;MACRO 8-31-89 ;Macro program ;Copyright (c)1989 by James Yi [73327,1653] ;MACINS installs this program in LOMEM ORG $B000 EXE 0 ;System ROM/RAM T200 M100 ; ---- ---- PEKBNK EQU 9BB1H FNKMAC EQU EEF9H POKBNK EQU 9BB0H LCDBUF EQU FD60H PASMAC EQU EEFBH POPALL EQU 1604H 14EDH NULSUB EQU 9CA8H 7FF3H KEYGPC EQU FD16H FFA2H KBDBUF EQU FD1EH FILDIR EQU F2B5H F9BAH POP3 EQU 1605H CHGET EQU 12F7H 12CBH CHGET_BEGIN EQU CHGET+5 ;Macro buffer in FilDir: 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 ;RST 7,04 HOOK04: DESP 2 LXI H,RTIN04 SHLI JMP NULSUB ;return addr ;RST 7.5 HOOK75: RTIN75: PUSH H LXI H,NULSUB ;return addr XTHL PUSH H PUSH D PUSH B PUSH PSW LXI H,POPALL PUSH H MVI A,0DH SIM EI ;poll GRPH/CODE LDA PRV_KEYPOS MOV B,A CALL GETKEY STA PRV_KEYPOS JNZ MA9 ;up position ORA B JZ MA4 ;released - toggle macset MOV A,M ;macseten MVI M,0 DCX H MOV B,M ORA M ;macset CMA MOV M,A ;cancel CMP B MVI B,30 JC BELL ;check stat MA4 LDAX D ;macstat INR A RNZ ;time delay XCHG DCX H DCR M ;macdelay RNZ INR M ;signal key buffer LXI H,KBDBUF MVI M,1 INX H MOV M,A ;0 INX H MOV M,A RET ;GRPH+CODE MA9 SUI 0CH RNZ ;reset STAX D ;macstat MVI M,$FF ;macseten MOV L,M MOV H,L SHLD PASMAC INX H SHLD FNKMAC MOV A,C RAR RNC XRA A STA KEYGPC ;jmp 0 PUSH H ;0000 MVI A,'1' STA MACGROUP RET ;read SHIFT/GRPH/CODE position GETKEY: LXI H,MACSETEN DEHL 2 ;macstat LDA KEYGPC MOV C,A ANI 0CH RET RTIN04: PUSH A LXI H,POPALL PUSH H RC ;F or Paste key MOV B,A ;GRPH/CODE chr CALL GETKEY JZ MA7 MVI M,$FF MA7 ;determine what to do with the key LDAX D ;macstat DESP 3 ;key chr ANA A JZ INACTIVE INR A JZ DO_MACRO ;fnk/paste mode INR A JNZ MA5 LHLD PASMAC MOV A,H ANA L INR A LXI H,FNKMAC+1 ORA M RNZ MA8: MVI A,$FF JMP SET_MACSTAT ;key mode MA5 INR A JNZ MA8 ;line input mode MOV A,B SUI 13 RNZ STAX D ;0D -> 00 JMP MA8 INACTIVE: ;new macro DCX H CMP M ;macset RZ MOV M,A STAX D ;clr key BEGIN_MACRO: ;initialize DESP 0 XCHG SHLD MACBEGSTAK XRA A STA RECURS_CNT MOV C,A DCR A ;find data file STA FILEBNK LXI H,MACDAT SHLD MACPTR XCHG ;DE=macro buffer pointer ;B=macro key ;C=buffer length GET_MACRO: DI PUSH D PUSH B LDA FILEBNK ANA A LHLD FILELOC JP MA10 ;data file already found ;locate data file MVI A,8 FINDFILE STA FILEBNK MOV B,A ;test ram to see if bank exists LXI H,LCDBUF CALL GETCHR CMA MOV D,A CALL POKBNK CALL GETCHR CMP D JNZ NEXTBNK ;skip if not ;search directory LXI H,FILDIR-11 SEARCHDIR LXI D,11 MA13 DAD D CALL GETCHR ANA A ;skip empty dir JP MA13 INR A ;end of dir JZ NEXTBNK ;non-empty dir found ;is it MACDEF.DO? PUSH H INX H INX H LXI D,MACDEF MVI C,8 CMPNAM DCR C JM FOUND INX H CALL GETCHR XCHG CMP M XCHG INX D JZ CMPNAM POP H JMP SEARCHDIR NEXTBNK: MOV A,B SUI 4 JP FINDFILE JMP MACFILE_NOTFOUND FOUND: POP H INX H CALL PEKBNK MOV E,D INX H CALL PEKBNK XCHG SHLD FILELOC MA10 ;locate group LDA MACGROUP STA HEADER+5 DB 1 FGH2 POP H INX H FGH3 CALL GETCHR CPI 26 JZ GROUP_NOTFOUND LXI D,HEADER MVI C,6 PUSH H FGH1 CALL GETCHR XCHG CMP M XCHG JNZ FGH2 INX H INX D DCR C JNZ FGH1 POP H ;locate key POP B POP D ;goto next line GNL1 CALL GETCHR INX H GNL2 CPI 26 JZ KEY_NOTFOUND CPI 13 JNZ GNL1 CALL GETCHR INX H GNL3 CPI 10 JNZ GNL2 GNL4 CALL READ_CHR JC GNL3 CMP B JNZ GNL1 ;load macro definition into buffer ;/c call ;/l link ;/t time delay ;/r repeat ;/i line input ;/k pause for key ;/x execute ML ;^? control char ;%?? hex number ;/? quote "?" PUSH H RESUME_PRV: POP H ;read/decode and put into buffer NEXT_CHR: CALL READ_CHR JC LOAD_DONE CPI '/' JZ FUNCTION CONTINUE: STAX D INX D INR C JNZ NEXT_CHR JMP TOOLONG INSERT: CALL READ_CHR MOV B,A PUSH H LXI H,RECURS_CNT INR M MOV A,M CPI 32 JC GET_MACRO TOOMANY_RECURSION GROUP_NOTFOUND: MACFILE_NOTFOUND: TOOLONG: MVI B,240 DB 33 KEY_NOTFOUND: MVI B,90 LHLD MACBEGSTAK SPHL IN D8H ANI FCH OUT D8H BELL: DI MVI D,30 B2 MOV E,B B1 DCR E JNZ B1 CALL CLICK DCR D JNZ B2 EI RET CLICK: NOP IN BAH XRI 20H OUT BAH XRI 20H OUT BAH RET FUNCTION: CALL GET_CAPS CPI 'C' JZ INSERT CPI 'X' JZ ML ;run time command MOV B,A MVI A,'/' STAX D INX D INR C JZ TOOLONG MOV A,B CPI # ML: XRA A JMP CONTINUE GETCHR: PUSH D PUSH B LDA FILEBNK MOV B,A CALL PEKBNK MOV A,D POP B POP D RET ;read/decode a chr READ_CHR: CALL GETCHR CPI 26 STC RZ INX H CPI '%' JZ RC2 CPI 13 JZ RC3 CPI '^' JNZ RC1 CALL GET_CAPS SUI 64 RC1 ANA A RET RC2 CALL RC2B PUSH B RLC RLC RLC RLC MOV C,A CALL RC2B ORA C POP B RET RC2B CALL GET_CAPS SUI '0' CPI 10 RC SUI 7 RET RC3 CALL GETCHR INX H CPI 10 STC RZ DCX H MVI A,13 ANA A RET GET_CAPS: CALL GETCHR INX H CPI 'a' RC CPI 'z'+1 RNC ANI DFH RET LOAD_DONE: LXI H,RECURS_CNT DCR M JP RESUME_PRV IN D8H ANI FCH OUT D8H EI CALL MA8 ;macstat on XRA A STAX D INR A STA MACRPT_CNT STA MACDELAY INX D MVI A,201 ;do_macro ;get next chr DO_MACRO: STAX D ;clear key ;repeat LXI D,MACPTR LXI H,MACRPT_LEN MOV A,M DCX H DCR M ;macrpt_ptr JNZ MA1 MOV M,A DCX H DCR M ;macrpt_cnt JZ MA2 LHLD MACRPT_LOC DB 1 MA2 INR M MA1 LHLI MA3 MOV A,M INX H SHLI ANA A JZ ML_MODE CPI '/' JZ DO_FUNC LOAD_CHR: DESP 3 STAX D RET DO_FUNC: MOV A,M INX H SHLI CPI 'L' JZ LINK CPI 'I' JZ SET_LINPUT_MODE CPI 'K' JZ SET_KEY_MODE CPI 'R' JZ REPEAT CPI 'T' JNZ LOAD_CHR ;set time delay CALL READ_CHR SHLI STA MACDELAY RET REPEAT: MOV A,M STA MACRPT_LEN STA MACRPT_PTR INX H MOV A,M STA MACRPT_CNT INX H SHLD MACRPT_LOC JMP MA3 LINK: MOV B,M LXI H,BEGIN_MACRO ML_MODE: PUSH H XRA A SET_MACSTAT: LXI H,MACSTAT MOV M,A RET SET_LINPUT_MODE: MVI A,FDH DB 1 SET_KEY_MODE: MVI A,FCH DCX D STAX D ;macstat POP H LXI H,RTIN04 XTHL XRA A STA KBDBUF JMP CHGET_BEGIN HEADER DB 'MaCrO ' PRV_KEYPOS DB 0 MACBEGSTAK DW 0 RECURS_CNT DB 0 FILEBNK DB 0 FILELOC DW 0 MACDEF DB 'MACDEFDO'