0010 * 8080 Relocator 0020 * Byte July 1977 p. 92 0030 * 0000 ORG 0C900H 0000 XEQ RELOC 0040 CRLF EQU 0C2F9H 0050 SOUT EQU 0C019H 0060 VDAD2 EQU 0C120H 0070 SCONV EQU 0C33AH 0080 RETRN EQU 0C004H 0090 ADOUT EQU 0C3E8H 0100 HBOUT EQU 0C3EDH 0110 OPORT EQU 0C807H 0120 GCLIN EQU 0C1E4H 0130 * 0140 RELOC EQU $ 0150 CALL CRLF 0160 MVI B,'a' 0170 CALL PARM get a 0180 SHLD SSTRT 0190 MVI B,'b' 0200 CALL PARM get b 0210 SHLD SBOT 0220 MVI B,'c' 0230 CALL PARM get c 0240 SHLD DTOP 0250 MVI B,'d' 0260 CALL PARM get d 0270 SHLD START 0280 MVI B,'e' 0290 CALL PARM get e 0300 SHLD STOP 0310 MVI B,'f' 0320 CALL PARM get f 0330 MOV A,L 0340 STA FUNK 0350 MVI B,'o' 0360 CALL PARM get output port 0370 MOV A,L 0380 STA OPORT 0390 LHLD SBOT 0400 XCHG move b to DE 0410 LHLD DTOP 0420 MOV B,H 0430 MOV C,L move c to BC 0440 LHLD SSTRT get a 0450 PUSH B save c 0460 CALL COMPH complement HL 0470 DAD D HL = b - a 0480 MOV B,H 0490 MOV C,L now BC 0500 POP H get c 0510 DAD B HL = end of destination area 0520 LDA FUNK 0530 ORA A 0540 JZ STEP3 skip move 0550 * 0560 MOVE LDAX D source to 0570 MOV M,A ... destination 0580 MOV A,B 0590 ORA C 0600 JZ TEST done 0610 DCX H 0620 DCX D 0630 DCX B 0640 JMP MOVE keep going 0650 * 0660 TEST LDA FUNK 0670 CPI 2 0680 JZ RETRN go to OS 0690 * 0700 STEP3 PUSH H save c 0710 XCHG 0720 CALL COMPH complement a 0730 POP D 0740 DAD D DE = c - a 0750 SHLD DISP displacement 0760 LHLD START get d 0770 DCX H 0780 * 0790 LOOP INX H 0800 XCHG 0810 LHLD STOP get e 0820 XCHG 0830 MOV A,E c - d 0840 SUB L 0850 MOV A,D 0860 SBB H 0870 JC RETRN done 0880 * 0890 MVI B,26 3 byte op code count 0900 LXI D,TABL3 0910 * 0920 CHEK3 LDAX D 0930 CMP M 0940 JZ ACT 3 byte op code 0950 DCR B 0960 INX D 0970 JNZ CHEK3 0980 * 0990 MVI B,18 2 byte op code count 1000 LXI D,TABL2 1010 * 1020 CHEK2 LDAX D 1030 CMP M 1040 JZ SKIP don't change 2 byte op's 1050 DCR B 1060 INX D 1070 JNZ CHEK2 1080 JMP LOOP 1090 * 1100 SKIP INX H skip 2nd byte 1110 JMP LOOP 1120 * 1130 ACT PUSH H 3 byte op 1140 LHLD SBOT get b 1150 XCHG ... to DE 1160 LHLD SSTRT get a 1170 MOV B,H 1180 MOV C,L ... to BC 1190 POP H 1200 INX H points to byte 2 1210 MOV A,E 1220 SUB M 1230 INX H 1240 MOV A,D 1250 SBB M b - loc 1260 JC LOOP operand greater than b, ignore 1270 * 1280 DCX H 1290 MOV A,M 1300 SUB C 1310 INX H 1320 MOV A,M 1330 SBB B loc - a 1340 JC LOOP operand less then a, ignore 1350 * 1360 DCX H 1370 XCHG 1380 LHLD DISP 1390 XCHG 1400 * 1410 DCX H point to op code 1420 MOV A,M 1430 CPI 31H 1440 JZ PLXI it's LXI SP 1450 CPI 22H 1460 JNC FIX not LXI B,D,H 1470 PLXI CALL ADOUT print loc of LXI 1480 MOV A,M 1490 CALL HBOUT print instruction 1500 INX H 1510 MOV A,M 1520 CALL HBOUT 1530 INX H 1540 MOV A,M 1550 CALL HBOUT 1560 CALL CRLF 1570 DCX H 1580 DCX H 1590 * 1600 FIX INX H 1610 MOV A,M fix up bytes 2 & 3 1620 ADD E 1630 MOV M,A 1640 INX H 1650 MOV A,M 1660 ADC D 1670 MOV M,A 1680 JMP LOOP 1690 * 1700 COMPH MOV A,H complement HL 1710 CMA 1720 MOV H,A 1730 MOV A,L 1740 CMA 1750 MOV L,A 1760 INX H 1770 RET 1780 * 1790 PARM EQU $ 1800 CALL SOUT output prompt plus blank 1810 MVI B,' ' 1820 CALL SOUT 1830 CALL GCLIN 1840 MVI C,1 1850 CALL VDAD2 1860 XCHG 1870 CALL SCONV 1880 CALL CRLF 1890 RET 1900 * 1910 * constants 1920 TABL3 EQU $ 1930 DW 01101H 1940 DW 02221H 1950 DW 0312AH 1960 DW 03A32H 1970 DW 0C3C2H 1980 DW 0CAC4H 1990 DW 0CDCCH 2000 DW 0D4D2H 2010 DW 0DCDAH 2020 DW 0E4E2H 2030 DW 0ECEAH 2040 DW 0F4F2H 2050 DW 0FCFAH 2060 TABL2 EQU $ 2070 DW 00E06H 2080 DW 01E16H 2090 DW 02E26H 2100 DW 03E36H 2110 DW 0CEC6H 2120 DW 0D6D3H 2130 DW 0DEDBH 2140 DW 0EEE6H 2150 DW 0FEF6H 2160 SSTRT DW 0 2170 SBOT DW 0 2180 DTOP DW 0 2190 START DW 0 2200 STOP DW 0 2210 FUNK DB 0 2220 DISP DW 0 2230 *