TITLE M5b Z-80 MONITOR RESIDENT ROM LIST NOCOND ;**************************************************************************** ; ; SYSTEM MONITOR FOR M5b ; (c) 1982,1983,1990 GRH Enterprises, Cupertino, CA ; ;**************************************************************************** ; ; This Monitor program resides at the top 2k of memory & supports the ;system resources and transfer to additional ROMs residing in the same memory ; area as this ROM. ; *INCLUDE ZBMH122.HDR ;**************************************************************************** ; ; 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. ; 1.8 - 29 MAY 86 GRH ; Add Cromemco PRI printer driver as primary printer. ; Change IOBYTE definitions. ; Remove initialization of Jade FDC port 40H in anticipation of ; Cromemco bank select useage. ; 1.9 - 16 AUG 86 GRH ; Fix bug in PRI driver which caused new Oki 93 to be busy. ; 1.10- 8 FEB 87 GRH ; Fix bug in register restore routine which caused IX & IY to be ; swapped prior to GOTO. ; Change restart error to vector to breakpoint after message. ; 1.11- 27 DEC 87 GRH ; Add bank memory management routines. ; 1.12 20 JUL 88 GRH ; Add Monitor function call restart. ; 1.20 29 DEC 88 GRH ; Add banked memory support: ; 1. Page 0 initialization. ; 2. Init bank register to bank 0F8H. ; 1.21 27 JAN 89 GRH ; Add new monitor function routines. ; ; 1.22 11-22-90 GRH ; Move debugger code to separate ROM in order to gain space for I/O ; drivers and interrupt code for SIO ports. ; Add serial I/O driver. ; Add rom xover function as include file so all modules can utilize it. ; VERSN EQU 122 ;**************************************************************************** FORM FALSE EQU 0 TRUE EQU NOT FALSE ; ; INCLUDE SYSTEM DEFINITION FILES ; ;*MACLIB ASMBTOOL.MLB ;*INCLUDE MONBOARD.DEF ;*INCLUDE BIGZ.DEF ;*INCLUDE JDDCONT.DEF ;*INCLUDE ZBMFUNS.DEF ; LIST OFF *MACLIB ASMBTOOL.MLB *INCLUDE MONBOARD.DEF *INCLUDE BIGZ.DEF *INCLUDE JDDCONT.DEF *INCLUDE ZBMFUNS.DEF LIST ON *INCLUDE ZBMG122.DEF ; THIS_ROM EQU MR_RNUM ; ; BANK SELECTION ; BNKREG EQU BZ_XADR ;MEMORY BANK SELECT REGISTER PORT ADDRESS (BIG Z) SUBTTL JUMP TARGETS FOR MONITOR ENTRY ORG MONROM ; ; COLD START VECTOR ; JP INIT ;COLD START (RESET) ; JP CI ;RETURN NEXT SYSTEM CONSOLE CHAR IN A ; FUNENT: JP MONFUNC ;EXECUTE MONITOR FUNCTION IN A ; JP CO ;SEND CHAR IN C TO SYSTEM CONSOLE ; JP COS ;RETURN SYSTEM CONSOLE OUTPUT STATUS IN A ; JP LO ;SEND CHAR IN C TO SYSTEM LIST DEVICE ; JP CIS ;RETURN SYSTEM CONSOLE INPUT STATUS IN A ; JP GETMEM ;RETURN BANKED MEMORY DATA ; JP PUTMEM ;STORE BANKED MEMORY DATA ; JP BNKSEL ;SELECT MEMORY BANK ; JP XMOVE ;SELECT MEMORY BANKS FOR MOVE ; JP BMOVE ;BANKED MEMORY BLOCK MOVE ; JP REST ;(NOT IMPLIMENTED) ;EXECUTE BANK FUNCTION ; JP LOS ;RETURN SYSTEM LIST DEVICE OUTPUT STATUS IN A ; JP REST ;INTERNAL BREAKPOINT ENTRY ; JP GOTOS ;INTERNAL EXECUTE REGISTERS PROCEDURE (GOTO) ; JP RSTER ;RESTART ERROR ENTRY ; JP PRTS ;DISPLAY BIT7 TERMINATED TEXT ON SYSTEM CONSOLE SUBTTL MONITOR BOARD SHADOW ROM SELECTION PROCEDURE *INCLUDE XROM.Z80 SUBTTL MEMORY MANAGEMENT ROUTINES ;**************************************************************************** ; ; BANK SELECT PROCEDURE ; NOTE: THIS FUNCTION IS ONLY FOR CP/M 3.0 COMPATABILITY. ALL OTHER ; ROUTINES SHOULD USE GETMEM, PUTMEM & XROM ROUTINES. ; ENTRY- A= BANK ADDRESS ; ;**************************************************************************** ; FBSEL: LD A,C ; BNKSEL: ; ; SELECT NEW BANK ; OUT (BNKREG),A ; ; STORE IN BANK PAGE 0 ; LD (THIS_BNK),A ; ; DONE ; RET ;**************************************************************************** ; ; SET BANKS FOR A FOLLOWING MOVE CALL (CP/M 3.0 COMPATABLE) ; ENTRY- B= SOURCE BANK ; C= DESTINATION BANK ; EXIT - A= ? ; ;**************************************************************************** ; XMOVE: ; ; STORE BANK #S ; LD (DBANK),BC ; ; SET BANKS CHANGED FLAG ; LD A,-1 LD (BNKCHG),A ; ; DONE ; RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; MEMORY TO MEMORY MOVE FUNCTION ; NOTE: THIS FUNCTION IS NOT CP/M 3.0 COMPATABLE. HL & DE ARE REVERSED ; (Z-80 COMPATABLE) ; ENTRY- HL= SOURCE PTR ; DE= DESTINATION PTR ; BC= BYTE COUNT ; EXIT - HL & DE= NEXT BYTES TO MOVE PTRS ; A, BC= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; BMOVE: ; ; IF BANK NOT SELECTED PRIOR TO CALL THEN USE FASTER INTRA-BANK MOVE ; LD A,(BNKCHG) OR A,A JP NZ,BMOVE2 ; LDIR ; ; DONE WITH SIMPLE CASE ; RET ; ; ; ELSE USE INTER-BANK MOVE ; BMOVE2: ; ; SAVE CURRENT BANK # ; LD A,(THIS_BNK) LD (CBANK),A ; ; CLEAR INTER-BANK MOVE FLAG FOR NEXT TIME ; XOR A,A LD (BNKCHG),A ; ; IF IN SAME BANK THEN USE INTRA_BANK MOVE ON IT ; PUSH HL ;SAVE PTR LD HL,(DBANK) LD A,H CP A,L POP HL ;PTR JP NZ,NTSAME ; ; SELECT BANK OF MOVE ; DI ;NO INTERRUPTS WHILE BANK SWAPPED ; OUT (BNKREG),A ;A STILL HAS BANK (BOTH SAME, REMEMBER?) ; LDIR ; ; DONE, RESTORE BANK TO CURRENT BANK WHEN CALLED ; BMOVE3: LD A,(CBANK) ;RESELECT CURRENT BANK & RETURN OUT (BNKREG),A ; EI ;ALLOW INTERRUPTS NOW RET ; ; ; BANKS NOT THE SAME, DO DISCRETE MOVE ; NTSAME: ; ; SAVE COUNT ; PUSH BC ;SAVE COUNT EXX POP BC EXX ; ; FETCH BANKS ; LD BC,(DBANK) ; ; NO INTERRUPTS WHILE MOVING ; DI ; ; TOP OF MOVE LOOP ; BMOVE4: LD A,B ;SELECT SOURCE BANK OUT (BNKREG),A LD A,(HL) EX AF,AF' ; LD A,C ;SELECT DESTINATION BANK OUT (BNKREG),A EX AF,AF' LD (DE),A ; INC HL ;NEXT BYTE INC DE ; EXX ;CHECK FOR DONE DEC BC LD A,C OR A,B EXX JP NZ,BMOVE4 ; ; DONE ; JP BMOVE3 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN BANKED MEMORY DATA FUNCTION ; ENTRY- HL= OFFSET PTR ; E= BANK # ; EXIT - A= DATA ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; GETMEM: ; ; SAVE REGISTER ; PUSH BC ; ; SAVE CURRENT BANK FOR RETURN ; LD A,(THIS_BNK) LD B,A ; ; SELECT BANK ; LD A,E DI ;NO INTERRUPTS OUT (BNKREG),A ; ; FETCH DATA ; LD C,(HL) ; ; RESTORE BANK ; LD A,B OUT (BNKREG),A ; ; RETURN DATA ; LD A,C ; ; DONE ; POP BC EI RET ;**************************************************************************** ; ; STORE DATA INTO BANKED MEMORY PROCEDURE ; ENTRY- HL= OFFSET PTR ; E= BANK # ; C= DATA ; EXIT - A= ? ; ;**************************************************************************** ; PUTMEM: ; ; SAVE REG ; PUSH BC ; ; SAVE CURRENT BANK TO RETURN TO ; LD A,(THIS_BNK) LD B,A ; ; SELECT BANK ; LD A,E DI ;NO INTERRUPTS WHILE BANK SWAPPED OUT (BNKREG),A ; ; STORE DATA ; LD (HL),C ; ; RESTORE BANK ; LD A,B OUT (BNKREG),A ; EI ; ; DONE ; POP BC RET SUBTTL MONITOR FUNCTION CALL DISPATCHER ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; ENTRY- A= FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; FUNCH: ;ROM SWAP ENTRY MONFUNC: ;EXTERNAL ENTRY ; ; IF NOT LOCAL FUNCTIONS THEN EXIT ; CP A,MAXFUNS JR NC,NOT_INT ; ; 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 GETMEM ;1: RETURN BANKED MEMORY DATA DW PUTMEM ;2: STORE DATA INTO BANKED MEMORY DW MFUNERR ;3: SPARE DW XMOVE ;4: SET BLOCK MOVE BANKS DW BMOVE ;5: BANKED BLOCK MOVE DW MFUNERR ;6: SELECT NEW BUS PROCESSOR DW MFUNERR ;7: RETURN CURRENTLY SELECTED BANK IN A DW GOTOS ;8: DEBUGGER EXECUTER DW FBSEL ;9: SELECT NEW BANK ; MAXFUNS EQU ($ - FUNTABL) / 2 SUBTTL MONITOR FUNCTIONS ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN VERSION FUNCTION ; EXIT - HL= VERSION # (123D = 1.23) ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; RETVERS: LD HL,VERSN RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; NOT INTERNAL FUNCTION, CHECK FOR DEBUGGER ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; NOT_INT: ; ; BIAS DOWN DEBUGGER FUNCTIONS ; SUB A,16 ; ; IF FUN# < START THEN INTERNAL FUNCTION RESERVED ERR ; JR C,MFUNERR ; ; ELSE IF FUN# > LAST THEN GO CHECK NEXT GROUP ; CP A,16 JR NC,NOT_DEB ; ; ELSE EXECUTE DEBUGGER FUNCTION ; ADD A,2 ;BIAS UP PUSH HL LD H,DEB_RNUM LD L,A EX (SP),HL CALL XROMF INC SP INC SP RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CHAR FUNCTIONS ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; NOT_DEB: ; ; BIAS DOWN TO CHAR FUNS ; SUB A,16 ; ; IF NOT CHAR FUNCS THEN CHECK NEXT GROUP ; CP A,32 JR NC,NOT_CHR ; ; ELSE EXECUTE CHAR ROM ; ADD A,2 PUSH HL LD L,A LD H,CHR_RNUM EX (SP),HL CALL XROMF INC SP INC SP RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; DISK DRIVER FUNCTIONS ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; NOT_CHR: ; ; BIAS DOWN TO DISK FUNCTIONS ; SUB A,32 ; ; IF NOT DISK FUNCTIONS THEN GO CHECK NEXT GROUP ; CP A,16 JR NC,NOT_DSK ; ; ELSE EXECUTE DISK ROM ; ADD A,2 ;ADD OFFSET ; PUSH HL ;SAVE ARG LD H,DK_RNUM ;SET ROM # LD L,A ;SET FUNCTION # EX (SP),HL CALL XROMF INC SP INC SP ; RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; MISCELLANEOUS DRIVER FUNCTIONS ; ENTRY- D= DRIVER FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; NOT_DSK: ; ; BIAS DOWN TO MISC. FUNCTIONS ; SUB A,16 ; ; SET ROM # ; ADD A,2 ;ADD OFFSET ; PUSH HL ;SAVE ARG LD H,CLK_RNUM ;SET ROM # LD L,A ;SET FUNCTION # EX (SP),HL CALL XROMF INC SP INC SP ; RET SUBTTL INITIALIZATION CODE ;---------------------------------------------------------------------------- ; ; THIS IS THE COLD START INIT CODE ; ;---------------------------------------------------------------------------- ; ROM_INIT: ;XROM ENTRY INIT: ;EXTERNAL ENTRY ; ; INSURE INTERRUPTS DISABLED ; DI ; ; REMOVE PAGE 0 IMAGE ; OUT (M2_CLDRES),A ; ; REMOVE JADE DOUBLE D WINDOW(S) ; LD A,DD_FREE ;REMOVE DD WINDOW, IF PRESENT OUT (DD_PRT3),A OUT (DD_PRT5),A OUT (DD_PRT8),A ; ; SET MEMORY BANK ; LD A,DEFBNK OUT (BNKREG),A ; ; INITIALIZE RESTART VECTORS IN PAGE 0 ; LD SP,003FH ;USE STACK TO INIT RESTARTS LD HL,0C300H LD DE,RSTER LD B,16 ;64 BYTES ; INIT1: PUSH DE PUSH HL DJNZ INIT1 ; ; SET STACK ; LD SP,MONSTK ; ; SET MEMORY BANK CONSTANT ; LD (THIS_BNK),A ;A STILL HAS DEFAULT BANK # ; ; INIT ALL BANKS ; LD E,A ;START WITH ALL Z80 BANKS LD HL,THIS_BNK ;POINT TO LOCATION TO STORE BANK # BNKS_INIT: LD C,E ;STORE IT CALL PUTMEM ; INC E ;NEXT BANK ; LD A,0FFH ;IF NOT LAST BANK THEN REPEAT CP A,E JR NZ,BNKS_INIT ; ; INITIALIZE IOBYTE ; LD A,IOBYTV ;SET TO INITIAL IOBYTE VALUE LD (IOBYTE),A ; ; SET BANK STACK ; LD (THIS_STK),SP ; ; SET FUNCTION CALL RESTART ; LD HL,FUNENT LD (MFUNRSV),HL ; ; INIT ROMS (I/O) ; LD HL,[CHR_RNUM SHL 8] + 1 ;CHAR PUSH HL CALL XROMF POP HL ; LD HL,[DEB_RNUM SHL 8] + 1 ;DEBUGGER PUSH HL CALL XROMF POP HL ; LD HL,[DK_RNUM SHL 8] + 1 ;DISK PUSH HL CALL XROMF POP HL ; LD HL,[CLK_RNUM SHL 8] + 1 ;MISC PUSH HL CALL XROMF POP HL ; ; OUTPUT SIGN-ON MESSAGE ; LD HL,LOGMSG ;OUTPUT SIGN-ON CALL PRTS ; ; EXECUTE THE DEBUGGER ; MAINLP: LD SP,MONSTK LD HL,[DEB_RNUM SHL 8] + MF_XDEB - 16 + 2 ;3 PUSH HL CALL XROMF POP HL JR MAINLP SUBTTL DEBUGGER SUPPORT ROUTINES ;**************************************************************************** ; ; GOTO STUB ; ;**************************************************************************** ; GOTOS: ; ; SCRUB FUNCTION DATA ON STACK ; POP HL ;RET ADDR TO XROMF POP HL ;CALLER RETURN ADDR POP HL ;XROM ARGUMENT ; ; SET REGISTERS ; LD HL,(RLOC) ;L= R, H= I LD A,H ;SET I REG. LD I,A ; LD A,L ;SAVE R REG ; LD HL,(FLOC) ;FETCH AF PUSH HL ; LD HL,(LLOC) ;SET HL ; ; DO AT LAST MINUTE TO MINIMIZE REFRESH REGISTER CHANGE ; LD R,A ;SET R POP AF ;SET AF ; ; RESERVE SPACE FOR A EI INSTRUCTION TO BE PATCHED IN ; DB 0 ;'NOP' OR PLACE FOR 'EI' ; ; RETURN TO EXECUTION ADDRESS ON STACK ; RET ;**************************************************************************** ; ; REST ROUTINE TRAPS ALL OF THE REGISTER CONTENTS WHENEVER A BREAKPOINT ; RESTART INSTRUCTION IS EXECUTED. THE TRAPPED CONTENTS ARE STORED IN THE ; MONITOR VARIABLE AREA FOR LATER ACCESS AND USE BY THE GOTO & THE EXAMINE ; REGISTERS COMMANDS. ; ; INSERT INTERRUPT DISABLER SOFTWARE AT START OF REST. ; ;**************************************************************************** ; REST: ; ; SAVE 8080 REGS FIRST SO WE CAN WORK ; PUSH AF LD A,R ;DO REFRESH REGISTER AS SOON AS POSSIBLE LD (LLOC),HL POP HL LD (FLOC),HL ; LD L,A ;REFRESH REGISTER LD A,I LD H,A LD (RLOC),HL ; LD (ELOC),DE LD (CLOC),BC ; ; FETCH RETURN ADDRESS FROM PGM STACK ; POP BC ; ; SAVE SP AT BREAKPOINT ; LD (SLOC),SP ; ; BACK UP RETURN ADDRESS TO POINT TO RESTART INSTRUCTION ; DEC BC ; ; SET UP LOCAL STACK ; LD SP,MONSTK ;SET THE MONITOR STACK ; ; RETURN TO DEBUGGER ; LD HL,[DEB_RNUM SHL 8] + 4 PUSH HL CALL XROMF POP HL JP MAINLP SUBTTL SUBROUTINES & FUNCTIONS ;---------------------------------------------------------------------------- ; ; UNINITIALIZED RESTART ERROR HANDLER ; ;---------------------------------------------------------------------------- ; RSTER: PUSH AF PUSH HL LD HL,RSTMSG CALL PRTS POP HL POP AF JP REST ;**************************************************************************** ; ; PRTS ROUTINE OUTPUTS AN ASCII STRING ONTO THE CONSOLE. ; THE STRING MUST BE TERMINATED BY BIT 7 SET IN THE LAST CHAR OF THE STRING. ; ENTRY- HL= TEXT PTR ; ;**************************************************************************** ; PRTS: ; ; DISPLAY CHAR ; LD C,(HL) ;FETCH CHAR RES 7,C ;MAKE 7-BIT PUSH HL ;SAVE PTR CALL CO ;DISPLAY CHAR POP HL ;RESTORE PTR ; ; IF CHAR < 128 THEN REPEAT ; BIT 7,(HL) INC HL ;NEXT CHAR JR Z,PRTS ; ; ELSE DONE ; RET SUBTTL EXTERNAL NON-FUNCTION CONSOLE I/O ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN SYSTEM CONSOLE OUTPUT STATUS FUNCTION ; EXIT - A= 0: BUSY, FFH: READY ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; COS: XCROM MF_COS ; ; DONE ; RET ;**************************************************************************** ; ; SEND CHAR TO SYSTEM CONSOLE OUTPUT PROCEDURE ; ENTRY- C= CHAR ; ;**************************************************************************** ; CO: XCROM MF_CO ; ; DONE ; RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN SYSTEM CONSOLE INPUT STATUS FUNCTION ; EXIT - A= 0: NOT READY, FFH: CHAR READY ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CIS: XCROM MF_CIS ; ; DONE ; RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN NEXT SYSTEM CONSOLE INPUT CHAR FUNCTION ; EXIT - A= CHAR (CTRL-Z: EOF) ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CI: XCROM MF_CI ; ; DONE ; RET ;**************************************************************************** ; ; SEND CHAR TO LIST DEVICE OUTPUT PROCEDURE ; ENTRY- C= CHAR ; ;**************************************************************************** ; LO: XCROM MF_LO ; ; DONE ; RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN LIST DEVICE OUTPUT STATUS FUNCTION ; EXIT - A= 0: BUSY, FFH: READY ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; LOS: XCROM MF_LOS ; ; DONE ; RET SUBTTL MESSAGES RSTMSG: DM CR,LF,'RST ERR ' LOGMSG: DB CR,LF,'65K BANKED ZMON V. ' PVERS VERSN DM CR,LF END