Common out boilerplate function prologue code; shrinks Star Trek from 44256 to

43892 bytes.
This commit is contained in:
David Given 2019-02-06 16:06:07 +01:00
parent b77f616598
commit 2b0629f87f
2 changed files with 69 additions and 15 deletions

58
mach/i80/libem/pro.s Normal file
View file

@ -0,0 +1,58 @@
.sect .text
.sect .rom
.sect .data
.sect .bss
.sect .text
.define .proword, .probyte
.define .pro0, .pro2, .pro4
! BC is used as the frame pointer, but HL and DE can be corrupted.
.proword:
pop h
push b
mov e, m
inx h
mov d, m
inx h
jmp .pron
.probyte:
pop h
push b
mvi e, 0xff
mov d, m
inx h
jmp .pron
.pro4:
pop h
push b
lxi d, -4
jmp .pron
.pro2:
pop h
push b
lxi d, -2
jmp .pron
.pro0:
pop h
push b
lxi d, 0
! fall through
.pron:
shld .retadr
! Copy the current stack pointer to BC.
lxi h, 0
dad sp
mov b, h
mov c, l
! Calculate the new stack pointer.
dad d
sphl
lhld .retadr
pchl

View file

@ -52,22 +52,18 @@ void con_mult(sz) word sz;
#define FL_MSB_AT_LOW_ADDRESS 0
#include <con_float>
void prolog(nlocals) full nlocals;
void prolog(full nlocals)
{
fprintf(codefile, "\tpush\tb\n\tlxi\th,0\n\tdad\tsp\n\tmov\tb,h\n\tmov\tc,l\n");
switch (nlocals)
{
case 4:
fprintf(codefile, "\tpush\th\n");
case 2:
fprintf(codefile, "\tpush\th\n");
case 0:
break;
default:
fprintf(codefile, "\tlxi\th,%d\n\tdad\tsp\n\tsphl\n", -nlocals);
break;
}
if (nlocals == 0)
fprintf(codefile, "\tcall .pro0\n");
else if (nlocals == 2)
fprintf(codefile, "\tcall .pro2\n");
else if (nlocals == 4)
fprintf(codefile, "\tcall .pro4\n");
else if (nlocals < 0x100)
fprintf(codefile, "\tcall .probyte\n\t.data1 %d\n", -nlocals);
else
fprintf(codefile, "\tcall .proword\n\t.data2 %d\n", -nlocals);
}
void mes(type) word type;