IMD DMK Tracks:77x10816 DSMD  Disk Descriptor30ÁÀ 00M4ååååååååååååååååDisk Descriptor2`ÀÀååååååååååååååå00M4ååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå åååååååååååååååååååååååååå0 %+ &, !'- "(. #)/ $*0åååååååååååååååååååååååååååååååååååååååååååååååå0 %+ &, !'- "(. #)/ $*0åååååååååååååååååååååååååååååååååååååååååååååååå0 %+ &, !'- "(. #)/ $*0ZBMC122SZ80bˆ‰Š‹ŒŽXROM Z80ZBMR122 Z80€ ZBMR122 Z80 -ZBMON 122ZBMK310 Z80+pqrZBMC123XZ80stZBMM122 Z80` ¡¢£¤¥ZBMK308 Z80*åHBIO308 HEXZBMK309 Z80€ !"#$%&ZBMK309 Z80.'()åååOM # TO EXECUTE ; LD HL,7 ;STACK OFFSET ADD HL,SP LD A,(HL) ;FETCH ROM # TO EXECUTE LD (HL),THIS_ROM ;SET RETURN ROM JR Z,XR_INIT ; ; ELSE TREAT AS FUNCTION ; INC SP ;SCRUB OLD AF INC SP ; DEC A ;BIAS DOWN CALL FUNCH ; ; FUNCZBMR124 Z80€ „…†‡CLOKROM DEFJZBMM122 Z80€ZBMM122 Z80€ZBMG101 DEFuƒZBMR124 Z80‘’åHBIO307 Z80j±²³´µ¶·ZBM-122 DOC€yz{|}~€åååå# POP HL ; ; EXECUTE THE ROM ; OUT (M2_RSEL),A ; ; THE PC SHOULD BE AT 0F833H AT THIS POINT ; ;++++++++++++++++++TION DONE, CLEAN UP ; XR_DONE: PUSH AF ;SAVE RETURN VALUES PUSH HL ; LD HL,6 ;SET RETURN CODE TO 0 (NO FUNCTION) ADZBMM122 Z80€ !"#œžŸZBMH122 HDR$ZBMD123 Z80€%&'()*2æZBMV122 Z80e+,-./01ZBM-122 DOC€‚¸¹º»¼½ZBM-122 DOC¾ZBMK307 Z80€¿ÀÁÂÃÄÅÆZBMK307 Z80€ÇÈÉÊËÌÍÎååå ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE ALTERNATE ROM FUNCTION FUNCTION ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; ROM EXECUTION RETURN POINT ; ENTRY- (SP)= AF ; (SP+2)= RETURD HL,SP LD (HL),0 ; POP HL ;RESTORE RETURN VALUES POP AF JR XROMF ; ; ; NO-FUNCTION RETURN ; XR_RET: POP AF ZBMF101 DEF)345ZBMD122 Z80€6789:;<=ZBMD122 Z80€>?@ABCDEDKBTROM DEFKLZBMK307 Z804ÏÐÑÒåHBIO308 Z80nÖרZBMG100 DEFÙÚZBMD122 Z80 àååå ; ENTRY- (SP+2)= FUNCTION # {0: NONE, ; 1: INITIALIZE ROM, ; 2..FF: FUNCTION -2} ; (SP+3)= ROM # TO EXECUTE N ADDRESS IN CALLER ; (SP+4)= FUNCTION # ; (SP+5)= RETURN ROM # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++ RET ; ; ; INIT EXECUTION ; XR_INIT: POP AF CALL ROM_INIT JR XR_DONE ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ZMONROM DEFMåZBMV122XZ80eSTUVWXYZBMV122XZ80eZ[\“”•–åCB2 DEF]ZBMC122 Z80gÛÜáâãäåZBMR123 Z80€ÝÞéêëìíîZBMD123 Z80€çèñòóôõöZBMR123 Z80ïðååå; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ IF ($ AND 7FFFH) > 7840H CONMSG **** ROM++++++++++++++++++++++ ; ; IF FUNCTION == 0 THEN RETURN ; PUSH HL ;SAVE DATA LD HL,6 ;OFFSET TO FUNCTION ADD HL,SP @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; MACROS ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ZBMK309 Z80€jkZBMK310 Z80€^_`abcdeZBMK310 Z80€fghilmnoZBMD122 Z80€FGHIvwxßZBMD123 Z80€÷øùúûüýþZBMD123 Z80ÿZBMK308 Z80€ZBMK308 Z80€     ååå XOVER OVERLAP **** ENDIF ORG 0F840H ; XROMF: ; ; SAVE POSSIBLE RETURN VALUES ; PUSH AF PUSH HL ; ; FETCH R LD A,(HL) POP HL ;RESTORE DATA ; OR A,A ;TEST JR Z,XR_RET ; ; ELSE IF FUNCTION == 1 THEN INITIALIZE ; DEC A @@@@ ; ; ACCESS RESIDENT ROM ; XRROM MACRO #FUN ; ; USE FUNCTION NO. #FUN ; PUSH HL LD HL,[MR_RNUM SHL 8] + #F0 %+ &, !'- "(. #)/ $*0UN + 2 EX (SP),HL CALL XROMF INC SP INC SP ENDM ; ; ACCESS DISK ROM ; XKROM MACRO #FUN ; ; USE FUNCTION (SP),HL CALL XROMF INC SP INC SP ENDM MEMORY BANKS FOR MOVE ; JP BMOVE ;BANKED MEMORY BLOCK MOVE ; JP REST ;(NOT IMPLIMENTED) ;EXECUTE BANK FUNCTION ; JP LO************************************** ; ; This Monitor program resides at the top 2k of memory & supports the ;system resou - 29 SEP 85 GRH ; Fix bug in Input command which caused monitor to crash. ; The jump to 'BITS2' expects DE to be on stack swapped prior to GOTO. ; Change restart error to vector to breakpoint after message. ; 1.11- 27 DEC 87 GRH ; Add bank memo NOT FALSE ; ; INCLUDE SYSTEM DEFINITION FILES ; ;*MACLIB ASMBTOOL.MLB ;*INCLUDE MONBOARD.DEF ;*INCLUDE BIGZ.DEF ;*US IN A ; JP LO ;SEND CHAR IN C TO SYSTEM LIST DEVICE ; JP CIS ;RETURN SYSTEM CONSOLE INPUT STATUS IN A ; JP GETMEM NO. #FUN ; PUSH HL LD HL,[DK_RNUM SHL 8] + #FUN + 2 - 64 EX (SP),HL CALL XROMF INC SP INC SP ENDM ; ; EG EQU BZ_XADR ;MEMORY BANK SELECT REGISTER PORT ADDRESS (BIG Z) SUBTTL JUMP TARGETS FOR MONITOR ENTRY ORG MONROM ;S ;RETURN SYSTEM LIST DEVICE OUTPUT STATUS IN A ; JP REST ;INTERNAL BREAKPOINT ENTRY ; JP GOTOS ;INTERNAL EXECUTE REGISrces and transfer to additional ROMs residing in the same memory ; area as this ROM. ; *INCLUDE ZBMH122.HDR ;***************. ; 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 ry management routines. ; 1.12 20 JUL 88 GRH ; Add Monitor function call restart. ; 1.20 29 DEC 88 GRH ; Add banked memoINCLUDE JDDCONT.DEF ;*INCLUDE ZBMFUNS.DEF ; LIST OFF *MACLIB ASMBTOOL.MLB *INCLUDE MONBOARD.DEF *INCLUDE BIGZ.DEF *INCL;RETURN BANKED MEMORY DATA ; JP PUTMEM ;STORE BANKED MEMORY DATA ; JP BNKSEL ;SELECT MEMORY BANK ; JP XMOVE ;SELECT ACCESS DEBUGGER ROM ; XDROM MACRO #FUN ; ; USE FUNCTION NO. #FUN ; PUSH HL LD HL,[DEB_RNUM SHL 8] + #FUN + 2 - 16  ; COLD START VECTOR ; JP INIT ;COLD START (RESET) ; JP CI ;RETURN NEXT SYSTEM CONSOLE CHAR IN A ; FUNENT: JP MONFUTERS PROCEDURE (GOTO) ; JP RSTER ;RESTART ERROR ENTRY ; JP PRTS ;DISPLAY BIT7 TERMINATED TEXT ON SYSTEM CONSOLE SU************************************************************* ; ; Revision status: ; ; 1.0 - Release ; 1.1 - ; Add Double ; Remove time delay from power up reset code to allow ISHA to access ; ram. ; Remove the auto-boot from reset function. ; 1ry support: ; 1. Page 0 initialization. ; 2. Init bank register to bank 0F8H. ; 1.21 27 JAN 89 GRH ; Add new monitor fUDE JDDCONT.DEF *INCLUDE ZBMFUNS.DEF LIST ON *INCLUDE ZBMG122.DEF ; THIS_ROM EQU MR_RNUM ; ; BANK SELECTION ; BNKRMEMORY BANKS FOR MOVE ; JP BMOVE ;BANKED MEMORY BLOCK MOVE ; JP REST ;(NOT IMPLIMENTED) ;EXECUTE BANK FUNCTION ; JP LO EX (SP),HL CALL XROMF INC SP INC SP ENDM ; ; ACCESS CHAR I/O ROM ; XCROM MACRO #FUN ; ; USE FUNCTION NO. #NC ;EXECUTE MONITOR FUNCTION IN A ; JP CO ;SEND CHAR IN C TO SYSTEM CONSOLE ; JP COS ;RETURN SYSTEM CONSOLE OUTPUT STATBTTL MONITOR BOARD SHADOW ROM SELECTION PROCEDURE *INCLUDE XROM.Z80 SUBTTL MEMORY MANAGEMENT ROUTINES ;*****************D deselect upon reset code. ; Change printer port. ; 1.2 - 20 FEB 83 GRH ; Add delay before turning off boot image, in case.8 - 29 MAY 86 GRH ; Add Cromemco PRI printer driver as primary printer. ; Change IOBYTE definitions. ; Remove initializatiunction routines. ; ; 1.22 11-22-90 GRH ; Move debugger code to separate ROM in order to gain space for I/O ; drivers andEG EQU BZ_XADR ;MEMORY BANK SELECT REGISTER PORT ADDRESS (BIG Z) SUBTTL JUMP TARGETS FOR MONITOR ENTRY ORG MONROM ;S ;RETURN SYSTEM LIST DEVICE OUTPUT STATUS IN A ; JP REST ;INTERNAL BREAKPOINT ENTRY ; JP GOTOS ;INTERNAL EXECUTE REGISFUN ; PUSH HL LD HL,[CHR_RNUM SHL 8] + #FUN + 2 - 32 EX (SP),HL CALL XROMF INC SP INC SP ENDM ; ; ACCESSUS IN A ; JP LO ;SEND CHAR IN C TO SYSTEM LIST DEVICE ; JP CIS ;RETURN SYSTEM CONSOLE INPUT STATUS IN A ; JP GETMEM  TITLE M5b Z-80 MONITOR RESIDENT ROM LIST NOCOND ;*************************************************************************** logic ; too slow. ; 1.3 - 17 MAR 84 GRH ; Change to allow Boot command parameter passing to boot ROM. ; ; 1.4 - 2 JUN on of Jade FDC port 40H in anticipation of ; Cromemco bank select useage. ; 1.9 - 16 AUG 86 GRH ; Fix bug in PRI driver w interrupt code for SIO ports. ; Add serial I/O driver. ; Add rom xover function as include file so all modules can utilize it ; COLD START VECTOR ; JP INIT ;COLD START (RESET) ; JP CI ;RETURN NEXT SYSTEM CONSOLE CHAR IN A ; FUNENT: JP MONFUTERS PROCEDURE (GOTO) ; JP RSTER ;RESTART ERROR ENTRY ; JP PRTS ;DISPLAY BIT7 TERMINATED TEXT ON SYSTEM CONSOLE SU MISC. I/O ROM ; XVROM MACRO #FUN ; ; USE FUNCTION NO. #FUN ; PUSH HL LD HL,[CLK_RNUM SHL 8] + #FUN + 2 - 80 EX ;RETURN BANKED MEMORY DATA ; JP PUTMEM ;STORE BANKED MEMORY DATA ; JP BNKSEL ;SELECT MEMORY BANK ; JP XMOVE ;SELECT * ; ; SYSTEM MONITOR FOR M5b ; (c) 1982,1983,1990 GRH Enterprises, Cupertino, CA ; ;**************************************84 GRH ; Fix bug in line printer status subroutine which hung the ; line printer by sensing the status incorrectly. ; 1.5hich 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 ; . ; VERSN EQU 122 ;**************************************************************************** FORM FALSE EQU 0 TRUE EQUNC ;EXECUTE MONITOR FUNCTION IN A ; JP CO ;SEND CHAR IN C TO SYSTEM CONSOLE ; JP COS ;RETURN SYSTEM CONSOLE OUTPUT STATBTTL MONITOR BOARD SHADOW ROM SELECTION PROCEDURE *INCLUDE XROM.Z80 SUBTTL MEMORY MANAGEMENT ROUTINES ;*****************0 %+ &, !'- "(. #)/ $*0*********************************************************** ; ; BANK SELECT PROCEDURE ; NOTE: THIS FUNCTION IS ONLY FOR CP/M VE: ; ; STORE BANK #S ; LD (DBANK),BC ; ; SET BANKS CHANGED FLAG ; LD A,-1 LD (BNKCHG),A ; ; DONE ; RET OVE2: ; ; SAVE CURRENT BANK # ; LD A,(THIS_BNK) LD (CBANK),A ; ; CLEAR INTER-BANK MOVE FLAG FOR NEXT TIME ; XOR  ; ; NO INTERRUPTS WHILE MOVING ; DI ; ; TOP OF MOVE LOOP ; BMOVE4: LD A,B ;SELECT SOURCE BANK OUT (BNKREG),A D A,E DI ;NO INTERRUPTS OUT (BNKREG),A ; ; FETCH DATA ; LD C,(HL) ; ; RESTORE BANK ; LD A,B OUT (BNKREG),A; ; DONE ; POP BC RET SUBTTL MONITOR FUNCTION CALL DISPATCHER ;++++++++++++++++++++++++++++++++++++++++++++++++++UNERR: LD A,-1 OR A,A RET ;############################################################################ ; ; MONITOR+++++ ; ; RETURN VERSION FUNCTION ; EXIT - HL= VERSION # (123D = 1.23) ; ;+++++++++++++++++++++++++++++++++++++++++++++++++3.0 COMPATABILITY. ALL OTHER ; ROUTINES SHOULD USE GETMEM, PUTMEM & XROM ROUTINES. ; ENTRY- A= BANK ADDRESS ; ;************* ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; MEMORY TO MEMORY MOVE FUNCTION ; NOTE: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 CPLD A,(HL) EX AF,AF' ; LD A,C ;SELECT DESTINATION BANK OUT (BNKREG),A EX AF,AF' LD (DE),A ; INC HL ;NEXT BYTE I ; ; RETURN DATA ; LD A,C ; ; DONE ; POP BC EI RET ;*****************************************************++++++++++++++++++++++++++ ; ; ENTRY- A= FUNCTION # ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ FUNCTION TABLE ; ;############################################################################ ; FUNTABL: DW RETVERS ;0:+++++++++++++++++++++++++++ ; RETVERS: LD HL,VERSN RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*************************************************************** ; FBSEL: LD A,C ; BNKSEL: ; ; SELECT NEW BANK ; OUT THIS FUNCTION IS NOT CP/M 3.0 COMPATABLE. HL & DE ARE REVERSED ; (Z-80 COMPATABLE) ; ENTRY- HL= SOURCE PTR ; DE= DESTINATI A,L POP HL ;PTR JP NZ,NTSAME ; ; SELECT BANK OF MOVE ; DI ;NO INTERRUPTS WHILE BANK SWAPPED ; OUT (BNKREG),A ;NC DE ; EXX ;CHECK FOR DONE DEC BC LD A,C OR A,B EXX JP NZ,BMOVE4 ; ; DONE ; JP BMOVE3 ;+++++++++++++*********************** ; ; STORE DATA INTO BANKED MEMORY PROCEDURE ; ENTRY- HL= OFFSET PTR ; E= BANK # ; C= DATA ; EXIT+++++++ ; FUNCH: ;ROM SWAP ENTRY MONFUNC: ;EXTERNAL ENTRY ; ; IF NOT LOCAL FUNCTIONS THEN EXIT ; CP A,MAXFUNS JR NC RETURN MONITOR ROM VERSION DW GETMEM ;1: RETURN BANKED MEMORY DATA DW PUTMEM ;2: STORE DATA INTO BANKED MEMORY DW MFUNE+++++++++++++++ ; ; NOT INTERNAL FUNCTION, CHECK FOR DEBUGGER ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ (BNKREG),A ; ; STORE IN BANK PAGE 0 ; LD (THIS_BNK),A ; ; DONE ; RET ;**************************************ON PTR ; BC= BYTE COUNT ; EXIT - HL & DE= NEXT BYTES TO MOVE PTRS ; A, BC= ? ; ;+++++++++++++++++++++++++++++++++++++++++A STILL HAS BANK (BOTH SAME, REMEMBER?) ; LDIR ; ; DONE, RESTORE BANK TO CURRENT BANK WHEN CALLED ; BMOVE3: LD A,(CB+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN BANKED MEMORY DATA FUNCTION ; ENTRY- HL= OFFSET PT - A= ? ; ;**************************************************************************** ; PUTMEM: ; ; SAVE REG ; PUSH,NOT_INT ; ; FUNCTION SEEMS LEGAL, FETCH EXECUTION ADDRESS FROM TABLE ; PUSH HL ;SAVE POSSIBLE ARGUMENT ; LD HL,FUNTARR ;3: SPARE DW XMOVE ;4: SET BLOCK MOVE BANKS DW BMOVE ;5: BANKED BLOCK MOVE DW MFUNERR ;6: SELECT NEW BUS PROCESSOR +++++++++++++++++ ; NOT_INT: ; ; BIAS DOWN DEBUGGER FUNCTIONS ; SUB A,16 ; ; IF FUN# < START THEN INTERNAL FUNCTION************************************** ; ; SET BANKS FOR A FOLLOWING MOVE CALL (CP/M 3.0 COMPATABLE) ; ENTRY- B= SOURCE BANK +++++++++++++++++++++++++++++++++++ ; BMOVE: ; ; IF BANK NOT SELECTED PRIOR TO CALL THEN USE FASTER INTRA-BANK MOVE ; LANK) ;RESELECT CURRENT BANK & RETURN OUT (BNKREG),A ; EI ;ALLOW INTERRUPTS NOW RET ; ; ; BANKS NOT THE SAME, DO DIR ; E= BANK # ; EXIT - A= DATA ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; GETMEM:  BC ; ; SAVE CURRENT BANK TO RETURN TO ; LD A,(THIS_BNK) LD B,A ; ; SELECT BANK ; LD A,E DI ;NO INTERRUPTS WBL ; 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 ARGUMEN DW MFUNERR ;7: RETURN CURRENTLY SELECTED BANK IN A DW GOTOS ;8: DEBUGGER EXECUTER DW FBSEL ;9: SELECT NEW BANK ; MAXF RESERVED ERR ; JR C,MFUNERR ; ; ELSE IF FUN# > LAST THEN GO CHECK NEXT GROUP ; CP A,16 JR NC,NOT_DEB ; ; ELSE E ; C= DESTINATION BANK ; EXIT - A= ? ; ;**************************************************************************** ; XMOD A,(BNKCHG) OR A,A JP NZ,BMOVE2 ; LDIR ; ; DONE WITH SIMPLE CASE ; RET ; ; ; ELSE USE INTER-BANK MOVE ; BMSCRETE MOVE ; NTSAME: ; ; SAVE COUNT ; PUSH BC ;SAVE COUNT EXX POP BC EXX ; ; FETCH BANKS ; LD BC,(DBANK) ; ; SAVE REGISTER ; PUSH BC ; ; SAVE CURRENT BANK FOR RETURN ; LD A,(THIS_BNK) LD B,A ; ; SELECT BANK ; LHILE BANK SWAPPED OUT (BNKREG),A ; ; STORE DATA ; LD (HL),C ; ; RESTORE BANK ; LD A,B OUT (BNKREG),A ; EI T & PUT EXECUTION ADDRESS ON STACK ; EX (SP),HL ; ; RETURN TO EXECUTION ADDRESS ; RET ; ; ; FUNCTION ERROR ; MFUNS EQU ($ - FUNTABL) / 2 SUBTTL MONITOR FUNCTIONS ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++XECUTE 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 0 %+ &, !'- "(. #)/ $*0 RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CHAR FUNCTIONS ; ;++++++++++++++ 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------------------------- ; ; THIS IS THE COLD START INIT CODE ; ;----------------------------------------------------------LL HAS DEFAULT BANK # ; ; INIT ALL BANKS ; LD E,A ;START WITH ALL Z80 BANKS LD HL,THIS_BNK ;POINT TO LOCATION TO STORE CALL XROMF POP HL ; ; OUTPUT SIGN-ON MESSAGE ; LD HL,LOGMSG ;OUTPUT SIGN-ON CALL PRTS ; ; EXECUTE THE DEBUGGER ; ; DO AT LAST MINUTE TO MINIMIZE REFRESH REGISTER CHANGE ; LD R,A ;SET R POP AF ;SET AF ; ; RESERVE SPACE FOR A  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 ;R----------------------------- ; RSTER: PUSH AF PUSH HL LD HL,RSTMSG CALL PRTS POP HL POP AF JP REST ;********++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; NOT_DEB: ; ; BIAS DOWN TO CHAR FUNS ; SUB A,16 ; ;  # LD L,A ;SET FUNCTION # EX (SP),HL CALL XROMF INC SP INC SP ; RET ;++++++++++++++++++++++++++++++++++++++++------------------ ; ROM_INIT: ;XROM ENTRY INIT: ;EXTERNAL ENTRY ; ; INSURE INTERRUPTS DISABLED ; DI ; ; REMOVE P BANK # BNKS_INIT: LD C,E ;STORE IT CALL PUTMEM ; INC E ;NEXT BANK ; LD A,0FFH ;IF NOT LAST BANK THEN REPEAT CP  ; MAINLP: LD SP,MONSTK LD HL,[DEB_RNUM SHL 8] + MF_XDEB - 16 + 2 ;3 PUSH HL CALL XROMF POP HL JR MAINLP SUBTTEI INSTRUCTION TO BE PATCHED IN ; DB 0 ;'NOP' OR PLACE FOR 'EI' ; ; RETURN TO EXECUTION ADDRESS ON STACK ; RET ;EFRESH REGISTER LD A,I LD H,A LD (RLOC),HL ; LD (ELOC),DE LD (CLOC),BC ; ; FETCH RETURN ADDRESS FROM PGM STACK ;******************************************************************** ; ; PRTS ROUTINE OUTPUTS AN ASCII STRING ONTO THE CONSOLEIF 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++++++++++++++++++++++++++++++++++++ ; ; MISCELLANEOUS DRIVER FUNCTIONS ; ENTRY- D= DRIVER FUNCTION # ; ;++++++++++++++++++AGE 0 IMAGE ; OUT (M2_CLDRES),A ; ; REMOVE JADE DOUBLE D WINDOW(S) ; LD A,DD_FREE ;REMOVE DD WINDOW, IF PRESENT OUT A,E JR NZ,BNKS_INIT ; ; INITIALIZE IOBYTE ; LD A,IOBYTV ;SET TO INITIAL IOBYTE VALUE LD (IOBYTE),A ; ; SET BANK SL DEBUGGER SUPPORT ROUTINES ;**************************************************************************** ; ; GOTO STUB ; ;**************************************************************************** ; ; REST ROUTINE TRAPS ALL OF THE REGISTER CONTEN POP BC ; ; SAVE SP AT BREAKPOINT ; LD (SLOC),SP ; ; BACK UP RETURN ADDRESS TO POINT TO RESTART INSTRUCTION ; DE. ; THE STRING MUST BE TERMINATED BY BIT 7 SET IN THE LAST CHAR OF THE STRING. ; ENTRY- HL= TEXT PTR ; ;*******************,A LD H,CHR_RNUM EX (SP),HL CALL XROMF INC SP INC SP RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; NOT_DSK: ; ; BIAS DOWN TO MISC. FUNCTIONS ; SUB A,16 ; ;(DD_PRT3),A OUT (DD_PRT5),A OUT (DD_PRT8),A ; ; SET MEMORY BANK ; LD A,DEFBNK OUT (BNKREG),A ; ; INITIALIZE RESTACK ; LD (THIS_STK),SP ; ; SET FUNCTION CALL RESTART ; LD HL,FUNENT LD (MFUNRSV),HL ; ; INIT ROMS (I/O) ; LD **************************************************************************** ; GOTOS: ; ; SCRUB FUNCTION DATA ON STACK ; TS WHENEVER A BREAKPOINT ; RESTART INSTRUCTION IS EXECUTED. THE TRAPPED CONTENTS ARE STORED IN THE ; MONITOR VARIABLE AREA FORC BC ; ; SET UP LOCAL STACK ; LD SP,MONSTK ;SET THE MONITOR STACK ; ; RETURN TO DEBUGGER ; LD HL,[DEB_RNUM SHL 8] ********************************************************* ; PRTS: ; ; DISPLAY CHAR ; LD C,(HL) ;FETCH CHAR RES 7,C +++++++++++++++++++++++ ; ; DISK DRIVER FUNCTIONS ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ SET ROM # ; ADD A,2 ;ADD OFFSET ; PUSH HL ;SAVE ARG LD H,CLK_RNUM ;SET ROM # LD L,A ;SET FUNCTION # EX (SP),HLTART VECTORS IN PAGE 0 ; LD SP,003FH ;USE STACK TO INIT RESTARTS LD HL,0C300H LD DE,RSTER LD B,16 ;64 BYTES ; INIT1: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 ;RET ADDR TO XROMF POP HL ;CALLER RETURN ADDR POP HL ;XROM ARGUMENT ; ; SET REGISTERS ; LD HL,(RLOC) ;L=  LATER ACCESS AND USE BY THE GOTO & THE EXAMINE ; REGISTERS COMMANDS. ; ; INSERT INTERRUPT DISABLER SOFTWARE AT START OF REST+ 4 PUSH HL CALL XROMF POP HL JP MAINLP SUBTTL SUBROUTINES & FUNCTIONS ;-------------------------------------------;MAKE 7-BIT PUSH HL ;SAVE PTR CALL CO ;DISPLAY CHAR POP HL ;RESTORE PTR ; ; IF CHAR < 128 THEN REPEAT ; BIT 7,(HL+++++ ; NOT_CHR: ; ; BIAS DOWN TO DISK FUNCTIONS ; SUB A,32 ; ; IF NOT DISK FUNCTIONS THEN GO CHECK NEXT GROUP ;  CALL XROMF INC SP INC SP ; RET SUBTTL INITIALIZATION CODE ;--------------------------------------------------- PUSH DE PUSH HL DJNZ INIT1 ; ; SET STACK ; LD SP,MONSTK ; ; SET MEMORY BANK CONSTANT ; LD (THIS_BNK),A ;A STI 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 HLR, 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 . ; ;**************************************************************************** ; REST: ; ; SAVE 8080 REGS FIRST SO WE--------------------------------- ; ; UNINITIALIZED RESTART ERROR HANDLER ; ;-----------------------------------------------) INC HL ;NEXT CHAR JR Z,PRTS ; ; ELSE DONE ; RET SUBTTL EXTERNAL NON-FUNCTION CONSOLE I/O ;+++++++++++++++++0 %+ &, !'- "(. #)/ $*0+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN SYSTEM CONSOLE OUTPUT STATUS FUNCTION ; EXIT - A= 0: B+++++++++++++++++++++++++++++++++++++++ ; CIS: XCROM MF_CIS ; ; DONE ; RET ;++++++++++++++++++++++++++++++++++++T STATUS FUNCTION ; EXIT - A= 0: BUSY, FFH: READY ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++************************************** ; ; This Monitor program resides at the top 2k of memory & supports the ;system resou.5 - 29 SEP 85 GRH ; Fix bug in Input command which caused monitor to crash. ; The jump to 'BITS2' expects DE to be on sta; swapped prior to GOTO. ; Change restart error to vector to breakpoint after message. ; 1.11- 27 DEC 87 GRH ; Add bank menge bank port definition for SSM CB2 cpu. ; Add THIS_STK init for rom bank. ; VERSN EQU 124 ; ;****************************DEF ;GLOBAL DEFS LIST ON ; THIS_ROM EQU MR_RNUM ; ; BANK SELECTION ; BNKREG EQU BNKPORT ;MEMORY BANK SELECT REGUSY, FFH: READY ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; COS: XCROM MF_COS ; ; ++++++++++++++++++++++++++++++++++++++++ ; ; RETURN NEXT SYSTEM CONSOLE INPUT CHAR FUNCTION ; EXIT - A= CHAR (CTRL-Z: EOF) ;++++ ; LOS: XCROM MF_LOS ; ; DONE ; RET SUBTTL MESSAGES RSTMSG: DM CR,LF,'RST ERR ' LOGMSG: DB CR,LF,'65K BANrces and transfer to additional ROMs residing in the same memory ; area as this ROM. ; *INCLUDE B:ZBMH122.HDR ;*************ck. ; 1.6 - 6 DEC 85 GRH ; Add code to disable all Jade controllers from 40H to 43H after ; reset. ; 1.7 - 8 FEB 86 GRHmory management routines. ; 1.12 20 JUL 88 GRH ; Add Monitor function call restart. ; 1.20 29 DEC 88 GRH ; Add banked me************************************************ FORM FALSE EQU 0 TRUE EQU NOT FALSE ; ; INCLUDE SYSTEM DEFINITION FISTER PORT ADDRESS SUBTTL JUMP TARGETS FOR MONITOR ENTRY ORG MONROM ; ; COLD START VECTOR ; JP INIT ;COLD START  DONE ; RET ;**************************************************************************** ; ; SEND CHAR TO SYSTEM CON ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CI: XCROM MF_CI ; ; DONE ; RET KED ZMON V. ' PVERS VERSN DM CR,LF END *************************************************************** ; ; Revision status: ; ; 1.0 - Release ; 1.1 - ; Add Doubl ; Remove time delay from power up reset code to allow ISHA to access ; ram. ; Remove the auto-boot from reset function. ;mory support: ; 1. Page 0 initialization. ; 2. Init bank register to bank 0F8H. ; 1.21 27 JAN 89 GRH ; Add new monitorILES ; ; NOTE: INCLUDE ONE OF THE FOLLOWING CPU FILES: ; ; BIGZ.DEF : JADE 'BIG Z' Z80 ; > CB2.DEF : SOLID STATE (RESET) ; JP CI ;RETURN NEXT SYSTEM CONSOLE CHAR IN A ; FUNENT: JP MONFUNC ;EXECUTE MONITOR FUNCTION IN A ; JP CO ;SESOLE OUTPUT PROCEDURE ; ENTRY- C= CHAR ; ;**************************************************************************** ; CO ;**************************************************************************** ; ; SEND CHAR TO LIST DEVICE OUTPUT PROCEDURE  WITHOUT INTERRUPT OUT (C),A LD A,DD_MB1 ;OPEN WINDOW TO SECTOR BUFFER (BANK 1) OUT (C),A ; ; FETCH FDC ADDRESS ; Pe D deselect upon reset code. ; Change printer port. ; 1.2 - 20 FEB 83 GRH ; Add delay before turning off boot image, in ca 1.8 - 29 MAY 86 GRH ; Add Cromemco PRI printer driver as primary printer. ; Change IOBYTE definitions. ; Remove initializa function routines. ; ; 1.22 11-22-90 GRH ; Move debugger code to separate ROM in order to gain space for I/O ; drivers aMUSIC 'CB2' Z80 ; ;*MACLIB ASMBTOOL.MLB ;*INCLUDE MONBOARD.DEF ;*INCLUDE JDDCONT.DEF ;*INCLUDE B:ZBMF101.DEF ;*INCLND CHAR IN C TO SYSTEM CONSOLE ; JP COS ;RETURN SYSTEM CONSOLE OUTPUT STATUS IN A ; JP LO ;SEND CHAR IN C TO SYSTEM LIST: XCROM MF_CO ; ; DONE ; RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; R; ENTRY- C= CHAR ; ;**************************************************************************** ; LO: XCROM MF_LO ; ;  TITLE M5b Z-80 MONITOR RESIDENT ROM LIST NOCOND ;***************************************************************************se logic ; too slow. ; 1.3 - 17 MAR 84 GRH ; Change to allow Boot command parameter passing to boot ROM. ; ; 1.4 - 2 JUtion of Jade FDC port 40H in anticipation of ; Cromemco bank select useage. ; 1.9 - 16 AUG 86 GRH ; Fix bug in PRI drivernd interrupt code for SIO ports. ; Add serial I/O driver. ; Add rom xover function as include file so all modules can utilize UDE B:ZBMG101.DEF ; LIST OFF *MACLIB ASMBTOOL.MLB ;VERSION # EXTRACTION *INCLUDE MONBOARD.DEF ;MONITOR II BOARD *IN DEVICE ; JP CIS ;RETURN SYSTEM CONSOLE INPUT STATUS IN A ; JP GETMEM ;RETURN BANKED MEMORY DATA ; JP PUTMEM ;STORE ETURN SYSTEM CONSOLE INPUT STATUS FUNCTION ; EXIT - A= 0: NOT READY, FFH: CHAR READY ; ;+++++++++++++++++++++++++++++++++++++ DONE ; RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN LIST DEVICE OUTPU* ; ; SYSTEM MONITOR FOR M5b ; (c) 1982,1983,1990 GRH Enterprises, Cupertino, CA ; ;**************************************N 84 GRH ; Fix bug in line printer status subroutine which hung the ; line printer by sensing the status incorrectly. ; 1 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 it. ; ; 1.23 2-21-91 GRH ; Add function #7, return current bank #. Remove reading THIS_BNK. ; ; 1.24 8-13-91 GRH ; ChaCLUDE CB2.DEF ;CPU *INCLUDE JDDCONT.DEF ;JADE CONTROLLER *INCLUDE B:ZBMF101.DEF ;MONITOR FUNCTIONS *INCLUDE B:ZBMG101.BANKED MEMORY DATA ; JP BNKSEL ;SELECT MEMORY BANK ; JP XMOVE ;SELECT MEMORY BANKS FOR MOVE ; JP BMOVE ;BANKED MEMOR0 %+ &, !'- "(. #)/ $*0 SUBTTL EXTERNAL DEFINITIONS FOR CLOCK ROM ;**************************************************************************** ; ; ENTRY POINTS ; ;============================================================================ STRUCT 0F800H ;START OF ROM 1 ;READ CLOCK DATA INTO BUFFER ; ENTRY- DE= PTR TO 13 BYTE BUFFER TO PUT DATA ; CLK_F2 EQU 2 ;SET CLOCK FROM DATA BUFFER************************* ; ; This Monitor program resides at the top 2k of memory & supports the ;system resources and tranput command which caused monitor to crash. ; The jump to 'BITS2' expects DE to be on stack. ; 1.6 - 6 DEC 85 GRH ; Add co Change restart error to vector to breakpoint after message. ; ; 1.11- 27 DEC 87 GRH ; Add bank memory management routines. ; ; INCLUDE SYSTEM DEFINITION FILES ; ;*MACLIB ASMBTOOL.MLB ;*INCLUDE ZMONROM.DEF ;*INCLUDE DKBTROM.DEF ;*INCLUDE CLOK;BREAKPOINT RESTART # BP_RSTV EQU BP_RST ;BREAKPOINT RESTART VECTOR LOCATION BP_RSTI EQU 0C7H + BP_RSTV ;BREAKPOINT INSTRUCTI THIS INCLUDE FILE DEFINES THE EXTERNAL I/O FOR THE CLOCK/CALENDAR ; ROM. ; ;***********************************************CLK_RDB DS 3 ;READ CLOCK DATA INTO BUFFER FUNCTION ; ENTRY- BC= PTR TO 13 BYTE BUFFER TO PLACE DATA ; CLK_WRB DS 3 ;SET  ; ENTRY- DE= PTR TO 13 BYTE BUFFER TO SET CLOCK FROM ; CLK_F3 EQU 3 ;RETURN CLOCK CALENDAR DATA CLK_F4 EQU 4 ;RETURN Csfer to additional ROMs residing in the same memory ; area as this ROM. ; ;**************************************************de to disable all Jade controllers from 40H to 43H after ; reset. ; 1.7 - 8 FEB 86 GRH ; Remove time delay from power up r ; ; 1.12 20 JUL 88 GRH ; Add Monitor function call restart. ; ; 1.20 29 DEC 88 GRH ; Add banked memory support: ; ROM.DEF ;*INCLUDE NAKEDT.DEF ;*INCLUDE MONBOARD.DEF ;*INCLUDE BIGZ.DEF ;*INCLUDE JDDCONT.DEF ;*INCLUDE PRI.DEF ; LIST OFON ; ; MONITOR FUNCTION CALL ; MFUNRST EQU 20H ;FUNCTION RESTART VECTOR # MFUNRSV EQU MFUNRST ;FUNCTION RESTART VECTO***************************** ; ; REVISION HISTORY: ; ; 1.0 6 JUL 88 GRH ; First cut. ; ; 1.1 26 SEP 88 GRH ; Change pCLOCK DATA FROM BUFFER FUNCTION ; ENTRY- BC= PTR TO 13 BYTE BUFFER CONTAINING DATA ; CLK_CAL DS 3 ;RETURN CLOCK CALENDARLOCK TIME DATA CLK_F5 EQU 5 ;RETURN CLOCK DATA FROM REGISTER ; ENTRY- E= REGISTER # ; CLK_F6 EQU 6 ;RETURN WHEN CLOCK C************************** ; ; Revision status: ; ; 1.0 - Release ; 1.1 - ; Add Double D deselect upon reset code. ; Chaneset code to allow ISHA to access ; ram. ; Remove the auto-boot from reset function. ; ; 1.8 - 29 MAY 86 GRH ; Add Crom1. Page 0 initialization. ; 2. Init bank register to bank 0F8H. ; ; 1.21 27 JAN 89 GRH ; Add new monitor function routinF *MACLIB ASMBTOOL.MLB *INCLUDE ZMONROM.DEF *INCLUDE DKBTROM.DEF *INCLUDE CLOKROM.DEF *INCLUDE NAKEDT.DEF *INCLUDE MONBOAR LOCATION MFUNRSI EQU 0C7H + MFUNRST ;FUNCTION RESTART INSTRUCTION ; ; BANK SELECTION ; BNKREG EQU BZ_XADR ;MEMORYrefixes to 'CLK_' ; ;**************************************************************************** ;====================== DATA FUNCTION ; EXIT - A= DAY L= DAY OF WEEK (0= SUNDAY) ; B= MONTH DE= ? ; C= YEAR ; CLK_TIM DS 3 ;RETURHANGES STATE CLK_F7 EQU 7 ;TEST FOR BOARD PRESENT ; EXIT - A= 0: NOT PRESENT ; CLK_F8 EQU 8 ;STOP CLOCK CLK_F9 EQU ge printer port. ; 1.2 - 20 FEB 83 GRH ; Add delay before turning off boot image, in case logic ; too slow. ; 1.3 - 17 Memco PRI printer driver as primary printer. ; Change IOBYTE definitions. ; Remove initialization of Jade FDC port 40H in antices. ; ; 1.22 11-22-90 GRH ; Move debugger code to separate ROM in order to gain space for I/O ; drivers and interrupt codRD.DEF *INCLUDE BIGZ.DEF *INCLUDE JDDCONT.DEF *INCLUDE PRI.DEF LIST ON ;================================================ BANK SELECT REGISTER PORT ADDRESS (BIG Z) DEFBNK EQU 0 ;DEFAULT Z-80 EXECUTION BANK ; ; MONITOR ADDRESSES ; MONROM EQ====================================================== ; ; ROM # ; ;======================================================N CLOCK TIME DATA FUNCTION ; EXIT - A= SECONDS C= HOURS ; B= MINUTES DE= ? ; ; PERFORM CLOCK ROM FUNCTION ; C TITLE M5b Z-80 MONITOR LIST NOCOND ;**************************************************************************** ; ; SYSTEAR 84 GRH ; Change to allow Boot command parameter passing to boot ROM. ; ; 1.4 - 2 JUN 84 GRH ; Fix bug in line printeripation of ; Cromemco bank select useage. ; ; 1.9 - 16 AUG 86 GRH ; Fix bug in PRI driver which caused new Oki 93 to be e for SIO ports. ; Add serial I/O driver. ; Add rom xover function as include file so all modules can utilize it. ; VERSN EQ============================ ; ; ASSEMBLE TIME VARIABLES ; ;==============================================================U 0F800H ;ROM START ADDR DK_ROM EQU DK_RNUM ;ROM # OF DISK ROM XDBROM EQU DK_RNUM ;DEFAULT BOOT ROM # ; ; PAGE 0 LOCA====================== CLK_ROM EQU 7 ;============================================================================ ; ; LK_FUN DS 3 ; ; ENTRY- C= FUNCTION # CLK_F0 EQU 0 ;RETURN ROM VERSION # ; EXIT - HL= BINARY VERSION # ; CLK_F1 EQU M MONITOR FOR M5b ; (c) 1982,1983,1990 GRH Enterprises, Cupertino, CA ; ;*************************************************** status subroutine which hung the ; line printer by sensing the status incorrectly. ; 1.5 - 29 SEP 85 GRH ; Fix bug in Inbusy. ; ; 1.10- 8 FEB 87 GRH ; Fix bug in register restore routine which caused IX & IY to be ; swapped prior to GOTO. ;U 121 ;**************************************************************************** FORM FALSE EQU 0 TRUE EQU NOT FALSE ============== ; ; ASSEMBLY-TIME CONSTANTS ; ; ; BREAKPOINTS ; NBKPTS EQU 2 ;NUMBER OF BREAKPOINTS BP_RST EQU 8 TIONS ; WSVEC EQU 0 ;VECTOR NUMBER FOR WARM RESTART ; IOBYTE EQU 3 ;ADDR OF I/O CONTROL BYTE IOBYTV EQU 00H ;DEFAULT IOB0 %+ &, !'- "(. #)/ $*0YTE VALUE ; ; MEMORY BANK DATA IN PAGE 0 ; THIS_BNK EQU 001BH ;BANK # FOR THIS BANK (CONSTANT) THIS_STK EQU 001CH ;STOC DS 1 ;I YLOC DS 2 ;IY XLOC DS 2 ;IX FPLOC DS 1 ;F' APLOC DS 1 ;A' CPLOC DS 1 ;C' BPLOC DS 1 ;B' EPLOC DS 1 ;E' DPLOC S DS BP_REC ENDM ; ; BANK #S ASSOCIATED WITH ARGUMENTS ; ARGPTR DS 2 ;PTR TO CURRENT ARGUMENT'S BANK A1_BNK DS 1 ;ABANK ;EXECUTE BANK FUNCTION ; ; MORE CHARACTER I/O ; JP LSTAT ;LINE PRINTER STATUS RETURN ; ; MONITOR PROCEDURE VECRE IN BANK PAGE 0 ; LD (THIS_BNK),A ; ; DONE ; RET ;*************************************************************NT ; EXIT - HL & DE= NEXT BYTES TO MOVE PTRS ; A, BC= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++SAME, REMEMBER?) ; LDIR ; ; DONE, RESTORE BANK TO CURRENT BANK WHEN CALLED ; BMOVE3: LD A,(CBANK) ;RESELECT CURRENT ++++++++++++++++++++++++++++++++++++++++ ; ; RETURN BANKED MEMORY DATA FUNCTION ; ENTRY- HL= OFFSET PTR ; E= BANK # ; EXITACK PTR WHILE THIS BANK IS SELECTED PREV_BNK EQU 001EH ;LINK BACK TO PREVIOUS BANK ;=====================================DS 1 ;D' LPLOC DS 1 ;L' HPLOC DS 1 ;H' ELOC DS 1 ;E DLOC DS 1 ;D CLOC DS 1 ;C BLOC DS 1 ;B FLOC DS 1 ;F ALOC DS 1 ;A SLRG #1 BANK A2_BNK DS 1 A3_BNK DS 1 SUBTTL JUMP TARGETS FOR MONITOR ENTRY ORG MONROM ; ; COLD START VECTOR ; JP TORS ; JP REST ;BREAKPOINT ENTRY DS 3 ;EXIT ;EXECUTE REGISTERS PROCEDURE (GOTO) ; DS 3 ;RESTART ERROR ENTRY SUBTT*************** ; ; SET BANKS FOR A FOLLOWING MOVE CALL (CP/M 3.0 COMPATABLE) ; ENTRY- B= SOURCE BANK ; C= DESTINATION BANK++++++++++++ ; BMOVE: ; ; IF BANK NOT SELECTED PRIOR TO CALL THEN USE FASTER INTRA-BANK MOVE ; LD A,(BNKCHG) OR A,A BANK & RETURN OUT (BNKREG),A ; EI ;ALLOW INTERRUPTS NOW RET ; ; ; BANKS NOT THE SAME, DO DISCRETE MOVE ; NTSAME: - A= DATA ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; GETMEM: ; ; SAVE REGISTER ======================================= ; ; CONSTANTS ; ;===============================================================OC DS 2 ;SP ; LLOC DS 1 ;L HLOC DS 1 ;H PLOC DS 2 ;PC BNKLOC DS 1 ;PC BANK # ; ; BANKED MEMORY MANAGEMENT ; CBANK DINIT ;COLD START ; ; CHARACTER I/O (6) ; JP CI ;CONSOLE INPUT ; JP MONFUNC ;EXECUTE FUNCTION ; CONOUT JP CO ;CONL MONITOR BOARD SHADOW ROM SELECTION PROCEDURE *INCLUDE XROM.Z80 SUBTTL MEMORY MANAGEMENT ROUTINES ;******************** ; EXIT - A= ? ; ;**************************************************************************** ; XMOVE: ; ; STORE BANK  JP NZ,BMOVE2 ; LDIR ; ; DONE WITH SIMPLE CASE ; RET ; ; ; ELSE USE INTER-BANK MOVE ; BMOVE2: ; ; SAVE CURR ; ; SAVE COUNT ; PUSH BC ;SAVE COUNT EXX POP BC EXX ; ; FETCH BANKS ; LD BC,(DBANK) ; ; NO INTERRUPTS ; PUSH BC ; ; SAVE CURRENT BANK FOR RETURN ; LD A,(THIS_BNK) LD B,A ; ; SELECT BANK ; LD A,E DI ;NO INTERR============= CTRLS EQU 13H ;ASCII DC3 CR EQU 0DH LF EQU 0AH BELL EQU 7 ;=============================================S 1 ;CURRENT EXECUTION BANK DBANK DS 1 ;DESTINATION BANK # FOR MOVE SBANK DS 1 ;SOURCE BANK # FOR MOVE BNKCHG DS 1 ;BANK CHANSOLE OUTPUT ; RET ;WAS PUNCH DS 2 ; JP LO ;LIST OUTPUT ; CONST JP CSTS ;CONSOLE STATUS ; ; MEMORY MANAGEMENT (******************************************************** ; ; BANK SELECT PROCEDURE ; NOTE: THIS FUNCTION IS ONLY FOR CP/M 3.0#S ; LD (DBANK),BC ; ; SET BANKS CHANGED FLAG ; LD A,-1 LD (BNKCHG),A ; ; DONE ; RET ;++++++++++++++++++ENT BANK # ; LD A,(THIS_BNK) LD (CBANK),A ; ; CLEAR INTER-BANK MOVE FLAG FOR NEXT TIME ; XOR A,A LD (BNKCHG),A ; WHILE MOVING ; DI ; ; TOP OF MOVE LOOP ; BMOVE4: LD A,B ;SELECT SOURCE BANK OUT (BNKREG),A LD A,(HL) EX AF,AF' UPTS OUT (BNKREG),A ; ; FETCH DATA ; LD C,(HL) ; ; RESTORE BANK ; LD A,B OUT (BNKREG),A ; ; RETURN DATA ;=============================== ; ; VARIABLES ; ;=======================================================================GED FLAG (0: NOT, /0: CHANGED) ; ; BREAKPOINTS ; STRUCT 0 BPADDR DS 2 ;ADDRESS OF BREAKPOINT BPABNK DS 1 ;BANK # OF B5) ; JP GETMEM ;RETURN MEMORY DATA (WAS IOCHK) JP PUTMEM ;STORE MEMORY DATA (WAS IOSET) JP BNKSEL ;SELECT MEMORY BANK  COMPATABILITY. ALL OTHER ; ROUTINES SHOULD USE GETMEM, PUTMEM & XROM ROUTINES. ; ENTRY- A= BANK ADDRESS ; ;****************++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; MEMORY TO MEMORY MOVE FUNCTION ; NOTE: THIS FUNCTION IS NOT C ; 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 J; LD A,C ;SELECT DESTINATION BANK OUT (BNKREG),A EX AF,AF' LD (DE),A ; INC HL ;NEXT BYTE INC DE ; EXX ;CHECK LD A,C ; ; DONE ; POP BC EI RET ;****************************************************************************===== ; ; SAVE 128 BYTES FOR MONITOR ; ORG MONROM - 128 MONSTK EQU $ ; ; REGISTER IMAGE STORAGE ; RLOC DS 1 ;R ILREAKPOINT BPDATA DS 1 ;DATA DISPLACED BY RESTART INSTRUCTION BP_REC DS 0 ;NUMBER OF BYTES IN RECORD ENDM TLOC: REPT NBKPTFOR EXECUTION (WAS MEMCK) JP XMOVE ;SELECT MEMORY BANKS FOR MOVE (WAS RTS) JP BMOVE ;MEMORY BLOCK MOVE (WAS RTS) DS 3 ;X************************************************************ ; BNKSEL: ; ; SELECT NEW BANK ; OUT (BNKREG),A ; ; STOP/M 3.0 COMPATABLE. HL & DE ARE REVERSED ; (Z-80 COMPATABLE) ; ENTRY- HL= SOURCE PTR ; DE= DESTINATION PTR ; BC= BYTE COUP NZ,NTSAME ; ; SELECT BANK OF MOVE ; DI ;NO INTERRUPTS WHILE BANK SWAPPED ; OUT (BNKREG),A ;A STILL HAS BANK (BOTH  FOR DONE DEC BC LD A,C OR A,B EXX JP NZ,BMOVE4 ; ; DONE ; JP BMOVE3 ;++++++++++++++++++++++++++++++++++++ ; ; STORE DATA INTO BANKED MEMORY PROCEDURE ; ENTRY- HL= OFFSET PTR ; E= BANK # ; C= DATA ; EXIT - A= ? ; ;**********0 %+ &, !'- "(. #)/ $*0****************************************************************** ; PUTMEM: ; ; SAVE REG ; PUSH BC ; ; SAVE CURRENUNCTION SEEMS LEGAL, FETCH EXECUTION ADDRESS FROM TABLE ; PUSH HL ;SAVE POSSIBLE ARGUMENT ; LD HL,FUNTABL ADD A,A ADDOVE ;4: SET BLOCK MOVE BANKS DW BMOVE ;5: BANKED BLOCK MOVE DW MFUNERR ;6: EXECUTE BANK ; DW MFUNERR ;7: EXECUTE CHARN # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; V_FUNS: ; ; SET ROM # ; PUSH HL+++++++++++++ ; ; MISCELLANEOUS DRIVER FUNCTIONS ; ENTRY- IX= IOPB PTR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++ ; ; REMOVE JADE DOUBLE D WINDOW(S) ; LD A,DD_FREE ;REMOVE DD WINDOW, IF PRESENT OUT (DD_PRT3),A OUT (DD_PRT5),A OUT 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_INITCALL PRTWD ; ; FALL INTO WARM START LOOP ; ;--------------------------------------------------------------------------T BANK TO RETURN TO ; LD A,(THIS_BNK) LD B,A ; ; SELECT BANK ; LD A,E DI ;NO INTERRUPTS WHILE BANK SWAPPED OUT 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 ADD DEVICE DRIVER FUNCTIONS DW D_FUNS ;8: EXECUTE DISK DEVICE DRIVER FUNCTIONS DW V_FUNS ;9: EXECUTE MISC DEVICE DRIVER FUNCT ;SAVE ARG LD H,CLK_ROM ;SET ROM # LD L,D ;SET FUNCTION # EX (SP),HL ; ; GO EXECUTE THE ROM ENTRY ; CALL XROMF +++++++++++++++++++++++++++ ; D_EXIOPB: ; ; SET ROM # ; PUSH HL ;SAVE ARG LD H,DK_ROM ;SET ROM # LD D,4 ;SET IOPB (DD_PRT8),A ; ; SET MEMORY BANK ; LD A,DEFBNK OUT (BNKREG),A ; ; INIT DEBUGGER ; LD HL,A1_BNK LD (ARGPTR),H ; ; INITIALIZE IOBYTE ; LD A,IOBYTV ;SET TO INITIAL IOBYTE VALUE LD (IOBYTE),A ; ; FILL BREAKPOINT ADDRESSES WITH -- ; ; THE WARM START CODE ; ;---------------------------------------------------------------------------- WINIT: ; ; F (BNKREG),A ; ; STORE DATA ; LD (HL),C ; ; RESTORE BANK ; LD A,B OUT (BNKREG),A ; EI ; ; DONE ; POP BCRESS ON STACK EX (SP),HL ; ; RETURN TO EXECUTION ADDRESS ; RET ; ; ; FUNCTION ERROR ; MFUNERR: LD A,-1 OR A,IONS ; DW D_EXIOPB ;10: EXECUTE IOPB ; MAXFUNS EQU ($ - FUNTABL) / 2 SUBTTL MONITOR FUNCTIONS ;+++++++++++++++++++++++INC SP INC SP RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; DISK DRIVER FUNC EXECUTE FUNCTION 1ST LD L,D ;SET FUNCTION # EX (SP),HL ; ; GO EXECUTE THE ROM ENTRY ; CALL SWPROM INC SP INC SPL LD (HL),A ;A STILL HAS DEFAULT BANK # INC HL LD (HL),A INC HL LD (HL),A ; ; INITIALIZE RESTART VECTORS IN PAGE 0 (LAST BYTE OF EXIT ROUTINE ; LD BC,[NBKPTS * BP_REC] - 1 LD HL,TLOC LD (HL),0 PUSH HL POP DE INC DE LDIR ; ; IRST RESTORE THE LOCAL STACK TO THE GLOBAL RAM ; LD SP,MONSTK ; ; RESTORE BANK TO DEFAULT BANK ; LD A,DEFBNK CALL BN RET SUBTTL MONITOR FUNCTION CALL DISPATCHER ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++A RET ;############################################################################ ; ; MONITOR FUNCTION TABLE ; ;###+++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN VERSION FUNCTION ; EXIT - HL= VERSION # (123D = 1.23) ; ;+TIONS ; ENTRY- D= DRIVER FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; D_FUN RET SUBTTL INITIALIZATION CODE ;---------------------------------------------------------------------------- ; ; THI0 ; LD SP,003FH ;USE STACK TO INIT RESTARTS LD HL,0C300H LD DE,RSTER LD B,16 ;64 BYTES ; INIT1: PUSH DE PUSH HL  SET BANK STACK ; LD (THIS_STK),SP ; ; INITIALIZE REGISTER IMAGES TO 0 ; LD HL,RLOC LD B,BNKLOC - RLOC + 1 ; INITKSEL ; ; PUT THE RETURN ON THE STACK FOR COMMANDS WHICH ARE SUBROUTINES ; LD HL,WINIT PUSH HL ; ; RESTORE THE WARM +++ ; ; ENTRY- A= FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; FUNCH: ;RO######################################################################### ; FUNTABL: DW RETVERS ;0: RETURN MONITOR ROM VERS+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; RETVERS: LD HL,VERSN RET ;+++++++++++++S: ; ; SET ROM # ; PUSH HL ;SAVE ARG LD H,XDBROM AND 7 ;SET ROM # LD L,D ;SET FUNCTION # EX (SP),HL ; ; GO EXS IS THE COLD START INIT CODE ; ;---------------------------------------------------------------------------- ; ROM_INIT: ;XDJNZ INIT1 ; ; SET STACK ; LD SP,MONSTK ; ; SET MEMORY BANK CONSTANT ; LD (THIS_BNK),A ;A STILL HAS DEFAULT BANK #2: LD (HL),C ;C HAS 0 FROM LAST LDIR FINISH INC HL DJNZ INIT2 ; ; NOW CHANGE SP & PC TO 0100H ; LD HL,0100H LD (PLSTART RESTART VECTOR IN PAGE 0 ; LD (WSVEC + 1),HL LD A,0C3H LD (WSVEC),A ; ; INIT FUNCTION CALL VECTOR ; LD HL,MOM SWAP ENTRY MONFUNC: ;EXTERNAL ENTRY ; ; IF ILLEGAL FUNCTION THEN RETURN ERROR ; CP A,MAXFUNS JR NC,MFUNERR ; ; FION ; DW GETMEM ;1: RETURN BANKED MEMORY DATA DW PUTMEM ;2: STORE DATA INTO BANKED MEMORY DW MFUNERR ;3: SPARE DW XM+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; MISCELLANEOUS DRIVER FUNCTIONS ; ENTRY- D= DRIVER FUNCTIOECUTE THE ROM ENTRY ; CALL XROM INC SP INC SP RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ROM ENTRY INIT: ;EXTERNAL ENTRY ; ; INSURE INTERRUPTS DISABLED ; DI ; ; REMOVE PAGE 0 IMAGE ; OUT (M2_CLDRES),A  ; ; INIT ALL BANKS ; LD E,A ;START WITH ALL Z80 BANKS LD HL,THIS_BNK ;POINT TO LOCATION TO STORE BANK # BNKS_INIT: OC),HL LD (SLOC),HL ; ; INSERT I/O INIT CODE HERE ; ; ; OUTPUT SIGN-ON MESSAGE ; LD HL,LOGMSG ;OUTPUT SIGN-ON NFUNC LD (MFUNRSV + 1),HL LD (MFUNRSV),A ; ; INIT BREAKPOINT VECTOR ; LD HL,REST LD (BP_RSTV),A LD (BP_RSTV +1),H0 %+ &, !'- "(. #)/ $*0L ; ; GET COMMAND FROM USER ; CALL CRLF CALL DECHO ; ; IF COMMAND NOT ALPHA THEN ERROR ; SUB A,'A' JR C,QPRT  CALL PRTWA ; ; EXECUTE WARM RESTART ; JR WINIT SUBTTL COMMANDS ;-------------------------------------------------OOTCD: LD C,XDBROM ;PASS IN DEFAULT BOOT ROM ADDR ; BOOTCC: LD D,1 ;SET BOOT FUNCTION # LD A,C ;BITS 2..0 = ROM # AND A, FILL LOOP ; FIO: PUSH DE LD DE,(A1_BNK) CALL PUTMEM ;STORE THE FILL VALUE POP DE ; ; IF NOT LAST LOCATION THEN REXPR3 ;HL= SRC, DE= LAST, BC= SRC2 ; ; TOP OF VERIFY LOOP ; CMPA: PUSH DE ;SAVE LAST PUSH BC ;SWAP SRC & SRC2 PTRS XB RET C ; ; ELSE REPEAT ; JR CMPA ;---------------------------------------------------------------------------- UMN ; LD A,L ;SEE IF ON 16 BYTE BOUNDARY CALL TRPLSP ;SKIP OVER TO RIGHT COLUMN ; ; SAVE PTR FOR CHAR DISPLAY ; PUA,0FH CALL TRPL2 ; ; DISPLAY CHAR ; DIS4: PUSH DE ;FETCH BANK IN E LD DE,(A1_BNK) CALL GETMEM ;FETCH DATA POP ; CP A,'Z' - 'A' + 1 JR NC,QPRT ; ; USE COMMAND CHAR AS OFFSET TO TABLE OF COMMAND EXECUTION ADDRESSES ; ADD A,A ;OF--------------------------- ; ; BOOT COMMAND ; ALLOWS EXECUTION OF A BOOT PROM ; ; B<(ARG * 10H) + PROM #> ; ARG :: 0..F7 ;MASK OF EXTRANEOUS BITS & CLEAR ERROR FLAG CALL SWPROM ; LD HL,BOOTEM CALL C,PRTWD ; JR WINIT ;GO TO MONITOR EXECEPEAT ; CALL HILO JR NC,FIO ; ; ELSE DONE ; JR WINIT ;--------------------------------------------------------- EX (SP),HL ; ; FETCH SRC2 DATA ; LD DE,(A3_BNK) CALL GETMEM LD C,A ; ; FETCH SRC1 DATA ; EX (SP),HL LD DE,; ; DISPLAY MEMORY COMMAND ; ; THIS ROUTINE DISPLAYS A BLOCK OF MEMORY ON THE CONSOLE DEVICE. THE ; USER MUST SPECIFY THE STSH HL ; ; TOP OF HEX DISPLAY LOOP ; DIS2: ; ; DISPLAY MEMORY DATA IN HEX ; PUSH DE ;FETCH BANK # IN E LD DE,(A1_DE ; AND A,7FH ;IF PRINTABLE THEN OUTPUT LD C,A CP A,' ' JR C,DIS5 ; CP A,7EH JR C,DIS6 ; DIS5: LD C,'.' ;ELSEFSET = INDEX * 2 ; LD E,A LD D,0 LD HL,TBL ;ADDRESS = (TABLE + OFFSET) ADD HL,DE ; LD A,(HL) ;FETCH ADDRESS INCH (PASSED TO BOOT ROM) ; PROM # :: 0..7 (DEFAULT # = 02H) ; ;-------------------------------------------------------------- ;---------------------------------------------------------------------------- ; ; FILL MEMORY COMMAND ; ; THIS ROUTINE------------------- ; ; VERIFY MEMORY COMMAND ; ; THIS ROUTINE COMPARES 2 BLOCKS OF MEMORY AGAINST EACH OTHER. IF A ; DIFFE(A1_BNK) CALL GETMEM LD B,A ;GET SOURCE 1 DATA ; ; IF SRC1 == SRC2 THEN EXIT ; LD A,C CP A,B ;IF S2=S1 THEN EXIT ART & FINISH ADDRESSES. THE DISPLAY IS ORGANIZED TO ; DISPLAY UP TO 16 BYTES PER DISPLAY LINE, WITH ALL COLUMNS ALIGNED SO EACHBNK) CALL GETMEM ;FETCH DATA FROM E:HL TO A CALL HEX1 ;DISPLAY DATA IN A POP DE ; ; IF DONE THEN GO ON TO ASCII ;  OUTPUT '.' ; DIS6: CALL CONOUT ; ; IF DONE THEN ABORT ; CALL HILOX RET C ; ; ELSE IF NOT ON EVEN 16 BYTE BOUNDAR HL LD H,(HL) LD L,A ; LD B,2 ;PASS IN DEFAULT OF 2 ARGUMENTS TO COMMAND ; JP (HL) ;EXECUTE THE COMMAND ;-------------------- BOOTC: ; ; IF NO ARGS THEN USE DEFAULT ; CALL PCHK ;IF NO FURTHER INPUT THEN USE DEFAULT JR C,BOOTCD  FILLS A BLOCK OF MEMORY WITH A USER DEFINED CONSTANT. IT ; EXPECTS 3 PARAMETERS TO BE ENTERED IN THE FOLLOWING ORDER: ; STARTRENCE IN THE RELATIVE ADDRESS CONTENTS IS DETECTED, THE ADDRESS OF THE ; 1ST BLOCK IS DISPLAYED, ALONG WITH IT'S CONTENTS & THE JR Z,CMPB ; ; ELSE DISPLAY SRC1 & SRC2 DATA ; PUSH AF ;SAVE S2 DATA ; CALL LADRB ;OUTPUT S1BNK:S1ADR S1DTA- LD A ; COLUMN HAS THE SAME LAST HEX DIGIT IN IT'S ADDR. ; ; D[ ] ; ;------------------------------------ CALL HILO ;INC & CHECK PTR JR C,DIS7 ;DONE IF CARRY ; ; NEXT COLUMN ; CALL BLK ;MAKE COLUMNS ; ; IF NOT ON EVENY THEN REPEAT ; LD A,L AND A,0FH JR NZ,DIS4 ; ; ELSE NEXT LINE ; JR DIS1 ; ; ; PARTIAL HEX LINE, START ASCII ---------------------------------------------------------------------- ; ; PRINT COMMAND ERROR MESSAGE & RETURN TO CLI ; ;--; ; ELSE GET USER ARG ; CALL EXF ;GET USER BOOT # POP BC ; JR BOOTCC ; ; ; SPECIAL DISK BOOT CODE SWAPS ROMS FO ADDR, FINISH ADDR, FILL VALUE ; ; F ; ;---------------------------------------------- CONTENTS OF THE ; OTHER BLOCK'S SAME RELATIVE ADDRESS. ; ; V ; ;,B CALL DASH1 ; CALL BLK ;DISPLAY S2BNK:S2ADR S2DTA POP AF EX (SP),HL PUSH AF LD DE,(A3_BNK) CALL LADR CALL B---------------------------------------- DISP: ; ; GET ARGUMENTS ; CALL EXLF ;GET BLOCK LIMITS ; ; TOP OF LINE LOOP 16 BYTE BOUNDARY THEN REPEAT ; LD A,L ;READY FOR NEW LINE? AND A,0FH JR NZ,DIS2 ; ; DONE WITH HEX DISPLAY, DO ASCIION PROPER COLUMN ; DIS7: SUB A,E ;SKIP OVER TO START ASCII CALL TRPLSP JR DIS3 ;-------------------------------------------------------------------------------------------------------------- QPRT: ; ; DISPLAY ERROR PROMPT ; LD HL,QMSG R BOOT. ; IF BOOT SUCCESSFUL, DOES NOT RETURN. ; IF UNSUCCESSFUL, RETURNS CARRY IF ERROR, NO CARRY IF DISK NOT INSERTED. ; B------------------------------ FILL: ; ; GET 3 ARGUMENTS ; CALL EXPR3 ;HL= PTR, DE= LAST ADDR, BC= VALUE ; ; TOP OF---------------------------------------------------------------------------- COMP: ; ; GET 3 ARGUMENTS FROM USER ; CALL LK POP AF EX (SP),HL ; CALL HEX1 ;OUTPUT S2DTA ; CMPB: POP BC POP DE ; ; IF SRC == LAST THEN DONE ; CALL HILO ; DIS1: ; ; DISPLAY START ADDRESS ; PUSH DE LD DE,(A1_BNK) CALL LADRB POP DE ; ; START DISPLAY ON PROPER COL ; DIS3: ; ; RESTORE PTR ; POP HL ; ; POSITION START ON PROPER COLUMN ; LD A,L ;SKIP OVER TO RIGHT SPACE AND ---------------------------------------- ; ; GOTO COMMAND ; ; GOTO COMMAND TRANSFERS CONTROL TO A SPECIFIED ADDRESS IT ALLOW0 %+ &, !'- "(. #)/ $*0S THE ; SELECTIVE SETTING OF UP TO 2 BREAKPOINTS AS WELL AS ALLOWING ANY CONSOLE ; INPUT TO BREAKPONT THE RUN, AS LONG AS INTE ; PUSH AF ;PRESET BANK # LD A,(BNKLOC) LD (A1_BNK),A ; CALL EXF POP DE ; LD (PLOC),DE ;PUT ADDR IN PC LOCATION ,(A1_BNK) LD (HL),A INC HL ; ; SAVE EXISTING LOCATION DATA IN TABLE ; PUSH HL ;SAVE REGS NEEDED FOR GETMEM & PUTMEM ESS ; ; INSERT RESTART BREAKPOINT VECTOR TO RESTORE ROUTINE ; LD HL,BP_RSTV LD DE,(BNKLOC) LD C,0C3H CALL PUTMEM ; LD HL,(RLOC) LD A,H LD I,A LD A,L ; ; DO AF ; LD HL,(FLOC) PUSH HL LD R,A ;MINIMIZE REFRESH REGISTER CHANGT DATA ; IN E,(C) JP BITS2 ;OUTPUT VALUE ;------------------------------------------------------------------------------------------------------------------------------------------------ MOVE: ; ; GET ARGS FROM USER ; CALL EXPR3 ;HL= SRY LOCATION & ALTER ; THE CONTENTS, IF DESIRED & IF THE ADDRESS IS IN RAM. THE CONTENTS MAY BE ; LEFT UNALTERED BY ENTERING A SRRUPT 1 IS ACTIVE. ; ; G ;START EXECUTION AT WHATEVER IS IN PC REG (NO BPS) ; G ;START EXECUTION AT START_ LD A,(A1_BNK) LD (BNKLOC),A ; ; IF LAST CHAR == CR THEN NO MORE ARGS ; LD A,C ;IF LAST = CR THEN EXIT CP A,CR JR EX DE,HL ;HL= PTR ; LD E,A ;E= BANK # CALL GETMEM PUSH AF ;SAVE DATA ; ; SET BREAKPOINT TO RESTART INSTRUCTION WINC HL LD C,LOW REST CALL PUTMEM INC HL LD C,HIGH REST CALL PUTMEM ; ; THE FOLLOWING CODE RESTORES THE Z80 REGISTEE POP AF ; ; FINALLY RESTORE HL & EXECUTE THE REQUESTED CODE ; LD HL,(LLOC) ; ; RESERVE SPACE FOR A EI INSTRUCTION - ; ; OUTPUT DATA TO PORT COMMAND ; ; O ; ;------------------------------------------------C, DE= SRC_LAST, BC= DEST ; ; TOP OF MOVE LOOP ; MOV1: ; ; MOVE 1 BYTE OF DATA ; PUSH DE ;SAVE LAST PTR PUSH BC PACE, COMMA OR RETURN. IF A RETURN IS ; ENTERED, THE ROUTINE IS TERMINATED. IF A SPACE OR COMMA IS ENTERED, THE ; ROUTINE PROCADDR (NO BPS) ; G,[,] ;START EXECUTION AT START_ADDR WITH ; BREAKPOINT AT BP1 AND OPTIONAL BREAKPOINT Z,GO3 ; ; GET & SET UP TO NBKPTS BREAKPOINTS ; GO0: LD B,NBKPTS LD HL,TLOC ;POINT TO TRAP STORAGE ; GO1: PUSH BC ;SHILE HERE ; PUSH BC ;SAVE LAST CHAR IN C LD C,BP_RSTI CALL PUTMEM POP BC ; POP AF ;RESTORE DATA EX DE,HL ;DE= PRS & EXECUTES THE 'PC' ; ; FIRST RESTORE THE Z80 ALTERNATE REGISTERS ; LD HL,(FPLOC) PUSH HL POP AF ; LD BC,(CPLOCTO BE PATCHED IN ; DB 0 ;'NOP' OR PLACE FOR 'EI' ; RET ;---------------------------------------------------------------------------------------- OUPT: ; ; GET ARGS FROM USER ; CALL EXPR ;GET DATA INTO E, PORT # INTO C POP DE POP BC ;SAVE DEST PTR ; LD DE,(A1_BNK) ;FETCH SRC DATA CALL GETMEM ; EX (SP),HL ;HL= DEST PTR LD DE,(A3_BNK) ;STORE SRC DATEEDS TO THE NEXT LOCATION & PRESENTS THE USER WITH AN ; OPPORTUNITY TO ALTER IT. ; ; S ; ;-------------------------- AT BP2 ; G,[,] ;START EXECUTION AT PC VALUE WITH BREAKPOINT(S) AT ; BP1 & OPTIONAL BP2. ; ;------------------AVE BREAKPOINTS REMAINING ; ; GET BREAKPOINT FROM USER ; PUSH HL ;STORAGE PTR LD B,2 CALL EXPR1 POP DE ;GET TRAP TR POP HL ;HL= RECORD.DATA PTR ; LD (HL),A ;STORE DATA INTO TABLE INC HL ;NEXT TABLE RECORD ; ; IF NO MORE ARGS TH) LD DE,(EPLOC) LD HL,(LPLOC) EX AF,AF' EXX ; ; NOW DO THE Z80 & 8080 REGISTERS ; LD IY,(YLOC) LD IX,(XLOC) ; ---------------- ; ; INPUT FROM PORT COMMAND ; ; THESE ROUTINES ALLOW BYTE-BY-BYTE INPUT OR OUTPUT FROM THE CURRENT ; CONSO ; ; OUTPUT TO PORT ; OUT (C),E ; ; DONE ; JP WINIT ;--------------------------------------------------------A IN DEST LD C,A CALL PUTMEM ; EX (SP),HL ;HL= SRC PTR POP BC ;BC= DEST PTR POP DE ;DE= LAST PTR ; ; NEXT, IF -------------------------------------------------- SUBS: ; ; GET ADDRESS FROM USER ; CALL EXPR1 ;GET ADDR CALL CRLF ---------------------------------------------------------- GOTO: ; ; IF NO ARGS THEN USE CURRENT REGISTERS ; CALL PCHK ADDR POP HL ;SPTR ; ; IF BREAKPOINT == 0 (NONE) THEN STOP ; LD A,(A1_BNK) ;INSURE 0 WASN'T SPEC'D OR A,D OR A,E EN DONE WITH BREAKPOINTS ; GO2: LD A,C CP A,CR POP BC ;BP COUNT JR Z,GO3 ; ; IF MORE ALLOWED THEN CONTINUE ; DJN LD DE,(ELOC) LD BC,(CLOC) ; ; DO STACK ; LD SP,(SLOC) ; ; PUSH PC ON STACK FOR RETURN INSTRUCTION TO EXECUTE ; LE DEVICE. ; ; I ; ;---------------------------------------------------------------------------- INPT: ; ; -------------------- ; ; MOVE COMMAND ; ; THIS ROUTINE EXPECTS 3 PARAMETERS, ENTERED IN THE FOLLOWING SEQUENCE: ; SOURCE 1SSRC <= LAST THEN REPEAT ; CALL HILOXB JR NC,MOV1 ; ; ELSE DONE ; JP WINIT ;------------------------------------;START ON NEW LINE POP HL ; ; TOP OF LOOP ; SUB1: ; ; DISPLAY EXISTING CONTENTS ; LD DE,(A1_BNK) CALL GETMEM  JR C,GO3 ; ; IF NO GOTO ADDRESS THEN SET BREAKPOINTS ; JR Z,GO0 ; ; FETCH NEW GOTO ADDRESS & PUT INTO 'PC' REGISTER JR Z,GO2 ; ; ELSE STORE BREAKPOINT ADDRESS IN TABLE ; LD (HL),E ;SAVE BP ADDR INC HL ; LD (HL),D INC HL ; LD AZ GO1 ; ; GOT ALL ARGS, EXECTUTE THE GOTO ; GO3: CALL CRLF ;NEW LINE FOR PGM ; POP HL ;GET RID OF WINIT RETURN ADDR LD A,(BNKLOC) CALL BNKSEL ; LD HL,(PLOC) PUSH HL ; ; DO INTERRUPT & REFRESH REGISTERS AS CLOSE TO EXIT AS POSSIBLE  GET PORT ARG FROM USER ; CALL EXPR1 ;GET INPUT PORT # INTO C CALL CRLF ;PUT DATA ON NEW LINE POP BC ; ; FETCH PORT BYTE ADDR, SOURCE LAST BYTE ADDR & DESTINATION 1ST BYTE ADDR. ; ; M ; ;----------------------------------------------- ; ; SUBSTITUTE MEMORY COMMAND ; ; THIS ROUTINE ALLOWS THE USER TO INSPECT ANY MEMORCALL DASH1 ; ; GET NEW VALUE FROM USER ; CALL PCHK ;GET NEW VALUE ; ; IF NONE THEN RETURN ; JP C,WINIT ;IF CHAR 0 %+ &, !'- "(. #)/ $*0= CR THEN RETURN ; ; IF LAST CHAR == SPACE OR COMMA THEN SKIP STORE ; JR Z,SUB2 ;IF CHAR = ' ' OR ',' THEN EXIT ; ;  JR SUB1 ;---------------------------------------------------------------------------- ; ; MTEST COMMAND TESTS A SPECIFI,BITS ;LOG ERR IF NOT ; ; RESTORE DATA IN MEMORY ; POP AF ;RESTORE BYTE LD C,A CALL PUTMEM POP DE ; ; IF NOT EXT ENTRY INC HL ; ; ; CONTINUATION FROM USER INPUT ; ENTRY- A= REGISTER REQUESTED CHAR ; XA: ; ; IF AT END OF TABL ;PTR CALL EXF POP HL ;HL= DATA ; ; PREFETCH DATA IN A ; LD A,L ; ; IF BYTE REGISTER THEN GO DO BYTE STORE ; , RESTORE PTR TO ATTRIBUTES/OFFSET BYTE OF TABLE ; XE: POP HL ; ; IF LAST CHAR == CR THEN DONE ; XF: LD A,C ;IF LAST = ''' ;IF NOT PRIMES THEN EXIT JR NZ,XA LD HL,PRMTB JR XMNE1 ; ; ; DISPLAY ALL REGISTER'S DATA ; XG: LD A,(HL) ;F----------------------- EXF: ; ; SET UP FOR 1 ARGUMENT ; LD B,1 ; ; INIT BANK PTR ; LD HL,A1_BNK LD (ARGPTR),HLELSE IF LAST CHAR == LINE FEED THEN BACK UP ; CP A,LF ;IF CHAR = LF THEN BACK UP JR Z,SUB3 ; ; ELSE GET & STORE VALUE ED BLOCK OF MEMORY TO SEE IF ANY HARD ; DATA BIT FAILURES EXIST. IT IS NOT AN EXHAUSTIVE TEST, BUT JUST A QUICK ; INDICATION ODONE THEN REPEAT ; CALL HILOX JR NC,MTEST1 ; ; DONE ; JP WINIT ;-----------------------------------------------LE THEN DONE ; INC (HL) ;DOES NOT CHANGE IN ROM VERSION RET Z ; ; MAKE USER REQUEST BIT 7 SAME AS TABLE'S ; JP P,XA EX (SP),HL ;HL= ATTRIBUTE PTR BIT 7,(HL) JR Z,XBREG ; ; ELSE IF WORD REGISTER THEN GO DO WORD STORE ; BIT 6,(HL) CR THEN RETURN CP A,CR RET Z ; ;---------------------------------------------------------------------------- ; ; THIS ISETCH TABLE ENTRY LD C,A ; ; IF AT END OF TABLE THEN DONE ; INC A ;IF AT END OF TABLE THEN RETURN RET Z ; ; IF BI ; ; ACCUMULATOR = 0 ; LD HL,0 ; ; ENTER GETTER WITH CHAR IN A ALREADY ; JR EX1 ;**************************** ; PUSH HL ;PTR CALL EXF ;CONTINUE HEX INPUT POP DE ;NEW VALUE POP HL ;PTR ; PUSH BC LD C,E LD DE,(A1_BNK) F THE MEMORY'S OPERATIVENESS. ; ; T ; ;------------------------------------------------------------------------------------------ ; ; EXAMINE REGISTERS COMMAND ; INSPECTS THE VALUES OF THE REGISTERS STORED BY THE LAST ENCOUNTB ;SORT OUT BIT 7 OF TABLE OR A,80H ;SET IT ON TEST VALUE JR XAC ; XAB: AND A,7FH ;RESET BIT 7 ; ; USER REQUESTED JR Z,XWREG ; ; ELSE DO INDIRECT BYTE STORE ; EX (SP),HL ;HL= DATA EX DE,HL ;HL= PTR LD DE,(BNKLOC) ;E= PC BANK P THE ACTUAL COMMAND ENTRY POINT ; ;---------------------------------------------------------------------------- XMNE: ; ; T 7 SET THEN DISPLAY NEW LINE ; CALL M,CRLF ;NEW LINE IF BIT 7 SET ; ; DISPLAY REGISTER ; LD C,(HL) PUSH HL CALL ************************************************ ; ; EXPR3 ROUTINE GETS 3 ARGUMENTS FROM USER, DOES A CR-LF & THEN ; LOADS BCALL PUTMEM ;LOAD VALUE ; POP BC ; ; IF LAST CHAR == CR THEN DONE ; LD A,C ;IF DELIM = CR THEN DONE CP A,CR JP Z--------------- MTEST: ; ; GET ARGS FROM USER ; CALL EXLF ;HL= START, DE= LAST ; ; TOP OF LOOP ; MTEST1: PUSH DERED ; BREAKPOINT. THE VALUES MAY BE MODIFIED IF DESIRED. ; ; X ;DISPLAY ALL REGISTER VALUES ; ;r= A,B,C,D,E,F,H REGISTER SHOULD MATCH NOW ; XAC: ; ; IF CHAR NOT MATCH THEN EXIT ; CP A,(HL) JR NZ,XAA ;NO MATCH, TRY AGAIN ; ; USH BC ;SAVE LAST CHAR LD C,A CALL PUTMEM POP BC JR XE ; ; ; WORD REGISTER WRITE ; XWREG: EX (SP),HL ;HL= DATA  START AT BEGINNING OF TABLE ; LD HL,ACTBL ;ADDR OF REG LOOK-UP TABLE ; ; IF NO ARGS THEN DISPLAY ALL REGS ; XMNE1: CALCONOUT CALL DASH ; ; DISPLAY REGISTER VALUE ; POP HL CALL PRTVAL CALL BLK INC HL ;NEXT ENTRY JR XG SUBTTC, DE & HL WITH THE PARAMS. ; ENTRY- B= 2 ; EXIT - HL= ARG1 ; DE= ARG2 ; BC= ARG3 ; ;***********************************,WINIT ; ; NEXT LOCATION ; SUB2: INC HL ;PTR = PTR + 2 INC HL ; ; PREVIOUS LOCATION ; SUB3: DEC HL ;PTR = PTR - E LD DE,(A1_BNK) CALL GETMEM ;FETCH DATA PUSH AF ;SAVE IT CPL ;INVERT BITS LD C,A CALL PUTMEM ; ; TEST BY XO,L,M,P,S,I,'A,'B,'C,'D,'E,'H,'L,'M,X,Y,R ; ;d= HEX NUMBER TO PLACE INTO REGISTER r ; ;----------------------------- CHARS MATCH, SET UP TO DISPLAY CURRENT DATA ; CALL BLK CALL PRTVAL CALL DASH ; ; GET USER DATA ; CALL PCHK ; ;  EX DE,HL ;DE= DATA, HL= PTR INC HL ;PRTVAL LEFT PTR TO LOW BYTE -1 LD (HL),E INC HL LD (HL),D JR XE ; ; ; BYTL PCHK JR C,XG ;IF CHAR = CR THEN SHOW ALL ; ; ELSE IF LAST CHAR == DELIMITER THEN REPEAT FOR ANOTHER REGISTER ; JR Z,L PROCEDURES & FUNCTIONS ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXF FUNCTION READS***************************************** EXPR3: ; ; BUMP ARG COUNT TO 3 ; INC B ;B HAS 2 ALREADY ; ; GET ARGS ; 1 ; ; IF ON MODULO 8 BOUNDARY, START ON NEW LINE & DISPLAY ADDRESS ; LD A,L AND A,7 CALL Z,LADRB ; ; CONTINUE ; RING WITH DATA, RESULT SHOULD BE 0 ; CALL GETMEM XOR A,C ; ; IF NOT 0 THEN DISPLAY DATA ('1' BIT IS ERROR) ; CALL NZ----------------------------------------------- ; ; CHARS NOT MATCH, TRY NEXT TABLE ENTRY ; XAA: INC HL ;SKIP OVER TO N IF USER ENTERED CR THEN DONE ; RET C ; ; IF NO CHANGE THEN EXIT ; JR Z,XF ; ; GET NEW DATA FROM USER ; PUSH HE REGISTER WRITE ; XBREG: EX (SP),HL ;HL= DATA INC DE ;PRTVAL LEFT PTR TO LOW BYTE -1 LD (DE),A ; ; VALUE STORE DONEXMNE1 ;IF CHAR = ' ' OR ',' THEN IGNORE ; ; ELSE IF USER REQUESTS ALTERNATE REGISTER THEN REPEAT WITH ALT TABLE ; CP A,' 1 ARGUMENT. ; ENTRY- A= ARGUMENT 1ST CHAR ; EXIT - STACK= ARGUMENT ; ;----------------------------------------------------- CALL EXPR ; ; RETURN VALUES FROM STACK ; POP BC POP DE JP CRLFA ;GO DO CRLF ;*********************************0 %+ &, !'- "(. #)/ $*0******************************************* ; ; EXPR SUBR. READS PARAMETERS FROM THE CONSOLE & DEVELOPS A 16 BIT HEX ; FOR EA IF NO ARGUMENTS LEFT THEN DONE ; EXPR1A: DEC B RET Z ; ; ARG = 0 ; EXPR0: LD HL,0 ; ; GET NEXT CHAR FROM USER ;A: EX (SP),HL PUSH HL ; ; BUMP TO NEXT ARG PAGE ; LD HL,(ARGPTR) INC HL LD (ARGPTR),HL ; ; IF LAST CHAR NOT CR  TRPL2: LD B,A INC B ;CONVERT N-1 TO N ; TRPL1: PUSH BC CALL BLK ;DO SPACING POP BC DJNZ TRPL1 ; ; DONE ; RENTRY- E= BINARY DATA ; EXIT - B= ? ; ;**************************************************************************** BITS2: ;*************************************************** PRTVAL: ; ; FETCH ADDRESS OFFSET OF REGISTER DATA ; INC HL ;SKIP RE CALL GETMEM EX DE,HL ;DE= PTR ; POP HL ; ; THIS IS TRICK, DECRIMENTS TO BYTE VALUE AND JUMPS AT SAME TIME ; DJNZ '-' ; ; GET CHAR FROM USER ; ECHO: CALL CONI ; ; ECHO TO USER ; PUSH BC LD C,A ;OUTPUT CHAR CALL CONOUT LD CH ONE. A CARRIAGE RETURN WILL TERMINATE THE ENTRY SEQUENCE. A BLANK ; OR COMMA WILL END THE CURRENT PARAMETER ENTRY. EACH PARA EX0: CALL ECHO ;GET NEXT # ; ; CONVERT CHAR TO BINARY ; EX1: LD C,A ;SAVE CHAR FOR LATER CALL NIBBLE ; ; IF NOT THEN GET NEXT ARGUMENT ; LD A,C CALL P2C JR NC,EX3 ; ; ELSE IF COUNT NOT EXHUSTED THEN ERROR ; DJNZ EX2B ; ; ET ;**************************************************************************** ; ; BITS PROCEDURE DISPLAYS ADDRESS AND D ; BIT COUNT = 8 ; LD B,8 ;BIT COUNT ; ; TOP OF OUTPUT LOOP ; BITS1: PUSH BC ; LD A,E ;USE MS BIT RLCA LD EGISTER CHAR LD A,(HL) ;GET OFFSET & ATTRIBUTES ; AND A,3FH ;ISOLATE OFFSET LD DE,RLOC ADD A,E ;BUILD ADDR OF REG CON PV2 ;ALLWAYS JUMP ; ; ; FETCH DATA ; PV1: LD A,(DE) ;GET REG CONTENTS ; ; DISPLAY DATA ; PV2: CALL HEX1 ;OUTPUTA,C ;RESTORE CHAR IN A POP BC ; ; DONE ; RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++METER ONLY TAKES ; THE LAST 4 DIGITS TYPED IN. ANY EXCESS IS DISCARDED. A NON-HEX DIGIT WILL ; TERMINATE THE ENTRY SEQUENCE & NUMBER THEN EXIT LOOP ; JR C,EX2 ; ; ELSE ADD TO ARGUMENT ; ADD HL,HL ;ARG *= 16 ADD HL,HL ADD HL,HL ADD HL,HL LSE RETURN ; RET ; ; ; RELATIVE JUMP EXTENSION ; EX2B: JP QPRT ;*************************************************ATA AS BINARY BITS ; ENTRY- HL= ADDRESS ; A= BINARY DATA ; EXIT - A= ? ; ;************************************************,A ; ; CONVERT TO ASCII ; LD A,'0' / 2 ;BUILD ASCII 1 OR 0 RLA ; ; DISPLAY ASCII DATA ; LD C,A PUSH DE CALL TENTS LD E,A LD A,0 ADC A,D LD D,A ; ; IF BIT 7 == 0 THEN SINGLE REGISTER (BYTE) VALUE ; LD A,(HL) ;NOW FIND ATT VALUE ; ; NOW DO LOW BYTE IF NEEDED ; DEC DE ;MEM PTR ; ; IF --BYTE_COUNT > 0 THEN REPEAT FOR LOW BYTE ; DJNZ PV+++++++++ ; ; HILO FUNCTION INCREMENTS HL. IT THEN CHECKS FOR (& DISALLOWS) A ; WRAP-AROUND SITUATION. IF IT OCCURS, THE CARRCAUSE A WARM BOOT OF THE MON. ; ENTRY- B= # OF PARAMETERS NEEDED ; EXIT - STACK= PARAMETERS ; ;***************************** OR A,L ;ADD IN NEW DIGIT LD L,A ; ; GET NEXT DIGIT ; JR EX0 ;GET NEXT ; ; ; NOT HEX NUMBER ENTERED, IF COLON T*************************** ; ; OUTPUT 3 SPACES EACH COLUMN TO POSITION ON COLUMN PROCEDURE ; ENTRY- A= NUMBER OF COLUMNS - 1**************************** BITS ; ; SAVE REG ; PUSH DE ; ; SAVE DATA ; PUSH AF ; ; DISPLAY ADDRESS ; CALCONOUT POP DE ; ; IF NOT DONE THEN REPEAT ; POP BC DJNZ BITS1 ; ; DONE ; RET ;***************************RIBUTES LD B,1 ;ASSUME BYTE VALUE RLCA JR NC,PV1 ;IF SINGLE REG THEN EXIT ; ; ELSE WORD VALUE ; INC B ; ; IF 1 ; ; ELSE DONE ; RET ;**************************************************************************** ; ; ECHO ROUTIY BIT WILL BE SET ON RETURN. ; IF NO WRAP-AROUND OCCURRED, HL IS COMPARED TO DE & THE FLAGS SET ACCORDINGLY. ; ENTRY- HL= PTR *********************************************** ; ; ; EXPR: LD HL,A1_BNK LD (ARGPTR),HL ; JR EXPR0 ; ; ; ; EXPR1: HEN SAVE ACCUMULATOR IN BANK REGISTER ; EX2: LD A,C CP A,':' JR NZ,EX2A ; ; STORE BANK # ; LD A,L LD HL,(ARGPTR {0..15} ; EXIT - A, B= ? ; ;**************************************************************************** TRPLSP: ; ; COL LADRB ;OUTPUT ADDR ; ; DISPLAY DATA ; POP DE LD E,D CALL BITS2 ; ; RESTORE & DONE ; POP DE RET ;***************************************************** ; ; DISPLAY REGISTER CONTENTS PROCEDURE ; ENTRY- HL= PTR TO TABLE 'REGISTERBIT 6 == 0 THEN DIRECT ADDRESS ; RLCA JR NC,PV1 ; ; ELSE INDIRECT ADDRESS, (HL) ; PUSH HL ;BUILD ADDR IN HL ; LDNE READS A BYTE FROM CONSOLE DEVICE & ECHOS THE CHAR BACK ; TO THE CONSOLE DEVICE. ; EXIT - A= CHAR ; ;********************* ; DE= LAST LOCATION ; EXIT - HL = HL + 1 ; CF = HL == 0 OR HL > DE ; A = ? ; ;+++++++++++++++++++++++++++++++++++++++++LD HL,A1_BNK LD (ARGPTR),HL JR EXPR1A ; ; ; IF LAST CHAR NOT VALID THEN ERROR ; EX3: JP NZ,QPRT ;NON 0 IS ERR ; ; ) LD (HL),A ; ; RESTART WITH ACCUMULATOR = 0 ; JR EXPR0 ; ; ; ELSE PUT VALUE UNDER RETURN ADDRESS ON STACK ; EX2MPUTE NUMBER OF SPACES ; AND A,0FH ;LIMIT TO 0..15 LD B,A ;MULTIPLY BY 3 (X= X * 2 + X) ADD A,A ; COLUMN ADD A,B ;************************************************************************ ; ; BITS2 PROCEDURE DISPLAYS DATA AS BINARY BITS ; E' ; EXIT - HL= PTR TO LAST BYTE OF TABLE RECORD ; DE= PTR TO LOW BYTE OF VALUE -1 ; A, BC= ? ; ;************************* A,(DE) ;USE CONTENTS OF HL AS ADDRESS OF VALUE LD H,A ; DEC DE LD A,(DE) LD L,A ; LD DE,(BNKLOC) ;FETCH (HL) VALUE******************************************************* ; ; 1ST ENTRY DISPLAYS A '-' FIRST ; DECHO: CALL DASH ;OUTPUT A+++++++++++++++++++++++++++++++++++ HILO: ; ; BUMP HL ; INC HL ; ; IF HL == 0 THEN RETURN CF ; LD A,H ;IF HL = 00 %+ &, !'- "(. #)/ $*0; The monitor is made up of the following files: ; ; ZBMRrrr.* = Resident ROM code ; ZBMDrrr.* = Debugger ; ZBMCrrr.* = CAR 84 GRH ; Change to allow Boot command parameter passing to boot ROM. ; ; 1.4 - 2 JUN 84 GRH ; Fix bug in line printeripation of ; Cromemco bank select useage. ; ; 1.9 - 16 AUG 86 GRH ; Fix bug in PRI driver which caused new Oki 93 to be ************************* ; ; This Monitor program resides at the top of memory & allows memory ; modification & testing, pro 29 DEC 88 GRH ; Add banked memory support: ; 1. Page 0 initialization. ; 2. Init bank register to bank 0F8H. ; 1.21 2 ;*INCLUDE MONBOARD.DEF ;*INCLUDE B:ZBMF101.DEF ;*INCLUDE B:ZBMG101.DEF ; LIST OFF *MACLIB ASMBTOOL.MLB *INCLUDE ++++++++++++++++ ; I_STUB: ADD A,2 ;BIAS UP PUSH HL LD H,MR_RNUM ;USE RESIDENT ROM LD L,A EX (SP),HL CALL XROMF ############### ; ; SIGN-ON ; ;############################################################################ ; LOGMSG: DB Character I/O ; ZBMKrrr.* = Disk I/O ; ZBMVrrr.* = Miscellaneous I/O Drivers ; ZBMGrrr.DEF = Global definitions & RAM alloc status subroutine which hung the ; line printer by sensing the status incorrectly. ; 1.5 - 29 SEP 85 GRH ; Fix bug in Inbusy. ; ; 1.10- 8 FEB 87 GRH ; Fix bug in register restore routine which caused IX & IY to be ; swapped prior to GOTO. ;gram breakpoints, console, printer, punch & ; reader I/O drivers and transfer to system boot ROM residing in same memory ; are7 JAN 89 GRH ; Add new monitor function routines. ; ; 1.22 11-22-90 GRH ; Move code to separate ROM in order to gain spaMONBOARD.DEF *INCLUDE B:ZBMF101.DEF *INCLUDE B:ZBMG101.DEF LIST ON THIS_ROM EQU DEB_RNUM ;ROM # OF THIS ROM RESTNT EQU M;GO EXECUTE THE FUNCTION INC SP ;BALANCE STACK INC SP RET ;*********************************************************R,LF,' 65K Banked Debugger V. ' PVERS VERSN DM CR,LF ;-----------------------------------------------------------------ation include ; XROM.Z80 = ROM Xover include ; ZBMHrrr.HDR = Common Header include ; put command which caused monitor to crash. ; The jump to 'BITS2' expects DE to be on stack. ; 1.6 - 6 DEC 85 GRH ; Add co Change restart error to vector to breakpoint after message. ; ; 1.11- 27 DEC 87 GRH ; Add bank memory management routines.a as this ROM. ; *INCLUDE B:ZBMH122.HDR ;**************************************************************************** ; ; Rce for I/O drivers and ; interrupt code. ; Add rom xover function as include file. ; Add function dispatcher for execution aR_BRK ;0F82AH ;BREAKPOINT ENTRY LOCATION IN RESIDENT ROM SUBTTL EXTERNAL ENTRY POINTS ORG MONROM ; JP CINIT ;COLD ST******************* ; ; COLD INIT ONLY SWITCHES TO RESIDENT ROM ; ;*********************************************************----------- ; ; THIS IS THE COLD START INIT CODE ; ;------------------------------------------------------------------------sfer to additional ROMs residing in the same memory ; area as this ROM. ; ;**************************************************de to disable all Jade controllers from 40H to 43H after ; reset. ; 1.7 - 8 FEB 86 GRH ; Remove time delay from power up r ; ; 1.12 20 JUL 88 GRH ; Add Monitor function call restart. ; ; 1.20 29 DEC 88 GRH ; Add banked memory support: ; evision status: ; ; 1.0 - Release ; 1.3 - 17 MAR 84 GRH ; Change to allow Boot command parameter passing to boot ROM. ; 1nd breakpoint entries. ; Add disk read, write, & logon commands ; 1-13-91 grh ; Add clock set command. ; ; 1.23 2-22-91 ART ; ; EXTERNAL FUNCTION ENTRY DURING INTERRUPT ; DS (MONROM + 6) - $ JP I_STUB ;++++++++++++++++++++++++++++++++++******************* ; CINIT: ; ; SET STACK ; LD SP,MONSTK ; ; RESET ROM FUNCTION SHOULD NOT RETURN ; LD HL,[MR_R---- ; ROM_INIT: ; ; SET MONITOR COMMAND ARGUMENT DEFAULTS ; LD A,DEFBNK LD HL,A1_BNK LD (ARGPTR),HL LD (HL),A ************************** ; ; Revision status: ; ; 1.0 - Release ; 1.1 - ; Add Double D deselect upon reset code. ; Chaneset code to allow ISHA to access ; ram. ; Remove the auto-boot from reset function. ; ; 1.8 - 29 MAY 86 GRH ; Add Crom TITLE M5b Z-80 DEBUGGER ROM LIST NOCOND ;**************************************************************************** ; ; .5 - 29 SEP 85 GRH ; Fix bug in Input command which caused monitor to crash. ; The jump to 'BITS2' expects DE to be on sta GRH ; Change references to THIS_BNK to CURBNK. ; VERSN EQU 123 ;***********************************************************++++++++++++++++++++++++++++++++++++++++++ ; ; EXTERNAL FUNCTION STUB FOR USE DURING AN INTERRUPT WITHOUT THE ; RESIDENT ROM NUM SHL 8] + 1 ;RESET PUSH HL CALL XROMF ; ; IF RETURNED THEN HALT ; HALT SUBTTL MONITOR BOARD SHADOW ROM SELECINC HL LD (HL),A INC HL LD (HL),A ; ; FILL BREAKPOINT ADDRESSES WITH 0 (LAST BYTE OF EXIT ROUTINE ; LD BC,[NBKPTS *ge printer port. ; 1.2 - 20 FEB 83 GRH ; Add delay before turning off boot image, in case logic ; too slow. ; 1.3 - 17 Memco PRI printer driver as primary printer. ; Change IOBYTE definitions. ; Remove initialization of Jade FDC port 40H in anticSYSTEM MONITOR FOR M5b ; (c) 1982,1983 GRH ELECTRONICS, CUPERTINO, CA ; ;***************************************************ck. ; 1.10- 8 FEB 87 GRH ; Fix bug in register restore routine which caused IX & IY to be ; swapped prior to GOTO. ; 1.20***************** FORM FALSE EQU 0 TRUE EQU NOT FALSE ; ; INCLUDE SYSTEM DEFINITION FILES ; ;*MACLIB ASMBTOOL.MLBENABLED. USE IN ALL NON-RESIDENT ROMS. ; ENTRY- A= FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++TION PROCEDURE *INCLUDE XROM.Z80 SUBTTL INITIALIZATION CODE ;############################################################# BP_REC] - 1 LD HL,TLOC LD (HL),0 PUSH HL POP DE INC DE LDIR ; ; INITIALIZE REGISTER IMAGES TO 0 ; LD HL,RLOC0 %+ &, !'- "(. #)/ $*0 LD B,BNKLOC - RLOC + 1 ; INIT2: LD (HL),C ;C HAS 0 FROM LAST LDIR FINISH INC HL DJNZ INIT2 ; ; NOW CHANGE SP & PC ,HL ; ; RETURN TO EXECUTION ADDRESS ; RET ; ; ; FUNCTION ERROR ; MFUNERR: LD A,-1 OR A,A RET ;#########+++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN VERSION FUNCTION ; EXIT - HL= VERSION # (123D = 1.23) ; ;+++R Z,PRTA ; ; RESTORE & RETURN ; POP BC RET ;**********************************************************************; PUSH HL ; ; DO HIGH BYTE 1ST ; LD C,H CALL PUTHXB ; ; NOW DO LOW NIBBLE ; POP HL LD C,L ; ; FALL INTO ***************************************************************** ; PUTHXN: LD A,C AND A,0FH ADD A,90H ;PUT INTO ASCII 0C3H LD HL,RESTNT ;RESIDENT ROM ENTRY VECTOR LD (BP_RSTV),A LD (BP_RSTV +1),HL ; ; SET DEFAULT BANK ; LD C,DEFBNK MAND INPUT ; ;---------------------------------------------------------------------------- ; QPRT: ; ; DISPLAY ERROR PROTO 0100H ; LD HL,0100H LD (PLOC),HL LD (SLOC),HL ; ; DONE ; RET SUBTTL MONITOR FUNCTION CALL DISPATCHER ;++++################################################################### ; ; MONITOR FUNCTION TABLE ; ;##########################+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; RETVERS: LD HL,VERSN RET ;********************* ; ; DISPLAY ADDRESS PROCEDURE ; ENTRY- E:HL= ADDRESS VALUE TO DISPLAY ; ;*******************************************BYTE OUTPUT ; ;**************************************************************************** ; ; DISPLAY HEX BYTE ON SYSTZONE DAA ;AH, THE UBIQUITOUS DAA CONVERT ADC A,40H DAA LD C,A JP CO SUBTTL DEBUGGER COMMAND INPUT ;---------- XRROM 9 ; ; GET COMMAND FROM USER ; CALL CRLF CALL DECHO ; ; IF COMMAND NOT ALPHA THEN ERROR ; SUB A,'A' JR MPT ; LD HL,QMSG CALL PRTWA ; ; EXECUTE WARM RESTART ; JR WINIT SUBTTL COMMANDS ;----------------------------++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; ENTRY- A= FUNCTION # ; ;+++++++++++++++++++++++################################################## ; FUNTABL: DW RETVERS ;0: RETURN MONITOR ROM VERSION DW DEBUG ;1: EXE************************************************************* ; ; PRTS ROUTINE OUTPUTS AN ASCII STRING ONTO THE CONSOLE. ; T********************************* ; PUTHXA: ; ; DISPLAY BANK # ; PUSH HL LD C,E CALL PUTHXB ; ; DISPLAY COLON ;EM CONSOLE PROCEDURE ; ENTRY- C= BYTE TO DISPLAY ; ;*************************************************************************------------------------------------------------------------------ ; ; DEBUGGER FUNCTION ; ;--------------------------------C,QPRT ; CP A,'Z' - 'A' + 1 JR NC,QPRT ; ; USE COMMAND CHAR AS OFFSET TO TABLE OF COMMAND EXECUTION ADDRESSES ; ADD ------------------------------------------------ ; ; BOOT COMMAND ; ALLOWS EXECUTION OF A BOOT PROM ; ; B<(ARG * 10H) + PR+++++++++++++++++++++++++++++++++++++++++++++++++++++ ; FUNCH: CP A,MAXFUNS JR NC,MFUNERR ; ; FUNCTION SEEMS LEGAL, FECUTE THE DEBUGGER DW REST ;2: BREAKPOINT CONTINUE DW PUTHXN ;3: DISPLAY HEX NIBBLE ON CONSOLE DW PUTHXB ;4: DISPLAY HEXHE STRING MUST BE TERMINATED BY BIT 7 SET IN THE LAST CHAR OF THE STRING. ; ENTRY- HL= TEXT PTR ; ;************************** LD C,':' CALL CO ; ; DISPLAY ADDRESS VALUE ; POP HL ; ; FALL INTO HEX WORD OUTPUT ; ;************************ ; PUTHXB: ; ; SAVE LOW NIBBLE ; PUSH BC ; ; DO HIGH NIBBLE 1ST ; RRC C RRC C RRC C RRC C CALL PUTHXN-------------------------------------------- ; DEBUG: ; ; OUTPUT SIGN-ON MESSAGE ; LD HL,LOGMSG ;OUTPUT SIGN-ON CALL A,A ;OFFSET = INDEX * 2 ; LD E,A LD D,0 LD HL,TBL ;ADDRESS = (TABLE + OFFSET) ADD HL,DE ; LD A,(HL) ;FETCH ADDREOM #> ; ARG :: 0..FH (PASSED TO BOOT ROM) ; PROM # :: 0..7 (DEFAULT # = 02H) ; ;-----------------------------------------TCH EXECUTION ADDRESS FROM TABLE ; PUSH HL ;SAVE POSSIBLE ARGUMENT ; LD HL,FUNTABL ADD A,A ADD A,L LD L,A LD A,0  BYTE ON CONSOLE DW PUTHXW ;5: DISPLAY HEX WORD ON CONSOLE DW PUTHXA ;6: DISPLAY HEX ADDRESS ON CONSOLE DW PRTS ;7: DIS************************************************** ; PRTS: ; ; SAVE REGISTER ; PUSH BC ; ; TOP OF PRINTING LOOP ; ******************************************************* ; ; DISPLAY HEX WORD ON SYSTEM CONSOLE PROCEDURE ; ENTRY- HL= BYTE TO ; ; NOW DO LOW NIBBLE ; POP BC ; ; FALL INTO NIBBLE OUTPUT ; ;************************************************PRTS ; ; WARM RESTART ENTRY ; WINIT: ; ; FIRST RESTORE THE LOCAL STACK TO THE GLOBAL RAM ; LD SP,MONSTK ; ; PUTSS INC HL LD H,(HL) LD L,A ; LD B,2 ;PASS IN DEFAULT OF 2 ARGUMENTS TO COMMAND ; JP (HL) ;EXECUTE THE COMMAND ----------------------------------- BOOTC: ; ; IF NO ARGS THEN USE DEFAULT ; CALL PCHK ;IF NO FURTHER INPUT THEN USE DE 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)PLAY BIT7 TERMINATED TEXT ON CONSOLE ; MAXFUNS EQU ($ - FUNTABL) / 2 SUBTTL DEBUGGER FUNCTIONS ;+++++++++++++++++++++++++ PRTA: LD C,(HL) ;FETCH CHAR ; RES 7,C ;MAKE SURE BIT 7 = 0 CALL CO ; BIT 7,(HL) ;IF BIT 7 = 1 THEN STOP INC HL J DISPLAY ; ;**************************************************************************** ; PUTHXW: ; ; SAVE LOW NIBBLE **************************** ; ; DISPLAY NIBBLE ON SYSTEM CONSOLE ; ENTRY- C<3..0>= NIBBLE ; EXIT - A= C= ? ; ;*********** THE RETURN ON THE STACK FOR COMMANDS WHICH ARE SUBROUTINES ; LD HL,WINIT PUSH HL ; ; INIT BREAKPOINT VECTOR ; LD A, ;---------------------------------------------------------------------------- ; ; PRINT COMMAND ERROR MESSAGE & RETURN TO COMFAULT JR C,BOOTCD ; ; ELSE GET USER ARG ; CALL EXF ;GET USER BOOT # POP BC ; JR BOOTCC ; ; ; SPECIAL DISK BO 0 %+ &, !'- "(. #)/ $*0OT CODE SWAPS ROMS FOR BOOT. ; IF BOOT SUCCESSFUL, DOES NOT RETURN. ; IF UNSUCCESSFUL, RETURNS CARRY IF ERROR, NO CARRY IF DISL VALUE ; ; F ; ;------------------------------------------------------------------------------------- ; ; VERIFY MEMORY COMMAND ; ; THIS ROUTINE COMPARES 2 BLOCKS OF MEMORY AGAINST EACH OTHER. IF A ; DIFFEREN********************** ; ; REVISION HISTORY: ; ; 1.0 - 23 SEP 83 GRH ; Initial version transferred from CBIOS routines. ========================================================================== LIST OFF *MACLIB ASMBTOOL.MLB *INCLUDE MONBOPUSH HL LD H,MR_RNUM ;USE RESIDENT ROM LD L,A EX (SP),HL CALL XROMF ;GO EXECUTE THE FUNCTION INC SP ;BALANCE STACK NIT CODE ; ;---------------------------------------------------------------------------- ; ROM_INIT: ; ; OUTPUT SIGN-ON NT & PUT EXECUTION ADDRESS ON STACK EX (SP),HL ; ; RETURN TO EXECUTION ADDRESS ; RET ; ; ; FUNCTION ERROR ; MFUNK NOT INSERTED. ; BOOTCD: LD C,DK_RNUM ;PASS IN DEFAULT BOOT ROM ADDR ; BOOTCC: LD L,1 + 2 ;SET BOOT FUNCTION # LD A,C ;------- ; FILL: ; ; GET 3 ARGUMENTS ; CALL EXPR3 ;HL= PTR, DE= LAST ADDR, BC= VALUE ; ; TOP OF FILL LOOP ; FIO: CE IN THE RELATIVE ADDRESS CONTENTS IS DETECTED, THE ADDRESS OF THE ; 1ST BLOCK IS DISPLAYED, ALONG WITH IT'S CONTENTS & THE CO; ; 1.22 11-25-90 GRH ; Modify slightly for Shared ROM ZMON V. 1.22. ; ; 1-7-91 GRH ; Change read clock buffer functionARD.DEF *INCLUDE CLOCK.DEF *INCLUDE B:ZBMF101.DEF *INCLUDE B:ZBMG101.DEF LIST ON THIS_ROM EQU CLK_RNUM ;ROM # OF THIS  INC SP RET ;**************************************************************************** ; ; COLD INIT ONLY SWITCHES TMESSAGE ; LD HL,LOGMSG ;OUTPUT SIGN-ON CALL PRTS ; RET LOGMSG: DB ' Misc. Drivers V. ' PVERS VERSN DM CR,LF SERR: LD A,-1 OR A,A RET ;############################################################################ ; ; MONITOR FBITS 2..0 = ROM # AND A,7 ;MASK OFF EXTRANEOUS BITS & CLEAR ERROR FLAG ; LD H,A PUSH HL CALL XROMF INC SP INC SP  PUSH DE LD DE,(A1_BNK) ; ; IF IN PROTECTED AREA THEN IGNORE ; LD A,H ;IF IN MONITOR RAM THEN IGNORE CP A,HIGH MONSNTENTS OF THE ; OTHER BLOCK'S SAME RELATIVE ADDRESS. ; ; V ; ;--- (1) to set clock calendar, and ; write clock buffer function (2) to set clock time. ; 1-21-91 GRH ; Fix bug in clock timeROM SUBTTL EXTERNAL ENTRY POINTS ORG MONROM ; JP CINIT ;COLD START ; ; EXTERNAL FUNCTION ENTRY DURING INTERRUPT O RESIDENT ROM ; ;**************************************************************************** ; CINIT: ; ; SET STACK ;UBTTL MONITOR FUNCTION CALL DISPATCHER ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; ENTRUNCTION TABLE ; ;############################################################################ ; FUNTABL: DW RETVERS ;0: R; ; IF RETURNED THEN MUST BE ERROR ; LD HL,BOOTEM CALL C,PRTWD ; JR WINIT ;GO TO MONITOR EXEC ;----------------TK JR NC,FILNO ; OR A,A ;ELSE IF NOT IN PAGE 0 THEN OK JP NZ,FILYES ; LD A,L ;ELSE IF IN 1ST 40H BYTES THEN IGNORE ------------------------------------------------------------------------- ; COMP: ; ; GET 3 ARGUMENTS FROM USER ; CALL  set function which set chip to 12 Hr format. ; VERSN EQU 122 ; ;*********************************************************** ; DS (MONROM + 6) - $ JP I_STUB ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EX LD SP,MONSTK ; ; RESET ROM FUNCTION SHOULD NOT RETURN HERE ; LD HL,[MR_RNUM SHL 8] + 1 ;RESET PUSH HL CALL XROMF Y- A= FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; FUNCH: CP A,MAXFUNS JETURN ROM VERSION # DW CLKSCAL ;1: SET CLOCK CALENDAR DW CLKSTIM ;2: SET CLOCK TIME DW CLKCAL ;3: RETURN CLOCK CALENDAR------------------------------------------------------------ ; ; FILL MEMORY COMMAND ; ; THIS ROUTINE FILLS A BLOCK OF MEMOR CP A,40H JR C,FILNO ; FILYES: CALL PUTMEM ;STORE THE FILL VALUE ; FILNO: POP DE ; ; IF NOT LAST LOCATION THEN REPE TITLE M5b MISCELLANEOUS I/O DRIVER ROM LIST NOCOND ;***************************************************************************************** SUBTTL DECLARATIONS ;============================================================================ ; ;*MTERNAL FUNCTION STUB FOR USE DURING AN INTERRUPT WITHOUT THE ; RESIDENT ROM ENABLED. USE IN ALL NON-RESIDENT ROMS. ; ENTRY- A=; ; IF RETURNED THEN HALT ; HALT SUBTTL MONITOR BOARD SHADOW ROM SELECTION PROCEDURE *INCLUDE XROM.Z80 SUBTTL IR NC,MFUNERR ; ; FUNCTION SEEMS LEGAL, FETCH EXECUTION ADDRESS FROM TABLE ; PUSH HL ;SAVE POSSIBLE ARGUMENT ; LD HL,F DATA DW CLKTIM ;4: RETURN CLOCK TIME DATA DW CLKRETR ;5: RETURN CLOCK REGISTER DATA DW CLKWAIT ;6: WAIT FOR CLOCK TO CY WITH A USER DEFINED CONSTANT. IT ; EXPECTS 3 PARAMETERS TO BE ENTERED IN THE FOLLOWING ORDER: ; START ADDR, FINISH ADDR, FILAT ; CALL HILO JR NC,FIO ; ; ELSE DONE ; JP WINIT ;------------------------------------------------------------**** ; ; MISC. I/O DRIVER ROUTINES FOR M5b ; *INCLUDE B:ZBMH122.HDR ;******************************************************ACLIB ASMBTOOL.MLB ;*INCLUDE MONBOARD.DEF ;*INCLUDE CLOCK.DEF ;*INCLUDE B:ZBMF101.DEF ;*INCLUDE B:ZBMG101.DEF ; ;== FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; I_STUB: ADD A,2 ;BIAS UP NITIALIZATION CODE ;---------------------------------------------------------------------------- ; ; THIS IS THE COLD START IUNTABL 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 ARGUMEHANGE DW ISTHERE ;7: RETURN BOARD PRESENT STATUS DW CLKSTOP ;8: STOP CLOCK DW CLKSTRT ;9: START CLOCK ; MAXFUNS EQU ( 0 %+ &, !'- "(. #)/ $*0$ - FUNTABL) / 2 SUBTTL ROM FUNCTIONS ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; R L= MSD ; CALL CLK_SET ; ; PROCESS DATE ; INC C POP HL ;WAS BC (DATE) LD A,H CALL H2BCD ; CALL CLK_SET ; H REGISTER ; LD C,CLK_SECL ;SET REGISTER # ; ; PROCESS SECONDS ; LD A,B CALL H2BCD ; CALL CLK_SET ; LD A,L IE FOR AWHILE ; CALL CLKWAIT ; ; FETCH DAY OF WEEK & SAVE ; LD C,CLK_WEEK CALL GETD AND A,7 ;MASK OFF GARBAGE {0..ILIZE ; CALL CLKWAIT ; ; PROCESS SECONDS ; LD C,CLK_SECL CALL GET2D LD H,7 ;MASK {0..79} CALL GETN PUSH AF ;ET ; EX (SP),HL EX (SP),HL ; ; RETURN WITH DATA ; IN A,(CLK_DATA) ;RETURN DATA RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; TEST IF BOARD PRESENT FUNCTION #7 ; EXIT - A,L= 0: THERE, /0: NOT THERE ; EX (SP),HL DJNZ CLKSDL ; ; DONE ; RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ETURN VERSION FUNCTION #0 ; EXIT - HL= VERSION # (123D = 1.23) ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++LD A,L INC C CALL CLK_SET ; ; PROCESS MONTH ; INC C LD A,D CALL H2BCD ; CALL CLK_SET ; LD A,L INC C CALNC C CALL CLK_SET ; ; PROCESS MINUTES ; INC C LD A,D CALL H2BCD ; CALL CLK_SET ; LD A,L INC C CALL CLK_SE7} LD L,A ; ; PROCESS DAY ; INC C CALL GET2D LD H,3 ;MASK {0..39} CALL GETN PUSH AF ; ; PROCESS MONTH ; SAVE ; ; PROCESS MINUTES ; CALL GET2D CALL GETN ;USE SAME MASK AS ABOVE {0..79} LD B,A ; ; PROCESS HOURS ; CA+++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; WAIT FOR CLOCK TO CHANGE FUNCTION #6 ; EXIT - A= 0: OK, /0: BOARD NOT;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ISTHERE: ; ; FETCH CLOCK DATA ; IN A,(C+ ; ; START CLOCK FUNCTION #9 ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKSTRT: +++++++++++++++++ ; RETVERS: LD HL,VERSN RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++L CLK_SET ; ; PROCESS YEAR ; INC C LD A,E CALL H2BCD ; CALL CLK_SET ; LD A,L INC C CALL CLK_SET ; ; DONT ; ; PROCESS HOURS ; INC C LD A,E CALL H2BCD ; CALL CLK_SET ; LD A,L SET 3,A ;SET 24 HR FORMAT BIT (HOURS M CALL GET2D LD H,1 ;MASK {0..19} CALL GETN LD B,A ; ; PROCESS YEAR ; CALL GET2D LD H,0FH ;MASK {0..99} CALL GLL GET2D LD H,3 ;MASK {0..39} CALL GETN LD C,A ; ; RETURN MINUTES IN A ; POP AF RET ;++++++++++++++++++++++ PRESENT ; C= CLK_SECL ; B= LO SECONDS DATA ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++LK_DATA) ; ; IF UPPER BITS NOT DRIVEN THEN BOARD IS NOT THERE ; AND A,11000000B ; ; ADJUST SENSE ; RET ;+++++; ; CLEAR HOLD ; XOR A,A OUT (CLK_DATA),A ; ; CLEAR COMMAND ; OUT (CLK_CMD),A ; ; DONE ; RET SUBTTL +++++ ; ; SET CLOCK CALENDAR FUNCTION #1 ; ENTRY- B= DATE ; D= MONTH ; E= YEAR ; L= DAY OF WEEK ; EXIT - A= 0 ; BC, E, TURN ON CLOCK ; JP CLKSTRT ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SET CLSD) INC C CALL CLK_SET ; ; START CLOCK ; JP CLKSTRT ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ETN ; ; RETURN VALUES ; LD C,A ;RETURN YEAR IN C POP AF ;RETURN DAY IN A RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN CLOCK DATA FUNCTION #5 ; ENTRY- C= CLOCK REGISTER # ; EXIT+ ; CLKWAIT: ; ; IF BOARD NOT THERE THEN RETURN ERROR ; CALL ISTHERE RET NZ ; ; FETCH CURRENT SECONDS ; LD C,C+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; STOP CLOCK FUNCTION #8 ; EXIT - A, B= ? ; ;++++FUNCTIONS & PROCEDURES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN 2 BCD DIGITS DE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKSCAL: ; ; STOP CLOCK ; PUSOCK TIME FUNCTION #2 ; ENTRY- B= SECONDS ; D= MINUTES ; E= HOURS ; EXIT - A= 0 ; BC, DE= ? ; ;+++++++++++++++++++++++++++++++++++++++++ ; ; RETURN CALENDAR FUNCTION #3 ; EXIT - A= DAY ; B= MONTH ; C= YEAR ; L= DAY OF WEEK ; DE= ? ; ;++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN TIME FUNCTION #4 ; EXIT - A= SECONDS ; B= MINUTES ; C= HOURS ; DE - A= REGISTER DATA ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKRETR: GETD: ; ; LK_SECL CALL GETD AND A,CLK_DMSK ;MASK OFF UNWANTED BITS LD B,A ; ; WAIT UNTIL SECONDS CHANGE ; CLKRWT: CALL GETD ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKSTOP: ; ; PUT HOLD ON CLOCK ; LD A,[1 SHLFROM CLOCK FUNCTION ; ENTRY- C= CLOCK REGISTER # ; EXIT- DE= DIGITS ; A= HIGH DIGIT ; C= C + 2 ; ;++++++++++++++++++++++H BC CALL CLKSTOP ; ; SET UP PTR TO REGS ; LD C,CLK_WEEK ; ; PROCESS DAY OF WEEK ; LD A,L CALL H2BCD ;A= LSD,++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKSTIM: ; ; STOP CLOCK ; CALL CLKSTOP ; ; SET UP TO SET EAC++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKCAL: ; ; WAIT FOR CLOCK DATA TO BE STABL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKTIM: ; ; WAIT FOR CLOCK TO STAB TELL CLOCK WHICH REGISTER TO READ ; LD A,C SET CLK_RD,A ;SET READ BIT OUT (CLK_CMD),A ; ; DELAY >= 5us PER DATA SHE AND A,CLK_DMSK CP A,B JR Z,CLKRWT ; ; DONE, RETURN 0 ; LD B,A XOR A,A RET ;++++++++++++++++++++++++++++++++ CLK_HOLD] OUT (CLK_DATA),A ; ; DELAY >= 150us FROM HOLD ; LD B,20 ;DELAY >= 150us FROM HOLD ; CLKSDL: EX (SP),HL ++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; GET2D: ; ; FETCH LOW DIGIT ; CALL GETD LD E,A ; ; FETCH  0 %+ &, !'- "(. #)/ $*0HIGH DIGIT ; INC C CALL GETD LD D,A ; ; PRESETUP FOR NEXT TIME ; INC C ; ; DONE ; RET ;+++++++++++++++IGIT ; TENSLP: ADD A,C DJNZ TENSLP ; ; DONE CONVERTING, RESTORE & RETURN ; NOTENS: POP BC ; RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLK_SET: ; ; OUTPUT DATA ; SET CLK_HOLD,A ;KEEP CLOCK STOPPED OUT (CLK_DATHL ; BIT 7,(HL) ;IF BIT 7 = 1 THEN STOP INC HL JR Z,PRTS ; ; DONE ; RET ;*********************************** LD A,E LD (IOPBPTR + 2),A ; ; FALL INTO DISK EXECUTER FUNCTION ; ;++++++++++++++++++++++++++++++++++++++++++++++++ ERROR ; ;**************************************************************************** ; ; ILLEGAL DRIVE REQUESTED ; EX,B CALL DASH1 ; CALL BLK ;DISPLAY S2BNK:S2ADR S2DTA POP AF EX (SP),HL PUSH AF LD DE,(A3_BNK) CALL LADR CALL B---------------------------------------- ; DISP: ; ; GET ARGUMENTS ; CALL EXLF ;GET BLOCK LIMITS ; ; TOP OF LINE L+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CONVERT BCD NUMBER TO BINARY FUNCTION ; ENTRY- E= LO BCD # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CONVERT BINARY NUMBER TO BCD DIGITS FUNCTION ; ENTRY- A= A),A ; ; OUTPUT REGISTER # ; LD A,C OUT (CLK_CMD),A ; ; STROBE DATA INTO REGISTER ; SET CLK_WRT,A OUT (CLK_CMD***************************************** ; ; SEND CHAR TO SYSTEM CONSOLE PROCEDURE ; ENTRY- C= CHAR ; ;*******************++++++++++++++++++++++++++++ ; ; EXECUTE THE DISK IOPB FUNCTION ; ENTRY- (IOPBPTR)= IOPB ADDRESS ; EXIT - AF= 0: NO ERRORS IT - AF= -2 ; (IOPB.PB_STAT)= ILLEGAL COMMAND ERROR ; ;*********************************************************************LK POP AF EX (SP),HL ; CALL HEX1 ;OUTPUT S2DTA ; CMPB: POP BC POP DE ; ; IF SRC == LAST THEN DONE ; CALL HILOOOP ; DIS1: ; ; DISPLAY START ADDRESS ; PUSH DE LD DE,(A1_BNK) CALL LADRB POP DE ; ; START DISPLAY ON PROPER  ; D= HI BCD # ; H= MASK FOR HI BYTE ; EXIT - A= NUMBER ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++BINARY DATA ; EXIT - A= UNITS DIGIT ; L= TENS DIGIT ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++),A ; LD A,C OUT (CLK_CMD),A ; ; DONE ; RET ;*************************************************************************************************************************** ; CO: XCROM MF_CO ; ; DONE ; RET END; ; A,BC,BC',HL,HL',DE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; DSKX: ; ; EXPR3 ;HL= SRC, DE= LAST, BC= SRC2 ; ; TOP OF VERIFY LOOP ; CMPA: PUSH DE ;SAVE LAST PUSH BC ;SWAP SRC & SRC2 PTRS XB RET C ; ; ELSE REPEAT ; JR CMPA ;---------------------------------------------------------------------------- COLUMN ; LD A,L ;SEE IF ON 16 BYTE BOUNDARY CALL TRPLSP ;SKIP OVER TO RIGHT COLUMN ; ; SAVE PTR FOR CHAR DISPLAY ; +++++++++++++ ; GETN: ; ; SAVE REGS ; PUSH BC ; ; FETCH LOW BYTE ; LD A,E AND A,CLK_DMSK LD C,A ; ; FETC++++++++ ; H2BCD: ; ; TENS = 0 ; LD L,0 ; ; IF UNITS < 10 THEN DONE ; H2BCDL: CP A,10 RET C ; ; ELSE UNIT********** ; ; PRTS ROUTINE OUTPUTS AN ASCII STRING ONTO THE CONSOLE. ; THE STRING MUST BE TERMINATED BY BIT 7 SET IN THE LACALL HTOA ; ; NEW LINE & RETURN ERROR ; CALL CRLF JP DSKERR ;+++++++++++++++++++++++++++++++++++++++++++++++++++++ FETCH DRIVE # ; LD HL,(IOPBPTR) INC HL LD A,(HL) ; ; IF JADE 8" FLOPPY THEN GO EXECUTE IT ; SUB A,4 JP C,JADE8 EX (SP),HL ; ; FETCH SRC2 DATA ; LD DE,(A3_BNK) CALL GETMEM LD C,A ; ; FETCH SRC1 DATA ; EX (SP),HL LD DE,; ; DISPLAY MEMORY COMMAND ; ; THIS ROUTINE DISPLAYS A BLOCK OF MEMORY ON THE CONSOLE DEVICE. THE ; USER MUST SPECIFY THE ST PUSH HL ; ; TOP OF HEX DISPLAY LOOP ; DIS2: ; ; DISPLAY MEMORY DATA IN HEX ; PUSH DE ;FETCH BANK # IN E LD DE,(H HIGH BYTE ; LD A,D ; ; MASK OFF NON-NUMERICAL BITS ; AND A,H ; ; MULTIPLY TENS DIGIT BY 10 & ADD TO UNITS ; LS -= 10 ; SUB A,10 INC L JR H2BCDL ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ST CHAR OF THE STRING. ; ENTRY- HL= TEXT PTR ; ;**************************************************************************** +++++++++++++++++++++++ ; ; EXECUTE IOPB FUNCTION 4 ; ENTRY- E:HL= IOPB PTR ; EXIT - IOPB.STATUS= 0: OK, /0: ERROR ; ;++++ ; ; ELSE IF SASI 8" HARD DISK THEN GO EXECUTE IT ; SUB A,4 JP C,ISHAX8 ; ; ELSE IF JADE 5" FLOPPY THEN GO EXECUTE (A1_BNK) CALL GETMEM LD B,A ;GET SOURCE 1 DATA ; ; IF SRC1 == SRC2 THEN EXIT ; LD A,C CP A,B ;IF S2=S1 THEN EXIT ART & FINISH ADDRESSES. THE DISPLAY IS ORGANIZED TO ; DISPLAY UP TO 16 BYTES PER DISPLAY LINE, WITH ALL COLUMNS ALIGNED SO EACHA1_BNK) CALL GETMEM ;FETCH DATA FROM E:HL TO A CALL HEX1 ;DISPLAY DATA IN A POP DE ; ; IF DONE THEN GO ON TO ASCII D B,A ;SET CNT LD A,C ;GET UNITS DIGIT JR Z,NOTENS ;IF (TENS & MASK) == 0 THEN RETURN UNITS ; LD C,10 ;ELSE ADD TENS D ; SET CLOCK DIGIT PROCEDURE ; ENTRY- A= BCD DATA ; C= COMMAND ; EXIT - A= COMMAND ; ;++++++++++++++++++++++++++++++++++++ ; PRTS: ; ; TOP OF PRINTING LOOP ; LD C,(HL) ;FETCH CHAR ; RES 7,C ;MAKE SURE BIT 7 = 0 PUSH HL CALL CO POP ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; EX_IOPB: ; ; SET IOPB PTR ; LD (IOPBPTR),HL IT ; SUB A,4 JP C,JADE5 ; ; ELSE IF SASI 5" THEN GO EXECUTE IT ; SUB A,4 JP C,ISHAX5 ; ; ELSE FALL INTO SELECT JR Z,CMPB ; ; ELSE DISPLAY SRC1 & SRC2 DATA ; PUSH AF ;SAVE S2 DATA ; CALL LADRB ;OUTPUT S1BNK:S1ADR S1DTA- LD A ; COLUMN HAS THE SAME LAST HEX DIGIT IN IT'S ADDR. ; ; D[ ] ; ;------------------------------------; CALL HILO ;INC & CHECK PTR JR C,DIS7 ;DONE IF CARRY ; ; NEXT COLUMN ; CALL BLK ;MAKE COLUMNS ; ; IF NOT ON E 0 %+ &, !'- "(. #)/ $*0;**************************************************************************** ; ; M5b Z-80 Banked Monitor External Interface Dtion definitions to add AUX & AUX2 devices & ; single, separate device driver and system function calls. ; ;****************TEM CONSOLE ; ; SYSTEM LIST DEVICE (PRINTER) FUNCTIONS ; MR_LOS EQU MR_BASE + 39 ;RETURN SYSTEM LIST DEVICE OUTPUT STATUS S MR_REST EQU MR_BASE + 48 ;RESTART ERROR ; ; ;****************************************************************************  BANK # IN A MF_BSEL EQU 9 ;SELECT BANK IN C ; MF_DVER EQU 16 ;RETURN DEBUGGER VERSION IN HL IN HUNDREDTHS (X.XX) MF_XDEB EQ38 ;RETURN STANDARD AUX DEVICE OUTPUT STATUS MF_AO EQU 39 ;SEND CHAR TO STANDARD AUX DEVICE MF_CIS EQU 40 ;RETURN SYSTEM CONSO ;TEST IOPB (E:HL) FOR ERROR & DISPLAY IOPB DATA IF TRUE MF_DIOB EQU 67 ;DISPLAY IOPB (E:HL) DATA ON SYSTEM CONSOLE MF_XIOB EQADDRESS FROM USER ; CALL EXPR1 ;GET ADDR CALL CRLF ;START ON NEW LINE POP HL ; ; TOP OF LOOP ; SUB1: ; ; DISPefinitions ; ;**************************************************************************** ; ; This file supplies the softwa************************************************************ ; ; ENTRY ADDRESSES ; MR_BASE EQU 0F800H ;BASE ADDRESS OF RO MR_LO EQU MR_BASE + 15 ;SEND CHAR IN C TO SYSTEM LIST DEVICE ; ; BANKED MEMORY MANAGEMENT ; MR_GMEM EQU MR_BASE + 21 ;RET ; ; MONITOR FUNCTION DEFINITIONS ; NOTE: ; ALL OTHER FUNCTION #S WILL RETURN -1 IN A (UNDEFINED FUNCTION ERROR) ; ;*****U 17 ;EXECUTE THE DEBUGGER (DOES NOT RETURN) MF_PHXN EQU 19 ;DISPLAY HEX NIBBLE IN C<3..0> ON SYSTEM CONSOLE MF_PHXB EQU 20 ;DLE INPUT STATUS IN A MF_CI EQU 41 ;RETURN NEXT SYSTEM CONSOLE CHAR IN A MF_COS EQU 42 ;RETURN SYSTEM CONSOLE OUTPUT STATUS IN U 68 ;EXECUTE IOPB (E:HL) ; MF_VVER EQU 80 ;RETURN MISC. DRIVER VERSION IN HL IN HUNDREDTHS (X.XX) MF_SCAL EQU 81 ;SET CLOCK LAY EXISTING CONTENTS ; LD DE,(A1_BNK) CALL GETMEM CALL DASH1 ; ; GET NEW VALUE FROM USER ; CALL PCHK ;GET NEW VAre interface definitions for the Vers. ; 1.22+ M5b Z-80 Banked Monitor ROMs. The definitions include the entry ; points at theM ; ; MONITOR FUNCTIONS ; MR_COLD EQU MR_BASE + 0 ;COLD RESET OF SYSTEM MR_FUN EQU MR_BASE + 6 ;EXECUTE FUNCTION IN A (SEURN BANKED MEMORY (E:HL) CONTENTS IN A MR_PMEM EQU MR_BASE + 24 ;STORE DATA IN C TO BANKED MEMORY (E:HL) MR_BSEL EQU MR_BASE +*********************************************************************** ; MF_VERS EQU 0 ;RETURN MONITOR VERSION IN HL IN HUNDRISPLAY HEX BYTE IN C ON SYSTEM CONSOLE MF_PHXW EQU 21 ;DISPLAY HEX WORD IN HL ON SYSTEM CONSOLE MF_PHXA EQU 22 ;DISPLAY HEX ADA MF_CO EQU 43 ;SEND CHAR IN C TO SYSTEM CONSOLE MF_LOS EQU 44 ;RETURN SYSTEM LIST DEVICE OUTPUT STATUS IN A MF_LO EQU 45 ;SECALENDAR MF_STIM EQU 82 ;SET CLOCK TIME MF_GCAL EQU 83 ;RETURN CLOCK CALENDAR MF_GTIM EQU 84 ;RETURN CLOCK TIME MF_GREG EQU LUE ; ; IF NONE THEN RETURN ; JP C,WINIT ;IF CHAR = CR THEN RETURN ; ; IF LAST CHAR == SPACE OR COMMA THEN SKIP STOR beginning of the ROM as well as the function arguments. The ; function argument definitions are explained in the ZBM-122.DOC fE FOLLOWING FOR #S) ; ; SYSTEM CONSOLE FUNCTIONS ; MR_CIS EQU MR_BASE + 18 ;RETURN SYSTEM CONSOLE INPUT STATUS MR_CI EQU  27 ;SELECT MEMORY BANK IN C MR_SBNK EQU MR_BASE + 30 ;SET SRC (B) & DEST (C) BANKS FOR BLOCK MOVE MR_BMOV EQU MR_BASE + 33 ;MEDTHS (X.XX) MF_GMEM EQU 1 ;RETURN BANKED MEMORY (E:HL) DATA IN A MF_PMEM EQU 2 ;STORE BANKED MEMORY (E:HL) DATA IN C MF_EXECDRESS IN E:HL ON SYSTEM CONSOLE MF_PUTS EQU 23 ;DIPLAY BIT-7 TERMINATED TEXT (HL) ON SYSTEM CONSOLE ; MF_CVER EQU 32 ;RETURN ND CHAR IN C TO SYSTEM LIST DEVICE MF_A2IS EQU 46 ;RETURN STANDARD AUX2 DEVICE INPUT STATUS MF_A2I EQU 47 ;RETURN STANDARD AUX85 ;RETURN CLOCK REGISTER DATA MF_CSYN EQU 86 ;WAIT FOR CLOCK SYNC/TEST BOARD PRESENCE MF_STPC EQU 88 ;STOP CLOCK MF_STC EQU E ; JR Z,SUB2 ;IF CHAR = ' ' OR ',' THEN EXIT ; ; ELSE IF LAST CHAR == LINE FEED THEN BACK UP ; CP A,LF ;IF CHAR = Lile. ; ;**************************************************************************** ; ; Revision History: ; ; 1.00 11-26-MR_BASE + 3 ;RETURN NEXT SYSTEM CONSOLE CHAR IN A MR_COS EQU MR_BASE + 12 ;RETURN SYSTEM CONSOLE OUTPUT STATUS IN A MR_CO EQU OVE DATA (BC= CNT) FROM SRC (HL) TO ; DEST (DE) BANKS MR_EXEC EQU MR_BASE + 36 ;EXECUTE PROGRAM (E:HL) IN ANOTHER BANK ;  EQU 3 ;EXECUTE PROCEDURE IN ANOTHER BANK (E:HL) MF_SBNK EQU 4 ;SELECT SRC (B) & DEST (C) BANKS FOR BLOCK MOVE MF_BMOV EQU 5 ;CHAR I/O VERSION IN HL IN HUNDREDTHS (X.XX) MF_XDFUN EQU 33 ;EXECUTE CHAR DEVICE DRIVER FUNCTION MF_SDEV EQU 35 ;SET STANDARD 2 DEVICE INPUT CHAR MF_A2OS EQU 48 ;RETURN STANDARD AUX2 DEVICE OUTPUT STATUS MF_A2O EQU 49 ;SEND CHAR TO STANDARD AUX2 DEVICE89 ;START CLOCK F THEN BACK UP JR Z,SUB3 ; ; ELSE GET & STORE VALUE ; PUSH HL ;PTR CALL EXF ;CONTINUE HEX INPUT POP DE ;NEW VALU90 grh ; First cut. ; ; 1.01 1-13-91 GRH ; Change clock function definitions for set clock. ; Change character i/o funcMR_BASE + 9 ;SEND CHAR IN C TO SYSTEM CONSOLE MR_PUTS EQU MR_BASE + 51 ;DISPLAY BIT-7 TERMINATED CHAR STRING (HL) ON ; SYS ; DEBUGGER SUPPORT ; MR_BRK EQU MR_BASE + 42 ;DEBUGGER BREAKPOINT ENTRY MR_GOTO EQU MR_BASE + 45 ;DEBUGGER INTERNAL PROCESMOVE N (BC) BYTES FROM SRC (HL) TO DEST (DE) BANKS MF_SELP EQU 6 ;SELECT NEW SS100 BUS PROCESSOR MF_GBNK EQU 7 ;RETURN CURRENTDEVICE MF_AIS EQU 36 ;RETURN STANDARD AUX DEVICE INPUT STATUS MF_AI EQU 37 ;RETURN STANDARD AUX DEVICE INPUT CHAR MF_AOS EQU  ; MF_KVER EQU 64 ;RETURN DISK DRIVER VERSION IN HL IN HUNDREDTHS (X.XX) MF_BOOT EQU 65 ;BOOT FROM DISK IN BC MF_TIOB EQU 66LTER IT. ; ; S ; ;---------------------------------------------------------------------------- ; SUBS: ; ; GET E POP HL ;PTR ; PUSH BC LD C,E LD DE,(A1_BNK) CALL PUTMEM ;LOAD VALUE ; POP BC ; ; IF LAST CHAR == CR THEN D 0 %+ &, !'- "(. #)/ $*0 TITLE M5b Z-80 DEBUGGER ROM LIST NOCOND ;**************************************************************************** ; ;  - 29 SEP 85 GRH ; Fix bug in Input command which caused monitor to crash. ; The jump to 'BITS2' expects DE to be on stack************************************************************************** FORM FALSE EQU 0 TRUE EQU NOT FALSE ; ; INC FOR USE DURING AN INTERRUPT WITHOUT THE ; RESIDENT ROM ENABLED. USE IN ALL NON-RESIDENT ROMS. ; ENTRY- A= FUNCTION # ; ;+++ALT ; HALT SUBTTL MONITOR BOARD SHADOW ROM SELECTION PROCEDURE *INCLUDE XROM.Z80 SUBTTL INITIALIZATION CODE ;####ES WITH 0 (LAST BYTE OF EXIT ROUTINE ; LD BC,[NBKPTS * BP_REC] - 1 LD HL,TLOC LD (HL),0 PUSH HL POP DE INC DE LDI ; 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 ; ; REXA ;6: DISPLAY HEX ADDRESS ON CONSOLE DW PRTS ;7: DISPLAY BIT7 TERMINATED TEXT ON CONSOLE ; MAXFUNS EQU ($ - FUNTABL) / 2 SYSTEM MONITOR FOR M5b ; (c) 1982,1983 GRH ELECTRONICS, CUPERTINO, CA ; ;***************************************************. ; 1.10- 8 FEB 87 GRH ; Fix bug in register restore routine which caused IX & IY to be ; swapped prior to GOTO. ; 1.20 2LUDE SYSTEM DEFINITION FILES ; ;*MACLIB ASMBTOOL.MLB ;*INCLUDE MONBOARD.DEF ;*INCLUDE ZBMFUNS.DEF ;*INCLUDE COMIOPB2.DEF ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; I_STUB: ADD A,2 ;BIAS UP PUSH HL LD H,MR_RN######################################################################## ; ; SIGN-ON ; ;####################################R ; ; INITIALIZE REGISTER IMAGES TO 0 ; LD HL,RLOC LD B,BNKLOC - RLOC + 1 ; INIT2: LD (HL),C ;C HAS 0 FROM LAST LDIRSTORE ARGUMENT & PUT EXECUTION ADDRESS ON STACK EX (SP),HL ; ; RETURN TO EXECUTION ADDRESS ; RET ; ; ; FUNCTION ER SUBTTL DEBUGGER FUNCTIONS ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN VERSIO************************* ; ; This Monitor program resides at the top of memory & allows memory ; modification & testing, pro9 DEC 88 GRH ; Add banked memory support: ; 1. Page 0 initialization. ; 2. Init bank register to bank 0F8H. ; 1.21 27  LIST OFF *MACLIB ASMBTOOL.MLB *INCLUDE MONBOARD.DEF *INCLUDE ZBMFUNS.DEF *INCLUDE COMIOPB2.DEF LIST ON *INCLUDE ZBMG1UM ;USE RESIDENT ROM LD L,A EX (SP),HL CALL XROMF ;GO EXECUTE THE FUNCTION INC SP ;BALANCE STACK INC SP RET ;######################################## ; LOGMSG: DB CR,LF,' 65K Banked Debugger V. ' PVERS VERSN DM CR,LF ;-------- FINISH INC HL DJNZ INIT2 ; ; NOW CHANGE SP & PC TO 0100H ; LD HL,0100H LD (PLOC),HL LD (SLOC),HL ; ; DONE ;ROR ; MFUNERR: LD A,-1 OR A,A RET ;############################################################################ ; N FUNCTION ; EXIT - HL= VERSION # (123D = 1.23) ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++gram breakpoints, console, printer, punch & ; reader I/O drivers and transfer to system boot ROM residing in same memory ; areJAN 89 GRH ; Add new monitor function routines. ; ; 1.22 11-22-90 GRH ; Move code to separate ROM in order to gain space22.DEF THIS_ROM EQU DEB_RNUM ;ROM # OF THIS ROM RESTNT EQU 0F82AH ;BREAKPOINT ENTRY LOCATION IN RESIDENT ROM SUBTTL E**************************************************************************** ; ; COLD INIT ONLY SWITCHES TO RESIDENT ROM ; ;-------------------------------------------------------------------- ; ; THIS IS THE COLD START INIT CODE ; ;--------------- RET SUBTTL MONITOR FUNCTION CALL DISPATCHER ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; MONITOR FUNCTION TABLE ; ;############################################################################ ; FUNTABL: DW RE++ ; RETVERS: LD HL,VERSN RET ;**************************************************************************** ; ; PRTa as this ROM. ; *INCLUDE ZBMH122.HDR ;**************************************************************************** ; ; Rev for I/O drivers and ; interrupt code. ; Add rom xover function as include file. ; Add function dispatcher for execution andXTERNAL ENTRY POINTS ORG MONROM ; JP CINIT ;COLD START ; ; EXTERNAL FUNCTION ENTRY DURING INTERRUPT ; DS (MONROM + **************************************************************************** ; CINIT: ; ; SET STACK ; LD SP,MONSTK ; ------------------------------------------------------------- ; ROM_INIT: ; ; SET MONITOR COMMAND ARGUMENT DEFAULTS ; L+ ; ; ENTRY- A= FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; FUNCH: CP ATVERS ;0: RETURN MONITOR ROM VERSION DW DEBUG ;1: EXECUTE THE DEBUGGER DW REST ;2: BREAKPOINT CONTINUE DW PUTHXN ;3: DS ROUTINE OUTPUTS AN ASCII STRING ONTO THE CONSOLE. ; THE STRING MUST BE TERMINATED BY BIT 7 SET IN THE LAST CHAR OF THE STRINision status: ; ; 1.0 - Release ; 1.3 - 17 MAR 84 GRH ; Change to allow Boot command parameter passing to boot ROM. ; 1.5 breakpoint entries. ; Add disk read, write, & logon commands ; 1-13-91 grh ; Add clock set command. ; VERSN EQU 122 ;**6) - $ JP I_STUB ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXTERNAL FUNCTION STUB; RESET ROM FUNCTION SHOULD NOT RETURN ; LD HL,[MR_RNUM SHL 8] + 1 ;RESET PUSH HL CALL XROMF ; ; IF RETURNED THEN HD A,DEFBNK LD HL,A1_BNK LD (ARGPTR),HL LD (HL),A INC HL LD (HL),A INC HL LD (HL),A ; ; FILL BREAKPOINT ADDRESS,MAXFUNS JR NC,MFUNERR ; ; FUNCTION SEEMS LEGAL, FETCH EXECUTION ADDRESS FROM TABLE ; PUSH HL ;SAVE POSSIBLE ARGUMENT ISPLAY HEX NIBBLE ON CONSOLE DW PUTHXB ;4: DISPLAY HEX BYTE ON CONSOLE DW PUTHXW ;5: DISPLAY HEX WORD ON CONSOLE DW PUTHG. ; ENTRY- HL= TEXT PTR ; ;**************************************************************************** ; PRTS: ; ; SA 0 %+ &, !'- "(. #)/ $*0VE REGISTER ; PUSH BC ; ; TOP OF PRINTING LOOP ; PRTA: LD C,(HL) ;FETCH CHAR ; RES 7,C ;MAKE SURE BIT 7 = 0 CALLEX WORD ON SYSTEM CONSOLE PROCEDURE ; ENTRY- HL= BYTE TO DISPLAY ; ;********************************************************* ; ;**************************************************************************** ; ; DISPLAY NIBBLE ON SYSTEM CONSOLE ; CAL STACK TO THE GLOBAL RAM ; LD SP,MONSTK ; ; PUT THE RETURN ON THE STACK FOR COMMANDS WHICH ARE SUBROUTINES ; LD HL,UMENTS TO COMMAND ; JP (HL) ;EXECUTE THE COMMAND ;--------------------------------------------------------------------- DEFAULT ; CALL PCHK ;IF NO FURTHER INPUT THEN USE DEFAULT JR C,BOOTCD ; ; ELSE GET USER ARG ; CALL EXF ;GET USER  MEMORY COMMAND ; ; THIS ROUTINE FILLS A BLOCK OF MEMORY WITH A USER DEFINED CONSTANT. IT ; EXPECTS 3 PARAMETERS TO BE ENTERE ; FILNO: POP DE ; ; IF NOT LAST LOCATION THEN REPEAT ; CALL HILO JR NC,FIO ; ; ELSE DONE ; JP WINIT ;--- CO ; BIT 7,(HL) ;IF BIT 7 = 1 THEN STOP INC HL JR Z,PRTA ; ; RESTORE & RETURN ; POP BC RET ;******************************** ; PUTHXW: ; ; SAVE LOW NIBBLE ; PUSH HL ; ; DO HIGH BYTE 1ST ; LD C,H CALL PUTHXB ; ; ENTRY- C<3..0>= NIBBLE ; EXIT - A= C= ? ; ;**************************************************************************** ; PWINIT PUSH HL ; ; INIT BREAKPOINT VECTOR ; LD A,0C3H LD HL,RESTNT ;RESIDENT ROM ENTRY VECTOR LD (BP_RSTV),A LD (------- ; ; PRINT COMMAND ERROR MESSAGE & RETURN TO COMMAND INPUT ; ;-------------------------------------------------------BOOT # POP BC ; JR BOOTCC ; ; ; SPECIAL DISK BOOT CODE SWAPS ROMS FOR BOOT. ; IF BOOT SUCCESSFUL, DOES NOT RETURN. ;D IN THE FOLLOWING ORDER: ; START ADDR, FINISH ADDR, FILL VALUE ; ; F ; ;------------------------------------------------------------------------------------- ; ; VERIFY MEMORY COMMAND ; ; THIS ROUTINE COMPARE*************************************************************** ; ; DISPLAY ADDRESS PROCEDURE ; ENTRY- E:HL= ADDRESS VALUE TONOW DO LOW NIBBLE ; POP HL LD C,L ; ; FALL INTO BYTE OUTPUT ; ;**************************************************UTHXN: LD A,C AND A,0FH ADD A,90H ;PUT INTO ASCII ZONE DAA ;AH, THE UBIQUITOUS DAA CONVERT ADC A,40H DAA LD C,ABP_RSTV +1),HL ; ; SET DEFAULT BANK ; LD C,DEFBNK XRROM 9 ; ; GET COMMAND FROM USER ; CALL CRLF CALL DECHO ; --------------------- ; QPRT: ; ; DISPLAY ERROR PROMPT ; LD HL,QMSG CALL PRTWA ; ; EXECUTE WARM RESTART ; JR W IF UNSUCCESSFUL, RETURNS CARRY IF ERROR, NO CARRY IF DISK NOT INSERTED. ; BOOTCD: LD C,DK_RNUM ;PASS IN DEFAULT BOOT ROM ADDR---------------------------------------------------------------- ; FILL: ; ; GET 3 ARGUMENTS ; CALL EXPR3 ;HL= PTR, DES 2 BLOCKS OF MEMORY AGAINST EACH OTHER. IF A ; DIFFERENCE IN THE RELATIVE ADDRESS CONTENTS IS DETECTED, THE ADDRESS OF THE ;  DISPLAY ; ;**************************************************************************** ; PUTHXA: ; ; DISPLAY BANK # ;************************** ; ; DISPLAY HEX BYTE ON SYSTEM CONSOLE PROCEDURE ; ENTRY- C= BYTE TO DISPLAY ; ;**************** JP CO SUBTTL DEBUGGER COMMAND INPUT ;---------------------------------------------------------------------------- ;  ; IF COMMAND NOT ALPHA THEN ERROR ; SUB A,'A' JR C,QPRT ; CP A,'Z' - 'A' + 1 JR NC,QPRT ; ; USE COMMAND CHAR ASINIT SUBTTL COMMANDS ;---------------------------------------------------------------------------- ; ; BOOT COMMAND ;  ; BOOTCC: LD L,1 + 2 ;SET BOOT FUNCTION # LD A,C ;BITS 2..0 = ROM # AND A,7 ;MASK OFF EXTRANEOUS BITS & CLEAR ERROR FL= LAST ADDR, BC= VALUE ; ; TOP OF FILL LOOP ; FIO: PUSH DE LD DE,(A1_BNK) ; ; IF IN PROTECTED AREA THEN IGNORE ; 1ST BLOCK IS DISPLAYED, ALONG WITH IT'S CONTENTS & THE CONTENTS OF THE ; OTHER BLOCK'S SAME RELATIVE ADDRESS. ; ; V ; ARG :: 0..FH (PASSED TO BOOT ROM) ; PROM # :: 0..7 (DEFAULAG ; LD H,A PUSH HL CALL XROMF INC SP INC SP ; ; IF RETURNED THEN MUST BE ERROR ; LD HL,BOOTEM CALL C,PRTWD  LD A,H ;IF IN MONITOR RAM THEN IGNORE CP A,HIGH MONSTK JR NC,FILNO ; OR A,A ;ELSE IF NOT IN PAGE 0 THEN OK JP NZ,FITART> ; ;-------------------------------------------------------------------------- FALL INTO HEX WORD OUTPUT ; ;**************************************************************************** ; ; DISPLAY HBBLE 1ST ; RRC C RRC C RRC C RRC C CALL PUTHXN ; ; NOW DO LOW NIBBLE ; POP BC ; ; FALL INTO NIBBLE OUTPUT SIGN-ON MESSAGE ; LD HL,LOGMSG ;OUTPUT SIGN-ON CALL PRTS ; ; WARM RESTART ENTRY ; WINIT: ; ; FIRST RESTORE THE LO(TABLE + OFFSET) ADD HL,DE ; LD A,(HL) ;FETCH ADDRESS INC HL LD H,(HL) LD L,A ; LD B,2 ;PASS IN DEFAULT OF 2 ARGT # = 02H) ; ;---------------------------------------------------------------------------- BOOTC: ; ; IF NO ARGS THEN USE ; JR WINIT ;GO TO MONITOR EXEC ;---------------------------------------------------------------------------- ; ; FILLLYES ; LD A,L ;ELSE IF IN 1ST 40H BYTES THEN IGNORE CP A,40H JR C,FILNO ; FILYES: CALL PUTMEM ;STORE THE FILL VALUE-- ; COMP: ; ; GET 3 ARGUMENTS FROM USER ; CALL EXPR3 ;HL= SRC, DE= LAST, BC= SRC2 ; ; TOP OF VERIFY LOOP ; CMPA 0 %+ &, !'- "(. #)/ $*0: PUSH DE ;SAVE LAST PUSH BC ;SWAP SRC & SRC2 PTRS EX (SP),HL ; ; FETCH SRC2 DATA ; LD DE,(A3_BNK) CALL GETMEM ------------------------------------------------------- ; ; DISPLAY MEMORY COMMAND ; ; THIS ROUTINE DISPLAYS A BLOCK OF MEMOER TO RIGHT COLUMN ; ; SAVE PTR FOR CHAR DISPLAY ; PUSH HL ; ; TOP OF HEX DISPLAY LOOP ; DIS2: ; ; DISPLAY MEMOBANK IN E LD DE,(A1_BNK) CALL GETMEM ;FETCH DATA POP DE ; AND A,7FH ;IF PRINTABLE THEN OUTPUT LD C,A CP A,' ' JY CONSOLE ; INPUT TO BREAKPONT THE RUN, AS LONG AS INTERRUPT 1 IS ACTIVE. ; ; G ;START EXECUTION AT WHATEVER IS IN PC RL EXF POP DE ; LD (PLOC),DE ;PUT ADDR IN PC LOCATION LD A,(A1_BNK) LD (BNKLOC),A ; ; IF LAST CHAR == CR THEN NO MO TABLE ; PUSH HL ;SAVE REGS NEEDED FOR GETMEM & PUTMEM EX DE,HL ;HL= PTR ; LD E,A ;E= BANK # CALL GETMEM PUSH AF LD HL,BP_RSTV LD DE,(BNKLOC) LD C,0C3H CALL PUTMEM INC HL LD C,LOW REST CALL PUTMEM INC HL LD C,HIGH REST CALL LD C,A ; ; FETCH SRC1 DATA ; EX (SP),HL LD DE,(A1_BNK) CALL GETMEM LD B,A ;GET SOURCE 1 DATA ; ; IF SRC1 == RY ON THE CONSOLE DEVICE. THE ; USER MUST SPECIFY THE START & FINISH ADDRESSES. THE DISPLAY IS ORGANIZED TO ; DISPLAY UP TO 16RY DATA IN HEX ; PUSH DE ;FETCH BANK # IN E LD DE,(A1_BNK) CALL GETMEM ;FETCH DATA FROM E:HL TO A CALL HEX1 ;DISPLAYR C,DIS5 ; CP A,7EH JR C,DIS6 ; DIS5: LD C,'.' ;ELSE OUTPUT '.' ; DIS6: CALL CO ; ; IF DONE THEN ABORT ; CALL HEG (NO BPS) ; G ;START EXECUTION AT START_ADDR (NO BPS) ; G,[,] ;START EXECUTION AT START_RE ARGS ; LD A,C ;IF LAST = CR THEN EXIT CP A,CR JR Z,GO3 ; ; GET & SET UP TO NBKPTS BREAKPOINTS ; GO0: LD B,NBKPT ;SAVE DATA ; ; SET BREAKPOINT TO RESTART INSTRUCTION WHILE HERE ; PUSH BC ;SAVE LAST CHAR IN C LD C,BP_RSTI CALL PU PUTMEM ; ; THE FOLLOWING CODE RESTORES THE Z80 REGISTERS & EXECUTES THE 'PC' ; ; FIRST RESTORE THE Z80 ALTERNATE REGISTSRC2 THEN EXIT ; LD A,C CP A,B ;IF S2=S1 THEN EXIT JR Z,CMPB ; ; ELSE DISPLAY SRC1 & SRC2 DATA ; PUSH AF ;SAVE S BYTES PER DISPLAY LINE, WITH ALL COLUMNS ALIGNED SO EACH ; COLUMN HAS THE SAME LAST HEX DIGIT IN IT'S ADDR. ; ; D[,] ;START EXECUTION AT PC VALUE WITH BREAKPOINTS LD HL,TLOC ;POINT TO TRAP STORAGE ; GO1: PUSH BC ;SAVE BREAKPOINTS REMAINING ; ; GET BREAKPOINT FROM USER ; PUSH TMEM POP BC ; POP AF ;RESTORE DATA EX DE,HL ;DE= PTR POP HL ;HL= RECORD.DATA PTR ; LD (HL),A ;STORE DATA INTO TAERS ; LD HL,(FPLOC) PUSH HL POP AF ; LD BC,(CPLOC) LD DE,(EPLOC) LD HL,(LPLOC) EX AF,AF' EXX ; ; NOW DO TH2 DATA ; CALL LADRB ;OUTPUT S1BNK:S1ADR S1DTA- LD A,B CALL DASH1 ; CALL BLK ;DISPLAY S2BNK:S2ADR S2DTA POP AF ER>[ ] ; ;---------------------------------------------------------------------------- ; DISP: ; ; GET ARGUMENTT COLUMN ; CALL BLK ;MAKE COLUMNS ; ; IF NOT ON EVEN 16 BYTE BOUNDARY THEN REPEAT ; LD A,L ;READY FOR NEW LINE? ANE ; JR DIS1 ; ; ; PARTIAL HEX LINE, START ASCII ON PROPER COLUMN ; DIS7: SUB A,E ;SKIP OVER TO START ASCII CALL TRP(S) AT ; BP1 & OPTIONAL BP2. ; ;---------------------------------------------------------------------------- ; GOTO: ; HL ;STORAGE PTR LD B,2 CALL EXPR1 POP DE ;GET TRAP ADDR POP HL ;SPTR ; ; IF BREAKPOINT == 0 (NONE) THEN STOP ; BLE INC HL ;NEXT TABLE RECORD ; ; IF NO MORE ARGS THEN DONE WITH BREAKPOINTS ; GO2: LD A,C CP A,CR POP BC ;BP COUNE Z80 & 8080 REGISTERS ; LD IY,(YLOC) LD IX,(XLOC) ; LD DE,(ELOC) LD BC,(CLOC) ; ; DO STACK ; LD SP,(SLOC) ; X (SP),HL PUSH AF LD DE,(A3_BNK) CALL LADR CALL BLK POP AF EX (SP),HL ; CALL HEX1 ;OUTPUT S2DTA ; CMPB: POP BCS ; CALL EXLF ;GET BLOCK LIMITS ; ; TOP OF LINE LOOP ; DIS1: ; ; DISPLAY START ADDRESS ; PUSH DE LD DE,(A1_BND A,0FH JR NZ,DIS2 ; ; DONE WITH HEX DISPLAY, DO ASCII ; DIS3: ; ; RESTORE PTR ; POP HL ; ; POSITION START ONLSP JR DIS3 ;---------------------------------------------------------------------------- ; ; GOTO COMMAND ; ; GOTO C ; IF NO ARGS THEN USE CURRENT REGISTERS ; CALL PCHK JR C,GO3 ; ; IF NO GOTO ADDRESS THEN SET BREAKPOINTS ; JR Z,G LD A,(A1_BNK) ;INSURE 0 WASN'T SPEC'D OR A,D OR A,E JR Z,GO2 ; ; ELSE STORE BREAKPOINT ADDRESS IN TABLE ; LD (HL),T JR Z,GO3 ; ; IF MORE ALLOWED THEN CONTINUE ; DJNZ GO1 ; ; GOT ALL ARGS, EXECTUTE THE GOTO ; GO3: CALL CRLF ;; PUSH PC ON STACK FOR RETURN INSTRUCTION TO EXECUTE ; LD BC,(BNKLOC) XRROM 9 ; LD HL,(PLOC) PUSH HL ; XRROM 8 ; POP DE ; ; IF SRC == LAST THEN DONE ; CALL HILOXB RET C ; ; ELSE REPEAT ; JR CMPA ;---------------------K) CALL LADRB POP DE ; ; START DISPLAY ON PROPER COLUMN ; LD A,L ;SEE IF ON 16 BYTE BOUNDARY CALL TRPLSP ;SKIP OV PROPER COLUMN ; LD A,L ;SKIP OVER TO RIGHT SPACE AND A,0FH CALL TRPL2 ; ; DISPLAY CHAR ; DIS4: PUSH DE ;FETCH OMMAND TRANSFERS CONTROL TO A SPECIFIED ADDRESS IT ALLOWS THE ; SELECTIVE SETTING OF UP TO 2 BREAKPOINTS AS WELL AS ALLOWING ANO0 ; ; FETCH NEW GOTO ADDRESS & PUT INTO 'PC' REGISTER ; PUSH AF ;PRESET BANK # LD A,(BNKLOC) LD (A1_BNK),A ; CALE ;SAVE BP ADDR INC HL ; LD (HL),D INC HL ; LD A,(A1_BNK) LD (HL),A INC HL ; ; SAVE EXISTING LOCATION DATA INNEW LINE FOR PGM ; POP HL ;GET RID OF WINIT RETURN ADDRESS ; ; INSERT RESTART BREAKPOINT VECTOR TO RESTORE ROUTINE ;  ; IF RETURNED THEN ERROR ; JP WINIT ;---------------------------------------------------------------------------- ; 0 %+ &, !'- "(. #)/ $*0 ; INPUT FROM PORT COMMAND ; ; THESE ROUTINES ALLOW BYTE-BY-BYTE INPUT OR OUTPUT FROM THE CURRENT ; CONSOLE DEVICE. ; ; IUT TO PORT ; OUT (C),E ; ; DONE ; JP WINIT ;--------------------------------------------------------------------- LD C,A ; ; IF DESTINATION == PROTECTED THEN IGNORE ; LD A,H ;IF IN MONITOR RAM THEN IGNORE CP A,HIGH MONSTK JR NC,TERING A SPACE, COMMA OR RETURN. IF A RETURN IS ; ENTERED, THE ROUTINE IS TERMINATED. IF A SPACE OR COMMA IS ENTERED, THE ; ROEXIT ; ; ELSE IF LAST CHAR == LINE FEED THEN BACK UP ; CP A,LF ;IF CHAR = LF THEN BACK UP JR Z,SUB3 ; ; ELSE GET &STS A SPECIFIED BLOCK OF MEMORY TO SEE IF ANY HARD ; DATA BIT FAILURES EXIST. IT IS NOT AN EXHAUSTIVE TEST, BUT JUST A QUICK ; ; ; IF NOT DONE THEN REPEAT ; CALL HILOX JR NC,MTEST1 ; ; DONE ; JP WINIT ;-------------------------------IF AT END OF TABLE THEN DONE ; INC (HL) ;DOES NOT CHANGE IN ROM VERSION RET Z ; ; MAKE USER REQUEST BIT 7 SAME AS TABL ; ;---------------------------------------------------------------------------- ; INPT: ; ; GET PORT ARG F------- ; ; MOVE COMMAND ; ; THIS ROUTINE EXPECTS 3 PARAMETERS, ENTERED IN THE FOLLOWING SEQUENCE: ; SOURCE 1ST BYTE ADDR, MOVNO ; OR A,A ;ELSE IF NOT PAGE 0 THEN OK JP NZ,MOVYES ; LD A,L ;ELSE IF IN 1ST 40H BYTES THEN IGNORE CP A,40H JRUTINE PROCEEDS TO THE NEXT LOCATION & PRESENTS THE USER WITH AN ; OPPORTUNITY TO ALTER IT. ; ; S ; ;---------------- STORE VALUE ; PUSH HL ;PTR CALL EXF ;CONTINUE HEX INPUT POP DE ;NEW VALUE POP HL ;PTR ; PUSH BC LD C,E LD D INDICATION OF THE MEMORY'S OPERATIVENESS. ; ; T ; ;--------------------------------------------------------------------------------------------- ; ; EXAMINE REGISTERS COMMAND ; INSPECTS THE VALUES OF THE REGISTERS STORED BY E'S ; JP P,XAB ;SORT OUT BIT 7 OF TABLE OR A,80H ;SET IT ON TEST VALUE JR XAC ; XAB: AND A,7FH ;RESET BIT 7 ; ; ROM USER ; CALL EXPR1 ;GET INPUT PORT # INTO C CALL CRLF ;PUT DATA ON NEW LINE POP BC ; ; FETCH PORT DATA ; IN ESOURCE LAST BYTE ADDR & DESTINATION 1ST BYTE ADDR. ; ; M ; ;-------------------- C,MOVNO ; MOVYES: CALL PUTMEM ; MOVNO: EX (SP),HL ;HL= SRC PTR POP BC ;BC= DEST PTR POP DE ;DE= LAST PTR ; ; ------------------------------------------------------------ ; SUBS: ; ; GET ADDRESS FROM USER ; CALL EXPR1 ;GET ADDR E,(A1_BNK) CALL PUTMEM ;LOAD VALUE ; POP BC ; ; IF LAST CHAR == CR THEN DONE ; LD A,C ;IF DELIM = CR THEN DONE C---------------------------- ; MTEST: ; ; GET ARGS FROM USER ; CALL EXLF ;HL= START, DE= LAST ; ; TOP OF LOOP ; THE LAST ENCOUNTERED ; BREAKPOINT. THE VALUES MAY BE MODIFIED IF DESIRED. ; ; X ;DISPLAY ALL REGISTER VALUES ; ; USER REQUESTED REGISTER SHOULD MATCH NOW ; XAC: ; ; IF CHAR NOT MATCH THEN EXIT ; CP A,(HL) JR NZ,XAA ;NO MATCH, T,(C) JP BITS2 ;OUTPUT VALUE ;---------------------------------------------------------------------------- ; ; OUTPUT D-------------------------------------------------------- ; MOVE: ; ; GET ARGS FROM USER ; CALL EXPR3 ;HL= SRC, DE= SRC NEXT, IF SRC <= LAST THEN REPEAT ; CALL HILOXB JR NC,MOV1 ; ; ELSE DONE ; JP WINIT ;-------------------------- CALL CRLF ;START ON NEW LINE POP HL ; ; TOP OF LOOP ; SUB1: ; ; DISPLAY EXISTING CONTENTS ; LD DE,(A1_BNK) CP A,CR JP Z,WINIT ; ; NEXT LOCATION ; SUB2: INC HL ;PTR = PTR + 2 INC HL ; ; PREVIOUS LOCATION ; SUB3: DEC HL MTEST1: PUSH DE LD DE,(A1_BNK) CALL GETMEM ;FETCH DATA PUSH AF ;SAVE IT CPL ;INVERT BITS LD C,A CALL PUTMEM ;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 ; ;-------------RY AGAIN ; ; CHARS MATCH, SET UP TO DISPLAY CURRENT DATA ; CALL BLK CALL PRTVAL CALL DASH ; ; GET USER DATA ; ATA TO PORT COMMAND ; ; O ; ;----------------------------------------------------------------_LAST, BC= DEST ; ; TOP OF MOVE LOOP ; MOV1: ; ; MOVE 1 BYTE OF DATA ; PUSH DE ;SAVE LAST PTR PUSH BC ;SAVE DES-------------------------------------------------- ; ; SUBSTITUTE MEMORY COMMAND ; ; THIS ROUTINE ALLOWS THE USER TO INSPECTALL GETMEM CALL DASH1 ; ; GET NEW VALUE FROM USER ; CALL PCHK ;GET NEW VALUE ; ; IF NONE THEN RETURN ; JP C,WIN;PTR = PTR - 1 ; ; IF ON MODULO 8 BOUNDARY, START ON NEW LINE & DISPLAY ADDRESS ; LD A,L AND A,7 CALL Z,LADRB ; ;  ; TEST BY XORING WITH DATA, RESULT SHOULD BE 0 ; CALL GETMEM XOR A,C ; ; IF NOT 0 THEN DISPLAY DATA ('1' BIT IS ERR--------------------------------------------------------------- ; ; CHARS NOT MATCH, TRY NEXT TABLE ENTRY ; XAA: INC HL CALL PCHK ; ; IF USER ENTERED CR THEN DONE ; RET C ; ; IF NO CHANGE THEN EXIT ; JR Z,XF ; ; GET NEW DATA FROM ------------ ; OUPT: ; ; GET ARGS FROM USER ; CALL EXPR ;GET DATA INTO E, PORT # INTO C POP DE POP BC ; ; OUTPT PTR ; LD DE,(A1_BNK) ;FETCH SRC DATA CALL GETMEM ; EX (SP),HL ;HL= DEST PTR LD DE,(A3_BNK) ;STORE SRC DATA IN DEST  ANY MEMORY LOCATION & ALTER ; THE CONTENTS, IF DESIRED & IF THE ADDRESS IS IN RAM. THE CONTENTS MAY BE ; LEFT UNALTERED BY ENIT ;IF CHAR = CR THEN RETURN ; ; IF LAST CHAR == SPACE OR COMMA THEN SKIP STORE ; JR Z,SUB2 ;IF CHAR = ' ' OR ',' THEN  CONTINUE ; JR SUB1 ;---------------------------------------------------------------------------- ; ; MTEST COMMAND TEOR) ; CALL NZ,BITS ;LOG ERR IF NOT ; ; RESTORE DATA IN MEMORY ; POP AF ;RESTORE BYTE LD C,A CALL PUTMEM POP DE ;SKIP OVER TO NEXT ENTRY INC HL ; ; ; CONTINUATION FROM USER INPUT ; ENTRY- A= REGISTER REQUESTED CHAR ; XA: ; ; USER ; PUSH HL ;PTR CALL EXF POP HL ;HL= DATA ; ; PREFETCH DATA IN A ; LD A,L ; ; IF BYTE REGISTER THEN GO D 0 %+ &, !'- "(. #)/ $*0O BYTE STORE ; EX (SP),HL ;HL= ATTRIBUTE PTR BIT 7,(HL) JR Z,XBREG ; ; ELSE IF WORD REGISTER THEN GO DO WORD STORE A,C ;IF LAST = CR THEN RETURN CP A,CR RET Z ; ;-------------------------------------------------------------------------- XG: LD A,(HL) ;FETCH TABLE ENTRY LD C,A ; ; IF AT END OF TABLE THEN DONE ; INC A ;IF AT END OF TABLE THEN RETURN OPB + PB_CMDO),A ; ; SET NO DOWNLOAD ; LD HL,0 ;XFER COUNT = 0 ; LD A,L ;ENABLE READ XFER ; ; GO TO COMMON CODE  ; LOGON DISK SECTOR COMMAND ;RB:A D:T S ; WHERE: B= ID SECTOR DATA LOAD ADDRESS BANK ; A= ID SECTOR DATA LOAD ADDRESS ; DS_BNK) XKROM MF_XIOB ; ; IF ERROR THEN DISPLAY IT ; INC A JP Z,QPRT ; LD A,(IOPB + PB_STATO) OR A,A RET Z ;  PUSH BC PUSH AF ; ; DISPLAY CALENDAR DATA ; LD C,B ;MONTH CALL PUTHXB CALL DASH ; POP AF ;DAY LD C,A CAP A,24 JR NC,SCABRT ; LD A,L ;MINS CP A,60 JR NC,SCABRT ; LD A,(A2_BNK) ;MONTH DEC A CP A,12 JR NC,SCABRT ; ; BIT 6,(HL) JR Z,XWREG ; ; ELSE DO INDIRECT BYTE STORE ; EX (SP),HL ;HL= DATA EX DE,HL ;HL= PTR LD DE,(BNKLOC)-- ; ; THIS IS THE ACTUAL COMMAND ENTRY POINT ; ;---------------------------------------------------------------------------RET Z ; ; IF BIT 7 SET THEN DISPLAY NEW LINE ; CALL M,CRLF ;NEW LINE IF BIT 7 SET ; ; DISPLAY REGISTER ; LD C,(HL ; JR DODISK ;---------------------------------------------------------------------------- ; ; WRITE DISK SECTOR COMMAN= DRIVE # ; T= TRACK # {0..N-1} ; S= SECTOR # {1..N} ; ;------------------------------------------------------------------LD HL,IOPB LD DE,(THIS_BNK) XKROM MF_DIOB ; ; DONE ; RET ;-------------------------------------------------------LL PUTHXB CALL DASH ; POP BC ;YEAR CALL PUTHXB ; CALL BLK CALL BLK POP BC ;DAY-OF-WEEK {0 (SUN)..6} CALL PUTHX LD A,E ;DATE DEC A CP A,31 JR NC,SCABRT ; LD A,(A3_BNK) ;YEAR CP A,100 JR NC,SCABRT ; LD A,C ;DAY OF WEEK  ;E= PC BANK PUSH BC ;SAVE LAST CHAR LD C,A CALL PUTMEM POP BC JR XE ; ; ; WORD REGISTER WRITE ; XWREG: EX (SP- ; XMNE: ; ; START AT BEGINNING OF TABLE ; LD HL,ACTBL ;ADDR OF REG LOOK-UP TABLE ; ; IF NO ARGS THEN DISPLAY ALL ) PUSH HL CALL CO CALL DASH ; ; DISPLAY REGISTER VALUE ; POP HL CALL PRTVAL CALL BLK INC HL ;NEXT ENTRY JRD ;WB:A D:T S ; WHERE: B= XFER ADDRESS BANK ; A= XFER ADDRESS ; D= DRIVE # ; T= TRACK # {0..N-1} ; S= SECTOR # {1..N} ---------- ; DKLOG: ; ; SET COMMAND ; LD A,PB_LOGC LD (IOPB + PB_CMDO),A ; ; SET NO DOWNLOAD ; LD HL,0 ;XFER --------------------- ; ; DISPLAY CLOCK DATA COMMAND ;K ; ;----------------------------------------------------------------B ; ; DONE ; RET ;---------------------------------------------------------------------------- ; ; SET CLOCK/CALENCP A,7 JR C,SCLK1 ; ; ILLEGAL ENTRY ; SCABRT: JP QPRT ; SCLK1: ; ; SAVE CALENDAR DATA ; PUSH BC PUSH DE ; ),HL ;HL= DATA EX DE,HL ;DE= DATA, HL= PTR INC HL ;PRTVAL LEFT PTR TO LOW BYTE -1 LD (HL),E INC HL LD (HL),D JR XREGS ; XMNE1: CALL PCHK JR C,XG ;IF CHAR = CR THEN SHOW ALL ; ; ELSE IF LAST CHAR == DELIMITER THEN REPEAT FOR ANOTHER  XG ;---------------------------------------------------------------------------- ; ; READ DISK SECTOR COMMAND ;RB:A D:T ; ;---------------------------------------------------------------------------- ; DKWRIT: ; ; SET COMMAND ; LD A,PB_WCOUNT = 0 ; LD A,L ;ENABLE READ XFER ; ; GO TO COMMON CODE ; DODISK: LD (IOPB + PB_FLGO),A LD (IOPB + PB_BCNTO),HL------------ ; DCLKC: ; ; START ON NEW LINE ; CALL CRLF ; ; FETCH TIME DATA ; XVROM MF_GTIM ; ; DISPLAY DATADAR COMMAND ;UH:M MM:D Y:DOW ; ; WHERE: H= HOURS (24 HR FORMAT) {0..17H} ; M= MINUTES {0..3BH} ; MM= MONTH {1..0CH} ; D ; SET TIME ; LD DE,(A1_BNK) ;E=HRS LD D,L ;D=MINS LD B,0 ;B=SECS LD A,52H XVROM MF_STIM ; ; SET CALENDAR ;E ; ; ; BYTE REGISTER WRITE ; XBREG: EX (SP),HL ;HL= DATA INC DE ;PRTVAL LEFT PTR TO LOW BYTE -1 LD (DE),A ; ; REGISTER ; JR Z,XMNE1 ;IF CHAR = ' ' OR ',' THEN IGNORE ; ; ELSE IF USER REQUESTS ALTERNATE REGISTER THEN REPEAT WITH AL S ; WHERE: B= LOAD ADDRESS BANK ; A= LOAD ADDRESS ; D= DRIVE # ; T= TRACK # {0..N-1} ; S= SECTOR # {1..N} ; ;-------RITC LD (IOPB + PB_CMDO),A ; ; SET NO UPLOAD ; LD HL,1024 ;XFER COUNT = MAX ; LD A,1 SHL PB_INHX ;DISABLE READ XFER ; ; FETCH ARGS ; CALL EXPR3 ; ; SET VARS ; LD (IOPB + PB_DMAO),HL LD (IOPB + PB_TRKO),DE LD (IOPB + PB_SECO), ; PUSH AF PUSH BC ;HOURS CALL PUTHXB LD C,':' CALL CO ; POP BC ;MINUTES LD C,B CALL PUTHXB LD C,':' CAL= DAY {1..1FH} ; Y= YEAR {0..99} ; DOW= DAY OF WEEK {0:SUN, 1:MON,..6:SAT} ; ;-------------------------------------------- POP DE ;DATE LD B,E ;B=DATE LD A,(A2_BNK) ;D=MONTH LD D,A POP HL ;L=DAY OF WEEK LD A,(A3_BNK) ;E=YEAR LD E,A VALUE STORE DONE, RESTORE PTR TO ATTRIBUTES/OFFSET BYTE OF TABLE ; XE: POP HL ; ; IF LAST CHAR == CR THEN DONE ; XF: LD T TABLE ; CP A,'''' ;IF NOT PRIMES THEN EXIT JR NZ,XA LD HL,PRMTB JR XMNE1 ; ; ; DISPLAY ALL REGISTER'S DATA ;--------------------------------------------------------------------- ; DKREAD: ; ; SET COMMAND ; LD A,PB_READC LD (I ; ; GO TO COMMON CODE ; JR DODISK ;---------------------------------------------------------------------------- ; BC LD A,(A1_BNK) LD (IOPB + PB_DMAXO),A LD A,(A2_BNK) LD (IOPB + PB_DRVO),A ; ; EXECUTE ; LD HL,IOPB LD DE,(THIL CO ; POP AF ;SECONDS LD C,A CALL PUTHXB CALL BLK CALL BLK ; ; FETCH CALENDAR DATA ; XVROM MF_GCAL PUSH HL-------------------------------- ; SCLKC: ; ; FETCH ARGS ; CALL EXPR3 ; ; TEST VALIDITY ; LD A,(A1_BNK) ;HRS C XVROM MF_SCAL ; ; DONE ; RET SUBTTL PROCEDURES & FUNCTIONS ;++++++++++++++++++++++++++++++++++++++++++++++++++++++ 0 %+ &, !'- "(. #)/ $*0++++++++++++++++++++++ ; ; EXF FUNCTION READS 1 ARGUMENT. ; ENTRY- A= ARGUMENT 1ST CHAR ; EXIT - STACK= ARGUMENT ; ;------ 3 ; INC B ;B HAS 2 ALREADY ; ; GET ARGS ; CALL EXPR ; ; RETURN VALUES FROM STACK ; POP BC POP DE JP CRLFAK LD (ARGPTR),HL ; JR EXPR0 ; ; ; ; EXPR1: LD HL,A1_BNK LD (ARGPTR),HL JR EXPR1A ; ; ; IF LAST CHAR NOT VALIDEX2A ; ; STORE BANK # ; LD A,L LD HL,(ARGPTR) LD (HL),A ; ; RESTART WITH ACCUMULATOR = 0 ; JR EXPR0 ; ; ; ********************************* ; TRPLSP: ; ; COMPUTE NUMBER OF SPACES ; AND A,0FH ;LIMIT TO 0..15 LD B,A ;MULTIPL BITS2 ; ; RESTORE & DONE ; POP DE RET ;*************************************************************************ER CONTENTS PROCEDURE ; ENTRY- HL= PTR TO TABLE 'REGISTER' ; EXIT - HL= PTR TO LAST BYTE OF TABLE RECORD ; DE= PTR TO LOW BYNDIRECT ADDRESS, (HL) ; PUSH HL ;BUILD ADDR IN HL ; LD A,(DE) ;USE CONTENTS OF HL AS ADDRESS OF VALUE LD H,A ; DEC ---------------------------------------------------------------------- ; EXF: ; ; SET UP FOR 1 ARGUMENT ; LD B,1 ; ;  ;GO DO CRLF ;**************************************************************************** ; ; EXPR SUBR. READS PARAMETE THEN ERROR ; EX3: JP NZ,QPRT ;NON 0 IS ERR ; ; IF NO ARGUMENTS LEFT THEN DONE ; EXPR1A: DEC B RET Z ; ; ARG = 0  ELSE PUT VALUE UNDER RETURN ADDRESS ON STACK ; EX2A: EX (SP),HL PUSH HL ; ; BUMP TO NEXT ARG PAGE ; LD HL,(ARGPTR) LY BY 3 (X= X * 2 + X) ADD A,A ; COLUMN ADD A,B ; TRPL2: LD B,A INC B ;CONVERT N-1 TO N ; TRPL1: PUSH BC CALL BLK*** ; ; BITS2 PROCEDURE DISPLAYS DATA AS BINARY BITS ; ENTRY- E= BINARY DATA ; EXIT - B= ? ; ;****************************TE OF VALUE -1 ; A, BC= ? ; ;**************************************************************************** ; PRTVAL: ; ; DE LD A,(DE) LD L,A ; LD DE,(BNKLOC) ;FETCH (HL) VALUE CALL GETMEM EX DE,HL ;DE= PTR ; POP HL ; ; THIS IS TRI INIT BANK PTR ; LD HL,A1_BNK LD (ARGPTR),HL ; ; ACCUMULATOR = 0 ; LD HL,0 ; ; ENTER GETTER WITH CHAR IN A ALRERS FROM THE CONSOLE & DEVELOPS A 16 BIT HEX ; FOR EACH ONE. A CARRIAGE RETURN WILL TERMINATE THE ENTRY SEQUENCE. A BLANK ; OR  ; EXPR0: LD HL,0 ; ; GET NEXT CHAR FROM USER ; EX0: CALL ECHO ;GET NEXT # ; ; CONVERT CHAR TO BINARY ; EX1: LD C, INC HL LD (ARGPTR),HL ; ; IF LAST CHAR NOT CR THEN GET NEXT ARGUMENT ; LD A,C CALL P2C JR NC,EX3 ; ; ELSE IF C ;DO SPACING POP BC DJNZ TRPL1 ; ; DONE ; RET ;**************************************************************************************************************** ; BITS2: ; ; BIT COUNT = 8 ; LD B,8 ;BIT COUNT ; ; TOP OF OUTPUT  FETCH ADDRESS OFFSET OF REGISTER DATA ; INC HL ;SKIP REGISTER CHAR LD A,(HL) ;GET OFFSET & ATTRIBUTES ; AND A,3FH ;CK, DECRIMENTS TO BYTE VALUE AND JUMPS AT SAME TIME ; DJNZ PV2 ;ALLWAYS JUMP ; ; ; FETCH DATA ; PV1: LD A,(DE) ;GET ADY ; JR EX1 ;**************************************************************************** ; ; EXPR3 ROUTINE GETS 3 ARCOMMA WILL END THE CURRENT PARAMETER ENTRY. EACH PARAMETER ONLY TAKES ; THE LAST 4 DIGITS TYPED IN. ANY EXCESS IS DISCARDED. A A ;SAVE CHAR FOR LATER CALL NIBBLE ; ; IF NOT NUMBER THEN EXIT LOOP ; JR C,EX2 ; ; ELSE ADD TO ARGUMENT ; ADD HOUNT NOT EXHUSTED THEN ERROR ; DJNZ EX2B ; ; ELSE RETURN ; RET ; ; ; RELATIVE JUMP EXTENSION ; EX2B: JP QPRT ************ ; ; BITS PROCEDURE DISPLAYS ADDRESS AND DATA AS BINARY BITS ; ENTRY- HL= ADDRESS ; A= BINARY DATA ; EXIT - A=LOOP ; BITS1: PUSH BC ; LD A,E ;USE MS BIT RLCA LD E,A ; ; CONVERT TO ASCII ; LD A,'0' / 2 ;BUILD ASCII 1 OR 0 ISOLATE OFFSET LD DE,RLOC ADD A,E ;BUILD ADDR OF REG CONTENTS LD E,A LD A,0 ADC A,D LD D,A ; ; IF BIT 7 == 0 THREG CONTENTS ; ; DISPLAY DATA ; PV2: CALL HEX1 ;OUTPUT VALUE ; ; NOW DO LOW BYTE IF NEEDED ; DEC DE ;MEM PTR ; GUMENTS FROM USER, DOES A CR-LF & THEN ; LOADS BC, DE & HL WITH THE PARAMS. ; ENTRY- B= 2 ; EXIT - HL= ARG1 ; DE= ARG2 ; NON-HEX DIGIT WILL ; TERMINATE THE ENTRY SEQUENCE & CAUSE A WARM BOOT OF THE MON. ; ENTRY- B= # OF PARAMETERS NEEDED ; EXIT -L,HL ;ARG *= 16 ADD HL,HL ADD HL,HL ADD HL,HL OR A,L ;ADD IN NEW DIGIT LD L,A ; ; GET NEXT DIGIT ; JR EX0 ;G ;**************************************************************************** ; ; OUTPUT 3 SPACES EACH COLUMN TO POSITION O ? ; ;**************************************************************************** ; BITS ; ; SAVE REG ; PUSH DE ;  RLA ; ; DISPLAY ASCII DATA ; LD C,A PUSH DE CALL CO POP DE ; ; IF NOT DONE THEN REPEAT ; POP BC DJNZ BITEN SINGLE REGISTER (BYTE) VALUE ; LD A,(HL) ;NOW FIND ATTRIBUTES LD B,1 ;ASSUME BYTE VALUE RLCA JR NC,PV1 ;IF SINGLE; IF --BYTE_COUNT > 0 THEN REPEAT FOR LOW BYTE ; DJNZ PV1 ; ; ELSE DONE ; RET ;******************************** BC= ARG3 ; ;**************************************************************************** ; EXPR3: ; ; BUMP ARG COUNT TO STACK= PARAMETERS ; ;**************************************************************************** ; ; ; EXPR: LD HL,A1_BNET NEXT ; ; ; NOT HEX NUMBER ENTERED, IF COLON THEN SAVE ACCUMULATOR IN BANK REGISTER ; EX2: LD A,C CP A,':' JR NZ,N COLUMN PROCEDURE ; ENTRY- A= NUMBER OF COLUMNS - 1 {0..15} ; EXIT - A, B= ? ; ;*******************************************; SAVE DATA ; PUSH AF ; ; DISPLAY ADDRESS ; CALL LADRB ;OUTPUT ADDR ; ; DISPLAY DATA ; POP DE LD E,D CALS1 ; ; DONE ; RET ;**************************************************************************** ; ; DISPLAY REGIST REG THEN EXIT ; ; ELSE WORD VALUE ; INC B ; ; IF BIT 6 == 0 THEN DIRECT ADDRESS ; RLCA JR NC,PV1 ; ; ELSE I******************************************** ; ; ECHO ROUTINE READS A BYTE FROM CONSOLE DEVICE & ECHOS THE CHAR BACK ; TO THE0 %+ &, !'- "(. #)/ $*0 CONSOLE DEVICE. ; EXIT - A= CHAR ; ;**************************************************************************** ; ; 1ST ; A = ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; HILO: ; ; BUMP HL ; INC + 1 ; CF = (HL == 0) OR (HL > DE) OR (CONSOLE ABORT) ; A= ? ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; HILOX: ; ; BUMP & TEST HL ; CALL HILO RET C ;DONE IF CF ; ; NOT DONE, CHECK FOR CONSOLE ABORT ; CALL CIS +++++++++++++++++++++++++++++ ; NIBBLE: ; ; IF CHAR < 0 THEN RETURN ERROR ; SUB A,'0' RET C ; ; IF CHAR > F THEN HE CARRY FLAG. ; EXIT - A= CHAR ; NC, ZF= DELIMITER (' ' OR ',') ; CF, ZF= CR ; NC. NZ= ANY OTHER ; ;++++++++++++++++++ded precomp thresholds to disk parameter command. ; Added inhibit implied seek bit specification. ; ; 1.3 - 7 JUN 88 GRH ;== ; ; THE COMMON IOPB STRUCTURE ; NOTE: ; A MINIMUM OF THE 1ST 10 BYTES UP TO STATUS FOR MOST IOPBS ARE ; TRANSFERRED ENTRY DISPLAYS A '-' FIRST ; DECHO: CALL DASH ;OUTPUT A '-' ; ; GET CHAR FROM USER ; ECHO: CALL CONI ; ; ECHO TOHL ; ; IF HL == 0 THEN RETURN CF ; LD A,H ;IF HL = 0 THEN RETURN CF OR A,L SCF RET Z ; ; ELSE CP DE,HL ; LD+++++++++++++++++ ; HILOXB: ; ; BUMP BC 1ST ; INC BC ; ; FALL INTO HILOX ; ;+++++++++++++++++++++++++++++++++;IF NO CONSOLE BREAK THEN OR A,A ; RETURN RET Z ; ; IF CHAR != CONTROL-S THEN BREAK ; CALL CONI ;IF CHAR <> CTRL-SRETURN ERROR ; CP A,'G' - '0' CCF RET C ; ; IF CHAR <= 9 THEN RETURN OK ; CP A,'9' - '0' + 1 CCF RET NC ; ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; PCHK: ; ; GET CHAR FROM USER ; CALL ECHO P2C: ; ; I Add additional errors. ; Modify definitions for hard disk ; ; 1.4 3 JUL 88 GRH ; Add '?' to all global names ; ; 2.0 2  TO THE CONTROLLER. LAST 6 STATUS BYTES ARE UPDATED BY ; THE CONTROLLER AFTER COMMAND COMPLETION. ; ;====================== USER ; PUSH BC LD C,A ;OUTPUT CHAR CALL CO LD A,C ;RESTORE CHAR IN A POP BC ; ; DONE ; RET ;++++++++++ A,E ;ELSE COMPARE HL TO DE SUB A,L LD A,D SBC A,H ; ; RETURN RESULTS ; RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; HILO FUNCTION INCREMENTS HL. IT THEN CHECKS FOR (& DISALLOWS) A ; WRAP-AROUND THEN BREAK CP A,CTRLS SCF RET NZ ; ; ELSE PAUSE ; CALL CONI ;ELSE WAIT FOR NEXT CHAR ; ; RETURN CONTINUE ;  ELSE IF CHAR < A THEN RETURN ERROR ; SUB A,'A' - '9' - 1 CP 10 ; ; ELSE RETURN CHAR - 7 ; RET ;++++++++++++++9 ;START CLOCK ; ENDM AUG 88 GRH ; Update IOPB structure to include byte count for buffer size. Was in ; PBST4O but not included in input section====================================================== STRUCT 0 ; ; ARGUMENT DATA XFERRED TO CONTROLLER ; PB_CMDO DS 1 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; HILO FUNCTION INCREMENTS HL. IT THEN CHECKS FOR (& DISA++++++++++++++++++++++++++++++++++++++++++++ ; ; HILOXB ROUTINE BUMPS BC & HL. IT THEN CHECKS FOR (& DISALLOWS) A ; WRAP-AROU SITUATION. IF IT OCCURS, THE CARRY BIT WILL BE SET ON RETURN. ; IF NO WRAP-AROUND OCCURRED, HL IS COMPARED TO DE & THE FLAGS S OR A,A RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; NIBBLE FUNCTION CONVERTS ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; PCHK FUNCTION READS A CHARACTER FROM THE CONSOLE, THEN CHECE MODULE DEFINES THE SYSTEM COMMON IOPB FOR SMART ; I/O DEVICES. ; IT CURRENTLY ONLY SUPPORTS DISK I/O. ; ;***************. ; Change '?' prefixes to 'PB_' prefixes. Needed due to CP/M 3.x data ; reserves '?' prefix. ; *** NOTE: THIS CHANGE IS NOTCOMMAND BYTE (SEE BELOW) PB_DRVO DS 1 ;DRIVE PB_TRKO DS 2 ;TRACK PB_SECO DS 2 ;SECTOR BIT 15= SIDE (EXCEPT HARD DISK) PB_FLGLLOWS) A ; WRAP-AROUND SITUATION. IF IT OCCURS, THE CARRY BIT WILL BE SET ON RETURN. ; IF NO WRAP-AROUND OCCURRED, HL IS COMPAND SITUATION. IF IT OCCURS, THE CARRY BIT WILL BE SET ON RETURN. ; IF NO WRAP-AROUND OCCURRED, HL IS COMPARED TO DE & THE FLAGSET ; ACCORDINGLY. IT ALSO CHECKS FOR A KEYBOARD ABORT. ; ENTRY- HL = PTR ; DE = LAST PTR ; EXIT - HL = HL + 1 ; CF = (HL 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 FLKS IT FOR A ; SPECIAL CHARACTER. IF IT IS NOT A SPECIAL CHARACTER, A NON-ZERO CONDITION ; IS RETURNED. IF IT IS A SPECIAL CHAR************************************************************* ; ; REVISIONS: ; ; 1.0 - 22 FEB 86 GRH ; Excerpted from the COMPATABLE WITH OLD VERSIONS!! *** ; ; 2.01 11-27-90 GRH ; Add PB_INHX flag definition. ; ;*****************************O DS 1 ;FLAGS PB_DMAO DS 2 ;XFER ADDRESS PB_DMAXO DS 1 ;EXTENDED XFER ADDRESS ; ; ARGUMENT TO CONTROLLER AND RESULT RETURNRED TO DE & THE FLAGS SET ACCORDINGLY. ; ENTRY- HL= PTR ; DE= LAST LOCATION ; EXIT - HL = HL + 1 ; CF = HL == 0 OR HL > DE SET ; ACCORDINGLY. IT ALSO TESTS FOR A KEYBOARD ABORT. ; ENTRY- HL = PTR ; DE = LAST PTR ; EXIT - HL = HL + 1 ; BC = BC == 0) OR (HL > DE) OR (CONSOLE ABORT) ; A= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++AG THE ERR. ; ENTRY- A= ASCII-HEX CHAR ; EXIT - A= BINARY VALUE OF 'CHAR' ; ;+++++++++++++++++++++++++++++++++++++++++++++++ACTER, A ZERO CONDITION IS RETURNED. ; FURTHER, IF THE CHARACTER IS A CR, THE CARRY FLAG IS SET. A BLANK OR A ; COMMA RESETS T 'JDDCONT.DEF' file & released. ; ; 1.1 - 24 SEP 86 GRH ; Changed structure and commands. ; ; 1.2 - 31 DEC 86 GRH ; Ad*********************************************** ;==========================================================================ED ; WRITES= BYTE COUNT WRITES= BYTE COUNT ACTUALLY WRITTEN ; READS= 0 READS= BYTE COUNT ACTUALLY READ ; PB_BCNTO DS 2 ;BYT0 %+ &, !'- "(. #)/ $*0 SUBTTL BOOT ROM EXTERNAL DEFINITIONS ;**************************************************************************** ; ; THIS================ ; ; ENTRY POINTS ; ;============================================================================ STRUCT ================= ; ; CONSOLE OUTPUT STUB IS USED BY ERROR ROUTINES TO TALK TO THE CONSOLE ; DS 3 ;===================================================== ; ; WRITE SECTOR COMMAND ; ;================================================================================= ; ; FORMAT TRACK COMMAND ; ;=======================================================================NED NUMBER OF BYTES FROM LAST SECTOR TO INDEX ;================================================================================================================================= ; ; ROM # ; ;========================================================UPPORTED IOSET DS 3 ;UNSUPPORTED MEMCK DS 3 ;UNSUPPORTED IODEF DS 3 ;UNSUPPORTED I/O CONTROL MR_REST DS 3 ;BREAKPOINT ENT INCLUDE FILE DEFINES THE DISK BOOT ROM EXTERNAL DEFINITIONS ; ;**************************************************************0F800H ;START OF ROM ; ; COLD START ENTRY ; DK_COLD DS 3 ;===================================================================================================================== ; ; EXECUTE IOPB FUNCTION ; ENTRY- IX= IOPB PTR ; EXIT - AF= 0,Z================= PB_WRITC EQU 2 ; ; IOPB REQUIREMENTS ; ;PBCMDO BYTE 2 ;PBDRVO BYTE DRIVE NUMBER ;PBTRKO WORD TRACK NU===== PB_FRMTC EQU 3 ; ; IOPB REQUIREMENTS ; ;PBCMDO BYTE 3 ;PBDRVO BYTE DRIVE NUMBER ;PBTRKO WORD TRACK NUMBER {0..N}  ; ; READ ADDRESS COMMAND ; ;============================================================================ PB_RADDC EQU 4 ==================== MR_RNUM EQU 0 ;============================================================================ ; ; ROMRY MR_LSTSTS DS 3 ;RETURN LIST DEVICE STATUS ; EXIT - A= 0: NOT READY, /0: READY FOR CHAR DS 3 ;SPARE DS 3 ;SPARE EN************** ; ; REVISION HISTORY: ; ; 1.0 6 JUL 88 GRH ; First cut. ; ; 1.1 26 SEP 88 GRH ; Change all '?' symbol================ ; ; DUMMY CONSOLE INPUT VECTOR ONLY RETURNS ; DS 3 ;=================================================F: NO ERROR ; DK_DSKX DS 3 ENDM ;============================================================================ ; ; MBER {0..N} ;PBSECO WORD SECTOR NUMBER {1..N} ;PBFLGO BYTE FLAGS ; ; 7 0 ; | | | | | | | | | ; ^ ^  ;PBSECO WORD HEAD IN PROPER BIT POSITION(S) ;PBFLGO BYTE (HARD DISK): INTERLEAVE FACTOR IN BITS 6..0 ; USE SET DISK PARAMS ( SUBTTL MONITOR ROM EXTERNAL DEFINITIONS ;**************************************************************************** ; ; I FUNCTIONS ; ;============================================================================ STRUCT 0F800H ;START OF ROM MR_DM ;============================================================================ ; ; ROM SWAP CROSS-OVER POINT ; ;=======s to 'DK_' symbols of 8 significant chars. ; ;**************************************************************************** =========================== ; ; DO DISK ROM FUNCTION ; DK_FUNC DS 3 ; ; ENTRY- C= FUNCTION # DK_RF0 EQU 0 ;RETURN ROM PAGE 0 RESERVED ; ;============================================================================ STRUCT 0040H DK_PROM DS 2 ; ; | |_____ 1: INHIBIT IMPLIED SEEK (IGNORED BY HARD DISK) ; |_________________ 1: INHIBIT RETRIES ; ;PBDMAO WORD XFEFUNCION 9) PRIOR TO USE ;PBDMAO WORD XFER ADDRESS (JADE CONTROLLER TRACK DRIVER) ; DRIVER REQUIREMENTS: ; BYTE 0: 055H, BYNCLUDE FILE THAT DEFINES THE MONITOR ROM I/O ; ;**************************************************************************** CBOOT DS 3 ;COLD START ENTRY MR_CONIN DS 3 ;CONSOLE INPUT ; EXIT - A= CHAR DS 3 ;UNSUPPORTED TAPE READER MR_CONOUT DS 3===================================================================== MR_XOVER EQU 0F800H + 30H  ;============================================================================ ; ; ROM # ; ;==============================VERSION NUMBER ; EXIT - HL= BINARY OF VERSION DK_RF1 EQU 1 ;OUTPUT IOPB DATA IF IOPB.PBSTATO != 0 ; ENTRY- IX= IOPBBOOTED PROM # & DRIVE # DS 4 ;BOOT SCRATCH ENDM R ADDRESS ;PBDMAXO BYTE EXTENDED XFER ADDRESS ;PBBCNT WORD BYTE COUNT OF BUFFER XFER (0: NO XFER) ; ;PBSTATO BYTE RETURNED ETE 1: 0AAH, ; BYTES 2 & 3: BYTE COUNT TO CHECKSUM (STARTING AT BYTE 0) ;PBDMAXO BYTE EXTENDED XFER ADDRESS ;PBBCNT WORD BYT; ; REVISION HISTORY: ; 1.0 6 JUL 88 GRH ; First cut. ; ; 1.1 26 SEP 88 GRH ; Change symbols to 'MR_' prefixes of 8 si ;CONSOLE OUTPUT ; ENTRY- C= CHAR DS 3 ;UNSUPPORTED TAPE PUNCH MR_LSTOUT DS 3 ;LIST DEVICE OUTPUT ; EXTRY- C= CHAR PBFLGO BYTE X ;PBDMAO WORD X ;PBDMAXO BYTE X ;PBBCNT WORD X ; ;PBSTATO BYTE RETURNED ERROR CODE (ALLWAYS 0) ;PBST1O BYTE X============================================== DK_RNUM EQU 2 ;============================================================ PTR DK_RF2 EQU 2 ;OUTPUT IOPB DATA ; ENTRY- IX= IOPB PTR ;===========================================================E RETURNED ERROR CODE (0= NONE) ;PBST1O BYTE X ;PBST2O BYTE X ;PBST3O BYTE X ;==========================================RROR CODE (0= NONE) ;PBST1O BYTE X ;PBST2O BYTE X ;PBST3O BYTE X ;======================================================E COUNT OF BUFFER XFER (0: NO XFER) ; ;PBSTATO BYTE RETURNED ERROR CODE (0= NONE) ;PBST1O BYTE X ;PBST2O WORD (FLOPPY) RETURgnificant chars. ; ;**************************************************************************** ;======================= MR_CONSTS DS 3 ;RETURN CONSOLE INPUT STATUS ; EXIT - A= 0: NOT READY, /0: CHAR READY DS 3 ;UNSUPPORTED IOCHK DS 3 ;UNS ;PBST2O BYTE X ;PBST3O BYTE X ;============================================================================ ; ; RETU0 %+ &, !'- "(. #)/ $*0RN FIRMWARE VERSION COMMAND ; ;============================================================================ PB_VERSC EQU 8 ;MAND: 0: SET PARAMS FROM SECT. BUFR & DISABLE LOGON ; 1: RETURN PARAMS IN SECT. BUFR & DISABLE LOGON ; 2: SET PARAMS FRDUCED WRITE CURRENT CYLINDER ; BYTE (FLOPPY): FIRST TRACK FOR MEDIUM PRECOMP SELECT ; (HARD DISK): LOW BYTE OF FIRST TRACKBYTE RETURNED ERROR CODE ;PBST1O BYTE X ;PBST2O BYTE X ;PBST3O BYTE X ;================================================= PB_STDVC EQU 12 ; ; IOPB REQUIREMENTS ; ;PBCMDO BYTE 12 ;PBDRVO BYTE DRIVE NUMBER {0..3} ;PBTRKO WORD X ;PBSECO WORD X============== ; ; RETURN DRIVE STATUS COMMAND ; ;========================================================================ECO WORD X ;PBFLGO BYTE X ;PBDMAO WORD X ;PBDMAXO BYTE X ;PBBCNT WORD 0 ; ;PBSTATO BYTE RETURNED ERROR CODE (0= NONE) ;PB; ;PBSTATO BYTE RETURNED ERROR CODE (ALLWAYS 0) ;PBST1O BYTE X ;PBST2O BYTE X ;PBST3O BYTE X ;PBST4O BYTE X ;PBST5O BYTE X ; IOPB REQUIREMENTS ; ;PBCMDO BYTE 8 ;PBDRVO BYTE X ;PBTRKO WORD X ;PBSECO WORD X ;PBFLGO BYTE X ;PBDMAO WORD X ;PBDOM SECT. BUFR & ENABLE LOGON ; 3: RETURN PARAMS IN SECT. BUFR & ENABLE LOGON ;PBDMAO WORD XFER ADDRESS OF STRUCTURE ;PBDM FOR PRECOMP ; BYTE (FLOPPY): FIRST TRACK FOR HIGH PRECOMP SELECT ; (HARD DISK): HIGH BYTE OF FIRST TRACK FOR PRECOMP ; B=========================== ; ; SEEK TRACK COMMAND ; ;==================================================================== ;PBFLGO BYTE SUBCOMMAND: 0: SET PARAMETERS FROM SECTOR BUFFER ; 1: RETURN PARAMETERS IN SECTOR BUFFER ;PBDMAO WORD XFER A==== PB_RDSTC EQU 13 ; ; IOPB REQUIREMENTS ; ;PBCMDO BYTE 13 ;PBDRVO BYTE DRIVE NUMBER ;PBTRKO WORD X ;PBSECO WORD X ST1O BYTE X ;PBST2O BYTE X ;PBST3O BYTE SUBCOMMAND, OUTPUT EIA BAUD RATE: ; 0: LEVEL STATUS ONLY 1: 600 (5" ONLY) ; 2:  SUBTTL COMMON IOPB ERROR CODES ;============================================================================ ; ; COMMAMAXO BYTE X ;PBBCNT WORD X ; ;PBSTATO BYTE RETURNED ERROR CODE (ALLWAYS 0) ;PBST1O BYTE X ;PBST2O WORD RETURNED VERSION NUMAXO BYTE EXTENDED XFER ADDRESS ;PBBCNT WORD BYTE COUNT OF BUFFER XFER (0: NO XFER) ; ;PBSTATO BYTE RETURNED ERROR CODE (0= NOYTE (HARD DISK): ECC DATA BURST LENGTH ; BYTE (HARD DISK): CONTROL BYTE ; ;====================================================== PB_SEEKC EQU 11 ; ; IOPB REQUIREMENTS ; ;PBCMDO BYTE 11 ;PBDRVO BYTE DRIVE NUMBER ;PBTRKO WORD TRACK NUMBER {0DDRESS OF DATA STRUCTURE ;PBDMAXO BYTE EXTENDED XFER ADDRESS ;PBBCNT WORD BYTE COUNT OF BUFFER XFER (0: NO XFER) ; ;PBSTATO ;PBFLGO BYTE X ;PBDMAO WORD X ;PBDMAXO BYTE X ;PBBCNT WORD 0 ; ;PBSTATO BYTE RETURNED ERROR CODE (0: NONE) ;PBST1O BYTE X 1200 3: 2400 ; 4: 4800 5: 9600 ; 6: 19200 (8" ONLY) FFH: RETURN CURRENT VALUE ;==================================ND ERROR CODES (PBSTATO OF COMMAND BLOCK ON RETURN) ; NOTE: ; BIT 7 MAY BE SET FOR ERROR TYPE 0 THRU 3. THIS DENOTES REMAINIBER (BINARY {0.00,..655.34}) ;============================================================================ ; ; SET DISK NE) ;PBST1O BYTE X ;PBST2O BYTE X ;PBST3O BYTE X ; ; SECTOR BUFFER STRUCTURE (SEE ALSO 'DISKS.DEF'): ; BYTE DISK FLAGS (DI============================== ; ; LOAD HEAD & IDLE COMMAND ; (USE CLEAR COMMAND TO STOP) ; ;---------------------------..N} ;PBSECO WORD X ;PBFLGO BYTE X ;PBDMAO WORD X ;PBDMAXO BYTE X ;PBBCNT WORD X ; ;PBSTATO BYTE RETURNED ERROR CODE (0= BYTE RETURNED ERROR CODE (0= NONE) ;PBST1O BYTE X ;PBST2O BYTE X ;PBST30 BYTE X ; ; SECTOR BUFFER STRUCTURE: (DEFAULTS)  ;PBST2O BYTE CONTROLLER STATUS PORT DATA (SEE JDDLOC.DEF- 'BLSTS') ;PBST3O BYTE X ;================================================================================ ; ; CLEAR COMMAND ; INTERRUPTS INTERRUPTABLE PROCESS (I.E.: LOAD HEAD & IDLE) ;NG ; BYTES OF IOPB STATUS CONTAIN VALID INFORMATION FROM A SASI BUS ; CONTROLLER. ; ;===================================FLAGS & SECTORS PER TRACK COMMAND ; ;============================================================================ PB_STDKC EQSKS.DEF- 'IDFLG') ; WORD TRACK 0 SECTS PER TRK, SECTOR SIZE {0:128,1:256,2:512,3:1024} ; WORD TRACK 1 SECTS PER TRK, SECTOR SI------------------------------------------------- PB_LHIC EQU 10 ; ; IOPB REQUIREMENTS ; ;PBCMDO BYTE 10 ;PBDRVO BYTE DRNONE) ;PBST1O BYTE X ;PBST2O BYTE X ;PBST3O BYTE X ;====================================================================; WORD HEAD ENGAGE TIME IN 100us (350) ; WORD STEP INTERVAL IN 100us (80) ; WORD TIME AFTER LAST STEP IN 100us (80) ; WOR====================================== ; ; SET EIA BAUD RATES COMMAND ; ;================================================= ;============================================================================ PB_CLRC EQU 15 ; ; IOPB REQUIREMENTS ; ;P========================================= ; ; TYPE 0: DRIVE ; PB_NOERR EQU 0 ;NO ERROR DURING FUNCTION PB_NOINDX EQU 1 ;U 9 ; ; IOPB REQUIREMENTS ; ;PBCMDO BYTE 9 ;PBDRVO BYTE DRIVE NUMBER ;PBTRKO WORD X ;PBSECO WORD X ;PBFLGO BYTE SUBCOMZE ; WORD DATA TRACKS SECTS PER TRACK, SECTOR SIZE ; BYTE DISK TYPE ; WORD CYLINDER COUNT ; BYTE HEAD COUNT ; WORD START REIVE NUMBER {0..3} ;PBTRKO WORD X ;PBSECO WORD X ;PBFLGO BYTE X ;PBDMAO WORD X ;PBDMAXO BYTE X ;PBBCNT WORD X ; ;PBSTATO ======== ; ; SET DRIVE PARAMETERS COMMAND ; ;============================================================================ D MOTOR START (HEAD LOAD) DELAY IN 100us (8":1, 5": ) ; ;========================================================================================= PB_EIABC EQU 14 ; ; IOPB REQUIREMENTS ; ;PBCMDO BYTE 14 ;PBDRVO BYTE X ;PBTRKO WORD X ;PBSBCMDO BYTE 15 ;PBDRVO BYTE X ;PBTRKO WORD X ;PBSECO WORD X ;PBFLGO BYTE X ;PBDMAO WORD X ;PBDMAXO BYTE X ;PBBCNT WORD 0 NO INDEX SIGNAL PB_NOSEEK EQU 2 ;NO SEEK COMPLETE PB_WFLT EQU 3 ;WRITE FAULT PB_NTRDY EQU 4 ;DRIVE NOT READY PB_NOSEL EQ0 %+ &, !'- "(. #)/ $*0U 5 ;DRIVE NOT SELECTED PB_NOTRK0 EQU 6 ;NO TRACK 0 SENSE PB_MDRV EQU 7 ;MULTI DRIVE SELECTED ; ; TYPE 1: CONTROLLER AD TRACK ; ; TYPE 2: COMMAND ; PB_ILCMD EQU 20H ;INVALID COMMAND FROM HOST PB_ILADD EQU 21H ;ILLEGAL DISK ADDRESS. AD 4 SEEK ERROR RECORD NOT FOUND = ; 5 HEAD LOAD DELETED RECORD WRITE FAULT ; 6 WRITE PROTECT = ; 7 NOT READY = = ; ; AERROR IN PBST2O) ; 01 - BUFFER OVERFLOW ON READ (TARGET REQUESTED TOO MANY BYTES) ; 02 - BUFFER OVERFLOW ON WRITE ( " " NE POP BC ; ; FETCH PORT DATA ; IN E,(C) JP BITS2 ;OUTPUT VALUE ;---------------------------------------------- ; ;---------------------------------------------------------------------------- ; MOVE: ; ; GET ARGS (1) to set clock calendar, and ; write clock buffer function (2) to set clock time. ; 1-21-91 GRH ; Fix bug in clock timeROM SUBTTL EXTERNAL ENTRY POINTS ORG MONROM ; JP CINIT ;COLD START ; ; EXTERNAL FUNCTION ENTRY DURING INTERRUPT ; PB_IDERR EQU 10H ;ID READ ERROR PB_UNCDAT EQU 11H ;UNCORRECTABLE DATA PB_NOIDAM EQU 12H ;ID ADDRESS DATA MARK NOT FOUND PDRESS IS BEYOND MAX ADDR PB_ILFUN EQU 22H ;ILLEGAL FUNCTION FOR THE SPECIFIED DRIVE ; ; TYPE 3: MISCELLANEOUS ; PB_RAMDDITIONAL DATA FROM SELF TEST: ; PBST20= 0: TRACK REGISTER FAILED, ; 1: SECTOR REGISTER FAILED ; PBST3O= 0: BIT OK, 1: BI " " " ) ; 03 - STATUS PHASE EXPECTED ; 04 - MESSAGE PHASE EXPECTED ; 05 - STATUS PHASE EXPECTED DURING REQUEST SENSE COMM------------------------------ ; ; OUTPUT DATA TO PORT COMMAND ; ; O ; ;------------------- FROM USER ; CALL EXPR3 ;HL= SRC, DE= SRC_LAST, BC= DEST ; ; TOP OF MOVE LOOP ; MOV1: ; ; MOVE 1 BYTE OF DATA ;  set function which set chip to 12 Hr format. ; VERSN EQU 122 ; ;*********************************************************** ; DS (MONROM + 6) - $ JP I_STUB ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXB_NODAM EQU 13H ;DATA ADDRESS MARK NOT FOUND PB_RNF EQU 14H ;RECORD NOT FOUND PB_SEEK EQU 15H ;SEEK ERROR ; PB_WPROT EERR EQU 30H ;CONTROLLER RAM TEST FAILED PB_ROMERR EQU 31H ;CONTROLLER ROM TEST FAILED PB_ECCBAD EQU 32H ;ECC HARDWARE FAILED T(S) FAILED ; PB_MTRON EQU 45H ;MOTOR ON FF DIAGNOSTIC FAILURE ; PBST2O= BLSTS ; PB_IFF EQU 46H ;INTERRUPT FF DIAGNOSTIAND ; 06 - MESSAGE PHASE EXPECTED DURING REQUEST SENSE COMMAND ; PB_PARTY EQU 4BH ;PARITY ERROR ; ; TYPE 5: SYSTEM ERR--------------------------------------------------------- ; OUPT: ; ; GET ARGS FROM USER ; CALL EXPR ;GET DATA INTO E, TITLE M5b MISCELLANEOUS I/O DRIVER ROM LIST NOCOND ;***************************************************************************************** SUBTTL DECLARATIONS ;============================================================================ ; ;*MTERNAL FUNCTION STUB FOR USE DURING AN INTERRUPT WITHOUT THE ; RESIDENT ROM ENABLED. USE IN ALL NON-RESIDENT ROMS. ; ENTRY- A=QU 17H ;WRITE PROTECTED PB_CDAT EQU 18H ;ERROR BURST CORRECTED (THIS IS NOT A HARD ERROR!!) PB_BDBLK EQU 19H ;BAD BLOCK FOU ; ; TYPE 4: CONTROLLER ERRORS SENSED BY FIRMWARE ; PB_ILDRV EQU 40H ;ILLEGAL DRIVE REQUESTED PB_ILRAT EQU 41H ;ILLEGAL BC FAILURE ; PBST2O= BLSTS ; PB_INTR EQU 48H ;ILLEGAL INTERRUPT PB_HNDSK EQU 49H ;CONTROLLER HANDSHAKE FAILURE ; SUB-ERRORS ; PB_CNP EQU 50H ;CONTROLLER FOR DRIVE IS NOT IN SYSTEM PB_BADPB EQU 51H ;BAD IOPB FORMAT OR DATA ; END FILE  PORT # INTO C POP DE POP BC ; ; OUTPUT TO PORT ; OUT (C),E ; ; DONE ; JP WINIT ;------------------------**** ; ; MISC. I/O DRIVER ROUTINES FOR M5b ; *INCLUDE B:ZBMH122.HDR ;******************************************************ACLIB ASMBTOOL.MLB ;*INCLUDE MONBOARD.DEF ;*INCLUDE CLOCK.DEF ;*INCLUDE B:ZBMF101.DEF ;*INCLUDE B:ZBMG101.DEF ; ;== FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; I_STUB: ADD A,2 ;BIAS UP ND PB_BDFMT EQU 1AH ;BAD FORMAT ERROR PB_ACCALT EQU 1CH ;ILLEGAL (DIRECT) ACCESS TO ALTERNATE TRACK PB_ALTUSD EQU 1DH ;ALTERAUD RATE REQUESTED ERROR PB_FDVR EQU 42H ;FORMAT DRIVER ERROR ; PB_FDCER EQU 44H ;FDC CHIP ERROR ; PBST1O= FDC STATUS: ; BORS IN PBST1O ; 01 - TIMEOUT WHILE WAITING FOR SASI BUSY ; 02 - TIMEOUT WHILE WAITING FOR SASI ACK TO CLEAR ; 03 - TIMEOUT WH FROM THE CURRENT ; CONSOLE DEVICE. ; ; I ; ;-------------------------------------------------------------------------------------------------------------------- ; ; MOVE COMMAND ; ; THIS ROUTINE EXPECTS 3 PARAMETERS, ENTERED IN THE ********************** ; ; REVISION HISTORY: ; ; 1.0 - 23 SEP 83 GRH ; Initial version transferred from CBIOS routines. ========================================================================== LIST OFF *MACLIB ASMBTOOL.MLB *INCLUDE MONBOPUSH HL LD H,MR_RNUM ;USE RESIDENT ROM LD L,A EX (SP),HL CALL XROMF ;GO EXECUTE THE FUNCTION INC SP ;BALANCE STACK NATE TRACK ALREADY USED PB_ALTNMK EQU 1EH ;ALTERNATE TRACK NOT MARKED AS ALTERNATE PB_ALTBAD EQU 1FH ;ALTERNATE TRACK EQUALS BIT# SEEK COMMAND READ WRITE ; 0 FDC BUSY = = ; 1 INDEX DATA REQUEST = ; 2 TRACK 0 LOST DATA = ; 3 CRC ERROR = = ; ILE WAITING FOR SASI REQUEST ; PB_SYNC EQU 4AH ;CONTROLLER PROTOCOL SYNC FAILURE ; SUB-ERRORS IN PBST1O (STATUS BYTE CAUSING ------------ ; INPT: ; ; GET PORT ARG FROM USER ; CALL EXPR1 ;GET INPUT PORT # INTO C CALL CRLF ;PUT DATA ON NEW LIFOLLOWING SEQUENCE: ; SOURCE 1ST BYTE ADDR, SOURCE LAST BYTE ADDR & DESTINATION 1ST BYTE ADDR. ; ; M ; ; 1.22 11-25-90 GRH ; Modify slightly for Shared ROM ZMON V. 1.22. ; ; 1-7-91 GRH ; Change read clock buffer functionARD.DEF *INCLUDE CLOCK.DEF *INCLUDE B:ZBMF101.DEF *INCLUDE B:ZBMG101.DEF LIST ON THIS_ROM EQU CLK_RNUM ;ROM # OF THIS  INC SP RET ;**************************************************************************** ; ; COLD INIT ONLY SWITCHES T0 %+ &, !'- "(. #)/ $*0O RESIDENT ROM ; ;**************************************************************************** ; CINIT: ; ; SET STACK ;UBTTL MONITOR FUNCTION CALL DISPATCHER ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; ENTRUNCTION TABLE ; ;############################################################################ ; FUNTABL: DW RETVERS ;0: R+++++++++++++++++ ; RETVERS: LD HL,VERSN RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++L CLK_SET ; ; PROCESS YEAR ; INC C LD A,E CALL H2BCD ; CALL CLK_SET ; LD A,L INC C CALL CLK_SET ; ; DONT ; ; PROCESS HOURS ; INC C LD A,E CALL H2BCD ; CALL CLK_SET ; LD A,L SET 3,A ;SET 24 HR FORMAT BIT (HOURS M CALL GET2D LD H,1 ;MASK {0..19} CALL GETN LD B,A ; ; PROCESS YEAR ; CALL GET2D LD H,0FH ;MASK {0..99} CALL GLL GET2D LD H,3 ;MASK {0..39} CALL GETN LD C,A ; ; RETURN MINUTES IN A ; POP AF RET ;++++++++++++++++++++++ LD SP,MONSTK ; ; RESET ROM FUNCTION SHOULD NOT RETURN HERE ; LD HL,[MR_RNUM SHL 8] + 1 ;RESET PUSH HL CALL XROMF Y- A= FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; FUNCH: CP A,MAXFUNS JETURN ROM VERSION # DW CLKSCAL ;1: SET CLOCK CALENDAR DW CLKSTIM ;2: SET CLOCK TIME DW CLKCAL ;3: RETURN CLOCK CALENDAR+++++ ; ; SET CLOCK CALENDAR FUNCTION #1 ; ENTRY- B= DATE ; D= MONTH ; E= YEAR ; L= DAY OF WEEK ; EXIT - A= 0 ; BC, E, TURN ON CLOCK ; JP CLKSTRT ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SET CLSD) INC C CALL CLK_SET ; ; START CLOCK ; JP CLKSTRT ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ETN ; ; RETURN VALUES ; LD C,A ;RETURN YEAR IN C POP AF ;RETURN DAY IN A RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN CLOCK DATA FUNCTION #5 ; ENTRY- C= CLOCK REGISTER # ; EXIT; ; IF RETURNED THEN HALT ; HALT SUBTTL MONITOR BOARD SHADOW ROM SELECTION PROCEDURE *INCLUDE XROM.Z80 SUBTTL IR NC,MFUNERR ; ; FUNCTION SEEMS LEGAL, FETCH EXECUTION ADDRESS FROM TABLE ; PUSH HL ;SAVE POSSIBLE ARGUMENT ; LD HL,F DATA DW CLKTIM ;4: RETURN CLOCK TIME DATA DW CLKRETR ;5: RETURN CLOCK REGISTER DATA DW CLKWAIT ;6: WAIT FOR CLOCK TO CDE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKSCAL: ; ; STOP CLOCK ; PUSOCK TIME FUNCTION #2 ; ENTRY- B= SECONDS ; D= MINUTES ; E= HOURS ; EXIT - A= 0 ; BC, DE= ? ; ;+++++++++++++++++++++++++++++++++++++++++ ; ; RETURN CALENDAR FUNCTION #3 ; EXIT - A= DAY ; B= MONTH ; C= YEAR ; L= DAY OF WEEK ; DE= ? ; ;++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN TIME FUNCTION #4 ; EXIT - A= SECONDS ; B= MINUTES ; C= HOURS ; DE - A= REGISTER DATA ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKRETR: GETD: ; ; NITIALIZATION CODE ;---------------------------------------------------------------------------- ; ; THIS IS THE COLD START IUNTABL 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 ARGUMEHANGE DW ISTHERE ;7: RETURN BOARD PRESENT STATUS DW CLKSTOP ;8: STOP CLOCK DW CLKSTRT ;9: START CLOCK ; MAXFUNS EQU (H BC CALL CLKSTOP ; ; SET UP PTR TO REGS ; LD C,CLK_WEEK ; ; PROCESS DAY OF WEEK ; LD A,L CALL H2BCD ;A= LSD,++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKSTIM: ; ; STOP CLOCK ; CALL CLKSTOP ; ; SET UP TO SET EAC++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKCAL: ; ; WAIT FOR CLOCK DATA TO BE STABL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKTIM: ; ; WAIT FOR CLOCK TO STAB TELL CLOCK WHICH REGISTER TO READ ; LD A,C SET CLK_RD,A ;SET READ BIT OUT (CLK_CMD),A ; ; DELAY >= 5us PER DATA SHENIT CODE ; ;---------------------------------------------------------------------------- ; ROM_INIT: ; ; OUTPUT SIGN-ON NT & PUT EXECUTION ADDRESS ON STACK EX (SP),HL ; ; RETURN TO EXECUTION ADDRESS ; RET ; ; ; FUNCTION ERROR ; MFUN$ - FUNTABL) / 2 SUBTTL ROM FUNCTIONS ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; R L= MSD ; CALL CLK_SET ; ; PROCESS DATE ; INC C POP HL ;WAS BC (DATE) LD A,H CALL H2BCD ; CALL CLK_SET ; H REGISTER ; LD C,CLK_SECL ;SET REGISTER # ; ; PROCESS SECONDS ; LD A,B CALL H2BCD ; CALL CLK_SET ; LD A,L IE FOR AWHILE ; CALL CLKWAIT ; ; FETCH DAY OF WEEK & SAVE ; LD C,CLK_WEEK CALL GETD AND A,7 ;MASK OFF GARBAGE {0..ILIZE ; CALL CLKWAIT ; ; PROCESS SECONDS ; LD C,CLK_SECL CALL GET2D LD H,7 ;MASK {0..79} CALL GETN PUSH AF ;ET ; EX (SP),HL EX (SP),HL ; ; RETURN WITH DATA ; IN A,(CLK_DATA) ;RETURN DATA RET ;+++++++++++++++++++++++++MESSAGE ; LD HL,LOGMSG ;OUTPUT SIGN-ON CALL PRTS ; RET LOGMSG: DB ' Misc. Drivers V. ' PVERS VERSN DM CR,LF SERR: LD A,-1 OR A,A RET ;############################################################################ ; ; MONITOR FETURN VERSION FUNCTION #0 ; EXIT - HL= VERSION # (123D = 1.23) ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++LD A,L INC C CALL CLK_SET ; ; PROCESS MONTH ; INC C LD A,D CALL H2BCD ; CALL CLK_SET ; LD A,L INC C CALNC C CALL CLK_SET ; ; PROCESS MINUTES ; INC C LD A,D CALL H2BCD ; CALL CLK_SET ; LD A,L INC C CALL CLK_SE7} LD L,A ; ; PROCESS DAY ; INC C CALL GET2D LD H,3 ;MASK {0..39} CALL GETN PUSH AF ; ; PROCESS MONTH ; SAVE ; ; PROCESS MINUTES ; CALL GET2D CALL GETN ;USE SAME MASK AS ABOVE {0..79} LD B,A ; ; PROCESS HOURS ; CA+++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; WAIT FOR CLOCK TO CHANGE FUNCTION #6 ; EXIT - A= 0: OK, /0: BOARD NOT0 %+ &, !'- "(. #)/ $*0 PRESENT ; C= CLK_SECL ; B= LO SECONDS DATA ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++LK_DATA) ; ; IF UPPER BITS NOT DRIVEN THEN BOARD IS NOT THERE ; AND A,11000000B ; ; ADJUST SENSE ; RET ;+++++; ; CLEAR HOLD ; XOR A,A OUT (CLK_DATA),A ; ; CLEAR COMMAND ; OUT (CLK_CMD),A ; ; DONE ; RET SUBTTL  ; D= HI BCD # ; H= MASK FOR HI BYTE ; EXIT - A= NUMBER ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++BINARY DATA ; EXIT - A= UNITS DIGIT ; L= TENS DIGIT ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++),A ; LD A,C OUT (CLK_CMD),A ; ; DONE ; RET ;*************************************************************************************************************************** ; CO: XCROM MF_CO ; ; DONE ; RET END,0FFH ;IF NOT LAST BANK THEN REPEAT CP A,E JR NZ,BNKS_INIT ; ; INITIALIZE IOBYTE ; LD A,IOBYTV ;SET TO INITIAL IOBYT+ ; CLKWAIT: ; ; IF BOARD NOT THERE THEN RETURN ERROR ; CALL ISTHERE RET NZ ; ; FETCH CURRENT SECONDS ; LD C,C+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; STOP CLOCK FUNCTION #8 ; EXIT - A, B= ? ; ;++++FUNCTIONS & PROCEDURES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN 2 BCD DIGITS +++++++++++++ ; GETN: ; ; SAVE REGS ; PUSH BC ; ; FETCH LOW BYTE ; LD A,E AND A,CLK_DMSK LD C,A ; ; FETC++++++++ ; H2BCD: ; ; TENS = 0 ; LD L,0 ; ; IF UNITS < 10 THEN DONE ; H2BCDL: CP A,10 RET C ; ; ELSE UNIT********** ; ; PRTS ROUTINE OUTPUTS AN ASCII STRING ONTO THE CONSOLE. ; THE STRING MUST BE TERMINATED BY BIT 7 SET IN THE LA WINDOW, IF PRESENT OUT (DD_PRT3),A OUT (DD_PRT5),A OUT (DD_PRT8),A ; ; SET MEMORY BANK ; LD A,DEFBNK OUT (BNKREGE VALUE LD (IOBYTE),A ; ; SET BANK STACK ; LD (THIS_STK),SP ; ; SET FUNCTION CALL RESTART ; LD HL,FUNENT LD (MLK_SECL CALL GETD AND A,CLK_DMSK ;MASK OFF UNWANTED BITS LD B,A ; ; WAIT UNTIL SECONDS CHANGE ; CLKRWT: CALL GETD ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKSTOP: ; ; PUT HOLD ON CLOCK ; LD A,[1 SHLFROM CLOCK FUNCTION ; ENTRY- C= CLOCK REGISTER # ; EXIT- DE= DIGITS ; A= HIGH DIGIT ; C= C + 2 ; ;++++++++++++++++++++++H HIGH BYTE ; LD A,D ; ; MASK OFF NON-NUMERICAL BITS ; AND A,H ; ; MULTIPLY TENS DIGIT BY 10 & ADD TO UNITS ; LS -= 10 ; SUB A,10 INC L JR H2BCDL ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ST CHAR OF THE STRING. ; ENTRY- HL= TEXT PTR ; ;**************************************************************************** ),A ; ; INITIALIZE RESTART VECTORS IN PAGE 0 ; LD SP,003FH ;USE STACK TO INIT RESTARTS LD HL,0C300H LD DE,RSTER LD FUNRSV),HL ; ; INIT ROMS (I/O) ; LD HL,[CHR_RNUM SHL 8] + 1 ;CHAR PUSH HL CALL XROMF POP HL ; LD HL,[DEB_RNUM SH AND A,CLK_DMSK CP A,B JR Z,CLKRWT ; ; DONE, RETURN 0 ; LD B,A XOR A,A RET ;++++++++++++++++++++++++++++++++ CLK_HOLD] OUT (CLK_DATA),A ; ; DELAY >= 150us FROM HOLD ; LD B,20 ;DELAY >= 150us FROM HOLD ; CLKSDL: EX (SP),HL ++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; GET2D: ; ; FETCH LOW DIGIT ; CALL GETD LD E,A ; ; FETCH D B,A ;SET CNT LD A,C ;GET UNITS DIGIT JR Z,NOTENS ;IF (TENS & MASK) == 0 THEN RETURN UNITS ; LD C,10 ;ELSE ADD TENS D ; SET CLOCK DIGIT PROCEDURE ; ENTRY- A= BCD DATA ; C= COMMAND ; EXIT - A= COMMAND ; ;++++++++++++++++++++++++++++++++++++ ; PRTS: ; ; TOP OF PRINTING LOOP ; LD C,(HL) ;FETCH CHAR ; RES 7,C ;MAKE SURE BIT 7 = 0 PUSH HL CALL CO POP B,16 ;64 BYTES ; INIT1: PUSH DE PUSH HL DJNZ INIT1 ; ; SET STACK ; LD SP,MONSTK ; ; SET MEMORY BANK CONSTANT L 8] + 1 ;DEBUGGER PUSH HL CALL XROMF POP HL ; LD HL,[DK_RNUM SHL 8] + 1 ;DISK PUSH HL CALL XROMF POP HL ; L++++++++++++++++++++++++++++++++++++++++++++ ; ; TEST IF BOARD PRESENT FUNCTION #7 ; EXIT - A,L= 0: THERE, /0: NOT THERE ; EX (SP),HL DJNZ CLKSDL ; ; DONE ; RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++HIGH DIGIT ; INC C CALL GETD LD D,A ; ; PRESETUP FOR NEXT TIME ; INC C ; ; DONE ; RET ;+++++++++++++++IGIT ; TENSLP: ADD A,C DJNZ TENSLP ; ; DONE CONVERTING, RESTORE & RETURN ; NOTENS: POP BC ; RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLK_SET: ; ; OUTPUT DATA ; SET CLK_HOLD,A ;KEEP CLOCK STOPPED OUT (CLK_DATHL ; BIT 7,(HL) ;IF BIT 7 = 1 THEN STOP INC HL JR Z,PRTS ; ; DONE ; RET ;***********************************; LD (THIS_BNK),A ;A STILL HAS DEFAULT BANK # LD (CURBNK),A ; ; INIT ALL BANKS ; LD E,A ;START WITH ALL Z80 BANKS D HL,[CLK_RNUM SHL 8] + 1 ;MISC PUSH HL CALL XROMF POP HL ; ; OUTPUT SIGN-ON MESSAGE ; LD HL,LOGMSG ;OUTPUT SIGN-O;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ISTHERE: ; ; FETCH CLOCK DATA ; IN A,(C+ ; ; START CLOCK FUNCTION #9 ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKSTRT: +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CONVERT BCD NUMBER TO BINARY FUNCTION ; ENTRY- E= LO BCD # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CONVERT BINARY NUMBER TO BCD DIGITS FUNCTION ; ENTRY- A= A),A ; ; OUTPUT REGISTER # ; LD A,C OUT (CLK_CMD),A ; ; STROBE DATA INTO REGISTER ; SET CLK_WRT,A OUT (CLK_CMD***************************************** ; ; SEND CHAR TO SYSTEM CONSOLE PROCEDURE ; ENTRY- C= CHAR ; ;*******************LD HL,THIS_BNK ;POINT TO LOCATION TO STORE BANK # BNKS_INIT: LD C,E ;STORE IT CALL PUTMEM ; INC E ;NEXT BANK ; LD AN CALL PRTS ; ; EXECUTE THE DEBUGGER ; MAINLP: LD SP,MONSTK LD HL,[DEB_RNUM SHL 8] + MF_XDEB - 16 + 2 ;3 PUSH HL 0 %+ &, !'- "(. #)/ $*0 TITLE M5b MISCELLANEOUS I/O DRIVER ROM LIST NOCOND ;***************************************************************************************** SUBTTL DECLARATIONS ;============================================================================ ; ;*MTERNAL FUNCTION STUB FOR USE DURING AN INTERRUPT WITHOUT THE ; RESIDENT ROM ENABLED. USE IN ALL NON-RESIDENT ROMS. ; ENTRY- A=; ; IF RETURNED THEN HALT ; HALT SUBTTL MONITOR BOARD SHADOW ROM SELECTION PROCEDURE *INCLUDE XROM.Z80 SUBTTL IR NC,MFUNERR ; ; FUNCTION SEEMS LEGAL, FETCH EXECUTION ADDRESS FROM TABLE ; PUSH HL ;SAVE POSSIBLE ARGUMENT ; LD HL,F DATA DW CLKTIM ;4: RETURN CLOCK TIME DATA DW CLKRETR ;5: RETURN CLOCK REGISTER DATA DW CLKWAIT ;6: WAIT FOR CLOCK TO CDE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKSCAL: ; ; STOP CLOCK ; PUSOCK TIME FUNCTION #2 ; ENTRY- B= SECONDS ; D= MINUTES ; E= HOURS ; EXIT - A= 0 ; BC, DE= ? ; ;++++++++++++++++++++++++**** ; ; MISC. I/O DRIVER ROUTINES FOR M5b ; *INCLUDE B:ZBMH122.HDR ;******************************************************ACLIB ASMBTOOL.MLB ;*INCLUDE MONBOARD.DEF ;*INCLUDE CLOCK.DEF ;*INCLUDE B:ZBMF101.DEF ;*INCLUDE B:ZBMG101.DEF ; ;== FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; I_STUB: ADD A,2 ;BIAS UP NITIALIZATION CODE ;---------------------------------------------------------------------------- ; ; THIS IS THE COLD START IUNTABL 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 ARGUMEHANGE DW ISTHERE ;7: RETURN BOARD PRESENT STATUS DW CLKSTOP ;8: STOP CLOCK DW CLKSTRT ;9: START CLOCK ; MAXFUNS EQU (H BC CALL CLKSTOP ; ; SET UP PTR TO REGS ; LD C,CLK_WEEK ; ; PROCESS DAY OF WEEK ; LD A,L CALL H2BCD ;A= LSD,++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKSTIM: ; ; STOP CLOCK ; CALL CLKSTOP ; ; SET UP TO SET EAC********************** ; ; REVISION HISTORY: ; ; 1.0 - 23 SEP 83 GRH ; Initial version transferred from CBIOS routines. ========================================================================== LIST OFF *MACLIB ASMBTOOL.MLB *INCLUDE MONBOPUSH HL LD H,MR_RNUM ;USE RESIDENT ROM LD L,A EX (SP),HL CALL XROMF ;GO EXECUTE THE FUNCTION INC SP ;BALANCE STACK NIT CODE ; ;---------------------------------------------------------------------------- ; ROM_INIT: ; ; OUTPUT SIGN-ON NT & PUT EXECUTION ADDRESS ON STACK EX (SP),HL ; ; RETURN TO EXECUTION ADDRESS ; RET ; ; ; FUNCTION ERROR ; MFUN$ - FUNTABL) / 2 SUBTTL ROM FUNCTIONS ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; R L= MSD ; CALL CLK_SET ; ; PROCESS DATE ; INC C POP HL ;WAS BC (DATE) LD A,H CALL H2BCD ; CALL CLK_SET ; H REGISTER ; LD C,CLK_SECL ;SET REGISTER # ; ; PROCESS SECONDS ; LD A,B CALL H2BCD ; CALL CLK_SET ; LD A,L I; ; 1.22 11-25-90 GRH ; Modify slightly for Shared ROM ZMON V. 1.22. ; ; 1-7-91 GRH ; Change read clock buffer functionARD.DEF *INCLUDE CLOCK.DEF *INCLUDE B:ZBMF101.DEF *INCLUDE B:ZBMG101.DEF LIST ON THIS_ROM EQU CLK_RNUM ;ROM # OF THIS  INC SP RET ;**************************************************************************** ; ; COLD INIT ONLY SWITCHES TMESSAGE ; LD HL,LOGMSG ;OUTPUT SIGN-ON CALL PRTS ; RET LOGMSG: DB ' Misc. Drivers V. ' PVERS VERSN DM CR,LF SERR: LD A,-1 OR A,A RET ;############################################################################ ; ; MONITOR FETURN VERSION FUNCTION #0 ; EXIT - HL= VERSION # (123D = 1.23) ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++LD A,L INC C CALL CLK_SET ; ; PROCESS MONTH ; INC C LD A,D CALL H2BCD ; CALL CLK_SET ; LD A,L INC C CALNC C CALL CLK_SET ; ; PROCESS MINUTES ; INC C LD A,D CALL H2BCD ; CALL CLK_SET ; LD A,L INC C CALL CLK_SE (1) to set clock calendar, and ; write clock buffer function (2) to set clock time. ; 1-21-91 GRH ; Fix bug in clock timeROM SUBTTL EXTERNAL ENTRY POINTS ORG MONROM ; JP CINIT ;COLD START ; ; EXTERNAL FUNCTION ENTRY DURING INTERRUPT O RESIDENT ROM ; ;**************************************************************************** ; CINIT: ; ; SET STACK ;UBTTL MONITOR FUNCTION CALL DISPATCHER ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; ENTRUNCTION TABLE ; ;############################################################################ ; FUNTABL: DW RETVERS ;0: R+++++++++++++++++ ; RETVERS: LD HL,VERSN RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++L CLK_SET ; ; PROCESS YEAR ; INC C LD A,E CALL H2BCD ; CALL CLK_SET ; LD A,L INC C CALL CLK_SET ; ; DONT ; ; PROCESS HOURS ; INC C LD A,E CALL H2BCD ; CALL CLK_SET ; LD A,L SET 3,A ;SET 24 HR FORMAT BIT (HOURS M set function which set chip to 12 Hr format. ; VERSN EQU 122 ; ;*********************************************************** ; DS (MONROM + 6) - $ JP I_STUB ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EX LD SP,MONSTK ; ; RESET ROM FUNCTION SHOULD NOT RETURN HERE ; LD HL,[MR_RNUM SHL 8] + 1 ;RESET PUSH HL CALL XROMF Y- A= FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; FUNCH: CP A,MAXFUNS JETURN ROM VERSION # DW CLKSCAL ;1: SET CLOCK CALENDAR DW CLKSTIM ;2: SET CLOCK TIME DW CLKCAL ;3: RETURN CLOCK CALENDAR+++++ ; ; SET CLOCK CALENDAR FUNCTION #1 ; ENTRY- B= DATE ; D= MONTH ; E= YEAR ; L= DAY OF WEEK ; EXIT - A= 0 ; BC, E, TURN ON CLOCK ; JP CLKSTRT ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SET CLSD) INC C CALL CLK_SET ; ; START CLOCK ; JP CLKSTRT ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++0 %+ &, !'- "(. #)/ $*0 SUBTTL SOLID STATE MUSIC CB2 Z-80 CPU DEFINITIONS ;***************************************************************************TO CHECK FOR CHANGE ; OR A,A JR Z,DOMOVE ; ; ELSE OTHER COMMANDS NEED TO CHECK DATA TO STOP ; D3LP: IN A,(HDATA) ;IF  PUSH HL PUSH DE EXX POP DE POP HL LD BC,1000H ADD HL,BC EXX ; ; SET COUNT ; LD BC,1000H ; ; FETCH DAT************************************************** ; ; REVISION STATUS: ; ; 3.0 - 28 JAN 87 GRH ; Change Jade DD boot to  ROMs not set up. ; 3.03 25 JUN 88 GRH ; Modify floppy boot to include new disk format with disk system tracks ; directorn calls. All Rom ; functions are supported thru the Rom swap address from the Monitor ; Rom. ; 3.07 11-25-90 GRH ; Modif============================================= ; ; CONSTANTS ; ;========================================================== ; ;============================================================================ LIST OFF *MACLIB ASMBTOOL.MLB *INCLUDE * ; ; Solid State Music model CB2, Z-80 CPU definitions ; ;*****************************************************************DATA == 1 THEN READ CP A,2 JR C,DOREAD ; JR Z,DOWRITE ;ELSE IF DATA == 2 THEN WRITE ; XOR A,A ;ELSE QUIT WITHOUT ERROA ; DOMOVLP: CALL GETBI ; ; STORE DATA ; EXX LD C,A CALL PUTBI EXX DEC BC LD A,C OR A,B JP NZ,DOMOVLP resident prom version. ; Implement disk I/O driver functions & vectors and COMIOPB. ; Add error message output. ; Add prom # y like the hard disk has (removed DCM & BLT loader). ; 3.04 7 JUL 88 GRH ; Add '?' to all include file names. ; Change booty slightly for ZMON Vers. 1.22. ; 3.08 2-20-91 GRH ; Make IOPB Sector for ISHA the same as floppies (0..n -> 1..n-1). ; Th================== FALSE EQU 0 TRUE EQU NOT FALSE ; DEBUG EQU FALSE ; HNGTMO EQU 10 ;HANGUP TIMOUT SECSIZ EQU 128 ;DISK MONBOARD.DEF *INCLUDE JDDCONT.DEF *INCLUDE ISHA.DEF *INCLUDE DISKS3.DEF *INCLUDE BDIR.DEF *INCLUDE B:ZBMF101.DEF *********** ; ; REVISION HISTORY: ; 1.0 - 8-13-91 GRH ; First cut. ; ;**************************************************R RET ; ;---------------------------------------------------------------------------- ; ; CONTINUOUS WRITES COMMAND ; ; ; ONLY DO THIS ONE ONCE ; XOR A,A RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++& drive passed in page 0. ; Drives now assigned the following logical to physical relationship: ; 0..3 = 8" Jade floppy ; 4.. system tracks directory references to new format. ; 3.05 6 AUG 88 GRH ; Make changes to Jade driver to support new IOPB foris also make 5" ISHA same as 8". ; Change references to THIS_BNK to CURBNK. ; ; 3.09 5-18-91 GRH ; Add hung ISHA reset cod SECTOR SIZE ; ; SYSTEM LOCATIONS ; LOGINBYTE EQU 0004H ;CP/M CURRENT DRIVE & USER BYTE DEFBFR EQU 0080H ;USE CPM DEFAU *INCLUDE B:ZBMG101.DEF LIST ON THIS_ROM EQU DK_RNUM ;ROM # OF THIS ROM DSKBNK EQU 0FEH ;BANK # OF FLOPPY DISK CONTROLLE************************** ;============================================================================ ; ; EXTENDED ADDREDOWRITE: LD C,A ;USE ARGUMENT AS DATA CALL PUTB JR D3LP ; ;-------------------------------------------------------------+ ; ; PRINT TEXT ON THE PRINTER COMMAND 0FH, EXERCISES THE I/O CAPABILITY ; ENTRY- A= PORT # ; (IOPB)= TEXT STRING PTR (TER7 = 8" ISHA hard disk ; 8..B = 5" Jade floppy ; C..F = 8" Micromation Doubler (ISIS) ; 10..13= 3" Jademat. ; 3.06 26 SEP 88 GRH ; Add code for ISHA 5" Hard Disk support. ; 0..3 = 8" Jade floppy ; 4..7 = 8" ISHA hard disk ; e to driver. It was in BIOS. ; ; 3.10 8-26-91 GRH ; Remove drive manipulation overhead. ISHA v3.02A now masks off ; unuseLT BUFFER FOR BIOS SECTOR 1 PROMST EQU 0F800H PROMSIZ EQU 2048 ;SIZE OF THIS PROM FOR CODE CHECKING ;===================RS BTENTS EQU 86H ;BOOT DIRECTORY VALIDITY CONSTANT ;####################################################################SS PORT ; ;============================================================================ ; BNKPORT EQU 0FEH --------------- ; ; CONTINUOUS READS COMMAND ; DOREAD: CALL GETB JR D3LP ; ; ;------------------------------------- TITLE M5b BANKED MONITOR DISK DRIVER ROM LIST NOCOND ;********************************************************************** floppy ; 3.01 4 JUN 88 GRH ; Fix bug in ISHAX that prevented the clear controller command from ; 8..B = 5" Jade floppy ; C..F = 5" ISHA Hard Disk ; 10..13 = 8" Micromation Doubler (ISIS) ; 14..17= 3"d bits. ; Fix problem with Clear Controller IOPB Command (drive == 0FFh). ; Move flag to track. ; VERSN EQU 310 ; ;******========================================================= ; ;*MACLIB ASMBTOOL.MLB ;*INCLUDE MONBOARD.DEF ;*INCLUDE JD######## ; ; PAGE 0 RESERVED AREA ; ;############################################################################ ORG 00+++++++++++++++++++++++++ ; DIAG3: ; ; SET UP PTRS ; LD HL,(IOPBL) LD DE,(IOPBXA) ; ; IF BLOCK MOVE THEN NO NEED --------------------------------------- ; ; BLOCK MOVE COMMAND TO LOW MEMORY ; DOMOVE: ; ; COMPUTE DESTINATION PTR ; ****** ; ; DISK CONTROLLER BOOTSTRAP DRIVER FOR M5B WITH ZMON MONITOR. ; *INCLUDE B:ZBMH122.HDR ;************************** working. ; 3.02 12 JUN 88 GRH ; Change 'RET'urns in 'H8BOOT' to 'JP ....,DKRET'. Returns caused ; system crashes because Jade floppy ; Change ?xxx symbols to x_xx symbols. ; First interim version supporting Monitor functio********************************************************************** SUBTTL DECLARATIONS ;===============================DCONT.DEF ;*INCLUDE ISHA.DEF ;*INCLUDE DISKS3.DEF ;*INCLUDE BDIR.DEF ;*INCLUDE B:ZBMF101.DEF ;*INCLUDE B:ZBMG101.DEF 40H ; ; BOOT VARIABLES ; DK_PROM DS 2 ;PROM # & DRIVE PASSED TO BIOS BIOSLN DS 2 ;BIOS LENGTH SAVE/SECTOR COUNT BIOSNT D0 %+ &, !'- "(. #)/ $*0S 2 ;BIOS ENTRY SUBTTL EXTERNAL ENTRY POINTS ORG MONROM ; JP CINIT ;COLD START ; ; EXTERNAL FUNCTION ENTRY DURINY SWITCHES TO RESIDENT ROM ; ;**************************************************************************** ; CINIT: ; ;  DM CR,LF SUBTTL LOW MEMORY PROCEDURES ;**************************************************************************** ; ;DESTINATION BANK ; B= SOURCE BANK ; EXIT - AF=BC=DE=HL= ? ; ;**************************************************************++ ; GETB: XRROM MF_GMEM RET SUBTTL MONITOR FUNCTION CALL DISPATCHER ;+++++++++++++++++++++++++++++++++++++++++++++################################ ; ; MONITOR FUNCTION TABLE ; ;#############################################################------------------------------------------------------------------- ; ; BOOT DISK FUNCTION #1 ; ENTRY- B= DRIVE # ; 0..3 =E ; CP A,4 ;IF 8" FLOPPY DISK THEN EXIT JP C,F8BOOT ; CP A,8 ;IF HARD DISK THEN EXIT JP C,H8BOOT ; CP A,0CH ;IF G INTERRUPT ; DS (MONROM + 6) - $ JP I_STUB ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++SET STACK ; LD SP,MONSTK ; ; RESET ROM FUNCTION SHOULD NOT RETURN HERE ; LD HL,[MR_RNUM SHL 8] + 1 ;RESET PUSH HL  PRTS ROUTINE OUTPUTS AN ASCII STRING ONTO THE CONSOLE. ; THE STRING MUST BE TERMINATED BY BIT 7 SET IN THE LAST CHAR OF THE S************** ; BNKSEL: XRROM MF_SBNK RET ;*************************************************************************+++++++++++++++++++++++++++++++ ; ; ENTRY- A= FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++############### ; FUNTABL: DW RETVERS ;0: RETURN ROM VERSION DW MBOOT ;1: BOOT DISK WITH ARGUMENT IN BC DW TST_PB ;2: 8" JADE FLOPPY ; 4..7 = 8" HARD DISK (ISHA) ; 8..B = 5" JADE FLOPPY ; C..F = 5" HARD DISK ; 10..13 = 8" MICRO5" FLOPPY THEN EXIT JP C,F5BOOT ; CP A,10H ;IF 5" HARD DISK THEN EXIT JP C,H5BOOT ; CP A,14H ;IF MICROMATION THEN EX+++ ; ; EXTERNAL FUNCTION STUB FOR USE DURING AN INTERRUPT WITHOUT THE ; RESIDENT ROM ENABLED. USE IN ALL NON-RESIDENT ROMS. CALL XROMF ; ; IF RETURNED THEN HALT ; HALT SUBTTL MONITOR BOARD SHADOW ROM SELECTION PROCEDURE *INCLUDE B:XROM.Z8TRING. ; ENTRY- HL= TEXT PTR ; ;**************************************************************************** ; PUTS: PRTS:*** ; ; PERFORM BANKED MEMORY BLOCK MOVE ; ENTRY- HL= SOURCE PTR ; DE= DESTINATION PTR ; BC= BYTE COUNT ; EXIT - AF=BC=D++++++++++++ ; FUNCH: CP A,MAXFUNS JR NC,MFUNERR ; ; FUNCTION SEEMS LEGAL, FETCH EXECUTION ADDRESS FROM TABLE ; PUS TEST IOPB STATUS FOR ERROR ; E:HL= PTR TO IOPB DW DIS_PB ;3: DISPLAY IOPB DATA ; E:HL= PTR TO IOPB DW EX_IOPB ;MATION (INTEL M2FM) ; 14..17 = 3" JADE FLOPPY ; ;-----------------------------------------------------------------------IT JP C,M8BOOT ; CP A,18H ;IF 3" FLOPPY THEN EXIT JP C,F3BOOT ; ; FALL INTO ERROR RETURN TO PRINT MESSAGE ; ;- ; ENTRY- A= FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; I_STUB: ADD A,2 0 SUBTTL INITIALIZATION CODE ;---------------------------------------------------------------------------- ; ; THIS IS TH ; ; SAVE REGISTER ; PUSH BC ; ; TOP OF PRINTING LOOP ; PRTA: LD C,(HL) ;FETCH CHAR ; RES 7,C ;MAKE SURE BIT 7E=HL= ? ; ;**************************************************************************** ; BMOVE: XRROM MF_BMOV RET H 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 4: EXECUTE IOPB ; E:HL= PTR TO IOPB ; MAXFUNS EQU ($ - FUNTABL) / 2 SUBTTL MONITOR FUNCTIONS ;++++++++++++++++++++++----- ; MBOOT: ; ; SAVE PROM # FOR BIOS ; LD A,C AND A,7 LD (DK_PROM),A ; ; EXTRACT DRIVE # FROM ARGUMENT ; --------------------------------------------------------------------------- ; ; ABORT RETURNS CONTROL TO THE MONITOR ROM WITH  ;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 ;BALE COLD START INIT CODE ; ;---------------------------------------------------------------------------- ; ROM_INIT: ; ; O = 0 CALL CO ; LD A,(HL) ;IF BIT 7 = 1 THEN STOP INC HL RLCA JR NC,PRTA ; ; RESTORE & RETURN ; POP BC RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN BANKED MEMORY BYTE FUNCTION ; ENTRY- LD H,(HL) LD L,A ; ; RESTORE ARGUMENT & PUT EXECUTION ADDRESS ON STACK EX (SP),HL ; ; RETURN TO EXECUTION ADDRESS ++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN VERSION FUNCTION #0 ; EXIT - HL= VERSION # (123D = 1.23) ;REPT 4 ;D4..D11 -> D0..D7 SRL B RR C ENDM ; ; IF DRIVE # > 0FFH THEN ABORT ; LD A,B OR A,A JP NZ,ABORT ; ; ERROR FLAG (CF) SET ; ;---------------------------------------------------------------------------- ; ABORT: SCF ;HAVE MONANCE STACK INC SP RET ;**************************************************************************** ; ; COLD INIT ONLUTPUT SIGN-ON MESSAGE ; LD HL,LOGMSG ;OUTPUT SIGN-ON CALL PRTS ; RET LOGMSG: DB ' M5b Disk Driver V. ' PVERS VERSN  ;**************************************************************************** ; ; SETUP BANKS FOR BLOCK MOVE ; ENTRY- C=  E:HL= PTR TO LOCATION OF DATA ; EXIT - A= DATA ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++; DKRET: RET ; ; ; FUNCTION ERROR ; MFUNERR: LD A,-1 OR A,A RET ;############################################ ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; RETVERS: LD HL,VERSN RET ;--------- SAVE DRIVE # AS LOGIN DRIVE FOR BIOS ; LD A,C LD (LOGINBYTE),A LD (DK_PROM + 1),A ; ; NOW VECTOR TO DISK BOOT ROUTINITOR PRINT ERROR MESSAGE JP DKRET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; TES0 %+ &, !'- "(. #)/ $*0T IOPB STATUS FOR ERROR FUNCTION 2 ; ENTRY- E:HL= IOPB PTR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++2) ; ; IF NO ERROR THEN RETURN IT ; OR A,A RET Z ; ; ELSE FALL INTO ERROR OUTPUT ; ;+++++++++++++++++++++++++L,(IOPBPTR) LD DE,(IOPBPTR + 2) LD B,PB_SIZE ; DBTE1: PUSH DE PUSH HL CALL GETB ; CALL HTOA ; CALL SPACE ;DISPL; SET IOPB PTR ; LD (IOPBPTR),HL LD A,E LD (IOPBPTR + 2),A ; ; FALL INTO DISK EXECUTER FUNCTION ; ;++++++++++C,ISHAX5 ; ; ELSE FALL INTO SELECT ERROR ; ;**************************************************************************; CONTROLLER NOT SENSED ERROR ; EXIT - AF= -2 ; (IOPB.PB_STAT)= CONTROLLER NOT PRESENT ERROR ; ;*************************** ; LD A,(LOGINBYTE) ;SET DRIVE LD (IOPB + PB_DRVO),A ; LD A,-1 ;SET CONTROLLER RESET FUNCTION LD (IOPB + PB_TRKO),A  ; LD HL,(DEFBFR + BD_SIOSS) LD A,H LD H,0 LD (IOPB + PB_SECO),HL LD L,A LD (IOPB + PB_TRKO),HL ; ; READ 1ST BI+++++++++++++ ; TST_PB: ; ; SET IOPB PTR ; LD (IOPBPTR),HL LD A,E LD (IOPBPTR + 2),A ; ; FALL INTO LOCAL FUNCTI+++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; DISPLAY IOPB DATA FUNCTION 3 ; ENTRY- E:HL= IOPB PTR ; ;+++++++++++AY SEPARATOR ; POP HL POP DE INC HL ;NEXT VALUE DJNZ DBTE1 ;IF NOT DONE THEN CONTINUE ; ; DISPLAY PORT # ; CAL++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE DISK IOPB FUNCTION ; ENTRY- (IOPBPTR)= IOP** ; ; ILLEGAL DRIVE REQUESTED ; EXIT - AF= -2 ; (IOPB.PB_STAT)= ILLEGAL COMMAND ERROR ; ;******************************************************************************** ; JCNP: LD (IX + PB_STATO),PB_CNP JR DSKERR SUBTTL JADE 5" & 8" FL ; LD HL,IOPB LD (IOPBPTR),HL LD A,(CURBNK) LD (IOPBPTR + 2),A CALL JADEX8 CALL DQERR JP NZ,ABORT ; ; PREPAREOS SECTOR INTO BUFFER ; CALL JADEX8R CALL NZ,DBERR JP NZ,DKRET ; ; FETCH BIOS LOAD ADDRESS & SIZE PARAMETERS FROM BIOON ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; TEST IOPB STATUS FOR ERROR FUNCTI+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; DIS_PB: ; ; SET IOPB PTR ; LD (IOPBPTR),HL LD A,EL SPACE CALL SPACE ;OUTPUT PORT # LD A,(DDPORT) CALL HTOA ; ; DISPLAY CONTROLLER ADDRESS ; CALL SPACE LD A,(DDADB ADDRESS ; EXIT - AF= 0: NO ERRORS ; ; A,BC,BC',HL,HL',DE= ? ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++********************************************* ; JSELERR: LD HL,(IOPBPTR) ;CALCULATE PTR TO STATUS LD DE,PB_STATO ADD HL,OPPY CONTROLLER DRIVER ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; 8" JADE FLOPPY BOOT  IOPB ; LD HL,LOGIOPB CALL IIOPB ; LD A,(LOGINBYTE) ;SET DRIVE LD (IOPB + PB_DRVO),A ; LD A,ID_SECT ;SET SECTOR S 1ST SECTOR ; CALL STUPBIOS JP C,DKRET ; ; READ BIOS ; JADRDB: CALL JADEX8R CALL NZ,DBERR JP NZ,DKRET ; LD ON 2 ; ENTRY- (IOPBPTR)= IOPB PTR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; DQERR:  LD (IOPBPTR + 2),A ; ; FALL INTO DISPLAY ROUTINE ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++DR + 1) CALL HTOA LD A,(DDADDR) CALL HTOA ; ; NEW LINE & RETURN ERROR ; CALL CRLF JP DSKERR ;++++++++++++++++++++++++++++++++++++ ; DSKX: ; ; FETCH DRIVE # ; LD HL,(IOPBPTR) INC HL LD A,(HL) ; ; IF JADE 8" FLOPPY THEN GDE LD (HL),PB_ILCMD ; ; FALL INTO DISK ERROR ; ;******************************************************************** ; THIS ROUTINE NOW ACCESSES THE NEW JADE CONTROLLER WITH ON-BOARD PROM. ; THE CODE WILL COMMAND THE CONTROLLER TO READ THE BLD (IOPB + PB_SECO),A ; ; LOG ON DRIVE ; CALL JADEX8R CALL NZ,DBERR JP NZ,DKRET ; ; READ THE DIRECTORY SECTOR ; HL,(IOPB + PB_SECO) ;NEXT SECTOR INC HL LD (IOPB + PB_SECO),HL ; LD HL,(IOPB + PB_DMAO) ;BUMP LOAD ADDRESS LD DE,(IOPB ; ; RESTORE PTRS ; LD HL,(IOPBPTR) LD DE,(IOPBPTR + 2) ; ; CALCULATE PTR TO STATUS ; LD A,PB_STATO ADD A,L L+++++++++++++ ; ; DISPLAY IOPB DATA FUNCTION ; ENTRY- (IOPBPTR)= IOPB PTR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE IOPB FUNCTION 4 ; ENTRY- E:HL= IOPB PTR ; EXIT - IO EXECUTE IT ; SUB A,4 JP C,JADE8 ; ; ELSE IF SASI 8" HARD DISK THEN GO EXECUTE IT ; SUB A,4 JP C,ISHAX8 ; ; E******** ; ; COMMON ERROR CODE ; EXIT - AF= -2 ; ;*************************************************************************IOS FROM THE DISK AND ; EXECUTE THE COLD START ENTRY IN THE BIOS. ; ENTRY- C, (LOGINBYTE)= DRIVE ; ;++++++++++++++++++++++ LD A,BD_SEC LD (IOPB + PB_SECO),A LD A,PB_READC LD (IOPB + PB_CMDO),A CALL JADEX8R CALL NZ,DBERR JP NZ,DKRET ; ; + PB_BCNTO) ;SECSIZ ADD HL,DE LD (IOPB + PB_DMAO),HL ; LD HL,BIOSLN ;IF --COUNT != 0 THEN REPEAT DEC (HL) JR NZ,JADD L,A LD A,0 ADC A,H LD H,A ; ; FETCH DATA ; CALL GETB ; ; RESTORE PTR ; LD HL,(IOPBPTR) LD DE,(IOPBPTR + ++++++++++++++++++++++++++++++ ; DBERR: ; ; DISPLAY HEADER ; LD HL,DERM CALL PUTS ; ; DISPLAY IOPB DATA ; LD HOPB.STATUS= 0: OK, /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; EX_IOPB: ; LSE IF JADE 5" FLOPPY THEN GO EXECUTE IT ; SUB A,4 JP C,JADE5 ; ; ELSE IF SASI 5" THEN GO EXECUTE IT ; SUB A,4 JP *** ; DSKERR: LD A,-2 OR A,A RET ;**************************************************************************** ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; F8BOOT: ; ; RESET THE CONTROLLER ; LD HL,CLRIOPB CALL IIOPB  IF NOT DIRECTORY SECTOR THEN ERROR ; LD A,(DEFBFR) CP A,BTENTS JP C,DKRET ; ; ELSE FETCH THE LOCATION FOR THE BIOSRDB IF DEBUG ; ; RETURN TO MONITOR ; OR A,A ;RETURN NO ERROR JP DKRET ELSE ; ; EXECUTE THE BIOS COLD STAR0 %+ &, !'- "(. #)/ $*0T ENTRY BY USING THE RESIDENT ROM ROUTINE ; LD HL,(BIOSNT) PUSH HL XRROM 8 JP DKRET ENDIF ;+++++++++++++++++++,(IOPBPTR) INC HL LD (HL),B ; ; DONE ; RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++; FALL INTO JADE EXECUTOR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE X LD IX,(IOPBPTR) ; ; IF COMMAND == CLEAR THEN EXIT ; LD A,(IX + PB_CMDO) CP A,PB_CLRC JP NZ,JNOCLR8 ; ; IF ALLUNT LD BC,(DDPORT) LD A,DD_MB1 OUT (C),A PUSH HL ;SAVE SRC PTR ; LD B,(IX + PB_DMAXO) ;SET BANKS LD C,DSKBNK CALT ;WAIT FOR COMPLETION JP NZ,JERET ;IF ERROR THEN RETURN ERROR ; ; COMMAND EXECUTED, XFER RESULTS FUNCTION ; SELECT COION ADDRESS ; LD E,(IX + PB_DMAO) LD D,(IX + PB_DMAO + 1) ; ; FETCH XFER COUNT ; LD C,(IX + PB_BCNTO) LD B,(IX + PSIZE TOO BIG ERROR ; JXERR: LD (IX + PB_STATO),PB_BADPB ;PASS BACK ERROR JR JDONE ; ; ; RETURN ERROR STATUS EXIT ; E+++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE DISK IOPB FUNCTION ; ENTRY- (IOPBPTR)= IOPB ADDRESS++++++++ ; ; EXECUTE THE JADE 8" FLOPPY DISK READ IOPB FUNCTION ; ENTRY- (IOPBPTR)= IOPB ADDRESS ; EXIT - AF= 0: NO ERRORS THE JADE FLOPPY DISK IOPB COMMON FUNCTION ; ENTRY- (IOPBPTR)= IOPB ADDRESS ; C= CONTROLLER PORT ADDRESS ; EXIT - AF= 0: NO E DRIVES THEN HARD RESET ; LD A,(IX + PB_DRVO) INC A JP NZ,JNOCLR8 ; LD A,DD_BGN JR JDOCMD ; ; ; FETCH SOURCE ADL BNKSEL ; POP HL ;SRC PTR POP BC ;COUNT LD DE,(DDADDR) ;DEST PTR CALL BMOVE ; ; EXECUTE THE COMMAND ; JEX: ; MMAND BLOCK WINDOW ; LD BC,(DDPORT) LD A,DD_MB0 OUT (C),A ; ; XFER IOPB STATUS TO HOST ; LD BC,(IOPBPTR + 2) ;SET B_BCNTO + 1) ; ; IF COUNT == 0 THEN NO UPLOAD ; LD A,C OR A,B JR Z,JDONE ; ; ELSE IF COUNT < 1024 THEN UPLOAD SECNTRY- A= ERROR CODE ; JERET: LD (IX + PB_STATO),A JR JDONE ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; A= DRIVE# -4 ; EXIT - AF= 0: NO ERRORS ; C= CONTROLLER PORT ADDRESS ; A,B,HL,DE= ? ; ;++++++++++++++++++++++++++++++; A,B,HL,DE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; JADEX8R: LD HL,0 LD (IRRORS ; A,B,HL,DE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; JADEX: ; ; SAVEDRESS FROM IOPB ; JNOCLR8: LD L,(IX + PB_DMAO) LD H,(IX + PB_DMAO + 1) ; ; FETCH COUNT ; LD C,(IX + PB_BCNTO) LD  ; OPEN WINDOW TO COMMAND BUFFER ; LD BC,(DDPORT) ;FETCH PORT # LD A,DD_MB0 ;OPEN WINDOW TO COMMAND BUFFER (BANK 0) OUTBANKS LD B,DSKBNK CALL BNKSEL ; LD HL,(DDADDR) LD DE,DD_CBO + PB_BCNTO ADD HL,DE ; EX DE,HL LD HL,(IOPBPTR) LDTOR DATA ; LD A,B CP A,4 JP C,JXUP ; ; ELSE IF COUNT > 1024 THEN ERROR ; LD A,C OR A,A JR NZ,JXERR ; ; UPL+++++++++++++++++ ; ; WAIT ON JADE CONTROLLER BUSY FUNCTION ; ENTRY- A= COMMAND TO OUTPUT ; EXIT - AF= 0: OK, /0: ERROR ; ++++++++++++++++++++++++++++++++++++++++++++++ ; ; JADE 5" ENTRY ; JADE5: LD C,DD_PRT5 JP JADEC ; ; ; JADE 8" ENTOPB + PB_BCNTO),HL ; ; FALL INTO LOCAL READ FUNCTION ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ PORT # ; LD A,C LD (DDPORT),A ; ; CHECK FOR CONTROLLER PRESENT ; IN A,(C) INC A ;0FFH IF NOT THERE JP Z,JCNP B,(IX + PB_BCNTO + 1) ; ; IF COUNT == 0 THEN NO DOWNLOAD ; LD A,C OR A,B JR Z,JEX ; ; ELSE IF COUNT < 1024 THEN D (C),A ; ; XFER THE IOPB TO THE CONTROLLER ; LD A,(IOPBPTR + 2) ;SET SRC BANK LD B,A LD C,DSKBNK CALL BNKSEL ; L BC,PB_BCNTO ADD HL,BC EX DE,HL ; LD BC,PB_SIZE - PB_BCNTO ; CALL BMOVE ; ; IF UPLOAD INHIBITED THEN SKIP IT ; OAD SECTOR DATA ; JXUP: PUSH DE ;DEST PTR PUSH BC ;BYTE CNT ; LD C,(IX + PB_DMAXO) LD B,DSKBNK CALL BNKSEL ; POPC= PORT # OF CONTROLLER ; DE,HL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; JWAITRY ; JADE8: LD C,DD_PRT8 ; ; COMMON INITIAL CODE ; JADEC: ADD A,4 ;BIAS DRIVE BACK UP LD B,A ; LD A,(HL) ;SAVE ++++++++++++++ ; ; EXECUTE THE JADE 8" FLOPPY DISK IOPB FUNCTION ; ENTRY- (IOPBPTR)= IOPB ADDRESS ; EXIT - AF= 0: NO ERRORS ; ; COMPUTE JADE CONTROLLER BASE ADDRESS ; DEC A ;FETCH ADDRESS SELECT SWITCH DATA AND A,DD_SASW RLCA OR A,HIGH DD_OWNLOAD DATA ; LD A,B CP A,4 JR C,JDOWN ; ; ELSE IF COUNT > 1024 THEN ERROR, SECTOR SIZE TOO BIG ; LD A,C OR A,AD HL,(DDADDR) ;COMPUTE DEST PTR LD DE,DD_CBO ADD HL,DE EX DE,HL ; LD HL,(IOPBPTR) ;SRC PTR = IOPB ADDRESS ; LD BC,PBBIT PB_INHX,(IX + PB_FLGO) JR NZ,JDONE ; ; XFER SECTOR DATA FROM CONTROLLER ; LD BC,(DDPORT) LD A,DD_MB0 ;SOFTLY GRAB BC ;BYTE CNT POP DE ;DEST PTR LD HL,(DDADDR) CALL BMOVE ; ; RELEASE IOPB WINDOW ; JDONE: LD A,DD_FREE LD BC,(: ; ; ISSUE PASSED COMMAND ; LD BC,(DDPORT) OUT (C),A ; ; PAUSE A WHILE FOR CONTROLLER TO CATCH UP ; EX (SP),HL CURRENT DRIVE LD (HL),B ;CHANGE TO LOCAL DRIVE # PUSH AF CALL JADEX ;EXECUTE FUNCTION POP BC ;RESTORE DRIVE # LD HL ; A,B,HL,DE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; JADEX8: LD C,DD_PRT8 ; BASE LD H,A LD L,0 LD (DDADDR),HL LD A,(CURBNK) LD (DDADDR + 2),A ; ; SETUP IOPB PTR ; LD HL,(IOPBPTR) PUSH I JP NZ,JXERR ; ; DOWNLOAD SECTOR DATA TO CONTROLLER ; JDOWN: ; ; OPEN WINDOW TO SECTOR BUFFER ; PUSH BC ;SAVE CO_STATO ;ONLY XFER PERTINENT BYTES CALL BMOVE ; ; EXECUTE THE COMMAND ; LD A,DD_EXC ;START COMMAND ; JDOCMD: CALL JWAI RESOURCES WITHOUT INTERRUPT OUT (C),A LD A,DD_MB1 ;OPEN WINDOW TO SECTOR BUFFER (BANK 1) OUT (C),A ; ; FETCH DESTINATDDPORT) OUT (C),A ; ; CHECK FOR ERROR ; LD A,(IX + PB_STATO) OR A,A ; ; DONE ; POP IX RET ; ; ; SECTOR  EX (SP),HL ; ; WAIT FOR TASK COMPLETION FOR A WHILE ; LD L,HNGTMO ;SET UP TIMOUT LD DE,0 ; JWAIT1: DEC DE ;IF NOT 0 %+ &, !'- "(. #)/ $*0TIMOUT THEN CONTINUE TO WAIT LD A,E OR A,D JR NZ,JWAIT2 ; DEC L ;IF TIME OUT THEN RETURN TO MONITOR OR A,L JP Z,DS+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; F3BOOT: EQU ABORT ;UNSUPPORTED SUBTTL MICR the BIOS image to the proper system ; address & jumps to the BIOS cold start entry point. ; ;********************************************************************************* ; ; REVISION STATUS: ; ; 1.0 - 26 FEB 81, Release ; 1.1 - Fix bug. ; 1.h the request thus ; yanking the processor out of it's sleep. ; 2.0 - 18 MAR 84 GRH ; Added hard disk boot option and boot  = 8" Micromation Doubler (ISIS) ; 10..13= 3" Jade floppy ; 3.01 4 JUN 88 GRHard Disk support. ; 0..3 = 8" Jade floppy ; 4..7 = 8" ISHA hard disk ; 8..B = 5" Jade floppy ; C..F = 5" ISHA Hard Disk ; 1************************************************************************** SUBTTL DECLARATIONS ;===========================KERR ; JWAIT2: IN A,(C) ;IF NOT DONE THEN WAIT AND A,DD_SHLT JR NZ,JWAIT1 ; RET ;RETURN ZF IF ($ AND 7FFFH) OMATION 8" FLOPPY DISK DRIVER ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; 8" MICROMATIO********************************************* ; H8BOOT: ; ; INSURE FDC WINDOW REMOVED ; LD BC,0341H XOR A,A H8B1: OU2 - 18 JUL 82, Move DD to high memory, clean up listing. ; 1.3 - 12 FEB 83 ; Add timout if DD not responding, add true recalibcommand source disk option. ; 2.1 - 18 APR 85 GRH ; Fix problem with hard disk boot from drive 1. Needs logon. Also ; Also  ; Fix bug in ISHAX that prevented the clear controller command from ; working. ; 3.02 12 JUN 88 GRH ; Change 'RET'urns 0..13 = 8" Micromation Doubler (ISIS) ; 14..17= 3" Jade floppy ; Change ?xxx sy================================================= ; ; CONSTANTS ; ;======================================================>= (0FC00H AND 7FFFH) CONMSG *** JADE DEPENDENT CODE OVERLAPS CONTROLLER MAP *** ENDIF SUBTTL JADE 5" FLOPPY DISK DRIVERN M2FM BOOT ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; M8BOOT: EQU ABORT ;UNSUPPORTEDT (C),A INC C DJNZ H8B1 ; ; ISSUE CLEAR CONTROLLER IOPB ; LD HL,CLRIOPB CALL IIOPB ; LD A,(LOGINBYTE) ;SET DRIVrate ; on boot in case the head is outside track 0. ; 1.4 - 14 FEB 83 ; Make changes for rev C board. ; 1.5 - 23 MAR 83 GRallow boot from 2nd platter. ; code logical physical ; 42 A DRIVE 0 HEAD 0 ; 52 B DRIVE 0 HEAD 2 ; 62 C DRIVE 1 HEAD 0 in 'H8BOOT' to 'JP ....,DKRET'. Returns caused ; system crashes because ROMs not set up. ; 3.03 25 JUN 88 GRH ; Modify flmbols to x_xx symbols. ; First interim version supporting Monitor function calls. All Rom ; functions are supported thru the ====================== FALSE EQU 0 TRUE EQU NOT FALSE ; DEBUG EQU FALSE ; HNGTMO EQU 10 ;HANGUP TIMOUT SECSIZ EQU 128 ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; 5" JADE FLOPPY DISK BOOT ; ;++++++++++++ ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; MICROMATION DRIVER ; ;++++++++++++++E # LD (IOPB + PB_DRVO),A ; LD A,-1 ;SET CONTROLLER RESET, NOT JUST DRIVE LD (IOPB + PB_TRKO),A ; LD HL,IOPB LD (IH ; Fix bug in recal routine to account for phase 1 anded with trk00 ; signal from drive. Causes recal to not work ; 1.6 - 3 ; 72 D DRIVE 1 HEAD 2 ; 3.0 - 28 JAN 87 GRH ; Change Jade DD boot to resident prom version. ; Implement disk I/O driver fuoppy boot to include new disk format with disk system tracks ; directory like the hard disk has (removed DCM & BLT loader). Rom swap address from the Monitor ; Rom. ; 3.07 11-25-90 GRH ; Modify slightly for ZMON Vers. 1.22. ; 3.08 2-20-91 GRH DISK SECTOR SIZE ; ; SYSTEM LOCATIONS ; LOGINBYTE EQU 0004H ;CP/M CURRENT DRIVE & USER BYTE DEFBFR EQU 0080H ;USE CPM D++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; F5BOOT: EQU ABORT ;UNSUPPORTED SUBTTL JADE 3" FLOPPY ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; M2X: EQU DSKERR SUBTTL ISHA 5" & 8" HARD DISK DRIVER ; TITLE M5b BANKED MONITOR DISK DRIVER ROM LIST NOCOND ;**********************************************************************APR 83 GRH ; Fix bug in boot routine that assumes the controller window is ; enabled after requesting it. Found out that if nctions & vectors and COMIOPB. ; Add error message output. ; Add prom # & drive passed in page 0. ; Drives now assigned the f; 3.04 7 JUL 88 GRH ; Add '?' to all include file names. ; Change boot system tracks directory references to new format. ;  ; Make IOPB Sector for ISHA the same as floppies (0..n -> 1..n-1). ; This also make 5" ISHA same as 8". ; Change references EFAULT BUFFER FOR BIOS SECTOR 1 PROMST EQU 0F800H PROMSIZ EQU 2048 ;SIZE OF THIS PROM FOR CODE CHECKING ;===============DISK DRIVER ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; 3" JADE FLOPPY DISK BOOT ; ;+**************************************************************************** ; ; Hard disk boot function. ; This module reads****** ; ; DISK CONTROLLER BOOTSTRAP DRIVER FOR M5B WITH ZMON MONITOR. ; *INCLUDE B:ZBMH122.HDR ;**************************the Z-80 is ; generating a wait signal, the bus request is never acknowledged! ; Solution is to output the RESET bit along witollowing logical to physical relationship: ; 0..3 = 8" Jade floppy ; 4..7 = 8" ISHA hard disk ; 8..B = 5" Jade floppy ; C..F3.05 6 AUG 88 GRH ; Make changes to Jade driver to support new IOPB format. ; 3.06 26 SEP 88 GRH ; Add code for ISHA 5" Hto THIS_BNK to CURBNK. ; ; 3.09 5-18-91 GRH ; Add hung ISHA reset code to driver. It was in BIOS. ; VERSN EQU 309 ; ;**============================================================= ; ;*MACLIB ASMBTOOL.MLB ;*INCLUDE MONBOARD.DEF ;*INCLUDE 0 %+ &, !'- "(. #)/ $*0OPBPTR),HL LD A,(CURBNK) LD (IOPBPTR + 2),A ; CALL ISHAX ; ; CHECK SELF TEST STATUS ; CALL DQERR ; ; SET UP IOLD (IX + PB_CMDO),PB_READC ; EXX LD A,B EXX LD HL,BD_SEC ;SECTOR = SECTOR + (DRV / 2) * 128 LD C,A LD B,0 ADD HL,ERR JP NZ,DKRET ; LD HL,(IOPB + PB_SECO) ;NEXT SECTOR INC HL LD (IOPB + PB_SECO),HL ; LD HL,(IOPB + PB_DMAO) ;BUMP DF ;BIAS DRIVE UP ADD A,0CH ;ISHA5 - DRVPRT AND A,0FH LD (IOPB + PB_DRVO),A POP AF ; ; COMPUTE SECTOR FROM LOGICAL  A JR HBTSSZ ; ; ; SECTOR SIZE COMPUTED IN HL ; GOTSSZ: EXX ;SAVE IN ALT REG ; ; NOW READ THE DIRECTORY SECTOR ;;LOAD IN CBIOS SECTOR #1 CALL DQERR ;CHECK FOR ERRORS JP NZ,DKRET ; CALL SETBIOPB ;SET UP IOPB FOR BIOS READ JP C,DKRE+++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SETUP IOPB FOR BIOS READ SUBR ; ENTRY- CBIOS SECTOR #1 IN DEFBFR ;L LD E,(HL) ; LD (BIOSNT),DE ; ; FETCH BIOS LENGTH & SAVE ; DEC HL LD B,(HL) DEC HL LD C,(HL) ; LD (BIOSLN)PB IN RAM ; LD HL,LOGIOPB CALL IIOPB ; ; FETCH & OFFSET PHYSICAL DRIVE ; LD A,(LOGINBYTE) ;COMPUTE & SET DRIVE SUBBC LD (IOPB + PB_SECO),HL ; CALL ISHAX ;READ THE DIRECTORY SECTOR (IOPB SET UP) CALL DQERR JP NZ,DKRET ; ; FETCH DMA ADDRESS LD DE,(IOPB + PB_BCNTO) ;SECSIZ ADD HL,DE LD (IOPB + PB_DMAO),HL ; LD A,(BIOSLN) ;IF NOT DONE THEN LOOP DEDRIVE ; ADD A,A ;UPPER NIBBLE = HEAD ADD A,A AND A,0C0H ;MASK OFF UNUSED BITS EXX ;SAVE SECTOR OFFSET IN B' FOR LAT LD (IX + PB_CMDO),PB_READC ; EXX ;FETCH LOGICAL DRIVE HEAD # LD A,B EXX ; LD HL,BD_SEC ;SECTOR = SECTOR + (DRV / T ; HDRDLP5: CALL ISHAX CALL DQERR JP NZ,DKRET ; LD HL,(IOPB + PB_SECO) ;NEXT SECTOR INC HL LD (IOPB + PB_SECO),H HL'= SECTOR BYTE COUNT {128, 256, 512, 1024} ; IX= IOPB PTR ; EXIT - CF= ERROR ; A,HL,DE,BC= ? ; ;+++++++++++++++++++++,BC ; ; MOVE THIS SECTOR TO PROPER LOCATION ; LD HL,DEFBFR POP BC ;SECTOR SIZE LDIR ; ; SET UP FOR NEXT SECTOR R A,4 ;8" = 4..7 -> 0..3 ; ; COMPUTE LOGICAL DRIVE FOR IOPB ; SRL A ;DRIVE = LOGICAL_DRIVE / 2 LD (IOPB + PB_DRVO),A IRECTORY INFO FOR BIOS ; LD HL,(DEFBFR + BD_SIOSS) ;FETCH CBIOS SECTOR FROM DIRECTORY ; ; SAVE TRACK ; LD E,H ; ; C A LD (BIOSLN),A JR NZ,HDRDLP IF NOT DEBUG ; ; EXECUTE THE BIOS COLD START ENTRY BY USING THE RESIDENT ROM ROUTINE ER USE LD B,A ; ; SET ID SECTOR FOR LOGIN ; LD A,ID_SECT ADD A,B LD (IOPB + PB_SECO),A EXX ; ; ISSUE CLEAR 2) * 128 LD C,A LD B,0 ADD HL,BC LD (IOPB + PB_SECO),HL ; CALL ISHAX ;READ THE DIRECTORY SECTOR (IOPB SET UP) CALLL ; LD HL,(IOPB + PB_DMAO) ;BUMP DMA ADDRESS EXX ;FETCH SECTOR SIZE PUSH HL EXX POP DE ADD HL,DE LD (IOPB + PB_+++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; SETBIOPB: ; ; FETCH BIOS LOAD PARAMETER OFFSET ; LD HL,(DEFBFEAD ; LD (IOPB + PB_DMAO),DE ;SET UP NEW DMA ADDRESS ; INC (IX + PB_SECO) ;NEXT SECTOR ; ; COMPUTE SECTOR COUNT FROM L; ; COMPUTE SECTOR FROM LOGICAL DRIVE ; RRA ;IF ODD DRIVE THEN SECTOR += 128 AND A,80H EXX ;SAVE SECTOR OFFSET IN PROCESS SECTOR ; LD H,0 EXX ;ADD IN LOGICAL DRIVE OFFSET LD A,B EXX LD C,A LD B,0 ADD HL,BC LD (IOPB + PB_SE ; LD HL,(BIOSNT) ;BIOS LOADED, GO EXECUTE IT PUSH HL XRROM 8 JP DKRET ELSE ;IF DEBUG THEN RETURN NO ERRORS OR CONTROLLER IOPB ; LD A,PB_CLRC LD (IOPB + PB_CMDO),A ; LD IX,IOPB CALL ISHAX ; ; CHECK SELF TEST STATUS ; CALL  DQERR JP NZ,DKRET ; ; FETCH DIRECTORY INFO FOR BIOS ; LD HL,(DEFBFR + BD_SIOSS) ;FETCH CBIOS SECTOR FROM DIRECTORY ; DMAO),HL ; LD A,(BIOSLN) ;IF NOT DONE THEN LOOP DEC A LD (BIOSLN),A JR NZ,HDRDLP5 ; LD HL,(BIOSNT) ;BIOS LOADED, GO R + 1) ; ; IF NOT IN 1ST SECTOR THEN RETURN ERROR ; EXX ;FETCH SECTOR SIZE PUSH HL EXX POP DE ; LD A,H ;LIMIT TENGTH ; EXX ;FETCH SECTOR SIZE PUSH HL EXX POP DE ; XOR A,A ;COUNT = 0 ; LD HL,(BIOSLN) ;COMPUTE # SECTORS LEB' FOR LATER USE LD B,A ; EVEN= 0, ODD= 80H (128) ; LD A,1 ;IF ODD, THEN USE PLATTER 1 ADD A,B LD (IOPB + PB_SECO),CO),HL ; ; PROCESS TRACK ; LD L,E LD H,0 LD (IOPB + PB_TRKO),HL ; CALL ISHAX ;LOAD IN CBIOS SECTOR #1 CALL DQERA JP DKRET ENDIF FORM ;---------------------------------------------------------------------------- ; ; 5" HARD DDQERR ; ; FORCE HOST ADAPTER LOG-ON ; LD A,PB_LOGC LD (IOPB + PB_CMDO),A ; CALL ISHAX CALL DQERR JP NZ,DKRET ;  ; SAVE TRACK ; LD E,H ; ; PROCESS SECTOR ; LD H,0 EXX ;ADD IN LOGICAL DRIVE OFFSET LD A,B EXX LD C,A LEXECUTE IT IF NOT DEBUG ; ; EXECUTE THE BIOS COLD START ENTRY BY USING THE RESIDENT ROM ROUTINE ; LD HL,(BIOSNT) PUO 1K ([3]FF AND A,3 LD H,A SBC HL,DE CCF RET C ; ; SAVE SECTOR SIZE ; PUSH DE ; ; COMPUTE PTR TO PARAMETERSN_LP: SBC HL,DE JR C,LEN_OK ; INC A JP LEN_LP ; ; ; SECTOR COUNT IN A ; LEN_OK: DEC A ;ALREADY HAVE 1ST SECTORA EXX ; ; FORCE HOST ADAPTER LOG-ON ; CALL ISHAX CALL DQERR JP NZ,DKRET ; ; NOW READ THE DIRECTORY SECTOR ; R ;CHECK FOR ERRORS JP NZ,DKRET ; CALL STUPBIOS ;SET UP IOPB FOR BIOS READ JP C,DKRET ; HDRDLP: CALL ISHAX CALL DQISK BOOT ; H5BOOT: ; ; BIAS DOWN DRIVE ; SUB A,8 ;5" = 8..B -> 4..7 ; ; COMPUTE LOGICAL DRIVE FOR IOPB ; PUSH A ; FETCH THE SECTOR SIZE ; LD A,(DEFBFR + ID_SSZ0O) EXX LD HL,128 ; OR A,A HBTSSZ: JR Z,GOTSSZ ; ADD HL,HL DECD B,0 ADD HL,BC LD (IOPB + PB_SECO),HL ; ; PROCESS TRACK ; LD L,E LD H,0 LD (IOPB + PB_TRKO),HL ; CALL ISHAX SH HL XRROM 8 JP DKRET ELSE ;IF DEBUG THEN RETURN NO ERRORS OR A JP DKRET ENDIF ;+++++++++++++++++++++++ ; LD HL,DEFBFR LD DE,(DEFBFR + 1) LD D,A ADD HL,DE ; ; FETCH LOAD ADDRESS & SAVE ; DEC HL LD D,(HL) DEC H ; ; SAVE COUNT IN LENGTH ; LD (BIOSLN),A ; ; DONE, RETURN NO ERROR ; OR A,A RET ;+++++++++++++++++++++++++0 %+ &, !'- "(. #)/ $*0+++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; ISHA 8" DRIVE HARD DISK DRIVER ; ENTRY- (IOPBPTR)= IOPB ADDRESS ; H++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ISHAX5: ; ; ADD A,8 ;BIAS BACK TO 5..7 ; JP ION CODE ; ISHAC: ; ; PUT IOPB ADDRESS IN BC FOR EASY OUTPUT TO CONTROLLER ; LD BC,(IOPBPTR) ; ; OUTPUT THE IOPB ADDIOPB PTR & CONTINUE COMMAND LD IX,(IOPBPTR) JR ISHANH ; ; ; CLEAR COMMAND ; ISHACLR: ; ; IF NOT ALL DRIVES THEN EX, RETURN FIRMWARE ERROR ; IN A,(ISH_DATA) LD (IX + PB_STATO),A ;RETURN NO ERRORS FOR NOW JR HDONE ;*****************+++++++++ ; STUPBIOS: ; ; FETCH BIOS LOAD PARAMETER OFFSET FROM LO BYTE OF COLD START JUMP ADDRESS ; LD A,(DEFBFR + 1) COUNT FROM LENGTH ; LD HL,(BIOSLN) ;COMPUTE # SECTORS LD DE,(IOPB + PB_BCNTO) ;USE BYTES READ XOR A,A ; BUMP: INC A S** ; ; DISPLAY BYTE ON SYSTEM CONSOLE PROCEDURE ; ENTRY- A= BINARY ; ;*****************************************************L= IOPB.PB_DRV PTR ; A= BASE DRIVE # -4 ; EXIT - AF= 0: NO ERRORS ; HL=BC= ? ; ;+++++++++++++++++++++++++++++++++++++++++SHAXC ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; COMMON ISHA DRIVER ; ENTRY- (IOPRESS TO HOST ADAPTER ; LD A,C OUT (ISH_DATA),A LD A,ISH_SPBL OUT (ISH_CMD),A CALL HWBUSY ; LD A,B OUT (ISH_DATA)ECUTE NORMALLY ; LD A,(IX + PB_DRVO) INC A JR NZ,ISHAC ; ; ELSE RESET THE CONTROLLER ; ISHACC: LD A,1 SHL ISH_RES*********************************************************** ; ; HWBUSY SUBR WAITS UNTIL HOST ADAPTOR GOES NOT BUSY ; EXIT - A ; ; IF NOT IN 1ST 128 BYTES THEN RETURN ERROR ; CP A,128 CCF RET C ; ; COMPUTE PTR TO PARAMETERS ; LD HL,DEFBFBC HL,DE ;KEEP SUBTRACTING UNTIL UNDERFLOW JR Z,NOBUMP JR NC,BUMP ; NOBUMP: ; ; SAVE COUNT IN LENGTH ; LD (BIOSLN)*********************** ; HTOA: LD C,A XDROM MF_PHXB ; ; DONE ; RET ;*****************************************+++++++++++++++++++++++++++++++++++ ; ISHAX8: ; ; ADD A,4 ;RESTORE DRIVE TO {0..3} ; ; COMMON ISHAX CODE ; ;ISHAXC: BPTR)= IOPB ADDRESS ; EXIT - AF= 0: NO ERRORS ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++,A LD A,ISH_SPBH OUT (ISH_CMD),A CALL HWBUSY ; LD A,(CURBNK) OUT (ISH_DATA),A LD A,ISH_SPBX OUT (ISH_CMD),A CALB ;ISSUE CONTROLLER RESET OUT (ISH_CMD),A XOR A,A OUT (ISH_CMD),A ; CLRWT: IN A,(ISH_STATUS) ;WAIT FOR CONTROLLER READ= STATUS ; ZF= TRUE ; ;**************************************************************************** ; HWBUSY: ; ; IF CR LD E,A LD D,0 ADD HL,DE ; ; FETCH LOAD ADDRESS & SAVE ; DEC HL LD D,(HL) DEC HL LD E,(HL) ; LD (BIOSNT,A ; ; DONE, RETURN NO ERROR ; OR A,A RET ;********************************************************************************************************** ; ; CONSOLE OUTPUT SUBR ; ENTRY- C= CHAR ; EXIT - AF= ? ; ;***************************; LD B,A ; LD A,(HL) ;SAVE DRIVE ARG FROM IOPB ; LD (HL),B ;CONVERT TO CONTROLLER DRIVES ; PUSH AF ; CALL ISHAX ; POP BC  ; ISHAX: ; ; CHECK FOR CONTROLLER PRESENT ; IN A,(ISH_STATUS) INC A JP Z,JCNP ; ; SET UP IOPB PTR ; PUSH IXL HWBUSY ; ; OUTPUT THE EXECUTE IOPB COMMAND ; LD A,ISH_EXEC OUT (ISH_CMD),A CALL HWBUSY ; ; RETURN THE ERROR STAY BIT ISH_BSYB,A JR NZ,CLRWT ; LD HL,0 ;DELAY A WHILE IN CASE ISHA FOOLING WITH STATUS PORT ; ISHA2: DEC HL LD A,H ONTROLLER BUSY THEN WAIT ; IN A,(ISH_STATUS) BIT ISH_BSYB,A JR NZ,HWBUSY ; ; ELSE RETURN ZF ; RET ;++++++++++),DE ; ; FETCH BIOS LENGTH & SAVE ; DEC HL LD B,(HL) DEC HL LD C,(HL) ; LD (BIOSLN),BC ; ; MOVE THIS SECTOR ***** ; ; INITIALIZE THE IOPB STRUCTURE IN RAM ; ENTRY- HL= IOPB PTR TO INITIALIZE FROM ; EXIT - HL, DE, BC= ? ; ;********************************************************* ; CO: XCROM MF_CO ; ; DONE ; RET ;***************************** ;RESTORE DRIVE ARG ; LD HL,(IOPBPTR) ; INC HL ; LD (HL),B ; RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++ LD IX,(IOPBPTR) ; ; IF CONTROLLER IS BUSY THEN CLEAR IT FIRST ; DEC A ;RESTORE STATUS BIT ISH_BSYB,A ;TEST BUSY JTUS ; HDONE: LD A,(IX + PB_STATO) OR A,A POP IX RET ; ; ; CONTROLLER BUSY UPON ENTRY- CLEAR CONTROLLER FIRST ; OR A,L JR NZ,ISHA2 ; IN A,(ISH_STATUS) BIT ISH_BSYB,A JR NZ,CLRWT ;IF BUSY AGAIN THEN CONTINUE TO WAIT ; ; IF NO ER++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; COMMON SETUP IOPB FOR BIOS READ SUBR ; ENTRY- CBIOS SETO PROPER LOCATION ; LD HL,DEFBFR LD BC,(IOPB + PB_BCNTO) ;USE COUNT ACTUALLY READ LDIR ; ; SET UP FOR NEXT SECTOR RE******************************************************************** ; IIOPB: ; ; MOVE THE IOPB ; LD DE,IOPB LD BC,PB*********************************************** ; ; NEW LINE SUBR ; EXIT - AF, C= ? ; ;**********************************+++++++++++++++++++++++ ; ; ISHA 5" DRIVER ; ENTRY- (IOPBPTR)= IOPB ADDRESS ; EXIT - AF= 0: NO ERRORS ; BC= SECTOR ; ;++R NZ,ISHUNG ; ; IF COMMAND == CLEAR THEN GO DO IT ; ISHANH: LD A,(IX + PB_CMDO) CP A,PB_CLRC JR Z,ISHACLR ; ; COMMISHUNG: CALL ISHACC ;HARD RESET CONTROLLER TO GET ITS ATTENTION RET NZ ;IF ERROR THEN RETURN IT ; PUSH IX ;ELSE RESTORE RORS THEN RETURN 0 ; AND A,(1 SHL ISH_ERRB) OR (1 SHL ISH_FERB) LD (IX + PB_STATO),A JR Z,HDONE ; ; ERROR ENCOUNTEREDCTOR #1 IN DEFBFR ; EXIT - CF= ERROR ; A,HL,DE,BC= ? ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++AD ; LD (IOPB + PB_DMAO),DE ;SET UP NEW DMA ADDRESS ; LD HL,IOPB + PB_SECO ;NEXT SECTOR INC (HL) ; ; COMPUTE SECTOR _SIZE LDIR RET SUBTTL ASCII CHAR ROUTINES ;******************************************************************************************************************** ; CRLF: LD C,0DH CALL CO LD C,0AH JR CO ;*****************************0 %+ &, !'- "(. #)/ $*0*********************************************** ; ; OUTPUT SPACE TO CONSOLE SUBR ; ;****************************************0 ;TRACK DW ID_SECT ;SECTOR DB 0 ;FLAGS DW DEFBFR ;DMA DB 0 ;EXTENDED DMA DW 0 ;XFER COUNT DB 0,0,0,0 ;STATUS******************************************************************** ; ; GET LOGICAL ADDR FROM IOPB SUBR ; ENTRY- IY= CDB PTR************************************** ; ; This code module contains the system character I/O drivers and ; resides in the sVERSN EQU 123 ;**************************************************************************** FORM FALSE EQU 0 TRUE EQU NOT F DURING AN INTERRUPT WITHOUT THE ; RESIDENT ROM ENABLED. USE IN ALL NON-RESIDENT ROMS. ; ENTRY- A= FUNCTION # ; ;+++++++++++ HALT SUBTTL MONITOR BOARD SHADOW ROM SELECTION PROCEDURE *INCLUDE B:XROM.Z80 SUBTTL BANKED MEMORY EXECUTER *INCLUDEINIT ENTRY JR DO_X END ************************************ ; SPACE: LD C,' ' JR CO SUBTTL INITIALIZED DATA ;############################### ; CLRIOPB: DB PB_CLRC ;COMMAND DB 0 ;DRIVE # DW -1 ;0: DRIVE, /0: CONTROLLER RESET DW 0 ;SECTOR DB 1 SHL PB_INH ; EXIT - A= 0: OK, /0: ERROR CODE ; DE= ? ; ;*************************************************************************** ame address space as the resident Monitor ROM. The ROMs ; communicate with each other through a ROM transfer function. ; *INCALSE ; ; INCLUDE SYSTEM DEFINITION FILES ; ;*MACLIB ASMBTOOL.MLB ;*INCLUDE MONBOARD.DEF ;*INCLUDE B:ZBMF101.DEF +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; I_STUB: ADD A,2 ;BIAS UP PUSH HL LD H,MR_RNUM ;USE  B:ZBMX100.Z80 SUBTTL MONITOR FUNCTION CALL DISPATCHER ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++### ; ; I/O PARAMETER BLOCK SAVE AREA ; ;########################################################################### ; IO############################################# ; ; MESSAGES ; ;############################################################X ;FLAGS (INHIBIT READ XFER) DW DEFBFR ;DMA DB 0 ;DMA BANK DW 0 ;XFER COUNT DB 0,0,0,0 ;STATUS, RESULTS IF ($; GETLAD: ; ; IF SECTOR DATA OUT OF RANGE THEN RETURN ERROR ; LD DE,(IOPB + PB_SECO) ;{0..255} LD A,D OR A,A JR NZLUDE B:ZBMH122.HDR ;**************************************************************************** ; ; Revision status: ; ; 1;*INCLUDE B:ZBMG101.DEF ;*INCLUDE CB2.DEF ; LIST OFF *MACLIB ASMBTOOL.MLB *INCLUDE MONBOARD.DEF *INCLUDE B:ZBMF101RESIDENT ROM LD L,A EX (SP),HL CALL XROMF ;GO EXECUTE THE FUNCTION INC SP ;BALANCE STACK INC SP RET ;********+++++++++ ; ; ENTRY- A= FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; FUNCHPB DS PB_SIZE ; PBRTRY EQU PB_FNRB ;DISABLE RETRYS BIT ;################################################################################ ; DERM: DB CR,LF,'Disk Error! IOPB data:' DB CR,LF DB 'CM DR TL TH SL SH FG AL AH AX CL CH ST R1 R2 R3  - PROMST) > PROMSIZ IF PROMSIZ = 2048 CONMSG **** ERROR! Code Too Large for 2k PROM! **** ELSE CONMSG **** ERRO,GETLADE ; ; IF TRACK DATA OUT OF RANGE THEN RETRUN ERROR ; LD A,(IOPB + PB_TRKO + 1) ;{0..255} OR A,A JR NZ,GETLADE .0 - Release ; 1.22 11-22-90 GRH ; Split off from Monitor code to separate ROM in order to gain space ; for I/O drivers an.DEF *INCLUDE B:ZBMG101.DEF *INCLUDE CB2.DEF LIST ON THIS_ROM EQU CHR_RNUM BNKREG EQU BNKPORT SUBTTL EXTERNAL EN******************************************************************** ; ; COLD INIT ONLY SWITCHES TO RESIDENT ROM ; ;********: PUSH HL LD HL,2006H ;SET FUNCTION HANDLER ADDRESS ; DO_X: LD (RXOFF),HL LD L,0FEH ;SET BANK # LD (RXBNK),HL ; PO########### ; ; HARD DISK SECTOR BUFFER ; ;########################################################################### ; PT CA' DM CR,LF ;############################################################################ ; ; LOGIN IOPB ; ;#####R! Code Too Large for 4k PROM! **** ENDIF ENDIF END  TITLE M5b Z-80 MONITOR CHARACTER I/O ROM LIST NOCOND ;**********************************************************************d interrupt code. ; Add rom xover function as include file. ; Add function dispatcher for execution and breakpoint entries. ;TRY POINTS ORG MONROM ; JP CINIT ;COLD START ; ; EXTERNAL FUNCTION ENTRY DURING INTERRUPT ; DS (MONROM + 6) - $ J******************************************************************** ; CINIT: ; ; SET STACK ; LD SP,MONSTK ; ; RESEP HL JP CALLBNK ;GO EXECUTE ;**************************************************************************** ; ; INITIALIHDBUFSZ EQU 256 HDSECB DS HDBUFSZ ; ;########################################################################### ; ; JA####################################################################### ; LOGIOPB: DB PB_LOGC ;COMMAND DB 0 ;DRIVE DW ;PUT IN PROPER FIELD RRCA RRCA ; ; SAVE LUN # FOR LATER USE ; LD (LUNSV), A LD (IY + LUN), A ; RET ;************* ; ; SYSTEM MONITOR FOR M5b ; (c) 1982,1983 GRH ELECTRONICS, CUPERTINO, CA ; ;************************************** Add CON: selection based on Naked Terminal presence. ; ; 1.23 8-16-91 GRH ; Move code to banked rom. Add rom swapper. ; P I_STUB ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXTERNAL FUNCTION STUB FOR USET ROM FUNCTION SHOULD NOT RETURN ; LD HL,[MR_RNUM SHL 8] + 1 ;RESET PUSH HL CALL XROMF ; ; IF RETURNED THEN HALT ; ZE I/O ; ;**************************************************************************** ; ROM_INIT: PUSH HL LD HL,2000H ;DE SECTOR BUFFER ; ;########################################################################### ; JADSECB DS 256 ;#####0 %+ &, !'- "(. #)/ $*0;**************************************************************************** ; ; M5b Z-80 Banked Memory Monitor Global DefiniONSTANTS ; ;============================================================================ ; DEFBNK EQU 0 ;DEFAULT BANK # ; TA IN PAGE 0 ; THIS_BNK EQU 001BH ;BANK # FOR THIS BANK (CONSTANT) THIS_STK EQU 001CH ;STACK PTR WHILE THIS BANK IS SELECTE ;ELSE RETURN NC RET ;**************************************************************************** ; ; CONTINUATION OC HL LD A,(THIS_BNK) SBC A,(HL) JR Z,RS5 ;FOUND 1, RESET IT ; ; NOT FOUND, SKIP TO NEXT RECORD ; INC HL ;SKIP BANC HL ;SET PTR TO DATA ; ; IF BREAKPOINT ALREADY CLEARED THEN SKIP RESTORE ; LD A,E ;IF LOC = 0:0 THEN SKIP RESTORE OR- A= CHAR AND 7FH ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CONI: ; ; GET CHAR FRTS WHEREVER THE CURSOR IS ; PRTWA: EQU PRTS ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++tions ; ;**************************************************************************** ; ; Revision History: ; ; 1.00 11-22 ; BREAKPOINTS ; NBKPTS EQU 2 ;NUMBER OF BREAKPOINTS BP_RST EQU 8 ;BREAKPOINT RESTART # BP_RSTV EQU BP_RST ;BREAKPOINT D ;PREV_BNK EQU 001EH ;LINK BACK TO PREVIOUS BANK ; ; ASCII CONSTANTS ; CTRLS EQU 13H ;ASCII DC3 CR EQU 0DH LF EQU 0AF BREAKPOINT CODE STARTED IN RESIDENT ROM. ; REST ROUTINE TRAPS ALL OF THE REGISTER CONTENTS WHENEVER A BREAKPOINT ; RESTART IK INC HL ;SKIP DATA ; DEC D JR NZ,RS2 ; ; NO BREAKPOINTS MATCH, ASSUME NOT SET ; INC BC ;BACK UP PTR TO RETURN A A,D OR A,C JR Z,RS8 ; ; ELSE RESTORE ORIGINAL DATA ; LD A,(HL) ;ELSE RESTORE ORIGINAL INSTR. PUSH HL EX DE,HL ROM CONSOLE ; CALL CI ; ; MASK OUT BIT 7 ; AND A,7FH ; ; IF UPPER CASE THEN RETURN ; CP A,'a' RET C ; ; E+ ; ; EXLF FUNCTION READS 2 ARGUMENTS FROM THE SYSTEM CONSOLE AND RETURNS ; WITH THE CONSOLE CURSOR ON THE NEXT LINE. ; ENTR-90 grh ; Initial separation from main module ; ; 1.01 2-21-91 GRH ; Add character ROM and CURBNK variables ; Add COMIORESTART VECTOR LOCATION BP_RSTI EQU 0C7H + BP_RSTV ;BREAKPOINT INSTRUCTION ; ; MONITOR FUNCTION CALL ; MFUNRST EQU 20H ;H BELL EQU 7 ; ; MONITOR ROM EXTENSIONS ; MR_RNUM EQU 0 ;RESIDENT ROM DK_RNUM EQU 2 ;DISK ROM DEB_RNUM EQU 3 ;DEBUGGER NSTRUCTION IS EXECUTED. THE TRAPPED CONTENTS ARE STORED IN THE ; MONITOR VARIABLE AREA FOR LATER ACCESS AND USE BY THE GOTO & TDDRESS ; RS5: ; ; DISPLAY BREAKPOINT INDICATOR ; PUSH BC LD C,'*' ;OUTPUT BREAK INDICATION CALL CO ; ; STORE P;HL= MEMPTR LD E,C ;E= BANK LD C,A ;C= DATA CALL PUTMEM POP HL ; ; NEXT BREAKPOINT ; RS8: INC HL ;DO NEXT BP LSE IF LOWER CASE THEN ; CP A,'z' + 1 RET NC ; ; CONVERT TO UPPER CASE ; AND A,5FH RET ;*********************Y- B= 2 ; EXIT - HL= ARG1 ; DE= ARG2 ; A, BC= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++PB.DEF include ; 5-18-91 GRH ; Changed COMIOPB2.DEF to COMIOPB3.DEF ; ; 8-16-91 GRH ; Add bank execution variables ; FUNCTION RESTART VECTOR # MFUNRSV EQU MFUNRST ;FUNCTION RESTART VECTOR LOCATION MFUNRSI EQU 0C7H + MFUNRST ;FUNCTION RESTART ROM CHR_RNUM EQU 4 ;CHAR I/O ROM CLK_RNUM EQU 7 ;MISC. I/O ROM ;=========================================================HE EXAMINE ; REGISTERS COMMANDS. ; ; INSERT INTERRUPT DISABLER SOFTWARE AT START OF REST. ; ;******************************C ; POP DE LD (PLOC),DE LD A,(THIS_BNK) LD (BNKLOC),A ; ; DISPLAY BREAK ADDRESS ; EX DE,HL ;HL= ADDR LD E,A DJNZ RS7 ; ; SAVE THE Z80 UNIQUES ; EX AF,AF' EXX LD (LPLOC),HL LD (EPLOC),DE LD (CPLOC),BC PUSH AF POP HL ******************************************************* ; ; PRTWD ROUTINE OUTPUTS AN ASCII STRING ONTO THE CONSOLE. ; THE ST++++++ ; EXLF: ; ; GET THE ARGS ; CALL EXPR ; ; RETURN THE ARGS ; POP DE POP HL ; ; FOLLOW WITH A NEW LINE;**************************************************************************** ; ;*INCLUDE COMIOPB3.DEF ; ; LIST OFF *INCLUDINSTRUCTION ; ; MONITOR ADDRESSES ; MONROM EQU 0F800H ;ROM START ADDR ; ; PAGE 0 LOCATIONS ; WSVEC EQU 0 ;VECTOR NF CHAR == SPACE THEN RETURN NC,ZF ; CP A,' ' ;IF CHAR = ' ' THEN RETURN RET Z ; ; IF CHAR == COMMA THEN RETURN NC, ZF ********************************************** ; REST: ; ; SET UP TO RESTORE BREAKPOINT(S) ; LD HL,TLOC ;SET TABLE PTR;E= BANK CALL LADR ; ; CLEAR BREAKPOINTS ; LD HL,TLOC LD B,NBKPTS ; ; TOP OF RESTORATION LOOP ; RS7: LD E,(HL) LD (FPLOC),HL LD (XLOC),IX LD (YLOC),IY ; ; GOTO MONITOR ; JP WINIT ;RETURN TO MONITOR ;+++++++++++++++++++++++RING MUST BE TERMINATED BY BIT 7 SET IN THE LAST CHAR OF THE STRING. ; ENTRY- HL= TEXT PTR ; ;******************************* ; JP CRLF ;**************************************************************************** ; ; CRLF ROUTINE OUTPUTS A CRE COMIOPB3.DEF ; LIST ON ;============================================================================ ; ; ASSEMBLE TIME CUMBER FOR WARM RESTART ; IOBYTE EQU 3 ;ADDR OF I/O CONTROL BYTE IOBYTV EQU 00H ;DEFAULT IOBYTE VALUE ; ; MEMORY BANK DA ; CP A,',' RET Z ; ; IF CHAR == RETURN THEN RETURN CF, ZF ; CP A,CR SCF RET Z ; ; ELSE RETURN NC,NZ ; CCF LD D,NBKPTS ; RS2: LD A,C SUB A,(HL) ;SEE IF SOFTWARE TRAP INC HL LD A,B SBC A,(HL) ;MAYBE, TRY REST OF ADDR IN ;FETCH BREAKPOINT ADDRESS LD (HL),0 ;CLEAR BREAKPOINT INC HL LD D,(HL) LD (HL),0 INC HL LD C,(HL) LD (HL),0 IN+++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CONI ROUTINE READS THE CONSOLE & STRIPS OFF THE PARITY BIT. ; EXIT ********************************************* ; ; 1ST ENTRY STARTS ON A NEW LINE ; PRTWD: CALL CRLF ; ; THIS ENTRY STA-LF ON THE CONSOLE DEVICE TO ; START A NEW LINE. ; ;************************************************************************0 %+ &, !'- "(. #)/ $*0**** ; CRLF: ; ; SAVE REG ; PUSH HL ; ; DISPLAY CRLF MESSAGE ; CRLFA: LD HL,CRMSG CALL PRTS ; ; RESTORE REG********* ; ; DISPLAY HEX BYTE ON SYSTEM CONSOLE PROCEDURE ; ENTRY- A= BYTE TO DISPLAY ; ;*********************************ACE. ; ENTRY- E:HL= WORD VALUE TO DISPLAY ; ;**************************************************************************** ;  Rev. A January 5,1991 GRH Enterprises ystem. The Monitor is designed with the following features: * CP/M 3.x compatability. * Banked memory suppDFFFFF Motorola MC68010 CPU E00000..EFFFFF Intel 80286 CPU F00000..F7FFFF ReserveE (Not used) 4 CP/M Default Disk 5..7 CP/M System Call 8..A Debugger breakpoint (RST 8) B C D E F 10.oftwarå  ió  devideä  uð  intï  logicaì  tasë modules® Thió allowó changeó tï causå thå minimuí impacô tï otheò moduleó with & RETURN ; POP HL RET ;**************************************************************************** ; ; LADR ROUTIN******************************************* ; HEX1: PUSH BC ;ADJUST REGS LD C,A CALL PUTHXB POP BC RET ;****** LADRB: ; ; DISPLAY WORD VALUE ; CALL LADRA ; ; FALL INTO DISPLAY BLANK PROCEDURE ; ;************************** 1129 Stonylake Ct Sunnyvale, CA .PA Š.HE TABLE OF CONTENTS ort. * Multiple processor support (Super S100). Thió  versioî  ió  aî  interií versioî untiì  releaså  ²  ió find F80000..F8FFFF Z80BNK0 Z80 Bank 0 F90000..F9FFFF Z80BNK1 Z80 Bank 1 FA0000..FAFFFF Z80BNK2 Z80 Bank 2 .12 (RST 16) 13 14 15 16 17 18..1A (RST 24) 1B Reserved 1C..1D Stack pointer for this bank (saved when biî thå system® Thå interfacå tï theså moduleó wilì bå a standard for as long as possible. These modules are made up ofE OUTPUTS THE ADDRESS VALUE ON THE CONSOLE, EITHER AT ; THE START OF A NEW LINE (LADRA) OR AT THE CURRENT CURSOR LOCATION (LADR********************************************************************** ; ; DASH ROUTINE OUTPUTS A '-' TO THE CONSOLE DEVICE ;************************************************** ; ; DISPLAY A BLANK (SPACE) ON THE SYSTEM CONSOLE PROCEDURE ; ;********** 1. Overview 2. Hardware Description 3. Software Description 4. Rom Modules 5. Monitor Function Call Facished. .PA Š.HE 2. HARDWARE DESCRIPTION The M5b hardware to support the System Monitor includes:  FB0000..FDFFFF Reserved FE0000..FE7FFF ROMBNK 32k ROM card FE8000..FE83FF Jade 8" Floppank swapped) 1E Reserved 1F Reserved 20..22 (RST 32) Monitor System Call facility 23 24..26 (8085 TRAP) the following files: ZBMR.* Thió  modulå containó thå ROÍ residenô codå in ROM 0. * The Cold Reset initializat). ; ENTRY- E:HL= ADDRESS VALUE TO DISPLAY ; ;**************************************************************************** ; ;**************************************************************************** ; ; 1ST ENTRY DISPLAYS DATA BYTE IN A FIRST ****************************************************************** ; BLK: ; ; PASS A BLANK TO CO PROCEDURE ; LD C,' ' ility 6. Debugger Commands .PA Š.HE 1. OVERVIEW Thå M5â Systeí Monitoò ió á systeí oæ  ª  Z8°  CPÕ  carä  witè: - Residenô  2ë bytå ROÍ allwayó aô F800..FFFFè. - Reseô bootstrað circuitryy Controller FE8400..FE87FF Jade 5" Floppy Controller FE8800..FE8BFF Jade 3" Floppy Controller  27 28..2A (RST 40) 2B 2C..2E (8085 RST 5.5) 2F 30..32 (RST 48) 33 34..36 (8085 RST 6.5) 37 38..3A CP/Mion vector. * The Monitor System Call facility. * The default interrupt tables and handlers. * The Banked Memo ; 1ST ENTRY STARTS ON A NEW LINE ; LADRA: PUSH DE PUSH HL CALL CRLF POP HL POP DE ; ; ENTRY TO CONTINUE AT C ; DASH1: CALL HEX1 ;OUTPUT A AS HEX ; ; THIS ENTRY DISPLAYS ONLY THE DASH ; DASH: LD C,'-' JR CO ;************** M5b Z80 BANKED MONITOR (ZBMx) softwarå anä  hardwarå tï supporô thå computeò systeí hardwarå resources® Iô ió designeä tï  bå  softwarå  interfacå  anä  h. - Banked (24 bit) addressing. * Monitor II card - Eight 2k x 8 ROMs all located at F800h. FE8C00..FEFFFF Reserved FF0000..FFFFFF Motorola MC68010 I/O space .pa Š Thå  followinç  de DDT & SID Breakpoint (RST 56) 3B 3C..3E (8085 RST 7.5) 3F 40..4F BIOS reserved 50..5B 5C..7F CP/M-80 File Controry support procedures. * Debugger Breakpoint handler. * Processor selection (SS100). ZBMD.* Thió  modulå URRENT CURSOR LOCATION ; LADR EQU PUTHXA JP PUTHXA ;********************************************************************************************************************************* ; ; PRINT ADDR PROCEDURE DISPLAYS A WORD VALUE FOLLOWED BY A SP Version 1.22 USER GUIDE November 23,1990 ardwarå  flexiblå  foò  futurå expansion¬ experimentation¬ anä maintenancå wheî hardwarå wilì bå harä tï finä foò thió olä s - Common RAM from E000h thru F7FFh The memory map for the system is: Start Last Label Use 000000..scribeó thå Pagå ° addresseó  reserveä  iî each Z80 bank: xxxx Use 0..2 Cold reset (RST 0) 3 CP/M IOBYTl Block 80..FF CP/M-80 Default sector buffer .PA Š.HE 3. SOFTWARE DESCRIPTION Thå  Monitoò  scontainó thå Z8° debuggeò code®  Iô resideó  iî ROÍ  £  3 (F800..FFFFh© iî  thå  ROÍ  memorù  board®  Iô  ió responsiblå for0 %+ &, !'- "(. #)/ $*0: * Memory and I/O examination and modification. * Memory testing and comparison. * Execution of programs wi® Iô resideó iî ROÍ £ 2 (F800..FFFFh© iî thå ROÍ memorù board®  Iô ió  responsiblå for: * Disk hardware & software ini 2 Disk drivers (ZBMK) 3 Debugger (ZBMD) 4 Character I/O drivers (M5ZC) 5 Spare 6 C= Character to output F812 Return System Console input status EXIT - A= 0: NOT READY, /0: CHAR READY  HL= SOURCE PTR DE= DESTINATION PTR BC= BYTE COUNT F824 Execute program in Cold Start initialization 2006 Execute Monitor ROM function support (see Monitor ROM entry points) 20H. Standard Arguments: A= Function # BC= Arg #1 DE= Arg #2 HL= Arg #3 E:HL= Banked memory ptr Standard Return   RETURN BANKED MEMORY DATA. Unbankeä systemó ignorå E. Entry- A= 1 E:HÌ= Address ptr th or without breapoints set. * Examination and modification of CPU registers. * Disk bootstrap argument passing to tialization. * Disk boostrap. * Disk IOPB execution. ZBMV.* Thió  modulå  containó  alì otheò  systeí  I/Spare 7 Additional I/O drivers (ZBMV) .pa Š *** ENTRY POINTS *** RESIDENT ROM: Address  F815 Return Banked Memory contents ENTRY- E:HL= ADDRESS EXIT - A= DATA F818 Store  another Bank ENTRY- E:HL= ADDRESS TO EXECUTE EXIT - Whatever the called program returns F827 .HE MONITOR DEVICES .PA ŠCharacter I/O DEVICE ASSIGNMENT 0 Naked Terminal board 1 Values: A= Byte HL= Word BC, DE= Additional values Return values: NOTEº  Alì  functionó assumå alì registeró arå  Exit - A= Data 2º  SET BANKED MEMORY DATA Unbanked systems ignore E. Entry- A= 2 Ã= disk driver. * Console ASCII-HEX & HEX-ASCII conversion. ZBMC.* Thió  modulå containó thå Characteò I/Ï drivers® Ï  drivers®  Iô resideó  iî ROÍ £ 7 (F800..FFFFh© iî thå ROÍ memorù board®  Iô is responsible for: Š * Real time clock Function F800 Cold start vector gets control upon Reset. F803 Return next System Console character EBanked Memory Contents ENTRY- E:HL= ADDRESS C= DATA F81B Select 64K Memory Bank f Return System List device output status EXIT - A= 0: BUSY, /0: READY F82Á Reserveä foò internaì De Logical device #1 2 Logical device #2 . . . 15 Logical device #15 .pa Š.HE 5. MONITORfree®  Bå surå  tï savå anù datá prioò tï callinç thió function. Thå  Á  registeò  maù contaiî thå followinç  reserveäData E:HL= Address ptr 3: EXECUTE A PROCEDURE IN ANOTHER BANK Entry- A= 3 E: Iô resideó iî  ROÍ  £  µ (F800..FFFFh© iî thå ROÍ  memorù  board®  Iô  ió responsiblå for: * Character I/O hardware-calendar support. .PA Š.HE 4. ROM MODULES Thå  Monitoò  Systeí makeó uså oæ á seô oæ  ROMXIT - A= CHAR F806 Execute Monitor Function (Same as RST 20H) ENTRY- Various, see section 5 F809 or execution **** WARNING! Stack must be in Common RAM! **** ENTRY- C= BANK # EXIT - buggeò prograí breakpoinô entry ŠF82D Reserved for internal Debugger program execution support F830 Restart Error FUNCTION CALL FACILITY Thå  Systeí  Monitoò implementó á systeí  calì  facilitù  iî ordeò  tï  simplifù thå interfacå  erroò valueó oî return. -1: Function not implemented error. -2: Function argument error. Thå folloHL= Procedure address 4º  SELECT MEMORY BANKS FOR BANKED MEMORY BLOCK MOVE Entry- A= 4 Â= Sourc & software initialization. * Logical-physical device conversion. * Single entry point support of driver function caó  iî  Memorù board®  Alì  ROÍ  sharå  thå samå addresó rangå froí  F800è  thrõ FFFFh. ROM USE 0 Resident ROM, gets  Send character to System Console device. ENTRY- C= Character to output F80C Return System Console outpuA= BANK # ON ENTRY F81Å  Seô Sourcå anä Destinatioî Bankó foò Blocë Movå function ENTRY- B= SOURCE BANK # F833 Display character string on the System Console The last character must have Bit 7 set.  tï thå systeí  resources®  Thió wilì  allo÷  flexabilitù oæ implementinç thå  I/Ï  driveró  whilå preserving the software iwinç pageó describå eacè functioî anä thå argumentó and returned values. .he *** Resident Functions descriptions e bank bank number C= Destination bank number. 5º  PERFORM THE INTRABANK BLOCK MOVE Entry- A= 5lls. * Function bypass entry points for Console, List & stdio. ZBMK.* Thió modulå containó thå Disë I/Ï driverscontrol on reset. Allways installed when the processor is executing outside the monitor system. (ZBMR) ±  RAM t status EXIT - A= 0: Busy, /0: Ready F80F Send character to System List Device. ENTRY-  C= DESTINATION BANK # F821 Move data from Source bank to destination bank ENTRY-ENTRY- HL= Character string pointer F836 F839 F83C .PA ŠCHARACTER ROM: ADDRESS FUNCTION 2000nterface. Theså  functionó arå executeä bù placinç thå argumentó  intï thå propeò registeró anä executinç á Restarô *** .pa Š 0: RETURN SYSTEM MONITOR VERSION NUMBER ENTRY- A= 0 EXIT - HL= BINARY VERSION # IN HUNDREDTHS (X.XX) 1º HL½ Sourcå pointer DÅ= Destinatioî pointer BÃ= Bytå counô tï move. 6: 0 %+ &, !'- "(. #)/ $*0 SELECT A NEW BUS PROCESSOR (SS100) Entry- A= 6 C= Processor number {0,..7} 7: RETURN CURRENTM CONSOLE. Entry- A= 14H C= Byte 21: DISPLAY HEX WORD ON THE SYSTEM CONSOLE. Entry-  ENTRY- A= 21H B= Device # {0..15} C= Sub-function: 0:  H= Baud rate index 4: Set device data ENTRY- E= M 1: System list 2: System AUX 3: System AUX2 EXIT - ATUS ENTRY- A= 28H EXIT - A= 0: NOT READY, /0: CHAR READY 41: RETURN NEXT STANDARD CONSOLE CHAR  A= 2FH EXIT - A= CHAR 48: RETURN STANDARD AUX2 OUTPUT STATUS ENTRY- A= 30H EXIT - A= 0: BUurn if successful 66: TEST IOPB.PBSTATO FOR ERROR AND DUMP IOPB IF TRUE ENTRY- A= 42H E:HLY SELECTED BANK NUMBER Entry- A= 7 Exit - A= Bank number 8: Reserved for internal debugger function A= 15H HL= Word 22º  DISPLAY HEX ADDRESS ON SYSTEM CONSOLE. Thió  functioî  ió  useä iî Bankeä memorùNOP (Can be used to test device presence) 1: Initialize device ode bits D= Baud rate index 5: Return Baud rate  A= 0: Ok -2: Illegal device -3º Illegaì argumenô    ENTRY- A= 29H EXIT - A= CHAR 42: RETURN STANDARD CONSOLE OUTPUT STATUS ENTRY- A= 2AH ESY, /0: READY 49: SEND CHAR TO STANDARD AUX2 OUTPUT ENTRY- A= 31H C= CHAR .HE L= IOPB Ptr EXIT - A= 0: NO ERROR, /0: ERROR CODE 67: DISPLAY IOPB ERROR DATA ENTRY- A= 43H  Entry- A= 8 9: Select Bank for execution Entry- A= 9 C= Bank # .he *  systems®  Iæ  thå systeí ió noô banked¬ theî iô ió redundanô witè functioî #3. Entry- A= 16H  2: Execute self test EXIT- A= 0: Ok, /0: error code  EXIT - L= Baud rate index 6: Set Baud rate ENTRY- E= Bau (Stä devicå noô exist) L= Device # on entry 36: RETURN STANDARD AUX INPUT STATUS ENTRY- AXIT - A= 0: BUSY, /0: READY 43: SEND CHAR TO STANDARD CONSOLE OUTPUT ENTRY- A= 2BH C= CHAR 4 *** Disk I/O Driver Functions *** .pa Š64: RETURN DISK DRIVER VERSION # ENTRY- A= 40H EXIT - HL E:HL= IOPB Ptr EXIT - A= 0: NO ERROR, /0: ERROR CODE 68: EXECUTE IOPB ENTRY- A=** Debugger Function Descriptions *** .pa Š16: RETURN DEBUGGER VERSION NUMBER ENTRY- A= 10H EXIT - HL= BINARY VERSION  E:HÌ= Address 23: Display text on System Console Entry- A= 17H HL= Ptr to Bit-7 terminated t 3: Return device data EXIT- L= Mode bits: 0: Input dd rate index EXIT - A= -2: Device not present -3: Argument error 34: SPARE = 24H EXIT - A= 0: NOT READY, /0: CHAR READY 37: RETURN NEXT STANDARD AUX CHAR Š ENTRY- A= 25H 4: RETURN STANDARD LIST DEVICE OUTPUT STATUS ENTRY- A= 2CH EXIT - A= 0: Busy, /0: Ready 45: SEND CHAR= Binary version # in hundredths (X.XX) 65: BOOT DISK ENTRY- A= 41H BC= Physical drive #  44H E:HL= IOPB Ptr EXIT - A= 0: NO ERRORS, /0: ERROR CODE .he *** Miscellaneous I/O Dri# IN HUNDREDTHS (X.XX) 17: EXECUTE DEBUGGER ENTRY- A= 11H 18: RESERVED FOR INTERNAL SYSTEM 19: DISPLAY HEext .he *** Character I/O Device Driver Functions *** .pa Š32: RETURN CHAR DEVICE DRIVER VERSION # ENTRevice 1: Output device 2: Baud rate enabled  ENTRY- A= 22H EXIT - A= -1 35: SET STANDARD DEVICE ENTRY- A= 23H B= De EXIT - A= CHAR 38: RETURN STANDARD AUX OUTPUT STATUS ENTRY- A= 26H EXIT - A= 0: BUSY, /0: READY 3 TO STANDARD LIST DEVICE OUTPUT ENTRY- A= 2DH C= Char 46: RETURN STANDARD AUX2 INPUT STATUS  Bit Definition 2..0= 0 3= 0 ver Functions *** .pa Š80: RETURN MISCELLANEOUS DRIVER VERSION ENTRY- A= 50H EXIT - HL= Binary verX NIBBLE ON THE SYSTEM CONSOLE. Entry- A= 13H C<3..0>= nibble 20: DISPLAY HEX BYTE ON THE SYSTEY- A= 20H EXIT - HL= Binary version # in hundredths (X.XX) 33: EXECUTE CHAR DEVICE DRIVER FUNCTION  3: XON/OFF Ok 4: XON/OFF enabled vice # to set to {0..15} C= Standard device to set 0: System console 9: SEND CHAR TO STANDARD AUX OUTPUT ENTRY- A= 27H C= CHAR 40: RETURN STANDARD CONSOLE INPUT ST ENTRY- A= 2EH EXIT - A= 0: NOT READY, /0: CHAR READY 47: RETURN NEXT STANDARD AUX2 CHAR ENTRY- 7..4= Drive # 15..8= Controller # EXIT - Error, will not retsion # in hundredths (X.XX) 81: SET CLOCK CALENDAR DATA ENTRY- A= 51H B= Day of month {1.0 %+ &, !'- "(. #)/ $*0.31} D= Month {1..12} E= Year {0..99} L= Day of week {0:Sun, 1:Moster # EXIT - A= Data from clock register 86: WAIT FOR CLOCK TO CHANGE. DOES NOT RETURN UNTIL CLOCK SECONDS CHå monitoò ió controlleä  bù  one- characteò  commandó  entereä froí thå keyboarä iî reponså tï  thå monitoò  prompt¬  á  dasèï digitó arå correct®  Iî bankeä memorù  systems¬ thå banë numbeò ió delimiteä bù á coloî (:)¬  I.E®  bb:aaaa®  Thå addresó angeably® Iî certaiî commandó á spacå oò á commá caî alsï  bå interchangeä witè á carriagå return®  Theså arå commandó foò   -DFFB,100A[CR] -DFFB 100A[space] -D0EF0FFB,100A[space] P ; LLOC DS 1 ;L HLOC DS 1 ;H PLOC DS 2 ;PC BNKLOC DS 1 ;PC BANK # ; ; BANKED MEMORY MANAGEMENT ; CBANK DS 1 ;CURRENTDDRESS, BANK DDPORT DS 1 ;JADE CONTROLLER PORT IOPBPTR DS 3 ;CURRENT IOPB POINTER ; ; CHARACTER I/O DEVICES ; C_CDEV DS n,..6:Sat} 82: SET CLOCK TIME DATA ENTRY- A= 52H B= Seconds {0..59} ANGE. ENTRY- A= 56H EXIT - A= 0: OK /0: Board not present 87: SPARE  (-)®  Nï spacå ió alloweä  betweeî  thå prompt and the command character. Addresó anä datá entriesº Thå generaì forí  entrù  ruleó  abovå applù tï  banë  numbeò  entries®  Iî addition¬  iæ á banë ió noô specified¬ theî thå lasô banë settinç whicè  thå Monitoò expectó á fixeä numbeò  oæ  entrieó  (anä hence delimiters) following the command character. Thå  f -DFFB0012:FFB,100A[CR] ŠCOMMAND DESCRIPTION Boot Disk (B) Thió commanä allowó á disë operatinç sys EXECUTION BANK DBANK DS 1 ;DESTINATION BANK # FOR MOVE SBANK DS 1 ;SOURCE BANK # FOR MOVE BNKCHG DS 1 ;BANK CHANGED FLAG (0:1 ;CONSOLE C_LDEV DS 1 ;LIST C_ADEV DS 1 ;AUX C_A2DEV DS 1 ;AUX2 ; ; BANK ; CURBNK DS 1 ;CURRENTLY SELECTED BANK # ; D= Minutes {0..59} E= Hours {0..23} 83: RETURN CLOCK CALENDAR DATA ENTRY- A= 53H  ENTRY- A= 57H EXIT - A= -1 88: STOP CLOCK ENTRY- A= 58H 89: START CLOCK foò aî addresó ió á  fouò  digiô Heø number»  foò data¬  á twï  digiô  Heø  number® Leadinç zeroó neeä noô bå entered»  thå is used by default. Delimitersº  Thå  Monitoò  recognizeó  threå  delimitersº  á carriagå  returî (CR)¬  á space¬  oò ollowinç  commandó  tï  displaù thå  blocë  oæ  memorù 120FFBè  tï 12100Aè arå alì equivalent®  Althougè thå spacinç  ió noô=================== ; ; RAM VARIABLES ; ;============================================================================ ;  NOT, /0: CHANGED) ; ; BREAKPOINTS ; STRUCT 0 BPADDR DS 2 ;ADDRESS OF BREAKPOINT BPABNK DS 1 ;BANK # OF BREAKPOINT BPD; BANK SWAPPING ; RCHL DS 2 ;ROM CALLER HL SAVE RXOFF DS 2 ;ROM CALL ADDRESS RXBNK DS 2 ;ROM CALL BANK IF ($ AND 7 EXIT - A= Day B= Month C= Year L= Day of week (0= Sunday, 1 ENTRY- A= 59H .HE *** Monitor Commands *** .PA Š Thå Monitoò commandó musô conforí tï á specifiã monitoò wilì supplù them® Nï  spacå ió alloweä betweeî thå commanä characteò anä thå  firsô addresó oò datá entry®  Subsequeá comma®  Á carriagå  returî indicateó tï thå monitoò thaô thå currenô commanä ió completå anä shoulä  bå executed®  Eitheò  forí free¬  somå varietù iî thå commanä forí ió allowed® Notå thaô  thå  displaù  commanä requireó twï  anä  onlù  twï  addre; SAVE 128 BYTES FOR MONITOR ; ORG MONROM - 128 MONSTK EQU $ ; ; REGISTER IMAGE STORAGE ; RLOC DS 1 ;R ILOC DS 1 ;IATA DS 1 ;DATA DISPLACED BY RESTART INSTRUCTION BP_REC DS 0 ;NUMBER OF BYTES IN RECORD ENDM TLOC: REPT NBKPTS DS BP_REC FFFH) > 7800H CONMSG **** RAM Allocation Too Large! **** ENDIF = Monday..) 84: RETURN CLOCK TIME DATA ENTRY- A= 54H EXIT - A= Seconds B= Mformat®  Thå general form is: -Ca1 a2 a3 wherå  Ã  ió thå commanä characteò anä a1-a³ arå thånô entrieó musô bå separateä bù á delimiter®  Thå  monitoò  lookó  aô onlù thå  lasô  fouò  addresó characteró oò lasô twï dá spacå oò commá caî marë thå enä oæ aî argumenô entry®  Iî ouò commanä exampleó wå wilì generallù uså á  spacå aó á delimitsó arguments¬  sï  thaô thå lasô delimiteò caî bå á commá oò á spacå as well as a carriage return.  YLOC DS 2 ;IY XLOC DS 2 ;IX FPLOC DS 1 ;F' APLOC DS 1 ;A' CPLOC DS 1 ;C' BPLOC DS 1 ;B' EPLOC DS 1 ;E' DPLOC DS 1 ;D'  ENDM ; ; BANK #S ASSOCIATED WITH ARGUMENTS ; ARGPTR DS 2 ;PTR TO CURRENT ARGUMENT'S BANK A1_BNK DS 1 ;ARG #1 BANK A2_BPPY PHYSICAL DRIVE 0 ; B JADE 5" FLOPPY PHYSICAL DRIVE 1 ; C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; D SIDE 2 & 3 OFinutes C= Hours 85: RETURN CLOCK REGISTER DATA ENTRY- A= 55H C= Regi addresó  anä datá  entries¬  iæ any®  Thå essentiaì partó oæ á commanä arå  aó follows: Thå  Commanä Characterº  Thatá characteró beforå á delimiter®  Sï iæ yoõ  makå á mistakå whilå typinç aî entry¬  keeð typinç untiì thå lasô  fouò oò twer¬  unlesó á commá makeó thå  commanä  forí clearer® Pleaså note¬ however¬ thaô yoõ caî uså thå spacå anä thå commá interch -D12:0FFB 100A[CR] -D0FFB 100A[CR] (After 12: first used) -DFFB,100A, LPLOC DS 1 ;L' HPLOC DS 1 ;H' ELOC DS 1 ;E DLOC DS 1 ;D CLOC DS 1 ;C BLOC DS 1 ;B FLOC DS 1 ;F ALOC DS 1 ;A SLOC DS 2 ;SNK DS 1 A3_BNK DS 1 ; ; DISK IOPB RESERVATION ; IOPB: DS PB_SIZE ; ; DISK ROM VARS ; DDADDR DS 3 ;JADE CONTROLLER A HARD DISK PHYSICAL DRIVE 0 ; E SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; F SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ; 0 %+ &, !'- "(. #)/ $*0Y BLOCK MOVE ; JP REST ;(NOT IMPLIMENTED) ;EXECUTE BANK FUNCTION ; JP LOS ;RETURN SYSTEM LIST DEVICE OUTPUT STATUS IN A **************** ; FBSEL: LD A,C ; BNKSEL: ; ; SELECT NEW BANK ; OUT (BNKREG),A ; ; STORE IN BANK PAGE 0 ; LTION #5 ; NOTE: THIS FUNCTION IS NOT CP/M 3.0 COMPATABLE. HL & DE ARE REVERSED ; (Z-80 COMPATABLE) ; ENTRY- HL= SOURCE PTR ) LD A,H CP A,L POP HL ;PTR JP NZ,NTSAME ; ; SELECT BANK OF MOVE ; DI ;NO INTERRUPTS WHILE BANK SWAPPED ; O ;NEXT BYTE INC DE ; EXX ;CHECK FOR DONE DEC BC LD A,C OR A,B EXX JP NZ,BMOVE4 ; ; DONE ; JP BMOVE3 *************************************** ; ; STORE DATA INTO BANKED MEMORY PROCEDURE FUNCTION #2 ; ENTRY- HL= OFFSET PTR ; E+++++++++++++++++++++++++++++++++ ; FUNCH: ;ROM SWAP ENTRY MONFUNC: ;EXTERNAL ENTRY ; ; IF NOT LOCAL FUNCTIONS THEN EXITFUNTABL: DW RETVERS ;0: RETURN MONITOR ROM VERSION DW GETMEM ;1: RETURN BANKED MEMORY DATA DW PUTMEM ;2: STORE DATA INT; JP REST ;INTERNAL BREAKPOINT ENTRY ; JP GOTOS ;INTERNAL EXECUTE REGISTERS PROCEDURE (GOTO) ; JP RSTER ;RESTART ERROD (THIS_BNK),A ; ; ALSO STORE LOCALLY ; LD (CURBNK),A ; ; DONE ; RET ;*************************************** ; DE= DESTINATION PTR ; BC= BYTE COUNT ; EXIT - HL & DE= NEXT BYTES TO MOVE PTRS ; A, BC= ? ; ;++++++++++++++++++++++++UT (BNKREG),A ;A STILL HAS BANK (BOTH SAME, REMEMBER?) ; LDIR ; ; DONE, RESTORE BANK TO CURRENT BANK WHEN CALLED ; BMOV ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN BANKED MEMORY DATA FUNCTION #1 ; EN= BANK # ; C= DATA ; EXIT - A= ? ; ;**************************************************************************** ; PUTMEM ; CP A,MAXFUNS JR NC,NOT_INT ; ; FUNCTION SEEMS LEGAL, FETCH EXECUTION ADDRESS FROM TABLE ; PUSH HL ;SAVE POSSIBLEO BANKED MEMORY DW MFUNERR ;3: SPARE DW XMOVE ;4: SET BLOCK MOVE BANKS DW BMOVE ;5: BANKED BLOCK MOVE DW MFUNERR ;6:R ENTRY ; JP PRTS ;DISPLAY BIT7 TERMINATED TEXT ON SYSTEM CONSOLE SUBTTL MONITOR BOARD SHADOW ROM SELECTION PROCEDURE ************************************* ; ; SET BANKS FOR A FOLLOWING MOVE CALL (CP/M 3.0 COMPATABLE) ; FUNCTION #4 ; ENTRY- B++++++++++++++++++++++++++++++++++++++++++++++++++++ ; BMOVE: ; ; IF BANK NOT SELECTED PRIOR TO CALL THEN USE FASTER INTRAE3: LD A,(CBANK) ;RESELECT CURRENT BANK & RETURN OUT (BNKREG),A ; EI ;ALLOW INTERRUPTS NOW RET ; ; ; BANKS NOT TRY- HL= OFFSET PTR ; E= BANK # ; EXIT - A= DATA ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++: ; ; SAVE REG ; PUSH BC ; ; SAVE CURRENT BANK TO RETURN TO ; LD A,(CURBNK) LD B,A ; ; SELECT BANK ; LD A 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 SELECT NEW BUS PROCESSOR DW RETCBNK ;7: RETURN CURRENTLY SELECTED BANK IN A DW GOTOS ;8: DEBUGGER EXECUTER DW FBSEL ;9 *INCLUDE B:XROM.Z80 SUBTTL MEMORY MANAGEMENT ROUTINES ;****************************************************************= SOURCE BANK ; C= DESTINATION BANK ; EXIT - A= ? ; ;**********************************************************************-BANK MOVE ; LD A,(BNKCHG) OR A,A JP NZ,BMOVE2 ; LDIR ; ; DONE WITH SIMPLE CASE ; RET ; ; ; ELSE USE INTERTHE SAME, DO DISCRETE MOVE ; NTSAME: ; ; SAVE COUNT ; PUSH BC ;SAVE COUNT EXX POP BC EXX ; ; FETCH BANKS ; +++++ ; GETMEM: ; ; SAVE REGISTER ; PUSH BC ; ; SAVE CURRENT BANK FOR RETURN ; LD A,(CURBNK) LD B,A ; ; SE,E DI ;NO INTERRUPTS WHILE BANK SWAPPED OUT (BNKREG),A ; ; STORE DATA ; LD (HL),C ; ; RESTORE BANK ; LD A,B ,A ; ; RESTORE ARGUMENT & PUT EXECUTION ADDRESS ON STACK ; EX (SP),HL ; ; RETURN TO EXECUTION ADDRESS ; RET ; ; : SELECT NEW BANK ; MAXFUNS EQU ($ - FUNTABL) / 2 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++************ ; ; BANK SELECT PROCEDURE ; NOTE: THIS FUNCTION IS ONLY FOR CP/M 3.0 COMPATABILITY. ALL OTHER ; ROUTINES SHOULD****** ; XMOVE: ; ; STORE BANK #S ; LD (DBANK),BC ; ; SET BANKS CHANGED FLAG ; LD A,-1 LD (BNKCHG),A ; ; D-BANK MOVE ; BMOVE2: ; ; SAVE CURRENT BANK # ; LD A,(CURBNK) LD (CBANK),A ; ; CLEAR INTER-BANK MOVE FLAG FOR NEXT LD BC,(DBANK) ; ; NO INTERRUPTS WHILE MOVING ; DI ; ; TOP OF MOVE LOOP ; BMOVE4: LD A,B ;SELECT SOURCE BANK OULECT BANK ; LD A,E DI ;NO INTERRUPTS OUT (BNKREG),A ; ; FETCH DATA ; LD C,(HL) ; ; RESTORE BANK ; LD A,B  OUT (BNKREG),A ; EI ; ; DONE ; POP BC RET SUBTTL MONITOR FUNCTION CALL DISPATCHER ;++++++++++++++++++++++++ ; FUNCTION ERROR ; MFUNERR: LD A,-1 OR A,A RET ;################################################################++++ ; ; NOT INTERNAL FUNCTION, CHECK FOR DEBUGGER ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ USE GETMEM, PUTMEM & XROM ROUTINES. ; ENTRY- A= BANK ADDRESS ; ;************************************************************ONE ; RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; MEMORY TO MEMORY MOVE FUNC TIME ; XOR A,A LD (BNKCHG),A ; ; IF IN SAME BANK THEN USE INTRA_BANK MOVE ON IT ; PUSH HL ;SAVE PTR LD HL,(DBANKT (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  OUT (BNKREG),A ; ; RETURN DATA ; LD A,C ; ; DONE ; POP BC EI RET ;*************************************++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; ENTRY- A= FUNCTION # ; ;+++++++++++++++++++++++++++++++++++++++++++############ ; ; MONITOR FUNCTION TABLE ; ;############################################################################ ; ++++++ ; NOT_INT: ; ; BIAS DOWN DEBUGGER FUNCTIONS ; SUB A,16 ; ; IF FUN# < START THEN INTERNAL FUNCTION RESERVED E0 %+ &, !'- "(. #)/ $*0RR ; JR C,MFUNERR ; ; ELSE IF FUN# > LAST THEN GO CHECK NEXT GROUP ; CP A,16 JR NC,NOT_DEB ; ; ELSE EXECUTE DEBU++++++++++++ ; ; DISK DRIVER FUNCTIONS ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; N# ; ADD A,2 ;ADD OFFSET ; PUSH HL ;SAVE ARG LD H,CLK_RNUM ;SET ROM # LD L,A ;SET FUNCTION # EX (SP),HL CALL XRO************************************** ; ; This code module contains the system character I/O drivers and ; resides in the s************************************************************************** FORM FALSE EQU 0 TRUE EQU NOT FALSE SERIAL EQUTERNAL FUNCTION STUB FOR USE DURING AN INTERRUPT WITHOUT THE ; RESIDENT ROM ENABLED. USE IN ALL NON-RESIDENT ROMS. ; ENTRY- A= IF RETURNED THEN HALT ; HALT SUBTTL MONITOR BOARD SHADOW ROM SELECTION PROCEDURE *INCLUDE XROM.Z80 SUBTTL MONITO-1 OR A,A RET ;############################################################################ ; ; MONITOR FUNCTION TABLGGER 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 ;OT_CHR: ; ; BIAS DOWN TO DISK FUNCTIONS ; SUB A,32 ; ; IF NOT DISK FUNCTIONS THEN GO CHECK NEXT GROUP ; CP A,16 MF INC SP INC SP ; RET SUBTTL MONITOR FUNCTIONS ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ame address space as the resident Monitor ROM. The ROMs ; communicate with each other through a ROM transfer function. ; *INC TRUE ; ; INCLUDE SYSTEM DEFINITION FILES ; ;*MACLIB ASMBTOOL.MLB ;*INCLUDE MONBOARD.DEF ;*INCLUDE NAKEDT.DEF ;*INCL FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; I_STUB: ADD A,2 ;BIAS UP R FUNCTION CALL DISPATCHER ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; ENTRY- A= FUNCTIE ; ;############################################################################ ; FUNTABL: DW RETVERS ;0: RETURN MONITO++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CHAR FUNCTIONS ; ;+++++++++++++++++++++++++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++++++++++++ ; ; RETURN VERSION FUNCTION #0 ; EXIT - HL= VERSION # (123D = 1.23) ; ;+++++++++++++++++++++++++++++++++++++++LUDE ZBMH122.HDR ;**************************************************************************** ; ; Revision status: ; ; 1.0UDE PRI.DEF ;*INCLUDE ZBMFUNS.DEF ;*INCLUDE COMIOPB2.DEF ; LIST OFF *MACLIB ASMBTOOL.MLB *INCLUDE MONBOARD.DEF *INCLUDEPUSH HL LD H,MR_RNUM ;USE RESIDENT ROM LD L,A EX (SP),HL CALL XROMF ;GO EXECUTE THE FUNCTION INC SP ;BALANCE STACK ON # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; FUNCH: CP A,MAXFUNS JR NC,MFUNERRR ROM VERSION ; DW MFUNERR ;1: RETURN CHAR DEVICE PARAMETERS DW MFUNERR ;2: EXECUTE SELF TEST DW MFUNERR ;3: SET STAND+++++++++++++++++++++++++++++++++++++++++++++++++++ ; NOT_DEB: ; ; BIAS DOWN TO CHAR FUNS ; SUB A,16 ; ; IF NOT CHAR ;SET FUNCTION # EX (SP),HL CALL XROMF INC SP INC SP ; RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; RETVERS: LD HL,VERSN RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++ - Release ; ; 1.22 11-22-90 GRH ; Separate code from monitor ROM. ; Move code to separate ROM in order to gain space for  NAKEDT.DEF *INCLUDE PRI.DEF *INCLUDE ZBMFUNS.DEF *INCLUDE COMIOPB2.DEF LIST ON *INCLUDE ZBMG122.DEF THIS_ROM EQU CHR INC SP RET ;**************************************************************************** ; ; COLD INIT ONLY SWITCHES T ; ; FUNCTION SEEMS LEGAL, FETCH EXECUTION ADDRESS FROM TABLE ; PUSH HL ;SAVE POSSIBLE ARGUMENT ; LD HL,FUNTABL ADDARD CONSOLE DEVICE DW MFUNERR ;4: SET STANDARD LIST DEVICE DW MFUNERR ;5: INITIALIZE CHAR DEVICE DW MFUNERR ;6: SET DEV 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,C+++++++++++++++++++++++++ ; ; MISCELLANEOUS DRIVER FUNCTIONS ; ENTRY- D= DRIVER FUNCTION # ; ;+++++++++++++++++++++++++++++ TITLE M5b Z-80 MONITOR CHARACTER I/O ROM LIST NOCOND ;**********************************************************************I/O drivers and ; interrupt code. ; Add rom xover function as include file. ; Add function dispatcher for execution and brea_RNUM SUBTTL EXTERNAL ENTRY POINTS ORG MONROM ; JP CINIT ;COLD START ; ; EXTERNAL FUNCTION ENTRY DURING INTERRUPT O RESIDENT ROM ; ;**************************************************************************** ; CINIT: ; ; SET STACK ; 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 EXEICE BAUD RATE DW MFUNERR ;7: SPARE DW CIS ;8: RETURN STANDARD CONSOLE INPUT STATUS DW CI ;9: RETURN STANDARD CONSOLE CHHR_RNUM EX (SP),HL CALL XROMF INC SP INC SP RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; NOT_DSK: ; ; BIAS DOWN TO MISC. FUNCTIONS ; SUB A,16 ; ; SET ROM ****** ; ; SYSTEM MONITOR FOR M5b ; (c) 1982,1983 GRH ELECTRONICS, CUPERTINO, CA ; ;**************************************kpoint entries. ; ; 1-9-91 GRH ; Add conditional ASSY for default CON:. Add SIO driver as alternate. ; VERSN EQU 122 ;** ; DS (MONROM + 6) - $ JP I_STUB ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EX LD SP,MONSTK ; ; RESET ROM FUNCTION SHOULD NOT RETURN ; LD HL,[MR_RNUM SHL 8] + 1 ;RESET PUSH HL CALL XROMF ; ; CUTION ADDRESS ON STACK EX (SP),HL ; ; RETURN TO EXECUTION ADDRESS ; RET ; ; ; FUNCTION ERROR ; MFUNERR: LD A,AR DW COS ;10: RETURN STANDARD CONSOLE OUTPUT STATUS DW CO ;11: SEND CHAR TO STANDARD CONSOLE DW LOS ;12: RETURN STANDA0 %+ &, !'- "(. #)/ $*0RD LIST DEVICE OUTPUT STATUS DW LO ;13: SEND CHAR TO STANDARD LIST DEVICE ; MAXFUNS EQU ($ - FUNTABL) / 2 SUBTTL DEBUGGE XOR A,A ENDIF LD (IOBYTE),A ; ; INIT SIO ANYWAY ; LD HL,IOIDTA ;SET TABLE PTR ; IOILP: LD C,(HL) ;FETCH PORT A BAUD ; DB 3CH DB 2 DB 01000101B DB 64 ; ; CTC 1: SIO #0B BAUD ; DB 3DH DB 2 DB 01000101B DB 64 ; DB -BYTE BIT 0..1)= 0: CON0, 1: CON1, 2: CON2, 3: CON3 ; EXIT - A= 0: BUSY, FFH: READY ; ;**************************************************************** ; ; SYSTEM CONSOLE INPUT STATUS SELECTOR ; ENTRY- (IOBYTE BIT 0..1)= 0: CON0, 1: CON1, 2: CON2, 3: CONSOLE 1 JP Z,CI2 ;CONSOLE 2 JP CI3 ;CONSOLE 3 ;************************************************************************* ; 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 C0B RET Z LD A,-1 RET ; ; ; OUTPUT CHAR ; CO0: CALL COS0 ;IF BUSY THEN WAIT JR Z,CO0 ; LD A,C ;OUTPUT CHAR & ER FUNCTIONS ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN VERSION FUNCTION ; EXI 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 ; 1 ;END-OF-TABLE SUBTTL FUNCTIONS AND PROCEDURES ;************************************************************************************************************* ; COS: LD A,(IOBYTE) AND A,3 JP Z,COS0 ;CONSOLE 0 CP A,2 JP M,COS1 ;CONSOLE 1 CON3 ; EXIT - A= 0: NOT READY, FFH: CHAR READY ; ;*********************************************************************************** ; ; LIST DEVICE OUTPUT SELECTOR ; ENTRY- (IOBYTE BIT 6..7)= 0: LST0, 40H: LST1, 80H: LST2, C0H: CON ; C= CHAR ; OS ;CONSOLE SUBTTL PRIMITIVE I/O DRIVERS IF SERIAL CONMSG -- SERIAL VERSION -- ;**************************************RETURN OUT (34H),A RET ELSE CONMSG -- NAKED TERMINAL VERSION -- ;*****************************************************T - HL= VERSION # (123D = 1.23) ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; RETVERS: ; SIO DONE ; IOIDN: ; ; DISPLAY SIGN-ON ; LD HL,LOGMSG CALL PRTS ; ; DONE ; RET ;######################**** ; ; DISPLAY TEXT ON CONSOLE PROCEDURE ; ENTRY- HL= PTR TO BIT-7 TERMINATED ASCII TEXT ; ;***************************** JP Z,COS2 ;CONSOLE 2 JP COS3 ;CONSOLE 3 ;***************************************************************************** ; 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 ;;**************************************************************************** ; LO: LD A,(IOBYTE) AND A,0C0H JP Z,LO0 ;PR************************************** ; ; PRIMARY CONSOLE DEVICE (CON0) : SIO #0A ; ;************************************************************* ; ; PRIMARY CONSOLE DEVICE (CON0) : NAKED TERMINAL ; ;********************************************** LD HL,VERSN RET ;**************************************************************************** ; ; INITIALIZE I/O ; ;###################################################### ; ; SIO INITIALIZATION DATA TABLE ; ;################################*********************************************** ; PRTS: ; ; DISPLAY CHAR ; LD C,(HL) RES 7,C PUSH HL CALL CO PO ; ; SYSTEM CONSOLE OUTPUT SELECTOR ; ENTRY- (IOBYTE BIT 0..1): 0: CON0, 1: CON1, 2: CON2, 3: CON3 ; C= CHAR ; ;*********CONSOLE 3 ;**************************************************************************** ; ; SYSTEM CONSOLE INPUT SELECTORINTER 0 CP A,80H JP M,LO1 ;PRINTER 1 JP Z,LO2 ;PRINTER 2 JP CO ;CONSOLE ;***************************************************************************** ; ; RETURN INPUT STATUS ; CIS0: IN A,(35H) AND A,00000001B RET Z LD A,-1 ;EL****************************** ; ; RETURN INPUT STATUS ; CIS0: IN A,(NT_STAT) ;IF NOT CHAR NOT READY THEN RETURN 0 AND A**************************************************************************** ; ROM_INIT: IF SERIAL <> TRUE ; ; IF NAKED############################################ ; IOIDTA: ; ; SIO #0A ; DB 35H ;PORT DB 8 DB 18H DB 4,44H DB 3,0C1P HL ; ; IF CHAR < 128 THEN DO NEXT CHAR ; BIT 7,(HL) INC HL JR Z,PRTS ; RET SUBTTL IOBYTE HANDLERS ;************************************************************************* ; CO: LD A,(IOBYTE) AND A,3 JP Z,CO0 ;CONSOLE 0 CP  ; ENTRY- (IOBYTE BIT 0..1)= 0: CON0, 1: CON1, 2: CON2, 3: CON3 ; EXIT - A= CHAR (CTRL-Z: EOF) ; ;*************************************************************** ; ; LIST DEVICE STATUS INPUT SELECTOR ; ENTRY- (IOBYTE BIT 6..7)= 0: LST0, 40H: LST1, 8SE RETURN -1 RET ; ; ; RETURN INPUT CHAR ; CI0: CALL CIS0 ;IF CHAR NOT READY THEN WAIT JR Z,CI0 ; IN A,(34H) ;ELS,1 SHL NT_READY RET Z LD A,-1 ;ELSE RETURN -1 RET ; ; ; RETURN INPUT CHAR ; CI0: CALL CIS0 ;IF CHAR NOT READY THE TERMINAL INSTALLED THEN SET IOBYTE TO IT ; ELSE SET IOBYTE TO SIO ; IN A,(NT_STAT) AND A,[1 SHL NT_PRSNT] RRCA ELSH 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 #0********************************************************************** ; ; SYSTEM CONSOLE OUTPUT STATUS SELECTOR ; ENTRY- (IOA,2 JP M,CO1 ;CONSOLE 1 JP Z,CO2 ;CONSOLE 2 JP CO3 ;CONSOLE 3 ;***************************************************************************************************** ; CI: LD A,(IOBYTE) AND A,3 JP Z,CI0 ;CONSOLE 0 CP A,2 JP M,CI1 ;0H: LST2, C0H: CON ; EXIT - A= 0: BUSY, FFH: READY ; ;***********************************************************************E RETURN CHAR RET ; ; ; RETURN OUTPUT STATUS ; COS0: IN A,(35H) ;IF NOT READY TO ACCEPT CHAR THEN WAIT AND A,0000010N WAIT JR Z,CI0 ; IN A,(NT_DATA) ;ELSE RETURN CHAR RET ; ; ; RETURN OUTPUT STATUS ; COS0: IN A,(NT_STAT) ;IF NOT R0 %+ &, !'- "(. #)/ $*0EADY TO ACCEPT CHAR THEN WAIT CPL AND A,1 SHL NT_BUSY RET Z LD A,-1 RET ; ; ; OUTPUT CHAR ; CO0: CALL COS0 ;IF ;**************************************************************************** ; ; ALTERNATE CONSOLE DEVICE (CON3) ; ;******E 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 LLL HAS DEFAULT BANK # ; ; INIT ALL BANKS ; LD E,A ;START WITH ALL Z80 BANKS LD HL,THIS_BNK ;POINT TO LOCATION TO STORE CALL XROMF POP HL ; ; OUTPUT SIGN-ON MESSAGE ; LD HL,LOGMSG ;OUTPUT SIGN-ON CALL PRTS ; ; EXECUTE THE DEBUGGER ; ; DO AT LAST MINUTE TO MINIMIZE REFRESH REGISTER CHANGE ; LD R,A ;SET R POP AF ;SET AF ; ; RESERVE SPACE FOR A Y ; ; INSURE INTERRUPTS DISABLED ; DI ; ; REMOVE PAGE 0 IMAGE ; OUT (M2_CLDRES),A ; ; REMOVE JADE DOUBLE D WINEM ; INC E ;NEXT BANK ; LD A,0FFH ;IF NOT LAST BANK THEN REPEAT CP A,E JR NZ,BNKS_INIT ; ; INITIALIZE IOBYTE ;  BUSY THEN WAIT JR Z,CO0 ; LD A,C ;OUTPUT CHAR & RETURN OUT (NT_DATA),A RET ENDIF ;************************************************************************************************* ; CIS3: EQU CIS0 CI3: EQU CI0 COS3: EQU COS0 CO3: EQD A,0BFH OUT (PRI_2CNT),A ;CLEAR STROBE RET ;************************************************************************* BANK # BNKS_INIT: LD C,E ;STORE IT CALL PUTMEM ; INC E ;NEXT BANK ; LD A,0FFH ;IF NOT LAST BANK THEN REPEAT CP  ; MAINLP: LD SP,MONSTK LD HL,[DEB_RNUM SHL 8] + MF_XDEB - 16 + 2 ;3 PUSH HL CALL XROMF POP HL JR MAINLP SUBTTEI INSTRUCTION TO BE PATCHED IN ; DB 0 ;'NOP' OR PLACE FOR 'EI' ; ; RETURN TO EXECUTION ADDRESS ON STACK ; RET ;DOW(S) ; LD A,DD_FREE ;REMOVE DD WINDOW, IF PRESENT OUT (DD_PRT3),A OUT (DD_PRT5),A OUT (DD_PRT8),A ; ; SET MEMORY  LD A,IOBYTV ;SET TO INITIAL IOBYTE VALUE LD (IOBYTE),A ; ; SET BANK STACK ; LD (THIS_STK),SP ; DEC E ;BACK UP TO ************************************************* ; ; ALTERNATE CONSOLE DEVICE (CON1) : SIO #0 ; ;**************************U CO0 ;**************************************************************************** ; ; LIST DEVICE 1 (LST1) : PRI CENTRO*** ; ; LIST DEVICE 1 (LST1) ; ;**************************************************************************** ; LOS1: EQU LA,E JR NZ,BNKS_INIT ; ; INITIALIZE IOBYTE ; LD A,IOBYTV ;SET TO INITIAL IOBYTE VALUE LD (IOBYTE),A ; ; SET BANK SL DEBUGGER SUPPORT ROUTINES ;**************************************************************************** ; ; GOTO STUB ; ;+++++++++++++++++++++++++ ; ; RETURN CURRENTLY SELECTED BANK FUNCTION #7 ; EXIT - A= BANK ; ;++++++++++++++++++++++++++++++BANK ; LD A,DEFBNK OUT (BNKREG),A ; ; INITIALIZE RESTART VECTORS IN PAGE 0 ; LD SP,003FH ;USE STACK TO INIT RESTARTSBANK 0FEH (ROM BANK) LD HL,THIS_STK ;SET PTR LD C,0 ;SET TO 0800H CALL PUTMEM ; INC HL LD C,8 CALL PUTMEM ; ; ************************************************** ; CIS1: EQU CIS0 CI1: EQU CI0 COS1: EQU COS0 CO1: EQU CO0 ;********NICS ; ;**************************************************************************** ; ; RETURN OUTPUT STATUS ; LOS0: OS0 LO1: EQU LO0 ;**************************************************************************** ; ; LIST DEVICE 2 (LST2) TACK ; LD (THIS_STK),SP ; ; SET FUNCTION CALL RESTART ; LD HL,FUNENT LD (MFUNRSV),HL ; ; INIT ROMS (I/O) ; LD **************************************************************************** ; GOTOS: ; ; SCRUB FUNCTION DATA ON STACK ; ++++++++++++++++++++++++++++++++++++++++++++++ ; RETCBNK: LD A,(CURBNK) CP A,A ;RETURN ZF RET SUBTTL INITIALIZATI LD HL,0C300H LD DE,RSTER LD B,16 ;64 BYTES ; INIT1: PUSH DE PUSH HL DJNZ INIT1 ; ; SET STACK ; LD SP,MONSTKSET FUNCTION CALL RESTART ; LD HL,FUNENT LD (MFUNRSV),HL ; ; INIT ROMS (I/O) ; LD HL,[CHR_RNUM SHL 8] + 1 ;CHAR PU******************************************************************** ; ; ALTERNATE CONSOLE DEVICE (CON2) ; ;**************** LD A,0BFH ;THIS PRINTER NEEDS STB=F FOR BUSY OUT (PRI_2CNT),A ; TO WORK PROPERLY ; IN A,(PRI_1ST) ;FETCH STATUS CPL  ; ;**************************************************************************** ; LOS2: EQU LOS0 LO2: EQU LO0 LOGMSGHL,[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 ;RET ADDR TO XROMF POP HL ;CALLER RETURN ADDR POP HL ;XROM ARGUMENT ; ; SET REGISTERS ; LD HL,(RLOC) ;L= ON CODE ;---------------------------------------------------------------------------- ; ; THIS IS THE COLD START INIT CODE ; ; ; SET MEMORY BANK CONSTANT ; LD (THIS_BNK),A ;A STILL HAS DEFAULT BANK # LD (CURBNK),A ; ; INIT ALL BANKS ; LSH 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************************************************************ ; CIS2: EQU CIS0 CI2: EQU CI0 COS2: EQU COS0 CO2: EQU CO0  AND A,[1 SHL PRI_1BSB] ;TEST BUSY RET Z ; LD A,-1 RET ; ; ; OUTPUT CHAR ; LO0: CALL LOS0 ;WAIT FOR BUSY=FALS DB ' M5b Character I/O V. ' PVERS VERSN DM CR,LF END  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 HLR, 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  ;---------------------------------------------------------------------------- ; ROM_INIT: ;XROM ENTRY INIT: ;EXTERNAL ENTRD 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 PUTM] + 1 ;DISK PUSH HL CALL XROMF POP HL ; LD HL,[CLK_RNUM SHL 8] + 1 ;MISC PUSH HL CALL XROMF POP HL ; ; OUTP0 %+ &, !'- "(. #)/ $*0UT SIGN-ON MESSAGE ; LD HL,LOGMSG ;OUTPUT SIGN-ON CALL PRTS ; ; EXECUTE THE DEBUGGER ; MAINLP: LD SP,MONSTK LD HL MINIMIZE REFRESH REGISTER CHANGE ; LD R,A ;SET R POP AF ;SET AF ; ; RESERVE SPACE FOR A EI INSTRUCTION TO BE PATCHEDA,R ;DO REFRESH REGISTER AS SOON AS POSSIBLE LD (LLOC),HL POP HL LD (FLOC),HL ; LD L,A ;REFRESH REGISTER LD A,I L- ; RSTER: PUSH AF PUSH HL LD HL,RSTMSG CALL PRTS POP HL POP AF JP REST ;************************************+++++++++++++++++++++++++++++++ ; ; RETURN SYSTEM CONSOLE OUTPUT STATUS FUNCTION ; EXIT - A= 0: BUSY, FFH: READY ; ;++++++++++++++++++ ; CIS: XCROM MF_CIS ; ; DONE ; RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++A= 0: BUSY, FFH: READY ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; LOS: XCROM MF_LOSFROM PROM DEFBFR EQU PAGE0 + 80H ;DEFAULT BUFFER ; ; BIOS FUNCTION CALL RESTART VECTOR ; BFUNRST EQU 28H BFUNRSV EQU PAG,[DEB_RNUM SHL 8] + MF_XDEB - 16 + 2 ;3 PUSH HL CALL XROMF POP HL JR MAINLP SUBTTL DEBUGGER SUPPORT ROUTINES ;***** IN ; DB 0 ;'NOP' OR PLACE FOR 'EI' ; ; RETURN TO EXECUTION ADDRESS ON STACK ; RET ;****************************D H,A LD (RLOC),HL ; LD (ELOC),DE LD (CLOC),BC ; ; FETCH RETURN ADDRESS FROM PGM STACK ; POP BC ; ; SAVE SP AT**************************************** ; ; PRTS ROUTINE OUTPUTS AN ASCII STRING ONTO THE CONSOLE. ; THE STRING MUST BE TER+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; COS: XCROM MF_COS ; ; DONE ; RET ;******++++++++++++ ; ; RETURN NEXT SYSTEM CONSOLE INPUT CHAR FUNCTION ; EXIT - A= CHAR (CTRL-Z: EOF) ; ;+++++++++++++++++++++++++ ; ; DONE ; RET SUBTTL MESSAGES RSTMSG: DM CR,LF,'RST ERR ' LOGMSG: DB CR,LF,'65K BANKED ZMON V. ' PVERS VERSN E0 + BFUNRST BFUNRSI EQU 0C7H + BFUNRST ; TPA: EQU 100H ;===============================================================*********************************************************************** ; ; GOTO FUNCTION #8 ; ;**************************************************************************** ; ; REST ROUTINE TRAPS ALL OF THE REGISTER CONTENTS WHENEVER A BREAKPOINT ;  BREAKPOINT ; LD (SLOC),SP ; ; BACK UP RETURN ADDRESS TO POINT TO RESTART INSTRUCTION ; DEC BC ; ; SET UP LOCAL STMINATED BY BIT 7 SET IN THE LAST CHAR OF THE STRING. ; ENTRY- HL= TEXT PTR ; ;********************************************************************************************************************* ; ; SEND CHAR TO SYSTEM CONSOLE OUTPUT PROCEDURE ; ENT+++++++++++++++++++++++++++++++++++++++++++++++++++ ; CI: XCROM MF_CI ; ; DONE ; RET ;************************** DM CR,LF END ============= ; ; OTHER DECLARATIONS ; ;============================================================================ ; MR_************************************************ ; GOTOS: ; ; SCRUB FUNCTION DATA ON STACK ; POP HL ;RET ADDR TO XROMFRESTART INSTRUCTION IS EXECUTED. THE TRAPPED CONTENTS ARE STORED IN THE ; MONITOR VARIABLE AREA FOR LATER ACCESS AND USE BY THEACK ; LD SP,MONSTK ;SET THE MONITOR STACK ; ; RETURN TO DEBUGGER ; LD HL,[DEB_RNUM SHL 8] + 2 PUSH HL CALL XROMF ***************************** ; PRTS: ; ; DISPLAY CHAR ; LD C,(HL) ;FETCH CHAR RES 7,C ;MAKE 7-BIT PUSH HL ;SAVERY- C= CHAR ; ;**************************************************************************** ; CO: XCROM MF_CO ; ; DONE************************************************** ; ; SEND CHAR TO LIST DEVICE OUTPUT PROCEDURE ; ENTRY- C= CHAR ; ;******QU CPMBS + 3C00H ;ADDRESS OF BDOS BIOS: EQU CPMBS + 4A00H ;ADDRESS OF BDOS BIOSR: EQU 1000H - BIOS ; ; PAGE 0 LOCATIONS ;RNUM EQU 0 ;INTERIM DEFINITION FOR INTERRUPT ROM SWAP ; SECSZ: EQU 128 NDRVS: EQU 6 IF BOOT = 10H ; ; 8" HARD DISK B POP HL ;CALLER RETURN ADDR POP HL ;XROM ARGUMENT ; ; SET REGISTERS ; LD HL,(RLOC) ;L= R, H= I LD A,H ;SET I REG GOTO & THE EXAMINE ; REGISTERS COMMANDS. ; ; INSERT INTERRUPT DISABLER SOFTWARE AT START OF REST. ; ;********************* POP HL JP MAINLP SUBTTL SUBROUTINES & FUNCTIONS ;----------------------------------------------------------------------- PTR CALL CO ;DISPLAY CHAR POP HL ;RESTORE PTR ; ; IF CHAR < 128 THEN REPEAT ; BIT 7,(HL) INC HL ;NEXT CHAR JR  ; RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN SYSTEM CONSOLE INPUT S********************************************************************** ; LO: XCROM MF_LO ; ; DONE ; RET ;+++++++ PAGE0: EQU 0 ;START OF CP/M RAM IOBYTE: EQU PAGE0 + 3 ;IOBYTE ADDR DEFDRV: EQU PAGE0 + 4 ;DEFAULT DRIVE PARAM ADDR BDOSJV OOT DATA ; STHD EQU 0 ;START LOGICAL DRIVE OF HARD DISK NDHD EQU 3 ;LAST LOGICAL DRIVE OF HARD DISK ST8FD EQU 4 ;START LO. 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******************************************************* ; REST: ; ; SAVE 8080 REGS FIRST SO WE CAN WORK ; PUSH AF LD ----- ; ; UNINITIALIZED RESTART ERROR HANDLER ; ;---------------------------------------------------------------------------Z,PRTS ; ; ELSE DONE ; RET SUBTTL EXTERNAL NON-FUNCTION CONSOLE I/O ;+++++++++++++++++++++++++++++++++++++++++++++TATUS FUNCTION ; EXIT - A= 0: NOT READY, FFH: CHAR READY ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN LIST DEVICE OUTPUT STATUS FUNCTION ; EXIT - EQU PAGE0 + 5 ;BDOS SYSTEM CALL ENTRY THIS_BNK EQU PAGE0 + 001BH ;BANK # OF THE CURRENT BANK DK_BDRV EQU 0041H ;BOOT DRIVE # GICAL DRIVE OF 8" FLOPPY ND8FD EQU 5 ;LAST LOGICAL DRIVE OF 8" FLOPPY ENDIF IF BOOT = 3 ; ; 8" FLOPPY BOOT DATA ;0 %+ &, !'- "(. #)/ $*0+++++++++++++++++ ; ; RETURN CALENDAR FUNCTION #3 ; EXIT - A= DAY ; B= MONTH ; C= YEAR ; L= DAY OF WEEK ; DE= ? ; ;++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN TIME FUNCTION #4 ; EXIT - A= SECONDS ; B= MINUTES ; C= HOURS ; DE - A= REGISTER DATA ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKRETR: GETD: ; ; LK_SECL CALL GETD AND A,CLK_DMSK ;MASK OFF UNWANTED BITS LD B,A ; ; WAIT UNTIL SECONDS CHANGE ; CLKRWT: CALL GETD ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKSTOP: ; ; PUT HOLD ON CLOCK ; LD A,[1 SHLFROM CLOCK FUNCTION ; ENTRY- C= CLOCK REGISTER # ; EXIT- DE= DIGITS ; A= HIGH DIGIT ; C= C + 2 ; ;++++++++++++++++++++++H HIGH BYTE ; LD A,D ; ; MASK OFF NON-NUMERICAL BITS ; AND A,H ; ; MULTIPLY TENS DIGIT BY 10 & ADD TO UNITS ; LS -= 10 ; SUB A,10 INC L JR H2BCDL ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKCAL: ; ; WAIT FOR CLOCK DATA TO BE STABL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKTIM: ; ; WAIT FOR CLOCK TO STAB TELL CLOCK WHICH REGISTER TO READ ; LD A,C SET CLK_RD,A ;SET READ BIT OUT (CLK_CMD),A ; ; DELAY >= 5us PER DATA SHE AND A,CLK_DMSK CP A,B JR Z,CLKRWT ; ; DONE, RETURN 0 ; LD B,A XOR A,A RET ;++++++++++++++++++++++++++++++++ CLK_HOLD] OUT (CLK_DATA),A ; ; DELAY >= 150us FROM HOLD ; LD B,20 ;DELAY >= 150us FROM HOLD ; CLKSDL: EX (SP),HL ++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; GET2D: ; ; FETCH LOW DIGIT ; CALL GETD LD E,A ; ; FETCH D B,A ;SET CNT LD A,C ;GET UNITS DIGIT JR Z,NOTENS ;IF (TENS & MASK) == 0 THEN RETURN UNITS ; LD C,10 ;ELSE ADD TENS D ; SET CLOCK DIGIT PROCEDURE ; ENTRY- A= BCD DATA ; C= COMMAND ; EXIT - A= COMMAND ; ;++++++++++++++++++++++++++++++++++++E FOR AWHILE ; CALL CLKWAIT ; ; FETCH DAY OF WEEK & SAVE ; LD C,CLK_WEEK CALL GETD AND A,7 ;MASK OFF GARBAGE {0..ILIZE ; CALL CLKWAIT ; ; PROCESS SECONDS ; LD C,CLK_SECL CALL GET2D LD H,7 ;MASK {0..79} CALL GETN PUSH AF ;ET ; EX (SP),HL EX (SP),HL ; ; RETURN WITH DATA ; IN A,(CLK_DATA) ;RETURN DATA RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; TEST IF BOARD PRESENT FUNCTION #7 ; EXIT - A,L= 0: THERE, /0: NOT THERE ; EX (SP),HL DJNZ CLKSDL ; ; DONE ; RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++HIGH DIGIT ; INC C CALL GETD LD D,A ; ; PRESETUP FOR NEXT TIME ; INC C ; ; DONE ; RET ;+++++++++++++++IGIT ; TENSLP: ADD A,C DJNZ TENSLP ; ; DONE CONVERTING, RESTORE & RETURN ; NOTENS: POP BC ; RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLK_SET: ; ; OUTPUT DATA ; SET CLK_HOLD,A ;KEEP CLOCK STOPPED OUT (CLK_DAT7} LD L,A ; ; PROCESS DAY ; INC C CALL GET2D LD H,3 ;MASK {0..39} CALL GETN PUSH AF ; ; PROCESS MONTH ; SAVE ; ; PROCESS MINUTES ; CALL GET2D CALL GETN ;USE SAME MASK AS ABOVE {0..79} LD B,A ; ; PROCESS HOURS ; CA+++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; WAIT FOR CLOCK TO CHANGE FUNCTION #6 ; EXIT - A= 0: OK, /0: BOARD NOT;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ISTHERE: ; ; FETCH CLOCK DATA ; IN A,(C+ ; ; START CLOCK FUNCTION #9 ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKSTRT: +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CONVERT BCD NUMBER TO BINARY FUNCTION ; ENTRY- E= LO BCD # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CONVERT BINARY NUMBER TO BCD DIGITS FUNCTION ; ENTRY- A= A),A ; ; OUTPUT REGISTER # ; LD A,C OUT (CLK_CMD),A ; ; STROBE DATA INTO REGISTER ; SET CLK_WRT,A OUT (CLK_CMD CALL GET2D LD H,1 ;MASK {0..19} CALL GETN LD B,A ; ; PROCESS YEAR ; CALL GET2D LD H,0FH ;MASK {0..99} CALL GLL GET2D LD H,3 ;MASK {0..39} CALL GETN LD C,A ; ; RETURN MINUTES IN A ; POP AF RET ;++++++++++++++++++++++ PRESENT ; C= CLK_SECL ; B= LO SECONDS DATA ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++LK_DATA) ; ; IF UPPER BITS NOT DRIVEN THEN BOARD IS NOT THERE ; AND A,11000000B ; ; ADJUST SENSE ; RET ;+++++; ; CLEAR HOLD ; XOR A,A OUT (CLK_DATA),A ; ; CLEAR COMMAND ; OUT (CLK_CMD),A ; ; DONE ; RET SUBTTL  ; D= HI BCD # ; H= MASK FOR HI BYTE ; EXIT - A= NUMBER ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++BINARY DATA ; EXIT - A= UNITS DIGIT ; L= TENS DIGIT ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++),A ; LD A,C OUT (CLK_CMD),A ; ; DONE ; RET ;******************************************************************ETN ; ; RETURN VALUES ; LD C,A ;RETURN YEAR IN C POP AF ;RETURN DAY IN A RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN CLOCK DATA FUNCTION #5 ; ENTRY- C= CLOCK REGISTER # ; EXIT+ ; CLKWAIT: ; ; IF BOARD NOT THERE THEN RETURN ERROR ; CALL ISTHERE RET NZ ; ; FETCH CURRENT SECONDS ; LD C,C+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; STOP CLOCK FUNCTION #8 ; EXIT - A, B= ? ; ;++++FUNCTIONS & PROCEDURES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN 2 BCD DIGITS +++++++++++++ ; GETN: ; ; SAVE REGS ; PUSH BC ; ; FETCH LOW BYTE ; LD A,E AND A,CLK_DMSK LD C,A ; ; FETC++++++++ ; H2BCD: ; ; TENS = 0 ; LD L,0 ; ; IF UNITS < 10 THEN DONE ; H2BCDL: CP A,10 RET C ; ; ELSE UNIT********** ; ; PRTS ROUTINE OUTPUTS AN ASCII STRING ONTO THE CONSOLE. ; THE STRING MUST BE TERMINATED BY BIT 7 SET IN THE LA0 %+ &, !'- "(. #)/ $*0ST CHAR OF THE STRING. ; ENTRY- HL= TEXT PTR ; ;****************************************************************************  + 6 LD (BDOSJV),A LD (BDOSJV + 1),HL ; ; INIT BIOS CALL VECTOR IN PAGE 0 ; LD HL,BIOFUNC LD (BFUNRSV),A LD (BFUN A,(DEFDRV) LD C,A JP CCP SUBTTL BIOS DISK FUNCTION ROUTINES ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++DISABLE UPLOAD (READ DATA) ; LD A,1 SHL PB_INHX LD (BTFLG),A ; ; ENABLE DOWNLOAD (WRITE DATA) ; LD HL,SECSZ LD (IOLD A,E LD (LOGRQ),A ; ; COMPUTE DISK DRIVER TABLE PTR ; CALL RETDVRT ;DRIVE IS STILL IN C REGISTER LD (DVRTPTR),HL OG JP NZ,FDSKER ; ; IF NO ID SECTOR THEN USE DEFAULTS ; LD A,(IOPB + PB_ST2O) CP A,-2 ;0: NO ID, -1: JADE ID, -2: EX,A RET ; ; ; IF NOT HARD DISK THEN GO DO FLOPPY TEST ; LGDEF: LD A,(BTDRV) IF STHD <> 0 CP A,STHD JR C,LGCKFD ********************************** ; ; SET TRACK # ; ENTRY- BC= TRACK # ; ;************************************************ ; PRTS: ; ; TOP OF PRINTING LOOP ; LD C,(HL) ;FETCH CHAR ; RES 7,C ;MAKE SURE BIT 7 = 0 PUSH HL CALL CO POP RSV + 1),HL ; ; SET DEFAULT SECTOR BUFFER ; LD BC,DEFBFR CALL SETDMA ; IF INTCPTS ; ; PUT BDOS VECTOR INTO INTE+++++++++++++++++++ ; ; READ A DISK SECTOR ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++PB + PB_BCNTO),HL ; ; PASS WRITE COMMAND ; LD A,PB_WRITC ;SELECT WRITE OP JP DISKOP ;+++++++++++++++++++++++++++++; ; PREFETCH DRIVER EXECUTION ADDRESS FROM TABLE ; LD E,(HL) ;STORE ADDRESS INC HL LD D,(HL) INC HL LD (DVRXADR),TENDED ID JR NZ,LGDEF ; ; ELSE XFER ID SECTOR DATA TO TABLES ; CALL TRNONE ;ASSUME NO TRANSLATION ; ; IF HARD DISK ENDIF CP A,NDHD + 1 JR NC,LGCKFD ; ; ELSE USE HARD DISK DEFAULTS ; CALL TRNONE ; NO XLATE LD HL,HDPBK ; ; **************************** ; SETTRK: LD (BTTRK),BC RET ;***********************************************************HL ; BIT 7,(HL) ;IF BIT 7 = 1 THEN STOP INC HL JR Z,PRTS ; ; DONE ; RET ;***********************************RCEPT CODE ; LD HL,(BDOS + 7) LD (BDOSV),HL ; ; NOW PUT INTERCEPT VECTOR INTO BDOS CODE ; LD HL,INTCPT LD (BDOS + ++++++++++++++++++++++++++++ ; DISKRD: ; ; ENABLE UPLOAD (READ DATA) ; XOR A,A LD (BTFLG),A ; ; DISABLE DOWNLOAD +++++++++++++++++++++++++++++++++++++++++++++++ ; ; SELECT DRIVE FUNCTION ; LOG-ON - SET DISK PARAMETER BLOCK ; ENTRY- C= DRDE ; ; FETCH FLAGS ; LD C,(HL) ; ; COMPUTE DISK PARAMETER TABLE ADDRESS ; LD HL,(BTDRV) LD H,0 ADD HL,HL ;DIS OR DOUBLE DENSITY THEN NO TRANSLATION ; LD A,(DEFBFR + ID_FLGO) AND A,[1 SHL DF_DTDB] OR [1 SHL DF_HARDB] ; ; ELSE SETXFER DATA TO TABLES ; SEL2: PUSH HL CALL DPBAD ; USE DEFAULT TABLE POP HL LD BC,DPBSZ LDIR JR SEL1 ; ; ; USE ***************** ; ; SET SECTOR ; ENTRY- BC= SECTOR # ; ;********************************************************************************************************** ; ; SEND CHAR TO SYSTEM CONSOLE PROCEDURE ; ENTRY- C= CHAR ; ;*******************7),HL ; ; INITIALIZE CLOCK VECTORS IF CLOCK INSTALLED ; LD A,MF_CSYN ;TEST FOR BOARD PRESENT CALL XMROM ; ; IF CLOC(WRITE DATA) ; LD (IOPB + PB_BCNTO),A LD (IOPB + PB_BCNTO + 1),A ; ; PASS READ COMMAND ; LD A,PB_READC ;SELECT READ IVE # ; E= 0 IF NEW SELECT ; EXIT - HL= PTR TO DPT OR 0 FOR ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++K # * 16 ADD HL,HL ADD HL,HL ADD HL,HL LD DE,D0DPH ADD HL,DE ; ; IF NOT FIRST SELECT OR LOGON INHIBITED THEN RETUR TRANSLATION ; CALL Z,TR8 ; ; XFER DISK DATA TO DPB ; NOX: CALL DPBAD ;GET ADDR OF DPB LD HL,DEFBFR + ID_SPTO LD 8" FLOPPY DEFAULTS ; LGCKFD: CALL TR8 LD HL,SD8PBK JR SEL2 ;******************************************************************** ; SETSEC: LD (BTSEC),BC RET ;************************************************************************************************************************************* ; CO: XCROM MF_CO ; ; DONE ; RET ENDK PRESENT THEN TURN ON CLOCK DRIVE ; OR A,A LD A,38H ;COND. JR (ON) JR Z,CLKON ; ; ELSE TURN OFF CLOCK DRIVE ; LDOP JP DISKOP ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; WRITE A DISK SECTOR ; E++++++++++++++++++++++ ; SELDSK: ; ; ASSUME ERROR ; LD HL,0 ; ; IF UNSUPPORTED DRIVE REQUESTED THEN RETURN 0 (ERRORN TABLE PTR ; LD A,(LOGRQ) OR A,C CPL AND A,1 RET Z ; ; ELSE LOG ON DRIVE ; LD (DTPTR),HL ;SAVE DRIVE TABLE PTBC,DPBSZ LDIR ; ; XFER DISK PHYSICAL DATA TO TABLE ; LD HL,DEFBFR + ID_FLGO ; SEL1: PUSH HL LD HL,(DVRTPTR) LD DE******************* ; ; HOME DRIVE - TREAT AS SEEK TRK 0 ; EXIT - BC= 0 ; ;********************************************** ; ; SET TRANSFER ADDR ; ENTRY- BC= ADDRESS ; EXIT - A= ? ; ;*************************************************************AGE 0 ; LD A,0C3H LD HL,BIOS + 3 LD (PAGE0),A LD (PAGE0 + 1),HL ; ; INIT BDOS CALL VECTOR IN PAGE 0 ; LD HL,BDOS A,18H ;UNCOND. JR (OFF) (CAUSES JUMP TO ILLEGAL) ; CLKON: LD (INHCLK),A ; ENDIF ; ; PASS DEFAULT DISK TO CCP ; LDXIT - A= 0: OK; /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; DISKWR: ; ; ) ; LD A,C CP A,NDRVS RET NC ; ; STORE DRIVE # FOR FUTURE USE ; LD (BTDRV),A ; ; SAVE LOGON REQUEST FLAG ; R ; ; ATTEMPT TO READ ID SECTOR ; XOR A,A ;INIT FLAG BYTE UNTIL FIRMWARE REVISED LD (IOPB + PB_ST2O),A ; CALL DISKL,DVRFLG ADD HL,DE EX DE,HL POP HL LD BC,DVRSIZ - DVRFLG LDIR ; ; RETURN DRIVE TABLE PTR ; LD HL,(DTPTR) XOR A****************************** ; HOME: LD BC,0 ; ; FALL INTO SET TRACK ; ;********************************************************* ; SETDMA: LD (BTDMA),BC CALL GETBNK ;FETCH BANK ADDRESS FROM MONITOR LD (BTDMAX),A RET ;++++++++++0 %+ &, !'- "(. #)/ $*0++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SECTOR TRANSLATION FUNCTION ; ENTRY- DE= 0: NO XLATE, ++++++++++++++++++++++++++++++ ; ; LOGON DISK FUNCTION ; EXIT - A= 0: OK; /0: ERROR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++ ; ; COMMON DISK I/O CODE ; ENTRY- A= IOPB COMMAND ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++++++++++++++++++++ITY LD E,A LD HL,IOPB LD A,MF_DIOB ;USE DISPLAY IOPB DATA FUNCTION CALL XMROM ; ; QUERY USER FOR OPTION ; LD HL,D************************************************ ; ; SET 3740 SECTOR TRANSLATION PROCEDURE ; ENTRY- (DTPTR)= MUST BE PTR TO D+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; DPBAD: LD HL,(DTPTR) ;FETCH BASE ADDR LD DE,10 ;ADD OFFSEECTOR LD D,0 LD HL,(IOPB + PB_SECO) ; PUSH HL ;SAVE SECTOR TO RESTORE LATER ; ADD HL,DE LD (IOPB + PB_SECO),HL ; ON ; OR A,A ;FUNCTION ERR? RET NZ ; ; RETURN THE COMMAND RESULTS STATUS ; LD A,(IOPB + PB_STATO) OR A,A RET ELSE PTR TO XLATE TABLE ; BC= SECTOR # TO XLATE ; EXIT - HL= XLATED SECTOR OR BC + 1 ; BC= UNCHANGED ; A, DE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++ ; DISKLOG: ; ; SET DESCRIPTOR SECTOR XFER ADDRESS TO DEFAULT BUFFER ; LD HL,DE++++++++++++++++++++++++++++++++++++++++++++++++++ ; DISKOP: ; ; SET UP IOPB ; LD HL,BTTRK LD DE,IOPB + PB_TRKO LD SKEB CALL EDITOR ; ; GET USER RESPONSE ; CALL CI ;GET USER RESPONSE ; PUSH AF ;SAVE CHAR LD C,A ;ECHO CHAR CATP ; EXIT - DE, HL= ? ; ;**************************************************************************** ; TR8: TR3740: LD DET OF DPB PTR ADD HL,DE LD E,(HL) ;FETCH DPB PTR INC HL LD D,(HL) RET SUBTTL HARD DISK ROUTINES ;++++++++++++++ ; EXECUTE IOPB ; CALL XPRIM ; ; RESTORE SECTOR ; POP HL LD (IOPB + PB_SECO),HL ; ; DONE ; RET ;++++ SUBTTL JADE FLOPPY DRIVER ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; JADE ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; SECTRN: ; ; IF NO TRANSLATION THEN RETURN SECTOFBFR LD (IOPB + PB_DMAO),HL CALL GETBNK LD (IOPB + PB_DMAXO),A ; ; SET DESCRIPTOR SECTOR SECTOR ; LD HL,ID_SECT LBC,PB_BCNTO - PB_TRKO LDIR ; DISKOP2: LD (IOPB + PB_CMDO),A ; ; FETCH DRIVER VECTOR & EXECUTE DISK DRIVER ; DKOPLP: LL COC POP AF ; AND A,5FH ;INSURE UPPER CASE ; ; IF RETRY THEN RETURN TO CALLER ; CP A,'R' ;IF RETRY THEN RETURN T,SDTRAN ; SETTR: LD HL,(DTPTR) LD (HL),E INC HL LD (HL),D RET ;**************************************************++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; HARD DISK DRIVER FUNCTION ; ENTRY- IY= DRIVER TABLE PTR ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE IOPB PRIMITIVE ; EXIT - A= 0: OK, /08" FLOPPY DISK DRIVER FUNCTION ; ENTRY- IY= DRIVER TABLE PTR ; EXIT - A= 0: OK; /0: ERROR ; ;+++++++++++++++++++++++++++++++R++ ; LD A,D ;IF TABLE ADDR = 0 THEN NO TRANSLATION OR A,E JP Z,NOTRAN ; ; ELSE CALCULATE NEW SECTOR FROM TABLE ; D (IOPB + PB_SECO),HL ; ; SET DESCRIPTOR SECTOR TRACK ; LD L,H ;H == 0 FROM LAST OPERATION (HL= 0) LD (IOPB + PB_TRKO) PUSH IY ;SAVE IY LD IY,(DVRTPTR) ;FETCH TABLE BASE ; LD HL,DKOPRET ;PUT RETURN ADDRESS ON STACK PUSH HL ; LD HL,(DVO CALLER JR Z,DKOPLP ; ; ELSE IF ABORT THEN DO WARM BOOT ; CP A,'A' ;IF ABORT THEN RE-BOOT JP Z,0 ; ; ELSE IF IG************************** ; ; SET NO SECTOR TRANSLATION PROCEDURE ; EXIT - HL, DE= ? ; ;********************************** EXIT - A= 0: OK; /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; HDEXEC: ; ; : ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; XPRIM: ; ; SET BANK ADDRESS TO+++++++++++++++++++++++++++++++++++++++++++++ ; FD8EXEC: ; ; CONVERT LOGICAL DRIVE TO PHYSICAL DRIVE ; LD A,(IY + DVRPDEX DE,HL ADD HL,BC LD L,(HL) ; LD H,0 RET ; ; ; CONVERT FROM CP/M'S LOGICAL SECTOR {0..N-1} TO PHYSICAL SECTOR {1.,HL ; ; ENABLE UPLOAD ; LD A,L ;L= 0 LD (IOPB + PB_FLGO),A ; ; DISABLE DOWNLOAD ; LD (IOPB + PB_BCNTO),HL ; ;RXADR) ;FETCH DRIVER ADDRESS PREFETCHED FROM TABLE JP (HL) ; ; DRIVER RETURNS HERE ; DKOPRET: POP IY ; ; IF NO ERRNORE THEN RETURN NO ERROR ; SUB A,'I' ;IF IGNORE THEN RETURN NO ERROR RET Z ; ; ELSE RETURN ERROR TO BDOS ; FDSKER: ****************************************** ; TRNONE: LD DE,0 JR SETTR ;++++++++++++++++++++++++++++++++++++++++++++++++ CONVERT LOGICAL DRIVE TO PHYSICAL DRIVE ; LD A,(IY + DVRPDRV) ;0,1: DRV 0, 2,3: DRV 1 LD (IOPB + PB_DRVO),A ; ; OFFSE THIS BANK FOR NOW ; CALL GETBNK LD E,A ;PRESET IOPB BANK LD (IOPB + PB_DMAXO),A ; ; EXECUTE THE PRIMITIVE IN ROM ;RV) LD (IOPB + PB_DRVO),A ; ; FETCH SECTOR DATA ; LD HL,(IOPB + PB_SECO) PUSH HL ;SAVE FOR XPRIM RESTORE ; ; ; .N} ; NOTRAN: LD HL,1 ADD HL,BC RET SUBTTL DISK SUPPORT ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++ PASS COMMAND TO EXECUTOR ; LD A,PB_LOGC JR DISKOP2 ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ORS THEN RETURN ZF ; RET Z ;IF NO_ERROR THEN RETURN ; ; PRINT ERROR ; CALL GETBNK ;SETUP BANK FOR FUTURE COMPATABILLD HL,0 ;RETURN DPB_PTR = 0 FOR SELECT FUNCTION LD A,-1 ;RETURN -1 TO BDOS OR A,A RET ;****************************++++++++++++++++++++++++++++ ; ; RETURN DRIVE PARAMETER BLOCK ADDR FUNCTION ; EXIT - DE= DPB PTR ; HL= ? ; ;+++++++++++++T LOGICAL ADDRESS WITH LOGICAL DRIVE ; LD A,(BTDRV) ;IF EVEN THEN ADD 0 ELSE ADD 128 RRCA AND A,80H LD E,A ;COMPUTE S LD HL,IOPB ;BANKED COMPATABILITY LD DE,(THIS_BNK) LD A,MF_XIOB ;SET MONITOR FUNCTION # CALL XMROM ;EXECUTE THE FUNCTI EXECUTE THE IOPB ; CALL XPRIM ; ; RESTORE THE MODIFIED SECTOR SO RETRY WILL WORK ; POP HL LD (IOPB + PB_SECO),HL ;0 %+ &, !'- "(. #)/ $*0 THEN RETURN CF OR A,L SCF RET Z ; ; ELSE CP DE,HL ; LD A,E ;ELSE COMPARE HL TO DE SUB A,L LD A,D SBC A,H ;; ; FALL INTO HILOX ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; HILO FUNCTION CHAR != CONTROL-S THEN BREAK ; CALL CONI ;IF CHAR <> CTRL-S THEN BREAK CP A,CTRLS SCF RET NZ ; ; ELSE PAUSE ;  THEN RETURN OK ; CP A,'9' - '0' + 1 CCF RET NC ; ; ELSE IF CHAR < A THEN RETURN ERROR ; SUB A,'A' - '9' - 1 CP ; ; GET CHAR FROM USER ; CALL ECHO P2C: ; ; IF CHAR == SPACE THEN RETURN NC,ZF ; CP A,' ' ;IF CHAR = ' ' THEN R******************************************** REST: ; ; SAVE 8080 REGS FIRST SO WE CAN WORK ; PUSH AF LD A,R ;DO REFREBC A,(HL) JR Z,RS5 ;FOUND 1, RESET IT ; ; NOT FOUND, SKIP TO NEXT RECORD ; INC HL ;SKIP BANK INC HL ;SKIP DATA ; DATA ; ; IF BREAKPOINT ALREADY CLEARED THEN SKIP RESTORE ; LD A,E ;IF LOC = 0:0 THEN SKIP RESTORE OR A,D OR A,C JR ; RETURN RESULTS ; RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; HILOXB RO INCREMENTS HL. IT THEN CHECKS FOR (& DISALLOWS) A ; WRAP-AROUND SITUATION. IF IT OCCURS, THE CARRY BIT WILL BE SET ON RETURN. CALL CONI ;ELSE WAIT FOR NEXT CHAR ; ; RETURN CONTINUE ; OR A,A RET ;++++++++++++++++++++++++++++++++++++++++++++10 ; ; ELSE RETURN CHAR - 7 ; RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ETURN RET Z ; ; IF CHAR == COMMA THEN RETURN NC, ZF ; CP A,',' RET Z ; ; IF CHAR == RETURN THEN RETURN CF, ZF ; SH 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 (RL DEC D JR NZ,RS2 ; ; NO BREAKPOINTS MATCH, ASSUME NOT SET ; INC BC ;BACK UP PTR TO RETURN ADDRESS ; RS5: ; ; DI Z,RS8 ; ; ELSE RESTORE ORIGINAL DATA ; LD A,(HL) ;ELSE RESTORE ORIGINAL INSTR. PUSH HL EX DE,HL ;HL= MEMPTR LD EUTINE BUMPS BC & HL. IT THEN CHECKS FOR (& DISALLOWS) A ; WRAP-AROUND SITUATION. IF IT OCCURS, THE CARRY BIT WILL BE SET ON RET ; IF NO WRAP-AROUND OCCURRED, HL IS COMPARED TO DE & THE FLAGS SET ; ACCORDINGLY. IT ALSO CHECKS FOR A KEYBOARD ABORT. ; ENTR++++++++++++++++++++++++++++++++ ; ; NIBBLE FUNCTION CONVERTS THE ASCII CHARACTERS 0-9 & A-F TO THEIR ; EQUIVALENT HEX VALUE.; PCHK FUNCTION READS A CHARACTER FROM THE CONSOLE, THEN CHECKS IT FOR A ; SPECIAL CHARACTER. IF IT IS NOT A SPECIAL CHARACTER, CP A,CR SCF RET Z ; ; ELSE RETURN NC,NZ ; CCF ;ELSE RETURN NC RET ;***************************************OC),HL ; LD (ELOC),DE LD (CLOC),BC ; ; FETCH RETURN ADDRESS FROM PGM STACK ; POP BC ; ; SAVE SP AT BREAKPOINT ;SPLAY BREAKPOINT INDICATOR ; PUSH BC LD C,'*' ;OUTPUT BREAK INDICATION CALL CONOUT ; ; STORE PC ; POP DE LD (PL,C ;E= BANK LD C,A ;C= DATA CALL PUTMEM POP HL ; ; NEXT BREAKPOINT ; RS8: INC HL ;DO NEXT BP DJNZ RS7 ; ; SURN. ; IF NO WRAP-AROUND OCCURRED, HL IS COMPARED TO DE & THE FLAGS SET ; ACCORDINGLY. IT ALSO TESTS FOR A KEYBOARD ABORT. ; Y- HL = PTR ; DE = LAST PTR ; EXIT - HL = HL + 1 ; CF = (HL == 0) OR (HL > DE) OR (CONSOLE ABORT) ; A= ? ; ;+++++++++++ IF THE CHARACTER IS NOT IN RANGE, THE CARRY BIT IS ; SET TO FLAG THE ERR. ; ENTRY- A= ASCII-HEX CHAR ; EXIT - A= BINARY VALU A NON-ZERO CONDITION ; IS RETURNED. IF IT IS A SPECIAL CHARACTER, A ZERO CONDITION IS RETURNED. ; FURTHER, IF THE CHARACTER I************************************* ; ; REST ROUTINE TRAPS ALL OF THE REGISTER CONTENTS WHENEVER A BREAKPOINT ; RESTART INS LD (SLOC),SP ; ; BACK UP RETURN ADDRESS TO POINT TO RESTART INSTRUCTION ; DEC BC ; ; SET UP LOCAL STACK ; LD SPOC),DE LD A,(THIS_BNK) LD (BNKLOC),A ; ; DISPLAY BREAK ADDRESS ; EX DE,HL ;HL= ADDR LD E,A ;E= BANK CALL LADR AVE THE Z80 UNIQUES ; EX AF,AF' EXX LD (LPLOC),HL LD (EPLOC),DE LD (CPLOC),BC PUSH AF POP HL LD (FPLOC),HL LDENTRY- HL = PTR ; DE = LAST PTR ; EXIT - HL = HL + 1 ; BC = BC + 1 ; CF = (HL == 0) OR (HL > DE) OR (CONSOLE ABORT) ; A+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ HILOX: ; ; BUMP & TEST HL ; CALL HILO RET C ;DONE IE OF 'CHAR' ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ NIBBLE: ; ; IF CHAR < 0 THEN S A CR, THE CARRY FLAG IS SET. A BLANK OR A ; COMMA RESETS THE CARRY FLAG. ; EXIT - A= CHAR ; NC, ZF= DELIMITER (' ' OR ',')TRUCTION IS EXECUTED. THE TRAPPED CONTENTS ARE STORED IN THE ; MONITOR VARIABLE AREA FOR LATER ACCESS AND USE BY THE GOTO & THE,MONSTK ;SET THE MONITOR STACK ; ; SET UP TO RESTORE BREAKPOINT(S) ; LD HL,TLOC ;SET TABLE PTR LD D,NBKPTS ; RS2: LD; ; CLEAR BREAKPOINTS ; RS6: LD HL,TLOC LD B,NBKPTS ; ; TOP OF RESTORATION LOOP ; RS7: LD E,(HL) ;FETCH BREAKPOINT (XLOC),IX LD (YLOC),IY ; ; GOTO MONITOR ; JP WINIT ;RETURN TO MONITOR ;-----------------------------------------= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ HILOXB: ; ; BUMP BC 1ST ; INC BC F CF ; ; NOT DONE, CHECK FOR CONSOLE ABORT ; CALL CONST ;IF NO CONSOLE BREAK THEN OR A,A ; RETURN RET Z ; ; IFRETURN ERROR ; SUB A,'0' RET C ; ; IF CHAR > F THEN RETURN ERROR ; CP A,'G' - '0' CCF RET C ; ; IF CHAR <= 9 ; CF, ZF= CR ; NC. NZ= ANY OTHER ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ PCHK:  EXAMINE ; REGISTERS COMMANDS. ; ; INSERT INTERRUPT DISABLER SOFTWARE AT START OF REST. ; ;******************************** A,C SUB A,(HL) ;SEE IF SOFTWARE TRAP INC HL LD A,B SBC A,(HL) ;MAYBE, TRY REST OF ADDR INC HL LD A,(THIS_BNK) S ADDRESS LD (HL),0 ;CLEAR BREAKPOINT INC HL LD D,(HL) LD (HL),0 INC HL LD C,(HL) LD (HL),0 INC HL ;SET PTR TO ----------------------------------- ; ; 3 TYPES OF ERRORS ARE DETECTED: A RESTART ERROR; AN I/O ASSIGNMENT ; ERROR; & CERTAIN0 %+ &, !'- "(. #)/ $*0 PROGRAM ERRORS (DETERMINED BY PARTICULAR ROUTINE WHERE THE ; ERROR CONDITION WAS ENCOUNTERED) EACH CAUSES A UNIQUE MESSAGE TO --------------------------------- ; ; COMMON ERROR HANDLER ; ENTRY- HL= MESSAGE PTR ; ;------------------------------------T BE TERMINATED BY BIT 7 SET IN THE LAST CHAR OF THE STRING. ; ENTRY- HL= TEXT PTR ; ;***************************************L= ARG1 ; DE= ARG2 ; A, BC= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ EXLF: ; ;LUE ON THE CONSOLE, EITHER AT ; THE START OF A NEW LINE (LADRA) OR AT THE CURRENT CURSOR LOCATION (LADR). ; ENTRY- E:HL= ADDRE******************** HEX1: ; ; SAVE LOW NIBBLE ; PUSH AF ; ; DO HIGH NIBBLE 1ST ; RRCA RRCA RRCA RRCA CALPROCEDURE ; ;**************************************************************************** COLON: LD C,':' JP CO ;*** LADRB: ; ; DISPLAY WORD VALUE ; CALL LADRA ; ; FALL INTO DISPLAY BLANK PROCEDURE ; ;**************************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 ASSI---------------------------------------- COMERR: CALL PRTWD JP WSVEC ;++++++++++++++++++++++++++++++++++++++++++++++++++************************************* ; ; 1ST ENTRY STARTS ON A NEW LINE ; PRTWD: CALL CRLF ; ; THIS ENTRY STARTS WHER GET THE ARGS ; CALL EXPR ; ; RETURN THE ARGS ; POP DE POP HL ; ; FOLLOW WITH A NEW LINE ; JP CRLF ;**SS VALUE TO DISPLAY ; ;**************************************************************************** ; ; 1ST ENTRY STARTS OL HEX2 ; ; NOW DO LOW NIBBLE ; POP AF HEX2: CALL CONV JR CO ;***************************************************************************************************************************** ; ; DASH ROUTINE OUTPUTS A '-' TO THE CONSOLE DEVICE************************************************** ; ; DISPLAY A BLANK (SPACE) ON THE SYSTEM CONSOLE PROCEDURE ; ;**********GNMENT. ; ;---------------------------------------------------------------------------- IOER: LD A,IOBYTV ;SET IOBYTE TO DEFA++++++++++++++++++++++++++ ; ; CONI ROUTINE READS THE CONSOLE & STRIPS OFF THE PARITY BIT. ; EXIT - A= CHAR AND 7FH ; ;++++EVER THE CURSOR IS ; PRTWA: ; ; SAVE REGISTER ; PUSH BC ; ; TOP OF PRINTING LOOP ; PRTA: LD C,(HL) ;FETCH CHAR ************************************************************************** ; ; CRLF ROUTINE OUTPUTS A CR-LF ON THE CONSOLE DEVN A NEW LINE ; LADRA: CALL CRLF ; ; ENTRY TO CONTINUE AT CURRENT CURSOR LOCATION ; LADR: ; ; DISPLAY BANK # ; LD ************************ ; ; CONV ROUTINE CONVERTS THE LOW ORDER NIBBLE OF THE ; ACCUMULATOR TO ITS ASCII EQUIVALENT. ; ENT ; ;**************************************************************************** ; ; 1ST ENTRY DISPLAYS DATA BYTE IN A FIR****************************************************************** BLK: ; ; PASS A BLANK TO CO PROCEDURE ; LD C,' ' ; ULT LD (IOBYTE),A LD HL,IOMSG JR COMERR ;----------------------------------------------------------------------------++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ CONI: ; ; GET CHAR FROM CONSOLE ; CALL CI ; ;; 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 ; ; RESTOREICE TO ; START A NEW LINE. ; ;**************************************************************************** CRLF: ; ; SAA,E CALL HEX1 ; CALL COLON ; ; DO HIGH BYTE 1ST ; LD A,H CALL HEX1 ; ; NOW DO LOW BYTE ; LD A,L ; ; FALRY- A= NUMBER (LO NIBBLE) ; EXIT - A= C= ASCII NUMBER ; ;********************************************************************ST ; DASH1: CALL HEX1 ;OUTPUT A AS HEX ; ; THIS ENTRY DISPLAYS ONLY THE DASH ; DASH: LD C,'-' JR CO ;***********; FALLS INTO CO SUBR ; SUBTTL IOBYTE HANDLERS ;*********************************************************************** ; ; UNINITIALIZED RESTART ERROR HANDLER ; ;---------------------------------------------------------------------------- RS MASK OUT BIT 7 ; AND A,7FH ; ; THIS RETURN DOES DOUBLE DUTY AS A STUB ; RTS: RET ;***************************** & RETURN ; POP BC RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXLF FUNCTIVE REG ; PUSH HL ; ; DISPLAY CRLF MESSAGE ; CRLFA: LD HL,CRMSG CALL PRTWA ; ; RESTORE REG & RETURN ; POP HL L INTO BYTE OUTPUT PROCEDURE ; ;**************************************************************************** ; ; DISPLAY******** CONV: AND A,0FH ADD A,90H ;PUT INTO ASCII ZONE DAA ;AH, THE UBIQUITOUS DAA CONVERT ADC A,40H DAA LD C,A ***************************************************************** ; ; PRINT ADDR PROCEDURE DISPLAYS A WORD VALUE FOLLOWED BY A***** ; ; CONSOLE OUTPUT SELECTOR ; ENTRY- (IOBYTE BIT 0..1): 0: CON0, 1: CON1, 2: CON2, 3: CON3 ; C= CHAR ; ;***********TER: PUSH AF PUSH HL LD HL,RSTMSG CALL PRTWD POP HL POP AF JP REST ;-------------------------------------------*********************************************** ; ; PRTWD ROUTINE OUTPUTS AN ASCII STRING ONTO THE CONSOLE. ; THE STRING MUSON READS 2 ARGUMENTS FROM THE SYSTEM CONSOLE AND RETURNS ; WITH THE CONSOLE CURSOR ON THE NEXT LINE. ; ENTRY- B= 2 ; EXIT - HRET ;**************************************************************************** ; ; LADR ROUTINE OUTPUTS THE ADDRESS VA HEX BYTE ON SYSTEM CONSOLE PROCEDURE ; ENTRY- A= BYTE TO DISPLAY ; ;******************************************************** RET ;**************************************************************************** ; ; DISPLAY A COLON ON SYSTEM CONSOLE  SPACE. ; ENTRY- E:HL= WORD VALUE TO DISPLAY ; ;**************************************************************************** ***************************************************************** CO: LD A,(IOBYTE) AND A,3 JP Z,CO0 ;CONSOLE 0 CP A,2 0 %+ &, !'- "(. #)/ $*0 JP M,CO1 ;CONSOLE 1 JP Z,CO2 ;CONSOLE 2 JP CO3 ;CONSOLE 3 ;***************************************************************************************** CI: LD A,(IOBYTE) AND A,3 JP Z,CI0 ;CONSOLE 0 CP A,2 JP M,CI1 ;CONSOLE 1 JP Z,CI2XIT - A= 0: BUSY, FFH: READY ; ;**************************************************************************** LSTAT: LD A,(IOB************************************************ ; ; SERIAL CHANNEL OUTPUT SELECTOR ; ENTRY- (IOBYTE BIT 4..5)= 0: SC0, 10H:  NOT READY TO ACCEPT CHAR THEN WAIT AND A,1 SHL NT_BUSY JR NZ,CO0 ; LD A,C ;OUTPUT CHAR & RETURN OUT (NT_DATA),A RETCI0 ;IOER ;**************************************************************************** ; ; ALTERNATE CONSOLE DEVICE (CON ; TO WORK PROPERLY ; IN A,(PRI_1ST) ;FETCH STATUS CPL AND A,[1 SHL PRI_1BSB] ;TEST BUSY RET Z ; LD A,-1 RET  SI0: EQU IOER SO0: EQU IOER ;**************************************************************************** ; ; SERIAL C******************** ; ; CONSOLE STATUS INPUT SELECTOR ; ENTRY- (IOBYTE BIT 0..1)= 0: CON0, 1: CON1, 2: CON2, 3: CON3 ; EXIT ;CONSOLE 2 JP CI3 ;CONSOLE 3 ;**************************************************************************** ; ; LIST YTE) AND A,0C0H JP Z,LSTAT0 ;PRINTER 0 CP A,80H JP M,LSTAT1 ;PRINTER 1 JP Z,LSTAT2 ;PRINTER 2 LD A,-1 ;CONSOLE (ASSSC1, 20H: SC2, 30H: SC3 ; C= CHAR ; ;**************************************************************************** PUNO: LD  CSTS0: 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 3) ; ;**************************************************************************** CO3: EQU CO0 ;IOER CSTS3: EQU CSTS0 ;IOER ;**************************************************************************** ; ; LIST DEVICE 1 (LST1) ; ;****************HANNEL 1 (SC1) ; ;**************************************************************************** SI1: EQU IOER SO1 EQU IOER  - A= 0: NOT READY, FFH: CHAR READY ; ;**************************************************************************** CSTS: LD DEVICE OUTPUT SELECTOR ; ENTRY- (IOBYTE BIT 6..7)= 0: LST0, 40H: LST1, 80H: LST2, C0H: CON ; C= CHAR ; ;*******************UME READY) RET ;**************************************************************************** ; ; SERIAL CHANNEL INPUT SA,(IOBYTE) AND A,30H JP Z,SO0 ;SERIAL CHANNEL 0 CP A,20H JP M,SO1 ;SERIAL CHANNEL 1 JP Z,SO2 ;SERIAL CHANNEL 2 JPRET ;**************************************************************************** ; ; ALTERNATE CONSOLE DEVICE (CON1)  CI3: EQU CI0 ;IOER ;**************************************************************************** ; ; LIST DEVICE 1 (LST************************************************************ LO1: EQU IOER LSTAT1: EQU IOER ;**************************** ;**************************************************************************** ; ; SERIAL CHANNEL 2 (SC1) ; ;*************A,(IOBYTE) AND A,3 JP Z,CSTS0 ;CONSOLE 0 CP A,2 JP M,CSTS1 ;CONSOLE 1 JP Z,CSTS2 ;CONSOLE 2 JP CSTS3 ;CONSOLE 3 ********************************************************* LO: LD A,(IOBYTE) AND A,0C0H JP Z,LO0 ;PRINTER 0 CP A,80H JPELECTOR ; ENTRY- (IOBYTE BIT 2..3)= 0: SC0, 4: SC1, 8: SC2, 0CH: SC3 ; EXIT - A= CHAR AND 7FH (CTRL-Z: EOF) ; ;************* SO3 ;SERIAL CHANNEL 3 SUBTTL PRIMITIVE I/O DRIVERS ;*********************************************************************; ;**************************************************************************** CI1: EQU CI0 CO1: EQU CO0 CSTS1: EQU CSTS0 1) ; ;**************************************************************************** LO0: CALL LSTAT0 ;WAIT FOR BUSY=FALSE************************************************ ; ; LIST DEVICE 2 (LST2) ; ;************************************************************************************************************** SI2 EQU IOER SO2 EQU IOER ;****************************** ;**************************************************************************** ; ; CONSOLE INPUT SELECTOR ; ENTRY- (IOBYT M,LO1 ;PRINTER 1 JP Z,LO2 ;PRINTER 2 JP CO ;CONSOLE ;***************************************************************************************************************************** RI: LD A,(IOBYTE) AND A,0CH JP Z,SI0 ;SERIAL CHANNEL 0 C******* ; ; PRIMARY CONSOLE DEVICE (CON0) ; ;**************************************************************************** C ;**************************************************************************** ; ; ALTERNATE CONSOLE DEVICE (CON2) ; ;*** 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***************************** LO2: EQU IOER LSTAT2: EQU IOER ;********************************************************************************************************* ; ; SERIAL CHANNEL 3 (SC1) ; ;***********************************************E BIT 0..1)= 0: CON0, 1: CON1, 2: CON2, 3: CON3 ; EXIT - A= CHAR (CTRL-Z: EOF) ; ;********************************************************* ; ; LIST DEVICE STATUS INPUT SELECTOR ; ENTRY- (IOBYTE BIT 6..7)= 0: LST0, 40H: LST1, 80H: LST2, C0H: CON ; EP A,8 JP M,SI1 ;SERIAL CHANNEL 1 JP Z,SI2 ;SERIAL CHANNEL 2 JP SI3 ;SERIAL CHANNEL 3 ;****************************I0: CALL CSTS0 ;IF CHAR NOT READY THEN WAIT JR Z,CI0 ; IN A,(NT_DATA) ;ELSE RETURN CHAR RET CO0: IN A,(NT_STAT) ;IF************************************************************************* CO2: EQU CO0 ;IOER CSTS2: EQU CSTS0 ;IOER CI2: EQU  A,0BFH OUT (PRI_2CNT),A ;CLEAR STROBE RET LSTAT0: LD A,0BFH ;THIS PRINTER NEEDS STB=F FOR BUSY OUT (PRI_2CNT),A***************** ; ; SERIAL CHANNEL 0 (SC0) ; ;********************************************************************************************************* SI3: EQU IOER SO3: EQU IOER SUBTTL MESSAGES CRMSG: DM CR,LF RSTMSG: DM 'RST ERR ' BOOTE0 %+ &, !'- "(. #)/ $*0M: DM 'BOOT LOAD ERR',CR,LF IOMSG: DM 'I/O ERR ' QMSG: DM LF,'^??' LOGMSG: DB '65K BANKED ZMON V. ' PVERS VERSN DM CR,LF PRT ;P DW QPRT ;Q DW QPRT ;R DW SUBS ;S SUBSTITUTE MEMORY DW MTEST ;T TEST MEMORY DW QPRT ;U DW COMP ;V VERI; PRMTB: DB 80H + 'A',APLOC - RLOC DB 'B',BPLOC - RLOC DB 'C',CPLOC - RLOC DB 'D',DPLOC - RLOC DB 'E',EPLOC - RLOC DB INIT ; ROUTINE START AND MUST BE IN THE 1ST SECTOR. THESE 2 WORDS ARE REFERENCED ; BY THE BOOT CODE IN ORDER TO FIND THE LOGINNING ;---------------------------------------------------------------------------- ; ; INIT - COLD START ENTRY FRO########################### ; MSGSO: DB CR,LF DB CPMSZ / (KBYTE * 10) + '0' DB (CPMSZ MOD (KBYTE * 10)) / KBYTE + '0' DBM 2 ; ; ENABLE INTERRUPT VECTOR 7 ; IN A,(M2_IMASK) AND A,7FH OUT (M2_IMASK),A ; ; FINALLY ENABLE VECTORED INTERRD BC,0 ;SET TRACK TO 0 CALL SETTRK ; CALL DISKRD JR NZ,WEROR ; ; CHECK FOR VALID BOOT DIRECTORY ; LD A,(DEFBFR)  SUBTTL DATA CONSTANTS ;############################################################################ ; ; TBL CONTAINS THE FY (COMPARE) MEMORY DW QPRT ;W DW XMNE ;X EXAMINE & CHANGE REGISTERS DW QPRT ;Y DW QPRT ;Z ;------------------ 'F',FPLOC - RLOC DB 'H',HPLOC - RLOC DB 'L',LPLOC - RLOC DB 'M' + 80H,[HPLOC - RLOC] + 0C0H DB 'X',[XLOC - RLOC + 1 ] +AD ADDRESS FOR THE BIOS & IT'S ; LENGTH. ; ;############################################################################ ; M BOOT MUST SET ALL BIOS PARAMS ; ;---------------------------------------------------------------------------- ; INIT: ;  'K CP/M-80 Vers 2.2',CR,LF DB 'M5b CBIOS Vers ' PVERS VERSN DM CR,LF IF $ > (DIRBF + SECSZ) CONMSG **** WARUPTS ; IN A,(M2_STAT) OR A,M2_IEN OUT (M2_STAT),A EI ENDIF ; IF BOOT = 10H ; TEST ISHA HOST ADAPTER FOR A HU CP A,86H JR C,WEROR ; ; SET UP TO LOAD CCP/BDOS ; LD HL,(DEFBFR + BD_SBDSS) ;PREFETCH BDOS TRK/SECTOR PUSH HL ; LADDRESSES OF THE COMMANDS. ; THE EXECUTIVE USES IT TO LOOK UP THE DESIRED ADDR. ; ;##########################################---------------------------------------------------------- ; ; Z80 REGISTER OFFSET TABLE ; ;-------------------------------- 80H DB 'Y',[YLOC - RLOC + 1 ] + 80H DB 'R',RLOC - RLOC ; ; BANK REGISTER ; DB 80H + 'K',BNKLOC - RLOC DB -1  BIOSSZ: DW BIOSND - BIOS ;BIOS MODULE SIZE IN BYTES BIOSST: DW BIOS ;BIOS MODULE LOAD ADDR FOR SBD ; ; CONTINUE ON WITH I; SET TEMPORARY STACK ; LD SP,DEFBFR ;USE PAGE 0 FOR STACK ; ; INIT DEFAULT DRIVE ; LD A,(DK_BDRV) ;USE DRIVE # PASSNING! COLD INIT CODE BIGGER THAN DIR BUFFER **** ELSE DS DIRBF+SECSZ-$ ;FILL OUT DIRECTORY BUFFER TO 1 SECTOR SIZE ENNG CONDITION AND CLEAR IF TRUE ; IN A,(ISH_STATUS) ;IF HOST ADAPTER BUSY THEN BIT ISH_BSYB,A JR Z,NTHUNG ; LD A,PB_CLRD HL,(DEFBFR + BD_SCCPS) ;FETCH CCP TRK/SECTOR LD C,L LD B,0 CALL SETSEC ; LD C,H CALL SETTRK ; LD BC,CCP CALL S################################## TBL: DW QPRT ;A DW BOOTC ;B BOOT DISK DW QPRT ;C DW DISP ;D DISPLAY MEMORY DW Q-------------------------------------------- ACTBL: DB 80H + 'A',ALOC - RLOC DB 'B',BLOC - RLOC DB 'C',CLOC - RLOC DB 'D'END NIT ; INIT1: JR INIT ;############################################################################ ; ; DIRECTORY SECTORED IN PAGE 0 AND A,3 LD (DEFDRV),A ; ; SEND SYSTEM SIGN-ON ; CLOGO: LD HL,MSGSO CALL EDITOR ; ; MODIFY COLD STARDIF ;---------------------------------------------------------- ; ; WARM REBOOT ENTRY LOADS CCP,BDOS FROM DISK & ; SETS C LD (IOPB + PB_CMDO),A CALL XPRIM ; NTHUNG: ENDIF ; ; LOG ON DRIVE TO INIT TABLES ; LD A,(DK_BDRV) AND A,3 ETDMA ; ; READ CCP/BDOS ; WREAD: CALL DISKRD JR NZ,WEROR ;IF ERROR THEN EXIT ; ; NEXT SECTOR ; LD HL,BTSEC INC PRT ;E DW FILL ;F FILL MEMORY DW GOTO ;G GOTO PGM & SET BREAKPOINTS DW QPRT ;H DW INPT ;I DISPLAY INPUT PORT DATA ,DLOC - RLOC DB 'E',ELOC - RLOC DB 'F',FLOC - RLOC DB 'H',HLOC - RLOC DB 'L',LLOC - RLOC DB 80H + 'M',[HLOC - RLOC] + ITE JP LISTST ;RETURN LIST STATUS JP SECTRN ;TRANSLATE SECTOR JP BIOFUNC ;EXECUTE FUNCTION CALL ;################# BUFFER STARTS HERE AFTER CRUNCHING COLD START ; CODE. THIS BUFFER IS USED BY THE CP/M DIRECTORY CHECK ROUTINES THAT ; CHECKT VECTOR TO WARM START ; LD HL,(BIOS+4) LD (BIOS+1),HL ; ; BOOT CCP & BDOS ; JR WARM ;#########################UP VARIABLES ; ;---------------------------------------------------------- ; WARM: ; ; SET TEMPORARY STACK ; LD SP,DE;MODULO 4 LD C,A LD E,0 CALL SELDSK LD A,L ;IF ERROR THEN ABORT OR A,H JR Z,WEROR ; ; READ BOOT DIRECTORY ; (HL) ; LD DE,(IOPB + PB_BCNTO) ;SECSZ ;DMA := DMA + SECTOR SIZE LD HL,(BTDMA) ADD HL,DE LD (BTDMA),HL ; ; IF NOT IN DW QPRT ;J DW QPRT ;K DW QPRT ;L DW MOVE ;M MOVE MEMORY DW QPRT ;N DW OUPT ;O OUTPUT DATA TO OUTPUT PORT DW Q0C0H DB 'P',[PLOC - RLOC + 1 ] + 80H DB 'S',[SLOC - RLOC + 1 ] + 80H DB 'I',ILOC - RLOC ; ; PRIME Z80 REGISTER OFFSETS ########################################################### ; ; THESE BOOT PARAMS MUST RESIDE AS DEFINED RIGHT BEFORE THE COLD FOR DISK CHANGE. ; ;############################################################################ ; DIRBF: EQU $ ;BUFFER BE################################################### ; ; SIGN-ON MESSAGE ; ;#################################################FBFR ; IF INTRPTS ; SET INTERRUPT VECTOR TABLE BASE ; LD A,HIGH INTABL LD I,A ; ; SET INTERRUPT MODE TO 2 ; I LD BC,DEFBFR ;SET XFER ADDRESS (USE DEFAULT BUFFER) CALL SETDMA ; LD BC,BD_SEC ;SET DIRECTORY SECTOR CALL SETSEC ; LTO BDOS THEN READ NEXT SECTOR ; LD DE,BDOS XOR A,A SBC HL,DE JR C,WREAD ; ; ELSE IF AT BEGINNING OF BDOS THEN SET U0 %+ &, !'- "(. #)/ $*0P NEW TRACK & SECTOR ; JR Z,RDBDOS ; ; ELSE IF NOT AT BIOS THEN READ NEXT SECTOR ; LD DE,BIOS - BDOS SBC HL,DE JP  ; LD HL,BIOFUNC LD (BFUNRSV),A LD (BFUNRSV + 1),HL ; ; SET DEFAULT SECTOR BUFFER ; LD BC,DEFBFR CALL SETDMA ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; READ A DISK SECTOR ; EXIT - A= 0: OK; /0: ERROR ; ;+DOWNLOAD (WRITE DATA) ; LD HL,SECSZ LD (IOPB + PB_BCNTO),HL ; ; PASS WRITE COMMAND ; LD A,PB_WRITC ;SELECT WRITE OP RIVE IS STILL IN C REGISTER LD (DVRTPTR),HL ; ; PREFETCH DRIVER EXECUTION ADDRESS FROM TABLE ; LD E,(HL) ;STORE ADDRESST2O) CP A,-2 ;0: NO ID, -1: JADE ID, -2: EXTENDED ID JR NZ,LGDEF ; ; ELSE XFER ID SECTOR DATA TO TABLES ; CALL TRNOV) IF STHD <> 0 CP A,STHD JR C,LGCKFD ENDIF CP A,NDHD + 1 JR NC,LGCKFD ; ; ELSE USE HARD DISK DEFAULTS ; *************************************************************************** ; SETTRK: LD (BTTRK),BC RET ;************C,WREAD ; ; ELSE DONE READING SYSTEM ; JP WZRPG ; ; ; ELSE SET UP & READ BDOS ; RDBDOS: POP HL ;RESTORE BDOS TRK/ IF INTCPTS ; ; PUT BDOS VECTOR INTO INTERCEPT CODE ; LD HL,(BDOS + 7) LD (BDOSV),HL ; ; NOW PUT INTERCEPT VECTOR+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; DISKRD: ; ; ENABLE UPLOAD (READ DATA) ; X JP DISKOP ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SELECT DRIVE FUNCTION ; LOS INC HL LD D,(HL) INC HL LD (DVRXADR),DE ; ; FETCH FLAGS ; LD C,(HL) ; ; COMPUTE DISK PARAMETER TABLE ADDRESNE ;ASSUME NO TRANSLATION ; ; IF HARD DISK OR DOUBLE DENSITY THEN NO TRANSLATION ; LD A,(DEFBFR + ID_FLGO) AND A,[1 SHCALL TRNONE ; NO XLATE LD HL,HDPBK ; ; XFER DATA TO TABLES ; SEL2: PUSH HL CALL DPBAD ; USE DEFAULT TABLE POP HL**************************************************************** ; ; SET SECTOR ; ENTRY- BC= SECTOR # ; ;******************SECTOR FROM DIRECTORY LD C,L LD B,A ;A STILL CONTAINS 0 CALL SETSEC ; LD C,H CALL SETTRK ; JR WREAD ; ; ; WA INTO BDOS CODE ; LD HL,INTCPT LD (BDOS + 7),HL ; ; INITIALIZE CLOCK VECTORS IF CLOCK INSTALLED ; LD A,MF_CSYN ;TESTOR A,A LD (BTFLG),A ; ; DISABLE DOWNLOAD (WRITE DATA) ; LD (IOPB + PB_BCNTO),A LD (IOPB + PB_BCNTO + 1),A ; ; PASG-ON - SET DISK PARAMETER BLOCK ; ENTRY- C= DRIVE # ; E= 0 IF NEW SELECT ; EXIT - HL= PTR TO DPT OR 0 FOR ERROR ; ;+++++++S ; LD HL,(BTDRV) LD H,0 ADD HL,HL ;DISK # * 16 ADD HL,HL ADD HL,HL ADD HL,HL LD DE,D0DPH ADD HL,DE ; ; IFL DF_DTDB] OR [1 SHL DF_HARDB] ; ; ELSE SET TRANSLATION ; CALL Z,TR8 ; ; XFER DISK DATA TO DPB ; NOX: CALL DPBAD  LD BC,DPBSZ LDIR JR SEL1 ; ; ; USE 8" FLOPPY DEFAULTS ; LGCKFD: CALL TR8 LD HL,SD8PBK JR SEL2 ;******************************************************************** ; SETSEC: LD (BTSEC),BC RET ;*****************************RM BOOT ERROR, OUTPUT MSG & HALT ; WEROR: LD HL,MSGLE ;OUTPUT ERROR MESSAGE CALL EDITOR HALT ; ; ; BOOT OK, INIT PAGE FOR BOARD PRESENT CALL XMROM ; ; IF CLOCK PRESENT THEN TURN ON CLOCK DRIVE ; OR A,A LD A,38H ;COND. JR (ON) JR Z,S READ COMMAND ; LD A,PB_READC ;SELECT READ OP JP DISKOP ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; SELDSK: ; ; ASSUME ERROR ; LD HL,0 ; ; IF U NOT FIRST SELECT OR LOGON INHIBITED THEN RETURN TABLE PTR ; LD A,(LOGRQ) OR A,C CPL AND A,1 RET Z ; ; ELSE LOG O;GET ADDR OF DPB LD HL,DEFBFR + ID_SPTO LD BC,DPBSZ LDIR ; ; XFER DISK PHYSICAL DATA TO TABLE ; LD HL,DEFBFR + ID_F****************************************************************** ; ; HOME DRIVE - TREAT AS SEEK TRK 0 ; EXIT - BC= 0 ; *********************************************** ; ; SET TRANSFER ADDR ; ENTRY- BC= ADDRESS ; EXIT - A= ? ; ;************** 0 ; WZRPG: ; ; INIT BIOS WARM START IN PAGE 0 ; LD A,0C3H LD HL,BIOS + 3 LD (PAGE0),A LD (PAGE0 + 1),HL ; ; CLKON ; ; ELSE TURN OFF CLOCK DRIVE ; LD A,18H ;UNCOND. JR (OFF) (CAUSES JUMP TO ILLEGAL) ; CLKON: LD (INHCLK),A ; ++++++++++++++++ ; ; WRITE A DISK SECTOR ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++NSUPPORTED DRIVE REQUESTED THEN RETURN 0 (ERROR) ; LD A,C CP A,NDRVS RET NC ; ; STORE DRIVE # FOR FUTURE USE ; LD N DRIVE ; LD (DTPTR),HL ;SAVE DRIVE TABLE PTR ; ; ATTEMPT TO READ ID SECTOR ; XOR A,A ;INIT FLAG BYTE UNTIL FIRMWARE LGO ; SEL1: PUSH HL LD HL,(DVRTPTR) LD DE,DVRFLG ADD HL,DE EX DE,HL POP HL LD BC,DVRSIZ - DVRFLG LDIR ; ; RE;**************************************************************************** ; HOME: LD BC,0 ; ; FALL INTO SET TRACK ; ************************************************************** ; SETDMA: LD (BTDMA),BC LD A,(THIS_BNK) LD (BTDMAX),A RETINIT BDOS CALL VECTOR IN PAGE 0 ; LD HL,BDOS + 6 LD (BDOSJV),A LD (BDOSJV + 1),HL ; ; INIT BIOS CALL VECTOR IN PAGE 0 ENDIF ; ; PASS DEFAULT DISK TO CCP ; LD A,(DEFDRV) LD C,A JP CCP SUBTTL BIOS DISK FUNCTION ROUTINES ;++++++++++++++++++++++++++++++++++++ ; DISKWR: ; ; DISABLE UPLOAD (READ DATA) ; LD A,1 SHL PB_INHX LD (BTFLG),A ; ; ENABLE (BTDRV),A ; ; SAVE LOGON REQUEST FLAG ; LD A,E LD (LOGRQ),A ; ; COMPUTE DISK DRIVER TABLE PTR ; CALL RETDVRT ;DREVISED LD (IOPB + PB_ST2O),A ; CALL DISKLOG JP NZ,FDSKER ; ; IF NO ID SECTOR THEN USE DEFAULTS ; LD A,(IOPB + PB_TURN DRIVE TABLE PTR ; LD HL,(DTPTR) XOR A,A RET ; ; ; IF NOT HARD DISK THEN GO DO FLOPPY TEST ; LGDEF: LD A,(BTDR ;**************************************************************************** ; ; SET TRACK # ; ENTRY- BC= TRACK # ; ;* ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SECTOR TRANSLATION FUNCTION ; ENTRY- 0 %+ &, !'- "(. #)/ $*0DE= 0: NO XLATE, ELSE PTR TO XLATE TABLE ; BC= SECTOR # TO XLATE ; EXIT - HL= XLATED SECTOR OR BC + 1 ; BC= UNCHANGED ; A+++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; DISKLOG: ; ; SET DESCRIPTOR SECTOR XFER ADDRESS TO DEFAULT BUF+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; DISKOP: ; ; SET UP IOPB ; LD HL,BTTRK LD DEION ; LD HL,DSKEB CALL EDITOR ; ; GET USER RESPONSE ; CALL CI ;GET USER RESPONSE ; PUSH AF ;SAVE CHAR LD C,A MUST BE PTR TO DTP ; EXIT - DE, HL= ? ; ;**************************************************************************** ; TR8E,10 ;ADD OFFSET OF DPB PTR ADD HL,DE LD E,(HL) ;FETCH DPB PTR INC HL LD D,(HL) RET SUBTTL HARD DISK ROUTINES  PB_SECO),HL ; ; EXECUTE IOPB ; CALL XPRIM ; ; RESTORE SECTOR ; POP HL LD (IOPB + PB_SECO),HL ; ; DONE ; ) OR A,A RET SUBTTL JADE FLOPPY DRIVER ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++, DE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; SECTRN: ; ; IF NO TRANSLATION FER ; LD HL,DEFBFR LD (IOPB + PB_DMAO),HL LD A,(THIS_BNK) LD (IOPB + PB_DMAXO),A ; ; SET DESCRIPTOR SECTOR SECTOR ,IOPB + PB_TRKO LD BC,PB_BCNTO - PB_TRKO LDIR ; DISKOP2: LD (IOPB + PB_CMDO),A ; ; FETCH DRIVER VECTOR & EXECUTE DIS ;ECHO CHAR CALL COC POP AF ; AND A,5FH ;INSURE UPPER CASE ; ; IF RETRY THEN RETURN TO CALLER ; CP A,'R' ;IF RET: TR3740: LD DE,SDTRAN ; SETTR: LD HL,(DTPTR) LD (HL),E INC HL LD (HL),D RET ;********************************** ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; HARD DISK DRIVER FUNCTION ; ENTRY- IY= DRIRET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE IOPB PRIMITIVE ; EXI++++++++ ; ; JADE 8" FLOPPY DISK DRIVER FUNCTION ; ENTRY- IY= DRIVER TABLE PTR ; EXIT - A= 0: OK; /0: ERROR ; ;+++++++++++THEN RETURN SECTOR++ ; LD A,D ;IF TABLE ADDR = 0 THEN NO TRANSLATION OR A,E JP Z,NOTRAN ; ; ELSE CALCULATE NEW SECTOR; LD HL,ID_SECT LD (IOPB + PB_SECO),HL ; ; SET DESCRIPTOR SECTOR TRACK ; LD L,H ;H == 0 FROM LAST OPERATION (HL= 0) K DRIVER ; DKOPLP: PUSH IY ;SAVE IY LD IY,(DVRTPTR) ;FETCH TABLE BASE ; LD HL,DKOPRET ;PUT RETURN ADDRESS ON STACK PRY THEN RETURN TO CALLER JR Z,DKOPLP ; ; ELSE IF ABORT THEN DO WARM BOOT ; CP A,'A' ;IF ABORT THEN RE-BOOT JP Z,0 ;****************************************** ; ; SET NO SECTOR TRANSLATION PROCEDURE ; EXIT - HL, DE= ? ; ;******************VER TABLE PTR ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ;T - A= 0: OK, /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; XPRIM: ; ; SET+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; FD8EXEC: ; ; CONVERT LOGICAL DRIVE TO PHYSICAL DRIVE  FROM TABLE ; EX DE,HL ADD HL,BC LD L,(HL) ; LD H,0 RET ; ; ; CONVERT FROM CP/M'S LOGICAL SECTOR {0..N-1} TO PH LD (IOPB + PB_TRKO),HL ; ; ENABLE UPLOAD ; LD A,L ;L= 0 LD (IOPB + PB_FLGO),A ; ; DISABLE DOWNLOAD ; LD (IOPBUSH HL ; LD HL,(DVRXADR) ;FETCH DRIVER ADDRESS PREFETCHED FROM TABLE JP (HL) ; ; DRIVER RETURNS HERE ; DKOPRET: POP ; ELSE IF IGNORE THEN RETURN NO ERROR ; SUB A,'I' ;IF IGNORE THEN RETURN NO ERROR RET Z ; ; ELSE RETURN ERROR TO B********************************************************** ; TRNONE: LD DE,0 JR SETTR ;++++++++++++++++++++++++++++++++ HDEXEC: ; ; CONVERT LOGICAL DRIVE TO PHYSICAL DRIVE ; LD A,(IY + DVRPDRV) ;0,1: DRV 0, 2,3: DRV 1 LD (IOPB + PB_DRVO) BANK ADDRESS TO THIS BANK FOR NOW ; LD A,(THIS_BNK) LD E,A ;PRESET IOPB BANK LD (IOPB + PB_DMAXO),A ; ; EXECUTE THE; LD A,(IY + DVRPDRV) LD (IOPB + PB_DRVO),A ; ; FETCH SECTOR DATA ; LD HL,(IOPB + PB_SECO) PUSH HL ;SAVE FOR XPRIYSICAL SECTOR {1..N} ; NOTRAN: LD HL,1 ADD HL,BC RET SUBTTL DISK SUPPORT ROUTINES ;+++++++++++++++++++++++++++++ + PB_BCNTO),HL ; ; PASS COMMAND TO EXECUTOR ; LD A,PB_LOGC JR DISKOP2 ;++++++++++++++++++++++++++++++++++++++++++ IY ; ; IF NO ERRORS THEN RETURN ZF ; RET Z ;IF NO_ERROR THEN RETURN ; ; PRINT ERROR ; LD DE,(THIS_BNK) ;SETUP BDOS ; FDSKER: LD HL,0 ;RETURN DPB_PTR = 0 FOR SELECT FUNCTION LD A,-1 ;RETURN -1 TO BDOS OR A,A RET ;************++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN DRIVE PARAMETER BLOCK ADDR FUNCTION ; EXIT - DE= DPB PTR ; HL= ? ;,A ; ; OFFSET LOGICAL ADDRESS WITH LOGICAL DRIVE ; LD A,(BTDRV) ;IF EVEN THEN ADD 0 ELSE ADD 128 RRCA AND A,80H LD  PRIMITIVE IN ROM ; LD HL,IOPB ;BANKED COMPATABILITY LD DE,(THIS_BNK) LD A,MF_XIOB ;SET MONITOR FUNCTION # CALL XMROM M RESTORE ; ; ; EXECUTE THE IOPB ; CALL XPRIM ; ; RESTORE THE MODIFIED SECTOR SO RETRY WILL WORK ; POP HL LD (I+++++++++++++++++++++++++++++++++++++++++++++++ ; ; LOGON DISK FUNCTION ; EXIT - A= 0: OK; /0: ERROR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; COMMON DISK I/O CODE ; ENTRY- A= IOPB COMMAND ; EXIT - A= 0: OK; /0: ERROR ; ;+++++ANK FOR FUTURE COMPATABILITY LD HL,IOPB LD A,MF_DIOB ;USE DISPLAY IOPB DATA FUNCTION CALL XMROM ; ; QUERY USER FOR OPT**************************************************************** ; ; SET 3740 SECTOR TRANSLATION PROCEDURE ; ENTRY- (DTPTR)=  ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; DPBAD: LD HL,(DTPTR) ;FETCH BASE ADDR LD DE,A ;COMPUTE SECTOR LD D,0 LD HL,(IOPB + PB_SECO) ; PUSH HL ;SAVE SECTOR TO RESTORE LATER ; ADD HL,DE LD (IOPB + ;EXECUTE THE FUNCTION ; OR A,A ;FUNCTION ERR? RET NZ ; ; RETURN THE COMMAND RESULTS STATUS ; LD A,(IOPB + PB_STATOOPB + PB_SECO),HL ; ; DONE ; RET SUBTTL BIOS FUNCTION CALLS ;+++++++++++++++++++++++++++++++++++++++++++++++++++++0 %+ &, !'- "(. #)/ $*0+++++++++++++++++++++++ ; ; FUNCTION DISPATCHER ; EXIT - A= -1: ERROR, 0: OK ; ;+++++++++++++++++++++++++++++++++++++++++++################################ ; BFUNTBL: DW RETVERS ;0:RETURN VERSION # DW RETDVRTF ;1:RETURN DISK PHYSICAL CONFIGURAT++++++++++++++++++++++++++++++++++++++ ; ; BIOS CALL ENTRY (E= DRIVE #) ; RETDVRTF: LD C,E ; RETDVRT: LD HL,DVR0 ;SIN THIS BANK PUSH IX ;MAKE HL = IX FOR NOW POP HL ; LD A,MF_XIOB ;MONITOR FUNCTION # (DISK FUNCTION) CALL XMROM ;EXEC************************ ; CRLF: LD C,CR CALL COC LD C,LF JP COC IF INTCPTS SUBTTL ADDITIONAL FUNCTIONS TO SUPPODIFIED, THEN IT IS ALLWAYS FALSE (NOP). ; INHCLK: JR C,ILLEGC ; ; NOW CHECK FOR EXTENDED CALLS ; CP A,8DH ;IF RETURN VAKES CLOCK/CALENDAR WORK. ; EXIT - B= 1 ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; R ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; MONITOR ROM EXECUTER ; ENTRY- A= FUNCTION+++++++++++++++++++++++++++++++++ ; BIOFUNC: ; ; IF FUNCTION # NOT IN TABLE THEN RETURN -1 ; LD A,C CP A,MAXFUNCS LION TABLE PTR DW EXIOPB ;2:EXECUTE THE IOPB MAXFUNCS EQU ($ - BFUNTBL) / 2 ;+++++++++++++++++++++++++++++++++++++++++++TART AT 1ST TABLE ; ; IF DRIVE == 0 THEN ALREADY THERE ; LD A,C OR A,A RET Z ; ; ELSE IF ILLEGAL DRIVE THEN RETURUTE MONITOR FUNCTION ; OR A,A ;FUNCTION ERROR? RET NZ ; ; FETCH & RETURN RESULT STATUS ; LD A,(IX + PB_STATO) OR ORT CDOS PROGRAMS ;*************************************************************************** ; ; SYSTEM CALL INTERCEPT ROUTERSION THEN RETURN IT JR Z,RETCVER ; CP A,90H ;IF NOT CLOCK THEN ERR JR C,ILLEGC ; JR Z,CLKCAL ;IF CALENDAR THEN GET ETCVER: LD B,1 RET SUBTTL CLOCK ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++  # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; XMROM: ; ; SWITCH TO LOCAL (LARGERD A,-1 RET NC ; ; ELSE COMPUTE TABLE ENTRY ; PUSH HL ;SAVE POSSIBLE DATA ; LD HL,BFUNTBL LD A,C ADD A,A ADD A+++++++++++++++++++++++++++++++++ ; ; RETURN BIOS VERSION # ; EXIT - HL= VERSION # IN BINARY {0.00,..655.35} ; ;+++++++++++N ERROR ; CP A,NDRVS JR C,RETDV2 ; OR A,A RET ; ; ; ELSE COMPUTE TABLE PTR ; RETDV2: LD B,C LD DE,DVRSIZ ; A,A ;TEST RESULT FOR RETURN RET SUBTTL NON-DISK PROCEDURES ;*********************************************************INE CHECKS FOR ILLEGAL BDOS CALLS & ; PRINTS MESSAGE IF ILLEGAL. ALSO IMPLEMENTS CDOS CLOCK/CALENDAR ; SYSTEM CALLS FOR ASMBIT ; CP A,92H JR Z,CLKTIM ;IF TIME THEN GET IT ; ; ILLEGAL SYSTEM CALL ; ILLEGC: PUSH BC ;SAVE FUNCTION # ; ; OUT ; ; RETURN CALENDAR FUNCTION 90H ; EXIT - A= DAY ; B= MONTH ; C= YEAR ; L= DAY OF WEEK ; ;+++++++++++++++++++++++++++) STACK ; LD (SPSAV),SP LD SP,LSTACK ; ; EXECUTE THE FUNCTION ; CALL MR_FUN ;EXECUTE MONITOR FUNCTION ; ; RESTO,L LD L,A LD A,0 ADC A,H LD H,A ; ; EXECUTE TABLE ADDRESS ; LD A,(HL) INC HL LD H,(HL) LD L,A ; EX (SP),+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; RETVERS: LD HL,VERSN XOR A,A ;RETURN NO ERROR RET RETDVL: ADD HL,DE DJNZ RETDVL ; ; RETURN NO ERROR ; XOR A,A RET ;+++++++++++++++++++++++++++++++++++++++++++++++******************* ; ; OUTPUT HEX DATA TO CONSOLE SUBR ; ENTRY- A= DATA ; EXIT - A, C= ? ; ;*****************************. ; ;*************************************************************************** INTCPT: LD A,C ;CHECK CALL VALIDITY CP A,PUT WARNING MESSAGE ; LD HL,ISCMSG ;OUTPUT WARNING CALL EDITOR ; ; OUTPUT FUNCTION # ; POP HL LD A,L CALL PRHEX +++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKCAL: LD A,MF_GCAL JR XMROM ;++++++++++++++++++++++++++++++++++RE THE STACK ; LD SP,(SPSAV) RET SUBTTL CHAR I/O ROUTINES ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++HL ;PUT CALLER'S DATA IN HL, FUNCTION ADDR ON RET ; STACK, EXECUTE FUNCTION ADDRESS ON STACK ;######################## ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN DRIVER TABLE PTR FUNCTION ; ENT+++++++++++++++++++++++++++++ ; ; EXECUTE IOPB FUNCTION ; ENTRY- IX= IOPB PTR ; EXIT - A= 0: OK ; ;+++++++++++++++++++++++*********************************************** ; PRHEX: LD C,A LD A,MF_PHXB JP XMROM ;****************************41 ;IF <= 40 THEN OK ; BDOSV EQU $ + 1 JP C,BDOS + 11H ;THIS ADDR MODIFIED BY WARM BOOT RTN ; ; THE FOLLOWING CONDITIONA ; ; OUTPUT NEW LINE ; CALL CRLF ; ; RETURN NULLS ; XOR A,A ;BC = HL = A = 0 LD L,A LD H,A LD C,A LD B,A ++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN TIME FUNCTION 92H ; EXIT - A= SECONDS ; B= MINUTES ; C= HOURS ; ;+++++++++++++++++++ ; ; CONSOLE INPUT ; EXIT - A= CHAR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#################################################### ; ; BIOS FUNCTION TABLE ; ;############################################RY- C= DRIVE # (E FOR FUNCTION CALL) ; EXIT - HL= DRIVER TABLE BASE PTR ; A, C= 0 ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; EXIOPB: ; ; SET UP FOR CALL ; LD DE,(THIS_BNK) ;E= IOPB PTR IS *********************************************** ; ; NEWLINE PROCEDURE ; ;***************************************************L JUMP IS MODIFIED TO AN UNCONDITIONAL JUMP BY ; THE WARM BOOT ROUTINE IF THE CLOCK/CALENDAR BOARD IS NOT PRESENT ; IF NOT M RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CDOS RETURN VERSION FUNCTION ; M++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKTIM: LD A,MF_GTIM JR XMROM ENDIF +++++++++++ ; CI: LD A,MF_CI JR XMROM ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 0 %+ &, !'- "(. #)/ $*0; ; RETURN CONSOLE STATUS ; EXIT - A= 0: NOT READY ; FFH: CHAR READY ; ;+++++++++++++++++++++++++++++++++++++++++++++++************************************ ; ; PUNCH DRIVER ; ENTRY- C= CHAR TO OUTPUT ; ;********************************************** ; ; MESSAGE EDITOR ; ENTRY- HL= TEXT PTR (BIT 7= 1: TERMINATOR) ; EXIT - REGS= ? ; ;******************************R_FUN ; ; GET & ECHO USER INPUT ; LD A,MF_CI CALL MR_FUN ; PUSH AF LD C,A LD A,MF_CO CALL MR_FUN POP AF ; ABLE INTERRUPTS RET ;---------------------------------------------------------------------------- ; ; UNSUPPORTED INTER############################################### ; IOPB: REPT PB_SIZE LIST OFF DB 0 LIST ON ENDM ;################VRHDS DS 1 ;HEADS ; ; DEFINE THE STRUCTURE SIZE ; DVRSIZ DS 0 ENDM ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@BOOT = 10H ALLDRV HDEXEC,4,60H,32,1,32,1,32,1,10H,256,4 ALLDRV HDEXEC,4,60H,32,1,32,1,32,1,10H,256,4 ALLDRV HDEXEC,5,60H,3+++++++++++++++++++++++++++++ ; CNSCK: LD A,MF_CIS JR XMROM ;********************************************************************************************* ; PUNCH: RET ;******************************************************************************************************************* ; EDITOR: LD DE,(THIS_BNK) LD A,MF_PUTS JR XMROM IF INTRPTS SUBTTL; IF OPTION IS CTRL-C THEN WARM BOOT ; CP A,3 ;IF CTRL-C THEN WARM BOOT JP Z,PAGE0 ; ; IF OPTION IS YES THEN WARM BORUPT ; ;---------------------------------------------------------------------------- ; ILLINT: PUSH AF ;SAVE ALL 8080 REG############################################################ ; ; DISK DRIVER TABLES ; ;#####################################@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; MACRO TO DEFINE THE DRIVER TABLE RECORD ; ENTRY- #DADD= DRIVER ADDRESS ; #PD= PHYSICAL DR2,1,32,1,32,1,10H,256,4 ALLDRV HDEXEC,5,60H,32,1,32,1,32,1,10H,256,4 ALLDRV FD8EXEC,0,0,26,0,26,0,26,0,0,77,1 ALLDRV FD8EX******************** ; ; CONSOLE OUTPUT ; ENTRY- C= CHAR TO OUTPUT ; ;************************************************************ ; ; PRINTER DRIVER ; ENTRY- C= CHAR TO OUTPUT ; ;****************************************************************** INTERRUPTS ;---------------------------------------------------------------------------- ; ; USER INTERRUPT ; ;-----------OT ; AND A,5FH ;IGNORE CASE ; CP A,'Y' JP Z,PAGE0 ; ; IF OPTION IS INTERRUPT THEN EXECUTE RESTART 7 ; CP A,'I' S PUSH HL PUSH BC PUSH DE LD HL,ILLIM ;NOTIFY USER OF INT JR IQCONT SUBTTL INITIALIZED DATA ;######################################################### ; STRUCT 0 DVRADD DS 2 ;START ADDRESS OF DISK DRIVER DVRFG DS 1 ;FLAGS (BIT 0= 1: IIVE # ; #FG= DRIVE FLAGS (IDFLGO) ; #S0= TRK 0 SPT ; #Z0= TRK 0 SIZE ; #S1= TRK 1 SPT ; #Z1= TRK 1 SIZE ; #SD= DATA EC,1,0,26,0,26,0,26,0,0,77,1 ENDIF IF BOOT = 3 ALLDRV FD8EXEC,0,0,26,0,26,0,26,0,0,77,1 ALLDRV FD8EXEC,1,0,26,0,26,0*********************** ; COC: LD A,MF_CO JR XMROM ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++********** ; LO: LD A,MF_LO JR XMROM ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ;----------------------------------------------------------------- ; ITRAP: ; ; SAVE REGS FIRST ; PUSH AF PUSH HL PU JR NZ,ITRAP1 ; POP DE POP BC ;RESTORE REGS 1ST POP HL POP AF JP 0038H ; ; ; IF OPTION IS MONITOR THEN EXECUTE ########################################################## ; ; 3740 SECTOR TRANSLATION TABLE ; **** CP/M SINGLE DENSITY **** NHIBIT LOGON) DVRPDRV DS 1 ;PHYSICAL DRIVE ;DVRLDRV DS 1 ;LOGICAL DRIVE {0..N-1} ; ; THE FOLLOWING MAY BE BROUGHT OFF DISKTRKS SPT ; #ZD= DATA TRKS SIZE ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ALLDRV MA,26,0,0,77,1 ALLDRV HDEXEC,4,60H,32,1,32,1,32,1,10H,256,4 ALLDRV HDEXEC,4,60H,32,1,32,1,32,1,10H,256,4 ALLDRV HDEXEC,5,60H+++++++++++ ; ; READER DRIVER - DUMMY ; EXIT - A= CTRL-Z ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; RETURN LIST DEVICE STATUS ; EXIT - A= 0: BUSY, FFH:READY ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++SH BC PUSH DE ; ; SAVE CURRENT ROM & GET MONITOR ROM ; IN A,(M2_RSEL) LD (ROMSAV),A LD A,MR_RNUM OUT (M2_RSEL),A MONITOR BREAKPOINT ; ITRAP1: CP A,'M' JR NZ,ITRAPR ; POP DE POP BC POP HL POP AF JP 0008H ; ; ; ELSE RESTORE ; ;############################################################################ ; SDTRAN: GXLATE 26,6 ;################ DESCRIPTOR OR FROM DEFAULT TABLES ; DVRFLG DS 1 ;DISK FLAGS DVR0SPT DS 1 ;TRK 0 SECTORS PER TRK DVR0SZ DS 1 ;TRK 0 SECTOR SCRO #DADD,#PD,#FG,#S0,#Z0,#S1,#Z1,#SD,#ZD,#DT,#CY,#HD LIST ON DW #DADD DB 0 ;;LOGON INHIBIT FLAG (LOGON ENABLED) DB #PD,32,1,32,1,32,1,10H,256,4 ALLDRV HDEXEC,5,60H,32,1,32,1,32,1,10H,256,4 ENDIF LIST ON ;#############################+++++++++++++ ; READER: LD A,CTRLZ ;FAKE EOF ; ; FALL INTO PUNCH RETURN ; ;****************************************+++++++++++++++ ; LISTST: LD A,MF_LOS JR XMROM ;********************************************************************* ; ; PRINT PROMPT ; LD HL,ITMSG IQCONT: LD A,MF_PUTS CALL MR_FUN ; LD HL,IQMSG ;QUERY USER LD A,MF_PUTS CALL M REGS & RETURN ; ITRAPR: LD A,(ROMSAV) ;RESTORE ROM # OUT (M2_RSEL),A ; POP DE POP BC POP HL POP AF EI ;RE-EN############################################################ ; ; COMMON I/O PARAMETER BLOCK ; ;#############################IZE DVR1SPT DS 1 DVR1SZ DS 1 DVRDSPT DS 1 DVRDSZ DS 1 DVRDTYP DS 1 ;RESERVED FOR DISK TYPE DVRCYLS DS 2 ;DISK CYLINDERS D DB #FG DB #S0,#Z0,#S1,#Z1,#SD,#ZD DB #DT ;;DISK TYPE DW #CY ;;CYLS DB #HD ;;HEADS LIST OFF ENDM DVR0: IF ############################################### ; ; DEFAULT 8" FLOPPY DISK PARAMETER BLOCK ; IBM 3740 SINGLE DENSITY FORMAT  0 %+ &, !'- "(. #)/ $*0; ;############################################################################ ; SD8PBK: DW 26 ;SECTORS PER TRACK DB 3 ;############################## ; HDPBK: DW 128 ;SECTORS PER TRACK (LOGICAL) (SPT) DB 5 ;BLOCK SHIFT FACTOR (BSH) DB 31 ########################################################################### ; ; START ON AN EVEN PAGE BOUNDARY ; IF $ AND######################################################## ; ; DRIVE PARAMETER HEADER AREA ; 1 PER DRIVE ; ;#################ISK CHECKSUMS ARRAY PTR ENDIF DW D#D(DD)ALL ;;DRIVE CLUSTER ALLOCATION BIT MAP PTR LIST OFF ENDM ; ; DEFINE THE DA##################################### ; ; VARIABLES ; ;###################################################################@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; MACRO TO DEFINE THE DRIVE ALLOCATION & CHECKSUMS AREA ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@R BLOCKS ; ;############################################################################ ; STRUCT 0 DPBSPT DS 2 ;SPT- SECTBLOCK SHIFT FACTOR DB 7 ;BLOCK MASK DB 0 ;NULL MASK DW 242 ;DISK SIZE -1 DW 63 ;DIRECTORY MAX DB 11000000B ;ALLOC  ;BLOCK MASK (BLM) DB 1 ;NULL MASK (EXM) DW 1015 ;DISK SIZE (CLUSTERS -1) (DSM) DW 1152 / 2 ;DIRECTORY MAX (DRM)  0FFH DS 100H - ($ AND 0FFH) ENDIF INTABL: REPT 7 ;1ST 7 ARE UNSUPPORTED LIST OFF DW ILLINT LIST ON ENDM ; DW########################################################### ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TA ; DD DL 1 REPT NDRVS LIST OFF ALLDPH 0123456789ABCDEF DD DL DD + 1 LIST ON ENDM ; ; LAST OF INITIALIZED CO######### ; DTPTR: DS 2 ;DRIVE TABLE PTR LOGRQ: DS 1 ;LOG ON REQUEST REG. DVRTPTR DS 2 ;DRIVE DRIVER TABLE BASE ADDRESS PTR @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ALLDAL: MACRO #D LIST ON IF ((DD - 1) >= STHD) AND ((DD - 1) <= NDHD) D#D(DD)ORS/TRACK DPBBSH DS 1 ;BSH- BLOCK SHIFT FACTOR DETERMINED BY CLUSTER SIZE ; 1K= 3, 2K= 4, 4K= 5, 8K= 6, 16K= 7 DPBBLM DS 10 DB 0 ;ALLOC 1 DW 16 ;CHECK SIZE DW 2 ;TRACK OFFSET DB 0 ;PHYSICAL RECORD SHIFT FACTOR DB 0 ;PHYSICAL RECORD MAS DB 0FFH ;ALLOCATION 0 (AL0) DB 10000000B ;ALLOCATION 1 (AL1) DW 0 ;CHECK SIZE (CKS) DW 2 ;TRACK OFFSET (OFF)  ITRAP ;INT 8 IS USER INTERRUPT ENDIF ;############################################################################ ; @@@@@@@@@@@@@ ; ; GENERATE A DISK PARAMETER TABLE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@DE READ FROM DISK ; BIOSND EQU $ SUBTTL UNINITIALIZED DATA AREA ;######################################################## DVRXADR DS 2 ;DRIVE DRIVER EXECUTION ADDRESS SECOFF DS 2 ;LOGICAL DRIVE SECTOR OFFSET (ADD TO SECTOR) ; ROMSAV EQU 0048H ;DSALL: DS 127 ;ALLOCATION BIT MAP FOR 8" HARD DRIVE #D(DD) ENDIF IF ((DD - 1) >= ST8FD) AND ((DD - 1) <= ND8FD) D#D(DD)AL ;BLM- BLOCK MASK ; 1K = 7, 2K= 15, 4K= 31, 8K= 63, 16K= 127 DPBEXM DS 1 ;EXM- EXTENT MASK ; DSM < 256 : 1K= 0, 2K= 1, K ; DW 0 ;SECTOR OFFSET (FOR LOGICAL DRIVE) ; ; DEFAULT DISK PHYSICAL PARAMETERS ; DB 0 ;FLAGS DB 26,0,26,0,26,0 ;SE DB 1 ;PHYSICAL RECORD SHIFT FACTOR (PSH) DB 1 ;PHYSICAL RECORD MASK (PRM) ; DW 0 ;SECTOR OFFSET (FOR LOGICAL DRIVE) ;  ; MESSAGES ; ;############################################################################ ; MSGLE: DM CR,LF,'LOAD ERROR'@@@@@@@@@@@ ; ALLDPH: MACRO #D LIST ON D#D(DD)DPH: ;DRIVE PARAMETER HEADER FOR DRIVE #D(DD) DW 0 ;;SECTOR TRAN TBL (OR#################### ; ; THE FOLLOWING DATA MUST RESIDE IN THIS ORDER TO MATCH THE IOPB DATA ; ;########################## 1 ;ROM SWAP SAVE OF ORIGINAL ROM SPSAV DS 2 ;USER SP SAVE WHILE USING LOCAL STACK DS 64 ;LOCAL STACK (32 ENTRIES) LSTACK EQL: DS 57 ;ALLOCATION BIT MAP FOR 8" DRIVE #D(DD) D#D(DD)CHK DS 32 ;DIRECTORY CHECKSUMS STORAGE (1 BYTE PER SECTOR) ENDIF4K= 3, 8K= 7, 16K= 15 ; DSM > 255 : 2K= 0, 4K= 1, 8K= 3, 16K= 7 DPBDSM DS 2 ;DSM- DRIVE STORAGE SIZE (IN CLUSTERS) ; INTCTORS PER TRACK, SECTOR SIZE (128) DB 0 ;TYPE DW 77 ;CYLS DB 1 ;HEADS ;###########################################; ; DB 01100000B ;FLAGS 256 BPS, HARD, SSSD DB 32,1,32,1,32,1 ;32 SPT, 256 BPS DB 10H ;TYPE DW 256 ;CYLS DB 4 ;HEA ; DSKEB: DM CR,LF,'Abort, Ignore, Retry, (BDOS) - ' ; IF INTCPTS ISCMSG: DM CR,LF,'ILL SYS CALL, #= ' ENDIF IF  0 IF NO XLATE) DW 0 ;;SCRATCH AREA DW 0 ;;" DW 0 ;;" DW DIRBF ;;DIRECTORY BUFFER PTR DW D#D(DD)DPB ;;DRIVE PARAME################################################## ; BTDRV: DS 1 ;DRIVE # BTTRK DS 2 ;TRACK # BTSEC DS 2 ;SECTOR # BTFLG DSU $ ;############################################################################ ; ; DRIVE ALLOCATION AREAS ; ;##### LIST OFF ENDM ; ; RESERVE THE DATA SPACE ; DD DL 1 REPT NDRVS LIST OFF ALLDAL 0123456789ABCDEF DD DL DD + 1 (((#_TRACKS - OFF) * SPT * BYTES PER SECTOR) / CLUSTER SIZE) -1 DPBDRM DS 2 ;DRM- DIRECTORY SIZE -1 DPBAL0 DS 2 ;AL0,1- DIRECT################################# ; ; DEFAULT 8" HARD DISK PARAMETER BLOCK ; ;##############################################DS ;############################################################################ ; ; MODE 2 INTERRUPT VECTOR TABLE ; ;#INTRPTS ITMSG DM CR,LF,'User' ILLIM DM CR,LF,'Ill.' IQMSG DM ' Int. Abort? (Y/N/I/M) - ' ENDIF ;####################TER BLK PTR IF ((DD - 1) <= NDHD) AND ((DD - 1) >= STHD) DW 0 ;;NO CHECKS ON HARD DISK ELSE DW D#D(DD)CHK ;;DRIVE D 1 ;RESERVED FOR FLAGS BTDMA DS 2 ;DMA ADDRESS BTDMAX DS 1 ;DMA EXTENDED ADDRESS ;############################################################################################################## ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@LIST ON ENDM ;############################################################################ ; ; RESERVE DRIVE PARAMETEORY ALLOCATION ; 1 MSB PER DIRECTORY CLUSTER ALLOCATED DPBCKS DS 2 ;CKS- # DIRECTORY SECTORS CHECKED ; (DRM +1) / 4 DP 0 %+ &, !'- "(. #)/ $*0BOFF DS 2 ;OFF- # RESERVED TRACKS (USUALLY 2) ; ; ADDITIONAL CP/M 3.0 DATA (ALSO COULD BE USED BY CP/M 2.2 DEBLOCKING) ; D@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE THE DPB FOR DRIVE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@åanä  negativå checksuí oæ á rangå oæ memorù contents®  Thå generaì forí oæ  thå command is C is the last byte of the block to be displayed. Thå  resultinç displaù dorô  thå command and return to the monitor command entry mode. ŠFill (F) Thå filì commanä allowó yoõ tï filì á bntrù addresó  anä  tï seô uð tï twï breakpointó foò returninç  controì tï  thå monitor®  Wheî thå monitoò encounteró  á  bre thió command¬ however¬ whicè makeó iô  á  powerfuì anä convenienô command®  Yoõ havå thå  optioî  oæ establishinç 0¬ 1¬ oò PBPSH DS 1 ;PSH- PHYSICAL RECORD SHIFT FACTOR BASED ON BYTES/SEC ; 0: 128, 1: 256, 2: 512, 3: 1024 DPBPHM DS 1 ;PHM- PHYSIC@@@@@@@@@@@@@@ ; ALLDPB: MACRO #D LIST ON D#D(DD)DPB: DS DPBSZ ;ALLOCATION FOR DRIVE #D(DD) LIST OFF ENDM ; ; RESEåss> where is the 1st location to checksum, wherå  07700H) OR ($ < 8000H) CONMSG **** BIOS TOO BIG, USE MOVCPM & RE-ADJUST! **** ENDIF END å pppp-nnnn wherå  pppð  ió  thå  positivå checksuí valuå  anä  nnnî  ió  thå negative checksum value (nligneä vertically® Periodó represenô datá foò whicè therå arå nï ASCIÉ equivalents®  Aó thå outpuô filló thå  screen¬ iô  whå  memorù blocë  tï  bå  filled¬  anä  egated pppp). Display (D) Thió  commanä  allowó  yoõ  tï displaù  thå  contentó  oæ  á specified block of memory. Tilì automaticallù scrolì up®  Tï freezå thå display¬  typå á control-Ó  (presó CTRÌ anä Ó keyó together)®  Tï starô iô  again¬ -F12:10AA 10BB 1 filló  thå memorù blocë 1210AAè througè 1210BBè witè thå constanô 1. Goto (G) l form for the G command is G,, is the physical disk drive number. Checksum Memory (C) Checksuí  memorù  displayó thå totaì positivå  he general form for the command is D wherå  wherå wherå  ,- Iæ  yo á Linå Feeä (CTRL-J)®  Yoõ caî continuå  examininç anä changinç memorù byte-by-bytå iî thió  waù aó lonç aó yoõ wish®  Tï mù bytå iî error¬  followeä bù aî 8-biô binarù representatioî oæ thå bitó iî error¬  iî whicè a 1 indicates a bit in error. Fransferring program control to the address in the PC register is -G[CR] tá byte from any input port. The general form of this command is I wherå õ  wisè  tï  leavå  thå  datá  unchanged¬  simplù  enteò  á delimiter® Iæ thå delimiteò ió á spacå oò comma¬ thå monitoò wilì akå iô easieò foò yoõ tï keeð tracë  oæ wherå  yoõ  are¬  oî everù 8-bytå boundarù (thaô is¬  aî  addresó endinç  iî ° oò 8©or example, the display F038 00010000 woulä indicatå thaô biô ´ oæ thå bytå iî memorù locatioî F or -G,, Therå arå twï morå pointó reguardinç breakpointó thaô  oughdress¾ ió thå I/Ï porô addresó iî hex®  Thå monitoò will respond by printing the data byte in binary Display clock/cale setó uð disë controlleò disë formaô tableó needeä tï perforí reaä & write operations. The general form of the command is catå  thå destinatioî addresó withiî thå sourcå block®  Sincå thå blocë  ió moveä  byte-by-byte¬  startinç  witè  thå bytå   wherå   Š wherå  is the sector # of ID sector. Move (M)  blocë thaô  followó  thå destination address. This will be corrected in a future release. Output (O) Thió  generaìexaminå thå contentó oæ á specifiã memorù locatioî anä alteò iô iæ yoõ desire®  Begiî thå S command by entering eò thå  desireä datá  followeä bù á delimiterº  á carriagå returî iæ yoõ wanô  tï terminatå  thå commanä oò á spacå oò commáy for bit failures, enter T wherå ::: á breakpoinô musô bå  useä  iî  placå oæ á valiä CPÕ  instructioî  op-codå  iî  thå program®  Iæ iô ió specifieä iî á operanM DD YY ww wherå hè ió thå timå iî houró (2´ houò format)¬ mí ió thå timå iî minutes¬  só ió thå timå iî seconds¬  MÍ ió t Thå  Í commanä moveó (Copies© á blocë oæ datá tï á specifieä address. The general form of the command is M wherå causeó  thå  CPÕ regå  registeró  arå displayed in the following format A-xx B-xx C-xx D-xx E-xx F-xx H-xx L-xx M-xx P-xxx will display the contents of the register and a prompt: -Xr,Dh- Aó  iî  thå  substitutå memo2733 ; BIOS CALL ENTRY (E= DRIVE #) 2734 ; 2735 RETDVRTF: ED78 4B 2736 L true recalibrate ; on boot in case the head is outside track 0. ; ; 1.4 - 14 FEB 83 ; Make changes for rev C board. ; ; 1. Needs logon. Also ; Also allow boot from 2nd platter. ; code logical physical ; 42 A DRIVE 0 HEAD 0 ; 52 B DRIVE 0 HEADnumbeò  {0:Sun¬ 1:Mon,..6:Sat}®  NOTEº  alì numberó currentlù musô bå entereä  iî hex. Š Verify (V) Yoõ  caî  uså turinç thå executioî oæ thå command¬ thå displaù caî bå frozeî  oò controì returneä tï thå monitoò aó describeä  foò  thå Tesisteò imageó currentlù storeä iî  RAÍ  tï  bå displayeä  foò  examination®  Theså  registeró arå thå  maiî  anä alternatå   x S-xxxx I-xx A'-xx B'-xx C'-xx D'-xx E'-xx F'-xx H'-xx L'-xx M'-xx X-xxxx Y-xxxx R-xx K-xx rù command¬  yoõ havå thå  optioî  oæ changinç  thå  registeò  valuå  (enterinç  thå  desireä  contentó followeä  bù  á  delD C,E 2737 ; 2738 RETDVRT: ED79 219FEE 2739 LD HL,DVR0 ;START AT 1ST TABLE .5 - 23 MAR 83 GRH ; Fix bug in recal routine to account for phase 1 anded with trk00 ; signal from drive. Causes recal to n 2 ; 62 C DRIVE 1 HEAD 0 ; 72 D DRIVE 1 HEAD 2 ; ; 3.0 - 28 JAN 87 GRH ; Change Jade DD boot to resident prom version. hå Ö commanä tï comparå twï blockó oæ  memorù and verify that they are the same. Type V <2nd start address> wherå wherå  or »  á spacå otò commá causeó thå contentó oæ thå  nexô registeò tï bå displayed®  Notå thaô changinç thå contentó oæ thå È  a****** ; ; DISK CONTROLLER BOOTSTRAP DRIVER ; ; FOR M5B WITH ZMON MONITOR. ; *INCLUDE ZBMH122.HDR ;**********************it. Found out that if the Z-80 is ; generating a wait signal, the bus request is never acknowledged! ; Solution is to output t0. ; Drives now assigned the following logical to physical relationship: ; 0..3 = 8" Jade floppy ; 4..7 = 8" ISHA hard disk blocë anä <2nä starô  address¾ ió thå startinç addresó oæ thå blocë tï bå verified®  Shoulä  thå twï blockó match¬ thå monit geô  thå  sectoò  datá from¬  is theù locationó  addresseä bù thå maiî anä alternatå È anä Ì  registeró arå  alsï displayeä (Í anä M')®  Foò bankeä memorù  syst -X'r wherå ò ió á maiî registeò anä 'ò ió aî alternatå register® (Notå thaô iæ yoõ wisnä Ì registeró changeó thå address»  iæ yoõ wisè tï alteò thå contents of the memory location, alter the M register GRH****************************************************** ; ; REVISION STATUS: ; ; 1.0 - 26 FEB 81, Release ; ; 1.1 - Fix bughe RESET bit along with the request thus ; yanking the processor out of it's sleep. ; ; 2.0 - 18 MAR 84 GRH ; Added hard d; 8..B = 5" Jade floppy ; C..F = 8" Micromation Doubler (ISIS) ; 10..13= 3" Jade floppy ; ; 3.01 4 JUN 88 GRH ; Fix bug in ISHAX that prevented the clear controller command from ; working. ; ; 3.02"0 %+ &, !'- "(. #)/ $*0 12 JUN 88 GRH ; Change 'RET'urns in 'H8BOOT' to 'JP ....,DKRET'. Returns caused ; system crashes because ROMs not set up. floppy ; Change ?xxx symbols to x_xx symbols. ; First interim version supporting Monitor function calCURRENT DRIVE & USER BYTE DEFBFR EQU 0080H ;USE CPM DEFAULT BUFFER FOR BIOS SECTOR 1 PROMST EQU 0F800H PROMSIZ EQU 2048 ;SIONTROLLERS BTENTS EQU 86H ;BOOT DIRECTORY VALIDITY CONSTANT ;############################################################T ROMS. ; ENTRY- A= FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; I_STUB: ROM.Z80 SUBTTL INITIALIZATION CODE ;---------------------------------------------------------------------------- ; ; THIS PRTS: ; ; SAVE REGISTER ; PUSH BC ; ; TOP OF PRINTING LOOP ; PRTA: LD C,(HL) ;FETCH CHAR ; RES 7,C ;MAKE SUREF=BC=DE=HL= ? ; ;**************************************************************************** ; BMOVE: XRROM MF_BMOV RET ; ; 3.03 25 JUN 88 GRH ; Modify floppy boot to include new disk format with disk system tracks ; directory like the harls. All Rom ; functions are supported thru the Rom swap address from the Monitor ; Rom. ; ; 3.07 11-25-90 GRH ; Modify ZE OF THIS PROM FOR CODE CHECKING ;============================================================================ ; ;*MACLI################ ; ; PAGE 0 RESERVED AREA ; ;############################################################################ 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  IS THE COLD START INIT CODE ; ;---------------------------------------------------------------------------- ; ROM_INIT: ;  BIT 7 = 0 CALL CO ; LD A,(HL) ;IF BIT 7 = 1 THEN STOP INC HL RLCA JR NC,PRTA ; ; RESTORE & RETURN ; POP BC  ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN BANKED MEMORY BYTE FUNCTION ; d disk has (removed DCM & BLT loader). ; ; 3.04 7 JUL 88 GRH ; Add '?' to all include file names. ; Change boot system traslightly for ZMON Vers. 1.22. ; VERSN EQU 307 ; ;***************************************************************************B ASMBTOOL.MLB ;*INCLUDE MONBOARD.DEF ;*INCLUDE COMIOPB2.DEF ;*INCLUDE JDDCONT.DEF ;*INCLUDE ISHA.DEF ;*INCLUDE DISKS.DEF  ORG 0040H ; ; BOOT VARIABLES ; DK_PROM DS 2 ;PROM # & DRIVE PASSED TO BIOS BIOSLN DS 2 ;BIOS LENGTH SAVE/SECTOR COUNT SP ;BALANCE STACK INC SP RET ;**************************************************************************** ; ; COLD  ; OUTPUT SIGN-ON MESSAGE ; LD HL,LOGMSG ;OUTPUT SIGN-ON CALL PRTS ; RET LOGMSG: DB ' M5b Disk Driver V. ' PVERS  RET ;**************************************************************************** ; ; SETUP BANKS FOR BLOCK MOVE ; ENTRENTRY- E:HL= PTR TO LOCATION OF DATA ; EXIT - A= DATA ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++cks directory references to new format. ; ; 3.05 6 AUG 88 GRH ; Make changes to Jade driver to support new IOPB format. ; * SUBTTL DECLARATIONS ;============================================================================ ; ; CONSTANTS ; ;*INCLUDE ZBMFUNS.DEF ; ;============================================================================ LIST OFF *MACLIB ASMBBIOSNT DS 2 ;BIOS ENTRY SUBTTL EXTERNAL ENTRY POINTS ORG MONROM ; JP CINIT ;COLD START ; ; EXTERNAL FUNCTION ENTINIT ONLY SWITCHES TO RESIDENT ROM ; ;**************************************************************************** ; CINIT: VERSN DM CR,LF SUBTTL LOW MEMORY PROCEDURES ;****************************************************************************Y- C= DESTINATION BANK ; B= SOURCE BANK ; EXIT - AF=BC=DE=HL= ? ; ;********************************************************++++++++ ; GETB: XRROM MF_GMEM RET SUBTTL MONITOR FUNCTION CALL DISPATCHER ;+++++++++++++++++++++++++++++++++++++++ ; 3.06 26 SEP 88 GRH ; Add code for ISHA 5" Hard Disk support. ; 0..3 = 8" Jade floppy ; 4..7 = 8" ISHA hard disk ; 8..B ;============================================================================ FALSE EQU 0 TRUE EQU NOT FALSE ; DEBUG EQU FALTOOL.MLB *INCLUDE MONBOARD.DEF *INCLUDE COMIOPB2.DEF *INCLUDE JDDCONT.DEF *INCLUDE ISHA.DEF *INCLUDE DISKS.DEF *INCLUDE ZBRY DURING INTERRUPT ; DS (MONROM + 6) - $ JP I_STUB ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SET STACK ; LD SP,MONSTK ; ; RESET ROM FUNCTION SHOULD NOT RETURN HERE ; LD HL,[MR_RNUM SHL 8] + 1 ;RESET PU ; ; PRTS ROUTINE OUTPUTS AN ASCII STRING ONTO THE CONSOLE. ; THE STRING MUST BE TERMINATED BY BIT 7 SET IN THE LAST CHAR OF******************** ; BNKSEL: XRROM MF_SBNK RET ;*******************************************************************+++++++++++++++++++++++++++++++++++++ ; ; ENTRY- A= FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= 5" Jade floppy ; C..F = 5" ISHA Hard Disk ; 10..13 = 8" Micromation Doubler (ISIS) ; 14..17= 3" JadeSE ; HNGTMO EQU 10 ;HANGUP TIMOUT SECSIZ EQU 128 ;DISK SECTOR SIZE ; ; SYSTEM LOCATIONS ; LOGINBYTE EQU 0004H ;CP/M MFUNS.DEF LIST ON *INCLUDE ZBMG122.DEF THIS_ROM EQU DK_RNUM ;ROM # OF THIS ROM DSKBNK EQU 0FEH ;BANK # OF FLOPPY DISK C+++++++++++ ; ; EXTERNAL FUNCTION STUB FOR USE DURING AN INTERRUPT WITHOUT THE ; RESIDENT ROM ENABLED. USE IN ALL NON-RESIDENSH HL CALL XROMF ; ; IF RETURNED THEN HALT ; HALT SUBTTL MONITOR BOARD SHADOW ROM SELECTION PROCEDURE *INCLUDE X THE STRING. ; ENTRY- HL= TEXT PTR ; ;**************************************************************************** ; PUTS: ********* ; ; PERFORM BANKED MEMORY BLOCK MOVE ; ENTRY- HL= SOURCE PTR ; DE= DESTINATION PTR ; BC= BYTE COUNT ; EXIT - A++++++++++++++++++ ; FUNCH: CP A,MAXFUNS JR NC,MFUNERR ; ; FUNCTION SEEMS LEGAL, FETCH EXECUTION ADDRESS FROM TABLE ;"0 %+ &, !'- "(. #)/ $*0 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) INOPB ;4: EXECUTE IOPB ; E:HL= PTR TO IOPB ; MAXFUNS EQU ($ - FUNTABL) / 2 SUBTTL MONITOR FUNCTIONS ;++++++++++++++++----------- ; MBOOT: ; ; SAVE PROM # FOR BIOS ; LD A,C AND A,7 LD (DK_PROM),A ; ; EXTRACT DRIVE # FROM ARGUMENT ;---------------------------------------------------------------------------- ; ; ABORT RETURNS CONTROL TO THE MONITOR ROMFUNCTION 2 ; ENTRY- (IOPBPTR)= IOPB PTR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; DLD A,E LD (IOPBPTR + 2),A ; ; FALL INTO DISPLAY ROUTINE ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++,(DDADDR + 1) CALL HTOA LD A,(DDADDR) CALL HTOA ; ; NEW LINE & RETURN ERROR ; CALL CRLF JP DSKERR ;++++++++++++++++++++++++++++++++++++ ; DSKX: ; ; FETCH DRIVE # ; LD HL,(IOPBPTR) INC HL LD A,(HL) ; ; IF JADE 8" FLOPPY C HL LD H,(HL) LD L,A ; ; RESTORE ARGUMENT & PUT EXECUTION ADDRESS ON STACK EX (SP),HL ; ; RETURN TO EXECUTION ADD++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN VERSION FUNCTION #0 ; EXIT - HL= VERSION # (123D = 1. ; REPT 4 ;D4..D11 -> D0..D7 SRL B RR C ENDM ; ; IF DRIVE # > 0FFH THEN ABORT ; LD A,B OR A,A JP NZ,ABORT  WITH ERROR FLAG (CF) SET ; ;---------------------------------------------------------------------------- ; ABORT: SCF ;HAQERR: ; ; RESTORE PTRS ; LD HL,(IOPBPTR) LD DE,(IOPBPTR + 2) ; ; CALCULATE PTR TO STATUS ; LD A,PB_STATO ADD A+++++++++++++++++++ ; ; DISPLAY IOPB DATA FUNCTION ; ENTRY- (IOPBPTR)= IOPB PTR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE IOPB FUNCTION 4 ; ENTRY- E:HL= IOPB PTR ; EXTHEN GO EXECUTE IT ; SUB A,4 JP C,JADE8 ; ; ELSE IF SASI 8" HARD DISK THEN GO EXECUTE IT ; SUB A,4 JP C,ISHAX8 ; RESS ; DKRET: RET ; ; ; FUNCTION ERROR ; MFUNERR: LD A,-1 OR A,A RET ;######################################23) ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; RETVERS: LD HL,VERSN RET ;---; ; SAVE DRIVE # AS LOGIN DRIVE FOR BIOS ; LD A,C LD (LOGINBYTE),A LD (DK_PROM + 1),A ; ; NOW VECTOR TO DISK BOOT VE MONITOR PRINT ERROR MESSAGE JP DKRET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ,L LD L,A LD A,0 ADC A,H LD H,A ; ; FETCH DATA ; CALL GETB ; ; RESTORE PTR ; LD HL,(IOPBPTR) LD DE,(IOPB++++++++++++++++++++++++++++++++++++ ; DBERR: ; ; DISPLAY HEADER ; LD HL,DERM CALL PUTS ; ; DISPLAY IOPB DATA ; IT - IOPB.STATUS= 0: OK, /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; EX_IOPB ; ELSE IF JADE 5" FLOPPY THEN GO EXECUTE IT ; SUB A,4 JP C,JADE5 ; ; ELSE IF SASI 5" THEN GO EXECUTE IT ; SUB A,4###################################### ; ; MONITOR FUNCTION TABLE ; ;#######################################################------------------------------------------------------------------------- ; ; BOOT DISK FUNCTION #1 ; ENTRY- B= DRIVE # ; ROUTINE ; CP A,4 ;IF 8" FLOPPY DISK THEN EXIT JP C,F8BOOT ; CP A,8 ;IF HARD DISK THEN EXIT JP C,H8BOOT ; CP A,0CH ; TEST IOPB STATUS FOR ERROR FUNCTION 2 ; ENTRY- E:HL= IOPB PTR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++PTR + 2) ; ; IF NO ERROR THEN RETURN IT ; OR A,A RET Z ; ; ELSE FALL INTO ERROR OUTPUT ; ;+++++++++++++++++++ LD HL,(IOPBPTR) LD DE,(IOPBPTR + 2) LD B,PB_SIZE ; DBTE1: PUSH DE PUSH HL CALL GETB ; CALL HTOA ; CALL SPACE : ; ; SET IOPB PTR ; LD (IOPBPTR),HL LD A,E LD (IOPBPTR + 2),A ; ; FALL INTO DISK EXECUTER FUNCTION ; ;++++ JP C,ISHAX5 ; ; ELSE FALL INTO SELECT ERROR ; ;********************************************************************##################### ; FUNTABL: DW RETVERS ;0: RETURN ROM VERSION DW MBOOT ;1: BOOT DISK WITH ARGUMENT IN BC DW TST_P0..3 = 8" JADE FLOPPY ; 4..7 = 8" HARD DISK (ISHA) ; 8..B = 5" JADE FLOPPY ; C..F = 5" HARD DISK ; 10..13 = 8" ;IF 5" FLOPPY THEN EXIT JP C,F5BOOT ; CP A,10H ;IF 5" HARD DISK THEN EXIT JP C,H5BOOT ; CP A,14H ;IF MICROMATION T+++++++++++++++++++ ; TST_PB: ; ; SET IOPB PTR ; LD (IOPBPTR),HL LD A,E LD (IOPBPTR + 2),A ; ; FALL INTO LOCAL +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; DISPLAY IOPB DATA FUNCTION 3 ; ENTRY- E:HL= IOPB PTR ; ;+++++;DISPLAY SEPARATOR ; POP HL POP DE INC HL ;NEXT VALUE DJNZ DBTE1 ;IF NOT DONE THEN CONTINUE ; ; DISPLAY PORT # ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE DISK IOPB FUNCTION ; ENTRY- (IOPBPTR******** ; ; ILLEGAL DRIVE REQUESTED ; EXIT - AF= -2 ; (IOPB.PB_STAT)= ILLEGAL COMMAND ERROR ; ;*************************B ;2: TEST IOPB STATUS FOR ERROR ; E:HL= PTR TO IOPB DW DIS_PB ;3: DISPLAY IOPB DATA ; E:HL= PTR TO IOPB DW EX_I MICROMATION (INTEL M2FM) ; 14..17 = 3" JADE FLOPPY ; ;-----------------------------------------------------------------HEN EXIT JP C,M8BOOT ; CP A,18H ;IF 3" FLOPPY THEN EXIT JP C,F3BOOT ; ; FALL INTO ERROR RETURN TO PRINT MESSAGE ; FUNCTION ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; TEST IOPB STATUS FOR ERROR +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; DIS_PB: ; ; SET IOPB PTR ; LD (IOPBPTR),HL  CALL SPACE CALL SPACE ;OUTPUT PORT # LD A,(DDPORT) CALL HTOA ; ; DISPLAY CONTROLLER ADDRESS ; CALL SPACE LD A)= IOPB ADDRESS ; EXIT - AF= 0: NO ERRORS ; ; A,BC,BC',HL,HL',DE= ? ; ;+++++++++++++++++++++++++++++++++++++++++++++++++*************************************************** ; JSELERR: LD (IX + PB_STATO),PB_ILCMD ; ; FALL INTO DISK ERROR ; #0 %+ &, !'- "(. #)/ $*0 ;**************************************************************************** ; ; COMMON ERROR CODE ; EXIT - AF= -2 ; ;TH ON-BOARD PROM. ; THE CODE WILL COMMAND THE CONTROLLER TO READ THE BIOS FROM THE DISK AND ; EXECUTE THE COLD START ENTRYJADEX8R CALL NZ,DBERR JP NZ,DKRET ; ; IF NOT DIRECTORY SECTOR THEN ERROR ; LD A,(DEFBFR) CP A,BTENTS JP C,DKRET UNT != 0 THEN REPEAT DEC (HL) JR NZ,JADRDB IF DEBUG ; ; RETURN TO MONITOR ; OR A,A ;RETURN NO ERROR JP DKRET IVE BACK UP LD B,A ; LD A,(HL) ;SAVE CURRENT DRIVE LD (HL),B ;CHANGE TO LOCAL DRIVE # PUSH AF CALL JADEX ;EXECUTE )= IOPB ADDRESS ; EXIT - AF= 0: NO ERRORS ; A,B,HL,DE= ? ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++DATA AND A,DD_SASW RLCA OR A,HIGH DD_BASE LD H,A LD L,0 LD (DDADDR),HL LD A,(THIS_BNK) LD (DDADDR + 2),A ; ; ROR, SECTOR SIZE TOO BIG ; LD A,C OR A,A JP NZ,JXERR ; ; DOWNLOAD SECTOR DATA TO CONTROLLER ; JDOWN: ; ; OPEN W**************************************************************************** ; DSKERR: LD A,-2 OR A,A RET ;******** IN THE BIOS. ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; F8BOOT: ; ; RESET THE CO; ; ELSE FETCH THE LOCATION FOR THE BIOS ; LD HL,(DEFBFR + BD_SIOSS) LD A,H LD H,0 LD (IOPB + PB_SECO),HL LD L,A  ELSE ; ; EXECUTE THE BIOS COLD START ENTRY BY USING THE RESIDENT ROM ROUTINE ; LD HL,(BIOSNT) PUSH HL XRROM 8 JFUNCTION POP BC ;RESTORE DRIVE # LD HL,(IOPBPTR) INC HL LD (HL),B ; ; DONE ; RET ;++++++++++++++++++++++++++++++++++++++ ; JADEX8: LD C,DD_PRT8 ; ; FALL INTO JADE EXECUTOR ; ;++++++++++++++++++++++++++++++++++++++++++++++++ SETUP IOPB PTR ; LD HL,(IOPBPTR) PUSH IX LD IX,(IOPBPTR) ; ; IF COMMAND == CLEAR THEN EXIT ; LD A,(IX + PB_CMDO) INDOW TO SECTOR BUFFER ; PUSH BC ;SAVE COUNT LD BC,(DDPORT) LD A,DD_MB1 OUT (C),A PUSH HL ;SAVE SRC PTR ; LD B,(******************************************************************** ; ; CONTROLLER NOT SENSED ERROR ; EXIT - AF= -2 ; (IOPNTROLLER ; LD HL,CLRIOPB CALL IIOPB ; LD HL,IOPB LD (IOPBPTR),HL LD A,(THIS_BNK) LD (IOPBPTR + 2),A CALL JADEX8  LD (IOPB + PB_TRKO),HL ; ; READ 1ST BIOS SECTOR INTO BUFFER ; CALL JADEX8R CALL NZ,DBERR JP NZ,DKRET ; ; FETCH BP DKRET ENDIF ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE DISK IOPB+++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE JADE 8" FLOPPY DISK READ IOPB FUNCTION ; ENTRY- (IOPBPTR)++++++++++++++++++++++++++++ ; ; EXECUTE THE JADE FLOPPY DISK IOPB COMMON FUNCTION ; ENTRY- (IOPBPTR)= IOPB ADDRESS ; C= CO CP A,PB_CLRC JP NZ,JNOCLR8 ; ; IF ALL DRIVES THEN HARD RESET ; LD A,(IX + PB_DRVO) INC A JP NZ,JNOCLR8 ; LD A,IX + PB_DMAXO) ;SET BANKS LD C,DSKBNK CALL BNKSEL ; POP HL ;SRC PTR POP BC ;COUNT LD DE,(DDADDR) ;DEST PTR CALL BB.PB_STAT)= CONTROLLER NOT PRESENT ERROR ; ;**************************************************************************** ; J CALL DQERR JP NZ,ABORT ; ; PREPARE IOPB ; LD HL,LOGIOPB CALL IIOPB ; LD A,(LOGINBYTE) ;SET DRIVE LD (IOPB + PIOS LOAD ADDRESS & SIZE PARAMETERS FROM BIOS 1ST SECTOR ; CALL STUPBIOS JP C,DKRET ; ; READ BIOS ; JADRDB: CALL JAD FUNCTION ; ENTRY- (IOPBPTR)= IOPB ADDRESS ; A= DRIVE# -4 ; EXIT - AF= 0: NO ERRORS ; C= CONTROLLER PORT ADDRESS ; A,B,H= IOPB ADDRESS ; EXIT - AF= 0: NO ERRORS ; A,B,HL,DE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++NTROLLER PORT ADDRESS ; EXIT - AF= 0: NO ERRORS ; A,B,HL,DE= ? ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++DD_BGN JR JDOCMD ; ; ; FETCH SOURCE ADDRESS FROM IOPB ; JNOCLR8: LD L,(IX + PB_DMAO) LD H,(IX + PB_DMAO + 1) ; ; MOVE ; ; EXECUTE THE COMMAND ; JEX: ; ; OPEN WINDOW TO COMMAND BUFFER ; LD BC,(DDPORT) ;FETCH PORT # LD A,DD_MB0 CNP: LD (IX + PB_STATO),PB_CNP JR DSKERR SUBTTL JADE 5" & 8" FLOPPY CONTROLLER DRIVER ;++++++++++++++++++++++++++++++B_DRVO),A ; LD A,ID_SECT ;SET SECTOR LD (IOPB + PB_SECO),A ; ; LOG ON DRIVE ; CALL JADEX8R CALL NZ,DBERR JP NZ,EX8R CALL NZ,DBERR JP NZ,DKRET ; LD HL,(IOPB + PB_SECO) ;NEXT SECTOR INC HL LD (IOPB + PB_SECO),HL ; LD HL,(IOPB L,DE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; JADE 5" ENTRY ; JADE5: LD ++++++++++++ ; JADEX8R: LD HL,0 LD (IOPB + PB_BCNTO),HL ; ; FALL INTO LOCAL READ FUNCTION ; ;++++++++++++++++++++++++++++++++++++++ ; JADEX: ; ; SAVE PORT # ; LD A,C LD (DDPORT),A ; ; CHECK FOR CONTROLLER PRESENT ; IN A,(C FETCH COUNT ; LD C,(IX + PB_BCNTO) LD B,(IX + PB_BCNTO + 1) ; ; IF COUNT == 0 THEN NO DOWNLOAD ; LD A,C OR A,B ;OPEN WINDOW TO COMMAND BUFFER (BANK 0) OUT (C),A ; ; XFER THE IOPB TO THE CONTROLLER ; LD A,(IOPBPTR + 2) ;SET SRC BAN++++++++++++++++++++++++++++++++++++++++++++++ ; ; 8" JADE FLOPPY BOOT ; THIS ROUTINE NOW ACCESSES THE NEW JADE CONTROLLER WIDKRET ; ; READ THE DIRECTORY SECTOR ; LD A,BD_SEC LD (IOPB + PB_SECO),A LD A,PB_READC LD (IOPB + PB_CMDO),A CALL + PB_DMAO) ;BUMP LOAD ADDRESS LD DE,(IOPB + PB_BCNTO) ;SECSIZ ADD HL,DE LD (IOPB + PB_DMAO),HL ; LD HL,BIOSLN ;IF --COC,DD_PRT5 JP JADEC ; ; ; JADE 8" ENTRY ; JADE8: LD C,DD_PRT8 ; ; COMMON INITIAL CODE ; JADEC: ADD A,4 ;BIAS DR+++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE JADE 8" FLOPPY DISK IOPB FUNCTION ; ENTRY- (IOPBPTR) INC A ;0FFH IF NOT THERE JP Z,JCNP ; ; COMPUTE JADE CONTROLLER BASE ADDRESS ; DEC A ;FETCH ADDRESS SELECT SWITCH  JR Z,JEX ; ; ELSE IF COUNT < 1024 THEN DOWNLOAD DATA ; LD A,B CP A,4 JR C,JDOWN ; ; ELSE IF COUNT > 1024 THEN ERK LD B,A LD C,DSKBNK CALL BNKSEL ; LD HL,(DDADDR) ;COMPUTE DEST PTR LD DE,DD_CBO ADD HL,DE EX DE,HL ; LD HL,(I#0 %+ &, !'- "(. #)/ $*0OPBPTR) ;SRC PTR = IOPB ADDRESS ; LD BC,PB_STATO ;ONLY XFER PERTINENT BYTES CALL BMOVE ; ; EXECUTE THE COMMAND ; LD ; LD BC,(DDPORT) LD A,DD_MB0 ;SOFTLY GRAB RESOURCES WITHOUT INTERRUPT OUT (C),A LD A,DD_MB1 ;OPEN WINDOW TO SECTOR BUFFEPB WINDOW ; JDONE: LD A,DD_FREE LD BC,(DDPORT) OUT (C),A ; ; CHECK FOR ERROR ; LD A,(IX + PB_STATO) OR A,A ; E FOR CONTROLLER TO CATCH UP ; EX (SP),HL EX (SP),HL ; ; WAIT FOR TASK COMPLETION FOR A WHILE ; LD L,HNGTMO ;SET UP ORT ;UNSUPPORTED SUBTTL JADE 3" FLOPPY DISK DRIVER ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ SUBTTL ISHA 5" & 8" HARD DISK DRIVER ;**************************************************************************** ; ; (LOGINBYTE) ;COMPUTE & SET DRIVE SUB A,4 ;8" = 4..7 -> 0..3 ; ; COMPUTE LOGICAL DRIVE FOR IOPB ; SRL A ;DRIVE = LOGICLL DQERR JP NZ,DKRET ; ; FETCH DIRECTORY INFO FOR BIOS ; LD HL,(DEFBFR + BD_SIOSS) ;FETCH CBIOS SECTOR FROM DIRECTORY A,DD_EXC ;START COMMAND ; JDOCMD: CALL JWAIT ;WAIT FOR COMPLETION JP NZ,JERET ;IF ERROR THEN RETURN ERROR ; ; COMMAND ER (BANK 1) OUT (C),A ; ; FETCH DESTINATION ADDRESS ; LD E,(IX + PB_DMAO) LD D,(IX + PB_DMAO + 1) ; ; FETCH XFER C; DONE ; POP IX RET ; ; ; SECTOR SIZE TOO BIG ERROR ; JXERR: LD (IX + PB_STATO),PB_BADPB ;PASS BACK ERROR JR JTIMOUT LD DE,0 ; JWAIT1: DEC DE ;IF NOT TIMOUT THEN CONTINUE TO WAIT LD A,E OR A,D JR NZ,JWAIT2 ; DEC L ;IF TIME +++++++ ; ; 3" JADE FLOPPY DISK BOOT ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; F3BHard disk boot function. ; This module reads the BIOS image to the proper system ; address & jumps to the BIOS cold start entrAL_DRIVE / 2 LD (IOPB + PB_DRVO),A ; ; COMPUTE SECTOR FROM LOGICAL DRIVE ; RRA ;IF ODD DRIVE THEN SECTOR += 128 AND; ; SAVE TRACK ; LD E,H ; ; PROCESS SECTOR ; LD H,0 EXX ;ADD IN LOGICAL DRIVE OFFSET LD A,B EXX LD C,A XECUTED, XFER RESULTS FUNCTION ; SELECT COMMAND BLOCK WINDOW ; LD BC,(DDPORT) LD A,DD_MB0 OUT (C),A ; ; XFER IOPB OUNT ; LD C,(IX + PB_BCNTO) LD B,(IX + PB_BCNTO + 1) ; ; IF COUNT == 0 THEN NO UPLOAD ; LD A,C OR A,B JR Z,JDONEDONE ; ; ; RETURN ERROR STATUS EXIT ; ENTRY- A= ERROR CODE ; JERET: LD (IX + PB_STATO),A JR JDONE ;++++++++++++++OUT THEN RETURN TO MONITOR OR A,L JP Z,DSKERR ; JWAIT2: IN A,(C) ;IF NOT DONE THEN WAIT AND A,DD_SHLT JR NZ,JWAIT1 OOT: EQU ABORT ;UNSUPPORTED SUBTTL MICROMATION 8" FLOPPY DISK DRIVER ;+++++++++++++++++++++++++++++++++++++++++++++++++++y point. ; ;**************************************************************************** ; H8BOOT: ; ; INSURE FDC WINDOW A,80H EXX ;SAVE SECTOR OFFSET IN C' FOR LATER USE LD B,A ; EVEN= 0, ODD= 80H (128) ; LD A,1 ;IF ODD, THEN USE PLAT LD B,0 ADD HL,BC LD (IOPB + PB_SECO),HL ; ; PROCESS TRACK ; LD L,E LD H,0 LD (IOPB + PB_TRKO),HL ; CALL ISHAXSTATUS TO HOST ; LD BC,(IOPBPTR + 2) ;SET BANKS LD B,DSKBNK CALL BNKSEL ; LD HL,(DDADDR) LD DE,DD_CBO + PB_BCNTO A ; ; ELSE IF COUNT < 1024 THEN UPLOAD SECTOR DATA ; LD A,B CP A,4 JP C,JXUP ; ; ELSE IF COUNT > 1024 THEN ERROR ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; WAIT ON JADE CONTROLLER BUSY FUNCTION ; ENTRY- A= COMMAND  ; RET ;RETURN ZF IF ($ AND 7FFFH) >= (0FC00H AND 7FFFH) CONMSG *** JADE DEPENDENT CODE OVERLAPS CONTROLLER MAP *** +++++++++++++++++++++++++ ; ; 8" MICROMATION M2FM BOOT ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ REMOVED ; LD BC,0341H XOR A,A H8B1: OUT (C),A INC C DJNZ H8B1 ; ; ISSUE CLEAR CONTROLLER IOPB ; LD HL,CLRIOPB TER 1 ADD A,B LD (IOPB + PB_SECO),A EXX ; ; FORCE HOST ADAPTER LOG-ON ; CALL ISHAX CALL DQERR JP NZ,DKRET ; ; ;LOAD IN CBIOS SECTOR #1 CALL DQERR ;CHECK FOR ERRORS JP NZ,DKRET ; CALL STUPBIOS ;SET UP IOPB FOR BIOS READ JP C,DKDD HL,DE ; EX DE,HL LD HL,(IOPBPTR) LD BC,PB_BCNTO ADD HL,BC EX DE,HL ; LD BC,PB_SIZE - PB_BCNTO ; CALL BMOVE ; LD A,C OR A,A JR NZ,JXERR ; ; UPLOAD SECTOR DATA ; JXUP: PUSH DE ;DEST PTR PUSH BC ;BYTE CNT ; LD C,(IX + PTO OUTPUT ; EXIT - AF= 0: OK, /0: ERROR ; C= PORT # OF CONTROLLER ; DE,HL= ? ; ;+++++++++++++++++++++++++++++++++++++++++ ENDIF SUBTTL JADE 5" FLOPPY DISK DRIVER ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ++++++++++ ; M8BOOT: EQU ABORT ;UNSUPPORTED ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ CALL IIOPB ; LD HL,IOPB LD (IOPBPTR),HL LD A,(THIS_BNK) LD (IOPBPTR + 2),A ; CALL ISHAX ; ; CHECK SELF TEST ST NOW READ THE DIRECTORY SECTOR ; LD (IX + PB_CMDO),PB_READC ; EXX LD A,B EXX LD HL,BD_SEC ;SECTOR = SECTOR + (DRV RET ; HDRDLP: CALL ISHAX CALL DQERR JP NZ,DKRET ; LD HL,(IOPB + PB_SECO) ;NEXT SECTOR INC HL LD (IOPB + PB_SECO),; ; IF UPLOAD INHIBITED THEN SKIP IT ; BIT PB_INHX,(IX + PB_FLGO) JR NZ,JDONE ; ; XFER SECTOR DATA FROM CONTROLLER B_DMAXO) LD B,DSKBNK CALL BNKSEL ; POP BC ;BYTE CNT POP DE ;DEST PTR LD HL,(DDADDR) CALL BMOVE ; ; RELEASE IO+++++++++++++++++++++++++++++++++++ ; JWAIT: ; ; ISSUE PASSED COMMAND ; LD BC,(DDPORT) OUT (C),A ; ; PAUSE A WHIL ; 5" JADE FLOPPY DISK BOOT ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; F5BOOT: EQU AB ; ; MICROMATION DRIVER ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; M2X: EQU DSKERR ATUS ; CALL DQERR ; ; SET UP IOPB IN RAM ; LD HL,LOGIOPB CALL IIOPB ; ; FETCH & OFFSET PHYSICAL DRIVE ; LD A,/ 2) * 128 LD C,A LD B,0 ADD HL,BC LD (IOPB + PB_SECO),HL ; CALL ISHAX ;READ THE DIRECTORY SECTOR (IOPB SET UP) CAHL ; LD HL,(IOPB + PB_DMAO) ;BUMP DMA ADDRESS LD DE,(IOPB + PB_BCNTO) ;SECSIZ ADD HL,DE LD (IOPB + PB_DMAO),HL ; LD $0 %+ &, !'- "(. #)/ $*0A,(BIOSLN) ;IF NOT DONE THEN LOOP DEC A LD (BIOSLN),A JR NZ,HDRDLP IF NOT DEBUG ; ; EXECUTE THE BIOS COLD START ENXX ;SAVE SECTOR OFFSET IN B' FOR LATER USE LD B,A ; ; SET ID SECTOR FOR LOGIN ; LD A,ID_SECT ADD A,B LD (IOPB +D HL,BD_SEC ;SECTOR = SECTOR + (DRV / 2) * 128 LD C,A LD B,0 ADD HL,BC LD (IOPB + PB_SECO),HL ; CALL ISHAX ;READ THEECTOR INC HL LD (IOPB + PB_SECO),HL ; LD HL,(IOPB + PB_DMAO) ;BUMP DMA ADDRESS EXX ;FETCH SECTOR SIZE PUSH HL EXXHL,DE,BC= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; SETBIOPB: ; ; FETCH BIOS L LDIR ; ; SET UP FOR NEXT SECTOR READ ; LD (IOPB + PB_DMAO),DE ;SET UP NEW DMA ADDRESS ; INC (IX + PB_SECO) ;NEXT SECT+++++++++++++ ; ISHAX8: ; ADD A,4 LD B,A LD A,(HL) LD (HL),B PUSH AF CALL ISHAX POP BC LD HL,(IOPBPTR) INC H BC ;SAVE FOR RESTORE DEC BC ;CONVERT TO LOGICAL SECTOR LD (IX + PB_SECO),C LD (IX + PB_SECO + 1),B ; ; PUT IOPB TRY BY USING THE RESIDENT ROM ROUTINE ; LD HL,(BIOSNT) ;BIOS LOADED, GO EXECUTE IT PUSH HL XRROM 8 JP DKRET ELSE  PB_SECO),A EXX ; ; ISSUE CLEAR CONTROLLER IOPB ; LD A,PB_CLRC LD (IOPB + PB_CMDO),A ; LD IX,IOPB CALL ISHAX ;  DIRECTORY SECTOR (IOPB SET UP) CALL DQERR JP NZ,DKRET ; ; FETCH DIRECTORY INFO FOR BIOS ; LD HL,(DEFBFR + BD_SIOSS)  POP DE ADD HL,DE LD (IOPB + PB_DMAO),HL ; LD A,(BIOSLN) ;IF NOT DONE THEN LOOP DEC A LD (BIOSLN),A JR NZ,HDRDLP5OAD PARAMETER OFFSET ; LD HL,(DEFBFR + 1) ; ; IF NOT IN 1ST SECTOR THEN RETURN ERROR ; EXX ;FETCH SECTOR SIZE PUSH OR ; ; COMPUTE SECTOR COUNT FROM LENGTH ; EXX ;FETCH SECTOR SIZE PUSH HL EXX POP DE ; XOR A,A ;COUNT = 0 ; HL LD (HL),B RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; COMMON ISHA DRIVERADDRESS IN BC FOR EASY OUTPUT TO CONTROLLER ; LD BC,(IOPBPTR) ; ; OUTPUT THE IOPB ADDRESS TO HOST ADAPTER ; LD A,C O ;IF DEBUG THEN RETURN NO ERRORS OR A JP DKRET ENDIF FORM ;-------------------------------------------------------- ; CHECK SELF TEST STATUS ; CALL DQERR ; ; FORCE HOST ADAPTER LOG-ON ; LD A,PB_LOGC LD (IOPB + PB_CMDO),A ; CAL;FETCH CBIOS SECTOR FROM DIRECTORY ; ; SAVE TRACK ; LD E,H ; ; PROCESS SECTOR ; LD H,0 EXX ;ADD IN LOGICAL DR ; LD HL,(BIOSNT) ;BIOS LOADED, GO EXECUTE IT IF NOT DEBUG ; ; EXECUTE THE BIOS COLD START ENTRY BY USING THE RESIDENHL EXX POP DE ; LD A,H ;LIMIT TO 1K ([3]FF AND A,3 LD H,A SBC HL,DE CCF RET C ; ; SAVE SECTOR SIZE ; PUS LD HL,(BIOSLN) ;COMPUTE # SECTORS LEN_LP: SBC HL,DE JR C,LEN_OK ; INC A JP LEN_LP ; ; ; SECTOR COUNT IN A ; LEN_ ; ENTRY- (IOPBPTR)= IOPB ADDRESS ; EXIT - AF= 0: NO ERRORS ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++UT (ISH_DATA),A LD A,ISH_SPBL OUT (ISH_CMD),A CALL HWBUSY ; LD A,B OUT (ISH_DATA),A LD A,ISH_SPBH OUT (ISH_CMD),A-------------------- ; ; 5" HARD DISK BOOT ; H5BOOT: ; ; BIAS DOWN DRIVE ; SUB A,8 ;5" = 8..B -> 4..7 ; ; COMPL ISHAX CALL DQERR JP NZ,DKRET ; ; FETCH THE SECTOR SIZE ; LD A,(DEFBFR + ID_SSZ0O) EXX LD HL,128 ; OR A,A HBIVE OFFSET LD A,B EXX LD C,A LD B,0 ADD HL,BC LD (IOPB + PB_SECO),HL ; ; PROCESS TRACK ; LD L,E LD H,0 LDT ROM ROUTINE ; LD HL,(BIOSNT) PUSH HL XRROM 8 JP DKRET ELSE ;IF DEBUG THEN RETURN NO ERRORS OR A JP DKRET H DE ; ; COMPUTE PTR TO PARAMETERS ; LD HL,DEFBFR LD DE,(DEFBFR + 1) LD D,A ADD HL,DE ; ; FETCH LOAD ADDRESS OK: DEC A ;ALREADY HAVE 1ST SECTOR ; ; SAVE COUNT IN LENGTH ; LD (BIOSLN),A ; ; DONE, RETURN NO ERROR ; OR A,A+++++++++++++++ ; ISHAX: ; ; CHECK FOR CONTROLLER PRESENT ; IN A,(ISH_STATUS) INC A JP Z,JCNP ; ; IF CLEAR COMM CALL HWBUSY ; LD A,(THIS_BNK) OUT (ISH_DATA),A LD A,ISH_SPBX OUT (ISH_CMD),A CALL HWBUSY ; ; OUTPUT THE EXECUTUTE LOGICAL DRIVE FOR IOPB ; PUSH AF ;BIAS DRIVE UP ADD A,0CH ;ISHA5 - DRVPRT AND A,0FH LD (IOPB + PB_DRVO),A POP ATSSZ: JR Z,GOTSSZ ; ADD HL,HL DEC A JR HBTSSZ ; ; ; SECTOR SIZE COMPUTED IN HL ; GOTSSZ: EXX ;SAVE IN ALT REG ; (IOPB + PB_TRKO),HL ; CALL ISHAX ;LOAD IN CBIOS SECTOR #1 CALL DQERR ;CHECK FOR ERRORS JP NZ,DKRET ; CALL SETBIOPB  ENDIF ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SETUP IOPB FOR BIOS READ SUBR & SAVE ; DEC HL LD D,(HL) DEC HL LD E,(HL) ; LD (BIOSNT),DE ; ; FETCH BIOS LENGTH & SAVE ; DEC HL LD B,(HL) RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; ISHA 8" DRIVE HARD DISK DRIVER AND THEN DO DIFFERENTLY ; PUSH IX LD IX,(IOPBPTR) ; LD A,(IX + PB_CMDO) CP A,PB_CLRC JR Z,ISHACLR ; ; TEMPORARILE IOPB COMMAND ; LD A,ISH_EXEC OUT (ISH_CMD),A CALL HWBUSY ; ; RESTORE THE IOPB ; POP BC ;SECTOR LD (IX + PB_SF ; ; COMPUTE SECTOR FROM LOGICAL DRIVE ; ADD A,A ;UPPER NIBBLE = HEAD ADD A,A AND A,0C0H ;MASK OFF UNUSED BITS E ; NOW READ THE DIRECTORY SECTOR ; LD (IX + PB_CMDO),PB_READC ; EXX ;FETCH LOGICAL DRIVE HEAD # LD A,B EXX ; L;SET UP IOPB FOR BIOS READ JP C,DKRET ; HDRDLP5: CALL ISHAX CALL DQERR JP NZ,DKRET ; LD HL,(IOPB + PB_SECO) ;NEXT S ; ENTRY- CBIOS SECTOR #1 IN DEFBFR ; HL'= SECTOR BYTE COUNT {128, 256, 512, 1024} ; IX= IOPB PTR ; EXIT - CF= ERROR ; A, DEC HL LD C,(HL) ; LD (BIOSLN),BC ; ; MOVE THIS SECTOR TO PROPER LOCATION ; LD HL,DEFBFR POP BC ;SECTOR SIZE ; ENTRY- (IOPBPTR)= IOPB ADDRESS ; EXIT - AF= 0: NO ERRORS ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Y CONVERT LOGICAL SECTOR TO PHYSICAL SECTOR UNTIL ISHA IS CHANGED ; ISHAC: LD C,(IX + PB_SECO) LD B,(IX + PB_SECO + 1) PUSECO),C LD (IX + PB_SECO + 1),B ; ; RETURN THE ERROR STATUS ; HDONE: LD A,(IX + PB_STATO) OR A,A POP IX RET ; ;$0 %+ &, !'- "(. #)/ $*0 ; CLEAR COMMAND ; ISHACLR: ; ; IF NOT ALL DRIVES THEN EXECUTE NORMALLY ; LD A,(IX + PB_DRVO) INC A JR NZ,ISHAC O),A ;RETURN NO ERRORS FOR NOW JR HDONE ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ESENT ; IN A,(ISH_STATUS) INC A JP Z,JCNP ; ; IF CLEAR COMMAND THEN DO DIFFERENTLY ; PUSH IX LD IX,(IOPBPTR) ; THEN EXECUTE NORMALLY ; LD A,(IX + PB_DRVO) INC A JR NZ,ISHAC5 ; ; ELSE RESET THE CONTROLLER ; JP ISHACC ;***+++++++++++++++++++++++ ; STUPBIOS: ; ; FETCH BIOS LOAD PARAMETER OFFSET FROM LO BYTE OF COLD START JUMP ADDRESS ; LD AOMPUTE SECTOR COUNT FROM LENGTH ; LD HL,(BIOSLN) ;COMPUTE # SECTORS LD DE,(IOPB + PB_BCNTO) ;USE BYTES READ XOR A,A ; B**************** ; ; DISPLAY BYTE ON SYSTEM CONSOLE PROCEDURE ; ENTRY- A= BINARY ; ;**************************************************************************************************** ; ; OUTPUT SPACE TO CONSOLE SUBR ; ;**************************; ; ELSE RESET THE CONTROLLER ; ISHACC: LD A,1 SHL ISH_RESB ;ISSUE CONTROLLER RESET OUT (ISH_CMD),A XOR A,A OUT (I ; ISHA 5" DRIVER ; ENTRY- (IOPBPTR)= IOPB ADDRESS ; EXIT - AF= 0: NO ERRORS ; BC= SECTOR ; ;+++++++++++++++++++++++++++++ LD A,(IX + PB_CMDO) CP A,PB_CLRC JR Z,ISHACLR5 ; ; PUT IOPB ADDRESS IN BC FOR EASY OUTPUT TO CONTROLLER ; ISHAC5: ************************************************************************* ; ; HWBUSY SUBR WAITS UNTIL HOST ADAPTOR GOES NOT BU,(DEFBFR + 1) ; ; IF NOT IN 1ST 128 BYTES THEN RETURN ERROR ; CP A,128 CCF RET C ; ; COMPUTE PTR TO PARAMETERS ;UMP: INC A SBC HL,DE ;KEEP SUBTRACTING UNTIL UNDERFLOW JR Z,NOBUMP JR NC,BUMP ; NOBUMP: ; ; SAVE COUNT IN LENGTH ;************************************* ; HTOA: LD C,A XDROM MF_PHXB ; ; DONE ; RET ;***************************************************************************** ; SPACE: LD C,' ' JR CO SUBTTL INITIALIZED DATA ;#################SH_CMD),A ; CLRWT: IN A,(ISH_STATUS) ;WAIT FOR CONTROLLER READY BIT ISH_BSYB,A JR NZ,CLRWT ; LD HL,0 ;DELAY A WHILE IN+++++++++++++++++++++++++++++++++++++++++++++++ ; ISHAX5: ; ADD A,8 ;BIAS BACK TO 5..7 LD B,A LD A,(HL) LD (HL),B LD BC,(IOPBPTR) ; ; OUTPUT THE IOPB ADDRESS TO HOST ADAPTER ; LD A,C OUT (ISH_DATA),A LD A,ISH_SPBL OUT (ISH_CMD),ASY ; EXIT - A= STATUS ; ZF= TRUE ; ;**************************************************************************** ; HWBUSY LD HL,DEFBFR LD E,A LD D,0 ADD HL,DE ; ; FETCH LOAD ADDRESS & SAVE ; DEC HL LD D,(HL) DEC HL LD E,(HL)  LD (BIOSLN),A ; ; DONE, RETURN NO ERROR ; OR A,A RET ;********************************************************************************************************** ; ; CONSOLE OUTPUT SUBR ; ENTRY- C= CHAR ; EXIT - AF= ? ; ;*************########################################################### ; ; MESSAGES ; ;############################################## CASE ISHA FOOLING WITH STATUS PORT ; ISHA2: DEC HL LD A,H OR A,L JR NZ,ISHA2 ; IN A,(ISH_STATUS) BIT ISH_BSYB,A PUSH AF CALL ISHAX5A POP BC LD HL,(IOPBPTR) LD (HL),B RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++ CALL HWBUSY ; LD A,B OUT (ISH_DATA),A LD A,ISH_SPBH OUT (ISH_CMD),A CALL HWBUSY ; LD A,(THIS_BNK) OUT (ISH_DA: ; ; IF CONTROLLER BUSY THEN WAIT ; IN A,(ISH_STATUS) BIT ISH_BSYB,A JR NZ,HWBUSY ; ; ELSE RETURN ZF ; RET ; LD (BIOSNT),DE ; ; FETCH BIOS LENGTH & SAVE ; DEC HL LD B,(HL) DEC HL LD C,(HL) ; LD (BIOSLN),BC ; ; MOV******************* ; ; INITIALIZE THE IOPB STRUCTURE IN RAM ; ENTRY- HL= IOPB PTR TO INITIALIZE FROM ; EXIT - HL, DE, BC= ?*************************************************************** ; CO: XCROM MF_CO ; ; DONE ; RET ;***************############################## ; DERM: DB CR,LF,'Disk Error! IOPB data:' DB CR,LF DB 'CM DR TL TH SL SH FG AL AH AX CL CH JR NZ,CLRWT ;IF BUSY AGAIN THEN CONTINUE TO WAIT ; ; IF NO ERRORS THEN RETURN 0 ; AND A,(1 SHL ISH_ERRB) OR (1 SHL ISH_FE++++++++++++++++++++++ ; ; ISHA 5" DRIVER CONTINUED ; ENTRY- (IOPBPTR)= IOPB ADDRESS ; EXIT - AF= 0: NO ERRORS ; BC= SECTOTA),A LD A,ISH_SPBX OUT (ISH_CMD),A CALL HWBUSY ; ; OUTPUT THE EXECUTE IOPB COMMAND ; LD A,ISH_EXEC OUT (ISH_CMD) ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; COMMON SETUP IOPB FOR BIOS READ SUBR ; EE THIS SECTOR TO PROPER LOCATION ; LD HL,DEFBFR LD BC,(IOPB + PB_BCNTO) ;USE COUNT ACTUALLY READ LDIR ; ; SET UP FOR  ; ;**************************************************************************** ; IIOPB: ; ; MOVE THE IOPB ; LD DE,I************************************************************* ; ; NEW LINE SUBR ; EXIT - AF, C= ? ; ;********************ST R1 R2 R3 PT CA' DM CR,LF ;############################################################################ ; ; LOGIN IRB) LD (IX + PB_STATO),A JR Z,HDONE ; ; ERROR ENCOUNTERED, RETURN FIRMWARE ERROR ; IN A,(ISH_DATA) LD (IX + PB_STATR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ISHAX5A: ; ; CHECK FOR CONTROLLER PR,A CALL HWBUSY ; ; RETURN THE ERROR STATUS ; JP HDONE ; ; ; CLEAR COMMAND ; ISHACLR5: ; ; IF NOT ALL DRIVES NTRY- CBIOS SECTOR #1 IN DEFBFR ; EXIT - CF= ERROR ; A,HL,DE,BC= ? ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++NEXT SECTOR READ ; LD (IOPB + PB_DMAO),DE ;SET UP NEW DMA ADDRESS ; LD HL,IOPB + PB_SECO ;NEXT SECTOR INC (HL) ; ; COPB LD BC,PB_SIZE LDIR RET SUBTTL ASCII CHAR ROUTINES ;******************************************************************************************************************** ; CRLF: LD C,0DH CALL CO LD C,0AH JR CO ;***************OPB ; ;############################################################################ ; LOGIOPB: DB PB_LOGC ;COMMAND DB 0%0 %+ &, !'- "(. #)/ $*0 ;DRIVE DW 0 ;TRACK DW ID_SECT ;SECTOR DB 0 ;FLAGS DW DEFBFR ;DMA DB 0 ;EXTENDED DMA DW 0 ;XFER COUNT DB 0,LOCATION BIT MAP FOR 8" HARD DRIVE 1 F227 (007F) 4138+ D2ALL: DS 127 ;ALLOCATION BIT MAP FOR 8" HARD DRIVE 2 F2A6 (007F 4191 ; 4192 ;############################################################################ +++++++++++++ ; BIOFUNC: ; ; IF FUNCTION # NOT IN TABLE THEN RETURN -1 ; LD A,C CP A,MAXFUNCS LD A,-1 RET NC ; XIOPB ;2:EXECUTE THE IOPB MAXFUNCS EQU ($ - BFUNTBL) / 2 ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; IF DRIVE == 0 THEN ALREADY THERE ; LD A,C OR A,A RET Z ; ; ELSE IF ILLEGAL DRIVE THEN RETURN ERROR ; CP A,NDCTION ; OR A,A ;FUNCTION ERROR? RET NZ ; ; FETCH & RETURN RESULT STATUS ; LD A,(IX + PB_STATO) OR A,A ;TEST RESU******************************* ; ; NEWLINE PROCEDURE ; ;*******************************************************************0,0,0 ;STATUS ; CLRIOPB: DB PB_CLRC ;COMMAND DB -1 ;DRIVE (-1= HARD RESET) DW 0 ;TRACK DW 0 ;SECTOR DB 1 SHL PB) 4151+ D3ALL: DS 127 ;ALLOCATION BIT MAP FOR 8" HARD DRIVE 3 F325 (0039) 4167+ D4ALL: DS 57 ;ALLOCATION BIT MAP FOR 4193 ; (0000) 4194- STRUCT 0 0000 (0002) 4195- DPBSPT DS 2 ;SPT- SECTORS/TRACK 0002 (0001) ; ELSE COMPUTE TABLE ENTRY ; PUSH HL ;SAVE POSSIBLE DATA ; LD HL,BFUNTBL LD A,C ADD A,A ADD A,L LD L,A LD A,0+++++++++++++ ; ; RETURN BIOS VERSION # ; EXIT - HL= VERSION # IN BINARY {0.00,..655.35} ; ;+++++++++++++++++++++++++++++++RVS JR C,RETDV2 ; OR A,A RET ; ; ; ELSE COMPUTE TABLE PTR ; RETDV2: LD B,C LD DE,DVRSIZ ; RETDVL: ADD HL,DE LT FOR RETURN RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; GET BANK NUMBER FUN******** ; CRLF: LD C,CR CALL COC LD C,LF JP COC IF INTCPTS SUBTTL ADDITIONAL FUNCTIONS TO SUPPORT CDOS PROGRAM_INHX ;FLAGS (INHIBIT READ XFER) DW DEFBFR ;DMA DB 0 ;DMA BANK DW 0 ;XFER COUNT DB 0,0,0,0 ;STATUS, RESULTS I 8" DRIVE 4 F35E (0020) 4168+ D4CHK DS 32 ;DIRECTORY CHECKSUMS STORAGE (1 BYTE PER SECTOR) F37E (0039) 4180+ D5 4196- DPBBSH DS 1 ;BSH- BLOCK SHIFT FACTOR DETERMINED BY CLUSTER SIZE 4197- ; 1K= 3, 2K= 4, 4K= 5, 8K ADC A,H LD H,A ; ; EXECUTE TABLE ADDRESS ; LD A,(HL) INC HL LD H,(HL) LD L,A ; EX (SP),HL ;PUT CALLER'S DA+++++++++++++++++++++++++++++++++++++++++++++ ; RETVERS: LD HL,VERSN XOR A,A ;RETURN NO ERROR RET ;++++++++++++++DJNZ RETDVL ; ; RETURN NO ERROR ; XOR A,A RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++CTION ; EXIT - A= BANK # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; GETBNK: LD A,MS ;*************************************************************************** ; ; SYSTEM CALL INTERCEPT ROUTINE CHECKS FOR IF ($ - PROMST) > PROMSIZ CONMSG **** ERROR! Code Too Large for PROM! **** ENDIF END ALL: DS 57 ;ALLOCATION BIT MAP FOR 8" DRIVE 5 F3B7 (0020) 4181+ D5CHK DS 32 ;DIRECTORY CHECKSUMS STORAGE (1 BYTE PER S= 6, 16K= 7 0003 (0001) 4198- DPBBLM DS 1 ;BLM- BLOCK MASK 4199- ; 1K = 7, 2K= 15, 4K= 31, 8K= 63, TA IN HL, FUNCTION ADDR ON RET ; STACK, EXECUTE FUNCTION ADDRESS ON STACK ;############################################++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN DRIVER TABLE PTR FUNCTION ; ENTRY- C= DRIVE # (E FO+++++++++ ; ; EXECUTE IOPB FUNCTION ; ENTRY- IX= IOPB PTR ; EXIT - A= 0: OK ; ;+++++++++++++++++++++++++++++++++++++++++++F_GBNK JP MR_FUN SUBTTL NON-DISK PROCEDURES ;*************************************************************************LLEGAL BDOS CALLS & ; PRINTS MESSAGE IF ILLEGAL. ALSO IMPLEMENTS CDOS CLOCK/CALENDAR ; SYSTEM CALLS FOR ASMB. ; ;********* 4104 ALLDAL 0123456789ABCDEF 4105 DD DL DD + 1 4106 LIST ON 4107 ECTOR) 4186 4187 4188 ;########################################### ; DONE ; RET SUBTTL BIOS FUNCTION CALLS ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++################################ ; ; BIOS FUNCTION TABLE ; ;################################################################R FUNCTION CALL) ; EXIT - HL= DRIVER TABLE BASE PTR ; A, C= 0 ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; EXIOPB: ; ; SET UP FOR CALL ; CALL GETBNK ;E= IOPB PTR IS IN THIS BANK LD E,A *** ; ; OUTPUT HEX DATA TO CONSOLE SUBR ; ENTRY- A= DATA ; EXIT - A, C= ? ; ;*************************************************************************************************************** INTCPT: LD A,C ;CHECK CALL VALIDITY CP A,41 ;IF <= 40 TH ENDM F129 (007F) 4112+ D0ALL: DS 127 ;ALLOCATION BIT MAP FOR 8" HARD DRIVE 0 F1A8 (007F) 4125+ D1ALL: DS 127 ;AL################################# 4189 ; 4190 ; RESERVE DRIVE PARAMETER BLOCKS +++ ; ; FUNCTION DISPATCHER ; EXIT - A= -1: ERROR, 0: OK ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++############ ; BFUNTBL: DW RETVERS ;0:RETURN VERSION # DW RETDVRTF ;1:RETURN DISK PHYSICAL CONFIGURATION TABLE PTR DW E++++++++++++++++++ ; ; BIOS CALL ENTRY (E= DRIVE #) ; RETDVRTF: LD C,E ; RETDVRT: LD HL,DVR0 ;START AT 1ST TABLE ;PUSH IX ;MAKE HL = IX FOR NOW POP HL ; LD A,MF_XIOB ;MONITOR FUNCTION # (DISK FUNCTION) CALL XMROM ;EXECUTE MONITOR FUN******************************* ; PRHEX: LD C,A LD A,MF_PHXB JP XMROM ;********************************************EN OK ; BDOSV EQU $ + 1 JP C,BDOS + 11H ;THIS ADDR MODIFIED BY WARM BOOT RTN ; ; THE FOLLOWING CONDITIONAL JUMP IS MODIFI%0 %+ &, !'- "(. #)/ $*0ED TO AN UNCONDITIONAL JUMP BY ; THE WARM BOOT ROUTINE IF THE CLOCK/CALENDAR BOARD IS NOT PRESENT ; IF NOT MODIFIED, THEN IT+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CDOS RETURN VERSION FUNCTION ; MAKES CLOCK/CALEN++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKTIM: LD A,MF_GTIM JR XMROM ENDIF ;+++++++++++++CI: LD A,MF_CI JR XMROM ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN CONS READER: LD A,CTRLZ ;FAKE EOF ; ; FALL INTO PUNCH RETURN ; ;******************************************************** ; LISTST: LD A,MF_LOS JR XMROM ;**************************************************************************** ; ; MET PROMPT ; LD HL,ITMSG IQCONT: LD A,MF_PUTS CALL MR_FUN ; LD HL,IQMSG ;QUERY USER LD A,MF_PUTS CALL MR_FUN ; ; RN ; ITRAPR: LD A,(ROMSAV) ;RESTORE ROM # OUT (M2_RSEL),A ; POP DE POP BC POP HL POP AF EI ;RE-ENABLE INTERRU IS ALLWAYS FALSE (NOP). ; INHCLK: JR C,ILLEGC ; ; NOW CHECK FOR EXTENDED CALLS ; CP A,8DH ;IF RETURN VERSION THEN RETUDAR WORK. ; EXIT - B= 1 ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; RETCVER: LD B,1+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; MONITOR ROM EXECUTER ; ENTRY- A= FUNCTION # ; ;++++++++OLE STATUS ; EXIT - A= 0: NOT READY ; FFH: CHAR READY ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++******************** ; ; PUNCH DRIVER ; ENTRY- C= CHAR TO OUTPUT ; ;*******************************************************SSAGE EDITOR ; ENTRY- HL= TEXT PTR (BIT 7= 1: TERMINATOR) ; EXIT - REGS= ? ; ;********************************************** GET & ECHO USER INPUT ; LD A,MF_CI CALL MR_FUN ; PUSH AF LD C,A LD A,MF_CO CALL MR_FUN POP AF ; ; IF OPTIOPTS RET ;---------------------------------------------------------------------------- ; ; UNSUPPORTED INTERRUPT ; ;--RN IT JR Z,RETCVER ; CP A,90H ;IF NOT CLOCK THEN ERR JR C,ILLEGC ; JR Z,CLKCAL ;IF CALENDAR THEN GET IT ; CP A,92H RET SUBTTL CLOCK ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN CAL++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; XMROM: ; ; SWITCH TO LOCAL (LARGER) STACK ; LD +++++++++++++ ; CNSCK: LD A,MF_CIS JR XMROM ;********************************************************************************************* ; PUNCH: RET ;**************************************************************************** ; ; PR****************************** ; EDITOR: CALL GETBNK LD E,A LD A,MF_PUTS JR XMROM IF INTRPTS SUBTTL INTERRUPTS N IS CTRL-C THEN WARM BOOT ; CP A,3 ;IF CTRL-C THEN WARM BOOT JP Z,PAGE0 ; ; IF OPTION IS YES THEN WARM BOOT ; AND -------------------------------------------------------------------------- ; ILLINT: PUSH AF ;SAVE ALL 8080 REGS PUSH HL  JR Z,CLKTIM ;IF TIME THEN GET IT ; ; ILLEGAL SYSTEM CALL ; ILLEGC: PUSH BC ;SAVE FUNCTION # ; ; OUTPUT WARNING MESSENDAR FUNCTION 90H ; EXIT - A= DAY ; B= MONTH ; C= YEAR ; L= DAY OF WEEK ; ;+++++++++++++++++++++++++++++++++++++++++++(SPSAV),SP LD SP,LSTACK ; ; EXECUTE THE FUNCTION ; CALL MR_FUN ;EXECUTE MONITOR FUNCTION ; ; RESTORE THE STACK ; **** ; ; CONSOLE OUTPUT ; ENTRY- C= CHAR TO OUTPUT ; ;*********************************************************************INTER DRIVER ; ENTRY- C= CHAR TO OUTPUT ; ;**************************************************************************** ; L ;---------------------------------------------------------------------------- ; ; USER INTERRUPT ; ;-----------------------A,5FH ;IGNORE CASE ; CP A,'Y' JP Z,PAGE0 ; ; IF OPTION IS INTERRUPT THEN EXECUTE RESTART 7 ; CP A,'I' JR NZ,ITRAP PUSH BC PUSH DE LD HL,ILLIM ;NOTIFY USER OF INT JR IQCONT SUBTTL INITIALIZED DATA ;##############################AGE ; LD HL,ISCMSG ;OUTPUT WARNING CALL EDITOR ; ; OUTPUT FUNCTION # ; POP HL LD A,L CALL PRHEX ; ; OUTPUT N+++++++++++++++++++++++++++++++++ ; CLKCAL: LD A,MF_GCAL JR XMROM ;++++++++++++++++++++++++++++++++++++++++++++++++++ LD SP,(SPSAV) RET SUBTTL CHAR I/O ROUTINES ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++******* ; COC: LD A,MF_CO JR XMROM ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; O: LD A,MF_LO JR XMROM ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN LIST ----------------------------------------------------- ; ITRAP: ; ; SAVE REGS FIRST ; PUSH AF PUSH HL PUSH BC PUSH1 ; POP DE POP BC ;RESTORE REGS 1ST POP HL POP AF JP 0038H ; ; ; IF OPTION IS MONITOR THEN EXECUTE MONITOR BREA############################################## ; ; 3740 SECTOR TRANSLATION TABLE ; **** CP/M SINGLE DENSITY **** ; ;#######EW LINE ; CALL CRLF ; ; RETURN NULLS ; XOR A,A ;BC = HL = A = 0 LD L,A LD H,A LD C,A LD B,A RET ;+++++++++++++++++++++++++++++++ ; ; RETURN TIME FUNCTION 92H ; EXIT - A= SECONDS ; B= MINUTES ; C= HOURS ; ;+++++++++++++++++++ ; ; CONSOLE INPUT ; EXIT - A= CHAR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; READER DRIVER - DUMMY ; EXIT - A= CTRL-Z ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ;DEVICE STATUS ; EXIT - A= 0: BUSY, FFH:READY ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++  DE ; ; SAVE CURRENT ROM & GET MONITOR ROM ; IN A,(M2_RSEL) LD (ROMSAV),A LD A,MR_RNUM OUT (M2_RSEL),A ; ; PRINKPOINT ; ITRAP1: CP A,'M' JR NZ,ITRAPR ; POP DE POP BC POP HL POP AF JP 0008H ; ; ; ELSE RESTORE REGS & RETU##################################################################### ; SDTRAN: GXLATE 26,6 ;############################&0 %+ &, !'- "(. #)/ $*0################################################ ; ; COMMON I/O PARAMETER BLOCK ; ;######################################### DS 1 DVR1SZ DS 1 DVRDSPT DS 1 DVRDSZ DS 1 DVRDTYP DS 1 ;RESERVED FOR DISK TYPE DVRCYLS DS 2 ;DISK CYLINDERS DVRHDS DS 1 ;DB #S0,#Z0,#S1,#Z1,#SD,#ZD DB #DT ;;DISK TYPE DW #CY ;;CYLS DB #HD ;;HEADS LIST OFF ENDM DVR0: IF BOOT = 10H -90 grh ; Initial separation from main module ; ;**************************************************************************MONITOR ADDRESSES ; MONROM EQU 0F800H ;ROM START ADDR ; ; PAGE 0 LOCATIONS ; WSVEC EQU 0 ;VECTOR NUMBER FOR WARM RESTA; ; RAM VARIABLES ; ;============================================================================ ; ; SAVE 128 BYTES FO ; ; BREAKPOINTS ; STRUCT 0 BPADDR DS 2 ;ADDRESS OF BREAKPOINT BPABNK DS 1 ;BANK # OF BREAKPOINT BPDATA DS 1 ;DATA DIA,(THIS_BNK) LD (BNKLOC),A ; ; DISPLAY BREAK ADDRESS ; EX DE,HL ;HL= ADDR LD E,A ;E= BANK CALL LADR ; ; CLEAR################################### ; IOPB: REPT PB_SIZE LIST OFF DB 0 LIST ON ENDM ;############################HEADS ; ; DEFINE THE STRUCTURE SIZE ; DVRSIZ DS 0 ENDM ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ALLDRV HDEXEC,4,60H,32,1,32,1,32,1,10H,256,4 ALLDRV HDEXEC,4,60H,32,1,32,1,32,1,10H,256,4 ALLDRV HDEXEC,5,60H,32,1,32,1,32,** ; ;============================================================================ ; ; ASSEMBLE TIME CONSTANTS ; ;======RT ; IOBYTE EQU 3 ;ADDR OF I/O CONTROL BYTE IOBYTV EQU 00H ;DEFAULT IOBYTE VALUE ; ; MEMORY BANK DATA IN PAGE 0 ; THIR MONITOR ; ORG MONROM - 128 MONSTK EQU $ ; ; REGISTER IMAGE STORAGE ; RLOC DS 1 ;R ILOC DS 1 ;I YLOC DS 2 ;IY XLOCSPLACED BY RESTART INSTRUCTION BP_REC DS 0 ;NUMBER OF BYTES IN RECORD ENDM TLOC: REPT NBKPTS DS BP_REC ENDM ; ;  BREAKPOINTS ; LD HL,TLOC LD B,NBKPTS ; ; TOP OF RESTORATION LOOP ; RS7: LD E,(HL) ;FETCH BREAKPOINT ADDRESS LD (H################################################ ; ; DISK DRIVER TABLES ; ;#################################################@@@@@@@@@@@@@@@@@ ; ; MACRO TO DEFINE THE DRIVER TABLE RECORD ; ENTRY- #DADD= DRIVER ADDRESS ; #PD= PHYSICAL DRIVE # ; #F1,10H,256,4 ALLDRV HDEXEC,5,60H,32,1,32,1,32,1,10H,256,4 ALLDRV FD8EXEC,0,0,26,0,26,0,26,0,0,77,1 ALLDRV FD8EXEC,1,0,26,0,====================================================================== ; DEFBNK EQU 0 ;DEFAULT BANK # ; ; BREAKPOINTS ; S_BNK EQU 001BH ;BANK # FOR THIS BANK (CONSTANT) THIS_STK EQU 001CH ;STACK PTR WHILE THIS BANK IS SELECTED PREV_BNK EQU 001E DS 2 ;IX FPLOC DS 1 ;F' APLOC DS 1 ;A' CPLOC DS 1 ;C' BPLOC DS 1 ;B' EPLOC DS 1 ;E' DPLOC DS 1 ;D' LPLOC DS 1 ;L' HPLOCBANK #S ASSOCIATED WITH ARGUMENTS ; ARGPTR DS 2 ;PTR TO CURRENT ARGUMENT'S BANK A1_BNK DS 1 ;ARG #1 BANK A2_BNK DS 1 A3_BNKL),0 ;CLEAR BREAKPOINT INC HL LD D,(HL) LD (HL),0 INC HL LD C,(HL) LD (HL),0 INC HL ;SET PTR TO DATA ; ; IF ########################### ; STRUCT 0 DVRADD DS 2 ;START ADDRESS OF DISK DRIVER DVRFG DS 1 ;FLAGS (BIT 0= 1: INHIBIT LOGONG= DRIVE FLAGS (IDFLGO) ; #S0= TRK 0 SPT ; #Z0= TRK 0 SIZE ; #S1= TRK 1 SPT ; #Z1= TRK 1 SIZE ; #SD= DATA TRKS SPT ; 26,0,26,0,0,77,1 ENDIF IF BOOT = 3 ALLDRV FD8EXEC,0,0,26,0,26,0,26,0,0,77,1 ALLDRV FD8EXEC,1,0,26,0,26,0,26,0,0,77,1 NBKPTS EQU 2 ;NUMBER OF BREAKPOINTS BP_RST EQU 8 ;BREAKPOINT RESTART # BP_RSTV EQU BP_RST ;BREAKPOINT RESTART VECTOR LOCATH ;LINK BACK TO PREVIOUS BANK ; ; ASCII CONSTANTS ; CTRLS EQU 13H ;ASCII DC3 CR EQU 0DH LF EQU 0AH BELL EQU 7 ; ;  DS 1 ;H' ELOC DS 1 ;E DLOC DS 1 ;D CLOC DS 1 ;C BLOC DS 1 ;B FLOC DS 1 ;F ALOC DS 1 ;A SLOC DS 2 ;SP ; LLOC DS 1 ;L H DS 1 ; ; DISK IOPB RESERVATION ; IOPB: DS PB_SIZE ; ; DISK ROM VARS ; DDADDR DS 3 ;JADE CONTROLLER ADDRESS, BANK DBREAKPOINT ALREADY CLEARED THEN SKIP RESTORE ; LD A,E ;IF LOC = 0:0 THEN SKIP RESTORE OR A,D OR A,C JR Z,RS8 ; ; E) DVRPDRV DS 1 ;PHYSICAL DRIVE ;DVRLDRV DS 1 ;LOGICAL DRIVE {0..N-1} ; ; THE FOLLOWING MAY BE BROUGHT OFF DISK DESCRIPTOR  #ZD= DATA TRKS SIZE ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ALLDRV MACRO #DADD,#P;**************************************************************************** ; ; M5b Z-80 Banked Memory Monitor Global DefiniION BP_RSTI EQU 0C7H + BP_RSTV ;BREAKPOINT INSTRUCTION ; ; MONITOR FUNCTION CALL ; MFUNRST EQU 20H ;FUNCTION RESTART VEC MONITOR ROM EXTENSIONS ; MR_RNUM EQU 0 ;RESIDENT ROM DK_RNUM EQU 2 ;DISK ROM DEB_RNUM EQU 3 ;DEBUGGER ROM CHR_RNUM EQU 4 ;LOC DS 1 ;H PLOC DS 2 ;PC BNKLOC DS 1 ;PC BANK # ; ; BANKED MEMORY MANAGEMENT ; CBANK DS 1 ;CURRENT EXECUTION BANK DBDPORT DS 1 ;JADE CONTROLLER PORT IOPBPTR DS 3 ;CURRENT IOPB POINTER IF ($ AND 7FFFH) > 7800H CONMSG **** RAM AllocationLSE RESTORE ORIGINAL DATA ; LD A,(HL) ;ELSE RESTORE ORIGINAL INSTR. PUSH HL EX DE,HL ;HL= MEMPTR LD E,C ;E= BANK LOR FROM DEFAULT TABLES ; DVRFLG DS 1 ;DISK FLAGS DVR0SPT DS 1 ;TRK 0 SECTORS PER TRK DVR0SZ DS 1 ;TRK 0 SECTOR SIZE DVR1SPTD,#FG,#S0,#Z0,#S1,#Z1,#SD,#ZD,#DT,#CY,#HD LIST ON DW #DADD DB 0 ;;LOGON INHIBIT FLAG (LOGON ENABLED) DB #PD DB #FG tions ; ;**************************************************************************** ; ; Revision History: ; ; 1.00 11-22TOR # MFUNRSV EQU MFUNRST ;FUNCTION RESTART VECTOR LOCATION MFUNRSI EQU 0C7H + MFUNRST ;FUNCTION RESTART INSTRUCTION ; ; CHAR I/O ROM CLK_RNUM EQU 7 ;MISC. I/O ROM ;============================================================================ ANK DS 1 ;DESTINATION BANK # FOR MOVE SBANK DS 1 ;SOURCE BANK # FOR MOVE BNKCHG DS 1 ;BANK CHANGED FLAG (0: NOT, /0: CHANGED)  Too Large! **** ENDIF D C,A ;C= DATA CALL PUTMEM POP HL ; ; NEXT BREAKPOINT ; RS8: INC HL ;DO NEXT BP DJNZ RS7 ; ; SAVE THE Z80 UNIQ