; ; ELECTRIC PENCIL SOURCE CODE ; VERSION DI-II FOR IMSAI VIO ; BASE EQU 0 BDOS EQU BASE+5 FCB EQU BASE+5CH BUFF EQU BASE+80H TPA EQU BASE+100H ; VIO EQU 0F000H NCOLS EQU 80 NROWS EQU 24 ; ORG TPA ; JMP INITPEN ; DB 'THE ELECTRIC PENCIL II (C) 1978 ' DB 'MICHAEL SHRAYER VER. DI-II REV. 3 ' ; INITPEN:LXI SP,SCRLSPD MVI A,8 ;INITIALIZE VIO STA VIO+7FFH LDA BASE+2 ;BIOS PAGE ADDRESS STA CONST1+2 ;SELF MODIFY CODE TO DO BIOS CALLS STA CONIN1+2 STA LIST1+2 MVI A,1 ;USE DRIVE A: STA 5CH ; ; CLEAR TEXT BUFFER AND RE-INITIALIZE SYSTEM ; COLDST: LXI H,SCRLSPD CALL L1380 ;ZERO MEMORY FROM SCRLSPD TO BASE OF CP/M DCX H DCR H SHLD MEMTOP ;TEXT BUFFER UPPER LIMIT CALL L0F2C ;RESTORE DEFAULT PRINT VALUES LXI H,TXTBUF-1 MVI M,0DH INX H SHLD BUFEND LXI D,SOM ;SIGN ON MESSAGE LXI H,VIO+37EH CALL L0801 ;CLEAR SCREEN & PRINT MESSAGE L017E: CALL CONST ORA A JZ L017E JMP WARMST ; ; CONSOLE STATUS CALL ; CONST: PUSH B PUSH D PUSH H CONST1: CALL 6 POP H POP D POP B RET ; ; CONSOLE INPUT CALL ; CONIN: PUSH B PUSH D PUSH H CONIN1: CALL 9 POP H POP D POP B RET ; ; LIST DEVICE OUTPUT ; LIST: PUSH PSW PUSH B PUSH D PUSH H MOV C,A LIST1: CALL 0FH POP H POP D POP B POP PSW RET ; WARMST: MVI A,8 ;INITIALIZE VIO STA VIO+7FFH LXI H,0 SHLD COLUMN ;ZERO ROW AND COLUMN LXI H,TXTBUF L01B7: CALL L0684 ;PUT 1ST PAGE ON SCREEN L01BA: LXI SP,SCRLSPD LXI H,L01BA ;RETURN ADDR FROM MAIN PROCESSING LOOP PUSH H ;SIMULATE A CALL LXI H,0 SHLD RPTCMD SHLD RPTCNT LHLD BUFEND XRA A MOV M,A STA L1892 STA L1885 STA L18AD STA L188E STA L188B CALL L02C5 ;RET ADDR OF CURSOR IN H,L MOV A,M PUSH PSW LDA INSFLG ;INSERT MODE FLAG ORA A MOV A,M JZ L01ED MVI A,9 ;USE HOR. TAB AS CURSOR CHAR IN INSERT MODE L01ED: ORI 80H ;TURN CURSOR ON MOV M,A CALL L125F MOV C,A POP PSW MOV M,A MOV A,C L01F7: CPI 7FH JZ L036C ;DESTRUCTIVE BACKSPACE CPI 20H JNC L0458 ;PRINTABLE CHAR CPI 0AH JZ L03C5 ;LINE FEED CPI 0CH JZ L03C0 ;FORM FEED CPI 0DH JZ L03CD ;CARRIAGE RETURN (CURSOR) CPI 'T'-40H JZ L088E ;ERASE TO END OF LINE CPI 'Y'-40H JZ L0657 ;DELETE LINE CPI 'D'-40H JZ L03EC ;DELETE CHAR CPI 'F'-40H JZ L0450 ;INSERT CHAR MODE CPI 'A'-40H JZ L036E ;CURSOR LEFT CPI 'S'-40H JZ L04D1 ;CURSOR RIGHT CPI 'I'-40H JZ L03D2 ;HORIZONTAL TAB (CURSOR) CPI 'P'-40H JZ L13C9 ;PRINT SUB-SYSTEM PUSH PSW CALL L065D CALL L02C5 POP PSW CPI 'W'-40H JZ L037B ;CURSOR UP CPI 'Z'-40H JZ L034E ;CURSOR DOWN CPI 'R'-40H JZ L04DB ;REPEAT FUNCTION MOV C,A XRA A STA INSFLG MOV A,C CPI 'K'-40H JZ L0A0C ;I/O SCOREBOARD CPI 'E'-40H JZ L0305 ;SCROLL UP CPI 'X'-40H JZ L031A ;SCROLL DOWN CPI 'V'-40H JZ L08B9 ;STRING SEARCH CPI 'C'-40H JZ L09DB ;CONTINUE SEARCH CPI 'G'-40H JZ L0403 ;INSERT LINE CPI 'Q'-40H JZ L02E8 ;HOME CURSOR CPI 'U'-40H JZ L05C7 ;DELETE BLOCK CPI 'H'-40H JZ L05DD ;INSERT BLOCK CPI 'B'-40H JZ WARMST ;CURSOR TO BEG. OF FILE CPI 'N'-40H JZ L02F9 ;CURSOR TO END OF FILE CPI 'O'-40H RNZ LXI D,L02B4 ;EXIT SYSTEM LXI H,VIO+38EH CALL L0801 CALL L125F CPI 'Y' JNZ L0A0C CALL CLRVIO JZ BASE ;EXIT (THIS JUMP ALWAYS TAKEN) ; DB 0DAH,0F8H,02H,03EH ; ; THIS CODE MODIFIES PRINT ROUTINE TO PRINT ENCRYPTED MESSAGES ; L02AA: CMA PUSH H MOV H,A MVI L,1AH ;LDAX D INSTRUCTION L02AF: SHLD L13C0 POP H RZ ; ; ENCRYPTED LITERALS ; L02B4: IRPC R, DB '&R' XOR ($ AND 0FFH) ENDM DB $ AND 0FFH ; ; CALCULATE THE ADDRESS REPRESENTED BY THE ROW IN ROW ; AND THE COLUMN IN ROW. ; L02C5: LDA COLUMN ;COLUMN MOV B,A L02C9: LDA ROW ;ROW PUSH D LXI D,NCOLS LXI H,VIO L02D3: DAD D DCR A JP L02D3 SHLD L18A7 LXI D,-NCOLS DAD D SHLD L189D INR D MOV E,B DAD D POP D RET ; DB 21H ; ; HOME CURSOR ; L02E8: XRA A STA COLUMN ;ZERO OUT COL L02EC: STA ROW ;ZERO OUT ROW L02EF: CALL L042B MOV A,C STA L1887 INR A RET ; DB 2AH ; ; CURSOR TO END OF FILE ; L02F9: LXI H,0 ;ZERO OUT ROW AND COLUMN SHLD COLUMN LHLD BUFEND ;END OF FILE POINTER ? JMP L01B7 ; ; SCROLL UP ; L0305: LHLD L1899 MOV A,M ORA A RZ CALL L0360 RZ L030F: CALL L032C LDA L188E CPI 'X'-40H JNZ L0305 ; ; SCROLL DOWN ; L031A: CALL L0386 RZ CALL L032C LDA L188E CPI 'E'-40H JNZ L031A JMP L0305 ; L032C: CALL L1229 LDA L1888 ORA A JZ L121C STA L18AD LDA L188B INR A CPI NROWS STA L188B RNZ XRA A STA L188B CALL L123A STA L18AD RET ; ; CURSOR DOWN ; L034E: LDA L1887 DCR A RM L0353: XRA A STA INSFLG LDA ROW INR A CPI NROWS JNZ L02EC L0360: LHLD L1897 CALL L06D6 ORA A RZ INX H JMP L0684 ; ; DELETE - DESTRUCTIVE BACKSPACE ; L036C: MVI M,20H ; ; CURSOR LEFT - NON DESTRUCTIVE BACKSPACE ; L036E: MOV A,B DCR A JP L03CE MVI A,NCOLS-1 STA COLUMN CALL L065D ; ; CURSOR UP ; L037B: XRA A STA INSFLG LDA ROW DCR A JP L02EC L0386: LHLD L1897 LXI D,TXTBUF MOV A,E SUB L MOV A,D SBB H JNZ L0396 MOV A,E SUB L RZ L0396: CALL L03A0 LHLD L1895 JMP L0684 ; L039F: DB 21H ; L03A0: MOV D,H MOV E,L DCX H L03A3: DCX H MOV A,M CPI 0EH ;COULD BE CNTRL-N JNC L03A3 INX H L03AB: SHLD L1895 CALL L06D6 INX H MOV A,E SUB L MOV A,D SBB H RC JNZ L03AB MOV A,E SUB L JNZ L03AB RET ; ; FORM FEED ; L03C0: MVI M,'L'-40H ;CNTL-L JMP L03C7 ; ; LINE FEED ; L03C5: MVI M,0DH L03C7: CALL L065D CALL L034E L03CD: XRA A L03CE: STA COLUMN RET ; ; TAB - MOVE CURSOR 8 CHARS TO RIGHT ; L03D2: MOV A,B ADI 8 ANI 0F8H ;FORCE MULTIPLE OF 8 STA COLUMN CPI NCOLS RC XRA A STA COLUMN CALL L042B RZ CALL L065D JMP L034E ; DB 31H ; ; DELETE CHAR AND CLOSE UP LINE ; L03EC: INX H L03ED: MOV A,M DCX H MOV M,A INX H INX H LDA L18A7 CMP L JNZ L03ED DCX H MVI M,20H JZ L065D JM L039F ; DB 22H ; ; INSERT LINE ROUTINE ; L0403: MVI B,0 CALL L02C9 L0408: PUSH H MOV B,M MVI C,1 MOV M,C LXI D,VIO+72FH CALL L0446 JNC L041C LXI H,VIO+77FH CALL L05BC L041C: POP H CALL L088E STA L1887 JZ L03CE ;ALWAYS TAKE THIS JUMP ; DB 0CDH,40H,04H,0C3H,0ACH ; L042B: LXI B,NCOLS CALL L02C9 DAD B L0432: DCX H MOV A,M ANI 7FH CPI 20H JNZ L0441 DCR C JNZ L0432 RET ; DB 11H ; L0441: CPI 0EH RC INR C RET ; L0446: MOV A,L SUB E MOV A,H SBB D RC RNZ MOV A,L SUB E ORA A RET ; ; TURN INSERT ON-OFF ; L0450: LDA INSFLG CMA STA INSFLG RET ; ; ENTRY POINT FOR TYPING OF NORMAL CHARS ; L0458: CPI 5CH ;DELIMITER CHAR JZ L0464 LDA INSFLG ORA A JZ L0486 L0464: MOV A,B CPI NCOLS-1 JZ L085B PUSH B PUSH H CPI NCOLS-14 ;32H IN VDM VERSION, 42H IN VIO VERSION JC L0473 MVI C,20H L0473: MOV B,M MOV M,C MOV C,B INX H LDA L18A7 CMP L JNZ L0473 CALL L06D1 CALL L065D POP H POP B L0486: MOV M,C MOV A,B INR A CPI NCOLS-1 JC L03CE JNZ L085B MOV A,C CPI 20H JNZ L04A7 CALL L042B JZ L03CD CALL L065D CALL L0353 JMP L0403 ; DB 0EH ; L04A7: CALL L06D1 MVI A,NCOLS-1 SUB C MOV B,A PUSH PSW PUSH B CALL L065D CALL L0353 POP B CALL L02C9 PUSH H CALL L0408 POP H MVI M,0DH POP PSW STA COLUMN INR A STA L1887 PUSH H CALL L065D POP H MVI M,20H RET ; ; CURSOR RIGHT ; L04D1: MOV A,B INR A CPI NCOLS JZ L03C7 JMP L03CE ; ; REPEAT COMMAND ; L04DB: LDA RPTCMD ORA A RNZ LXI H,0 L04E3: CALL L125F ;GET CHAR CALL L050F ;ADD CHAR TO VALUE IN H,L RET CARRY NOT NUMERIC JC L04E3 ;NUMERIC, GET 2ND OR 3RD CHR STA RPTCMD ;SAVE CHAR TYPED (COMMAND TO REPEAT) L04EF: MOV A,L ;SEE IF REPEAT COUNT = ZERO ORA H RZ DCX H SHLD RPTCNT ;SAVE REPEAT COUNT CALL L02C5 ;CALC SCREEN ADDR LDA RPTCMD ;GET COMMAND MOV C,A ;IN C CALL L01F7 ;DISPATCH TO COMMAND CALL L1229 LHLD BUFEND MVI M,0 LHLD RPTCNT JMP L04EF ; DB 11H ; ; ACCUMULATE 16 BIT VALUE IN H,L, RET CARRY CLEAR IF ; CHAR IN ACC IS NOT NUMERIC ; L050F: CPI '0' CMC RNC CPI '9'+1 RNC MOV B,H MOV C,L DAD H DAD H DAD B DAD H SUI '0' MOV C,A L051F: MVI B,0 DAD B STC RET ; L0524: CALL L056B MOV D,H MOV E,L LDA COLUMN MOV C,A MVI B,0 DAD B XCHG CALL L06D6 CALL L0446 RC XCHG RET ; SOM: IRPC R, DB '&R' XOR ($ AND 0FFH) ENDM DB $ AND 0FFH ; L056B: LHLD L1897 LDA ROW ORA A RZ MOV B,A L0574: CALL L06D6 ORA A RZ INX H DCR B JNZ L0574 RET ; L057F: SUB B RZ JNC L05A4 LHLD L18C4 MOV D,H MOV E,L MOV A,B ADD E MOV E,A JNC L0590 INR D L0590: MVI B,0 DAD B L0593: LDAX D MOV M,A INX D INX H ORA A JNZ L0593 DCX H SHLD BUFEND RZ ;THIS RETURN ALWAYS TAKEN ; DB 0CDH,0A6H,04H,21H ; L05A4: LHLD BUFEND MOV C,A MVI B,0 L05AA: DAD B CALL L138C LHLD L18C4 MOV B,M MVI C,1 MOV M,C LHLD BUFEND XCHG SHLD BUFEND L05BC: LDAX D MOV M,A DCX D DCX H CMP C JNZ L05BC INX H MOV M,B RET ; ; DELETE BLOCK COMMAND ; L05C7: CALL L062B INX D CALL L0593 CALL L1380 CALL L0681 LDA L1887 ORA A JZ L02E8 RET ; DB 03EH ; ; INSERT BLOCK ; L05DD: CALL L062B PUSH H PUSH D PUSH H CALL L0524 POP D CALL L0446 POP D JZ L0650 JC L05FB CALL L0446 JZ L0650 JC L0650 XRA A L05FB: STA L1889 SHLD L18C4 POP H INX H MOV A,E SUB L MOV C,A MOV A,D SBB H MOV B,A LDA L1889 ORA A JZ L0611 DAD B L0611: PUSH B PUSH H LHLD BUFEND CALL L05AA POP H POP B INX D L061C: MOV A,M STAX D INX D INX H DCX B MOV A,B ORA C JNZ L061C JMP L0681 ; DB 2AH,0FH ; L062B: LXI H,TXTBUF CALL L0646 JZ L0650 PUSH H CALL L0645 JZ L0650 MOV D,H MOV E,L CALL L0645 JNZ L0650 POP H RET ; L0645: INX H L0646: MOV A,M ORA A RZ CPI 5CH ;DELIMITER CHAR. JNZ L0645 ORA A RET ; L0650: LXI D,L080C JMP L1397 ; DB 06H ; L0657: LHLD L189D CALL L088E L065D: CALL L056B SHLD L18C4 CALL L042B LDA L1887 MOV B,A MOV A,C STA L1887 CALL L057F LHLD L18C4 XCHG MVI B,0 CALL L02C9 LDA L1887 ORA A CNZ L11CD L0681: LHLD L1897 L0684: LXI D,VIO SHLD L1897 MVI B,NCOLS ;PROBABLY NCOLS L068C: MVI C,1 MOV A,M ORA A JZ L069C PUSH H CALL L06AF POP H ORA A JNZ L069D L069C: DCR C L069D: XCHG CALL L0879 CALL L06C9 XCHG JNZ L068C SHLD L1899 JMP L02EF ; L06AE: MOV A,M L06AF: CPI 0EH RC INR C INX H MOV A,B CMP C JNZ L06AE MVI A,20H L06BB: DCR C DCX H CMP M JNZ L06BB L06C1: DCR C DCX H CMP M JZ L06C1 INR C RET ; L06C9: MVI A,(VIO+(NCOLS*NROWS)) AND 0FFH CMP L RNZ MVI A,((VIO+(NCOLS*NROWS)) SHR 8) AND 0FFH CMP H RET ; L06D1: MVI B,0 CALL L02C9 L06D6: MVI C,0 L06D8: MOV A,M ORA A RZ INR C MVI A,50H CMP C JZ L07AB MOV A,M ANI 7FH CPI 0CH RZ CPI 0DH RZ INX H JMP L06D8 ; DB 0CDH,029H,06H,11H ; L06F3: IRPC R, DB '&R' XOR ($ AND 0FFH) ENDM DB $ AND 0FFH ; IRPC R, DB '&R' XOR ($ AND 0FFH) ENDM DB $ AND 0FFH ; IRPC R, DB '&R' XOR ($ AND 0FFH) ENDM DB $ AND 0FFH ; IRPC R, DB '&R' XOR ($ AND 0FFH) ENDM DB $ AND 0FFH ; IRPC R, DB '&R' XOR ($ AND 0FFH) ENDM DB $ AND 0FFH ; IRPC R, DB '&R' XOR ($ AND 0FFH) ENDM DB $ AND 0FFH ; IRPC R, DB '&R' XOR ($ AND 0FFH) ENDM DB $ AND 0FFH ; IRPC R, DB '&R' XOR ($ AND 0FFH) ENDM DB $ AND 0FFH ; IRPC R, DB '&R' XOR ($ AND 0FFH) ENDM DB $ AND 0FFH ; IRPC R, DB '&R' XOR ($ AND 0FFH) ENDM DB $ AND 0FFH ; IRPC R, DB '&R' XOR ($ AND 0FFH) ENDM DB $ AND 0FFH ; IRPC R, DB '&R' XOR ($ AND 0FFH) ENDM DB $ AND 0FFH ; DB 0C2H,0EFH,06H,0CDH ; L07AB: DCX H DCR C JZ L085B MOV A,M ANI 7FH CPI 20H JNZ L07AB L07B8: DCR C JZ L085B DCX H MOV A,M ANI 7FH CPI 20H JZ L07B8 INX H INR C RNZ ; DB 0CDH,0F8H,02H,21H,0FH ; L07CD: MOV B,A LDA LINLEN SUB B MOV B,A MVI C,0 LDA L1886 CPI 5FH JNZ L07E7 XRA A STA L1886 JZ L0819 ; DB 0CDH,40H,04H ; L07E7: MOV A,M CALL L0871 JNZ L07F7 CALL L171E INX D INX H JMP L07E7 ; L07F6: MOV A,M L07F7: CPI 20H JNZ L081A INX D INX H JMP L07F6 ; L0801: PUSH H CALL CLRVIO POP H JZ L1824 ; DB 0CDH,0A9H,02H ; L080C: IRPC R, DB '&R' XOR ($ AND 0FFH) ENDM DB $ AND 0FFH ; L0819: MOV A,M L081A: INX H CPI 0EH RC CALL L0871 JNZ L082B XRA A STA L1891 JMP L0819 ; L082B: INR C MOV A,B CMP C JNZ L0819 MOV A,M CPI 20H JZ L0849 INX H RC DCX H L083A: MOV A,M CALL L0869 JZ L0849 DCR C JZ L085B DCX H JMP L083A ; L0849: DCX H MOV A,M CALL L0869 JZ L0849 INX H MOV A,C INR A CMP B JNC L0859 INR C L0859: XRA A RET ; L085B: XRA A STA COLUMN L085F: XRA A STA L18CE LHLD L1897 JMP L01B7 ; L0869: DCR C JZ L085B CPI 20H RZ INR C L0871: CPI 5FH RZ CPI 7CH RET ; DB 0CDH,0EEH ; L0879: DCR C JM L088E LDAX D MOV M,A INX D INX H JMP L0879 ; L0884: LDAX D MOV M,A INX D INX H DCR C JNZ L0884 RET ; DB 2AH ; L088E: PUSH B L088F: MVI C,20H L0891: MOV M,C INX H MOV A,L ANI 0FH JNZ L0891 CALL L08A1 JNZ L088F POP B RET ; L08A1: PUSH H LXI B,1050H ;NOT A LABEL MOV A,H SBI 0F0H MOV H,A XRA A L08AA: DAD H RAL CMP C JC L08B2 SUB C INX H L08B2: DCR B JNZ L08AA POP H ORA A RET ; ; STRING SEARCH ROUTINE ; L08B9: CALL L0524 SHLD L189B LXI D,L112D LXI H,VIO+370H CALL L0801 INX H MVI M,0A0H CALL L108D LXI H,0 SHLD L18A1 SHLD L188C SHLD L18C4 CALL L110C LHLD L18C4 MOV A,L ORA H JNZ L08ED LDA L188D ORA A JZ L09DB DCX H L08ED: PUSH H CALL L1148 LDA L188C MOV B,A LDA L188D MOV C,A LHLD L18C4 ADD L MOV L,A JNC L0902 INR H L0902: SHLD L189B MOV A,C PUSH D CALL L057F POP D INX D LHLD L18C4 XCHG LDA L188D ORA A CNZ L11CD CALL L125A POP H DCX H MOV A,L ORA H JNZ L08ED JMP L0681 ; DB 0CDH,40H,04H ; ; PRINT SCOREBOARD ; L0927: IRPC R, DB '&R' XOR ($ AND 0FFH) ENDM DB $ AND 0FFH ; IRPC R, DB '&R' XOR ($ AND 0FFH) ENDM DB $ AND 0FFH ; IRPC R, DB '&R' XOR ($ AND 0FFH) ENDM DB $ AND 0FFH ; IRPC R, DB '&R' XOR ($ AND 0FFH) ENDM DB $ AND 0FFH ; IRPC R, DB '&R' XOR ($ AND 0FFH) ENDM DB $ AND 0FFH ; IRPC R, DB '&R' XOR ($ AND 0FFH) ENDM DB $ AND 0FFH ; IRPC R, DB '&R' XOR ($ AND 0FFH) ENDM DB $ AND 0FFH ; IRPC R, DB '&R' XOR ($ AND 0FFH) ENDM DB $ AND 0FFH ; IRPC R, DB '&R' XOR ($ AND 0FFH) ENDM DB $ AND 0FFH ; IRPC R, DB '&R' XOR ($ AND 0FFH) ENDM DB $ AND 0FFH ; IRPC R,
DB '&R' XOR ($ AND 0FFH) ENDM DB $ AND 0FFH ; IRPC R, DB '&R' XOR ($ AND 0FFH) ENDM DB $ AND 0FFH ; DB 0D2H,77H,08H,0C3H,24H,09H ; L09DB: LDA L188C ORA A JZ L085F CALL L1148 DCX H CALL L03A0 PUSH PSW PUSH H JZ L09F1 LHLD L1895 L09F1: CALL L06D6 INX H SHLD L189B LXI H,0 SHLD COLUMN SHLD L18A1 POP H POP PSW JZ L0684 LHLD L1895 L0A09: JMP L0684 ; ; DISK/TAPE I/O ROUTINES ; L0A0C: LXI D,L06F3 L0A0F: CALL L0DED LXI H,VIO+1E0H SHLD L18C2 CALL L11DD L0A1B: LHLD L18C2 L0A1E: INX H CALL L08A1 JNZ L0A1E CALL L06C9 CZ L0B07 LDA FCB ORI 30H MOV M,A INX H MVI M,3AH INX H MVI M,0A0H CALL L108D SHLD L18C2 LXI D,L0A1B PUSH D LXI D,L18CE CALL L0D72 RC CPI 'C' ;CLEAR COMMAND JZ L0D8E CPI 'R' ;READ TAPE COMMAND JZ L12E6 CPI 'W' ;WRITE TAPE COMMAND JZ L128F CPI 'V' ;TAPE VERIFY COMMAND JZ L12E7 CPI 'D' ;DISK DIRECTORY COMMAND JZ L0A80 CPI 'L' ;DISK LOAD COMMAND JZ L0B21 CPI 'S' ;DISK SAVE COMMAND JZ L0B87 CPI 'K' ;KILL DISK FILE COMMAND JNZ L0DD0 CALL L0C51 CALL L0C61 CALL L0C4C JMP L0AA2 ; DB 31H,0C3H,09H,01H ; ; DISK DIRECTORY COMMAND ; L0A80: CALL L0C51 CALL L0D71 JC L0AA2 CPI 3FH JC L0A9F DCX D CALL L0C61 LXI B,3F03H LXI H,65H JNZ L0AA8 ; DB 0CDH,07CH,0AH,11H ; L0A9F: CALL L0C95 L0AA2: CALL L0CBB LXI B,3F0BH L0AA8: CALL L0CC1 MVI A,11H CALL L0C53 CPI 0FFH JZ L0D79 PUSH PSW LXI H,VIO+220H SHLD L18C2 CALL L11DD MVI A,20H STA L18AD POP PSW L0AC5: LXI D,10H LHLD L18C2 DAD D RRC RRC RRC ANI 60H ORI 81H MOV E,A CALL L06C9 JNZ L0AE2 PUSH D CALL L1229 CALL L0B07 POP D L0AE2: SHLD L18C2 MVI C,8 CALL L0884 MVI M,2EH INX H MVI C,3 CALL L0884 MVI A,12H CALL L0C53 ORA A JP L0AC5 LXI D,NCOLS DAD D CALL L06C9 JZ L1229 RET ; DB 0CDH ; L0B07: LXI D,VIO+230H LXI H,VIO+280H L0B0D: MOV A,M STAX D INX D INX H CALL L06C9 JNZ L0B0D XCHG PUSH H CALL L088E POP H JNZ 0B06H ;NEVER TAKE THIS JUMP RET ; L0B21: CALL L0C51 CALL L0C61 MVI A,0FH CALL L0C53 CPI 0FFH JZ L0D79 LHLD BUFEND L0B34: MVI A,14H CALL L0C53 ORA A JNZ L0B6E CALL L13A6 XCHG LXI D,80H L0B44: LDAX D MOV M,A ORA A JZ L0B68 INX H INR E JNZ L0B44 JMP L0B34 ; L0B52: CALL L1373 ; L0B55: IRPC R, DB '&R' XOR ($ AND 0FFH) ENDM DB $ AND 0FFH ; DB 0FAH,04CH,011H,021H ; L0B68: CALL L0C23 JMP L1300 ; L0B6E: MVI A,10H CALL L0C53 L0B73: CALL L1373 ; L0B76: IRPC R, DB '&R' XOR ($ AND 0FFH) ENDM DB $ AND 0FFH ; DB 0C2H,7CH,0BH,0C3H,4CH,11H ; ; DISK SAVE COMMAND ; L0B87: CALL L0C51 PUSH D CALL L0C61 CALL L1268 CALL L0C4C MVI A,16H CALL L0C53 ORA A JM L0C2E MOV A,H INR A RLC MOV B,A MVI C,1 JNC L0BA7 INR C L0BA7: LXI H,BUFF L0BAA: LDAX D MOV M,A INX D INR L JNZ L0BAA MVI A,15H CALL L0C53 ORA A JNZ L0C2E DCR B JNZ L0BA7 DCR C JNZ L0BA7 CALL L0C23 LXI D,L0C0D LHLD L18C2 CALL L1824 INX H SHLD L18C2 POP D CALL L0C61 MVI A,0FH CALL L0C53 CPI 0FFH JZ L0B6E CALL L0524 L0BE3: MVI A,14H CALL L0C53 ORA A JNZ L0B6E LXI D,BUFF L0BEF: LDAX D CMP M JNZ L0C1D ORA A JZ L0C00 INX H INR E JNZ L0BEF JMP L0BE3 ; L0C00: CALL L0C23 JMP L0AA2 ; ; "UN-MODIFY" ENCRYPTION DECODE ROUTINE ; L0C06: PUSH H LXI H,0B71AH JZ L02AF ; L0C0D: IRPC R, DB '&R' XOR ($ AND 0FFH) ENDM DB $ AND 0FFH ; DB 11H ; L0C1D: CALL L0C4C JMP L0B73 ; L0C23: MVI A,10H CALL L0C53 CPI 0FFH RNZ JMP L0B73 ; L0C2E: PUSH PSW CALL L0C4C POP PSW JM L0B52 CPI 2 JNZ L0B73 CALL L1373 ; L0C3E: IRPC R, DB '&R' XOR ($ AND 0FFH) ENDM DB $ AND 0FFH ; DB 0C2H,7CH,0BH,0C9H ; L0C4C: MVI A,13H JMP L0C53 ; L0C51: MVI A,0DH L0C53: PUSH B PUSH D PUSH H MOV C,A LXI D,FCB CALL BDOS POP H POP D POP B RET ; L0C61: CALL L0CBB CALL L0D71 JC L0D5E CPI 3FH JC L0DD0 MVI C,8 L0C71: MOV M,A INX H INX D LDAX D DCR C JZ L0C89 ORA A JZ L0C82 CPI 20H JNZ L0C71 L0C82: MVI M,20H INX H DCR C JNZ L0C82 L0C89: MVI M,'P' INX H MVI M,'C' INX H MVI M,'L' CALL L0D72 RC ; ; TEST TO INSURE DISK DRIVE BETWEEN 1 AND 4 INCLUSIVE ; L0C95: CPI '1' JC L0CA8 CPI '5' JNC L0CA8 ANI 7 STA FCB RNZ ;ALWAYS RETURN DB 32H,8CH,09H ; L0CA8: CALL L1373 ; L0CAB: IRPC R,