IMD DMK Tracks:77x10816 DSMD  Disk Descriptor30 00M4 0 %+ &, !'- "(. #)/ $*00 %+ &, !'- "(. #)/ $*00 %+ &, !'- "(. #)/ $*0DKBT300 Z80 DKBT300 Z807 BBM103 Z80BBM103 Z80ZMON107 Z80ZMON107 Z80=DKBT305 Z80DKBT305 Z80{DKBT307 Z80CDEFGHIJDKBT307 Z80'KLMDKBT304 Z80NOPQRSTUDKBT304 Z80VWXYZ[\]alibrate ; 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 Also ; Also allow boot from 2nd platter. ; code logical physical ; 42 A DRIVE 0 HEAD 0 ; 52 B DRIVE 0 HEAD 2 ; 62 C DRIBBM103 Z80 !"#$%BBM103 Z80W&'()*+ZMON108 Z80,-./0123ZMON108 Z80456789:;ZMON110 Z80ZMON110 Z80ZMON110 Z80OZMON111 Z80DKBT304 Z80^DKBT300AZ80_`abcdefDKBT300AZ80ighijklm-ZMON1XX  GRH ; Fix bug in recal routine to account for phase 1 anded with trk00 ; signal from drive. Causes recal to not work ; ; 1VE 1 HEAD 0 ; 72 D DRIVE 1 HEAD 2 ; ; 3.0 - 10 FEB 86 GRH ; Change Jade DD boot to resident prom version. ; Implement diZMON108 Z80<<=>?ZMON109XZ80@ABCDEFGZMON109XZ80HIJKLMNOZMON109XZ80=PQRSZMON111 Z80ZMON111 Z80mCLOK102 Z80TCLOK100 Z80"ZMON121 Z80nopqrstuZMON121 Z80vwxyz{|}ZMON121 Z80~ZMON121 Z80` TITLE DISK BOOTSTRAP DRIVER II LIST NOCOND ;**************************************************************************** ; .6 - 3 APR 83 GRH ; Fix bug in boot routine that assumes the controller window is ; enabled after requesting it. Found out tsk I/O driver functions & vectors. ; code drive ; 0x Jade #0 (40H) F0 ; 1x Jade #0 (40H) F1 ; 2x Jade #1 (41H) F0 ; 3xM5I100 Z80iTUVWXYZM5C100 Z802[\]^ZMON109 Z80_`abcdefZMON109 Z80ghijklmnCLOK101 Z80GDKBT201 Z80DKBT201 Z80DKBT308 Z80  ZMON2 DOC!ZMONROM DEFZMON1-X Z80ZMON1-X Z80 ; DISK CONTROLLER BOOTSTRAP DRIVER ; ; FOR M5B WITH ZMON MONITOR. ; (ALSO WILL WORK STAND-ALONE) ; ;**********************hat if the Z-80 is ; generating a wait signal, the bus request is never acknowledged! ; Solution is to output the RESET bit al Jade #1 (41H) F1 ; 4x ISHA DRIVE 0 HEAD 0 ; 5x ISHA DRIVE 0 HEAD 2 ; 6x ISHA DRIVE 1 HEAD 0 ; 7x ISHA DRIVE 1 HEAD 2 ;ZMON109 Z80=opqrZMON106 Z80stuvwxyzZMON106 Z80{|}~ZMON106 Z80=DKBT308 Z80   DKBT308 Z80>DKBT306 Z80DKBT306 Z80 !"#$%&ZMON1-X Z80=DMOSS202ASMDMOSS202ASMDMOSS202ASME****************************************************** ; ; REVISION STATUS: ; ; 1.0 - 26 FEB 81, Release ; 1.1 - Fix bug. ong with the request thus ; yanking the processor out of it's sleep. ; ; 2.0 - 18 MAR 84 GRH ; Added hard disk boot option Add error message output. ; VERSN EQU '30' ; ;**************************************************************************** ZMON105 Z80ZMON105 Z80ZMON105 Z807ZMON107 Z80DKBT306 Z80<'()*DKBT303 Z80+,-./012DKBT303 Z80~3456789:DKBT307 Z80;<=>?@ABIOBOARD DEF; 1.2 - 18 JUL 82, Move DD to high memory, clean up listing. ; 1.3 - 12 FEB 83 ; Add timout if DD not responding, add true rec and boot command source disk option. ; ; 2.1 - 18 APR 85 GRH ; Fix problem with hard disk boot from drive 1. Needs logon.  SUBTTL DECLARATIONS ;============================================================================ ; ; CONSTANTS ; ;=0 %+ &, !'- "(. #)/ $*0=========================================================================== FALSE EQU 0 TRUE EQU NOT FALSE ; DEBUG EQU FALSE*INCLUDE NAKEDT.DEF ;*INCLUDE HDISK.DEF ; ;============================================================================ LISROLLER PORT # ; ; BOOT VARIABLES ; ARGSAV DS 1 ;ARGUMENT SAVE BYTE BIOSLN DS 2 ;BIOS LENGTH SAVE/SECTOR COUNT BIOSNT DS  ;---------------------------------------------------------------------------- JP CO ;---------------------------------- START OF 1ST VECTOR FOR USER ACCESS ; ;############################################################################ DB HIGHOR FOR RETURN NOP ;ALIGN NEXT INSTRUCTION OUT (ROMSEL),A ; ; MONITOR ROM CONTINUES EXECUTION NOW ; ;------------- 40H PAGE ADDRESS ; 41H= PORT 41H PAGE ADDRESS ; 42H= PORT 42H PAGE ADDRESS ; 43H= PORT 43H PAGE ADDRESS ; (0: NOT IN SYSTEOLLER BOOT ; SUBTTL JADE BOOT ;---------------------------------------------------------------------------- ; ; THIS ROU ; REV EQU 'C' ;JADE BOARD REVISION LEVEL ; BIOSSEC EQU 13 ;START SECTOR OF BIOS HNGTMO EQU 10 ;HANGUP TIMOUT SECSIZ EQT OFF *INCLUDE MONBOARD.DEF *INCLUDE COMIOPB.DEF *INCLUDE JDDCONT.DEF *INCLUDE ISHA.DEF *INCLUDE NAKEDT.DEF *INCLUDE HDISK2 ;BIOS ENTRY SUBTTL MAIN PGM ORG PROMST ;---------------------------------------------------------------------------- ------------------------------------------ ; ; JADE FLOPPY DISK DRIVER VECTOR ; ENTRY- BC= IOPB PTR ; E= 0: NO DATA XFER ; VERSN,'.',LOW VERSN ;---------------------------------------------------------------------------- ; ; COLD START FROM RE--------------------------------------------------------------- ; ; BOOT CALLER HAS SWAPPED ROMS & STARTS EXECUTING HERE. ; EM) ; LD HL,FDC0 ;INIT PORTS & ADDRESS LD B,ARGSAV - FDC0 IFD: LD (HL),0 INC HL DJNZ IFD ; LD BC,0440H ;START WITH TINE NOW ACCESSES THE NEW JADE CONTROLLER WITH ON-BOARD PROM. ; THE CODE WILL COMMAND THE CONTROLLER TO READ THE BIOS FROM THU 128 ;DISK SECTOR SIZE ; ; SYSTEM LOCATIONS ; LOGINBY EQU 0004H ;CP/M CURRENT DRIVE & USER BYTE IOPB EQU 005CH ;USE D.DEF LIST ON ;============================================================================ ; ; PAGE 0 RESERVED AREA ;  ; ; STAND-ALONE ENTRY VECTOR ; ;---------------------------------------------------------------------------- JP COLD ;BO EXIT - AF= 0: NO ERRORS ; BC,DE,HL,IX= ? ; ;---------------------------------------------------------------------------- SET IN CASE THIS IS ONLY PROM IN SYSTEM ; ;---------------------------------------------------------------------------- COLD:NTRY- C= ARGUMENTS: ; 7 0 ; |x| | | |x|x|x|x| ; ^ ^ ^__________ JADE CONTROLLER #1 DRIVE {0,1} ; | |__________PORT 40H FOR 4 PORTS LD HL,FDC0 IFD2: IN A,(C) ;GET BOARD STATUS INC A ;IF ALL 1S THEN NOT EXISTING JR Z,NOTHERE ; DE DISK AND ; EXECUTE THE COLD START ENTRY IN THE BIOS. ; ;-----------------------------------------------------------------EFAULT FCB AS IOPB AREA DEFBFR EQU 0080H ;USE CPM DEFAULT BUFFER FOR BIOS SECTOR 1 PROMST EQU 0F800H XOVER EQU PROMST + 30H  ;============================================================================ ORG 0040H ; ; JADE CONTROLLER WINDOW PAGE AOT VECTOR ;---------------------------------------------------------------------------- ; ; CONSOLE INPUT ; EXIT - A= CHJP JADEX ;---------------------------------------------------------------------------- ; ; ISHA DRIVER VECTOR ; ENTRY- B DI ;DISABLE ROM IMAGE OUT (COLDRES),A ; LD SP,DEFBFR ;SET UP COLD STACK LD C,0 ;SELECT OPTIONS JR BEGIN ;-----__ JADE CONTROLLER #2 DRIVE {0,1} ; |______________ ISHA HARD DISK (BIT 4 & 5= LOGICAL DRIVE) ; BHARDB EQU 2 ;ISHA HARD DIEC A AND DDSASW ;COMPUTE BOARD ADDR RLCA OR DDBASE SHR 8 LD (HL),A ;STORE ADDRESS OF PORT NOTHERE: INC HL ;NEXT PO----------- ; ; COMPUTE THE PORT # ; LD A,(ARGSAV) ;PORT ADDRESS = 40H + (DRIVE# MOD 2) SRL A ADD A,40H CP A,44H ;;ROM CROSS-OVER POINT PROMSIZ EQU 2048 ;SIZE OF THIS PROM FOR CODE CHECKING ;============================================DDRESSES (0: NON-EXISTENT) ; FDC0 DS 1 ;FLOPPY CONTROLLER PAGE FOR PORT 40H FDC1 DS 1 ;FLOPPY CONTROLLER PAGE FOR PORT 41H FAR ; ;---------------------------------------------------------------------------- RET NOP NOP DS 3 ;RESERVE SPACE C= IOPB PTR ; EXIT - AF= 0: NO ERRORS ; BC,DE,HL,IX= ? ; ;---------------------------------------------------------------------------------------------------------------------------------------- ; ; SWAP ROMS TO RETURN TO CALLER ; ;---------------SK BIT # ;---------------------------------------------------------------------------- BEGIN: ; ; SAVE ARGUMENT ; LD A,RT INC C DJNZ IFD2 ; ; NOW VECTOR TO DISK BOOT ROUTINE ; LD A,(ARGSAV) AND 0F0H RRCA RRCA RRCA RRCA BIT BIF PORT NOT {40H..43H} THEN ABORT JR NC,ABORT ; LD C,A ; ; RESET & START THE DISK PROCESSOR ; LD A,DDBGN CALL JWAI================================ ; ;*INCLUDE MONBOARD.DEF ;*INCLUDE COMIOPB.DEF ;*INCLUDE JDDCONT.DEF ;*INCLUDE ISHA.DEF ;DC2 DS 1 ;FLOPPY CONTROLLER PAGE FOR PORT 42H FDC3 DS 1 ;FLOPPY CONTROLLER PAGE FOR PORT 43H ; FDCPRT DS 1 ;CURRENT JADE CONT ;---------------------------------------------------------------------------- ; ; CONSOLE OUTPUT SUBR ; ENTRY- C= CHAR ;----------- JP ISHAX ;############################################################################ ; ; PUT VERSION # AT------------------------------------------------------------- DS XOVER - $ ;POSITION CODE DKRET: LD A,XMONROM ;SELECT MONITC ;CHECK OPTIONS LD (ARGSAV),A ; SAVE ARGS ; ; SET UP CONTROLLER TABLE AT 40H ; TABLE IS ARRANGED AS FOLLOWS: ; 40H= PORTHARDB,A ;TEST FOR HARD DISK RES BHARDB,A ;CLEAR HARD DISK BIT LD (ARGSAV),A JP NZ,HBOOT ; ; FALL THROUGH TO JADE CONTRT JR NZ,ABORT ; ; TEST THE STATUS ; LD IX,IOPB CALL JGETRES CALL NZ,DBERR ;DIAGNOSTIC ERROR ; ; PREPARE IOPB ;0 %+ &, !'- "(. #)/ $*0 CALL IIOPB ; LD A,(ARGSAV) ;SET DRIVE LD B,A AND A,1 ;SEPARATE DRIVE LD C,A LD A,B AND A,0FEH ;SEPARATE CONTRO(BIOSLN),A JR NZ,JADRDB ; ; EXECUTE THE BIOS COLD START ENTRY ; LD HL,(BIOSNT) JP (HL) ; ; ; ABORT RETURNS CONTROLD OK, COMPUTE CONTROLLER PORT ; JADE1: LD A,(IX + PBDRVO) ;PORT = DRIVE MOD 4 SRL A SRL A ADD A,40H CP A,44H ;IF CONTDRIVE PARAMETERS DW JTYPE4 ;RETURN DRIVE STATUS DW JTYPE4 ;SET EIA BAUD RATE DW JTYPE4 ;CLEAR NJCMDS EQU ($ - JADETBL)X + PBST4O) ;FETCH COUNT LD B,(IX + PBST5O) ; BIT PBFNXB,(IX + PBFLGO) ;IF FLAG == TRUE THEN NO XFER JR NZ,JT1 ; LD A; PUSH BC ;SAVE PORT # LD C,(IX + PBST4O) ;FETCH COUNT LD B,(IX + PBST5O) ; BIT PBFNXB,(IX + PBFLGO) ;IF FLAG == TRUEDD HL,DE EX DE,HL ; PUSH IX ;SET IOPB ADDRESS POP HL ; PUSH BC ;SAVE PORT # LD BC,IOPBSZ LDIR POP BC ; ; EION IN CONTROLLER LD H,0 LD H,(HL) LD L,0 PUSH BC ;SAVE PORT # LD BC,DDCBO ADD HL,BC LD BC,IOPBSZ ;COUNT = REMAINLLER SLA A OR A,C ;MERGE THE TWO LD (IOPB + PBDRVO),A ; ; LOG ON DRIVE ; LD BC,IOPB CALL JADEX CALL NZ,DBERR  TO THE MONITOR ROM ; ABORT: SCF ;HAVE MONITOR PRINT ERROR MESSAGE JP DKRET ;++++++++++++++++++++++++++++++++++++++++ROLLER > #4 THEN ERROR JR NC,DSKERR ; ; SAVE PORT # ; LD (FDCPRT),A LD C,A ; ; USE COMMAND TO INDEX INTO DRIVER T / 2 ; ;---------------------------------------------------------------------------- ; ; TYPE 1 JADE COMMAND XFERS SECTOR ,C ;IF COUNT == 0 THEN NO XFER OR A,B JR Z,JT1 ; LDIR ;XFER DATA JT1: POP BC ; ; REMOVE JADE WINDOW ; XOR A,A  THEN NO XFER JR NZ,JT2 ; LD A,C ;IF COUNT == 0 THEN NO XFER OR A,B JR Z,JT2 ; LDIR ;XFER DATA JT2: POP BC ; ;XECUTE THE COMMAND ; LD A,DDEXC ;START COMMAND CALL JWAIT ;WAIT FOR COMPLETION RET NZ ; ; FALL INTO GET RESULTS FUNDER LDIR POP BC ; ; RELEASE IOPB WINDOW ; XOR A,A OUT (C),A ; ; CHECK FOR ERROR ; LD A,(IX + PBSTATO) OR A JP NZ,DKRET ; ; READ 1ST BIOS SECTOR ; LD (IX + PBSECO),BIOSSEC LD (IX + PBCMDO),DDRDS LD BC,IOPB CALL JADEX CAL++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE JADE IOPB FUNCTION ; ENTRY- BC= IOPB ADDRESS ; DRIVE= {0..3}: PORT 40ABLE ; LD A,(IX + PBCMDO) LD E,A LD D,0 LD HL,JADETBL ADD HL,DE ADD HL,DE LD A,(HL) INC HL LD H,(HL) LD L,ADATA FROM CONTROLLER ; ;---------------------------------------------------------------------------- JTYPE1: ; ; EXECUTE  OUT (C),A RET ;---------------------------------------------------------------------------- ; ; TYPE 2 JADE COMMAND FALL INTO THE JADE EXECUTION FUNCTION ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ CTION ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; COMMAND EXECUTED, XFER RESULT,A RET ;---------------------------------------------------------------------------- ; ; TYPE 3 JADE COMMAND XFERS FOL NZ,DBERR JP NZ,DKRET ; ; FETCH PARAMETERS ; CALL STUPBIOS JP C,DKRET ; ; READ BIOS ; JADRDB: LD BC,IOPB ;H, {4..7}: PORT 41H ; EXIT - AF= 0: NO ERRORS ; IX= IOPB ADDRESS ; A,BC,HL,DE= ? ; ;+++++++++++++++++++++++++++++++++++++ JP (HL) ; ; COMMAND TYPE TABLE ; JADETBL: DW JTYPE1 ;LOGON DISK DW JTYPE1 ;READ SECTOR DW JTYPE2 ;WRITE SECTORCOMMAND ; CALL JEX RET NZ ;IF ERROR THEN QUIT ; ; XFER DATA FROM CONTROLLER ; LD A,DDMB0 ;SOFTLY GRAB RESOURCES WI XFERS SECTOR DATA TO CONTROLLER ; ;---------------------------------------------------------------------------- JTYPE2: ; ; ; EXECUTE THE JADE IOPB FUNCTION ; ENTRY- C= CONTROLLER PORT # {40..43H} ; IX= IOPB ADDRESS ; EXIT - AF= 0: NO ERRORS S FUNCTION ; ENTRY- IX= IOPB ADDRESS ; C= PORT ADDRESS OF BOARD {40..43H} ; (00[C])= HI BYTE BASE ADDRESS OF BOARD ; EXIT RMAT PGM TO CONTROLLER ; ;---------------------------------------------------------------------------- JTYPE3: ; ; XFER FEXECUTE THE IOPB CALL JADEX CALL NZ,DBERR JP NZ,DKRET ; INC (IX + PBSECO) ;NEXT SECTOR ; LD HL,(IOPB + PBDMAO) ;BUM+++++++++++++++++++++++++++++++++++++++ JADEX: ; ; SAVE ARGUMENTS ; PUSH BC ;USE IX AS IOPB PTR POP IX ; ; SELECT DW JTYPE3 ;FORMAT TRACK DW JTYPE1 ;READ ADDRESS DW JTYPE4 ;EIA OUTPUT DW JTYPE4 ;EIA STATUS DW JTYPE4 ;IDLE DWTHOUT INTERRUPT OUT (C),A LD A,DDMB1 ;OPEN WINDOW TO SECTOR BUFFER (BANK 1) OUT (C),A ; LD E,(IX + PBDMAO) ;FETCH DES; XFER DATA TO CONTROLLER ; LD A,DDMB1 ;OPEN WINDOW TO SECTOR BUFFER (BANK 1) OUT (C),A ; LD E,(IX + PBDMAO) ;FETCH ; B, DE, HL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JEX: LD A,DDMB0 ;OPEN WINDOW- AF= 0: NO ERRORS ; DE, HL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JGETRES: LORMAT PROGRAM TO CONTROLLER ; LD A,DDMB0 ;SELECT COMMAND BANK OUT (C),A ; LD L,(IX + PBDMAO) LD H,(IX + [PBDMAO + 1])P LOAD ADDRESS LD DE,SECSIZ ADD HL,DE LD (IOPB + PBDMAO),HL ; LD A,(BIOSLN) ;IF --COUNT != 0 THEN REPEAT DEC A LD  OPERATION ; LD A,(IX + PBCMDO) CP A,NJCMDS JP C,JADE1 ; ; ERROR ; DSKERR: LD A,-1 OR A,A RET ; ; ; COMMAN JTYPE4 ;RETURN VERSION DW JTYPE4 ;SET DISK FLAGS DW JTYPE4 ;LOAD HEAD & IDLE DW JTYPE4 ;SEEK TRACK DW JTYPE4 ;SET TINATION ADDRESS LD D,(IX + [PBDMAO + 1]) ; LD L,C ;FETCH FDC ADDRESS LD H,0 LD H,(HL) LD L,0 ; PUSH BC LD C,(IDESTINATION ADDRESS LD D,(IX + [PBDMAO + 1]) ; LD L,C ;FETCH CONTROLLER ADDRESS LD H,0 LD H,(HL) LD L,0 EX DE,HL  TO COMMAND BUFFER (BANK 0) OUT (C),A ; LD L,C ;COMPUTE CDB OFFSET ADDRESS LD H,0 LD H,(HL) LD L,0 LD DE,DDCBO AD A,DDMB0 ;RESELECT COMMAND BLOCK WINDOW OUT (C),A ; PUSH IX ;XFER IOPB RESULTS POP DE ; LD L,C ;COMPUTE IOPB LOCAT LD E,C LD D,0 LD A,(DE) LD D,A LD E,0 ; PUSH BC LD C,(IX + PBST4O) LD B,(IX + PBST5O) ; BIT PBFNXB,(IX + PB0 %+ &, !'- "(. #)/ $*0FLGO) ;IF FLAG == TRUE THEN NO XFER JR NZ,JT3 ; LD A,C ;IF COUNT == 0 THEN NO XFER OR A,B JR Z,JT3 ; LDIR ;XFER DISSUE CMD EX (SP),HL ;WASTE SOME TIME FOR DD TO CATCH UP EX (SP),HL ; ; WAIT FOR TASK COMPLETION FOR A WHILE ; LD L,************************************************************** HBOOT: ; ; ISSUE CONTROLLER RESET & CONTINUE ; LD A,1 SHL USE PLATTER 1 OR C LD (IOPB + PBSECO),A EXX ; CLRWT: IN A,(HSTATUS) ;WAIT FOR CONTROLLER READY CP 0FFH ;IF NOT INSTAT NZ ; ; LOAD THE CBIOS ; LD A,(DEFBFR + HDBIOSS) ;FETCH CBIOS SECTOR FROM DIRECTORY EXX ;ADD IN LOGICAL DRIVE OFFSE ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; ISHA DRIVER ; ENTRY- BC= IOPB ADDRESS ***************** ; ; HWBUSY SUBR WAITS UNTIL HOST ADAPTOR GOES NOT BUSY ; EXIT - A= STATUS ; ZF= TRUE ; ;***************EC HL ;FETCH BIOS LOAD ADDRESS LD D,(HL) DEC HL LD E,(HL) ; IF DEBUG LD DE,(ARG2) ;DEBUG, LOAD IN AT ARG 2 ENDATA JT3: POP BC ; ; EXECUTE THE FORMAT DRIVER ; JP JEX ;-----------------------------------------------------------HNGTMO ;SET UP TIMOUT LD DE,0 JWAIT1: DEC DE ;IF NOT TIMOUT THEN CONTINUE TO WAIT LD A,E OR D JR NZ,JWAIT2 ; DEC L  HRESET OUT (HCMD),A XOR A OUT (HCMD),A ; ; INSURE FDC WINDOW REMOVED ; LD BC,0440H XOR A,A H1: OUT (C),A INC LLED THEN QUIT JP Z,DKRET ; BIT HBUSYB,A ;ELSE WAIT JR NZ,CLRWT ; ; WAIT A WHILE IN CASE HOST ADAPTER FIDDLING WITH ST OR C EXX LD (IOPB + PBSECO),A ; LD BC,IOPB CALL ISHAX ;LOAD IN CBIOS SECTOR #1 CALL DQERR ;CHECK FOR ERRORS R; EXIT - AF= 0: NO ERRORS ; IX= IOPB ADDRESS ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++************************************************************* HWBUSY: IN A,(HSTATUS) ;WAIT FOR DONE BIT HBUSYB,A JR NZ,HWBUIF LD (BIOSNT),DE ;SAVE START ADDRESS ; DEC HL ;FETCH BIOS LENGTH LD B,(HL) DEC HL LD C,(HL) LD (BIOSLN),BC ;SAVE ----------------- ; ; TYPE 4 JADE COMMAND XFERS IOPB ONLY TO/FROM CONTROLLER ; ;------------------------------------------ ;IF TIME OUT THEN RETURN TO MONITOR OR L JP Z,DSKERR ; JWAIT2: IN A,(C) ;IF NOT DONE THEN WAIT AND A,DDSHLT JR NZ,JWC DJNZ H1 ; ; SET UP IOPB IN RAM ; CALL IIOPB ; ; SAVE LOGIN DRIVE FOR BIOS ; LD A,(ARGSAV) ;COMPUTE & SET DRIVETATUS PORT ; LD HL,0 HB1: DEC HL LD A,H OR L JR NZ,HB1 ; ; AND CHECK AGAIN ; IN A,(HSTATUS) BIT HBUSYB,A JRET NZ ; CALL STUPBIOS ;SET UP IOPB FOR BIOS READ JP C,DKRET ; HDRDLP: LD BC,IOPB CALL ISHAX CALL DQERR RET NZ ;  ISHAX: PUSH BC POP IX ; ; OUTPUT THE IOPB ADDRESS TO HOST ADAPTER ; LD A,C OUT (HDATA),A LD A,HIOPBL OUT (HCMSY RET ;**************************************************************************** ; ; COMMON SETUP IOPB FOR BIOS REAIT ; LD HL,DEFBFR ;MOVE THIS SECTOR TO PROPER PLACE LD BC,SECSIZ LDIR ; LD (IOPB + PBDMAO),DE ;SET UP NEW DMA ADDRESS ---------------------------------- JTYPE4: EQU JEX ;**********************************************************************AIT1 ; RET ;RETURN ZF IF $ >= 0FC00H CONMSG *** JADE DEPENDENT CODE OVERLAPS CONTROLLER MAP *** ENDIF SUBTTL  LD (LOGINBY),A ;STORE DRIVE IN CP/M LOGIN BYTE FOR CBIOS ; ; COMPUTE LOGICAL DRIVE FOR IOPB ; SRL A ;DRIVE = LOGICAL_ NZ,CLRWT ;IF BUSY AGAIN THEN CONTINUE TO WAIT ; ; CHECK SELF TEST STATUS ; LD IX,IOPB CALL DQERR ; ; FORCE HOST AD INC (IX + PBSECO) ;NEXT SECTOR (IX SET TO IOPB BY ISHAX) ; LD HL,(IOPB + PBDMAO) ;BUMP DMA ADDRESS LD DE,SECSIZ ADD HL,D),A CALL HWBUSY ; LD A,B OUT (HDATA),A LD A,HIOPBH OUT (HCMD),A CALL HWBUSY ; XOR A,A OUT (HDATA),A LD A,HID SUBR ; ENTRY- CBIOS SECTOR #1 IN DEFBFR ; EXIT - CF= ERROR ; IX= IOPB ADDRESS ; A,HL,DE,BC= ? ; ;********************* ; LD IX,IOPB ;POINT TO IOPB INC (IX + PBSECO) ;NEXT SECTOR ; LD HL,(BIOSLN) ;COMPUTE # SECTORS LD A,L ;IF NOT EVEN S****** ; ; WAIT ON JADE CONTROLLER BUSY FUNCTION ; ENTRY- A= COMMAND TO OUTPUT ; C= PORT OF CONTROLLER ; EXIT - AF= 0: OK,HARD DISK BOOT ;**************************************************************************** ; ; Hard disk boot function. ; DRIVE / 2 LD (IOPB + PBDRVO),A ; ; COMPUTE SECTOR FROM LOGICAL DRIVE ; RRA ;IF ODD DRIVE THEN SECTOR += 128 AND A,8APTER LOG-ON ; LD BC,IOPB CALL ISHAX ;LOGON DRIVE CALL DQERR RET NZ ; ; NOW READ THE DIRECTORY SECTOR ; LD (IX DE LD (IOPB + PBDMAO),HL ; LD A,(BIOSLN) ;IF NOT DONE THEN LOOP DEC A LD (BIOSLN),A JR NZ,HDRDLP ; LD HL,(BIOSNT) OPBX OUT (HCMD),A CALL HWBUSY ; ; OUTPUT THE EXECUTE IOPB COMMAND ; LD A,HEXEC OUT (HCMD),A CALL HWBUSY ; ; R******************************************************* STUPBIOS: LD A,(DEFBFR + 1) ;FETCH BIOS LOAD PARAMETERS CP A,SECSIZECTOR THEN BUMP 1 AND A,7FH JR Z,NOBUMP ; LD DE,SECSIZ ADD HL,DE ; NOBUMP: LD A,L RLA ;PUT BIT 7 INTO BIT 0 OF H  /0: ERROR ; DE,HL= ? ; ;**************************************************************************** JWAIT: OUT (C),A ;This module reads the BIOS image to the proper system ; address & jumps to the BIOS cold start entry point. ; ;**************0H EXX ;SAVE SECTOR OFFSET IN C' FOR LATER USE LD C,A ; EVEN= 0, ODD= 80H (128) ; LD A,(IOPB + PBSECO) ;IF ODD, THEN+ PBCMDO),DDRDS LD (IX + PBSECO),HDIRSEC LD BC,IOPB CALL ISHAX ;READ THE DIRECTORY SECTOR (IOPB SET UP) CALL DQERR RE;BIOS LOADED, GO EXECUTE IT IF NOT DEBUG JP (HL) ELSE ;IF DEBUG THEN RETURN NO ERRORS OR A JP DKRET ENDIF ETURN THE ERROR STATUS ; LD A,(IX + PBSTATO) OR A,A RET ;*********************************************************** ;CHECK LIMITS OF OFFSET CCF RET C ; LD HL,DEFBFR ;COMPUTE OFFSET TO CBIOS VECTORS LD E,A LD D,0 ADD HL,DE ; D RL H LD A,H DEC A ;ALREADY HAVE 1ST SECTOR LD (BIOSLN),A ;PUT INTO VAR ; ; RETURN NO ERROR ; OR A,A RET ;**0 %+ &, !'- "(. #)/ $*0************************************************************************** ; ; INITIALIZE THE IOPB STRUCTURE IN RAM ; EXIT - AF RRCA RRCA RRCA RRCA CALL CONV ; ; NOW CONVERT LOWER NIBBLE ; POP AF CONV: AND A,0FH ;INSURE ONLY NIBBLE ************************************** DQERR: LD A,(IX + PBSTATO) ;CHECK FOR ERROR OR A,A RET Z ; DBERR: PUSH BC ;SAVE P******************************************* ; ; PRINT TEXT SUBR ; ENTRY- HL= TEXT PTR (LAST CHAR HAS BIT 7 SET) ; EXIT - HL,EM TRACKS DIRECTORIES ; EACH DIRECTORY IS FOLOWED BY A TABLE OF RECORDS DEFINING THE XFER FORMAT. ; THE LAST RECORD IS TERMI,23 ;BIOS DW 0 ;TERMINATOR ; ; 8" HARD DISK ; H8DIR: DB 86H ;NEW FORMAT, 6 ENTRIES DW 81,48 ;FREE SECTORS DW 4,16is ROM. ; ;************************************************************* ; ; Revision status: ; ; 1.0 - Release ; ; 1.1 s philosophy. ; Changed exit routine to enable interrupts before executing program ; to allow for keyboard abort. ; Change siHL= DEFBFR ; B= 0 ; ;**************************************************************************** IIOPB: ; ; ZERO OUT TADD A,90H ;CONVERT DAA ADC A,40H DAA LD C,A ;OUTPUT ; ; FALL INTO CONSOLE OUTPUT ; ;************************ORT # ; ; NEW LINE ; CALL CRLF ; ; OUTPUT TEXT ; LD HL,DERM CALL PUTS ; ; OUTPUT STATUS BYTES ; PUSH IX  C, A= ? ; ;**************************************************************************** PUTS: LD C,(HL) RES 7,C CALL CO NATED BY A 0000H DATA PTR BUFFER ADDRESS. ; STRUCTURE: ; DW DATA PTR ; DW TRK/SECTOR (TRK BIT 7 == 1: SINGLE DENSITY XLATE)  ;CCP SEC, SIZE DW 20,28 ;BDOS DW 55,1 ;SPARE (BLT) DW 57,9 ;SPARE (DCM) DW 66,15 ;BIOS ; DW SYBUFR,0001,1 ;BOOT- 14 JUL 85 GRH ; Changed variable initialization philosophy to constants, assuming ; 64k system ram is allways present. Oldgn-on message to a constant memory value. ; Fix bug in e'X'amine register command which did not treat the 'M' ; register correHE IOPB ; LD HL,IOPB LD B,IOPBSZ ZIOPB: LD (HL),0 INC HL DJNZ ZIOPB ; ; SET THE XFER COUNT ; LD HL,SECSIZ LD **************************************************** ; ; CONSOLE OUTPUT SUBR ; ENTRY- C= CHAR ; EXIT - AF= ? ; ;********** POP HL LD DE,PBSTATO ADD HL,DE LD B,PBST5O - PBSTATO + 1 ; DBTE1: LD A,(HL) CALL HTOA CALL SPACE INC HL DJNZ DB ; BIT 7,(HL) RET NZ ; INC HL JR PUTS ;***************************************************************************; DW SECTOR COUNT ; ;############################################################################ ; ; JADE 8" FLOPPY ; F TITLE DIGITAL GROUP/BIG BOARD Z-80 MONITOR 'DGMON' LIST NOCOND ;************************************************************ version dynamically allocated ; variable space depending on top of available ram. ; Fix bug in 'G'oto command which transposectly. 'M' or ''M' now allows setting (HL). ; ; 1.2 - 18 AUG 85 GRH ; Implement overlay approach for commands to make more r(IOPB + PBST4O),HL ; ; SET THE XFER ADDRESS ; LD HL,DEFBFR LD (IOPB + PBDMAO),HL RET ;********************************************************************************************** CO: IN A,(NTS) ;IF BUSY THEN WAIT AND A,1 SHL NTBSY JR TE1 ; CALL CRLF POP BC ;RESTORE PORT # JP DSKERR ; DERM: DM 'Disk Error, Status = ' ;***************************** ; ; OUTPUT SPACE TO CONSOLE SUBR ; ;**************************************************************************** SPACE: L8DIR: DB 6 + 80H ;NEW DIRECTORY FORMAT, 6 ENTRIES DW 0,0 ;NO FREE SPACE DW 102H,16 ;CCP TRK/SEC & SIZE DW 112H,28 ;BDO* ; ; SYSTEM MONITOR FOR Z80 ; (c) 1982,1983 GRH ELECTRONICS, CUPERTINO, CA ; ;*******************************************d IX & IY register images. ; Added tests for 'F'ill & 'M'ove commands to abort operation if ; monitor area is about to be compoom for ; features & I/O drivers. Overlays reside in the 2nd 2k of the ROM in ; the base page of ROM area. Implement the real ************************************************ ; ; CONVERT BINARY NIBBLE TO ASCII-HEX & OUTPUT SUBR ; ENTRY- A= BINARY ; NZ,CO ; LD A,C OUT (NTD),A RET ;**************************************************************************** ; ; D************************************************ ; ; NEW LINE SUBR ; EXIT - AF, C= ? ; ;*********************************D C,' ' JR CO IF ($ < PROMST) OR ($ > (PROMST + PROMSIZ)) CONMSG ERROR! Code Too Large for PROM! ENDIF END S DW 0,0 ;SPARE (BLT) DW 0,0 ;SPARE (DCM) DW 4,23 ;BIOS DIRSIZ EQU $ - F8DIR ; ; FORMAT TABLE DEFINES WHERE DATA G****************** ; ; This Monitor program resides at the top of memory & ; allows memory modification & testing, program brromised. 'S'ubstitute will still ; allow monitor area to be modified if needed. Old version assumed ; monitor was in rom and ntime clock & cassette ; 'L'oad / 'U'nload commands. ; ; 1.3 - 8 OCT 85 GRH ; Add disk read, write & boot commands. ; Add ;**************************************************************************** HTOA: ; ; CONVERT UPPER NIBBLE 1ST ; PUSH ISK ERROR OUTPUT SUBR ; ENTRY- IX= IOPB BASE ; EXIT - AF= 0: NO ERROR ; HL,DE= ? ; ;********************************************************************************* CRLF: LD C,0DH CALL CO LD C,0AH JR CO ;*********************************FBFR ;DEFAULT (READ) BUFFER PTR ;############################################################################ ; ; SYSTOES ON DISK ; DW SYBUFR,0001,1 ;BOOT SECTOR DW DIRBFR,0003H,1 ;DIRECTORY DW CCPST,0102H,46 ;CP/M SYSTEM DW BIOSST,8004Heakpoints, ; console, printer, punch & reader I/O drivers and transfer to ; system boot ROM residing in same memory area as thot alterable, so didn't bother to check. ; Changed examine & change register table to reflect constant location ; for variablehelp command ; VERSN EQU '13' ; ;************************************************************* FORM FALSE EQU 0 TRUE EQU0 %+ &, !'- "(. #)/ $*0 NOT FALSE ;INCLUDE BB.DEF ;INCLUDE BBDISK.DEF LIST OFF *INCLUDE BB.DEF *INCLUDE BBDISK.DEF LIST ON ;==============OPB FUNCTION RETIOPB DS 3 ;RETURN IOPB PTR IN HL FUNCTION ;============================ ; ; MEMORY LOCATIONS ; ;====== CPLOC DS 1 ;C' BPLOC DS 1 ;B' EPLOC DS 1 ;E' DPLOC DS 1 ;D' LPLOC DS 1 ;L' HPLOC DS 1 ;H' ELOC DS 1 ;E DLOC DS 1 ;D CL^ ^________________ 0: ROM ENABLED, 1: RAM ENABLED ; |________________________________ INTERRUPTS 0: DISABLED$ >= (ROM - 128) CONMSG **** Variables run into disk buffer **** ENDIF DS ROM - 128 DBUFF DS 128 ;DISK I/O DATA BUFF POP HL LD SP,(ISPSAV) ENDM SUBTTL MAIN PROGRAM ORG ROM ;-------------------------------------- ; ; JUMP TARGETSST ;BREAKPOINT ENTRY LPSTAT: JP LSTAT ;RETURN LINE PRINTER STATUS IN A FUNCTION JP SETBACK ;SET & RETURN BACKGROUND VECTOROR LATER LD B,SPSV - MONVARS LD HL,MONVARS VINITL: LD (HL),0 INC HL DJNZ VINITL LD A,4 ;INIT TICK COUNT LD (TI============== ; ; COMPILE TIME VARS ; ;============================ ROM EQU 0F800H ;ROM START ADDR NBKPTS EQU 2 ;MAX NU====================== WSVEC EQU 0000H ;VECTOR NUMBER FOR WARM RESTART ;============================ ; ; CONSTANTS ; OC DS 1 ;C BLOC DS 1 ;B FLOC DS 1 ;FLAGS ALOC DS 1 ;A SLOC DS 2 ;SP ; ; BREAKPOINTS ; TLOC: REPT NBKPTS DS 2 ;BREAKP, 1: ENABLED ; RAMSTAT EQU 3 ;RAM ENABLED BIT INTSTAT EQU 7 ;INTERRUPTS ENABLED BIT ; TEMP DS 2 ;TEMPORARY STORAGE TICER SUBTTL MACROS ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; SAVE REGISTERS ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@ SAVE MACRO PUSH HL FOR BASIC I/O ; ;-------------------------------------- CBOOT JP CINIT - ROM ;COLD START CONIN JP CI ;RETURN CHAR FROM CON FUNCTION JP GETTICK ;RETURN TICK COUNT IN HL FUNCTION JP GETCLKP ;RETURN CLOCK ARRAY PTR IN HL FUNCTION ;-----------KCNT),A LD HL,0 ;INIT GOTO JUMP & HL REG IMAGE LD (LLOC),HL LD (PLOC),HL LD HL,USRSTK ;INIT SP REG LD (SLOC),HL MBER OF BREAKPOINTS ALLOWED OVLSIZ EQU 512 ;MAX SIZE OF OVERLAYS ;============================ ; ; I/O ROM ENTRY VECTORS ;============================ BELL EQU 7 LF EQU 0AH CR EQU 0DH CTRLS EQU 13H ;ASCII DC3 ;============================ OINT ADDRESS DS 1 ;BREAKPOINT DATA (INSTRUCTION REPLACED BY RST8) ENDM ; ; ALL THE FOLLOWING IS NOT INITIALIZED TO 0 ;KS DS 2 ;CLOCK TICKS ACCUMULATED TIKCNT DS 1 ;CLOCK SECONDS COUNT TOD DS 7 ;CLOCK ARRAY BYTC DS 2 ;CASSETTE BYTE COUNT B PUSH DE PUSH BC ENDM ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; RESTORE REGISTERS ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@ RESTORSOLE IN A FUNCTION JP SUDI ;SUDING FORMAT CASSETTE INPUT FUNCTION CONOUT JP CO ;OUTPUT CHAR IN C TO CONSOLE FUNCTION JP S--------------------------- ; ; THE COLD INITIALIZATION CODE ; ;-------------------------------------- INIT: DI LD A,DY ;-------------------------------------- ; ; INSERT I/O INIT CODE HERE ; ;-------------------------------------- LD HL,IO ; ;============================ ORG IOROM VIDINIT DS 3 ;VIDEO OUTPUT INITIALIZATION VIDOUT DS 3 ;OUTPUT CHAR IN C FUNCTION ; ; VARIABLE AREA ; ;============================ ORG ROM - 256 USRSTK EQU $ ;START OF USER STACK UPON GOTO MONVARS EQU SPSV DS 2 ;STACK PTR SAVE LOCATION ; ; INTERRUPT STACK ; DS 24 ISTACK EQU $ ISPSAV DS 2 ; ; I/O LOCAL STACK ; IOSTAYTSR DS 2 ;CASSETTE BYTES READ ; ; DISK IOPB ; IOPB: PBCMD DS 1 ;COMMAND BYTE PBDRV DS 1 ;DRIVE NUMBER BYTE PBTRK DS 2E MACRO POP BC ;RESTORE USER ENVIRONMENT POP DE POP HL ENDM ;@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; INTERRUPT SAVE ; ;UDO ;SUDING FORMAT CASSETTE OUTPUT FUNCTION LIST JP LO ;OUTPUT CHAR IN C TO LIST DEVICE FUNCTION CONST JP CSTS ;RETURN CONSSTAT + ON ;DISABLE ROMS, ENABLE RAM OUT (PORT0),A LD (MONSTAT),A ;INTERRUPTS = FALSE TOO LD SP,3FH ;USE STACK TO INIT RTABL ;INIT PROGRAMMABLE DEVICES INIT3 LD B,(HL) ;FETCH BYTE COUNT INC HL LD C,(HL) ;FETCH PORT # INC HL OTIR BIT 7, KBINIT DS 3 ;KEYBOARD INIT FUNCTION, LOW INTVEC IN C KBDIN DS 3 ;RETURN NEXT KEYBOARD CHAR IN A FUNCTION KBDST DS 3 ;RETURN  $ ;START OF MONITOR VARIABLE AREA STKTRAP DS 2 ;LOCATION FOR RS9 VECTOR UPON GOTO MONSTK EQU $ ;MONITOR STACK START ; CK EQU AUXMEM + 2048 ;PUT STACK IN AUX RAM SINCE AVAILABLE IOSPSAV DS 2 ;PUT STACK PTR HERE SO ACCESSIBLE FOR RETURN ; V ;TRACK WORD PBSEC DS 2 ;SECTOR WORD PBFLG DS 1 ;FLAG BYTE PBDMA DS 2 ;XFER ADDRESS START WORD PBDMAX DS 1 ;XFER ADDRESS EXT@@@@@@@@@@@@@@@@@@@@@@@@@@@ ISAVE MACRO LD (ISPSAV),SP LD SP,ISTACK PUSH HL PUSH DE PUSH BC PUSH AF ENDM ;@@OLE STATUS IN A FUNCTION JP SELRAM ;SELECT RAM FUNCTION JP CHKINT ;SET INTERRUPTS TO FLAG FUNCTION JP MEMCK ;RETURN MEMESTARTS LD HL,0C300H LD DE,RSTER LD B,16 ;64 BYTES INIT1: PUSH DE PUSH HL DJNZ INIT1 LD SP,MONSTK ;SET UP STACK (HL) ;IF COUNT > 127 THEN DONE JR Z,INIT3 LD C,CTCAV ;ENABLE KEYBOARD LD HL,KBINIT CALL CALLROM LD A,HIGH INTTBL0: NOT READY, FFH: CHAR WAITING IN A KBDINT DS 3 ;KEYBOARD INTERRUPT ROUTINE ; DKBOOTV DS 3 ;DISK BOOT XCUTE DS 3 ;EXECUTE I; REGISTER IMAGES ; RLOC DS 1 ;REFRESH ILOC DS 1 ;INTERRUPT YLOC DS 2 ;IY XLOC DS 2 ;IX FPLOC DS 1 ;FLAGS' APLOC DS 1 ;A'ALUE STORAGE AS WELL. ; ; MONITOR STATUS BITS ; MONSTAT DS 1 ; 7 0 ; |IES| 0 | 0 | 0 |RAS| 0 | 0 | 0 | ; ENDED (NOT USED) PBSTAT DS 1 ;STATUS RETURNED (0: NO ERRORS) DS PBCMD + IOPBSZ - $ ;SPARES TO FILL 16 BYTES OF IOPB IF @@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; INTERRUPT RESTORE ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@ IRESTORE MACRO POP AF POP BC POP DEORY LIMIT FUNCTION JP CALLROM ;CALL ROM VECTOR IN HL FUNCTION JP DISPATCH ;CALL INTERRUPT ROM VECTOR IN HL FUNCTION JP RE LD HL,USRMSG ;OUTPUT 'MEMORY= ' CALL PRTWD ; ; CONTINUATION OF THE SCS MONITOR ; LD (SPSV),SP ;SAVE STACK F ;INIT INTERRUPTS LD I,A LD (ILOC),A ;DEFAULT I REGISTER IM 2 LD HL,MONSTAT ;INTERRUPTS ON SET INTSTAT,(HL) EI L0 %+ &, !'- "(. #)/ $*0D HL,LOGMSG ;OUTPUT SIGN-ON CALL PRTWD ;---------------------------- ; ; THE WARM START CODE ; ;--------------------- ADD A,A ;COMPUTE OVERLAY ADDRESS LD E,A LD HL,0800H ;2ND HALF OF 4K EPROM ADD HL,DE PUSH BC DI ;NO INTERRUPTS W++++++++++++++++++++++++++++++++++++++++ MEMCK: LD A,LOW (MONVARS - 60) LD B,HIGH (MONVARS - 60) RET ;++++++++++++++++NTRY SEQUENCE & ; CAUSE A WARM BOOT OF THE MONITOR. ; ENTRY- B= # OF PARAMETERS NEEDED ; EXIT - STACK= PARAMETERS ; ;+++++******** ; ; OUTPUT QUERY MESSAGE ; ;**************************** QPRT: LD HL,QMSG ;OUTPUT ? MESSAGE JP PRTWD SUBT+ DECHO: CALL DASH ;OUTPUT A '-' ECHO: CALL CONI ECH1: PUSH BC LD C,A ;OUTPUT CHAR CALL CONOUT LD A,C ;RESTORE C: INC HL LD A,H ;IF HL = 0 THEN RETURN CF OR L SCF RET Z LD A,E ;ELSE COMPARE HL TO DE SUB L LD A,D SBC A,H ++++++++++++++++++++++++++++++++++ ; ; NIBBLE ROUTINE CONVERTS THE ASCII CHARACTERS 0-9 & A-F ; TO THEIR EQUIVALENT HEX VALU------- WINIT: LD SP,(SPSV) ;RESTORE THE STACK WINITA: LD HL,WINIT ;PUT RETURN ADDRESS ON STACK PUSH HL LD (WSVEC + 1)HILE ACCESSING ROM XOR A,A ;ENABLE ROM OUT (PORT0),A LD A,(HL) ;FETCH PTR TO OVERLAY INC HL LD H,(HL) LD L,A ++++++++++++++++++++++ ; ; EXF SUBR. READS 1 PARAMETER. ; ENTRY- A= PARAMETER 1ST CHAR ; EXIT - STACK= PARAMETER ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ EX3: JR NZ,QPRT ;NON 0 IS ERR EXPR1: DEC B ;IF NO PARAMS TTL GENERAL PURPOSE SUBROUTINES ;*************************************************************** ; ; CONV ROUTINE CONVERTS THEHAR IN A POP BC RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXPR3 ROUTINE GETS 3 PARAMET RET ;********************************************************** ; ; HILOX ROUTINE INCREMENTS HL, COMPARES IT TO DE & IFE. IF THE CHARACTER IS NOT IN ; RANGE, THE CARRY BIT IS SET TO FLAG THE ERR. ; ;++++++++++++++++++++++++++++++++++++++++++++,HL ;RETURN HERE IF REBOOT LD A,0C3H LD (WSVEC),A CALL CRLF ;NEW LINE CALL DECHO ;GET COMMAND SUB 'A' ;IF CHAR <> LD DE,OVERLAY ;DEST = OVERLAY AREA LD BC,OVLSIZ LDIR ;MOVE OVERLAY TO BUFFER POP BC LD A,DYSTAT + ON ;TURN OFF ROM ++++++++++++++++++++++++++++++++ EXF: LD B,1 ;SET 1 PARAM LD HL,0 JR EX1 ;1ST CHAR IN A ALREADY ;+++++++++++++++++++HEN RETURN RET Z EXPR: LD HL,0 ;PARAM = 0 EX0: CALL ECHO ;GET NEXT # EX1: LD C,A ;SAVE CHAR FOR LATER CALL NIBBL LOW ORDER NIBBLE OF THE ; ACCUMULATOR TO ITS ASCII EQUIVALENT. ; EXIT - C= 'N' ; ;****************************************ERS, THEN DOES A CR-LF ; EXIT - DE= P1 ; BC= P2 ; HL= P3 ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; EQUAL, RETURNS CONTROL TO THE MONITOR EXEC. OTHERWISE, ; CONTROL RETURNS TO THE CALLING ROUTINE. ; ;*******************+++++++++++++++++++ NIBBLE: SUB '0' RET C CP 'G' - '0' CCF RET C CP '9' - '0' + 1 CCF RET NC SUB 'A' - '9 'A' -> 'F' THEN ERR JP C,QPRT CP 'Z' - 'A' + 1 JR NC,QPRT LD B,2 ;PASS IN 2 PARAMS TO HANDLER LD E,A ;SET UP  OUT (PORT0),A EI LD A,(OVERLAY) ;IF OVERLAY CORRECT THEN EXECUTE IT CP C JP Z,OVERLAY + 1 LD HL,OVLERRM ;ELSE ER+++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXPR SUBR. READS PARAMETERS FROM THE CONSOLE & DEVELOPS A 16 ; BIT HEX E JR C,EX2 ;IF NOT NUMBER THEN EXIT ADD HL,HL ;PARAM = PARAM * 16 ADD HL,HL ADD HL,HL ADD HL,HL OR L ;ADD IN NE*********************** CONV: AND 0FH ADD A,90H ;PUT INTO ASCII ZONE DAA ;AH, THE UBIQUITOUS DAA CONVERT ADC A,40H D++ EXPR3: INC B ;B HAS 2 ALREADY CALL EXPR POP BC POP DE JP CRLFA ;GO DO CRLF ;+++++++++++++++++++++++++++++++++*************************************** HILOD: POP DE ;GET RID OF RETURN ADDR RET ;RETURN TO MONITOR HILOXB: INC BC ' - 1 CP 10 RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; PCHK ROUTINE READS A CHARACTER FFOR TABLE LOOKUP LD D,0 LD HL,TBL ;OVERLAY_# = (TABLE + OFFSET) ADD HL,DE LD A,(HL) INC A ;IF -1 THEN UNSUPPORTED ROR JP PRTWA ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; MEMCHK FUNCTION RETURNS THE TOP OF AVAILABVALUE FOR EACH ONE. ; A CARRIAGE RETURN WILL TERMINATE THE ENTRY SEQUENCE. ; A BLANK OR COMMA WILL END THE CURRENT PARAMETER EW DIGIT LD L,A JR EX0 ;GET NEXT ; EX2: EX (SP),HL ;PUT UNDER RETURN ADDR ON STACK PUSH HL LD A,C ;IF LAST CHAR = DEAA LD C,A RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; ECHO ROUTINE READS A BYTE FROM CON++++++++++++++++++++++++++++++ ; ; HILO ROUTINE INCREMENTS HL. IT THEN CHECKS FOR (& ; DISALLOWS) A WRAP-AROUND SITUATION.  HILOX: CALL HILO JR C,HILOD ;DONE IF CF CALL CONST ;IF NO CONSOLE BREAK THEN OR A ; RETURN RET Z CALL CONI ROM THE CONSOLE, THEN ; CHECKS IT FOR A DELIMITER. IF IT IS NOT A DELIMITER, A NON- ; ZERO CONDITION IS RETURNED. IF IT IS ACOMMAND JR Z,QPRT DEC A LD C,A LD HL,OVERLAY ;IF OVERLAY ALREADY INSTALLED THEN EXIT CP (HL) JP Z,OVERLAY + 1 LE ; MEMORY (LESS 60 BYTES FOR THE MONITOR STACK) ; EXIT - B= HIGH BYTE OF RAM ; A= LOW BYTE OF RAM ; ;++++++++++++++++++NTRY. ; EACH PARAMETER ONLY TAKES THE LAST 4 DIGITS TYPED IN, ANY EXCESS IS ; DISCARDED. A NON-HEX DIGIT WILL TERMINATE THE ELIM THEN EXIT CALL P2C JR NC,EX3 DJNZ QPRT ;ELSE IF MORE REQ'D THEN ERR RET ;ELSE RETURN ;********************SOLE DEVICE & ECHOS ; THE CHAR BACK TO THE CONSOLE DEVICE. ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++; EXIT - CF= HL + 1 == 0 (WRAP AROUND) ; F= HL - DE ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ HILO;IF CHAR <> CTRL-S THEN BREAK CP CTRLS JR NZ,HILOD JP CONI ;ELSE WAIT FOR NEXT CHAR ;+++++++++++++++++++++++++++++ DELIMITER, A ZERO ; CONDITION IS RETURNED. FURTHER, IF THE DELIMITER IS A CR, ; THE CARRY FLAG IS SET. A BLANK OR A COMMA R0 %+ &, !'- "(. #)/ $*0ESETS THE CARRY ; FLAG. ; EXIT - Z CF ; 1 0 : DELIMITER ; 1 1 : CR ; 0 0 : CHARACTER ; 0 1 : NEVER RETURNED *********** REST: DI ;INSERT INTERRUPT DISABLE HERE PUSH HL ;SAVE ALL REGS PUSH DE PUSH BC PUSH AF LD DE,SLOC + 2 ;MAYBE, TRY REST OF ADDR JR Z,RS5 ;FOUND 1, RESET IT RS3: INC HL ;NOT FOUND, TRY NEXT 1 INC HL DEC D JR NZ,RS2 ; HL ;DO NEXT BP DJNZ RS7 ; ; BREAKPOINTS REMOVED, SAVE REMAINING REGS ; LD SP,HPLOC + 1 EX AF,AF' ;NOW SAVE THE Z80 UOP BC POP AF POP HL LD SP,HL LLOC EQU $ + 1 HLOC EQU $ + 2 LD HL,0 GIE EI ;ENABLE INTERRUPTS ON EXECUTION HERE PLOBLE POINTER LD E,(HL) INC HL LD A,(HL) ;GET OFFSET & ATTRIBUTES FROM HIGH BYTE OR HIGH (ROM AND 0F000H) LD D,A ORS ARE DETECTED: A RESTART ERROR; ; & CERTAIN PROGRAM ERRORS (DETERMINED BY ; PARTICULAR ROUTINE WHERE THE ERROR CONDITION ; ;******************************************************************** CONI: CALL CI AND 7FH RTS: RET ;*********** ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ PCHK: CALL ECHO P2C: CP ' ' ;IF CHAR = ' ' THEN RETURN;SET UP PTR TO REGISTER IMAGES LD HL,10 ;GO UP 10 BYTES IN STACK TO RETURN ADDRESS ADD HL,SP ;COMPUTE SP AT TIME OF BREAKP; UNSET BREAKPOINT ENCOUNTERED ; INC BC ;NONE FOUND ; ; BREAKPOINT FOUND IN TABLE ; RS5: PUSH BC ;BREAK ADDR LDNIQUES EXX PUSH HL PUSH DE PUSH BC PUSH AF PUSH IX PUSH IY LD A,I LD B,A LD A,R LD C,A PUSH BC LD A,C EQU $ + 1 JP 0 ;************************************** ; ; NO ARGS, DISPLAY ALL REGS SUBR ; ENTRY- HL= REGISTER TABLD A,(HL) ;NOW FIND ATTRIBUTES LD B,1 ;SINGLE REG VALUE RLCA JR NC,PV1 ;IF SINGLE REG THEN EXIT INC B ;ELSE REG PA WAS ENCOUNTERED) ; EACH CAUSES A UNIQUE MESSAGE TO BE PRINTED, THEN DOES A WARM ; INIT OF THE MONITOR. ; ;--------------**************************************************** ; ; PRTWD ROUTINE OUTPUTS AN ASCII STRING ONTO THE CONSOLE. ; THE STRIN RET Z CP ',' ;IF CHAR = ',' THEN RETURN RET Z CP CR ;IF CHAR = CR THEN RETURN CF SCF RET Z CCF ;ELSE REOINT LD B,4 ;DO SP..DE EX DE,HL ;BPSP -> DE, .SP_REG -> HL RS1: DEC HL LD (HL),D ;SAVE REGS IN WORK AREA [SP,AF,BC,D C,'*' ;OUTPUT BREAK INDICATION CALL CONOUT POP HL ;BP LOCATION LD A,HIGH RS9 ;IF A RETURN BREAK THEN SKIP OUTPUT CPHIGH INTTBL ;RESTORE INTERRUPT VECTORS LD I,A IM 2 EI LD HL,ACTBL ;DISPLAY REGS CALL XG JP WINIT ;RETURN TO MONITLE PTR ; ;************************************** XG: LD A,(HL) LD C,A INC A ;IF AT END OF TABLE THEN RETURN RET Z IR INC DE ;DO HIGH BYTE 1ST RLCA ;IF NOT (HL) THEN EXIT JR NC,PV1 ; ; INDIRECT, GET VALUE OF PTR TO VALUE ; PUSH ------------------------------------------------- ;------------------------------------------- ; ; UNINITIALIZED RESTART ERROG MUST BE TERMINATED BY BIT 7 SET IN THE LAST CHAR ; OF THE STRING. THE STRING WILL START A NEW LNE (PRTWD) OR ; CONTINUE ONTURN NC RET ;*************************************************************** ; ; REST ROUTINE TRAPS ALL OF THE REGISTERE] DEC HL LD (HL),E POP DE ;NEXT REG DJNZ RS1 ;FALLS OUT WITH HL REG VALUE IN DE LD (LLOC),DE ;SAVE HL VALUE P H JR Z,RS6 LD (PLOC),HL ;SAVE FOR GOTO CALL LADR ;OUTPUT BP ADDRESS ; ; REMOVE BREAKPOINTS ; RS6: LD HL,TLOC LDOR ; ; IF GOTO EXECUTION ADDRESS IS A SUBROUTINE THEN EXECUTION MAY ; RETURN HERE ; RS9: PUSH HL RST 8 ;FORCE BP ;CALL M,CRLF ;NEW LINE IF BIT 7 SET CALL CONOUT CALL DASH CALL PRTVAL CALL BLK INC HL ;NEXT ENTRY JR XG ;*****HL ;BUILD ADDR IN HL LD A,(DE) LD H,A DEC DE LD A,(DE) LD L,A LD A,(HL) ;GET (HL) VALUE POP HL DJNZ PV2 ;ALLWR HANDLER ; ;------------------------------------------- RSTER: LD HL,RSTMSG ;--------------------------------- ; ; CO THE SAME LINE (PRTWA). ; ;*************************************************************** PRTWD: CALL CRLF PRTWA: PUSH BC CONTENTS ; WHENEVER A RESTART 1 INSTRUCTION IS EXECUTED. THE TRAPPED ; CONTENTS ARE STORED IN THE SYSTEM STACK AREA FOR LATOP BC ;GET BREAKPOINT LOCATION + 1 DEC BC ;BACK UP TO RESTART INSTRUCTION LD SP,MONSTK ;SET THE MONITOR STACK ; ; CHE BC,NBKPTS * 256 RS7: LD E,(HL) ;FETCH BP ADDR IN DE LD (HL),C ;NULL BP ADDRESS INC HL LD D,(HL) LD (HL),C INC HL ; THE GOTO ROUTINE USES THE EXIT ROUTINE TO SET CPU REGISTERS TO THE ; REGISTER VALUES & EXECUTES THE GOTO ADDRESS ; EXIT:******************************************* ; ; PRINT REGISTER VALUE SUBR ; ENTRY- HL= TABLE PTR TO CHAR ; EXIT - DE= PTR TOAYS JUMP PV1: LD A,(DE) ;GET REG CONTENTS PV2: CALL HEX1 ;OUTPUT VALUE DEC DE ;MEM PTR DJNZ PV1 INC DE ;REPOINMMON ERROR HANDLER ; ENTRY- HL= MESSAGE PTR ; ;--------------------------------- COMERR: CALL PRTWD JP WSVEC ;******* PRTA: LD C,(HL) RES 7,C ;MAKE SURE BIT 7 = 0 CALL CO BIT 7,(HL) ;IF BIT 7 = 1 THEN STOP INC HL JR Z,PRTA PRTBER ACCESS ; AND USE BY THE GOTO & THE EXAMINE REGISTERS COMMANDS. ; ; ;****************************************************CK FOR BREAKPOINTS ; LD D,NBKPTS LD HL,TLOC RS2: LD A,(HL) SUB C ;SEE IF SOFTWARE TRAP INC HL LD A,(HL) SBC A,B  LD A,E ;IF LOC = 0 THEN SKIP RESTORE OR D JR Z,RS8 LD A,(HL) ;ELSE RESTORE ORIGINAL INSTR. LD (DE),A RS8: INC  POP BC LD A,C LD R,A LD A,B LD I,A POP IY POP IX POP AF POP BC POP DE POP HL EX AF,AF' EXX POP DE P REG VALUE LOW BYTE ; HL= PTR TO ATTRIB. BYTE ; ;************************************************ PRTVAL: INC HL ;FETCH TAT TO LOW BYTE OF REGISTER VALUE RET ;--------------------------------------------------------------- ; ; 2 TYPES OF ERR************************************************************* ; ; CONI ROUTINE READS THE CONSOLE & STRIPS OFF THE PARITY BIT. : POP BC RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXLF ROUTINE READS 2 PARAMETERS, PUTS0 %+ &, !'- "(. #)/ $*0 THEM INTO THE DE ; & HL REGS, THEN DOES A CR-LF. ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ EXLF:  CALL HEX1 LD A,L HEX1: PUSH AF RRCA RRCA RRCA RRCA CALL HEX2 POP AF HEX2: CALL CONV JP CO ;********ILE SWAPPING STACKS ; DI ; ; SAVE THIS STACK ; LD (IOSPSAV),SP ;SAVE THIS STACK ; ; SELECT ROM ; LD A,(MONSTAT)WAPPING ENVIRONMENT ; ; RESTORE CALLER'S STACK ; LD SP,(IOSPSAV) ; ; FALL THROUGH TO SELECTING RAM ; ;*********ABLED THEN LD A,(IOSPSAV) ; RESTORE RETURN VALUE RET Z ; RETURN ; EI ;ELSE ENABLE INTERRUPTS RET ;********* SETBACK: LD A,00000001B ;DISABLE INTERRUPT WHILE CHANGING VECTOR OUT (CTCB2),A PUSH DE LD DE,(MSVEC) LD (MSVEC),HL  ; CLOCK 250MS INTERRUPT HANDLER ; ;************************************** TIMER: ISAVE PUSH HL ;HL TOO LD HL,(TICKS) LD (DE),A ;STORE NEW VALUE RET C ;IF NO ROLLOVER THEN RETURN INC HL ;ELSE NEXT ARRAY INC DE DJNZ CLOCK2 ;IF NOT DCALL EXPR POP DE POP HL ;*************************************************************** ; ; CRLF ROUTINE OUTPUTS A C************************************************** ; ; DASH ROUTINE OUTPUTS A '-' TO THE CONSOLE DEVICE ; ;***************** ;TELL INTERRUPT ROUTINES WE'RE IN ROM RES RAMSTAT,A LD (MONSTAT),A ; XOR A,A ;DISABLE RAM, ENABLE ROMS & STACK OUT (P******************* ; ; SELECT RAM SUBROUTINE ; (NEEDED FOR BOOTED ROUTINE) ; ;**************************** SELRAM: ; ********************************** ; ; DISPATCH TO ROM INTERRUPT VECTOR SUBR ; ENTRY- HL= VECTOR ; ;********************* INC HL ;IF VECTOR != -1 THEN LD A,L OR H JR Z,SETBAK1 LD A,10000001B ; ENABLE INTERRUPT OUT (CTCB2),A SETBAK1 ;BUMP FREE RUNNING CLOCK TICK COUNT INC HL LD (TICKS),HL LD HL,TIKCNT ;IF --TICK_CNT == 0 THEN DEC (HL) JR NZ,TIMERONE THEN REPEAT RET ;ELSE RETURN TODTAB: DB 60H ;SECONDS PER MINUTE DB 60H ;MINUTES PER HOUR DB 24H ;HOURS PER DAY R-LF ON THE CONSOLE DEVICE TO ; START A NEW LINE. ; ;*************************************************************** CRLF: ***************************************** DASH1: CALL HEX1 ;OUTPUT A AS HEX DASH: LD C,'-' JP CO ;******************ORT0),A ; ; SET UP NEW STACK ; LD SP,IOSTACK ; ; NOW ABLE TO INTERRUPT AGAIN ; CALL CHKINT ; ; SAVE ENVIRONMEN; SAVE POSSIBLE RETURN VALUE ; LD (IOSPSAV),A ;SAVE RETURN VALUE ; ; SELECT RAM ; LD A,(MONSTAT) ;DO INTERRUPT ROUTI********************** DISPATCH: ISAVE XOR A,A ;SELECT ROM OUT (PORT0),A PUSH HL ;SAVE VECTOR LD HL,DISPATR ;PUT : EX DE,HL POP DE RET ;************************************** ; ; MILLISECOND INTERRUPT HANDLER ; USES 2 STACK W2 LD A,4 ; RESET TICK_CNT TO 4 (1 SECOND) LD (HL),A CALL CLOCK ; DO CLOCK TIMEKEEPING TIMER2: POP HL IRESTORDB 99H ;OVERFLOW FROM DAYS ;++++++++++++++++++++++++++++++++++++++ ; ; RETURN CLOCK TICK COUNT FUNCTION ; EXIT - HL= TPUSH HL CRLFA: LD HL,CRMSG CALL PRTWA POP HL RET ;*************************************************************** ***** ; ; PRINT ADDR SUBR ; ;*********************** LADRB: CALL LADRA BLK: LD C,' ' ;OUTPUT A SPACE JP CO ;******T ; PUSH DE PUSH BC PUSH HL ;VECTOR -> STACK ; ; EXECUTE ROM VECTOR ; LD HL,ROMRET ;PUT RET ADDRESS ON STACK & FENE 1ST SET RAMSTAT,A LD (MONSTAT),A LD A,DYSTAT + ON OUT (PORT0),A ;******************************************* ; RETURN ADDRESS ON STACK EX (SP),HL JP (HL) ;EXECUTE VECTOR DISPATR: LD A,(MONSTAT) ;IF ROM INTERRUPTED THEN SKIP RAM SELORDS ; ;************************************** MSVEC DW -1 ;INITIAL VECTOR = NONE MILISEC: PUSH HL PUSH AF LD HL,(ME EI RETI ;**************************** ; ; CLOCK TIME KEEPER ; ;**************************** CLOCK: LD DE,TOD ICK COUNT ; ;++++++++++++++++++++++++++++++++++++++ GETTICK: LD HL,(TICKS) RET ;++++++++++++++++++++++++++++++++++++ ; ; LADR ROUTINE OUTPUTS THE CONTENTS OF HL ON THE CONSOLE ; EITHER AT THE START OF A NEW LINE (LADRA) OR AT THE CURRENT ; ************************************* ; ; ROM CALLER ; ROM CODE MUST HANDLE INTERRUPT ENABLES ; ENTRY- HL= ROM VECTOR ADDRTCH VECTOR EX (SP),HL JP (HL) ;EXECUTE ROM CODE ; ; ROM RETURNS HERE ; ROMRET: ; ; RESTORE CALLER'S ENVIRONMENT  ; SELECTIVELY ENABLE INTERRUPTS FUNCTION ; EXIT - ZF= INTERRUPTS DISABLED ; NZ= INTERRUPTS ENABLED ; A= (IOSPSAV) ; ;*ECT OUT (PORT0),A IRESTORE RET SUBTTL CLOCK ROUTINES ;++++++++++++++++++++++++++++++++++++++ ; ; SET BACKGROUNDSVEC) ;IF VECTOR == -1 THEN INC HL LD A,L OR H DEC HL JR NZ,DOMSVEC POP AF ; IGNORE INTERRUPT POP HL JR MSR;POINT TO TIME OF DAY ARRAY LD HL,TODTAB ;MAX COUNT TABLE LD B,4 ;ELEMENT COUNT CLOCK2: LD A,(DE) ;INCREMENT TIME WITH AD++ ; ; RETURN CLOCK ARRAY PTR FUNCTION ; EXIT - HL= ARRAY PTR ; ;++++++++++++++++++++++++++++++++++++++ GETCLKP: LD HL CURSOR LOCATION (LADR). ; ;*************************************************************** LADRA: CALL CRLF LADR: LD A,H ESS ; EXIT - AF, HL= RETURN VALUES (?) ; ;******************************************* CALLROM: ; ; DISABLE INTERRUPTS WH; POP BC ;RESTORE ENVIRONMENT POP DE ; ; NO INTERRUPTS WHILE SWAPPING STACKS ; DI ;DISABLE INTERRUPTS WHILE S****************************************** CHKINT: DI ;ASSUME DISABLED LD A,(MONSTAT) BIT INTSTAT,A ;IF INTERRUPTS NOT EN TASK VECTOR FUNCTION ; ENTRY- HL= VECTOR (-1= NONE) ; EXIT - HL= VECTOR ON ENTRY ; ;++++++++++++++++++++++++++++++++++++++ ET DOMSVEC: POP AF CALL DISPATCH ;EXECUTE VECTOR POP HL MSRET: EI RETI ;************************************** ;D INSTRUCTION ADD A,1 DAA ;CONVERT TO BCD CP (HL) ;IF ROLLOVER THEN JR C,CLOCK3 XOR A ;THIS ARRAY = 0 CLOCK3:,TOD RET SUBTTL MESSAGES LOGMSG: DB 'DGMON V ',HIGH VERSN,'.',LOW VERSN CRMSG: DM CR,LF USRMSG: DB 'MEMORY = ' DB (MO0 %+ &, !'- "(. #)/ $*0NVARS / 10000) + '0', ((MONVARS MOD 10000) / 1000) + '0' DM 'K',CR,LF QMSG: DM '????' RSTMSG: DM 'RST ERR' OVLERRM DM CR,LF**************** ; ; LIST DEVICE ; ;************************************** LO: ;OUTPUT CHAR IN C TO LINE PRINTER CALL static unsigned bytsr, bytc; ;unsigned casi(count, staddr) unsigned count; char *staddr;{ ; return bytsr; ; } ; ENTRY- (SPLD C,3 ;WAIT 1.5 BITS BEFORE TESTING CALL DELAY NXTBIT: IN A,(IOSTAT) ;GET DATUM AND 1 SHL CASDATI RLCA ;PUT IN BIT T2VAR: LD HL,4 ;FETCH PARAMETERS ADD HL,SP LD E,(HL) ;FETCH START ADDRESS INC HL LD D,(HL) INC HL PUSH DE ENTRY- (SP+2)= START ADDRESS PTR ; (SP+4)= BYTES TO WRITE COUNT ; ;*********************************************************C) ;IF --BYTE_COUNT != 0 THEN LOOP DEC DE LD (BYTC),DE LD A,E OR D JR NZ,WMORE CALL LEADER ;ELSE WRITE TRAILER M'. ;MOVES TO HIGH MEMORY, CHANGES COLD START VECTOR TO WARM START, THEN ;EXECUTES WARM START. ; ;!!!!!!!!!!!!!!!!!!!!!!!!!!,'OVERLAY ERR' SUBTTL PRIMITIVE I/O DRIVERS ;************************************** ; ; CONSOLE DEVICE ; ;***********LSTAT ;IF BUSY THEN WAIT JR Z,LO LD A,CENTDST + ON ;INSURE STROBE IS FALSE (HIGH) OUT (IOSTBS),A LD A,C ;FETCH & OUT+2)= LOAD START ADDRESS PTR ; (SP+4)= BYTE COUNT (0: ENTIRE FILE) ; ;*******************************************************0 RLCA ADD D ;ADD TO PREVIOUS BITS RRCA LD D,A LD C,2 ;WAIT FOR 1 BIT CELL CALL DELAY DEC E ;BIT_COUNT-- LD E,(HL) ;FETCH COUNT INC HL LD D,(HL) LD (BYTC),DE POP HL ;P1 RET ;************************************** ***************** SUDO: CALL GET2VAR ;FETCH PARAMETERS FROM STACK CALL LEADER ;WRITE LEADER WMORE: LD E,9 ;BIT COUNT & RETURN XOR A RET ;**************************** ; ; WRITE LEADER SUBR ; EXIT - BC, D= 0 ; ;********************!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! OVERLAY: ;OVERLAY GETS LOADED IN HERE DB -2 ;DUMMY OVERLAY # FORCES 1ST LO*************************** CI: ;RETURN NEXT AVAILABLE CHAR IN A PUSH HL LD HL,KBDIN CALL CALLROM POP HL RET CO:PUT DATA OUT (CENTOUT),A LD A,CENTDST + OFF ;OUTPUT DATA STROBE OUT (IOSTBS),A LD A,CENTDST + ON ;TURN OFF DATA STROBE ******************* SUDI: CALL GET2VAR ;FETCH PARAMETERS FROM STACK PUSH HL LD HL,0 ;BYTES_READ = 0 LD (BYTSR),HL JP NZ,NXTBIT LD (HL),D ;STORE IN MEMORY LD DE,(BYTSR) ;BYTES_READ++ INC DE LD (BYTSR),DE INC HL ;MEM_PTR++ ; ; DELAY SUBR DETERMINES BAUD RATE ; ENTRY- C= NUMBER OF 436US ; EXIT - BC= 0 ; ;************************************** + 1 XOR A,A ;CLEAR CARRY LD A,(HL) ;GET BYTE RLA ;START BY WRITING START BIT (0) WNXTBT: PUSH AF ;SAVE AND 1 ******** LEADER: LD C,0 ;5.4 SEC LD D,48 LEADLP: CALL DELAY DEC D JR NZ,LEADLP RET IF ($ >= (0FF00H - OVLSIZ)) AD CINIT: LD HL,AUXMEM ;TEST AUXILIARY RAM FOR STACK LOCATION LD BC,2048 LD SP,XRAMDON - ROM - 2 ;DUMMY STACK FOR NOW J ;OUTPUT CHAR IN C TO CONSOLE PUSH HL LD HL,VIDOUT CALL CALLROM POP HL RET CSTS: ;RETURN CONSOLE STATUS IN A (0 OUT (IOSTBS),A RET LSTAT: ;RETURN LINE PRINTER STATUS IN A (0:BUSY, -1:NOT) IN A,(IOSTAT) ;FETCH I/O STATUS CPL ;R POP HL ;START ADDRESS SKLEAD: IN A,(IOSTAT) ;WAIT FOR END OF LEADER AND 1 SHL CASDATI JR NZ,SKLEAD MORE: LD B,0 ;TI LD DE,(BYTC) ;IF --BYTE_COUNT == 0 THEN DONE DEC DE LD A,E OR D LD (BYTC),DE JR NZ,MORE SRDONE: LD HL,(BYTSR) ;RET DELAY: LD B,122 ;DELAY CONSTANT (76 FOR 2.5 MHZ) DELOOP: DEC B JP NZ,DELOOP DEC C ;IF --MULTIPLIER != 0 THEN LOOP JP;OUTPUT BIT RLCA ;SHIFT DATA TO BIT 3 FOR ADDRESSABLE LATCH RLCA RLCA ADD A,CASDATO OUT (IOSTBS),A POP AF ;RESTOR ($ <= 7FFFH) CONMSG **** Error - Code Collides With Overlay area (Too Big) **** ENDIF SUBTTL OVERLAY AREA ORG 0FF00P RAMTST - ROM DW XRAMDON - ROM XRAMDON: JR Z,AUXOK LD SP,STOP - ROM - 2 ;BEEP BUZZER JP BEEP - ROM DW STOP - ROM : NOT READY, -1: READY) PUSH HL LD HL,KBDST ;IF NOT CHAR NOT READY THEN RETURN 0 CALL CALLROM POP HL RET ; ; KEYBEVERSE SENSE AND A,1 SHL CENTBSY ;IF BUSY THEN RETURN 0 RET Z LD A,-1 ;ELSE RETURN -1 RET ;***********************MOUT = 256 TIMOUT: INC B JR Z,SRDONE ;TIMED OUT, NO MORE DATA IN A,(IOSTAT) ;IF DATUM == MARK THEN LOOP AND 1 SHL CASURN BYTES_READ LD A,L ;SET FLAGS TO RETURN VALUE OR H RET ;************************************** ; ; FETCH 2 PA NZ,DELAY RET ;************************************************************************** ; ; SUDING CASSETTE WRITE ; ORE DATA LD C,2 ;HOLD FOR 1 BIT CELL CALL DELAY RRA ;NEXT BIT DEC E ;IF --BIT_COUNT != 0 THEN LOOP JP NZ,WNXTBH - OVLSIZ ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ; ; OVERLAY BUFFER HAS COLD START CODSTOP: JR $ AUXOK: LD SP,AUXMEM + 2048 ;USE AUXILLIARY RAM FOR STACK LD HL,CHRMEM ;TEST CHARACTER RAM LD BC,2048 CALL OARD INTERRUPT ROUTINE ; KEYSRV: PUSH HL LD HL,KBDINT CALL DISPATCH POP HL IRET: EI RETI ;************************************************************************* ; ; SUDING CASSETTE READ ; IMPLEMENTED AS A 'C' FUNCTION AS FOLLOWS: ;DATI JP NZ,TIMOUT LD DE,8 ;SET BIT COUNT WTSTRT: IN A,(IOSTAT) ;WAIT FOR SPACE AND 1 SHL CASDATI JP NZ,WTSTRT RAMETERS FROM STACK SUBR ; ENTRY- (SP+4)= P1 ; (SP+6)= COUNT ; EXIT - HL= P1 ; ;************************************** GE IMPLEMENTED LIKE A 'C' FUNCTION AS: ;static unsigned bytc; ;caso(count, staddr) unsigned count; char *staddr;{ ; } ; ; T LD A,CASDATO + ON ;ELSE WRITE 2 STOP BITS (1) OUT (IOSTBS),A LD C,4 CALL DELAY INC HL ;MEM_PTR++ LD DE,(BYTE ON RESET ;EXECUTES DIAGNOSTICS UPON COLD RESET FROM PAGE 0 OF ROM, ALL ABSOLUTE ;REFERENCES MUST BE REFERENCED BY 'NAME - RORAMTST - ROM JR Z,CHROK LD B,2 ;2 BEEPS = VIDEO CHARACTER RAM ERROR CALL BEEPS - ROM CHROK: LD HL,ATTMEM ;TEST ATTRI0 %+ &, !'- "(. #)/ $*0BUTE MEMORY LD BC,2048 CALL RAMTST - ROM JR Z,ATTOK LD B,3 CALL BEEPS - ROM ATTOK: LD A,(VIDINIT) ;IF I/O ROM NOTUSH HL ;SAVE RAM FAILURE ADDRESS LD HL,RAMMSG - ROM CALL POUT - ROM POP HL ;ADDRESS CALL OUTW - ROM JR $ ;FATAL ERROM COLD TO WARM START LD (ROM + 1),HL JP ROM MONERR: PUSH HL ;OUTPUT ERROR ADDRESS PUSH DE PUSH HL LD HL,MONERM C A JR NZ,BEEP3 RET ;************************************** ; ; PRIMITIVE OUTPUT SUBR ; ENTRY- HL= TXT PTR (>127************** ; ; NON DESTRUCTIVE RAM TEST SUBR ; ENTRY- HL= RAM PTR ; BC= COUNT ; EXIT - ZF= OK, NZ= BAD RAM ; HL= BVIDOUT ;**************************** ; ; OUTPUT HEX BYTE SUBR ; ENTRY- A= BYTE ; ;**************************** OUTBF00H ;###################################### ; ; INTERRUPT VECTOR TABLE ; ;###################################### INTTBL: ********************************************** ; ; TBL CONTAINS THE OVERLAY NUMBERS OF THE COMMANDS. ; THE EXECUTIVE USES IT  THERE THEN ERROR CP 0C3H JR Z,IOROMOK LD B,4 CALL BEEPS - ROM JR $ IOROMOK: CALL VIDINIT ;INIT VIDEO OUTPUT OR, GO NO FURTHER URAMOK: LD SP,0 ;TEST UPPER RAM CALL TSTLOW - ROM JR NZ,RAMERR LD C,BELL ;ANNOUNCE FINISH CALL - ROM CALL POUT - ROM POP HL CALL OUTW - ROM CALL OUTSPC - ROM POP DE POP HL LD A,(DE) XOR (HL) CALL OUTBH - R=LAST) ; ;************************************** POUT: LD C,(HL) PUSH HL RES 7,C CALL VIDOUT POP HL BIT 7,(HL) ;IFAD RAM PTR ; ;************************************** RAMTST: LD A,(HL) ;FETCH BYTE CPL ;COMPLEMENT IT LD (HL),A ;STORH: CALL OUTB - ROM JR OUTH OUTB: CALL PRDIG - ROM PRDIG: RLCA ;START WITH UPPER NIBBLE RLCA RLCA RLCA PUSH AF ; DW IRET ;SIOB TX DW IRET ;SIOB EXTERNAL/STATUS DW IRET ;SIOB RX DW IRET ;SIOB SPECIAL RX CONDITION DW IRET ;SIOA TX TO LOOK UP THE DESIRED OVERLAY. ; ;********************************************************** TBL: DB -1 ;A DB BOOTCO ;Bo IN A,(SENSE) ;IF SW1 SET THEN FILL DISPLAY WITH CHARS BIT SW1,A JR NZ,NOCHRS ; ; FILL SCREEN WITH INCREMENTING CHARS VIDOUT IN A,(SENSE) ;IF SW1 SET THEN CONTINUOUS DIAGNOSTIC BIT SW1,A JP Z,0 ; ; DIAGNOSTICS OVER, MOVE MONITOR TO OM JR $ ;************************************** ; ; BEEP SUBR ; ;************************************** BEEPS: PUS CHAR > 127 THEN DONE RET NZ INC HL JR POUT ;************************************** ; ; TEST LOW RAM SUBR ; ;**E IT CP (HL) ;TEST IT CPL ;RESTORE IT LD (HL),A RET NZ ;IF BAD THEN RETURN INC HL ;NEXT LOCATION DEC BC LD SAVE VALUE AND 0FH ;MASK OFF OTHER NIBBLE CP 10 ;IF > 9 THEN CONVERT TO A..F JR C,NTALPH ADD 7 NTALPH: ADD '0' ;CONVDW IRET ;SIOA EXTERNAL/STATUS DW IRET ;SIOA RX DW IRET ;SIOA SPECIAL RX CONDITION CTCAV: DW KEYSRV ;KEYBOARD DW IRET ;Iot DB CLOCKCO ;Clock set/display DB DISPO ;Display DB -1 ;E DB FILLO ;Fill memory DB GOTOO ;Goto address DB HEL; LD DE,80 * 23 LD C,' ' VIDTLP: PUSH BC PUSH DE CALL VIDOUT POP DE POP BC INC C ;NEXT CHAR LD A,7EH ;IF NEW HIGH MEMORY & EXECUTE ; LD SP,ROM - 100H ;PUT STACK BELOW MONITOR TEMPORARILY LD HL,0 LD DE,ROM ;PUT MONITOR AT F800 LH BC ;SAVE COUNT CALL BEEP - ROM ;DO 1 BEEP POP BC ;IF --COUNT != 0 THEN REPEAT DJNZ BEEPS RET BEEP: LD A,BUZZE************************************ TSTLOW: LD HL,TSTLOW - ROM ;MOVE THIS CODE TO HIGH MEMORY LD DE,TSTLOW LD BC,TLSIZ A,C OR B JR NZ,RAMTST RET TLSIZ EQU $ - TSTLOW ;SIZE OF CODE NEEDED TO TEST LOW BANK ;****************************ERT TO ASCII LD C,A CALL VIDOUT POP AF ;RESTORE DATA RET ;**************************** ; ; OUTPUT SPACE SUBR NDEX PULSE DW IRET ;SIOA SYNC DW IRET ;VERTICAL SYNC INTERVAL CTCBV: DW IRET ;SIOB BAUD RATE (NOT USED) DW IRET ;SIOA BPCO ;Help DB INPTO ;Input DB -1 ;J DB -1 ;K DB LOADCO ;Load cassette (read) DB MOVEO ;Move memory DB -1 ;N CHAR > PRINTABLE THEN RE-INIT TO ' ' CP C JR NC,VIDLP1 LD C,' ' VIDLP1: DEC DE ;COUNT-- LD A,E OR D JR NZ,VIDTD BC,2048 ;2K ZMON LDIR LD HL,0 ;TEST LOAD LD DE,ROM LD BC,2048 MONTST: LD A,(DE) CP (HL) JR NZ,MONERR INC R + ON ;TURN ON BUZZER OUT (PORT0),A LD BC,0 ;DELAY ON TIME BEEP2: DEC C JR NZ,BEEP2 DJNZ BEEP2 LD A,BUZZER + LDIR JP TSTLO1 ;EXECUTES NEXT INSTRUCTION IN HIGH MEMORY TSTLO1: LD A,DYSTAT + ON ;TURN ON RAM OUT (PORT0),A LD HL,0 ********** ; ; OUTPUT HEX WORD SUBR ; ENTRY- HL= WORD ; ;************************************** OUTW: LD A,H ;START WIT; ;**************************** OUTSPC: LD C,' ' JP VIDOUT RAMMSG: DM CR,LF,'RAM ERROR AT ' MONERM: DM CR,LF,'MONITOR LOAUD RATE (NOT USED) DW MILISEC ;REAL TIME CLOCK MILLISECOND TIMER DW TIMER ;REAL TIME CLOCK TICK DMAVEC: DW IRET ;DMA READB OUPTO ;Output DB -1 ;P DB -1 ;Q DB READCO ;Read disk DB SUBSO ;Substitute memory DB MTESTO ;Test memory DB LP ; ; TEST RAM ; NOCHRS: LD HL,8000H ;START WITH UPPER 32K LD BC,8000H CALL RAMTST - ROM JR Z,URAMOK RAMERR: PHL INC DE DEC BC LD A,C OR B JR NZ,MONTST CALL VIDINIT ;CLEAR SCREEN FOR MONITOR LD HL,INIT ;CHANGE ENTRY FROFF ;TURN OFF BUZZER OUT (PORT0),A LD A,2 ;DELAY OFF TIME BEEP3: DEC C ;BC NOW = 0 JR NZ,BEEP3 DJNZ BEEP3 DE;TEST LOW RAM LD BC,2048 CALL RAMTST LD A,DYSTAT + OFF ;TURN ON ROM OUT (PORT0),A RET ;************************H HIGH BYTE PUSH HL CALL OUTB - ROM POP HL LD A,L ;FALL THROUGH WITH LOW BYTE CALL OUTB - ROM OUTH: LD C,'H' JP AD ERROR AT ' IF ($ >= 0FF00H) OR ($ < 7FFFH) CONMSG **** COLD BOOT CODE RUNS INTO INTERRUPT TABLE **** ENDIF ORG 0FDY DW IRET ;DMA MATCH DW IRET ;DMA END_OF_BLOCK DW IRET ;DMA MATCH/END SUBTTL CONSTANTS DS 0FF30H - $ ;************UNLDCO ;Unload cassette (write) DB COMPO ;Verify memory DB WRITCO ;Write disk DB XMNEO ;Xamine registers DB -1 ;Y 0 %+ &, !'- "(. #)/ $*0 DB BYEO ;Zleep ;--------------------------------------------------------------- ; ; Z80 REGISTER OFFSET TABLE ; STRUCT TB 'B',0,BPLOC,0 TB 'C',0,CPLOC,0 TB 'D',0,DPLOC,0 TB 'E',0,EPLOC,0 TB 'F',0,FPLOC,0 TB 'H',0,HPLOC,0 TB 'L',0,LPLDE DB 128 ;/128 = 300 BAUD DB 2,CTCB1 ;CTC B1 IN COUNTER MODE & 300 BAUD DB 01000111B DB 128 DB 2,CTCB2 ;RTC DIYTE CONTAINING THE OVERLAY OFFSET NUMBER AND THE ;CODE MUST START AT THE 2ND BYTE OF THE OVERLAY. ; ;!!!!!!!!!!!!!!!!!!!!!!!! DW READC READCO EQU 16 DW WRITC WRITCO EQU 17 DW HELPC HELPCO EQU 18 ;---------------------------------------------C,FIOC LD (HL),C ;PUT DOWN THE FILL VALUE CALL HILO ;INC & CHECK THE PTR JR NC,FIO FIOC: POP DE ;RESTORE SP IN CAS BYE1 RET ;--------------------------------------------------------------- ; ; VERIFY MEMORY COMMAND ; ; THIS ROUTI;FORMAT POP AF CALL HEX1 ;OUTPUT S2 CMPB: POP BC CALL HILOXB JR CMPA ;-----------------------------------------URE- BYTE= REGISTER CHAR ; BIT 7= NEW LINE IF PRINTOUT ; WORD= ADDRESS OF VALUE ; BIT 7= 0: BYTE, 1: WORD VALUE ; BITOC,0 TB 'M',1,LPLOC,11000000B TB 'X',0,XLOC,10000000B TB 'Y',0,YLOC,10000000B TB 'R',0,RLOC,0 DB -1 ;############VISOR = 1MS DB 00000111B DB 250 DB 2,CTCB3 ;RTC TICK, INTERRUPT EVERY 250MS DB 11000111B DB 250 DB -1 IF $ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ORG 0800H ;REALLY 0800H OBASE EQU $ ;###################################### ------------------ ; ; ERROR OVERLAY ; ;--------------------------------------------------------------- OERROR: DB ERRORO E STACK JP WINIT ; WAS OVERWRITTEN ;--------------------------------------------------------------- ; ; SLEEP COMMANDNE COMPARES 2 BLOCKS OF MEMORY AGAINST EACH ; OTHER. IF A DIFFERENCE IN THE RELATIVE ADDRESS CONTENTS IS ; DETECTED, THE ADD---------------------- ; ; DISPLAY MEMORY COMMAND ; ; THIS ROUTINE DISPLAYS A BLOCK OF MEMORY ON THE ; CONSOLE DEVICE. THE 6= 0: DIRECT, 1: INDIRECT VALUE ; ;--------------------------------------------------------------- TB MACRO #REG,#M,#ADDR,#A################ ; ; I/O DEVICE INIT TABLE ; ;############################ IOTABL: DB 2,PORT3 ;TTL BIT LATCHES DB ATT< 7FFFH CONMSG **** Error - Code Exceeds FFFFH **** ENDIF SUBTTL MONITOR OVERLAYS ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ; ; TABLE OF POINTERS TO THE OVERLAYS ; ;###################################### DW OERROR ;0= ERROR OVERLAY (-2 FOR OVE;OVERLAY # ;--------------------------------------------------------------- ; ; FILL MEMORY COMMAND ; ; THIS ROUTINE FI ; ; THE BYE ROUTINE IS USED TO PREVENT UNAUTHORIZED USAGE ; OF THE SYSTEM. THE SYSTEM LOCKS UP & WILL NOT RESPOND TO ; ANRESS OF THE 1ST BLOCK IS DISPLAYED, ALONG ; WITH IT'S CONTENTS & THE CONTENTS OF THE OTHER BLOCK'S SAME ; RELATIVE ADDRESS.  USER MUST SPECIFY THE START & FINISH ; ADDRESSES. THE DISPLAY IS ORGANIZED TO DISPLAY UP TO 16 ; BYTES PER DISPLAY LINE, WIM DB #REG + (#M * 80H), LOW #ADDR, (HIGH (#ADDR AND 0FFFH)) + #AM ENDM ACTBL: TB 'A',1,ALOC,0 TB 'B',0,BLOC,0 TB 'C',EN + ON DB FDCRST + ON DB 1,SELMUX DB 00001010B ;DRIVES OFF, TEST= FALSE, RDY SELECT= DRQ DB 6,DMA ;RESET OF DMA PE!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ; ; THE FOLLOWING CODE RESIDES IN THE 2ND HALF OF THE 32K EPROM. ;IT STARTS WITH A TABLE RLAY #) ERRORO EQU 0 DW FILL FILLO EQU 1 DW BYE BYEO EQU 2 DW COMP COMPO EQU 3 DW DISP DISPO EQU 4 DW GOTO GOTOOLLS A BLOCK OF MEMORY WITH A USER ; DEFINED CONSTANT. IT EXPECTS 3 PARAMETERS TO BE ENTERED IN ; THE FOLLOWING ORDER: ; STAYTHING OTHER THAN 2 ASCII BELL CHARACTERS. WHEN IT SEES ; THEN CONSECUTIVELY, CONTROL IS RETURNED TO THE MONITOR ; WITHOUT A ; ; V ; ;---------------------------------------------------------TH ALL COLUMNS ALIGNED SO EACH ; COLUMN HAS THE SAME LAST HEX DIGIT IN IT'S ADDR. ; ; D[ ] ; ;-----0,CLOC,0 TB 'D',0,DLOC,0 TB 'E',0,ELOC,0 TB 'F',0,FLOC,0 TB 'H',0,HLOC,0 TB 'L',0,LLOC,0 TB 'M',1,LLOC,11000000B TR ZILOG REPT 6 DB 11000011B ENDM DB 1,CTCA0 ;KEYBOARD DB (LOW CTCAV) AND 11111000B DB 2,CTCA1 ;INDEX PULSES OF POINTERS TO EACH OVERLAY, (FOLLOWED BY ;AN EQUATE TO THE OFFSET OF THE POINTER TO LINK TO THE COMMAND ;LOOKUP TABLE), FOLLO EQU 5 DW INPT INPTO EQU 6 DW OUPT OUPTO EQU 7 DW MOVE MOVEO EQU 8 DW BOOTC BOOTCO EQU 9 DW SUBS SUBSO EQU 10 DRT ADDR, FINISH ADDR, FILL VALUE ; ; F ; ;--------------------------------------------LTERING ANYTHING. ; ; Z ; ;--------------------------------------------------------------- BYE: DB BYEO BYE2: LD B,------ COMP: DB COMPO CALL EXPR3 CMPA: LD A,(BC) ;GET SOURCE 2 DATA PUSH BC ;SAVE SOURCE 2 PTR LD B,(HL) ;GET SOU---------------------------------------------------------- DISP: DB DISPO CALL EXLF ;GET BLOCK LIMITS DIS1: CALL LADRB B 'P',0,PLOC,10000000B TB 'S',0,SLOC,10000000B TB 'I',0,ILOC,0 ; ; PRIME Z80 REGISTER OFFSETS ; PRMTB: TB 'A',1,APLOC,0 DB 01000111B ;COUNT INDEX PULSES MOD 256 DB 0 DB 3,CTCB0 ;CTC B DB (LOW CTCBV) AND 11111000B DB 01000111B ;COUNTER MOWED BY THE COMMAND OVERLAY ITSELF. OVERLAYS ;WILL NOT BE LONGER THAN 512 BYTES AT THIS TIME. THE OVERLAYS ;MUST START WITH A BW MTEST MTESTO EQU 11 DW XMNE XMNEO EQU 12 DW LOADC LOADCO EQU 13 DW UNLDC UNLDCO EQU 14 DW CLOCKC CLOCKCO EQU 15 ------------------- FILL: DB FILLO CALL EXPR3 ;GET 3 PARAMS FIO: LD A,H ;PROTECT MONITOR CODE CP HIGH MONVARS JR N2 ;SET UP FOR 2 CHARS BYE1: CALL CONI CP BELL ;IF NOT BELL THEN RESTART JR NZ,BYE2 CALL ECH1 ;ECHO THE BELL DJNZRCE 1 DATA CP B ;IF S2=S1 THEN EXIT JR Z,CMPB PUSH AF ;SAVE S2 DATA CALL LADRB ;OUTPUT ADDR LD A,B CALL DASH1  ;DISPLAY START ADDR LD A,L ;SEE IF ON 16 BYTE BOUNDARY CALL TRPLSP - DISP + OVERLAY ;SKIP OVER TO RIGHT COLUMN PUSH HL 0 %+ &, !'- "(. #)/ $*0 DIS2: LD A,(HL) ;GET CONTENTS CALL HEX1 CALL HILO ;INC & CHECK PTR JR C,DIS7 ;DONE IF CARRY CALL BLK ;MAKE COLUM*************** TRPLSP: AND 0FH ;ISOLATE LOW NIBBLE LD B,A ;PREPARE TO SPACE OVER TO RIGHT ADD A,A ; COLUMN ADD B DR (NO BPS) ; G,[,] ;START EXECUTION AT START_ADDR WITH ; BREAKPOINT AT BP1 AND OPTIONAL BREAKPOINT AET TRAP ADDRESS FROM USER POP DE POP HL ;PTR LD A,D ;IF BREAKPOINT SPECIFIED AS 0 THEN IGNORE OR E JR Z,GO2 G RESTORE & EXECUTE GOTO ;--------------------------------------------------------------- ; ; INPUT FROM PORT COMMAND ; R ;GET DATA INTO E, PORT # INTO C POP DE POP BC OUT (C),E RET ;---------------------------------------------------.255} ; ;------------------------------------------------ BOOTC: DB BOOTCO ; ; CHECK FOR DRIVE NUMBER ; CALL PCHK ;IF----------------------------- ; ; SUBSTITUTE MEMORY COMMAND ; ; THIS ROUTINE ALLOWS THE USER TO INSPECT ANY MEMORY ; LOCATNS LD A,L ;READY FOR NEW LINE? AND 0FH JR NZ,DIS2 DIS3: POP HL ;RESTORE START OF LINE LD A,L ;SKIP OVER TO RIGHT S;**************************** ; ; OUTPUT N SPACES SUBR ; ENTRY- A= #_SPACES ; EXIT - B= 0 ; ;***************************T BP2 ; G,[,] ;START EXECUTION AT PC VALUE WITH BREAKPOINT(S) AT ; BP1 & OPTIONAL BP2. ; ;--------------------LD (HL),E ;SAVE BP ADDR INC HL LD (HL),D INC HL LD A,(DE) ;SAVE BP ADDR INSTRUCTION LD (HL),A INC HL LD A,0C ; THESE ROUTINES ALLOW BYTE-BY-BYTE INPUT OR OUTPUT FROM ; THE CURRENT CONSOLE DEVICE. ; ; I ; ;------------------ ; ; MOVE COMMAND ; ; THIS ROUTINE EXPECTS 3 PARAMETERS, ENTERED IN THE ; FOLLOWING SEQUENCE: ; SOURCE 1ST BYTE AD NO FURTHER INPUT THEN USE DEFAULT LD C,0 ;DEFAULT TO 0 JR C,BOOTCD ; ; GET DRIVE NUMBER ; CALL EXF ;GET USER BOOT ION & ALTER THE CONTENTS, IF DESIRED & IF THE ADDRESS ; IS IN RAM. THE CONTENTS MAY BE LEFT UNALTERED BY ENTERING A ; SPACE,PACE AND 0FH CALL TRPL2 - DISP + OVERLAY DIS4: LD A,(HL) ;OUTPUT MEMORY IN ASCII AND 7FH ;IF PRINTABLE THEN OUTPUT * TRPL2: LD B,A INC B TRPL1: CALL BLK ;DO SPACING DJNZ TRPL1 RET ;---------------------------------------------------------------------------------------------------- GOTO: DB GOTOO CALL PCHK ;IF NO ARGS THEN EXIT JR C,GO3 JR FH ;INSERT THE BP LD (DE),A GO2: LD A,C ;IF CHAR = CR THEN DONE BPING CP CR POP BC ;COUNT JR Z,GO3 DJNZ GO1 ---------------------------------------------------- INPT: DB INPTO CALL EXPR1 ;GET INPUT PORT # INTO C CALL CRLF ;PUT DR, SOURCE LAST BYTE ADDR & ; DESTINATION 1ST BYTE ADDR. ; ; M ; ;-------------# POP BC ; ; PASS DRIVE NUMBER TO COLD BOOT ROUTINE IN ROM ; BOOTCD: LD HL,DKBOOTV CALL CALLROM ; ; CURRENTLY, IF  COMMA OR RETURN. IF A RETURN IS ENTERED, THE ROUTINE ; IS TERMINATED. IF A SPACE OR COMMA IS ENTERED, THE ROUTINE ; PROCEEDLD C,A CP ' ' JR C,DIS5 CP 7EH JR C,DIS6 DIS5: LD C,'.' ;ELSE OUTPUT '.' DIS6: CALL CONOUT CALL HILOX LD A,-------------------------------- ; ; GOTO COMMAND ; ; GOTO COMMAND TRANSFERS CONTROL TO A SPECIFIED ADDRESS ; IT ALLOWS THZ,GO0 ;ELSE IF DELIM. (NO START ADDR) THEN EXIT ; ; EXECUTION ADDRESS SPECIFIED ; CALL EXF ;GET NEW GOTO ADDR POP HL  ;ELSE IF <2 BPS THEN LOOP ; ; GOTO ADDRESS & BREAKPOINTS TAKEN CARE OF ; GO3: CALL CRLF ;NEW LINE FOR PGM DI ;DISABDATA ON NEW LINE POP BC IN E,(C) ;FETCH DATA LD B,8 ;BIT COUNT INPT1: LD A,E ;OUTPUT BINARY BITS RLCA LD E,A--------------------------------------------- MOVE: DB MOVEO CALL EXPR3 MOV1: LD A,B ;PROTECT MONITOR ENVIRONMENT CP ROM RETURNS THEN A != 0, SO ALLWAYS ERROR. HOOKS ARE HERE ; NOW FOR USER TO CODE UP A RETURN WITHOUT ERROR. ; OR A RET ZS TO THE NEXT LOCATION & PRESENTS THE USER WITH AN ; OPPORTUNITY TO ALTER IT. ; ; S ; ;----------------------------L ;READY FOR NEW LINE? AND 0FH JR NZ,DIS4 ;NO JR DIS1 ;YES ; DIS7: SUB A,E ;SKIP OVER TO START ASCII CALL TRPLSPE SELECTIVE SETTING OF UP TO 2 BREAKPOINTS AS ; WELL AS ALLOWING ANY CONSOLE INPUT TO BREAKPONT THE RUN, AS ; LONG AS INTERR LD (PLOC),HL ;PUT ADDR IN PC LOCATION LD A,C ;IF LAST = CR THEN EXIT CP CR JR Z,GO3 ; ; BREAKPOINTS SPECIFIED ; GLE INTERRUPTS WHILE MESSING WITH REGS POP HL ;COMMAND RETURN ADDRESS LD HL,RS9 ;PUT TRAP FOR STACK UNDERRUN ON STACK  LD A,'0' / 2 RLA LD C,A CALL CONOUT DJNZ INPT1 RET ;-------------------------------------- ; ; OUTPUT DATAHIGH MONVARS RET NC LD A,(HL) ;MOVE 1 BYTE LD (BC),A CALL HILOXB ;RETURNS TO COMMAND INPUT IF DONE JR MOV1 ;- ; ; ERROR RETURNED, OUTPUT MESSAGE & STATUS WORD ; PUSH AF LD HL,BOOTM - BOOTC + OVERLAY CALL PRTWD POP AF CALL ----------------------------------- SUBS: DB SUBSO CALL EXPR1 ;GET ADDR CALL CRLF ;START ON NEW LINE POP HL SUB1:  - DISP + OVERLAY JR DIS3 ;**************************** ; ; COMPUTE COLUMN SUBR ; ENTRY- A=COLUMN ; ;*************UPT 1 IS ACTIVE. ; ; G ;START EXECUTION AT WHATEVER IS IN PC REG (NO BPS) ; G ;START EXECUTION AT START_ADO0: LD B,NBKPTS LD HL,TLOC ;POINT TO TRAP STORAGE GO1: PUSH BC ;# BPS PUSH HL ;STORAGE PTR LD B,2 CALL EXPR1 ;G PUSH HL LD HL,REST ;PUT BREAKPOINT ENTRY PTR INTO TRAP VECTOR LD (9),HL POP DE ;ADJUST STACK JP EXIT ;GO DO RE TO PORT COMMAND ; ; O ; ;-------------------------------------- OUPT: DB OUPTO CALL EXP----------------------------------------------- ; ; BOOT COMMAND ; ALLOWS EXECUTION OF A BOOT PROM ; ; B {0.HEX1 JP CRLF ; ; BOOT LOAD ERROR MESSAGE ; BOOTM: DM CR,LF,'Boot Load Error - ' ;----------------------------------LD A,(HL) ;OUTPUT EXISTING CONTENTS CALL DASH1 CALL PCHK ;GET NEW VALUE RET C ;IF CHAR = CR THEN RETURN JR Z,SUB2 0 %+ &, !'- "(. #)/ $*0;IF CHAR = ' ' OR ',' THEN SKIP STORE CP LF ;IF CHAR = LF THEN BACK UP JR Z,SUB3 PUSH HL ;PTR CALL EXF ;CONTINUE ------------ MTEST: DB MTESTO CALL EXLF MTEST1: LD A,(HL) LD B,A ;SAVE ORIGINAL CPL LD (HL),A XOR (HL) ;RESULTLUES OF THE ; REGISTERS STORED BY THE LAST ENCOUNTERED BREAKPOINT. THE ; VALUES MAY BE MODIFIED IF DESIRED. ; ; X ;DI FOUND REGISTER REQUESTED IN TABLE ; XAC: PUSH BC ;CHAR IN B CALL BLK ;OUTPUT SPACE CALL PRTVAL ;OUTPUT CURRENT VALU LD (DE),A EX (SP),HL ;RECOVER TABLE PTR LD A,(HL) ;GET THE ATTRIBUTES EX (SP),HL RLCA ;IF 8 BIT REG THEN EXIT ----------- LOADC: DB LOADCO CALL EXPR1 ;GET LOAD ADDRESS LD HL,0 ;0 LOADS THE ENTIRE FILE (<=65,536 BYTES) EX (SP),H------------------- ; ; DISPLAY & SET REAL TIME CLOCK COMMAND ; ;C ;DISPLAY TIME ;Chours minutes [seconds] ;SET TIME ( CALL HEX1 CALL CLKEI - CLOCKC + OVERLAY JP CRLF CLKSET: CALL EXF ;GET HOURS FROM USER POP BC POP HL LD (HL),C HEX INPUT POP DE ;NEW VALUE POP HL ;PTR LD (HL),E ;LOAD VALUE LD A,C ;IF DELIM = CR THEN DONE CP CR RET Z SUB SHOULD BE 0 LD (HL),B ;RESTORE ORIGINAL DATA CALL NZ,BITS - MTEST + OVERLAY ;LOG ERR IF NOT MTEST2: CALL HILOX JR MTESPLAY ALL REGISTER VALUES ; ;r= A,B,C,D,E,F,H,L,M,P,S,I,'A,'B,'C,'D,'E,'H,'L,'M,X,Y,R ; ;d= HEX NUMBER TO PLAE CALL DASH ;OUTPUT '-' CALL PCHK ;GET NEW INPUT POP BC ;CHAR IN B RET C ;IF CHAR = CR THEN RETURN JR Z,XF ;IF JR NC,XE INC DE ;ELSE REG PAIR, DO OTHER 8 BITS LD A,H ;STORE HIGH BYTE LD (DE),A XE: POP HL ;TABLE PTR XF: LD L ;SHOVE UNDER STACK RETURN ADDRESS PUSH HL CALL SUDI ;READ IT POP DE ;BALANCE STACK EX (SP),HL ;SAVE ACTUAL COUSECONDS OPTIONAL) ; ;-------------------------------------------------------------------- CLOCKC: DB CLOCKCO DI ;DISABL DEC HL PUSH HL CALL PCHK ;IF NO MINUTES THEN ERROR POP HL JR C,CLKQ PUSH HL ;GET MINUTES CALL EXF POP BC 2: INC HL ;PTR = PTR + 2 INC HL SUB3: DEC HL ;PTR = PTR - 1 LD A,L ;IF ON MOD 8 BOUNDARY THEN AND 7 ; OUTPUT ADDR ST1 ;******************************************* ; ; BITS SUBR OUTPUTS ADDRESS & BINARY DATA ; ENTRY- E= DATA ; HL= ACE INTO REGISTER r ; ;------------------------------------------------------------------------- XMNE: DB XMNEO JR XMNE0 NO CHANGE THEN EXIT PUSH HL ;PTR LD C,A ;SAVE 1ST DIGIT LD A,B ;TEST FOR 'M' CP 'M' PUSH AF LD A,C ;RESTORE A,C ;IF LAST = CR THEN RETURN CP CR RET Z ; ; THIS IS THE ACTUAL COMMAND ENTRY POINT ; XMNE0: LD HL,ACTBL ;ADDR OF REG NT LD HL,RDMSG - LOADC + OVERLAY ;OUTPUT BYTES READ CALL PRTWD POP HL ;OUTPUT ACTUAL BYTES READ JP LADR RDMSG: DE INTERRUPTS TO PREVENT SKEW LD A,(MONSTAT) LD (TEMP),A RES INTSTAT,A LD (MONSTAT),A CALL GETCLKP ;FETCH ARRAY PTR POP HL LD (HL),C DEC HL PUSH HL CALL PCHK ;IF NO SECONDS THEN ASSUME 0 LD C,0 JR C,CLKSEC CALL EXF ;ELSE GET CALL Z,LADRB JR SUB1 ;--------------------------------------------------------------- ; ; MTEST COMMAND TESTS A SPEDDRESS ; ;******************************************* BITS: PUSH DE LD E,A CALL LADRB ;OUTPUT ADDR LD B,8 ;BIT COUN;VECTOR ; ; GOT ARGS: DISPLAY CURRENT VALUE & ACCEPT & SET NEW VALUE ; XA: LD B,A ;SAVE ARG CHAR XAA: LD A,(HL) ;FETCH1ST DIGIT CALL EXF ;GET NEW VALUE ON STACK POP HL ;FETCH NEW VALUE FROM STACK POP AF ;IF NOT 'M' THEN NO REDIRECTION LOOK-UP TABLE XMNE1: CALL PCHK JP C,XG ;IF CHAR = CR THEN SHOW ALL JR Z,XMNE1 ;IF CHAR = ' ' OR ',' THEN LOOP CP M 'READ= ' ;---------------------------------------------------------- ; ; UNLOAD (WRITE) CASSETTE TAPE COMMAND ; ;U(CONOW INC HL ;POINT TO HOURS INC HL PUSH HL CALL PCHK ;IF NO INPUT THEN DISPLAY JR NC,CLKSET ;ELSE SET CALL CRLF SECONDS POP BC CLKSEC: POP HL LD (HL),C JR CLKEI CLKQ: CALL CLKEI - CLOCKC + OVERLAY JP QPRT ;**************CIFIED BLOCK OF MEMORY TO SEE ; IF ANY HARD DATA BIT FAILURES EXIST. IT IS NOT AN EXHAUSTIVE ; TEST, BUT JUST A QUICK INDICAT BITS1: LD A,E RLCA LD E,A LD A,'0' / 2 ;BUILD ASCII 1 OR 0 RLA LD C,A CALL CONOUT DJNZ BITS1 POP DE RET TABLE CHAR INC A ;IF END OF TABLE (-1) THEN ERROR JP Z,QPRT DEC A AND 7FH ;REMOVE NEWLINE BIT CP B ;IF CHAR == A JR NZ,NOREDIR ; ; 'M' SPECIFIED, USE CURRENT VALUE AS POINTER TO VALUE ; PUSH HL ;NEW VALUE LD A,(DE) ;FETCH PTR VAL'''' ;IF NOT PRIMES THEN EXIT JR NZ,XA LD HL,PRMTB JR XMNE1 ;-------------------------------------------------------UNT) (START_ADDRESS) ; ;---------------------------------------------------------- UNLDC: DB UNLDCO CALL EXPR ;GET COUNT & ;DISPLAY TIME ON NEW LINE POP HL ;HOURS PTR LD A,(HL) ;OUTPUT HOURS (HEX IS OK) CALL HEX1 LD C,':' ;OUTPUT DELIMI************************ ; ; RESTORE INTERRUPT STATUS SUBR ; ;************************************** CLKEI: LD A,(TEMP) ;TION OF THE MEMORY'S ; OPERATIVENESS. ; ; T ; ;--------------------------------------------------- ;------------------------------------------------------------------------- ; ; EXAMINE REGISTERS COMMAND INSPECTS THE VARG THEN FOUND JR Z,XAC INC HL ;NOT THIS ENTRY, SKIP TO NEXT ENTRY. CHAR INC HL ;ADDRL INC HL ;ADDRH JR XAA ; ; UE LD L,A INC DE LD A,(DE) LD H,A POP DE LD (HL),E ;STORE NEW VALUE JR XE NOREDIR: LD A,L ;STORE NEW VALUE --- ; ; LOAD COMMAND READS THE SUDING CASSETTE TAPE ; ;L(START_ADDRESS) ; ;----------------------------------------------- ADDRESS CALL CRLF CALL SUDO POP HL ;BALANCE STACK POP HL RET ;-------------------------------------------------TER CALL CO DEC HL ;OUTPUT MINUTES LD A,(HL) CALL HEX1 LD C,':' CALL CO DEC HL ;OUTPUT SECONDS LD A,(HL) RESTORE INTERRUPT STATUS LD (MONSTAT),A BIT INTSTAT,A RET Z EI RET ;-------------------------------------- ; ;  0 %+ &, !'- "(. #)/ $*0 READ SECTOR COMMAND ; ;Raddress drive track sector ; ;-------------------------------------- READC: DB READCO ; ; GET CALL PRTWD POP AF ;OUTPUT ERROR CODE CALL HEX1 JP CRLF ; ; MOVE DATA TO USER REQUESTED AREA ; DKOPOK: LD HL,DBUFF ; MOVE REQUESTED DATA TO BUFFER WHERE ROM CAN ACCESS IT ; POP HL ;SOURCE ADDRESS LD DE,DBUFF ;MOVE REQUESTED DATA TO BUtitute(address)[ ]' DB CR,LF,'Fill(first) (last) (data) Move(first) (last) (destination)' DB CR,LF,'Test(first) (last) is ROM. ; ;**************************************************************************** ; ; Revision status: ; ; 1.0 - Relt. ; 1.7 - 8 FEB 86 GRH ; Remove time delay from power up reset code to allow ISHA to access ; ram. ; Remove the auto-bo REQUIRED USER COMMANDS ; LD B,4 CALL EXPR ; ; SET UP THE IOPB ; LD A,RDSCMD ;READ COMMAND LD (PBCMD),A ; XOR A ;MOVE SECTOR DATA TO REQUESTED AREA LD BC,128 LDIR RET ;-------------------------------------- ; ; WRITE SECTOR FFER LD BC,128 LDIR ; ; EXECUTE THE IOPB ; LD DE,IOPB ;PASS THE IOPB PTR LD HL,XCUTE ;PASS THE EXECUTION VECTOR  Verify(first) (last) (other first)' DB CR,LF,'Input(port) Output(port) (data)' DB CR,LF,'Load(address) ease ; 1.1 - ; Add Double D deselect upon reset code. ; Change printer port. ; 1.2 - 20 FEB 83 GRH ; Add delay before turot from reset function. ; ; 1.8 - 29 MAY 86 GRH ; Add Cromemco PRI printer driver as primary printer. ; Change IOBYTE defi,A ;INIT FLAGS LD (PBFLG),A ; LD (PBSTAT),A ;CLEAR ERRORS ; POP HL ;SECTOR LD (PBSEC),HL ; POP HL ;TRACK LD (PCOMMAND ; ;Waddress drive track sector ; ;-------------------------------------- WRITC: DB WRITCO ; ; GET REQUIRED PARACALL CALLROM ; ; IF NO ERRORS THEN RETURN ; OR A RET Z ; ; ELSE OUTPUT WRITE ERROR ; PUSH AF ;SAVE ERROR STATUS Unload(address)' DB CR,LF,'Boot[drive]' DB CR,LF,'Read(address) (drive) (track) (sector)' DB CR,LF,'Write(add TITLE M5b Z-80 MONITOR LIST NOCOND ;*************************************************************************** ; ; SYSTEMning off boot image, in case logic ; too slow. ; 1.3 - 17 MAR 84 GRH ; Change to allow Boot command parameter passing to nitions. ; Remove initialization of Jade FDC port 40H in anticipation of ; Cromemco bank select useage. ; VERSN EQU '18' BTRK),HL ; POP HL ;DRIVE LD A,L LD (PBDRV),A ; LD HL,DBUFF ;XFER ADDRESS LD (PBDMA),HL ; ; EXECUTE THE IOPB ; METERS FROM USER ; LD B,4 ;GET PARAMETERS FROM USER CALL EXPR ; ; SET UP IOPB ; LD A,WRSCMD ;WRITE SECTOR COMMAND  LD HL,DKERM - WRITC + OVERLAY CALL PRTWD POP AF ;OUTPUT ERROR CODE CALL HEX1 JP CRLF ; DKERM: DM 'Disk Error: ' ress) (drive) (track) (sector)' DB CR,LF,'Goto[(address)][ (breakpoint1)[ (breakpoint2)]]' DB CR,LF,'Xamine[(register)[ (d MONITOR FOR M5b ; (c) 1982,1983 GRH ELECTRONICS, CUPERTINO, CA ; ;*********************************************************boot ROM. ; ; 1.4 - 2 JUN 84 GRH ; Fix bug in line printer status subroutine which hung the ; line printer by sensing th;**************************************************************************** FORM FALSE EQU 0 TRUE EQU NOT FALSE LSTINC EQ LD DE,IOPB ;PASS PARAMETERS LD HL,XCUTE CALL CALLROM ; ; IF NO ERRORS THEN GO XFER DATA ; POP DE ;DMA DESTINATION LD (PBCMD),A ; XOR A,A ;CLEAR FLAGS LD (PBFLG),A ; LD (PBSTAT),A ;CLEAR ERRORS ; POP HL ;SECTOR LD (PBSEC),HL ; ;-------------------------------------- ; ; HELP COMMAND ; ;H ; ;-------------------------------------- HELPC DB HELata)]] | [''(register)[ (data)]] | []' DM CR,LF,'Zleep' END ****************** ; ; This Monitor program resides at the top of memory & allows memory ; modification & testing, program bre status incorrectly. ; 1.5 - 29 SEP 85 GRH ; Fix bug in Input command which caused monitor to crash. ; The jump to 'BITSU FALSE ; ; INCLUDE SYSTEM DEFINITION FILES ; ;*INCLUDE NAKEDT.DEF ;*INCLUDE MONBOARD.DEF ;*INCLUDE BIGZ.DEF ;*INCLUDE  STILL ON STACK OR A JR Z,DKOPOK ; ; ELSE OUTPUT ERROR ; PUSH AF ;SAVE ERROR STATUS LD HL,DKERM - READC + OVERLAY  POP HL ;TRACK LD (PBTRK),HL ; POP HL ;DRIVE LD A,L LD (PBDRV),A ; LD HL,DBUFF ;XFER ADDRESS LD (PBDMA),HL ; PCO LD HL,HELPM - HELPC + OVERLAY JP PRTWD HELPM: DB 'Clock[HH MM[ SS]]' DB CR,LF,'Display(first) (last) Subseakpoints, console, printer, punch & ; reader I/O drivers and transfer to system boot ROM residing in same memory ; area as th2' expects DE to be on stack. ; 1.6 - 6 DEC 85 GRH ; Add code to disable all Jade controllers from 40H to 43H after ; reseJDDCONT.DEF ;*INCLUDE IOBOARD.DEF ;*INCLUDE PRI.DEF ; LIST OFF *INCLUDE NAKEDT.DEF *INCLUDE MONBOARD.DEF *INCLUDE BIGZ.D 0 %+ &, !'- "(. #)/ $*0EF *INCLUDE JDDCONT.DEF *INCLUDE IOBOARD.DEF *INCLUDE PRI.DEF LIST ON ;============================ ; ; ASSEMBLE TIME  EQU 11H ELOC EQU 10H FLOC EQU 14H HLOC EQU 31H LLOC EQU 30H PLOC EQU 34H SLOC EQU 17H TLOC EQU 35H TLOCX EQU 25H LLOCX ENTRY POINTS JP RTS ;SPECIAL I/O CONTROL JP REST ;BREAKPOINT ENTRY LPSTAT: JP LSTAT ;LINE PRINTER STATUS RETURN DS 6  LD DE,RSTER LD B,16 ;64 BYTES INIT1: PUSH DE PUSH HL DJNZ INIT1 ; ; SET TEMPORARY STACK ; LD SP,80H ; ; REMOP '0' JR NZ,NOT0 LD A,' ' NOT0: LD C,A CALL CO LD C,B CALL CO LD C,'K' CALL CO CALL CRLF POP HL ;MEMTOP A LD A,BZUCM ;OUTPUT COMMAND BYTE OUT (BZUCMD),A IN A,(BZUDAT) ;READ ANY GARBAGE CHAR ; ; INSERT I/O INIT CODE HERE RK SPACE NEEDS. ; EXIT - HL= MEMTOP PTR ; ;**************************************************************************** MEMS******************************************** MEMCK: PUSH HL CALL MEMSIZ ;GET THE RAM SIZE LD A,L ;TAKE OFF WORKSPACE SUVARIABLES ; ;============================ ROM EQU 0F800H ;ROM START ADDR WSVEC EQU 0 ;VECTOR NUMBER FOR WARM RESTART NBKP EQU 20H ; APLOC EQU 9 BPLOC EQU 11 CPLOC EQU 10 DPLOC EQU 13 EPLOC EQU 12 FPLOC EQU 8 HPLOC EQU 15 LPLOC EQU 14 XLOC  ;SAVE 2 SPARES ;------------------------------------------------ ; ; THE FOLLOWING CODE MUST RESIDE AT THE SAME ; ADDR VE JADE DOUBLE D WINDOW(S) ; LD A,DDFREE ;REMOVE DD WINDOW, IF PRESENT OUT (41H),A OUT (42H),A OUT (43H),A ; ; INIT ; ; CONTINUATION OF THE SCS MONITOR, MOVE EXIT ROUTINE TO RAM ; LD SP,HL LD DE,EXIT EX DE,HL LD BC,ENDX - EX; ; ; OUTPUT SIGN-ON MESSAGE ; LD HL,LOGMSG ;OUTPUT SIGN-ON CALL PRTWD JR WINIT ; ; SPECIAL DISK BOOT CODE SWAPS IZ: PUSH BC ;MONITOR START LOCATION LD BC,ROM LD HL,-1 MEMSZ1: INC HL LD A,(HL) CPL LD (HL),A CP (HL) CPL LD (B 60 JR NC,MEMCK0 DEC H MEMCK0: LD B,H POP HL RET ;************************************** ; ; EXF SUBR. READS 1 PATS EQU 2 ;NUMBER OF BREAKPOINTS ;============================ ; ; CONSTANTS ; ;============================ CTRLS EQUEQU 7 YLOC EQU 5 RLOC EQU 2 ILOC EQU 3 SUBTTL MAIN PROGRAM ORG ROM ;-------------------------------------- ; ; JUMP TAAS THE BOOT ROM START CODE. ; ;------------------------------------------------ DBOOT: LD A,C ;PERFORM SWAP AND 7 ;CLEAR IALIZE IOBYTE ; LD C,IOBYTV ;SET TO INITIAL IOBYTE VALUE CALL IOSET ; ; SIZE AND DISPLAY MEMORY ; LD HL,USRMSG ;OUTPIT LDIR ; LD BC,NBKPTS * 3 ;CONTINUE 'JP 0' FOR 3 TIMES PUSH DE POP HL DEC HL LDIR ; LD HL,-24 ADD HL,SP PUSROMS FOR BOOT ; IF BOOT SUCCESSFUL, DOES NOT RETURN. ; IF UNSUCCESSFUL, RETURNS CARRY IF ERROR, NO CARRY IF DISK NOT INSERTED.HL),A JR NZ,MEMSZ2 ; LD A,H ;SEE IF ON MONITOR BORDER CP B JR NZ,MEMSZ1 MEMSZ2: DEC HL ;TAKE OFF WORKSPACE LD BC,ERAMETER. ; ENTRY- A= PARAMETER 1ST CHAR ; EXIT - STACK= PARAMETER ; ;************************************** EXF: LD B,1 ;S 13H ;ASCII DC3 CR EQU 0DH LF EQU 0AH BELL EQU 7 ;============================ ; ; VARIABLES ; ;===================RGETS FOR BASIC I/O ; ;-------------------------------------- CBOOT JP INIT ;COLD START CONIN JP CI ;CONSOLE INPUT READERERROR MSG IN CASE ROM NOT THERE & MASK OUT ROMSEL,A RET ;-------------------------------------- ; ; THE COLD INITIALIZAUT MEMORY= CALL PRTWD CALL MEMSIZ ;OUTPUT MEMORY SIZE PUSH HL ;SAVE VALUE FOR LATER ; ; COMPUTE # KS ; LD A,H ; /1H HL INC HL ;ADJUST USER STACK LOCATION INC HL LD (SPSV),HL ;SAVE INITIAL STACK VALUE ; ; INITIALIZE REGISTER IMAGES  ; BOOTCD: LD C,XDBROM ;PASS IN DEFAULT BOOT ROM ADDR BOOTCC: CALL DBOOT LD HL,BOOTEM CALL C,PRTWD ; JR WINIT ;GO TO XIT-ENDX-3*NBKPTS+1 ;EXIT RTN + BP JUMPS ADD HL,BC POP BC ;UNPREDICTABLE DURING INIT RET ;**************************ET 1 PARAM LD HL,0 JR EX1 ;1ST CHAR IN A ALREADY ;**********************************************************************========= IOBYTE EQU 3 ;ADDR OF I/O CONTROL BYTE IOBYTV EQU 00H ;DEFAULT IOBYTE VALUE ; SPSV EQU 6 ;STACK PTR SAVE LOCATI JP RI ;READER CONOUT JP CO ;CONSOLE OUTPUT PUNCH JP PUNO ;PUNCH LIST JP LO ;LIST OUTPUT CONST JP CSTS ;CONSOLE STATUS TION CODE ; ;-------------------------------------- INIT: ; ; INSURE INTERRUPTS DISABLED ; DI ; ; REMOVE PAGE 0 IM024 SRL A SRL A LD C,0 ;TENS COUNT = 0 MEMLP: SUB 10 ;NUMBER = NUMBER - 10 JR C,MEM1 ; INC C ;IF < 10 THEN C = TETO 0 ; LD D,10 INIT2: PUSH BC DEC D JR NZ,INIT2 ; ; INITIALIZE BIG Z 8251 ; XOR A ;GET IT'S ATTENTION 1ST LD BMONITOR EXEC ;**************************************************************************** ; ; MEMSIZ SUBR CALCULATES THE************************************************** ; ; MEMCHK SUBR FINDS THE CURRENT TOP OF CONTIGUOUS MEMORY (LESS THE ; MO****** ; ; EXPR SUBR. READS PARAMETERS FROM THE CONSOLE & DEVELOPS A 16 BIT HEX ; FOR EACH ONE. A CARRIAGE RETURN WILL TERMINON ; ; REGISTER STORAGE DISPLACEMENTS FROM NORMAL SYSTEM ; STACK LOCATION. ; ALOC EQU 15H BLOC EQU 13H CLOC EQU 12H DLOC JP IOCHK ;PUT IOBYTE INTO A JP IOSET ;(C) HAS NEW IOBYTE JP MEMCK ;MEMORY LIMIT CHECK JP RTS ;IODEF- DEFINE USER I/OAGE ; OUT COLDRES,A ; ; INITIALIZE RESTART VECTORS IN PAGE 0 ; LD SP,3FH ;USE STACK TO INIT RESTARTS LD HL,0C300H NS DIGIT JR MEMLP ; MEM1: ADD '0' + 10 ;CONVERT TO + ASCII # LD B,A LD A,C ;IF TENS = 0 THEN OUTPUT SPACE ADD '0' C,5 URTLP: OUT (BZUDAT),A EX (SP),HL ;DELAY A WHILE EX (SP),HL DJNZ URTLP LD A,BZUMOD ;OUTPUT MODE BYTE OUT (BZUCMD), TOP OF CONTIGUOUS RAM. IT SEARCHES FROM ; THE BOTTOM UP UNTIL A NON-RAM LOCATION IS FOUND. IT THEN TAKES OFF FOR ; MONITOR WONITOR WORKSPACE) & RETURNS THE VALUE. ; EXIT - B= HIGH BYTE OF RAM ; A= LOW BYTE OF RAM ; ;********************************ATE THE ENTRY SEQUENCE. A BLANK ; OR COMMA WILL END THE CURRENT PARAMETER ENTRY. EACH PARAMETER ONLY TAKES ; THE LAST 4 DIGITS 0 %+ &, !'- "(. #)/ $*0 TYPED IN. ANY EXCESS IS DISCARDED. A NON-HEX DIGIT WILL ; TERMINATE THE ENTRY SEQUENCE & CAUSE A WARM BOOT OF THE MON. ; ENTR2C JR NC,EX3 DJNZ QPRT ;ELSE IF MORE REQ'D THEN ERR RET ;ELSE RETURN ;----------------------------------------------------------------------- ASGN: CALL ECHO ;GET THE LOGICAL DEVICE DESIRED LD HL,ALT ;START OF CONVERSION TABLE LD DE,APT  B,2 ;PASS IN 2 PARAMS TO HANDLER LD HL,TBL ;ADDRESS = (TABLE + OFFSET) ADD HL,DE LD A,(HL) INC HL LD H,(HL) LD L,---- ; ; ASSIGN CONTINUED ; ;---------------------------- AS1: LD D,B ;SAVE THE COUNTER RESIDUE LD B,4 CALL DECHO ;GE A= CURRENT IOBYTE VALUE ; ;******************************************* IOCHK: LD A,(IOBYTE) RET ;-------------------------------------------- ; ; VERIFY MEMORY COMMAND ; ; THIS ROUTINE COMPARES 2 BLOCKS OF MEMORY AGAINST EACH OTHER. IF A ;  JR CMPA ;---------------------------------------------------------------------------- ; ; DISPLAY MEMORY COMMAND ; ; THIY- B= # OF PARAMETERS NEEDED ; EXIT - STACK= PARAMETERS ; ;******************************************************************------------------------------ ; ; LOGICAL ASSIGNMENT OF PERIPHERALS COMMAND ; ; THIS COMMAND CONTROLS THE ASSIGNMENT OF PHY- ALT ; # OF ELEMENTS LD B,4 ; COUNT = # ENTRIES AS0: CP (HL) ;IF CHAR = TABLE[LOGICAL] THEN JR Z,AS1 ; EXIT ADD HL,DA JP (HL) ;---------------------------------------------------------------------------- ; ; FILL MEMORY COMMAND ; ; THIT NEW ASSIGNMENT AS2: INC HL ;PTR = PTR + 1 CP (HL) ;IF CHAR <> (TABLE) THEN EXIT JR NZ,AS3 LD L,B ;SAVE THE RESIDUE-------------------------------------------------------- ; ; SLEEP COMMAND ; ; THE BYE ROUTINE IS USED TO PREVENT UNAUTHORIZDIFFERENCE IN THE RELATIVE ADDRESS CONTENTS IS DETECTED, THE ADDRESS OF THE ; 1ST BLOCK IS DISPLAYED, ALONG WITH IT'S CONTENTS S ROUTINE DISPLAYS A BLOCK OF MEMORY ON THE CONSOLE DEVICE. THE ; USER MUST SPECIFY THE START & FINISH ADDRESSES. THE DISPLAY I********** AS3: DJNZ AS2 ;PART OF THE ASSIGN CODE EX3: JR NZ,QPRT ;NON 0 IS ERR EXPR1: DEC B ;IF NO PARAMS THEN RETURN RSICAL PERIPHERALS TO THE ; 4 LOGICAL DEVICE TYPES. IT ALTERS (IOBYTE) TO MATCH THE CURRENT ASSIGNMENT. ; THE 4 LOGICAL DEVICESE ;ELSE NEXT LOGICAL ENTRY DJNZ AS0 QPRT: LD HL,QMSG ;OUTPUT ? MESSAGE CALL PRTWA ;---------------------------- ; ; S ROUTINE FILLS A BLOCK OF MEMORY WITH A USER DEFINED CONSTANT. IT ; EXPECTS 3 PARAMETERS TO BE ENTERED IN THE FOLLOWING ORDER: TO FORM ASGNT DEC L LD B,D LD H,3 DEC B JR Z,AS5 ;NO SHIFT NEEDED AS4: ADD HL,HL ;SHIFT MASKS ADD HL,HL DJNZED USAGE OF THE SYSTEM. ; THE SYSTEM LOCKS UP & WILL NOT RESPOND TO ANYTHING OTHER THAN 2 ASCII BELL ; CHARACTERS. WHEN IT SEE& THE CONTENTS OF THE ; OTHER BLOCK'S SAME RELATIVE ADDRESS. ; ; V S ORGANIZED TO ; DISPLAY UP TO 16 BYTES PER DISPLAY LINE, WITH ALL COLUMNS ALIGNED SO EACH ; COLUMN HAS THE SAME LAST HEX DIGIET Z EXPR: LD HL,0 ;PARAM = 0 EX0: CALL ECHO ;GET NEXT # EX1: LD C,A ;SAVE CHAR FOR LATER CALL NIBBLE JR C,EX2 ;IF NO ARE CONSOLE, READER, LIST & PUNCH. IN ALL CASES, THE ; TTY DEVICE (SYSTEM CONSOLE) IS SET UP AS THE DEFAULT DEVICE. ; ; Ax THE WARM START CODE ; ;---------------------------- WINIT: LD SP,(SPSV) ;RESTORE THE STACK WINITA: LD HL,WINIT ;RESET RETURN ; START ADDR, FINISH ADDR, FILL VALUE ; ; F ; ;------------------------------------- AS4 AS5: LD A,(IOBYTE) OR H XOR H ;LOGICAL BITS NOW OFF OR L ;PUT IN NEW VALUE LD C,A ;**************************S THEN CONSECUTIVELY, CONTROL IS RETURNED TO THE ; MONITOR WITHOUT ALTERING ANYTHING. ; ; Z ; ;----------------------- ; ;---------------------------------------------------------------------------- COMP: CALL EXPR3 CMPA: LD A,(BC) ;GET SOURCT IN IT'S ADDR. ; ; D[ ] ; ;-------------------------------------------------------------------------T NUMBER THEN EXIT ADD HL,HL ;PARAM = PARAM * 16 ADD HL,HL ADD HL,HL ADD HL,HL OR L ;ADD IN NEW DIGIT LD L,A JR  ;x= C,R,P,L (CONSOLE,READER,PUNCH,LIST) ; Ax-y ;y= C: T,C,B,1 (TTY,CRT,BAT,UC1) ; R: T,P,1,2 (TTY,PTR,UR1,UR2) ;  & WARM START VECT PUSH HL LD (WSVEC + 1),HL LD A,0C3H LD (WSVEC),A CALL CRLF CALL DECHO ;GET COMMAND SUB 'A' ;I--------------------------------------- FILL: CALL EXPR3 ;GET 3 PARAMS FIO: LD (HL),C ;PUT DOWN THE FILL VALUE CALL HILO ************ ; ; SET IOBYTE SUBR ; ENTRY- C= NEW IOBYTE VALUE ; ;************************************** IOSET: LD A,C LD----------------------------------------------------- BYE: LD B,2 ;SET UP FOR 2 CHARS BYE1: CALL CONI CP BELL ;IF NOT BELLE 2 DATA PUSH BC ;SAVE SOURCE 2 PTR LD B,(HL) ;GET SOURCE 1 DATA CP B ;IF S2=S1 THEN EXIT JR Z,CMPB PUSH AF ;SAVE --- DISP: CALL EXLF ;GET BLOCK LIMITS DIS1: CALL LADRB ;DISPLAY START ADDR LD A,L ;SEE IF ON 16 BYTE BOUNDARY CALL TRPLEX0 ;GET NEXT ; EX2: EX (SP),HL ;PUT UNDER RETURN ADDR ON STACK PUSH HL LD A,C ;IF LAST CHAR = DELIM THEN EXIT CALL P P: T,P,1,2 (TTY,PTP,UP1,UP2) ; L: T,L,1,2 (TTY,CRT,LPT,UL1) ; ;---------------------------------------------------F CHAR <> 'A' -> 'F' THEN ERR JR C,QPRT CP 'Z' - 'A' + 1 JR NC,QPRT ADD A,A ;OFFSET = INDEX * 2 LD E,A LD D,0 LD;INC & CHECK THE PTR JR NC,FIO POP DE ;RESTORE SP IN CASE STACK JR WINIT ; WAS OVERWRITTEN ;------------------------ (IOBYTE),A ;SAVE NEW ASSIGNMENTS RET ;******************************************* ; ; RETURN IOBYTE VALUE SUBR ; EXIT - THEN RESTART JR NZ,BYE CALL ECH1 ;ECHO THE BELL DJNZ BYE1 RET ;----------------------------------------------------S2 DATA CALL LADRB ;OUTPUT ADDR LD A,B CALL DASH1 ;FORMAT POP AF CALL HEX1 ;OUTPUT S2 CMPB: POP BC CALL HILOXB SP ;SKIP OVER TO RIGHT COLUMN PUSH HL DIS2: LD A,(HL) ;GET CONTENTS CALL HEX1 CALL HILO ;INC & CHECK PTR JR C,DIS7  0 %+ &, !'- "(. #)/ $*0;DONE IF CARRY CALL BLK ;MAKE COLUMNS LD A,L ;READY FOR NEW LINE? AND 0FH JR NZ,DIS2 DIS3: POP HL ;RESTORE START OF ---------------------------- ; ; GOTO COMMAND ; ; GOTO COMMAND TRANSFERS CONTROL TO A SPECIFIED ADDRESS IT ALLOWS THE ; SEL CALL EXF ;GET NEW GOTO ADDR POP DE LD HL,PLOC ;PUT ADDR IN PC LOCATION ADD HL,SP LD (HL),D DEC HL LD (HL),E LDL,REST LD (9),HL ;SET BP VECTOR ADDR LD HL,24 ;FIND REG SET ROUTINE ADDR ADD HL,SP POP DE ;ADJUST STACK JP (HL) ;G---------------- OUPT: CALL EXPR ;GET DATA INTO E, PORT # INTO C POP DE POP BC OUT (C),E RET ;--------------------- (DEFAULT # = 02H) ; ;------------------------------------------------ BOOTC: CALL PCHK ;IF NO FURTHER INPUT THEN USE DEFAU----------------------------- SUBS: CALL EXPR1 ;GET ADDR CALL CRLF ;START ON NEW LINE POP HL SUB1: LD A,(HL) ;OUTPUT EXE IF ANY HARD ; DATA BIT FAILURES EXIST. IT IS NOT AN EXHAUSTIVE TEST, BUT JUST A QUICK ; INDICATION OF THE MEMORY'S OPERATIVELINE LD A,L ;SKIP OVER TO RIGHT SPACE AND 0FH CALL TRPL2 DIS4: LD A,(HL) ;OUTPUT MEMORY IN ASCII AND 7FH ;IF PRINTABECTIVE SETTING OF UP TO 2 BREAKPOINTS AS WELL AS ALLOWING ANY CONSOLE ; INPUT TO BREAKPONT THE RUN, AS LONG AS INTERRUPT 1 IS A A,C ;IF LAST = CR THEN EXIT CP CR JR Z,GO3 GO0: LD B,NBKPTS LD HL,TLOC ;POINT TO TRAP STORAGE ADD HL,SP GO1: PUSH BO DO REG RESTORE ;---------------------------------------------------------------------------- ; ; INPUT FROM PORT COMMAND ------------------------------------------------------- ; ; MOVE COMMAND ; ; THIS ROUTINE EXPECTS 3 PARAMETERS, ENTERED IN TLT JP C,BOOTCD CALL EXF ;GET USER BOOT # POP BC JP BOOTCC ;---------------------------------------------------------ISTING CONTENTS CALL DASH1 CALL PCHK ;GET NEW VALUE RET C ;IF CHAR = CR THEN RETURN JR Z,SUB2 ;IF CHAR = ' ' OR ',' TNESS. ; ; T ; ;---------------------------------------------------------------------------- MTEST: LE THEN OUTPUT LD C,A CP ' ' JR C,DIS5 CP 7EH JR C,DIS6 DIS5: LD C,'.' ;ELSE OUTPUT '.' DIS6: CALL CONOUT CALL HICTIVE. ; ; G ;START EXECUTION AT WHATEVER IS IN PC REG (NO BPS) ; G ;START EXECUTION AT START_ADDR (NO BPSC ;# BPS PUSH HL ;STORAGE PTR LD B,2 CALL EXPR1 POP DE ;GET TRAP ADDR POP HL ;SPTR LD A,D ;INSURE 0 WASN'T SPEC ; ; THESE ROUTINES ALLOW BYTE-BY-BYTE INPUT OR OUTPUT FROM THE CURRENT ; CONSOLE DEVICE. ; ; I ; ;---------HE FOLLOWING SEQUENCE: ; SOURCE 1ST BYTE ADDR, SOURCE LAST BYTE ADDR & DESTINATION 1ST BYTE ADDR. ; ; M ,[,] ;START EXECUTION AT START_ADDR WITH ; BREAKPOINT AT BP1 AND OPTIONAL BREAKPOINT AT BP2 ; 'D OR E JR Z,GO2 LD (HL),E ;SAVE BP ADDR INC HL LD (HL),D INC HL LD A,(DE) ;SAVE BP ADDR INSTRUCTION LD (HL),A------------------------------------------------------------------- INPT: CALL EXPR1 ;GET INPUT PORT # INTO C CALL CRLF ;PUDR> ; ;---------------------------------------------------------------------------- MOVE: CALL EXPR3 MOV1 THE CONTENTS, IF DESIRED & IF THE ADDRESS IS IN RAM. THE CONTENTS MAY BE ; LEFT UNALTERED BY ENTERING A SPACE, COMMA OR RETURNPOP HL ;PTR LD (HL),E ;LOAD VALUE LD A,C ;IF DELIM = CR THEN DONE CP CR RET Z SUB2: INC HL ;PTR = PTR + 2 INC HL : POP AF ;RESTORE BYTE LD (HL),A CALL HILOX JR MTEST1 ; BITS: PUSH DE LD E,A CALL LADRB ;OUTPUT ADDR BITS2: LD B,LL TRPLSP JR DIS3 ; TRPLSP: AND 0FH ;ISOLATE LOW NIBBLE LD B,A ;PREPARE TO SPACE OVER TO RIGHT ADD A,A ; COLUMN ADG,[,] ;START EXECUTION AT PC VALUE WITH BREAKPOINT(S) AT ; BP1 & OPTIONAL BP2. ; ;------------------------------ INC HL LD A,0CFH ;INSERT THE BP LD (DE),A GO2: LD A,C ;IF CHAR = CR THEN DONE BPING CP CR POP BC JR Z,GO3 DJNZT DATA ON NEW LINE POP BC IN E,(C) PUSH DE ;FIX BUG. BITS2 POPS DE BEFORE 'RET' JR BITS2 ;OUTPUT VALUE ;-----------: LD A,(HL) ;MOVE 1 BYTE LD (BC),A CALL HILOXB JR MOV1 ;------------------------------------------------ ; ; BOOT CO. IF A RETURN IS ; ENTERED, THE ROUTINE IS TERMINATED. IF A SPACE OR COMMA IS ENTERED, THE ; ROUTINE PROCEEDS TO THE NEXT LOCA SUB3: DEC HL ;PTR = PTR - 1 LD A,L ;IF ON MOD 8 BOUNDARY THEN AND 7 ; OUTPUT ADDR CALL Z,LADRB JR SUB1 ;--------8 ;BIT COUNT BITS1: LD A,E RLCA LD E,A LD A,'0' / 2 ;BUILD ASCII 1 OR 0 RLA LD C,A CALL CONOUT DJNZ BITS1 POP D B TRPL2: LD B,A INC B TRPL1: CALL BLK ;DO SPACING DJNZ TRPL1 RET ;---------------------------------------------------------------------------------------------- GOTO: CALL PCHK ;SEE IF OD ADDR WANTED JR C,GO3 JR Z,GO0 ;YES, BUT SET BP  GO1 ;ELSE IF <2 BPS THEN LOOP GO3: CALL CRLF ;NEW LINE FOR PGM POP HL ;GET RID OF STACK JUNK LD HL,RS9 PUSH HL LD H--------------------------- ; ; OUTPUT DATA TO PORT COMMAND ; ; O ; ;----------------------MMAND ; ALLOWS EXECUTION OF A BOOT PROM ; ; B<(ARG * 10H) + PROM #> ; ARG :: 0..FH (PASSED TO BOOT ROM) ; PROM # :: 0..7TION & PRESENTS THE USER WITH AN ; OPPORTUNITY TO ALTER IT. ; ; S ; ;------------------------------------------------------------------------------------------------------------------- ; ; MTEST COMMAND TESTS A SPECIFIED BLOCK OF MEMORY TO SEDE RET ;---------------------------------------------------------------------------- ; ; EXAMINE REGISTERS COMMAND ; INS 0 %+ &, !'- "(. #)/ $*0PECTS THE VALUES OF THE REGISTERS STORED BY THE LAST ENCOUNTERED ; BREAKPOINT. THE VALUES MAY BE MODIFIED IF DESIRED. ; ; X<XF ;IF NO CHANGE THEN EXIT PUSH HL ;PTR CALL EXF POP HL LD A,L INC DE LD (DE),A EX (SP),HL ;RECOVER TABLE PTR H CALL PRTVAL CALL BLK INC HL ;NEXT ENTRY JR XG ; PRTVAL: INC HL ;NEXT ENTRY LD A,(HL) ;GET OFFSET & ATTRIBUTES ***************************************** ; ; CONV ROUTINE CONVERTS THE LOW ORDER NIBBLE OF THE ; ACCUMULATOR TO ITS ASCII EBC RET ;*************************************************************** ; ; EXPR3 ROUTINE GETS 3 PARAMETERS, DOES A CR-RN CF OR L SCF RET Z LD A,E ;ELSE COMPARE HL TO DE SUB L LD A,D SBC A,H RET ;*****************************OUTINE CONVERTS THE ASCII CHARACTERS 0-9 & A-F ; TO THEIR EQUIVALENT HEX VALUE. IF THE CHARACTER IS NOT IN ; RANGE, THE CARR***************************************************** PCHK: CALL ECHO P2C: CP ' ' ;IF CHAR = ' ' THEN RETURN RET Z CP ','CR> ;DISPLAY ALL REGISTER VALUES ; ;r= A,B,C,D,E,F,H,L,M,P,S,I,'A,'B,'C,'D,'E,'H,'L,'M,X,Y,R ; ;d= HEX NUMBER LD A,(HL) ;GET THE ATTRIBUTES EX (SP),HL RLCA ;IF 8 BIT REG THEN EXIT JR NC,XE INC DE ;ELSE REG PAIR, DO OTHER 8 BI AND 3FH ;ISOLATE OFFSET ADD A,2 ;ALLOW FOR RET ADDR EX DE,HL LD L,A ;BUILD ADDR OF REG CONTENTS LD H,0 ADD HL,SP QUIVALENT. ; ENTRY- A= NUMBER (LO NIBBLE) ; EXIT - A= C= ASCII NUMBER ; ;***************************************************LF & THEN ; LOADS BC, DE & HL WITH THE PARAMS. ; ;*************************************************************** EXPR3: IN***************************** ; ; HILOX ROUTINE INCREMENTS HL, COMPARES IT TO DE & IF ; EQUAL, RETURNS CONTROL TO THE MONITOY BIT IS SET TO FLAG THE ERR. ; ;*************************************************************** NIBBLE: SUB '0' RET C CP ;IF CHAR = ',' THEN RETURN RET Z CP CR ;IF CHAR = CR THEN RETURN CF SCF RET Z CCF ;ELSE RETURN NC RET ;*** TO PLACE INTO REGISTER r ; ;---------------------------------------------------------------------------- XAA: INC HL ;SKIP TS LD A,H LD (DE),A XE: POP HL ;TABLE PTR XF: LD A,C ;IF LAST = CR THEN RETURN CP CR RET Z ; ; THIS IS THE ACTUA EX DE,HL LD A,(HL) ;NOW FIND ATTRIBUTES LD B,1 ;SINGLE REG VALUE RLCA JR NC,PV1 ;IF SINGLE REG THEN EXIT INC B ;E************ CONV: AND 0FH ADD A,90H ;PUT INTO ASCII ZONE DAA ;AH, THE UBIQUITOUS DAA CONVERT ADC A,40H DAA LD C,AC B ;B HAS 2 ALREADY CALL EXPR POP BC POP DE JP CRLFA ;GO DO CRLF ;**********************************************R EXEC. OTHERWISE, ; CONTROL RETURNS TO THE CALLING ROUTINE. ; ;**********************************************************  'G' - '0' CCF RET C CP '9' - '0' + 1 CCF RET NC SUB 'A' - '9' - 1 CP 10 RET ;****************************************************************************************************** ; ; REST ROUTINE TRAPS ALL OF THE REGISTER CONTENTS OVER TO NEXT ENTRY INC HL XA: INC (HL) ;IF AT END OF TABLE THEN RETURN RET Z JP P,XAB ;SORT OUT BIT 7 OF TABLE OR 80HL COMMAND ENTRY POINT ; XMNE: LD HL,ACTBL ;ADDR OF REG LOOK-UP TABLE XMNE1: CALL PCHK JR C,XG ;IF CHAR = CR THEN SHOW ALL LSE REG PAIR RLCA ;IF NOT (HL) THEN EXIT JR NC,PV1 PUSH HL ;BUILD ADDR IN HL LD A,(DE) LD H,A DEC DE LD A,(DE)  RET ;*************************************************************** ; ; ECHO ROUTINE READS A BYTE FROM CONSOLE DEVICE****************************** ; ; HILO ROUTINE INCREMENTS HL. IT THEN CHECKS FOR (& DISALLOWS) A ; WRAP-AROUND SITUATION. IFHILOD: POP DE ;GET RID OF RETURN ADDR RET ;RETURN TO MONITOR HILOXB: INC BC HILOX: CALL HILO JR C,HILOD ;DONE IF C*********************************************** ; ; PCHK ROUTINE READS A CHARACTER FROM THE CONSOLE, THEN CHECKS IT FOR A ; DWHENEVER A RESTART 1 ; INSTRUCTION IS EXECUTED. THE TRAPPED CONTENTS ARE STORED IN THE SYSTEM ; STACK AREA FOR LATER ACCESS AN ;SET IT ON TEST VALUE JR XAC ; XAB: AND 7FH ;RESET BIT 7 XAC: DEC (HL) ;TO BE PULLED OUT IN ROM CP (HL) JR NZ,XAA  JR Z,XMNE1 ;IF CHAR = ' ' OR ',' THEN LOOP CP '''' ;IF NOT PRIMES THEN EXIT JR NZ,XA LD HL,PRMTB JR XMNE1 ; XG: LD LD L,A LD A,(HL) ;GET (HL) VALUE POP HL DJNZ PV2 ;ALLWAYS JUMP PV1: LD A,(DE) ;GET REG CONTENTS PV2: CALL HEX1 ;OU & ECHOS ; THE CHAR BACK TO THE CONSOLE DEVICE. ; ;*************************************************************** DECHO: C IT OCCURS, THE CARRY BIT WILL BE SET ON RETURN. ; IF NO WRAP-AROUND OCCURRED, HL IS COMPARED TO DE & THE FLAGS SET ACCORDINGLYF CALL CONST ;IF NO CONSOLE BREAK THEN OR A ; RETURN RET Z CALL CONI ;IF CHAR <> CTRL-S THEN BREAK CP CTRLS JR NELIMITER. IF IT IS NOT A DELIMITER, A NON-ZERO CONDITION IS RETURNED. IF ; IT IS A DELIMITER, A ZERO CONDITION IS RETURNED. FURD USE BY THE GOTO & THE EXAMINE REGISTERS ; COMMANDS. ; ; INSERT INTERRUPT DISABLER SOFTWARE AT START OF REST. ; ;*********;NO MATCH, TRY AGAIN CALL BLK CALL PRTVAL CALL DASH CALL PCHK ;GET NEW INPUT RET C ;IF CHAR = CR THEN RETURN JR Z, A,(HL) LD C,A INC A ;IF AT END OF TABLE THEN RETURN RET Z CALL M,CRLF ;NEW LINE IF BIT 7 SET CALL CONOUT CALL DASTPUT VALUE DEC DE ;MEM PTR DJNZ PV1 RET FORM SUBTTL GENERAL PURPOSE SUBROUTINES ;***********************************ALL DASH ;OUTPUT A '-' ECHO: CALL CONI ECH1: PUSH BC LD C,A ;OUTPUT CHAR CALL CONOUT LD A,C ;RESTORE CHAR IN A POP . ; ;**************************************************************************** HILO: INC HL LD A,H ;IF HL = 0 THEN RETUZ,HILOD JP CONI ;ELSE WAIT FOR NEXT CHAR ;*************************************************************** ; ; NIBBLE RTHER, IF THE DELIMITER ; IS A CR, THE CARRY FLAG IS SET. A BLANK OR A COMMA RESETS THE CARRY FLAG. ; ;****************************************************************************************** REST: PUSH HL ;SAVE ALL REGS PUSH DE PUSH BC PUSH AF 0 %+ &, !'- "(. #)/ $*0 CALL MEMSIZ ;GET THE MONITOR STACK LOCATION EX DE,HL LD HL,10 ;GO UP 10 BYTES IN STACK ADD HL,SP LD B,4 EX DE,HL T POP DE ;BP LOCATION LD A,RS9 / 256 CP D ;SEE IF A RET BP JR Z,RS6 INC HL INC HL LD (HL),E ;RESTORE USER PC  A,B LD I,A POP IX POP IY POP AF POP BC POP DE POP HL EX AF,AF' EXX POP DE POP BC POP AF POP HL LD S LD HL,IOMSG JR COMERR ;------------------------------------------- ; ; UNINITIALIZED RESTART ERROR HANDLER ; ;------APT QUE1: PUSH AF CALL BLK LD C,(HL) ;GET CURRENT LOGICAL DEVICE CODE CALL CONOUT CALL DASH POP AF PUSH AF PUSH BY BIT 7 SET IN THE LAST CHAR OF THE STRING. ; THE STRING WILL START A NEW LNE (PRTWD) OR CONTINUE ON THE SAME LINE (PRTWA). ;CONSOLE DEVICE TO ; START A NEW LINE. ; ;*************************************************************** CRLF: PUSH HL CRL********************* DASH1: CALL HEX1 ;OUTPUT A AS HEX DASH: LD C,'-' JR CO ;*********************** ; ; PRINT ADDR RS1: DEC HL LD (HL),D ;SAVE IN WORK AREA DEC HL LD (HL),E POP DE DJNZ RS1 POP BC ;GET BREAKPOINT LOCATION + 1 DINC HL LD (HL),D EX DE,HL ;OUTPUT BP LOCATION CALL LADR RS6: LD HL,TLOCX ADD HL,SP LD BC,NBKPTS * 256 RS7: LD E,(HLP,HL DB 0 ;PLACE FOR EI LD HL,0 JP 0 ; ENDX: EQU $ ;------------------------------------------------------------------------------------------------- RSTER: LD HL,RSTMSG ;--------------------------------- ; ; COMMON ERROR HANDLER ; EHL QUE2: INC HL INC A AND 3 ;BITS 0 & 1 ARE 0 WHEN ON CURRENT ASSGN JR NZ,QUE2 LD C,(HL) ;FOUND IT, NOW OUTPUT IT CA ;**************************************************************************** PRTWD: CALL CRLF PRTWA: PUSH BC PRTA: LD C,(HFA: LD HL,CRMSG CALL PRTWA POP HL RET ;*************************************************************** ; ; LADR ROU SUBR ; ;*********************** LADRB: CALL LADRA BLK: LD C,' ' ;OUTPUT A SPACE ; FALLS INTO CO SUBR SUBTTL IOBYTE HAEC BC ;BACK UP TO RESTART INSTRUCTION LD SP,HL ;SET THE MONITOR STACK LD HL,TLOCX ;RESTORE BP ADD HL,SP PUSH DE LD D) ;RESTORE BP'D LOCATIONS LD (HL),C ;RESET SYSTEM SAVE AREA INC HL LD D,(HL) LD (HL),C INC HL LD A,E ;IF LOC = 0 ---------------- ; ; 3 TYPES OF ERRORS ARE DETECTED: A RESTART ERROR; AN I/O ASSIGNMENT ; ERROR; & CERTAIN PROGRAM ERRORS (DENTRY- HL= MESSAGE PTR ; ;--------------------------------- COMERR: CALL PRTWD JP WSVEC ;********************************LL CONOUT POP HL POP AF RRA RRA ADD HL,DE ;NEXT ENTRY DJNZ QUE1 RET ;***************************************L) RES 7,C ;MAKE SURE BIT 7 = 0 CALL CO LD A,(HL) ;IF BIT 7 = 1 THEN STOP INC HL RLCA JR NC,PRTA PRTB: POP BC RTINE OUTPUTS THE CONTENTS OF HL ON THE CONSOLE ; EITHER AT THE START OF A NEW LINE (LADRA) OR AT THE CURRENT ; CURSOR LOCATINDLERS ;******************************************************************** ; ; CONSOLE OUTPUT SELECTOR ; ENTRY- (IOBYTE BI,NBKPTS RS2: LD A,(HL) SUB C ;SEE IF SOFTWARE TRAP INC HL LD A,(HL) SBC A,B ;MAYBE, TRY REST OF ADDR JR Z,RS5 ;FOUTHEN SKIP RESTORE OR D JR Z,RS8 LD A,(HL) ;ELSE RESTORE ORIGINAL INSTR. LD (DE),A RS8: INC HL ;DO NEXT BP DJNZ RS7 TERMINED BY PARTICULAR ROUTINE WHERE THE ; ERROR CONDITION WAS ENCOUNTERED) EACH CAUSES A UNIQUE MESSAGE TO BE ; PRINTED, THEN******************************************** ; ; QUERY ROUTINE WILL TELL THE OPERATOR WHAT HIS CURRENT LOGICAL-PHYSICAL ; PER***************************** ; ; CONI ROUTINE READS THE CONSOLE & STRIPS OFF THE PARITY BIT. ; ;***************************ET ;*************************************************************** ; ; EXLF ROUTINE READS 2 PARAMETERS, PUTS THEM INTO TON (LADR). ; ;*************************************************************** LADRA: CALL CRLF LADR: LD A,H CALL HEX1 LDT 0..1): 0: CON0, 1: CON1, 2: CON2, 3: CON3 ; C= CHAR ; ;*******************************************************************ND 1, RESET IT RS3: INC HL ;NOT FOUND, TRY NEXT 1 INC HL DEC D JR NZ,RS2 RS4: INC BC ;NONE FOUND RS5: LD HL,LLOCX P EX AF,AF' ;NOW SAVE THE Z80 UNIQUES EXX PUSH HL PUSH DE PUSH BC PUSH AF PUSH IX PUSH IY LD A,I LD B,A LD  DOES A WARM INIT OF THE MONITOR. THE I/O ERROR CAUSES THE ; I/O ASSIGNMENTS TO BE RESET TO THE DEFAULT ASSIGNMENT. ; ;------IPHERAL DEVICE ASSIGNMENTS ARE. NO PARAMETERS (OTHER THAN A CR) ARE ; REQUIRED ON ENTRY. ; ;************************************************************************** CONI: CALL CI AND 7FH RTS: RET ;*********************************************HE DE ; & HL REGS, THEN DOES A CR-LF. ; ;*************************************************************** EXLF: CALL EXPR  A,L HEX1: PUSH AF RRCA RRCA RRCA RRCA CALL HEX2 POP AF HEX2: CALL CONV JR CO ;***************************** CO: LD A,(IOBYTE) AND 3 JP Z,CO0 ;CONSOLE 0 CP 2 JP M,CO1 ;CONSOLE 1 JP Z,CO2 ;CONSOLE 2 JP CO3 ;CONSOLE 3 OP DE ADD HL,SP LD (HL),E ;STORE USER (HL) INC HL LD (HL),D PUSH BC LD C,'*' ;OUTPUT BREAK INDICATION CALL CONOUA,R LD C,A PUSH BC JP WINITA ;RETURN TO MONITOR RS9: PUSH HL RST 8 ;FORCE BP EXIT: POP BC LD A,C LD R,A LD---------------------------------------------------------------------- IOER: LD A,IOBYTV ;SET IOBYTE TO DEFAULT LD (IOBYTE),A******************************************* QUERY: LD A,(IOBYTE) LD B,4 LD HL,ACT ;ADDR OF CONVERSION TABLE LD DE,ALT - ******************************* ; ; PRTWD ROUTINE OUTPUTS AN ASCII STRING ONTO THE CONSOLE. ; THE STRING MUST BE TERMINATED POP DE POP HL ;*************************************************************** ; ; CRLF ROUTINE OUTPUTS A CR-LF ON THE ****************************** ; ; DASH ROUTINE OUTPUTS A '-' TO THE CONSOLE DEVICE ; ;************************************* ;************************************************************************* ; ; CONSOLE STATUS INPUT SELECTOR ; ENTRY- (IOB 0 %+ &, !'- "(. #)/ $*0YTE BIT 0..1)= 0: CON0, 1: CON1, 2: CON2, 3: 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= CHNSOLE (ASSUME READY) RET ;******************************************************************** ; ; SERIAL CHANNEL INPUT 30H JP Z,SO0 ;SERIAL CHANNEL 0 CP 20H JP M,SO1 ;SERIAL CHANNEL 1 JP Z,SO2 ;SERIAL CHANNEL 2 JP SO3 ;SERIAL CHANNE************** CI1: CALL CSTS1 ;IF NOT READY THEN WAIT JR Z,CI1 ; IN A,(BZUDAT) ;INPUT CHAR RET CO1: IN A,(BZUST) ************************************** LO0: CALL LSTAT0 JR Z,LO0 ; LD A,0BFH ;INSURE STROBE HIGH (LOGICAL 0) OUT (PRI2STORE STROBE OUT (CENTOUT),A RET LSTAT1: IN A,(CENTS) ;IF BUSY THEN RETURN 0 CPL ;REVERSE SENSE AND A,[1 SHL CENTR ;************************************** ; ; SERIAL CHANNEL 3 (SC3) ; ;************************************** SI3: EQU ******************************************* CSTS: LD A,(IOBYTE) AND 3 JP Z,CSTS0 ;CONSOLE 0 CP 2 JP M,CSTS1 ;CONSOLE AR ; ;************************************************************************* LO: LD A,(IOBYTE) AND 0C0H JP Z,LO0 ;PRI SELECTOR ; ENTRY- (IOBYTE BIT 2..3)= 0: SC0, 4: SC1, 8: SC2, 0CH: SC3 ; EXIT - A= CHAR AND 7FH (CTRL-Z: EOF) ; ;***********L 3 SUBTTL PRIMITIVE I/O DRIVERS ;************************************** ; ; PRIMARY CONSOLE DEVICE (CON0) ; ;*********;IF NOT READY THEN WAIT AND BZUTXR JR Z,CO1 ; LD A,C ;OUTPUT CHAR OUT (BZUDAT),A RET CSTS1: IN A,(BZUST) ;IF RXCNT),A LD A,C ;OUTPUT CHARACTER OUT (PRI1DO),A LD A,NOT [1 SHL PRI1CSB] ;OUTPUT STROBE OUT (PRI2CNT),A LD A,0BFH OBSY] RET Z ; LD A,-1 ;ELSE RETURN -1 RET ;************************************** ; ; LIST DEVICE 2 (LST2) ; ;**IOER SO3: EQU IOER SUBTTL MESSAGES CRMSG: DM CR,LF RSTMSG: DM 'RST ERR' BOOTEM: DM 'BOOT LOAD ERR',CR,LF USRMSG: DM '1 JP Z,CSTS2 ;CONSOLE 2 JP CSTS3 ;CONSOLE 3 ;******************************************************************** ; NTER 0 CP 80H JP M,LO1 ;PRINTER 1 JP Z,LO2 ;PRINTER 2 JP CO ;CONSOLE ;*************************************************************************************************** RI: LD A,(IOBYTE) AND 0CH JP Z,SI0 ;SERIAL CHANNEL 0 CP 8 JP***************************** CI0: CALL CSTS0 ;IF CHAR NOT READY THEN WAIT JR Z,CI0 ; IN A,(NTD) ;ELSE RETURN CHAR RETRDY NOT TRUE THEN RETURN 0 AND BZURXR RET Z ; LD A,-1 ;ELSE RETURN -1 RET ;************************************UT (PRI2CNT),A ;CLEAR STROBE RET LSTAT0: IN A,(PRI1ST) ;FETCH STATUS CPL AND A,[1 SHL PRI1BSB] ;TEST RET Z ; L************************************ LO2: EQU IOER LSTAT2: EQU IOER ;************************************** ; ; SERIAL MEMORY = ' IOMSG: DM 'I/O ERR' QMSG: DM '????' LOGMSG: DM 'ZMON VERS ',HIGH VERSN,'.',LOW VERSN,CR,LF SUBTTL CONSTANTS ; ; CONSOLE INPUT SELECTOR ; 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, 80H: LS M,SI1 ;SERIAL CHANNEL 1 JP Z,SI2 ;SERIAL CHANNEL 2 JP SI3 ;SERIAL CHANNEL 3 ;************************************** CO0: IN A,(NTS) ;IF NOT READY TO ACCEPT CHAR THEN WAIT AND 1 SHL NTBSY JR NZ,CO0 ; LD A,C ;OUTPUT CHAR & RETURN ** ; ; ALTERNATE CONSOLE DEVICE (CON2) ; ;************************************** CO2: EQU IOER CSTS2: EQU IOER CI2: EQU ID A,-1 RET ;************************************** ; ; LIST DEVICE 1 (LST1) ; ;**************************************CHANNEL 0 (SC0) ; ;************************************** SI0: EQU IOER SO0: EQU IOER ;************************************************************************************* ; ; TBL CONTAINS THE ADDRESSES OF THE COMMANDS. ; THE EXECUTIVE USES IT******************************************************************* CI: LD A,(IOBYTE) AND 3 JP Z,CI0 ;CONSOLE 0 CP 2 JT2, C0H: CON ; EXIT - A= 0: BUSY, FFH: READY ; ;************************************************************************* LS*********************************** ; ; SERIAL CHANNEL OUTPUT SELECTOR ; ENTRY- (IOBYTE BIT 4..5)= 0: SC0, 10H: SC1, 20H: SC2 OUT (NTD),A RET CSTS0: IN A,(NTS) ;IF NOT CHAR NOT READY THEN RETURN 0 AND 1 SHL NTRDY RET Z ; LD A,-1 ;ELSE REOER ;************************************** ; ; ALTERNATE CONSOLE DEVICE (CON3) ; ;************************************ LO1: CALL LSTAT1 ;IF BUSY THEN WAIT JR Z,LO1 ; LD A,[1 SHL CENTDST] ;INSURE STROBE STARTS HIGH OUT (CENTOUT),A LD A,****** ; ; SERIAL CHANNEL 1 (SC1) ; ;************************************** SI1: EQU IOER SO1: EQU IOER ;************ TO LOOK UP THE DESIRED ADDR. ; ;***************************************************** TBL: DW ASGN ;A DW BOOTC ;B DW QP M,CI1 ;CONSOLE 1 JP Z,CI2 ;CONSOLE 2 JP CI3 ;CONSOLE 3 ;**********************************************************TAT: LD A,(IOBYTE) AND 0C0H JP Z,LSTAT0 ;PRINTER 0 CP 80H JP M,LSTAT1 ;PRINTER 1 JP Z,LSTAT2 ;PRINTER 2 LD A,-1 ;CO, 30H: SC3 ; C= CHAR ; ;************************************************************************* PUNO: LD A,(IOBYTE) ANDTURN -1 RET ;************************************** ; ; ALTERNATE CONSOLE DEVICE (CON1) ; ;************************** CO3: EQU IOER CSTS3: EQU IOER CI3: EQU IOER ;************************************** ; ; LIST DEVICE 1 (LST1) ; ;C ;OUTPUT CHAR SET CENTDST,A OUT (CENTOUT),A RES CENTDST,A ;OUTPUT LOW TRUE STROBE OUT (CENTOUT),A SET CENTDST,A ;RE************************** ; ; SERIAL CHANNEL 2 (SC2) ; ;************************************** SI2: EQU IOER SO2: EQU IOEPRT ;C DW DISP ;D DW QPRT ;E DW FILL ;F DW GOTO ;G DW QPRT ;H DW INPT ;I DW QPRT ;J DW QPRT ;K DW QPR 0 %+ &, !'- "(. #)/ $*0T ;L DW MOVE ;M DW QPRT ;N DW OUPT ;O DW QPRT ;P DW QUERY ;Q DW QPRT ;R DW SUBS ;S DW MTEST ;T DW QPR ;LOGICAL CONSOLE DEVICE TABLE DB '3' ; CONSOLE 3 DB '2' ; CONSOLE 2 DB '1' ; CONSOLE 1 DB '0' ; CONSOLE 0 ;****************** ; ; This Monitor program resides at the top of memory & allows memory ; modification & testing, program bre status incorrectly. ; 1.5 - 29 SEP 85 GRH ; Fix bug in Input command which caused monitor to crash. ; The jump to 'BITS**** FORM FALSE EQU 0 TRUE EQU NOT FALSE LSTINC EQU FALSE ; ; INCLUDE SYSTEM DEFINITION FILES ; ;*INCLUDE NAKEDT.DEF ============ ; ; VARIABLES ; ;============================ IOBYTE EQU 3 ;ADDR OF I/O CONTROL BYTE IOBYTV EQU 00H ;DEFA INIT ;COLD START CONIN JP CI ;CONSOLE INPUT READER JP RI ;READER CONOUT JP CO ;CONSOLE OUTPUT PUNCH JP PUNO ;PUNCH LIT ;U DW COMP ;V DW QPRT ;W DW XMNE ;X DW QPRT ;Y DW BYE ;Z ;----------------------- ; ; IOBYTE TABLE ; ;---------------------------------- ; ; Z80 REGISTER OFFSET TABLE ; ;--------------------------------- ACTBL: DB 80H + 'A',ALeakpoints, console, printer, punch & ; reader I/O drivers and transfer to system boot ROM residing in same memory ; area as th2' expects DE to be on stack. ; 1.6 - 6 DEC 85 GRH ; Add code to disable all Jade controllers from 40H to 43H after ; rese ;*INCLUDE MONBOARD.DEF ;*INCLUDE BIGZ.DEF ;*INCLUDE JDDCONT.DEF ;*INCLUDE IOBOARD.DEF ;*INCLUDE PRI.DEF ; LIST OFF *INCULT IOBYTE VALUE ; SPSV EQU 6 ;STACK PTR SAVE LOCATION ; ; REGISTER STORAGE DISPLACEMENTS FROM NORMAL SYSTEM ; STACK LOCATST JP LO ;LIST OUTPUT CONST JP CSTS ;CONSOLE STATUS JP IOCHK ;PUT IOBYTE INTO A JP IOSET ;(C) HAS NEW IOBYTE JP MEMCK---------------------- ALT: DB 'L' ;LOGICAL LIST DEVICE TABLE DB 'C' ; CONSOLE DB '2' ; LIST DEVICE 2 DB '1' ; LISOC DB 'B',BLOC DB 'C',CLOC DB 'D',DLOC DB 'E',ELOC DB 'F',FLOC DB 'H',HLOC DB 'L',LLOC DB 80H + 'M',HLOC + 0C0H is ROM. ; ;**************************************************************************** ; ; Revision status: ; ; 1.0 - Relt. ; 1.7 - 8 FEB 86 GRH ; Remove time delay from power up reset code to allow ISHA to access ; ram. ; Remove the auto-boLUDE NAKEDT.DEF *INCLUDE MONBOARD.DEF *INCLUDE BIGZ.DEF *INCLUDE JDDCONT.DEF *INCLUDE IOBOARD.DEF *INCLUDE PRI.DEF LIST OION. ; ALOC EQU 15H BLOC EQU 13H CLOC EQU 12H DLOC EQU 11H ELOC EQU 10H FLOC EQU 14H HLOC EQU 31H LLOC EQU 30H PLOC EQ ;MEMORY LIMIT CHECK JP RTS ;IODEF- DEFINE USER I/O ENTRY POINTS JP RTS ;SPECIAL I/O CONTROL JP REST ;BREAKPOINT ENTRYT DEVICE 1 DB '0' ; LIST DEVICE 0 ; APT: DB 'P' ;LOGICAL PUNCH DEVICE TABLE DB '3' ; SERIAL CHANNEL 3 DB '2' ; SE DB 'P',PLOC + 80H DB 'S',SLOC + 80H DB 'I',ILOC ; ; PRIME Z80 REGISTER OFFSETS ; PRMTB: DB 80H + 'A',APLOC DB 'B',BPease ; 1.1 - ; Add Double D deselect upon reset code. ; Change printer port. ; 1.2 - 20 FEB 83 GRH ; Add delay before turot from reset function. ; ; 1.8 - 29 MAY 86 GRH ; Add Cromemco PRI printer driver as primary printer. ; Change IOBYTE defiN ;============================ ; ; ASSEMBLE TIME VARIABLES ; ;============================ ROM EQU 0F800H ;ROM START AU 34H SLOC EQU 17H TLOC EQU 35H TLOCX EQU 25H LLOCX EQU 20H ; APLOC EQU 9 BPLOC EQU 11 CPLOC EQU 10 DPLOC EQU 13 EPLOC LPSTAT: JP LSTAT ;LINE PRINTER STATUS RETURN DS 6 ;SAVE 2 SPARES ;------------------------------------------------ ; RIAL CHANNEL 2 DB '1' ; SERIAL CHANNEL 1 DB '0' ; SERIAL CHANNEL 0 ; ART: DB 'R' ;LOGICAL READER DEVICE TABLE DB '3LOC DB 'C',CPLOC DB 'D',DPLOC DB 'E',EPLOC DB 'F',FPLOC DB 'H',HPLOC DB 'L',LPLOC DB 'M' + 80H,HPLOC + 0C0H DB ' TITLE M5b Z-80 MONITOR LIST NOCOND ;*************************************************************************** ; ; SYSTEMning off boot image, in case logic ; too slow. ; 1.3 - 17 MAR 84 GRH ; Change to allow Boot command parameter passing to nitions. ; Remove initialization of Jade FDC port 40H in anticipation of ; Cromemco bank select useage. ; ; 1.X 3 JUN 86 DDR WSVEC EQU 0 ;VECTOR NUMBER FOR WARM RESTART NBKPTS EQU 2 ;NUMBER OF BREAKPOINTS ;============================ ; ;  EQU 12 FPLOC EQU 8 HPLOC EQU 15 LPLOC EQU 14 XLOC EQU 7 YLOC EQU 5 RLOC EQU 2 ILOC EQU 3 SUBTTL MAIN PROGRAM ORG ROM; THE FOLLOWING CODE MUST RESIDE AT THE SAME ; ADDR AS THE BOOT ROM START CODE. ; ;----------------------------------------' ; SERIAL CHANNEL 3 DB '2' ; SERIAL CHANNEL 2 DB '1' ; SERIAL CHANNEL 1 DB '0' ; SERIAL CHANNEL 0 ; ACT: DB 'C'X',XLOC + 80H DB 'Y',YLOC + 80H DB 'R',RLOC DB -1 END  MONITOR FOR M5b ; (c) 1982,1983 GRH ELECTRONICS, CUPERTINO, CA ; ;*********************************************************boot ROM. ; ; 1.4 - 2 JUN 84 GRH ; Fix bug in line printer status subroutine which hung the ; line printer by sensing th GRH ; MODIFY TO WORK WITH M5INIT ; VERSN EQU '1x' ;************************************************************************ CONSTANTS ; ;============================ CTRLS EQU 13H ;ASCII DC3 CR EQU 0DH LF EQU 0AH BELL EQU 7 ;================ ;-------------------------------------- ; ; JUMP TARGETS FOR BASIC I/O ; ;-------------------------------------- CBOOT JP-------- DBOOT: LD A,C ;PERFORM SWAP AND 7 ;CLEAR ERROR MSG IN CASE ROM NOT THERE & MASK OUT ROMSEL,A RET ;--------- 0 %+ &, !'- "(. #)/ $*0----------------------------- ; ; THE COLD INITIALIZATION CODE ; ;-------------------------------------- INIT: ; ; INSUMORY SIZE PUSH HL ;SAVE VALUE FOR LATER ; ; COMPUTE # KS ; LD A,H ; /1024 SRL A SRL A LD C,0 ;TENS COUNT = 0 MEHL LD (SPSV),HL ;SAVE INITIAL STACK VALUE ; ; INITIALIZE REGISTER IMAGES TO 0 ; LD D,10 INIT2: PUSH BC DEC D JR NZM ADDR BOOTCC: CALL DBOOT LD HL,BOOTEM CALL C,PRTWD ; JR WINIT ;GO TO MONITOR EXEC ;******************************,BC POP BC ;UNPREDICTABLE DURING INIT RET ;***************************************************************************EADY ;**************************************************************************** ; ; EXPR SUBR. READS PARAMETERS FROM THE;GET NEXT # EX1: LD C,A ;SAVE CHAR FOR LATER CALL NIBBLE JR C,EX2 ;IF NOT NUMBER THEN EXIT ADD HL,HL ;PARAM = PARAM *  THE ; TTY DEVICE (SYSTEM CONSOLE) IS SET UP AS THE DEFAULT DEVICE. ; ; Ax ;x= C,R,P,L (CONSOLE,READER,PUNCH,LIST) ; Ax-RE INTERRUPTS DISABLED ; DI ; ; REMOVE PAGE 0 IMAGE ; XOR A,A ;32K BYTESAVER OUT (40H),A ; ; INITIALIZE RESTARTMLP: SUB 10 ;NUMBER = NUMBER - 10 JR C,MEM1 ; INC C ;IF < 10 THEN C = TENS DIGIT JR MEMLP ; MEM1: ADD '0' + 10 ;CONVE,INIT2 ; ; INITIALIZE BIG Z 8251 ; XOR A ;GET IT'S ATTENTION 1ST LD B,5 URTLP: OUT (BZUDAT),A EX (SP),HL ;DELAY A ********************************************** ; ; MEMSIZ SUBR CALCULATES THE TOP OF CONTIGUOUS RAM. IT SEARCHES FROM ; THE B* ; ; MEMCHK SUBR FINDS THE CURRENT TOP OF CONTIGUOUS MEMORY (LESS THE ; MONITOR WORKSPACE) & RETURNS THE VALUE. ; EXIT - B CONSOLE & DEVELOPS A 16 BIT HEX ; FOR EACH ONE. A CARRIAGE RETURN WILL TERMINATE THE ENTRY SEQUENCE. A BLANK ; OR COMMA WILL 16 ADD HL,HL ADD HL,HL ADD HL,HL OR L ;ADD IN NEW DIGIT LD L,A JR EX0 ;GET NEXT ; EX2: EX (SP),HL ;PUT UNDER REy ;y= C: T,C,B,1 (TTY,CRT,BAT,UC1) ; R: T,P,1,2 (TTY,PTR,UR1,UR2) ; P: T,P,1,2 (TTY,PTP,UP1,UP2) ; L: T,L VECTORS IN PAGE 0 ; LD SP,3FH ;USE STACK TO INIT RESTARTS LD HL,0C300H LD DE,RSTER LD B,16 ;64 BYTES INIT1: PUSH DERT TO + ASCII # LD B,A LD A,C ;IF TENS = 0 THEN OUTPUT SPACE ADD '0' CP '0' JR NZ,NOT0 LD A,' ' NOT0: LD C,A WHILE EX (SP),HL DJNZ URTLP LD A,BZUMOD ;OUTPUT MODE BYTE OUT (BZUCMD),A LD A,BZUCM ;OUTPUT COMMAND BYTE OUT (BZUCMOTTOM UP UNTIL A NON-RAM LOCATION IS FOUND. IT THEN TAKES OFF FOR ; MONITOR WORK SPACE NEEDS. ; EXIT - HL= MEMTOP PTR ; ;***= HIGH BYTE OF RAM ; A= LOW BYTE OF RAM ; ;**************************************************************************** MEMEND THE CURRENT PARAMETER ENTRY. EACH PARAMETER ONLY TAKES ; THE LAST 4 DIGITS TYPED IN. ANY EXCESS IS DISCARDED. A NON-HEX DIGTURN ADDR ON STACK PUSH HL LD A,C ;IF LAST CHAR = DELIM THEN EXIT CALL P2C JR NC,EX3 DJNZ QPRT ;ELSE IF MORE REQ'D T,1,2 (TTY,CRT,LPT,UL1) ; ;---------------------------------------------------------------------------- ASGN: CALL ECHO ;GET  PUSH HL DJNZ INIT1 ; ; SET TEMPORARY STACK ; LD SP,80H ; ; REMOVE JADE DOUBLE D WINDOW(S) ; LD A,DDFREE ;REMO CALL CO LD C,B CALL CO LD C,'K' CALL CO CALL CRLF POP HL ;MEMTOP ; ; CONTINUATION OF THE SCS MONITOR, MOVE EXID),A IN A,(BZUDAT) ;READ ANY GARBAGE CHAR ; ; INSERT I/O INIT CODE HERE ; ; ; OUTPUT SIGN-ON MESSAGE ; LD HL,LOGMS************************************************************************* MEMSIZ: PUSH BC ;MONITOR START LOCATION LD BC,ROM CK: PUSH HL CALL MEMSIZ ;GET THE RAM SIZE LD A,L ;TAKE OFF WORKSPACE SUB 60 JR NC,MEMCK0 DEC H MEMCK0: LD B,H POPIT WILL ; TERMINATE THE ENTRY SEQUENCE & CAUSE A WARM BOOT OF THE MON. ; ENTRY- B= # OF PARAMETERS NEEDED ; EXIT - STACK= PARHEN ERR RET ;ELSE RETURN ;---------------------------------------------------------------------------- ; ; LOGICAL ASSITHE LOGICAL DEVICE DESIRED LD HL,ALT ;START OF CONVERSION TABLE LD DE,APT - ALT ; # OF ELEMENTS LD B,4 ; COUNT = # ENTRIVE DD WINDOW, IF PRESENT OUT (41H),A OUT (42H),A OUT (43H),A ; ; INITIALIZE IOBYTE ; LD C,IOBYTV ;SET TO INITIAL IOT ROUTINE TO RAM ; LD SP,HL LD DE,EXIT EX DE,HL LD BC,ENDX - EXIT LDIR ; LD BC,NBKPTS * 3 ;CONTINUE 'JP 0' G ;OUTPUT SIGN-ON CALL PRTWD JR WINIT ; ; SPECIAL DISK BOOT CODE SWAPS ROMS FOR BOOT ; IF BOOT SUCCESSFUL, DOES NOT RET LD HL,-1 MEMSZ1: INC HL LD A,(HL) CPL LD (HL),A CP (HL) CPL LD (HL),A JR NZ,MEMSZ2 ; LD A,H ;SEE IF ON MONI HL RET ;************************************** ; ; EXF SUBR. READS 1 PARAMETER. ; ENTRY- A= PARAMETER 1ST CHAR ; EXIT AMETERS ; ;**************************************************************************** AS3: DJNZ AS2 ;PART OF THE ASSIGN COGNMENT OF PERIPHERALS COMMAND ; ; THIS COMMAND CONTROLS THE ASSIGNMENT OF PHYSICAL PERIPHERALS TO THE ; 4 LOGICAL DEVICE TYPEES AS0: CP (HL) ;IF CHAR = TABLE[LOGICAL] THEN JR Z,AS1 ; EXIT ADD HL,DE ;ELSE NEXT LOGICAL ENTRY DJNZ AS0 QPRT: LD BYTE VALUE CALL IOSET ; ; SIZE AND DISPLAY MEMORY ; LD HL,USRMSG ;OUTPUT MEMORY= CALL PRTWD CALL MEMSIZ ;OUTPUT MEFOR 3 TIMES PUSH DE POP HL DEC HL LDIR ; LD HL,-24 ADD HL,SP PUSH HL INC HL ;ADJUST USER STACK LOCATION INC URN. ; IF UNSUCCESSFUL, RETURNS CARRY IF ERROR, NO CARRY IF DISK NOT INSERTED. ; BOOTCD: LD C,XDBROM ;PASS IN DEFAULT BOOT ROTOR BORDER CP B JR NZ,MEMSZ1 MEMSZ2: DEC HL ;TAKE OFF WORKSPACE LD BC,EXIT-ENDX-3*NBKPTS+1 ;EXIT RTN + BP JUMPS ADD HL- STACK= PARAMETER ; ;************************************** EXF: LD B,1 ;SET 1 PARAM LD HL,0 JR EX1 ;1ST CHAR IN A ALRDE EX3: JR NZ,QPRT ;NON 0 IS ERR EXPR1: DEC B ;IF NO PARAMS THEN RETURN RET Z EXPR: LD HL,0 ;PARAM = 0 EX0: CALL ECHO S. IT ALTERS (IOBYTE) TO MATCH THE CURRENT ASSIGNMENT. ; THE 4 LOGICAL DEVICES ARE CONSOLE, READER, LIST & PUNCH. IN ALL CASES,HL,QMSG ;OUTPUT ? MESSAGE CALL PRTWA ;---------------------------- ; ; THE WARM START CODE ; ;------------------------ 0 %+ &, !'- "(. #)/ $*0---- WINIT: LD SP,(SPSV) ;RESTORE THE STACK WINITA: LD HL,WINIT ;RESET RETURN & WARM START VECT PUSH HL LD (WSVEC + 1),HL START_ADDR> ; ;---------------------------------------------------------------------------- FILL: CA BITS NOW OFF OR L ;PUT IN NEW VALUE LD C,A ;************************************** ; ; SET IOBYTE SUBR ; ENTRY- C= N ; MONITOR WITHOUT ALTERING ANYTHING. ; ; Z ; ;-------------------------------------------------------------------------------------------------------- COMP: CALL EXPR3 CMPA: LD A,(BC) ;GET SOURCE 2 DATA PUSH BC ;SAVE SOURCE 2 PTR LD B,(HL ; ;---------------------------------------------------------------------------- DISP: CALL EXLF ;GET BLOCK LIMITS DIS1: CA NZ,DIS4 ;NO JR DIS1 ;YES ; DIS7: SUB A,E ;SKIP OVER TO START ASCII CALL TRPLSP JR DIS3 ; TRPLSP: AND 0FH ;ISOLATEN AT START_ADDR WITH ; BREAKPOINT AT BP1 AND OPTIONAL BREAKPOINT AT BP2 ; G,[,] ;START EXECUTION AT PC VALUE WITH LD A,0C3H LD (WSVEC),A CALL CRLF CALL DECHO ;GET COMMAND SUB 'A' ;IF CHAR <> 'A' -> 'F' THEN ERR JR C,QPRT CP 'ZLL EXPR3 ;GET 3 PARAMS FIO: LD (HL),C ;PUT DOWN THE FILL VALUE CALL HILO ;INC & CHECK THE PTR JR NC,FIO POP DE ;RESTOEW IOBYTE VALUE ; ;************************************** IOSET: LD A,C LD (IOBYTE),A ;SAVE NEW ASSIGNMENTS RET ;*****---- BYE: LD B,2 ;SET UP FOR 2 CHARS BYE1: CALL CONI CP BELL ;IF NOT BELL THEN RESTART JR NZ,BYE CALL ECH1 ;ECHO THE ) ;GET SOURCE 1 DATA CP B ;IF S2=S1 THEN EXIT JR Z,CMPB PUSH AF ;SAVE S2 DATA CALL LADRB ;OUTPUT ADDR LD A,B CALLL LADRB ;DISPLAY START ADDR LD A,L ;SEE IF ON 16 BYTE BOUNDARY CALL TRPLSP ;SKIP OVER TO RIGHT COLUMN PUSH HL DIS2: L LOW NIBBLE LD B,A ;PREPARE TO SPACE OVER TO RIGHT ADD A,A ; COLUMN ADD B TRPL2: LD B,A INC B TRPL1: CALL BLK ;DO  BREAKPOINT(S) AT ; BP1 & OPTIONAL BP2. ; ;---------------------------------------------------------------------------- G' - 'A' + 1 JR NC,QPRT ADD A,A ;OFFSET = INDEX * 2 LD E,A LD D,0 LD B,2 ;PASS IN 2 PARAMS TO HANDLER LD HL,TBL ;RE SP IN CASE STACK JR WINIT ; WAS OVERWRITTEN ;---------------------------- ; ; ASSIGN CONTINUED ; ;----------------************************************** ; ; RETURN IOBYTE VALUE SUBR ; EXIT - A= CURRENT IOBYTE VALUE ; ;*******************BELL DJNZ BYE1 RET ;---------------------------------------------------------------------------- ; ; VERIFY MEMORY COMML DASH1 ;FORMAT POP AF CALL HEX1 ;OUTPUT S2 CMPB: POP BC CALL HILOXB JR CMPA ;------------------------------------D A,(HL) ;GET CONTENTS CALL HEX1 CALL HILO ;INC & CHECK PTR JR C,DIS7 ;DONE IF CARRY CALL BLK ;MAKE COLUMNS LD A,LSPACING DJNZ TRPL1 RET ;---------------------------------------------------------------------------- ; ; GOTO COMMAND OTO: CALL PCHK ;SEE IF OD ADDR WANTED JR C,GO3 JR Z,GO0 ;YES, BUT SET BP CALL EXF ;GET NEW GOTO ADDR POP DE LD HL,PADDRESS = (TABLE + OFFSET) ADD HL,DE LD A,(HL) INC HL LD H,(HL) LD L,A JP (HL) ;--------------------------------------------- AS1: LD D,B ;SAVE THE COUNTER RESIDUE LD B,4 CALL DECHO ;GET NEW ASSIGNMENT AS2: INC HL ;PTR = PTR + 1 C************************ IOCHK: LD A,(IOBYTE) RET ;---------------------------------------------------------------------AND ; ; THIS ROUTINE COMPARES 2 BLOCKS OF MEMORY AGAINST EACH OTHER. IF A ; DIFFERENCE IN THE RELATIVE ADDRESS CONTENTS IS DE---------------------------------------- ; ; DISPLAY MEMORY COMMAND ; ; THIS ROUTINE DISPLAYS A BLOCK OF MEMORY ON THE CONSO ;READY FOR NEW LINE? AND 0FH JR NZ,DIS2 DIS3: POP HL ;RESTORE START OF LINE LD A,L ;SKIP OVER TO RIGHT SPACE AND 0F; ; GOTO COMMAND TRANSFERS CONTROL TO A SPECIFIED ADDRESS IT ALLOWS THE ; SELECTIVE SETTING OF UP TO 2 BREAKPOINTS AS WELL AS LOC ;PUT ADDR IN PC LOCATION ADD HL,SP LD (HL),D DEC HL LD (HL),E LD A,C ;IF LAST = CR THEN EXIT CP CR JR Z,GO3 ------------------------------------------- ; ; FILL MEMORY COMMAND ; ; THIS ROUTINE FILLS A BLOCK OF MEMORY WITH A USER DEFP (HL) ;IF CHAR <> (TABLE) THEN EXIT JR NZ,AS3 LD L,B ;SAVE THE RESIDUE TO FORM ASGNT DEC L LD B,D LD H,3 DEC B ------- ; ; SLEEP COMMAND ; ; THE BYE ROUTINE IS USED TO PREVENT UNAUTHORIZED USAGE OF THE SYSTEM. ; THE SYSTEM LOCKS UP & TECTED, THE ADDRESS OF THE ; 1ST BLOCK IS DISPLAYED, ALONG WITH IT'S CONTENTS & THE CONTENTS OF THE ; OTHER BLOCK'S SAME RELATLE DEVICE. THE ; USER MUST SPECIFY THE START & FINISH ADDRESSES. THE DISPLAY IS ORGANIZED TO ; DISPLAY UP TO 16 BYTES PER DISPH CALL TRPL2 DIS4: LD A,(HL) ;OUTPUT MEMORY IN ASCII AND 7FH ;IF PRINTABLE THEN OUTPUT LD C,A CP ' ' JR C,DIS5 CPALLOWING ANY CONSOLE ; INPUT TO BREAKPONT THE RUN, AS LONG AS INTERRUPT 1 IS ACTIVE. ; ; G ;START EXECUTION AT WHATEVER GO0: LD B,NBKPTS LD HL,TLOC ;POINT TO TRAP STORAGE ADD HL,SP GO1: PUSH BC ;# BPS PUSH HL ;STORAGE PTR LD B,2 CALLINED CONSTANT. IT ; EXPECTS 3 PARAMETERS TO BE ENTERED IN THE FOLLOWING ORDER: ; START ADDR, FINISH ADDR, FILL VALUE ; ; F< JR Z,AS5 ;NO SHIFT NEEDED AS4: ADD HL,HL ;SHIFT MASKS ADD HL,HL DJNZ AS4 AS5: LD A,(IOBYTE) OR H XOR H ;LOGICALWILL NOT RESPOND TO ANYTHING OTHER THAN 2 ASCII BELL ; CHARACTERS. WHEN IT SEES THEN CONSECUTIVELY, CONTROL IS RETURNED TO THE IVE ADDRESS. ; ; V ; ;--------------------------------------------LAY LINE, WITH ALL COLUMNS ALIGNED SO EACH ; COLUMN HAS THE SAME LAST HEX DIGIT IN IT'S ADDR. ; ; D[ ] 7EH JR C,DIS6 DIS5: LD C,'.' ;ELSE OUTPUT '.' DIS6: CALL CONOUT CALL HILOX LD A,L ;READY FOR NEW LINE? AND 0FH JR IS IN PC REG (NO BPS) ; G ;START EXECUTION AT START_ADDR (NO BPS) ; G,[,] ;START EXECUTIO EXPR1 POP DE ;GET TRAP ADDR POP HL ;SPTR LD A,D ;INSURE 0 WASN'T SPEC'D OR E JR Z,GO2 LD (HL),E ;SAVE BP ADDR 0 %+ &, !'- "(. #)/ $*0 INC HL LD (HL),D INC HL LD A,(DE) ;SAVE BP ADDR INSTRUCTION LD (HL),A INC HL LD A,0CFH ;INSERT THE BP LD (DE),A------------------ INPT: CALL EXPR1 ;GET INPUT PORT # INTO C CALL CRLF ;PUT DATA ON NEW LINE POP BC IN E,(C) PUSH DE ------------------------------------------------------- MOVE: CALL EXPR3 MOV1: LD A,(HL) ;MOVE 1 BYTE LD (BC),A CALL HILORAM. THE CONTENTS MAY BE ; LEFT UNALTERED BY ENTERING A SPACE, COMMA OR RETURN. IF A RETURN IS ; ENTERED, THE ROUTINE IS TERMIIF DELIM = CR THEN DONE CP CR RET Z SUB2: INC HL ;PTR = PTR + 2 INC HL SUB3: DEC HL ;PTR = PTR - 1 LD A,L ;IF ON MO JR MTEST1 ; BITS: PUSH DE LD E,A CALL LADRB ;OUTPUT ADDR BITS2: LD B,8 ;BIT COUNT BITS1: LD A,E RLCA LD E,A LD END OF TABLE THEN RETURN RET Z JP P,XAB ;SORT OUT BIT 7 OF TABLE OR 80H ;SET IT ON TEST VALUE JR XAC ; XAB: AND 7FH OF REG LOOK-UP TABLE XMNE1: CALL PCHK JR C,XG ;IF CHAR = CR THEN SHOW ALL JR Z,XMNE1 ;IF CHAR = ' ' OR ',' THEN LOOP C GO2: LD A,C ;IF CHAR = CR THEN DONE BPING CP CR POP BC JR Z,GO3 DJNZ GO1 ;ELSE IF <2 BPS THEN LOOP GO3: CALL CRLF  ;FIX BUG. BITS2 POPS DE BEFORE 'RET' JR BITS2 ;OUTPUT VALUE ;-------------------------------------- ; ; OUTPUT DATA TO XB JR MOV1 ;------------------------------------------------ ; ; BOOT COMMAND ; ALLOWS EXECUTION OF A BOOT PROM ; ; BNATED. IF A SPACE OR COMMA IS ENTERED, THE ; ROUTINE PROCEEDS TO THE NEXT LOCATION & PRESENTS THE USER WITH AN ; OPPORTUNITY TD 8 BOUNDARY THEN AND 7 ; OUTPUT ADDR CALL Z,LADRB JR SUB1 ;--------------------------------------------------------- A,'0' / 2 ;BUILD ASCII 1 OR 0 RLA LD C,A CALL CONOUT DJNZ BITS1 POP DE RET ;------------------------------------ ;RESET BIT 7 XAC: DEC (HL) ;TO BE PULLED OUT IN ROM CP (HL) JR NZ,XAA ;NO MATCH, TRY AGAIN CALL BLK CALL PRTVAL CP '''' ;IF NOT PRIMES THEN EXIT JR NZ,XA LD HL,PRMTB JR XMNE1 ; XG: LD A,(HL) LD C,A INC A ;IF AT END OF TABLE THE;NEW LINE FOR PGM POP HL ;GET RID OF STACK JUNK LD HL,RS9 PUSH HL LD HL,REST LD (9),HL ;SET BP VECTOR ADDR LD HL,2PORT COMMAND ; ; O ; ;-------------------------------------- OUPT: CALL EXPR ;GET DATA INTO<(ARG * 10H) + PROM #> ; ARG :: 0..FH (PASSED TO BOOT ROM) ; PROM # :: 0..7 (DEFAULT # = 02H) ; ;------------------------O ALTER IT. ; ; S ; ;---------------------------------------------------------------------------- SUBS: CALL EXPR1 ------------------- ; ; MTEST COMMAND TESTS A SPECIFIED BLOCK OF MEMORY TO SEE IF ANY HARD ; DATA BIT FAILURES EXIST. IT IS N---------------------------------------- ; ; EXAMINE REGISTERS COMMAND ; INSPECTS THE VALUES OF THE REGISTERS STORED BY THE LALL DASH CALL PCHK ;GET NEW INPUT RET C ;IF CHAR = CR THEN RETURN JR Z,XF ;IF NO CHANGE THEN EXIT PUSH HL ;PTR CALN RETURN RET Z CALL M,CRLF ;NEW LINE IF BIT 7 SET CALL CONOUT CALL DASH CALL PRTVAL CALL BLK INC HL ;NEXT ENTRY 4 ;FIND REG SET ROUTINE ADDR ADD HL,SP POP DE ;ADJUST STACK JP (HL) ;GO DO REG RESTORE ;---------------------------- E, PORT # INTO C POP DE POP BC OUT (C),E RET ;---------------------------------------------------------------------------------------------- BOOTC: CALL PCHK ;IF NO FURTHER INPUT THEN USE DEFAULT JP C,BOOTCD CALL EXF ;GET USER BOOT # P;GET ADDR CALL CRLF ;START ON NEW LINE POP HL SUB1: LD A,(HL) ;OUTPUT EXISTING CONTENTS CALL DASH1 CALL PCHK ;GET NEOT AN EXHAUSTIVE TEST, BUT JUST A QUICK ; INDICATION OF THE MEMORY'S OPERATIVENESS. ; ; T ; ;------AST ENCOUNTERED ; BREAKPOINT. THE VALUES MAY BE MODIFIED IF DESIRED. ; ; X ;DISPLAY ALL REGISTER VALUES ; ;r= A,L EXF POP HL LD A,L INC DE LD (DE),A EX (SP),HL ;RECOVER TABLE PTR LD A,(HL) ;GET THE ATTRIBUTES EX (SP),HL RL JR XG ; PRTVAL: INC HL ;NEXT ENTRY LD A,(HL) ;GET OFFSET & ATTRIBUTES AND 3FH ;ISOLATE OFFSET ADD A,2 ;ALLOW FOR R------------------------------------------------ ; ; INPUT FROM PORT COMMAND ; ; THESE ROUTINES ALLOW BYTE-BY-BYTE INPUT OR ------ ; ; MOVE COMMAND ; ; THIS ROUTINE EXPECTS 3 PARAMETERS, ENTERED IN THE FOLLOWING SEQUENCE: ; SOURCE 1ST BYTE ADDR, SOP BC JP BOOTCC ;---------------------------------------------------------------------------- ; ; SUBSTITUTE MEMORY COMMAW VALUE RET C ;IF CHAR = CR THEN RETURN JR Z,SUB2 ;IF CHAR = ' ' OR ',' THEN EXIT CP LF ;IF CHAR = LF THEN BACK UP JR---------------------------------------------------------------------- MTEST: CALL EXLF MTEST1: LD A,(HL) PUSH AF CPL LDB,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 ; ;------------------CA ;IF 8 BIT REG THEN EXIT JR NC,XE INC DE ;ELSE REG PAIR, DO OTHER 8 BITS LD A,H LD (DE),A XE: POP HL ;TABLE PTR ET ADDR EX DE,HL LD L,A ;BUILD ADDR OF REG CONTENTS LD H,0 ADD HL,SP EX DE,HL LD A,(HL) ;NOW FIND ATTRIBUTES LD OUTPUT FROM THE CURRENT ; CONSOLE DEVICE. ; ; I ; ;----------------------------------------------------------OURCE LAST BYTE ADDR & DESTINATION 1ST BYTE ADDR. ; ; M ; ;---------------------ND ; ; THIS ROUTINE ALLOWS THE USER TO INSPECT ANY MEMORY LOCATION & ALTER ; THE CONTENTS, IF DESIRED & IF THE ADDRESS IS IN  Z,SUB3 PUSH HL ;PTR CALL EXF ;CONTINUE HEX INPUT POP DE ;NEW VALUE POP HL ;PTR LD (HL),E ;LOAD VALUE LD A,C ; (HL),A XOR (HL) ;RESULT SHOULD BE 0 CALL NZ,BITS ;LOG ERR IF NOT MTEST2: POP AF ;RESTORE BYTE LD (HL),A CALL HILOX ---------------------------------------------------------- XAA: INC HL ;SKIP OVER TO NEXT ENTRY INC HL XA: INC (HL) ;IF ATXF: LD A,C ;IF LAST = CR THEN RETURN CP CR RET Z ; ; THIS IS THE ACTUAL COMMAND ENTRY POINT ; XMNE: LD HL,ACTBL ;ADDRB,1 ;SINGLE REG VALUE RLCA JR NC,PV1 ;IF SINGLE REG THEN EXIT INC B ;ELSE REG PAIR RLCA ;IF NOT (HL) THEN EXIT JR0 %+ &, !'- "(. #)/ $*0 NC,PV1 PUSH HL ;BUILD ADDR IN HL LD A,(DE) LD H,A DEC DE LD A,(DE) LD L,A LD A,(HL) ;GET (HL) VALUE POP HL *************************** ; ; ECHO ROUTINE READS A BYTE FROM CONSOLE DEVICE & ECHOS ; THE CHAR BACK TO THE CONSOLE DEVICE. INCREMENTS HL. IT THEN CHECKS FOR (& DISALLOWS) A ; WRAP-AROUND SITUATION. IF IT OCCURS, THE CARRY BIT WILL BE SET ON RETURN. ETURN TO MONITOR HILOXB: INC BC HILOX: CALL HILO JR C,HILOD ;DONE IF CF CALL CONST ;IF NO CONSOLE BREAK THEN OR A ; ; PCHK ROUTINE READS A CHARACTER FROM THE CONSOLE, THEN CHECKS IT FOR A ; DELIMITER. IF IT IS NOT A DELIMITER, A NON-ZERO COTHE TRAPPED CONTENTS ARE STORED IN THE SYSTEM ; STACK AREA FOR LATER ACCESS AND USE BY THE GOTO & THE EXAMINE REGISTERS ; COMM TRAP INC HL LD A,(HL) SBC A,B ;MAYBE, TRY REST OF ADDR JR Z,RS5 ;FOUND 1, RESET IT RS3: INC HL ;NOT FOUND, TRY NEXT;ELSE RESTORE ORIGINAL INSTR. LD (DE),A RS8: INC HL ;DO NEXT BP DJNZ RS7 EX AF,AF' ;NOW SAVE THE Z80 UNIQUES EXX PUDJNZ PV2 ;ALLWAYS JUMP PV1: LD A,(DE) ;GET REG CONTENTS PV2: CALL HEX1 ;OUTPUT VALUE DEC DE ;MEM PTR DJNZ PV1 RET  ; ;*************************************************************** DECHO: CALL DASH ;OUTPUT A '-' ECHO: CALL CONI ECH1: P ; IF NO WRAP-AROUND OCCURRED, HL IS COMPARED TO DE & THE FLAGS SET ACCORDINGLY. ; ;****************************************** ; RETURN RET Z CALL CONI ;IF CHAR <> CTRL-S THEN BREAK CP CTRLS JR NZ,HILOD JP CONI ;ELSE WAIT FOR NEXT CHAR NDITION IS RETURNED. IF ; IT IS A DELIMITER, A ZERO CONDITION IS RETURNED. FURTHER, IF THE DELIMITER ; IS A CR, THE CARRY FLAGANDS. ; ; INSERT INTERRUPT DISABLER SOFTWARE AT START OF REST. ; ;********************************************************** 1 INC HL DEC D JR NZ,RS2 RS4: INC BC ;NONE FOUND RS5: LD HL,LLOCX POP DE ADD HL,SP LD (HL),E ;STORE USER (HL) SH HL PUSH DE PUSH BC PUSH AF PUSH IX PUSH IY LD A,I LD B,A LD A,R LD C,A PUSH BC JP WINITA ;RETURN TO MOFORM SUBTTL GENERAL PURPOSE SUBROUTINES ;**************************************************************************** ; ; CUSH BC LD C,A ;OUTPUT CHAR CALL CONOUT LD A,C ;RESTORE CHAR IN A POP BC RET ;******************************************************************** HILO: INC HL LD A,H ;IF HL = 0 THEN RETURN CF OR L SCF RET Z LD A,E ;ELSE COMPAR;*************************************************************** ; ; NIBBLE ROUTINE CONVERTS THE ASCII CHARACTERS 0-9 & A-F ; IS SET. A BLANK OR A COMMA RESETS THE CARRY FLAG. ; ;****************************************************************************************** REST: PUSH HL ;SAVE ALL REGS PUSH DE PUSH BC PUSH AF CALL MEMSIZ ;GET THE MONITOR STACK LOCATION  INC HL LD (HL),D PUSH BC LD C,'*' ;OUTPUT BREAK INDICATION CALL CONOUT POP DE ;BP LOCATION LD A,RS9 / 256 CP D NITOR RS9: PUSH HL RST 8 ;FORCE BP EXIT: POP BC LD A,C LD R,A LD A,B LD I,A POP IX POP IY POP AF POP BCONV ROUTINE CONVERTS THE LOW ORDER NIBBLE OF THE ; ACCUMULATOR TO ITS ASCII EQUIVALENT. ; ENTRY- A= NUMBER (LO NIBBLE) ; EXI***************************** ; ; EXPR3 ROUTINE GETS 3 PARAMETERS, DOES A CR-LF & THEN ; LOADS BC, DE & HL WITH THE PARAMS. E HL TO DE SUB L LD A,D SBC A,H RET ;********************************************************** ; ; HILOX ROUTINE TO THEIR EQUIVALENT HEX VALUE. IF THE CHARACTER IS NOT IN ; RANGE, THE CARRY BIT IS SET TO FLAG THE ERR. ; ;****************** PCHK: CALL ECHO P2C: CP ' ' ;IF CHAR = ' ' THEN RETURN RET Z CP ',' ;IF CHAR = ',' THEN RETURN RET Z CP CR ;IF EX DE,HL LD HL,10 ;GO UP 10 BYTES IN STACK ADD HL,SP LD B,4 EX DE,HL RS1: DEC HL LD (HL),D ;SAVE IN WORK AREA DE ;SEE IF A RET BP JR Z,RS6 INC HL INC HL LD (HL),E ;RESTORE USER PC INC HL LD (HL),D EX DE,HL ;OUTPUT BP LOCATIO POP DE POP HL EX AF,AF' EXX POP DE POP BC POP AF POP HL LD SP,HL DB 0 ;PLACE FOR EI LD HL,0 JP 0 ; T - A= C= ASCII NUMBER ; ;*************************************************************** CONV: AND 0FH ADD A,90H ;PUT INT ; ;*************************************************************** EXPR3: INC B ;B HAS 2 ALREADY CALL EXPR POP BC POP  INCREMENTS HL, COMPARES IT TO DE & IF ; EQUAL, RETURNS CONTROL TO THE MONITOR EXEC. OTHERWISE, ; CONTROL RETURNS TO THE CAL************************************************* NIBBLE: SUB '0' RET C CP 'G' - '0' CCF RET C CP '9' - '0' + 1 CCF CHAR = CR THEN RETURN CF SCF RET Z CCF ;ELSE RETURN NC RET ;****************************************************C HL LD (HL),E POP DE DJNZ RS1 POP BC ;GET BREAKPOINT LOCATION + 1 DEC BC ;BACK UP TO RESTART INSTRUCTION LD SP,HLN CALL LADR RS6: LD HL,TLOCX ADD HL,SP LD BC,NBKPTS * 256 RS7: LD E,(HL) ;RESTORE BP'D LOCATIONS LD (HL),C ;RESET SY ENDX: EQU $ ;---------------------------------------------------------------------------- ; ; 3 TYPES OF ERRORS ARE DETEO ASCII ZONE DAA ;AH, THE UBIQUITOUS DAA CONVERT ADC A,40H DAA LD C,A RET ;************************************DE JP CRLFA ;GO DO CRLF ;**************************************************************************** ; ; HILO ROUTINELING ROUTINE. ; ;********************************************************** HILOD: POP DE ;GET RID OF RETURN ADDR RET ;R RET NC SUB 'A' - '9' - 1 CP 10 RET ;**************************************************************************** ************************ ; ; REST ROUTINE TRAPS ALL OF THE REGISTER CONTENTS WHENEVER A RESTART 1 ; INSTRUCTION IS EXECUTED.  ;SET THE MONITOR STACK LD HL,TLOCX ;RESTORE BP ADD HL,SP PUSH DE LD D,NBKPTS RS2: LD A,(HL) SUB C ;SEE IF SOFTWARESTEM SAVE AREA INC HL LD D,(HL) LD (HL),C INC HL LD A,E ;IF LOC = 0 THEN SKIP RESTORE OR D JR Z,RS8 LD A,(HL) CTED: A RESTART ERROR; AN I/O ASSIGNMENT ; ERROR; & CERTAIN PROGRAM ERRORS (DETERMINED BY PARTICULAR ROUTINE WHERE THE ; ERROR0 %+ &, !'- "(. #)/ $*0 CONDITION WAS ENCOUNTERED) EACH CAUSES A UNIQUE MESSAGE TO BE ; PRINTED, THEN DOES A WARM INIT OF THE MONITOR. THE I/O ERROR C; QUERY ROUTINE WILL TELL THE OPERATOR WHAT HIS CURRENT LOGICAL-PHYSICAL ; PERIPHERAL DEVICE ASSIGNMENTS ARE. NO PARAMETERS (OTREADS THE CONSOLE & STRIPS OFF THE PARITY BIT. ; ;******************************************************************** CONI: *********************** ; ; EXLF ROUTINE READS 2 PARAMETERS, PUTS THEM INTO THE DE ; & HL REGS, THEN DOES A CR-LF. ; ;********************************** LADRA: CALL CRLF LADR: LD A,H CALL HEX1 LD A,L HEX1: PUSH AF RRCA RRCA RRCA RRCA = CHAR ; ;******************************************************************** CO: LD A,(IOBYTE) AND 3 JP Z,CO0 ;CONSOLE..1)= 0: CON0, 1: CON1, 2: CON2, 3: CON3 ; EXIT - A= CHAR (CTRL-Z: EOF) ; ;************************************************** STATUS INPUT SELECTOR ; ENTRY- (IOBYTE BIT 6..7)= 0: LST0, 40H: LST1, 80H: LST2, C0H: CON ; EXIT - A= 0: BUSY, FFH: READY ; AUSES THE ; I/O ASSIGNMENTS TO BE RESET TO THE DEFAULT ASSIGNMENT. ; ;-------------------------------------------------------HER THAN A CR) ARE ; REQUIRED ON ENTRY. ; ;**************************************************************************** QUERCALL CI AND 7FH RTS: RET ;**************************************************************************** ; ; PRTWD ROUTI*********************************************************** EXLF: CALL EXPR POP DE POP HL ;*************************** CALL HEX2 POP AF HEX2: CALL CONV JR CO ;********************************************************** ; ; DASH ROUTINE 0 CP 2 JP M,CO1 ;CONSOLE 1 JP Z,CO2 ;CONSOLE 2 JP CO3 ;CONSOLE 3 ;*************************************************************** CI: LD A,(IOBYTE) AND 3 JP Z,CI0 ;CONSOLE 0 CP 2 JP M,CI1 ;CONSOLE 1 JP Z,CI2 ;CONSOLE 2 JP C ;************************************************************************* LSTAT: LD A,(IOBYTE) AND 0C0H JP Z,LSTAT0 ;PRIN--------------------- IOER: LD A,IOBYTV ;SET IOBYTE TO DEFAULT LD (IOBYTE),A LD HL,IOMSG JR COMERR ;------------------Y: LD A,(IOBYTE) LD B,4 LD HL,ACT ;ADDR OF CONVERSION TABLE LD DE,ALT - APT QUE1: PUSH AF CALL BLK LD C,(HL) ;GET CNE OUTPUTS AN ASCII STRING ONTO THE CONSOLE. ; THE STRING MUST BE TERMINATED BY BIT 7 SET IN THE LAST CHAR OF THE STRING. ; T************************************ ; ; CRLF ROUTINE OUTPUTS A CR-LF ON THE CONSOLE DEVICE TO ; START A NEW LINE. ; ;**** OUTPUTS A '-' TO THE CONSOLE DEVICE ; ;********************************************************** DASH1: CALL HEX1 ;OUTPUT **************************** ; ; CONSOLE STATUS INPUT SELECTOR ; ENTRY- (IOBYTE BIT 0..1)= 0: CON0, 1: CON1, 2: CON2, 3: CON3I3 ;CONSOLE 3 ;************************************************************************* ; ; LIST DEVICE OUTPUT SELECTORTER 0 CP 80H JP M,LSTAT1 ;PRINTER 1 JP Z,LSTAT2 ;PRINTER 2 LD A,-1 ;CONSOLE (ASSUME READY) RET ;****************------------------------- ; ; UNINITIALIZED RESTART ERROR HANDLER ; ;------------------------------------------- RSTER: LD URRENT LOGICAL DEVICE CODE CALL CONOUT CALL DASH POP AF PUSH AF PUSH HL QUE2: INC HL INC A AND 3 ;BITS 0 & 1 ARE HE STRING WILL START A NEW LNE (PRTWD) OR CONTINUE ON THE SAME LINE (PRTWA). ; ;********************************************************************************************************* CRLF: PUSH HL CRLFA: LD HL,CRMSG CALL PRTWA POP HL RET A AS HEX DASH: LD C,'-' JR CO ;*********************** ; ; PRINT ADDR SUBR ; ;*********************** LADRB: CALL L ; EXIT - A= 0: NOT READY, FFH: CHAR READY ; ;************************************************************************* CSTS ; ENTRY- (IOBYTE BIT 6..7)= 0: LST0, 40H: LST1, 80H: LST2, C0H: CON ; C= CHAR ; ;********************************************************************************************* ; ; SERIAL CHANNEL INPUT SELECTOR ; ENTRY- (IOBYTE BIT 2..3)= 0: SC0, 4:HL,RSTMSG ;--------------------------------- ; ; COMMON ERROR HANDLER ; ENTRY- HL= MESSAGE PTR ; ;----------------------0 WHEN ON CURRENT ASSGN JR NZ,QUE2 LD C,(HL) ;FOUND IT, NOW OUTPUT IT CALL CONOUT POP HL POP AF RRA RRA ADD HL,****************************** PRTWD: CALL CRLF PRTWA: PUSH BC PRTA: LD C,(HL) RES 7,C ;MAKE SURE BIT 7 = 0 CALL CO LD;*************************************************************** ; ; LADR ROUTINE OUTPUTS THE CONTENTS OF HL ON THE CONSOLE ;ADRA BLK: LD C,' ' ;OUTPUT A SPACE ; FALLS INTO CO SUBR SUBTTL IOBYTE HANDLERS ;****************************************: LD A,(IOBYTE) AND 3 JP Z,CSTS0 ;CONSOLE 0 CP 2 JP M,CSTS1 ;CONSOLE 1 JP Z,CSTS2 ;CONSOLE 2 JP CSTS3 ;CONSOLE 3******************************** LO: LD A,(IOBYTE) AND 0C0H JP Z,LO0 ;PRINTER 0 CP 80H JP M,LO1 ;PRINTER 1 JP Z,LO2 SC1, 8: SC2, 0CH: SC3 ; EXIT - A= CHAR AND 7FH (CTRL-Z: EOF) ; ;************************************************************----------- COMERR: CALL PRTWD JP WSVEC ;**************************************************************************** ; DE ;NEXT ENTRY DJNZ QUE1 RET ;******************************************************************** ; ; CONI ROUTINE  A,(HL) ;IF BIT 7 = 1 THEN STOP INC HL RLCA JR NC,PRTA PRTB: POP BC RET ;**************************************** EITHER AT THE START OF A NEW LINE (LADRA) OR AT THE CURRENT ; CURSOR LOCATION (LADR). ; ;************************************************************* ; ; CONSOLE OUTPUT SELECTOR ; ENTRY- (IOBYTE BIT 0..1): 0: CON0, 1: CON1, 2: CON2, 3: CON3 ; C ;******************************************************************** ; ; CONSOLE INPUT SELECTOR ; ENTRY- (IOBYTE BIT 0 ;PRINTER 2 JP CO ;CONSOLE ;************************************************************************* ; ; LIST DEVICE******** RI: LD A,(IOBYTE) AND 0CH JP Z,SI0 ;SERIAL CHANNEL 0 CP 8 JP M,SI1 ;SERIAL CHANNEL 1 JP Z,SI2 ;SERIAL CHA0 %+ &, !'- "(. #)/ $*0NNEL 2 JP SI3 ;SERIAL CHANNEL 3 ;************************************************************************* ; ; SERIAL AR THEN WAIT AND 1 SHL NTBSY JR NZ,CO0 ; LD A,C ;OUTPUT CHAR & RETURN OUT (NTD),A RET CSTS0: IN A,(NTS) ;IF NO*********************************** CO2: EQU IOER CSTS2: EQU IOER CI2: EQU IOER ;************************************** ******** ; ; LIST DEVICE 1 (LST1) ; ;************************************** LO1: CALL LSTAT1 ;IF BUSY THEN WAIT JR Z,LO1********** SI0: EQU IOER SO0: EQU IOER ;************************************** ; ; SERIAL CHANNEL 1 (SC1) ; ;************ ; ; TBL CONTAINS THE ADDRESSES OF THE COMMANDS. ; THE EXECUTIVE USES IT TO LOOK UP THE DESIRED ADDR. ; ;************** 'P' ;LOGICAL PUNCH DEVICE TABLE DB '3' ; SERIAL CHANNEL 3 DB '2' ; SERIAL CHANNEL 2 DB '1' ; SERIAL CHANNEL 1 DBILOC ; ; PRIME Z80 REGISTER OFFSETS ; PRMTB: DB 80H + 'A',APLOC DB 'B',BPLOC DB 'C',CPLOC DB 'D',DPLOC DB 'E',EPLOC CHANNEL OUTPUT SELECTOR ; ENTRY- (IOBYTE BIT 4..5)= 0: SC0, 10H: SC1, 20H: SC2, 30H: SC3 ; C= CHAR ; ;*********************T CHAR NOT READY THEN RETURN 0 AND 1 SHL NTRDY RET Z ; LD A,-1 ;ELSE RETURN -1 RET ;*************************** ; ; ALTERNATE CONSOLE DEVICE (CON3) ; ;************************************** CO3: EQU IOER CSTS3: EQU IOER CI3: EQU IOER ; LD A,[1 SHL CENTDST] ;INSURE STROBE STARTS HIGH OUT (CENTOUT),A LD A,C ;OUTPUT CHAR SET CENTDST,A OUT (CENTOUT),A****************************** SI1: EQU IOER SO1: EQU IOER ;************************************** ; ; SERIAL CHANNEL 2*************************************** TBL: DW ASGN ;A DW BOOTC ;B DW QPRT ;C DW DISP ;D DW QPRT ;E DW FILL ;F '0' ; SERIAL CHANNEL 0 ; ART: DB 'R' ;LOGICAL READER DEVICE TABLE DB '3' ; SERIAL CHANNEL 3 DB '2' ; SERIAL CHANNE DB 'F',FPLOC DB 'H',HPLOC DB 'L',LPLOC DB 'M' + 80H,HPLOC + 0C0H DB 'X',XLOC + 80H DB 'Y',YLOC + 80H DB 'R',RLOC **************************************************** PUNO: LD A,(IOBYTE) AND 30H JP Z,SO0 ;SERIAL CHANNEL 0 CP 20H JP *********** ; ; ALTERNATE CONSOLE DEVICE (CON1) ; ;************************************** CI1: CALL CSTS1 ;IF NOT READY TH ;************************************** ; ; LIST DEVICE 1 (LST1) ; ;************************************** LO0: CALL RES CENTDST,A ;OUTPUT LOW TRUE STROBE OUT (CENTOUT),A SET CENTDST,A ;RESTORE STROBE OUT (CENTOUT),A RET LSTAT1: (SC2) ; ;************************************** SI2: EQU IOER SO2: EQU IOER ;************************************** ;  DW GOTO ;G DW QPRT ;H DW INPT ;I DW QPRT ;J DW QPRT ;K DW QPRT ;L DW MOVE ;M DW QPRT ;N DW OUPT ;O L 2 DB '1' ; SERIAL CHANNEL 1 DB '0' ; SERIAL CHANNEL 0 ; ACT: DB 'C' ;LOGICAL CONSOLE DEVICE TABLE DB '3' ; CONS DB -1 END M,SO1 ;SERIAL CHANNEL 1 JP Z,SO2 ;SERIAL CHANNEL 2 JP SO3 ;SERIAL CHANNEL 3 SUBTTL PRIMITIVE I/O DRIVERS ;**********EN WAIT JR Z,CI1 ; IN A,(BZUDAT) ;INPUT CHAR RET CO1: IN A,(BZUST) ;IF NOT READY THEN WAIT AND BZUTXR JR Z,CO1  LSTAT0 JR Z,LO0 ; LD A,0BFH ;INSURE STROBE HIGH (LOGICAL 0) OUT (PRI2CNT),A LD A,C ;OUTPUT CHARACTER OUT (PRI1DO IN A,(CENTS) ;IF BUSY THEN RETURN 0 CPL ;REVERSE SENSE AND A,[1 SHL CENTBSY] RET Z ; LD A,-1 ;ELSE RETURN -1 RET ; SERIAL CHANNEL 3 (SC3) ; ;************************************** SI3: EQU IOER SO3: EQU IOER SUBTTL MESSAGES CRMSG: DW QPRT ;P DW QUERY ;Q DW QPRT ;R DW SUBS ;S DW MTEST ;T DW QPRT ;U DW COMP ;V DW QPRT ;W DW XMNE ;X OLE 3 DB '2' ; CONSOLE 2 DB '1' ; CONSOLE 1 DB '0' ; CONSOLE 0 ;--------------------------------- ; ; Z80 REGIS**************************** ; ; PRIMARY CONSOLE DEVICE (CON0) ; ;************************************** CI0: CALL CSTS0 ;; LD A,C ;OUTPUT CHAR OUT (BZUDAT),A RET CSTS1: IN A,(BZUST) ;IF RXRDY NOT TRUE THEN RETURN 0 AND BZURXR RET Z ),A LD A,NOT [1 SHL PRI1CSB] ;OUTPUT STROBE OUT (PRI2CNT),A LD A,0BFH OUT (PRI2CNT),A ;CLEAR STROBE RET LSTAT0:  ;************************************** ; ; LIST DEVICE 2 (LST2) ; ;************************************** LO2: EQU IO DM CR,LF RSTMSG: DM 'RST ERR' BOOTEM: DM 'BOOT LOAD ERR',CR,LF USRMSG: DM 'MEMORY = ' IOMSG: DM 'I/O ERR' QMSG: DM '????'  DW QPRT ;Y DW BYE ;Z ;----------------------- ; ; IOBYTE TABLE ; ;----------------------- ALT: DB 'L' ;LOGICAL LISTER OFFSET TABLE ; ;--------------------------------- ACTBL: DB 80H + 'A',ALOC DB 'B',BLOC DB 'C',CLOC DB 'D',DLOC DBIF CHAR NOT READY THEN WAIT JR Z,CI0 ; IN A,(NTD) ;ELSE RETURN CHAR RET CO0: IN A,(NTS) ;IF NOT READY TO ACCEPT CH; LD A,-1 ;ELSE RETURN -1 RET ;************************************** ; ; ALTERNATE CONSOLE DEVICE (CON2) ; ;***IN A,(PRI1ST) ;FETCH STATUS CPL AND A,[1 SHL PRI1BSB] ;TEST RET Z ; LD A,-1 RET ;******************************ER LSTAT2: EQU IOER ;************************************** ; ; SERIAL CHANNEL 0 (SC0) ; ;**************************** LOGMSG: DM 'ZMON VERS ',HIGH VERSN,'.',LOW VERSN,CR,LF SUBTTL CONSTANTS ;*************************************************T DEVICE TABLE DB 'C' ; CONSOLE DB '2' ; LIST DEVICE 2 DB '1' ; LIST DEVICE 1 DB '0' ; LIST DEVICE 0 ; APT: DB 'E',ELOC DB 'F',FLOC DB 'H',HLOC DB 'L',LLOC DB 80H + 'M',HLOC + 0C0H DB 'P',PLOC + 80H DB 'S',SLOC + 80H DB 'I',0 %+ &, !'- "(. #)/ $*0 TITLE M5 INITIALIZATION LIST NOCOND ;*************************************************************************** ; ; M5 INSTART ADDRESS OF THIS PROM MONROM EQU 0800H ;START ADDRESS OF MONITOR CODE IN ROM OVROM EQU 1000H ;START ADDRESS OF MONITOR  ;=========================================================================== ORG IOROM NTINIT DS 3 ;NAKED TERMINAL INIT NT;SET COUNT LD SP,HRAMDN - 2 ;FAKE RETURN ADDRESS IN ROM JP RAMTST ; DW HRAMDN HRAMDN: JR Z,HRAMOK ;IF HIGH RAM OK THEN GX ;ELSE DO LOW BYTE LD A,L EXX JR FRE6 ; FRE10: LD C,'H' ;OUTPUT H SUFFIX LD SP,FRE11 - 2 JP NTOUT ; DW FRE11  PORT EXX SUB A,10H ;CONVERT 41..43H TO '1'..'3' LD C,A CALL NTOUT LD HL,JADM2 CALL POUT ; ; COMMAND THE SELF TASSED ; EXX LD HL,PM CALL POUT EXX JR NOJADE ; ; CONTROLLER FAILED ; JAD5: EXX ;OUTPUT FAILED LD HL,FM  ISHA1: IN A,(HSTATUS) BIT HBUSYB,A JR NZ,ISHADN ; DEC HL ;IF COUNT NOT EXHAUSTED THEN REPEAT LD A,L OR A,H JR NZITIALIZATION CODE ; ;*************************************************************************** ; ; This module contains thOVERLAYS IOROM EQU 3000H ;START ADDRESS OF I/O DRIVER ROM LOTEST EQU 0A000H ;PLACE TO PUT LOW MEMORY TEST MONST EQU 0F800H OUT DS 3 ;NAKED TERMINAL OUTPUT NTINI DS 3 ;NAKED TERMINAL INPUT INIT NTIN DS 3 ;NAKED TERMINAL INPUT (KEYBOARD) CR EQU O DO LOW RAM ; ; FATAL ERROR- HIGH RAM NO GOOD FOR STACK! PRINT IT OUT! ; FRE: EXX ;SAVE ADDRESS LD DE,RAMMSG ;PRINT M FRE11: JR $ ;EFFECTIVELY HALT ; ; HIGH RAM OK, SET STACK & CHECK LOW RAM ; HRAMOK: LD SP,9000H ;SHOULD BE OK CALL TSTLEST ; EXX LD A,DDBGN ;RESET BOARD OUT (C),A ; LD HL,0 JAD2: IN A,(C) ;CHECK FOR DONE BIT DDSHLT,A JR Z,JAD4 ; CALL POUT ; LD A,(IX + PBSTATO) ;OUTPUT STATUS CALL OUTBH EXX ; ; NEXT BOARD ; NOJADE: XOR A,A ;REMOVE FDC WINDOW ,ISHA1 ; ; ERROR, BOARD TIMED OUT ; LD HL,TMOM CALL POUT JR NOISHA ; ; CHECK FOR SELF TEST ERROR ; ISHADN: IN Ae Z-80 code to perform self test and ; initialization of the M5b system. It is expected to get control after ; reset and resid ;START OF MONITOR RAM IMAGE ;*INCLUDE MONBOARD.DEF ;*INCLUDE NAKEDT.DEF ;*INCLUDE CLOCK.DEF ;*INCLUDE ISHA.DEF ;*INCLUDE0DH LF EQU 0AH SUBTTL CODE ;--------------------------------------------------------------------------- ; ; BEGINNING OESSAGE FRE3: LD A,(DE) OR A,A JR Z,FRE2 ; LD C,A INC DE LD SP,FRE1 - 2 JP NTOUT ; DW FRE1 FRE1: JR FRE3 ; FROW JR NZ,FRE ; ; ALL RAM PASSED, GO ON TO SELF TESTS ; ;---------------------------------------------------------------- DEC HL ;WAIT FOR A WHILE LD A,L OR A,H JR NZ,JAD2 ; ; CONTROLLER TIMEOUT! ; JAD3: EXX LD HL,TMOM CALL POUT  OUT (C),A ; INC C ;NEXT PORT LD A,C CP A,44H JR C,JAD1 ; ; ;-----------------------------------------------------,(HDATA) ;FETCH SELF TEST STATUS OR A,A JR NZ,ISHAER ; ; ISHA OK ; LD HL,PM CALL POUT JR NOISHA ; ; ISHA ERROe at page 0. After self test it then moves ZMON2 to high ; memory and transfers control to the ZMON2 cold start routines. ; ; JDDCONT.DEF ;*INCLUDE PROMIII.DEF ;*INCLUDE PRI.DEF ;*INCLUDE COMIOPB.DEF LIST OFF *INCLUDE MONBOARD.DEF *INCLUDE NAKEDTF SELF TEST ; ;--------------------------------------------------------------------------- ORG PROMST ; ; FIRST DISABLE E2: LD E,4 ;DIGIT COUNT ; EXX ;RESTORE BAD ADDRESS FOR OUTPUT LD A,H EXX ; FRE6: RLCA RLCA RLCA RLCA LD B,A ----------- ; ; SELF TESTS: ; ;--------------------------------------------------------------------------- ; ; JADE FLOPEXX JR NOJADE ; ; CONTROLLER DONE, GET RESULTS ; JAD4: LD A,DDMB0 ;FETCH RESULTS OUT (C),A ; IN A,(C) ;COMPUTE ---------------------- ; ; TEST INTELLIGENT SASI HOST ADAPTER ; ;---------------------------------------------------------R ; ISHAER: PUSH AF ;SAVE ERROR CODE LD HL,FM CALL POUT POP AF CALL OUTBH ; NOISHA: ; ; ;-----------------------*************************************************************************** ; ; Revisions: ; ; 1.0 Release grh ; VERS EQ.DEF *INCLUDE CLOCK.DEF *INCLUDE ISHA.DEF *INCLUDE JDDCONT.DEF *INCLUDE PROMIII.DEF *INCLUDE PRI.DEF *INCLUDE COMIOPB.DEF MONITOR BOARD RAM IN CASE ITS INSTALLED ; LD A,8 OUT (0FCH),A ; ; REMOVE THE JADE CONTROLLERS FROM MEMORY 1ST ; LD C AND 0FH ADD A,90H DAA ADC A,40H DAA LD C,A LD SP,FRE5 - 2 JP NTOUT ; DW FRE5 FRE5: LD A,B ;RESTORE BYTE FORPY CONTROLLERS ; LD C,41H ;START WITH 1ST BOARD JAD1: IN A,(C) ;SEE IF BOARD PRESENT INC A ;IF 0FFH THEN ABSENT JR Z,BOARD ADDRESS AND A,DDSASW RLCA OR A,HIGH DDBASE LD H,0A0H ;STORE DATA LD L,C LD (HL),A ; LD H,A LD L,0 LD D------------------ IN A,(HSTATUS) ;CHECK FOR PRESENCE INC A JR Z,NOISHA ; ; BOARD FOUND, TEST IT ; LD HL,ISHAM ;REP---------------------------------------------------- ; ; CROMEMCO 'PRI' PRINTER INTERFACE SELF TEST ; ;---------------------U '10' ; ;*************************************************************************** SUBTTL DECLARATIONS PROMST EQU 0 ; LIST ON ;=========================================================================== ; ; I/O DRIVER PROM ENTRY POINTS ; ,41H X1: XOR A,A OUT (C),A INC C LD A,C CP 44H JR C,X1 ; ; TEST HIGH RAM ; LD HL,8000H ;SET PTR LD BC,8000H  NEXT DIGIT DEC E ;IF COUNT EXHAUSTED THEN DONE JR Z,FRE10 ; BIT 0,E ;IF ODD THEN GO DO 2ND NIBBLE JR NZ,FRE6 ; EXNOJADE ; ; CONTROLLER PRESENT, ANNOUNCE IT ; EXX LD HL,JADM ;OUTPUT BOARD PRESENCE CALL POUT EXX LD A,C ;OUTPUTE,DDCBO ADD HL,DE PUSH HL POP IX ; LD A,(IX + PBSTATO) ;GET SELF TEST STATUS OR A,A JR NZ,JAD5 ; ; CONTROLLER PORT FIND CALL POUT ; LD A,1 SHL HRESET ;START THE TEST OUT (HCMD),A XOR A,A OUT (HCMD),A ; LD HL,0 ;WAIT FOR DONE------------------------------------------------------ IN A,(PRI1ST) ;TEST FOR PRESENCE INC A JR Z,NOPRI ; ; ANNOUNCE 0 %+ &, !'- "(. #)/ $*0THE BOARD'S PRESENCE ; LD HL,PRIM CALL POUT LD HL,PTM CALL POUT ; NOPRI: ; ; ;------------------------------------ 1 TEST ; LD E,1 LD B,8 PROM2: CALL REGCMP PUSH AF LD A,B ;PASS COUNT + 10H BACK AS ERROR ADD A,10H LD D,A POP ---------------------- IN A,(CLKDAT) ;CHECK FOR PRESENCE INC A JR Z,NOCLK ; ; CLOCK PRESENT, TEST IT ; LD C,CLKSECLLD BC,2048 MONTST: LD A,(DE) CP A,(HL) JR NZ,MONERR ; INC HL INC DE DEC BC LD A,C OR A,B JR NZ,MONTST ; ; AM LD DE,LOTEST LD BC,TLSIZE LDIR JP LOTEST ; ; NOW EXECUTING IN HIGH MEMORY ; TSTLO1: XOR A,A ;TURN OFF 32K BYTE COUNT NOT EXHAUSTED THEN REPEAT LD A,C OR A,B JR NZ,RAMTST ; RET ;ELSE RETURN ; TLSIZE EQU $ - TSTLO1 ;****** OUTB ;*************************************************************************** ; ; OUTPUT 'H' SUBR ; ;************* ; ;*************************************************************************** OUTSPC: LD C,' ' JP NTOUT ;++++++++++++--------------------------------------- ; ; PROM PROGRAMMER SELF TEST ; ;---------------------------------------------------AF LD A,D JR NZ,PROME ; SLA E ;WALK BIT LEFT DJNZ PROM2 ; ; TEST A/D EOC ; CALL GETAD ;FETCH A/D DATA LD L,A ;WAIT FOR SECONDS TO CHANGE CALL GETD AND A,CLKDMSK LD B,A LD HL,0 ;SET ALARM CLK1: CALL GETD AND A,CLKDMSK CP A,MONITOR CODE LOADED & VERIFIED ; JP MONST ; ; MONITOR LOAD ERROR ; MONERR: PUSH HL ;SAVE ERROR STATUS PUSH DE PUSHSAVER OUT (40H),A ; CALL RAMTST - TSTLO1 + LOTEST ;DO THE TEST ; LD A,2 ;TURN BYTESAVER BACK ON & RETURN OUT (40H),A ********************************************************************* ; ; OUTPUT TEXT SUBR ; ENTRY- HL= TEXT PTR ( > 7FH = LA************************************************************** OUTH: LD C,'H' JP NTOUT ;********************************+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; GET CLOCK DATA FUNCTION ; ENTRY- C= CLOCK REGISTER # ; E------------------------ IN A,(PRMST) ;CHECK IF BOARD PRESENT INC A JR Z,NOPROM ; ; BOARD PRESENT, TEST IT! ; LD HL LD A,3 ;PASS BACK ERROR 3 JR C,PROME ; ; TEST A/D DATA ; LD A,L OR A,A ;IF 0 OR FFH THEN ERROR LD A,4 JR Z,PB JR NZ,CLK2 ; DEC HL LD A,L OR A,H JR NZ,CLK1 ; ; TIMEOUT - FAILURE ; LD HL,FM CALL POUT JR NOCLK ; ;  HL ; LD HL,MONERM ;OUTPUT ERROR CALL POUT ; POP HL ;OUTPUT ADDRESS CALL OUTW CALL OUTSPC ; POP DE ;OUTPUT BITS RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; NON DESTRUCTIVE RAM TEST FUNCTION ST CHAR) ; ;*************************************************************************** POUT: LD C,(HL) PUSH HL RES 7,C ******************************************* ; ; OUTPUT HEX BYTE SUBR ; ENTRY- A= BYTE ; ;**********************************XIT - A= REGISTER DATA ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ GETD: LD A,C ;SET UP R,PROMM CALL POUT ; LD A,1 SHL PPG ;OUTPUT PROGRAM GATE BIT TO READ DATA REGISTER OUT (PRMCMD),A LD C,PDATA ;SET UP DATROME ; INC L LD A,5 JR Z,PROME ; ; SELF TEST PASSED ; LD HL,PM CALL POUT JR NOPROM ; ; SELF TEST FAILED ; PASS ; CLK2: LD HL,PM CALL POUT ; NOCLK: ; ; ;------------------------------------------------------------------------ IN ERROR POP HL LD A,(DE) XOR A,(HL) CALL OUTBH ; JR $ ;EFFECTIVELY HALT SUBTTL FUNCTIONS & SUBROUTINES ;+++++ ; ENTRY- HL= RAM PTR ; BC= COUNT ; EXIT - ZF= PASS, NZ= FAIL (HL= BAD LOCATION ADDRESS) ; ;+++++++++++++++++++++++++++++++ CALL NTOUT POP HL BIT 7,(HL) ;IF CHAR >= 80H THEN DONE RET NZ ; INC HL JR POUT ;*********************************************************************** OUTBH: CALL OUTB ;OUTPUT WITH 'H' APPENDED JR OUTH ; ; OUTB: CALL PRDIG PRDIG:EAD SET CLKRD,A OUT (CLKCMD),A ; ; DELAY A WHILE ; EX (SP),HL EX (SP),HL ; ; RETURN DATA ; IN A,(CLKDAT) RA PORT # ; ; TEST DATA REGISTER FOR ALL 0S ; LD E,0 CALL REGCMP LD A,1 ;PASS ERROR # JR NZ,PROME ; ; TEST DATA PROME: PUSH AF ;SAVE ERROR CODE LD HL,FM CALL POUT POP AF CALL OUTBH ; NOPROM: ; ; ;------------------------------- ; ; NOW BOOT MONITOR CODE ; ;--------------------------------------------------------------------------- ; ; BLOCK M++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; TEST LOW RAM FUNCTION ; EXIT - ZF= PASS, NZ= FAIL ++++++++++++++++++++++++++++++++++++++++++++ RAMTST: LD A,(HL) ;FETCH BYTE CPL ;INVERT IT LD (HL),A ;STORE IT CP (HL)********************************************* ; ; OUTPUT HEX WORD SUBR ; ENTRY- HL= WORD ; ;******************************* RLCA RLCA RLCA RLCA PUSH AF PUSH HL AND 0FH ADD A,90H DAA ADC A,40H DAA LD C,A CALL NTOUT POP HL POET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; COMPARE PORT DATA READ-BACK FUNCTION  REGISTER FOR ALL 1S ; LD E,-1 ;CHECK OPPOSIT CALL REGCMP LD A,2 JR NZ,PROME ; ; TEST DATA REGISTER WITH A WALKING----------------------------------------------- ; ; CLOCK SELF TEST ; ;-----------------------------------------------------OVE MONITOR TO HIGH RAM ; LD HL,MONROM LD DE,MONST LD BC,2048 LDIR ; ; TEST LOAD ; LD HL,MONROM LD DE,MONST  ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ TSTLOW: LD HL,TSTLO1 ;MOVE THIS CODE TO HIGH R ;TEST IT CPL ;RESTORE ORIGINAL DATA LD (HL),A RET NZ ;IF BAD THEN RETURN NZ ; INC HL ;NEXT LOCATION DEC BC ;IF******************************************** OUTW: LD A,H ;START WITH HIGH BYTE PUSH HL CALL OUTB POP HL LD A,L CALLP AF RET ;*************************************************************************** ; ; OUTPUT SPACE TO CONSOLE SUBR  ; ENTRY- C= PORT # ; E= PORT DATA IMAGE ; EXIT - A= DATA READ BACK ; ZF= PASS, NZ= FAIL ; ;+++++++++++++++++++++++++++++0 %+ &, !'- "(. #)/ $*0++++++++++++++++++++++++++++++++++++++++++++++ REGCMP: OUT (C),E IN A,(C) CP A,E RET ;++++++++++++++++++++++++++++++ DM CR,LF,'MONITOR LOAD ERROR AT ' JADM: DM CR,LF,'JADE FDC AT 4' JADM2: DM 'H =' ISHAM: DM CR,LF,'ISHA =' PRIM: DM CR,LF,'P '10' ; ;*************************************************************************** SUBTTL DECLARATIONS PROMST EQU 3000HPUT TO KNOWN STATE ; ;--------------------------------------------------------------------------- JP NTOI ; ; ;------------------------------ JP NTIN ; ; ;--------------------------------------------------------------------------- ; ; CONSOLE------------------------------------------- ; ; BIG Z USART INIT (SAME AS OUTPUT INIT) ; ;-------------------------------------------------- ; ; INIT VIDEO TO KNOWN STATE ; ;--------------------------------------------------------------------------+++++++++++++++++++++++++++++++++++++++++++++ ; ; GET A/D DATA FUNCTION ; EXIT - A= DATA ; CF= NO EOC ERROR ; B= ? ; ;+RI =' PROMM: DM CR,LF,'PROM =' CLKM: DM CR,LF,'CLOCK =' PM: DM ' PASS' FM: DM ' FAILED ' PTM: DM ' PRESENT' TMOM: DM ' TI ;START OF THIS CODE MODULE ;=========================================================================== ; ; INCLUSION----------------------------------------------------------------- ; ; CONSOLE OUTPUT ; ENTRY- C= CHARACTER TO OUTPUT ; ;--- INPUT STATUS FUNCTION ; EXIT - A= 0: NOT READY, FFH: READY ; ;------------------------------------------------------------------------------------------------------- JP BZOI ; ; ;--------------------------------------------------------------------- NTOI: LD C,1BH ;OUTPUT CLEAR SCREEN CALL NTOUT LD C,'E' ; ; FALL INTO NTOUT ; ;-----------------------------------++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ GETAD: LD A,[1 SHL PSCV] + [1 SHL PVO] ;ISSUE START MED OUT' END S ; ;=========================================================================== ;*INCLUDE NAKEDT.DEF ;*INCLUDE BIGZ.DEF L------------------------------------------------------------------------ JP NTOUT ; ; ;------------------------------------------------- JP NTIST ; ; ;--------------------------------------------------------------------------- ; ; INIT BIG Z US------- ; ; BIG Z USART INPUT FUNCTION ; EXIT - A= CHARACTER ; ;--------------------------------------------------------------------------------------------------- ; ; VIDEO OUTPUT ; ENTRY- C= CHARACTER TO OUTPUT ; ;------------------------------CONVERT PULSE OUT (PRMCMD),A RES PSCV,A OUT (PRMCMD),A ; ; WAIT A WHILE FOR EOC ; LD B,0 EOCLP: IN A,(PRMST) ANDIST OFF *INCLUDE NAKEDT.DEF *INCLUDE BIGZ.DEF LIST ON SUBTTL ENTRY VECTORS ORG PROMST ; ; NOTE: THE FIRST 5 FUNC--------------------------------------- ; ; CONSOLE INPUT INIT ; ;----------------------------------------------------------ART TO KNOWN STATE ; ;--------------------------------------------------------------------------- JP BZOI ; ; ;-------------------------- JP NTIN ; ; ;--------------------------------------------------------------------------- ; ; BIG Z USART--------------------------------------------- NTOUT: IN A,(NTS) ;CHECK FOR BUSY AND A,1 SHL NTBSY JR NZ,NTOUT ; ; OUTP A,PRMEOC JR Z,GOTEOC ; ; IF NO TIMEOUT THEN REPEAT ; DJNZ EOCLP ; ; ELSE RETURN TIMEOUT FLAG ; SCF RET ; ; ;*************************************************************************** ; ; M5b I/O PRIMITIVES MODULE ; ;**************TIONS MUST BE THE SYSTEM CONSOLE. THIS IS REQUIRED ; BY THE MONITOR, WHICH ALLWAYS TALKS TO THIS DEVICE WHEN EXECUTING ; SELF ----------------- JP RETURN ;NOT USED FOR NAKED TERMINAL ; ; ;----------------------------------------------------------------------------------------------------------------------------- ; ; BIG Z USART OUTPUT ; ENTRY- C= CHARACTER TO OUTPUT ;  INPUT STATUS FUNCTION ; EXIT - A= 0: NOT READY, FFH: READY ; ;--------------------------------------------------------------UT CHAR ; LD A,C OUT (NTD),A RET ;--------------------------------------------------------------------------- ; ;  GOT EOC, RETURN DATA ; GOTEOC: IN A,(PADDAT) OR A,A RET SUBTTL DATA RAMMSG: DB CR,LF,'RAM ERROR AT ',0 MONERM:************************************************************* ; ; REVISIONS: ; ; 1.0 3 JUN 86 GRH ; RELEASE ; VERSN EQUTEST AND INITIALIZATION. ; ;--------------------------------------------------------------------------- ; ; INIT CONSOLE OUT--------------- ; ; CONSOLE INPUT FUNCTION ; EXIT - A= CHARACTER ; ;-------------------------------------------------------;--------------------------------------------------------------------------- JP BZOUT ; ; ;--------------------------------------------- JP NTIST SUBTTL NAKED TERMINAL I/O FUNCTIONS ;-----------------------------------------------------------DUMMY RETURN (NULL PROCEDURE) ; ;--------------------------------------------------------------------------- RETURN: RET 0 %+ &, !'- "(. #)/ $*0 ;--------------------------------------------------------------------------- ; ; KEYBOARD INPUT FUNCTION ; EXIT - A= CHARACT--------------------------------------- ; ; INIT OUTPUT TO KNOWN STATE ; ;--------------------------------------------------CHAR ; LD A,C OUT (BZUDAT),A RET ;--------------------------------------------------------------------------- ; ; is ROM. ; ;**************************************************************************** ; ; Revision status: ; ; 1.0 - Relt. ; 1.7 - 8 FEB 86 GRH ; Remove time delay from power up reset code to allow ISHA to access ; ram. ; Remove the auto-boER ; ;--------------------------------------------------------------------------- NTIN: CALL NTIST ;WAIT FOR CHARACTER READY------------------------- BZOI: XOR A,A ;GET 8251'S ATTENTION 1ST LD B,5 BZOI1: OUT (BZUDAT),A EX (SP),HL ;DELAY A WHILEKEYBOARD INPUT FUNCTION ; EXIT - A= CHARACTER ; ;--------------------------------------------------------------------------- ease ; 1.1 - ; Add Double D deselect upon reset code. ; Change printer port. ; 1.2 - 20 FEB 83 GRH ; Add delay before turot from reset function. ; ; 1.8 - 29 MAY 86 GRH ; Add Cromemco PRI printer driver as primary printer. ; Change IOBYTE defi JR Z,NTIN ; ; FETCH CHARACTER ; IN A,(NTD) RET ;--------------------------------------------------------------- EX (SP),HL DJNZ BZOI1 ; ; NOW PROGRAM THE CHIP ; LD A,BZUMOD ;OUTPUT MODE BYTE OUT (BZUCMD),A ; LD A,BZUCM ;OU BZIN: CALL BZINST ;WAIT FOR CHAR READY JR Z,BZIN ; ; RETURN CHARACTER ; IN A,(BZUDAT) RET ;------------------- TITLE M5b Z-80 MONITOR LIST NOCOND ;*************************************************************************** ; ; SYSTEMning off boot image, in case logic ; too slow. ; 1.3 - 17 MAR 84 GRH ; Change to allow Boot command parameter passing to nitions. ; Remove initialization of Jade FDC port 40H in anticipation of ; Cromemco bank select useage. ; ; 1.9 - 16 AUG 8------------ ; ; KEYBOARD STATUS FUNCTION ; EXIT - A= 0: NOT READY, FFH: READY ; ;-----------------------------------------TPUT COMMAND BYTE OUT (BZUCMD),A ; ; FLUSH GARBAGE ; IN A,(BZUDAT) RET ;------------------------------------------------------------------------------------------------ ; ; KEYBOARD STATUS FUNCTION ; EXIT - A= 0: NOT READY, FFH: READY ; MONITOR FOR M5b ; (c) 1982,1983 GRH ELECTRONICS, CUPERTINO, CA ; ;*********************************************************boot ROM. ; ; 1.4 - 2 JUN 84 GRH ; Fix bug in line printer status subroutine which hung the ; line printer by sensing th6 GRH ; Fix bug in PRI driver which caused new Oki 93 to be busy. ; VERSN EQU '19' ;**************************************---------------------------------- NTIST: ; ; IF STATUS == NOT READY THEN RETURN 0 ; IN A,(NTS) ;FETCH STATUS AND A,1----------------------------------- ; ; CHARACTER OUTPUT ; ENTRY- C= CHARACTER TO OUTPUT ; ;------------------------------- ;--------------------------------------------------------------------------- BZINST: IN A,(BZUST) AND A,BZURXR RET Z ; ****************** ; ; This Monitor program resides at the top of memory & allows memory ; modification & testing, program bre status incorrectly. ; 1.5 - 29 SEP 85 GRH ; Fix bug in Input command which caused monitor to crash. ; The jump to 'BITS************************************** FORM FALSE EQU 0 TRUE EQU NOT FALSE LSTINC EQU FALSE ; ; INCLUDE SYSTEM DEFINITI SHL NTRDY RET Z ; ; ELSE RETURN -1 ; LD A,-1 RET SUBTTL BIG Z SERIAL PORT ;-------------------------------------------------------------------------------- BZOUT: IN A,(BZUST) ;WAIT FOR TX READY AND A,BZUTXR JR Z,BZOUT ; ; OUTPUT  LD A,-1 RET ENDeakpoints, console, printer, punch & ; reader I/O drivers and transfer to system boot ROM residing in same memory ; area as th2' expects DE to be on stack. ; 1.6 - 6 DEC 85 GRH ; Add code to disable all Jade controllers from 40H to 43H after ; reseON FILES ; ;*INCLUDE NAKEDT.DEF ;*INCLUDE MONBOARD.DEF ;*INCLUDE BIGZ.DEF ;*INCLUDE JDDCONT.DEF ;*INCLUDE IOBOARD.DEF ;*I0 %+ &, !'- "(. #)/ $*0NCLUDE PRI.DEF ; LIST OFF *INCLUDE NAKEDT.DEF *INCLUDE MONBOARD.DEF *INCLUDE BIGZ.DEF *INCLUDE JDDCONT.DEF *INCLUDE IOBO FROM NORMAL SYSTEM ; STACK LOCATION. ; ALOC EQU 15H BLOC EQU 13H CLOC EQU 12H DLOC EQU 11H ELOC EQU 10H FLOC EQU 14H HET ;(C) HAS NEW IOBYTE JP MEMCK ;MEMORY LIMIT CHECK JP RTS ;IODEF- DEFINE USER I/O ENTRY POINTS JP RTS ;SPECIAL I/O COZE RESTART VECTORS IN PAGE 0 ; LD SP,3FH ;USE STACK TO INIT RESTARTS LD HL,0C300H LD DE,RSTER LD B,16 ;64 BYTES INIT 10 ;CONVERT TO + ASCII # LD B,A LD A,C ;IF TENS = 0 THEN OUTPUT SPACE ADD '0' CP '0' JR NZ,NOT0 LD A,' ' NOT0 ;DELAY A WHILE EX (SP),HL DJNZ URTLP LD A,BZUMOD ;OUTPUT MODE BYTE OUT (BZUCMD),A LD A,BZUCM ;OUTPUT COMMAND BYTE M ; THE BOTTOM UP UNTIL A NON-RAM LOCATION IS FOUND. IT THEN TAKES OFF FOR ; MONITOR WORK SPACE NEEDS. ; EXIT - HL= MEMTOP PT; EXIT - B= HIGH BYTE OF RAM ; A= LOW BYTE OF RAM ; ;***********************************************************************ARD.DEF *INCLUDE PRI.DEF LIST ON ;============================ ; ; ASSEMBLE TIME VARIABLES ; ;========================LOC EQU 31H LLOC EQU 30H PLOC EQU 34H SLOC EQU 17H TLOC EQU 35H TLOCX EQU 25H LLOCX EQU 20H ; APLOC EQU 9 BPLOC EQU 11 NTROL JP REST ;BREAKPOINT ENTRY LPSTAT: JP LSTAT ;LINE PRINTER STATUS RETURN DS 6 ;SAVE 2 SPARES ;-------------------1: PUSH DE PUSH HL DJNZ INIT1 ; ; SET TEMPORARY STACK ; LD SP,80H ; ; REMOVE JADE DOUBLE D WINDOW(S) ; LD A,DD: LD C,A CALL CO LD C,B CALL CO LD C,'K' CALL CO CALL CRLF POP HL ;MEMTOP ; ; CONTINUATION OF THE SCS MONITOROUT (BZUCMD),A IN A,(BZUDAT) ;READ ANY GARBAGE CHAR ; ; INSERT I/O INIT CODE HERE ; ; ; OUTPUT SIGN-ON MESSAGE ; LR ; ;**************************************************************************** MEMSIZ: PUSH BC ;MONITOR START LOCATION ***** MEMCK: PUSH HL CALL MEMSIZ ;GET THE RAM SIZE LD A,L ;TAKE OFF WORKSPACE SUB 60 JR NC,MEMCK0 DEC H MEMCK0: LD==== ROM EQU 0F800H ;ROM START ADDR WSVEC EQU 0 ;VECTOR NUMBER FOR WARM RESTART NBKPTS EQU 2 ;NUMBER OF BREAKPOINTS ;== CPLOC EQU 10 DPLOC EQU 13 EPLOC EQU 12 FPLOC EQU 8 HPLOC EQU 15 LPLOC EQU 14 XLOC EQU 7 YLOC EQU 5 RLOC EQU 2 ILOC EQU----------------------------- ; ; THE FOLLOWING CODE MUST RESIDE AT THE SAME ; ADDR AS THE BOOT ROM START CODE. ; ;------FREE ;REMOVE DD WINDOW, IF PRESENT OUT (41H),A OUT (42H),A OUT (43H),A ; ; INITIALIZE IOBYTE ; LD C,IOBYTV ;SET TO , MOVE EXIT ROUTINE TO RAM ; LD SP,HL LD DE,EXIT EX DE,HL LD BC,ENDX - EXIT LDIR ; LD BC,NBKPTS * 3 ;CONTIND HL,LOGMSG ;OUTPUT SIGN-ON CALL PRTWD JR WINIT ; ; SPECIAL DISK BOOT CODE SWAPS ROMS FOR BOOT ; IF BOOT SUCCESSFUL, DOLD BC,ROM LD HL,-1 MEMSZ1: INC HL LD A,(HL) CPL LD (HL),A CP (HL) CPL LD (HL),A JR NZ,MEMSZ2 ; LD A,H ;SEE  B,H POP HL RET ;************************************** ; ; EXF SUBR. READS 1 PARAMETER. ; ENTRY- A= PARAMETER 1ST CHA========================== ; ; CONSTANTS ; ;============================ CTRLS EQU 13H ;ASCII DC3 CR EQU 0DH LF EQU 0A 3 SUBTTL MAIN PROGRAM ORG ROM ;-------------------------------------- ; ; JUMP TARGETS FOR BASIC I/O ; ;-------------------------------------------------------- DBOOT: LD A,C ;PERFORM SWAP AND 7 ;CLEAR ERROR MSG IN CASE ROM NOT THERE & MASK INITIAL IOBYTE VALUE CALL IOSET ; ; SIZE AND DISPLAY MEMORY ; LD HL,USRMSG ;OUTPUT MEMORY= CALL PRTWD CALL MEMSIZ UE 'JP 0' FOR 3 TIMES PUSH DE POP HL DEC HL LDIR ; LD HL,-24 ADD HL,SP PUSH HL INC HL ;ADJUST USER STACK LOCATES NOT RETURN. ; IF UNSUCCESSFUL, RETURNS CARRY IF ERROR, NO CARRY IF DISK NOT INSERTED. ; BOOTCD: LD C,XDBROM ;PASS IN DEFAUIF ON MONITOR BORDER CP B JR NZ,MEMSZ1 MEMSZ2: DEC HL ;TAKE OFF WORKSPACE LD BC,EXIT-ENDX-3*NBKPTS+1 ;EXIT RTN + BP JUMPR ; EXIT - STACK= PARAMETER ; ;************************************** EXF: LD B,1 ;SET 1 PARAM LD HL,0 JR EX1 ;1ST CHAH BELL EQU 7 ;============================ ; ; VARIABLES ; ;============================ IOBYTE EQU 3 ;ADDR OF I/O C------------------------ CBOOT JP INIT ;COLD START CONIN JP CI ;CONSOLE INPUT READER JP RI ;READER CONOUT JP CO ;CONSOLE OUT ROMSEL,A RET ;-------------------------------------- ; ; THE COLD INITIALIZATION CODE ; ;------------------------;OUTPUT MEMORY SIZE PUSH HL ;SAVE VALUE FOR LATER ; ; COMPUTE # KS ; LD A,H ; /1024 SRL A SRL A LD C,0 ;TENS COUION INC HL LD (SPSV),HL ;SAVE INITIAL STACK VALUE ; ; INITIALIZE REGISTER IMAGES TO 0 ; LD D,10 INIT2: PUSH BC DECLT BOOT ROM ADDR BOOTCC: CALL DBOOT LD HL,BOOTEM CALL C,PRTWD ; JR WINIT ;GO TO MONITOR EXEC ;********************S ADD HL,BC POP BC ;UNPREDICTABLE DURING INIT RET ;*****************************************************************R IN A ALREADY ;**************************************************************************** ; ; EXPR SUBR. READS PARAMETERONTROL BYTE IOBYTV EQU 00H ;DEFAULT IOBYTE VALUE ; SPSV EQU 6 ;STACK PTR SAVE LOCATION ; ; REGISTER STORAGE DISPLACEMENTS OUTPUT PUNCH JP PUNO ;PUNCH LIST JP LO ;LIST OUTPUT CONST JP CSTS ;CONSOLE STATUS JP IOCHK ;PUT IOBYTE INTO A JP IOS-------------- INIT: ; ; INSURE INTERRUPTS DISABLED ; DI ; ; REMOVE PAGE 0 IMAGE ; OUT COLDRES,A ; ; INITIALINT = 0 MEMLP: SUB 10 ;NUMBER = NUMBER - 10 JR C,MEM1 ; INC C ;IF < 10 THEN C = TENS DIGIT JR MEMLP ; MEM1: ADD '0' + D JR NZ,INIT2 ; ; INITIALIZE BIG Z 8251 ; XOR A ;GET IT'S ATTENTION 1ST LD B,5 URTLP: OUT (BZUDAT),A EX (SP),HL ******************************************************** ; ; MEMSIZ SUBR CALCULATES THE TOP OF CONTIGUOUS RAM. IT SEARCHES FRO*********** ; ; MEMCHK SUBR FINDS THE CURRENT TOP OF CONTIGUOUS MEMORY (LESS THE ; MONITOR WORKSPACE) & RETURNS THE VALUE. S FROM THE CONSOLE & DEVELOPS A 16 BIT HEX ; FOR EACH ONE. A CARRIAGE RETURN WILL TERMINATE THE ENTRY SEQUENCE. A BLANK ; OR C0 %+ &, !'- "(. #)/ $*0OMMA WILL END THE CURRENT PARAMETER ENTRY. EACH PARAMETER ONLY TAKES ; THE LAST 4 DIGITS TYPED IN. ANY EXCESS IS DISCARDED. A NT UNDER RETURN ADDR ON STACK PUSH HL LD A,C ;IF LAST CHAR = DELIM THEN EXIT CALL P2C JR NC,EX3 DJNZ QPRT ;ELSE IF MO L: T,L,1,2 (TTY,CRT,LPT,UL1) ; ;---------------------------------------------------------------------------- ASGN: CALL ERT CP 'Z' - 'A' + 1 JR NC,QPRT ADD A,A ;OFFSET = INDEX * 2 LD E,A LD D,0 LD B,2 ;PASS IN 2 PARAMS TO HANDLER LDDE ;RESTORE SP IN CASE STACK JR WINIT ; WAS OVERWRITTEN ;---------------------------- ; ; ASSIGN CONTINUED ; ;------ ;******************************************* ; ; RETURN IOBYTE VALUE SUBR ; EXIT - A= CURRENT IOBYTE VALUE ; ;*********;ECHO THE BELL DJNZ BYE1 RET ;---------------------------------------------------------------------------- ; ; VERIFY M A,B CALL DASH1 ;FORMAT POP AF CALL HEX1 ;OUTPUT S2 CMPB: POP BC CALL HILOXB JR CMPA ;--------------------------ON-HEX DIGIT WILL ; TERMINATE THE ENTRY SEQUENCE & CAUSE A WARM BOOT OF THE MON. ; ENTRY- B= # OF PARAMETERS NEEDED ; EXIT - RE REQ'D THEN ERR RET ;ELSE RETURN ;---------------------------------------------------------------------------- ; ; LOCHO ;GET THE LOGICAL DEVICE DESIRED LD HL,ALT ;START OF CONVERSION TABLE LD DE,APT - ALT ; # OF ELEMENTS LD B,4 ; COUNT HL,TBL ;ADDRESS = (TABLE + OFFSET) ADD HL,DE LD A,(HL) INC HL LD H,(HL) LD L,A JP (HL) ;--------------------------------------------- AS1: LD D,B ;SAVE THE COUNTER RESIDUE LD B,4 CALL DECHO ;GET NEW ASSIGNMENT AS2: INC HL ;PTR = P********************************** IOCHK: LD A,(IOBYTE) RET ;-----------------------------------------------------------EMORY COMMAND ; ; THIS ROUTINE COMPARES 2 BLOCKS OF MEMORY AGAINST EACH OTHER. IF A ; DIFFERENCE IN THE RELATIVE ADDRESS CONT-------------------------------------------------- ; ; DISPLAY MEMORY COMMAND ; ; THIS ROUTINE DISPLAYS A BLOCK OF MEMORY ONSTACK= PARAMETERS ; ;**************************************************************************** AS3: DJNZ AS2 ;PART OF THEGICAL ASSIGNMENT OF PERIPHERALS COMMAND ; ; THIS COMMAND CONTROLS THE ASSIGNMENT OF PHYSICAL PERIPHERALS TO THE ; 4 LOGICAL D = # ENTRIES AS0: CP (HL) ;IF CHAR = TABLE[LOGICAL] THEN JR Z,AS1 ; EXIT ADD HL,DE ;ELSE NEXT LOGICAL ENTRY DJNZ AS0 ----------------------------------------------------- ; ; FILL MEMORY COMMAND ; ; THIS ROUTINE FILLS A BLOCK OF MEMORY WITH TR + 1 CP (HL) ;IF CHAR <> (TABLE) THEN EXIT JR NZ,AS3 LD L,B ;SAVE THE RESIDUE TO FORM ASGNT DEC L LD B,D LD H,----------------- ; ; SLEEP COMMAND ; ; THE BYE ROUTINE IS USED TO PREVENT UNAUTHORIZED USAGE OF THE SYSTEM. ; THE SYSTEM LENTS IS DETECTED, THE ADDRESS OF THE ; 1ST BLOCK IS DISPLAYED, ALONG WITH IT'S CONTENTS & THE CONTENTS OF THE ; OTHER BLOCK'S  THE CONSOLE DEVICE. THE ; USER MUST SPECIFY THE START & FINISH ADDRESSES. THE DISPLAY IS ORGANIZED TO ; DISPLAY UP TO 16 BYTE ASSIGN CODE EX3: JR NZ,QPRT ;NON 0 IS ERR EXPR1: DEC B ;IF NO PARAMS THEN RETURN RET Z EXPR: LD HL,0 ;PARAM = 0 EX0: CEVICE TYPES. IT ALTERS (IOBYTE) TO MATCH THE CURRENT ASSIGNMENT. ; THE 4 LOGICAL DEVICES ARE CONSOLE, READER, LIST & PUNCH. IN  QPRT: LD HL,QMSG ;OUTPUT ? MESSAGE CALL PRTWA ;---------------------------- ; ; THE WARM START CODE ; ;--------------A USER DEFINED CONSTANT. IT ; EXPECTS 3 PARAMETERS TO BE ENTERED IN THE FOLLOWING ORDER: ; START ADDR, FINISH ADDR, FILL VALUE3 DEC B JR Z,AS5 ;NO SHIFT NEEDED AS4: ADD HL,HL ;SHIFT MASKS ADD HL,HL DJNZ AS4 AS5: LD A,(IOBYTE) OR H XOR HOCKS UP & WILL NOT RESPOND TO ANYTHING OTHER THAN 2 ASCII BELL ; CHARACTERS. WHEN IT SEES THEN CONSECUTIVELY, CONTROL IS RETURNSAME RELATIVE ADDRESS. ; ; V ; ;----------------------------------S PER DISPLAY LINE, WITH ALL COLUMNS ALIGNED SO EACH ; COLUMN HAS THE SAME LAST HEX DIGIT IN IT'S ADDR. ; ; D[ <ALL ECHO ;GET NEXT # EX1: LD C,A ;SAVE CHAR FOR LATER CALL NIBBLE JR C,EX2 ;IF NOT NUMBER THEN EXIT ADD HL,HL ;PARAM ALL CASES, THE ; TTY DEVICE (SYSTEM CONSOLE) IS SET UP AS THE DEFAULT DEVICE. ; ; Ax ;x= C,R,P,L (CONSOLE,READER,PUNCH,LIS-------------- WINIT: LD SP,(SPSV) ;RESTORE THE STACK WINITA: LD HL,WINIT ;RESET RETURN & WARM START VECT PUSH HL LD (WSVE ; ; F ; ;---------------------------------------------------------------------------- ;LOGICAL BITS NOW OFF OR L ;PUT IN NEW VALUE LD C,A ;************************************** ; ; SET IOBYTE SUBR ; EED TO THE ; MONITOR WITHOUT ALTERING ANYTHING. ; ; Z ; ;-------------------------------------------------------------------------------------------------------- COMP: CALL EXPR3 CMPA: LD A,(BC) ;GET SOURCE 2 DATA PUSH BC ;SAVE SOURCE 2 PTR END_ADDR>] ; ;---------------------------------------------------------------------------- DISP: CALL EXLF ;GET BLOCK LIMITS= PARAM * 16 ADD HL,HL ADD HL,HL ADD HL,HL OR L ;ADD IN NEW DIGIT LD L,A JR EX0 ;GET NEXT ; EX2: EX (SP),HL ;PUT) ; Ax-y ;y= C: T,C,B,1 (TTY,CRT,BAT,UC1) ; R: T,P,1,2 (TTY,PTR,UR1,UR2) ; P: T,P,1,2 (TTY,PTP,UP1,UP2) ; C + 1),HL LD A,0C3H LD (WSVEC),A CALL CRLF CALL DECHO ;GET COMMAND SUB 'A' ;IF CHAR <> 'A' -> 'F' THEN ERR JR C,QP FILL: CALL EXPR3 ;GET 3 PARAMS FIO: LD (HL),C ;PUT DOWN THE FILL VALUE CALL HILO ;INC & CHECK THE PTR JR NC,FIO POP NTRY- C= NEW IOBYTE VALUE ; ;************************************** IOSET: LD A,C LD (IOBYTE),A ;SAVE NEW ASSIGNMENTS RET-------------- BYE: LD B,2 ;SET UP FOR 2 CHARS BYE1: CALL CONI CP BELL ;IF NOT BELL THEN RESTART JR NZ,BYE CALL ECH1  LD B,(HL) ;GET SOURCE 1 DATA CP B ;IF S2=S1 THEN EXIT JR Z,CMPB PUSH AF ;SAVE S2 DATA CALL LADRB ;OUTPUT ADDR LD DIS1: CALL LADRB ;DISPLAY START ADDR LD A,L ;SEE IF ON 16 BYTE BOUNDARY CALL TRPLSP ;SKIP OVER TO RIGHT COLUMN PUSH H0 %+ &, !'- "(. #)/ $*0L DIS2: LD A,(HL) ;GET CONTENTS CALL HEX1 CALL HILO ;INC & CHECK PTR JR C,DIS7 ;DONE IF CARRY CALL BLK ;MAKE COLUMN BLK ;DO SPACING DJNZ TRPL1 RET ;---------------------------------------------------------------------------- ; ; GOTO------- GOTO: CALL PCHK ;SEE IF OD ADDR WANTED JR C,GO3 JR Z,GO0 ;YES, BUT SET BP CALL EXF ;GET NEW GOTO ADDR POP DEALL CRLF ;NEW LINE FOR PGM POP HL ;GET RID OF STACK JUNK LD HL,RS9 PUSH HL LD HL,REST LD (9),HL ;SET BP VECTOR ADDRT DATA TO PORT COMMAND ; ; O ; ;-------------------------------------- OUPT: CALL EXPR ;GETOM ; ; B<(ARG * 10H) + PROM #> ; ARG :: 0..FH (PASSED TO BOOT ROM) ; PROM # :: 0..7 (DEFAULT # = 02H) ; ;--------------ORTUNITY TO ALTER IT. ; ; S ; ;---------------------------------------------------------------------------- SUBS: CA----------------------------- ; ; MTEST COMMAND TESTS A SPECIFIED BLOCK OF MEMORY TO SEE IF ANY HARD ; DATA BIT FAILURES EXISS LD A,L ;READY FOR NEW LINE? AND 0FH JR NZ,DIS2 DIS3: POP HL ;RESTORE START OF LINE LD A,L ;SKIP OVER TO RIGHT SPAC COMMAND ; ; GOTO COMMAND TRANSFERS CONTROL TO A SPECIFIED ADDRESS IT ALLOWS THE ; SELECTIVE SETTING OF UP TO 2 BREAKPOINTS A LD HL,PLOC ;PUT ADDR IN PC LOCATION ADD HL,SP LD (HL),D DEC HL LD (HL),E LD A,C ;IF LAST = CR THEN EXIT CP CR  LD HL,24 ;FIND REG SET ROUTINE ADDR ADD HL,SP POP DE ;ADJUST STACK JP (HL) ;GO DO REG RESTORE ;------------------ DATA INTO E, PORT # INTO C POP DE POP BC OUT (C),E RET ;---------------------------------------------------------------------------------------------- BOOTC: CALL PCHK ;IF NO FURTHER INPUT THEN USE DEFAULT JP C,BOOTCD CALL EXF ;GET USER LL EXPR1 ;GET ADDR CALL CRLF ;START ON NEW LINE POP HL SUB1: LD A,(HL) ;OUTPUT EXISTING CONTENTS CALL DASH1 CALL PCHT. IT IS NOT AN EXHAUSTIVE TEST, BUT JUST A QUICK ; INDICATION OF THE MEMORY'S OPERATIVENESS. ; ; T E AND 0FH CALL TRPL2 DIS4: LD A,(HL) ;OUTPUT MEMORY IN ASCII AND 7FH ;IF PRINTABLE THEN OUTPUT LD C,A CP ' ' JR CS WELL AS ALLOWING ANY CONSOLE ; INPUT TO BREAKPONT THE RUN, AS LONG AS INTERRUPT 1 IS ACTIVE. ; ; G ;START EXECUTION A JR Z,GO3 GO0: LD B,NBKPTS LD HL,TLOC ;POINT TO TRAP STORAGE ADD HL,SP GO1: PUSH BC ;# BPS PUSH HL ;STORAGE PTR LD ---------------------------------------------------------- ; ; INPUT FROM PORT COMMAND ; ; THESE ROUTINES ALLOW BYTE-BY-BYTE---------------- ; ; MOVE COMMAND ; ; THIS ROUTINE EXPECTS 3 PARAMETERS, ENTERED IN THE FOLLOWING SEQUENCE: ; SOURCE 1ST BYBOOT # POP BC JP BOOTCC ;---------------------------------------------------------------------------- ; ; SUBSTITUTE MEK ;GET NEW VALUE RET C ;IF CHAR = CR THEN RETURN JR Z,SUB2 ;IF CHAR = ' ' OR ',' THEN EXIT CP LF ;IF CHAR = LF THEN BA; ;---------------------------------------------------------------------------- MTEST: CALL EXLF MTEST1: LD A,(HL) PUSH AF ,DIS5 CP 7EH JR C,DIS6 DIS5: LD C,'.' ;ELSE OUTPUT '.' DIS6: CALL CONOUT CALL HILOX LD A,L ;READY FOR NEW LINE? ANT WHATEVER IS IN PC REG (NO BPS) ; G ;START EXECUTION AT START_ADDR (NO BPS) ; G,[,] ;STARB,2 CALL EXPR1 POP DE ;GET TRAP ADDR POP HL ;SPTR LD A,D ;INSURE 0 WASN'T SPEC'D OR E JR Z,GO2 LD (HL),E ;SAVE INPUT OR OUTPUT FROM THE CURRENT ; CONSOLE DEVICE. ; ; I ; ;------------------------------------------------TE ADDR, SOURCE LAST BYTE ADDR & DESTINATION 1ST BYTE ADDR. ; ; M ; ;-----------MORY COMMAND ; ; THIS ROUTINE ALLOWS THE USER TO INSPECT ANY MEMORY LOCATION & ALTER ; THE CONTENTS, IF DESIRED & IF THE ADDRCK UP JR Z,SUB3 PUSH HL ;PTR CALL EXF ;CONTINUE HEX INPUT POP DE ;NEW VALUE POP HL ;PTR LD (HL),E ;LOAD VALUE  CPL LD (HL),A XOR (HL) ;RESULT SHOULD BE 0 CALL NZ,BITS ;LOG ERR IF NOT MTEST2: POP AF ;RESTORE BYTE LD (HL),A CD 0FH JR NZ,DIS4 ;NO JR DIS1 ;YES ; DIS7: SUB A,E ;SKIP OVER TO START ASCII CALL TRPLSP JR DIS3 ; TRPLSP: AND 0FHT EXECUTION AT START_ADDR WITH ; BREAKPOINT AT BP1 AND OPTIONAL BREAKPOINT AT BP2 ; G,[,] ;START EXECUTION AT PC  BP ADDR INC HL LD (HL),D INC HL LD A,(DE) ;SAVE BP ADDR INSTRUCTION LD (HL),A INC HL LD A,0CFH ;INSERT THE BP ---------------------------- INPT: CALL EXPR1 ;GET INPUT PORT # INTO C CALL CRLF ;PUT DATA ON NEW LINE POP BC IN E,(C) ----------------------------------------------------------------- MOVE: CALL EXPR3 MOV1: LD A,(HL) ;MOVE 1 BYTE LD (BC),A ESS IS IN RAM. THE CONTENTS MAY BE ; LEFT UNALTERED BY ENTERING A SPACE, COMMA OR RETURN. IF A RETURN IS ; ENTERED, THE ROUTIN LD A,C ;IF DELIM = CR THEN DONE CP CR RET Z SUB2: INC HL ;PTR = PTR + 2 INC HL SUB3: DEC HL ;PTR = PTR - 1 LD A,L ALL HILOX JR MTEST1 ; BITS: PUSH DE LD E,A CALL LADRB ;OUTPUT ADDR BITS2: LD B,8 ;BIT COUNT BITS1: LD A,E RLCA L ;ISOLATE LOW NIBBLE LD B,A ;PREPARE TO SPACE OVER TO RIGHT ADD A,A ; COLUMN ADD B TRPL2: LD B,A INC B TRPL1: CALLVALUE WITH BREAKPOINT(S) AT ; BP1 & OPTIONAL BP2. ; ;--------------------------------------------------------------------- LD (DE),A GO2: LD A,C ;IF CHAR = CR THEN DONE BPING CP CR POP BC JR Z,GO3 DJNZ GO1 ;ELSE IF <2 BPS THEN LOOP GO3: C PUSH DE ;FIX BUG. BITS2 POPS DE BEFORE 'RET' JR BITS2 ;OUTPUT VALUE ;-------------------------------------- ; ; OUTPU CALL HILOXB JR MOV1 ;------------------------------------------------ ; ; BOOT COMMAND ; ALLOWS EXECUTION OF A BOOT PRE IS TERMINATED. IF A SPACE OR COMMA IS ENTERED, THE ; ROUTINE PROCEEDS TO THE NEXT LOCATION & PRESENTS THE USER WITH AN ; OPP ;IF ON MOD 8 BOUNDARY THEN AND 7 ; OUTPUT ADDR CALL Z,LADRB JR SUB1 ;-----------------------------------------------D E,A LD A,'0' / 2 ;BUILD ASCII 1 OR 0 RLA LD C,A CALL CONOUT DJNZ BITS1 POP DE RET ;--------------------------0 %+ &, !'- "(. #)/ $*0-------------------------------------------------- ; ; EXAMINE REGISTERS COMMAND ; INSPECTS THE VALUES OF THE REGISTERS STOREPRTVAL CALL DASH CALL PCHK ;GET NEW INPUT RET C ;IF CHAR = CR THEN RETURN JR Z,XF ;IF NO CHANGE THEN EXIT PUSH HL  TABLE THEN RETURN RET Z CALL M,CRLF ;NEW LINE IF BIT 7 SET CALL CONOUT CALL DASH CALL PRTVAL CALL BLK INC HL ;N1 RET FORM SUBTTL GENERAL PURPOSE SUBROUTINES ;**************************************************************************I ECH1: PUSH BC LD C,A ;OUTPUT CHAR CALL CONOUT LD A,C ;RESTORE CHAR IN A POP BC RET ;******************************************************************** HILO: INC HL LD A,H ;IF HL = 0 THEN RETURN CF OR L SCF RET Z LD A,E ;ECHAR ;*************************************************************** ; ; NIBBLE ROUTINE CONVERTS THE ASCII CHARACTERS 0-CARRY FLAG IS SET. A BLANK OR A COMMA RESETS THE CARRY FLAG. ; ;**************************************************************D BY THE LAST ENCOUNTERED ; BREAKPOINT. THE VALUES MAY BE MODIFIED IF DESIRED. ; ; X ;DISPLAY ALL REGISTER VALUES ; <;PTR CALL EXF POP HL LD A,L INC DE LD (DE),A EX (SP),HL ;RECOVER TABLE PTR LD A,(HL) ;GET THE ATTRIBUTES EX (SEXT ENTRY JR XG ; PRTVAL: INC HL ;NEXT ENTRY LD A,(HL) ;GET OFFSET & ATTRIBUTES AND 3FH ;ISOLATE OFFSET ADD A,2 ;A** ; ; CONV ROUTINE CONVERTS THE LOW ORDER NIBBLE OF THE ; ACCUMULATOR TO ITS ASCII EQUIVALENT. ; ENTRY- A= NUMBER (LO NIBB*************************************** ; ; EXPR3 ROUTINE GETS 3 PARAMETERS, DOES A CR-LF & THEN ; LOADS BC, DE & HL WITH THLSE COMPARE HL TO DE SUB L LD A,D SBC A,H RET ;********************************************************** ; ; HIL9 & A-F ; TO THEIR EQUIVALENT HEX VALUE. IF THE CHARACTER IS NOT IN ; RANGE, THE CARRY BIT IS SET TO FLAG THE ERR. ; ;****************** PCHK: CALL ECHO P2C: CP ' ' ;IF CHAR = ' ' THEN RETURN RET Z CP ',' ;IF CHAR = ',' THEN RETURN RET Z r> ;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 ; ;--------P),HL RLCA ;IF 8 BIT REG THEN EXIT JR NC,XE INC DE ;ELSE REG PAIR, DO OTHER 8 BITS LD A,H LD (DE),A XE: POP HL ;TLLOW FOR RET ADDR EX DE,HL LD L,A ;BUILD ADDR OF REG CONTENTS LD H,0 ADD HL,SP EX DE,HL LD A,(HL) ;NOW FIND ATTRIBLE) ; EXIT - A= C= ASCII NUMBER ; ;*************************************************************** CONV: AND 0FH ADD A,90HE PARAMS. ; ;*************************************************************** EXPR3: INC B ;B HAS 2 ALREADY CALL EXPR POPOX ROUTINE INCREMENTS HL, COMPARES IT TO DE & IF ; EQUAL, RETURNS CONTROL TO THE MONITOR EXEC. OTHERWISE, ; CONTROL RETURNS *********************************************************** NIBBLE: SUB '0' RET C CP 'G' - '0' CCF RET C CP '9' - '0'CP CR ;IF CHAR = CR THEN RETURN CF SCF RET Z CCF ;ELSE RETURN NC RET ;******************************************-------------------------------------------------------------------- XAA: INC HL ;SKIP OVER TO NEXT ENTRY INC HL XA: INC (HABLE PTR XF: LD A,C ;IF LAST = CR THEN RETURN CP CR RET Z ; ; THIS IS THE ACTUAL COMMAND ENTRY POINT ; XMNE: LD HL,AUTES LD B,1 ;SINGLE REG VALUE RLCA JR NC,PV1 ;IF SINGLE REG THEN EXIT INC B ;ELSE REG PAIR RLCA ;IF NOT (HL) THEN ;PUT INTO ASCII ZONE DAA ;AH, THE UBIQUITOUS DAA CONVERT ADC A,40H DAA LD C,A RET ;************************** BC POP DE JP CRLFA ;GO DO CRLF ;**************************************************************************** ; ; HITO THE CALLING ROUTINE. ; ;********************************************************** HILOD: POP DE ;GET RID OF RETURN ADDR  + 1 CCF RET NC SUB 'A' - '9' - 1 CP 10 RET ;****************************************************************************************************** ; ; REST ROUTINE TRAPS ALL OF THE REGISTER CONTENTS WHENEVER A RESTART 1 ; INSTRUCTION IS L) ;IF AT END OF TABLE THEN RETURN RET Z JP P,XAB ;SORT OUT BIT 7 OF TABLE OR 80H ;SET IT ON TEST VALUE JR XAC ; XACTBL ;ADDR OF REG LOOK-UP TABLE XMNE1: CALL PCHK JR C,XG ;IF CHAR = CR THEN SHOW ALL JR Z,XMNE1 ;IF CHAR = ' ' OR ',' THE EXIT JR NC,PV1 PUSH HL ;BUILD ADDR IN HL LD A,(DE) LD H,A DEC DE LD A,(DE) LD L,A LD A,(HL) ;GET (HL) VALUE ************************************* ; ; ECHO ROUTINE READS A BYTE FROM CONSOLE DEVICE & ECHOS ; THE CHAR BACK TO THE CONSOLO ROUTINE INCREMENTS HL. IT THEN CHECKS FOR (& DISALLOWS) A ; WRAP-AROUND SITUATION. IF IT OCCURS, THE CARRY BIT WILL BE SET O RET ;RETURN TO MONITOR HILOXB: INC BC HILOX: CALL HILO JR C,HILOD ;DONE IF CF CALL CONST ;IF NO CONSOLE BREAK TH******** ; ; PCHK ROUTINE READS A CHARACTER FROM THE CONSOLE, THEN CHECKS IT FOR A ; DELIMITER. IF IT IS NOT A DELIMITER, A NEXECUTED. THE TRAPPED CONTENTS ARE STORED IN THE SYSTEM ; STACK AREA FOR LATER ACCESS AND USE BY THE GOTO & THE EXAMINE REGISTEB: AND 7FH ;RESET BIT 7 XAC: DEC (HL) ;TO BE PULLED OUT IN ROM CP (HL) JR NZ,XAA ;NO MATCH, TRY AGAIN CALL BLK CALL N LOOP CP '''' ;IF NOT PRIMES THEN EXIT JR NZ,XA LD HL,PRMTB JR XMNE1 ; XG: LD A,(HL) LD C,A INC A ;IF AT END OF POP HL DJNZ PV2 ;ALLWAYS JUMP PV1: LD A,(DE) ;GET REG CONTENTS PV2: CALL HEX1 ;OUTPUT VALUE DEC DE ;MEM PTR DJNZ PVLE DEVICE. ; ;*************************************************************** DECHO: CALL DASH ;OUTPUT A '-' ECHO: CALL CONN RETURN. ; IF NO WRAP-AROUND OCCURRED, HL IS COMPARED TO DE & THE FLAGS SET ACCORDINGLY. ; ;********************************EN OR A ; RETURN RET Z CALL CONI ;IF CHAR <> CTRL-S THEN BREAK CP CTRLS JR NZ,HILOD JP CONI ;ELSE WAIT FOR NEXT ON-ZERO CONDITION IS RETURNED. IF ; IT IS A DELIMITER, A ZERO CONDITION IS RETURNED. FURTHER, IF THE DELIMITER ; IS A CR, THE RS ; COMMANDS. ; ; INSERT INTERRUPT DISABLER SOFTWARE AT START OF REST. ; ;************************************************0 %+ &, !'- "(. #)/ $*0**************************** REST: PUSH HL ;SAVE ALL REGS PUSH DE PUSH BC PUSH AF CALL MEMSIZ ;GET THE MONITOR STACK SER (HL) INC HL LD (HL),D PUSH BC LD C,'*' ;OUTPUT BREAK INDICATION CALL CONOUT POP DE ;BP LOCATION LD A,RS9 / 2TURN TO MONITOR RS9: PUSH HL RST 8 ;FORCE BP EXIT: POP BC LD A,C LD R,A LD A,B LD I,A POP IX POP IY POP A------------------------------- IOER: LD A,IOBYTV ;SET IOBYTE TO DEFAULT LD (IOBYTE),A LD HL,IOMSG JR COMERR ;--------**** QUERY: LD A,(IOBYTE) LD B,4 LD HL,ACT ;ADDR OF CONVERSION TABLE LD DE,ALT - APT QUE1: PUSH AF CALL BLK LD C,(HRTWD ROUTINE OUTPUTS AN ASCII STRING ONTO THE CONSOLE. ; THE STRING MUST BE TERMINATED BY BIT 7 SET IN THE LAST CHAR OF THE ST********************************************** ; ; CRLF ROUTINE OUTPUTS A CR-LF ON THE CONSOLE DEVICE TO ; START A NEW LINE.SH ROUTINE OUTPUTS A '-' TO THE CONSOLE DEVICE ; ;********************************************************** DASH1: CALL HEX1LOCATION EX DE,HL LD HL,10 ;GO UP 10 BYTES IN STACK ADD HL,SP LD B,4 EX DE,HL RS1: DEC HL LD (HL),D ;SAVE IN WORK56 CP D ;SEE IF A RET BP JR Z,RS6 INC HL INC HL LD (HL),E ;RESTORE USER PC INC HL LD (HL),D EX DE,HL ;OUTPUT F POP BC POP DE POP HL EX AF,AF' EXX POP DE POP BC POP AF POP HL LD SP,HL DB 0 ;PLACE FOR EI LD HL,0 ----------------------------------- ; ; UNINITIALIZED RESTART ERROR HANDLER ; ;------------------------------------------- L) ;GET CURRENT LOGICAL DEVICE CODE CALL CONOUT CALL DASH POP AF PUSH AF PUSH HL QUE2: INC HL INC A AND 3 ;BITS RING. ; THE STRING WILL START A NEW LNE (PRTWD) OR CONTINUE ON THE SAME LINE (PRTWA). ; ;************************************ ; ;*************************************************************** CRLF: PUSH HL CRLFA: LD HL,CRMSG CALL PRTWA POP HL  ;OUTPUT A AS HEX DASH: LD C,'-' JR CO ;*********************** ; ; PRINT ADDR SUBR ; ;*********************** LAD AREA DEC HL LD (HL),E POP DE DJNZ RS1 POP BC ;GET BREAKPOINT LOCATION + 1 DEC BC ;BACK UP TO RESTART INSTRUCTION BP LOCATION CALL LADR RS6: LD HL,TLOCX ADD HL,SP LD BC,NBKPTS * 256 RS7: LD E,(HL) ;RESTORE BP'D LOCATIONS LD (HL),C JP 0 ; ENDX: EQU $ ;---------------------------------------------------------------------------- ; ; 3 TYPES OF ERRORRSTER: LD HL,RSTMSG ;--------------------------------- ; ; COMMON ERROR HANDLER ; ENTRY- HL= MESSAGE PTR ; ;------------0 & 1 ARE 0 WHEN ON CURRENT ASSGN JR NZ,QUE2 LD C,(HL) ;FOUND IT, NOW OUTPUT IT CALL CONOUT POP HL POP AF RRA RRA**************************************** PRTWD: CALL CRLF PRTWA: PUSH BC PRTA: LD C,(HL) RES 7,C ;MAKE SURE BIT 7 = 0 CA RET ;*************************************************************** ; ; LADR ROUTINE OUTPUTS THE CONTENTS OF HL ON THE RB: CALL LADRA BLK: LD C,' ' ;OUTPUT A SPACE ; FALLS INTO CO SUBR SUBTTL IOBYTE HANDLERS ;****************************** LD SP,HL ;SET THE MONITOR STACK LD HL,TLOCX ;RESTORE BP ADD HL,SP PUSH DE LD D,NBKPTS RS2: LD A,(HL) SUB C ;SEE I ;RESET SYSTEM SAVE AREA INC HL LD D,(HL) LD (HL),C INC HL LD A,E ;IF LOC = 0 THEN SKIP RESTORE OR D JR Z,RS8 LS ARE DETECTED: A RESTART ERROR; AN I/O ASSIGNMENT ; ERROR; & CERTAIN PROGRAM ERRORS (DETERMINED BY PARTICULAR ROUTINE WHERE TH--------------------- COMERR: CALL PRTWD JP WSVEC ;*********************************************************************** ADD HL,DE ;NEXT ENTRY DJNZ QUE1 RET ;******************************************************************** ; ; CONLL CO LD A,(HL) ;IF BIT 7 = 1 THEN STOP INC HL RLCA JR NC,PRTA PRTB: POP BC RET ;******************************CONSOLE ; EITHER AT THE START OF A NEW LINE (LADRA) OR AT THE CURRENT ; CURSOR LOCATION (LADR). ; ;************************************************************* ; ; CONSOLE OUTPUT SELECTOR ; ENTRY- (IOBYTE BIT 0..1): 0: CON0, 1: CON1, 2: CON2, 3: F SOFTWARE TRAP INC HL LD A,(HL) SBC A,B ;MAYBE, TRY REST OF ADDR JR Z,RS5 ;FOUND 1, RESET IT RS3: INC HL ;NOT FOUNDD A,(HL) ;ELSE RESTORE ORIGINAL INSTR. LD (DE),A RS8: INC HL ;DO NEXT BP DJNZ RS7 EX AF,AF' ;NOW SAVE THE Z80 UNIQUES E ; ERROR CONDITION WAS ENCOUNTERED) EACH CAUSES A UNIQUE MESSAGE TO BE ; PRINTED, THEN DOES A WARM INIT OF THE MONITOR. THE I***** ; ; QUERY ROUTINE WILL TELL THE OPERATOR WHAT HIS CURRENT LOGICAL-PHYSICAL ; PERIPHERAL DEVICE ASSIGNMENTS ARE. NO PARAI ROUTINE READS THE CONSOLE & STRIPS OFF THE PARITY BIT. ; ;*************************************************************************************************** ; ; EXLF ROUTINE READS 2 PARAMETERS, PUTS THEM INTO THE DE ; & HL REGS, THEN DOES A CR-LF.**************************************** LADRA: CALL CRLF LADR: LD A,H CALL HEX1 LD A,L HEX1: PUSH AF RRCA RRCA RRCCON3 ; C= CHAR ; ;******************************************************************** CO: LD A,(IOBYTE) AND 3 JP Z,CO0, TRY NEXT 1 INC HL DEC D JR NZ,RS2 RS4: INC BC ;NONE FOUND RS5: LD HL,LLOCX POP DE ADD HL,SP LD (HL),E ;STORE U EXX PUSH HL PUSH DE PUSH BC PUSH AF PUSH IX PUSH IY LD A,I LD B,A LD A,R LD C,A PUSH BC JP WINITA ;RE/O ERROR CAUSES THE ; I/O ASSIGNMENTS TO BE RESET TO THE DEFAULT ASSIGNMENT. ; ;---------------------------------------------METERS (OTHER THAN A CR) ARE ; REQUIRED ON ENTRY. ; ;************************************************************************** CONI: CALL CI AND 7FH RTS: RET ;**************************************************************************** ; ; P ; ;*************************************************************** EXLF: CALL EXPR POP DE POP HL ;*****************A RRCA CALL HEX2 POP AF HEX2: CALL CONV JR CO ;********************************************************** ; ; DA ;CONSOLE 0 CP 2 JP M,CO1 ;CONSOLE 1 JP Z,CO2 ;CONSOLE 2 JP CO3 ;CONSOLE 3 ;***********************************0 %+ &, !'- "(. #)/ $*0************************************** ; ; CONSOLE STATUS INPUT SELECTOR ; ENTRY- (IOBYTE BIT 0..1)= 0: CON0, 1: CON1, 2: CONE 2 JP CI3 ;CONSOLE 3 ;************************************************************************* ; ; LIST DEVICE OUTPUTAT0 ;PRINTER 0 CP 80H JP M,LSTAT1 ;PRINTER 1 JP Z,LSTAT2 ;PRINTER 2 LD A,-1 ;CONSOLE (ASSUME READY) RET ;******************************************************************** PUNO: LD A,(IOBYTE) AND 30H JP Z,SO0 ;SERIAL CHANNEL 0 CP********************* ; ; ALTERNATE CONSOLE DEVICE (CON1) ; ;************************************** CI1: CALL CSTS1 ;IF NO: EQU IOER ;************************************** ; ; LIST DEVICE 1 (LST1) ; ;**************************************  RES CENTDST,A ;OUTPUT LOW TRUE STROBE OUT (CENTOUT),A SET CENTDST,A ;RESTORE STROBE OUT (CENTOUT),A RET LSTAT1: IOER ;************************************** ; ; SERIAL CHANNEL 2 (SC2) ; ;************************************** SI22, 3: CON3 ; EXIT - A= 0: NOT READY, FFH: CHAR READY ; ;*********************************************************************T SELECTOR ; ENTRY- (IOBYTE BIT 6..7)= 0: LST0, 40H: LST1, 80H: LST2, C0H: CON ; C= CHAR ; ;********************************************************************************************* ; ; SERIAL CHANNEL INPUT SELECTOR ; ENTRY- (IOBYTE BIT 2..3)=  20H JP M,SO1 ;SERIAL CHANNEL 1 JP Z,SO2 ;SERIAL CHANNEL 2 JP SO3 ;SERIAL CHANNEL 3 SUBTTL PRIMITIVE I/O DRIVERS ;T READY THEN WAIT JR Z,CI1 ; IN A,(BZUDAT) ;INPUT CHAR RET CO1: IN A,(BZUST) ;IF NOT READY THEN WAIT AND BZUTXR  LO0: CALL LSTAT0 ;WAIT FOR BUSY=FALSE JR Z,LO0 ; LD A,C ;OUTPUT CHARACTER OUT (PRI1DO),A LD A,NOT [1 SHL PRI1CSB LD A,[1 SHL CENTDST] ;INSURE STROBE STARTS HIGH OUT (CENTOUT),A ; IN A,(CENTS) ;IF BUSY THEN RETURN 0 CPL ;REVERSE S: EQU IOER SO2: EQU IOER ;************************************** ; ; SERIAL CHANNEL 3 (SC3) ; ;***************************** CSTS: LD A,(IOBYTE) AND 3 JP Z,CSTS0 ;CONSOLE 0 CP 2 JP M,CSTS1 ;CONSOLE 1 JP Z,CSTS2 ;CONSOLE 2 JP CSTS3 ****************************************** LO: LD A,(IOBYTE) AND 0C0H JP Z,LO0 ;PRINTER 0 CP 80H JP M,LO1 ;PRINTER 1 0: SC0, 4: SC1, 8: SC2, 0CH: SC3 ; EXIT - A= CHAR AND 7FH (CTRL-Z: EOF) ; ;**************************************************************************************** ; ; PRIMARY CONSOLE DEVICE (CON0) ; ;************************************** CI0: CALJR Z,CO1 ; LD A,C ;OUTPUT CHAR OUT (BZUDAT),A RET CSTS1: IN A,(BZUST) ;IF RXRDY NOT TRUE THEN RETURN 0 AND BZURXR] ;OUTPUT STROBE OUT (PRI2CNT),A LD A,0BFH OUT (PRI2CNT),A ;CLEAR STROBE RET LSTAT0: LD A,0BFH ;THIS PRINTER NENSE AND A,[1 SHL CENTBSY] RET Z ; LD A,-1 ;ELSE RETURN -1 RET ;************************************** ; ; LIST************* SI3: EQU IOER SO3: EQU IOER SUBTTL MESSAGES CRMSG: DM CR,LF RSTMSG: DM 'RST ERR' BOOTEM: DM 'BOOT LOAD ;CONSOLE 3 ;******************************************************************** ; ; CONSOLE INPUT SELECTOR ; ENTRY- (IO JP Z,LO2 ;PRINTER 2 JP CO ;CONSOLE ;************************************************************************* ; ; L****************** RI: LD A,(IOBYTE) AND 0CH JP Z,SI0 ;SERIAL CHANNEL 0 CP 8 JP M,SI1 ;SERIAL CHANNEL 1 JP Z,SI2 ;L CSTS0 ;IF CHAR NOT READY THEN WAIT JR Z,CI0 ; IN A,(NTD) ;ELSE RETURN CHAR RET CO0: IN A,(NTS) ;IF NOT READY TO RET Z ; LD A,-1 ;ELSE RETURN -1 RET ;************************************** ; ; ALTERNATE CONSOLE DEVICE (CON2EEDS STB=F FOR BUSY OUT (PRI2CNT),A ; TO WORK PROPERLY ; IN A,(PRI1ST) ;FETCH STATUS CPL AND A,[1 SHL PRI1BSB] ;TEST  DEVICE 2 (LST2) ; ;************************************** LO2: EQU IOER LSTAT2: EQU IOER ;****************************ERR',CR,LF USRMSG: DM 'MEMORY = ' IOMSG: DM 'I/O ERR' QMSG: DM '????' LOGMSG: DM 'ZMON VERS ',HIGH VERSN,'.',LOW VERSN,CR,LFBYTE BIT 0..1)= 0: CON0, 1: CON1, 2: CON2, 3: CON3 ; EXIT - A= CHAR (CTRL-Z: EOF) ; ;****************************************IST DEVICE STATUS INPUT SELECTOR ; ENTRY- (IOBYTE BIT 6..7)= 0: LST0, 40H: LST1, 80H: LST2, C0H: CON ; EXIT - A= 0: BUSY, FFH:SERIAL CHANNEL 2 JP SI3 ;SERIAL CHANNEL 3 ;************************************************************************* ;  ACCEPT CHAR THEN WAIT AND 1 SHL NTBSY JR NZ,CO0 ; LD A,C ;OUTPUT CHAR & RETURN OUT (NTD),A RET CSTS0: IN A,(NT) ; ;************************************** CO2: EQU IOER CSTS2: EQU IOER CI2: EQU IOER ;*****************************BUSY RET Z ; LD A,-1 RET ;************************************** ; ; LIST DEVICE 1 (LST1) ; ;***************************** ; ; SERIAL CHANNEL 0 (SC0) ; ;************************************** SI0: EQU IOER SO0: EQU IOER ;******** SUBTTL CONSTANTS ;***************************************************** ; ; TBL CONTAINS THE ADDRESSES OF THE COMMANDS. **************************** CI: LD A,(IOBYTE) AND 3 JP Z,CI0 ;CONSOLE 0 CP 2 JP M,CI1 ;CONSOLE 1 JP Z,CI2 ;CONSOL READY ; ;************************************************************************* LSTAT: LD A,(IOBYTE) AND 0C0H JP Z,LS ; SERIAL CHANNEL OUTPUT SELECTOR ; ENTRY- (IOBYTE BIT 4..5)= 0: SC0, 10H: SC1, 20H: SC2, 30H: SC3 ; C= CHAR ; ;***********S) ;IF NOT CHAR NOT READY THEN RETURN 0 AND 1 SHL NTRDY RET Z ; LD A,-1 ;ELSE RETURN -1 RET ;************************** ; ; ALTERNATE CONSOLE DEVICE (CON3) ; ;************************************** CO3: EQU IOER CSTS3: EQU IOER CI3******************* LO1: CALL LSTAT1 ;IF BUSY THEN WAIT JR Z,LO1 ; LD A,C ;OUTPUT CHAR SET CENTDST,A OUT (CENTOUT),A****************************** ; ; SERIAL CHANNEL 1 (SC1) ; ;************************************** SI1: EQU IOER SO1: EQU ; THE EXECUTIVE USES IT TO LOOK UP THE DESIRED ADDR. ; ;***************************************************** TBL: DW ASGN 0 %+ &, !'- "(. #)/ $*0;A DW BOOTC ;B DW QPRT ;C DW DISP ;D DW QPRT ;E DW FILL ;F DW GOTO ;G DW QPRT ;H DW INPT ;I DW QPRT ;DER DEVICE TABLE DB '3' ; SERIAL CHANNEL 3 DB '2' ; SERIAL CHANNEL 2 DB '1' ; SERIAL CHANNEL 1 DB '0' ; SERIAL C 80H,HPLOC + 0C0H DB 'X',XLOC + 80H DB 'Y',YLOC + 80H DB 'R',RLOC DB -1 END ****************** ; ; This Monitor program resides at the top of memory & allows memory ; modification & testing, program bre status incorrectly. ; 1.5 - 29 SEP 85 GRH ; Fix bug in Input command which caused monitor to crash. ; The jump to 'BITS; ;============================ ROM EQU 0F800H ;ROM START ADDR WSVEC EQU 0 ;VECTOR NUMBER FOR WARM RESTART NBKPTS EQU 2 ;EQU 25H LLOCX EQU 20H ; APLOC EQU 9 BPLOC EQU 11 CPLOC EQU 10 DPLOC EQU 13 EPLOC EQU 12 FPLOC EQU 8 HPLOC EQU 15 LPLOCRETURN DS 6 ;SAVE 2 SPARES ;------------------------------------------------ ; ; THE FOLLOWING CODE MUST RESIDE AT THEJ DW QPRT ;K DW QPRT ;L DW MOVE ;M DW QPRT ;N DW OUPT ;O DW QPRT ;P DW QUERY ;Q DW QPRT ;R DW SUBS ;SHANNEL 0 ; ACT: DB 'C' ;LOGICAL CONSOLE DEVICE TABLE DB '3' ; CONSOLE 3 DB '2' ; CONSOLE 2 DB '1' ; CONSOLE 1 Deakpoints, console, printer, punch & ; reader I/O drivers and transfer to system boot ROM residing in same memory ; area as th2' expects DE to be on stack. ; 1.6 - 6 DEC 85 GRH ; Add code to disable all Jade controllers from 40H to 43H after ; reseNUMBER OF BREAKPOINTS ;============================ ; ; CONSTANTS ; ;============================ CTRLS EQU 13H ;ASCI EQU 14 XLOC EQU 7 YLOC EQU 5 RLOC EQU 2 ILOC EQU 3 SUBTTL MAIN PROGRAM ORG ROM ;-------------------------------------- SAME ; ADDR AS THE BOOT ROM START CODE. ; ;------------------------------------------------ DBOOT: LD A,C ;PERFORM SWAP  DW MTEST ;T DW QPRT ;U DW COMP ;V DW QPRT ;W DW XMNE ;X DW QPRT ;Y DW BYE ;Z ;----------------------- B '0' ; CONSOLE 0 ;--------------------------------- ; ; Z80 REGISTER OFFSET TABLE ; ;---------------------------------is ROM. ; ;**************************************************************************** ; ; Revision status: ; ; 1.0 - Relt. ; VERSN EQU '16' ; ;**************************************************************************** FORM FALSE EQU 0 TRUI DC3 CR EQU 0DH LF EQU 0AH BELL EQU 7 ;============================ ; ; VARIABLES ; ;============================  ; ; JUMP TARGETS FOR BASIC I/O ; ;-------------------------------------- CBOOT JP INIT ;COLD START CONIN JP CI ;CONSOLEAND 7 ;CLEAR ERROR MSG IN CASE ROM NOT THERE & MASK OUT ROMSEL,A RET ;-------------------------------------- ; ; THE C; ; IOBYTE TABLE ; ;----------------------- ALT: DB 'L' ;LOGICAL LIST DEVICE TABLE DB 'C' ; CONSOLE DB '2' ; LIST D ACTBL: DB 80H + 'A',ALOC DB 'B',BLOC DB 'C',CLOC DB 'D',DLOC DB 'E',ELOC DB 'F',FLOC DB 'H',HLOC DB 'L',LLOC Dease ; 1.1 - ; Add Double D deselect upon reset code. ; Change printer port. ; 1.2 - 20 FEB 83 GRH ; Add delay before turE EQU NOT FALSE LSTINC EQU FALSE ; ; INCLUDE SYSTEM DEFINITION FILES ; ;*INCLUDE NAKEDT.DEF ;*INCLUDE MONBOARD.DEF ;*INIOBYTE EQU 3 ;ADDR OF I/O CONTROL BYTE IOBYTV EQU 80H ;DEFAULT IOBYTE VALUE SELECTS LPT AS LIST DEV. ; SPSV EQU 6 ;STACK P INPUT READER JP RI ;READER CONOUT JP CO ;CONSOLE OUTPUT PUNCH JP PUNO ;PUNCH LIST JP LO ;LIST OUTPUT CONST JP CSTS ;COLD INITIALIZATION CODE ; ;-------------------------------------- INIT: ; ; INSURE INTERRUPTS DISABLED ; DI ; ; DEEVICE 2 DB '1' ; LIST DEVICE 1 DB '0' ; LIST DEVICE 0 ; APT: DB 'P' ;LOGICAL PUNCH DEVICE TABLE DB '3' ; SERIAL CB 80H + 'M',HLOC + 0C0H DB 'P',PLOC + 80H DB 'S',SLOC + 80H DB 'I',ILOC ; ; PRIME Z80 REGISTER OFFSETS ; PRMTB: DB 80H TITLE M5b Z-80 MONITOR LIST NOCOND ;*************************************************************************** ; ; SYSTEMning off boot image, in case logic ; too slow. ; 1.3 - 17 MAR 84 GRH ; Change to allow Boot command parameter passing to CLUDE BIGZ.DEF ;*INCLUDE JDDCONT.DEF ;*INCLUDE IOBOARD.DEF ; LIST OFF *INCLUDE NAKEDT.DEF *INCLUDE MONBOARD.DEF *INCLUDETR SAVE LOCATION ; ; REGISTER STORAGE DISPLACEMENTS FROM NORMAL SYSTEM ; STACK LOCATION. ; ALOC EQU 15H BLOC EQU 13H CLOCONSOLE STATUS JP IOCHK ;PUT IOBYTE INTO A JP IOSET ;(C) HAS NEW IOBYTE JP MEMCK ;MEMORY LIMIT CHECK JP RTS ;IODEF- DLAY A WHILE FOR HARDWARE TO CATCH UP ; LD HL,0 RESWT: DEC HL LD A,L OR H JR NZ,RESWT ; ; REMOVE PAGE 0 IMAGE ; HANNEL 3 DB '2' ; SERIAL CHANNEL 2 DB '1' ; SERIAL CHANNEL 1 DB '0' ; SERIAL CHANNEL 0 ; ART: DB 'R' ;LOGICAL REA + 'A',APLOC DB 'B',BPLOC DB 'C',CPLOC DB 'D',DPLOC DB 'E',EPLOC DB 'F',FPLOC DB 'H',HPLOC DB 'L',LPLOC DB 'M' + MONITOR FOR M5b ; (c) 1982,1983 GRH ELECTRONICS, CUPERTINO, CA ; ;*********************************************************boot ROM. ; ; 1.4 - 2 JUN 84 GRH ; Fix bug in line printer status subroutine which hung the ; line printer by sensing th BIGZ.DEF *INCLUDE JDDCONT.DEF *INCLUDE IOBOARD.DEF LIST ON ;============================ ; ; ASSEMBLE TIME VARIABLES  EQU 12H DLOC EQU 11H ELOC EQU 10H FLOC EQU 14H HLOC EQU 31H LLOC EQU 30H PLOC EQU 34H SLOC EQU 17H TLOC EQU 35H TLOCX EFINE USER I/O ENTRY POINTS JP RTS ;SPECIAL I/O CONTROL JP REST ;BREAKPOINT ENTRY LPSTAT: JP LSTAT ;LINE PRINTER STATUS OUT COLDRES,A ; ; INITIALIZE RESTART VECTORS IN PAGE 0 ; LD SP,3FH ;USE STACK TO INIT RESTARTS LD HL,0C300H LD DE,RS0 %+ &, !'- "(. #)/ $*0TER LD B,16 ;64 BYTES INIT1: PUSH DE PUSH HL DJNZ INIT1 ; ; SET TEMPORARY STACK ; LD SP,80H ; ; REMOVE JADE D' CP '0' JR NZ,NOT0 LD A,' ' NOT0: LD C,A CALL CO LD C,B CALL CO LD C,'K' CALL CO CALL CRLF POP HL ;MECMD),A LD A,BZUCM ;OUTPUT COMMAND BYTE OUT (BZUCMD),A IN A,(BZUDAT) ;READ ANY GARBAGE CHAR ; ; INSERT I/O INIT CODE HCE NEEDS. ; EXIT - HL= MEMTOP PTR ; ;**************************************************************************** MEMSIZ: PU************************************** MEMCK: PUSH HL CALL MEMSIZ ;GET THE RAM SIZE LD A,L ;TAKE OFF WORKSPACE SUB 60  IN. ANY EXCESS IS DISCARDED. A NON-HEX DIGIT WILL ; TERMINATE THE ENTRY SEQUENCE & CAUSE A WARM BOOT OF THE MON. ; ENTRY- B= R NC,EX3 DJNZ QPRT ;ELSE IF MORE REQ'D THEN ERR RET ;ELSE RETURN ;----------------------------------------------------------------------- ASGN: CALL ECHO ;GET THE LOGICAL DEVICE DESIRED LD HL,ALT ;START OF CONVERSION TABLE LD DE,APT - ALT OUBLE D WINDOW(S) ; LD A,DDOUT ;REMOVE DD WINDOW, IF PRESENT OUT (40H),A OUT (41H),A OUT (42H),A OUT (43H),A ; ; MTOP ; ; CONTINUATION OF THE SCS MONITOR, MOVE EXIT ROUTINE TO RAM ; LD SP,HL LD DE,EXIT EX DE,HL LD BC,ENDXERE ; ; ; OUTPUT SIGN-ON MESSAGE ; LD HL,LOGMSG ;OUTPUT SIGN-ON CALL PRTWD ; ; SPECIAL DISK BOOT CODE SWAPS ROMS FSH BC ;MONITOR START LOCATION LD BC,ROM LD HL,-1 MEMSZ1: INC HL LD A,(HL) CPL LD (HL),A CP (HL) CPL LD (HL),A  JR NC,MEMCK0 DEC H MEMCK0: LD B,H POP HL RET ;************************************** ; ; EXF SUBR. READS 1 PARAMETE# OF PARAMETERS NEEDED ; EXIT - STACK= PARAMETERS ; ;************************************************************************------------------------ ; ; LOGICAL ASSIGNMENT OF PERIPHERALS COMMAND ; ; THIS COMMAND CONTROLS THE ASSIGNMENT OF PHYSICAL ; # OF ELEMENTS LD B,4 ; COUNT = # ENTRIES AS0: CP (HL) ;IF CHAR = TABLE[LOGICAL] THEN JR Z,AS1 ; EXIT ADD HL,DE ;EL INITIALIZE IOBYTE ; LD C,IOBYTV ;SET TO INITIAL IOBYTE VALUE CALL IOSET ; ; SIZE AND DISPLAY MEMORY ; LD HL,USRMSG  - EXIT LDIR ; LD BC,NBKPTS * 3 ;CONTINUE 'JP 0' FOR 3 TIMES PUSH DE POP HL DEC HL LDIR ; LD HL,-24 ADD HL,SP OR BOOT ; IF BOOT SUCCESSFUL, DOES NOT RETURN. ; IF UNSUCCESSFUL, RETURNS CARRY IF ERROR, NO CARRY IF DISK NOT INSERTED. ; B JR NZ,MEMSZ2 ; LD A,H ;SEE IF ON MONITOR BORDER CP B JR NZ,MEMSZ1 MEMSZ2: DEC HL ;TAKE OFF WORKSPACE LD BC,EXIT-ENR. ; ENTRY- A= PARAMETER 1ST CHAR ; EXIT - STACK= PARAMETER ; ;************************************** EXF: LD B,1 ;SET 1 P**** AS3: DJNZ AS2 ;PART OF THE ASSIGN CODE EX3: JR NZ,QPRT ;NON 0 IS ERR EXPR1: DEC B ;IF NO PARAMS THEN RETURN RET Z PERIPHERALS TO THE ; 4 LOGICAL DEVICE TYPES. IT ALTERS (IOBYTE) TO MATCH THE CURRENT ASSIGNMENT. ; THE 4 LOGICAL DEVICES ARE CSE NEXT LOGICAL ENTRY DJNZ AS0 QPRT: LD HL,QMSG ;OUTPUT ? MESSAGE CALL PRTWA ;---------------------------- ; ; THE WA;OUTPUT MEMORY= CALL PRTWD CALL MEMSIZ ;OUTPUT MEMORY SIZE PUSH HL ;SAVE VALUE FOR LATER ; ; COMPUTE # KS ; LD A,H  PUSH HL INC HL ;ADJUST USER STACK LOCATION INC HL LD (SPSV),HL ;SAVE INITIAL STACK VALUE ; ; INITIALIZE REGISTER IMOOTCD: LD C,XDBROM ;PASS IN DEFAULT BOOT ROM ADDR BOOTCC: CALL DBOOT LD HL,BOOTEM CALL C,PRTWD ; JR WINIT ;GO TO MONITODX-3*NBKPTS+1 ;EXIT RTN + BP JUMPS ADD HL,BC POP BC ;UNPREDICTABLE DURING INIT RET ;********************************ARAM LD HL,0 JR EX1 ;1ST CHAR IN A ALREADY ;****************************************************************************EXPR: LD HL,0 ;PARAM = 0 EX0: CALL ECHO ;GET NEXT # EX1: LD C,A ;SAVE CHAR FOR LATER CALL NIBBLE JR C,EX2 ;IF NOT NUMBONSOLE, READER, LIST & PUNCH. IN ALL CASES, THE ; TTY DEVICE (SYSTEM CONSOLE) IS SET UP AS THE DEFAULT DEVICE. ; ; Ax ;x= RM START CODE ; ;---------------------------- WINIT: LD SP,(SPSV) ;RESTORE THE STACK WINITA: LD HL,WINIT ;RESET RETURN & WAR ; /1024 SRL A SRL A LD C,0 ;TENS COUNT = 0 MEMLP: SUB 10 ;NUMBER = NUMBER - 10 JR C,MEM1 ; INC C ;IF < 10 THEN CAGES TO 0 ; LD D,10 INIT2: PUSH BC DEC D JR NZ,INIT2 ; ; INITIALIZE BIG Z 8251 ; XOR A ;GET IT'S ATTENTION 1ST R EXEC ;**************************************************************************** ; ; MEMSIZ SUBR CALCULATES THE TOP O******************************************** ; ; MEMCHK SUBR FINDS THE CURRENT TOP OF CONTIGUOUS MEMORY (LESS THE ; MONITOR  ; ; EXPR SUBR. READS PARAMETERS FROM THE CONSOLE & DEVELOPS A 16 BIT HEX ; FOR EACH ONE. A CARRIAGE RETURN WILL TERMINATE THER THEN EXIT ADD HL,HL ;PARAM = PARAM * 16 ADD HL,HL ADD HL,HL ADD HL,HL OR L ;ADD IN NEW DIGIT LD L,A JR EX0 ;C,R,P,L (CONSOLE,READER,PUNCH,LIST) ; Ax-y ;y= C: T,C,B,1 (TTY,CRT,BAT,UC1) ; R: T,P,1,2 (TTY,PTR,UR1,UR2) ; PM START VECT PUSH HL LD (WSVEC + 1),HL LD A,0C3H LD (WSVEC),A CALL CRLF CALL DECHO ;GET COMMAND SUB 'A' ;IF CHAR = TENS DIGIT JR MEMLP ; MEM1: ADD '0' + 10 ;CONVERT TO + ASCII # LD B,A LD A,C ;IF TENS = 0 THEN OUTPUT SPACE ADD '0 LD B,5 URTLP: OUT (BZUDAT),A EX (SP),HL ;DELAY A WHILE EX (SP),HL DJNZ URTLP LD A,BZUMOD ;OUTPUT MODE BYTE OUT (BZUF CONTIGUOUS RAM. IT SEARCHES FROM ; THE BOTTOM UP UNTIL A NON-RAM LOCATION IS FOUND. IT THEN TAKES OFF FOR ; MONITOR WORK SPAWORKSPACE) & RETURNS THE VALUE. ; EXIT - B= HIGH BYTE OF RAM ; A= LOW BYTE OF RAM ; ;**************************************E ENTRY SEQUENCE. A BLANK ; OR COMMA WILL END THE CURRENT PARAMETER ENTRY. EACH PARAMETER ONLY TAKES ; THE LAST 4 DIGITS TYPEDGET NEXT ; EX2: EX (SP),HL ;PUT UNDER RETURN ADDR ON STACK PUSH HL LD A,C ;IF LAST CHAR = DELIM THEN EXIT CALL P2C J: T,P,1,2 (TTY,PTP,UP1,UP2) ; L: T,L,1,2 (TTY,CRT,LPT,UL1) ; ;--------------------------------------------------------- <> 'A' -> 'F' THEN ERR JR C,QPRT CP 'Z' - 'A' + 1 JR NC,QPRT ADD A,A ;OFFSET = INDEX * 2 LD E,A LD D,0 LD B,2 0 %+ &, !'- "(. #)/ $*0;PASS IN 2 PARAMS TO HANDLER LD HL,TBL ;ADDRESS = (TABLE + OFFSET) ADD HL,DE LD A,(HL) INC HL LD H,(HL) LD L,A JP; ; ASSIGN CONTINUED ; ;---------------------------- AS1: LD D,B ;SAVE THE COUNTER RESIDUE LD B,4 CALL DECHO ;GET NEW RRENT IOBYTE VALUE ; ;******************************************* IOCHK: LD A,(IOBYTE) RET ;-------------------------------------------- ; ; VERIFY MEMORY COMMAND ; ; THIS ROUTINE COMPARES 2 BLOCKS OF MEMORY AGAINST EACH OTHER. IF A ; DIFFERPA ;---------------------------------------------------------------------------- ; ; DISPLAY MEMORY COMMAND ; ; THIS ROUTIF CARRY CALL BLK ;MAKE COLUMNS LD A,L ;READY FOR NEW LINE? AND 0FH JR NZ,DIS2 DIS3: POP HL ;RESTORE START OF LINE ---------------------- ; ; GOTO COMMAND ; ; GOTO COMMAND TRANSFERS CONTROL TO A SPECIFIED ADDRESS IT ALLOWS THE ; SELECTIVE EXF ;GET NEW GOTO ADDR POP DE LD HL,PLOC ;PUT ADDR IN PC LOCATION ADD HL,SP LD (HL),D DEC HL LD (HL),E LD A,C  (HL) ;---------------------------------------------------------------------------- ; ; FILL MEMORY COMMAND ; ; THIS ROUTASSIGNMENT AS2: INC HL ;PTR = PTR + 1 CP (HL) ;IF CHAR <> (TABLE) THEN EXIT JR NZ,AS3 LD L,B ;SAVE THE RESIDUE TO FO-------------------------------------------------- ; ; SLEEP COMMAND ; ; THE BYE ROUTINE IS USED TO PREVENT UNAUTHORIZED USAENCE IN THE RELATIVE ADDRESS CONTENTS IS DETECTED, THE ADDRESS OF THE ; 1ST BLOCK IS DISPLAYED, ALONG WITH IT'S CONTENTS & THE INE DISPLAYS A BLOCK OF MEMORY ON THE CONSOLE DEVICE. THE ; USER MUST SPECIFY THE START & FINISH ADDRESSES. THE DISPLAY IS ORGA LD A,L ;SKIP OVER TO RIGHT SPACE AND 0FH CALL TRPL2 DIS4: LD A,(HL) ;OUTPUT MEMORY IN ASCII AND 7FH ;IF PRINTABLE THE SETTING OF UP TO 2 BREAKPOINTS AS WELL AS ALLOWING ANY CONSOLE ; INPUT TO BREAKPONT THE RUN, AS LONG AS INTERRUPT 1 IS ACTIVE.;IF LAST = CR THEN EXIT CP CR JR Z,GO3 GO0: LD B,NBKPTS LD HL,TLOC ;POINT TO TRAP STORAGE ADD HL,SP GO1: PUSH BC ;# INE FILLS A BLOCK OF MEMORY WITH A USER DEFINED CONSTANT. IT ; EXPECTS 3 PARAMETERS TO BE ENTERED IN THE FOLLOWING ORDER: ; STRM ASGNT DEC L LD B,D LD H,3 DEC B JR Z,AS5 ;NO SHIFT NEEDED AS4: ADD HL,HL ;SHIFT MASKS ADD HL,HL DJNZ AS4 GE OF THE SYSTEM. ; THE SYSTEM LOCKS UP & WILL NOT RESPOND TO ANYTHING OTHER THAN 2 ASCII BELL ; CHARACTERS. WHEN IT SEES THENCONTENTS OF THE ; OTHER BLOCK'S SAME RELATIVE ADDRESS. ; ; V ; ;-NIZED TO ; DISPLAY UP TO 16 BYTES PER DISPLAY LINE, WITH ALL COLUMNS ALIGNED SO EACH ; COLUMN HAS THE SAME LAST HEX DIGIT IN IN OUTPUT LD C,A CP ' ' JR C,DIS5 CP 7EH JR C,DIS6 DIS5: LD C,'.' ;ELSE OUTPUT '.' DIS6: CALL CONOUT CALL HILOX  ; ; G ;START EXECUTION AT WHATEVER IS IN PC REG (NO BPS) ; G ;START EXECUTION AT START_ADDR (NO BPS) ; BPS PUSH HL ;STORAGE PTR LD B,2 CALL EXPR1 POP DE ;GET TRAP ADDR POP HL ;SPTR LD A,D ;INSURE 0 WASN'T SPEC'D OART ADDR, FINISH ADDR, FILL VALUE ; ; F ; ;-------------------------------------------AS5: LD A,(IOBYTE) OR H XOR H ;LOGICAL BITS NOW OFF OR L ;PUT IN NEW VALUE LD C,A ;******************************** CONSECUTIVELY, CONTROL IS RETURNED TO THE ; MONITOR WITHOUT ALTERING ANYTHING. ; ; Z ; ;-------------------------------------------------------------------------------------------------------- COMP: CALL EXPR3 CMPA: LD A,(BC) ;GET SOURCE 2 DAT'S ADDR. ; ; D[ ] ; ;---------------------------------------------------------------------------- DLD A,L ;READY FOR NEW LINE? AND 0FH JR NZ,DIS4 ;NO JR DIS1 ;YES ; DIS7: SUB A,E ;SKIP OVER TO START ASCII CALL TRPG,[,] ;START EXECUTION AT START_ADDR WITH ; BREAKPOINT AT BP1 AND OPTIONAL BREAKPOINT AT BP2 ; G,[,] ;START EXECUTION AT PC VALUE WITH BREAKPOINT(S) AT ; BP1 & OPTIONAL BP2. ; ;------------------------------------ HL LD A,0CFH ;INSERT THE BP LD (DE),A GO2: LD A,C ;IF CHAR = CR THEN DONE BPING CP CR POP BC JR Z,GO3 DJNZ GO1  CHECK THE PTR JR NC,FIO POP DE ;RESTORE SP IN CASE STACK JR WINIT ; WAS OVERWRITTEN ;---------------------------- TE),A ;SAVE NEW ASSIGNMENTS RET ;******************************************* ; ; RETURN IOBYTE VALUE SUBR ; EXIT - A= CURESTART JR NZ,BYE CALL ECH1 ;ECHO THE BELL DJNZ BYE1 RET ;----------------------------------------------------------A CALL LADRB ;OUTPUT ADDR LD A,B CALL DASH1 ;FORMAT POP AF CALL HEX1 ;OUTPUT S2 CMPB: POP BC CALL HILOXB JR CMKIP OVER TO RIGHT COLUMN PUSH HL DIS2: LD A,(HL) ;GET CONTENTS CALL HEX1 CALL HILO ;INC & CHECK PTR JR C,DIS7 ;DONE RPL2: LD B,A INC B TRPL1: CALL BLK ;DO SPACING DJNZ TRPL1 RET ;---------------------------------------------------------------------------------------------- GOTO: CALL PCHK ;SEE IF OD ADDR WANTED JR C,GO3 JR Z,GO0 ;YES, BUT SET BP CALL;ELSE IF <2 BPS THEN LOOP GO3: CALL CRLF ;NEW LINE FOR PGM POP HL ;GET RID OF STACK JUNK LD HL,RS9 PUSH HL LD HL,REST0 %+ &, !'- "(. #)/ $*0 LD (9),HL ;SET BP VECTOR ADDR LD HL,24 ;FIND REG SET ROUTINE ADDR ADD HL,SP POP DE ;ADJUST STACK JP (HL) ;GO DO R---------- OUPT: CALL EXPR ;GET DATA INTO E, PORT # INTO C POP DE POP BC OUT (C),E RET ;---------------------------AULT # = 02H) ; ;------------------------------------------------ BOOTC: CALL PCHK ;IF NO FURTHER INPUT THEN USE DEFAULT J----------------------- SUBS: CALL EXPR1 ;GET ADDR CALL CRLF ;START ON NEW LINE POP HL SUB1: LD A,(HL) ;OUTPUT EXISTINGNY HARD ; DATA BIT FAILURES EXIST. IT IS NOT AN EXHAUSTIVE TEST, BUT JUST A QUICK ; INDICATION OF THE MEMORY'S OPERATIVENESS. THE VALUES OF THE REGISTERS STORED BY THE LAST ENCOUNTERED ; BREAKPOINT. THE VALUES MAY BE MODIFIED IF DESIRED. ; ; X ;DF NO CHANGE THEN EXIT PUSH HL ;PTR CALL EXF POP HL LD A,L INC DE LD (DE),A EX (SP),HL ;RECOVER TABLE PTR LD A,LL PRTVAL CALL BLK INC HL ;NEXT ENTRY JR XG ; PRTVAL: INC HL ;NEXT ENTRY LD A,(HL) ;GET OFFSET & ATTRIBUTES AND 3EG RESTORE ;---------------------------------------------------------------------------- ; ; INPUT FROM PORT COMMAND ; ; ------------------------------------------------- ; ; MOVE COMMAND ; ; THIS ROUTINE EXPECTS 3 PARAMETERS, ENTERED IN THE FOLP C,BOOTCD CALL EXF ;GET USER BOOT # POP BC JP BOOTCC ;--------------------------------------------------------------- CONTENTS CALL DASH1 CALL PCHK ;GET NEW VALUE RET C ;IF CHAR = CR THEN RETURN JR Z,SUB2 ;IF CHAR = ' ' OR ',' THEN EX ; ; T ; ;---------------------------------------------------------------------------- MTEST: CALL EISPLAY ALL REGISTER VALUES ; ;r= A,B,C,D,E,F,H,L,M,P,S,I,'A,'B,'C,'D,'E,'H,'L,'M,X,Y,R ; ;d= HEX NUMBER TO PL(HL) ;GET THE ATTRIBUTES EX (SP),HL RLCA ;IF 8 BIT REG THEN EXIT JR NC,XE INC DE ;ELSE REG PAIR, DO OTHER 8 BITS LFH ;ISOLATE OFFSET ADD A,2 ;ALLOW FOR RET ADDR EX DE,HL LD L,A ;BUILD ADDR OF REG CONTENTS LD H,0 ADD HL,SP EX DETHESE ROUTINES ALLOW BYTE-BY-BYTE INPUT OR OUTPUT FROM THE CURRENT ; CONSOLE DEVICE. ; ; I ; ;---------------LOWING SEQUENCE: ; SOURCE 1ST BYTE ADDR, SOURCE LAST BYTE ADDR & DESTINATION 1ST BYTE ADDR. ; ; M ; ;---------------------------------------------------------------------------- MOVE: CALL EXPR3 MOV1: LD AONTENTS, IF DESIRED & IF THE ADDRESS IS IN RAM. THE CONTENTS MAY BE ; LEFT UNALTERED BY ENTERING A SPACE, COMMA OR RETURN. IF A ;PTR LD (HL),E ;LOAD VALUE LD A,C ;IF DELIM = CR THEN DONE CP CR RET Z SUB2: INC HL ;PTR = PTR + 2 INC HL SUB3:AF ;RESTORE BYTE LD (HL),A CALL HILOX JR MTEST1 ; BITS: PUSH DE LD E,A CALL LADRB ;OUTPUT ADDR BITS2: LD B,8 ;BIO NEXT ENTRY INC HL XA: INC (HL) ;IF AT END OF TABLE THEN RETURN RET Z JP P,XAB ;SORT OUT BIT 7 OF TABLE OR 80H ;SETAND ENTRY POINT ; XMNE: LD HL,ACTBL ;ADDR OF REG LOOK-UP TABLE XMNE1: CALL PCHK JR C,XG ;IF CHAR = CR THEN SHOW ALL JR ZG PAIR RLCA ;IF NOT (HL) THEN EXIT JR NC,PV1 PUSH HL ;BUILD ADDR IN HL LD A,(DE) LD H,A DEC DE LD A,(DE) LD L ON NEW LINE POP BC IN E,(C) PUSH DE ;FIX BUG. BITS2 POPS DE BEFORE 'RET' JR BITS2 ;OUTPUT VALUE ;-----------------,(HL) ;MOVE 1 BYTE LD (BC),A CALL HILOXB JR MOV1 ;------------------------------------------------ ; ; BOOT COMMAND  RETURN IS ; ENTERED, THE ROUTINE IS TERMINATED. IF A SPACE OR COMMA IS ENTERED, THE ; ROUTINE PROCEEDS TO THE NEXT LOCATION & DEC HL ;PTR = PTR - 1 LD A,L ;IF ON MOD 8 BOUNDARY THEN AND 7 ; OUTPUT ADDR CALL Z,LADRB JR SUB1 ;--------------T COUNT BITS1: LD A,E RLCA LD E,A LD A,'0' / 2 ;BUILD ASCII 1 OR 0 RLA LD C,A CALL CONOUT DJNZ BITS1 POP DE R IT ON TEST VALUE JR XAC ; XAB: AND 7FH ;RESET BIT 7 XAC: DEC (HL) ;TO BE PULLED OUT IN ROM CP (HL) JR NZ,XAA ;NO MA,XMNE1 ;IF CHAR = ' ' OR ',' THEN LOOP CP '''' ;IF NOT PRIMES THEN EXIT JR NZ,XA LD HL,PRMTB JR XMNE1 ; XG: LD A,(HL,A LD A,(HL) ;GET (HL) VALUE POP HL DJNZ PV2 ;ALLWAYS JUMP PV1: LD A,(DE) ;GET REG CONTENTS PV2: CALL HEX1 ;OUTPUT V--------------------- ; ; OUTPUT DATA TO PORT COMMAND ; ; O ; ;---------------------------- ; ALLOWS EXECUTION OF A BOOT PROM ; ; B<(ARG * 10H) + PROM #> ; ARG :: 0..FH (PASSED TO BOOT ROM) ; PROM # :: 0..7 (DEF PRESENTS THE USER WITH AN ; OPPORTUNITY TO ALTER IT. ; ; S ; ;------------------------------------------------------------------------------------------------------------------- ; ; MTEST COMMAND TESTS A SPECIFIED BLOCK OF MEMORY TO SEE IF AET ;---------------------------------------------------------------------------- ; ; EXAMINE REGISTERS COMMAND ; INSPECTS TCH, TRY AGAIN CALL BLK CALL PRTVAL CALL DASH CALL PCHK ;GET NEW INPUT RET C ;IF CHAR = CR THEN RETURN JR Z,XF ;I) LD C,A INC A ;IF AT END OF TABLE THEN RETURN RET Z CALL M,CRLF ;NEW LINE IF BIT 7 SET CALL CONOUT CALL DASH CAALUE DEC DE ;MEM PTR DJNZ PV1 RET FORM SUBTTL GENERAL PURPOSE SUBROUTINES ;*****************************************0 %+ &, !'- "(. #)/ $*0*********************************** ; ; CONV ROUTINE CONVERTS THE LOW ORDER NIBBLE OF THE ; ACCUMULATOR TO ITS ASCII EQUIVALET ;*************************************************************** ; ; EXPR3 ROUTINE GETS 3 PARAMETERS, DOES A CR-LF & T OR L SCF RET Z LD A,E ;ELSE COMPARE HL TO DE SUB L LD A,D SBC A,H RET ;*********************************** CONVERTS THE ASCII CHARACTERS 0-9 & A-F ; TO THEIR EQUIVALENT HEX VALUE. IF THE CHARACTER IS NOT IN ; RANGE, THE CARRY BIT *********************************************** PCHK: CALL ECHO P2C: CP ' ' ;IF CHAR = ' ' THEN RETURN RET Z CP ',' ;IF L MEMSIZ ;GET THE MONITOR STACK LOCATION EX DE,HL LD HL,10 ;GO UP 10 BYTES IN STACK ADD HL,SP LD B,4 EX DE,HL RS1: P DE ;BP LOCATION LD A,RS9 / 256 CP D ;SEE IF A RET BP JR Z,RS6 INC HL INC HL LD (HL),E ;RESTORE USER PC INC HL LD I,A POP IX POP IY POP AF POP BC POP DE POP HL EX AF,AF' EXX POP DE POP BC POP AF POP HL LD SP,HL ENT. ; ENTRY- A= NUMBER (LO NIBBLE) ; EXIT - A= C= ASCII NUMBER ; ;*********************************************************HEN ; LOADS BC, DE & HL WITH THE PARAMS. ; ;*************************************************************** EXPR3: INC B ;*********************** ; ; HILOX ROUTINE INCREMENTS HL, COMPARES IT TO DE & IF ; EQUAL, RETURNS CONTROL TO THE MONITOR EXECIS SET TO FLAG THE ERR. ; ;*************************************************************** NIBBLE: SUB '0' RET C CP 'G' -CHAR = ',' THEN RETURN RET Z CP CR ;IF CHAR = CR THEN RETURN CF SCF RET Z CCF ;ELSE RETURN NC RET ;*********DEC HL LD (HL),D ;SAVE IN WORK AREA DEC HL LD (HL),E POP DE DJNZ RS1 POP BC ;GET BREAKPOINT LOCATION + 1 DEC BC  LD (HL),D EX DE,HL ;OUTPUT BP LOCATION CALL LADR RS6: LD HL,TLOCX ADD HL,SP LD BC,NBKPTS * 256 RS7: LD E,(HL) ;RE DB 0 ;PLACE FOR EI LD HL,0 JP 0 ; ENDX: EQU $ ;------------------------------------------------------------------****** CONV: AND 0FH ADD A,90H ;PUT INTO ASCII ZONE DAA ;AH, THE UBIQUITOUS DAA CONVERT ADC A,40H DAA LD C,A RETB HAS 2 ALREADY CALL EXPR POP BC POP DE JP CRLFA ;GO DO CRLF ;****************************************************. OTHERWISE, ; CONTROL RETURNS TO THE CALLING ROUTINE. ; ;********************************************************** HILOD: '0' CCF RET C CP '9' - '0' + 1 CCF RET NC SUB 'A' - '9' - 1 CP 10 RET ;****************************************************************************************************** ; ; REST ROUTINE TRAPS ALL OF THE REGISTER CONTENTS WHENEV ;BACK UP TO RESTART INSTRUCTION LD SP,HL ;SET THE MONITOR STACK LD HL,TLOCX ;RESTORE BP ADD HL,SP PUSH DE LD D,NBKPTSTORE BP'D LOCATIONS LD (HL),C ;RESET SYSTEM SAVE AREA INC HL LD D,(HL) LD (HL),C INC HL LD A,E ;IF LOC = 0 THEN S---------- ; ; 3 TYPES OF ERRORS ARE DETECTED: A RESTART ERROR; AN I/O ASSIGNMENT ; ERROR; & CERTAIN PROGRAM ERRORS (DETERMIN ;*************************************************************** ; ; ECHO ROUTINE READS A BYTE FROM CONSOLE DEVICE & ECH************************ ; ; HILO ROUTINE INCREMENTS HL. IT THEN CHECKS FOR (& DISALLOWS) A ; WRAP-AROUND SITUATION. IF IT OC POP DE ;GET RID OF RETURN ADDR RET ;RETURN TO MONITOR HILOXB: INC BC HILOX: CALL HILO JR C,HILOD ;DONE IF CF CA***************************************** ; ; PCHK ROUTINE READS A CHARACTER FROM THE CONSOLE, THEN CHECKS IT FOR A ; DELIMITER A RESTART 1 ; INSTRUCTION IS EXECUTED. THE TRAPPED CONTENTS ARE STORED IN THE SYSTEM ; STACK AREA FOR LATER ACCESS AND USE S RS2: LD A,(HL) SUB C ;SEE IF SOFTWARE TRAP INC HL LD A,(HL) SBC A,B ;MAYBE, TRY REST OF ADDR JR Z,RS5 ;FOUND 1, KIP RESTORE OR D JR Z,RS8 LD A,(HL) ;ELSE RESTORE ORIGINAL INSTR. LD (DE),A RS8: INC HL ;DO NEXT BP DJNZ RS7 EX AED BY PARTICULAR ROUTINE WHERE THE ; ERROR CONDITION WAS ENCOUNTERED) EACH CAUSES A UNIQUE MESSAGE TO BE ; PRINTED, THEN DOES OS ; THE CHAR BACK TO THE CONSOLE DEVICE. ; ;*************************************************************** DECHO: CALL DACURS, THE CARRY BIT WILL BE SET ON RETURN. ; IF NO WRAP-AROUND OCCURRED, HL IS COMPARED TO DE & THE FLAGS SET ACCORDINGLY. ; LL CONST ;IF NO CONSOLE BREAK THEN OR A ; RETURN RET Z CALL CONI ;IF CHAR <> CTRL-S THEN BREAK CP CTRLS JR NZ,HILOER. IF IT IS NOT A DELIMITER, A NON-ZERO CONDITION IS RETURNED. IF ; IT IS A DELIMITER, A ZERO CONDITION IS RETURNED. FURTHER, BY THE GOTO & THE EXAMINE REGISTERS ; COMMANDS. ; ; INSERT INTERRUPT DISABLER SOFTWARE AT START OF REST. ; ;***************RESET IT RS3: INC HL ;NOT FOUND, TRY NEXT 1 INC HL DEC D JR NZ,RS2 RS4: INC BC ;NONE FOUND RS5: LD HL,LLOCX POP DE F,AF' ;NOW SAVE THE Z80 UNIQUES EXX PUSH HL PUSH DE PUSH BC PUSH AF PUSH IX PUSH IY LD A,I LD B,A LD A,R A WARM INIT OF THE MONITOR. THE I/O ERROR CAUSES THE ; I/O ASSIGNMENTS TO BE RESET TO THE DEFAULT ASSIGNMENT. ; ;------------SH ;OUTPUT A '-' ECHO: CALL CONI ECH1: PUSH BC LD C,A ;OUTPUT CHAR CALL CONOUT LD A,C ;RESTORE CHAR IN A POP BC R;**************************************************************************** HILO: INC HL LD A,H ;IF HL = 0 THEN RETURN CF D JP CONI ;ELSE WAIT FOR NEXT CHAR ;*************************************************************** ; ; NIBBLE ROUTINEIF THE DELIMITER ; IS A CR, THE CARRY FLAG IS SET. A BLANK OR A COMMA RESETS THE CARRY FLAG. ; ;****************************************************************************************** REST: PUSH HL ;SAVE ALL REGS PUSH DE PUSH BC PUSH AF CAL ADD HL,SP LD (HL),E ;STORE USER (HL) INC HL LD (HL),D PUSH BC LD C,'*' ;OUTPUT BREAK INDICATION CALL CONOUT POLD C,A PUSH BC JP WINITA ;RETURN TO MONITOR RS9: PUSH HL RST 8 ;FORCE BP EXIT: POP BC LD A,C LD R,A LD A,B ---------------------------------------------------------------- IOER: LD A,IOBYTV ;SET IOBYTE TO DEFAULT LD (IOBYTE),A LD 0 %+ &, !'- "(. #)/ $*0HL,IOMSG JR COMERR ;------------------------------------------- ; ; UNINITIALIZED RESTART ERROR HANDLER ; ;------------UE1: PUSH AF CALL BLK LD C,(HL) ;GET CURRENT LOGICAL DEVICE CODE CALL CONOUT CALL DASH POP AF PUSH AF PUSH HL QU 7 SET IN THE LAST CHAR OF THE STRING. ; THE STRING WILL START A NEW LNE (PRTWD) OR CONTINUE ON THE SAME LINE (PRTWA). ; ;***E DEVICE TO ; START A NEW LINE. ; ;*************************************************************** CRLF: PUSH HL CRLFA: LD*************** DASH1: CALL HEX1 ;OUTPUT A AS HEX DASH: LD C,'-' JR CO ;*********************** ; ; PRINT ADDR SUBR IT 6..7)= 0: TTY, 40H: CRT, 80H: LPT, C0H: USR1 ; C= CHAR ; ;***************************************************************, 80H: USR1, C0H: USR2 ; LD A,(IOBYTE) AND 0CH JP Z,TTST ;SYSTEM CONSOLE CP 8 JP M,PTRST ;PAPER TAPE RDR JP Z,RUS ;******************************************************************** RI: LD A,(IOBYTE) AND 0CH JP Z,TTYRDR ;SYSTEM CONSO------------------------------- RSTER: LD HL,RSTMSG ;--------------------------------- ; ; COMMON ERROR HANDLER ; ENTRY- E2: INC HL INC A AND 3 ;BITS 0 & 1 ARE 0 WHEN ON CURRENT ASSGN JR NZ,QUE2 LD C,(HL) ;FOUND IT, NOW OUTPUT IT CALL CON************************************************************************* PRTWD: CALL CRLF PRTWA: PUSH BC PRTA: LD C,(HL) R HL,CRMSG CALL PRTWA POP HL RET ;*************************************************************** ; ; LADR ROUTINE O ; ;*********************** LADRB: CALL LADRA BLK: LD C,' ' ;OUTPUT A SPACE ; FALLS INTO CO SUBR SUBTTL IOBYTE HANDLERS********** LO: LD A,(IOBYTE) AND 0C0H JP Z,TTYOUT ;SYSTEM CONSOLE CP 80H JP M,CRTOUT ;CRT JP Z,LPRT ;LINE PRINTER T1 ;USER 1 JP RUST2 ;USER 2 ;******************************************************************** ; ; CONSOLE INPUT LE CP 8 JP M,PTRIN ;PAPER APE RDR JP Z,RUSI1 ;USER 1 JP RUSI2 ;USER 2 ;*****************************************HL= MESSAGE PTR ; ;--------------------------------- COMERR: CALL PRTWD JP WSVEC ;**************************************OUT POP HL POP AF RRA RRA ADD HL,DE ;NEXT ENTRY DJNZ QUE1 RET ;*********************************************ES 7,C ;MAKE SURE BIT 7 = 0 CALL CO LD A,(HL) ;IF BIT 7 = 1 THEN STOP INC HL RLCA JR NC,PRTA PRTB: POP BC RET UTPUTS THE CONTENTS OF HL ON THE CONSOLE ; EITHER AT THE START OF A NEW LINE (LADRA) OR AT THE CURRENT ; CURSOR LOCATION (LA ;******************************************************************** ; ; CONSOLE OUTPUT ; ENTRY- (IOBYTE BIT 0..1): 0: TTYJP LUSE1 ;USER 1 ;************************************************************************* ; ; CONSOLE STATUS INPUT ; ; ENTRY- (IOBYTE BIT 0..1)= 0: TTY, 1: CRT, 2: BATCH, 3: USR1 ; EXIT - A= CHAR (CTRL-Z: EOF) ; ;************************************************************* ; ; LIST DEVICE STATUS INPUT ; ENTRY- (IOBYTE BIT 6..7)= 0:TTY, 40H: CRT, 80H: LPT, C0H: USR************************************** ; ; QUERY ROUTINE WILL TELL THE OPERATOR WHAT HIS CURRENT LOGICAL-PHYSICAL ; PERIPHERA*********************** ; ; CONI ROUTINE READS THE CONSOLE & STRIPS OFF THE PARITY BIT. ; ;********************************* ;*************************************************************** ; ; EXLF ROUTINE READS 2 PARAMETERS, PUTS THEM INTO THE DE DR). ; ;*************************************************************** LADRA: CALL CRLF LADR: LD A,H CALL HEX1 LD A,L , 1: CRT, 2: BAT, 3: USR1 ; C= CHAR ; ;******************************************************************** CO: LD A,(IOBYTENTRY- (IOBYTE BIT 0..1)= 0: TTY, 1: CRT, 2: BATCH, 3: USER 1 ; EXIT - A= 0: NOT READY, FFH: CHAR READY ; ;********************************************************* CI: LD A,(IOBYTE) AND 3 JP Z,TTYIN ;SYSTEM CONSOLE CP 2 JP M,CRTIN ;CRT JP 1 ; EXIT - A= 0: BUSY, FFH: READY ; ;************************************************************************* LSTAT: LD A,(L DEVICE ASSIGNMENTS ARE. NO PARAMETERS (OTHER THAN A CR) ARE ; REQUIRED ON ENTRY. ; ;************************************************************************** CONI: CALL CI AND 7FH RTS: RET ;*************************************************** ; & HL REGS, THEN DOES A CR-LF. ; ;*************************************************************** EXLF: CALL EXPR POP DEHEX1: PUSH AF RRCA RRCA RRCA RRCA CALL HEX2 POP AF HEX2: CALL CONV JR CO ;**********************************E) AND 3 JP Z,TTYOUT ;SYSTEM CONSOLE CP 2 JP M,CRTOUT ;CRT JP NZ,CUSO1 ;USER 1 ; *** BATCH FALLS INTO LIST OUTPU******************************************************* CSTS: LD A,(IOBYTE) AND 3 JP Z,TTST ;SYSTEM CONSOLE CP 2 JP M,NZ,CUSI1 ;USER 1 ; BATCH INPUT FALLS INTO READER VECTOR ;*****************************************************************IOBYTE) AND 0C0H JP Z,TTOST ;SYSTEM CONSOLE CP 80H JP M,CRTOST ;CRT JP Z,LPRST ;LINE PRINTER JP LUST1 ;USER 1 ************************************* QUERY: LD A,(IOBYTE) LD B,4 LD HL,ACT ;ADDR OF CONVERSION TABLE LD DE,ALT - APT Q************************* ; ; PRTWD ROUTINE OUTPUTS AN ASCII STRING ONTO THE CONSOLE. ; THE STRING MUST BE TERMINATED BY BIT POP HL ;*************************************************************** ; ; CRLF ROUTINE OUTPUTS A CR-LF ON THE CONSOL************************ ; ; DASH ROUTINE OUTPUTS A '-' TO THE CONSOLE DEVICE ; ;*******************************************T *** ;************************************************************************* ; ; LIST DEVICE OUTPUT ; ENTRY- (IOBYTE BCRTST ;CRT JP NZ,CUST1 ;USER 1 ; ; BATCH MODE STATUS INPUT FALLS THROUGH HERE ; ENTRY- (IOBYTE BIT 6..7)= 0: TTY, 40H: PTR*** ; ; READER INPUT ; ENTRY- (IOBYTE BIT 2..3)= 0: TTY, 4: PTR, 8: USR1, CH: USR2 ; EXIT - A= CHAR AND 7FH (CTRL-Z: EOF) ; ;************************************************************************* ; ; PUNCH DEVICE OUTPUT ; ENTRY- (IOBYTE BIT 4..0 %+ &, !'- "(. #)/ $*05)= 0: TTY, 10H: HSP, 20H: USR1, 30H: USR2 ; C= CHAR ; ;********************************************************************RN -1 RET TTOST: IN A,NTS ;IF BUSY THEN RETURN 0 CPL AND 1 SHL NTBSY JR TTOST1 ;***************************** BUSY THEN WAIT JR Z,LPRT LD A,[1 SHL CENTDST] ;INSURE STROBE STARTS HIGH OUT (CENTOUT),A LD A,C ;OUTPUT CHAR SET C**************************** ; ; ALTERNATE READER DEVICE (PTR) ; ;************************************** PTRIN: EQU IOER P************************* ; ; ALTERNATE PUNCH DEVICE (UP1) ; ;************************************** PUSO1: EQU IOER ;**UTIVE USES IT TO LOOK UP THE DESIRED ADDR. ; ;***************************************************** TBL: DW ASGN ;A DW BOODB '2' ; USER DEVICE #2 DB '1' ; USER DEVICE #1 DB 'P' ; PUNCH TO HIGH SPEED PUNCH DB 'T' ; PUNCH TO SYSTEM CONSOLC + 80H DB 'S',SLOC + 80H DB 'I',ILOC ; ; PRIME Z80 REGISTER OFFSETS ; PRMTB: DB 80H + 'A',APLOC DB 'B',BPLOC DB 'C'***** PUNO: LD A,(IOBYTE) AND 30H JP Z,TTPNCH ;SYSTEM CONSOLE CP 20H JP M,HSP ;HIGH SPEED PUNCH JP Z,PUSO1 ;USER 1 ********* ; ; ALTERNATE CONSOLE DEVICE (CRT) ; ;************************************** CRTIN: CALL CRTST ;IF NOT READY ENTDST,A OUT (CENTOUT),A RES CENTDST,A ;OUTPUT LOW TRUE STROBE OUT (CENTOUT),A SET CENTDST,A ;RESTORE STROBE OUT (CENTRST: EQU IOER ;************************************** ; ; ALTERNATE READER DEVICE (UR1) ; ;***************************************************************** ; ; ALTERNATE PUNCH DEVICE (UP2) ; ;************************************** PUSO2: EQU TC ;B DW QPRT ;C DW DISP ;D DW QPRT ;E DW FILL ;F DW GOTO ;G DW QPRT ;H DW INPT ;I DW QPRT ;J DW QPRTE ; ART: DB 'R' ;LOGICAL READER DEVICE TABLE DB '2' ; USER DEVICE #2 DB '1' ; USER DEVICE #1 DB 'P' ; READER TO H,CPLOC DB 'D',DPLOC DB 'E',EPLOC DB 'F',FPLOC DB 'H',HPLOC DB 'L',LPLOC DB 'M' + 80H,HPLOC + 0C0H DB 'X',XLOC + 80 JP PUSO2 ;USER 2 SUBTTL PRIMITIVE I/O DRIVERS ;************************************** ; ; PRIMARY CONSOLE DEVICE (TTY)THEN WAIT JR Z,CRTIN IN A,BZUDAT ;INPUT CHAR RET CRTOUT: CALL CRTOST ;IF NOT READY THEN WAIT JR Z,CRTOUT LD A,CTOUT),A RET LPRST: IN A,(CENTS) ;IF BUSY THEN RETURN 0 CPL ;REVERSE SENSE AND A,[1 SHL CENTBSY] RET Z LD A,-1********* RUSI1: EQU IOER RUST1: EQU IOER ;************************************** ; ; ALTERNATE READER DEVICE (UR2) ; ;IOER ;************************************** ; ; ALTERNATE LIST DEVICE (UL1) ; ;************************************** ;K DW QPRT ;L DW MOVE ;M DW QPRT ;N DW OUPT ;O DW QPRT ;P DW QUERY ;Q DW QPRT ;R DW SUBS ;S DW MTESTIGH SPEED READER DB 'T' ; READER TO SYSTEM CONSOLE ; ACT: DB 'C' ;LOGICAL CONSOLE DEVICE TABLE DB '1' ; USER DEVICE #H DB 'Y',YLOC + 80H DB 'R',RLOC DB -1 END  ; ;************************************** TTYIN: CALL TTST ;IF CHAR NOT READY THEN WAIT JR Z,TTYIN IN A,NTD ;ELSE RE ;OUTPUT CHAR OUT BZUDAT,A RET CRTST: IN A,BZUST ;IF RXRDY NOT TRUE THEN RETURN 0 AND BZURXR CRTST1: RET Z LD A, ;ELSE RETURN -1 RET ; ADDITIONAL I/O DEVICES ;************************************** ; ; ALTERNATE CONSOLE DEVICE (U************************************** RUSI2: EQU IOER RUST2: EQU IOER ;************************************** ; ; PRIM LUSE1: EQU IOER LUST1: EQU IOER SUBTTL MESSAGES CRMSG: DM CR,LF RSTMSG: DM 'RST ERR' BOOTEM: DM 'BOOT LOAD ERR',CR,LF  ;T DW QPRT ;U DW COMP ;V DW QPRT ;W DW XMNE ;X DW QPRT ;Y DW BYE ;Z ;----------------------- ; ; IOBYTE1 DB 'B' ; CONSOLE TO BATCH (LPT OR PTR) DB 'C' ; CONSOLE TO CRT DB 'T' ; CONSOLE TO SYSTEM CONSOLE ;------------TURN CHAR RET TTYOUT: CALL TTOST ;IF NOT READY TO ACCEPT CHAR THEN WAIT JR Z,TTYOUT LD A,C ;OUTPUT CHAR & RETURN -1 ;ELSE RETURN -1 RET CRTOST: IN A,BZUST ;IF TXRDY NOT TRUE THEN RETURN 0 AND BZUTXR JR CRTST1 ;*************C1) ; ;************************************** CUSI1: EQU IOER CUSO1: EQU IOER CUST1: EQU IOER ;***********************ARY PUNCH DEVICE (TTY) ; ;************************************** TTPNCH: EQU IOER ;**************************************  USRMSG: DM 'MEMORY = ' IOMSG: DM 'I/O ERR' QMSG: DM '????' LOGMSG: DM 'ZMON VERS ',HIGH VERSN,'.',LOW VERSN,CR,LF SUBTTL TABLE ; ;----------------------- ALT: DB 'L' ;LOGICAL LIST DEVICE TABLE DB '2' ; USER DEVICE #2 DB '1' ; USER DEVIC--------------------- ; ; Z80 REGISTER OFFSET TABLE ; ;--------------------------------- ACTBL: DB 80H + 'A',ALOC DB 'B',OUT NTD,A RET TTST: IN A,NTS ;IF NOT CHAR NOT READY THEN RETURN 0 AND 1 SHL NTRDY TTOST1: RET Z LD A,-1 ;ELSE RETU************************* ; ; ALTERNATE LIST DEVICE (LPT) ; ;************************************** LPRT: CALL LPRST ;IF*************** ; ; PRIMARY READER DEVICE (TTY) ; ;************************************** TTYRDR: EQU IOER ;********** ; ; ALTERNATE PUNCH DEVICE (PTP) ; ;************************************** HSP: EQU IOER HSPST: EQU IOER ;************* CONSTANTS ;***************************************************** ; ; TBL CONTAINS THE ADDRESSES OF THE COMMANDS. ; THE EXECE #1 DB 'L' ; LIST TO HIGH SPEED PRINTER DB 'T' ; LIST TO SYSTEM CONSOLE ; APT: DB 'P' ;LOGICAL PUNCH DEVICE TABLE BLOC DB 'C',CLOC DB 'D',DLOC DB 'E',ELOC DB 'F',FLOC DB 'H',HLOC DB 'L',LLOC DB 80H + 'M',HLOC + 0C0H DB 'P',PLO0 %+ &, !'- "(. #)/ $*0 TITLE Z-80 MONITOR LIST NOCOND ;*************************************************************************** ; ; SYSTEM MON, in case logic ; too slow. ; 1.3 - 17 MAR 84 GRH ; Change to allow Boot command parameter passing to boot ROM. ; ; 1.4EF *INCLUDE JDDCONT.DEF *INCLUDE IOBOARD.DEF LIST ON ;============================ ; ; ASSEMBLE TIME VARIABLES ; ;===H DLOC EQU 11H ELOC EQU 10H FLOC EQU 14H HLOC EQU 31H LLOC EQU 30H PLOC EQU 34H SLOC EQU 17H TLOC EQU 35H TLOCX EQU 25HSER I/O ENTRY POINTS JP RTS ;SPECIAL I/O CONTROL JP REST ;BREAKPOINT ENTRY LPSTAT: JP LSTAT ;LINE PRINTER STATUS RETURN D HL,0C300H LD DE,RSTER LD B,16 ;64 BYTES INIT1: PUSH DE PUSH HL DJNZ INIT1 ; LD SP,80H ;SET UP TEMPORARY STACK LL CRLF POP HL ;MEMTOP ; ; CONTINUATION OF THE SCS MONITOR ; LD SP,HL ;MOVE EXIT RTN TO RAM LD DE,EXIT EX HERE ; LD HL,LOGMSG ;OUTPUT SIGN-ON CALL PRTWD ; ; SPECIAL DISK BOOT CODE SWAPS ROMS FOR BOOT ; IF BOOT SUCCESSFUITOR FOR Z80 ; (c) 1982,1983 GRH ELECTRONICS, CUPERTINO, CA ; ;************************************************************* - 2 JUN 84 GRH ; Fix bug in line printer status subroutine which hung the ; line printer by sensing the status incorrectl========================= ROM EQU 0F800H ;ROM START ADDR WSVEC EQU 0 ;VECTOR NUMBER FOR WARM RESTART NBKPTS EQU 2 ;NUMBER  LLOCX EQU 20H ; APLOC EQU 9 BPLOC EQU 11 CPLOC EQU 10 DPLOC EQU 13 EPLOC EQU 12 FPLOC EQU 8 HPLOC EQU 15 LPLOC EQU 14 DS 6 ;SAVE 2 SPARES ;------------------------------------------------ ; ; THE FOLLOWING CODE MUST RESIDE AT THE SAME LD A,DDOUT ;REMOVE DD WINDOW, IF PRESENT OUT DDPORT,A ; ; INITIALIZE IOBYTE ; LD C,IOBYTV ;SET TO INITIAL IOBYTE VALUE DE,HL LD BC,ENDX - EXIT LDIR LD BC,NBKPTS * 3 ;CONTINUE 'JP 0' FOR 3 TIMES PUSH DE POP HL DEC HL LDIR LD HL,-24L, DOES NOT RETURN. ; IF UNSUCCESSFUL, RETURNS CARRY IF ERROR, NO CARRY IF DISK ; NOT INSERTED. ; BOOTCD: LD C,XDBROM ;PASS ************** ; ; This Monitor program resides at the top of memory & allows memory ; modification & testing, program breakpy. ; 1.5 - 29 SEP 85 GRH ; Fix bug in Input command which caused monitor to crash. ; The jump to 'BITS2' expects DE to beOF BREAKPOINTS ;============================ ; ; CONSTANTS ; ;============================ CTRLS EQU 13H ;ASCII DC3  XLOC EQU 7 YLOC EQU 5 RLOC EQU 2 ILOC EQU 3 SUBTTL MAIN PROGRAM ORG ROM ;-------------------------------------- ; ; ; ADDR AS THE BOOT ROM START CODE. ; ;------------------------------------------------ DBOOT: LD A,C ;PERFORM SWAP AND 7  CALL IOSET LD HL,USRMSG ;OUTPUT MEMORY= CALL PRTWD CALL MEMSIZ ;OUTPUT MEMORY SIZE PUSH HL ;SAVE VALUE FOR LATER  ADD HL,SP PUSH HL INC HL ;ADJUST USER STACK LOCATION INC HL LD (SPSV),HL ;SAVE INITIAL STACK VALUE LD D,10 ;INIT IN DEFAULT BOOT ROM ADDR BOOTCC: CALL DBOOT LD HL,BOOTEM CALL C,PRTWD JR WINIT ;GO TO MONITOR EXEC ;***************oints, console, printer, punch & ; reader I/O drivers and transfer to system boot ROM residing in same memory ; area as this R on stack. ; VERSN EQU '15' ; ;************************************************************* FORM FALSE EQU 0 TRUE EQU NCR EQU 0DH LF EQU 0AH BELL EQU 7 ;============================ ; ; VARIABLES ; ;============================ IOBYTE JUMP TARGETS FOR BASIC I/O ; ;-------------------------------------- CBOOT JP INIT ;COLD START CONIN JP CI ;CONSOLE INPUT ;CLEAR ERROR MSG IN CASE ROM NOT THERE & MASK OUT ROMSEL,A RET ;-------------------------------------- ; ; THE COLD INI ; COMPUTE # KS LD A,H ; /1024 SRL A SRL A LD C,0 ;TENS COUNT = 0 MEMLP: SUB 10 ;NUMBER = NUMBER - 10 JR C,MEMREGISTER STORAGE AREA WITH 0 INIT2: PUSH BC DEC D JR NZ,INIT2 ; ; BIG Z 8251 INITIALIZATION ; XOR A ;GET IT'S ATTEN************************************************ ; ; MEMSIZ SUBR CALCULATES THE TOP OF CONTIGUOUS RAM. IT ; SEARCHES FROM THEOM. ; ;************************************************************* ; ; Revision status: ; ; 1.0 - Release ; 1.1 - ; AdOT FALSE LSTINC EQU FALSE ; ; INCLUDE SYSTEM DEFINITION FILES ; ;*INCLUDE NAKEDT.DEF ;*INCLUDE MONBOARD.DEF ;*INCLUDE BEQU 3 ;ADDR OF I/O CONTROL BYTE IOBYTV EQU 80H ;DEFAULT IOBYTE VALUE SELECTS LPT AS LIST DEV. ; SPSV EQU 6 ;STACK PTR SAVE READER JP RI ;READER CONOUT JP CO ;CONSOLE OUTPUT PUNCH JP PUNO ;PUNCH LIST JP LO ;LIST OUTPUT CONST JP CSTS ;CONSOLE TIALIZATION CODE ; ;-------------------------------------- INIT: DI LD HL,0 ;DELAY A WHILE FOR HARDWARE TO CATCH UP RESWT1 INC C ;IF < 10 THEN C = TENS DIGIT JR MEMLP MEM1: ADD '0' + 10 ;CONVERT TO + ASCII # LD B,A LD A,C ;IF TENS = 0 TTION 1ST LD B,5 URTLP: OUT BZUDAT,A EX (SP),HL ;DELAY A WHILE EX (SP),HL DJNZ URTLP LD A,BZUMOD ;OUTPUT MODE BYTE  BOTTOM UP UNTIL A NON-RAM LOCATION IS ; FOUND. IT THEN TAKES OFF FOR MONITOR WORK SPACE NEEDS. ; EXIT - HL= MEMTOP PTR ; ;*d Double D deselect upon reset code. ; Change printer port. ; 1.2 - 20 FEB 83 GRH ; Add delay before turning off boot imageIGZ.DEF ;*INCLUDE JDDCONT.DEF ;*INCLUDE IOBOARD.DEF ; LIST OFF *INCLUDE NAKEDT.DEF *INCLUDE MONBOARD.DEF *INCLUDE BIGZ.D LOCATION ; ; REGISTER STORAGE DISPLACEMENTS FROM NORMAL SYSTEM ; STACK LOCATION. ; ALOC EQU 15H BLOC EQU 13H CLOC EQU 12STATUS JP IOCHK ;PUT IOBYTE INTO A JP IOSET ;(C) HAS NEW IOBYTE JP MEMCK ;MEMORY LIMIT CHECK JP RTS ;IODEF- DEFINE U: DEC HL LD A,L OR H JR NZ,RESWT OUT COLDRES,A ;NOW REMOVE PAGE 0 IMAGE LD SP,3FH ;USE STACK TO INIT RESTARTS LHEN OUTPUT SPACE ADD '0' CP '0' JR NZ,NOT0 LD A,' ' NOT0: LD C,A CALL CO LD C,B CALL CO LD C,'K' CALL CO CAOUT BZUCMD,A LD A,BZUCM ;OUTPUT COMMAND BYTE OUT BZUCMD,A IN A,BZUDAT ;READ ANY GARBAGE CHAR ; ; INSERT I/O INIT CODE************************************************************** MEMSIZ: PUSH BC ;MONITOR START LOCATION LD BC,ROM LD HL,-1 0 %+ &, !'- "(. #)/ $*0 MEMSZ1: INC HL LD A,(HL) CPL LD (HL),A CP (HL) CPL LD (HL),A JR NZ,MEMSZ2 LD A,H ;SEE IF ON MONITOR BORDER C ; ; EXF SUBR. READS 1 PARAMETER. ; ENTRY- A= PARAMETER 1ST CHAR ; EXIT - STACK= PARAMETER ; ;********************************************************* AS3: DJNZ AS2 ;PART OF THE ASSIGN CODE EX3: JR NZ,QPRT ;NON 0 IS ERR EXPR1: DEC B ;IF NO PAROF PHYSICAL ; PERIPHERALS TO THE 4 LOGICAL DEVICE TYPES. IT ALTERS (IOBYTE) ; TO MATCH THE CURRENT ASSIGNMENT. THE 4 LOGICALE ;ELSE NEXT LOGICAL ENTRY DJNZ AS0 QPRT: LD HL,QMSG ;OUTPUT ? MESSAGE CALL PRTWA ;---------------------------- ; ; LS A BLOCK OF MEMORY WITH A USER ; DEFINED CONSTANT. IT EXPECTS 3 PARAMETERS TO BE ENTERED IN ; THE FOLLOWING ORDER: ; STARL LD B,D LD H,3 DEC B JR Z,AS5 ;NO SHIFT NEEDED AS4: ADD HL,HL ;SHIFT MASKS ADD HL,HL DJNZ AS4 AS5: LD A,(IOBYSTEM LOCKS UP & WILL NOT RESPOND TO ; ANYTHING OTHER THAN 2 ASCII BELL CHARACTERS. WHEN IT SEES ; THEN CONSECUTIVELY, CONTROP B JR NZ,MEMSZ1 MEMSZ2: DEC HL ;TAKE OFF WORKSPACE LD BC,EXIT-ENDX-3*NBKPTS+1 ;EXIT RTN + BP JUMPS ADD HL,BC POP BC ********** EXF: LD B,1 ;SET 1 PARAM LD HL,0 JR EX1 ;1ST CHAR IN A ALREADY ;*******************************************AMS THEN RETURN RET Z EXPR: LD HL,0 ;PARAM = 0 EX0: CALL ECHO ;GET NEXT # EX1: LD C,A ;SAVE CHAR FOR LATER CALL NIBBLE DEVICES ARE ; CONSOLE, READER, LIST & PUNCH. IN ALL CASES, THE TTY DEVICE ; (SYSTEM CONSOLE) IS SET UP AS THE DEFAULT DEVICTHE WARM START CODE ; ;---------------------------- WINIT: LD SP,(SPSV) ;RESTORE THE STACK WINITA: LD HL,WINIT ;RESET RETURNT ADDR, FINISH ADDR, FILL VALUE ; ; F ; ;---------------------------------------------TE) OR H XOR H ;LOGICAL BITS NOW OFF OR L ;PUT IN NEW VALUE LD C,A ;************************************** ; ; SEL IS RETURNED TO THE MONITOR ; WITHOUT ALTERING ANYTHING. ; ; Z ; ;--------------------------------------------------;UNPREDICTABLE DURING INIT RET ;********************************************************** ; ; MEMCHK SUBR FINDS THE CURR************************* ; ; EXPR SUBR. READS PARAMETERS FROM THE CONSOLE & ; DEVELOPS A 16 BIT HEX FOR EACH ONE. A CARRIAG JR C,EX2 ;IF NOT NUMBER THEN EXIT ADD HL,HL ;PARAM = PARAM * 16 ADD HL,HL ADD HL,HL ADD HL,HL OR L ;ADD IN NEW DE. ; ; Ax ;x= C,R,P,L (CONSOLE,READER,PUNCH,LIST) ; Ax-y ;y= C: T,C,B,1 (TTY,CRT,BAT,UC1) ; R: T,P,1,2 (TTY,PTR, & WARM START VECT PUSH HL LD (WSVEC + 1),HL LD A,0C3H LD (WSVEC),A CALL CRLF CALL DECHO ;GET COMMAND SUB 'A' ;I------------------ FILL: CALL EXPR3 ;GET 3 PARAMS FIO: LD (HL),C ;PUT DOWN THE FILL VALUE CALL HILO ;INC & CHECK THE PTR T IOBYTE SUBR ; ENTRY- C= NEW IOBYTE VALUE ; ;************************************** IOSET: LD A,C LD (IOBYTE),A ;SAVE NEW------------- BYE: LD B,2 ;SET UP FOR 2 CHARS BYE1: CALL CONI CP BELL ;IF NOT BELL THEN RESTART JR NZ,BYE CALL ECH1 ;ENT TOP OF CONTIGUOUS ; MEMORY (LESS THE MONITOR WORKSPACE) & RETURNS THE VALUE. ; EXIT - B= HIGH BYTE OF RAM ; A= LOW BYTEE RETURN WILL ; TERMINATE THE ENTRY SEQUENCE. A BLANK OR COMMA WILL END THE ; CURRENT PARAMETER ENTRY. EACH PARAMETER ONLY TIGIT LD L,A JR EX0 ;GET NEXT ; EX2: EX (SP),HL ;PUT UNDER RETURN ADDR ON STACK PUSH HL LD A,C ;IF LAST CHAR = DELIMUR1,UR2) ; P: T,P,1,2 (TTY,PTP,UP1,UP2) ; L: T,L,1,2 (TTY,CRT,LPT,UL1) ; ;--------------------------------------F CHAR <> 'A' -> 'F' THEN ERR JR C,QPRT CP 'Z' - 'A' + 1 JR NC,QPRT ADD A,A ;OFFSET = INDEX * 2 LD E,A LD D,0 LD JR NC,FIO POP DE ;RESTORE SP IN CASE STACK JR WINIT ; WAS OVERWRITTEN ;---------------------------- ; ; ASSIGN CON ASSIGNMENTS RET ;******************************************* ; ; RETURN IOBYTE VALUE SUBR ; EXIT - A= CURRENT IOBYTE VAECHO THE BELL DJNZ BYE1 RET ;--------------------------------------------------------------- ; ; VERIFY MEMORY COMMAND  OF RAM ; ;********************************************************** MEMCK: PUSH HL CALL MEMSIZ ;GET THE RAM SIZE LD A,AKES THE LAST ; 4 DIGITS TYPED IN. ANY EXCESS IS DISCARDED. A NON-HEX DIGIT WILL ; TERMINATE THE ENTRY SEQUENCE & CAUSE A WA THEN EXIT CALL P2C JR NC,EX3 DJNZ QPRT ;ELSE IF MORE REQ'D THEN ERR RET ;ELSE RETURN ;---------------------------------------------------- ASGN: CALL ECHO ;GET THE LOGICAL DEVICE DESIRED LD HL,ALT ;START OF CONVERSION TABLE LD DE,APT  B,2 ;PASS IN 2 PARAMS TO HANDLER LD HL,TBL ;ADDRESS = (TABLE + OFFSET) ADD HL,DE LD A,(HL) INC HL LD H,(HL) LD L,TINUED ; ;---------------------------- AS1: LD D,B ;SAVE THE COUNTER RESIDUE LD B,4 CALL DECHO ;GET NEW ASSIGNMENT AS2LUE ; ;******************************************* IOCHK: LD A,(IOBYTE) RET ;----------------------------------------- ; ; THIS ROUTINE COMPARES 2 BLOCKS OF MEMORY AGAINST EACH ; OTHER. IF A DIFFERENCE IN THE RELATIVE ADDRESS CONTENTS IS ; DL ;TAKE OFF WORKSPACE SUB 60 JR NC,MEMCK0 DEC H MEMCK0: LD B,H POP HL RET ;**************************************RM BOOT OF THE MON. ; ENTRY- B= # OF PARAMETERS NEEDED ; EXIT - STACK= PARAMETERS ; ;***************************************------------------------------------ ; ; LOGICAL ASSIGNMENT OF PERIPHERALS COMMAND ; ; THIS COMMAND CONTROLS THE ASSIGNMENT - ALT ; # OF ELEMENTS LD B,4 ; COUNT = # ENTRIES AS0: CP (HL) ;IF CHAR = TABLE[LOGICAL] THEN JR Z,AS1 ; EXIT ADD HL,DA JP (HL) ;--------------------------------------------------------------- ; ; FILL MEMORY COMMAND ; ; THIS ROUTINE FIL: INC HL ;PTR = PTR + 1 CP (HL) ;IF CHAR <> (TABLE) THEN EXIT JR NZ,AS3 LD L,B ;SAVE THE RESIDUE TO FORM ASGNT DEC ---------------------- ; ; SLEEP COMMAND ; ; THE BYE ROUTINE IS USED TO PREVENT UNAUTHORIZED USAGE ; OF THE SYSTEM. THE SYETECTED, THE ADDRESS OF THE 1ST BLOCK IS DISPLAYED, ALONG ; WITH IT'S CONTENTS & THE CONTENTS OF THE OTHER BLOCK'S SAME ; RE0 %+ &, !'- "(. #)/ $*0LATIVE ADDRESS. ; ; V ; ;-----------------------------------------L COLUMNS ALIGNED SO EACH ; COLUMN HAS THE SAME LAST HEX DIGIT IN IT'S ADDR. ; ; D[ ] ; ;----------'.' ;ELSE OUTPUT '.' DIS6: CALL CONOUT CALL HILOX LD A,L ;READY FOR NEW LINE? AND 0FH JR NZ,DIS4 ;NO JR DIS1 ;YES ; G ;START EXECUTION AT START_ADDR (NO BPS) ; G,[,] ;START EXECUTION AT START_ADDR WITH ;RAP ADDR POP HL ;SPTR LD A,D ;INSURE 0 WASN'T SPEC'D OR E JR Z,GO2 LD (HL),E ;SAVE BP ADDR INC HL LD (HL),D IDEVICE. ; ; I ; ;--------------------------------------------------------------- INPT: CALL EXPR1 ;GET INPUTSTART_ADDR> ; ;---------------------------------------------------------- MOVE: CALL EXPR3 MONTS, IF DESIRED & IF THE ADDRESS ; IS IN RAM. THE CONTENTS MAY BE LEFT UNALTERED BY ENTERING A ; SPACE, COMMA OR RETURN. IF ---------------------- COMP: CALL EXPR3 CMPA: LD A,(BC) ;GET SOURCE 2 DATA PUSH BC ;SAVE SOURCE 2 PTR LD B,(HL) ;GET SO----------------------------------------------------- DISP: CALL EXLF ;GET BLOCK LIMITS DIS1: CALL LADRB ;DISPLAY START ADDR ; DIS7: SUB A,E ;SKIP OVER TO START ASCII CALL TRPLSP JR DIS3 ; TRPLSP: AND 0FH ;ISOLATE LOW NIBBLE LD B,A ;PREPAR BREAKPOINT AT BP1 AND OPTIONAL BREAKPOINT AT BP2 ; G,[,] ;START EXECUTION AT PC VALUE WITH BREAKPOINT(S) AT ; NC HL LD A,(DE) ;SAVE BP ADDR INSTRUCTION LD (HL),A INC HL LD A,0CFH ;INSERT THE BP LD (DE),A GO2: LD A,C ;IF CHAR PORT # INTO C CALL CRLF ;PUT DATA ON NEW LINE POP BC IN E,(C) PUSH DE ;FIX BUG. BITS2 POPS DE BEFORE 'RET' JR BITS2V1: LD A,(HL) ;MOVE 1 BYTE LD (BC),A CALL HILOXB JR MOV1 ;------------------------------------------------ ; ; BOOT A RETURN IS ENTERED, THE ROUTINE ; IS TERMINATED. IF A SPACE OR COMMA IS ENTERED, THE ROUTINE ; PROCEEDS TO THE NEXT LOCATIOURCE 1 DATA CP B ;IF S2=S1 THEN EXIT JR Z,CMPB PUSH AF ;SAVE S2 DATA CALL LADRB ;OUTPUT ADDR LD A,B CALL DASH1 ; LD A,L ;SEE IF ON 16 BYTE BOUNDARY CALL TRPLSP ;SKIP OVER TO RIGHT COLUMN PUSH HL DIS2: LD A,(HL) ;GET CONTENTS CALE TO SPACE OVER TO RIGHT ADD A,A ; COLUMN ADD B TRPL2: LD B,A INC B TRPL1: CALL BLK ;DO SPACING DJNZ TRPL1 RET  BP1 & OPTIONAL BP2. ; ;---------------------------------------------------------------------------- GOTO: CALL PCHK ;SEE IF = CR THEN DONE BPING CP CR POP BC JR Z,GO3 DJNZ GO1 ;ELSE IF <2 BPS THEN LOOP GO3: CALL CRLF ;NEW LINE FOR PGM POP ;OUTPUT VALUE ;-------------------------------------- ; ; OUTPUT DATA TO PORT COMMAND ; ; O ; ARG :: 0..FH (PASSED TO BOOT ROM) ; PROM # :: 0.N & PRESENTS THE USER WITH AN ; OPPORTUNITY TO ALTER IT. ; ; S ; ;-------------------------------------------------FORMAT POP AF CALL HEX1 ;OUTPUT S2 CMPB: POP BC CALL HILOXB JR CMPA ;----------------------------------------------L HEX1 CALL HILO ;INC & CHECK PTR JR C,DIS7 ;DONE IF CARRY CALL BLK ;MAKE COLUMNS LD A,L ;READY FOR NEW LINE? AND  ;---------------------------------------------------------------------------- ; ; GOTO COMMAND ; ; GOTO COMMAND TRANSFERS C OD ADDR WANTED JR C,GO3 JR Z,GO0 ;YES, BUT SET BP CALL EXF ;GET NEW GOTO ADDR POP DE LD HL,PLOC ;PUT ADDR IN PC LO HL ;GET RID OF STACK JUNK LD HL,RS9 PUSH HL LD HL,REST LD (9),HL ;SET BP VECTOR ADDR LD HL,24 ;FIND REG SET ROUTINUT> ; ;-------------------------------------- OUPT: CALL EXPR ;GET DATA INTO E, PORT # INTO C POP DE POP BC OUT (C),E .7 (DEFAULT # = 02H) ; ;------------------------------------------------ BOOTC: CALL PCHK ;IF NO FURTHER INPUT THEN USE DEF-------------- SUBS: CALL EXPR1 ;GET ADDR CALL CRLF ;START ON NEW LINE POP HL SUB1: LD A,(HL) ;OUTPUT EXISTING CONTENTS----------------- ; ; DISPLAY MEMORY COMMAND ; ; THIS ROUTINE DISPLAYS A BLOCK OF MEMORY ON THE ; CONSOLE DEVICE. THE USER0FH JR NZ,DIS2 DIS3: POP HL ;RESTORE START OF LINE LD A,L ;SKIP OVER TO RIGHT SPACE AND 0FH CALL TRPL2 DIS4: LD A,(HONTROL TO A SPECIFIED ADDRESS ; IT ALLOWS THE SELECTIVE SETTING OF UP TO 2 BREAKPOINTS AS ; WELL AS ALLOWING ANY CONSOLE INPCATION ADD HL,SP LD (HL),D DEC HL LD (HL),E LD A,C ;IF LAST = CR THEN EXIT CP CR JR Z,GO3 GO0: LD B,NBKPTS LD E ADDR ADD HL,SP POP DE ;ADJUST STACK JP (HL) ;GO DO REG RESTORE ;--------------------------------------------------- RET ;---------------------------------------------------------- ; ; MOVE COMMAND ; ; THIS ROUTINE EXPECTS 3 PARAMETERS,AULT JP C,BOOTCD CALL EXF ;GET USER BOOT # POP BC JP BOOTCC ;------------------------------------------------------- CALL DASH1 CALL PCHK ;GET NEW VALUE RET C ;IF CHAR = CR THEN RETURN JR Z,SUB2 ;IF CHAR = ' ' OR ',' THEN EXIT CP L MUST SPECIFY THE START & FINISH ; ADDRESSES. THE DISPLAY IS ORGANIZED TO DISPLAY UP TO 16 ; BYTES PER DISPLAY LINE, WITH ALL) ;OUTPUT MEMORY IN ASCII AND 7FH ;IF PRINTABLE THEN OUTPUT LD C,A CP ' ' JR C,DIS5 CP 7EH JR C,DIS6 DIS5: LD C,UT TO BREAKPONT THE RUN, AS ; LONG AS INTERRUPT 1 IS ACTIVE. ; ; G ;START EXECUTION AT WHATEVER IS IN PC REG (NO BPS) HL,TLOC ;POINT TO TRAP STORAGE ADD HL,SP GO1: PUSH BC ;# BPS PUSH HL ;STORAGE PTR LD B,2 CALL EXPR1 POP DE ;GET T------------ ; ; INPUT FROM PORT COMMAND ; ; THESE ROUTINES ALLOW BYTE-BY-BYTE INPUT OR OUTPUT FROM ; THE CURRENT CONSOLE  ENTERED IN THE ; FOLLOWING SEQUENCE: ; SOURCE 1ST BYTE ADDR, SOURCE LAST BYTE ADDR & ; DESTINATION 1ST BYTE ADDR. ; ; M<-------- ; ; SUBSTITUTE MEMORY COMMAND ; ; THIS ROUTINE ALLOWS THE USER TO INSPECT ANY MEMORY ; LOCATION & ALTER THE CONTEF ;IF CHAR = LF THEN BACK UP JR Z,SUB3 PUSH HL ;PTR CALL EXF ;CONTINUE HEX INPUT POP DE ;NEW VALUE POP HL ;PTR 0 %+ &, !'- "(. #)/ $*0LD (HL),E ;LOAD VALUE LD A,C ;IF DELIM = CR THEN DONE CP CR RET Z SUB2: INC HL ;PTR = PTR + 2 INC HL SUB3: DEC HL  CALL HILOX JR MTEST1 ; BITS: PUSH DE LD E,A CALL LADRB ;OUTPUT ADDR BITS2: LD B,8 ;BIT COUNT BITS1: LD A,E RLCAL) ;IF AT END OF TABLE THEN RETURN RET Z JP P,XAB ;SORT OUT BIT 7 OF TABLE OR 80H ;SET IT ON TEST VALUE JR XAC ; XACTBL ;ADDR OF REG LOOK-UP TABLE XMNE1: CALL PCHK JR C,XG ;IF CHAR = CR THEN SHOW ALL JR Z,XMNE1 ;IF CHAR = ' ' OR ',' THE EXIT JR NC,PV1 PUSH HL ;BUILD ADDR IN HL LD A,(DE) LD H,A DEC DE LD A,(DE) LD L,A LD A,(HL) ;GET (HL) VALUE *********** ; ; ECHO ROUTINE READS A BYTE FROM CONSOLE DEVICE & ECHOS ; THE CHAR BACK TO THE CONSOLE DEVICE. ; ;**********S FOR (& ; DISALLOWS) A WRAP-AROUND SITUATION. IF IT OCCURS, THE CARRY ; BIT WILL BE SET ON RETURN. IF NO WRAP-AROUND OCCURR HILOX: CALL HILO JR C,HILOD ;DONE IF CF CALL CONST ;IF NO CONSOLE BREAK THEN OR A ; RETURN RET Z CALL CONI ;IF ;PTR = PTR - 1 LD A,L ;IF ON MOD 8 BOUNDARY THEN AND 7 ; OUTPUT ADDR CALL Z,LADRB JR SUB1 ;----------------------- LD E,A LD A,'0' / 2 ;BUILD ASCII 1 OR 0 RLA LD C,A CALL CONOUT DJNZ BITS1 POP DE RET ;----------------------B: AND 7FH ;RESET BIT 7 XAC: DEC (HL) ;TO BE PULLED OUT IN ROM CP (HL) JR NZ,XAA ;NO MATCH, TRY AGAIN CALL BLK CALL N LOOP CP '''' ;IF NOT PRIMES THEN EXIT JR NZ,XA LD HL,PRMTB JR XMNE1 ; XG: LD A,(HL) LD C,A INC A ;IF AT END OF POP HL DJNZ PV2 ;ALLWAYS JUMP PV1: LD A,(DE) ;GET REG CONTENTS PV2: CALL HEX1 ;OUTPUT VALUE DEC DE ;MEM PTR DJNZ PV***************************************************** DECHO: CALL DASH ;OUTPUT A '-' ECHO: CALL CONI ECH1: PUSH BC LD C,A ED, HL ; IS COMPARED TO DE & THE FLAGS SET ACCORDINGLY. ; ;*************************************************************** CHAR <> CTRL-S THEN BREAK CP CTRLS JR NZ,HILOD JP CONI ;ELSE WAIT FOR NEXT CHAR ;***********************************---------------------------------------- ; ; MTEST COMMAND TESTS A SPECIFIED BLOCK OF MEMORY TO SEE ; IF ANY HARD DATA BIT F--------------------------------------------------- ; ; EXAMINE REGISTERS COMMAND INSPECTS THE VALUES OF THE ; REGISTERS STOPRTVAL CALL DASH CALL PCHK ;GET NEW INPUT RET C ;IF CHAR = CR THEN RETURN JR Z,XF ;IF NO CHANGE THEN EXIT PUSH HL  TABLE THEN RETURN RET Z CALL M,CRLF ;NEW LINE IF BIT 7 SET CALL CONOUT CALL DASH CALL PRTVAL CALL BLK INC HL ;N1 RET FORM SUBTTL GENERAL PURPOSE SUBROUTINES ;*************************************************************** ; ; CONV ;OUTPUT CHAR CALL CONOUT LD A,C ;RESTORE CHAR IN A POP BC RET ;**************************************************HILO: INC HL LD A,H ;IF HL = 0 THEN RETURN CF OR L SCF RET Z LD A,E ;ELSE COMPARE HL TO DE SUB L LD A,D SBC A,**************************** ; ; NIBBLE ROUTINE CONVERTS THE ASCII CHARACTERS 0-9 & A-F ; TO THEIR EQUIVALENT HEX VALUE. IF AILURES EXIST. IT IS NOT AN EXHAUSTIVE ; TEST, BUT JUST A QUICK INDICATION OF THE MEMORY'S ; OPERATIVENESS. ; ; T ;DISPLAY ALL REGISTER VALUES ; ;PTR CALL EXF POP HL LD A,L INC DE LD (DE),A EX (SP),HL ;RECOVER TABLE PTR LD A,(HL) ;GET THE ATTRIBUTES EX (SEXT ENTRY JR XG ; PRTVAL: INC HL ;NEXT ENTRY LD A,(HL) ;GET OFFSET & ATTRIBUTES AND 3FH ;ISOLATE OFFSET ADD A,2 ;A ROUTINE CONVERTS THE LOW ORDER NIBBLE OF THE ; ACCUMULATOR TO ITS ASCII EQUIVALENT. IT PUTS THE RESULT INTO ; C FOR LATER O************* ; ; EXPR3 ROUTINE GETS 3 PARAMETERS, DOES A CR-LF & THEN ; LOADS BC, DE & HL WITH THE PARAMS. ; ;***********H RET ;********************************************************** ; ; HILOX ROUTINE INCREMENTS HL, COMPARES IT TO DE & THE CHARACTER IS NOT IN ; RANGE, THE CARRY BIT IS SET TO FLAG THE ERR. ; ;**************************************************DDR> ; ;--------------------------------------------------------------- MTEST: CALL EXLF MTEST1: LD A,(HL) PUSH ;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 ; ;-----P),HL RLCA ;IF 8 BIT REG THEN EXIT JR NC,XE INC DE ;ELSE REG PAIR, DO OTHER 8 BITS LD A,H LD (DE),A XE: POP HL ;TLLOW FOR RET ADDR EX DE,HL LD L,A ;BUILD ADDR OF REG CONTENTS LD H,0 ADD HL,SP EX DE,HL LD A,(HL) ;NOW FIND ATTRIBUTPUT. ; ;*************************************************************** CONV: AND 0FH ADD A,90H ;PUT INTO ASCII ZONE D**************************************************** EXPR3: INC B ;B HAS 2 ALREADY CALL EXPR POP BC POP DE JP CRLFA ;IF ; EQUAL, RETURNS CONTROL TO THE MONITOR EXEC. OTHERWISE, ; CONTROL RETURNS TO THE CALLING ROUTINE. ; ;****************************** NIBBLE: SUB '0' RET C CP 'G' - '0' CCF RET C CP '9' - '0' + 1 CCF RET NC SUB 'A' - '9' - 1 CP 1 AF CPL LD (HL),A XOR (HL) ;RESULT SHOULD BE 0 CALL NZ,BITS ;LOG ERR IF NOT MTEST2: POP AF ;RESTORE BYTE LD (HL),A-------------------------------------------------------------------- XAA: INC HL ;SKIP OVER TO NEXT ENTRY INC HL XA: INC (HABLE PTR XF: LD A,C ;IF LAST = CR THEN RETURN CP CR RET Z ; ; THIS IS THE ACTUAL COMMAND ENTRY POINT ; XMNE: LD HL,AUTES LD B,1 ;SINGLE REG VALUE RLCA JR NC,PV1 ;IF SINGLE REG THEN EXIT INC B ;ELSE REG PAIR RLCA ;IF NOT (HL) THENAA ;AH, THE UBIQUITOUS DAA CONVERT ADC A,40H DAA LD C,A RET ;****************************************************GO DO CRLF ;*************************************************************** ; ; HILO ROUTINE INCREMENTS HL. IT THEN CHECK***************************************** HILOD: POP DE ;GET RID OF RETURN ADDR RET ;RETURN TO MONITOR HILOXB: INC BC0 RET ;*************************************************************** ; ; PCHK ROUTINE READS A CHARACTER FROM THE CONS0 %+ &, !'- "(. #)/ $*0OLE, THEN ; CHECKS IT FOR A DELIMITER. IF IT IS NOT A DELIMITER, A NON- ; ZERO CONDITION IS RETURNED. IF IT IS A DELIMITER, OR LATER ACCESS ; AND USE BY THE GOTO & THE EXAMINE REGISTERS COMMANDS. ; ; INSERT INTERRUPT DISABLER SOFTWARE AT START OF R ;FOUND 1, RESET IT RS3: INC HL ;NOT FOUND, TRY NEXT 1 INC HL DEC D JR NZ,RS2 RS4: INC BC ;NONE FOUND RS5: LD HL,LLOZ RS7 EX AF,AF' ;NOW SAVE THE Z80 UNIQUES EXX PUSH HL PUSH DE PUSH BC PUSH AF PUSH IX PUSH IY LD A,I LD B,AS A WARM ; INIT OF THE MONITOR. THE I/O ERROR CAUSES THE I/O ASSIGNMENTS ; TO BE RESET TO THE DEFAULT ASSIGNMENT. ; ;-----TS ARE. NO ; PARAMETERS (OTHER THAN A CR) ARE REQUIRED ON ENTRY. ; ;************************************************************* CONI: CALL CI AND 7FH RTS: RET ;*************************************************************** ; ; PRTWD ROUTI*************************************************** EXLF: CALL EXPR POP DE POP HL ;***********************************A ZERO ; CONDITION IS RETURNED. FURTHER, IF THE DELIMITER IS A CR, ; THE CARRY FLAG IS SET. A BLANK OR A COMMA RESETS THE CAEST. ; ;*************************************************************** REST: PUSH HL ;SAVE ALL REGS PUSH DE PUSH BC PCX POP DE ADD HL,SP LD (HL),E ;STORE USER (HL) INC HL LD (HL),D PUSH BC LD C,'*' ;OUTPUT BREAK INDICATION CALL LD A,R LD C,A PUSH BC JP WINITA ;RETURN TO MONITOR RS9: PUSH HL RST 8 ;FORCE BP EXIT: POP BC LD A,C LD R,---------------------------------------------------------- IOER: LD A,IOBYTV ;SET IOBYTE TO DEFAULT LD (IOBYTE),A LD HL,IOM******* QUERY: LD A,(IOBYTE) LD B,4 LD HL,ACT ;ADDR OF CONVERSION TABLE LD DE,ALT - APT QUE1: PUSH AF CALL BLK LD CNE OUTPUTS AN ASCII STRING ONTO THE CONSOLE. ; THE STRING MUST BE TERMINATED BY BIT 7 SET IN THE LAST CHAR ; OF THE STRING. **************************** ; ; CRLF ROUTINE OUTPUTS A CR-LF ON THE CONSOLE DEVICE TO ; START A NEW LINE. ; ;************RRY ; FLAG. ; ;*************************************************************** PCHK: CALL ECHO P2C: CP ' ' ;IF CHAR = ' 'USH AF CALL MEMSIZ ;GET THE MONITOR STACK LOCATION EX DE,HL LD HL,10 ;GO UP 10 BYTES IN STACK ADD HL,SP LD B,4 EX  CONOUT POP DE ;BP LOCATION LD A,RS9 / 256 CP D ;SEE IF A RET BP JR Z,RS6 INC HL INC HL LD (HL),E ;RESTORE USERA LD A,B LD I,A POP IX POP IY POP AF POP BC POP DE POP HL EX AF,AF' EXX POP DE POP BC POP AF POP HL SG JR COMERR ;------------------------------------------- ; ; UNINITIALIZED RESTART ERROR HANDLER ; ;------------------,(HL) ;GET CURRENT LOGICAL DEVICE CODE CALL CONOUT CALL DASH POP AF PUSH AF PUSH HL QUE2: INC HL INC A AND 3 ;BITHE STRING WILL START A NEW LNE (PRTWD) OR ; CONTINUE ON THE SAME LINE (PRTWA). ; ;******************************************************************************************** CRLF: PUSH HL CRLFA: LD HL,CRMSG CALL PRTWA POP HL RET ;******* THEN RETURN RET Z CP ',' ;IF CHAR = ',' THEN RETURN RET Z CP CR ;IF CHAR = CR THEN RETURN CF SCF RET Z CCF ;EDE,HL RS1: DEC HL LD (HL),D ;SAVE IN WORK AREA DEC HL LD (HL),E POP DE DJNZ RS1 POP BC ;GET BREAKPOINT LOCATION + PC INC HL LD (HL),D EX DE,HL ;OUTPUT BP LOCATION CALL LADR RS6: LD HL,TLOCX ADD HL,SP LD BC,NBKPTS * 256 RS7: LD LD SP,HL DB 0 ;PLACE FOR EI LD HL,0 JP 0 ; ENDX: EQU $ ;------------------------------------------------------------------------------- RSTER: LD HL,RSTMSG ;--------------------------------- ; ; COMMON ERROR HANDLER ; ENTRY- HL= METS 0 & 1 ARE 0 WHEN ON CURRENT ASSGN JR NZ,QUE2 LD C,(HL) ;FOUND IT, NOW OUTPUT IT CALL CONOUT POP HL POP AF RRA ********************** PRTWD: CALL CRLF PRTWA: PUSH BC PRTA: LD C,(HL) RES 7,C ;MAKE SURE BIT 7 = 0 CALL CO LD A,(HL) ******************************************************** ; ; LADR ROUTINE OUTPUTS THE CONTENTS OF HL ON THE CONSOLE ; EITHERLSE RETURN NC RET ;*************************************************************** ; ; REST ROUTINE TRAPS ALL OF THE RE 1 DEC BC ;BACK UP TO RESTART INSTRUCTION LD SP,HL ;SET THE MONITOR STACK LD HL,TLOCX ;RESTORE BP ADD HL,SP PUSH DE  E,(HL) ;RESTORE BP'D LOCATIONS LD (HL),C ;RESET SYSTEM SAVE AREA INC HL LD D,(HL) LD (HL),C INC HL LD A,E ;IF LO--------- ; ; 3 TYPES OF ERRORS ARE DETECTED: A RESTART ERROR; AN I/O ; ASSIGNMENT ERROR; & CERTAIN PROGRAM ERRORS (DETERMINSSAGE PTR ; ;--------------------------------- COMERR: CALL PRTWD JP WSVEC ;********************************************RRA ADD HL,DE ;NEXT ENTRY DJNZ QUE1 RET ;******************************************************************** ; ;  ;IF BIT 7 = 1 THEN STOP INC HL RLCA JR NC,PRTA PRTB: POP BC RET ;************************************************ AT THE START OF A NEW LINE (LADRA) OR AT THE CURRENT ; CURSOR LOCATION (LADR). ; ;*****************************************GISTER CONTENTS ; WHENEVER A RESTART 1 INSTRUCTION IS EXECUTED. THE TRAPPED ; CONTENTS ARE STORED IN THE SYSTEM STACK AREA F LD D,NBKPTS RS2: LD A,(HL) SUB C ;SEE IF SOFTWARE TRAP INC HL LD A,(HL) SBC A,B ;MAYBE, TRY REST OF ADDR JR Z,RS5C = 0 THEN SKIP RESTORE OR D JR Z,RS8 LD A,(HL) ;ELSE RESTORE ORIGINAL INSTR. LD (DE),A RS8: INC HL ;DO NEXT BP DJNED BY ; PARTICULAR ROUTINE WHERE THE ERROR CONDITION WAS ENCOUNTERED) ; EACH CAUSES A UNIQUE MESSAGE TO BE PRINTED, THEN DOE******************* ; ; QUERY ROUTINE WILL TELL THE OPERATOR WHAT HIS CURRENT ; LOGICAL-PHYSICAL PERIPHERAL DEVICE ASSIGNMENCONI ROUTINE READS THE CONSOLE & STRIPS OFF THE PARITY BIT. ; ;****************************************************************************** ; ; EXLF ROUTINE READS 2 PARAMETERS, PUTS THEM INTO THE DE ; & HL REGS, THEN DOES A CR-LF. ; ;********************************** LADRA: CALL CRLF LADR: LD A,H CALL HEX1 LD A,L HEX1: PUSH AF RRCA RRCA RRCA RRCA CALL HE0 %+ &, !'- "(. #)/ $*0X2 POP AF HEX2: CALL CONV JR CO ;********************************************************** ; ; DASH ROUTINE OUTPUTSP M,CRTOUT ;CRT JP NZ,CUSO1 ;USER 1 ; *** BATCH FALLS INTO LIST OUTPUT *** ;********************************************* CSTS: LD A,(IOBYTE) AND 3 JP Z,TTST ;SYSTEM CONSOLE CP 2 JP M,CRTST ;CRT JP NZ,CUST1 ;USER 1 ; ; BATCH MODE  VECTOR ;******************************************************************** ; ; READER INPUT ; ENTRY- (IOBYTE BIT 2..3)=CP 80H JP M,CRTOST ;CRT JP Z,LPRST ;LINE PRINTER JP LUST1 ;USER 1 ;************************************************ADY TO ACCEPT CHAR THEN WAIT JR Z,TTYOUT LD A,C ;OUTPUT CHAR & RETURN OUT NTD,A RET TTST: IN A,NTS ;IF NOT CHAR N;IF TXRDY NOT TRUE THEN RETURN 0 AND BZUTXR JR CRTST1 ;************************************** ; ; ALTERNATE LIST DEVISI1: EQU IOER CUSO1: EQU IOER CUST1: EQU IOER ;************************************** ; ; PRIMARY READER DEVICE (TTY)  A '-' TO THE CONSOLE DEVICE ; ;********************************************************** DASH1: CALL HEX1 ;OUTPUT A AS HEX******************************** ; ; LIST DEVICE OUTPUT ; ENTRY- (IOBYTE BIT 6..7)= 0: TTY, 40H: CRT, 80H: LPT, C0H: USR1 ; STATUS INPUT FALLS THROUGH HERE ; ENTRY- (IOBYTE BIT 6..7)= 0: TTY, 40H: PTR, 80H: USR1, C0H: USR2 ; LD A,(IOBYTE) AND 0CH 0: TTY, 4: PTR, 8: USR1, CH: USR2 ; EXIT - A= CHAR AND 7FH (CTRL-Z: EOF) ; ;************************************************************************* ; ; PUNCH DEVICE OUTPUT ; ENTRY- (IOBYTE BIT 4..5)= 0: TTY, 10H: HSP, 20H: USR1, 30H: USR2 ; C= COT READY THEN RETURN 0 AND 1 SHL NTRDY TTOST1: RET Z LD A,-1 ;ELSE RETURN -1 RET TTOST: IN A,NTS ;IF BUSY THEN RETCE (LPT) ; ;************************************** LPRT: CALL LPRST ;IF BUSY THEN WAIT JR Z,LPRT LD A,[1 SHL CENTDST; ;************************************** TTYRDR: EQU IOER ;************************************** ; ; ALTERNATE READER DASH: LD C,'-' JR CO ;*********************** ; ; PRINT ADDR SUBR ; ;*********************** LADRB: CALL LADRA BL C= CHAR ; ;************************************************************************* LO: LD A,(IOBYTE) AND 0C0H JP Z,TTY JP Z,TTST ;SYSTEM CONSOLE CP 8 JP M,PTRST ;PAPER TAPE RDR JP Z,RUST1 ;USER 1 JP RUST2 ;USER 2 ;********************************* RI: LD A,(IOBYTE) AND 0CH JP Z,TTYRDR ;SYSTEM CONSOLE CP 8 JP M,PTRIN ;PAPER APE RDR JP Z,RUSI1HAR ; ;************************************************************************* PUNO: LD A,(IOBYTE) AND 30H JP Z,TTPNCH URN 0 CPL AND 1 SHL NTBSY JR TTOST1 ;************************************** ; ; ALTERNATE CONSOLE DEVICE (CRT) ; ] ;INSURE STROBE STARTS HIGH OUT (CENTOUT),A LD A,C ;OUTPUT CHAR SET CENTDST,A OUT (CENTOUT),A RES CENTDST,A ;OUTPUT  DEVICE (PTR) ; ;************************************** PTRIN: EQU IOER PTRST: EQU IOER ;********************************K: LD C,' ' ;OUTPUT A SPACE ; FALLS INTO CO SUBR SUBTTL IOBYTE HANDLERS ;************************************************OUT ;SYSTEM CONSOLE CP 80H JP M,CRTOUT ;CRT JP Z,LPRT ;LINE PRINTER JP LUSE1 ;USER 1 ;********************************************************************************** ; ; CONSOLE INPUT ; ENTRY- (IOBYTE BIT 0..1)= 0: TTY, 1: CRT, 2: BATC ;USER 1 JP RUSI2 ;USER 2 ;************************************************************************* ; ; LIST DEVICE ;SYSTEM CONSOLE CP 20H JP M,HSP ;HIGH SPEED PUNCH JP Z,PUSO1 ;USER 1 JP PUSO2 ;USER 2 SUBTTL PRIMITIVE I/O DRIVER;************************************** CRTIN: CALL CRTST ;IF NOT READY THEN WAIT JR Z,CRTIN IN A,BZUDAT ;INPUT CHAR LOW TRUE STROBE OUT (CENTOUT),A SET CENTDST,A ;RESTORE STROBE OUT (CENTOUT),A RET LPRST: IN A,(CENTS) ;IF BUSY THE****** ; ; ALTERNATE READER DEVICE (UR1) ; ;************************************** RUSI1: EQU IOER RUST1: EQU IOER ;*********************** ; ; CONSOLE OUTPUT ; ENTRY- (IOBYTE BIT 0..1): 0: TTY, 1: CRT, 2: BAT, 3: USR1 ; C= CHAR ; ;****************************************************** ; ; CONSOLE STATUS INPUT ; ENTRY- (IOBYTE BIT 0..1)= 0: TTY, 1: CRT, 2: BATCH,H, 3: USR1 ; EXIT - A= CHAR (CTRL-Z: EOF) ; ;******************************************************************** CI: LD A,(STATUS INPUT ; ENTRY- (IOBYTE BIT 6..7)= 0:TTY, 40H: CRT, 80H: LPT, C0H: USR1 ; EXIT - A= 0: BUSY, FFH: READY ; ;***********S ;************************************** ; ; PRIMARY CONSOLE DEVICE (TTY) ; ;************************************** TTYINRET CRTOUT: CALL CRTOST ;IF NOT READY THEN WAIT JR Z,CRTOUT LD A,C ;OUTPUT CHAR OUT BZUDAT,A RET CRTST: IN N RETURN 0 CPL ;REVERSE SENSE AND A,[1 SHL CENTBSY] RET Z LD A,-1 ;ELSE RETURN -1 RET ; ADDITIONAL I/O DEVIC*********************************** ; ; ALTERNATE READER DEVICE (UR2) ; ;************************************** RUSI2: EQU ************************************************************ CO: LD A,(IOBYTE) AND 3 JP Z,TTYOUT ;SYSTEM CONSOLE CP 2 J 3: USER 1 ; EXIT - A= 0: NOT READY, FFH: CHAR READY ; ;*********************************************************************IOBYTE) AND 3 JP Z,TTYIN ;SYSTEM CONSOLE CP 2 JP M,CRTIN ;CRT JP NZ,CUSI1 ;USER 1 ; BATCH INPUT FALLS INTO READER************************************************************** LSTAT: LD A,(IOBYTE) AND 0C0H JP Z,TTOST ;SYSTEM CONSOLE : CALL TTST ;IF CHAR NOT READY THEN WAIT JR Z,TTYIN IN A,NTD ;ELSE RETURN CHAR RET TTYOUT: CALL TTOST ;IF NOT REA,BZUST ;IF RXRDY NOT TRUE THEN RETURN 0 AND BZURXR CRTST1: RET Z LD A,-1 ;ELSE RETURN -1 RET CRTOST: IN A,BZUST ES ;************************************** ; ; ALTERNATE CONSOLE DEVICE (UC1) ; ;************************************** CUIOER RUST2: EQU IOER ;************************************** ; ; PRIMARY PUNCH DEVICE (TTY) ; ;***********************0 %+ &, !'- "(. #)/ $*0*************** TTPNCH: EQU IOER ;************************************** ; ; ALTERNATE PUNCH DEVICE (PTP) ; ;*********** DM '????' LOGMSG: DM 'ZMON VERS ',HIGH VERSN,'.',LOW VERSN,CR,LF SUBTTL CONSTANTS ;**************************************LOGICAL LIST DEVICE TABLE DB '2' ; USER DEVICE #2 DB '1' ; USER DEVICE #1 DB 'L' ; LIST TO HIGH SPEED PRINTER DB 'LE ; ;--------------------------------- ACTBL: DB 80H + 'A',ALOC DB 'B',BLOC DB 'C',CLOC DB 'D',DLOC DB 'E',ELOC DBis ROM. ; ;**************************************************************************** ; ; Revision status: ; ; 1.0 - Relt. ; 1.7 - 8 FEB 86 GRH ; Remove time delay from power up reset code to allow ISHA to access ; ram. ; Remove the auto-bo*************************** HSP: EQU IOER HSPST: EQU IOER ;************************************** ; ; ALTERNATE PUNCH DEV*************** ; ; TBL CONTAINS THE ADDRESSES OF THE COMMANDS. ; THE EXECUTIVE USES IT TO LOOK UP THE DESIRED ADDR. ; ;***T' ; LIST TO SYSTEM CONSOLE ; APT: DB 'P' ;LOGICAL PUNCH DEVICE TABLE DB '2' ; USER DEVICE #2 DB '1' ; USER DEVICE  'F',FLOC DB 'H',HLOC DB 'L',LLOC DB 80H + 'M',HLOC + 0C0H DB 'P',PLOC + 80H DB 'S',SLOC + 80H DB 'I',ILOC ; ; PRIease ; 1.1 - ; Add Double D deselect upon reset code. ; Change printer port. ; 1.2 - 20 FEB 83 GRH ; Add delay before turot from reset function. ; VERSN EQU '17' ;**************************************************************************** FORMICE (UP1) ; ;************************************** PUSO1: EQU IOER ;************************************** ; ; ALTERNAT************************************************** TBL: DW ASGN ;A DW BOOTC ;B DW QPRT ;C DW DISP ;D DW QPRT ;E #1 DB 'P' ; PUNCH TO HIGH SPEED PUNCH DB 'T' ; PUNCH TO SYSTEM CONSOLE ; ART: DB 'R' ;LOGICAL READER DEVICE TABLE DME Z80 REGISTER OFFSETS ; PRMTB: DB 80H + 'A',APLOC DB 'B',BPLOC DB 'C',CPLOC DB 'D',DPLOC DB 'E',EPLOC DB 'F',FPLOC TITLE M5b Z-80 MONITOR LIST NOCOND ;*************************************************************************** ; ; SYSTEMning off boot image, in case logic ; too slow. ; 1.3 - 17 MAR 84 GRH ; Change to allow Boot command parameter passing to  FALSE EQU 0 TRUE EQU NOT FALSE LSTINC EQU FALSE ; ; INCLUDE SYSTEM DEFINITION FILES ; ;*INCLUDE NAKEDT.DEF ;*INCLUDE E PUNCH DEVICE (UP2) ; ;************************************** PUSO2: EQU IOER ;************************************** DW FILL ;F DW GOTO ;G DW QPRT ;H DW INPT ;I DW QPRT ;J DW QPRT ;K DW QPRT ;L DW MOVE ;M DW QPRT ;N DWB '2' ; USER DEVICE #2 DB '1' ; USER DEVICE #1 DB 'P' ; READER TO HIGH SPEED READER DB 'T' ; READER TO SYSTEM CONS DB 'H',HPLOC DB 'L',LPLOC DB 'M' + 80H,HPLOC + 0C0H DB 'X',XLOC + 80H DB 'Y',YLOC + 80H DB 'R',RLOC DB -1 END MONITOR FOR M5b ; (c) 1982,1983 GRH ELECTRONICS, CUPERTINO, CA ; ;*********************************************************boot ROM. ; ; 1.4 - 2 JUN 84 GRH ; Fix bug in line printer status subroutine which hung the ; line printer by sensing thMONBOARD.DEF ;*INCLUDE BIGZ.DEF ;*INCLUDE JDDCONT.DEF ;*INCLUDE IOBOARD.DEF ; LIST OFF *INCLUDE NAKEDT.DEF *INCLUDE MONB; ; ALTERNATE LIST DEVICE (UL1) ; ;************************************** LUSE1: EQU IOER LUST1: EQU IOER SUBTTL MESSA OUPT ;O DW QPRT ;P DW QUERY ;Q DW QPRT ;R DW SUBS ;S DW MTEST ;T DW QPRT ;U DW COMP ;V DW QPRT ;W DWOLE ; ACT: DB 'C' ;LOGICAL CONSOLE DEVICE TABLE DB '1' ; USER DEVICE #1 DB 'B' ; CONSOLE TO BATCH (LPT OR PTR) DB ' ****************** ; ; This Monitor program resides at the top of memory & allows memory ; modification & testing, program bre status incorrectly. ; 1.5 - 29 SEP 85 GRH ; Fix bug in Input command which caused monitor to crash. ; The jump to 'BITSOARD.DEF *INCLUDE BIGZ.DEF *INCLUDE JDDCONT.DEF *INCLUDE IOBOARD.DEF LIST ON ;============================ ; ; ASSEMBLGES CRMSG: DM CR,LF RSTMSG: DM 'RST ERR' BOOTEM: DM 'BOOT LOAD ERR',CR,LF USRMSG: DM 'MEMORY = ' IOMSG: DM 'I/O ERR' QMSG: XMNE ;X DW QPRT ;Y DW BYE ;Z ;----------------------- ; ; IOBYTE TABLE ; ;----------------------- ALT: DB 'L' ;C' ; CONSOLE TO CRT DB 'T' ; CONSOLE TO SYSTEM CONSOLE ;--------------------------------- ; ; Z80 REGISTER OFFSET TABeakpoints, console, printer, punch & ; reader I/O drivers and transfer to system boot ROM residing in same memory ; area as th2' expects DE to be on stack. ; 1.6 - 6 DEC 85 GRH ; Add code to disable all Jade controllers from 40H to 43H after ; reseE TIME VARIABLES ; ;============================ ROM EQU 0F800H ;ROM START ADDR WSVEC EQU 0 ;VECTOR NUMBER FOR WARM RESTAR0 %+ &, !'- "(. #)/ $*0T NBKPTS EQU 2 ;NUMBER OF BREAKPOINTS ;============================ ; ; CONSTANTS ; ;============================ CTPLOC EQU 15 LPLOC EQU 14 XLOC EQU 7 YLOC EQU 5 RLOC EQU 2 ILOC EQU 3 SUBTTL MAIN PROGRAM ORG ROM ;--------------------MUST RESIDE AT THE SAME ; ADDR AS THE BOOT ROM START CODE. ; ;------------------------------------------------ DBOOT: LD A,C1H),A OUT (42H),A OUT (43H),A ; ; INITIALIZE IOBYTE ; LD C,IOBYTV ;SET TO INITIAL IOBYTE VALUE CALL IOSET ; ; SP,HL LD DE,EXIT EX DE,HL LD BC,ENDX - EXIT LDIR ; LD BC,NBKPTS * 3 ;CONTINUE 'JP 0' FOR 3 TIMES PUSH DE POP HL JR WINIT ; ; SPECIAL DISK BOOT CODE SWAPS ROMS FOR BOOT ; IF BOOT SUCCESSFUL, DOES NOT RETURN. ; IF UNSUCCESSFUL, RETURNS ,(HL) CPL LD (HL),A CP (HL) CPL LD (HL),A JR NZ,MEMSZ2 ; LD A,H ;SEE IF ON MONITOR BORDER CP B JR NZ,MEMSZ1 ******************* ; ; EXF SUBR. READS 1 PARAMETER. ; ENTRY- A= PARAMETER 1ST CHAR ; EXIT - STACK= PARAMETER ; ;*********RLS EQU 13H ;ASCII DC3 CR EQU 0DH LF EQU 0AH BELL EQU 7 ;============================ ; ; VARIABLES ; ;============------------------ ; ; JUMP TARGETS FOR BASIC I/O ; ;-------------------------------------- CBOOT JP INIT ;COLD START CON ;PERFORM SWAP AND 7 ;CLEAR ERROR MSG IN CASE ROM NOT THERE & MASK OUT ROMSEL,A RET ;--------------------------------IZE AND DISPLAY MEMORY ; LD HL,USRMSG ;OUTPUT MEMORY= CALL PRTWD CALL MEMSIZ ;OUTPUT MEMORY SIZE PUSH HL ;SAVE VALUE DEC HL LDIR ; LD HL,-24 ADD HL,SP PUSH HL INC HL ;ADJUST USER STACK LOCATION INC HL LD (SPSV),HL ;SAVE INITIAL SCARRY IF ERROR, NO CARRY IF DISK NOT INSERTED. ; BOOTCD: LD C,XDBROM ;PASS IN DEFAULT BOOT ROM ADDR BOOTCC: CALL DBOOT LD H MEMSZ2: DEC HL ;TAKE OFF WORKSPACE LD BC,EXIT-ENDX-3*NBKPTS+1 ;EXIT RTN + BP JUMPS ADD HL,BC POP BC ;UNPREDICTABLE DURI***************************** EXF: LD B,1 ;SET 1 PARAM LD HL,0 JR EX1 ;1ST CHAR IN A ALREADY ;************************================ IOBYTE EQU 3 ;ADDR OF I/O CONTROL BYTE IOBYTV EQU 80H ;DEFAULT IOBYTE VALUE SELECTS LPT AS LIST DEV. ; SPIN JP CI ;CONSOLE INPUT READER JP RI ;READER CONOUT JP CO ;CONSOLE OUTPUT PUNCH JP PUNO ;PUNCH LIST JP LO ;LIST OUTPUT ------ ; ; THE COLD INITIALIZATION CODE ; ;-------------------------------------- INIT: ; ; INSURE INTERRUPTS DISABLED FOR LATER ; ; COMPUTE # KS ; LD A,H ; /1024 SRL A SRL A LD C,0 ;TENS COUNT = 0 MEMLP: SUB 10 ;NUMBER = NUMBER - 1TACK VALUE ; ; INITIALIZE REGISTER IMAGES TO 0 ; LD D,10 INIT2: PUSH BC DEC D JR NZ,INIT2 ; ; INITIALIZE BIG Z 8L,BOOTEM CALL C,PRTWD ; JR WINIT ;GO TO MONITOR EXEC ;***************************************************************NG INIT RET ;**************************************************************************** ; ; MEMCHK SUBR FINDS THE CUR**************************************************** ; ; EXPR SUBR. READS PARAMETERS FROM THE CONSOLE & DEVELOPS A 16 BIT HEX SV EQU 6 ;STACK PTR SAVE LOCATION ; ; REGISTER STORAGE DISPLACEMENTS FROM NORMAL SYSTEM ; STACK LOCATION. ; ALOC EQU 15H  CONST JP CSTS ;CONSOLE STATUS JP IOCHK ;PUT IOBYTE INTO A JP IOSET ;(C) HAS NEW IOBYTE JP MEMCK ;MEMORY LIMIT CHECK  ; DI ; ; REMOVE PAGE 0 IMAGE ; OUT COLDRES,A ; ; INITIALIZE RESTART VECTORS IN PAGE 0 ; LD SP,3FH ;USE STACK T0 JR C,MEM1 ; INC C ;IF < 10 THEN C = TENS DIGIT JR MEMLP ; MEM1: ADD '0' + 10 ;CONVERT TO + ASCII # LD B,A LD A,C251 ; XOR A ;GET IT'S ATTENTION 1ST LD B,5 URTLP: OUT (BZUDAT),A EX (SP),HL ;DELAY A WHILE EX (SP),HL DJNZ URTLP ************* ; ; MEMSIZ SUBR CALCULATES THE TOP OF CONTIGUOUS RAM. IT SEARCHES FROM ; THE BOTTOM UP UNTIL A NON-RAM LOCATIONRENT TOP OF CONTIGUOUS MEMORY (LESS THE ; MONITOR WORKSPACE) & RETURNS THE VALUE. ; EXIT - B= HIGH BYTE OF RAM ; A= LOW BYT ; FOR EACH ONE. A CARRIAGE RETURN WILL TERMINATE THE ENTRY SEQUENCE. A BLANK ; OR COMMA WILL END THE CURRENT PARAMETER ENTRY. BLOC EQU 13H CLOC EQU 12H DLOC EQU 11H ELOC EQU 10H FLOC EQU 14H HLOC EQU 31H LLOC EQU 30H PLOC EQU 34H SLOC EQU 17H TL JP RTS ;IODEF- DEFINE USER I/O ENTRY POINTS JP RTS ;SPECIAL I/O CONTROL JP REST ;BREAKPOINT ENTRY LPSTAT: JP LSTAT ;LIO INIT RESTARTS LD HL,0C300H LD DE,RSTER LD B,16 ;64 BYTES INIT1: PUSH DE PUSH HL DJNZ INIT1 ; ; SET TEMPORARY S ;IF TENS = 0 THEN OUTPUT SPACE ADD '0' CP '0' JR NZ,NOT0 LD A,' ' NOT0: LD C,A CALL CO LD C,B CALL CO LD  LD A,BZUMOD ;OUTPUT MODE BYTE OUT (BZUCMD),A LD A,BZUCM ;OUTPUT COMMAND BYTE OUT (BZUCMD),A IN A,(BZUDAT) ;READ ANY GA IS FOUND. IT THEN TAKES OFF FOR ; MONITOR WORK SPACE NEEDS. ; EXIT - HL= MEMTOP PTR ; ;************************************E OF RAM ; ;**************************************************************************** MEMCK: PUSH HL CALL MEMSIZ ;GET TEACH PARAMETER ONLY TAKES ; THE LAST 4 DIGITS TYPED IN. ANY EXCESS IS DISCARDED. A NON-HEX DIGIT WILL ; TERMINATE THE ENTRY SEOC EQU 35H TLOCX EQU 25H LLOCX EQU 20H ; APLOC EQU 9 BPLOC EQU 11 CPLOC EQU 10 DPLOC EQU 13 EPLOC EQU 12 FPLOC EQU 8 HNE PRINTER STATUS RETURN DS 6 ;SAVE 2 SPARES ;------------------------------------------------ ; ; THE FOLLOWING CODE TACK ; LD SP,80H ; ; REMOVE JADE DOUBLE D WINDOW(S) ; LD A,DDOUT ;REMOVE DD WINDOW, IF PRESENT OUT (40H),A OUT (4C,'K' CALL CO CALL CRLF POP HL ;MEMTOP ; ; CONTINUATION OF THE SCS MONITOR, MOVE EXIT ROUTINE TO RAM ; LD SRBAGE CHAR ; ; INSERT I/O INIT CODE HERE ; ; ; OUTPUT SIGN-ON MESSAGE ; LD HL,LOGMSG ;OUTPUT SIGN-ON CALL PRTWD **************************************** MEMSIZ: PUSH BC ;MONITOR START LOCATION LD BC,ROM LD HL,-1 MEMSZ1: INC HL LD AHE RAM SIZE LD A,L ;TAKE OFF WORKSPACE SUB 60 JR NC,MEMCK0 DEC H MEMCK0: LD B,H POP HL RET ;*******************QUENCE & CAUSE A WARM BOOT OF THE MON. ; ENTRY- B= # OF PARAMETERS NEEDED ; EXIT - STACK= PARAMETERS ; ;********************0 %+ &, !'- "(. #)/ $*0******************************************************** AS3: DJNZ AS2 ;PART OF THE ASSIGN CODE EX3: JR NZ,QPRT ;NON 0 IS ER ; THIS COMMAND CONTROLS THE ASSIGNMENT OF PHYSICAL PERIPHERALS TO THE ; 4 LOGICAL DEVICE TYPES. IT ALTERS (IOBYTE) TO MATCH THE[LOGICAL] THEN JR Z,AS1 ; EXIT ADD HL,DE ;ELSE NEXT LOGICAL ENTRY DJNZ AS0 QPRT: LD HL,QMSG ;OUTPUT ? MESSAGE CALL---------- ; ; FILL MEMORY COMMAND ; ; THIS ROUTINE FILLS A BLOCK OF MEMORY WITH A USER DEFINED CONSTANT. IT ; EXPECTS 3 PAEXIT JR NZ,AS3 LD L,B ;SAVE THE RESIDUE TO FORM ASGNT DEC L LD B,D LD H,3 DEC B JR Z,AS5 ;NO SHIFT NEEDED A THE BYE ROUTINE IS USED TO PREVENT UNAUTHORIZED USAGE OF THE SYSTEM. ; THE SYSTEM LOCKS UP & WILL NOT RESPOND TO ANYTHING OTHE BLOCK IS DISPLAYED, ALONG WITH IT'S CONTENTS & THE CONTENTS OF THE ; OTHER BLOCK'S SAME RELATIVE ADDRESS. ; ; V ; ;---------------------------------------------------------------------------- D SO EACH ; COLUMN HAS THE SAME LAST HEX DIGIT IN IT'S ADDR. ; ; D[ ] ; ;---------------------------HAR FOR LATER CALL NIBBLE JR C,EX2 ;IF NOT NUMBER THEN EXIT ADD HL,HL ;PARAM = PARAM * 16 ADD HL,HL ADD HL,HL ADD E) IS SET UP AS THE DEFAULT DEVICE. ; ; Ax ;x= C,R,P,L (CONSOLE,READER,PUNCH,LIST) ; Ax-y ;y= C: T,C,B,1 (TTY,CRT,BAT,UE THE STACK WINITA: LD HL,WINIT ;RESET RETURN & WARM START VECT PUSH HL LD (WSVEC + 1),HL LD A,0C3H LD (WSVEC),A CALLUE> ; ;---------------------------------------------------------------------------- FILL: CALL EXPR3 ;GET 3 PARAMS FIO: LD  VALUE LD C,A ;************************************** ; ; SET IOBYTE SUBR ; ENTRY- C= NEW IOBYTE VALUE ; ;************ING. ; ; Z ; ;---------------------------------------------------------------------------- BYE: LD B,2 ;SET UP FOR 2  COMP: CALL EXPR3 CMPA: LD A,(BC) ;GET SOURCE 2 DATA PUSH BC ;SAVE SOURCE 2 PTR LD B,(HL) ;GET SOURCE 1 DATA CP B ;IF------------------------------------------------- DISP: CALL EXLF ;GET BLOCK LIMITS DIS1: CALL LADRB ;DISPLAY START ADDR LHL,HL OR L ;ADD IN NEW DIGIT LD L,A JR EX0 ;GET NEXT ; EX2: EX (SP),HL ;PUT UNDER RETURN ADDR ON STACK PUSH HL LDC1) ; R: T,P,1,2 (TTY,PTR,UR1,UR2) ; P: T,P,1,2 (TTY,PTP,UP1,UP2) ; L: T,L,1,2 (TTY,CRT,LPT,UL1) ; ;----- CRLF CALL DECHO ;GET COMMAND SUB 'A' ;IF CHAR <> 'A' -> 'F' THEN ERR JR C,QPRT CP 'Z' - 'A' + 1 JR NC,QPRT ADD A,(HL),C ;PUT DOWN THE FILL VALUE CALL HILO ;INC & CHECK THE PTR JR NC,FIO POP DE ;RESTORE SP IN CASE STACK JR WINIT ;************************** IOSET: LD A,C LD (IOBYTE),A ;SAVE NEW ASSIGNMENTS RET ;**************************************CHARS BYE1: CALL CONI CP BELL ;IF NOT BELL THEN RESTART JR NZ,BYE CALL ECH1 ;ECHO THE BELL DJNZ BYE1 RET ;------ S2=S1 THEN EXIT JR Z,CMPB PUSH AF ;SAVE S2 DATA CALL LADRB ;OUTPUT ADDR LD A,B CALL DASH1 ;FORMAT POP AF CALL D A,L ;SEE IF ON 16 BYTE BOUNDARY CALL TRPLSP ;SKIP OVER TO RIGHT COLUMN PUSH HL DIS2: LD A,(HL) ;GET CONTENTS CALL HE A,C ;IF LAST CHAR = DELIM THEN EXIT CALL P2C JR NC,EX3 DJNZ QPRT ;ELSE IF MORE REQ'D THEN ERR RET ;ELSE RETURN ;----------------------------------------------------------------------- ASGN: CALL ECHO ;GET THE LOGICAL DEVICE DESIRED LD HA ;OFFSET = INDEX * 2 LD E,A LD D,0 LD B,2 ;PASS IN 2 PARAMS TO HANDLER LD HL,TBL ;ADDRESS = (TABLE + OFFSET) ADD  WAS OVERWRITTEN ;---------------------------- ; ; ASSIGN CONTINUED ; ;---------------------------- AS1: LD D,B ;SAVE ***** ; ; RETURN IOBYTE VALUE SUBR ; EXIT - A= CURRENT IOBYTE VALUE ; ;******************************************* IOCHK: ---------------------------------------------------------------------- ; ; VERIFY MEMORY COMMAND ; ; THIS ROUTINE COMPARES 2HEX1 ;OUTPUT S2 CMPB: POP BC CALL HILOXB JR CMPA ;---------------------------------------------------------------------X1 CALL HILO ;INC & CHECK PTR JR C,DIS7 ;DONE IF CARRY CALL BLK ;MAKE COLUMNS LD A,L ;READY FOR NEW LINE? AND 0FH ---------------------------------------------------------------------------- ; ; LOGICAL ASSIGNMENT OF PERIPHERALS COMMAND ; L,ALT ;START OF CONVERSION TABLE LD DE,APT - ALT ; # OF ELEMENTS LD B,4 ; COUNT = # ENTRIES AS0: CP (HL) ;IF CHAR = TABLHL,DE LD A,(HL) INC HL LD H,(HL) LD L,A JP (HL) ;------------------------------------------------------------------THE COUNTER RESIDUE LD B,4 CALL DECHO ;GET NEW ASSIGNMENT AS2: INC HL ;PTR = PTR + 1 CP (HL) ;IF CHAR <> (TABLE) THEN LD A,(IOBYTE) RET ;---------------------------------------------------------------------------- ; ; SLEEP COMMAND ; ; BLOCKS OF MEMORY AGAINST EACH OTHER. IF A ; DIFFERENCE IN THE RELATIVE ADDRESS CONTENTS IS DETECTED, THE ADDRESS OF THE ; 1ST------- ; ; DISPLAY MEMORY COMMAND ; ; THIS ROUTINE DISPLAYS A BLOCK OF MEMORY ON THE CONSOLE DEVICE. THE ; USER MUST SPECI JR NZ,DIS2 DIS3: POP HL ;RESTORE START OF LINE LD A,L ;SKIP OVER TO RIGHT SPACE AND 0FH CALL TRPL2 DIS4: LD A,(HL) 0 %+ &, !'- "(. #)/ $*0;OUTPUT MEMORY IN ASCII AND 7FH ;IF PRINTABLE THEN OUTPUT LD C,A CP ' ' JR C,DIS5 CP 7EH JR C,DIS6 DIS5: LD C,'.' BREAKPONT THE RUN, AS LONG AS INTERRUPT 1 IS ACTIVE. ; ; G ;START EXECUTION AT WHATEVER IS IN PC REG (NO BPS) ; G ;START EXECUTION AT START_ADDR (NO BPS) ; G,[,] ;START EXECUTION AT START_ADDR WITH ; BREAKPO POP HL ;SPTR LD A,D ;INSURE 0 WASN'T SPEC'D OR E JR Z,GO2 LD (HL),E ;SAVE BP ADDR INC HL LD (HL),D INC HL LDE DEVICE. ; ; I ; ;---------------------------------------------------------------------------- INPT: CALL EXN 1ST BYTE ADDR. ; ; M ; ;------------------------------------------------------USER TO INSPECT ANY MEMORY LOCATION & ALTER ; THE CONTENTS, IF DESIRED & IF THE ADDRESS IS IN RAM. THE CONTENTS MAY BE ; LEFT F ;CONTINUE HEX INPUT POP DE ;NEW VALUE POP HL ;PTR LD (HL),E ;LOAD VALUE LD A,C ;IF DELIM = CR THEN DONE CP CR D BE 0 CALL NZ,BITS ;LOG ERR IF NOT MTEST2: POP AF ;RESTORE BYTE LD (HL),A CALL HILOX JR MTEST1 ; BITS: PUSH DE L DIS7: SUB A,E ;SKIP OVER TO START ASCII CALL TRPLSP JR DIS3 ; TRPLSP: AND 0FH ;ISOLATE LOW NIBBLE LD B,A ;PREPARE TOINT AT BP1 AND OPTIONAL BREAKPOINT AT BP2 ; G,[,] ;START EXECUTION AT PC VALUE WITH BREAKPOINT(S) AT ; BP1 & OPT A,(DE) ;SAVE BP ADDR INSTRUCTION LD (HL),A INC HL LD A,0CFH ;INSERT THE BP LD (DE),A GO2: LD A,C ;IF CHAR = CR THENPR1 ;GET INPUT PORT # INTO C CALL CRLF ;PUT DATA ON NEW LINE POP BC IN E,(C) PUSH DE ;FIX BUG. BITS2 POPS DE BEFORE '---------------------- MOVE: CALL EXPR3 MOV1: LD A,(HL) ;MOVE 1 BYTE LD (BC),A CALL HILOXB JR MOV1 ;----------------UNALTERED BY ENTERING A SPACE, COMMA OR RETURN. IF A RETURN IS ; ENTERED, THE ROUTINE IS TERMINATED. IF A SPACE OR COMMA IS ENT RET Z SUB2: INC HL ;PTR = PTR + 2 INC HL SUB3: DEC HL ;PTR = PTR - 1 LD A,L ;IF ON MOD 8 BOUNDARY THEN AND 7 ; OUTD E,A CALL LADRB ;OUTPUT ADDR BITS2: LD B,8 ;BIT COUNT BITS1: LD A,E RLCA LD E,A LD A,'0' / 2 ;BUILD ASCII 1 OR 0  SPACE OVER TO RIGHT ADD A,A ; COLUMN ADD B TRPL2: LD B,A INC B TRPL1: CALL BLK ;DO SPACING DJNZ TRPL1 RET ;--IONAL BP2. ; ;---------------------------------------------------------------------------- GOTO: CALL PCHK ;SEE IF OD ADDR W DONE BPING CP CR POP BC JR Z,GO3 DJNZ GO1 ;ELSE IF <2 BPS THEN LOOP GO3: CALL CRLF ;NEW LINE FOR PGM POP HL ;GET RET' JR BITS2 ;OUTPUT VALUE ;-------------------------------------- ; ; OUTPUT DATA TO PORT COMMAND ; ; O ; ARG ::ERED, THE ; ROUTINE PROCEEDS TO THE NEXT LOCATION & PRESENTS THE USER WITH AN ; OPPORTUNITY TO ALTER IT. ; ; S ; ;-PUT ADDR CALL Z,LADRB JR SUB1 ;---------------------------------------------------------------------------- ; ; MTEST CRLA LD C,A CALL CONOUT DJNZ BITS1 POP DE RET ;----------------------------------------------------------------------------------------------------------------------------------------------- ; ; GOTO COMMAND ; ; GOTO COMMAND TRANSFERS CONTRANTED JR C,GO3 JR Z,GO0 ;YES, BUT SET BP CALL EXF ;GET NEW GOTO ADDR POP DE LD HL,PLOC ;PUT ADDR IN PC LOCATION ARID OF STACK JUNK LD HL,RS9 PUSH HL LD HL,REST LD (9),HL ;SET BP VECTOR ADDR LD HL,24 ;FIND REG SET ROUTINE ADDR A> ; ;-------------------------------------- OUPT: CALL EXPR ;GET DATA INTO E, PORT # INTO C POP DE POP  0..FH (PASSED TO BOOT ROM) ; PROM # :: 0..7 (DEFAULT # = 02H) ; ;------------------------------------------------ BOOTC: --------------------------------------------------------------------------- SUBS: CALL EXPR1 ;GET ADDR CALL CRLF ;START ON OMMAND TESTS A SPECIFIED BLOCK OF MEMORY TO SEE IF ANY HARD ; DATA BIT FAILURES EXIST. IT IS NOT AN EXHAUSTIVE TEST, BUT JUST A------- ; ; EXAMINE REGISTERS COMMAND ; INSPECTS THE VALUES OF THE REGISTERS STORED BY THE LAST ENCOUNTERED ; BREAKPOINT. THOL TO A SPECIFIED ADDRESS IT ALLOWS THE ; SELECTIVE SETTING OF UP TO 2 BREAKPOINTS AS WELL AS ALLOWING ANY CONSOLE ; INPUT TO DD HL,SP LD (HL),D DEC HL LD (HL),E LD A,C ;IF LAST = CR THEN EXIT CP CR JR Z,GO3 GO0: LD B,NBKPTS LD HL,TLOC ;DD HL,SP POP DE ;ADJUST STACK JP (HL) ;GO DO REG RESTORE ;-------------------------------------------------------------BC OUT (C),E RET ;---------------------------------------------------------------------------- ; ; MOVE COMMAND ; ; TCALL PCHK ;IF NO FURTHER INPUT THEN USE DEFAULT JP C,BOOTCD CALL EXF ;GET USER BOOT # POP BC JP BOOTCC ;-----------NEW LINE POP HL SUB1: LD A,(HL) ;OUTPUT EXISTING CONTENTS CALL DASH1 CALL PCHK ;GET NEW VALUE RET C ;IF CHAR = CR TH QUICK ; INDICATION OF THE MEMORY'S OPERATIVENESS. ; ; T ; ;---------------------------------------E VALUES MAY BE MODIFIED IF DESIRED. ; ; X ;DISPLAY ALL REGISTER VALUES ; ;r= A,B,C,D,E,F,H,L,M,P,S,I,'A,'B,'C,'D0 %+ &, !'- "(. #)/ $*0,'E,'H,'L,'M,X,Y,R ; ;d= HEX NUMBER TO PLACE INTO REGISTER r ; ;--------------------------------------------------- NC,XE INC DE ;ELSE REG PAIR, DO OTHER 8 BITS LD A,H LD (DE),A XE: POP HL ;TABLE PTR XF: LD A,C ;IF LAST = CR THEN RELD ADDR OF REG CONTENTS LD H,0 ADD HL,SP EX DE,HL LD A,(HL) ;NOW FIND ATTRIBUTES LD B,1 ;SINGLE REG VALUE RLCA J********************************************************** CONV: AND 0FH ADD A,90H ;PUT INTO ASCII ZONE DAA ;AH, THE UBI*********************************** EXPR3: INC B ;B HAS 2 ALREADY CALL EXPR POP BC POP DE JP CRLFA ;GO DO CRLF ; & IF ; EQUAL, RETURNS CONTROL TO THE MONITOR EXEC. OTHERWISE, ; CONTROL RETURNS TO THE CALLING ROUTINE. ; ;****************************** NIBBLE: SUB '0' RET C CP 'G' - '0' CCF RET C CP '9' - '0' + 1 CCF RET NC SUB 'A' - '9' - 1 C RET Z CCF ;ELSE RETURN NC RET ;**************************************************************************** ; ; RE------------------------- XAA: INC HL ;SKIP OVER TO NEXT ENTRY INC HL XA: INC (HL) ;IF AT END OF TABLE THEN RETURN RET ZTURN CP CR RET Z ; ; THIS IS THE ACTUAL COMMAND ENTRY POINT ; XMNE: LD HL,ACTBL ;ADDR OF REG LOOK-UP TABLE XMNE1: CALR NC,PV1 ;IF SINGLE REG THEN EXIT INC B ;ELSE REG PAIR RLCA ;IF NOT (HL) THEN EXIT JR NC,PV1 PUSH HL ;BUILD ADDR INQUITOUS DAA CONVERT ADC A,40H DAA LD C,A RET ;*************************************************************** ; ;**************************************************************************** ; ; HILO ROUTINE INCREMENTS HL. IT THEN CHECKS FO******************************************** HILOD: POP DE ;GET RID OF RETURN ADDR RET ;RETURN TO MONITOR HILOXB: INCP 10 RET ;**************************************************************************** ; ; PCHK ROUTINE READS A CHARACTST ROUTINE TRAPS ALL OF THE REGISTER CONTENTS WHENEVER A RESTART 1 ; INSTRUCTION IS EXECUTED. THE TRAPPED CONTENTS ARE STORED I JP P,XAB ;SORT OUT BIT 7 OF TABLE OR 80H ;SET IT ON TEST VALUE JR XAC ; XAB: AND 7FH ;RESET BIT 7 XAC: DEC (HL) ;TL PCHK JR C,XG ;IF CHAR = CR THEN SHOW ALL JR Z,XMNE1 ;IF CHAR = ' ' OR ',' THEN LOOP CP '''' ;IF NOT PRIMES THEN EXIT  HL LD A,(DE) LD H,A DEC DE LD A,(DE) LD L,A LD A,(HL) ;GET (HL) VALUE POP HL DJNZ PV2 ;ALLWAYS JUMP PV1: LD  ECHO ROUTINE READS A BYTE FROM CONSOLE DEVICE & ECHOS ; THE CHAR BACK TO THE CONSOLE DEVICE. ; ;***************************R (& DISALLOWS) A ; WRAP-AROUND SITUATION. IF IT OCCURS, THE CARRY BIT WILL BE SET ON RETURN. ; IF NO WRAP-AROUND OCCURRED, HL BC HILOX: CALL HILO JR C,HILOD ;DONE IF CF CALL CONST ;IF NO CONSOLE BREAK THEN OR A ; RETURN RET Z CALL CONI ;ER FROM THE CONSOLE, THEN CHECKS IT FOR A ; DELIMITER. IF IT IS NOT A DELIMITER, A NON-ZERO CONDITION IS RETURNED. IF ; IT IS N THE SYSTEM ; STACK AREA FOR LATER ACCESS AND USE BY THE GOTO & THE EXAMINE REGISTERS ; COMMANDS. ; ; INSERT INTERRUPT DISAO BE PULLED OUT IN ROM CP (HL) JR NZ,XAA ;NO MATCH, TRY AGAIN CALL BLK CALL PRTVAL CALL DASH CALL PCHK ;GET NEW IN JR NZ,XA LD HL,PRMTB JR XMNE1 ; XG: LD A,(HL) LD C,A INC A ;IF AT END OF TABLE THEN RETURN RET Z CALL M,CRLF ;A,(DE) ;GET REG CONTENTS PV2: CALL HEX1 ;OUTPUT VALUE DEC DE ;MEM PTR DJNZ PV1 RET FORM SUBTTL GENERAL PURPOSE SUB************************************ DECHO: CALL DASH ;OUTPUT A '-' ECHO: CALL CONI ECH1: PUSH BC LD C,A ;OUTPUT CHAR C IS COMPARED TO DE & THE FLAGS SET ACCORDINGLY. ; ;***************************************************************************IF CHAR <> CTRL-S THEN BREAK CP CTRLS JR NZ,HILOD JP CONI ;ELSE WAIT FOR NEXT CHAR ;********************************A DELIMITER, A ZERO CONDITION IS RETURNED. FURTHER, IF THE DELIMITER ; IS A CR, THE CARRY FLAG IS SET. A BLANK OR A COMMA RESETBLER SOFTWARE AT START OF REST. ; ;**************************************************************************** REST: PUSH HLPUT RET C ;IF CHAR = CR THEN RETURN JR Z,XF ;IF NO CHANGE THEN EXIT PUSH HL ;PTR CALL EXF POP HL LD A,L INC DE NEW LINE IF BIT 7 SET CALL CONOUT CALL DASH CALL PRTVAL CALL BLK INC HL ;NEXT ENTRY JR XG ; PRTVAL: INC HL ;NEXTROUTINES ;**************************************************************************** ; ; CONV ROUTINE CONVERTS THE LOW ORDEALL CONOUT LD A,C ;RESTORE CHAR IN A POP BC RET ;*************************************************************** ; * HILO: INC HL LD A,H ;IF HL = 0 THEN RETURN CF OR L SCF RET Z LD A,E ;ELSE COMPARE HL TO DE SUB L LD A,D SBC******************************* ; ; NIBBLE ROUTINE CONVERTS THE ASCII CHARACTERS 0-9 & A-F ; TO THEIR EQUIVALENT HEX VALUE. S THE CARRY FLAG. ; ;**************************************************************************** PCHK: CALL ECHO P2C: CP '  ;SAVE ALL REGS PUSH DE PUSH BC PUSH AF CALL MEMSIZ ;GET THE MONITOR STACK LOCATION EX DE,HL LD HL,10 ;GO UP 10 B LD (DE),A EX (SP),HL ;RECOVER TABLE PTR LD A,(HL) ;GET THE ATTRIBUTES EX (SP),HL RLCA ;IF 8 BIT REG THEN EXIT JR ENTRY LD A,(HL) ;GET OFFSET & ATTRIBUTES AND 3FH ;ISOLATE OFFSET ADD A,2 ;ALLOW FOR RET ADDR EX DE,HL LD L,A ;BUIR NIBBLE OF THE ; ACCUMULATOR TO ITS ASCII EQUIVALENT. ; ENTRY- A= NUMBER (LO NIBBLE) ; EXIT - A= C= ASCII NUMBER ; ;***** ; EXPR3 ROUTINE GETS 3 PARAMETERS, DOES A CR-LF & THEN ; LOADS BC, DE & HL WITH THE PARAMS. ; ;**************************** A,H RET ;********************************************************** ; ; HILOX ROUTINE INCREMENTS HL, COMPARES IT TO DEIF THE CHARACTER IS NOT IN ; RANGE, THE CARRY BIT IS SET TO FLAG THE ERR. ; ;***********************************************' ;IF CHAR = ' ' THEN RETURN RET Z CP ',' ;IF CHAR = ',' THEN RETURN RET Z CP CR ;IF CHAR = CR THEN RETURN CF SCF YTES IN STACK ADD HL,SP LD B,4 EX DE,HL RS1: DEC HL LD (HL),D ;SAVE IN WORK AREA DEC HL LD (HL),E POP DE DJNZ 0 %+ &, !'- "(. #)/ $*0RS1 POP BC ;GET BREAKPOINT LOCATION + 1 DEC BC ;BACK UP TO RESTART INSTRUCTION LD SP,HL ;SET THE MONITOR STACK LD HL, ADD HL,SP LD BC,NBKPTS * 256 RS7: LD E,(HL) ;RESTORE BP'D LOCATIONS LD (HL),C ;RESET SYSTEM SAVE AREA INC HL LD D,(H-------------------------------------------------------------- ; ; 3 TYPES OF ERRORS ARE DETECTED: A RESTART ERROR; AN I/O ASS-------------- ; ; COMMON ERROR HANDLER ; ENTRY- HL= MESSAGE PTR ; ;--------------------------------- COMERR: CALL PRTWD UE2 LD C,(HL) ;FOUND IT, NOW OUTPUT IT CALL CONOUT POP HL POP AF RRA RRA ADD HL,DE ;NEXT ENTRY DJNZ QUE1 RETRTWD: CALL CRLF PRTWA: PUSH BC PRTA: LD C,(HL) RES 7,C ;MAKE SURE BIT 7 = 0 CALL CO LD A,(HL) ;IF BIT 7 = 1 THEN STOP ******************************* ; ; LADR ROUTINE OUTPUTS THE CONTENTS OF HL ON THE CONSOLE ; EITHER AT THE START OF A NEW LIACE ; FALLS INTO CO SUBR SUBTTL IOBYTE HANDLERS ;******************************************************************** ; TLOCX ;RESTORE BP ADD HL,SP PUSH DE LD D,NBKPTS RS2: LD A,(HL) SUB C ;SEE IF SOFTWARE TRAP INC HL LD A,(HL) SBC L) LD (HL),C INC HL LD A,E ;IF LOC = 0 THEN SKIP RESTORE OR D JR Z,RS8 LD A,(HL) ;ELSE RESTORE ORIGINAL INSTR. LIGNMENT ; ERROR; & CERTAIN PROGRAM ERRORS (DETERMINED BY PARTICULAR ROUTINE WHERE THE ; ERROR CONDITION WAS ENCOUNTERED) EACH  JP WSVEC ;**************************************************************************** ; ; QUERY ROUTINE WILL TELL THE OPE ;******************************************************************** ; ; CONI ROUTINE READS THE CONSOLE & STRIPS OFF TH INC HL RLCA JR NC,PRTA PRTB: POP BC RET ;*************************************************************** ; ; EXLNE (LADRA) OR AT THE CURRENT ; CURSOR LOCATION (LADR). ; ;*************************************************************** L; CONSOLE OUTPUT ; ENTRY- (IOBYTE BIT 0..1): 0: TTY, 1: CRT, 2: BAT, 3: USR1 ; C= CHAR ; ;*********************************A,B ;MAYBE, TRY REST OF ADDR JR Z,RS5 ;FOUND 1, RESET IT RS3: INC HL ;NOT FOUND, TRY NEXT 1 INC HL DEC D JR NZ,RS2 D (DE),A RS8: INC HL ;DO NEXT BP DJNZ RS7 EX AF,AF' ;NOW SAVE THE Z80 UNIQUES EXX PUSH HL PUSH DE PUSH BC PUSH CAUSES A UNIQUE MESSAGE TO BE ; PRINTED, THEN DOES A WARM INIT OF THE MONITOR. THE I/O ERROR CAUSES THE ; I/O ASSIGNMENTS TO BRATOR WHAT HIS CURRENT LOGICAL-PHYSICAL ; PERIPHERAL DEVICE ASSIGNMENTS ARE. NO PARAMETERS (OTHER THAN A CR) ARE ; REQUIRED ONE PARITY BIT. ; ;******************************************************************** CONI: CALL CI AND 7FH RTS: RET F ROUTINE READS 2 PARAMETERS, PUTS THEM INTO THE DE ; & HL REGS, THEN DOES A CR-LF. ; ;*************************************ADRA: CALL CRLF LADR: LD A,H CALL HEX1 LD A,L HEX1: PUSH AF RRCA RRCA RRCA RRCA CALL HEX2 POP AF HEX2: CALL C*********************************** CO: LD A,(IOBYTE) AND 3 JP Z,TTYOUT ;SYSTEM CONSOLE CP 2 JP M,CRTOUT ;CRT JP NZ,CRS4: INC BC ;NONE FOUND RS5: LD HL,LLOCX POP DE ADD HL,SP LD (HL),E ;STORE USER (HL) INC HL LD (HL),D PUSH BC LAF PUSH IX PUSH IY LD A,I LD B,A LD A,R LD C,A PUSH BC JP WINITA ;RETURN TO MONITOR RS9: PUSH HL RST 8 ;FE RESET TO THE DEFAULT ASSIGNMENT. ; ;---------------------------------------------------------------------------- IOER: LD A ENTRY. ; ;**************************************************************************** QUERY: LD A,(IOBYTE) LD B,4 LD HL;**************************************************************************** ; ; PRTWD ROUTINE OUTPUTS AN ASCII STRING ONTO T************************** EXLF: CALL EXPR POP DE POP HL ;************************************************************ONV JR CO ;********************************************************** ; ; DASH ROUTINE OUTPUTS A '-' TO THE CONSOLE DEVUSO1 ;USER 1 ; *** BATCH FALLS INTO LIST OUTPUT *** ;******************************************************************D C,'*' ;OUTPUT BREAK INDICATION CALL CONOUT POP DE ;BP LOCATION LD A,RS9 / 256 CP D ;SEE IF A RET BP JR Z,RS6 INORCE BP EXIT: POP BC LD A,C LD R,A LD A,B LD I,A POP IX POP IY POP AF POP BC POP DE POP HL EX AF,AF' ,IOBYTV ;SET IOBYTE TO DEFAULT LD (IOBYTE),A LD HL,IOMSG JR COMERR ;------------------------------------------- ; ; U,ACT ;ADDR OF CONVERSION TABLE LD DE,ALT - APT QUE1: PUSH AF CALL BLK LD C,(HL) ;GET CURRENT LOGICAL DEVICE CODE CALLHE CONSOLE. ; THE STRING MUST BE TERMINATED BY BIT 7 SET IN THE LAST CHAR OF THE STRING. ; THE STRING WILL START A NEW LNE (P*** ; ; CRLF ROUTINE OUTPUTS A CR-LF ON THE CONSOLE DEVICE TO ; START A NEW LINE. ; ;*************************************ICE ; ;********************************************************** DASH1: CALL HEX1 ;OUTPUT A AS HEX DASH: LD C,'-' JR CO ******* ; ; LIST DEVICE OUTPUT ; ENTRY- (IOBYTE BIT 6..7)= 0: TTY, 40H: CRT, 80H: LPT, C0H: USR1 ; C= CHAR ; ;***********C HL INC HL LD (HL),E ;RESTORE USER PC INC HL LD (HL),D EX DE,HL ;OUTPUT BP LOCATION CALL LADR RS6: LD HL,TLOCX EXX POP DE POP BC POP AF POP HL LD SP,HL DB 0 ;PLACE FOR EI LD HL,0 JP 0 ; ENDX: EQU $ ;--------------NINITIALIZED RESTART ERROR HANDLER ; ;------------------------------------------- RSTER: LD HL,RSTMSG ;------------------- CONOUT CALL DASH POP AF PUSH AF PUSH HL QUE2: INC HL INC A AND 3 ;BITS 0 & 1 ARE 0 WHEN ON CURRENT ASSGN JR NZ,QRTWD) OR CONTINUE ON THE SAME LINE (PRTWA). ; ;**************************************************************************** P************************** CRLF: PUSH HL CRLFA: LD HL,CRMSG CALL PRTWA POP HL RET ;******************************** ;*********************** ; ; PRINT ADDR SUBR ; ;*********************** LADRB: CALL LADRA BLK: LD C,' ' ;OUTPUT A SP************************************************************** LO: LD A,(IOBYTE) AND 0C0H JP Z,TTYOUT ;SYSTEM CONSOLE CP 0 %+ &, !'- "(. #)/ $*080H JP M,CRTOUT ;CRT JP Z,LPRT ;LINE PRINTER JP LUSE1 ;USER 1 ;********************************************************************************** ; ; CONSOLE INPUT ; ENTRY- (IOBYTE BIT 0..1)= 0: TTY, 1: CRT, 2: BATCH, 3: USR1 ; EXIT - A= CER 2 ;************************************************************************* ; ; LIST DEVICE STATUS INPUT ; ENTRY- (I JP M,HSP ;HIGH SPEED PUNCH JP Z,PUSO1 ;USER 1 JP PUSO2 ;USER 2 SUBTTL PRIMITIVE I/O DRIVERS ;*********************************** CRTIN: CALL CRTST ;IF NOT READY THEN WAIT JR Z,CRTIN IN A,BZUDAT ;INPUT CHAR RET CRTOUT: CALL CRNTOUT),A SET CENTDST,A ;RESTORE STROBE OUT (CENTOUT),A RET LPRST: IN A,(CENTS) ;IF BUSY THEN RETURN 0 CPL ;REVERADER DEVICE (UR1) ; ;************************************** RUSI1: EQU IOER RUST1: EQU IOER ;****************************;************************************** PUSO2: EQU IOER ;************************************** ; ; ALTERNATE LIST DEVIC********************* ; ; CONSOLE STATUS INPUT ; ENTRY- (IOBYTE BIT 0..1)= 0: TTY, 1: CRT, 2: BATCH, 3: USER 1 ; EXIT - A= 0HAR (CTRL-Z: EOF) ; ;******************************************************************** CI: LD A,(IOBYTE) AND 3 JP Z,TTOBYTE BIT 6..7)= 0:TTY, 40H: CRT, 80H: LPT, C0H: USR1 ; EXIT - A= 0: BUSY, FFH: READY ; ;***************************************************** ; ; PRIMARY CONSOLE DEVICE (TTY) ; ;************************************** TTYIN: CALL TTST ;IF CHAR NTOST ;IF NOT READY THEN WAIT JR Z,CRTOUT LD A,C ;OUTPUT CHAR OUT BZUDAT,A RET CRTST: IN A,BZUST ;IF RXRDY NOT TRSE SENSE AND A,[1 SHL CENTBSY] RET Z LD A,-1 ;ELSE RETURN -1 RET ; ADDITIONAL I/O DEVICES ;****************************** ; ; ALTERNATE READER DEVICE (UR2) ; ;************************************** RUSI2: EQU IOER RUST2: EQU IOER E (UL1) ; ;************************************** LUSE1: EQU IOER LUST1: EQU IOER SUBTTL MESSAGES CRMSG: DM CR,LF RST: NOT READY, FFH: CHAR READY ; ;************************************************************************* CSTS: LD A,(IOBYTE)YIN ;SYSTEM CONSOLE CP 2 JP M,CRTIN ;CRT JP NZ,CUSI1 ;USER 1 ; BATCH INPUT FALLS INTO READER VECTOR ;************************************************** LSTAT: LD A,(IOBYTE) AND 0C0H JP Z,TTOST ;SYSTEM CONSOLE CP 80H JP M,CRTOST ;CRTOT READY THEN WAIT JR Z,TTYIN IN A,NTD ;ELSE RETURN CHAR RET TTYOUT: CALL TTOST ;IF NOT READY TO ACCEPT CHAR THEN WUE THEN RETURN 0 AND BZURXR CRTST1: RET Z LD A,-1 ;ELSE RETURN -1 RET CRTOST: IN A,BZUST ;IF TXRDY NOT TRUE THEN R****************** ; ; ALTERNATE CONSOLE DEVICE (UC1) ; ;************************************** CUSI1: EQU IOER CUSO1: EQU ;************************************** ; ; PRIMARY PUNCH DEVICE (TTY) ; ;************************************** TTPNCH: MSG: DM 'RST ERR' BOOTEM: DM 'BOOT LOAD ERR',CR,LF USRMSG: DM 'MEMORY = ' IOMSG: DM 'I/O ERR' QMSG: DM '????' LOGMSG: DM 'Z AND 3 JP Z,TTST ;SYSTEM CONSOLE CP 2 JP M,CRTST ;CRT JP NZ,CUST1 ;USER 1 ; ; BATCH MODE STATUS INPUT FALLS THROUG******************************************************* ; ; READER INPUT ; ENTRY- (IOBYTE BIT 2..3)= 0: TTY, 4: PTR, 8: USR1, JP Z,LPRST ;LINE PRINTER JP LUST1 ;USER 1 ;*************************************************************************AIT JR Z,TTYOUT LD A,C ;OUTPUT CHAR & RETURN OUT NTD,A RET TTST: IN A,NTS ;IF NOT CHAR NOT READY THEN RETURN 0 ETURN 0 AND BZUTXR JR CRTST1 ;************************************** ; ; ALTERNATE LIST DEVICE (LPT) ; ;*********** IOER CUST1: EQU IOER ;************************************** ; ; PRIMARY READER DEVICE (TTY) ; ;*********************EQU IOER ;************************************** ; ; ALTERNATE PUNCH DEVICE (PTP) ; ;************************************MON VERS ',HIGH VERSN,'.',LOW VERSN,CR,LF SUBTTL CONSTANTS ;***************************************************** ; ; TBLH HERE ; ENTRY- (IOBYTE BIT 6..7)= 0: TTY, 40H: PTR, 80H: USR1, C0H: USR2 ; LD A,(IOBYTE) AND 0CH JP Z,TTST ;SYSTEM CON CH: USR2 ; EXIT - A= CHAR AND 7FH (CTRL-Z: EOF) ; ;******************************************************************** RI: ; ; PUNCH DEVICE OUTPUT ; ENTRY- (IOBYTE BIT 4..5)= 0: TTY, 10H: HSP, 20H: USR1, 30H: USR2 ; C= CHAR ; ;****************AND 1 SHL NTRDY TTOST1: RET Z LD A,-1 ;ELSE RETURN -1 RET TTOST: IN A,NTS ;IF BUSY THEN RETURN 0 CPL AND 1 SHL N*************************** LPRT: CALL LPRST ;IF BUSY THEN WAIT JR Z,LPRT LD A,[1 SHL CENTDST] ;INSURE STROBE STARTS H***************** TTYRDR: EQU IOER ;************************************** ; ; ALTERNATE READER DEVICE (PTR) ; ;******** HSP: EQU IOER HSPST: EQU IOER ;************************************** ; ; ALTERNATE PUNCH DEVICE (UP1) ; ;********** CONTAINS THE ADDRESSES OF THE COMMANDS. ; THE EXECUTIVE USES IT TO LOOK UP THE DESIRED ADDR. ; ;****************************SOLE CP 8 JP M,PTRST ;PAPER TAPE RDR JP Z,RUST1 ;USER 1 JP RUST2 ;USER 2 ;************************************** LD A,(IOBYTE) AND 0CH JP Z,TTYRDR ;SYSTEM CONSOLE CP 8 JP M,PTRIN ;PAPER APE RDR JP Z,RUSI1 ;USER 1 JP RUSI2 ;US********************************************************* PUNO: LD A,(IOBYTE) AND 30H JP Z,TTPNCH ;SYSTEM CONSOLE CP 20H TBSY JR TTOST1 ;************************************** ; ; ALTERNATE CONSOLE DEVICE (CRT) ; ;************************IGH OUT (CENTOUT),A LD A,C ;OUTPUT CHAR SET CENTDST,A OUT (CENTOUT),A RES CENTDST,A ;OUTPUT LOW TRUE STROBE OUT (CE******************************** PTRIN: EQU IOER PTRST: EQU IOER ;************************************** ; ; ALTERNATE RE**************************** PUSO1: EQU IOER ;************************************** ; ; ALTERNATE PUNCH DEVICE (UP2) ; ************************* TBL: DW ASGN ;A DW BOOTC ;B DW QPRT ;C DW DISP ;D DW QPRT ;E DW FILL ;F DW GOTO ;G0 %+ &, !'- "(. #)/ $*0 DW QPRT ;H DW INPT ;I DW QPRT ;J DW QPRT ;K DW QPRT ;L DW MOVE ;M DW QPRT ;N DW OUPT ;O DW QPRT ;P  DB '1' ; USER DEVICE #1 DB 'P' ; READER TO HIGH SPEED READER DB 'T' ; READER TO SYSTEM CONSOLE ; ACT: DB 'C' ;LOGLPLOC DB 'M' + 80H,HPLOC + 0C0H DB 'X',XLOC + 80H DB 'Y',YLOC + 80H DB 'R',RLOC DB -1 END ********************** ; ; REVISION STATUS: ; ; 1.0 - 26 FEB 81, Release ; 1.1 - Fix bug. ; 1.2 - 18 JUL 82, Move DD to hiking the processor out of it's sleep. ; ; 2.0 - 18 MAR 84 GRH ; Added hard disk boot option and boot command source disk opn Doubler (ISIS) ; 10..13= 3" Jade floppy ; ; 3.01 4 JUN 88 GRH ; Fix bug i************************************************* SUBTTL DECLARATIONS ;====================================================NROM.DEF ;*INCLUDE MONBOARD.DEF ;*INCLUDE DKBTROM.DEF ;*INCLUDE COMIOPB.DEF ;*INCLUDE JDDCONT.DEF ;*INCLUDE ISHA.DEF ;*INC DW QUERY ;Q DW QPRT ;R DW SUBS ;S DW MTEST ;T DW QPRT ;U DW COMP ;V DW QPRT ;W DW XMNE ;X DW QPRT ;Y ICAL CONSOLE DEVICE TABLE DB '1' ; USER DEVICE #1 DB 'B' ; CONSOLE TO BATCH (LPT OR PTR) DB 'C' ; CONSOLE TO CRT Dgh memory, clean up listing. ; 1.3 - 12 FEB 83 ; Add timout if DD not responding, add true recalibrate ; on boot in case the tion. ; ; 2.1 - 18 APR 85 GRH ; Fix problem with hard disk boot from drive 1. Needs logon. Also ; Also allow boot from 2ndn ISHAX that prevented the clear controller command from ; working. ; ; 3.02 12 JUN 88 GRH ; Change 'RET'urns in 'H8BOOT======================== ; ; CONSTANTS ; ;============================================================================ FLUDE NAKEDT.DEF ;*INCLUDE DISKS.DEF ; ;============================================================================ LIST OF DW BYE ;Z ;----------------------- ; ; IOBYTE TABLE ; ;----------------------- ALT: DB 'L' ;LOGICAL LIST DEVICE TABLEB 'T' ; CONSOLE TO SYSTEM CONSOLE ;--------------------------------- ; ; Z80 REGISTER OFFSET TABLE ; ;-----------------head is outside track 0. ; 1.4 - 14 FEB 83 ; Make changes for rev C board. ; 1.5 - 23 MAR 83 GRH ; Fix bug in recal routin platter. ; code logical physical ; 42 A DRIVE 0 HEAD 0 ; 52 B DRIVE 0 HEAD 2 ; 62 C DRIVE 1 HEAD 0 ; 72 D DRIVE 1 HEA' to 'JP ....,DKRET'. Returns caused ; system crashes because ROMs not set up. ; ; 3.03 25 JUN 88 GRH ; Modify floppy boALSE EQU 0 TRUE EQU NOT FALSE ; DEBUG EQU FALSE ; LF EQU 0AH CR EQU 0DH ; HNGTMO EQU 10 ;HANGUP TIMOUT SECSIZ EQU 128 F *INCLUDE ZMONROM.DEF *INCLUDE MONBOARD.DEF *INCLUDE DKBTROM.DEF *INCLUDE COMIOPB.DEF *INCLUDE JDDCONT.DEF *INCLUDE ISHA. DB '2' ; USER DEVICE #2 DB '1' ; USER DEVICE #1 DB 'L' ; LIST TO HIGH SPEED PRINTER DB 'T' ; LIST TO SYSTEM CON---------------- ACTBL: DB 80H + 'A',ALOC DB 'B',BLOC DB 'C',CLOC DB 'D',DLOC DB 'E',ELOC DB 'F',FLOC DB 'H',HLOC e to account for phase 1 anded with trk00 ; signal from drive. Causes recal to not work ; ; 1.6 - 3 APR 83 GRH ; Fix bug iD 2 ; ; 3.0 - 28 JAN 87 GRH ; Change Jade DD boot to resident prom version. ; Implement disk I/O driver functions & vectorot to include new disk format with disk system tracks ; directory like the hard disk has (removed DCM & BLT loader). ; ; 3. ;DISK SECTOR SIZE ; ; SYSTEM LOCATIONS ; LOGINBYTE EQU 0004H ;CP/M CURRENT DRIVE & USER BYTE IOPB EQU 005CH ;USE DEFAUDEF *INCLUDE NAKEDT.DEF *INCLUDE DISKS.DEF LIST ON PHASECK MACRO #NAME IF $ <> #NAME CONMSG **** Phase Error - #NAME SOLE ; APT: DB 'P' ;LOGICAL PUNCH DEVICE TABLE DB '2' ; USER DEVICE #2 DB '1' ; USER DEVICE #1 DB 'P' ; PUNCH TO  DB 'L',LLOC DB 80H + 'M',HLOC + 0C0H DB 'P',PLOC + 80H DB 'S',SLOC + 80H DB 'I',ILOC ; ; PRIME Z80 REGISTER OFFSETS  TITLE DISK BOOTSTRAP DRIVER II LIST NOCOND ;**************************************************************************** ; n boot routine that assumes the controller window is ; enabled after requesting it. Found out that if the Z-80 is ; generatings and COMIOPB. ; Add error message output. ; Add prom # & drive passed in page 0. ; Drives now assigned the following logical04 7 JUL 88 GRH ; Add '?' to all include file names. ; Change boot system tracks directory references to new format. ; ; 3LT FCB AS IOPB AREA DEFBFR EQU 0080H ;USE CPM DEFAULT BUFFER FOR BIOS SECTOR 1 PROMST EQU 0F800H PROMSIZ EQU 2048 ;SIZE OF Not Equal to *ROM.DEF **** ENDIF ENDM SUBTTL UNINITIALIZED DATA ;####################################################HIGH SPEED PUNCH DB 'T' ; PUNCH TO SYSTEM CONSOLE ; ART: DB 'R' ;LOGICAL READER DEVICE TABLE DB '2' ; USER DEVICE #2 ; PRMTB: DB 80H + 'A',APLOC DB 'B',BPLOC DB 'C',CPLOC DB 'D',DPLOC DB 'E',EPLOC DB 'F',FPLOC DB 'H',HPLOC DB 'L', ; DISK CONTROLLER BOOTSTRAP DRIVER ; ; FOR M5B WITH ZMON MONITOR. ; ;****************************************************** a wait signal, the bus request is never acknowledged! ; Solution is to output the RESET bit along with the request thus ; yan to physical relationship: ; 0..3 = 8" Jade floppy ; 4..7 = 8" ISHA hard disk ; 8..B = 5" Jade floppy ; C..F = 8" Micromatio.05 6 AUG 88 GRH ; Make changes to Jade driver to support new IOPB format. ; VERSN EQU 305 ; ;***************************THIS PROM FOR CODE CHECKING ;============================================================================ ; ;*INCLUDE ZMO######################## ; ; PAGE 0 RESERVED AREA ; ;#####################################################################0 %+ &, !'- "(. #)/ $*0####### ORG 0040H ; ; BOOT VARIABLES ; PHASECK ?DKPROM DKPROM DS 2 ;PROM # & DRIVE PASSED TO BIOS BIOSLN DS 2 ;BIOS LNCTION ; ENTRY- C= FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ PHASECK ?DKF ; COLD START FROM RESET IN CASE THIS IS ONLY PROM IN SYSTEM ; ;--------------------------------------------------------------ARTS EXECUTING HERE. ; ENTRY- B= DRIVE # ; 0..3 = 8" JADE FLOPPY ; 4..7 = 8" HARD DISK (ISHA) ; 8..B = 5" JADE FLOPOOT ; CP A,0CH ;IF 5" FLOPPY THEN EXIT JP C,F5BOOT ; CP A,10H ;IF MICROMATION THEN EXIT JP C,M8BOOT ; CP A,14H ;++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; 5" JADE FLOPPY DISK BOOT ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ F8BOOT: ; ; SET THE PORT # ; EXX LD C,DD_PORT8 IN A SECTOR THEN ERROR ; LD A,(DEFBFR) CP A,86H JP C,DKRET ; ; ELSE FETCH THE LOCATION FOR THE BIOS ; LD HL,(DEFBFR + ENGTH SAVE/SECTOR COUNT BIOSNT DS 2 ;BIOS ENTRY SUBTTL MAIN PGM ORG PROMST ;------------------------------------------UNC JP DKFUNC ;**************************************************************************** ; ; CONSOLE OUTPUT SUBR ; -------------- COLD: DI ;DISABLE ROM IMAGE OUT (?COLDRES),A ; LD SP,DEFBFR ;SET UP COLD STACK LD B,0 ;SELECT OPTIONS PY ; C..F = 8" MICROMATION (INTEL M2FM) ; 10..13 = 3" JADE FLOPPY ; ;---------------------------------------------IF 3" FLOPPY THEN EXIT JP C,F3BOOT ; ; FALL INTO ERROR RETURN TO PRINT MESSAGE ; ;----------------------------------+++++++++++++++++++++++++++++++++++++++ F5BOOT: EQU ABORT ;UNSUPPORTED ;++++++++++++++++++++++++++++++++++++++++++++++++++,(C) AND A,DD_SASW RLCA OR A,HIGH DD_BASE LD H,A LD L,0 EXX ; ; RESET & START THE DISK PROCESSOR ; LD A,DD_BGBD_SIOSS) LD A,H LD H,0 LD (IOPB + PB_SECO),HL LD L,A LD (IOPB + PB_TRKO),HL ; ; READ 1ST BIOS SECTOR INTO BUFFER ---------------------------------- ; ; STAND-ALONE ENTRY VECTOR ; ;---------------------------------------------------------ENTRY- C= CHAR ; ;**************************************************************************** JP CO ;+++++++++++++++++ JR BEGIN ;---------------------------------------------------------------------------- ; ; SWAP ROMS TO RETURN TO CALLE------------------------------- BEGIN: ; ; SAVE PROM # FOR BIOS ; LD A,C AND A,7 LD (?DKPROM),A ; ; EXTRACT DRIV------------------------------------------ ; ; ABORT RETURNS CONTROL TO THE MONITOR ROM WITH ERROR FLAG (CF) SET ; ;--------++++++++++++++++++++++++++ ; ; 8" MICROMATION M2FM BOOT ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++N CALL JWAIT JR NZ,ABORT ; ; TEST THE SELF TEST STATUS ; LD IX,IOPB CALL JGETRES CALL NZ,DBERR ;DIAGNOSTIC ERROR  ; CALL DSKX CALL NZ,DBERR JP NZ,DKRET ; ; FETCH BIOS LOAD ADDRESS & SIZE PARAMETERS FROM BIOS 1ST SECTOR ; CALL ST------------------- PHASECK ?DKCOLD JP COLD ;BOOT VECTOR ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; JADE FLOPPY DISK DRIVER VECTOR ; ENTRY- IX= IOPB PTR ; EXIT R ; ;---------------------------------------------------------------------------- DS ?XOVER - $ ;POSITION CODE DKRET: LD AE # FROM ARGUMENT ; REPT 4 ;D4..D11 -> D0..D7 SRL B RR C ENDM ; ; IF DRIVE # > 0FFH THEN ABORT ; LD A,B OR A,-------------------------------------------------------------------- ABORT: SCF ;HAVE MONITOR PRINT ERROR MESSAGE JR DKRET +++++++++++ M8BOOT: EQU ABORT ;UNSUPPORTED SUBTTL JADE BOOT ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; PREPARE IOPB ; LD HL,LOGIOPB CALL IIOPB ; LD A,(LOGINBYTE) ;SET DRIVE LD (IOPB + PB_DRVO),A ; LD A,2 ;SET UPBIOS JP C,DKRET ; ; READ BIOS ; JADRDB: CALL DSKX CALL NZ,DBERR JP NZ,DKRET ; INC (IX + PB_SECO) ;NEXT SECTO+++++++++++++++++ ; ; CONSOLE INPUT ; EXIT - A= CHAR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- AF= 0: NO ERRORS ; BC,DE,HL,IX= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ PHASEC,?XMONROM ;SELECT MONITOR FOR RETURN NOP ;ALIGN NEXT INSTRUCTION OUT (?ROMSEL),A ; ; MONITOR ROM CONTINUES EXECUTION NA JR NZ,ABORT ; ; SAVE DRIVE # AS LOGIN DRIVE FOR BIOS ; LD A,C LD (LOGINBYTE),A LD (?DKPROM + 1),A ; ; NOW VEC ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; 3" JADE FLOPPY DISK BOOT ; ;++++++++++++++++++++++++ ; ; 8" JADE FLOPPY BOOT ; THIS ROUTINE NOW ACCESSES THE NEW JADE CONTROLLER WITH ON-BOARD PROM. ; THE CODESECTOR LD (IOPB + PB_SECO),A ; ; LOG ON DRIVE ; CALL DSKX CALL NZ,DBERR JP NZ,DKRET ; ; READ THE DIRECTORY SECTR ; LD HL,(IOPB + PB_DMAO) ;BUMP LOAD ADDRESS LD DE,SECSIZ ADD HL,DE LD (IOPB + PB_DMAO),HL ; LD HL,BIOSLN ;IF --CO+++++++++ RET NOP NOP ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; DISK ROM FUK ?DSKX JP DSKX SUBTTL MAIN FUNCTIONS ;---------------------------------------------------------------------------- ; OW ; ;---------------------------------------------------------------------------- ; ; BOOT CALLER HAS SWAPPED ROMS & STTOR TO DISK BOOT ROUTINE ; CP A,4 ;IF 8" FLOPPY DISK THEN EXIT JR C,F8BOOT ; CP A,8 ;IF HARD DISK THEN EXIT JP C,H8B+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ F3BOOT: EQU ABORT ;UNSUPPORTED ;++++++++++++++++++++++ WILL COMMAND THE CONTROLLER TO READ THE BIOS FROM THE DISK AND ; EXECUTE THE COLD START ENTRY IN THE BIOS. ; ;++++++++++++OR ; LD (IX + PB_SECO),BD_SEC LD (IX + PB_CMDO),PB_READC CALL DSKX CALL NZ,DBERR JP NZ,DKRET ; ; IF NOT DIRECTORYUNT != 0 THEN REPEAT DEC (HL) JR NZ,JADRDB IF DEBUG ; ; RETURN TO MONITOR ; OR A,A ;RETURN NO ERROR JP DKRET  0 %+ &, !'- "(. #)/ $*0 ELSE ; ; EXECUTE THE BIOS COLD START ENTRY ; LD HL,(BIOSNT) JP (HL) ENDIF SUBTTL DISK IOPB EXECUTOR ;+++++ DEC A ;IF MICROMATION THEN EXIT JP Z,M2X ; JP JADEX ;ELSE MUST BE JADE CONTROLLER ; ; ; DRIVE PORT TABLE ; DRVP+ JADEX: ; ; CHECK FOR CONTROLLER PRESENT ; EXX IN A,(C) EXX INC A ;0FFH IF NOT THERE JR Z,JCNP ; ; COMPUTEROMATION TO 3", ASSUME OK ; JADEOK: LD (IX + PB_DRVO),A PUSH HL LD HL,JADERET EX (SP),HL JP (HL) ;EXECUTE THE DRIVEE4 ;RETURN VERSION " " DW JTYPE5 ;SET DISK FLAGS SECTOR DATA BOTH WAYS DW JTYPE4 ;LOAD HEAD & IDLE IOPB ONLY DW JTYPE************************************************************* JSELERR: LD (IX + PB_STATO),PB_ILCMD JP DSKERR ;********ERROR THEN QUIT ; ; XFER DATA FROM CONTROLLER ; JT1A: EXX LD A,DD_MB0 ;SOFTLY GRAB RESOURCES WITHOUT INTERRUPT OUT (C)ADPB ;PASS BACK ERROR JP DSKERR ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETUR+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE DISK IOPB FUNCTION ; ENTRY- IX= IOPB RT: REPT 4 ;8" FLOPPY DRIVES DB DD_PORT8 ENDM REPT 4 ;8" HARD DISK DRIVES DB ?HSTATUS ENDM REPT 4 ;5" FLOPPY DR JADE CONTROLLER BASE ADDRESS ; DEC A ;FETCH ADDRESS SELECT SWITCH DATA AND A,DD_SASW RLCA OR A,HIGH DD_BASE EXX LR TYPE ; ; JADE ROUTINES RETURN HERE ; JADERET: POP HL ;RESTORE DRIVE BUT SAVE FLAGS (ERROR) LD (IX + PB_DRVO),H RE4 ;SEEK TRACK " " DW JTYPE5 ;SET DRIVE PARAMETERS SECTOR DATA BOTH WAYS DW JTYPE4 ;RETURN DRIVE STATUS IOPB ONLY DW JT******************************************************************** ; ; CONTROLLER NOT SENSED ERROR ; ;********************,A LD A,DD_MB1 ;OPEN WINDOW TO SECTOR BUFFER (BANK 1) OUT (C),A ; ; FETCH FDC ADDRESS ; PUSH HL EXX POP HL ; ; N NO ERRORS FUNCTION ; EXIT - A= 0 ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DSKOK: XOADDRESS ; EXIT - AF= 0: NO ERRORS ; ; A,BC,BC',HL,HL',DE= ? ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++IVES DB DD_PORT5 ENDM REPT 4 ;8" MICROMATION DOUBLER DRIVES DB 1 ENDM REPT 4 ;3" FLOPPY DRIVES DB DD_PORT3 ENDD H,A LD L,0 EXX ; ; USE COMMAND TO INDEX INTO DRIVER TABLE ; LD A,(IX + PB_CMDO) ;IF UNSUPPORTED COMMAND THEN ERROR T ;############################################################################ ; ; COMMAND TYPE TABLE ; ;###########YPE4 ;SET EIA BAUD RATE " " DW JTYPE4 ;CLEAR " " NJCMDS EQU ($ - JADETBL) / 2 ;********************************************************************************************* JCNP: LD (IX + PB_STATO),PB_CNP JP DSKERR ;++++++++++++++++++++ FETCH DESTINATION ADDRESS ; LD E,(IX + PB_DMAO) LD D,(IX + PB_DMAO + 1) ; ; FETCH XFER COUNT ; LD C,(IX + PB_BCNTOR A,A RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; TYPE 2 JADE COMMAND XFERS+++++++++++++++++++ DSKX: ; ; COMMAND OK, COMPUTE CONTROLLER PORT ; LD A,(IX + PB_DRVO) CP A,NDRVS ;IF DRIVE # OUT OFM NDRVS EQU $ - DRVPRT SUBTTL JADE FLOPPY CONTROLLER PRIMITIVES ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++ CP A,NJCMDS JR NC,DCMDERR ; LD E,A LD D,0 LD HL,JADETBL ADD HL,DE ADD HL,DE LD A,(HL) INC HL LD H,(HL) LD################################################################# JADETBL: DW JTYPE1 ;LOGON DISK RETURN SECTOR DATA DW JT*************************************** ; ; ILLEGAL COMMAND ERROR ; ;*******************************************************++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; TYPE 1 JADE COMMAND XFERS SECTOR DATA FROM CONTROLLER ; ENTRY-) LD B,(IX + PB_BCNTO + 1) ; ; IF COUNT > 1024 THEN ERROR ; LD A,B CP A,4 JR NC,JT1B ; ; ELSE IF COUNT > 0 THEN SECTOR DATA TO CONTROLLER ; ENTRY- IX= IOPB PTR ; HL'= CONTROLLER WINDOW PTR ; C'= CONTROLLER PORT ; EXIT - AF= 0: NO ERR RANGE THEN RETURN ERROR JP NC,JSELERR ; LD HL,DRVPRT ;CALULATE DRIVE PORT TABLE ELEMENT ADD A,L LD L,A LD A,0 ADC +++++++++++++++++++++ ; ; EXECUTE THE DISK IOPB FUNCTION ; ENTRY- IX= IOPB ADDRESS ; C'= CONTROLLER PORT ADDRESS ; EXIT -  L,A ; ; IF NEEDED, BIAS DRIVE DOWN ; LD A,(IX + PB_DRVO) PUSH AF ;SAVE FOR LATER RESTORATION ; CP A,4 ;IF 8" THENYPE1 ;READ SECTOR " " " DW JTYPE2 ;WRITE SECTOR SEND SECTOR DATA DW JTYPE2 ;FORMAT TRACK " " " DW JTYPE1 ;READ ********************* DCMDERR: LD (IX + PB_STATO),PB_ILCMD ; ; COMMON ERROR CODE ; DSKERR: LD A,-1 OR A,A RET  IX= IOPB PTR ; HL'= CONTROLLER WINDOW PTR ; C'= CONTROLLER PORT ; EXIT - AF= 0: NO ERRORS ; B, DE, HL= ? ; ;++++++++++ XFER DATA ; OR A,C JR Z,JT1 ; LDIR ; ; REMOVE JADE WINDOW BEFORE RETURNING ; JT1: EXX XOR A,A OUT (C),A EXXORS ; B, DE, HL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JTYPE2: ; ; OPEN WINA,H LD H,A LD A,(HL) ;FETCH CONTROLLER PORT EXX LD C,A EXX ; CP A,?HSTATUS ;IF HARD DISK THEN EXIT JP Z,ISHAX ;AF= 0: NO ERRORS ; ; A,BC,BC',HL,HL',DE= ? ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ NO NEED JR C,JADEOK ; SUB A,8 ;SKIP OVER 8" HARD DISK CP A,4 ;IF 5" THEN OK JR C,JADEOK ; SUB A,8 ;SKIP OVER MICADDRESS RETURN SECTOR DATA DW JTYPE4 ;EIA OUTPUT IOPB ONLY DW JTYPE4 ;EIA STATUS " " DW JTYPE4 ;IDLE " " DW JTYP;**************************************************************************** ; ; ILLEGAL DRIVE REQUESTED ; ;***************++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JTYPE1: ; ; EXECUTE COMMAND ; CALL JEX RET NZ ;IF  ; RET ; ; ; ILLEGAL IOPB FORMAT ERROR ; JT1B: CALL JT1 ;REMOVE CONTROLLER WINDOW BADIOPB: LD (IX + PB_STATO),PB_BDOW TO SECTOR BUFFER ; EXX LD A,DD_MB1 JT2A: OUT (C),A ; ; FETCH CONTROLLER ADDRESS FOR DESTINATION ; PUSH HL EXX 0 %+ &, !'- "(. #)/ $*0 POP DE ; ; FETCH SOURCE ADDRESS FROM IOPB ; LD L,(IX + PB_DMAO) LD H,(IX + PB_DMAO + 1) ; ; FETCH COUNT ; LD OPEN WINDOW TO COMMAND BUFFER (BANK 0) OUT (C),A ; ; COMPUTE OFFSET TO CDB ; PUSH HL EXX POP HL LD DE,DD_CBO AD+++++++++++++++++++++++++++++++++++++++ JGETRES: ; ; SELECT COMMAND BLOCK WINDOW ; EXX LD A,DD_MB0 OUT (C),A ; ; ; C'= CONTROLLER PORT ; EXIT - AF= 0: NO ERRORS ; B, DE, HL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++MMAND TO OUTPUT ; C'= PORT OF CONTROLLER ; EXIT - AF= 0: OK, /0: ERROR ; DE,HL= ? ; ;++++++++++++++++++++++++++++++++++++ ENDIF SUBTTL MICROMATION PRIMITIVES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; MICis ROM. ; ;**************************************************************************** ; ; Revision status: ; ; 1.0 - Relt. ; 1.7 - 8 FEB 86 GRH ; Remove time delay from power up reset code to allow ISHA to access ; ram. ; Remove the auto-boC,(IX + PB_BCNTO) LD B,(IX + PB_BCNTO + 1) ; ; IF COUNT > 1024 THEN ERROR ; LD A,B CP A,4 JR NC,JT1B ; ; ELSE ID HL,DE EX DE,HL ; ; IOPB ADDRESS IS SOURCE ; PUSH IX ;SET IOPB ADDRESS POP HL ; ; DOWNLOAD THE IOPB ; LD BC, COMPUTE IOPB LOCATION IN WINDOW ; PUSH HL EXX POP HL LD DE,DD_CBO + PB_STATO ADD HL,DE ; ; FETCH IOPB ADDRESS OF++++++++++++++++++++ JTYPE4: EQU JEX ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; ++++++++++++++++++++++++++++++++++++++++ JWAIT: ; ; ISSUE PASSED COMMAND ; EXX OUT (C),A EXX ; ; PAUSE A WHILE FROMATION DRIVER ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ M2X: EQU DSKERR SUBTTL ease ; 1.1 - ; Add Double D deselect upon reset code. ; Change printer port. ; 1.2 - 20 FEB 83 GRH ; Add delay before turot from reset function. ; ; 1.8 - 29 MAY 86 GRH ; Add Cromemco PRI printer driver as primary printer. ; Change IOBYTE defiF COUNT > 0 THEN XFER DATA ; OR A,C JR Z,JT2 ; LDIR ; JT2: ; ; FALL INTO THE JADE EXECUTION FUNCTION ; ;++++PB_STATO ;ONLY XFER PERTINENT BYTES LDIR ; ; EXECUTE THE COMMAND ; LD A,DD_EXC ;START COMMAND CALL JWAIT ;WAIT FOR C STATUS BYTES ; PUSH IX POP DE EX DE,HL LD BC,PB_STATO ADD HL,BC EX DE,HL ; ; COUNT = REMAINDER ; LD BC,PB_S TYPE 5 JADE COMMAND XFERS SECTOR BUFFER BOTH DIRECTIONS ; ENTRY- IX= IOPB PTR ; HL'= CONTROLLER WINDOW PTR ; C'= CONTROLLEOR CONTROLLER TO CATCH UP ; EX (SP),HL EX (SP),HL ; ; WAIT FOR TASK COMPLETION FOR A WHILE ; LD L,HNGTMO ;SET UP TIM TITLE M5b Z-80 MONITOR LIST NOCOND ;*************************************************************************** ; ; SYSTEMning off boot image, in case logic ; too slow. ; 1.3 - 17 MAR 84 GRH ; Change to allow Boot command parameter passing to nitions. ; Remove initialization of Jade FDC port 40H in anticipation of ; Cromemco bank select useage. ; ; 1.9 - 16 AUG 8++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE JADE IOPB FUNCTION ; ENTRY- IX= IOOMPLETION RET NZ ;IF ERROR THEN RETURN ERROR ; ; FALL INTO GET RESULTS FUNCTION ; ;++++++++++++++++++++++++++++++++IZE - PB_STATO ; ; UPLOAD STATUS BYTES ; LDIR ; ; RELEASE IOPB WINDOW ; EXX XOR A,A OUT (C),A EXX ; ; CHR PORT ; EXIT - AF= 0: NO ERRORS ; B, DE, HL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++OUT LD DE,0 JWAIT1: DEC DE ;IF NOT TIMOUT THEN CONTINUE TO WAIT LD A,E OR D JR NZ,JWAIT2 ; DEC L ;IF TIME OUT THEN MONITOR FOR M5b ; (c) 1982,1983 GRH ELECTRONICS, CUPERTINO, CA ; ;*********************************************************boot ROM. ; ; 1.4 - 2 JUN 84 GRH ; Fix bug in line printer status subroutine which hung the ; line printer by sensing th6 GRH ; Fix bug in PRI driver which caused new Oki 93 to be busy. ; ; 1.10- 8 FEB 87 GRH ; Fix bug in register restore rPB PTR ; HL'= CONTROLLER WINDOW PTR ; C'= CONTROLLER PORT ; EXIT - AF= 0: NO ERRORS ; B, DE, HL= ? ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; COMMAND EXECUTED, XFER RESULTS FUNCTION ; ENTRY- IX= IOPB PTR ; HL'= CONTECK FOR ERROR ; LD A,(IX + PB_STATO) OR A,A RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JTYPE5: CALL JTYPE2 ;XFER DATA DOWN AND EXECUTE RET NZ ;IF ERROR THEN RETURN JP JT1A ;XFER DATA BACK ;++++++++ RETURN TO MONITOR OR L JP Z,DSKERR ; JWAIT2: EXX IN A,(C) ;IF NOT DONE THEN WAIT EXX AND A,DD_SHLT JR NZ,JWAIT1 ****************** ; ; This Monitor program resides at the top of memory & allows memory ; modification & testing, program bre status incorrectly. ; 1.5 - 29 SEP 85 GRH ; Fix bug in Input command which caused monitor to crash. ; The jump to 'BITSoutine which caused IX & IY to be ; swapped prior to GOTO. ; Change restart error to vector to breakpoint after message. ; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JEX: ; ; OPEN WINDOW TO COMMAND BUFFER ; EXX LD A,DD_MB0 ;ROLLER WINDOW PTR ; C'= CONTROLLER PORT ; EXIT - AF= 0: NO ERRORS ; B, DE, HL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++ ; ; TYPE 4 JADE COMMAND XFERS IOPB ONLY TO/FROM CONTROLLER ; ENTRY- IX= IOPB PTR ; HL'= CONTROLLER WINDOW PTR ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; WAIT ON JADE CONTROLLER BUSY FUNCTION ; ENTRY- A= CO ; RET ;RETURN ZF IF ($ AND 7FFFH) >= (0FC00H AND 7FFFH) CONMSG *** JADE DEPENDENT CODE OVERLAPS CONTROLLER MAP *** eakpoints, console, printer, punch & ; reader I/O drivers and transfer to system boot ROM residing in same memory ; area as th2' expects DE to be on stack. ; 1.6 - 6 DEC 85 GRH ; Add code to disable all Jade controllers from 40H to 43H after ; reseVERSN EQU '10' ;**************************************************************************** FORM FALSE EQU 0 TRUE EQU NOT !0 %+ &, !'- "(. #)/ $*0FALSE LSTINC EQU FALSE ; ; INCLUDE SYSTEM DEFINITION FILES ; ;*INCLUDE NAKEDT.DEF ;*INCLUDE MONBOARD.DEF ;*INCLUDE BIGZ========================= IOBYTE EQU 3 ;ADDR OF I/O CONTROL BYTE IOBYTV EQU 00H ;DEFAULT IOBYTE VALUE ; SPSV EQU 6 ;STACKLE INPUT READER JP RI ;READER CONOUT JP CO ;CONSOLE OUTPUT PUNCH JP PUNO ;PUNCH LIST JP LO ;LIST OUTPUT CONST JP CSTS  COLD INITIALIZATION CODE ; ;-------------------------------------- INIT: ; ; INSURE INTERRUPTS DISABLED ; DI ; ; ; LD A,H ; /1024 SRL A SRL A LD C,0 ;TENS COUNT = 0 MEMLP: SUB 10 ;NUMBER = NUMBER - 10 JR C,MEM1 ; INC C ;IF REGISTER IMAGES TO 0 ; LD D,10 INIT2: PUSH BC DEC D JR NZ,INIT2 ; ; INITIALIZE BIG Z 8251 ; XOR A ;GET IT'S ATTER WINIT ;GO TO MONITOR EXEC ;**************************************************************************** ; ; MEMSIZ SUB****************************************************************** ; ; MEMCHK SUBR FINDS THE CURRENT TOP OF CONTIGUOUS MEMORY.DEF ;*INCLUDE JDDCONT.DEF ;*INCLUDE IOBOARD.DEF ;*INCLUDE PRI.DEF ; LIST OFF *INCLUDE NAKEDT.DEF *INCLUDE MONBOARD.DEF  PTR SAVE LOCATION ; ; REGISTER STORAGE DISPLACEMENTS FROM NORMAL SYSTEM ; STACK LOCATION. ; ALOC EQU 15H BLOC EQU 13H CL;CONSOLE STATUS JP IOCHK ;PUT IOBYTE INTO A JP IOSET ;(C) HAS NEW IOBYTE JP MEMCK ;MEMORY LIMIT CHECK JP RTS ;IODEF-REMOVE PAGE 0 IMAGE ; OUT COLDRES,A ; ; INITIALIZE RESTART VECTORS IN PAGE 0 ; LD SP,3FH ;USE STACK TO INIT RESTARTS < 10 THEN C = TENS DIGIT JR MEMLP ; MEM1: ADD '0' + 10 ;CONVERT TO + ASCII # LD B,A LD A,C ;IF TENS = 0 THEN OUTPUT SPANTION 1ST LD B,5 URTLP: OUT (BZUDAT),A EX (SP),HL ;DELAY A WHILE EX (SP),HL DJNZ URTLP LD A,BZUMOD ;OUTPUT MODE BYTER CALCULATES THE TOP OF CONTIGUOUS RAM. IT SEARCHES FROM ; THE BOTTOM UP UNTIL A NON-RAM LOCATION IS FOUND. IT THEN TAKES OFF F (LESS THE ; MONITOR WORKSPACE) & RETURNS THE VALUE. ; EXIT - B= HIGH BYTE OF RAM ; A= LOW BYTE OF RAM ; ;**************** *INCLUDE BIGZ.DEF *INCLUDE JDDCONT.DEF *INCLUDE IOBOARD.DEF *INCLUDE PRI.DEF LIST ON ;============================ ; ; OC EQU 12H DLOC EQU 11H ELOC EQU 10H FLOC EQU 14H HLOC EQU 31H LLOC EQU 30H PLOC EQU 34H SLOC EQU 17H TLOC EQU 35H TLOC DEFINE USER I/O ENTRY POINTS JP RTS ;SPECIAL I/O CONTROL JP REST ;BREAKPOINT ENTRY LPSTAT: JP LSTAT ;LINE PRINTER STATU LD HL,0C300H LD DE,RSTER LD B,16 ;64 BYTES INIT1: PUSH DE PUSH HL DJNZ INIT1 ; ; SET TEMPORARY STACK ; LD SP,CE ADD '0' CP '0' JR NZ,NOT0 LD A,' ' NOT0: LD C,A CALL CO LD C,B CALL CO LD C,'K' CALL CO CALL CRLF  OUT (BZUCMD),A LD A,BZUCM ;OUTPUT COMMAND BYTE OUT (BZUCMD),A IN A,(BZUDAT) ;READ ANY GARBAGE CHAR ; ; INSERT I/O OR ; MONITOR WORK SPACE NEEDS. ; EXIT - HL= MEMTOP PTR ; ;****************************************************************************************************************************** MEMCK: PUSH HL CALL MEMSIZ ;GET THE RAM SIZE LD A,L ;TAKE OF ASSEMBLE TIME VARIABLES ; ;============================ ROM EQU 0F800H ;ROM START ADDR WSVEC EQU 0 ;VECTOR NUMBER FOR WAX EQU 25H LLOCX EQU 20H ; APLOC EQU 9 BPLOC EQU 11 CPLOC EQU 10 DPLOC EQU 13 EPLOC EQU 12 FPLOC EQU 8 HPLOC EQU 15 LPLS RETURN DS 6 ;SAVE 2 SPARES ;------------------------------------------------ ; ; THE FOLLOWING CODE MUST RESIDE AT T80H ; ; REMOVE JADE DOUBLE D WINDOW(S) ; LD A,DDFREE ;REMOVE DD WINDOW, IF PRESENT OUT (41H),A OUT (42H),A OUT (43HPOP HL ;MEMTOP ; ; CONTINUATION OF THE SCS MONITOR, MOVE EXIT ROUTINE TO RAM ; LD SP,HL LD DE,EXIT EX DE,HL INIT CODE HERE ; ; ; OUTPUT SIGN-ON MESSAGE ; LD HL,LOGMSG ;OUTPUT SIGN-ON CALL PRTWD JR WINIT ; ; SPECIAL DISK ********** MEMSIZ: PUSH BC ;MONITOR START LOCATION LD BC,ROM LD HL,-1 MEMSZ1: INC HL LD A,(HL) CPL LD (HL),A CP (F WORKSPACE SUB 60 JR NC,MEMCK0 DEC H MEMCK0: LD B,H POP HL RET ;************************************** ; ; EXF RM RESTART NBKPTS EQU 2 ;NUMBER OF BREAKPOINTS ;============================ ; ; CONSTANTS ; ;=======================OC EQU 14 XLOC EQU 7 YLOC EQU 5 RLOC EQU 2 ILOC EQU 3 SUBTTL MAIN PROGRAM ORG ROM ;------------------------------------HE SAME ; ADDR AS THE BOOT ROM START CODE. ; ;------------------------------------------------ DBOOT: LD A,C ;PERFORM SWAP ),A ; ; INITIALIZE IOBYTE ; LD C,IOBYTV ;SET TO INITIAL IOBYTE VALUE CALL IOSET ; ; SIZE AND DISPLAY MEMORY ; LD LD BC,ENDX - EXIT LDIR ; LD BC,NBKPTS * 3 ;CONTINUE 'JP 0' FOR 3 TIMES PUSH DE POP HL DEC HL LDIR ; LD HL,-24 BOOT CODE SWAPS ROMS FOR BOOT ; IF BOOT SUCCESSFUL, DOES NOT RETURN. ; IF UNSUCCESSFUL, RETURNS CARRY IF ERROR, NO CARRY IF DIHL) CPL LD (HL),A JR NZ,MEMSZ2 ; LD A,H ;SEE IF ON MONITOR BORDER CP B JR NZ,MEMSZ1 MEMSZ2: DEC HL ;TAKE OFF WORSUBR. READS 1 PARAMETER. ; ENTRY- A= PARAMETER 1ST CHAR ; EXIT - STACK= PARAMETER ; ;************************************** ===== CTRLS EQU 13H ;ASCII DC3 CR EQU 0DH LF EQU 0AH BELL EQU 7 ;============================ ; ; VARIABLES ; ;===-- ; ; JUMP TARGETS FOR BASIC I/O ; ;-------------------------------------- CBOOT JP INIT ;COLD START CONIN JP CI ;CONSO AND 7 ;CLEAR ERROR MSG IN CASE ROM NOT THERE & MASK OUT ROMSEL,A RET ;-------------------------------------- ; ; THE HL,USRMSG ;OUTPUT MEMORY= CALL PRTWD CALL MEMSIZ ;OUTPUT MEMORY SIZE PUSH HL ;SAVE VALUE FOR LATER ; ; COMPUTE # KS  ADD HL,SP PUSH HL INC HL ;ADJUST USER STACK LOCATION INC HL LD (SPSV),HL ;SAVE INITIAL STACK VALUE ; ; INITIALIZE SK NOT INSERTED. ; BOOTCD: LD C,XDBROM ;PASS IN DEFAULT BOOT ROM ADDR BOOTCC: CALL DBOOT LD HL,BOOTEM CALL C,PRTWD ; JKSPACE LD BC,EXIT-ENDX-3*NBKPTS+1 ;EXIT RTN + BP JUMPS ADD HL,BC POP BC ;UNPREDICTABLE DURING INIT RET ;********** EXF: LD B,1 ;SET 1 PARAM LD HL,0 JR EX1 ;1ST CHAR IN A ALREADY ;******************************************************!0 %+ &, !'- "(. #)/ $*0********************** ; ; EXPR SUBR. READS PARAMETERS FROM THE CONSOLE & DEVELOPS A 16 BIT HEX ; FOR EACH ONE. A CARRIAGE REJR C,EX2 ;IF NOT NUMBER THEN EXIT ADD HL,HL ;PARAM = PARAM * 16 ADD HL,HL ADD HL,HL ADD HL,HL OR L ;ADD IN NEW DIGIVICE. ; ; Ax ;x= C,R,P,L (CONSOLE,READER,PUNCH,LIST) ; Ax-y ;y= C: T,C,B,1 (TTY,CRT,BAT,UC1) ; R: T,P,1,2 (TTY,PIT ;RESET RETURN & WARM START VECT PUSH HL LD (WSVEC + 1),HL LD A,0C3H LD (WSVEC),A CALL CRLF CALL DECHO ;GET COMMA------------------------------------------------------- FILL: CALL EXPR3 ;GET 3 PARAMS FIO: LD (HL),C ;PUT DOWN THE FILL VAL**************************** ; ; SET IOBYTE SUBR ; ENTRY- C= NEW IOBYTE VALUE ; ;************************************** IO--------------------------------------------------------------------- BYE: LD B,2 ;SET UP FOR 2 CHARS BYE1: CALL CONI CP BE(BC) ;GET SOURCE 2 DATA PUSH BC ;SAVE SOURCE 2 PTR LD B,(HL) ;GET SOURCE 1 DATA CP B ;IF S2=S1 THEN EXIT JR Z,CMPB TURN WILL TERMINATE THE ENTRY SEQUENCE. A BLANK ; OR COMMA WILL END THE CURRENT PARAMETER ENTRY. EACH PARAMETER ONLY TAKES ; TT LD L,A JR EX0 ;GET NEXT ; EX2: EX (SP),HL ;PUT UNDER RETURN ADDR ON STACK PUSH HL LD A,C ;IF LAST CHAR = DELIM THTR,UR1,UR2) ; P: T,P,1,2 (TTY,PTP,UP1,UP2) ; L: T,L,1,2 (TTY,CRT,LPT,UL1) ; ;-----------------------------------ND SUB 'A' ;IF CHAR <> 'A' -> 'F' THEN ERR JR C,QPRT CP 'Z' - 'A' + 1 JR NC,QPRT ADD A,A ;OFFSET = INDEX * 2 LD E,UE CALL HILO ;INC & CHECK THE PTR JR NC,FIO POP DE ;RESTORE SP IN CASE STACK JR WINIT ; WAS OVERWRITTEN ;--------SET: LD A,C LD (IOBYTE),A ;SAVE NEW ASSIGNMENTS RET ;******************************************* ; ; RETURN IOBYTE VALULL ;IF NOT BELL THEN RESTART JR NZ,BYE CALL ECH1 ;ECHO THE BELL DJNZ BYE1 RET ;------------------------------------ PUSH AF ;SAVE S2 DATA CALL LADRB ;OUTPUT ADDR LD A,B CALL DASH1 ;FORMAT POP AF CALL HEX1 ;OUTPUT S2 CMPB: POP BCHE LAST 4 DIGITS TYPED IN. ANY EXCESS IS DISCARDED. A NON-HEX DIGIT WILL ; TERMINATE THE ENTRY SEQUENCE & CAUSE A WARM BOOT OF EN EXIT CALL P2C JR NC,EX3 DJNZ QPRT ;ELSE IF MORE REQ'D THEN ERR RET ;ELSE RETURN ;----------------------------------------------------------------------- ASGN: CALL ECHO ;GET THE LOGICAL DEVICE DESIRED LD HL,ALT ;START OF CONVERSION TAA LD D,0 LD B,2 ;PASS IN 2 PARAMS TO HANDLER LD HL,TBL ;ADDRESS = (TABLE + OFFSET) ADD HL,DE LD A,(HL) INC HL L-------------------- ; ; ASSIGN CONTINUED ; ;---------------------------- AS1: LD D,B ;SAVE THE COUNTER RESIDUE LD B,4 E SUBR ; EXIT - A= CURRENT IOBYTE VALUE ; ;******************************************* IOCHK: LD A,(IOBYTE) RET ;-------------------------------------------- ; ; VERIFY MEMORY COMMAND ; ; THIS ROUTINE COMPARES 2 BLOCKS OF MEMORY AGAINST EACH CALL HILOXB JR CMPA ;---------------------------------------------------------------------------- ; ; DISPLAY MEMORY CTHE MON. ; ENTRY- B= # OF PARAMETERS NEEDED ; EXIT - STACK= PARAMETERS ; ;**************************************************---------------------------------------------- ; ; LOGICAL ASSIGNMENT OF PERIPHERALS COMMAND ; ; THIS COMMAND CONTROLS THE ABLE LD DE,APT - ALT ; # OF ELEMENTS LD B,4 ; COUNT = # ENTRIES AS0: CP (HL) ;IF CHAR = TABLE[LOGICAL] THEN JR Z,AS1 ; D H,(HL) LD L,A JP (HL) ;---------------------------------------------------------------------------- ; ; FILL MEMORY C CALL DECHO ;GET NEW ASSIGNMENT AS2: INC HL ;PTR = PTR + 1 CP (HL) ;IF CHAR <> (TABLE) THEN EXIT JR NZ,AS3 LD L,B ;------------------------------------------------------------------------ ; ; SLEEP COMMAND ; ; THE BYE ROUTINE IS USED TO PR OTHER. IF A ; DIFFERENCE IN THE RELATIVE ADDRESS CONTENTS IS DETECTED, THE ADDRESS OF THE ; 1ST BLOCK IS DISPLAYED, ALONG WITOMMAND ; ; THIS ROUTINE DISPLAYS A BLOCK OF MEMORY ON THE CONSOLE DEVICE. THE ; USER MUST SPECIFY THE START & FINISH ADDRESSE************************** AS3: DJNZ AS2 ;PART OF THE ASSIGN CODE EX3: JR NZ,QPRT ;NON 0 IS ERR EXPR1: DEC B ;IF NO PARAMSSSIGNMENT OF PHYSICAL PERIPHERALS TO THE ; 4 LOGICAL DEVICE TYPES. IT ALTERS (IOBYTE) TO MATCH THE CURRENT ASSIGNMENT. ; THE 4 EXIT ADD HL,DE ;ELSE NEXT LOGICAL ENTRY DJNZ AS0 QPRT: LD HL,QMSG ;OUTPUT ? MESSAGE CALL PRTWA ;-------------------OMMAND ; ; THIS ROUTINE FILLS A BLOCK OF MEMORY WITH A USER DEFINED CONSTANT. IT ; EXPECTS 3 PARAMETERS TO BE ENTERED IN THE SAVE THE RESIDUE TO FORM ASGNT DEC L LD B,D LD H,3 DEC B JR Z,AS5 ;NO SHIFT NEEDED AS4: ADD HL,HL ;SHIFT MASKS EVENT UNAUTHORIZED USAGE OF THE SYSTEM. ; THE SYSTEM LOCKS UP & WILL NOT RESPOND TO ANYTHING OTHER THAN 2 ASCII BELL ; CHARACTH IT'S CONTENTS & THE CONTENTS OF THE ; OTHER BLOCK'S SAME RELATIVE ADDRESS. ; ; V ; ;---------------------ADD HL,HL DJNZ AS4 AS5: LD A,(IOBYTE) OR H XOR H ;LOGICAL BITS NOW OFF OR L ;PUT IN NEW VALUE LD C,A ;**********ERS. WHEN IT SEES THEN CONSECUTIVELY, CONTROL IS RETURNED TO THE ; MONITOR WITHOUT ALTERING ANYTHING. ; ; Z ; ;-------F_VERIFY_BLOCK> ; ;---------------------------------------------------------------------------- COMP: CALL EXPR3 CMPA: LD A,ME LAST HEX DIGIT IN IT'S ADDR. ; ; D[ ] ; ;---------------------------------------------------------"0 %+ &, !'- "(. #)/ $*0------------------- DISP: CALL EXLF ;GET BLOCK LIMITS DIS1: CALL LADRB ;DISPLAY START ADDR LD A,L ;SEE IF ON 16 BYTE BOUNSTART ASCII CALL TRPLSP JR DIS3 ; TRPLSP: AND 0FH ;ISOLATE LOW NIBBLE LD B,A ;PREPARE TO SPACE OVER TO RIGHT ADD A,AOINT AT BP2 ; G,[,] ;START EXECUTION AT PC VALUE WITH BREAKPOINT(S) AT ; BP1 & OPTIONAL BP2. ; ;--------------SP ; GO1: PUSH BC ;SAVE BREAKPOINTS REMAINING ; PUSH HL ;STORAGE PTR LD B,2 CALL EXPR1 POP DE ;GET TRAP ADDR POPRT BREAKPOINT VECTOR TO RST 8 ; LD HL,REST LD (9),HL ;SET BP VECTOR ADDR ; ; RESTORE ROUTINE IS ON STACK, SO COMPUTE E ;-------------------------------------- ; ; OUTPUT DATA TO PORT COMMAND ; ; O ; ;-------- ; ; BOOT COMMAND ; ALLOWS EXECUTION OF A BOOT PROM ; ; B<(ARG * 10H) + PROM #> ; ARG :: 0..FH (PASSED TO BOOT ROM) ;TO THE NEXT LOCATION & PRESENTS THE USER WITH AN ; OPPORTUNITY TO ALTER IT. ; ; S ; ;-------------------------------DARY CALL TRPLSP ;SKIP OVER TO RIGHT COLUMN PUSH HL DIS2: LD A,(HL) ;GET CONTENTS CALL HEX1 CALL HILO ;INC & CHECK P ; COLUMN ADD B TRPL2: LD B,A INC B TRPL1: CALL BLK ;DO SPACING DJNZ TRPL1 RET ;---------------------------------------------------------------------------------------------- GOTO: ; ; IF NO ARGS THEN USE CURRENT REGISTERS ; CALL PC HL ;SPTR ; LD A,D ;INSURE 0 WASN'T SPEC'D OR E JR Z,GO2 ; LD (HL),E ;SAVE BP ADDR INC HL LD (HL),D INC HL ;NTRY ADDRESS ; LD HL,24 ;FIND REG SET ROUTINE ADDR ADD HL,SP ; ; EXECUTE THE RESTORE & GOTO ; POP DE ;ADJUST STACK-------------------------------- OUPT: CALL EXPR ;GET DATA INTO E, PORT # INTO C POP DE POP BC OUT (C),E RET ;----- PROM # :: 0..7 (DEFAULT # = 02H) ; ;------------------------------------------------ BOOTC: CALL PCHK ;IF NO FURTHER INPU--------------------------------------------- SUBS: CALL EXPR1 ;GET ADDR CALL CRLF ;START ON NEW LINE POP HL SUB1: LD A,TR JR C,DIS7 ;DONE IF CARRY CALL BLK ;MAKE COLUMNS LD A,L ;READY FOR NEW LINE? AND 0FH JR NZ,DIS2 DIS3: POP HL ;R-------------------------------------------- ; ; GOTO COMMAND ; ; GOTO COMMAND TRANSFERS CONTROL TO A SPECIFIED ADDRESS IT AHK ;SEE IF OD ADDR WANTED JR C,GO3 ; ; IF NO GOTO ADDRESS THEN SET BREAKPOINTS ; JR Z,GO0 ;YES, BUT SET BP ; ; FE LD A,(DE) ;SAVE BP ADDR INSTRUCTION LD (HL),A INC HL ; LD A,0CFH ;INSERT THE BP LD (DE),A ; ; IF NO MORE ARGS  JP (HL) ;GO DO REG RESTORE ;---------------------------------------------------------------------------- ; ; INPUT FR----------------------------------------------------------------------- ; ; MOVE COMMAND ; ; THIS ROUTINE EXPECTS 3 PARAMETET THEN USE DEFAULT JP C,BOOTCD CALL EXF ;GET USER BOOT # POP BC JP BOOTCC ;-----------------------------------------(HL) ;OUTPUT EXISTING CONTENTS CALL DASH1 CALL PCHK ;GET NEW VALUE RET C ;IF CHAR = CR THEN RETURN JR Z,SUB2 ;IF CHAESTORE START OF LINE LD A,L ;SKIP OVER TO RIGHT SPACE AND 0FH CALL TRPL2 DIS4: LD A,(HL) ;OUTPUT MEMORY IN ASCII AND LLOWS THE ; SELECTIVE SETTING OF UP TO 2 BREAKPOINTS AS WELL AS ALLOWING ANY CONSOLE ; INPUT TO BREAKPONT THE RUN, AS LONG AS TCH NEW GOTO ADDRESS & PUT INTO 'PC' REGISTER ; CALL EXF ;GET NEW GOTO ADDR POP DE LD HL,PLOC ;PUT ADDR IN PC LOCATION THEN DONE WITH BREAKPOINTS ; GO2: LD A,C ;IF CHAR = CR THEN DONE BPING CP CR POP BC JR Z,GO3 ; ; IF MORE ALLOWED THOM PORT COMMAND ; ; THESE ROUTINES ALLOW BYTE-BY-BYTE INPUT OR OUTPUT FROM THE CURRENT ; CONSOLE DEVICE. ; ; I ;START EXECUTION AT WHATEVER IS IN PC REG (NO BPS) ; G ;START EXECUTION AT ST ADD HL,SP LD (HL),D DEC HL LD (HL),E ; ; IF LAST CHAR == CR THEN NO MORE ARGS ; LD A,C ;IF LAST = CR THEN EXIT EN CONTINUE ; DJNZ GO1 ;ELSE IF <2 BPS THEN LOOP ; ; GOT ALL ARGS, EXECTUTE THE GOTO ; GO3: CALL CRLF ;NEW LINE FOR P> ; ;---------------------------------------------------------------------------- INPT: CALL EXPR1 ;GET INPUT PORT # INTO C T_ADDR> ; ;---------------------------------------------------------------------------- MOVE: ATION & ALTER ; THE CONTENTS, IF DESIRED & IF THE ADDRESS IS IN RAM. THE CONTENTS MAY BE ; LEFT UNALTERED BY ENTERING A SPACE,E ;NEW VALUE POP HL ;PTR LD (HL),E ;LOAD VALUE LD A,C ;IF DELIM = CR THEN DONE CP CR RET Z SUB2: INC HL ;PTR = PCONOUT CALL HILOX LD A,L ;READY FOR NEW LINE? AND 0FH JR NZ,DIS4 ;NO JR DIS1 ;YES ; DIS7: SUB A,E ;SKIP OVER TO ART_ADDR (NO BPS) ; G,[,] ;START EXECUTION AT START_ADDR WITH ; BREAKPOINT AT BP1 AND OPTIONAL BREAKP CP CR JR Z,GO3 ; ; GET & SET UP TO NBKPTS BREAKPOINTS ; GO0: LD B,NBKPTS LD HL,TLOC ;POINT TO TRAP STORAGE ADD HL,GM ; POP HL ;GET RID OF STACK JUNK ; ; PASS IN LOCATION OF RESTORE ROUTINE ; LD HL,RS9 PUSH HL ; ; INSERT RESTA CALL CRLF ;PUT DATA ON NEW LINE POP BC IN E,(C) PUSH DE ;FIX BUG. BITS2 POPS DE BEFORE 'RET' JR BITS2 ;OUTPUT VALUECALL EXPR3 MOV1: LD A,(HL) ;MOVE 1 BYTE LD (BC),A CALL HILOXB JR MOV1 ;---------------------------------------------- COMMA OR RETURN. IF A RETURN IS ; ENTERED, THE ROUTINE IS TERMINATED. IF A SPACE OR COMMA IS ENTERED, THE ; ROUTINE PROCEEDS TR + 2 INC HL SUB3: DEC HL ;PTR = PTR - 1 LD A,L ;IF ON MOD 8 BOUNDARY THEN AND 7 ; OUTPUT ADDR CALL Z,LADRB JR S"0 %+ &, !'- "(. #)/ $*0UB1 ;---------------------------------------------------------------------------- ; ; MTEST COMMAND TESTS A SPECIFIED BLOCKJNZ BITS1 POP DE RET ;---------------------------------------------------------------------------- ; ; EXAMINE REGISTERL) JR NZ,XAA ;NO MATCH, TRY AGAIN CALL BLK CALL PRTVAL CALL DASH CALL PCHK ;GET NEW INPUT RET C ;IF CHAR = CR THEXMNE1 ; XG: LD A,(HL) LD C,A INC A ;IF AT END OF TABLE THEN RETURN RET Z CALL M,CRLF ;NEW LINE IF BIT 7 SET CALL C: CALL HEX1 ;OUTPUT VALUE DEC DE ;MEM PTR DJNZ PV1 RET FORM SUBTTL GENERAL PURPOSE SUBROUTINES ;************************* DECHO: CALL DASH ;OUTPUT A '-' ECHO: CALL CONI ECH1: PUSH BC LD C,A ;OUTPUT CHAR CALL CONOUT LD A,C ;RESTORE  SET ACCORDINGLY. ; ;**************************************************************************** HILO: INC HL LD A,H ;IF  CP CTRLS JR NZ,HILOD JP CONI ;ELSE WAIT FOR NEXT CHAR ;************************************************************** OF MEMORY TO SEE IF ANY HARD ; DATA BIT FAILURES EXIST. IT IS NOT AN EXHAUSTIVE TEST, BUT JUST A QUICK ; INDICATION OF THE MES COMMAND ; INSPECTS THE VALUES OF THE REGISTERS STORED BY THE LAST ENCOUNTERED ; BREAKPOINT. THE VALUES MAY BE MODIFIED IF DEN RETURN JR Z,XF ;IF NO CHANGE THEN EXIT PUSH HL ;PTR CALL EXF POP HL LD A,L INC DE LD (DE),A EX (SP),HL ;RECONOUT CALL DASH CALL PRTVAL CALL BLK INC HL ;NEXT ENTRY JR XG ; PRTVAL: INC HL ;NEXT ENTRY LD A,(HL) ;GET OFFSE********************************************************* ; ; CONV ROUTINE CONVERTS THE LOW ORDER NIBBLE OF THE ; ACCUMULATOCHAR IN A POP BC RET ;*************************************************************** ; ; EXPR3 ROUTINE GETS 3 PARAMEHL = 0 THEN RETURN CF OR L SCF RET Z LD A,E ;ELSE COMPARE HL TO DE SUB L LD A,D SBC A,H RET ;************** ; ; NIBBLE ROUTINE CONVERTS THE ASCII CHARACTERS 0-9 & A-F ; TO THEIR EQUIVALENT HEX VALUE. IF THE CHARACTER IS NOT IN ; MORY'S OPERATIVENESS. ; ; T ; ;---------------------------------------------------------------------SIRED. ; ; X ;DISPLAY ALL REGISTER VALUES ; ;r= A,B,C,D,E,F,H,L,M,P,S,I,'A,'B,'C,'D,'E,'H,'L,'M,X,Y,R ; ;d= HEX NUMBER TO PLACE INTO REGISTER r ; ;---------------------------------------------------------------------------- XAAR, DO OTHER 8 BITS LD A,H LD (DE),A XE: POP HL ;TABLE PTR XF: LD A,C ;IF LAST = CR THEN RETURN CP CR RET Z ; ; T,0 ADD HL,SP EX DE,HL LD A,(HL) ;NOW FIND ATTRIBUTES LD B,1 ;SINGLE REG VALUE RLCA JR NC,PV1 ;IF SINGLE REG THEN **************************** CONV: AND 0FH ADD A,90H ;PUT INTO ASCII ZONE DAA ;AH, THE UBIQUITOUS DAA CONVERT ADC A,40***** EXPR3: INC B ;B HAS 2 ALREADY CALL EXPR POP BC POP DE JP CRLFA ;GO DO CRLF ;******************************OL TO THE MONITOR EXEC. OTHERWISE, ; CONTROL RETURNS TO THE CALLING ROUTINE. ; ;********************************************'0' RET C CP 'G' - '0' CCF RET C CP '9' - '0' + 1 CCF RET NC SUB 'A' - '9' - 1 CP 10 RET ;*************R IF NOT MTEST2: POP AF ;RESTORE BYTE LD (HL),A CALL HILOX JR MTEST1 ; BITS: PUSH DE LD E,A CALL LADRB ;OUTPUT AD: INC HL ;SKIP OVER TO NEXT ENTRY INC HL XA: INC (HL) ;IF AT END OF TABLE THEN RETURN RET Z JP P,XAB ;SORT OUT BIT 7 OHIS IS THE ACTUAL COMMAND ENTRY POINT ; XMNE: LD HL,ACTBL ;ADDR OF REG LOOK-UP TABLE XMNE1: CALL PCHK JR C,XG ;IF CHAR = CEXIT INC B ;ELSE REG PAIR RLCA ;IF NOT (HL) THEN EXIT JR NC,PV1 PUSH HL ;BUILD ADDR IN HL LD A,(DE) LD H,A DECH DAA LD C,A RET ;*************************************************************** ; ; ECHO ROUTINE READS A BYTE FRO********************************************** ; ; HILO ROUTINE INCREMENTS HL. IT THEN CHECKS FOR (& DISALLOWS) A ; WRAP-AROU************** HILOD: POP DE ;GET RID OF RETURN ADDR RET ;RETURN TO MONITOR HILOXB: INC BC HILOX: CALL HILO JR C,H*************************************************************** ; ; PCHK ROUTINE READS A CHARACTER FROM THE CONSOLE, THEN CHECDR BITS2: LD B,8 ;BIT COUNT BITS1: LD A,E RLCA LD E,A LD A,'0' / 2 ;BUILD ASCII 1 OR 0 RLA LD C,A CALL CONOUT DF TABLE OR 80H ;SET IT ON TEST VALUE JR XAC ; XAB: AND 7FH ;RESET BIT 7 XAC: DEC (HL) ;TO BE PULLED OUT IN ROM CP (HR THEN SHOW ALL JR Z,XMNE1 ;IF CHAR = ' ' OR ',' THEN LOOP CP '''' ;IF NOT PRIMES THEN EXIT JR NZ,XA LD HL,PRMTB JR  DE LD A,(DE) LD L,A LD A,(HL) ;GET (HL) VALUE POP HL DJNZ PV2 ;ALLWAYS JUMP PV1: LD A,(DE) ;GET REG CONTENTS PV2M CONSOLE DEVICE & ECHOS ; THE CHAR BACK TO THE CONSOLE DEVICE. ; ;*********************************************************ND SITUATION. IF IT OCCURS, THE CARRY BIT WILL BE SET ON RETURN. ; IF NO WRAP-AROUND OCCURRED, HL IS COMPARED TO DE & THE FLAGSILOD ;DONE IF CF CALL CONST ;IF NO CONSOLE BREAK THEN OR A ; RETURN RET Z CALL CONI ;IF CHAR <> CTRL-S THEN BREAK KS IT FOR A ; DELIMITER. IF IT IS NOT A DELIMITER, A NON-ZERO CONDITION IS RETURNED. IF ; IT IS A DELIMITER, A ZERO CONDITION #0 %+ &, !'- "(. #)/ $*0IS RETURNED. FURTHER, IF THE DELIMITER ; IS A CR, THE CARRY FLAG IS SET. A BLANK OR A COMMA RESETS THE CARRY FLAG. ; ;*******. ; ;**************************************************************************** REST: ; ; SAVE 8080 REGS FIRST SO WE CA IF SOFTWARE TRAP INC HL LD A,(HL) SBC A,B ;MAYBE, TRY REST OF ADDR JR Z,RS5 ;FOUND 1, RESET IT ; RS3: INC HL ;NOT  SKIP RESTORE OR D JR Z,RS8 ; LD A,(HL) ;ELSE RESTORE ORIGINAL INSTR. LD (DE),A ; RS8: INC HL ;DO NEXT BP DJNZ RS----------------------------------------------------------------------- EXIT: ; ; FIRST RESTORE THE Z80 UNIQUES ; POP BC THE MONITOR. THE I/O ERROR CAUSES THE ; I/O ASSIGNMENTS TO BE RESET TO THE DEFAULT ASSIGNMENT. ; ;--------------------------- COMERR: CALL PRTWD JP WSVEC ;**************************************************************************** ; ; QUERY T ENTRY DJNZ QUE1 RET ;******************************************************************** ; ; CONI ROUTINE READS TH********************************************************************* PCHK: CALL ECHO P2C: CP ' ' ;IF CHAR = ' ' THEN RETURN N WORK ; PUSH HL PUSH DE PUSH BC PUSH AF ; ; GET THE MONITOR STACK LOCATION ; CALL MEMSIZ ; ; SET UP PTR TO FOUND, TRY NEXT 1 INC HL DEC D JR NZ,RS2 ; RS4: INC BC ;NONE FOUND ; RS5: LD HL,LLOCX ; POP DE ADD HL,SP LD (H7 ; ; SAVE THE Z80 UNIQUES ; EX AF,AF' EXX PUSH HL PUSH DE PUSH BC PUSH AF PUSH IX PUSH IY LD A,I LD B, LD A,C LD R,A LD A,B LD I,A POP IY POP IX POP AF POP BC POP DE POP HL ; ; NOW DO THE 8080 REGS ; EX -------------------------------------------------- IOER: LD A,IOBYTV ;SET IOBYTE TO DEFAULT LD (IOBYTE),A LD HL,IOMSG JR ROUTINE WILL TELL THE OPERATOR WHAT HIS CURRENT LOGICAL-PHYSICAL ; PERIPHERAL DEVICE ASSIGNMENTS ARE. NO PARAMETERS (OTHER THANE CONSOLE & STRIPS OFF THE PARITY BIT. ; ;******************************************************************** CONI: CALL CI  RET Z CP ',' ;IF CHAR = ',' THEN RETURN RET Z CP CR ;IF CHAR = CR THEN RETURN CF SCF RET Z CCF ;ELSE RETURN NCREGISTER SAVE AREA ABOVE STACK ; EX DE,HL LD HL,10 ;GO UP 10 BYTES IN STACK ADD HL,SP ; LD B,4 ;FOUR REGS EX DE,HLL),E ;STORE USER (HL) INC HL LD (HL),D ; PUSH BC ; LD C,'*' ;OUTPUT BREAK INDICATION CALL CONOUT ; POP DE ;BP A LD A,R LD C,A PUSH BC ; ; GOTO MONITOR ; JP WINITA ;RETURN TO MONITOR ;------------------------------------AF,AF' EXX POP DE POP BC POP AF POP HL ;STACK PTR LD SP,HL DB 0 ;'NOP' OR PLACE FOR 'EI' LD HL,0 ;'HL' REGISTCOMERR ;---------------------------------------------------------------------------- ; ; UNINITIALIZED RESTART ERROR HAND A CR) ARE ; REQUIRED ON ENTRY. ; ;**************************************************************************** QUERY: LD A, AND 7FH RTS: RET ;**************************************************************************** ; ; PRTWD ROUTINE OUTPU RET ;**************************************************************************** ; ; REST ROUTINE TRAPS ALL OF THE RE ; ; SAVE AF,BC,DE,HL ; RS1: DEC HL LD (HL),D ;SAVE IN WORK AREA DEC HL LD (HL),E POP DE DJNZ RS1 ; ; FETCHLOCATION LD A,RS9 / 256 CP D ;SEE IF A RET BP JR Z,RS6 ; INC HL INC HL LD (HL),E ;RESTORE USER PC INC HL LD (---------------------------------------- ; ; THE FOLLOWING CODE IS MOVED TO THE MONITOR STACK AREA ; ;--------------------ER JP 0 ;'PC' REGISTER ; ENDX: EQU $ ;---------------------------------------------------------------------------- ; LER ; ;---------------------------------------------------------------------------- RSTER: PUSH AF PUSH HL LD HL,RSTMSG (IOBYTE) LD B,4 LD HL,ACT ;ADDR OF CONVERSION TABLE LD DE,ALT - APT QUE1: PUSH AF CALL BLK LD C,(HL) ;GET CURRENT LTS AN ASCII STRING ONTO THE CONSOLE. ; THE STRING MUST BE TERMINATED BY BIT 7 SET IN THE LAST CHAR OF THE STRING. ; THE STRINGISTER CONTENTS WHENEVER A RESTART 1 ; INSTRUCTION IS EXECUTED. THE TRAPPED CONTENTS ARE STORED IN THE SYSTEM ; STACK AREA FOR RETURN ADDRESS FROM PGM STACK ; POP BC ;GET BREAKPOINT LOCATION + 1 ; DEC BC ;BACK UP TO RESTART INSTRUCTION ; LD SPHL),D ; EX DE,HL ;OUTPUT BP LOCATION CALL LADR ; RS6: LD HL,TLOCX ADD HL,SP LD BC,NBKPTS * 256 ; RS7: LD E,(HL) ;-------------------------------------------------------- RS9: PUSH HL RST 8 ;FORCE BP ; ;--------------------------------- ; 3 TYPES OF ERRORS ARE DETECTED: A RESTART ERROR; AN I/O ASSIGNMENT ; ERROR; & CERTAIN PROGRAM ERRORS (DETERMINED BY PARTICUL CALL PRTWD POP HL POP AF JP REST ;---------------------------------------------------------------------------- ; ;OGICAL DEVICE CODE CALL CONOUT CALL DASH POP AF PUSH AF PUSH HL QUE2: INC HL INC A AND 3 ;BITS 0 & 1 ARE 0 WHEN OG WILL START A NEW LNE (PRTWD) OR CONTINUE ON THE SAME LINE (PRTWA). ; ;****************************************************** LATER ACCESS AND USE BY THE GOTO & THE EXAMINE REGISTERS ; COMMANDS. ; ; INSERT INTERRUPT DISABLER SOFTWARE AT START OF REST,HL ;SET THE MONITOR STACK ; LD HL,TLOCX ;RESTORE BP ADD HL,SP PUSH DE ; LD D,NBKPTS ; RS2: LD A,(HL) SUB C ;SEERESTORE BP'D LOCATIONS LD (HL),C ;RESET SYSTEM SAVE AREA INC HL LD D,(HL) LD (HL),C INC HL LD A,E ;IF LOC = 0 THEN------------------------------------------- ; ; THE FOLLOWING CODE RESTORES THE Z80 REGISTERS & EXECUTES THE 'PC' ; ;-----AR ROUTINE WHERE THE ; ERROR CONDITION WAS ENCOUNTERED) EACH CAUSES A UNIQUE MESSAGE TO BE ; PRINTED, THEN DOES A WARM INIT OF COMMON ERROR HANDLER ; ENTRY- HL= MESSAGE PTR ; ;---------------------------------------------------------------------------N CURRENT ASSGN JR NZ,QUE2 LD C,(HL) ;FOUND IT, NOW OUTPUT IT CALL CONOUT POP HL POP AF RRA RRA ADD HL,DE ;NEX********************** PRTWD: CALL CRLF PRTWA: PUSH BC PRTA: LD C,(HL) RES 7,C ;MAKE SURE BIT 7 = 0 CALL CO LD A,(HL) #0 %+ &, !'- "(. #)/ $*0 ;IF BIT 7 = 1 THEN STOP INC HL RLCA JR NC,PRTA PRTB: POP BC RET ;************************************************ AT THE START OF A NEW LINE (LADRA) OR AT THE CURRENT ; CURSOR LOCATION (LADR). ; ;************************************************************* ; ; CONSOLE OUTPUT SELECTOR ; ENTRY- (IOBYTE BIT 0..1): 0: CON0, 1: CON1, 2: CON2, 3: CON3 ; C= CHAR ******************************************************************* ; ; CONSOLE INPUT SELECTOR ; ENTRY- (IOBYTE BIT 0..1)= 0:ER 2 JP CO ;CONSOLE ;************************************************************************* ; ; LIST DEVICE STATUS  RI: LD A,(IOBYTE) AND 0CH JP Z,SI0 ;SERIAL CHANNEL 0 CP 8 JP M,SI1 ;SERIAL CHANNEL 1 JP Z,SI2 ;SERIAL CHANNEL 2 NOT READY THEN WAIT JR Z,CI0 ; IN A,(NTD) ;ELSE RETURN CHAR RET CO0: IN A,(NTS) ;IF NOT READY TO ACCEPT CHAR THEN ,-1 ;ELSE RETURN -1 RET ;************************************** ; ; ALTERNATE CONSOLE DEVICE (CON2) ; ;************************** ; ; EXLF ROUTINE READS 2 PARAMETERS, PUTS THEM INTO THE DE ; & HL REGS, THEN DOES A CR-LF. ; ;********************************** LADRA: CALL CRLF LADR: LD A,H CALL HEX1 LD A,L HEX1: PUSH AF RRCA RRCA RRCA RRCA CALL HE; ;******************************************************************** CO: LD A,(IOBYTE) AND 3 JP Z,CO0 ;CONSOLE 0 CP  CON0, 1: CON1, 2: CON2, 3: CON3 ; EXIT - A= CHAR (CTRL-Z: EOF) ; ;**********************************************************INPUT SELECTOR ; ENTRY- (IOBYTE BIT 6..7)= 0: LST0, 40H: LST1, 80H: LST2, C0H: CON ; EXIT - A= 0: BUSY, FFH: READY ; ;****** JP SI3 ;SERIAL CHANNEL 3 ;************************************************************************* ; ; SERIAL CHANNEL WAIT AND 1 SHL NTBSY JR NZ,CO0 ; LD A,C ;OUTPUT CHAR & RETURN OUT (NTD),A RET CSTS0: IN A,(NTS) ;IF NOT CHAR N*************************** CO2: EQU IOER CSTS2: EQU IOER CI2: EQU IOER ;************************************** ; ; AL*************************************************** EXLF: CALL EXPR POP DE POP HL ;***********************************X2 POP AF HEX2: CALL CONV JR CO ;********************************************************** ; ; DASH ROUTINE OUTPUTS2 JP M,CO1 ;CONSOLE 1 JP Z,CO2 ;CONSOLE 2 JP CO3 ;CONSOLE 3 ;*************************************************************** CI: LD A,(IOBYTE) AND 3 JP Z,CI0 ;CONSOLE 0 CP 2 JP M,CI1 ;CONSOLE 1 JP Z,CI2 ;CONSOLE 2 JP CI3 ;CON******************************************************************* LSTAT: LD A,(IOBYTE) AND 0C0H JP Z,LSTAT0 ;PRINTER 0 OUTPUT SELECTOR ; ENTRY- (IOBYTE BIT 4..5)= 0: SC0, 10H: SC1, 20H: SC2, 30H: SC3 ; C= CHAR ; ;*****************************OT READY THEN RETURN 0 AND 1 SHL NTRDY RET Z ; LD A,-1 ;ELSE RETURN -1 RET ;***********************************TERNATE CONSOLE DEVICE (CON3) ; ;************************************** CO3: EQU IOER CSTS3: EQU IOER CI3: EQU IOER ;***************************** ; ; CRLF ROUTINE OUTPUTS A CR-LF ON THE CONSOLE DEVICE TO ; START A NEW LINE. ; ;************ A '-' TO THE CONSOLE DEVICE ; ;********************************************************** DASH1: CALL HEX1 ;OUTPUT A AS HEX******************** ; ; CONSOLE STATUS INPUT SELECTOR ; ENTRY- (IOBYTE BIT 0..1)= 0: CON0, 1: CON1, 2: CON2, 3: CON3 ; EXITSOLE 3 ;************************************************************************* ; ; LIST DEVICE OUTPUT SELECTOR ; ENTRCP 80H JP M,LSTAT1 ;PRINTER 1 JP Z,LSTAT2 ;PRINTER 2 LD A,-1 ;CONSOLE (ASSUME READY) RET ;******************************************************************** PUNO: LD A,(IOBYTE) AND 30H JP Z,SO0 ;SERIAL CHANNEL 0 CP 20H JP M,SO1 ;*** ; ; ALTERNATE CONSOLE DEVICE (CON1) ; ;************************************** CI1: CALL CSTS1 ;IF NOT READY THEN WAIT ************************************* ; ; LIST DEVICE 1 (LST1) ; ;************************************** LO0: CALL LSTAT*************************************************** CRLF: PUSH HL CRLFA: LD HL,CRMSG CALL PRTWA POP HL RET ;******* DASH: LD C,'-' JR CO ;*********************** ; ; PRINT ADDR SUBR ; ;*********************** LADRB: CALL LADRA BL - A= 0: NOT READY, FFH: CHAR READY ; ;************************************************************************* CSTS: LD A,(Y- (IOBYTE BIT 6..7)= 0: LST0, 40H: LST1, 80H: LST2, C0H: CON ; C= CHAR ; ;********************************************************************************************* ; ; SERIAL CHANNEL INPUT SELECTOR ; ENTRY- (IOBYTE BIT 2..3)= 0: SC0, 4: SC1, 8:SERIAL CHANNEL 1 JP Z,SO2 ;SERIAL CHANNEL 2 JP SO3 ;SERIAL CHANNEL 3 SUBTTL PRIMITIVE I/O DRIVERS ;****************** JR Z,CI1 ; IN A,(BZUDAT) ;INPUT CHAR RET CO1: IN A,(BZUST) ;IF NOT READY THEN WAIT AND BZUTXR JR Z,CO1 ; LD A0 ;WAIT FOR BUSY=FALSE JR Z,LO0 ; LD A,C ;OUTPUT CHARACTER OUT (PRI1DO),A LD A,NOT [1 SHL PRI1CSB] ;OUTPUT STROBE ******************************************************** ; ; LADR ROUTINE OUTPUTS THE CONTENTS OF HL ON THE CONSOLE ; EITHERK: LD C,' ' ;OUTPUT A SPACE ; FALLS INTO CO SUBR SUBTTL IOBYTE HANDLERS ;************************************************IOBYTE) AND 3 JP Z,CSTS0 ;CONSOLE 0 CP 2 JP M,CSTS1 ;CONSOLE 1 JP Z,CSTS2 ;CONSOLE 2 JP CSTS3 ;CONSOLE 3 ;************************* LO: LD A,(IOBYTE) AND 0C0H JP Z,LO0 ;PRINTER 0 CP 80H JP M,LO1 ;PRINTER 1 JP Z,LO2 ;PRINT SC2, 0CH: SC3 ; EXIT - A= CHAR AND 7FH (CTRL-Z: EOF) ; ;**************************************************************************************** ; ; PRIMARY CONSOLE DEVICE (CON0) ; ;************************************** CI0: CALL CSTS0 ;IF CHAR ,C ;OUTPUT CHAR OUT (BZUDAT),A RET CSTS1: IN A,(BZUST) ;IF RXRDY NOT TRUE THEN RETURN 0 AND BZURXR RET Z ; LD A OUT (PRI2CNT),A LD A,0BFH OUT (PRI2CNT),A ;CLEAR STROBE RET LSTAT0: LD A,0BFH ;THIS PRINTER NEEDS STB=F FOR BUS$0 %+ &, !'- "(. #)/ $*0Y OUT (PRI2CNT),A ; TO WORK PROPERLY ; IN A,(PRI1ST) ;FETCH STATUS CPL AND A,[1 SHL PRI1BSB] ;TEST BUSY RET Z ; ; ;************************************** LO2: EQU IOER LSTAT2: EQU IOER ;************************************** ; ; SG: DM 'MEMORY = ' IOMSG: DM 'I/O ERR ' QMSG: DM '????' LOGMSG: DM 'ZMON VERS 1.',HIGH VERSN,LOW VERSN,CR,LF SUBTTL DATA CUTPUT PORT DW QPRT ;P DW QUERY ;Q DISPLAY LOGICAL & PHYSICAL DEVICES DW QPRT ;R DW SUBS ;S SUBSTITUTE MEMORY DW MT2' ; SERIAL CHANNEL 2 DB '1' ; SERIAL CHANNEL 1 DB '0' ; SERIAL CHANNEL 0 ; ACT: DB 'C' ;LOGICAL CONSOLE DEVICE TAB 80H DB 'R',RLOC DB -1 END is ROM. ; ;**************************************************************************** ; ; Revision status: ; ; 1.0 - Relt. ; 1.7 - 8 FEB 86 GRH ; Remove time delay from power up reset code to allow ISHA to access ; ram. ; Remove the auto-boLD A,-1 RET ;************************************** ; ; LIST DEVICE 1 (LST1) ; ;*************************************ERIAL CHANNEL 0 (SC0) ; ;************************************** SI0: EQU IOER SO0: EQU IOER ;**************************ONSTANTS ;############################################################################ ; ; TBL CONTAINS THE ADDRESSES OF THE EST ;T TEST MEMORY DW QPRT ;U DW COMP ;V VERIFY (COMPARE) MEMORY DW QPRT ;W DW XMNE ;X EXAMINE & CHANGE REGISTERS LE DB '3' ; CONSOLE 3 DB '2' ; CONSOLE 2 DB '1' ; CONSOLE 1 DB '0' ; CONSOLE 0 ;-----------------------------ease ; 1.1 - ; Add Double D deselect upon reset code. ; Change printer port. ; 1.2 - 20 FEB 83 GRH ; Add delay before turot from reset function. ; ; 1.8 - 29 MAY 86 GRH ; Add Cromemco PRI printer driver as primary printer. ; Change IOBYTE defi* LO1: CALL LSTAT1 ;IF BUSY THEN WAIT JR Z,LO1 ; LD A,C ;OUTPUT CHAR SET CENTDST,A OUT (CENTOUT),A RES CENTDST,A ;************ ; ; SERIAL CHANNEL 1 (SC1) ; ;************************************** SI1: EQU IOER SO1: EQU IOER ;******COMMANDS. ; THE EXECUTIVE USES IT TO LOOK UP THE DESIRED ADDR. ; ;########################################################### DW QPRT ;Y DW BYE ;Z SLEEP UNTILL BELL ;----------------------- ; ; IOBYTE TABLE ; ;----------------------- ALT: ---- ; ; Z80 REGISTER OFFSET TABLE ; ;--------------------------------- ACTBL: DB 80H + 'A',ALOC DB 'B',BLOC DB 'C',CLO TITLE M5b Z-80 MONITOR LIST NOCOND ;*************************************************************************** ; ; SYSTEMning off boot image, in case logic ; too slow. ; 1.3 - 17 MAR 84 GRH ; Change to allow Boot command parameter passing to nitions. ; Remove initialization of Jade FDC port 40H in anticipation of ; Cromemco bank select useage. ; ; 1.9 - 16 AUG 8OUTPUT LOW TRUE STROBE OUT (CENTOUT),A SET CENTDST,A ;RESTORE STROBE OUT (CENTOUT),A RET LSTAT1: LD A,[1 SHL CEN******************************** ; ; SERIAL CHANNEL 2 (SC2) ; ;************************************** SI2: EQU IOER SO2: E################# TBL: DW ASGN ;A ASSIGN PHYSICAL TO LOGICAL DEVICES DW BOOTC ;B BOOT DISK DW QPRT ;C DW DISP ;D DISPDB 'L' ;LOGICAL LIST DEVICE TABLE DB 'C' ; CONSOLE DB '2' ; LIST DEVICE 2 DB '1' ; LIST DEVICE 1 DB '0' ; LIST C DB 'D',DLOC DB 'E',ELOC DB 'F',FLOC DB 'H',HLOC DB 'L',LLOC DB 80H + 'M',HLOC + 0C0H DB 'P',PLOC + 80H DB 'S', MONITOR FOR M5b ; (c) 1982,1983 GRH ELECTRONICS, CUPERTINO, CA ; ;*********************************************************boot ROM. ; ; 1.4 - 2 JUN 84 GRH ; Fix bug in line printer status subroutine which hung the ; line printer by sensing th6 GRH ; Fix bug in PRI driver which caused new Oki 93 to be busy. ; ; 1.10- 8 FEB 87 GRH ; Fix bug in register restore rTDST] ;INSURE STROBE STARTS HIGH OUT (CENTOUT),A ; IN A,(CENTS) ;IF BUSY THEN RETURN 0 CPL ;REVERSE SENSE AND A,[1 SHQU IOER ;************************************** ; ; SERIAL CHANNEL 3 (SC3) ; ;************************************** SI3LAY MEMORY DW QPRT ;E DW FILL ;F FILL MEMORY DW GOTO ;G GOTO PGM & SET BREAKPOINTS DW QPRT ;H DW INPT ;I DISPLAY DEVICE 0 ; APT: DB 'P' ;LOGICAL PUNCH DEVICE TABLE DB '3' ; SERIAL CHANNEL 3 DB '2' ; SERIAL CHANNEL 2 DB '1' ; SSLOC + 80H DB 'I',ILOC ; ; PRIME Z80 REGISTER OFFSETS ; PRMTB: DB 80H + 'A',APLOC DB 'B',BPLOC DB 'C',CPLOC DB 'D',D****************** ; ; This Monitor program resides at the top of memory & allows memory ; modification & testing, program bre status incorrectly. ; 1.5 - 29 SEP 85 GRH ; Fix bug in Input command which caused monitor to crash. ; The jump to 'BITSoutine which caused IX & IY to be ; swapped prior to GOTO. ; Change restart error to vector to breakpoint after message. ; L CENTBSY] RET Z ; LD A,-1 ;ELSE RETURN -1 RET ;************************************** ; ; LIST DEVICE 2 (LST2) : EQU IOER SO3: EQU IOER SUBTTL MESSAGES CRMSG: DM CR,LF RSTMSG: DM 'RST ERR ' BOOTEM: DM 'BOOT LOAD ERR',CR,LF USRMSINPUT PORT DATA DW QPRT ;J DW QPRT ;K DW QPRT ;L DW MOVE ;M MOVE MEMORY DW QPRT ;N DW OUPT ;O OUTPUT DATA TO OERIAL CHANNEL 1 DB '0' ; SERIAL CHANNEL 0 ; ART: DB 'R' ;LOGICAL READER DEVICE TABLE DB '3' ; SERIAL CHANNEL 3 DB 'PLOC DB 'E',EPLOC DB 'F',FPLOC DB 'H',HPLOC DB 'L',LPLOC DB 'M' + 80H,HPLOC + 0C0H DB 'X',XLOC + 80H DB 'Y',YLOC +eakpoints, console, printer, punch & ; reader I/O drivers and transfer to system boot ROM residing in same memory ; area as th2' expects DE to be on stack. ; 1.6 - 6 DEC 85 GRH ; Add code to disable all Jade controllers from 40H to 43H after ; rese; 1.11- 27 DEC 87 GRH ; Add bank memory management routines. ; VERSN EQU '11' ;*******************************************$0 %+ &, !'- "(. #)/ $*0********************************* FORM FALSE EQU 0 TRUE EQU NOT FALSE LSTINC EQU FALSE ; ; INCLUDE SYSTEM DEFINITION FIQU 13H ;ASCII DC3 CR EQU 0DH LF EQU 0AH BELL EQU 7 ; BNKREG EQU 0F4H ;MEMORY BANK SELECT REGISTER PORT ADDRESS (BIG Z) ################################ ; ; FIXED DATA AREA ; ;####################################################################JP LO ;LIST OUTPUT CONST JP CSTS ;CONSOLE STATUS ; ; MEMORY MANAGEMENT (5) ; JP GETMEM ;RETURN MEMORY DATA (WAS IOCHK ROMSEL,A RET SUBTTL MEMORY MANAGEMENT ROUTINES ;************************************************************************ ENTRY- HL= SOURCE PTR ; DE= DESTINATION PTR ; BC= BYTE COUNT ; EXIT - HL & DE= NEXT BYTES TO MOVE PTRS ; A, BC= ? ; ;+NK) ;RESELECT CURRENT BANK & RETURN OUT (BNKREG),A RET ; ; ; BANKS NOT THE SAME, DO DISCREET MOVE ; NTSAME: PUSH BC  SELECT BANK ; LD A,E OUT (BNKREG),A ; ; FETCH DATA ; LD A,(HL) ; ; RESTORE BANK ; PUSH AF LD A,(CBANK) OLES ; ;*INCLUDE NAKEDT.DEF ;*INCLUDE MONBOARD.DEF ;*INCLUDE BIGZ.DEF ;*INCLUDE JDDCONT.DEF ;*INCLUDE IOBOARD.DEF ;*INCLUD ;============================ ; ; VARIABLES ; ;============================ IOBYTE EQU 3 ;ADDR OF I/O CONTROL BYTE IO######## RESERVED EQU 6 ;CHANGE THIS TO RESERV SPACE ORG 0F800H - RESERVED CBANK DS 1 ;CURRENT EXECUTION BANK DBANK DS 1 ;) JP PUTMEM ;STORE MEMORY DATA (WAS IOSET) JP BNKSEL ;SELECT MEMORY BANK FOR EXECUTION (WAS MEMCK) JP XMOVE ;SELECT MEM**** ; ; BANK SELECT PROCEDURE ; ENTRY- A= BANK ADDRESS ; ;****************************************************************+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ BMOVE: ; ; IF BANK SELECTED PRIOR TO CALL THEN ;SAVE COUNT EXX POP BC EXX ; LD BC,(DBANK) ;FETCH BANKS ; BMOVE4: LD A,B ;SELECT SOURCE BANK OUT (BNKREG),A LD AUT (BNKREG),A POP AF ; ; DONE ; RET ;**************************************************************************** E PRI.DEF ; LIST OFF *INCLUDE NAKEDT.DEF *INCLUDE MONBOARD.DEF *INCLUDE BIGZ.DEF *INCLUDE JDDCONT.DEF *INCLUDE IOBOARD.DBYTV EQU 00H ;DEFAULT IOBYTE VALUE ; ; ; REGISTER STORAGE DISPLACEMENTS FROM NORMAL SYSTEM ; STACK LOCATION. ; ALOC EQU 1DESTINATION BANK # FOR MOVE SBANK DS 1 ;SOURCE BANK # FOR MOVE BNKCHG DS 1 ;BANK CHANGED FLAG (0: NOT, /0: CHANGED) SPSV DS 2ORY BANKS FOR MOVE (WAS RTS) JP BMOVE ;MEMORY BLOCK MOVE (WAS RTS) ; ; BREAKPOINT VECTOR ; JP REST ;BREAKPOINT ENTRY ************ BNKSEL: OUT (BNKREG),A LD (CBANK),A RET ;****************************************************************EXECUTE LDIR ; LD A,(BNKCHG) ;IF BANK SELECTED THEN SKIP BANK SELECT OR A,A JP NZ,BMOVE2 ; EX DE,HL LDIR EX DE,HL ,(DE) EX AF,AF' ; LD A,C ;SELECT DESTINATION BANK OUT (BNKREG),A EX AF,AF' LD (HL),A ; INC HL ;NEXT BYTE INC D ; ; STORE DATA INTO BANKED MEMORY PROCEDURE ; ENTRY- HL= OFFSET PTR ; E= BANK # ; C= DATA ; EXIT - A= ? ; ;***********EF *INCLUDE PRI.DEF LIST ON ;============================ ; ; ASSEMBLE TIME VARIABLES ; ;============================ 5H BLOC EQU 13H CLOC EQU 12H DLOC EQU 11H ELOC EQU 10H FLOC EQU 14H HLOC EQU 31H LLOC EQU 30H PLOC EQU 34H SLOC EQU 17H ;STACK PTR SAVE LOCATION (WAS 6) SUBTTL MAIN PROGRAM ORG ROM ;-------------------------------------- ; ; JUMP TARGETS  ; ; MORE CHARACTER I/O ; LPSTAT: JP LSTAT ;LINE PRINTER STATUS RETURN DS 6 ;SAVE 2 SPARES ;------------------------************ ; ; SET BANKS FOR A FOLLOWING MOVE CALL ; ENTRY- B= SOURCE BANK ; C= DESTINATION BANK ; ;******************* ; RET ; ; ; CLEAR BANK CHANGE FLAG ; BMOVE2: XOR A,A LD (BNKCHG),A ; ; IF IN SAME BANK THEN USE BLOCK MOVE INSTRE ; EXX ;CHECK FOR DONE DEC BC LD A,C OR A,B EXX JP NZ,BMOVE4 ; ; DONE ; JP BMOVE3 ;+++++++++++++++++***************************************************************** PUTMEM: ; ; SELECT BANK ; LD A,E OUT (BNKREG),A ;  ROM EQU 0F800H ;ROM START ADDR WSVEC EQU 0 ;VECTOR NUMBER FOR WARM RESTART NBKPTS EQU 2 ;NUMBER OF BREAKPOINTS DEFBNK EQU TLOC EQU 35H TLOCX EQU 25H LLOCX EQU 20H ; APLOC EQU 9 BPLOC EQU 11 CPLOC EQU 10 DPLOC EQU 13 EPLOC EQU 12 FPLOC EQU FOR BASIC I/O ; ;-------------------------------------- ; ; COLD START VECTOR ; CBOOT JP INIT ;COLD START ; ; CHARA------------------------ ; ; THE FOLLOWING CODE MUST RESIDE AT THE SAME ; ADDR AS THE BOOT ROM START CODE. ; ;-----------********************************************************* XMOVE: LD (DBANK),BC XOR A,A ;FLAG CHANGE DEC A LD (BNKCHG),A UCTION ; PUSH HL ;SAVE PTR LD HL,(DBANK) LD A,H CP A,L POP HL ;PTR JP NZ,NTSAME ; OUT (BNKREG),A ;A STILL HAS +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN BANKED MEMORY DATA FUNCTION ; ENTRY- HL= OFFSET PTR ;; STORE DATA ; LD (HL),C ; ; RESTORE BANK ; LD A,(CBANK) OUT (BNKREG),A ; ; DONE ; RET SUBTTL INITIALIZ 0 ;DEFAULT Z-80 EXECUTION BANK ;============================ ; ; CONSTANTS ; ;============================ CTRLS E8 HPLOC EQU 15 LPLOC EQU 14 XLOC EQU 7 YLOC EQU 5 RLOC EQU 2 ILOC EQU 3 ;############################################CTER I/O (6) ; CONIN JP CI ;CONSOLE INPUT READER JP RI ;READER CONOUT JP CO ;CONSOLE OUTPUT PUNCH JP PUNO ;PUNCH LIST ------------------------------------- DBOOT: LD A,C ;PERFORM SWAP AND 7 ;CLEAR ERROR MSG IN CASE ROM NOT THERE & MASK OUT RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; MEMORY TO MEMORY MOVE FUNCTION ;BANK ; EX DE,HL ;MOVE DATA LDIR EX DE,HL ; ; DONE, RESTORE BANK TO CURRENT BANK WHEN CALLED ; BMOVE3: LD A,(CBA E= BANK # ; EXIT - A= DATA ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ GETMEM: ; ; ATION CODE ;-------------------------------------- ; ; THE COLD INITIALIZATION CODE ; ;------------------------------------%0 %+ &, !'- "(. #)/ $*0-- INIT: ; ; INSURE INTERRUPTS DISABLED ; DI ; ; REMOVE PAGE 0 IMAGE ; OUT COLDRES,A ; ; FIX MEMORY BANK ;  # KS ; LD A,H ; /1024 SRL A SRL A LD C,0 ;TENS COUNT = 0 MEMLP: SUB 10 ;NUMBER = NUMBER - 10 JR C,MEM1 ; INC K BY SUBTRACTING ADD HL,SP PUSH HL ;SAVE SP ; INC HL ;ADJUST USER STACK LOCATION INC HL LD (SPSV),HL ;SAVE INITIAL ************* ; ; MEMSIZ SUBR CALCULATES THE TOP OF CONTIGUOUS RAM. IT SEARCHES FROM ; THE BOTTOM UP UNTIL A NON-RAM LOCATION POINT TO LAST RAM SPACE ; DEC HL ; ; ADJUST FOR MONITOR RESERVED AREA ; LD BC,[EXIT - ENDX] - [3 * NBKPTS] - RESERV*********** ; ; EXF SUBR. READS 1 PARAMETER. ; ENTRY- A= PARAMETER 1ST CHAR ; EXIT - STACK= PARAMETER ; ;***************************************************************** AS3: DJNZ AS2 ;PART OF THE ASSIGN CODE EX3: JR NZ,QPRT ;NON 0 IS ERR EXPR1COMMAND CONTROLS THE ASSIGNMENT OF PHYSICAL PERIPHERALS TO THE ; 4 LOGICAL DEVICE TYPES. IT ALTERS (IOBYTE) TO MATCH THE CURREN LD A,DEFBNK OUT (BNKREG),A LD (CBANK),A ; ; REMOVE JADE DOUBLE D WINDOW(S) ; LD A,DDFREE ;REMOVE DD WINDOW, IF PRESEC ;IF < 10 THEN C = TENS DIGIT JR MEMLP ; MEM1: ADD '0' + 10 ;CONVERT TO + ASCII # LD B,A LD A,C ;IF TENS = 0 THEN OUTSTACK VALUE ; ; INITIALIZE REGISTER IMAGES TO 0 ; LD D,10 INIT2: PUSH BC ;BC HAS 0 FROM LAST LDIR FINISH DEC D JR N IS FOUND. IT THEN TAKES OFF FOR ; MONITOR WORK SPACE NEEDS. ; EXIT - HL= MEMTOP PTR ; ;************************************ED + 1 ADD HL,BC ;ABOVE CALCULATES TO NEGATIVE #, SO IS SUB ; ; RESTORE & RETURN ; POP BC ;UNPREDICTABLE DURING INIT ********************* EXF: LD B,1 ;SET 1 PARAM LD HL,0 JR EX1 ;1ST CHAR IN A ALREADY ;********************************: DEC B ;IF NO PARAMS THEN RETURN RET Z EXPR: LD HL,0 ;PARAM = 0 EX0: CALL ECHO ;GET NEXT # EX1: LD C,A ;SAVE CHAR FOR T ASSIGNMENT. ; THE 4 LOGICAL DEVICES ARE CONSOLE, READER, LIST & PUNCH. IN ALL CASES, THE ; TTY DEVICE (SYSTEM CONSOLE) IS SENT OUT (41H),A OUT (42H),A OUT (43H),A ; ; INITIALIZE RESTART VECTORS IN PAGE 0 ; LD SP,003FH ;USE STACK TO INIT REPUT SPACE ADD '0' CP '0' JR NZ,NOT0 LD A,' ' NOT0: LD C,A CALL CO LD C,B CALL CO LD C,'K' CALL CO CALL Z,INIT2 ; ; INSERT I/O INIT CODE HERE ; ; ; OUTPUT SIGN-ON MESSAGE ; LD HL,LOGMSG ;OUTPUT SIGN-ON CALL PRTWD JR WI**************************************** MEMSIZ: ; ; SAVE REG ; PUSH BC ;MONITOR START LOCATION ; ; INITIALIZE ;  RET ;**************************************************************************** ; ; MEMCHK SUBR FINDS THE CURRENT TOP******************************************** ; ; EXPR SUBR. READS PARAMETERS FROM THE CONSOLE & DEVELOPS A 16 BIT HEX ; FOR ELATER CALL NIBBLE JR C,EX2 ;IF NOT NUMBER THEN EXIT ADD HL,HL ;PARAM = PARAM * 16 ADD HL,HL ADD HL,HL ADD HL,HL T UP AS THE DEFAULT DEVICE. ; ; Ax ;x= C,R,P,L (CONSOLE,READER,PUNCH,LIST) ; Ax-y ;y= C: T,C,B,1 (TTY,CRT,BAT,UC1) ; STARTS LD HL,0C300H LD DE,RSTER LD B,16 ;64 BYTES INIT1: PUSH DE PUSH HL DJNZ INIT1 ; ; SET TEMPORARY STACK ; CRLF ; ; CONTINUATION OF THE SCS MONITOR, MOVE EXIT ROUTINE TO RAM ; POP HL ;MEMTOP LD SP,HL LD DE,EXIT EX DE,HL NIT ; ; SPECIAL DISK BOOT CODE SWAPS ROMS FOR BOOT. ; IF BOOT SUCCESSFUL, DOES NOT RETURN. ; IF UNSUCCESSFUL, RETURNS  LD BC,ROM ;SAVE ROM PAGE TO COMPARE TO ; LD HL,-1 ;START AT LOCATION 0 ; ; NON-DESTRUCTIVE TEST UNTIL NO RAM OR MONITO OF CONTIGUOUS MEMORY (LESS THE ; MONITOR WORKSPACE) & RETURNS THE VALUE. ; EXIT - B= HIGH BYTE OF RAM ; A= LOW BYTE OF RAMACH ONE. A CARRIAGE RETURN WILL TERMINATE THE ENTRY SEQUENCE. A BLANK ; OR COMMA WILL END THE CURRENT PARAMETER ENTRY. EACH PAROR L ;ADD IN NEW DIGIT LD L,A JR EX0 ;GET NEXT ; EX2: EX (SP),HL ;PUT UNDER RETURN ADDR ON STACK PUSH HL LD A,C ;I R: T,P,1,2 (TTY,PTR,UR1,UR2) ; P: T,P,1,2 (TTY,PTP,UP1,UP2) ; L: T,L,1,2 (TTY,CRT,LPT,UL1) ; ;------------- LD SP,80H ; ; INITIALIZE IOBYTE ; LD C,IOBYTV ;SET TO INITIAL IOBYTE VALUE CALL IOSET ; ; SIZE AND DISPLAY MEMORY  LD BC,ENDX - EXIT LDIR ; ; FILL BREAKPOINT ADDRESSES WITH 0 (LAST BYTE OF EXIT ROUTINE ; LD BC,NBKPTS * 3 PUSH DE CARRY IF ERROR, NO CARRY IF DISK NOT INSERTED. ; BOOTCD: LD C,XDBROM ;PASS IN DEFAULT BOOT ROM ADDR BOOTCC: CALL DBOOT LD HR ROM BASE INCURRED ; MEMSZ1: INC HL LD A,(HL) CPL LD (HL),A ; CP (HL) CPL LD (HL),A ; JR NZ,MEMSZ2 ;NO RAM ; ; ;**************************************************************************** MEMCK: PUSH HL CALL MEMSIZ ;GET THE RAM SAMETER ONLY TAKES ; THE LAST 4 DIGITS TYPED IN. ANY EXCESS IS DISCARDED. A NON-HEX DIGIT WILL ; TERMINATE THE ENTRY SEQUENCE &F LAST CHAR = DELIM THEN EXIT CALL P2C JR NC,EX3 DJNZ QPRT ;ELSE IF MORE REQ'D THEN ERR RET ;ELSE RETURN ;----------------------------------------------------------------------- ASGN: CALL ECHO ;GET THE LOGICAL DEVICE DESIRED LD HL,ALT ; ; LD HL,USRMSG ;OUTPUT MEMORY= CALL PRTWD CALL MEMSIZ ;OUTPUT MEMORY SIZE PUSH HL ;SAVE VALUE FOR LATER ; ; COMPUTEPOP HL DEC HL LDIR ; ; RESERVE REGISTER IMAGE SPACE FROM STACK TO EXIT ROUTINE JUST STORED ; LD HL,-24 ;BACK UP STACL,BOOTEM CALL C,PRTWD ; JR WINIT ;GO TO MONITOR EXEC ;*************************************************************** LD A,H ;SEE IF ON MONITOR BORDER CP A,B JR NZ,MEMSZ1 ; ; DONE WITH TEST, CALCULATE TOP OF FREE RAM ; MEMSZ2: ; ;IZE LD A,L ;TAKE OFF WORKSPACE SUB 60 JR NC,MEMCK0 DEC H MEMCK0: LD B,H POP HL RET ;*************************** CAUSE A WARM BOOT OF THE MON. ; ENTRY- B= # OF PARAMETERS NEEDED ; EXIT - STACK= PARAMETERS ; ;****************************-------------------------------------------------------------------- ; ; LOGICAL ASSIGNMENT OF PERIPHERALS COMMAND ; ; THIS START OF CONVERSION TABLE LD DE,APT - ALT ; # OF ELEMENTS LD B,4 ; COUNT = # ENTRIES AS0: CP (HL) ;IF CHAR = TABLE[LOGICA%0 %+ &, !'- "(. #)/ $*0L] THEN JR Z,AS1 ; EXIT ADD HL,DE ;ELSE NEXT LOGICAL ENTRY DJNZ AS0 QPRT: LD HL,QMSG ;OUTPUT ? MESSAGE CALL PRTWA -- ; ; FILL MEMORY COMMAND ; ; THIS ROUTINE FILLS A BLOCK OF MEMORY WITH A USER DEFINED CONSTANT. IT ; EXPECTS 3 PARAMETERSR NZ,AS3 LD L,B ;SAVE THE RESIDUE TO FORM ASGNT DEC L LD B,D LD H,3 DEC B JR Z,AS5 ;NO SHIFT NEEDED AS4: ADD  ROUTINE IS USED TO PREVENT UNAUTHORIZED USAGE OF THE SYSTEM. ; THE SYSTEM LOCKS UP & WILL NOT RESPOND TO ANYTHING OTHER THAN 2S DISPLAYED, ALONG WITH IT'S CONTENTS & THE CONTENTS OF THE ; OTHER BLOCK'S SAME RELATIVE ADDRESS. ; ; V ;START EXECUTION AT WHATEVER IS IN PC REG (NO BPS) ; G  ;---------------------------- ; ; THE WARM START CODE ; ;---------------------------- WINIT: LD SP,(SPSV) ;RESTORE THE ST TO BE ENTERED IN THE FOLLOWING ORDER: ; START ADDR, FINISH ADDR, FILL VALUE ; ; F ; HL,HL ;SHIFT MASKS ADD HL,HL DJNZ AS4 AS5: LD A,(IOBYTE) OR H XOR H ;LOGICAL BITS NOW OFF OR L ;PUT IN NEW VALUE  ASCII BELL ; CHARACTERS. WHEN IT SEES THEN CONSECUTIVELY, CONTROL IS RETURNED TO THE ; MONITOR WITHOUT ALTERING ANYTHING. ; CE_LAST> ; ;---------------------------------------------------------------------------- COMP: CH ; COLUMN HAS THE SAME LAST HEX DIGIT IN IT'S ADDR. ; ; D[ ] ; ;-----------------------------------UTPUT '.' DIS6: CALL CONOUT CALL HILOX LD A,L ;READY FOR NEW LINE? AND 0FH JR NZ,DIS4 ;NO JR DIS1 ;YES ; DIS7: S;START EXECUTION AT START_ADDR (NO BPS) ; G,[,] ;START EXECUTION AT START_ADDR WITH ; BREAKPOINT AT BACK WINITA: LD HL,WINIT ;RESET RETURN & WARM START VECT PUSH HL LD (WSVEC + 1),HL LD A,0C3H LD (WSVEC),A CALL CRLF ;---------------------------------------------------------------------------- FILL: CALL EXPR3 ;GET 3 PARAMS FIO: LD (HL),C  LD C,A ;************************************** ; ; SET IOBYTE SUBR ; ENTRY- C= NEW IOBYTE VALUE ; ;******************** ; Z ; ;---------------------------------------------------------------------------- BYE: LD B,2 ;SET UP FOR 2 CHARS BALL EXPR3 CMPA: LD A,(BC) ;GET SOURCE 2 DATA PUSH BC ;SAVE SOURCE 2 PTR LD B,(HL) ;GET SOURCE 1 DATA CP B ;IF S2=S1 T----------------------------------------- DISP: CALL EXLF ;GET BLOCK LIMITS DIS1: CALL LADRB ;DISPLAY START ADDR LD A,L ;UB A,E ;SKIP OVER TO START ASCII CALL TRPLSP JR DIS3 ; TRPLSP: AND 0FH ;ISOLATE LOW NIBBLE LD B,A ;PREPARE TO SPACE OP1 AND OPTIONAL BREAKPOINT AT BP2 ; G,[,] ;START EXECUTION AT PC VALUE WITH BREAKPOINT(S) AT ; BP1 & OPTIONAL BPCALL DECHO ;GET COMMAND SUB 'A' ;IF CHAR <> 'A' -> 'F' THEN ERR JR C,QPRT CP 'Z' - 'A' + 1 JR NC,QPRT ADD A,A ;OFFS;PUT DOWN THE FILL VALUE CALL HILO ;INC & CHECK THE PTR JR NC,FIO POP DE ;RESTORE SP IN CASE STACK JR WINIT ; WAS OV****************** IOSET: LD A,C LD (IOBYTE),A ;SAVE NEW ASSIGNMENTS RET ;******************************************* ;YE1: CALL CONI CP BELL ;IF NOT BELL THEN RESTART JR NZ,BYE CALL ECH1 ;ECHO THE BELL DJNZ BYE1 RET ;--------------HEN EXIT JR Z,CMPB PUSH AF ;SAVE S2 DATA CALL LADRB ;OUTPUT ADDR LD A,B CALL DASH1 ;FORMAT POP AF CALL HEX1 ;OSEE IF ON 16 BYTE BOUNDARY CALL TRPLSP ;SKIP OVER TO RIGHT COLUMN PUSH HL DIS2: LD A,(HL) ;GET CONTENTS CALL HEX1 CALVER TO RIGHT ADD A,A ; COLUMN ADD B TRPL2: LD B,A INC B TRPL1: CALL BLK ;DO SPACING DJNZ TRPL1 RET ;----------2. ; ;---------------------------------------------------------------------------- GOTO: ; ; IF NO ARGS THEN USE CURRENT ET = INDEX * 2 LD E,A LD D,0 LD B,2 ;PASS IN 2 PARAMS TO HANDLER LD HL,TBL ;ADDRESS = (TABLE + OFFSET) ADD HL,DE ERWRITTEN ;---------------------------- ; ; ASSIGN CONTINUED ; ;---------------------------- AS1: LD D,B ;SAVE THE COUN ; RETURN IOBYTE VALUE SUBR ; EXIT - A= CURRENT IOBYTE VALUE ; ;******************************************* IOCHK: LD A,(IO-------------------------------------------------------------- ; ; VERIFY MEMORY COMMAND ; ; THIS ROUTINE COMPARES 2 BLOCKS UTPUT S2 CMPB: POP BC CALL HILOXB JR CMPA ;---------------------------------------------------------------------------- L HILO ;INC & CHECK PTR JR C,DIS7 ;DONE IF CARRY CALL BLK ;MAKE COLUMNS LD A,L ;READY FOR NEW LINE? AND 0FH JR NZ,------------------------------------------------------------------ ; ; GOTO COMMAND ; ; GOTO COMMAND TRANSFERS CONTROL TO A REGISTERS ; CALL PCHK ;SEE IF OD ADDR WANTED JR C,GO3 ; ; IF NO GOTO ADDRESS THEN SET BREAKPOINTS ; JR Z,GO0 ;YES,LD A,(HL) INC HL LD H,(HL) LD L,A JP (HL) ;--------------------------------------------------------------------------TER RESIDUE LD B,4 CALL DECHO ;GET NEW ASSIGNMENT AS2: INC HL ;PTR = PTR + 1 CP (HL) ;IF CHAR <> (TABLE) THEN EXIT JBYTE) RET ;---------------------------------------------------------------------------- ; ; SLEEP COMMAND ; ; THE BYEOF MEMORY AGAINST EACH OTHER. IF A ; DIFFERENCE IN THE RELATIVE ADDRESS CONTENTS IS DETECTED, THE ADDRESS OF THE ; 1ST BLOCK I ; ; DISPLAY MEMORY COMMAND ; ; THIS ROUTINE DISPLAYS A BLOCK OF MEMORY ON THE CONSOLE DEVICE. THE ; USER MUST SPECIFY THE SDIS2 DIS3: POP HL ;RESTORE START OF LINE LD A,L ;SKIP OVER TO RIGHT SPACE AND 0FH CALL TRPL2 DIS4: LD A,(HL) ;OUTPUT SPECIFIED ADDRESS IT ALLOWS THE ; SELECTIVE SETTING OF UP TO 2 BREAKPOINTS AS WELL AS ALLOWING ANY CONSOLE ; INPUT TO BREAKPON BUT SET BP ; ; FETCH NEW GOTO ADDRESS & PUT INTO 'PC' REGISTER ; CALL EXF ;GET NEW GOTO ADDR POP DE LD HL,PLOC ;PU&0 %+ &, !'- "(. #)/ $*0T ADDR IN PC LOCATION ADD HL,SP LD (HL),D DEC HL LD (HL),E ; ; IF LAST CHAR == CR THEN NO MORE ARGS ; LD A,C ;IF; IF MORE ALLOWED THEN CONTINUE ; DJNZ GO1 ;ELSE IF <2 BPS THEN LOOP ; ; GOT ALL ARGS, EXECTUTE THE GOTO ; GO3: CALL. ; ; I ; ;---------------------------------------------------------------------------- INPT: CALL EXPR1 ;GETE ADDR. ; ; M ; ;--------------------------------------------------------------INSPECT ANY MEMORY LOCATION & ALTER ; THE CONTENTS, IF DESIRED & IF THE ADDRESS IS IN RAM. THE CONTENTS MAY BE ; LEFT UNALTEREINUE HEX INPUT POP DE ;NEW VALUE POP HL ;PTR LD (HL),E ;LOAD VALUE LD A,C ;IF DELIM = CR THEN DONE CP CR RET Z  CALL NZ,BITS ;LOG ERR IF NOT MTEST2: POP AF ;RESTORE BYTE LD (HL),A CALL HILOX JR MTEST1 ; BITS: PUSH DE LD E,A ----------------- XAA: INC HL ;SKIP OVER TO NEXT ENTRY INC HL XA: INC (HL) ;IF AT END OF TABLE THEN RETURN RET Z JP P, LAST = CR THEN EXIT CP CR JR Z,GO3 ; ; GET & SET UP TO NBKPTS BREAKPOINTS ; GO0: LD B,NBKPTS LD HL,TLOC ;POINT TO  CRLF ;NEW LINE FOR PGM ; POP HL ;GET RID OF STACK JUNK ; ; PASS IN LOCATION OF RESTORE ROUTINE ; LD HL,RS9 PUSH HT INPUT PORT # INTO C CALL CRLF ;PUT DATA ON NEW LINE POP BC IN E,(C) PUSH DE ;FIX BUG. BITS2 POPS DE BEFORE 'RET' J-------------- MOVE: CALL EXPR3 MOV1: LD A,(HL) ;MOVE 1 BYTE LD (BC),A CALL HILOXB JR MOV1 ;------------------------D BY ENTERING A SPACE, COMMA OR RETURN. IF A RETURN IS ; ENTERED, THE ROUTINE IS TERMINATED. IF A SPACE OR COMMA IS ENTERED, THSUB2: INC HL ;PTR = PTR + 2 INC HL SUB3: DEC HL ;PTR = PTR - 1 LD A,L ;IF ON MOD 8 BOUNDARY THEN AND 7 ; OUTPUT ADDRCALL LADRB ;OUTPUT ADDR BITS2: LD B,8 ;BIT COUNT BITS1: LD A,E RLCA LD E,A LD A,'0' / 2 ;BUILD ASCII 1 OR 0 RLA LDXAB ;SORT OUT BIT 7 OF TABLE OR 80H ;SET IT ON TEST VALUE JR XAC ; XAB: AND 7FH ;RESET BIT 7 XAC: DEC (HL) ;TO BE PULTRAP STORAGE ADD HL,SP ; GO1: PUSH BC ;SAVE BREAKPOINTS REMAINING ; PUSH HL ;STORAGE PTR LD B,2 CALL EXPR1 POP DEL ; ; INSERT RESTART BREAKPOINT VECTOR TO RST 8 ; LD HL,REST LD (9),HL ;SET BP VECTOR ADDR ; ; RESTORE ROUTINE IS R BITS2 ;OUTPUT VALUE ;-------------------------------------- ; ; OUTPUT DATA TO PORT COMMAND ; ; O ; ARG :: 0..FH (E ; ROUTINE PROCEEDS TO THE NEXT LOCATION & PRESENTS THE USER WITH AN ; OPPORTUNITY TO ALTER IT. ; ; S ; ;--------- CALL Z,LADRB JR SUB1 ;---------------------------------------------------------------------------- ; ; MTEST COMMAND T C,A CALL CONOUT DJNZ BITS1 POP DE RET ;---------------------------------------------------------------------------- LED OUT IN ROM CP (HL) JR NZ,XAA ;NO MATCH, TRY AGAIN CALL BLK CALL PRTVAL CALL DASH CALL PCHK ;GET NEW INPUT RE ;GET TRAP ADDR POP HL ;SPTR ; LD A,D ;INSURE 0 WASN'T SPEC'D OR E JR Z,GO2 ; LD (HL),E ;SAVE BP ADDR INC HL ON STACK, SO COMPUTE ENTRY ADDRESS ; LD HL,24 ;FIND REG SET ROUTINE ADDR ADD HL,SP ; ; EXECUTE THE RESTORE & GOTO ; TO_OUTPUT> ; ;-------------------------------------- OUPT: CALL EXPR ;GET DATA INTO E, PORT # INTO C POP DE POP BC OUTPASSED TO BOOT ROM) ; PROM # :: 0..7 (DEFAULT # = 02H) ; ;------------------------------------------------ BOOTC: CALL PCH------------------------------------------------------------------- SUBS: CALL EXPR1 ;GET ADDR CALL CRLF ;START ON NEW LINEESTS A SPECIFIED BLOCK OF MEMORY TO SEE IF ANY HARD ; DATA BIT FAILURES EXIST. IT IS NOT AN EXHAUSTIVE TEST, BUT JUST A QUICK  ; ; EXAMINE REGISTERS COMMAND ; INSPECTS THE VALUES OF THE REGISTERS STORED BY THE LAST ENCOUNTERED ; BREAKPOINT. THE VALUEST C ;IF CHAR = CR THEN RETURN JR Z,XF ;IF NO CHANGE THEN EXIT PUSH HL ;PTR CALL EXF POP HL LD A,L INC DE LD (DE LD (HL),D INC HL ; LD A,(DE) ;SAVE BP ADDR INSTRUCTION LD (HL),A INC HL ; LD A,0CFH ;INSERT THE BP LD (DE),A ; POP DE ;ADJUST STACK JP (HL) ;GO DO REG RESTORE ;--------------------------------------------------------------------- (C),E RET ;---------------------------------------------------------------------------- ; ; MOVE COMMAND ; ; THIS ROUTK ;IF NO FURTHER INPUT THEN USE DEFAULT JP C,BOOTCD CALL EXF ;GET USER BOOT # POP BC JP BOOTCC ;------------------- POP HL SUB1: LD A,(HL) ;OUTPUT EXISTING CONTENTS CALL DASH1 CALL PCHK ;GET NEW VALUE RET C ;IF CHAR = CR THEN RETUR; INDICATION OF THE MEMORY'S OPERATIVENESS. ; ; T ; ;----------------------------------------------- MAY BE MODIFIED IF DESIRED. ; ; X ;DISPLAY ALL REGISTER VALUES ; ;r= A,B,C,D,E,F,H,L,M,P,S,I,'A,'B,'C,'D,'E,'H,'),A EX (SP),HL ;RECOVER TABLE PTR LD A,(HL) ;GET THE ATTRIBUTES EX (SP),HL RLCA ;IF 8 BIT REG THEN EXIT JR NC,XE  ; IF NO MORE ARGS THEN DONE WITH BREAKPOINTS ; GO2: LD A,C ;IF CHAR = CR THEN DONE BPING CP CR POP BC JR Z,GO3 ; ------- ; ; INPUT FROM PORT COMMAND ; ; THESE ROUTINES ALLOW BYTE-BY-BYTE INPUT OR OUTPUT FROM THE CURRENT ; CONSOLE DEVICEINE EXPECTS 3 PARAMETERS, ENTERED IN THE FOLLOWING SEQUENCE: ; SOURCE 1ST BYTE ADDR, SOURCE LAST BYTE ADDR & DESTINATION 1ST BY--------------------------------------------------------- ; ; SUBSTITUTE MEMORY COMMAND ; ; THIS ROUTINE ALLOWS THE USER TO N JR Z,SUB2 ;IF CHAR = ' ' OR ',' THEN EXIT CP LF ;IF CHAR = LF THEN BACK UP JR Z,SUB3 PUSH HL ;PTR CALL EXF ;CONT----------------------------- MTEST: CALL EXLF MTEST1: LD A,(HL) PUSH AF CPL LD (HL),A XOR (HL) ;RESULT SHOULD BE 0 L,'M,X,Y,R ; ;d= HEX NUMBER TO PLACE INTO REGISTER r ; ;----------------------------------------------------------- INC DE ;ELSE REG PAIR, DO OTHER 8 BITS LD A,H LD (DE),A XE: POP HL ;TABLE PTR XF: LD A,C ;IF LAST = CR THEN RETURN C