Common out boilerplate function prologue code; shrinks Star Trek from 44256 to
43892 bytes.
This commit is contained in:
parent
b77f616598
commit
2b0629f87f
58
mach/i80/libem/pro.s
Normal file
58
mach/i80/libem/pro.s
Normal 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
|
||||
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue