TITLE M5b Z-80 MONITOR LIST NOCOND ;*************************************************************************** ; ; SYSTEM MONITOR FOR M5b ; (c) 1982,1983 GRH ELECTRONICS, CUPERTINO, CA ; ;*************************************************************************** ; ; This Monitor program resides at the top of memory & allows memory ; modification & testing, program breakpoints, console, printer, punch & ; reader I/O drivers and transfer to system boot ROM residing in same memory ; area as this ROM. ; ;**************************************************************************** ; ; Revision status: ; ; 1.0 - Release ; 1.1 - ; Add Double D deselect upon reset code. ; Change printer port. ; 1.2 - 20 FEB 83 GRH ; Add delay before turning off boot image, in case logic ; too slow. ; 1.3 - 17 MAR 84 GRH ; Change to allow Boot command parameter passing to boot ROM. ; ; 1.4 - 2 JUN 84 GRH ; Fix bug in line printer status subroutine which hung the ; line printer by sensing the status incorrectly. ; 1.5 - 29 SEP 85 GRH ; Fix bug in Input command which caused monitor to crash. ; The jump to 'BITS2' expects DE to be on stack. ; 1.6 - 6 DEC 85 GRH ; Add code to disable all Jade controllers from 40H to 43H after ; reset. ; 1.7 - 8 FEB 86 GRH ; Remove time delay from power up reset code to allow ISHA to access ; ram. ; Remove the auto-boot from reset function. ; VERSN EQU '17' ;**************************************************************************** FORM FALSE EQU 0 TRUE EQU NOT FALSE LSTINC EQU FALSE ; ; INCLUDE SYSTEM DEFINITION FILES ; ;*INCLUDE NAKEDT.DEF ;*INCLUDE MONBOARD.DEF ;*INCLUDE BIGZ.DEF ;*INCLUDE JDDCONT.DEF ;*INCLUDE IOBOARD.DEF ; LIST OFF *INCLUDE NAKEDT.DEF *INCLUDE MONBOARD.DEF *INCLUDE BIGZ.DEF *INCLUDE JDDCONT.DEF *INCLUDE IOBOARD.DEF LIST ON ;============================ ; ; ASSEMBLE TIME VARIABLES ; ;============================ ROM EQU 0F800H ;ROM START ADDR WSVEC EQU 0 ;VECTOR NUMBER FOR WARM RESTART NBKPTS EQU 2 ;NUMBER OF BREAKPOINTS ;============================ ; ; CONSTANTS ; ;============================ CTRLS EQU 13H ;ASCII DC3 CR EQU 0DH LF EQU 0AH BELL EQU 7 ;============================ ; ; VARIABLES ; ;============================ IOBYTE EQU 3 ;ADDR OF I/O CONTROL BYTE IOBYTV EQU 80H ;DEFAULT IOBYTE VALUE SELECTS LPT AS LIST DEV. ; SPSV EQU 6 ;STACK PTR SAVE LOCATION ; ; REGISTER STORAGE DISPLACEMENTS FROM NORMAL SYSTEM ; STACK LOCATION. ; ALOC EQU 15H BLOC EQU 13H CLOC EQU 12H DLOC EQU 11H ELOC EQU 10H FLOC EQU 14H HLOC EQU 31H LLOC EQU 30H PLOC EQU 34H SLOC EQU 17H TLOC EQU 35H TLOCX EQU 25H LLOCX EQU 20H ; APLOC EQU 9 BPLOC EQU 11 CPLOC EQU 10 DPLOC EQU 13 EPLOC EQU 12 FPLOC EQU 8 HPLOC EQU 15 LPLOC EQU 14 XLOC EQU 7 YLOC EQU 5 RLOC EQU 2 ILOC EQU 3 SUBTTL MAIN PROGRAM ORG ROM ;-------------------------------------- ; ; JUMP TARGETS FOR BASIC I/O ; ;-------------------------------------- CBOOT JP INIT ;COLD START CONIN JP CI ;CONSOLE INPUT READER JP RI ;READER CONOUT JP CO ;CONSOLE OUTPUT PUNCH JP PUNO ;PUNCH LIST JP LO ;LIST OUTPUT CONST JP CSTS ;CONSOLE STATUS JP IOCHK ;PUT IOBYTE INTO A JP IOSET ;(C) HAS NEW IOBYTE JP MEMCK ;MEMORY LIMIT CHECK JP RTS ;IODEF- DEFINE USER I/O ENTRY POINTS JP RTS ;SPECIAL I/O CONTROL JP REST ;BREAKPOINT ENTRY LPSTAT: JP LSTAT ;LINE PRINTER STATUS RETURN DS 6 ;SAVE 2 SPARES ;------------------------------------------------ ; ; THE FOLLOWING CODE MUST RESIDE AT THE SAME ; ADDR AS THE BOOT ROM START CODE. ; ;------------------------------------------------ DBOOT: LD A,C ;PERFORM SWAP AND 7 ;CLEAR ERROR MSG IN CASE ROM NOT THERE & MASK OUT ROMSEL,A RET ;-------------------------------------- ; ; THE COLD INITIALIZATION CODE ; ;-------------------------------------- INIT: ; ; INSURE INTERRUPTS DISABLED ; DI ; ; REMOVE PAGE 0 IMAGE ; OUT COLDRES,A ; ; INITIALIZE RESTART VECTORS IN PAGE 0 ; LD SP,3FH ;USE STACK TO INIT RESTARTS LD HL,0C300H LD DE,RSTER LD B,16 ;64 BYTES INIT1: PUSH DE PUSH HL DJNZ INIT1 ; ; SET TEMPORARY STACK ; LD SP,80H ; ; REMOVE JADE DOUBLE D WINDOW(S) ; LD A,DDOUT ;REMOVE DD WINDOW, IF PRESENT OUT (40H),A OUT (41H),A OUT (42H),A OUT (43H),A ; ; INITIALIZE IOBYTE ; LD C,IOBYTV ;SET TO INITIAL IOBYTE VALUE CALL IOSET ; ; SIZE AND DISPLAY MEMORY ; LD HL,USRMSG ;OUTPUT MEMORY= CALL PRTWD CALL MEMSIZ ;OUTPUT MEMORY SIZE PUSH HL ;SAVE VALUE FOR LATER ; ; COMPUTE # KS ; LD A,H ; /1024 SRL A SRL A LD C,0 ;TENS COUNT = 0 MEMLP: SUB 10 ;NUMBER = NUMBER - 10 JR C,MEM1 ; INC C ;IF < 10 THEN C = TENS DIGIT JR MEMLP ; MEM1: ADD '0' + 10 ;CONVERT TO + ASCII # LD B,A LD A,C ;IF TENS = 0 THEN OUTPUT SPACE ADD '0' CP '0' JR NZ,NOT0 LD A,' ' NOT0: LD C,A CALL CO LD C,B CALL CO LD C,'K' CALL CO CALL CRLF POP HL ;MEMTOP ; ; CONTINUATION OF THE SCS MONITOR, MOVE EXIT ROUTINE TO RAM ; LD SP,HL LD DE,EXIT EX DE,HL LD BC,ENDX - EXIT LDIR ; LD BC,NBKPTS * 3 ;CONTINUE 'JP 0' FOR 3 TIMES PUSH DE POP HL DEC HL LDIR ; LD HL,-24 ADD HL,SP PUSH HL INC HL ;ADJUST USER STACK LOCATION INC HL LD (SPSV),HL ;SAVE INITIAL STACK VALUE ; ; INITIALIZE REGISTER IMAGES TO 0 ; LD D,10 INIT2: PUSH BC DEC D JR NZ,INIT2 ; ; INITIALIZE BIG Z 8251 ; XOR A ;GET IT'S ATTENTION 1ST LD B,5 URTLP: OUT (BZUDAT),A EX (SP),HL ;DELAY A WHILE EX (SP),HL DJNZ URTLP LD A,BZUMOD ;OUTPUT MODE BYTE OUT (BZUCMD),A LD A,BZUCM ;OUTPUT COMMAND BYTE OUT (BZUCMD),A IN A,(BZUDAT) ;READ ANY GARBAGE CHAR ; ; INSERT I/O INIT CODE HERE ; ; ; OUTPUT SIGN-ON MESSAGE ; LD HL,LOGMSG ;OUTPUT SIGN-ON CALL PRTWD JR WINIT ; ; SPECIAL DISK BOOT CODE SWAPS ROMS FOR BOOT ; IF BOOT SUCCESSFUL, DOES NOT RETURN. ; IF UNSUCCESSFUL, RETURNS CARRY IF ERROR, NO CARRY IF DISK NOT INSERTED. ; BOOTCD: LD C,XDBROM ;PASS IN DEFAULT BOOT ROM ADDR BOOTCC: CALL DBOOT LD HL,BOOTEM CALL C,PRTWD ; JR WINIT ;GO TO MONITOR EXEC ;**************************************************************************** ; ; MEMSIZ SUBR CALCULATES THE TOP OF CONTIGUOUS RAM. IT SEARCHES FROM ; THE BOTTOM UP UNTIL A NON-RAM LOCATION IS FOUND. IT THEN TAKES OFF FOR ; MONITOR WORK SPACE NEEDS. ; EXIT - HL= MEMTOP PTR ; ;**************************************************************************** MEMSIZ: PUSH BC ;MONITOR START LOCATION LD BC,ROM LD HL,-1 MEMSZ1: INC HL LD A,(HL) CPL LD (HL),A CP (HL) CPL LD (HL),A JR NZ,MEMSZ2 ; LD A,H ;SEE IF ON MONITOR BORDER CP B JR NZ,MEMSZ1 MEMSZ2: DEC HL ;TAKE OFF WORKSPACE LD BC,EXIT-ENDX-3*NBKPTS+1 ;EXIT RTN + BP JUMPS ADD HL,BC POP BC ;UNPREDICTABLE DURING INIT RET ;**************************************************************************** ; ; MEMCHK SUBR FINDS THE CURRENT TOP OF CONTIGUOUS MEMORY (LESS THE ; MONITOR WORKSPACE) & RETURNS THE VALUE. ; EXIT - B= HIGH BYTE OF RAM ; A= LOW BYTE OF RAM ; ;**************************************************************************** MEMCK: PUSH HL CALL MEMSIZ ;GET THE RAM SIZE LD A,L ;TAKE OFF WORKSPACE SUB 60 JR NC,MEMCK0 DEC H MEMCK0: LD B,H POP HL RET ;************************************** ; ; EXF SUBR. READS 1 PARAMETER. ; ENTRY- A= PARAMETER 1ST CHAR ; EXIT - STACK= PARAMETER ; ;************************************** EXF: LD B,1 ;SET 1 PARAM LD HL,0 JR EX1 ;1ST CHAR IN A ALREADY ;**************************************************************************** ; ; EXPR SUBR. READS PARAMETERS FROM THE CONSOLE & DEVELOPS A 16 BIT HEX ; FOR EACH ONE. A CARRIAGE RETURN WILL TERMINATE THE ENTRY SEQUENCE. A BLANK ; OR COMMA WILL END THE CURRENT PARAMETER ENTRY. EACH PARAMETER ONLY TAKES ; THE LAST 4 DIGITS TYPED IN. ANY EXCESS IS DISCARDED. A NON-HEX DIGIT WILL ; TERMINATE THE ENTRY SEQUENCE & CAUSE A WARM BOOT OF THE MON. ; ENTRY- B= # OF PARAMETERS NEEDED ; EXIT - STACK= PARAMETERS ; ;**************************************************************************** AS3: DJNZ AS2 ;PART OF THE ASSIGN CODE EX3: JR NZ,QPRT ;NON 0 IS ERR EXPR1: DEC B ;IF NO PARAMS THEN RETURN RET Z EXPR: LD HL,0 ;PARAM = 0 EX0: CALL ECHO ;GET NEXT # EX1: LD C,A ;SAVE CHAR FOR LATER CALL NIBBLE JR C,EX2 ;IF NOT NUMBER THEN EXIT ADD HL,HL ;PARAM = PARAM * 16 ADD HL,HL ADD HL,HL ADD HL,HL OR L ;ADD IN NEW DIGIT LD L,A JR EX0 ;GET NEXT ; EX2: EX (SP),HL ;PUT UNDER RETURN ADDR ON STACK PUSH HL LD A,C ;IF LAST CHAR = DELIM THEN EXIT CALL P2C JR NC,EX3 DJNZ QPRT ;ELSE IF MORE REQ'D THEN ERR RET ;ELSE RETURN ;---------------------------------------------------------------------------- ; ; LOGICAL ASSIGNMENT OF PERIPHERALS COMMAND ; ; THIS COMMAND CONTROLS THE ASSIGNMENT OF PHYSICAL PERIPHERALS TO THE ; 4 LOGICAL DEVICE TYPES. IT ALTERS (IOBYTE) TO MATCH THE CURRENT ASSIGNMENT. ; THE 4 LOGICAL DEVICES ARE CONSOLE, READER, LIST & PUNCH. IN ALL CASES, THE ; TTY DEVICE (SYSTEM CONSOLE) IS SET UP AS THE DEFAULT DEVICE. ; ; Ax ;x= C,R,P,L (CONSOLE,READER,PUNCH,LIST) ; Ax-y ;y= C: T,C,B,1 (TTY,CRT,BAT,UC1) ; R: T,P,1,2 (TTY,PTR,UR1,UR2) ; P: T,P,1,2 (TTY,PTP,UP1,UP2) ; L: T,L,1,2 (TTY,CRT,LPT,UL1) ; ;---------------------------------------------------------------------------- ASGN: CALL ECHO ;GET THE LOGICAL DEVICE DESIRED LD HL,ALT ;START OF CONVERSION TABLE LD DE,APT - ALT ; # OF ELEMENTS LD B,4 ; COUNT = # ENTRIES AS0: CP (HL) ;IF CHAR = TABLE[LOGICAL] THEN JR Z,AS1 ; EXIT ADD HL,DE ;ELSE NEXT LOGICAL ENTRY DJNZ AS0 QPRT: LD HL,QMSG ;OUTPUT ? MESSAGE CALL PRTWA ;---------------------------- ; ; THE WARM START CODE ; ;---------------------------- WINIT: LD SP,(SPSV) ;RESTORE THE STACK WINITA: LD HL,WINIT ;RESET RETURN & WARM START VECT PUSH HL LD (WSVEC + 1),HL LD A,0C3H LD (WSVEC),A CALL CRLF CALL DECHO ;GET COMMAND SUB 'A' ;IF CHAR <> 'A' -> 'F' THEN ERR JR C,QPRT CP 'Z' - 'A' + 1 JR NC,QPRT ADD A,A ;OFFSET = INDEX * 2 LD E,A LD D,0 LD B,2 ;PASS IN 2 PARAMS TO HANDLER LD HL,TBL ;ADDRESS = (TABLE + OFFSET) ADD HL,DE LD A,(HL) INC HL LD H,(HL) LD L,A JP (HL) ;---------------------------------------------------------------------------- ; ; FILL MEMORY COMMAND ; ; THIS ROUTINE FILLS A BLOCK OF MEMORY WITH A USER DEFINED CONSTANT. IT ; EXPECTS 3 PARAMETERS TO BE ENTERED IN THE FOLLOWING ORDER: ; START ADDR, FINISH ADDR, FILL VALUE ; ; F ; ;---------------------------------------------------------------------------- FILL: CALL EXPR3 ;GET 3 PARAMS FIO: LD (HL),C ;PUT DOWN THE FILL VALUE CALL HILO ;INC & CHECK THE PTR JR NC,FIO POP DE ;RESTORE SP IN CASE STACK JR WINIT ; WAS OVERWRITTEN ;---------------------------- ; ; ASSIGN CONTINUED ; ;---------------------------- AS1: LD D,B ;SAVE THE COUNTER RESIDUE LD B,4 CALL DECHO ;GET NEW ASSIGNMENT AS2: INC HL ;PTR = PTR + 1 CP (HL) ;IF CHAR <> (TABLE) THEN EXIT JR NZ,AS3 LD L,B ;SAVE THE RESIDUE TO FORM ASGNT DEC L LD B,D LD H,3 DEC B JR Z,AS5 ;NO SHIFT NEEDED AS4: ADD HL,HL ;SHIFT MASKS ADD HL,HL DJNZ AS4 AS5: LD A,(IOBYTE) OR H XOR H ;LOGICAL BITS NOW OFF OR L ;PUT IN NEW VALUE LD C,A ;************************************** ; ; SET IOBYTE SUBR ; ENTRY- C= NEW IOBYTE VALUE ; ;************************************** IOSET: LD A,C LD (IOBYTE),A ;SAVE NEW ASSIGNMENTS RET ;******************************************* ; ; RETURN IOBYTE VALUE SUBR ; EXIT - A= CURRENT IOBYTE VALUE ; ;******************************************* IOCHK: LD A,(IOBYTE) RET ;---------------------------------------------------------------------------- ; ; SLEEP COMMAND ; ; THE BYE ROUTINE IS USED TO PREVENT UNAUTHORIZED USAGE OF THE SYSTEM. ; THE SYSTEM LOCKS UP & WILL NOT RESPOND TO ANYTHING OTHER THAN 2 ASCII BELL ; CHARACTERS. WHEN IT SEES THEN CONSECUTIVELY, CONTROL IS RETURNED TO THE ; MONITOR WITHOUT ALTERING ANYTHING. ; ; Z ; ;---------------------------------------------------------------------------- BYE: LD B,2 ;SET UP FOR 2 CHARS BYE1: CALL CONI CP BELL ;IF NOT BELL THEN RESTART JR NZ,BYE CALL ECH1 ;ECHO THE BELL DJNZ BYE1 RET ;---------------------------------------------------------------------------- ; ; VERIFY MEMORY COMMAND ; ; THIS ROUTINE COMPARES 2 BLOCKS OF MEMORY AGAINST EACH OTHER. IF A ; DIFFERENCE IN THE RELATIVE ADDRESS CONTENTS IS DETECTED, THE ADDRESS OF THE ; 1ST BLOCK IS DISPLAYED, ALONG WITH IT'S CONTENTS & THE CONTENTS OF THE ; OTHER BLOCK'S SAME RELATIVE ADDRESS. ; ; V ; ;---------------------------------------------------------------------------- COMP: CALL EXPR3 CMPA: LD A,(BC) ;GET SOURCE 2 DATA PUSH BC ;SAVE SOURCE 2 PTR LD B,(HL) ;GET SOURCE 1 DATA CP B ;IF S2=S1 THEN EXIT JR Z,CMPB PUSH AF ;SAVE S2 DATA CALL LADRB ;OUTPUT ADDR LD A,B CALL DASH1 ;FORMAT POP AF CALL HEX1 ;OUTPUT S2 CMPB: POP BC CALL HILOXB JR CMPA ;---------------------------------------------------------------------------- ; ; DISPLAY MEMORY COMMAND ; ; THIS ROUTINE DISPLAYS A BLOCK OF MEMORY ON THE CONSOLE DEVICE. THE ; USER MUST SPECIFY THE START & FINISH ADDRESSES. THE DISPLAY IS ORGANIZED TO ; DISPLAY UP TO 16 BYTES PER DISPLAY LINE, WITH ALL COLUMNS ALIGNED SO EACH ; COLUMN HAS THE SAME LAST HEX DIGIT IN IT'S ADDR. ; ; D[ ] ; ;---------------------------------------------------------------------------- DISP: CALL EXLF ;GET BLOCK LIMITS DIS1: CALL LADRB ;DISPLAY START ADDR LD A,L ;SEE IF ON 16 BYTE BOUNDARY CALL TRPLSP ;SKIP OVER TO RIGHT COLUMN PUSH HL DIS2: LD A,(HL) ;GET CONTENTS CALL HEX1 CALL HILO ;INC & CHECK PTR JR C,DIS7 ;DONE IF CARRY CALL BLK ;MAKE COLUMNS LD A,L ;READY FOR NEW LINE? AND 0FH JR NZ,DIS2 DIS3: POP HL ;RESTORE START OF LINE LD A,L ;SKIP OVER TO RIGHT SPACE AND 0FH CALL TRPL2 DIS4: LD A,(HL) ;OUTPUT MEMORY IN ASCII AND 7FH ;IF PRINTABLE THEN OUTPUT LD C,A CP ' ' JR C,DIS5 CP 7EH JR C,DIS6 DIS5: LD C,'.' ;ELSE OUTPUT '.' DIS6: CALL CONOUT CALL HILOX LD A,L ;READY FOR NEW LINE? AND 0FH JR NZ,DIS4 ;NO JR DIS1 ;YES ; DIS7: SUB A,E ;SKIP OVER TO START ASCII CALL TRPLSP JR DIS3 ; TRPLSP: AND 0FH ;ISOLATE LOW NIBBLE LD B,A ;PREPARE TO SPACE OVER TO RIGHT ADD A,A ; COLUMN ADD B TRPL2: LD B,A INC B TRPL1: CALL BLK ;DO SPACING DJNZ TRPL1 RET ;---------------------------------------------------------------------------- ; ; GOTO COMMAND ; ; GOTO COMMAND TRANSFERS CONTROL TO A SPECIFIED ADDRESS IT ALLOWS THE ; SELECTIVE SETTING OF UP TO 2 BREAKPOINTS AS WELL AS ALLOWING ANY CONSOLE ; INPUT TO BREAKPONT THE RUN, AS LONG AS INTERRUPT 1 IS ACTIVE. ; ; G ;START EXECUTION AT WHATEVER IS IN PC REG (NO BPS) ; G ;START EXECUTION AT START_ADDR (NO BPS) ; G,[,] ;START EXECUTION AT START_ADDR WITH ; BREAKPOINT AT BP1 AND OPTIONAL BREAKPOINT AT BP2 ; G,[,] ;START EXECUTION AT PC VALUE WITH BREAKPOINT(S) AT ; BP1 & OPTIONAL BP2. ; ;---------------------------------------------------------------------------- GOTO: CALL PCHK ;SEE IF OD ADDR WANTED JR C,GO3 JR Z,GO0 ;YES, BUT SET BP CALL EXF ;GET NEW GOTO ADDR POP DE LD HL,PLOC ;PUT ADDR IN PC LOCATION ADD HL,SP LD (HL),D DEC HL LD (HL),E LD A,C ;IF LAST = CR THEN EXIT CP CR JR Z,GO3 GO0: LD B,NBKPTS LD HL,TLOC ;POINT TO TRAP STORAGE ADD HL,SP GO1: PUSH BC ;# BPS PUSH HL ;STORAGE PTR LD B,2 CALL EXPR1 POP DE ;GET TRAP ADDR POP HL ;SPTR LD A,D ;INSURE 0 WASN'T SPEC'D OR E JR Z,GO2 LD (HL),E ;SAVE BP ADDR INC HL LD (HL),D INC HL LD A,(DE) ;SAVE BP ADDR INSTRUCTION LD (HL),A INC HL LD A,0CFH ;INSERT THE BP LD (DE),A GO2: LD A,C ;IF CHAR = CR THEN DONE BPING CP CR POP BC JR Z,GO3 DJNZ GO1 ;ELSE IF <2 BPS THEN LOOP GO3: CALL CRLF ;NEW LINE FOR PGM POP HL ;GET RID OF STACK JUNK LD HL,RS9 PUSH HL LD HL,REST LD (9),HL ;SET BP VECTOR ADDR LD HL,24 ;FIND REG SET ROUTINE ADDR ADD HL,SP POP DE ;ADJUST STACK JP (HL) ;GO DO REG RESTORE ;---------------------------------------------------------------------------- ; ; INPUT FROM PORT COMMAND ; ; THESE ROUTINES ALLOW BYTE-BY-BYTE INPUT OR OUTPUT FROM THE CURRENT ; CONSOLE DEVICE. ; ; I ; ;---------------------------------------------------------------------------- INPT: CALL EXPR1 ;GET INPUT PORT # INTO C CALL CRLF ;PUT DATA ON NEW LINE POP BC IN E,(C) PUSH DE ;FIX BUG. BITS2 POPS DE BEFORE 'RET' JR BITS2 ;OUTPUT VALUE ;-------------------------------------- ; ; OUTPUT DATA TO PORT COMMAND ; ; O ; ;-------------------------------------- OUPT: CALL EXPR ;GET DATA INTO E, PORT # INTO C POP DE POP BC OUT (C),E RET ;---------------------------------------------------------------------------- ; ; MOVE COMMAND ; ; THIS ROUTINE EXPECTS 3 PARAMETERS, ENTERED IN THE FOLLOWING SEQUENCE: ; SOURCE 1ST BYTE ADDR, SOURCE LAST BYTE ADDR & DESTINATION 1ST BYTE ADDR. ; ; M ; ;---------------------------------------------------------------------------- MOVE: CALL EXPR3 MOV1: LD A,(HL) ;MOVE 1 BYTE LD (BC),A CALL HILOXB JR MOV1 ;------------------------------------------------ ; ; BOOT COMMAND ; ALLOWS EXECUTION OF A BOOT PROM ; ; B<(ARG * 10H) + PROM #> ; ARG :: 0..FH (PASSED TO BOOT ROM) ; PROM # :: 0..7 (DEFAULT # = 02H) ; ;------------------------------------------------ BOOTC: CALL PCHK ;IF NO FURTHER INPUT THEN USE DEFAULT JP C,BOOTCD CALL EXF ;GET USER BOOT # POP BC JP BOOTCC ;---------------------------------------------------------------------------- ; ; SUBSTITUTE MEMORY COMMAND ; ; THIS ROUTINE ALLOWS THE USER TO INSPECT ANY MEMORY LOCATION & ALTER ; THE CONTENTS, IF DESIRED & IF THE ADDRESS IS IN RAM. THE CONTENTS MAY BE ; LEFT UNALTERED BY ENTERING A SPACE, COMMA OR RETURN. IF A RETURN IS ; ENTERED, THE ROUTINE IS TERMINATED. IF A SPACE OR COMMA IS ENTERED, THE ; ROUTINE PROCEEDS TO THE NEXT LOCATION & PRESENTS THE USER WITH AN ; OPPORTUNITY TO ALTER IT. ; ; S ; ;---------------------------------------------------------------------------- SUBS: CALL EXPR1 ;GET ADDR CALL CRLF ;START ON NEW LINE POP HL SUB1: LD A,(HL) ;OUTPUT EXISTING CONTENTS CALL DASH1 CALL PCHK ;GET NEW VALUE RET C ;IF CHAR = CR THEN RETURN JR Z,SUB2 ;IF CHAR = ' ' OR ',' THEN EXIT CP LF ;IF CHAR = LF THEN BACK UP JR Z,SUB3 PUSH HL ;PTR CALL EXF ;CONTINUE HEX INPUT POP DE ;NEW VALUE POP HL ;PTR LD (HL),E ;LOAD VALUE LD A,C ;IF DELIM = CR THEN DONE CP CR RET Z SUB2: INC HL ;PTR = PTR + 2 INC HL SUB3: DEC HL ;PTR = PTR - 1 LD A,L ;IF ON MOD 8 BOUNDARY THEN AND 7 ; OUTPUT ADDR CALL Z,LADRB JR SUB1 ;---------------------------------------------------------------------------- ; ; MTEST COMMAND TESTS A SPECIFIED BLOCK OF MEMORY TO SEE IF ANY HARD ; DATA BIT FAILURES EXIST. IT IS NOT AN EXHAUSTIVE TEST, BUT JUST A QUICK ; INDICATION OF THE MEMORY'S OPERATIVENESS. ; ; T ; ;---------------------------------------------------------------------------- MTEST: CALL EXLF MTEST1: LD A,(HL) PUSH AF CPL LD (HL),A XOR (HL) ;RESULT SHOULD BE 0 CALL NZ,BITS ;LOG ERR IF NOT MTEST2: POP AF ;RESTORE BYTE LD (HL),A CALL HILOX JR MTEST1 ; BITS: PUSH DE LD E,A CALL LADRB ;OUTPUT ADDR BITS2: LD B,8 ;BIT COUNT BITS1: LD A,E RLCA LD E,A LD A,'0' / 2 ;BUILD ASCII 1 OR 0 RLA LD C,A CALL CONOUT DJNZ BITS1 POP DE RET ;---------------------------------------------------------------------------- ; ; EXAMINE REGISTERS COMMAND ; INSPECTS THE VALUES OF THE REGISTERS STORED BY THE LAST ENCOUNTERED ; BREAKPOINT. THE VALUES MAY BE MODIFIED IF DESIRED. ; ; X ;DISPLAY ALL REGISTER VALUES ; ;r= A,B,C,D,E,F,H,L,M,P,S,I,'A,'B,'C,'D,'E,'H,'L,'M,X,Y,R ; ;d= HEX NUMBER TO PLACE INTO REGISTER r ; ;---------------------------------------------------------------------------- XAA: INC HL ;SKIP OVER TO NEXT ENTRY INC HL XA: INC (HL) ;IF AT END OF TABLE THEN RETURN RET Z JP P,XAB ;SORT OUT BIT 7 OF TABLE OR 80H ;SET IT ON TEST VALUE JR XAC ; XAB: AND 7FH ;RESET BIT 7 XAC: DEC (HL) ;TO BE PULLED OUT IN ROM CP (HL) JR NZ,XAA ;NO MATCH, TRY AGAIN CALL BLK CALL PRTVAL CALL DASH CALL PCHK ;GET NEW INPUT RET C ;IF CHAR = CR THEN RETURN JR Z,XF ;IF NO CHANGE THEN EXIT PUSH HL ;PTR CALL EXF POP HL LD A,L INC DE LD (DE),A EX (SP),HL ;RECOVER TABLE PTR LD A,(HL) ;GET THE ATTRIBUTES EX (SP),HL RLCA ;IF 8 BIT REG THEN EXIT JR NC,XE INC DE ;ELSE REG PAIR, DO OTHER 8 BITS LD A,H LD (DE),A XE: POP HL ;TABLE PTR XF: LD A,C ;IF LAST = CR THEN RETURN CP CR RET Z ; ; THIS IS THE ACTUAL COMMAND ENTRY POINT ; XMNE: LD HL,ACTBL ;ADDR OF REG LOOK-UP TABLE XMNE1: CALL PCHK JR C,XG ;IF CHAR = CR THEN SHOW ALL JR Z,XMNE1 ;IF CHAR = ' ' OR ',' THEN LOOP CP '''' ;IF NOT PRIMES THEN EXIT JR NZ,XA LD HL,PRMTB JR XMNE1 ; XG: LD A,(HL) LD C,A INC A ;IF AT END OF TABLE THEN RETURN RET Z CALL M,CRLF ;NEW LINE IF BIT 7 SET CALL CONOUT CALL DASH CALL PRTVAL CALL BLK INC HL ;NEXT ENTRY JR XG ; PRTVAL: INC HL ;NEXT ENTRY LD A,(HL) ;GET OFFSET & ATTRIBUTES AND 3FH ;ISOLATE OFFSET ADD A,2 ;ALLOW FOR RET ADDR EX DE,HL LD L,A ;BUILD ADDR OF REG CONTENTS LD H,0 ADD HL,SP EX DE,HL LD A,(HL) ;NOW FIND ATTRIBUTES LD B,1 ;SINGLE REG VALUE RLCA JR NC,PV1 ;IF SINGLE REG THEN EXIT INC B ;ELSE REG PAIR RLCA ;IF NOT (HL) THEN EXIT JR NC,PV1 PUSH HL ;BUILD ADDR IN HL LD A,(DE) LD H,A DEC DE LD A,(DE) LD L,A LD A,(HL) ;GET (HL) VALUE POP HL DJNZ PV2 ;ALLWAYS JUMP PV1: LD A,(DE) ;GET REG CONTENTS PV2: CALL HEX1 ;OUTPUT VALUE DEC DE ;MEM PTR DJNZ PV1 RET FORM SUBTTL GENERAL PURPOSE SUBROUTINES ;**************************************************************************** ; ; CONV ROUTINE CONVERTS THE LOW ORDER NIBBLE OF THE ; ACCUMULATOR TO ITS ASCII EQUIVALENT. ; ENTRY- A= NUMBER (LO NIBBLE) ; EXIT - A= C= ASCII NUMBER ; ;*************************************************************** CONV: AND 0FH ADD A,90H ;PUT INTO ASCII ZONE DAA ;AH, THE UBIQUITOUS DAA CONVERT ADC A,40H DAA LD C,A RET ;*************************************************************** ; ; ECHO ROUTINE READS A BYTE FROM CONSOLE DEVICE & ECHOS ; THE CHAR BACK TO THE CONSOLE DEVICE. ; ;*************************************************************** DECHO: CALL DASH ;OUTPUT A '-' ECHO: CALL CONI ECH1: PUSH BC LD C,A ;OUTPUT CHAR CALL CONOUT LD A,C ;RESTORE CHAR IN A POP BC RET ;*************************************************************** ; ; EXPR3 ROUTINE GETS 3 PARAMETERS, DOES A CR-LF & THEN ; LOADS BC, DE & HL WITH THE PARAMS. ; ;*************************************************************** EXPR3: INC B ;B HAS 2 ALREADY CALL EXPR POP BC POP DE JP CRLFA ;GO DO CRLF ;**************************************************************************** ; ; HILO ROUTINE INCREMENTS HL. IT THEN CHECKS FOR (& DISALLOWS) A ; WRAP-AROUND SITUATION. IF IT OCCURS, THE CARRY BIT WILL BE SET ON RETURN. ; IF NO WRAP-AROUND OCCURRED, HL IS COMPARED TO DE & THE FLAGS SET ACCORDINGLY. ; ;**************************************************************************** HILO: INC HL LD A,H ;IF HL = 0 THEN RETURN CF OR L SCF RET Z LD A,E ;ELSE COMPARE HL TO DE SUB L LD A,D SBC A,H RET ;********************************************************** ; ; HILOX ROUTINE INCREMENTS HL, COMPARES IT TO DE & IF ; EQUAL, RETURNS CONTROL TO THE MONITOR EXEC. OTHERWISE, ; CONTROL RETURNS TO THE CALLING ROUTINE. ; ;********************************************************** HILOD: POP DE ;GET RID OF RETURN ADDR RET ;RETURN TO MONITOR HILOXB: INC BC HILOX: CALL HILO JR C,HILOD ;DONE IF CF CALL CONST ;IF NO CONSOLE BREAK THEN OR A ; RETURN RET Z CALL CONI ;IF CHAR <> CTRL-S THEN BREAK CP CTRLS JR NZ,HILOD JP CONI ;ELSE WAIT FOR NEXT CHAR ;*************************************************************** ; ; NIBBLE ROUTINE CONVERTS THE ASCII CHARACTERS 0-9 & A-F ; TO THEIR EQUIVALENT HEX VALUE. IF THE CHARACTER IS NOT IN ; RANGE, THE CARRY BIT IS SET TO FLAG THE ERR. ; ;*************************************************************** NIBBLE: SUB '0' RET C CP 'G' - '0' CCF RET C CP '9' - '0' + 1 CCF RET NC SUB 'A' - '9' - 1 CP 10 RET ;**************************************************************************** ; ; PCHK ROUTINE READS A CHARACTER FROM THE CONSOLE, THEN CHECKS IT FOR A ; DELIMITER. IF IT IS NOT A DELIMITER, A NON-ZERO CONDITION IS RETURNED. IF ; IT IS A DELIMITER, A ZERO CONDITION IS RETURNED. FURTHER, IF THE DELIMITER ; IS A CR, THE CARRY FLAG IS SET. A BLANK OR A COMMA RESETS THE CARRY FLAG. ; ;**************************************************************************** PCHK: CALL ECHO P2C: CP ' ' ;IF CHAR = ' ' THEN RETURN RET Z CP ',' ;IF CHAR = ',' THEN RETURN RET Z CP CR ;IF CHAR = CR THEN RETURN CF SCF RET Z CCF ;ELSE RETURN NC RET ;**************************************************************************** ; ; REST ROUTINE TRAPS ALL OF THE REGISTER CONTENTS WHENEVER A RESTART 1 ; INSTRUCTION IS EXECUTED. THE TRAPPED CONTENTS ARE STORED IN THE SYSTEM ; STACK AREA FOR LATER ACCESS AND USE BY THE GOTO & THE EXAMINE REGISTERS ; COMMANDS. ; ; INSERT INTERRUPT DISABLER SOFTWARE AT START OF REST. ; ;**************************************************************************** REST: PUSH HL ;SAVE ALL REGS PUSH DE PUSH BC PUSH AF CALL MEMSIZ ;GET THE MONITOR STACK LOCATION EX DE,HL LD HL,10 ;GO UP 10 BYTES IN STACK ADD HL,SP LD B,4 EX DE,HL RS1: DEC HL LD (HL),D ;SAVE IN WORK AREA DEC HL LD (HL),E POP DE DJNZ RS1 POP BC ;GET BREAKPOINT LOCATION + 1 DEC BC ;BACK UP TO RESTART INSTRUCTION LD SP,HL ;SET THE MONITOR STACK LD HL,TLOCX ;RESTORE BP ADD HL,SP PUSH DE LD D,NBKPTS RS2: LD A,(HL) SUB C ;SEE IF SOFTWARE TRAP INC HL LD A,(HL) SBC A,B ;MAYBE, TRY REST OF ADDR JR Z,RS5 ;FOUND 1, RESET IT RS3: INC HL ;NOT FOUND, TRY NEXT 1 INC HL DEC D JR NZ,RS2 RS4: INC BC ;NONE FOUND RS5: LD HL,LLOCX POP DE ADD HL,SP LD (HL),E ;STORE USER (HL) INC HL LD (HL),D PUSH BC LD C,'*' ;OUTPUT BREAK INDICATION CALL CONOUT POP DE ;BP LOCATION LD A,RS9 / 256 CP D ;SEE IF A RET BP JR Z,RS6 INC HL INC HL LD (HL),E ;RESTORE USER PC INC HL LD (HL),D EX DE,HL ;OUTPUT BP LOCATION CALL LADR RS6: LD HL,TLOCX ADD HL,SP LD BC,NBKPTS * 256 RS7: LD E,(HL) ;RESTORE BP'D LOCATIONS LD (HL),C ;RESET SYSTEM SAVE AREA INC HL LD D,(HL) LD (HL),C INC HL LD A,E ;IF LOC = 0 THEN SKIP RESTORE OR D JR Z,RS8 LD A,(HL) ;ELSE RESTORE ORIGINAL INSTR. LD (DE),A RS8: INC HL ;DO NEXT BP DJNZ RS7 EX AF,AF' ;NOW SAVE THE Z80 UNIQUES EXX PUSH HL PUSH DE PUSH BC PUSH AF PUSH IX PUSH IY LD A,I LD B,A LD A,R LD C,A PUSH BC JP WINITA ;RETURN TO MONITOR RS9: PUSH HL RST 8 ;FORCE BP EXIT: POP BC LD A,C LD R,A LD A,B LD I,A POP IX POP IY POP AF POP BC POP DE POP HL EX AF,AF' EXX POP DE POP BC POP AF POP HL LD SP,HL DB 0 ;PLACE FOR EI LD HL,0 JP 0 ; ENDX: EQU $ ;---------------------------------------------------------------------------- ; ; 3 TYPES OF ERRORS ARE DETECTED: A RESTART ERROR; AN I/O ASSIGNMENT ; ERROR; & CERTAIN PROGRAM ERRORS (DETERMINED BY PARTICULAR ROUTINE WHERE THE ; ERROR CONDITION WAS ENCOUNTERED) EACH CAUSES A UNIQUE MESSAGE TO BE ; PRINTED, THEN DOES A WARM INIT OF THE MONITOR. THE I/O ERROR CAUSES THE ; I/O ASSIGNMENTS TO BE RESET TO THE DEFAULT ASSIGNMENT. ; ;---------------------------------------------------------------------------- IOER: LD A,IOBYTV ;SET IOBYTE TO DEFAULT LD (IOBYTE),A LD HL,IOMSG JR COMERR ;------------------------------------------- ; ; UNINITIALIZED RESTART ERROR HANDLER ; ;------------------------------------------- RSTER: LD HL,RSTMSG ;--------------------------------- ; ; COMMON ERROR HANDLER ; ENTRY- HL= MESSAGE PTR ; ;--------------------------------- COMERR: CALL PRTWD JP WSVEC ;**************************************************************************** ; ; QUERY ROUTINE WILL TELL THE OPERATOR WHAT HIS CURRENT LOGICAL-PHYSICAL ; PERIPHERAL DEVICE ASSIGNMENTS ARE. NO PARAMETERS (OTHER THAN A CR) ARE ; REQUIRED ON ENTRY. ; ;**************************************************************************** QUERY: LD A,(IOBYTE) LD B,4 LD HL,ACT ;ADDR OF CONVERSION TABLE LD DE,ALT - APT QUE1: PUSH AF CALL BLK LD C,(HL) ;GET CURRENT LOGICAL DEVICE CODE CALL CONOUT CALL DASH POP AF PUSH AF PUSH HL QUE2: INC HL INC A AND 3 ;BITS 0 & 1 ARE 0 WHEN ON CURRENT ASSGN JR NZ,QUE2 LD C,(HL) ;FOUND IT, NOW OUTPUT IT CALL CONOUT POP HL POP AF RRA RRA ADD HL,DE ;NEXT ENTRY DJNZ QUE1 RET ;******************************************************************** ; ; CONI ROUTINE READS THE CONSOLE & STRIPS OFF THE PARITY BIT. ; ;******************************************************************** CONI: CALL CI AND 7FH RTS: RET ;**************************************************************************** ; ; PRTWD ROUTINE OUTPUTS AN ASCII STRING ONTO THE CONSOLE. ; THE STRING MUST BE TERMINATED BY BIT 7 SET IN THE LAST CHAR OF THE STRING. ; THE STRING WILL START A NEW LNE (PRTWD) OR CONTINUE ON THE SAME LINE (PRTWA). ; ;**************************************************************************** PRTWD: CALL CRLF PRTWA: PUSH BC PRTA: LD C,(HL) RES 7,C ;MAKE SURE BIT 7 = 0 CALL CO LD A,(HL) ;IF BIT 7 = 1 THEN STOP INC HL RLCA JR NC,PRTA PRTB: POP BC RET ;*************************************************************** ; ; EXLF ROUTINE READS 2 PARAMETERS, PUTS THEM INTO THE DE ; & HL REGS, THEN DOES A CR-LF. ; ;*************************************************************** EXLF: CALL EXPR POP DE POP HL ;*************************************************************** ; ; CRLF ROUTINE OUTPUTS A CR-LF ON THE CONSOLE DEVICE TO ; START A NEW LINE. ; ;*************************************************************** CRLF: PUSH HL CRLFA: LD HL,CRMSG CALL PRTWA POP HL RET ;*************************************************************** ; ; LADR ROUTINE OUTPUTS THE CONTENTS OF HL ON THE CONSOLE ; EITHER AT THE START OF A NEW LINE (LADRA) OR AT THE CURRENT ; CURSOR LOCATION (LADR). ; ;*************************************************************** LADRA: CALL CRLF LADR: LD A,H CALL HEX1 LD A,L HEX1: PUSH AF RRCA RRCA RRCA RRCA CALL HEX2 POP AF HEX2: CALL CONV JR CO ;********************************************************** ; ; DASH ROUTINE OUTPUTS A '-' TO THE CONSOLE DEVICE ; ;********************************************************** DASH1: CALL HEX1 ;OUTPUT A AS HEX DASH: LD C,'-' JR CO ;*********************** ; ; PRINT ADDR SUBR ; ;*********************** LADRB: CALL LADRA BLK: LD C,' ' ;OUTPUT A SPACE ; FALLS INTO CO SUBR SUBTTL IOBYTE HANDLERS ;******************************************************************** ; ; CONSOLE OUTPUT ; ENTRY- (IOBYTE BIT 0..1): 0: TTY, 1: CRT, 2: BAT, 3: USR1 ; C= CHAR ; ;******************************************************************** CO: LD A,(IOBYTE) AND 3 JP Z,TTYOUT ;SYSTEM CONSOLE CP 2 JP M,CRTOUT ;CRT JP NZ,CUSO1 ;USER 1 ; *** BATCH FALLS INTO LIST OUTPUT *** ;************************************************************************* ; ; LIST DEVICE OUTPUT ; ENTRY- (IOBYTE BIT 6..7)= 0: TTY, 40H: CRT, 80H: LPT, C0H: USR1 ; C= CHAR ; ;************************************************************************* LO: LD A,(IOBYTE) AND 0C0H JP Z,TTYOUT ;SYSTEM CONSOLE CP 80H JP M,CRTOUT ;CRT JP Z,LPRT ;LINE PRINTER JP LUSE1 ;USER 1 ;************************************************************************* ; ; CONSOLE STATUS INPUT ; ENTRY- (IOBYTE BIT 0..1)= 0: TTY, 1: CRT, 2: BATCH, 3: USER 1 ; EXIT - A= 0: NOT READY, FFH: CHAR READY ; ;************************************************************************* CSTS: LD A,(IOBYTE) AND 3 JP Z,TTST ;SYSTEM CONSOLE CP 2 JP M,CRTST ;CRT JP NZ,CUST1 ;USER 1 ; ; BATCH MODE STATUS INPUT FALLS THROUGH HERE ; ENTRY- (IOBYTE BIT 6..7)= 0: TTY, 40H: PTR, 80H: USR1, C0H: USR2 ; LD A,(IOBYTE) AND 0CH JP Z,TTST ;SYSTEM CONSOLE CP 8 JP M,PTRST ;PAPER TAPE RDR JP Z,RUST1 ;USER 1 JP RUST2 ;USER 2 ;******************************************************************** ; ; CONSOLE INPUT ; ENTRY- (IOBYTE BIT 0..1)= 0: TTY, 1: CRT, 2: BATCH, 3: USR1 ; EXIT - A= CHAR (CTRL-Z: EOF) ; ;******************************************************************** CI: LD A,(IOBYTE) AND 3 JP Z,TTYIN ;SYSTEM CONSOLE CP 2 JP M,CRTIN ;CRT JP NZ,CUSI1 ;USER 1 ; BATCH INPUT FALLS INTO READER VECTOR ;******************************************************************** ; ; READER INPUT ; ENTRY- (IOBYTE BIT 2..3)= 0: TTY, 4: PTR, 8: USR1, CH: USR2 ; EXIT - A= CHAR AND 7FH (CTRL-Z: EOF) ; ;******************************************************************** RI: LD A,(IOBYTE) AND 0CH JP Z,TTYRDR ;SYSTEM CONSOLE CP 8 JP M,PTRIN ;PAPER APE RDR JP Z,RUSI1 ;USER 1 JP RUSI2 ;USER 2 ;************************************************************************* ; ; LIST DEVICE STATUS INPUT ; ENTRY- (IOBYTE BIT 6..7)= 0:TTY, 40H: CRT, 80H: LPT, C0H: USR1 ; EXIT - A= 0: BUSY, FFH: READY ; ;************************************************************************* LSTAT: LD A,(IOBYTE) AND 0C0H JP Z,TTOST ;SYSTEM CONSOLE CP 80H JP M,CRTOST ;CRT JP Z,LPRST ;LINE PRINTER JP LUST1 ;USER 1 ;************************************************************************* ; ; PUNCH DEVICE OUTPUT ; ENTRY- (IOBYTE BIT 4..5)= 0: TTY, 10H: HSP, 20H: USR1, 30H: USR2 ; C= CHAR ; ;************************************************************************* PUNO: LD A,(IOBYTE) AND 30H JP Z,TTPNCH ;SYSTEM CONSOLE CP 20H JP M,HSP ;HIGH SPEED PUNCH JP Z,PUSO1 ;USER 1 JP PUSO2 ;USER 2 SUBTTL PRIMITIVE I/O DRIVERS ;************************************** ; ; PRIMARY CONSOLE DEVICE (TTY) ; ;************************************** TTYIN: CALL TTST ;IF CHAR NOT READY THEN WAIT JR Z,TTYIN IN A,NTD ;ELSE RETURN CHAR RET TTYOUT: CALL TTOST ;IF NOT READY TO ACCEPT CHAR THEN WAIT JR Z,TTYOUT LD A,C ;OUTPUT CHAR & RETURN OUT NTD,A RET TTST: IN A,NTS ;IF NOT CHAR NOT READY THEN RETURN 0 AND 1 SHL NTRDY TTOST1: RET Z LD A,-1 ;ELSE RETURN -1 RET TTOST: IN A,NTS ;IF BUSY THEN RETURN 0 CPL AND 1 SHL NTBSY JR TTOST1 ;************************************** ; ; ALTERNATE CONSOLE DEVICE (CRT) ; ;************************************** CRTIN: CALL CRTST ;IF NOT READY THEN WAIT JR Z,CRTIN IN A,BZUDAT ;INPUT CHAR RET CRTOUT: CALL CRTOST ;IF NOT READY THEN WAIT JR Z,CRTOUT LD A,C ;OUTPUT CHAR OUT BZUDAT,A RET CRTST: IN A,BZUST ;IF RXRDY NOT TRUE THEN RETURN 0 AND BZURXR CRTST1: RET Z LD A,-1 ;ELSE RETURN -1 RET CRTOST: IN A,BZUST ;IF TXRDY NOT TRUE THEN RETURN 0 AND BZUTXR JR CRTST1 ;************************************** ; ; ALTERNATE LIST DEVICE (LPT) ; ;************************************** LPRT: CALL LPRST ;IF BUSY THEN WAIT JR Z,LPRT LD A,[1 SHL CENTDST] ;INSURE STROBE STARTS HIGH OUT (CENTOUT),A LD A,C ;OUTPUT CHAR SET CENTDST,A OUT (CENTOUT),A RES CENTDST,A ;OUTPUT LOW TRUE STROBE OUT (CENTOUT),A SET CENTDST,A ;RESTORE STROBE OUT (CENTOUT),A RET LPRST: IN A,(CENTS) ;IF BUSY THEN RETURN 0 CPL ;REVERSE SENSE AND A,[1 SHL CENTBSY] RET Z LD A,-1 ;ELSE RETURN -1 RET ; ADDITIONAL I/O DEVICES ;************************************** ; ; ALTERNATE CONSOLE DEVICE (UC1) ; ;************************************** CUSI1: EQU IOER CUSO1: EQU IOER CUST1: EQU IOER ;************************************** ; ; PRIMARY READER DEVICE (TTY) ; ;************************************** TTYRDR: EQU IOER ;************************************** ; ; ALTERNATE READER DEVICE (PTR) ; ;************************************** PTRIN: EQU IOER PTRST: EQU IOER ;************************************** ; ; ALTERNATE READER DEVICE (UR1) ; ;************************************** RUSI1: EQU IOER RUST1: EQU IOER ;************************************** ; ; ALTERNATE READER DEVICE (UR2) ; ;************************************** RUSI2: EQU IOER RUST2: EQU IOER ;************************************** ; ; PRIMARY PUNCH DEVICE (TTY) ; ;************************************** TTPNCH: EQU IOER ;************************************** ; ; ALTERNATE PUNCH DEVICE (PTP) ; ;************************************** HSP: EQU IOER HSPST: EQU IOER ;************************************** ; ; ALTERNATE PUNCH DEVICE (UP1) ; ;************************************** PUSO1: EQU IOER ;************************************** ; ; ALTERNATE PUNCH DEVICE (UP2) ; ;************************************** PUSO2: EQU IOER ;************************************** ; ; ALTERNATE LIST DEVICE (UL1) ; ;************************************** LUSE1: EQU IOER LUST1: EQU IOER SUBTTL MESSAGES CRMSG: DM CR,LF RSTMSG: DM 'RST ERR' BOOTEM: DM 'BOOT LOAD ERR',CR,LF USRMSG: DM 'MEMORY = ' IOMSG: DM 'I/O ERR' QMSG: DM '????' LOGMSG: DM 'ZMON VERS ',HIGH VERSN,'.',LOW VERSN,CR,LF SUBTTL CONSTANTS ;***************************************************** ; ; TBL CONTAINS THE ADDRESSES OF THE COMMANDS. ; THE EXECUTIVE USES IT TO LOOK UP THE DESIRED ADDR. ; ;***************************************************** TBL: DW ASGN ;A DW BOOTC ;B DW QPRT ;C DW DISP ;D DW QPRT ;E DW FILL ;F DW GOTO ;G DW QPRT ;H DW INPT ;I DW QPRT ;J DW QPRT ;K DW QPRT ;L DW MOVE ;M DW QPRT ;N DW OUPT ;O DW QPRT ;P DW QUERY ;Q DW QPRT ;R DW SUBS ;S DW MTEST ;T DW QPRT ;U DW COMP ;V DW QPRT ;W DW XMNE ;X DW QPRT ;Y DW BYE ;Z ;----------------------- ; ; IOBYTE TABLE ; ;----------------------- ALT: DB 'L' ;LOGICAL LIST DEVICE TABLE DB '2' ; USER DEVICE #2 DB '1' ; USER DEVICE #1 DB 'L' ; LIST TO HIGH SPEED PRINTER DB 'T' ; LIST TO SYSTEM CONSOLE ; APT: DB 'P' ;LOGICAL PUNCH DEVICE TABLE DB '2' ; USER DEVICE #2 DB '1' ; USER DEVICE #1 DB 'P' ; PUNCH TO HIGH SPEED PUNCH DB 'T' ; PUNCH TO SYSTEM CONSOLE ; ART: DB 'R' ;LOGICAL READER DEVICE TABLE DB '2' ; USER DEVICE #2 DB '1' ; USER DEVICE #1 DB 'P' ; READER TO HIGH SPEED READER DB 'T' ; READER TO SYSTEM CONSOLE ; ACT: DB 'C' ;LOGICAL CONSOLE DEVICE TABLE DB '1' ; USER DEVICE #1 DB 'B' ; CONSOLE TO BATCH (LPT OR PTR) DB 'C' ; CONSOLE TO CRT DB 'T' ; CONSOLE TO SYSTEM CONSOLE ;--------------------------------- ; ; Z80 REGISTER OFFSET TABLE ; ;--------------------------------- ACTBL: DB 80H + 'A',ALOC DB 'B',BLOC DB 'C',CLOC DB 'D',DLOC DB 'E',ELOC DB 'F',FLOC DB 'H',HLOC DB 'L',LLOC DB 80H + 'M',HLOC + 0C0H DB 'P',PLOC + 80H DB 'S',SLOC + 80H DB 'I',ILOC ; ; PRIME Z80 REGISTER OFFSETS ; PRMTB: DB 80H + 'A',APLOC DB 'B',BPLOC DB 'C',CPLOC DB 'D',DPLOC DB 'E',EPLOC DB 'F',FPLOC DB 'H',HPLOC DB 'L',LPLOC DB 'M' + 80H,HPLOC + 0C0H DB 'X',XLOC + 80H DB 'Y',YLOC + 80H DB 'R',RLOC DB -1 END