/* ** print all assembler info before any code is generated */ header() { beglab=getlabel(); /*42*/ } /* ** print any assembler stuff needed at the end */ trailer() { #ifndef LINK if((beglab == 1)|(beglab > 9000)) #endif /* LINK */ nl(); /*keep last ";" from blanking first EXT*/ cptr=STARTGLB; /*37*/ while(cptr dest) { /* adjust stack references */ if(streq(sour,"DAD SP")) { --sour; i=BPW; while(isdigit(*(--sour))) { if((*sour = *sour-i) < '0') { *sour = *sour+10; i=1; } else i=0; } } } csp=csp+BPW; } /* ** pop stack to the secondary register */ pop() { ol("POP D"); csp=csp+BPW; } /* ** swap primary register and stack */ swapstk() { ol("XTHL"); } /* ** process switch statement */ sw() { ffcall("CCSWITCH##"); } /* ** call specified subroutine name */ ffcall(sname) char *sname; { ot("CALL "); outstr(sname); nl(); } /* ** return from subroutine */ ffret() { ol("RET"); } /* ** perform subroutine call to value on stack */ callstk() { ffcall ("CCDCAL##"); /*36*/ } /* ** jump to internal label number */ jump(label) int label; { ot("JMP "); printlabel(label); nl(); } /* ** test primary register and jump if false */ testjump(label) int label; { ol("MOV A,H"); ol("ORA L"); ot("JZ "); printlabel(label); nl(); } /* ** test primary register against zero and jump if false */ zerojump(oper, label, lval) int (*oper)(), label, lval[]; { /*13*/ clearstage(lval[7], 0); /* purge conventional code */ (*oper)(label); /*13*/ } /* ** define storage according to size */ defstorage(size) int size; { if(size==1) ot("DB "); else ot("DW "); } /* ** point to following object(s) */ point() { ol("DW $+2"); } /* ** modify stack pointer to value given */ modstk(newsp, save) int newsp, save; { int k; k=newsp-csp; if(k==0)return newsp; if(k>=0) { if(k<7) { if(k&1) { ol("INX SP"); k--; } while(k) { ol("POP B"); k=k-BPW; } return newsp; } } if(k<0) { if(k>-7) { if(k&1) { ol("DCX SP"); k++; } while(k) { ol("PUSH B"); k=k+BPW; } return newsp; } } if(save) swap(); const(k); ol("DAD SP"); ol("SPHL"); if(save) swap(); return newsp; } /* ** double primary register */ doublereg() { ol("DAD H");}