home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C/C++ Interactive Guide
/
c-cplusplus-interactive-guide.iso
/
c_ref
/
csource4
/
223_01
/
cc42.c
< prev
next >
Wrap
Text File
|
1979-12-31
|
7KB
|
324 lines
/*
** add primary and secondary registers (result in primary)
*/
ffadd() {ol("DAD D");}
/*
** subtract primary from secondary register (result in primary)
*/
ffsub() {ffcall("CCSUB##");}
/*
** multiply primary and secondary registers (result in primary)
*/
ffmult() {ffcall("CCMULT##");}
/*
** divide secondary by primary register
** (quotient in primary, remainder in secondary)
*/
ffdiv() {ffcall("CCDIV##");}
/*
** remainder of secondary/primary
** (remainder in primary, quotient in secondary)
*/
ffmod() {ffdiv();swap();}
/*
** inclusive "or" primary and secondary registers
** (result in primary)
*/
ffor() {ffcall("CCOR##");}
/*
** exclusive "or" the primary and secondary registers
** (result in primary)
*/
ffxor() {ffcall("CCXOR##");}
/*
** "and" primary and secondary registers
** (result in primary)
*/
ffand() {ffcall("CCAND##");}
/*
** logical negation of primary register
*/
lneg() {ffcall("CCLNEG##");}
/*
** arithmetic shift right secondary register
** number of bits given in primary register
** (result in primary)
*/
ffasr() {ffcall("CCASR##");}
/*
** arithmetic shift left secondary register
** number of bits given in primary register
** (result in primary)
*/
ffasl() {ffcall("CCASL##");}
/*
** two's complement primary register
*/
neg() {ffcall("CCNEG##");}
/*
** one's complement primary register
*/
com() {ffcall("CCCOM##");}
/*
** multi dimensional array index generater fas 2.6
*/
getmd(mdval) int mdval;{
push(); /* save sum fas 2.6 */
immed(); /* LXI H, fas 2.6 */
outdec(mdval); /* with index fas 2.6 */
nl(); /* fas 2.6 */
ffmult(); /* multiply by subscript fas 2.6 */
pop(); /* retrieve sum fas 2.6 */
}
/*
** increment primary register by one object of whatever size
*/
inc(n) int n; {
while(1) {
ol("INX H");
if(--n < 1) break;
}
}
/*
** decrement primary register by one object of whatever size
*/
dec(n) int n; {
while(1) {
ol("DCX H");
if(--n < 1) break;
}
}
/*
** test for equal to
*/
ffeq() {ffcall("CCEQ##");}
/*
** test for equal to zero
*/
eq0(label) int label; {
ol("MOV A,H");
ol("ORA L");
ot("JNZ ");
printlabel(label);
nl();
}
/*
** test for not equal to
*/
ffne() {ffcall("CCNE##");}
/*
** test for not equal to zero
*/
ne0(label) int label; {
ol("MOV A,H");
ol("ORA L");
ot("JZ ");
printlabel(label);
nl();
}
/*
** test for less than (signed)
*/
fflt() {ffcall("CCLT##");}
/*
** test for less than to zero
*/
lt0(label) int label; {
ol("XRA A");
ol("ORA H");
ot("JP ");
printlabel(label);
nl();
}
/*
** test for less than or equal to (signed)
*/
ffle() {ffcall("CCLE##");}
/*
** test for less than or equal to zero
*/
le0(label) int label; {
ol("MOV A,H");
ol("ORA L");
ol("JZ $+8");
ol("XRA A");
ol("ORA H");
ot("JP ");
printlabel(label);
nl();
}
/*
** test for greater than (signed)
*/
ffgt() {ffcall("CCGT##");}
/*
** test for greater than to zero
*/
gt0(label) int label; {
ol("XRA A");
ol("ORA H");
ot("JM ");
printlabel(label);
nl();
ol("ORA L");
ot("JZ ");
printlabel(label);
nl();
}
/*
** test for greater than or equal to (signed)
*/
ffge() {ffcall("CCGE##");}
/*
** test for gteater than or equal to zero
*/
ge0(label) int label; {
ol("XRA A");
ol("ORA H");
ot("JM ");
printlabel(label);
nl();
}
/*
** test for less than (unsigned)
*/
ult() {ffcall("CCULT##");}
/*
** test for less than to zero (unsigned)
*/
ult0(label) int label; {
ot("JMP ");
printlabel(label);
nl();
}
/*
** test for less than or equal to (unsigned)
*/
ule() {ffcall("CCULE##");}
/*
** test for greater than (unsigned)
*/
ugt() {ffcall("CCUGT##");}
/*
** test for greater than or equal to (unsigned)
*/
uge() {ffcall("CCUGE##");}
#ifdef OPTIMIZE
peephole(ptr) char *ptr; {
while(*ptr) {
if(streq(ptr,"LXI H,0\nDAD SP\nCALL CCGINT##")) {
if(streq(ptr+29, "XCHG;;")) {pp2();ptr=ptr+36;}
else {pp1();ptr=ptr+29;}
}
else if(streq(ptr,"LXI H,2\nDAD SP\nCALL CCGINT##")) {
if(streq(ptr+29, "XCHG;;")) {pp3(pp2);ptr=ptr+36;}
else {pp3(pp1);ptr=ptr+29;}
}
else if(optimize) {
if(streq(ptr, "DAD SP\nCALL CCGINT##")) {
ol("CALL CCDSGI##");
ptr=ptr+21;
}
else if(streq(ptr, "DAD D\nCALL CCGINT##")) {
ol("CALL CCDDGI##");
ptr=ptr+20;
}
else if(streq(ptr, "DAD SP\nCALL CCGCHAR##")) {
ol("CALL CCDSGC##");
ptr=ptr+22;
}
else if(streq(ptr, "DAD D\nCALL CCGCHAR##")) {
ol("CALL CCDDGC##");
ptr=ptr+21;
}
else if(streq(ptr,
"DAD SP\nMOV D,H\nMOV E,L\nCALL CCGINT##\nINX H\nCALL CCPINT##")) {
ol("CALL CCINCI##");
ptr=ptr+57;
}
else if(streq(ptr,
"DAD SP\nMOV D,H\nMOV E,L\nCALL CCGINT##\nDCX H\nCALL CCPINT##")) {
ol("CALL CCDECI##");
ptr=ptr+57;
}
else if(streq(ptr,
"DAD SP\nMOV D,H\nMOV E,L\nCALL CCGCHAR##\nINX H\nMOV A,L\nSTAX D")) {
ol("CALL CCINCC##");
ptr=ptr+59;
}
else if(streq(ptr,
"DAD SP\nMOV D,H\nMOV E,L\nCALL CCGCHAR##\nDCX H\nMOV A,L\nSTAX D")) {
ol("CALL CCDECC##");
ptr=ptr+59;
}
else if(streq(ptr, "DAD D\nPOP D\nCALL CCPINT##")) {
ol("CALL CDPDPI##");
ptr=ptr+26;
}
else if(streq(ptr, "DAD D\nPOP D\nMOV A,L\nSTAX D")) {
ol("CALL CDPDPC##");
ptr=ptr+27;
}
else if(streq(ptr, "POP D\nCALL CCPINT##")) {
ol("CALL CCPDPI##");
ptr=ptr+20;
}
/*30*/
/* additional optimizing logic goes here */
else cout(*ptr++, output);
}
else cout(*ptr++, output);
}
}
pp1() {
ol("POP H");
ol("PUSH H");
}
pp2() {
ol("POP D");
ol("PUSH D");
}
pp3(pp) int (*pp)(); { /*13*/
ol("POP B");
(*pp)(); /*13*/
ol("PUSH B");
}
#endif