; BASE EQU 0F000H USER EQU BASE+800H TOP EQU BASE OR 0FFH ;FOR ROM OPERATION ; ; ; TITLE ' ' ; RS1 EQU 38H IOBYT EQU 8 INIT EQU 0C4H SENSE EQU 15 RSTOP EQU 20H TTI EQU 1 TTO EQU 1 TTS EQU 0 TTC EQU 0 TTYGO EQU 1 TTYNO EQU 0 TTYDA EQU 1 TTYBE EQU 80H CRTI EQU 5 CRTS EQU 4 CRTO EQU 5 CRTDA EQU 1 CRTBE EQU 80H CASI EQU 7 CASS EQU 6 CASD EQU 7 CASDA EQU 1 CASBE EQU 80H FALSE EQU 0 TRUE EQU NOT FALSE FQUE EQU 0FFH TOUT EQU 250 DLY EQU 250 CR EQU 0DH LF EQU 0AH JUMP MACRO ;VECTORS TO OUTSIDE OF P/ROM DW J ;JUMP VECTOR FOR UNUSED COMMANDS J SET J+3 ENDM GET MACRO IN IOBYT CMA ENDM PUT MACRO CMA OUT IOBYT ENDM FETCH MACRO VALUE LXI H,VALUE DAD SP ENDM CMSK EQU 0FCH RMSK EQU 0F3H PMSK EQU 0CFH LMSK EQU 03FH CTTY EQU 0 CCRT EQU 1 BATCH EQU 2 CUSE EQU 3 RTTY EQU 0 RCAS EQU 4 RPTR EQU 8 RUSE1 EQU 0CH PTTY EQU 0 PCAS EQU 10H PPTP EQU 20H PUSE1 EQU 30H LTTY EQU 0 LCRT EQU 40H LUSE1 EQU 80H LUSE2 EQU 0C0H ; ; ORG USER ;USER DEFINED EXTERNAL I/O HANDLERS CILOC: DS 3 ;EXTERNAL CONSOLE INPUT COLOC: DS 3 ;EXTERNAL CONSOLE OUTPUT RPTRL: DS 3 ;PAPER TAPE READER R1LOC: DS 3 ;AUXILLARY READER PPTPL: DS 3 ;PAPER TAPE PUNCH P1LOC: DS 3 ;AUXILLARY STORAGE DEVICE L1LOC: DS 3 ;AUXILLARY LIST DEVICE 1 L2LOC: DS 3 ;AUXILLARY LIST DEVICE 2 CSLOC: DS 3 ;EXTERNAL CONSOLE STATUS ROUTINE J SET $ ; ; PROGRAM CODE BEGINS HERE ; ORG BASE JMP BEGIN JMP CI JMP RI JMP CO JMP PO JMP LO JMP CSTS JMP IOCHK JMP IOSET JMP MEMCK TRAP: JMP RESTART VERS: DB CR,LF,'APPLE V' DB '2.4 ' LVER EQU $-VERS BEGIN: IN SENSE OUT IOBYT TOPS: LXI H,TOP BG0: DCR H MOV A,M CMA MOV M,A CMP M CMA MOV M,A JNZ BG0 INX H MVI B,ENDX-EXIT LXI D,ENDX BG1: DCX D LDAX D DCX H MOV M,A DCR B JNZ BG1 SPHL LXI B,-40 DAD B PUSH H LXI H,0 PUSH H PUSH H PUSH H HELLO: LXI H,VERS MVI D,LVER VER0: MOV C,M INX H CALL CO DCR D JNZ VER0 START: EI LXI D,START PUSH D MVI A,TTYNO OUT TTC CALL CRLF MVI C,'.' CALL CO STAR0: CALL TI ORA A JZ STAR0 SUI 'A' RM CPI 'Z'-'A'+1 JP LER ADD A LXI H,TBL ADD L MOV L,A MOV A,M INX H MOV H,M MOV L,A MVI C,2 PCHL TBL: DW ASSIGN ;A - ASSIGN I/O DW BYE ;B - SYSTEM SHUT-DOWN DW COMP ;C - COMPARE MEMORY WITH READER INPUT DW DISP ;D - DISPLAY MEMORY ON CONSOLE IN HEX DW EOF ;E - END OF FILE TAG FOR HEX DUMPS DW FILL ;F - FILL MEMORY WITH CONSTANT DW GOTO ;G - GOTO
, W/BREAKPOINTS (2) DW HEXN ;H - HEX MATH JUMP ;I DW TEST ;J - NON-DESTRUCTIVE MEMORY TEST JUMP ;K DW LOAD ;L - LOAD A BINARY FORMAT FILE DW MOVE ;M - MOVE MASS MEMORY DW NULL ;N - PUNCH LEADER/TRAILER JUMP ;O JUMP ;P DW QUERY ;Q - QI(N)=READ PORT; QO(N,V)=SEND TO PORT DW READ ;R - READ A HEX FILE (W/CHECKSUM) DW SUBS ;S - EXAMINE/SUBSTITUTE MEMORY DW TYPE ;T - DISPLAY MEMORY IN ASCII DW UNLD ;U - DUMP MEMORY IN BINARY FILE FORMAT DW VERIFY ;V - COMPARE MEMORY TO MEMORY DW WRITE ;W - DUMP MEMORY IN HEX FILE FORMAT DW X ;X - EXAMINE/MODIFY CPU REGISTERS DW WHERE ;Y - FIND 'N' BYTES IN MEMORY DW SIZE ;Z - ADDR OF LAST R/W MEMORY LOCATION ASSIGN: CALL TI LXI H,LTBL MVI C,4 AS0: CMP M INX H JZ AS1 INX H INX H INX H DCR C JZ LER JMP AS0 AS1: MOV B,M INX H MOV E,M INX H MOV D,M XCHG AS2: CALL TI CPI '=' JNZ AS2 CALL TI MVI C,4 AS4: CMP M INX H JZ AS5 INX H DCR C JZ LER JMP AS4 AS5: CALL TI CPI CR JNZ AS5 MOV C,M CALL IOCHK ANA B ORA C MOV C,A IOSET: PUSH PSW MOV A,C PUT POP PSW RET BYE: CALL TI CPI 'Y' JNZ LER CALL TI CPI 'E' JNZ LER CALL CRLF DI BYE0: CALL CI ANI 7FH CPI 1AH JNZ BYE0 POP D JMP HELLO COMP: CALL EXLF CM0: CALL RI JC LER CMP M CNZ CM1 CALL HILO JNC CM0 RET CM1: MOV B,A CALL HLSP MOV A,M CALL LBYTE CALL BLK MOV A,B CALL LBYTE JMP CRLF DISP: CALL EXPR POP D POP H DI0: CALL CRLF CALL LADR DI1: CALL BLK MOV A,M CALL LBYTE CALL HILO RC MOV A,L ANI 0FH JNZ DI1 JMP DI0 EOF: DCR C CALL EXPR CALL PEOL MVI C,':' CALL PO XRA A MOV D,A CALL PBYTE POP H CALL PADR MVI A,1 CALL PBYTE XRA A SUB D CALL PBYTE JMP NULL FILL: INR C CALL EXPR POP B POP D POP H FI0: MOV M,C CALL HILO JNC FI0 POP D JMP START GOTO: CALL PCHK JC GO3 JZ GO0 CALL EXF POP D FETCH PLOC MOV M,D DCX H MOV M,E MOV A,B CPI CR JZ GO3 GO0: MVI D,2 FETCH TLOCX GO1: PUSH H MVI C,1 CALL EXPR MOV E,B POP B POP H MOV A,B ORA C JZ GO2 MOV M,C INX H MOV M,B INX H LDAX B MOV M,A INX H MVI A,(RST 7) STAX B GO2: MOV A,E CPI CR JZ GO2A DCR D JNZ GO1 GO2A: MVI A,0C3H STA RS1 LXI H,TRAP SHLD RS1+1 GO3: CALL CRLF POP D FETCH 8 PCHL TEST: CALL EXLF T1: MOV A,M CMA MOV M,A CMP M PUSH PSW CNZ CM1 POP PSW CMA MOV M,A CALL HILO JNC T1 RET WHERE: MVI D,0 WH0: MVI C,1 CALL EXPR INR D MOV A,B CPI CR JNZ WH0 LXI B,0 MOV H,B MOV A,D DCR A ADD A MOV L,A DAD SP PUSH H PUSH B LOOKC: CALL CRLF LOOK: POP B POP H MOV E,D MOV A,B ANA C INR A JZ DONE LDAX B INX B CMP M PUSH H PUSH B JNZ LOOK FOUND: DCR E JZ TELL LDAX B INX B DCX H DCX H CMP M JNZ LOOK JMP FOUND TELL: POP H PUSH H DCX H CALL LADR JMP LOOKC DONE: POP B DCR E JNZ DONE RET MOVE: INR C CALL EXPR POP B POP D POP H MV0: MOV A,M STAX B INX B CALL HILO JNC MV0 RET NULL: CALL LEAD JMP STAR0 READ: DCR C CALL EXPR RED0: POP H PUSH H CALL RIX MVI B,':' SUB B JNZ RED0 MOV D,A CALL BYTE JZ RED2 MOV E,A CALL BYTE PUSH PSW CALL BYTE POP B MNV C,A DAD B CALL BYTE RED1: CALL BYTE MOV M,A INX H DCR E JNZ RED1 CALL BYTE JNZ LER JMP RED0 RED2: CALL BYTE MOV H,A CALL BYTE MOV L,A ORA H POP D RZ XCHG FETCH PLOC MOV M,D DCX H MOV M,E RET SUBS: DCR C CALL EXPR CALL P2C JC LER POP H SU0: MOV A,M CALL LBYTE MVI C,'-' CALL COPCK RC JZ SU1 PUSH H CALL EXF POP D POP H MOV M,E MOV A,B CPI CR RZ SU1: INX H MOV A,L ANI 7 CZ CRLF JMP SU0 TYPE: CALL EXPR POP D POP H CALL TY1 TY0: MOV A,M ANI 7FH MOV C,A SUI ' ' CM TY3 ADI 22H CM TY3 CALL CO CALL HILO RC DCR B CZ TY1 JMP TY0 TY1: MVI B,64 CALL CRLF JMP HLSP TY3: MVI C,'.' RET UNLD: CALL EXLF CALL CI CALL LEAD CALL UNL2 UNL1: MOV C,M CALL PO CALL HILO JNC UNL1 CALL UNL2 JMP NULL UNL2: LXI B,8FFH UNL3: CALL PO DCR B JNZ UNL3 RET WRITE: CALL EXLF WRI0: MOV A,L ADI 16 MOV C,A MOV A,H ACI 0 MOV B,A MOV A,E SUB C MOV C,A MOV A,D SBB B JC WRI1 MVI A,16 JMP WRI2 WRI1: MOV A,C ADI 17 WRI2: ORA A RZ PUSH D MOV E,A MVI D,0 CALL PEOL MVI C,':' CALL PO MOV A,E CALL PBYTE CALL PADR XRA A CALL PBYTE WRI3: MOV A,M INX H CALL PBYTE DCR E JNZ WRI3 XRA A SUB D CALL PBYTE POP D JMP WRI0 X: CALL TI LXI H,ACTBL CPI CR JZ X6 X0: CMP M JZ X1 PUSH PSW MOV A,M ORA A JM LER INX H INX H INX H POP PSW JMP X0 X1: CALL BLK X2: INX H MOV A,M XCHG MOV L,A MVI H,0 DAD SP XCHG INX H MOV B,M INX H LDAX D CALL LBYTE DCR B JZ X3 DCX D LDAX D CALL LBYTE X3: INR B MVI C,'-' CALL COPCK RC JZ X5 PUSH H PUSH B CALL EXF POP H POP PSW PUSH B PUSH PSW MOV A,L STAX D POP B DCR B JZ X4 INX D MOV A,H STAX D X4: POP B POP H X5: MOV A,M ORA A RM MOV A,B CPI CR RZ JMP X2 X6: CALL CRLF X7: CALL BLK MOV A,M INX H ORA A RM MOV C,A CALL CO MVI C,'=' CALL CO MOV A,M INX H XCH MOV L,A MVI H,0 DAD SP XCHG MOV B,M INX H LDAX D CALL LBYTE DCR B JZ X7 DCX D LDAX D CALL LBYTE JMP X7 CCHK: CALL CI ANI 7FH CPI 3 RNZ LER: CALL MEMSIZ LXI D,-8 DAD D SPHL MVI C,'*' CALL CO JMP START HLSP: CALL LADR BLK: MVI C,' ' CO: CALL IOCHK ANI NOT CMSK JNZ CO0 TTYOUT: IN TTS ANI TTYBE JNZ TTYOUT MOV A,C OUT TTO RET CO0: CPI CCRT JNZ CO1 CRTOUT: IN CRTS ANI CRTBE JNZ CRTOUT MOV A,C OUT CRTO RET CO1: CPI BATCH JZ LO JMP COLOC BYTE: CALL RIBBLE RLC RLC RLC RLC MOV C,A CALL RIBBLE ORA C MOV C,A ADD D MOV D,A MOV A,C RET CI: CALL IOCHK ANI NOT CMSK JNZ CI1 TTYIN: IN TTS ANI TTYDA JNZ TTYIN IN TTI RET CI1: CPI CCRT JNZ CI2 CRTIN: IN CRTS ANI CRTDA JNZ CRTIN IN CRTI RET CI2: CPI BATCH JZ RI JMP CILOC CONV: ADI 90H DAA ACI 40H DAA MOV C,A RET EXLF: CALL EXPR POP D POP H CRLF: MVI C,CR CALL CO MVI C,LF CALL CO CALL CSTS ORA A CNZ CCHK MVI C,0FFH CALL CO JMP CO CSTS: CALL IOCHK ANI NOT CMSK JNZ CS0 IN TTS JMP CS1 CS0: CPI CCRT JNZ CS3 IN CRTS CS1: ANI TTYDA MVI A,FALSE CS2: RNZ CMA RET CS3: CPI BATCH MVI A,TRUE JZ CS2 JMP CSLOC EXPR: LXI H,0 EX0: CALL TI EX1: MOV B,A CALL NIBBLE JC EX2 DAD H DAD H DAD H DAD H ORA L MOV L,A JMP EX0 EX2: XTHL PUSH H MOV A,B CALL P2C JNC EX3 DCR C JNZ LER RET EX3: JNZ LER DCR C JNZ EXPR RET EXF: MVI C,1 LXI H,0 JMP EX1 HILO: INX H MOV A,H ORA L STC RZ MOV A,E SUB L MOV A,D SBBH RET IOCHK: GET RET HEXN CALL EXLF PUSH H DAD D CALL HLSP POP H MOV A,L SUB E MOV L,A MOV A,H SBB D MOV H,A LADR: MOV A,H CALL LBYTE MOV A,L LBYTE: PUSH PSW RRC RRC RRC RRC ANI 0FH CALL HXD POP PSW ANI 0FH HXD: CALL CONV JMP CO LEAD: MVI B,60 LE0: MVI C,0 CALL PO DCR B JNZ LE0 RET LO: CALL IOCHK ANI NOT LMSK JZ TTYOUT CPI LCRT JZ CRTOUT CPI LUSE1 JZ L1LOC JMP L2LOC MEMCK: PUSH H CALL MEMSIZ MOV B,H MVI A,0C0H POP H RET MEMSIZ: PUSH B LHLD TOPS+1 MEM0: DCR H MOV A,M CMA MOV M,A CMP M CMA MOV M,A JNZ MEM0 INX H LXI B,EXIT-ENDX DAD B POP B RET RIBBLE: CALL RIX NIBBLE: SUI '0' RC ADI '0'-'G' RC ADI 6 JP NI0 ADI 7 RC NI0: ADI 10 ORA A RET PADR: MOV A,H CALL PBYTE MOV A,L PBYTE: PUSH PSW RRC RRC RRC RRC ANI 0FH CALL CONV CALL PO POP PSW PUSH PSW ANI 0FH CALL CONV CALL PO POP PSW ADD D MOV D,A RET SIZE: CALL CRLF CALL MEMSIZ LXI B,(ENDX-EXIT)-1 DAD B JMP LADR COPCK: CALL CO PCHK: CALL TI P2C: CPI ' ' RZ CPI ',' RZ CPI CR STC CMC RNZ STC RET PEOL: MVI C,CR CALL PO MVI C,LF PO: CALL IOCHK ANI NOT PMSK JZ TTYOUT CPI PCAS JNZ PO1 PO0: IN CASS ANI CASBE JNZ PO0 MOV A,C OUT CASD RET PO1: CPI PPTP JZ PPTPL JMP P1LOC RI: PUSH H CALL IOCHK ANI NOT RMSK JNZ RI3 MVI A,TTYGO OUT TTC MVI A,TTYNO OUT TTC MVI H,TOUT RI0: IN TTS ANI TTYDA JZ RI2 PUSH B MVI B,DLY DL0: DCR B JNZ DL0 POP B DCR H JNZ RI0 RI1: XRA A STC POP H RET RI2: IN TTI ORA A POP H RET RI3: CPI RCAS JNZ RI6 RI4: IN CASS ANI RSTOP ;EXTERNAL METHOD OF ABORTING JZ RI1 IN CASS ANI CASDA JNZ RI4 RI5: IN CASI ORA A POP H RET RI6: POP H CPI RPTR JZ RPTRL JMP R1LOC RIX: CALL RI JC LER ANI 7FH RET LOAD: DCR C CALL EXPR POP H MVI E,FQUE LD0: MVI D,4 LD1: CALL RIFF JNZ LD0 DCR D JNZ LD1 LD2: CALL RIFF JZ LD2 MOV M,A MVI A,7 ;BELL OUT TTO LD3: INX H CALL RIFF JZ ECHK MOV M,A JMP LD3 ECHK: CALL RIFF JZ ECHK1 ECHK0: MOV M,E INX H MOV M,A JMP LD3 ECHK1: CALL RIFF JZ ECHK3 ECHK2: MOV M,E INX H JMP ECHK0 ECHK3: CALL RIFF RZ MOV M,E INX H JMP ECHK2 RIFF: CALL RI JC LER CMP E RET RESTART: PUSH H PUSH D PUSH B PUSH PSW CALL MEMSIZ XCHG FETCH 10 MVI B,4 XCHG RST0: DCX H MOV M,D DCX H MOV M,E POP D DCR B JNZ RST0 POP B DCX B SPHL FETCH TLOC MOV A,M SUB C INX H JNZ RST1 MOV A,M SUB B JZ RST3 RST1: INX H INX H MOV A,M SUB C JNZ RST2 INX H MOV A,M SUB B JZ RST3 RST2: INX B RST3: FETCH LLOC MOV M,E INX H MOV M,D IN\ H INX H MOV M,C INX H MOV M,B PUSH B MVI C,'*' CALL CO POP H CALL LADR FETCH TLOC MVI D,2 RST4: MOV C,M MVI M,0 INX H MOV B,M MVI M,0 INX H MOV A,C ORA B JZ RST5 MOV A,M STAX B RST5: INX H DCR D JNZ RST4 JMP START TI: CALL CI ANI 7FH RZ CPI CR RZ CPI 'N' RZ PUSH B MOV C,A CALL CO MOV A,C POP B RET QUERY: CALL TI CPI 'O' JZ QOUT CPI 'I' JNZ LER DCR C CALL EXPR POP B FETCH QILOC Q0: MOV M,C DCX H LXI D,QI1 PUSH D PCHL QI1: MVI D,8 MOV E,A CALL BLK QI2: MOV A,E RAL MOV E,A MVI A,0 ACI '0' MOV C,A CALL CO DCR D JNZ QI2 RET QOUT: CALL EXPR POP D POP B MOV A,E FETCH QOLOC MOV M,C DCX H PCHL VERIFY: INR C CALL EXPR CALL CRLF POP B POP D POP H VERI0: LDAX B CMP M CNZ ERROR INX B CALL HILO JNC VERI0 RET ERROR: PUSH B CALL CM1 POP B RET LTBL: DB 'C',CMSK DW ACT DB 'R',RMSK DW ART DB 'P',PMSK DW APT DB 'L',LMSK DW ALT ACT: DB 'T',CTTY ;T=TELETYPE DB 'C',CCRT ;C=CRT (VIDEO MONITOR) DB 'B',BATCH ;BATCH MODE, COMMANDS FROM READER DB '1',CUSE ART: DB 'T',RTTY DB 'P',RPTR ;P=PAPER TAPE DB 'C',RCAS ;C=CASSETTE DB '1',RUSE1 APT: DB 'T',PTTY DB 'P',PPTP DB 'C',PCAS ;C=CASSETTE DB '1',PUSE1 ALT: DB 'T',LTTY DB 'C',LCRT DB '1',LUSE1 DB '2',LUSE2 EXIT: POP D POP B POP PSW POP H SPHL EI LXI H,$-$ HLX EQU $-2 JMP $-$ PCX EQU $-2 T1A: DW 0 DB 0 DW 0 DB 0 QIO: IN 0 RET OUT 0 RET ; ENDX: ALOC EQU 7 BLOC EQU 5 CLOC EQU 4 DLOC EQU 3 ELOC EQU 2 FLOC EQU 6 HLOC EQU HLX-EXIT+11 LLOC EQU HLX-EXIT+8 PLOC EQU PCX-EXIT+11 SLOC EQU 9 TLOC EQU T1A-EXIT+8 TLOCX EQU TLOC+2 QILOC EQU QIO-EXIT+11 QOLOC EQU QIO-EXIT+14 ; ACTBL: DB 'A', ALOC, 1 DB 'B', BLOC, 1 DB 'C', CLOC, 1 DB 'D', DLOC, 1 DB 'E', ELOC, 1 DB 'F', FLOC, 1 DB 'H', HLOC, 1 DB 'L', LLOC+2, 1 DB 'M', HLOC, 2 DB 'P', PLOC, 2 DB 'S', SLOC, 2 DB -1 Z: ;END OF PROGRAM ; ; ; END