; ;============================ ; GEN180.MAC ;============================ ;written 15.04.87 ;comments in english 18.11.87 ; ;authors address: ; ; Herbert Oppmann ; Erwin-Rommel-Str.59 ; 8520 Erlangen ; West Germany ; ;create GEN180.COM: ; ; M80 =GEN180 ; L80 GEN180,GEN180/N/E/Y ; .Z80 ; ;============================ ;publics (for use with SID or ZSID) ;============================ ; PUBLIC ZIEL PUBLIC SIGNON PUBLIC ANFANG PUBLIC FCB1 PUBLIC FCB2 PUBLIC NXTSEC PUBLIC ERROR PUBLIC RAUS PUBLIC LOADED PUBLIC TRYAGN PUBLIC DOIT PUBLIC COMMND PUBLIC SBYTE PUBLIC SWORD PUBLIC SMULTI PUBLIC SMLTAD PUBLIC SCHANG PUBLIC SMOVE PUBLIC SEXIT PUBLIC NXTWRT PUBLIC WRTERR PUBLIC TOOBIG PUBLIC FALVER PUBLIC NICREA PUBLIC TABLE PUBLIC V344 PUBLIC V34 ; ;============================ ;equates ;============================ ; ;ASCII - characters: ; TAB EQU 9 ;tabulator LF EQU 10 ;line feed CR EQU 13 ;carriage return ; ;addresses: ; BDOS EQU 5 ;basic disc operating system TBASE EQU 100H ;start of TPA (transient program area) ZIEL EQU 6000H ;location where part of this program is loaded ; ;BDOS - functions: ; STROUT EQU 9 ;print string RESET EQU 13 ;same as ^C OPEN EQU 15 ;open file CLOSE EQU 16 ;close file READ EQU 20 ;read sequential WRITE EQU 21 ;write sequential CREATE EQU 22 ;create file SETDMA EQU 26 ;set DMA address ; ;patch - commands: ; BYTE EQU 0 ;write a byte to an address WORD EQU 1 ;write a word (two byte) to an address MULTI EQU 2 ;write a word to several addresses MLTADD EQU 3 ;add a word to contents of several addresses CHANGE EQU 4 ;write a block (several byte) to an address MOVE EQU 5 ;move a block (may overlap!) EXIT EQU 6 ;write to disc and exit program ; ;other: ; SECLEN EQU 128 ;length of a logical sector ; ;============================ GEN180: ;============================ ; LD DE,SIGNON ;print message LD C,STROUT CALL BDOS LD HL,ANFANG ;move rest of program LD DE,ZIEL LD BC,ENDE-ANFANG LDIR JP ZIEL ;activate rest ; ;============================ ;local data ;============================ ; SIGNON: DEFB '=====================================',CR,LF DEFB 'GEN180.COM Version 1.00E',CR,LF DEFB 'Purpose: add new instructions to M80',CR,LF DEFB 'Written by Herbert Oppmann 4/87',CR,LF DEFB '=====================================',CR,LF,LF,'$' ; ;============================ ANFANG: ;============================ ; .PHASE ZIEL ; LD DE,FCB1 ;open file M80.COM LD C,OPEN CALL BDOS INC A ;not found? JR Z,NOTFND ; LD HL,TBASE NXTSEC: PUSH HL ;read sectors EX DE,HL ;until end of file or error LD C,SETDMA CALL BDOS LD DE,FCB1 LD C,READ CALL BDOS OR A JR NZ,LOADED POP HL LD DE,SECLEN ADD HL,DE LD DE,ZIEL ;protect against overwriting LD A,L SUB E LD A,H SBC A,D JR C,NXTSEC LD DE,TOOBIG ;M80.COM is to big ; ERROR: LD C,STROUT ;error routine. CALL BDOS ;print error message and warm boot RAUS: LD C,RESET JP BDOS ; NOTFND: LD DE,NITDA ;error 'not found' JR ERROR ; VERSF: POP HL ;error 'wrong version' LD DE,FALVER JR ERROR ; LOADED: POP HL DEC A ;was it a load error? LD DE,RDERR JR NZ,ERROR LD HL,TABLE ;no. SEARCH: LD E,(HL) ;now identify M80 INC HL LD D,(HL) INC HL ;HL points to next entry PUSH HL LD A,E AND D INC A JR Z,VERSF LD HL,(104H) ;at 103h there is a jump instruction. AND A ;use the jump address for identification SBC HL,DE JR NZ,TRYAGN POP HL ;jump address is ok, now check default title PUSH HL ;(contains version and date) LD A,(HL) ;get pointer to list INC HL LD H,(HL) LD L,A LD E,(HL) ;first entry is address of title INC HL LD D,(HL) INC HL ;HL points to text to compare LD B,13 ;only 13 characters are compared SEA1: LD A,(DE) INC DE CP (HL) INC HL JR NZ,TRYAGN DJNZ SEA1 JR DOIT ;we found it! ; TRYAGN: POP HL INC HL INC HL JR SEARCH ; DOIT: LD DE,OPTIM ;now prepare patching LD C,STROUT ;tell user what we found CALL BDOS POP HL ;HL still points to second entry LD E,(HL) ;get address of list of patches INC HL LD D,(HL) INC DE ;skip first entry INC DE PUSH DE LD C,STROUT ;print text to compare CALL BDOS POP HL ;HL now holds address of list of patches LD DE,17 ;number of characters reserved for text ADD HL,DE ;skip text, start patching ; COMMND: LD A,(HL) ;get command INC HL ;increment pointer ; SBYTE: CP BYTE JR NZ,SWORD ; ;format: address (word), value (byte) ; LD E,(HL) INC HL LD D,(HL) INC HL LD A,(HL) INC HL LD (DE),A JR COMMND ; SWORD: CP WORD JR NZ,SMULTI ; ;format: address (word), value (word) ; LD E,(HL) INC HL LD D,(HL) INC HL LD A,(HL) INC HL LD (DE),A INC DE LD A,(HL) INC HL LD (DE),A JR COMMND ; SMULTI: CP MULTI JR NZ,SMLTAD ; ;format: value (word), addr. (word), ..., 0FFFFH (word) ; LD C,(HL) ;BC = value INC HL LD B,(HL) INC HL SMUL: LD E,(HL) ;DE = address INC HL LD D,(HL) INC HL LD A,E AND D INC A ;ready? JR Z,COMMND EX DE,HL LD (HL),C ;no, store value INC HL LD (HL),B EX DE,HL JR SMUL ; SMLTAD: CP MLTADD JR NZ,SCHANG ; ;format: offset (word), addr. (word), ..., 0FFFFH (word) ; LD C,(HL) ;BC = offset INC HL LD B,(HL) INC HL SMAD: LD E,(HL) ;DE = address INC HL LD D,(HL) INC HL LD A,E AND D INC A ;ready? JR Z,COMMND PUSH HL EX DE,HL LD E,(HL) ;get old value INC HL LD D,(HL) EX DE,HL ADD HL,BC ;add offset EX DE,HL LD (HL),D ;store new value DEC HL LD (HL),E POP HL JR SMAD ; SCHANG: CP CHANGE JR NZ,SMOVE ; ;format: address (word), size (word), data ; LD E,(HL) ;DE = address INC HL LD D,(HL) INC HL LD C,(HL) ;BC = size INC HL LD B,(HL) INC HL ;HL = source address LDIR JR COMMND ; SMOVE: CP MOVE JR NZ,SEXIT ; ;format: source address (word), end of block (word), ; destination address (word) ; LD E,(HL) ;DE = source address INC HL LD D,(HL) INC HL LD A,(HL) INC HL PUSH HL LD H,(HL) ;HL = end of block LD L,A AND A SBC HL,DE ;size = end of block - source address LD B,H ;BC = size LD C,L POP HL PUSH DE ;(SP) = source address, HL = pointer INC HL LD E,(HL) ;DE = destination address INC HL LD D,(HL) INC HL EX (SP),HL ;HL = source address, (SP) = pointer PUSH HL AND A SBC HL,DE ;move up or down? JR C,SMVUP POP HL ;down, then use LDIR LDIR JR SMVEND ; SMVUP: EX DE,HL ;up, then use LDDR ADD HL,BC EX DE,HL POP HL ADD HL,BC DEC HL DEC DE LDDR ; SMVEND: POP HL JP COMMND ; INTERR: LD DE,INTERN ;error 'internal' JP ERROR ; SEXIT: CP EXIT JR NZ,INTERR ; ;format: number of records to save to disc (byte) ; LD B,(HL) ;B = number of records PUSH BC LD DE,FCB2 LD C,CREATE CALL BDOS POP BC INC A ;error at create? JR Z,NOCREA ; LD HL,TBASE NXTWRT: PUSH BC PUSH HL EX DE,HL LD C,SETDMA CALL BDOS LD DE,FCB2 LD C,WRITE CALL BDOS OR A ;error at write? JR NZ,WRTERR POP HL LD DE,SECLEN ADD HL,DE POP BC DJNZ NXTWRT LD DE,FCB2 ;ready, now close file LD C,CLOSE CALL BDOS LD DE,OKMESG LD C,STROUT CALL BDOS JP RAUS ; NOCREA: LD DE,NICREA JP ERROR ; WRTERR: POP HL ;write error POP BC LD DE,WRERR JP ERROR ; ;============================ ;fixed data ;============================ ; ;error messages: ; TOOBIG: DEFB 'file M80.COM does''nt fit' DEFB ' in memory below GEN180!',CR,LF,'$' ; NITDA: DEFB 'file M80.COM not found!',CR,LF,'$' ; RDERR: DEFB 'error while reading file M80.COM!',CR,LF,'$' ; FALVER: DEFB 'unknown version of M80!',CR,LF,'$' ; OPTIM: DEFB 'version found :',CR,LF,'MACRO-80 $' ; INTERN: DEFB 'I N T E R N A L E R R O R !!',CR,LF,'$' ; NICREA: DEFB 'can''t create file M180.COM!',CR,LF,'$' ; WRERR: DEFB 'error while writing file M180.COM!',CR,LF,'$' ; OKMESG: DEFB 'ready!',CR,LF,'$' ; ;identification table: ;contents: jump address, address of list of patches ; TABLE: DEFW 470CH,V344 DEFW 438FH,V34 DEFW 0FFFFH ;end of table ; ;lists of patches: ;contents: address of text to compare, text to compare (13 characters are ; compared, 17 characters reserved), patch commands with parameters ; ;++++++++++++++++++++++++++++ V344: DEFW 1B01H DEFB '3.44',TAB,'09-Dec-81',CR,LF,'$' ; ;change title of M80: ; DEFB BYTE DEFW 1AFDH DEFB '1' ; ;move some parts of the program: ;(make room for enlarging lists) ; DEFB MOVE DEFW 0AEAH,0B40H,4F35H ; ;adapt jumps within moved part: ; DEFB MLTADD DEFW 444BH DEFW 4F41H,4F47H,4F4CH,4F51H,4F5EH,4F63H,4F68H DEFW 4F6FH,4F72H,4F75H,0FFFFH ; ;adapt jumps/calls to routines that are in the moved part: ; DEFB MULTI DEFW 4F35H DEFW 03B3H,0B49H,0BB2H,0BC9H,0F2EH,1EA6H,1EABH,1EB1H DEFW 1EC4H,1ECCH,1FF5H,2080H,2120H,27C1H,280EH,285EH DEFW 2A42H,2A4DH,3096H,317EH,31ACH,31C2H,32CEH,3381H DEFW 3392H,35F5H,35FBH,3776H,0FFFFH ; DEFB MULTI DEFW 4F6EH DEFW 03A7H,1CD0H,1CE5H,1FEDH,207BH,27EBH,2807H,2A3BH DEFW 2A45H,35EDH,0FFFFH ; DEFB MULTI DEFW 4F74H DEFW 1CC9H,1CD7H,1CDEH,1CEDH,1CF2H,27A2H,27A5H,27B5H DEFW 27EFH,27F2H,27FDH,2852H,2AF2H,2B01H,2C4CH,2C5FH DEFW 32C4H,35BFH,3748H,0FFFFH ; DEFB MULTI DEFW 4F81H DEFW 03C0H,0453H,0B59H,0BFBH,0F2BH,1023H,1115H,1E3EH DEFW 1E45H,1EBAH,211DH,2794H,27C8H,2AFEH,3175H,318BH DEFW 3373H,33C4H,33C9H,38ABH,0FFFFH ; ;move and enlarge lists: ; DEFB CHANGE DEFW 0AEAH,10 DEFW XJ024,XJ026,XJ028,XJ02A,XJ02C ; DEFB MOVE DEFW 0AC6H,0AF4H,0B01H ; DEFB CHANGE DEFW 0AC6H,10 DEFB 24H,0,26H,0,28H,0,2AH,0,2CH,0 ; DEFB MOVE DEFW 092BH,0AD0H,095CH ; DEFB CHANGE DEFW 092BH,10 DEFB 01100010B,4AH DEFB 'ST' DEFB 01100100B,48H DEFB 'STIO' ; DEFB MOVE DEFW 08F7H,0935H,091EH ; DEFB CHANGE DEFW 08F7H,4 DEFB 01110010B,76H DEFB 'LP' ; DEFB MOVE DEFW 0826H,08FBH,0849H ; DEFB CHANGE DEFW 0826H,5 DEFB 01100011B,46H DEFB 'UT0' ; DEFB MOVE DEFW 0819H,082BH,0837H ; DEFB CHANGE DEFW 0819H,11 DEFB 01110011B,83H DEFB 'TIM' DEFB 01110100B,93H DEFB 'TIMR' ; DEFB MOVE DEFW 0814H,0824H,0827H ; DEFB CHANGE DEFW 0814H,11 DEFB 01110011B,8BH DEFB 'TDM' DEFB 01110100B,9BH DEFB 'TDMR' ; DEFB MOVE DEFW 07EAH,081FH,07F2H ; DEFB CHANGE DEFW 07EAH,4 DEFB 01100010B,42H DEFB 'LT' ; DEFB MOVE DEFW 0742H,07EEH,0746H ; DEFB CHANGE DEFW 0742H,4 DEFB 01100010B,44H DEFB 'N0' ; ;adapt pointers to lists: ; DEFB MLTADD DEFW 4 DEFW 05AAH,05ACH,05AEH,05B0H,0FFFFH ;TJ,TK,TL,TM ; DEFB MLTADD DEFW 8 DEFW 05B2H,05B4H,0FFFFH ;TN,TO ; DEFB MLTADD DEFW 23H DEFW 05B6H,05B8H,05BAH,05BCH,0FFFFH ;TP,TQ,TR,TS ; DEFB MLTADD DEFW 27H DEFW 05BEH,0FFFFH ;TT ; DEFB MLTADD DEFW 31H DEFW 05C0H,05C2H,05C4H,05C6H ;TU,TV,TW,TX DEFW 05C8H,05CAH,058BH,0593H ;TY,TZ,TPOINT,TDOLLR DEFW 0407H,03EFH,0F74H,0FFFFH;FLOCTL,JMPTBL,XTBL ; DEFB MLTADD DEFW 3BH DEFW 0F7BH,0FFFFH ;XJPTBL ; ;additional XJPxx: ; XJ024 EQU 4F8BH ; DEFB CHANGE DEFW XJ024,IN0LAE I0: LD A,B ;MLT ww CALL 164CH CALL 114EH CALL NZ,049DH LD C,4CH JP 0FC2H ; XJ026 EQU $-I0+XJ024 ; LD A,B ;IN0 g,(m) CALL 164CH CALL 114EH CALL NC,049DH CALL 1163H CALL 116EH LD C,0 AND 7 CALL 0F9CH CALL 1109H CALL 115BH LD A,(3CE7H) OR A JP 11F6H ; XJ028 EQU $-I0+XJ024 ; LD A,B ;OUT0 (m),g CALL 164CH CALL 110CH CALL 0F2AH CALL 115BH LD A,(3CE7H) OR A CALL NZ,049DH CALL 113BH LD A,E PUSH AF CALL 114EH CALL NC,049DH CALL 1163H LD A,(3CE8H) AND 7 LD C,1 CALL 0F9CH POP AF JP 16D9H ; XJ02A EQU $-I0+XJ024 ; LD A,B ;TSTIO m CALL 164CH LD A,74H CALL 164CH CALL 110CH CALL 1163H LD A,(3CE7H) OR A JP 11F6H ; XJ02C EQU $-I0+XJ024 ; LD A,B ;TST m / TST g / TST (HL) CALL 164CH CALL 110CH LD A,(3CE7H) CP 10H JP Z,REG0-I0+XJ024 OR A JP NZ,KLHL0-I0+XJ024 LD A,64H CALL 164CH CALL 1163H CALL 113BH LD A,E JP 16D9H REG0: CALL 1163H LD A,(3CE8H) AND 7 LD C,4 JP 0F9CH KLHL0: CP 20H CALL NZ,049DH CALL 115BH LD A,(3CE8H) CP 4 CALL NZ,049DH CALL 1148H LD A,34H JP 164CH ; IN0LAE EQU $-I0 ; ;new end of program: ; FREE0 EQU XJ024+IN0LAE ; DEFB BYTE DEFW FREE0 DEFB '0' ; DEFB MULTI DEFW FREE0,0127H,2E15H,0FFFFH ; ;save and exit: ; DEFB EXIT,(FREE0-0FFH)/SECLEN+1 ; ;++++++++++++++++++++++++++++ V34: DEFW 19A3H DEFB '3.4',TAB,'01-Dec-80',CR,LF,'$',0 ; ;change title of M80: ; DEFB BYTE DEFW 199FH DEFB '1' ; ;move some parts of the program: ;(make room for enlarging lists) ; GETCHR EQU 0AE9H GETCHN EQU 4B95H DISPLC EQU GETCHN-GETCHR ; UNKNO1 EQU 0B22H UN1N EQU UNKNO1+DISPLC ; UNKNO2 EQU 0B28H UN2N EQU UNKNO2+DISPLC ; DECPO EQU 0B35H DECPON EQU DECPO+DISPLC ; INCPO EQU 0B3FH ; ;move: ; DEFB MOVE DEFW GETCHR,INCPO,GETCHN ; ;adapt jumps within moved part: ; DEFB MLTADD DEFW DISPLC DEFW 4BA1H,4BA7H,4BACH,4BB1H,4BBEH,4BC3H,4BC8H,4BCFH DEFW 4BD2H,4BD5H,0FFFFH ; ;adapt jumps/calls to routines that are in the moved part: ; DEFB MULTI DEFW GETCHN DEFW 03A8H,0B48H,0BB1H,0BC8H,0F23H,1D27H,1D2CH,1D32H DEFW 1D45H,1D4DH,1E71H,1EFCH,1F91H,2569H,25B6H,261DH DEFW 27E0H,27EBH,2DDFH,2EC7H,2EF5H,2F0BH,3017H,30CAH DEFW 30DBH,333EH,3344H,34BFH,0FFFFH ; DEFB MULTI DEFW UN1N DEFW 039CH,1B51H,1B66H,1E69H,1EF7H,2593H,25AFH,25FFH DEFW 2610H,27D9H,27E3H,3336H,0FFFFH ; DEFB MULTI DEFW UN2N DEFW 1B4AH,1B58H,1B5FH,1B6EH,1B73H,254AH,254DH,255DH DEFW 2597H,259AH,25A5H,25F8H,288DH,289CH,29C2H,29D5H DEFW 300DH,3308H,3491H,0FFFFH ; DEFB MULTI DEFW DECPON DEFW 03B5H,0448H,0B58H,0BFAH,0F20H,1027H,1119H,1CBFH DEFW 1CC6H,1D3BH,1F8EH,253CH,2570H,2899H,2EBEH,2ED4H DEFW 30BCH,310DH,3112H,35F5H,0FFFFH ; ;move and enlarge lists: ; DEFB CHANGE DEFW GETCHR,DIS8 INS8: DEFW XJ124,XJ126,XJ128,XJ12A,XJ12C ; DIS8 EQU $-INS8 ; CUT7 EQU 0AC5H ; DEFB MOVE DEFW CUT7,GETCHR+DIS8 DEFW CUT7+DIS7+DIS6+DIS5+DIS4+DIS3+DIS2+DIS1+DIS0 ; DEFB CHANGE DEFW CUT7,DIS7 INS7: DEFB 24H,0,26H,0,28H,0,2AH,0,2CH,0 ; DIS7 EQU $-INS7 ; CUT6 EQU 092CH ; DEFB MOVE DEFW CUT6,CUT7+DIS7,CUT6+DIS6+DIS5+DIS4+DIS3+DIS2+DIS1+DIS0 ; DEFB CHANGE DEFW CUT6,DIS6 INS6: DEFB 01100010B,4AH DEFB 'ST' DEFB 01100100B,48H DEFB 'STIO' ; DIS6 EQU $-INS6 ; CUT5 EQU 08F8H ; DEFB MOVE DEFW CUT5,CUT6+DIS6,CUT5+DIS5+DIS4+DIS3+DIS2+DIS1+DIS0 ; DEFB CHANGE DEFW CUT5,DIS5 INS5: DEFB 01110010B,76H DEFB 'LP' ; DIS5 EQU $-INS5 ; CUT4 EQU 0827H ; DEFB MOVE DEFW CUT4,CUT5+DIS5,CUT4+DIS4+DIS3+DIS2+DIS1+DIS0 ; DEFB CHANGE DEFW CUT4,DIS4 INS4: DEFB 01100011B,46H DEFB 'UT0' ; DIS4 EQU $-INS4 ; CUT3 EQU 081AH ; DEFB MOVE DEFW CUT3,CUT4+DIS4,CUT3+DIS3+DIS2+DIS1+DIS0 ; DEFB CHANGE DEFW CUT3,DIS3 INS3: DEFB 01110011B,83H DEFB 'TIM' DEFB 01110100B,93H DEFB 'TIMR' ; DIS3 EQU $-INS3 ; CUT2 EQU 0815H ; DEFB MOVE DEFW CUT2,CUT3+DIS3,CUT2+DIS2+DIS1+DIS0 ; DEFB CHANGE DEFW CUT2,DIS2 INS2: DEFB 01110011B,8BH DEFB 'TDM' DEFB 01110100B,9BH DEFB 'TDMR' ; DIS2 EQU $-INS2 ; CUT1 EQU 07EBH ; DEFB MOVE DEFW CUT1,CUT2+DIS2,CUT1+DIS1+DIS0 ; DEFB CHANGE DEFW CUT1,DIS1 INS1: DEFB 01100010B,42H DEFB 'LT' ; DIS1 EQU $-INS1 ; CUT0 EQU 0743H ; DEFB MOVE DEFW CUT0,CUT1+DIS1,CUT0+DIS0 ; DEFB CHANGE DEFW CUT0,DIS0 INS0: DEFB 01100010B,44H DEFB 'N0' ; DIS0 EQU $-INS0 ; ;adapt pointers to lists: ; DEFB MLTADD DEFW DIS0 DEFW 05B0H,05B2H,05B4H,05B6H,0FFFFH ;TJ,TK,TL,TM ; DEFB MLTADD DEFW DIS0+DIS1 DEFW 05B8H,05BAH,0FFFFH ;TN,TO ; DEFB MLTADD DEFW DIS0+DIS1+DIS2+DIS3+DIS4 DEFW 05BCH,05BEH,05C0H,05C2H,0FFFFH ;TP,TQ,TR,TS ; DEFB MLTADD DEFW DIS0+DIS1+DIS2+DIS3+DIS4+DIS5 DEFW 05C4H,0FFFFH ;TT ; DEFB MLTADD DEFW DIS0+DIS1+DIS2+DIS3+DIS4+DIS5+DIS6 DEFW 05C6H,05C8H,05CAH,05CCH ;TU,TV,TW,TX DEFW 05CEH,05D0H,0591H,0599H ;TY,TZ,TPOINT,TDOLLR DEFW 03FCH,03E4H,0F78H,0FFFFH;FLOCTL,JMPTBL,XTBL ; DEFB MLTADD DEFW DIS0+DIS1+DIS2+DIS3+DIS4+DIS5+DIS6+DIS7 DEFW 0F7FH,0FFFFH ;XJPTBL ; ;additional XJPxx: ; ERRORA EQU 0492H CODE EQU 1629H ; XJ124 EQU INCPO+DISPLC ; DEFB CHANGE DEFW XJ124,IN1LAE I1: LD A,B ;MLT ww CALL CODE CALL 115AH CALL NZ,ERRORA LD C,4CH JP 0FC6H ; XJ126 EQU $-I1+XJ124 ; LD A,B ;IN0 g,(m) CALL CODE CALL 115AH CALL NC,ERRORA CALL 116FH CALL 117AH LD C,0 AND 7 CALL 0FA0H CALL 110DH CALL 1167H LD A,(3A16H) OR A JP 1202H ; XJ128 EQU $-I1+XJ124 ; LD A,B ;OUT0 (m),g CALL CODE CALL 1110H CALL 0F1FH CALL 1167H LD A,(3A16H) OR A CALL NZ,ERRORA CALL 113FH LD A,E PUSH AF CALL 115AH CALL NC,ERRORA CALL 116FH LD A,(3A17H) AND 7 LD C,1 CALL 0FA0H POP AF JP CODE ; XJ12A EQU $-I1+XJ124 ; LD A,B ;TSTIO m CALL CODE LD A,74H CALL CODE CALL 1110H CALL 116FH LD A,(3A16H) OR A JP 1202H ; XJ12C EQU $-I1+XJ124 ; LD A,B ;TST m / TST g / TST (HL) CALL CODE CALL 1110H LD A,(3A16H) CP 10H JP Z,REG1-I1+XJ124 OR A JP NZ,KLHL1-I1+XJ124 LD A,64H CALL CODE CALL 116FH CALL 113FH LD A,E JP CODE REG1: CALL 116FH LD A,(3A17H) AND 7 LD C,4 JP 0FA0H KLHL1: CP 20H CALL NZ,ERRORA CALL 1167H LD A,(3A17H) CP 4 CALL NZ,ERRORA CALL 114CH LD A,34H JP CODE ; IN1LAE EQU $-I1 ; ;new end of program: ; FREE1 EQU XJ124+IN1LAE ; DEFB BYTE DEFW FREE1 DEFB 10H ; DEFB MULTI DEFW FREE1,0127H,2B66H,0FFFFH ; ;save and exit: ; DEFB EXIT,(FREE1-0FFH)/SECLEN+1 ; ;============================ ;variable data ;============================ ; FCB1: DEFB 0,'M80 COM' DEFS 24,0 ; FCB2: DEFB 0,'M180 COM' DEFS 24,0 ; .DEPHASE ENDE: END GEN180