Common out boilerplate function prologue code; shrinks Star Trek from 44256 to
43892 bytes.
This commit is contained in:
parent
b77f616598
commit
2b0629f87f
2 changed files with 69 additions and 15 deletions
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
|
#define FL_MSB_AT_LOW_ADDRESS 0
|
||||||
#include <con_float>
|
#include <con_float>
|
||||||
|
|
||||||
void prolog(nlocals) full nlocals;
|
void prolog(full nlocals)
|
||||||
{
|
{
|
||||||
|
if (nlocals == 0)
|
||||||
fprintf(codefile, "\tpush\tb\n\tlxi\th,0\n\tdad\tsp\n\tmov\tb,h\n\tmov\tc,l\n");
|
fprintf(codefile, "\tcall .pro0\n");
|
||||||
switch (nlocals)
|
else if (nlocals == 2)
|
||||||
{
|
fprintf(codefile, "\tcall .pro2\n");
|
||||||
case 4:
|
else if (nlocals == 4)
|
||||||
fprintf(codefile, "\tpush\th\n");
|
fprintf(codefile, "\tcall .pro4\n");
|
||||||
case 2:
|
else if (nlocals < 0x100)
|
||||||
fprintf(codefile, "\tpush\th\n");
|
fprintf(codefile, "\tcall .probyte\n\t.data1 %d\n", -nlocals);
|
||||||
case 0:
|
else
|
||||||
break;
|
fprintf(codefile, "\tcall .proword\n\t.data2 %d\n", -nlocals);
|
||||||
default:
|
|
||||||
fprintf(codefile, "\tlxi\th,%d\n\tdad\tsp\n\tsphl\n", -nlocals);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void mes(type) word type;
|
void mes(type) word type;
|
||||||
|
|
Loading…
Reference in a new issue