;EDITED BY HERB JOHNSON MAY 26 - JUNE 9 2019 TO MATCH ;SSZ80 DESIGN LIMITED PRINTED VERSION OF ZAPPLE MONITOR ;EDITED FROM V1.05R VERSION 1979 - LOOK HARD FOR TRANSCRIPTION ERRORS! ;I'VE RETAINED COMMENTARY FROM V1 CODE NOT IN V2 CODE - IS IT CORRECT? ; << ZAPPLE 2-K MONITOR SYSTEM >> ; by ; ; COMPUTER DESIGN LABS, INC. ; REESEARCH PARK ; PRINCETON, NEW JERSEY 08540 ; ; COPYRIGHT APRIL 1978 TDL INC ; ASSEMBLED BY ROGER AMIDON ; MODIFIED BY RUSSELL PILLSBURY ; .PHEX .PABS ;THIS MONITOR IN ABSOLUTE FORMAT .XLINK ; ; ;BASE = \"STARTING ADDRESS?" BASE = 0F000H ; ; ;-TELEPRINTER ; TTI = 5 ;DATA IN PORT TTO = 7 ;DATA OUT PORT TTOP = 4 ;PIA DATA PORT TTS = 6 ;STATUS PORT (IN) TTYDA = 1 ;DATA AVAILABLE MASK BIT TTYBE = 2 ;XMTR BUFFER EMPTY MASK ; ; MAGTAPE SYSTEM CASS = 0F800H POUSR = 0F803H RIUSR = 0F806H T.ON = 12H T.OFF = 14H X.ON = 11H X.OFF = 13H ; ; ; USER = 0E000H IOBYT = USER ;R/W PORT FOR TEMP. STORAGE SENSE = 0FFH ;TEST PORT TO ABORT READ OPERATION RST7 = 38H ;RST 7 (LOCATION FOR TRAP) FALSE = 0 ;ISN'T SO TRUE = # FALSE ;IT IS SO CR = 0DH ;ASCII CARRIAGE RETURN LF = 0AH ;ASCII LINE FEED BS = 8 ;BACK SPACE FIL = 00 ;FILL CHARACTERS AFTER CRLF MAX = 7 ;NUMBER OF QUES IN EOF ; ; ; CMSK = 11111100B ;CONSOLE DEVICE RMSK = 11110011B ;STORAGE DEVICE (IN) PMSK = 11001111B ;STORAGE DEVICE (OUT) LMSK = 00111111B ;LIST DEVICE ; ;-CONSOLE CONFIGURATION CTTY = 0 ;TELEPRINTER CCRT = 1 ;C.R.T. BATCH = 2 ;READER FOR INPUT, LIST FOR OUTPUT CUSE = 3 ;USER DEFINED ; ;-STORAGE INPUT CONFIGURATION RTTY = 0 ;TELEPRINTER READER RPTR = 4 ;HIGH-SPEED RDR (EXTERNAL ROUTINE) RCAS = 8 ;CASSETTE RUSER = 0CH ;USER DEFINED ; ;-STORAGE OUTPUT CONFIGURATION PTTY = 0 ;TELEPRINTER PUNCH PPTP = 10H ;HIGH-SPEED PUNCH (EXTERNAL ROUTINE) PCAS = 20H ;CASSETTE PUSER = 30H ;USER DEFINED ; ;-LIST DEVICE CONFIGURATION LTTY = 0 ;TELEPRINTER PRINTER LCRT = 40H ;C.R.T. SCREEN LINE = 80H ;LINE PRINTER (EXTERNAL ROUTINE) LUSER = 0C0H ;USER DEFINED ; ; ; VECTORS FOR USER DEFINED ROUTINES ; .LOC USER+20H CILOC: .BLKB 3 ;CONSOLE INPUT COLOC: .BLKB 3 ;CONSOLE OUTPUT CRTIN: .BLKB 3 ;CRT KEYBOARD RTN CRTOUT: .BLKB 3 ;CRTOUTPUT ROUTINE CRTST: .BLKB 3 ;CRT STATUS CHECK RTN LPNTR: .BLKB 3 ;LINE PRINTER OUTPUT ROUTINE RPTPL: .BLKB 3 ;HIGH-SPEED READER RULOC: .BLKB 3 ;USER DEFINED STORAGE (INPUT) PTPL: .BLKB 3 ;HIGH-SPEED PUNCH PULOC: .BLKB 3 ;USER DEFINED STORAGE (OUTPUT) LULOC: .BLKB 3 ;USER DEFINED PRINTER CSLOC: .BLKB 3 ;CONSOLE INPUT STATUS ROUTINE J = . ; PROGRAM CODE BEGINS HERE ; .LOC BASE JMP BEGIN ;GO AROUND VECTORS ; ; ; ; THESE VECTORS MAY BE USED BY USER WRITTEN ; PROGRAMS TO SIMPLIFY THE HANDLING OF I/O ; FROM SYSTEM TO SYSTEM. WHATEVER THE CURRENT ; ASSIGNED DEVICE, THESE VECTORS WILL PERFORM ; THE REQUIRED I/O OPERATION, AND RETURN TO ; THE CALLING PROGRAM. (RET) ; ; REGISTER CONVENTIONS ; ; ANY INPUT OR OUTPUT DEVICE- ; CHARACTER TO BE OUTPUT IN 'C' REGISTER. ; CHARACTER WILL BE IN 'A' REGISTER UPON ; RETURNING FROM AN INPUT OR OUTPUT. ; 'CSTS'- ; RETURNS TRUE (0FFH IN 'A' REG.) IF THERE IS ; SOMETHING WAITING, AND ZERO (00) IF NOT. ; 'IOCHK'- ; RETURNS WITH THE CURRENT I/O CONFIGURATION ; BYTE IN 'A' REGISTER. ; 'IOSET'- ; ALLOWS A PROGRAM TO DYNAMICALLY ALTER THE ; CURRENT I/O CONFIGURATION, AND REQUIRES ; THE NEW BYTE IN 'C' REGISTER. ; 'MEMCK'- ; RETURNS WITH THE HIGHEST ALLOWED USER ; MEMORY LOCATION. 'B'=HIGH BYTE, 'A'=LOW. ; 'TRAP'- ; THIS IS THE 'BREAKPOINT' ENTRY POINT, BUT MAY ; BE CALLED. IT WILL SAVE THE MACHINE STATE. ; RETURN IS MADE WITH A 'G[CR]' ON THE CONSOLE. ; JMP CI ;CONSOLE INPUT JMP RI ;READER INPUT JMP CO ;CONSOLE OUTPUT JMP PO ;PUNCH OUTPUT JMP LO ;LIST OUTPUT JMP CSTS ;CONSOLE STATUS JMP IOCHK ;I/O CHECK JMP IOSET ;I/O SET JMP MEMCK ;MEMORY LIMIT CHECK ; THIS IS THE BREAKPOINT "TRAP" HANDLING ; ROUTINE. ALL USER REGISTERS ARE SAVED ; FOR DISPLAY PURPOSES, AND THE CONTENTS ; ARE RESTORED WHEN EXECUTING A "GO" (G) ; COMMAND. ; TRAP: PUSH PSW LDAI DI XTHL PUSH D PUSH B PUSH H PUSH PSW POP B LDAR ANI 7FH BIT 2,C JRZ .+4 ORI 80H STAR LXI D,..TR0 JMPR MEMSIZ+1 ..TR0: LXI H, 10 ;GO UP 10 BYTES IN STACK DAD SP MVI B,4 ;PICK OFF REG. XCHG ..TR1: DCX H MOV M,D ;SAVE IN WORKAREA DCX H MOV M,E POP D DJNZ ..TR1 POP B DCX B ;ADJUST P.C. VALUE SPHL ;SET MONITOR STACK CALL INTCK LXI H, TLOCX DAD SP CALL ..TR6 INX H INX H CNZ ..TR6 JRZ ..TR2 INX B ..TR2: LXI H, LLOCX DAD SP MOV M,E ;STORE USER H&L INX H MOV M,D INX H INX H INX H MOV M,C ;AND USER P.C. INX H MOV M,B LXI H, TLOCX DAD SP PUSH B LXI B, 200H ..TR3: MOV E,M ;REPLACE BYTES TAKEN FOR TRAP MOV M,C ;ZERO OUT STORAGE AREA INX H MOV D,M MOV M,C INX H MOV A,E ORA D ;DO NOTHING IF ZERO JRZ ..TR4 MOV A,M STAX D ;STORE BYTE ..TR4: INX H ;SAME THING DJNZ ..TR3 ;FOR OTHER BREAKPOINT EXAF ;GET ALTERNATE SET OF REG.'S EXX XTHL ;AND STORE IN WORKSPACE PUSH D PUSH B PUSH PSW PUSH X PUSH Y LDAR ;GET REFRESH BYTE MOV C,A LDAI ;GET INTERUPT VECTOR BYTE MOV B,A PUSH B ;SAVE MVI C, '@' CALL CO CALL LADR JMP START ;BACK TO START ; ..TR6: MOV A,M SUB C ;LOOK FOR A TRAP/MATCH INX H RNZ MOV A,M SUB B RET ; ; THIS IS A CALLED ROUTINE USED ; TO CALCULATE THE TOP OF MEMORY ; STARTING FROM THE BOTTOM OF ; MEMORY, AND SEARCHING UPWARD UNTIL ; FIRST R/W MEMORY IS FOUND, AND THEN ; CONTINUING UNTIL THE END OF THE R/W ; MEMORY. THIS ALLOWS R.O.M. AT ZERO, ; AND INSURES A CONTINUOUS MEMORY BLOCK ; HAS BEEN FOUND. ; IT IS USED BY THE ERROR ROUTINE TO ; RESET THE STACK POINTER. ; MEMSIZ: POP D LXI H,-1 ;START AT THE BOTTOM DI ..M0: INR H ;FIRST FIND R/W MOV A,M CMA MOV M,A CMP M CMA MOV M,A JRNZ ..M0 ;KEEP LOOKING FOR RAM ..M1: INR H ;R/W FOUND, NOW FIND END MOV A,M MOV B,C MOV C,A CMA MOV M,A CMP M MOV M,C JRZ ..M1 ;NOT THERE YET MOV A,B ..M2: LXI B,(EXIT-ENDX)-256 DAD B XCHG PCHL ; ; THIS ROUTINE RETURNS TO A USER ; PROGRAM THE CURRENT TOP OF ; MEMORY VALUE MINUS WORKSPACE ; AREA USED BY THE MONITOR. ; MEMCK: PUSH H PUSH D PUSH B LDAR PUSH PSW CALL MEMSIZ POP PSW POP B MOV B,D POP D POP H MVI A, 0A0H RPO EI RET MSG: .BYTE CR,LF,FIL,FIL .ASCII 'Zapple V2.R' MSGL = .-MSG ; BEGIN: IN SENSE ;INITIALIZE I/O CONFIGURATION STA IOBYT LXI SP, USER+3FFH ;SET TEMP STACK MVI A,7 OUT TTOP OUT TTOP+1 OUT TTOP OUT TTS MVI A, 3CH OUT TTS+1 CALL PORA ;IS IT THE PIA? JRNZ STSTK MVI A, 3 ;RESET ACIA OUT TTS MVI A, 51H OUT TTS ;INIT ACIA STSTK: CALL MEMSIZ XCHG SPHL CALL INTCK XCHG LXI B,ENDX-EXIT LXI H,EXIT LDIR ;MOVE TO RAM LXI H, -5FH DAD D PUSH H ;PRE-LOAD STACK VALUE LXI H,0 ;INITIALIZE OTHER REGISTERS MVI B,10 ; (20 OF THEM) ..B2: PUSH H DJNZ ..B2 MVI B, MSGL CALL TOM START: LXI D,START ;MAIN 'WORK' LOOP PUSH D ;SET UP A RETURN TO HERE CALL CRLF MVI C,'.' CALL CO LXI H,TBL ;POINT TO INTERNAL TABLE STAR0: CALL TI ;GET A CONSOLE CHARACTER JRZ STAR0 ;GET ANOTHER SUI 'A' ;QUALIFY THE CHARACTER RC ;Z ADD A ;A*2 ADD L ;ADD IN DISPLACEMENT MOV L,A MOV A,M INX H MOV H,M MOV L,A PCHL ;GO EXECUTE COMMAND. ; ; ; ; TBL: .WORD ASSIGN ;A - ASSIGN I/O .WORD BRANCH ;B - BRANCH TO USER TABLE .WORD CASS ;C - MAGTAPE .WORD DISP ;D - DISPLAY MEMORY ON CONS. IN HEX .WORD EOF ;E - END OF FILE TAG FOR HEX DUMPS .WORD FILL ;F - FILL MEMORY WITH A CONSTANT .WORD GOTO ;G - GOTO [ADDR]<,>BREAKPOINTS (2) .WORD HEXN ;H - HEX MATH. , .WORD J ;I * USER DEFINED J=J+3 ;INCREMENT VECTOR ADDR .WORD TEST ;J - NON-DESTRUCTIVE MEMORY TEST .WORD J ;K * USER DEFINED J=J+3 ;INCREMENT VECTOR ADDR .WORD LOAD ;L - LOAD A BINARY FORMAT FILE .WORD MOVE ;M - MOVE BLOCKS OF MEMORY .WORD NULL ;N - PUNCH NULLS ON PUNCH DEVICED .WORD POUT ;O - O(N)=OUTPUT TO PORT N .WORD PUTA ;P - 'PUT' ASCII INTO MEMORY. .WORD QUERY ;Q - QI(N)=DISP. N; QO(N,V)=OUT N,V .WORD READ ;R - READ A HEX FILE (W/CHECKSUMS) .WORD SUBS ;S - SUBSTITUTE &/OR EXAMINE MEMORY .WORD TYPE ;T - TYPE MEMORY IN ASCII .WORD UNLD ;U - MEMORY TO PUNCH (BINARY FORMAT) .WORD VERIFY ;V - COMPARE MEMORY AGAINST MEMORY .WORD WRITE ;W - MEMORY TO PUNCH (HEX FORMAT) .WORD XAM ;X - EXAMINE & MODIFY CPU REGISTERS .WORD WHERE ;Y - FIND SEQUENCE OF BYTES IN MEM. .WORD SIZE ;Z - ADDRESS OF LAST R/W LOCATION ; UTAB = USER+80H ; ; ; THIS COMMAND WILL FILL A BLOCK OF MEMORY ; WITH A VALUE. IE: F0,1FFF,0 FILLS FROM ; <1> TO <2> WITH THE BYTE <3>. HANDY FOR ; INITIALIZING A BLOCK TO A SPECIFIC VALUE, OR ; MEMORY TO A CONSTANT VALUE BEFORE LOADING ; A PROGRAM. (ZERO IS ESPECIALLY USEFUL.) ; FILL: CALL EXP3 ;GET 3 PARAMETERS ..F: MOV M,C ;STORE THE BYTE CALL HILO JRNC ..F POP D ;RESTORE STACK JMPR START ; IN CASE OF ACCIDENTS BRANCH: CALL TI CPI "." JRNZ ERRX LXI H,UTAB JMPR STAR0 ; OF THE VARIOUS I/O DRIVERS & DEVICES. THIS IS ; ACCOMPLISHED VIA A HARDWARE READ/WRITE PORT. ; THIS PORT IS INITIALIZED UPON SIGN-ON ; BY THE VALUE READ ON PORT 'SENSE'. IT MAY BE ; DYNAMICALLY MODIFIED THROUGH CONSOLE COMMANDS. ; ; THE VALUE ON THE 'IOBYT' PORT REPRESENTS THE ; CURRENT CONFIGURATION. IT IS STRUCTURED THUSLY: ; ; 000000XX - WHERE XX REPRESENTS THE CURRENT CONSOLE. ; 0000XX00 - WHERE XX REPRESENTS THE CURRENT READER. ; 00XX0000 - WHERE XX REPRESENTS THE CURRENT PUNCH. ; XX000000 - WHERE XX REPRESENTS THE CURRENT LISTER. ; ; WHEN XX = 00, THE DEVICE IS ALWAYS THE ; TELEPRINTER. WHEN XX = 11, THE DEVICE IS ALWAYS THE ; USER DEFINED. SEE OPERATORS MANUAL FOR FURTHER ; DETAILS. ; ASSIGN: CALL TI ;GET DEVICE NAME LXI H,LTBL-1 ;POINT TO DEVICE TABLE LXI D,4 ;IDENTIFIER + 4 DEV. IN TABLE CALL ..A3 ;GET DEVICE PUSH B ..A1: CALL TI ;SCAN PAST '=' SUI '=' JRNZ ..A1 MOV E,A CALL TI ;GET NEW ASSIGNMENT CALL ..A3 POP D MVI H,3 MOV L,C MOV A,E ..A2: DCR A JM ASET DAD H DAD H JMPR ..A2 ..A3: LXI B,400H ;4 POSSIBLE ASSIGNMENTS ..A4: INX H ;POINT TO ASSIGNMENT NAME CMP M ;LOOK FOR PROPER MATCH RZ ;MATCH FOUND DAD D INR C ;KEEP TRACK OF ASSIGNMENT NMBR DJNZ ..A4 ERRX: JMP ERROR ASET: XRA H MOV H,A CALL IOCHK ANA H ;MODIFY ONLY SELECTED DEVICE ORA L ;'OR' IN NEW BIT PATTERN MOV C,A ;NEW CONFIGURATION ; ; THIS ALLOWS USER PROGRAMS TO MODIFY ; THE I/O CONFIGURATION DYNAMICALLY ; DURING EXECUTION. ; IOSET: MOV A,C ;NEW I/O BYTE PASSED IN C REG STA IOBYT ;IN MEMORY RET ; IOCHK: LDA IOBYT ;GET SAVED BYTE RET ; ; THIS DISPLAYS THE CONTENTS OF MEMORY IN BASE HEX ; WITH THE STARTING LOCATION ON EACH LINE.(BETWEEN ; THE TWO PARAMETERS GIVEN). 16 BYTES PER LINE MAX. ; DISP: MVI A,16 CALL EXPC ;GET DISPLAY RANGE ..D0: CALL LFADRX ;CRLF & PRINT ADDR. ..D1: CALL BLK ;SPACE OVER MOV A,M CALL LBYTE CALL HILOX ;RANGE CHECK DJNZ ..D1 JMPR ..D0 ;TIME TO CRLF ; ; THIS COMMAND ALLOWS EXECUTION OF ANOTHER ; PROGRAM WHILE RETAINING SOME MONITOR ; CONTROL BY SETTING BREAKPOINTS. ; ; TO SIMPLY EXECUTE, TYPE 'G[CR]'. TO SET ; A BREAKPOINT TRAP, ADD THE ADDRESS(ES) TO THE ; COMMAND. IE: G,[CR]. TWO BREAKPOINTS ; ARE ALLOWED, ENOUGH TO SATISFY MOST REQUIREMENTS. ; ONCE A BREAKPOINT HAS BEEN REACHED, THE ; REGISTERS MAY BE EXAMINED OR MODIFIED. THE ; PROGRAM CAN THEN BE CONTINUED BY TYPING ONLY ; A 'G[CR]'. OR ANOTHER BREAKPOINT COULD BE ; IMPLEMENTED AT THAT TIME BY TYPING 'G,[CR]'. ; ; *NOTE: THIS IS SOFTWARE CONTROLLED, AND THE ; BREAKPOINT MUST OCCUR ON AN INTRUCTION ; BYTE. ; GOTO: CALL PCHK ;GET A POSSIBLE ADDRESS JRZ ..G0 ;DELIMETER ENTERED CALL EXF ;GET ONE EXPRESSION POP D LXI H, PLOC ;PLACE ADDRESS IN 'P' LOCATION DAD SP MOV M,D ;HIGH BYTE DCX H MOV M,E ;LOW BYTE ..G0: CPI CR ;SEE IF LAST CHARACTER WAS CR JRZ ..G4 ;YES, LEAVE MVI D,2 ;TWO BREAKPOINTS MAX LXI H, TLOC ;POINT TO TRAP STORAGE DAD SP ..G1: PUSH H ;SAVE STORAGE POINTER CALL EXPR ;GET A TRAP ADDRESS POP B ;TRAP ADDR. POP H ;STORAGE PUSH PSW MOV A,B ;LOOK AT TRAP ADDR ORA C JRZ ..G2 ;DON'T SET A TRAP AT 0 MOV M,C ;SAVE BKPT ADDR INX H MOV M,B INX H LDAX B ;PICK UP INST. BYTE MOV M,A ;SAVE THAT TOO INX H MVI A,0FFH ;RST 7 STAX B ;SOFTWARE INTERUPT ..G2: POP PSW ;LOOK AT DELIMITER JRC ..G3 DCR D ;COUNT BKPTS JRNZ ..G1 ;GET ONE MORE ..G3: MVI A,JMP ;SET UP JMP C3 INSTRUCTION STA RST7 ; AT RESTART TRAP LOC. LXI H,TRAP ; TO MONITOR VECTOR SHLD RST7+1 ..G4: CALL CRLF POP D ;CLEAR SYSTEM RETURN POP D PUSH D BIT 7,E LXI H,INTLOC DAD SP MVI M,(DI) JRZ ..G5 MVI M,(EI) ..G5: LXI H,16H ;FIND 'EXIT' ROUTINE DAD SP ;UP IN STACK PCHL ;GOOD LUCK. ; ; ; THIS IS A 'QUICKIE' MEMORY TEST TO SPOT ; HARD MEMORY FAILURES, OR ACCIDENTLY ; PROTECTED MEMORY LOCATIONS. IT IS NOT ; MEANT TO BE THE DEFINITIVE MEMORY DIAGNOSTIC. ; IT IS, HOWEVER, NON-DESTRUCTIVE. ERRORS ARE ; PRINTED ON THE CONSOLE AS FOLLOWS- ; 00000100 WHERE <1> IS THE BAD BIT. ; BIT LOCATION OF THE FAILURE IS EASILY ; DETERMINED. NON-R/W MEMORY WILL RETURN ; WITH- 11111111 ; TEST: CALL EXPC ;GET TWO PARAMS ..T1: MOV A,M ;READ A BYTE MOV B,A ;SAVE IN B REG. CMA MOV M,A ;READ/COMPLIMENT/WRITE XRA M ; & COMPARE MOV M,B JRZ ..T2 ;SKIP IF ZERO (OK) PUSH D ;SAVE END POINTER MOV E,A ;SET-UP TO DISPLAY CALL HLSP ;PRINT BAD ADDR CALL BITS ;PRINT BAD BIT LOC. POP D ;RESTORE DE ..T2: CALL HILOX ;RANGE TEST JMPR ..T1 ; ; THIS COMMAND MOVES MASS AMOUNTS OF MEMORY ; FROM <1> THRU <2> TO THE ADDRESS STARTING ; AT <3>. THIS ROUTINE SHOULD BE USED WITH ; SOME CAUTION, AS IT COULD SMASH MEMORY IF ; CARELESSLY IMPLEMENTED. ; ; M<1>,<2>,<3> ; MOVE: CALL EXP3 ;GET 3 PARAMETERS ..M: MOV A,M ;PICK UP STAX B ;PUT DOWN INX B ;MOVE UP CALL HILOX ;CHECK IF DONE JMPR ..M ; THIS COMMAND READS THE CHECK-SUMMED HEX FILES ; MAY SUPPORT CDL RELOCATING AND/OR INTEL FORMAT ; A "BIAS" MAY BE ADDED WHICH WILL CAUSE THE OBJECT ; CODE TO BE PLACED IN A LOCATION OTHER THAN ITS ; INTENDED EXECUTION LOCATION. ; CHECK THE R COMMAND DOCUMENTS AND PDF SOURCE FOR DETAILS - HERB READ: CALL EXP3 POP D LXI H,0 PUSH H JRC ..R0 CALL EXPR POP H JRC ..R0 XTHL CALL EXPR POP H XTHL ..R0: MVI C, X.ON CALL CO POP B EXX CALL CRLF ..R1: CALL RIX SUI ':' MOV B,A ANI 0EFH JRNZ ..R1 MOV D,A CALL ..BYTE MOV E,A CALL ..BYTE PUSH PSW CALL ..BYTE POP H MOV L,A CALL ..BYTE ORA A PUSH PSW CNZ ..FLIP POP PSW JRNZ ..R1A INR A ..R1A: INR E DCR E JRZ ..DONE PUSH PSW XRA A CALL ..FLIP MOV A,B DCR A JRNZ ..R7 ..R2: CALL ..R8 JRNC ..R4 EXAF POP PSW PUSH PSW EXAF PUSH H MOV L,A CALL ..R8 JRNC ..R3 EXAF MOV A,L EXAF MOV L,A CALL ..R8 DCR E ..R3: MOV H,A EXAF CALL ..FLIP MOV A,L XTHL CALL ..SAVE POP PSW ..R4: CALL ..SAVE JRNZ ..R2 ..R5: POP PSW CALL ..BYTE JRZ ..R1 ..R6: CALL LFADR JMP ERROR ..R7: CALL ..BYTE CALL ..SAVE JRNZ ..R7 JMPR ..R5 ..R8: DJNZ ..R9 CALL ..BYTE DCR E MOV C,A MVI B,8 ..R9: CALL ..BYTE SLAR C RET ..DONE: MVI C,X.OFF ;13 CALL CO MOV A,H ORA L RZ XTHL RET ..FLIP: EXX ORA A JRZ ..DE DCR A JRZ ..HL DCR A JRNZ ..R6 PUSH B ..DAD: EXX XCHG XTHL DAD D POP D RET ..DE: PUSH D .BYTE (CPI) ;FEH ..HL: PUSH H JMPR ..DAD ..SAVE: MOV M,A INX H DCR E RET ..BYTE: PUSH B ;PRESERVE BC CALL RIBBLE ;GET A CONVERTED ASCII CHAR. RLC RLC RLC RLC ;MOVE IT TO HIGH NIBBLE MOV C,A ;SAVE IT CALL RIBBLE ;GET OTHER HALF ORA C ;MAKE WHOLE MOV C,A ;SAVE AGAIN IN C ADD D ;UPDATE CHECKSUM MOV D,A ;NEW CHECKSUM MOV A,C ;CONVERTED BYTE POP B RET ; THIS ROUTINE ALLOWS BOTH INSPECTION OF & ; MODIFICATION OF MEMORY ON A BYTE BY BYTE ; BASIS. IT TAKES ONE ADDRESS PARAMETER, ; FOLLOWED BY A SPACE. THE DATA AT THAT ; LOCATION WILL BE DISPLAYED. IF IT IS ; DESIRED TO CHANGE IT, THE VALUE IS THEN ; ENTERED. A FOLLOWING SPACE WILL DISPLAY ; THE NEXT BYTE. A CARRIAGE RETURN [CR] ; WILL TERMINATE THE COMMAND. THE SYSTEM ; ADDS A CRLF AT LOCATIONS ENDING WITH EITHER ; XXX0 OR XXX8. TO AID IN DETERMINING THE ; PRESENT ADDRESS, IT IS PRINTED AFTER ; EACH CRLF. A BACKARROW [_] WILL BACK ; UP THE POINTER AND DISPLAY THE ; PREVIOUS LOCATION. ; SUBS: CALL EXPR ;GET STARTING ADDR. POP H RC ..S0: MOV A,M CALL LBYTE ;DISPLAY THE BYTE CALL COPCK ;MODIFY? RC ; NO, ALL DONE JRZ ..S1 ;DON'T MODIFY PUSH H ;SAVE POINTER CALL EXF ;GET NEW VALUE POP D ;VALUE IN E POP H MOV M,E ;MODIFY RC ;DONE ..S1: CPI ',' JRZ ..S4 INX H ..S2: MOV A,L ;SEE IF TIME TO CRLF ANI 7 ..S3: CZ LFADR ;TIME TO CRLF JMPR ..S0 ..S4: DCX H ;DECREMENT POINTER JMPR ..S3 ;AND PRINT DATA THERE ; ; THIS ROUTINE TRANSLATES THE DATA IN ; MEMORY TO AN ASCII FORMAT. ALL NON- ; PRINTING CHARACTERS ARE CONVERTED TO ; PERIODS. [.] ; THERE ARE 64 CHARACTERS PER LINE. ; TYPE: MVI A,64 ;CHARACTERS PER LINE CALL EXPC ;GET RANGE ..T0: CALL LFADRX ;DISPLAY ADDRESS ..T1: MOV A,M ANI 7FH ;KILL PARITY BIT CPI ' ' ;RANGE TEST JRNC ..T3 ;=>SPACE ..T2: MVI A,'.' ;REPLACE NON-PRINTING ..T3: CPI 07DH ;ABOVE LOWER CASE z JRNC ..T2 MOV C,A ;SEND IT CALL CO CALL HILOX ;MORE TO GO? DJNZ ..T1 ;SEE IF TIME TO CRLF JMPR ..T0 ; YES. ; ; THIS ROUTINE VERIFIES THE CONTENTS ; OF ONE MEMORY BLOCK WITH ANOTHER. ; ; V,, ; VERIFY FROM <1> THRU <2> WITH ; THE CONTENTS OF MEMORY BEGINNING AT <3> ; VERIFY: CALL EXP3 ;GET 3 PARAMETERS ..V0: LDAX B PUSH B MOV B,M CMP B CNZ CERR ;DISPLAY ERRORS ..V1: POP B INX B CALL HILOX JMPR ..V0 ; ; THIS ROUTINE DUMPS MEMORY IN THE STANDARD ; INTEL HEX-FILE FORMAT. A START & END ; PARAMETER IS REQUIRED. AT THE CONCLUSION ; OF THE DUMP, AN "END OF FILE" SHOULD BE ; GENERATED WITH THE "E" COMMAND. ; WRITE: MVI A,24 CALL EXPC ;GET TWO PARAMETERS CALL TPON ;TURN ON TAPE ..W0: CALL PEOL ;CRLF TO PUNCH LXI B,':' ;START-OF-FILE CUE CALL PO ;PUNCH IT PUSH D ;SAVE PUSH H ; POINTERS EXAF MOV C,A EXAF ;SAVE FOR LATER ..W1: INR B ;CALCULATE FILE LENGTH CALL HILO JRC ..W2 ;SHORT FILE MOV A,C SUB B ;ENOUGH YET? JRNZ ..W1 ; NO. POP H ;GET START ADDR BACK. CALL ..W3 ;SEND THE BLOCK POP D ;RESTORE END OF FILE POINTER JMPR ..W0 ;KEEP GOING ..W2: POP H POP D CALL ..W3 JMPR TOFF ..W3: MOV A,B CALL PBYTE ;PUNCH IT CALL PADR ;PUNCH ADDRESS MOV A,B ADD H ADD L MOV D,A XRA A CALL PBYTE ..W4: MOV C,M ;GET A DATA BYTE MOV A,D ADD C MOV D,A MOV A,C CALL PBYTE ;PUNCH IT INX H ;POINT TO NEXT BYTE DJNZ ..W4 ;DECREMENT FILE COUNT XRA A SUB D JMPR PBYTE ;FINISH UP & RETURN ; ; ; THIS OUTPUTS THE END OF FILE (EOF) PATTERN ; FOR THE CHECKSUM LOADER. IT IS USED AFTER ; PUNCHING A BLOCK OF MEMORY WITH THE 'W' ; COMMAND. AN ADDRESS PARAMETER MAY BE GIVEN, ; AND UPON READING, THIS ADDRESS WILL BE ; AUTOMATICALLY PLACED IN THE 'P' COUNTER. THE ; PROGRAM CAN THEN BE RUN WITH A SIMPLE 'G[CR]' ; COMMAND. ; EOF: CALL EXPR ;GET OPTIONAL ADDR. CALL TPON CALL PEOL ;CRLF TO PUNCH MVI C,':' ;FILE MARKER CUE CALL PO XRA A ;ZERO LENGTH CALL PBYTE POP H CALL PADR ;PUNCH OPTIONAL ADDR. LXI H,0 ;FILE TYPE=0 CALL PADR ;PUNCH IT TOFF: MVI C,T.OFF JMPR PO ; ; SEND H&L VALUE TO PUNCH DEVICE ; PADR: MOV A,H CALL PBYTE MOV A,L ; ; PUNCH A SINGLE BYTE ; PBYTE: PUSH PSW ;NIBBLE AT A TIME RRC RRC RRC RRC CALL ..2 POP PSW ;NEXT NIBBLE ..2: CALL CONV JMPR PO ; ; SEND CRLF TO PUNCH DEVICE ; PEOL: MVI C,CR!80H CALL PO MVI C,LF ; ; PUNCH OUTPUT DRIVER ROUTINE ; PO: CALL IOCHK ANI # PMSK JZ TTYOUT ;PUNCH=TELEPRINTER CPI PCAS ;CASSETTE? JZ POUSR ; NO. CPI PPTP JZ PTPL JMP PULOC ; ; ; THIS ROUTINE ALLOWS DISPLAYING THE ; USER'S CPU REGISTERS. THEY ALSO MAY BE ; USING THE REGISTER NAME AFTER TYPING THE "X". ; I.E. XA 00- ; THE REGISTER MAY BE SKIPPED OVER, OR MODIFIED, ; SIMILARLY TO THE "S" COMMAND. ; ; TO DISPLAY THE "NORMAL" SYSTEM STATUS, ; SIMPLY TYPE "X[CR]". TO DISPLAY THE ; ADDITIONAL Z-80 REGISTERS, FOLLOW ; THE "X" WITH AN APOSTROPHE. I.E. "X'[CR]", ; OR TO EXAMINE A SINGLE "PRIME" REGISTER, ; TYPE THE REGISTER IDENTIFIER AFTER THE ; APOSTROPHE. I.E. X'X 0000- ; ; THESE REGISTER VALUES ARE PLACED INTO THE CPU ; UPON EXECUTING ANY "GO" COMMAND. [G] ; XAM: CALL PCHK LXI H,ACTBL JRC ..X6 ;FULL REG. DISPLAY CPI "'" ;SEE IF PRIMES WANTED JRNZ ..X0 LXI H,PRMTB CALL PCHK JRZ ..X6 ;FULL REG. DISPLAY ..X0: CMP M ;TEST FOR REGISTER NAME JRZ ..X1 BIT 7,M ;SEE IF END OF TABLE JNZ ERROR INX H INX H JMPR ..X0 ..X1: CALL BLK ..X2: CALL ..X8 ..X3: CALL COPCK JRZ ..X5 PUSH H PUSH B CALL EXF POP H POP B PUSH PSW ;SAVE DELIMINTER MOV A,L STAX D BIT 7, B JRZ ..X4 INX D MOV A,H STAX D ..X4: POP PSW POP H ..X5: RC BIT 7,M RNZ JMPR ..X2 ..X6: CALL CRLF ..X7: CALL BLK MOV C,M CALL CO MVI C,'=' CALL CO CALL ..X8 BIT 7,M JRZ ..X7 BIT 6,M ;TEST FOR SPECIAL "M" RNZ DCX D LDAX D RAL RNC MVI C, '*' JMPR COX ..X8: INX H MOV A,M INX H XCHG MOV B,A ANI 3FH MOV L,A MVI H,0 DAD SP INX H INX H BIT 6,B JRZ ..X9 MOV A,M DCX H MOV L,M MOV H,A ;GOT IT ..X9: MOV A,M CALL LBYTE ;PRINT REG. VALUE XCHG ;RESTORE TABLE POINTER BIT 7,B ;SINGLE OR DOUBLE? RZ ;SINGLE. DCX D LDAX D JMPR LBYTE ; ; ; HEXADECIMAL MATH ROUTINE ; ; THIS ROUTINE IS USEFUL FOR ; DETERMINING RELATIVE JUMP ; OFFSETS. IT RETURNS THE SUM ; & DIFFERENCE OF TWO PARAMETERS. ; ; H, ; ; X+Y X-Y ; HEXN: CALL EXPC PUSH H ;SAVE HL FOR LATER DAD D ;GET SUM CALL HLSP ;PRINT IT POP H ;THIS IS LATER ORA A ;CLEAR CARRY DSBC D ;GET DIFFERENCE & PRINT IT ; ; PRINT H&L ON CONSOLE ; LADR: MOV A,H CALL LBYTE MOV A,L LBYTE: PUSH PSW RRC RRC RRC RRC CALL ..2 POP PSW ..2: CALL CONV COX: JMPR CO ; ; THIS ROUTINE READS A BINARY FILE ; IMAGE, IN THE FORM AS PUNCHED IN ; THE "U" (UNLOAD) COMMAND. IT TAKES ; ONE PARAMETER, WHICH IS THE STARTING ; ADDRESS OF THE LOAD, AND WILL PRINT ; THE LAST ADDRESS(+1) LOADED ON THE ; CONSOLE DEVICE. ; LOAD: CALL EXPR ;INITIAL LOAD ADDRESS CALL CRLF POP H MVI D,0FFH ;START-OF-FILE TAG ..L0: LXI B,407H ;FIND AT LEAST FOUR 0FFH'S ..L1: CALL RIFF JRNZ ..L0 DJNZ ..L1 ..L2: CALL RIFF ;4 FOUND, NOW WAIT FOR NON-0FFH JRZ ..L2 MOV M,A ;FIRST REAL DATA BYTE CALL CO ..L3: INX H CALL RIFF JRZ ..L5 ;POSSIBLE END OF FILE ..L4: MOV M,A JMPR ..L3 ..L5: MVI B,1 ;INITIALIZE ..L6: CALL RIFF JRNZ ..L7 INR B ;COUNT QUES MVI A,MAX ;LOOK FOR EOF CMP B ;FOUND MAX? JRNZ ..L6 ;NOPE JMPR LFADR ;YEP, PRINT END ADDR ..L7: MOV M,D INX H DJNZ ..L7 JMPR ..L4 ; THIS ALLOWS ENTERING OF ASCII TEXT INTO MEMORY ; FROM THE CONSOLE DEVICE. THE PARITY BIT IS CLEARED, ; AND ALL WILL BE STORED EXCEPT THE BACK-ARROW [_] ; WHICH DELETES THE PREVIOUS CHARACTER, AND ; CONTROL-D, WHICH RETURNS CONTROL TO THE MONITOR. ; THIS COMMAND, COMBINED WITH THE 'Y' COMMAND, ; PROVIDES A RUDIMENTARY TEXT PROCESSING ABILITY. ; PUTA: CALL EXPR ;GET THE STARTING ADDR. CALL CRLF POP H ..P1: CALL KI ;GET A CHARACTER CPI 4 ;CONTROL-D? (EOT) JRZ LFADR ;YES, STOP & PRINT ADDR. CPI BS ;ERASE MISTAKE? JRZ ..P3 ; YES. MOV M,A ;ELSE STORE IT IN MEMORY MOV C,A INX H ..P2: CALL CO ;ECHO ON CONSOLE JMPR ..P1 ..P3: DCX H ;BACK UP POINTER MOV C,M JMPR ..P2 ;ECHO & CONTINUE LFADRX: EXAF MOV B,A EXAF JMPR LFADR ; ; THIS ROUTINE WILL RETURN THE ; CURRENT VALUE OF THE HIGHEST ; READ/WRITE MEMORY LOCATION THAT ; IS AVAILABLE ON THE SYSTEM. ; IT WILL "SEARCH" FOR MEMORY ; STARTING AT THE BOTTOM OF MEMORY ; AND GO UPWARDS UNTIL NON-R/W MEMORY ; IS FOUND. ; SIZE: CALL MEMSIZ ;GET THE VALUE CALL INTCK LXI H,(ENDX-EXIT) DAD D ; CRLF BEFORE HLSP ROUTINE ; LFADR: CALL CRLF ; ; PRINT THE CURRENT VALUE OF H&L, ; AND A SPACE. ; HLSP: CALL LADR ; ; PRINT A SPACE ON THE CONSOLE ; BLK: MVI C,' ' ; CO: CALL IOCHK ANI # CMSK JRNZ CO0 TTYOUT: CALL PORA JRNZ ..TT1 ..TT0: IN TTS ANI TTYBE JRZ ..TT0 MOV A,C OUT TTO RET ..TT1: PUSH B MVI B,11 XRA A ..TT2: RAL OUT TTOP MVI A,5 OUT TTS DCR A OUT TTS ..TT3: IN TTS RAL JRNC ..TT3 RARR C DJNZ ..TT2 POP B MOV A,C RET CO0: DCR A ;CCRT? JZ CRTOUT ; YES. DCR A ;BATCH? JNZ COLOC ; NO, MUST BE USER LO: CALL IOCHK ANI #LMSK JRZ TTYOUT CPI LCRT JZ CRTOUT CPI LINE JZ LPNTR JMP LULOC ; THIS GETS A READER CHARACTER, ; AND ALSO COMPARES IT WITH "D" REG. ; IT WILL ABORT ON AN "OUT-OF-DATA" ; CONDITION. ; RIFF: CALL RI ;NORMAL READER ROUTINE JRC ERROR ;ABORT ON A CARRY CMP D ;COMPARE W/"D" REG. RET ; THIS ROUTINE ALLOWS EXAMINATION OF ; ANY INPUT PORT, OR THE SENDING OF ; ANY VALUE TO ANY OUTPUT PORT. ; ; QO,[CR] ; OUTPUT TO PORT , THE VALUE ; ; QI[CR] ; DISPLAY THE PORT ; QUERY: CALL EXPR POP B INP E BITS: MVI B,8 ;DISPLAY 8 BITS CALL BLK ..Q2: SLAR E MVI A,'0' >1 ADC A ;MAKE "0" OR "1" MOV C,A CALL CO DJNZ ..Q2 JMPR CRLF POUT: CALL EXPC MOV C,L OUTP E RET ; ; THIS IS A MESSAGE OUTPUT ROUTINE. ; IT IS USED BY THE SIGN-ON AND CRLF. ; POINTER IS IN HL (WHEN ENTERED AT ; TOM) AND LENGTH IN B REG. ; TOM: LXI H,MSG TOM1: MOV C,M ;GET A CHARACTER INX H ;MOVE POINTER CALL CO ;OUTPUT IT DJNZ TOM1 ;KEEP GOING TILL B=0 CALL CSTS ;SEE IF AN ABORT REQUEST INR A ; WAITING. CZ KI CPI 3 ; CONTROL C? RNZ ; ; SYSTEM ERROR ROUTINE. THIS ; WILL RESTORE THE SYSTEM AFTER ; A SYSTEM ERROR HAS BEEN TAKEN. ; THE I/O CONFIGURATION IS NOT ; AFFECTED. ; ERROR: CALL MEMSIZ LXI D,-22 ;STACK POINTER OFFSET DAD D SPHL ;RESET STACK CALL INTCK MVI C,'*' ;ANNOUNCE ERROR CALL CO JMP START ;BACK TO WORK ; ; THIS SUBOUTINE IS USED TO DISPLAY THE ; CURRENT LOCATION OF THE 'M' REGISTER POINTERS (HL), ; AND THE VALUE AT THE LOCATION, AND THE CONTENTS ; OF THE ACCUMULATOR. USED BY TWO ROUTINES. ; CERR: EXAF ;SAVE ACC. CALL HLSP ;DISPLAY H&L MOV A,B CALL LBYTE ;PRINT 'M' CALL BLK ;SPACE OVER EXAF CALL LBYTE ;PRINT ACC. ; CONSOLE CARRIAGE RETURN & ; LINE FEED ROUTINE. ; ; THE NUMBER OF FILL CHARACTERS ; IS SET TO 3 TO ALLOW A ; LARGER NUMBER OF TERMINALS TO ; BE USED WITH THIS MONITOR. ; THE NUMBER OF FILLS MAY NOT BE ; ADJUSTED. ; CRLF: PUSH H ;SAVE HL PUSH B MVI B,4 ;CRLF LENGTH CALL TOM ;SEND CRLF POP B POP H RET INTCK: CPI 0AAH RNZ EI RET ; THIS IS THE MAIN "PARAMETER-GETTING" ROUTINE. ; THIS ROUTINE WILL ABORT ON A NON-HEX CHARACTER. ; IT TAKES THE MOST RECENTLY TYPED FOUR VALID ; HEX CHARACTERS, AND PLACES THEM UP ON THE STACK. ; (AS GNE 16 BIT VALUE, CONTAINED IN TWO ; 8-BIT BYTES.) IF A CARRIAGE RETURN IS ENTERED, ; IT WILL PLACE THE VALUE OF "0000" IN THE STACK. ; EXPR: CALL TI ;GET SOMETHING FROM CONSOLE EXF: LXI H,0 ..EX1: MOV B,A ;SAVE IT CALL NIBBLE ;CONVERT ASCII TO HEX. JRC ..EX2 ;ILLEGAL CHARACTER DETECTED DAD H ;MULTIPLY BY 16 DAD H DAD H DAD H ORA L ;OR IN THE SINGLE NIBBLE MOV L,A CALL TI JMPR ..EX1 ;GET SOME MORE ..EX2: XTHL ;SAVE UP IN STACK PUSH H ;REPLACE THE RETURN MOV A,B ;TEST THE DELIMITER CALL QCHK JRNC ERROR ;CR ENTERED RET EXPC: EXAF CALL EXPR JRC ERROR CALL EXPR POP D POP H JRC ..P PUSH H CALL EXPR POP B POP H MOV A,C ORA A JRZ ..P EXAF ORA A ..P: PUSH PSW CALL CRLF POP PSW RET ; ; GET THREE PARAMETERS ; EXP3: CALL EXPC JRC ERROR RET ; ; CONVERT HEX TO ASCII ; CONV: ANI 0FH ;LOW NIBBLE ONLY ADI 90H DAA ACI 40H DAA MOV C,A RET ; ; TEST THE CURRENT CONSOLES ; KEYBOARD FOR A KEY-PRESS. ; RETURN TRUE (0FFH IN A REG) ; IF THERE IS A CHARACTER ; WAITING IN THE UART. ; CSTS: CALL IOCHK ANI # CMSK JRNZ ..CS1 CALL PORA JRZ ..CS0 XRA A RET ..CS0: IN TTS RAR MVI A, TRUE RC CMA RET ..CS1: DCR A ;CCRT JZ CRTST DCR A RZ JMP CSLOC ; ; RANGE TESTING ROUTINES. ; CARRY SET INDICATES RANGE EXCEEDED. ; HILOX: CALL HILO RNC ;OK POP D ;RETURN ONE LEVEL BACK RET ; HILO: INX H ;INCREMENT HL MOV A,H ;TEST FOR CROSSING 64K BORDER ORA L STC ;CARRY SET=STOP RZ ;YES, BORDER CROSSED MOV A,E ;NOW, TEST HL VS. DE SUB L MOV A,D SBB H RET ;IF CARRY WAS SET, THEN STOP ; ; THIS ROUTINE SENDS EIGHT RUBOUTS ; TO THE PUNCH DEVICE. ; MARK: LXI B,08FFH ;SET-UP B&C JMPR LE0 TPON: MVI C,T.ON CALL PO LEAD: LXI B,3C00H ;PRESET FOR SOME NULLS LE0: CALL PO DJNZ LE0 RET ; RIBBLE: CALL RIX NIBBLE: SUI '0' ;QUALIFY & CONVERT RC ;<0 CPI 'G'-'0' ;>F? CMC ;PERVERT CARRY RC CPI 10 ;NMBR? CMC ;PERVERT AGAIN RNC ;RETURN CLEAN SUI 'A'-'9'-1 ;ADJUST CPI 0AH ;FILTER ":" THRU "@" RET COPCK: MVI C,'-' CALL CO ; PCHK: CALL TI ; ; TEST FOR DELIMITERS ; QCHK: CPI ' ' ;RETURN ZERO IF DELIMITER RZ CPI ',' RZ CPI CR ;RETURN W/CARRY SET IF CR STC RZ CMC ;ELSE NON-ZERO, NO CARRY RET ; ; ; THIS IS A BINARY DUMP ROUTINE THAT MAY BE ; USED WITH BOTH PAPER-TAPE AND/OR CASSETTE ; SYSTEMS. IT PUNCHES A START-OF-FILE MARK ; AND THEN PUNCHES IN FULL 8-BITS DIRECTLY ; FROM MEMORY. IT IS FOLLOWED BY AN END-OF- ; FILE MARKER. THESE DUMPS MAY BE LOADED ; USING THE "L" COMMAND. THEY ARE USEFUL ; FOR FAST LOADING, AND MAY BE VERIFIED ; USING THE "C" (COMPARE) COMMAND. ; ; U,[CR] ; PUNCHES FROM THRU ; UNLD: CALL EXPC ;GET TWO PARAMETERS CALL LEAD ;PUNCH LEADER CALL MARK ;PUNCH FILE MARKER ..U: MOV C,M ;GET MEMORY BYTE CALL PO ;PUNCH IT CALL HILO ;SEE IF DONE JRNC ..U CALL MARK ;PUNCH END FILE MARKER ; ; THIS PUNCHES NULLS (LEADER/TRAILER). ; IT RETURNS "QUIET" IN CASE THE PUNCH ; AND CONSOLE ARE THE SAME. ; NULL: CALL LEAD ;PUNCH NULLS ; MAIN CONSOLE INPUT ROUTINE ; CI: CALL IOCHK ANI # CMSK JRNZ CI1 ; ; TELEPRINTER ROUTINE ; TTYIN: CALL PORA JRNZ ..TT1 ..TT0: IN TTS RAR JRNC ..TT0 IN TTI RET ..TT1: PUSH B ..TT2: IN TTOP RAL JRC ..TT2 MVI A,1 CALL RDEL+2 MVI B,8 ..TT3: CALL RDEL IN TTOP RAL RARR C DJNZ ..TT3 CALL RDEL MOV A,C POP B RET ; CI1: DCR A ;CONSOLE=CRT? JZ CRTIN ;NO, MUST BE USER DEFINED CI2: DCR A JNZ CILOC ; ; READER INPUT ROUTINE, WITH ; TIME-OUT DELAY. INCLUDES ; PULSING OF HARDWARE PORT ; TO INDICATE REQUEST FOR ; READER DATA. ; RI: CALL IOCHK ANI # RMSK JRNZ ..RI0 CALL TTYIN ORA A RET ..RI0: CPI RCAS JZ RIUSR CPI RPTR JZ RPTPL JMP RULOC ; ; THIS ROUTINE GETS READER INPUT ; AND KILLS THE PARITY BIT. ; RIX: CALL RIFF JMPR KPTY ; THIS IS THE INTERNAL KEYBOARD ; HANDLING ROUTINE. IT WILL IGNORE ; RUBOUTS (0FFH) AND BLANKS (00), ; AND IT WILL NOT ECHO CR'S & N'S. ; (NO N'S FOR THE "NULL" COMMAND). ; IT CONVERTS LOWER CASE TO UPPER ; CASE FOR THE LOOK-UP OF COMMANDS. ; ; OTHER CHARACTERS ARE ECHOED AS THEY ; ARE RECIEVED. ; KI: CALL CI ;GET CHARACTER FROM CONSOLE KPTY: ANI 7FH ;CLEAR PARITY BIT RET PORA: PUSH B ;ROUTINE TO FIND ACIA OR PIA IN TTOP MOV B,A IN TTS CMP B POP B RET RDEL: MVI A,5 ;RESET TIMER FUL BIT INIT OUT TTS DCR A OUT TTS ..RD0: IN TTS RAL JRNC ..RD0 RET ; ; THIS IS A HEXADECIMAL SEARCH ROUTINE. IT ; TAKES NO ADDRESS PARAMETERS. AS MANY ; BYTES MAY BE ENTERED, SEPARATED BY A COMMA, ; AS DESIRED. THE MAXIMUM IS 255, BUT 3-4 IS ; TYPICAL, AND MORE THAN 12 WOULD BE UNUSUAL. ; THE ENTIRE MEMORY IS SEARCHED, STARTING ; FROM ZERO, AND ALL STARTING ADDRESSES OF EACH ; OCCURENCE OF THE REQUESTED STRING ARE PRINTED ; ON THE CONSOLE DEVICE. ; WHERE: LXI H,0 ;COUNT SEARCH BYTES MOV C,L DAD SP DCX H XCHG ..Y0: CALL EXPR ;GET ONE BYTE POP H ;PICK IT UP MOV H,L ;STICK IN HIGH BYTE PUSH H ;PUT IT IN STACK INX SP ;ADJUST STACK INR C ;COUNT UP JRNC ..Y0 ;MORE TO GO MOV A,C PUSH PSW PUSH D LXI B,0 PUSH B ..Y2: POP H POP D LDAX D CCIR JPO ..DONE POP PSW PUSH PSW PUSH D PUSH H ..Y3: DCR A JRZ ..Y5 ..Y4: EXAF DCX D LDAX D CMP M JRNZ ..Y2 INX H EXAF JMPR ..Y3 ..Y5: POP H PUSH H DCX H PUSH B CALL LFADR POP B JMPR ..Y2 ..DONE: XCHG INX H SPHL RET ; THIS IS THE INTERNAL KEYBOARD ; HANDLING ROUTINE. IT WILL IGNORE ; RUBOUTS (0FFH) AND BLANKS (00), ; AND IT WILL NOT ECHO CR'S & N'S. ; (NO N'S FOR THE "NULL" COMMAND). ; IT CONVERTS LOWER CASE TO UPPER ; CASE FOR THE LOOK-UP OF COMMANDS. ; ; OTHER CHARACTERS ARE ECHOED AS THEY ; ARE RECIEVED. ; TI: CALL KI RZ ;NULL CPI 7FH RZ CPI CR RZ PUSH B MOV C,A CALL CO ORA A POP B RET ; ; ; ; THE FIRST CHARACTER IS THE DEVICE NAME ; (ONE LETTER) AND THE NEXT FOUR ARE THE ; NAMES OF THE FOUR POSSIBLE DRIVERS TO BE ; ASSIGNED. ; LTBL: .BYTE 'C' ;CONSOLE ASSIGNMENTS .BYTE 'T' ;CTTY T=TELEPRINTER .BYTE 'V' ;CCRT V=CRT (VIDEO MONITOR) .BYTE 'B' ;BATCH= COMMANDS FROM READER .BYTE 'U' ;CUSE USER ; .BYTE 'R' ;READER ASSIGNMENTS .BYTE 'T' ;RTTY .BYTE 'P' ;RPTR P=PAPER TAPE .BYTE 'C' ;RCAS C=CASSETTE .BYTE 'U' ;RUSER USER ; .BYTE 'P' ;PUNCH ASSIGNMENTS .BYTE 'T' ;PTTY .BYTE 'P' ;PPTP .BYTE 'C' ;PCAS C=CASSETTE .BYTE 'U' ;PUSER USER ; .BYTE 'L' ;LIST ASSIGNMENTS .BYTE 'T' ;LTTY LIST=TELEPRINTER .BYTE 'V' ;LCRT LIST=CRT .BYTE 'L' ;LINE PRINTER .BYTE 'U' ;LUSER USER ; ; ; THIS IS A SHORT PROGRAM, EXECUTED ; UPON EXECUTING A "GO" COMMAND. IT ; IS PLACED IN THE WORK AREA WHEN ; THE MONITOR IS INITIALIZED, AS IT ; REQUIRES RAM FOR PROPER OPERATION. ; EXIT: ;EXIT ROUTINE (LOADS ALL REGISTERS) POP B MOV A,C STAR MOV A,B STAI POP Y POP X POP PSW POP B POP D POP H EXAF EXX POP D POP B POP PSW POP H SPHL LXI H,0 NOP ;RESERVED FOR ENABLE INTERUPTS JMP 0 ; .WORD 0 ;STORAGE AREA FOR TRAP DATA .BYTE 0 .WORD 0 .BYTE 0 ; ; DISPLACEMENTS OF REGISTER ; STORAGE FROM NORMAL STACK ; LOCATION. ; ENDX: ; ALOC = 15H BLOC = 13H CLOC = 12H DLOC = 11H ELOC = 10H FLOC = 14H HLOC = 30H LLOC = 2FH INTLOC = 2FH PLOC = 34H SLOC = 17H TLOC = 35H TLOCX = 25H LLOCX = 1FH ; APLOC = 09H BPLOC = 0BH CPLOC = 0AH DPLOC = 0DH EPLOC = 0CH FPLOC = 08H HPLOC = 0FH LPLOC = 0EH XLOC = 07 YLOC = 05 RLOC = 02 ILOC = 03 ; ; ; THIS IS THE TABLE USED TO DETERMINE ; A VALID REGISTER IDENTIFIER, AND IT'S ; DISPLACEMENT FROM THE STACK POINTER. ; ; POSITION ONE= REGISTER NAME, WITH BIT 7 INDICATING ; END OF TABLE. ; ; POSITION TWO= BIAS FROM CURRENT STACK LEVEL OR'ED ; WITH A TWO-BIT FLAG. 00XXXXXX=BYTE ; 10XXXXXX=WORD ; 01XXXXXX=SPECIAL FOR "M" REG. ; ACTBL: ;NORMAL SET OF REGISTERS (8080) ; ;PLUS THE INTERUPT REGISTER ("I") ; .BYTE 'A', ALOC !0 .BYTE 'B', BLOC !0 .BYTE 'C', CLOC !0 .BYTE 'D', DLOC !0 .BYTE 'E', ELOC !0 .BYTE 'F', FLOC !0 .BYTE 'H', HLOC !0 .BYTE 'L', LLOC !0 .BYTE 'M', HLOC !040H .BYTE 'P', PLOC !080H .BYTE 'S', SLOC !080H .BYTE 'I', ILOC !0 ; .BYTE 80H ; PRMTB: ;ADDITIONAL SET OF REGISTERS (Z-80) ; .BYTE 'A', APLOC !0 .BYTE 'B', BPLOC !0 .BYTE 'C', CPLOC !0 .BYTE 'D', DPLOC !0 .BYTE 'E', EPLOC !0 .BYTE 'F', FPLOC !0 .BYTE 'H', HPLOC !0 .BYTE 'L', LPLOC !0 .BYTE 'M', HPLOC !040H .BYTE 'X', XLOC !080H .BYTE 'Y', YLOC !080H .BYTE 'R', RLOC !0 .BYTE 0C0H ; Z: ;END OF PROGRAM ; ; ; .END BASE