Merge pull request #142 from davidgiven/dtrg-arraysizes
i80: factor out function prologue boilerplate
This commit is contained in:
commit
3d5977b93b
2 changed files with 107 additions and 47 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
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef NORCSID
|
#ifndef NORCSID
|
||||||
static char rcsid[]= "$Id$" ;
|
static char rcsid[] = "$Id$";
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -14,80 +14,82 @@ static char rcsid[]= "$Id$" ;
|
||||||
|
|
||||||
#include <stdlib.h> /* atol */
|
#include <stdlib.h> /* atol */
|
||||||
|
|
||||||
void
|
void con_part(sz, w) register sz;
|
||||||
con_part(sz,w) register sz; word w; {
|
word w;
|
||||||
|
{
|
||||||
|
|
||||||
while (part_size % sz)
|
while (part_size % sz)
|
||||||
part_size++;
|
part_size++;
|
||||||
if (part_size == 2)
|
if (part_size == 2)
|
||||||
part_flush();
|
part_flush();
|
||||||
if (sz == 1) {
|
if (sz == 1)
|
||||||
|
{
|
||||||
w &= 0xFF;
|
w &= 0xFF;
|
||||||
if (part_size)
|
if (part_size)
|
||||||
w <<= 8;
|
w <<= 8;
|
||||||
part_word |= w;
|
part_word |= w;
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
assert(sz == 2);
|
assert(sz == 2);
|
||||||
part_word = w;
|
part_word = w;
|
||||||
}
|
}
|
||||||
part_size += sz;
|
part_size += sz;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void con_mult(sz) word sz;
|
||||||
con_mult(sz) word sz; {
|
{
|
||||||
|
|
||||||
if (argval != 4)
|
if (argval != 4)
|
||||||
fatal("bad icon/ucon size");
|
fatal("bad icon/ucon size");
|
||||||
fprintf(codefile,".data4\t%ld\n",atol(str));
|
fprintf(codefile, ".data4\t%ld\n", atol(str));
|
||||||
}
|
}
|
||||||
|
|
||||||
#define CODE_GENERATOR
|
#define CODE_GENERATOR
|
||||||
#define IEEEFLOAT
|
#define IEEEFLOAT
|
||||||
#define FL_MSL_AT_LOW_ADDRESS 0
|
#define FL_MSL_AT_LOW_ADDRESS 0
|
||||||
#define FL_MSW_AT_LOW_ADDRESS 0
|
#define FL_MSW_AT_LOW_ADDRESS 0
|
||||||
#define FL_MSB_AT_LOW_ADDRESS 0
|
#define FL_MSB_AT_LOW_ADDRESS 0
|
||||||
#include <con_float>
|
#include <con_float>
|
||||||
|
|
||||||
void
|
void prolog(full nlocals)
|
||||||
prolog(nlocals) 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)
|
||||||
case 4: fprintf(codefile,"\tpush\th\n");
|
fprintf(codefile, "\tcall .pro2\n");
|
||||||
case 2: fprintf(codefile,"\tpush\th\n");
|
else if (nlocals == 4)
|
||||||
case 0: break;
|
fprintf(codefile, "\tcall .pro4\n");
|
||||||
default:
|
else if (nlocals < 0x100)
|
||||||
fprintf(codefile,"\tlxi\th,%d\n\tdad\tsp\n\tsphl\n",-nlocals);
|
fprintf(codefile, "\tcall .probyte\n\t.data1 %d\n", -nlocals);
|
||||||
break;
|
else
|
||||||
}
|
fprintf(codefile, "\tcall .proword\n\t.data2 %d\n", -nlocals);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void mes(type) word type;
|
||||||
mes(type) word type ; {
|
{
|
||||||
int argt ;
|
int argt;
|
||||||
|
|
||||||
switch ( (int)type ) {
|
switch ((int)type)
|
||||||
case ms_ext :
|
{
|
||||||
for (;;) {
|
case ms_ext:
|
||||||
switch ( argt=getarg(
|
for (;;)
|
||||||
ptyp(sp_cend)|ptyp(sp_pnam)|sym_ptyp) ) {
|
{
|
||||||
case sp_cend :
|
switch (argt = getarg(ptyp(sp_cend) | ptyp(sp_pnam) | sym_ptyp))
|
||||||
return ;
|
{
|
||||||
default:
|
case sp_cend:
|
||||||
strarg(argt) ;
|
return;
|
||||||
fprintf(codefile,".define %s\n",argstr) ;
|
default:
|
||||||
break ;
|
strarg(argt);
|
||||||
|
fprintf(codefile, ".define %s\n", argstr);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
default:
|
||||||
default :
|
while (getarg(any_ptyp) != sp_cend)
|
||||||
while ( getarg(any_ptyp) != sp_cend ) ;
|
;
|
||||||
break ;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
char *segname[] = {
|
char* segname[] = { ".sect .text", ".sect .data", ".sect .rom", ".sect .bss" };
|
||||||
".sect .text",
|
|
||||||
".sect .data",
|
|
||||||
".sect .rom",
|
|
||||||
".sect .bss"
|
|
||||||
};
|
|
||||||
|
|
Loading…
Reference in a new issue