TITLE M5b Z-80 MONITOR CHARACTER I/O ROM LIST NOCOND ;**************************************************************************** ; ; SYSTEM MONITOR FOR M5b ; (c) 1982,1983 GRH ELECTRONICS, CUPERTINO, CA ; ;**************************************************************************** ; ; This code module contains the system character I/O drivers and ; resides in the same address space as the resident Monitor ROM. The ROMs ; communicate with each other through a ROM transfer function. ; *INCLUDE ZBMH122.HDR ;**************************************************************************** ; ; Revision status: ; ; 1.0 - Release ; ; 1.22 11-22-90 GRH ; Separate code from monitor ROM. ; Move code to separate ROM in order to gain space for I/O drivers and ; interrupt code. ; Add rom xover function as include file. ; Add function dispatcher for execution and breakpoint entries. ; ; 1-9-91 GRH ; Add conditional ASSY for default CON:. Add SIO driver as alternate. ; VERSN EQU 122 ;**************************************************************************** FORM FALSE EQU 0 TRUE EQU NOT FALSE SERIAL EQU TRUE ; ; INCLUDE SYSTEM DEFINITION FILES ; ;*MACLIB ASMBTOOL.MLB ;*INCLUDE MONBOARD.DEF ;*INCLUDE NAKEDT.DEF ;*INCLUDE PRI.DEF ;*INCLUDE ZBMFUNS.DEF ;*INCLUDE COMIOPB2.DEF ; LIST OFF *MACLIB ASMBTOOL.MLB *INCLUDE MONBOARD.DEF *INCLUDE NAKEDT.DEF *INCLUDE PRI.DEF *INCLUDE ZBMFUNS.DEF *INCLUDE COMIOPB2.DEF LIST ON *INCLUDE ZBMG122.DEF THIS_ROM EQU CHR_RNUM SUBTTL EXTERNAL ENTRY POINTS ORG MONROM ; JP CINIT ;COLD START ; ; EXTERNAL FUNCTION ENTRY DURING INTERRUPT ; DS (MONROM + 6) - $ JP I_STUB ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXTERNAL FUNCTION STUB FOR USE DURING AN INTERRUPT WITHOUT THE ; RESIDENT ROM ENABLED. USE IN ALL NON-RESIDENT ROMS. ; ENTRY- A= FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; I_STUB: ADD A,2 ;BIAS UP PUSH HL LD H,MR_RNUM ;USE RESIDENT ROM LD L,A EX (SP),HL CALL XROMF ;GO EXECUTE THE FUNCTION INC SP ;BALANCE STACK INC SP RET ;**************************************************************************** ; ; COLD INIT ONLY SWITCHES TO RESIDENT ROM ; ;**************************************************************************** ; CINIT: ; ; SET STACK ; LD SP,MONSTK ; ; RESET ROM FUNCTION SHOULD NOT RETURN ; LD HL,[MR_RNUM SHL 8] + 1 ;RESET PUSH HL CALL XROMF ; ; IF RETURNED THEN HALT ; HALT SUBTTL MONITOR BOARD SHADOW ROM SELECTION PROCEDURE *INCLUDE XROM.Z80 SUBTTL MONITOR FUNCTION CALL DISPATCHER ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; ENTRY- A= FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; FUNCH: CP A,MAXFUNS JR NC,MFUNERR ; ; FUNCTION SEEMS LEGAL, FETCH EXECUTION ADDRESS FROM TABLE ; PUSH HL ;SAVE POSSIBLE ARGUMENT ; LD HL,FUNTABL ADD A,A ADD A,L LD L,A LD A,0 ADC A,H LD H,A LD A,(HL) INC HL LD H,(HL) LD L,A ; ; RESTORE ARGUMENT & PUT EXECUTION ADDRESS ON STACK EX (SP),HL ; ; RETURN TO EXECUTION ADDRESS ; RET ; ; ; FUNCTION ERROR ; MFUNERR: LD A,-1 OR A,A RET ;############################################################################ ; ; MONITOR FUNCTION TABLE ; ;############################################################################ ; FUNTABL: DW RETVERS ;0: RETURN MONITOR ROM VERSION ; DW MFUNERR ;1: RETURN CHAR DEVICE PARAMETERS DW MFUNERR ;2: EXECUTE SELF TEST DW MFUNERR ;3: SET STANDARD CONSOLE DEVICE DW MFUNERR ;4: SET STANDARD LIST DEVICE DW MFUNERR ;5: INITIALIZE CHAR DEVICE DW MFUNERR ;6: SET DEVICE BAUD RATE DW MFUNERR ;7: SPARE DW CIS ;8: RETURN STANDARD CONSOLE INPUT STATUS DW CI ;9: RETURN STANDARD CONSOLE CHAR DW COS ;10: RETURN STANDARD CONSOLE OUTPUT STATUS DW CO ;11: SEND CHAR TO STANDARD CONSOLE DW LOS ;12: RETURN STANDARD LIST DEVICE OUTPUT STATUS DW LO ;13: SEND CHAR TO STANDARD LIST DEVICE ; MAXFUNS EQU ($ - FUNTABL) / 2 SUBTTL DEBUGGER FUNCTIONS ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN VERSION FUNCTION ; EXIT - HL= VERSION # (123D = 1.23) ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; RETVERS: LD HL,VERSN RET ;**************************************************************************** ; ; INITIALIZE I/O ; ;**************************************************************************** ; ROM_INIT: IF SERIAL <> TRUE ; ; IF NAKED TERMINAL INSTALLED THEN SET IOBYTE TO IT ; ELSE SET IOBYTE TO SIO ; IN A,(NT_STAT) AND A,[1 SHL NT_PRSNT] RRCA ELSE XOR A,A ENDIF LD (IOBYTE),A ; ; INIT SIO ANYWAY ; LD HL,IOIDTA ;SET TABLE PTR ; IOILP: LD C,(HL) ;FETCH PORT INC HL ; LD A,C ;IF PORT == -1 THEN DONE INC A JR Z,IOIDN ; LD B,(HL) ;FETCH COUNT INC HL OTIR JR IOILP ; ; SIO DONE ; IOIDN: ; ; DISPLAY SIGN-ON ; LD HL,LOGMSG CALL PRTS ; ; DONE ; RET ;############################################################################ ; ; SIO INITIALIZATION DATA TABLE ; ;############################################################################ ; IOIDTA: ; ; SIO #0A ; DB 35H ;PORT DB 8 DB 18H DB 4,44H DB 3,0C1H DB 5,0EAH DB 0 ; ; SIO #0B ; DB 37H DB 8 DB 18H DB 4,44H DB 3,0C1H DB 5,0EAH DB 0 ; ; CTC 0: SIO #0A BAUD ; DB 3CH DB 2 DB 01000101B DB 64 ; ; CTC 1: SIO #0B BAUD ; DB 3DH DB 2 DB 01000101B DB 64 ; DB -1 ;END-OF-TABLE SUBTTL FUNCTIONS AND PROCEDURES ;**************************************************************************** ; ; DISPLAY TEXT ON CONSOLE PROCEDURE ; ENTRY- HL= PTR TO BIT-7 TERMINATED ASCII TEXT ; ;**************************************************************************** ; PRTS: ; ; DISPLAY CHAR ; LD C,(HL) RES 7,C PUSH HL CALL CO POP HL ; ; IF CHAR < 128 THEN DO NEXT CHAR ; BIT 7,(HL) INC HL JR Z,PRTS ; RET SUBTTL IOBYTE HANDLERS ;**************************************************************************** ; ; SYSTEM CONSOLE OUTPUT STATUS SELECTOR ; ENTRY- (IOBYTE BIT 0..1)= 0: CON0, 1: CON1, 2: CON2, 3: CON3 ; EXIT - A= 0: BUSY, FFH: READY ; ;**************************************************************************** ; COS: LD A,(IOBYTE) AND A,3 JP Z,COS0 ;CONSOLE 0 CP A,2 JP M,COS1 ;CONSOLE 1 JP Z,COS2 ;CONSOLE 2 JP COS3 ;CONSOLE 3 ;**************************************************************************** ; ; SYSTEM CONSOLE OUTPUT SELECTOR ; ENTRY- (IOBYTE BIT 0..1): 0: CON0, 1: CON1, 2: CON2, 3: CON3 ; C= CHAR ; ;**************************************************************************** ; CO: LD A,(IOBYTE) AND A,3 JP Z,CO0 ;CONSOLE 0 CP A,2 JP M,CO1 ;CONSOLE 1 JP Z,CO2 ;CONSOLE 2 JP CO3 ;CONSOLE 3 ;**************************************************************************** ; ; SYSTEM CONSOLE INPUT STATUS SELECTOR ; ENTRY- (IOBYTE BIT 0..1)= 0: CON0, 1: CON1, 2: CON2, 3: CON3 ; EXIT - A= 0: NOT READY, FFH: CHAR READY ; ;**************************************************************************** ; CIS: LD A,(IOBYTE) AND A,3 JP Z,CIS0 ;CONSOLE 0 CP A,2 JP M,CIS1 ;CONSOLE 1 JP Z,CIS2 ;CONSOLE 2 JP CIS3 ;CONSOLE 3 ;**************************************************************************** ; ; SYSTEM CONSOLE INPUT SELECTOR ; ENTRY- (IOBYTE BIT 0..1)= 0: CON0, 1: CON1, 2: CON2, 3: CON3 ; EXIT - A= CHAR (CTRL-Z: EOF) ; ;**************************************************************************** ; CI: LD A,(IOBYTE) AND A,3 JP Z,CI0 ;CONSOLE 0 CP A,2 JP M,CI1 ;CONSOLE 1 JP Z,CI2 ;CONSOLE 2 JP CI3 ;CONSOLE 3 ;**************************************************************************** ; ; LIST DEVICE OUTPUT SELECTOR ; ENTRY- (IOBYTE BIT 6..7)= 0: LST0, 40H: LST1, 80H: LST2, C0H: CON ; C= CHAR ; ;**************************************************************************** ; LO: LD A,(IOBYTE) AND A,0C0H JP Z,LO0 ;PRINTER 0 CP A,80H JP M,LO1 ;PRINTER 1 JP Z,LO2 ;PRINTER 2 JP CO ;CONSOLE ;**************************************************************************** ; ; LIST DEVICE STATUS INPUT SELECTOR ; ENTRY- (IOBYTE BIT 6..7)= 0: LST0, 40H: LST1, 80H: LST2, C0H: CON ; EXIT - A= 0: BUSY, FFH: READY ; ;**************************************************************************** ; LOS: LD A,(IOBYTE) AND A,0C0H JP Z,LOS0 ;PRINTER 0 CP A,80H JP M,LOS1 ;PRINTER 1 JP Z,LOS2 ;PRINTER 2 JP COS ;CONSOLE SUBTTL PRIMITIVE I/O DRIVERS IF SERIAL CONMSG -- SERIAL VERSION -- ;**************************************************************************** ; ; PRIMARY CONSOLE DEVICE (CON0) : SIO #0A ; ;**************************************************************************** ; ; RETURN INPUT STATUS ; CIS0: IN A,(35H) AND A,00000001B RET Z LD A,-1 ;ELSE RETURN -1 RET ; ; ; RETURN INPUT CHAR ; CI0: CALL CIS0 ;IF CHAR NOT READY THEN WAIT JR Z,CI0 ; IN A,(34H) ;ELSE RETURN CHAR RET ; ; ; RETURN OUTPUT STATUS ; COS0: IN A,(35H) ;IF NOT READY TO ACCEPT CHAR THEN WAIT AND A,00000100B RET Z LD A,-1 RET ; ; ; OUTPUT CHAR ; CO0: CALL COS0 ;IF BUSY THEN WAIT JR Z,CO0 ; LD A,C ;OUTPUT CHAR & RETURN OUT (34H),A RET ELSE CONMSG -- NAKED TERMINAL VERSION -- ;**************************************************************************** ; ; PRIMARY CONSOLE DEVICE (CON0) : NAKED TERMINAL ; ;**************************************************************************** ; ; RETURN INPUT STATUS ; CIS0: IN A,(NT_STAT) ;IF NOT CHAR NOT READY THEN RETURN 0 AND A,1 SHL NT_READY RET Z LD A,-1 ;ELSE RETURN -1 RET ; ; ; RETURN INPUT CHAR ; CI0: CALL CIS0 ;IF CHAR NOT READY THEN WAIT JR Z,CI0 ; IN A,(NT_DATA) ;ELSE RETURN CHAR RET ; ; ; RETURN OUTPUT STATUS ; COS0: IN A,(NT_STAT) ;IF NOT READY TO ACCEPT CHAR THEN WAIT CPL AND A,1 SHL NT_BUSY RET Z LD A,-1 RET ; ; ; OUTPUT CHAR ; CO0: CALL COS0 ;IF BUSY THEN WAIT JR Z,CO0 ; LD A,C ;OUTPUT CHAR & RETURN OUT (NT_DATA),A RET ENDIF ;**************************************************************************** ; ; ALTERNATE CONSOLE DEVICE (CON1) : SIO #0 ; ;**************************************************************************** ; CIS1: EQU CIS0 CI1: EQU CI0 COS1: EQU COS0 CO1: EQU CO0 ;**************************************************************************** ; ; ALTERNATE CONSOLE DEVICE (CON2) ; ;**************************************************************************** ; CIS2: EQU CIS0 CI2: EQU CI0 COS2: EQU COS0 CO2: EQU CO0 ;**************************************************************************** ; ; ALTERNATE CONSOLE DEVICE (CON3) ; ;**************************************************************************** ; CIS3: EQU CIS0 CI3: EQU CI0 COS3: EQU COS0 CO3: EQU CO0 ;**************************************************************************** ; ; LIST DEVICE 1 (LST1) : PRI CENTRONICS ; ;**************************************************************************** ; ; RETURN OUTPUT STATUS ; LOS0: LD A,0BFH ;THIS PRINTER NEEDS STB=F FOR BUSY OUT (PRI_2CNT),A ; TO WORK PROPERLY ; IN A,(PRI_1ST) ;FETCH STATUS CPL AND A,[1 SHL PRI_1BSB] ;TEST BUSY RET Z ; LD A,-1 RET ; ; ; OUTPUT CHAR ; LO0: CALL LOS0 ;WAIT FOR BUSY=FALSE JR Z,LO0 ; LD A,C ;OUTPUT CHARACTER OUT (PRI_1DO),A LD A,NOT [1 SHL PRI_1CSB] ;OUTPUT STROBE OUT (PRI_2CNT),A LD A,0BFH OUT (PRI_2CNT),A ;CLEAR STROBE RET ;**************************************************************************** ; ; LIST DEVICE 1 (LST1) ; ;**************************************************************************** ; LOS1: EQU LOS0 LO1: EQU LO0 ;**************************************************************************** ; ; LIST DEVICE 2 (LST2) ; ;**************************************************************************** ; LOS2: EQU LOS0 LO2: EQU LO0 LOGMSG DB ' M5b Character I/O V. ' PVERS VERSN DM CR,LF END