;MACINS 8/31/89 ;Installs MACRO in LOMEM ;Copyright (c)1989 by James Yi [73327,1653] ORG 60000 ;System ROM/RAM T200 M100 ; ---- ---- MVDBI EQU 41BAH 3469H CLRHBC EQU 7747H CLRHB EQU 5DC1H RUNMRET EQU 3293H RST75V EQU EEC2H RST04 EQU F507H+4 FILDIR1 EQU F39CH FILDIR2 EQU F4A7H CSRITP EQU F21FH KBSITP EQU FD03H CHGET EQU 12F7H KILL EQU 2B2CH FINDCO EQU 2BA6H UPTDIR EQU 2C62H MVHBI EQU 32A7H GETCO6 EQU 41A1H BEEP EQU 4F45H INXD EQU 5587H CRLFC EQU 5A77H TMDELA EQU 6214H PRINTC EQU 679EH MENU EQU 67A4H OMMSG EQU 69ACH INSERT EQU 82A8H DELETE EQU 82DAH MVHBCI EQU 8316H TICK EQU 8FC9H NULSUB EQU 9CA8H LOMEM EQU F4EEH TOP EQU F4FBH LEN EQU F4FDH EXE EQU F4FFH DOAREA EQU F661H FLNM EQU F746H KEYGPC EQU FD16H IDWORD EQU 'MA' ENTRY: LDA KEYGPC CMA ANI 2 JZ CANCEL DESP 0 XCHG SHLD STACK ;determine if it should be installed or removed LXI D,$A001 LXI B,IDWORD LHLD LOMEM SEARCH: RST 3 JC INSTAL PUSH H LHLI DSUB B POP H JZ REMOVE INR D JMP SEARCH REMOVE: INX D INX D LDAX D MOV B,A ADD D CMP H LXI H,CMVMSG JNZ ERREXT ;ok to remove PUSH B DI ;restore hooks MOV A,E ADI 8 MOV E,A LHLI SHLD RST04 MOV A,E ADI 4 MOV E,A LHLI LXI B,NULSUB DSUB B MVI A,201 JZ I10 MVI A,195 I10 LHLI SHLD RST75V+1 STA RST75V ;delete lomem code POP A CMA INR A CALL SETLOW ;clear directory space LXI H,MACRTN LXI B,11*27 ;27 slots CALL CLRHBC ;print msg and exit LXI H,RMVMSG JMP EXIT INSTAL: ;check file directory LXI H,MACRTN MVI B,27 LXI D,11 I12 MOV A,M ANA A JM NODIR DAD D DCR B JNZ I12 ;get file's location,top,end LXI H,ENHFIL ;file name PUSH H CALL FNDFIL POP H JZ ERREXT XCHG CALL GETCO6 INX H INX H PUSH B ;length PUSH H ;filloc XCHG SHLD TOP DAD B DCX H SHLD LEN ;create lomem space LXI H,4 DAD B ;space size INR L DCR L MOV A,H JZ LL1 INR A LL1 LHLD LOMEM PUSH PSW PUSH H CALL SETLOW POP D POP PSW ;record ID & size INX D ;skip 1st byte LXI H,IDWORD SHLI INX D INX D STAX D ;size INX D ;move to lomem MOV B,A MVI C,0 POP H ;file in mem DAD B ;calc shift POP B ;file len PUSH D ;lomem pgm beg CALL MVHBCI ;move ;calculate relocation addr offset LHLD TOP MOV B,H MOV C,L POP H DSUB B SHLD DIFF DAD B XCHG DCX H PUSH D ;relocate RELOC: PUSH H LDAX D PUSH D CALL GETOPL POP D INX D CPI 3 JC NOREL LHLI MOV B,H MOV C,L LHLD TOP DCX H DSUB B JNC NIR LHLD LEN DSUB B JC NIR LHLD DIFF DAD B SHLI NIR: INX D NOREL: CPI 2 CNC INXD POP H RST 3 JNC RELOC ;set hooks DI POP D LHLD RST04 XCHG SHLD RST04 XCHG MOV A,E ADI 7 MOV E,A SHLI INX D INX D LHLD RST75V+1 XCHG SHLD RST75V+1 XCHG INX D INX D LDA RST75V CPI 201 JNZ I11 LXI H,NULSUB I11 SHLI MVI A,195 STA RST75V ;initialize macro buffer LXI H,MACRTN MOV A,M INR A JZ L12 LXI D,MACODE MVI B,24 CALL MVDBI MVI M,'1' ;macgroup INX H MVI B,11 CALL CLRHB L12 ;set interrupt counters MVI A,1 STA CSRITP INR A STA KBSITP ;print msg and exit LXI H,INSMSG EXIT: MVI D,30 S2 MVI E,30 S1 DCR E JNZ S1 CALL TICK DCR D JNZ S2 CALL PRINTC CALL DELFIL PAUEXT: LHLD STACK SPHL XCHG DESP 0 LHLX LXI B,RUNMRET DSUB B RZ CANCEL: LXI H,CANMSG CZ PRINTC CZ DELFIL MVI A,2 JMP TMDELA DELFIL: PUSH H LXI H,ENHFIL CALL KILFIL LXI H,ENIFIL CALL KILFIL POP H RET KILFIL: LDA KEYGPC RRC RC CALL FNDFIL RZ JMP KILL FNDFIL: LXI D,FLNM CALL MVHBI-2 CALL UPTDIR JMP FINDCO ;make or delete lomem space ;A(signed) SETLOW: LHLD LOMEM ADD H MOV D,A SUB H MOV B,A MVI C,0 MOV L,C JNC SL1 PUSH B MOV A,H SUB D MOV B,A MOV H,D CALL DELETE POP B JMP SL2 SL1 CALL INSERT JC IMERR DAD B SL2 LDA DOAREA+1 ADD B STA DOAREA+1 MOV A,H STA LOMEM+1 SUI $A0 STA $A000 RET NODIR: LXI H,NODIRMSG JMP ERREXT IMERR: LXI H,OMMSG ERREXT: CALL PRINTC CALL BEEP JMP PAUEXT ;get opcode length GETOPL: CPI 64 JC GO1 SUI 192 JNC GO2 MVI A,1 RET GO2: ADI 64 GO1: MOV E,A ANI 3 MOV B,A MOV A,E XRA B RAR RAR LXI H,OPLTBL MOV E,A MVI D,0 DAD D MOV A,M RLC RLC GO3: RRC RRC DCR B JP GO3 ANI 3 RET ;opcode length table OPLTBL: DB $5D,$65,$55,$65 DB $5D,$65,$55,$65 DB $7D,$65,$76,$65 DB $7D,$65,$76,$65 DB $F5,$67,$75,$AF DB $B5,$67,$B5,$6F DB $75,$67,$75,$67 DB $75,$67,$75,$AF INSMSG DB 'Installed',0 RMVMSG DB 'Removed',0 CMVMSG DB 'Cannot remove',0 CANMSG DB 'Cancelled',0 DIFF DW 0 ENIFIL DB 'MACINS' ENHFIL DB 'MACRO ' DB '.CO missing',0 STACK DW 0 NODIRMSG DB 'Directory used',0 MACRTN EQU F386H MACBUF EQU MACRTN+24 MACGROUP EQU MACBUF MACRPT_LOC EQU MACBUF+1 MACRPT_CNT EQU MACBUF+3 MACRPT_PTR EQU MACBUF+4 MACRPT_LEN EQU MACBUF+5 MACSET EQU MACBUF+6 MACSETEN EQU MACBUF+7 MACDELAY EQU MACBUF+8 MACSTAT EQU MACBUF+9 MACPTR EQU MACBUF+10 MACDAT EQU MACBUF+12 MACODE: DB FFH POP H PUSH H PUSH A DAD D POP A RET XTHL PUSH A DAD D POP A XTHL RET PUSH H PUSH D DESP 4 LHLI POP D PUSH A DAD D POP A XTHL RET