Merge pull request #142 from davidgiven/dtrg-arraysizes

i80: factor out function prologue boilerplate
This commit is contained in:
David Given 2019-02-06 16:15:53 +01:00 committed by GitHub
commit 3d5977b93b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 107 additions and 47 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

@ -5,7 +5,7 @@
*/
#ifndef NORCSID
static char rcsid[]= "$Id$" ;
static char rcsid[] = "$Id$";
#endif
/*
@ -14,80 +14,82 @@ static char rcsid[]= "$Id$" ;
#include <stdlib.h> /* atol */
void
con_part(sz,w) register sz; word w; {
void con_part(sz, w) register sz;
word w;
{
while (part_size % sz)
part_size++;
if (part_size == 2)
part_flush();
if (sz == 1) {
if (sz == 1)
{
w &= 0xFF;
if (part_size)
w <<= 8;
part_word |= w;
} else {
}
else
{
assert(sz == 2);
part_word = w;
}
part_size += sz;
}
void
con_mult(sz) word sz; {
void con_mult(sz) word sz;
{
if (argval != 4)
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 IEEEFLOAT
#define FL_MSL_AT_LOW_ADDRESS 0
#define FL_MSW_AT_LOW_ADDRESS 0
#define FL_MSB_AT_LOW_ADDRESS 0
#define FL_MSL_AT_LOW_ADDRESS 0
#define FL_MSW_AT_LOW_ADDRESS 0
#define FL_MSB_AT_LOW_ADDRESS 0
#include <con_float>
void
prolog(nlocals) 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;
}
void prolog(full nlocals)
{
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 ; {
int argt ;
void mes(type) word type;
{
int argt;
switch ( (int)type ) {
case ms_ext :
for (;;) {
switch ( argt=getarg(
ptyp(sp_cend)|ptyp(sp_pnam)|sym_ptyp) ) {
case sp_cend :
return ;
default:
strarg(argt) ;
fprintf(codefile,".define %s\n",argstr) ;
break ;
switch ((int)type)
{
case ms_ext:
for (;;)
{
switch (argt = getarg(ptyp(sp_cend) | ptyp(sp_pnam) | sym_ptyp))
{
case sp_cend:
return;
default:
strarg(argt);
fprintf(codefile, ".define %s\n", argstr);
break;
}
}
}
default :
while ( getarg(any_ptyp) != sp_cend ) ;
break ;
default:
while (getarg(any_ptyp) != sp_cend)
;
break;
}
}
char *segname[] = {
".sect .text",
".sect .data",
".sect .rom",
".sect .bss"
};
char* segname[] = { ".sect .text", ".sect .data", ".sect .rom", ".sect .bss" };