IMD 1.18: 19/12/2012 10:19:01  Disk Descriptor30à?€00M4ååååååååååååååååååååååååå0 ( ) *!+",#-$.%/ &0 'åååååååååååååååååååååååååååååååååååååååååååååååå0 ( ) *!+",#-$.%/ &0 'HBIO204 Z80x FBIO205 Z80€ FBIO205 Z80,!"#-M5ZBIOS2XX ; ;************************************************************* ; REVISIONS: ; ; 2.2.0 - RELEASE ; ; 2.2.3 - SWAPPED åN 84 GRH ; Change floppy disk drivers to relate to ISASI control of JADE ; FDC. ; Change IOPB sector value from physical INTRPTS EQU TRUE ;ENABLE INTERRUPT PROCESSING WHISTLE INTCPTS EQU TRUE ;ENABLE SYSTEM CALL INTERCEPT WHISTLE LIST ON ;**HBIO203 Z80Z$%&'()*+,-./01HBIO204AZ80s23456789:;<=>?@AFBIO110 Z80@BCDEFGHIJKLMHBIO204XZ80tNOPQRSTUVWXYZ[\]DCM & BIOS SECTORS ON DISK, ALLOWING A ; LARGER BIOS ALLOCATION ON THE DISK. ; ; 2.2.4 - ADDED NAKED TERMINAL DRIVERS & Iå sector (1..n) to logical ; sector value (0..n-1). This maintains more uniformity in ; parameter passing between hard di*********************************************************** ; ; (c) 1981 GRH Electronics, CUPERTINO, CA ; ;*************HBIO204BZ80o^_`abcdefghijklååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååOBYTE IN ; ANTICIPATION OF THE MONITOR. ALSO, ALL REFERENCES ; REQUIRING THE I/O PROMS TO BOOT HAS BEEN REMOVED. ; ;åsk & JADE floppy IOPBs. ; Vector I/O routines to monitor rom routines. ; ; 2.03 - 4 JUN 84 GRH ; Add bells & whistles agai************************************************ ; ; CONFIGURATION: ; ; CPM ISASI ; DRIVE DRIVE USAGE IF HARDBT ;HARD å 2.2.5 - RECONFIGURE FOR 62K SYSTEM. ; ; 2.2.6 - 20 FEB 83 ; DOUBLE D REV C UPGRADE. CHANGE BOARD STATUS PORT BITS. ; ; 2.2ån. ; Move to 61k system. ; ; 2.04 - 30 MAR 85 GRH ; Implemented hard disk drive 1 as C: & D:. ; Implemented the Logon funDISK BOOT CONFIG. ; A 0 SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; B 1 SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 0 ; Cå.7 - 8 MAR 83 GRH ; ADDED CLOCK/CALENDAR DRIVER, SYSTEM CALL INTERCEPT, ; ILLEGAL SYSTEM CALL MESSAGE, CHANGED BIOS SIZE TO ENåction for the hard disk. ; Implemented user friendly disk error options: Abort, Retry, Ignore. ; Solved warm boot hang problem 2 SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; D 3 SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ; E 4 JADE FLOPPY PHYSICAåD ; OF INITIALIZED DATA AREA. RESTRUCTURE MODULES. ; ; 2.28 - 22 APR 83 GRH ; CHANGED DEFINITIONS TO ALLOW BIG DIRECTORIESå by reseting host adapter if busy. ; VERSN EQU '04' ; ;*********************************************************************L DRIVE 0 ; F 5 JADE FLOPPY PHYSICAL DRIVE 1 ; 6 JADE FLOPPY PHYSICAL DRIVE 2 ; 7 JADE FLOPPY PHYSICAL DRIVE 3 å. ; DISALLOWED DRIVES C & D. ; ; 2.29 - 3 SEP 83 GRH ; Changed Rev # for blocked DCM. Enables IBM system 34 ; 256 bytes p TITLE CUSTOMIZED BIOS FOR M5B LIST NOCOND LIST OFF ;********************************* ; ; ASSEMBLY PARAMETERS ; ;********* SUBTTL SYSTEM DECLARATIONS ;-------------------------------------- ; ; DISK OPERATING SYSTEM ADDRESSES ; ;------ ELSE ; A 4 JADE FLOPPY PHYSICAL DRIVE 0 ; B 5 JADE FLOPPY PHYSICAL DRIVE 1 ; 6 JADE FLOPPY PHYSICAL DRIVE 2 åer sector disks to be read. ; ; 1.10 - 23 SEP 83 GRH ; Move clock-calendar routines to ROM. Add Interrupt handler ; (Mode **************************** FALSE EQU 0 TRUE EQU NOT FALSE ;====================================== ; ; CONDITIONAL ASSEMBL-------------------------------- NKSYS: EQU 61 ;SYSTEM SIZE IN K BYTES KBYTE: EQU 1024 CPMSZ: EQU KBYTE*NKSYS CPMBS: EQU CP ; 7 JADE FLOPPY PHYSICAL DRIVE 3 ; C 0 SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; D 1 SIDE 2 & 3 OF HARD DISK PHå2). Change Revision display of sign-on (separate CBIOS rev). ; ; 2.00 - 24 MAR 84 GRH ; Modify for hard disk ; ; 2.01 - 2Y FLAGS ; ;====================================== SHORT EQU TRUE ;SHORT BIOS (REMOVES UNESENTIAL CODE) LSTINC EQU FALSE ;LMSZ - (20 * KBYTE) ; CP/M BIAS VALUE CCP: EQU CPMBS+3400H ;ADDR OF CCP BDOS: EQU CPMBS+3C00H ;ADDRESS OF BDOS BIOS: EQU CPMBSYSICAL DRIVE 0 ; E 2 SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; F 3 SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ENDIFå8 APR 84 GRH ; Change hard disk DPB to reflect half size directory, but keep ; allocation for 1k directory ; ; 2.02 - 2 JUIST INCLUDE FILES HARDBT EQU TRUE ;HARD DISK BOOT (FALSE= FLOPPY BOOT) USEMON EQU TRUE ;USE MONITOR ROM I/O ROUTINES IF TRUE0 ( ) *!+"#-$.%/ &0 ',+4A00H ;ADDRESS OF BDOS BIOSR: EQU 1000H-BIOS ; PAGE0: EQU 0 ;START OF CP/M RAM IOBYTE: EQU PAGE0 + 3 ;IOBYTE ADDR DEFDRV:---------------------------- ; ; OTHER BIOS VARS NEEDING INIT ; ;-------------------------------------- BTDMA: DW 0 ;SYSTE9 ;RETURN TIME ENTRY ;**************************** ; ; ASCII CHARS ; ;**************************** LF: EQU 0AH CR: EQ DB 'M5b CBIOS Vers 2.' DM HIGH VERSN , LOW VERSN,CR,LF DS DIRBF+SECSZ-$ ;FILL OUT DIRECTORY BUFFER TO 1 SECTOR SIZE P CNSCK ;GET CONSOLE STATUS JP CI ;CONSOLE INPUT JP COC ;CONSOLE OUTPUT JP LO ;PRINTER OUTPUT JP PUNCH JP READER  EQU PAGE0 + 4 ;DEFAULT DRIVE PARAM ADDR DEFBFR EQU PAGE0 + 80H ;DEFAULT BUFFER TPA: EQU 100H ; ; OTHER DECLARATIONS ; DM TRANSFER ADDR DTPTR: DW 0 ;DRIVE TABLE PTR LOGRQ: DB 0 ;LOG ON REQUEST REG. ;----------------------------------------U 0DH CTRLZ: EQU 1AH ; ; INCLUDE JDDCONT.DEF ; INCLUDE MONBOARD.DEF ; INCLUDE IOBOARD.DEF ; INCLUDE NAKEDT.DEF ; INCLUD ;---------------------------------------------------------- ; ; WARM REBOOT ENTRY LOADS CCP,BDOS FROM DISK & ; SETS UP VAREFIOB: EQU 80H ;INITIAL IOBYTE VALUE (LPT ON) DFDRV: EQU 0 ;INITIAL DEFAULT DRIVE SECSZ: EQU 128 FMTSZ: EQU 100H ;FORMAT B---------------------------------- ; ; DIRECTORY SECTOR BUFFER STARTS HERE AFTER CRUNCHING COLD START ; CODE. THIS BUFFER ISE ISASI.DEF ; INCLUDE CLOCK.DEF IF NOT LSTINC LIST OFF ENDIF *INCLUDE JDDCONT.DEF *INCLUDE MONBOARD.DEF *INCLUDE IOBIABLES ; ;---------------------------------------------------------- WARM: IF INTRPTS LD A,HIGH INTABL ;INIT INTERRUPT V ;SET TRANSFER ADDR JP DISKRD ;PERFORM DISK READ JP DISKWR ;PERFORM DISK WRITE JP LISTST ;RETURN LIST STATUS JP SECTRUFFER SIZE NDRVS: EQU 6 BTDIRS EQU 3 ;HARD DISK SYSTEM TRACKS DIRECTORY SECTOR BTCCPO EQU 3 ;OFFSET TO CCP ENTRY IN SYS TRK USED BY THE CP/M DIRECTORY CHECK ROUTINES THAT ; CHECK FOR DISK CHANGE. ; ;------------------------------------------------OARD.DEF *INCLUDE NAKEDT.DEF *INCLUDE ISASI.DEF *INCLUDE CLOCK.DEF ;====================================== ; ; DRIVE FLAECTORS LD I,A IM 2 ;USE MODE 2 IN A,INTMSK AND 7FH ;ENABLE INT 7 OUT INTMSK,A IN A,MONSTS ;ENABLE MONITOR BOARN ;TRANSLATE SECTOR JP ITRAP ;FORMAT VECTOR ;************************************************************************** S DIRECTORY IF HARDBT LASTSEC EQU 47 ;LAST BOOT SECTOR ELSE LASTSEC EQU 45 ;LAST BOOT SECTOR ENDIF ;***************-------------------------- DIRBF: EQU $ ;BUFFER BEGINNING ;--------------------------------------------------------------; ; THESE BOOT PARAMS MUST RESIDE AS DEFINED RIGHT BEFORE THE COLD ; INIT ROUTINE START AND MUST BE IN THE 1ST SECTOR. ; TH********************************************************** ; ; THE FOLLOWING 2 PARAMETERS MUST REFLECT THE MAX DISK SIZE & ; ------ ; ; INIT - COLD START ENTRY FROM BOOT MUST SET ALL BIOS PARAMS ; ;----------------------------------------------- DENSITY 0:SINGLE, 1:DOUBLE ; | | | | |____ TRACK 1 DENSITY 0:SINGLE, 1:DOUBLE ; | | | |______ DATA TRACKS DENSITY 0OM LD A,0 ;SET DRIVE 0 LD (BTDRV),A IF HARDBT IN A,(HSTATUS) ;IF HOST ADAPTER BUSY THEN BIT HBUSYB,A JR Z,NTHESE 2 WORDS ARE REFERENCED BY THE BOOT CODE IN ; ORDER TO FIND THE LOAD ADDRESS FOR THE BIOS & IT'S LENGTH. ; ;*************THE MAX DIRECTORY SIZE. ; ;************************************************************************* ALLSIZ EQU 33 ;ALLOCATIO--------------------- INIT: LD SP,DEFBFR ;USE PAGE 0 FOR STACK CALL GETMON ;MAKE SURE BOOT ROM IS DISABLED LD A,DEFI:SINGLE, 1:DOUBLE ; | | |________ 0:SINGLE SIDED, 1:DOUBLE SIDED ; | |____________ 0:FLOPPY DISK, 1:HARD DISK ; |__UNG LD A,1 SHL HRESET ; RESET HOST ADAPTER TO CLEAR HANG OUT (HCMD),A XOR A OUT (HCMD),A EX (SP),HL ; DELAY FOR************************************************************* BIOSSZ: DW BIOSND - BIOS ;BIOS MODULE SIZE IN BYTES BIOSST: DW BN BIT MAP SIZE (1 BYTE PER 8 CLUSTERS) CHKSIZ EQU 32 ;DIRECTORY CHECKSUMS ARRAY SIZE (1 BYTE PER DIR. SECTOR) ;*************OB ;INIT I/O BYTE LD (IOBYTE),A LD A,DFDRV ;INIT DEFAULT DRIVE LD (DEFDRV),A ; ; SEND SYSTEM SIGN-ON ; CLOGO: LD _____________ SECTOR SIZE BITS= 00:128, 01:256, 10:512, 11:1024 ; ; DRIVE FLAGS BIT #S ; DFT0D EQU 0 DFT1D EQU 1 DFDTD EQU HOST ADAPTER TO CATCH UP EX (SP),HL WARM1: IN A,(HSTATUS) ; WHILE BUSY THEN WAIT BIT HBUSYB,A JR NZ,WARM1 NTHUNG: IOS ;BIOS MODULE LOAD ADDR FOR SBD INIT1: JR INIT ;---------------------------------- ; ; DISK CONTROLLER COMMAND BLOC*************** ; ; ADDRESSES ; ;**************************** CALROM EQU 7 ;CALENDAR ROM SELECT # RDBENT EQU 0F800H ;REAHL,MSGSO CALL EDITOR LD HL,(BIOS+4) ;MODIFY COLD START TO WARM START LD (BIOS+1),HL JP WARM ; ; SIGN-ON MESSAGE ; 2 DFTSD EQU 3 DFHARD EQU 5 DFDBL EQU 6 DFDBL1 EQU 7 LIST ON SUBTTL BIOS CODE ORG BIOS ;---------------------------LD BC,DEFBFR ;READ BOOT DIRECTORY CALL SETDMA LD C,BTDIRS CALL SETSEC LD C,0 ELSE LD C,1 ENDIF CALL SETTRK K ; ;---------------------------------- BTDRV: DB 0 ;DRIVE # BTTRK: DB 0 ;TRACK # BTSEC: DB 0 ;SECTOR # ;----------D CLOCK BUFFER ENTRY SETENT EQU RDBENT + 3 ;SET CLOCK ENTRY CALENT EQU RDBENT + 6 ;RETURN CALENDAR ENTRY TIMENT EQU RDBENT +  MSGSO: DB CR,LF DB CPMSZ / (KBYTE * 10) + '0' DB (CPMSZ MOD (KBYTE * 10)) / KBYTE + '0' DB 'K CP/M-80 Vers 2.2',CR,LF - ; ; BIOS JUMP VECTOR TABLE ; ;---------------------------- JP INIT1 ;COLD START ENTRY JP WARM ;RELOAD CCP/BDOS JGS BYTE FROM ID SECTOR ; ;====================================== ; ; 7 0 ; | | | |0| | | | | ; \___/^ ^ ^ ^ ^__ TRACK 0D INTERRUPTS OR MONIE OUT MONSTS,A EI ENDIF LD SP,DEFBFR ;SELECT TEMPORARY STACK CALL GETMON ;SELECT MONITOR R0 ( ) *!+"#-$.%/ &0 ', IF HARDBT CALL DISKRD JR NZ,WEROR ENDIF LD BC,CCP ;SET LOAD ADDR CALL SETDMA IF HARDBT LD A,(DEFBFR FDSKER: LD HL,0 ;RETURN DPB_PTR = 0 FOR SELECT FUNCTION LD A,-1 ;RETURN -1 TO BDOS OR A RET ;**********************;COND. JR (ON) JR Z,CLKON LD A,18H ;UNCOND. JR (OFF) (CAUSES JUMP TO ILLEGAL) CLKON: LD (INHCLK),A ENDIF LD A,(DEFDUT BIT 7 LOG4: LD (LOGIOPB + PBDRV),A FDLOGR: CALL HDEXECL ;LOG ON DRIVE & RETURN IDENTITY SECTOR DATA JR Z,LOGCK L) CALL DSKER JR RWOPR ;SINCE RETURNED, DO RETRY DOFLOP: LD (IY + PBDRV),A LD A,(BTSEC) DEC A ;CHANGE TO LOGICAL S+ BTCCPO) ;PICK UP START OF CP/M IMAGE FROM DIRECTORY INC A ;OFFSET FOR READ DECRIMENT LD C,A ELSE LD C,2 ;START WIT*************************** ; ; SELECT DRIVE ; LOG-ON - SET DISK PARAMETER BLOCK ; ENTRY- C= DRIVE # ; E= 0 IF NEVER LOGGRV) ;PASS IN DEFAULT DISK TO CCP LD C,A JP CCP SUBTTL DISK ROUTINES ;*************************** ; ; READ A DISK SED A,(LOGIOPB + PBSTAT) ;PASS ERROR CODE TO DISK_ERROR() CALL DSKER JR FDLOGR ;RETURN HERE MEANS TO RETRY ; ; CHECK FORH SECTOR #2 ENDIF CALL SETSEC ; ; READ CCP/BDOS ; WREAD: CALL DISKRD JR NZ,WEROR ;IF ERROR THEN EXIT LD A,(BTSED BEFORE ; EXIT - HL= PTR TO DPT OR 0 FOR ERROR ; ;************************************************* SELDSK: LD HL,0 ;ASSUCTOR ; ;*************************** DISKRD: LD IY,IOPB ;SELECT READ OP LD (IY + PBCMD),RDCMD JR HDDO ;*********** JADE ID ; LOGCK: LD HL,DEFBFR LD DE,JADEID LD B,IDSZE LOGID: LD A,(DE) ;IF NO MATCH THEN ASSUME 3740 FORMAT CP (HL) ---------------- DSKOK: XOR A ;RETURN 0 RET ;-------------------------------------------------------------------- ; ;EC) ;IF LAST SECTOR THEN DONE CP LASTSEC JR NC,WZRPG INC A ;NEXT SECTOR LD (BTSEC),A LD DE,SECSZ ;DMA := DMA + SECTME ERROR LD A,C ;SET DRIVE # CP NDRVS ;IF NOT 0..(NUMBER_OF_DRIVES -1) THEN ERROR RET NC LD (BTDRV),A ;STORE DRIVE***************** ; ; WRITE A DISK SECTOR ; ;**************************** DISKWR: LD IY,IOPB ;SELECT WRITE OP LD (I JR NZ,LG3740 INC HL INC DE DJNZ LOGID ; ; DISKETTE CONTAINS ID. ASSUME NO SECTOR TRANSLATION ; CALL TRNONE  DISK ERROR SUBR. ; QUERIES USER FOR ABORT (REBOOT), IGNORE (RETURN OK TO BDOS), ; RETRY (RETURNS TO CALLER) OR NORMAL BDOS OR SIZE LD HL,(BTDMA) ADD HL,DE LD (BTDMA),HL JR WREAD ; ; WARM BOOT ERROR, OUTPUT MSG & HALT ; WEROR: LD HL,MSGLE # LD A,E ;SET LOG REQUEST VECTOR LD (LOGRQ),A RETDSK: LD A,(BTDRV) ;COMPUTE TABLE PTR LD L,A LD H,0 ADD HL,HL ERROR (DEFAULT). ; ENTRY- A= ERROR CODE ; EXIT - A= FFH (DEFAULT), CHAR OTHERWISE ; HL= ? ; ;----------------------------- ;OUTPUT ERROR MESSAGE CALL EDITOR HALT ; ; BOOT OK, INIT PAGE 0 ; WZRPG: LD A,0C3H ;INITIALIZE BIOS WARM START VECTO;DISK # * 16 ADD HL,HL ADD HL,HL ADD HL,HL LD DE,D0DPH ADD HL,DE LD A,(LOGRQ) ;IF NOT_1ST_LOG_ON THEN RETURN TABLELOP ELSE CP 2 JR C,DOFLOP SUB 2 ;BIAS DOWN TO HARD DISK ADDRESS ENDIF SRL A ;0,1: DRV 0, 2,3: DRV 1 LDSINGLE (0) AND HARD DISK FLAG = FALSE (0) THEN USE ; 3740 FORMAT ; LD A,(DEFBFR + DDDDF - DDBUF) AND [1 SHL DFDTD] OR [1 --------------------------------------- DSKER: LD HL,DSKEB ;POINT TO ERROR BYTE CALL PRHEX ;LOAD ERROR CODE INTO MESSAGE R LD HL,BIOS + 3 LD (PAGE0),A LD (PAGE0 + 1),HL LD HL,BDOS + 6 ;INIT BDOS CALL VECTOR LD (PAGE0 + 5),A LD (PAGE0 + PTR AND 1 XOR 1 RET Z ; ; READ IDENTITY SECTOR ; LD (DTPTR),HL ;SAVE DRIVE TABLE PTR LD A,(BTDRV) ;PERFORM DCM  (IY + PBDRV),A LD D,0 ;COMPUTE SECTOR RR D ;DRIVE BIT 0 -> SECTOR BIT 7 LD A,(BTSEC) DEC A ;CHANGE TO LOGICAL SSHL DFHARD] CALL Z,TR3740 LOGDON: LD HL,(DTPTR) ;ELSE RETURN PTR TO TABLE XOR A RET ; ; ASSUME 3740 FORMAT DISKETTE LD HL,DSKEM ;OUTPUT ERROR MESSAGE CALL EDITOR CALL CI ;GET USER RESPONSE PUSH AF ;SAVE CHAR LD C,A ;ECHO CHAR  6),HL LD HL,DEFBFR ;SET DEFAULT SECTOR BUFFER LD (BTDMA),HL IF INTCPTS LD HL,(BDOS + 7) ;GET BDOS VECTOR LD (BDOLOG-ON IF NOT HARDBT CP 2 ;IF FLOPPIES THEN JR NC,LOG2 ADD 4 ;BIAS UP TO FDC DRIVES JR LOG3 LOG2: SUB 2 ;EECTOR AND 7FH OR D RWOPC: LD (IY + PBSEC),A LD A,(BTTRK) ;SET TRACK LD (IY + PBTRK),A LD (IY + PBFLG),0 ;NO F ; LG3740: LD A,(BTDRV) ;IF HARD DISK THEN IF HARDBT CP 4 JR NC,LG371 ELSE CP 2 JR C,LG371 ENDIF CAL CALL COC POP AF AND 5FH ;INSURE UPPER CASE CP 'R' ;IF RETRY THEN RETURN TO CALLER RET Z POP HL ;NOT RETURNISV),HL ;PUT IN INTERCEPT CODE LD HL,INTCPT ;NOW PUT INTERCEPT VECTOR INTO BDOS VECTOR LD (BDOS + 7),HL IN A,(CLKDAT) LSE BIAS DOWN TO HARD DISKS LOG3: ENDIF LD HL,LOGIOPB + PBSEC ;START WITH SECTOR 0 LD (HL),0 CP 4 ;IF HARD DISK THLAGS FOR NOW LD HL,(BTDMA) ;SET DMA ADDR LD (IY + PBDMA),L LD (IY + [PBDMA + 1]),H LD (IY + PBDMAX),0 ;THIS BANK FORL TRNONE ; NO XLATE CALL DPBAD ; USE DEFAULT TABLE LD HL,HDPBK JR MOVDPB LG371: CALL TR3740 ;SET SECTOR TRANSLATE NG, WASTE ADDRESS TO CALLER CP 'A' ;IF ABORT THEN RE-BOOT JP Z,0 SUB 'I' ;IF IGNORE THEN RETURN NO ERROR RET Z ;IF CLOCK NOT PRESENT THEN TURN OFF CLOCK DRIVE AND 11000000B ;TEST UNUSED BUT DRIVEN BITS (1S IF NOT THERE) LD A,38H EN JR NC,LOG4 RRCA ;IF ODD LOGICAL DRIVE THEN PUSH AF AND 80H ;SECTOR = 128 LD (HL),A POP AF AND 7FH ;MASK O NOW RWOPR: CALL HDEXEC ; DO OP RET Z ;IF NO_ERROR THEN RETURN LD A,(IY + PBSTAT) ;PASS STATUS BYTE TO DISK_ERROR(Y + PBCMD),WRCMD HDDO: LD A,(BTDRV) CP NDRVS ;IF RANGE ERROR THEN ABORT JP NC,FDSKER IF HARDBT CP 4 JR NC,DOFCALL DPBAD ;GET ADDR OF DPB & MOVE DOWN DISK INFO TO IT LD HL,DEFBFR + DDDPB - DDBUF CALL MOVDPB ; ; IF DENSITY FLAG = ECTOR JR RWOPC ;----------------------------------------- ; ; NORMAL EXIT ; EXIT - A= 0 ; ;-------------------------0 ( ) *!+"#-$.%/ &0 ', CALL DPBAD ;MOVE PARAMETERS INTO DISK PAR BLK LD HL,SDPBK MOVDPB: LD BC,DPBSZ ;MOVE DRIVE TABLE TO CP/M DRIVE TABLE  NOT MODIFIED, THEN IT IS ALLWAYS FALSE (NOP). ; INHCLK: JR C,ILLEGC ; ; NOW CHECK FOR EXTENDED CALLS ; CP 8DH ;IF RETU***************** SETSEC: LD A,C LD (BTSEC),A RET ;***************************** ; ; SET TRANSFER ADDR ; ENTRY- BC=******** CLKTIM: LD HL,TIMENT JR CLK1 ;************************************************************ ; ; READ CLOCK TSK EXECUTE SUBR ; EXIT - NZ= ERRORS ; ;********************************* HDEXECL: LD HL,LIOPBAD ;USE LOGON IOPB JR HDEXELDIR JR LOGDON ;RETURN PTR TO TABLE ;********************************* ; ; SET 3740 SECTOR TRANSLATION ; EXIT - DRN VERSION THEN RETURN IT JR Z,RETVER CP 90H ;IF NOT CLOCK THEN ERR JR C,ILLEGC JR Z,CLKCAL ;IF CALENDAR THEN GET I ADDRESS ; EXIT - HL= BC= ADDRESS ; ;***************************** SETDMA: LD (BTDMA),BC RET ;***********************IME FUNCTION 93H ; ENTRY- DE= PTR TO 13 BYTE BUFFER FOR CLOCK DATA ; ;*******************************************************E, HL= ? ; ;********************************* TR3740: LD DE,SDTRAN SETTR LD HL,(DTPTR) LD (HL),E INC HL LD (HL),D RET CP 92H JR C,CLKSET ;IF SET FUNCTION THEN SET CLOCK JR Z,CLKTIM ;IF TIME THEN GET IT CP 93H JR Z,CLKRDC ;IF REA**************************************** ; ; SECTOR TRANSLATION ; ENTRY- DE= 0: NO XLATE, ELSE PTR TO XLATE TABLE ; BC= SEC***** CLKRDC: LD C,E ;SET UP PARAMETERS LD B,D LD HL,RDBENT JR CLK2 ;********************************************A,(HL) INC HL OUT (HCMD),A HDX2: IN A,(HSTATUS) BIT HBUSYB,A JR NZ,HDX2 DJNZ HDX1 LD A,HEXEC ;NOW EXECUTE THT ;********************************* ; ; SET NO SECTOR TRANSLATION ; EXIT - HL, DE= ? ; ;*****************************D CLOCK THEN GET IT ; ; ILLEGAL SYSTEM CALL ; ILLEGC: LD HL,ISCMSG ;OUTPUT WARNING CALL EDITOR XOR A ;BC = HL = A = 0 TOR # TO XLATE ; EXIT - HL= XLATED SECTOR OR (BC) + 1 ; BC= UNCHANGED ; A, DE= ? ; ;*************************************************** ; ; CLOCK SET FUNCTION 91H ; ENTRY- DE= CLOCK IMAGE BUFR PTR (13 BYTES LONG) ; ;****************************E IOPB OUT (HCMD),A HDX3: IN A,(HSTATUS) BIT HBUSYB,A JR NZ,HDX3 AND (1 SHL HERRB) + (1 SHL HFERRB) ;CHECK FOR ERRO**** TRNONE: LD DE,0 JR SETTR ;************************************** ; ; GET DRIVE PARAMETER BLOCK ADDR ; EXIT - D LD L,A LD H,A LD C,A LD B,A RET ;***************************************** ; ; CDOS RETURN VERSION SYSTEM CALL RS RET IF INTCPTS ;*************************************************************************** ; ; SYSTEM CALL INTERE= DPB PTR ; HL= ? ; ;************************************** DPBAD: LD HL,(DTPTR) ;FETCH BASE ADDR LD DE,10 ;ADD OFFSET  ; MAKES CLOCK/CALENDAR WORK. ; EXIT - B= 1 ; ;***************************************** RETVER: LD B,1 RET SUBTTL MI LD L,(HL) LD H,0 RET ; NOTRAN: LD HL,1 ADD HL,BC RET ;************************************** ; ; LOAD HEX D************************************************ ; ; EXECUTE ROM ROUTINE ; ENTRY- HL= ENTRY ADDRESS ; A= ROM # ; EXIT - ENCEPT ROUTINE CHECKS FOR ILLEGAL BDOS CALLS & ; PRINTS MESSAGE IF ILLEGAL. ALSO IMPLEMENTS CDOS CLOCK/CALENDAR ; SYSTEM CALLSOF DPB PTR ADD HL,DE LD E,(HL) ;FETCH DPB PTR INC HL LD D,(HL) RET ;*************************************** ; SC I/O DRIVERS ;***************************************** ; ; CLOCK ROUTINES ; ;***************************************** ATA INTO MEMORY SUBR ; ENTRY- A= DATA ; HL= PTR TO MEMORY ; EXIT - A= DATA ; HL= HL + 2 ; ;*****************************TRY ROM RE-SELECTED ; ;********************************************************** EXROM: PUSH AF ;SAVE NEW ROM IN A,RO FOR ASMB. ; ;*************************************************************************** INTCPT: LD A,C ;CHECK CALL VALIDIT; HOME DRIVE - TREAT AS SEEK TRK 0 ; ;*************************************** HOME: LD C,0 ;**************************; ; RETURN CALENDAR FUNCTION 90H ; EXIT - A= DAY ; B= MONTH ; C= YEAR ; L= DAY OF WEEK ; ;************************************* PRHEX: CALL PRDIG ;DO HIGH NIBBLE PRDIG: RLCA ;POSITION NIBBLE INTO LOW 4 BITS RLCA RLCA RLCA PUSH AFMSEL ;SAVE CURRENT ROM LD (ROMSAV),A POP AF ;SELECT NEW ROM AND ROMSMK OUT ROMSEL,A PUSH HL ;SAVE ENTRY LD HY CP 41 ;IF <= 40 THEN OK BDOSV EQU $ + 1 JP C,BDOS + 11H ;THIS ADDR MODIFIED BY WARM BOOT RTN ; ; THE FOLLOWING COND*** ; ; SET TRACK # ; ENTRY- C= TRACK # ; EXIT - A= C= TRACK # ; ;***************************** SETTRK: LD A,C LD (BTTR************* CLKCAL: LD HL,CALENT ;ROM ENTRY POINT CLK1: LD BC,CLKBFR ;READ CLOCK JR CLK2 ;*********************** ;SAVE DATA AND 0FH ;MASK OFF OTHER NIBBLE CP 10 ;OFFSET IF > 9 JR C,NTALPH ADD 7 NTALPH: ADD '0' ;CONVERT TOL,EXROMR ;PUT RETURN ADDR ON STACK EX (SP),HL JP (HL) ;EXECUTE ROM EXROMR: PUSH AF ;SAVE RETURN VALUE LD A,(ROMSAV) ;ITIONAL JUMP IS MODIFIED TO AN UNCONDITIONAL JUMP BY ; THE WARM BOOT ROUTINE IF THE CLOCK/CALENDAR BOARD IS NOT PRESENT ; IFK),A RET ;***************************** ; ; SET SECTOR ; ENTRY- C= SECTOR # ; EXIT - A= C= SECTOR # ; ;************************** ; ; RETURN TIME FUNCTION 92H ; EXIT - A= SECONDS ; B= MINITS ; C= HOURS ; ;***************************** ASCII LD (HL),A ;STORE CHAR POP AF ;DATA INC HL ;NEXT CHAR RET ;********************************* ; ; HARD DI************************** SECTRN: LD A,D ;IF TABLE ADDR = 0 THEN NO TRANSLATION OR E JR Z,NOTRAN EX DE,HL ADD HL,BC ****************************** CLKSET: LD C,E ;SET UP PARAMETERS LD B,D LD HL,SETENT CLK2: LD A,CALROM ;**********C1 HDEXEC: LD HL,IOPBADR ;OUTPUT IOPB ADDRESS TO ISASI HDEXEC1: LD B,3 HDX1: LD A,(HL) INC HL OUT (HDATA),A LD 0 ( ) *!+"#-$.%/ &0 ',RESELECT ORIGINAL ROM OUT ROMSEL,A POP AF ;RETURN VALUE RET ENDIF SUBTTL CHAR I/O ROUTINES ;*************************** ; ; UNSUPPORTED INTERRUPT ; ;************************************** ILLINT: PUSH AF ;SAVE ALL 8080 REGS PU ;********************************** ; ; READER DRIVER - DUMMY ; EXIT - A= CTRL-Z ; ;*********************************AMETER BLOCK ; ;------------------------------------------- HDPBK: DW 128 ;SECTORS PER TRACK (LOGICAL) (SPT) DB 5 ;BLOCK  EDITOR ; ENTRY- HL= TEXT PTR (BIT 7= 1: TERMINATOR) ; EXIT - REGS= ? ; ;************************************************************* ; ; CONSOLE INPUT ; EXIT - A= CHAR ; ;************************** CI: IF USEMON CALL GETMON ;SWITCH IN MOSH HL PUSH BC LD HL,ILLIM ;NOTIFY USER OF INT JR IQCONT SUBTTL DATA CONSTANTS ;------------------------------------* READER: LD A,CTRLZ ;FAKE EOF RET ;************************************** ; ; PUNCH DRIVER ; ENTRY- C= CHAR TO OUTPSHIFT FACTOR (BSH) DB 31 ;BLOCK MASK (BLM) DB 1 ;NULL MASK (EXM) DW 1015 ;DISK SIZE (CLUSTERS -1) (DSM) DW 1152 NITOR ROM JP 0F803H ;USE MONITOR ELSE CALL CNSCK ;IF NO CHAR RDY THEN WAIT JR Z,CI IN A,NTD ;ELSE RETURN CHAR R------------ ; ; MODE 2 INTERRUPT VECTOR TABLE ; ;------------------------------------------------ IF $ AND 0FFH ;START ONUT ; ;************************************** PUNCH: RET ;************************************ ; ; PRINTER DRIVER ; EN/ 2 ;DIRECTORY MAX (DRM) DB 0FFH ;ALLOCATION 0 (AL0) DB 10000000B ;ALLOCATION 1 (AL1) DW 0 ;CHECK SIZE (CKS) D(HL) ;IF BIT 7 SET THEN RETURN RET NZ INC HL ;ELSE PRINT NEXT CHAR JR EDITOR IF INTRPTS SUBTTL INTERRUPTS ;---ET ENDIF ;**************************************** ; ; RETURN CONSOLE STATUS ; EXIT - A= 0: NOT READY ; FFH: CH EVEN PAGE BOUNDARY DS 100H - ($ AND 0FFH) ENDIF INTABL: REPT 7 ;1ST 7 ARE UNSUPPORTED DW ILLINT ENDM DW ITRAP TRY- C= CHAR TO OUTPUT ; ;************************************ LO: IF USEMON CALL GETMON JP 0F80FH ELSE CALL LIW 2 ;TRACK OFFSET (OFF) ;--------------------------------- ; ; HARD DISK DATA ; ;--------------------------------- ----------------------------------- ; ; USER INTERRUPT ; ;-------------------------------------- ITRAP: PUSH AF ;SAVE USAR READY ; ;**************************************** CNSCK: IF USEMON CALL GETMON JP 0F812H ELSE IN A,NTS ;IF ;INT 8 IS USER INTERRUPT ENDIF ;-------------------------------------- ; ; 3740 SECTOR TRANSLATION TABLE ; **** CP/M ED REGISTERS PUSH HL PUSH BC LD HL,ITMSG ;NOTIFY USER IQCONT: CALL EDITOR LD HL,IQMSG ;QUERY USER CALL EDITOR CDATA NOT READY THEN RETURN 0 AND 1 SHL NTRDY TTOST1: RET Z LD A,-1 ;ELSE RETURN -1 RET ENDIF ;*****************SINGLE DENSITY **** ; ;-------------------------------------- SDTRAN: DB 1,7,13,19,25,5,11,17,23,3,9,15 DB 21,2,8,14,20,26, CENTOUT,A SET 7,A OUT CENTOUT,A RET ENDIF ;***************************************** ; ; RETURN LIST DEVICE ST DB HIOPBH DB 0 DB HIOPBX LOGIOPB: DB LOGCMD ;READ COMMAND DB 4 ;DRIVE DW 0 ;TRACK DW 0 ;SECTOR DB 0 ;FLALL CI CP 3 ;IF CTRL-C THEN WARM BOOT JP Z,PAGE0 AND 5FH ;IGNORE CASE CP 'Y' ;IF YES THEN ABORT JP Z,PAGE0 ********************** ; ; CONSOLE OUTPUT ; ENTRY- C= CHAR TO OUTPUT ; ;*************************************** COC: I6,12,18,24,4,10 DB 16,22 ;------------------------------------------- ; ; DEFAULT FLOPPY DISK PARAMETER BLOCK ; IBM 37ATUS ; EXIT - A= 0: BUSY, FFH:READY ; ;***************************************** LISTST: IF USEMON CALL GETMON JP 0FAGS (LOGON) DW DEFBFR ;DMA ADDR DB 0 ;BANK ADDR DS (LOGIOPB + 16) - $ LIOPBAD: DB LOW LOGIOPB ;LOGON DISK IOPB POINCP 'I' JR NZ,ITRAP1 POP BC ;ELSE RESTORE & GOTO MONITOR TRAP POP HL POP AF JP 0038H ITRAP1: CP 'M' ;IF MONITOR F USEMON CALL GETMON JP 0F809H ELSE CALL NTOST ;IF BUSY THEN WAIT OR A JR Z,COC LD A,C OUT NTD,A RET 40 SINGLE DENSITY FORMAT ; ;------------------------------------------- SDPBK: DW 26 ;SECTORS PER TRACK DB 3 ;BLOCK SHIFT827H ELSE IN A,CENTS ;IF BUSY THEN RETURN 0 CPL ;INVERT THE SENSE AND 1 SHL CENTBSY RET Z LD A,0FFH ;ELSE RETER TABLE DB HIOPBL DB HIGH LOGIOPB DB HIOPBH DB 0 DB HIOPBX ;------------------ ; ; MESSAGES ; ;-------THEN GOTO MONITOR TRAP JR NZ,ITRAPR CALL GETMON ;INSURE MONITOR THERE POP BC POP HL POP AF JP 0F824H ITRAPR: P ;*********************************************** ; ; RETURN CONSOLE OUTPUT READY STATUS ; EXIT - A= 0: BUSY, FFH: READY ;  FACTOR DB 7 ;BLOCK MASK DB 0 ;NULL MASK DW 242 ;DISK SIZE -1 DW 63 ;DIRECTORY MAX DB 11000000B ;ALLOC 0 DB 0 ;TURN -1 RET ENDIF ;**************************** ; ; GET MONITOR PROM SUBR ; EXIT - A= ? ; ;*********************----------- MSGLE: DM CR,LF,'LOAD ERROR' DSKEM: DB CR,LF,'Disk Error Status: ' DSKEB: DB '00H',CR,LF DM 'Abort, Ignore, RetOP BC ;IF CONTINUE THEN RESTORE & RETURN POP HL POP AF EI ;RE-ENABLE INTERRUPTS RET ;***************************;*********************************************** NTOST: IN A,NTS CPL ;REVERSE SENSE AND 1 SHL NTBSY JR TTOST1 ENDIFALLOC 1 DW 16 ;CHECK SIZE DW 2 ;TRACK OFFSET ;------------------------------------------- ; ; DEFAULT HARD DISK PAR******* GETMON: LD A,XMONROM OUT (ROMSEL),A RET ;***************************************************** ; ; MESSAGESTST ;IF BUSY THEN WAIT JR Z,LO LD A,C ;OUTPUT CHAR SET 7,A OUT CENTOUT,A RES 7,A ;OUTPUT LOW TRUE STROBE OUTIOPB: REPT 16 ;;HARD DISK IOPB DB 0 ENDM IOPBADR: DB LOW IOPB ;HARD DISK IOPB POINTER TABLE DB HIOPBL DB HIGH IOPB** EDITOR: LD C,(HL) ;MESSAGE EDIT LOOP PUSH HL ;SAVE PTR RES 7,C ;CLEAR BIT 7 FOR OUTPUT CALL COC POP HL BIT 7,0 ( ) *!+"#-$.%/ &0 ',ry, (BDOS) - ' IF INTCPTS ISCMSG: DM CR,LF,'ILL. SYS. CALL',CR,LF ENDIF IF INTRPTS ITMSG DM CR,LF,'User' ILLIM DMå--------------------------- CLKBFR: DS 13 ROMSAV DS 1 ;ROM SWAP SAVE OF ORIGINAL ROM ENDIF ;---------------------RD DISK BOOT CONFIG. ; A 0 SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; B 1 SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 0 ; ECTORY SIZE -1 DS 2 ;AL0,1- DIRECTORY ALLOCATION ; 1 MSB PER DIRECTORY CLUSTER ALLOCATED DS 2 ;CKS- # DIRECTORY SECTORS  CR,LF,'Unsupported' IQMSG DM ' Interrupt: Abort? (Y/N) - ' ENDIF ;---------------------------- ; ; ID SECTOR LABEL å--------------------------- ; ; DRIVE ALLOCATION AREAS DECLARED ; ;------------------------------------------------ ALLDA C 2 SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; D 3 SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ; E 4 JADE FLOPPY PHYS ; ;---------------------------- JADEID: DB 'Jade DD ' IDSZE: EQU $-JADEID ;-------------------------------------- ; ;åL: MACRO #D IF (HARDBT AND (DD < 5)) OR (NOT HARDBT AND (DD > 2)) D#D(DD)ALL: DS 128 ;ALLOCATION FOR DRIVE #D(DD) ELSE ICAL DRIVE 0 ; F 5 JADE FLOPPY PHYSICAL DRIVE 1 ; 6 JADE FLOPPY PHYSICAL DRIVE 2 ; 7 JADE FLOPPY PHYSICAL DRIVE DD DL 1 REPT NDRVS ALLDPB 0123456789ABCDEF DD DL DD + 1 ENDM IF ($ > 0F800H) OR ($ < 8000H) CONMSG BIOS TOO  DRIVE PARAMETER HEADER AREA ; 1 PER DRIVE ; ;-------------------------------------- ALLDPH: MACRO #D D#D(DD)DPH: ;DRIVE  TITLE CUSTOMIZED BIOS FOR M5B LIST NOCOND LIST OFF ;********************************* ; ; ASSEMBLY PARAMETERS ; ;***** D#D(DD)ALL: DS ALLSIZ ;DISK CLUSTER ALLOCATION BIT MAP FOR DRIVE #D(DD) D#D(DD)CHK DS CHKSIZ ;DIRECTORY CHECKSUMS STORAGE (1 B 3 ELSE ; A 4 JADE FLOPPY PHYSICAL DRIVE 0 ; B 5 JADE FLOPPY PHYSICAL DRIVE 1 ; 6 JADE FLOPPY PHYSICAL DRIVEBIG ENDIF END PARAMETER HEADER FOR DRIVE #D(DD) DW 0 ;SECTOR TRAN TBL (OR 0 IF NO XLATE) DW 0 ;SCRATCH AREA DW 0 ;" DW 0 ;" DW D**************************** FALSE EQU 0 TRUE EQU NOT FALSE ;====================================== ; ; CONDITIONAL ASSEMBLåIRBF ;DIRECTORY BUFFER PTR DW D#D(DD)DPB ;DRIVE PARAMETER BLK PTR IF (HARDBT AND (DD < 5)) OR (NOT HARDBT AND (DD > 2)) Y FLAGS ; ;====================================== SHORT EQU TRUE ;SHORT BIOS (REMOVES UNESENTIAL CODE) LSTINC EQU FALSE ;L---------------------- ; ; RESERVE DRIVE PARAMETER BLOCKS ; ;-------------------------------------- ALLDPB: MACRO #D D#D PHYSICAL DRIVE 0 ; E 2 SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; F 3 SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ENå DW 0 ;NO CHECKS ON HARD DISK ELSE DW D#D(DD)CHK ;DRIVE DISK CHECKSUMS ARRAY PTR ENDIF DW D#D(DD)ALL ;DRIVE CLUSIST INCLUDE FILES HARDBT EQU FALSE ;HARD DISK BOOT (FALSE= FLOPPY BOOT) USEMON EQU TRUE ;USE MONITOR ROM I/O ROUTINES IF TRU(DD)DPB: ;ALLOCATION FOR DRIVE #D(DD) IF DD = 1 DS 2 ;SPT- SECTORS/TRACK DS 1 ;BSH- BLOCK SHIFT FACTOR DETERMINED BY DIF ; ;************************************************************* ; REVISIONS: ; ; 2.2.0 - RELEASE ; ; 2.2.3 - SWAPPåTER ALLOCATION BIT MAP PTR ENDM DD DL 1 REPT NDRVS ALLDPH 0123456789ABCDEF DD DL DD + 1 ENDM BIOSND EQU $ SUBTTE INTRPTS EQU FALSE ;ENABLE INTERRUPT PROCESSING WHISTLE INTCPTS EQU FALSE ;ENABLE SYSTEM CALL INTERCEPT WHISTLE LIST ON CLUSTER SIZE ; 1K= 3, 2K= 4, 4K= 5, 8K= 6, 16K= 7 DS 1 ;BLM- BLOCK MASK ; 1K = 7, 2K= 15, 4K= 31, 8K= 63, 16K= 127 DED DCM & BIOS SECTORS ON DISK, ALLOWING A ; LARGER BIOS ALLOCATION ON THE DISK. ; ; 2.2.4 - ADDED NAKED TERMINAL DRIVERS åL DATA AREA ;------------------------------------------------ ; ; THE REMAINING AREA DOES NOT HAVE TO ; BELONG ON THE DISK.;************************************************************* ; ; (c) 1981 GRH Electronics, CUPERTINO, CA ; ;**********S 1 ;EXM- EXTENT MASK ; DSM < 256 : 1K= 0, 2K= 1, 4K= 3, 8K= 7, 16K= 15 ; DSM > 255 : 2K= 0, 4K= 1, 8K= 3, 16K= 7 DS 2& IOBYTE IN ; ANTICIPATION OF THE MONITOR. ALSO, ALL REFERENCES ; REQUIRING THE I/O PROMS TO BOOT HAS BEEN REMOVED. ;å ; ;------------------------------------------------ IF INTCPTS ;---------------------------- ; ; CLOCK BUFFER ; ;-*************************************************** ; ; CONFIGURATION: ; ; CPM ISASI ; DRIVE DRIVE USAGE IF HARDBT ;HA ;DSM- DRIVE STORAGE SIZE (IN CLUSTERS) ; INT(((#_TRACKS - OFF) * SPT * BYTES PER SECTOR) / CLUSTER SIZE) -1 DS 2 ;DRM- DIRYTE PER DIR SECTOR) ENDIF ENDM DD DL 1 REPT NDRVS ALLDAL 0123456789ABCDEF DD DL DD + 1 ENDM ;---------------- 2 ; 7 JADE FLOPPY PHYSICAL DRIVE 3 ; C 0 SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; D 1 SIDE 2 & 3 OF HARD DISKCHECKED ; (DRM +1) / 4 DS 2 ;OFF- # RESERVED TRACKS (USUALLY 2) DPBSZ EQU $ - D0DPB ELSE DS DPBSZ ENDIF ENDM 0 ( ) *!+"#-$.%/ &0 ', ; 2.2.5 - RECONFIGURE FOR 62K SYSTEM. ; ; 2.2.6 - 20 FEB 83 ; DOUBLE D REV C UPGRADE. CHANGE BOARD STATUS PORT BITS. ; ; TORY SIZE. ; ;============================================================================ ALLSIZ EQU 33 ;ALLOCATION BIT MAP gain. ; Move to 61k system. ; ; 2.04 - 30 MAR 85 GRH ; Implemented hard disk drive 1 as C: & D:. ; Implemented the Logon --- ORG BIOS ; JP INIT1 ;COLD START ENTRY JP WARM ;RELOAD CCP/BDOS JP CNSCK ;GET CONSOLE STATUS JP CI ;CONSOLE IN================================== NKSYS EQU 61 ;SYSTEM SIZE IN K BYTES KBYTE EQU 1024 CPMSZ EQU KBYTE*NKSYS CPMBS EQU CPMS2.2.7 - 8 MAR 83 GRH ; ADDED CLOCK/CALENDAR DRIVER, SYSTEM CALL INTERCEPT, ; ILLEGAL SYSTEM CALL MESSAGE, CHANGED BIOS SIZE TOSIZE (1 BYTE PER 8 CLUSTERS) CHKSIZ EQU 32 ;DIRECTORY CHECKSUMS ARRAY SIZE (1 BYTE PER DIR. SECTOR) ;==================function for the hard disk. ; Implemented user friendly disk error options: Abort, Retry, Ignore. ; Solved warm boot hang probPUT JP COC ;CONSOLE OUTPUT JP LO ;PRINTER OUTPUT JP PUNCH JP READER JP HOME ;HOME SELECTED DRIVE JP SELDSK ;SELE END ; OF INITIALIZED DATA AREA. RESTRUCTURE MODULES. ; ; 2.28 - 22 APR 83 GRH ; CHANGED DEFINITIONS TO ALLOW BIG DIRECTOR========================================================== ; ; ADDRESSES ; ;=============================================lem by reseting host adapter if busy. ; ; 2.05 - 17 JAN 86 GRH ; Changed floppy driver to new Rom version. ; Changed disk CT DISK DRIVE JP SETTRK ;SET TRACK # JP SETSEC ;SET SECTOR # JP SETDMA ;SET TRANSFER ADDR JP DISKRD ;PERFORM DISK REH ;ADDRESS OF BDOS BIOSR EQU 1000H-BIOS ; PAGE0 EQU 0 ;START OF CP/M RAM IOBYTE EQU PAGE0 + 3 ;IOBYTE ADDR DEFDRV EQU PAGEIES. ; DISALLOWED DRIVES C & D. ; ; 2.29 - 3 SEP 83 GRH ; Changed Rev # for blocked DCM. Enables IBM system 34 ; 256 byte=============================== CALROM EQU 7 ;CALENDAR ROM SELECT # ; ; CLOCK/CALENDAR ROM ENTRY POINTS ; RDBENT EQU 0F8I/O to allow drive driver change. ; Optimize various routines. ; VERSN EQU '05' ; ;****************************************AD JP DISKWR ;PERFORM DISK WRITE JP LISTST ;RETURN LIST STATUS JP SECTRN ;TRANSLATE SECTOR IF INTRPTS JP ITRAP ;0 + 4 ;DEFAULT DRIVE PARAM ADDR DEFBFR EQU PAGE0 + 80H ;DEFAULT BUFFER TPA EQU 100H ;====================================s per sector disks to be read. ; ; 1.10 - 23 SEP 83 GRH ; Move clock-calendar routines to ROM. Add Interrupt handler ; (Mo00H ;READ CLOCK BUFFER ENTRY SETENT EQU RDBENT + 3 ;SET CLOCK ENTRY CALENT EQU RDBENT + 6 ;RETURN CALENDAR ENTRY TIMENT EQU ======================================== ; ; OTHER DECLARATIONS ; ;=======================================================de 2). Change Revision display of sign-on (separate CBIOS rev). ; ; 2.00 - 24 MAR 84 GRH ; Modify for hard disk ; ; 2.01 RDBENT + 9 ;RETURN TIME ENTRY ; ; BOOT PROM ENTRY POINTS ; DKBASE EQU 0F800H ;BASE ADDRESS JADEX EQU DKBASE + 000CH ;JAD=============== ; ;*INCLUDE COMIOPB.DEF ;*INCLUDE JDDCONT.DEF ;*INCLUDE JDDDISK.DEF ;*INCLUDE MONBOARD.DEF ;*INCLUDE IOBOA MUST RESIDE AS DEFINED RIGHT BEFORE THE COLD ; INIT ROUTINE START AND MUST BE IN THE 1ST SECTOR. ; THESE 2 WORDS ARE REFERE===================== DEFIOB EQU 80H ;INITIAL IOBYTE VALUE (LPT ON) DFDRV EQU 0 ;INITIAL DEFAULT DRIVE SECSZ EQU 128 NDRVS- 28 APR 84 GRH ; Change hard disk DPB to reflect half size directory, but keep ; allocation for 1k directory ; ; 2.02 - 2E CONTROLLER DRIVER ISHAX EQU DKBASE + 000FH ;SASI HOST ADAPTOR DRIVER ;==================================================RD.DEF ;*INCLUDE NAKEDT.DEF ;*INCLUDE ISHA.DEF ;*INCLUDE CLOCK.DEF ; ;=====================================================NCED BY THE BOOT CODE IN ; ORDER TO FIND THE LOAD ADDRESS FOR THE BIOS & IT'S LENGTH. ; ;*********************************** EQU 6 BTDIRS EQU 3 ;HARD DISK SYSTEM TRACKS DIRECTORY SECTOR BTCCPO EQU 3 ;OFFSET TO CCP ENTRY IN SYS TRKS DIRECTORY IF H JUN 84 GRH ; Change floppy disk drivers to relate to ISASI control of JADE ; FDC. ; Change IOPB sector value from physi========================== ; ; ASCII CHARS ; ;================================================================================================== LIST OFF *INCLUDE COMIOPB.DEF *INCLUDE JDDCONT.DEF *INCLUDE JDDDISK.DEF *INCLUDE MONBOARD.DEF *IN*************************************** BIOSSZ: DW BIOSND - BIOS ;BIOS MODULE SIZE IN BYTES BIOSST: DW BIOS ;BIOS MODULE LOADARDBT LASTSEC EQU 47 ;LAST BOOT SECTOR ELSE LASTSEC EQU 45 ;LAST BOOT SECTOR ENDIF ;===============================cal sector (1..n) to logical ; sector value (0..n-1). This maintains more uniformity in ; parameter passing between hard= LF: EQU 0AH CR: EQU 0DH CTRLZ: EQU 1AH SUBTTL BIOS CODE ;-------------------------------------------------------------CLUDE IOBOARD.DEF *INCLUDE NAKEDT.DEF *INCLUDE ISHA.DEF *INCLUDE CLOCK.DEF LIST ON ;==================================== ADDR FOR SBD INIT1: JR INIT ;############################################################################ ; ; DIRECTORY============================================= ; ; THE FOLLOWING 2 PARAMETERS MUST REFLECT THE MAX DISK SIZE & ; THE MAX DIREC disk & JADE floppy IOPBs. ; Vector I/O routines to monitor rom routines. ; ; 2.03 - 4 JUN 84 GRH ; Add bells & whistles a--------------- ; ; BIOS JUMP VECTOR TABLE ; ;-------------------------------------------------------------------------======================================== ; ; DISK OPERATING SYSTEM ADDRESSES ; ;==========================================********************************* SUBTTL SYSTEM DECLARATIONS ;=============================================================FORMAT VECTOR ENDIF ;************************************************************************** ; ; THESE BOOT PARAMSZ - (20 * KBYTE) ; CP/M BIAS VALUE CCP EQU CPMBS+3400H ;ADDR OF CCP BDOS EQU CPMBS+3C00H ;ADDRESS OF BDOS BIOS EQU CPMBS+4A00 0 ( ) *!+"#-$.%/ &0 ', SECTOR BUFFER STARTS HERE AFTER CRUNCHING COLD START ; CODE. THIS BUFFER IS USED BY THE CP/M DIRECTORY CHECK ROUTINES THAT ; IN A,(CLKDAT) ;IF CLOCK NOT PRESENT THEN TURN OFF CLOCK DRIVE AND 11000000B ;TEST UNUSED BUT DRIVEN BITS (1S IF NOMOD (KBYTE * 10)) / KBYTE + '0' DB 'K CP/M-80 Vers 2.2',CR,LF DB 'M5b CBIOS Vers 2.', HIGH VERSN , LOW VERSN DM CR,LF TURNS TO CALLER ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; DISK ERROR SUBR. ; QUELL DISKRD JR NZ,WEROR ENDIF LD BC,CCP ;SET LOAD ADDR CALL SETDMA IF HARDBT LD A,(DEFBFR + BTCCPO) ;PICK UP  CHECK FOR DISK CHANGE. ; ;############################################################################ DIRBF: EQU $ ;BUFFET THERE) LD A,38H ;COND. JR (ON) JR Z,CLKON LD A,18H ;UNCOND. JR (OFF) (CAUSES JUMP TO ILLEGAL) CLKON: LD (INHCLK),A  ; DS DIRBF+SECSZ-$ ;FILL OUT DIRECTORY BUFFER TO 1 SECTOR SIZE ;--------------------------------------------------------RIES USER FOR ABORT (REBOOT), IGNORE (RETURN OK TO BDOS), ; RETRY (RETURNS TO CALLER) OR NORMAL BDOS ERROR (DEFAULT). ; ENTRR BEGINNING ;---------------------------------------------------------------------------- ; ; INIT - COLD START ENTRY ENDIF LD A,(DEFDRV) ;PASS IN DEFAULT DISK TO CCP LD C,A JP CCP SUBTTL DISK ROUTINES ;+++++++++++++++++++++++++++++-------------------- ; ; WARM REBOOT ENTRY LOADS CCP,BDOS FROM DISK & SETS UP VARIABLES ; ;---------------------------------Y- A= ERROR CODE ; EXIT - A= FFH (DEFAULT), CHAR OTHERWISE ; HL= ? ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++IF CALL SETSEC ; ; READ CCP/BDOS ; WREAD: CALL DISKRD JR NZ,WEROR ;IF ERROR THEN EXIT LD A,(IOPB + PBSECO) ;IF LAS FROM BOOT MUST SET ALL BIOS PARAMS ; ;---------------------------------------------------------------------------- INIT: ; +++++++++++++++++++++++++++++++++++++++++++++++ ; ; READ A DISK SECTOR ; ;++++++++++++++++++++++++++++++++++++++++++++++++------------------------------------------- WARM: IF INTRPTS LD A,HIGH INTABL ;INIT INTERRUPT VECTORS LD I,A IM 2 ;US+++++++++++++++++++++++ DSKER: LD HL,DSKEB ;POINT TO ERROR BYTE CALL PRHEX ;LOAD ERROR CODE INTO MESSAGE LD HL,DSKEM ;T SECTOR THEN DONE CP LASTSEC JR NC,WZRPG INC A ;NEXT SECTOR LD (IOPB + PBSECO),A LD DE,SECSZ ;DMA := DMA + SECTOR  ; INIT STACK ; LD SP,DEFBFR ;USE PAGE 0 FOR STACK ; ; SAVE BOOT PROM # ; IN A,(ROMSEL) AND A,ROMSMK LD (DKPROM)++++++++++++++++++++++++++++ DISKRD: LD IY,IOPB ;SELECT READ OP LD (IY + PBCMDO),DDRDS JR DRDCNT ;+++++++++++++++++++SIZE LD HL,(IOPB + PBDMAO) ADD HL,DE LD (IOPB + PBDMAO),HL JR WREAD ; ; WARM BOOT ERROR, OUTPUT MSG & HALT ; WEROR,A ; ; SELECT MONITOR ROM FOR CONSOLE ROUTINES ; CALL GETMON ;MAKE SURE BOOT ROM IS DISABLED ; ; INIT IOBYTE ; LD+++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; WRITE A DISK SECTOR ; ;+++++++++++++++++++++++++++++++++++++UT MONSTS,A EI ENDIF LD SP,DEFBFR ;SELECT TEMPORARY STACK CALL GETMON ;SELECT MONITOR ROM LD A,0 ;SET DRIVE 0 AF AND 5FH ;INSURE UPPER CASE CP 'R' ;IF RETRY THEN RETURN TO CALLER RET Z POP HL ;NOT RETURNING, WASTE ADDRES: LD HL,MSGLE ;OUTPUT ERROR MESSAGE CALL EDITOR HALT ; ; BOOT OK, INIT PAGE 0 ; WZRPG: LD A,0C3H ;INITIALIZE BIOS WAR A,DEFIOB LD (IOBYTE),A ; ; INIT DEFAULT DRIVE ; LD A,DFDRV LD (DEFDRV),A ; ; SEND SYSTEM SIGN-ON ; LD HL,MSGS+++++++++++++++++++++++++++++++++++++++ DISKWR: LD IY,IOPB ;SELECT WRITE OP LD (IY + PBCMDO),DDWRS DRDCNT: LD A,(IY +  LD (IOPB + PBDRVO),A IF HARDBT IN A,(HSTATUS) ;IF HOST ADAPTER BUSY THEN BIT HBUSYB,A JR Z,NTHUNG LD A,1 SHL S TO CALLER CP 'A' ;IF ABORT THEN RE-BOOT JP Z,0 SUB 'I' ;IF IGNORE THEN RETURN NO ERROR RET Z FDSKER: LD HL,0 M START VECTOR LD HL,BIOS + 3 LD (PAGE0),A LD (PAGE0 + 1),HL LD HL,BDOS + 6 ;INIT BDOS CALL VECTOR LD (PAGE0 + 5),A O CALL EDITOR ; ; CHANGE COLD START TO WARM START ; LD HL,(BIOS+4) LD (BIOS+1),HL ; ; GO EXECUTE WARM START ; PBDRVO) CP NDRVS ;IF RANGE ERROR THEN ABORT JR NC,FDSKER LD (IY + PBFLGO),0 ;NO FLAGS FOR NOW RWOPR: CALL DISKEX HRESET ; RESET HOST ADAPTER TO CLEAR HANG OUT (HCMD),A XOR A OUT (HCMD),A EX (SP),HL ; DELAY FOR HOST ADAPTER TO CA ;RETURN DPB_PTR = 0 FOR SELECT FUNCTION LD A,-1 ;RETURN -1 TO BDOS OR A RET ;++++++++++++++++++++++++++++++++++++++ LD (PAGE0 + 6),HL LD HL,DEFBFR ;SET DEFAULT SECTOR BUFFER LD (IOPB + PBDMAO),HL IF INTCPTS LD HL,(BDOS + 7) ;GET JP WARM ;############################################################################ ; ; SIGN-ON MESSAGE ; ;########## ; DO OP RET Z ;IF NO_ERROR THEN RETURN LD A,(IY + PBSTATO) ;PASS STATUS BYTE TO DISK_ERROR() CALL DSKER JR RWOPR TCH UP EX (SP),HL WARM1: IN A,(HSTATUS) ; WHILE BUSY THEN WAIT BIT HBUSYB,A JR NZ,WARM1 NTHUNG: LD BC,DEFBFR ;READ ++++++++++++++++++++++++++++++++++++++ ; ; SELECT DRIVE FUNCTION ; LOG-ON - SET DISK PARAMETER BLOCK ; ENTRY- C= DRIVE # BDOS VECTOR LD (BDOSV),HL ;PUT IN INTERCEPT CODE LD HL,INTCPT ;NOW PUT INTERCEPT VECTOR INTO BDOS VECTOR LD (BDOS + 7),HL ################################################################## MSGSO: DB CR,LF DB CPMSZ / (KBYTE * 10) + '0' DB (CPMSZ ;SINCE RETURNED, DO RETRY DISKEX: LD IX,(DPHPTR) ;FETCH DRIVER ADDRESS LD H,(IX + (-1)) LD L,(IX + (-2)) JP (HL) ;REBOOT DIRECTORY CALL SETDMA LD C,BTDIRS CALL SETSEC LD C,0 ELSE LD C,1 ENDIF CALL SETTRK IF HARDBT CAE MODE 2 IN A,INTMSK AND 7FH ;ENABLE INT 7 OUT INTMSK,A IN A,MONSTS ;ENABLE MONITOR BOARD INTERRUPTS OR MONIE OOUTPUT ERROR MESSAGE CALL EDITOR CALL CI ;GET USER RESPONSE PUSH AF ;SAVE CHAR LD C,A ;ECHO CHAR CALL COC POPSTART OF CP/M IMAGE FROM DIRECTORY INC A ;OFFSET FOR READ DECRIMENT LD C,A ELSE LD C,2 ;START WITH SECTOR #2 END 0 ( ) *!+"#-$.%/ &0 ',; E= 0 IF NEVER LOGGED BEFORE ; EXIT - HL= PTR TO DPT OR 0 FOR ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++*********************************************************************** ; ; SET NO SECTOR TRANSLATION ; EXIT - HL, DE= ? ; Y + PBSTATO) ;PASS ERROR CODE TO DISK_ERROR() CALL DSKER JR FDLOGR ;RETURN HERE MEANS TO RETRY ; ; ; CHECK FOR ID SECTOEXIT - A= C= SECTOR # ; ;**************************************************************************** SETSEC: LD A,C LD (IO CKTRAN: CALL TRNONE ;ASSUME NO TRANSLATE LD IY,(DPBPTR) ;FETCH PTR LD A,(IY + [DPBDSMO + 1]) ;FETCH DISK SIZE HIGH BYTE ++++++++++++++++++++++++ SELDSK: ; ; IF REQUESTED DRIVE NOT VALID THEN RETURN 0 ; LD HL,0 ;ASSUME INVALID ; LD A,C ;**************************************************************************** TRNONE: LD DE,0 JR SETTR ;++++++++++++++++R ; LOGCK: LD A,(IY + PBST2O) ;FETCH IDENTITY SECTOR FLAG OR A,A JR Z,NOID ; ; DISK CONTAINS ID. ; LD DE,(DPBPTR) PB + PBSECO),A RET ;**************************************************************************** ; ; SET TRANSFER ADDR ;SET DRIVE # CP NDRVS ;IF NOT 0..(NUMBER_OF_DRIVES -1) THEN ERROR RET NC ; ; SAVE DRIVE AND LOGON FLAG ; LD (IOPB + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; GET DRIVE PARAMETER BLOCK ADDR ; EXIT - DE= DPB PTR ; HL;MOVE DISK DPB TO BIOS DPB LD HL,DEFBFR + IDDPBO LD BC,IDDPBSZ LDIR ; LD HL,DEFBFR + IDFLGO ;MOVE FLAGS TO DPB LD BC, ; ENTRY- BC= ADDRESS ; EXIT - HL= BC= ADDRESS ; ;*************************************************************************** PTR TO TABLE RET ; ; ; TABLE OF DEFAULT DPB PTRS FOR EACH DRIVE ; DDPBT: IF HARDBT REPT 4 DW HDDPB ENDM RPBDRVO),A ;STORE DRIVE # ; LD A,E ;SET LOG REQUEST VECTOR LD (LOGRQ),A ; ; COMPUTE TABLE PTRS FOR RETURN ; RETDSK: L= (DPHPTR) + 11 ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DPBAD: LD HL,(DPHPTR) ;FETCH IDFSIZE - 1 LDIR ; ; IF EXTENDED DATA THEN ALREADY GOT IT ; LD A,(IY + PBST2O) ;CHECK FOR EXTENDED DATA INC A JR NZ* SETDMA: LD (IOPB + PBDMAO),BC XOR A,A LD (IOPB + PBDMAXO),A RET ;+++++++++++++++++++++++++++++++++++++++++++++++++EPT 2 DW FDDPB ENDM ELSE REPT 2 DW FDDPB ENDM REPT 4 DW HDDPB ENDM ENDIF ;*************************D L,C ;COMPUTE TABLE PTR (C STILL HAS DRIVE) LD H,0 PUSH HL ;SAVE *1 POP DE ADD HL,HL ;DISK # * 8 ADD HL,HL ADD HBASE ADDR LD DE,10 ;ADD OFFSET OF DPB PTR ADD HL,DE LD E,(HL) ;FETCH DPB PTR INC HL LD D,(HL) LD (DPBPTR),DE ;SAVE*************************************************** ; ; COMPUTE FLOPPY SECTORS PER TRACK SUBR ; ENTRY- HL= PTR TO PUT DATA ;L,HL ADD HL,DE ;* 9 ADD HL,HL ;* 18 LD DE,D0DPH ADD HL,DE LD (DPHPTR),HL ;SAVE POINTER FOR SUBSEQUENT OPS ; CALL  FOR FUTURE USE RET ;**************************************************************************** ; ; HOME DRIVE - TR DEC DE DEC DE EX DE,HL ;HL POINTS TO TRACK 0 ; LD A,(DEFBFR + IDFLGO) ;TEST FOR HARD DISK BIT DFHARDB,A JR NZ,LO# TO XLATE ; EXIT - HL= XLATED SECTOR OR (BC) + 1 ; BC= UNCHANGED ; A, DE= ? ; ;+++++++++++++++++++++++++++++++++++++++++ A= BIT 0= 0: 26 SPT, 1: 48 SPT ; ;**************************************************************************** SETSPT: LD (DPBAD LD HL,(DPHPTR) ;RETURN THE NEW PTR ; ; IF NOT 1ST SELECT FOR THIS DRIVE THEN RETURN NEW PTR ; LD A,(LOGRQ) ;IF NOEAT AS SEEK TRK 0 ; ;**************************************************************************** HOME: LD C,0 ;********GHARD ; ; DO FLOPPY TRACK SIZES ACCORDING TO TRACK FLAGS ; CALL SETSPT INC HL RRCA CALL SETSPT INC HL RRCA CA+++++++++++++++++++++++++++++++++++ SECTRN: LD A,D ;IF TABLE ADDR = 0 THEN NO TRANSLATION OR E JR Z,NOTRAN EX DE,HL AHL),48 ;ASSUME DOUBLE DENSITY BIT 0,A RET NZ LD (HL),26 RET ;*****************************************************T_1ST_LOG_ON THEN RETURN TABLE PTR AND 1 RET NZ ; ; FIRST SELECT FOR THIS DRIVE, READ IDENTITY SECTOR FIRST ; LD IY,L******************************************************************** ; ; SET TRACK # ; ENTRY- C= TRACK # ; EXIT - A= C= TRACLL SETSPT JR CKTRAN ; ; DO HARD DISK ; LOGHARD: EX DE,HL LD HL,HDDPB + DPBSPT0O LD BC,3 LDIR JR CKTRAN ; ; DD HL,BC LD L,(HL) LD H,0 RET ; NOTRAN: LD HL,1 ADD HL,BC RET ;********************************************************************* ; ; SET 3740 SECTOR TRANSLATION ; EXIT - DE, HL= ? ; ;*******************************************OGIOPB LD (IY + PBDRVO),C ;PERFORM DCM LOG-ON (C STILL HAS DRIVE #) ; LD (IY + PBSECO),0 ;START WITH SECTOR 0 ; FDLOGR: CK # ; ;**************************************************************************** SETTRK: LD A,C LD (IOPB + PBTRKO),A R; NO ID SECTOR EXISTS, ASSUME DEFAULTS ; NOID: LD E,(IY + PBDRVO) ;COMPUTE TABLE ADDRESS LD D,0 LD HL,DDPBT ADD HL,DE ****************************** ; ; LOAD HEX DATA INTO MEMORY SUBR ; ENTRY- A= DATA ; HL= PTR TO MEMORY ; EXIT - A= DATA ;********************************* TR3740: LD DE,SDTRAN SETTR LD HL,(DPHPTR) LD (HL),E INC HL LD (HL),D RET ;*****ALL DRDCNT ;LOG ON DRIVE & RETURN IDENTITY SECTOR DATA JR Z,LOGCK ; ; ERROR ENCOUNTERED, ASK USER FOR ACTION ; LD A,(IET ;**************************************************************************** ; ; SET SECTOR ; ENTRY- C= SECTOR # ;  ADD HL,DE LD A,(HL) INC HL LD H,(HL) LD L,A LD DE,(DPBPTR) LD BC,DPBSZ LDIR ; ; IF FLOPPY THEN TRANSLATE ; ,CKTRAN ;TRUE IF EXTENDED DATA ALREADY STORED ; ; RECREATE EXTENDED DISK DATA ; DEC DE ;BACK UP TO TRACK 0 SECTOR COUNT+++++++++++++++++++++++++++ ; ; SECTOR TRANSLATION FUNCTION ; ENTRY- DE= 0: NO XLATE, ELSE PTR TO XLATE TABLE ; BC= SECTOR  OR A,A ;IF SIZE < 256K THEN MUST BE IBM 3740 CALL Z,TR3740 ; ; LOGON DONE, RETURN PTR ; LD HL,(DPHPTR) ;ELSE RETURN 0 ( ) *!+",#-$.%/ &0 ' HL= HL + 2 ; ;**************************************************************************** PRHEX: CALL PRDIG ;DO HIGH NIBBCALL ; ILLEGC: LD HL,ISCMSG ;OUTPUT WARNING CALL EDITOR XOR A ;BC = HL = A = 0 LD L,A LD H,A LD C,A LD B,A RET  DPBSPT0O) JP C,FDSECOK ; INC A ;CONVERT BACK TO 1..N SET 7,A ;2ND SIDE LD (IY + PBSECO),A ; ; IOPB MASSAGED, CRY- DE= PTR TO 13 BYTE BUFFER FOR CLOCK DATA ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ LE PRDIG: RLCA ;POSITION NIBBLE INTO LOW 4 BITS RLCA RLCA RLCA PUSH AF ;SAVE DATA AND 0FH ;MASK OFF OTHER N ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CDOS RETURN VERSION SYSTEM CALL ; MAKALL THE PROM CODE ; FDSECOK: LD A,(DKPROM) ;FETCH PROM # OUT (ROMSEL),A ; LD BC,IOPB ;PASS THE IOPB ARGUMENT CALL JACLKRDC: LD C,E ;SET UP PARAMETERS LD B,D LD HL,RDBENT JR CLK2 ;*****************************************************------------------------------------------------------------- ; ; SYSTEM CALL INTERCEPT ROUTINE CHECKS FOR ILLEGAL BDOS CALLS ES CLOCK/CALENDAR WORK. ; EXIT - B= 1 ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ RETVERDEX ; ; RESTORE MONITOR ROM ; CHKERR: PUSH AF ;SAVE STATUS CALL GETMON POP AF ; ; COMMAND COMPLETED, CHECK STATUS*********************** ; ; CLOCK SET FUNCTION 91H ; ENTRY- DE= CLOCK IMAGE BUFR PTR (13 BYTES LONG) ; ;*******************& ; PRINTS MESSAGE IF ILLEGAL. ALSO IMPLEMENTS CDOS CLOCK/CALENDAR ; SYSTEM CALLS FOR ASMB. ; ;--------------------------- ;NEXT CHAR RET SUBTTL DISK DRIVERS ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; : LD B,1 RET SUBTTL MISC I/O DRIVERS ;***************************************** ; ; CLOCK ROUTINES ; ;*************** ; OR A RET Z ; LD A,-1 RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; H********************************************************* CLKSET: LD C,E ;SET UP PARAMETERS LD B,D LD HL,SETENT CLK2: L------------------------------------------------- INTCPT: LD A,C ;CHECK CALL VALIDITY CP 41 ;IF <= 40 THEN OK BDOSV EQU FLOPPY DISK EXECUTE DRIVER FUNCTION ; ENTRY- IY= IOPB PTR (MUST BE PRESERVED) ; EXIT - A,FLAGS= 0: NO ERRORS, -1= ERROR ; HL************************** ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN CALENDAR D A,CALROM ;**************************************************************************** ; ; EXECUTE ROM ROUTINE ; ENTRY$ + 1 JP C,BDOS + 11H ;THIS ADDR MODIFIED BY WARM BOOT RTN ; ; THE FOLLOWING CONDITIONAL JUMP IS MODIFIED TO AN UNCONDITION,DE,BC= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ IF HARDBT D4XADR: D5XADR: ; FUNCTION 90H ; EXIT - A= DAY ; B= MONTH ; C= YEAR ; L= DAY OF WEEK ; ;+++++++++++++++++++++++++++++++++++++++++++++++++,BC= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ IF HARDBT D0XADR: D1XADR: D2XADR- HL= ENTRY ADDRESS ; A= ROM # ; EXIT - ENTRY ROM RE-SELECTED ; ;**********************************************************AL JUMP BY ; THE WARM BOOT ROUTINE IF THE CLOCK/CALENDAR BOARD IS NOT PRESENT ; IF NOT MODIFIED, THEN IT IS ALLWAYS FALSE (N; CONVERT LOGICAL DRIVE TO PHYSICAL DRIVE ; LD A,(IY + PBDRVO) ;BIAS DOWN SUB A,4 LD (IY + PBDRVO),A ELSE D0XADR:+++++++++++++++++++++++++++ CLKCAL: LD HL,CALENT ;ROM ENTRY POINT CLK1: LD BC,CLKBFR ;READ CLOCK JR CLK2 ;+++++++++++: D3XADR: ELSE D2XADR: D3XADR: D4XADR: D5XADR: ENDIF ; ; CONVERT LOGICAL DRIVE TO PHYSICAL DRIVE ; LD A,(IY ****************** EXROM: PUSH AF ;SAVE NEW ROM IN A,ROMSEL ;SAVE CURRENT ROM LD (ROMSAV),A POP AF ;SELECT NEW ROM OP). ; INHCLK: JR C,ILLEGC ; ; NOW CHECK FOR EXTENDED CALLS ; CP 8DH ;IF RETURN VERSION THEN RETURN IT JR Z,RETVER  D1XADR: ENDIF ; ; SELECT SIDE ; LD IX,(DPBPTR) ;COMPUTE DISPLACEMENT TO SPT VALUE LD A,(IY + PBTRKO) CP 2 ;I+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN TIME FUNCTION 92H ; EXIT - A= SECONDS ; B= MIN+ PBDRVO) ;FETCH LOGICAL DRIVE SRL A ;0/1= DRIVE 0, 2/3= DRIVE 1 LD (IY + PBDRVO),A ; ; CONVERT LOGICAL SECTOR TO PHY AND ROMSMK OUT ROMSEL,A PUSH HL ;SAVE ENTRY LD HL,EXROMR ;PUT RETURN ADDR ON STACK EX (SP),HL JP (HL) ;EXECUTE CP 90H ;IF NOT CLOCK THEN ERR JR C,ILLEGC JR Z,CLKCAL ;IF CALENDAR THEN GET IT CP 92H JR C,CLKSET ;IF SET FUNCTIOF TRACK 0 OR 1 THEN OK JR C,FD01 ; LD A,2 ;DATA TRACKS ALLWAYS 2 ; FD01: ADD A,DPBSPT0O ; LD (FDOFF),A ;MODIFY INSTUTES ; C= HOURS ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ CLKTIM: LD HL,TIMENT JR CSICAL SECTOR ; LD D,0 RR D ;DRIVE BIT 0 -> SECTOR BIT 7 LD A,(IY + PBSECO) DEC A ;CHANGE TO LOGICAL SECTOR {0..127} ROM EXROMR: PUSH AF ;SAVE RETURN VALUE LD A,(ROMSAV) ;RESELECT ORIGINAL ROM OUT ROMSEL,A POP AF ;RETURN VALUE REN THEN SET CLOCK JR Z,CLKTIM ;IF TIME THEN GET IT CP 93H JR Z,CLKRDC ;IF READ CLOCK THEN GET IT ; ; ILLEGAL SYSTEM RUCTION OPERAND ; LD A,(IY + PBSECO) ;DETERMINE IF 2ND SIDE DEC A ;CONVERT 1..N TO 0..N-1 FDOFF EQU $ + 2 SUB A,(IX +LK1 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; READ CLOCK TIME FUNCTION 93H ; ENT AND 7FH ;MASK BIT 7 OR D ;ADD IN LOGICAL DRIVE LD (IY + PBSECO),A ; ; OUTPUT IOPB ADDRESS ; LD A,(DKPROM) OUIBBLE ADD A,90H ;USE THE UBIQUITOUS DAA ROUTINE DAA ADC A,40H DAA LD (HL),A ;STORE CHAR POP AF ;DATA INC HLT (ROMSEL),A ; LD BC,IOPB CALL ISHAX JR CHKERR IF INTCPTS SUBTTL CP/M UNSUPPORTED SYSTEM CALLS ;--------------- 0 ( ) *!+",#-$.%/ &0 'T ENDIF SUBTTL CHAR I/O ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; ---------------- ; ; USER INTERRUPT ; ;---------------------------------------------------------------------------- ITRA ; ; RETURN CONSOLE OUTPUT READY STATUS ; EXIT - A= 0: BUSY, FFH: READY ; ;+++++++++++++++++++++++++++++++++++++++++++++++++ ENDIF INTABL: REPT 7 ;1ST 7 ARE UNSUPPORTED DW ILLINT ENDM DW ITRAP ;INT 8 IS USER INTERRUPT ENDIF ;##########CONSOLE INPUT ; EXIT - A= CHAR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ CI: IF USP: PUSH AF ;SAVE USED REGISTERS PUSH HL PUSH BC LD HL,ITMSG ;NOTIFY USER IQCONT: CALL EDITOR LD HL,IQMSG ;QUERY US+++++++++++++++++++++++++++ NTOST: IN A,NTS CPL ;REVERSE SENSE AND 1 SHL NTBSY JR TTOST1 ENDIF ;++++++++++++++################################################################## ; ; 3740 SECTOR TRANSLATION TABLE ; **** CP/M SINGLE D************** LISTST: IF USEMON CALL GETMON JP 0F827H ELSE IN A,CENTS ;IF BUSY THEN RETURN 0 CPL ;INVERT THER CALL EDITOR CALL CI CP 3 ;IF CTRL-C THEN WARM BOOT JP Z,PAGE0 AND 5FH ;IGNORE CASE CP 'Y' ;IF YES THEN ABO++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; READER DRIVER - DUMMY ; EXIT - A= CTRL-Z ; ;++++++++++++ENSITY **** ; ;############################################################################ SDTRAN: DB 1,7,13,19,25,5,11,17,2E SENSE AND 1 SHL CENTBSY RET Z LD A,0FFH ;ELSE RETURN -1 RET ENDIF ;*************************************** IN A,NTD ;ELSE RETURN CHAR RET ENDIF ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++RT JP Z,PAGE0 CP 'I' JR NZ,ITRAP1 POP BC ;ELSE RESTORE & GOTO MONITOR TRAP POP HL POP AF JP 0038H ITRAP1: ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ READER: LD A,CTRLZ ;FAKE EOF ; FALL THROUGH TO PUNCH RETURN 3,3,9,15 DB 21,2,8,14,20,26,6,12,18,24,4,10 DB 16,22 ;#################################################################************************************* ; ; GET MONITOR PROM SUBR ; EXIT - A= ? ; ;****************************************** ; ; RETURN CONSOLE STATUS ; EXIT - A= 0: NOT READY ; FFH: CHAR READY ; ;+++++++++++++++++++++++++++++++++++++++++++++CP 'M' ;IF MONITOR THEN GOTO MONITOR TRAP JR NZ,ITRAPR CALL GETMON ;INSURE MONITOR THERE POP BC POP HL POP AF JP########### ; ; DISK PARAMETER BLOCK STRUCTURE ; ;#########################################################################********************************** GETMON: LD A,XMONROM OUT (ROMSEL),A RET ;******************************************+++++++++++++++++++++++++++++++ CNSCK: IF USEMON CALL GETMON JP 0F812H ELSE IN A,NTS ;IF DATA NOT READY THEN RET 0F824H ITRAPR: POP BC ;IF CONTINUE THEN RESTORE & RETURN POP HL POP AF EI ;RE-ENABLE INTERRUPTS RET ;*******T ; ;**************************************************************************** PUNCH: RET ;**************************### STRUCT 0 DPBSPTO DS 2 ;SPT- LOGICAL SECTORS/TRACK DPBBSHO DS 1 ;BSH- BLOCK SHIFT FACTOR DETERMINED BY CLUSTER SIZE ;********************************** ; ; MESSAGE EDITOR ; ENTRY- HL= TEXT PTR (BIT 7= 1: TERMINATOR) ; EXIT - REGS= ? ; ;***URN 0 AND 1 SHL NTRDY TTOST1: RET Z LD A,-1 ;ELSE RETURN -1 RET ENDIF ;*********************************************************************** ; ; UNSUPPORTED INTERRUPT ; ;************************************** ILLINT: PUSH AF ;SAV************************************************** ; ; PRINTER DRIVER ; ENTRY- C= CHAR TO OUTPUT ; ;*********************** 1K= 3, 2K= 4, 4K= 5, 8K= 6, 16K= 7 DPBBLMO DS 1 ;BLM- BLOCK MASK ; 1K = 7, 2K= 15, 4K= 31, 8K= 63, 16K= 127 DPBEXMO DS 1 ************************************************************************* EDITOR: LD C,(HL) ;MESSAGE EDIT LOOP PUSH HL ;SAV************************************ ; ; CONSOLE OUTPUT ; ENTRY- C= CHAR TO OUTPUT ; ;*************************************E ALL 8080 REGS PUSH HL PUSH BC LD HL,ILLIM ;NOTIFY USER OF INT JR IQCONT SUBTTL DATA CONSTANTS ;################***************************************************** LO: IF USEMON CALL GETMON JP 0F80FH ELSE CALL LISTST ;IF B;EXM- EXTENT MASK ; DSM < 256 : 1K= 0, 2K= 1, 4K= 3, 8K= 7, 16K= 15 ; DSM > 255 : 2K= 0, 4K= 1, 8K= 3, 16K= 7 DPBDSMO DE PTR RES 7,C ;CLEAR BIT 7 FOR OUTPUT CALL COC POP HL BIT 7,(HL) ;IF BIT 7 SET THEN RETURN RET NZ INC HL ;ELS*************************************** COC: IF USEMON CALL GETMON JP 0F809H ELSE CALL NTOST ;IF BUSY THEN WAIT ############################################################ ; ; MODE 2 INTERRUPT VECTOR TABLE ; ;########################USY THEN WAIT JR Z,LO LD A,C ;OUTPUT CHAR SET 7,A OUT CENTOUT,A RES 7,A ;OUTPUT LOW TRUE STROBE OUT CENTOUT,A S 2 ;DSM- DRIVE STORAGE SIZE (IN CLUSTERS) ; INT(((#_TRACKS - OFF) * SPT * BYTES PER SECTOR) / CLUSTER SIZE) -1 DPBDRMO DS 2E PRINT NEXT CHAR JR EDITOR IF INTRPTS SUBTTL INTERRUPTS ;------------------------------------------------------------ OR A JR Z,COC LD A,C OUT NTD,A RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #################################################### IF $ AND 0FFH ;START ON EVEN PAGE BOUNDARY DS 100H - ($ AND 0FFH)  SET 7,A OUT CENTOUT,A RET ENDIF ;**************************************************************************** ; EMON CALL GETMON ;SWITCH IN MONITOR ROM JP 0F803H ;USE MONITOR ELSE CALL CNSCK ;IF NO CHAR RDY THEN WAIT JR Z,CI  ; RETURN LIST DEVICE STATUS ; EXIT - A= 0: BUSY, FFH:READY ; ;************************************************************** ;**************************************************************************** ; ; PUNCH DRIVER ; ENTRY- C= CHAR TO OUTPU 0 ( ) *!+",#-$.%/ &0 ' ;DRM- DIRECTORY SIZE -1 DPBAL0O DS 2 ;AL0,1- DIRECTORY ALLOCATION ; 1 MSB PER DIRECTORY CLUSTER ALLOCATED DPBCKSO DS 2 ;CDD DL 1 REPT NDRVS LIST OFF ALLDPH 0123456789ABCDEF DD DL DD + 1 LIST ON ENDM BIOSND EQU $ SUBTTL DATA AREA ;################################# HDDPB: DW 128 ;SECTORS PER TRACK (LOGICAL) (SPT) DB 5 ;BLOCK SHIFT FACTOR (BSH) DB 31 FF ALLDAL 0123456789ABCDEF DD DL DD + 1 LIST ON ENDM ;##############################################################KS- # DIRECTORY SECTORS CHECKED ; (DRM +1) / 4 DPBOFFO DS 2 ;OFF- # RESERVED TRACKS AT BEGINNING OF DISK ; ; NEW DATA ############################################################################ ; ; UNINITIALIZED DATA AREA ; THE REMAINING AR ;BLOCK MASK (BLM) DB 1 ;NULL MASK (EXM) DW 1015 ;DISK SIZE (CLUSTERS -1) (DSM) DW 1152 / 2 ;DIRECTORY MAX (DRM) ############## ; ; RESERVE DRIVE PARAMETER BLOCKS ; ;#####################################################################LF,'Disk Error Status: ' DSKEB: DB '00H',CR,LF DM 'Abort, Ignore, Retry, (BDOS) - ' IF INTCPTS ISCMSG: DM CR,LF,'ILL. SYEA DOES NOT HAVE TO BELONG ON THE DISK. ; ;############################################################################ IF DB 0FFH ;ALLOCATION 0 (AL0) DB 10000000B ;ALLOCATION 1 (AL1) DW 0 ;CHECK SIZE (CKS) DW 2 ;TRACK OFFSET (OFF) ####### ALLDPB: MACRO #D LIST ON ; ; DRIVE PARAMETER BLOCK FOR DRIVE #D(DD) ; D#D(DD)DPB: DS DPBSZ LIST OFF ENDM S. CALL',CR,LF ENDIF IF INTRPTS ITMSG DM CR,LF,'User' ILLIM DM CR,LF,'Unsupported' IQMSG DM ' Interrupt: Abort? (Y/N)S PER TRACK DPBDSPTO DS 1 ;DATA TRACKS SECTORS PER TRACK DPBSZ DS 0 ;SIZE OF DPB ENDM ;################################ INTCPTS CLKBFR: DS 13 ;CLOCK BUFFER ROMSAV DS 1 ;ROM SWAP SAVE OF ORIGINAL ROM ENDIF DPHPTR DS 2 ;DRIVE TABLE PTR DPBPT; ; NEW PARAMETERS ; DB 00100000B ;DISK FLAGS DB 128 ;TRACK 0 SECTORS PER TRACK DB 128 ;TRACK 1 SECTORS PER TRACK  ; DD DL 1 REPT NDRVS LIST OFF ALLDPB 0123456789ABCDEF DD DL DD + 1 LIST ON ENDM IF ($ > 0F800H) OR ($ < 8000H - ' ENDIF ;############################################################################ ; ; DRIVE PARAMETER HEADER############################################ ; ; DEFAULT FLOPPY PARAMETER BLOCK FOR IBM 3740 FORMAT ; ;##################R DS 2 ;DRIVE PARAMETER BLOCK PTR LOGRQ DS 1 ;LOG ON REQUEST REG. DKPROM DS 1 ;DISK BOOT PROM NUMBER ;###################) ; ; WARN IF BIOS TOO BIG ; CONMSG BIOS TOO BIG ENDIF END  AREA ; 1 PER DRIVE ; ;############################################################################ ALLDPH: MACRO #D LI########################################################## FDDPB: DW 26 ;SECTORS PER TRACK DB 3 ;BLOCK SHIFT FACTOR DB 7 ######################################################### ; ; DRIVE ALLOCATION AREAS DECLARED ; ALLOCATION REQUIRES 1 BIT P COMMON IO PARAMETER BLOCK ; ;############################################################################ IOPB: REPT IOPBSZåST ON ; ; DRIVE PARAMETER HEADER FOR DRIVE #D(DD) ; DW D#D(DD)XADR ;DRIVER EXECUTION ADDRESS D#D(DD)DPH: DW 0 ;SECTOR ;BLOCK MASK DB 0 ;NULL MASK DW 242 ;DISK SIZE -1 DW 63 ;DIRECTORY MAX DB 11000000B ;ALLOC 0 DB 0 ;ALLOC 1 DW 16ER CLUSTER ON DISK. ; CHECKSUMS REQUIRE 1 BYTE PER DIRECTORY SECTOR ; ;###################################################### DB 0 ENDM ;############################################################################ ; ; LOGON IOPB ; ;#####å TRAN TBL (OR 0 IF NO XLATE) DW 0 ;SCRATCH AREA DW 0 ;" DW 0 ;" DW DIRBF ;DIRECTORY BUFFER PTR DW D#D(DD)DPB ;DRI ;CHECK SIZE DW 2 ;TRACK OFFSET ; ; THE FOLLOWING ARE NEW PARAMETERS ; DB 0 ;DISK FLAGS DB 26 ;TRACK 0 SECTORS PE###################### ALLDAL: MACRO #D LIST ON IF (HARDBT AND (DD < 5)) OR (NOT HARDBT AND (DD > 2)) ; ; CLUSTER ALL####################################################################### LOGIOPB: DB DDLOG ;LOGON COMMAND DB 0 ;DRIVE DWåVE PARAMETER BLK PTR IF (HARDBT AND (DD < 5)) OR (NOT HARDBT AND (DD > 2)) DW 0 ;NO CHECKS ON HARD DISK ELSE DW D#DR TRACK DB 26 ;TRACK 1 SECTORS PER TRACK DB 26 ;DATA TRACKS SECTORS PER TRACK ;######################################OCATION BIT MAP FOR DRIVE #D(DD) ; D#D(DD)ALL: DS 128 ELSE ; ; CLUSTER ALLOCATION BIT MAP & DIRECTORY CHECKSUMS STORAG 0 ;TRACK DW 0 ;SECTOR DB 0 ;FLAGS (LOGON) DW DEFBFR ;DMA ADDR DB 0 ;BANK ADDR REPT IOPBSZ - ($ - LOGIOPB) LISTå(DD)CHK ;DRIVE DISK CHECKSUMS ARRAY PTR ENDIF DW D#D(DD)ALL ;DRIVE CLUSTER ALLOCATION BIT MAP PTR LIST OFF ENDM ; ###################################### ; ; DEFAULT HARD DISK PARAMETER BLOCK ; ;###########################################E FOR DRIVE #D(DD) ; D#D(DD)ALL: DS ALLSIZ D#D(DD)CHK DS CHKSIZ ENDIF LIST OFF ENDM ; DD DL 1 REPT NDRVS LIST O OFF DB 0 LIST ON ENDM ;############################################################################ ; ; MESSAGE; DPBFLGO DS 1 ;DISK FLAGS FROM DISK DPBSPT0O DS 1 ;TRACK 0 PHYSICAL SECTORS PER TRACK DPBSPT1O DS 1 ;TRACK 1 PHYSICAL SECTORS ; ;############################################################################ MSGLE: DM CR,LF,'LOAD ERROR' DSKEM: DB CR,DB 128 ;DATA TRACKS SECTORS PER TRACK ;############################################################################ ; ; 0 ( ) *!+",#-$.%/ &0 ' TITLE CUSTOMIZED BIOS FOR M5B LIST NOCOND ;************************************************************* ; ; (c) 1981 AST BOOT SECTOR ELSE LASTSEC EQU 45 ;LAST BOOT SECTOR ENDIF ;**********************************************************E MODULES. ; ; 2.28 - 22 APR 83 GRH ; CHANGED DEFINITIONS TO ALLOW BIG DIRECTORIES. ; DISALLOWED DRIVES C & D. ; ; 2.29 LE ; ;---------------------------- JP INIT1 ;COLD START ENTRY JP WARM ;RELOAD CCP/BDOS JP CNSCK ;GET CONSOLE STATUS GRH Electronics, CUPERTINO, CA ; ;************************************************************* ; ; CONFIGURATION: ; ; CPM*************** ; ; THE FOLLOWING 2 PARAMETERS MUST REFLECT THE MAX DISK SIZE & ; THE MAX DIRECTORY SIZE. ; ;**************- 3 SEP 83 GRH ; Changed Rev # for blocked DCM. Enables IBM system 34 ; 256 bytes per sector disks to be read. ; ; 1.10 -  JP CI ;CONSOLE INPUT JP COC ;CONSOLE OUTPUT JP LO ;PRINTER OUTPUT JP PUNCH JP READER JP HOME ;HOME SELECTED DRIVE TRUE INTRPTS EQU TRUE ;ENABLE INTERRUPT PROCESSING WHISTLE INTCPTS EQU TRUE ;ENABLE SYSTEM CALL INTERCEPT WHISTLE ;-----*********************************************************** ALLSIZ EQU 33 ;ALLOCATION BIT MAP SIZE (1 BYTE PER 8 CLUSTERS) CHK23 SEP 83 GRH ; Move clock-calendar routines to ROM. Add Interrupt handler ; (Mode 2). Change Revision display of sign-on (s JP SELDSK ;SELECT DISK DRIVE JP SETTRK ;SET TRACK # JP SETSEC ;SET SECTOR # JP SETDMA ;SET TRANSFER ADDR JP DISKR--------------------------------- ; ; DISK OPERATING SYSTEM ADDRESSES ; ;-------------------------------------- NKSYS: EQE 0 ; 2 SASI CONTROLLER FLOPPY DRIVE 1 ; 3 NOT USED ; C 4 JADE FLOPPY PHYSICAL DRIVE 0 ; D 5 JADE FLOPPY PHYSICASIZ EQU 32 ;DIRECTORY CHECKSUMS ARRAY SIZE (1 BYTE PER DIR. SECTOR) ;**************************** ; ; ADDRESSES ; ;******eparate CBIOS rev). ; ; 2.00 - 24 MAR 84 GRH ; Modify for hard disk ; ; 2.01 - 28 APR 84 GRH ; Change hard disk DPB toD ;PERFORM DISK READ JP DISKWR ;PERFORM DISK WRITE JP LISTST ;RETURN LIST STATUS JP SECTRN ;TRANSLATE SECTOR RET ;U 61 ;SYSTEM SIZE IN K BYTES KBYTE: EQU 1024 CPMSZ: EQU KBYTE*NKSYS CPMBS: EQU CPMSZ - (20 * KBYTE) ; CP/M BIAS VALUE CCP: L DRIVE 1 ; 6 JADE FLOPPY PHYSICAL DRIVE 2 ; 7 JADE FLOPPY PHYSICAL DRIVE 3 ; ;********************************************************* CALROM EQU 7 ;CALENDAR ROM SELECT # RDBENT EQU 0F800H ;READ CLOCK BUFFER ENTRY SETENT EQU RDBENT + 3FORMAT DUMMY ;************************************************************************** ; ; THESE BOOT PARAMS MUST RESIDE EQU CPMBS+3400H ;ADDR OF CCP BDOS: EQU CPMBS+3C00H ;ADDRESS OF BDOS BIOS: EQU CPMBS+4A00H ;ADDRESS OF BDOS BIOSR: EQU 1000H-B************************** ; REVISIONS: ; ; 2.2.0 - RELEASE ; ; 2.2.3 - SWAPPED DCM & BIOS SECTORS ON DISK, ALLOWING A ; ;SET CLOCK ENTRY CALENT EQU RDBENT + 6 ;RETURN CALENDAR ENTRY TIMENT EQU RDBENT + 9 ;RETURN TIME ENTRY ;****************to relate to ISASI control of JADE ; FDC. ; Change IOPB sector value from physical sector (1..n) to logical ; sector vaAS DEFINED RIGHT BEFORE THE COLD ; INIT ROUTINE START AND MUST BE IN THE 1ST SECTOR. ; THESE 2 WORDS ARE REFERENCED BY THE BIOS ; PAGE0: EQU 0 ;START OF CP/M RAM IOBYTE: EQU PAGE0 + 3 ;IOBYTE ADDR DEFDRV: EQU PAGE0 + 4 ;DEFAULT DRIVE PARAM ADDR D LARGER BIOS ALLOCATION ON THE DISK. ; ; 2.2.4 - ADDED NAKED TERMINAL DRIVERS & IOBYTE IN ; ANTICIPATION OF THE MONIT************ ; ; ASCII CHARS ; ;**************************** LF: EQU 0AH CR: EQU 0DH CTRLZ: EQU 1AH ; ; INCLUDE JDDCOlue (0..n-1). This maintains more uniformity in ; parameter passing between hard disk & JADE floppy IOPBs. ; Vector I/O rouOOT CODE IN ; ORDER TO FIND THE LOAD ADDRESS FOR THE BIOS & IT'S LENGTH. ; ;************************************************EFBFR EQU PAGE0 + 80H ;DEFAULT BUFFER TPA: EQU 100H ; ; OTHER DECLARATIONS ; DEFIOB: EQU 80H ;INITIAL IOBYTE VALUE (LPT OR. ALSO, ALL REFERENCES ; REQUIRING THE I/O PROMS TO BOOT HAS BEEN REMOVED. ; ; 2.2.5 - RECONFIGURE FOR 62K SYSTEM. ; NT.DEF ; INCLUDE MONBOARD.DEF ; INCLUDE IOBOARD.DEF ; INCLUDE NAKEDT.DEF ; INCLUDE ISASI.DEF ; INCLUDE CLOCK.DEF IF NOTtines to monitor rom routines. ; ; 2.03 - 4 JUN 84 GRH ; Add bells & whistles again. ; Move to 61k system. ; VERSN EQU '************************** BIOSSZ: DW BIOSND - BIOS ;BIOS MODULE SIZE IN BYTES BIOSST: DW BIOS ;BIOS MODULE LOAD ADDR FOR SBDON) DFDRV: EQU 0 ;INITIAL DEFAULT DRIVE SECSZ: EQU 128 FMTSZ: EQU 100H ;FORMAT BUFFER SIZE NDRVS: EQU 4 BTDIRS EQU 3 ;HA; 2.2.6 - 20 FEB 83 ; DOUBLE D REV C UPGRADE. CHANGE BOARD STATUS PORT BITS. ; ; 2.2.7 - 8 MAR 83 GRH ; ADDED CLOCK/CALENDAR LSTINC LIST OFF ENDIF *INCLUDE JDDCONT.DEF *INCLUDE MONBOARD.DEF *INCLUDE IOBOARD.DEF *INCLUDE NAKEDT.DEF *INCLUDE ISA03' ; ;************************************************************************* SUBTTL SYSTEM DECLARATIONS FALSE EQU 0  INIT1: JR INIT ;-------------------------------------- ; ; RESERVE DRIVE PARAMETER BLOCKS ; ;------------------------RD DISK SYSTEM TRACKS DIRECTORY SECTOR BTCCPO EQU 3 ;OFFSET TO CCP ENTRY IN SYS TRKS DIRECTORY IF HARDBT LASTSEC EQU 47 ;L DRIVER, SYSTEM CALL INTERCEPT, ; ILLEGAL SYSTEM CALL MESSAGE, CHANGED BIOS SIZE TO END ; OF INITIALIZED DATA AREA. RESTRUCTURSI.DEF *INCLUDE CLOCK.DEF LIST ON SUBTTL BIOS CODE ORG BIOS ;---------------------------- ; ; BIOS JUMP VECTOR TABTRUE EQU NOT FALSE ; ; CONDITIONAL ASSEMBLY FLAGS ; SHORT EQU TRUE ;SHORT BIOS (REMOVES UNESENTIAL CODE) LSTINC EQU FALS ISASI ; DRIVE DRIVE USAGE ; A 0 SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; B 1 SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE ;LIST INCLUDE FILES HARDBT EQU TRUE ;HARD DISK BOOT (FALSE= FLOPPY BOOT) USEMON EQU TRUE ;USE MONITOR ROM I/O ROUTINES IF reflect half size directory, but keep ; allocation for 1k directory ; ; 2.02 - 2 JUN 84 GRH ; Change floppy disk drivers 0 ( ) *!+",#-$.%/ &0 '-------------- D0DPB: DS 2 ;SPT- SECTORS/TRACK DS 1 ;BSH- BLOCK SHIFT FACTOR DETERMINED BY CLUSTER SIZE ; 1K= 3, 2K= 4,D ; WARM BOOT ERROR, OUTPUT MSG & HALT WEROR: LD HL,MSGLE ;OUTPUT ERROR MESSAGE CALL EDITOR HALT ; BOOT OK, INI-------------------------------------- ; ; DIRECTORY SECTOR BUFFER STARTS HERE AFTER CRUNCHING COLD START ; CODE. THIS BUFFENC,DOFLOP ELSE JR C,DOFLOP ENDIF LD (IY + PBDRV),0 ;ONLY USE HARD DISK FOR NOW IF NOT HARDBT SUB 2 ;BIA 4K= 5, 8K= 6, 16K= 7 DS 1 ;BLM- BLOCK MASK ; 1K = 7, 2K= 15, 4K= 31, 8K= 63, 16K= 127 DS 1 ;EXM- EXTENT MASK ; DSM T PAGE 0 WZRPG: LD A,0C3H ;INITIALIZE BIOS WARM START VECTOR LD HL,BIOS + 3 LD (PAGE0),A LD (PAGE0 + 1),HL LD HL,BR IS USED BY THE CP/M DIRECTORY CHECK ROUTINES THAT ; CHECK FOR DISK CHANGE. ; ;--------------------------------------------S DOWN TO HARD DISK ADDRESS ENDIF LD D,0 ;COMPUTE SECTOR RRCA RR D LD A,(BTSEC) DEC A ;CHANGE TO LOGICAL SECERRUPT VECTORS LD I,A IM 2 ;USE MODE 2 IN A,INTMSK AND 7FH ;ENABLE INT 7 OUT INTMSK,A IN A,MONSTS ;ENABLE MONIDOS + 6 ;INIT BDOS CALL VECTOR LD (PAGE0 + 5),A LD (PAGE0 + 6),HL LD HL,DEFBFR ;SET DEFAULT SECTOR BUFFER LD (BTDMA),H------------------------------ DIRBF: EQU $ ;BUFFER BEGINNING ;----------------------------------------------------------TOR AND 7FH OR D RWOPC: LD (IY + PBSEC),A LD A,(BTTRK) ;SET TRACK LD (IY + PBTRK),A LD (IY + PBFLG),0 ;NO FLAGSTOR BOARD INTERRUPTS OR MONIE OUT MONSTS,A EI ENDIF LD SP,DEFBFR ;SELECT TEMPORARY STACK CALL GETMON ;SELECT MUSTERS) ; INT(((#_TRACKS - OFF) * SPT * BYTES PER SECTOR) / CLUSTER SIZE) -1 DS 2 ;DRM- DIRECTORY SIZE -1 DS 2 ;AL0,1- DIL IF INTCPTS LD HL,(BDOS + 7) ;GET BDOS VECTOR LD (BDOSV),HL ;PUT IN INTERCEPT CODE LD HL,INTCPT ;NOW PUT INTERCEPT V---------- ; ; INIT - COLD START ENTRY FROM BOOT MUST SET ALL BIOS PARAMS ; ;------------------------------------------- FOR NOW LD HL,(BTDMA) ;SET DMA ADDR LD (IY + PBDMA),L LD (IY + [PBDMA + 1]),H LD (IY + PBDMAX),0 ;THIS BANK FOR NOWONITOR ROM LD A,0 ;SET DRIVE 0 LD (BTDRV),A IF HARDBT LD BC,DEFBFR ;READ BOOT DIRECTORY CALL SETDMA LD C,BTDIRECTORY ALLOCATION ; 1 MSB PER DIRECTORY CLUSTER ALLOCATED DS 2 ;CKS- # DIRECTORY SECTORS CHECKED ; (DRM +1) / 4 DS ECTOR INTO BDOS VECTOR LD (BDOS + 7),HL IN A,(CLKDAT) ;IF CLOCK NOT PRESENT THEN TURN OFF CLOCK DRIVE AND 11000000B  CALL HDEXEC ; DO OP JR NZ,DSKER ;EXIT IF ERROR ;----------------------------------------- ; ; NORMAL EXIT ; EXITRS CALL SETSEC LD C,0 ELSE LD C,1 ENDIF CALL SETTRK IF HARDBT CALL DISKRD JR NZ,WEROR ENDIF LD2 ;OFF- # RESERVED TRACKS (USUALLY 2) DPBSZ EQU $ - D0DPB IF NDRVS GT 3 D1DPB: DS DPBSZ ENDIF IF NDRVS GT 4 D2DPB: DS ;TEST UNUSED BUT DRIVEN BITS (1S IF NOT THERE) LD A,38H ;COND. JR (ON) JR Z,CLKON LD A,18H ;UNCOND. JR (OFF) (CAUSESDEFIOB ;INIT I/O BYTE LD (IOBYTE),A LD A,DFDRV ;INIT DEFAULT DRIVE LD (DEFDRV),A ; ; SEND SYSTEM SIGN-ON ; CLOGO: - A= 0 ; ;----------------------------------------- DSKOK: XOR A ;RETURN 0 RET DOFLOP: IF HARDBT ADD 2 ELS BC,CCP ;SET LOAD ADDR CALL SETDMA IF HARDBT LD A,(DEFBFR + BTCCPO) ;PICK UP START OF CP/M IMAGE FROM DIRECTORY INC DPBSZ ENDIF IF NDRVS GT 5 D3DPB: DS DPBSZ ENDIF ;---------------------------------- ; ; DISK CONTROLLER COMMAND  JUMP TO ILLEGAL) CLKON: LD (INHCLK),A ENDIF LD A,(DEFDRV) ;PASS IN DEFAULT DISK TO CCP LD C,A JP CCP SUBTTL DIS LD HL,MSGSO CALL EDITOR LD HL,(BIOS+4) ;MODIFY COLD START TO WARM START LD (BIOS+1),HL JP WARM ; ; SIGN-ON MESSAGE ADD 4 ;ADD OFFSET TO JADE VECTORS ENDIF LD (IY + PBDRV),A LD A,(BTSEC) DEC A ;CHANGE TO LOGICAL SECTOR JR RW A ;OFFSET FOR READ DECRIMENT LD C,A ELSE LD C,2 ;START WITH SECTOR #2 ENDIF CALL SETSEC ; READ CCP/BDOS BLOCK ; ;---------------------------------- BTDRV: DB 0 ;DRIVE # BTTRK: DB 0 ;TRACK # BTSEC: DB 0 ;SECTOR # ;------K ROUTINES ;*************************** ; ; READ A DISK SECTOR ; ;*************************** DISKRD: LD IY,IOPB ;SELE ; MSGSO: DB CR,LF DB CPMSZ / (KBYTE * 10) + '0' DB (CPMSZ MOD (KBYTE * 10)) / KBYTE + '0' DB 'K CP/M-80 Vers 2.2',CR,OPC ;---------------------------------- ; ; DISK ERROR EXIT ; EXIT - A= FFH ; ;---------------------------------- DSK WREAD: CALL DISKRD JR NZ,WEROR ;IF ERROR THEN EXIT LD A,(BTSEC) ;IF LAST SECTOR THEN DONE CP LASTSEC JR NC,WZRPG -------------------------------- ; ; OTHER BIOS VARS NEEDING INIT ; ;-------------------------------------- BTDMA: DW 0 ;SECT READ OP LD (IY + PBCMD),RDCMD JR HDDO ;**************************** ; ; WRITE A DISK SECTOR ; ;**************LF DB 'M5b CBIOS Vers 2.' DB HIGH VERSN , LOW VERSN,CR,LF,0 DS DIRBF+SECSZ-$ ;FILL OUT DIRECTORY BUFFER TO 1 SECTORER: LD A,0FFH ;RETURN -1 OR A RET ;************************************************* ; ; SELECT DRIVE ; LOG-ON - SINC A ;NEXT SECTOR LD (BTSEC),A LD DE,SECSZ ;DMA := DMA + SECTOR SIZE LD HL,(BTDMA) ADD HL,DE LD (BTDMA),HL JR WREAYSTEM TRANSFER ADDR DTPTR: DW 0 ;DRIVE TABLE PTR LOGRQ: DB 0 ;LOG ON REQUEST REG. ;------------------------------------************** DISKWR: LD IY,IOPB ;SELECT WRITE OP LD (IY + PBCMD),WRCMD HDDO: LD A,(BTDRV) CP 2 IF HARDBT JR  SIZE ;---------------------------------------------------------- ; ; WARM REBOOT ENTRY LOADS CCP,BDOS FROM DISK & ; SET< 256 : 1K= 0, 2K= 1, 4K= 3, 8K= 7, 16K= 15 ; DSM > 255 : 2K= 0, 4K= 1, 8K= 3, 16K= 7 DS 2 ;DSM- DRIVE STORAGE SIZE (IN CLS UP VARIABLES ; ;---------------------------------------------------------- WARM: IF INTRPTS LD A,HIGH INTABL ;INIT INT------------------------- INIT: LD SP,DEFBFR ;USE PAGE 0 FOR STACK CALL GETMON ;MAKE SURE BOOT ROM IS DISABLED LD A,0 ( ) *!+",#-$.%/ &0 'ET DISK PARAMETER BLOCK ; ENTRY- C= DRIVE # ; E= 0 IF NEVER LOGGED BEFORE ; EXIT - HL= PTR TO DPT OR 0 FOR ERROR ; ;******= ERRORS ; ;********************************* HDEXECL: LD HL,LIOPBAD ;USE LOGON IOPB JR HDEXEC1 HDEXEC: LD HL,IOPBADMATCH THEN ASSUME 3740 FORMAT CP (HL) JR NZ,LG3740 INC HL INC DE DJNZ LOGID ; DISKETTE CONTAINS ID. SET NO SECTJR Z,RETVER CP 90H ;IF NOT CLOCK THEN ERR JR C,ILLEGC JR Z,CLKCAL ;IF CALENDAR THEN GET IT CP 92H JR C,CLKSET ;******************************************* SELDSK: LD HL,0 ;ASSUME ERROR LD A,C ;SET DRIVE # CP NDRVS ;IF NOT 0..3 THR ;OUTPUT IOPB ADDRESS TO ISASI HDEXEC1: LD B,3 HDX1: LD A,(HL) INC HL OUT (HDATA),A LD A,(HL) INC HL OUT (HCMD)OR TRANSLATION XOR A LD HL,(DTPTR) ;FETCH BASE ADDR LD (HL),A ;XLATE TABLE PTR = 0 INC HL LD (HL),A CALL DPBAD IF SET FUNCTION THEN SET CLOCK JR Z,CLKTIM ;IF TIME THEN GET IT CP 93H JR Z,CLKRDC ;IF READ CLOCK THEN GET IT ; ; IK # ; ENTRY- C= TRACK # ; EXIT - A= C= TRACK # ; ;***************************** SETTRK: LD A,C LD (BTTRK),A RET ;*,A HDX2: IN A,(HSTATUS) BIT HBUSYB,A JR NZ,HDX2 DJNZ HDX1 LD A,HEXEC ;NOW EXECUTE THE IOPB OUT (HCMD),A HDX ;GET ADDR OF DPB & MOVE DOWN DISK INFO TO IT LD HL,DEFBFR + DDDPB - DDBUF LD BC,DPBSZ LDIR LD A,(DEFBFR + DDDDF - DDBLLEGAL SYSTEM CALL ; ILLEGC: LD HL,ISCMSG ;OUTPUT WARNING CALL EDITOR LD L,A ;BC = HL = A = 0 LD H,A LD C,A LD B,A **************************** ; ; SET SECTOR ; ENTRY- C= SECTOR # ; EXIT - A= C= SECTOR # ; ;***************************** F LOGICAL DRIVE 0 THEN RETURN DPB 0 ELSE SUB A,2 ;IF LOGICAL DRIVE 0 THEN RETURN DPB 0 ENDIF LD HL,HDDPH0 ;FIXED DA3: IN A,(HSTATUS) BIT HBUSYB,A JR NZ,HDX3 AND (1 SHL HERRB) + (1 SHL HFERRB) ;CHECK FOR ERRORS RET IF INTCPTS UF) ;IF DENSITY FLAG = 0 THEN USE 3740 AND 4 CALL Z,TR3740 LD HL,(DTPTR) ;ELSE RETURN PTR TO TABLE JP DSKOK ; ASS RET ;***************************************** ; ; CDOS RETURN VERSION SYSTEM CALL ; MAKES CLOCK/CALENDAR WORK. ; EX SETSEC: LD A,C LD (BTSEC),A RET ;***************************** ; ; SET TRANSFER ADDR ; ENTRY- BC= ADDRESS ; EXIT -TA RET Z LD HL,HDDPH1 ;ELSE RETURN DPB 1 RET FDSEL: LD A,E ;SET LOG REQUEST VECTOR LD (LOGRQ),A RETDSK: LD A,(B;*************************************************************************** ; ; SYSTEM CALL INTERCEPT ROUTINE CHECKS FOR ILLEIT - B= 1 ; ;***************************************** RETVER: LD B,1 RET SUBTTL MISC I/O DRIVERS ;******************* HL= BC= ADDRESS ; ;***************************** SETDMA: LD (BTDMA),BC RET ;*****************************************TDRV) ;COMPUTE TABLE PTR IF HARDBT SUB 2 ENDIF LD L,A LD H,0 ADD HL,HL ;DISK # * 16 ADD HL,HL ADD HL,HL AGAL BDOS CALLS & ; PRINTS MESSAGE IF ILLEGAL. ALSO IMPLEMENTS CDOS CLOCK/CALENDAR ; SYSTEM CALLS FOR ASMB. ; ;************C,DPBSZ LD HL,SDPBK LDIR LD HL,(DTPTR) ;RETURN PTR TO TABLE JP DSKOK ;********************************* ; ; S********************** ; ; CLOCK ROUTINES ; ;***************************************** ; ; RETURN CALENDAR FUNCTION 90H ;********************** ; ; SECTOR TRANSLATION ; ENTRY- DE= 0: NO XLATE, ELSE PTR TO XLATE TABLE ; BC= SECTOR # TO XLATE ; DD HL,HL LD DE,D0DPH ADD HL,DE LD A,(LOGRQ) ;RETURN TABLE PTR IF NOT 1ST LOG-ON AND 1 JR NZ,DSKOK ; READ IDENTIT*************************************************************** INTCPT: LD A,C ;CHECK CALL VALIDITY CP 41 ;IF <= 40 THEN OKET 3740 SECTOR TRANSLATION ; ;********************************* TR3740: LD DE,SDTRAN LD HL,(DTPTR) LD (HL),E INC HL L EXIT - A= DAY ; B= MONTH ; C= YEAR ; L= DAY OF WEEK ; ;***************************************** CLKCAL: LD HL,CALENEXIT - HL= XLATED SECTOR OR (BC) + 1 ; BC= UNCHANGED ; A, DE= ? ; ;*******************************************************Y SECTOR LD (DTPTR),HL ;SAVE DRIVE TABLE PTR LD A,(BTDRV) ;PERFORM DCM LOG-ON IF HARDBT ADD 2 ;BIAS UP TO FDC DRI BDOSV EQU $ + 1 JP C,BDOS + 11H ;THIS ADDR MODIFIED BY WARM BOOT RTN ; ; THE FOLLOWING CONDITIONAL JUMP IS MODIFIED TO D (HL),D RET ;************************************** ; ; GET DRIVE PARAMETER BLOCK ADDR ; EXIT - DE= DPB PTR ; HL=T ;ROM ENTRY POINT CLK1: LD BC,CLKBFR ;READ CLOCK JR CLK2 ;************************************* ; ; RETURN TIME FUN******** SECTRN: LD A,D ;IF TABLE ADDR = 0 THEN NO TRANSLATION OR E JR Z,NOTRAN EX DE,HL ADD HL,BC LD L,(HL) LDVES ELSE ADD 4 ;BIAS UP TO FDC DRIVES ENDIF LD (LOGIOPB + PBDRV),A CALL HDEXECL JR Z,LOGCK LD HL,0 ;ERROR-AN UNCONDITIONAL JUMP BY ; THE WARM BOOT ROUTINE IF THE CLOCK/CALENDAR BOARD IS NOT PRESENT ; IF NOT MODIFIED, THEN IT IS AL ? ; ;************************************** DPBAD: LD HL,(DTPTR) ;FETCH BASE ADDR LD DE,10 ;ADD OFFSET OF DPB PTR ADD HCTION 92H ; EXIT - A= SECONDS ; B= MINITS ; C= HOURS ; ;************************************* CLKTIM: LD HL,TIMENT J H,0 RET ; NOTRAN: LD HL,1 ADD HL,BC RET ;********************************* ; ; HARD DISK EXECUTE SUBR ; EXIT - NZ BAD LOG-ON JR DSKER ; CHECK FOR JADE ID LOGCK: LD HL,DEFBFR LD DE,JADEID LD B,IDSZE LOGID: LD A,(DE) ;IF NO LWAYS FALSE (NOP). ; INHCLK: JR C,ILLEGC ; ; NOW CHECK FOR EXTENDED CALLS ; CP 8DH ;IF RETURN VERSION THEN RETURN IT L,DE LD E,(HL) ;FETCH DPB PTR INC HL LD D,(HL) RET ;*************************************** ; ; HOME DRIVE - TEN ERROR RET NC LD (BTDRV),A CP 2 IF HARDBT JR NC,FDSEL ELSE JR C,FDSEL ENDIF IF HARDBT OR A ;IREAT AS SEEK TRK 0 ; ;*************************************** HOME: LD C,0 ;***************************** ; ; SET TRACUME 3740 FORMAT DISKETTE LG3740: CALL TR3740 ;SET SECTOR TRANSLATE CALL DPBAD ;MOVE PARAMETERS INTO DISK PAR BLK LD B0 ( ) *!+",#-$.%/ &0 'R CLK1 ;************************************************************ ; ; READ CLOCK TIME FUNCTION 93H ; ENTRY- DE= PTR TSSAGE EDIT LOOP OR A RET Z LD C,A PUSH HL CALL COC POP HL INC HL JR EDITOR IF INTRPTS SUBTTL INTERRUPTS IT - A= CHAR ; ;************************** CI: IF USEMON CALL GETMON ;SWITCH IN MONITOR ROM JP 0F803H ;USE MONITOR T ON EVEN PAGE BOUNDARY DS 100H - ($ AND 0FFH) ENDIF INTABL: REPT 7 ;1ST 7 ARE UNSUPPORTED DW ILLINT ENDM DW ITRO 13 BYTE BUFFER FOR CLOCK DATA ; ;************************************************************ CLKRDC: LD C,E ;SET UP PAR;-------------------------------------- ; ; USER INTERRUPT ; ;-------------------------------------- ITRAP: PUSH AF ;SAV ELSE CALL CNSCK ;IF NO CHAR RDY THEN WAIT JR Z,CI IN A,NTD ;ELSE RETURN CHAR RET ENDIF ;*****************AP ;INT 8 IS USER INTERRUPT ENDIF ;-------------------------------------- ; ; 3740 SECTOR TRANSLATION TABLE ; **** C********** PUNCH: RET ;************************************ ; ; PRINTER DRIVER ; ENTRY- C= CHAR TO OUTPUT ; ;********E USED REGISTERS PUSH HL PUSH BC LD HL,ITMSG ;NOTIFY USER IQCONT: CALL EDITOR LD HL,IQMSG ;QUERY USER CALL EDITOR*********************** ; ; RETURN CONSOLE STATUS ; EXIT - A= 0: NOT READY ; FFH: CHAR READY ; ;**********************P/M SINGLE DENSITY **** ; ;-------------------------------------- SDTRAN: DB 1,7,13,19,25,5,11,17,23,3,9,15 DB 21,2,8,14,20**************************** LO: IF USEMON CALL GETMON JP 0F80FH ELSE CALL LISTST ;IF BUSY THEN WAIT JR Z,LO ION 91H ; ENTRY- DE= CLOCK IMAGE BUFR PTR (13 BYTES LONG) ; ;********************************************************** CLKS CALL CI CP 3 ;IF CTRL-C THEN WARM BOOT JP Z,0000H AND 5FH ;IGNORE CASE CP 'Y' ;IF YES THEN ABORT JP Z,0000H ****************** CNSCK: IF USEMON CALL GETMON JP 0F812H ELSE IN A,NTS ;IF DATA NOT READY THEN RETURN 0 AND 1,26,6,12,18,24,4,10 DB 16,22 ;-------------------------------------- ; ; DEFAULT DISK PARAMETER BLOCK ; IBM 3740 SINGL LD A,C ;OUTPUT CHAR SET 7,A OUT CENTOUT,A RES 7,A ;OUTPUT LOW TRUE STROBE OUT CENTOUT,A SET 7,A OUT CENTOUT,AET: LD C,E ;SET UP PARAMETERS LD B,D LD HL,SETENT CLK2: LD A,CALROM ;********************************************** CP 'I' JR NZ,ITRAP1 POP BC ;ELSE RESTORE & GOTO MONITOR TRAP POP HL POP AF JP 0038H ITRAP1: CP 'M' ;IF MONIE DENSITY FORMAT ; ;-------------------------------------- SDPBK: DW 26 ;SECTORS PER TRACK DB 3 ;BLOCK SHIFT FACTOR DB  RET ENDIF ;***************************************** ; ; RETURN LIST DEVICE STATUS ; EXIT - A= 0: BUSY, FFH:READY************ ; ; EXECUTE ROM ROUTINE ; ENTRY- HL= ENTRY ADDRESS ; A= ROM # ; EXIT - ENTRY ROM RE-SELECTED ; ;***********TOR THEN GOTO MONITOR TRAP JR NZ,ITRAPR CALL GETMON ;INSURE MONITOR THERE POP BC POP HL POP AF JP 0F824H ITRAP OUTPUT ; ENTRY- C= CHAR TO OUTPUT ; ;*************************************** COC: IF USEMON CALL GETMON JP 0F809H 7 ;BLOCK MASK DB 0 ;NULL MASK DW 242 ;DISK SIZE -1 DW 63 ;DIRECTORY MAX DB 11000000B ;ALLOC 0 DB 0 ;ALLOC 1 DW  ; ;***************************************** LISTST: IF USEMON CALL GETMON JP 0F827H ELSE IN A,CENTS ;IF BUSY*********************************************** EXROM: PUSH AF ;SAVE NEW ROM IN A,ROMSEL ;SAVE CURRENT ROM LD (ROMSAV)R: POP BC ;IF CONTINUE THEN RESTORE & RETURN POP HL POP AF EI ;RE-ENABLE INTERRUPTS RET ;*********************** ELSE CALL NTOST ;IF BUSY THEN WAIT OR A JR Z,COC LD A,C OUT NTD,A RET ;**********************************16 ;CHECK SIZE DW 2 ;TRACK OFFSET ;--------------------------------- ; ; HARD DISK DATA ; ;------------------------ THEN RETURN 0 CPL ;INVERT THE SENSE AND 1 SHL CENTBSY RET Z LD A,0FFH ;ELSE RETURN -1 RET ENDIF ;******,A POP AF ;SELECT NEW ROM AND ROMSMK OUT ROMSEL,A PUSH HL ;SAVE ENTRY LD HL,EXROMR ;PUT RETURN ADDR ON STACK *************** ; ; UNSUPPORTED INTERRUPT ; ;************************************** ILLINT: PUSH AF ;SAVE ALL 8080 REGS ************* ; ; RETURN CONSOLE OUTPUT READY STATUS ; EXIT - A= 0: BUSY, FFH: READY ; ;***********************************--------- IOPB: REPT 16 ;;HARD DISK IOPB DB 0 ENDM IOPBADR: DB LOW IOPB ;HARD DISK IOPB POINTER TABLE DB HIOPBL D********************** ; ; GET MONITOR PROM SUBR ; EXIT - A= ? ; ;**************************** GETMON: LD A,XMONROM OU EX (SP),HL JP (HL) ;EXECUTE ROM EXROMR: PUSH AF ;SAVE RETURN VALUE LD A,(ROMSAV) ;RESELECT ORIGINAL ROM OUT ROMSEL,A PUSH HL PUSH BC LD HL,ILLIM ;NOTIFY USER OF INT JR IQCONT SUBTTL DATA CONSTANTS ;--------------------------------************ NTOST: IN A,NTS CPL ;REVERSE SENSE AND 1 SHL NTBSY JR TTOST1 ENDIF ;*****************************B HIGH IOPB DB HIOPBH DB 0 DB HIOPBX LOGIOPB: DB LOGCMD ;READ COMMAND DB 4 ;DRIVE DW 0 ;TRACK DW 1 ;SECTOR T (ROMSEL),A RET ;************************** ; ; MESSAGE EDITOR ; ;************************** EDITOR: LD A,(HL) ;ME POP AF ;RETURN VALUE RET ENDIF SUBTTL CHAR I/O ROUTINES ;************************** ; ; CONSOLE INPUT ; EX---------------- ; ; MODE 2 INTERRUPT VECTOR TABLE ; ;------------------------------------------------ IF $ AND 0FFH ;STAR***** ; ; READER DRIVER - DUMMY ; EXIT - A= CTRL-Z ; ;********************************** READER: LD A,CTRLZ ;FAKE EOF RAMETERS LD B,D LD HL,RDBENT JR CLK2 ;********************************************************** ; ; CLOCK SET FUNCTET ;************************************** ; ; PUNCH DRIVER ; ENTRY- C= CHAR TO OUTPUT ; ;**************************** SHL NTRDY TTOST1: RET Z LD A,-1 ;ELSE RETURN -1 RET ENDIF ;*************************************** ; ; CONSOLE0 ( ) *!+",#-$.%/ &0 ' DB 0 ;FLAGS (LOGON) DW DEFBFR ;DMA ADDR DB 0 ;BANK ADDR DS (LOGIOPB + 16) - $ LIOPBAD: DB LOW LOGIOPB ;LOGON DISå D0DPH: DW 0 ;SECTOR TRAN TBL (OR 0 IF NO XLATE) DW 0 ;SCRATCH AREA DW 0 ;" DW 0 ;" DW DIRBF ;DIRECTORY BUFFER PTR DISK BOOT CONFIG. ; A 0 SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; B 1 SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 0 ; CK IOPB POINTER TABLE DB HIOPBL DB HIGH LOGIOPB DB HIOPBH DB 0 DB HIOPBX ;------------------ ; ; MESSAGES å DW D0DPB ;DRIVE PARAMETER BLK PTR DW D0CHK ;DRIVE DISK CHECKSUMS ARRAY PTR DW D0ALL ;DRIVE CLUSTER ALLOCATION BIT MAP P 2 SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; D 3 SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ; E 4 JADE FLOPPY PHYSICAHKSIZ ;DIRECTORY CHECKSUMS STORAGE (1 BYTE PER DIR SECTOR) IF NDRVS GT 3 D1ALL: DS ALLSIZ D1CHK DS CHKSIZ ENDIF åTR IF NDRVS GT 3 D1DPH: DW 0 DW 0 DW 0 DW 0 DW DIRBF DW D1DPB DW D1CHK DW D1ALL ENDIF IF NDRVS GTL DRIVE 0 ; F 5 JADE FLOPPY PHYSICAL DRIVE 1 ; 6 JADE FLOPPY PHYSICAL DRIVE 2 ; 7 JADE FLOPPY PHYSICAL DRIVE 3  IF NDRVS GT 4 D2ALL: DS ALLSIZ D2CHK DS CHKSIZ ENDIF IF NDRVS GT 5 D3ALL: DS ALLSIZ D3CHK DS CHKSIZ ENDIF F INTRPTS ITMSG DB CR,LF,'User',0 ILLIM DB CR,LF,'Unsupported',0 IQMSG DB ' Interrupt: Abort? (Y/N) - ',0 ENDIF ;----- TITLE CUSTOMIZED BIOS FOR M5B LIST NOCOND LIST OFF ;********************************* ; ; ASSEMBLY PARAMETERS ; ;***** 4 D2DPH: DW 0 DW 0 DW 0 DW 0 DW DIRBF DW D2DPB DW D2CHK DW D2ALL ENDIF IF NDRVS GT 5 D3DPH: DW 0 DW ELSE ; A 4 JADE FLOPPY PHYSICAL DRIVE 0 ; B 5 JADE FLOPPY PHYSICAL DRIVE 1 ; 6 JADE FLOPPY PHYSICAL DRIVE 2  IF INTCPTS ;---------------------------- ; ; CLOCK BUFFER ; ;---------------------------- CLKBFR: DS 13 ROMSAV DS----------------------- ; ; ID SECTOR LABEL ; ;---------------------------- JADEID: DB 'Jade DD ' IDSZE: EQU $-JADEID **************************** FALSE EQU 0 TRUE EQU NOT FALSE ;====================================== ; ; CONDITIONAL ASSEMBL ; 7 JADE FLOPPY PHYSICAL DRIVE 3 ; C 0 SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; D 1 SIDE 2 & 3 OF HARD DISK PH 1 ;ROM SWAP SAVE OF ORIGINAL ROM ENDIF ;---------------------------- ; ; HARD DISK ALLOCATION ; ;----------------- ;-------------------------------------- ; ; DRIVE PARAMETER HEADER AREA ; 1 PER DRIVE ; ;---------------------------------Y FLAGS ; ;====================================== SHORT EQU TRUE ;SHORT BIOS (REMOVES UNESENTIAL CODE) LSTINC EQU FALSE ;LAMETER BLOCKS ; ;--------------------------------- HDDPB: DW 128 ;SECTORS PER TRACK (LOGICAL) (SPT) DB 5 ;BLOCK SHIFT FACYSICAL DRIVE 0 ; E 2 SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; F 3 SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ENDIF----------- HDALL0: DS 128 HDALL1: DS 128 IF ($ > 0F800H) OR ($ < 8000H) CONMSG BIOS TOO BIG ENDIF END ----- HDDPH0: DW 0 ;SECTOR TRAN TBL (OR 0 IF NO XLATE) DW 0 ;SCRATCH AREA DW 0 ;" DW 0 ;" DW DIRBF ;DIRECTORY BUFFIST INCLUDE FILES HARDBT EQU TRUE ;HARD DISK BOOT (FALSE= FLOPPY BOOT) USEMON EQU TRUE ;USE MONITOR ROM I/O ROUTINES IF TRUETOR (BSH) DB 31 ;BLOCK MASK (BLM) DB 1 ;NULL MASK (EXM) DW 1015 ;DISK SIZE (CLUSTERS -1) (DSM) DW 1152 / 2 ;DIRE ; ;************************************************************* ; REVISIONS: ; ; 2.2.0 - RELEASE ; ; 2.2.3 - SWAPPED åER PTR DW HDDPB ;DRIVE PARAMETER BLK PTR DW 0 ;NO DRIVE DISK CHECKSUMS DW HDALL0 ;DRIVE CLUSTER ALLOCATION BIT MAP PTR  INTRPTS EQU TRUE ;ENABLE INTERRUPT PROCESSING WHISTLE INTCPTS EQU TRUE ;ENABLE SYSTEM CALL INTERCEPT WHISTLE LIST ON ;**CTORY MAX (DRM) DB 0FFH ;ALLOCATION 0 (AL0) DB 10000000B ;ALLOCATION 1 (AL1) DW 0 ;CHECK SIZE (CKS) DW 2 ;TRADCM & BIOS SECTORS ON DISK, ALLOWING A ; LARGER BIOS ALLOCATION ON THE DISK. ; ; 2.2.4 - ADDED NAKED TERMINAL DRIVERS & Iå HDDPH1: DW 0 ;SECTOR TRAN TBL (OR 0 IF NO XLATE) DW 0 ;SCRATCH AREA DW 0 ;" DW 0 ;" DW DIRBF ;DIRECTORY BUFFER P*********************************************************** ; ; (c) 1981 GRH Electronics, CUPERTINO, CA ; ;*************CK OFFSET (OFF) BIOSND EQU $ SUBTTL DATA AREA ;------------------------------------------------ ; ; THE REMAINING AROBYTE IN ; ANTICIPATION OF THE MONITOR. ALSO, ALL REFERENCES ; REQUIRING THE I/O PROMS TO BOOT HAS BEEN REMOVED. ; ;åTR DW HDDPB ;DRIVE PARAMETER BLK PTR DW 0 ;NO DRIVE DISK CHECKSUMS DW HDALL1 ;DRIVE CLUSTER ALLOCATION BIT MAP PTR ************************************************ ; ; CONFIGURATION: ; ; CPM ISASI ; DRIVE DRIVE USAGE IF HARDBT ;HARD EA DOES NOT HAVE TO ; BELONG ON THE DISK. ; ;------------------------------------------------ ; ; DRIVE ALLOCATION AREAS; ;------------------ MSGLE: DB CR,LF,'LOAD ERROR',0 IF INTCPTS ISCMSG: DB CR,LF,'ILL. SYS. CALL',CR,LF,0 ENDIF I DECLARED ; ;------------------------------------------------ D0ALL: DS ALLSIZ ;DISK CLUSTER ALLOCATION BIT MAP D0CHK DS C 0 DW 0 DW 0 DW DIRBF DW D3DPB DW D3CHK DW D3ALL ENDIF ;--------------------------------- ; ; HARD DISK PAR0 ( ) *!+",#-$.%/ &0 ' 2.2.5 - RECONFIGURE FOR 62K SYSTEM. ; ; 2.2.6 - 20 FEB 83 ; DOUBLE D REV C UPGRADE. CHANGE BOARD STATUS PORT BITS. ; ; 2.2OARD.DEF *INCLUDE NAKEDT.DEF *INCLUDE ISASI.DEF *INCLUDE CLOCK.DEF LIST ON SUBTTL BIOS CODE ORG BIOS ;--------------n. ; Move to 61k system. ; ; 2.04 - 30 MAR 85 GRH ; Implemented hard disk drive 1 as C: & D:. ; Implemented the Logon fun COMMAND BLOCK ; ;---------------------------------- BTDRV: DB 0 ;DRIVE # BTTRK: DB 0 ;TRACK # BTSEC: DB 0 ;SECTOR # .7 - 8 MAR 83 GRH ; ADDED CLOCK/CALENDAR DRIVER, SYSTEM CALL INTERCEPT, ; ILLEGAL SYSTEM CALL MESSAGE, CHANGED BIOS SIZE TO EN-------------- ; ; BIOS JUMP VECTOR TABLE ; ;---------------------------- JP INIT1 ;COLD START ENTRY JP WARM ;RELOADction for the hard disk. ; Implemented user friendly disk error options: Abort, Retry, Ignore. ; Solved warm boot hang problem ;-------------------------------------- ; ; OTHER BIOS VARS NEEDING INIT ; ;-------------------------------------- BTDMA:********************************************************** ; ; THE FOLLOWING 2 PARAMETERS MUST REFLECT THE MAX DISK SIZE & ;  CCP/BDOS JP CNSCK ;GET CONSOLE STATUS JP CI ;CONSOLE INPUT JP COC ;CONSOLE OUTPUT JP LO ;PRINTER OUTPUT JP PUNCH  by reseting host adapter if busy. ; VERSN EQU '04' ; ;********************************************************************* DW 0 ;SYSTEM TRANSFER ADDR DTPTR: DW 0 ;DRIVE TABLE PTR LOGRQ: DB 0 ;LOG ON REQUEST REG. ;---------------------------THE MAX DIRECTORY SIZE. ; ;************************************************************************* ALLSIZ EQU 33 ;ALLOCATIO. ; DISALLOWED DRIVES C & D. ; ; 2.29 - 3 SEP 83 GRH ; Changed Rev # for blocked DCM. Enables IBM system 34 ; 256 bytes p JP READER JP HOME ;HOME SELECTED DRIVE JP SELDSK ;SELECT DISK DRIVE JP SETTRK ;SET TRACK # JP SETSEC ;SET SECTOR #**** SUBTTL SYSTEM DECLARATIONS ;-------------------------------------- ; ; DISK OPERATING SYSTEM ADDRESSES ; ;----------------------------------------------------- ; ; DIRECTORY SECTOR BUFFER STARTS HERE AFTER CRUNCHING COLD START ; CODE. TN BIT MAP SIZE (1 BYTE PER 8 CLUSTERS) CHKSIZ EQU 32 ;DIRECTORY CHECKSUMS ARRAY SIZE (1 BYTE PER DIR. SECTOR) ;*************er sector disks to be read. ; ; 1.10 - 23 SEP 83 GRH ; Move clock-calendar routines to ROM. Add Interrupt handler ; (Mode  JP SETDMA ;SET TRANSFER ADDR JP DISKRD ;PERFORM DISK READ JP DISKWR ;PERFORM DISK WRITE JP LISTST ;RETURN LIST STATHIS BUFFER IS USED BY THE CP/M DIRECTORY CHECK ROUTINES THAT ; CHECK FOR DISK CHANGE. ; ;-----------------------------------*************** ; ; ADDRESSES ; ;**************************** CALROM EQU 7 ;CALENDAR ROM SELECT # RDBENT EQU 0F800H ;REA2). Change Revision display of sign-on (separate CBIOS rev). ; ; 2.00 - 24 MAR 84 GRH ; Modify for hard disk ; ; 2.01 - 2US JP SECTRN ;TRANSLATE SECTOR JP ITRAP ;FORMAT VECTOR ;***************************************************************MSZ - (20 * KBYTE) ; CP/M BIAS VALUE CCP: EQU CPMBS+3400H ;ADDR OF CCP BDOS: EQU CPMBS+3C00H ;ADDRESS OF BDOS BIOS: EQU CPMBS--------------------------------------- DIRBF: EQU $ ;BUFFER BEGINNING ;-------------------------------------------------D CLOCK BUFFER ENTRY SETENT EQU RDBENT + 3 ;SET CLOCK ENTRY CALENT EQU RDBENT + 6 ;RETURN CALENDAR ENTRY TIMENT EQU RDBENT + 8 APR 84 GRH ; Change hard disk DPB to reflect half size directory, but keep ; allocation for 1k directory ; ; 2.02 - 2 JU*********** ; ; THESE BOOT PARAMS MUST RESIDE AS DEFINED RIGHT BEFORE THE COLD ; INIT ROUTINE START AND MUST BE IN THE 1ST S+4A00H ;ADDRESS OF BDOS BIOSR: EQU 1000H-BIOS ; PAGE0: EQU 0 ;START OF CP/M RAM IOBYTE: EQU PAGE0 + 3 ;IOBYTE ADDR DEFDRV:------------------- ; ; INIT - COLD START ENTRY FROM BOOT MUST SET ALL BIOS PARAMS ; ;----------------------------------9 ;RETURN TIME ENTRY ;**************************** ; ; ASCII CHARS ; ;**************************** LF: EQU 0AH CR: EQN 84 GRH ; Change floppy disk drivers to relate to ISASI control of JADE ; FDC. ; Change IOPB sector value from physicalECTOR. ; THESE 2 WORDS ARE REFERENCED BY THE BOOT CODE IN ; ORDER TO FIND THE LOAD ADDRESS FOR THE BIOS & IT'S LENGTH. ; ; EQU PAGE0 + 4 ;DEFAULT DRIVE PARAM ADDR DEFBFR EQU PAGE0 + 80H ;DEFAULT BUFFER TPA: EQU 100H ; ; OTHER DECLARATIONS ; D---------------------------------- INIT: LD SP,DEFBFR ;USE PAGE 0 FOR STACK CALL GETMON ;MAKE SURE BOOT ROM IS DISABLED U 0DH CTRLZ: EQU 1AH ; ; INCLUDE JDDCONT.DEF ; INCLUDE MONBOARD.DEF ; INCLUDE IOBOARD.DEF ; INCLUDE NAKEDT.DEF ; INCLUD sector (1..n) to logical ; sector value (0..n-1). This maintains more uniformity in ; parameter passing between hard di************************************************************************** BIOSSZ: DW BIOSND - BIOS ;BIOS MODULE SIZE IN BYTES EFIOB: EQU 80H ;INITIAL IOBYTE VALUE (LPT ON) DFDRV: EQU 0 ;INITIAL DEFAULT DRIVE SECSZ: EQU 128 FMTSZ: EQU 100H ;FORMAT B LD A,DEFIOB ;INIT I/O BYTE LD (IOBYTE),A LD A,DFDRV ;INIT DEFAULT DRIVE LD (DEFDRV),A ; ; SEND SYSTEM SIGN-ON E ISASI.DEF ; INCLUDE CLOCK.DEF IF NOT LSTINC LIST OFF ENDIF *INCLUDE JDDCONT.DEF *INCLUDE MONBOARD.DEF *INCLUDE IOBsk & JADE floppy IOPBs. ; Vector I/O routines to monitor rom routines. ; ; 2.03 - 4 JUN 84 GRH ; Add bells & whistles agai BIOSST: DW BIOS ;BIOS MODULE LOAD ADDR FOR SBD INIT1: JR INIT ;---------------------------------- ; ; DISK CONTROLLERUFFER SIZE NDRVS: EQU 6 BTDIRS EQU 3 ;HARD DISK SYSTEM TRACKS DIRECTORY SECTOR BTCCPO EQU 3 ;OFFSET TO CCP ENTRY IN SYS TRKD ; OF INITIALIZED DATA AREA. RESTRUCTURE MODULES. ; ; 2.28 - 22 APR 83 GRH ; CHANGED DEFINITIONS TO ALLOW BIG DIRECTORIESS DIRECTORY IF HARDBT LASTSEC EQU 47 ;LAST BOOT SECTOR ELSE LASTSEC EQU 45 ;LAST BOOT SECTOR ENDIF ;***************-------------------------------- NKSYS: EQU 61 ;SYSTEM SIZE IN K BYTES KBYTE: EQU 1024 CPMSZ: EQU KBYTE*NKSYS CPMBS: EQU CP0 ( ) *!+",#-$.%/ &0 '; CLOGO: LD HL,MSGSO CALL EDITOR LD HL,(BIOS+4) ;MODIFY COLD START TO WARM START LD (BIOS+1),HL JP WARM ; ; SIGN-FLG),0 ;NO FLAGS FOR NOW LD HL,(BTDMA) ;SET DMA ADDR LD (IY + PBDMA),L LD (IY + [PBDMA + 1]),H LD (IY + PBDMAX),0 ;1 NTHUNG: LD BC,DEFBFR ;READ BOOT DIRECTORY CALL SETDMA LD C,BTDIRS CALL SETSEC LD C,0 ELSE LD C,1 ENDIF  ;NOT RETURNING, WASTE ADDRESS TO CALLER CP 'A' ;IF ABORT THEN RE-BOOT JP Z,0 SUB 'I' ;IF IGNORE THEN RETURN NO ERROON MESSAGE ; MSGSO: DB CR,LF DB CPMSZ / (KBYTE * 10) + '0' DB (CPMSZ MOD (KBYTE * 10)) / KBYTE + '0' DB 'K CP/M-80 VersTHIS BANK FOR NOW RWOPR: CALL HDEXEC ; DO OP RET Z ;IF NO_ERROR THEN RETURN LD A,(IY + PBSTAT) ;PASS STATUS BYTE TCALL SETTRK IF HARDBT CALL DISKRD JR NZ,WEROR ENDIF LD BC,CCP ;SET LOAD ADDR CALL SETDMA IF HARDBT R RET Z FDSKER: LD HL,0 ;RETURN DPB_PTR = 0 FOR SELECT FUNCTION LD A,-1 ;RETURN -1 TO BDOS OR A RET ;********* LD A,38H ;COND. JR (ON) JR Z,CLKON LD A,18H ;UNCOND. JR (OFF) (CAUSES JUMP TO ILLEGAL) CLKON: LD (INHCLK),A ENDIFO DISK_ERROR() CALL DSKER JR RWOPR ;SINCE RETURNED, DO RETRY DOFLOP: LD (IY + PBDRV),A LD A,(BTSEC) DEC A ;CHANGELD A,(DEFBFR + BTCCPO) ;PICK UP START OF CP/M IMAGE FROM DIRECTORY INC A ;OFFSET FOR READ DECRIMENT LD C,A ELSE LD C,**************************************** ; ; SELECT DRIVE ; LOG-ON - SET DISK PARAMETER BLOCK ; ENTRY- C= DRIVE # ; E= 0  LD A,(DEFDRV) ;PASS IN DEFAULT DISK TO CCP LD C,A JP CCP SUBTTL DISK ROUTINES ;*************************** ; ; RECTOR SIZE ;---------------------------------------------------------- ; ; WARM REBOOT ENTRY LOADS CCP,BDOS FROM DISK &  TO LOGICAL SECTOR JR RWOPC ;----------------------------------------- ; ; NORMAL EXIT ; EXIT - A= 0 ; ;------------2 ;START WITH SECTOR #2 ENDIF CALL SETSEC ; ; READ CCP/BDOS ; WREAD: CALL DISKRD JR NZ,WEROR ;IF ERROR THEN EXIT IF NEVER LOGGED BEFORE ; EXIT - HL= PTR TO DPT OR 0 FOR ERROR ; ;************************************************* SELDSK: LEAD A DISK SECTOR ; ;*************************** DISKRD: LD IY,IOPB ;SELECT READ OP LD (IY + PBCMD),RDCMD JR HDDO ; SETS UP VARIABLES ; ;---------------------------------------------------------- WARM: IF INTRPTS LD A,HIGH INTABL ;INI----------------------------- DSKOK: XOR A ;RETURN 0 RET ;-------------------------------------------------------------D HL,0 ;ASSUME ERROR LD A,C ;SET DRIVE # CP NDRVS ;IF NOT 0..(NUMBER_OF_DRIVES -1) THEN ERROR RET NC LD (BTDRV),A ;**************************** ; ; WRITE A DISK SECTOR ; ;**************************** DISKWR: LD IY,IOPB ;SELECT WRIT INTERRUPT VECTORS LD I,A IM 2 ;USE MODE 2 IN A,INTMSK AND 7FH ;ENABLE INT 7 OUT INTMSK,A IN A,MONSTS ;ENABLE------- ; ; DISK ERROR SUBR. ; QUERIES USER FOR ABORT (REBOOT), IGNORE (RETURN OK TO BDOS), ; RETRY (RETURNS TO CALLER) OR:= DMA + SECTOR SIZE LD HL,(BTDMA) ADD HL,DE LD (BTDMA),HL JR WREAD ; ; WARM BOOT ERROR, OUTPUT MSG & HALT ; WEROR ;STORE DRIVE # LD A,E ;SET LOG REQUEST VECTOR LD (LOGRQ),A RETDSK: LD A,(BTDRV) ;COMPUTE TABLE PTR LD L,A LD H,0 TE OP LD (IY + PBCMD),WRCMD HDDO: LD A,(BTDRV) CP NDRVS ;IF RANGE ERROR THEN ABORT JP NC,FDSKER IF HARDBT CP  MONITOR BOARD INTERRUPTS OR MONIE OUT MONSTS,A EI ENDIF LD SP,DEFBFR ;SELECT TEMPORARY STACK CALL GETMON ;SEL NORMAL BDOS ERROR (DEFAULT). ; ENTRY- A= ERROR CODE ; EXIT - A= FFH (DEFAULT), CHAR OTHERWISE ; HL= ? ; ;----------------: LD HL,MSGLE ;OUTPUT ERROR MESSAGE CALL EDITOR HALT ; ; BOOT OK, INIT PAGE 0 ; WZRPG: LD A,0C3H ;INITIALIZE BIOS WAR ADD HL,HL ;DISK # * 16 ADD HL,HL ADD HL,HL ADD HL,HL LD DE,D0DPH ADD HL,DE LD A,(LOGRQ) ;IF NOT_1ST_LOG_ON THEN4 JR NC,DOFLOP ELSE CP 2 JR C,DOFLOP SUB 2 ;BIAS DOWN TO HARD DISK ADDRESS ENDIF SRL A ;0,1: DRV 0, 2,ECT MONITOR ROM LD A,0 ;SET DRIVE 0 LD (BTDRV),A IF HARDBT IN A,(HSTATUS) ;IF HOST ADAPTER BUSY THEN BIT HBUSYB---------------------------------------------------- DSKER: LD HL,DSKEB ;POINT TO ERROR BYTE CALL PRHEX ;LOAD ERROR CODE IM START VECTOR LD HL,BIOS + 3 LD (PAGE0),A LD (PAGE0 + 1),HL LD HL,BDOS + 6 ;INIT BDOS CALL VECTOR LD (PAGE0 + 5),A  RETURN TABLE PTR AND 1 XOR 1 RET Z ; ; READ IDENTITY SECTOR ; LD (DTPTR),HL ;SAVE DRIVE TABLE PTR LD A,(BTDRV) 3: DRV 1 LD (IY + PBDRV),A LD D,0 ;COMPUTE SECTOR RR D ;DRIVE BIT 0 -> SECTOR BIT 7 LD A,(BTSEC) DEC A ;CHANGE,A JR Z,NTHUNG LD A,1 SHL HRESET ; RESET HOST ADAPTER TO CLEAR HANG OUT (HCMD),A XOR A OUT (HCMD),A EX (SP),HL NTO MESSAGE LD HL,DSKEM ;OUTPUT ERROR MESSAGE CALL EDITOR CALL CI ;GET USER RESPONSE PUSH AF ;SAVE CHAR LD C,A LD (PAGE0 + 6),HL LD HL,DEFBFR ;SET DEFAULT SECTOR BUFFER LD (BTDMA),HL IF INTCPTS LD HL,(BDOS + 7) ;GET BDOS VEC;PERFORM DCM LOG-ON IF NOT HARDBT CP 2 ;IF FLOPPIES THEN JR NC,LOG2 ADD 4 ;BIAS UP TO FDC DRIVES JR LOG3 LO TO LOGICAL SECTOR AND 7FH OR D RWOPC: LD (IY + PBSEC),A LD A,(BTTRK) ;SET TRACK LD (IY + PBTRK),A LD (IY + PB ; DELAY FOR HOST ADAPTER TO CATCH UP EX (SP),HL WARM1: IN A,(HSTATUS) ; WHILE BUSY THEN WAIT BIT HBUSYB,A JR NZ,WARM ;ECHO CHAR CALL COC POP AF AND 5FH ;INSURE UPPER CASE CP 'R' ;IF RETRY THEN RETURN TO CALLER RET Z POP HL TOR LD (BDOSV),HL ;PUT IN INTERCEPT CODE LD HL,INTCPT ;NOW PUT INTERCEPT VECTOR INTO BDOS VECTOR LD (BDOS + 7),HL IN A 2.2',CR,LF DB 'M5b CBIOS Vers 2.' DM HIGH VERSN , LOW VERSN,CR,LF DS DIRBF+SECSZ-$ ;FILL OUT DIRECTORY BUFFER TO 1 S,(CLKDAT) ;IF CLOCK NOT PRESENT THEN TURN OFF CLOCK DRIVE AND 11000000B ;TEST UNUSED BUT DRIVEN BITS (1S IF NOT THERE) LD A,(BTSEC) ;IF LAST SECTOR THEN DONE CP LASTSEC JR NC,WZRPG INC A ;NEXT SECTOR LD (BTSEC),A LD DE,SECSZ ;DMA 0 ( ) *!+",#-$.%/ &0 'G2: SUB 2 ;ELSE BIAS DOWN TO HARD DISKS LOG3: ENDIF LD HL,LOGIOPB + PBSEC ;START WITH SECTOR 0 LD (HL),0 CP 4 ;IF ;SAVE DATA AND 0FH ;MASK OFF OTHER NIBBLE CP 10 ;OFFSET IF > 9 JR C,NTALPH ADD 7 NTALPH: ADD '0' ;CONVERT TO  TRNONE ; NO XLATE CALL DPBAD ; USE DEFAULT TABLE LD HL,HDPBK JR MOVDPB LG371: CALL TR3740 ;SET SECTOR TRANSLATE TIONAL JUMP IS MODIFIED TO AN UNCONDITIONAL JUMP BY ; THE WARM BOOT ROUTINE IF THE CLOCK/CALENDAR BOARD IS NOT PRESENT ; IF  HARD DISK THEN JR NC,LOG4 RRCA ;IF ODD LOGICAL DRIVE THEN PUSH AF AND 80H ;SECTOR = 128 LD (HL),A POP AF ANDASCII LD (HL),A ;STORE CHAR POP AF ;DATA INC HL ;NEXT CHAR RET ;********************************* ; ; HARD DIS CALL DPBAD ;MOVE PARAMETERS INTO DISK PAR BLK LD HL,SDPBK MOVDPB: LD BC,DPBSZ ;MOVE DRIVE TABLE TO CP/M DRIVE TABLE LNOT MODIFIED, THEN IT IS ALLWAYS FALSE (NOP). ; INHCLK: JR C,ILLEGC ; ; NOW CHECK FOR EXTENDED CALLS ; CP 8DH ;IF RETUR**************** SETSEC: LD A,C LD (BTSEC),A RET ;***************************** ; ; SET TRANSFER ADDR ; ENTRY- BC= K EXECUTE SUBR ; EXIT - NZ= ERRORS ; ;********************************* HDEXECL: LD HL,LIOPBAD ;USE LOGON IOPB JR HDEXECDIR JR LOGDON ;RETURN PTR TO TABLE ;********************************* ; ; SET 3740 SECTOR TRANSLATION ; EXIT - DEN VERSION THEN RETURN IT JR Z,RETVER CP 90H ;IF NOT CLOCK THEN ERR JR C,ILLEGC JR Z,CLKCAL ;IF CALENDAR THEN GET ITADDRESS ; EXIT - HL= BC= ADDRESS ; ;***************************** SETDMA: LD (BTDMA),BC RET ;************************Z,LOGCK LD A,(LOGIOPB + PBSTAT) ;PASS ERROR CODE TO DISK_ERROR() CALL DSKER JR FDLOGR ;RETURN HERE MEANS TO RETRY ; 1 HDEXEC: LD HL,IOPBADR ;OUTPUT IOPB ADDRESS TO ISASI HDEXEC1: LD B,3 HDX1: LD A,(HL) INC HL OUT (HDATA),A LD A, HL= ? ; ;********************************* TR3740: LD DE,SDTRAN SETTR LD HL,(DTPTR) LD (HL),E INC HL LD (HL),D RET CP 92H JR C,CLKSET ;IF SET FUNCTION THEN SET CLOCK JR Z,CLKTIM ;IF TIME THEN GET IT CP 93H JR Z,CLKRDC ;IF READ*************************************** ; ; SECTOR TRANSLATION ; ENTRY- DE= 0: NO XLATE, ELSE PTR TO XLATE TABLE ; BC= SECT ; CHECK FOR JADE ID ; LOGCK: LD HL,DEFBFR LD DE,JADEID LD B,IDSZE LOGID: LD A,(DE) ;IF NO MATCH THEN ASSUME 3740 FORM,(HL) INC HL OUT (HCMD),A HDX2: IN A,(HSTATUS) BIT HBUSYB,A JR NZ,HDX2 DJNZ HDX1 LD A,HEXEC ;NOW EXECUTE THE CLOCK THEN GET IT ; ; ILLEGAL SYSTEM CALL ; ILLEGC: LD HL,ISCMSG ;OUTPUT WARNING CALL EDITOR XOR A ;BC = HL = A = 0 OR # TO XLATE ; EXIT - HL= XLATED SECTOR OR (BC) + 1 ; BC= UNCHANGED ; A, DE= ? ; ;**************************************AT CP (HL) JR NZ,LG3740 INC HL INC DE DJNZ LOGID ; ; DISKETTE CONTAINS ID. ASSUME NO SECTOR TRANSLATION ; CAL IOPB OUT (HCMD),A HDX3: IN A,(HSTATUS) BIT HBUSYB,A JR NZ,HDX3 AND (1 SHL HERRB) + (1 SHL HFERRB) ;CHECK FOR ERROR*** TRNONE: LD DE,0 JR SETTR ;************************************** ; ; GET DRIVE PARAMETER BLOCK ADDR ; EXIT - DE LD L,A LD H,A LD C,A LD B,A RET ;***************************************** ; ; CDOS RETURN VERSION SYSTEM CALL ************************* SECTRN: LD A,D ;IF TABLE ADDR = 0 THEN NO TRANSLATION OR E JR Z,NOTRAN EX DE,HL ADD HL,BC L TRNONE CALL DPBAD ;GET ADDR OF DPB & MOVE DOWN DISK INFO TO IT LD HL,DEFBFR + IDSPTO CALL MOVDPB ; ; IF DENSITY FS RET IF INTCPTS ;*************************************************************************** ; ; SYSTEM CALL INTERC= DPB PTR ; HL= ? ; ;************************************** DPBAD: LD HL,(DTPTR) ;FETCH BASE ADDR LD DE,10 ;ADD OFFSET O; MAKES CLOCK/CALENDAR WORK. ; EXIT - B= 1 ; ;***************************************** RETVER: LD B,1 RET SUBTTL MIS LD L,(HL) LD H,0 RET ; NOTRAN: LD HL,1 ADD HL,BC RET ;************************************** ; ; LOAD HEX DALAG = SINGLE (0) AND HARD DISK FLAG = FALSE (0) THEN USE ; 3740 FORMAT ; LD A,(DEFBFR + IDFLGO) AND [1 SHL DFDTD] OR [1 SEPT ROUTINE CHECKS FOR ILLEGAL BDOS CALLS & ; PRINTS MESSAGE IF ILLEGAL. ALSO IMPLEMENTS CDOS CLOCK/CALENDAR ; SYSTEM CALLS F DPB PTR ADD HL,DE LD E,(HL) ;FETCH DPB PTR INC HL LD D,(HL) RET ;*************************************** ; ;C I/O DRIVERS ;***************************************** ; ; CLOCK ROUTINES ; ;***************************************** ;TA INTO MEMORY SUBR ; ENTRY- A= DATA ; HL= PTR TO MEMORY ; EXIT - A= DATA ; HL= HL + 2 ; ;******************************HL DFHARD] CALL Z,TR3740 LOGDON: LD HL,(DTPTR) ;ELSE RETURN PTR TO TABLE XOR A RET ; ; ASSUME 3740 FORMAT DISKETTE FOR ASMB. ; ;*************************************************************************** INTCPT: LD A,C ;CHECK CALL VALIDITY HOME DRIVE - TREAT AS SEEK TRK 0 ; ;*************************************** HOME: LD C,0 ;*************************** ; RETURN CALENDAR FUNCTION 90H ; EXIT - A= DAY ; B= MONTH ; C= YEAR ; L= DAY OF WEEK ; ;************************************* PRHEX: CALL PRDIG ;DO HIGH NIBBLE PRDIG: RLCA ;POSITION NIBBLE INTO LOW 4 BITS RLCA RLCA RLCA PUSH AF  ; LG3740: LD A,(BTDRV) ;IF HARD DISK THEN IF HARDBT CP 4 JR NC,LG371 ELSE CP 2 JR C,LG371 ENDIF CALL CP 41 ;IF <= 40 THEN OK BDOSV EQU $ + 1 JP C,BDOS + 11H ;THIS ADDR MODIFIED BY WARM BOOT RTN ; ; THE FOLLOWING CONDI** ; ; SET TRACK # ; ENTRY- C= TRACK # ; EXIT - A= C= TRACK # ; ;***************************** SETTRK: LD A,C LD (BTTRK 7FH ;MASK OUT BIT 7 LOG4: LD (LOGIOPB + PBDRV),A FDLOGR: CALL HDEXECL ;LOG ON DRIVE & RETURN IDENTITY SECTOR DATA JR ),A RET ;***************************** ; ; SET SECTOR ; ENTRY- C= SECTOR # ; EXIT - A= C= SECTOR # ; ;************* ;********************************* ; ; SET NO SECTOR TRANSLATION ; EXIT - HL, DE= ? ; ;******************************0 ( ) *!+",#-$.%/ &0 '************ CLKCAL: LD HL,CALENT ;ROM ENTRY POINT CLK1: LD BC,CLKBFR ;READ CLOCK JR CLK2 ;************************URN -1 RET ENDIF ;**************************** ; ; GET MONITOR PROM SUBR ; EXIT - A= ? ; ;**********************,EXROMR ;PUT RETURN ADDR ON STACK EX (SP),HL JP (HL) ;EXECUTE ROM EXROMR: PUSH AF ;SAVE RETURN VALUE LD A,(ROMSAV) ;RP BC ;IF CONTINUE THEN RESTORE & RETURN POP HL POP AF EI ;RE-ENABLE INTERRUPTS RET ;***************************************** ; ; RETURN TIME FUNCTION 92H ; EXIT - A= SECONDS ; B= MINITS ; C= HOURS ; ;************************************ GETMON: LD A,XMONROM OUT (ROMSEL),A RET ;***************************************************** ; ; MESSAGE ESELECT ORIGINAL ROM OUT ROMSEL,A POP AF ;RETURN VALUE RET ENDIF SUBTTL CHAR I/O ROUTINES ;*************************** ; ; UNSUPPORTED INTERRUPT ; ;************************************** ILLINT: PUSH AF ;SAVE ALL 8080 REGS PUS ;********************************** ; ; READER DRIVER - DUMMY ; EXIT - A= CTRL-Z ; ;**********************************EDITOR ; ENTRY- HL= TEXT PTR (BIT 7= 1: TERMINATOR) ; EXIT - REGS= ? ; ;************************************************************* ; ; CONSOLE INPUT ; EXIT - A= CHAR ; ;************************** CI: IF USEMON CALL GETMON ;SWITCH IN MONH HL PUSH BC LD HL,ILLIM ;NOTIFY USER OF INT JR IQCONT SUBTTL DATA CONSTANTS ;------------------------------------- READER: LD A,CTRLZ ;FAKE EOF RET ;************************************** ; ; PUNCH DRIVER ; ENTRY- C= CHAR TO OUTPUME FUNCTION 93H ; ENTRY- DE= PTR TO 13 BYTE BUFFER FOR CLOCK DATA ; ;********************************************************* EDITOR: LD C,(HL) ;MESSAGE EDIT LOOP PUSH HL ;SAVE PTR RES 7,C ;CLEAR BIT 7 FOR OUTPUT CALL COC POP HL BIT 7,(ITOR ROM JP 0F803H ;USE MONITOR ELSE CALL CNSCK ;IF NO CHAR RDY THEN WAIT JR Z,CI IN A,NTD ;ELSE RETURN CHAR RE----------- ; ; MODE 2 INTERRUPT VECTOR TABLE ; ;------------------------------------------------ IF $ AND 0FFH ;START ON T ; ;************************************** PUNCH: RET ;************************************ ; ; PRINTER DRIVER ; ENT**** CLKRDC: LD C,E ;SET UP PARAMETERS LD B,D LD HL,RDBENT JR CLK2 ;*********************************************HL) ;IF BIT 7 SET THEN RETURN RET NZ INC HL ;ELSE PRINT NEXT CHAR JR EDITOR IF INTRPTS SUBTTL INTERRUPTS ;----EVEN PAGE BOUNDARY DS 100H - ($ AND 0FFH) ENDIF INTABL: REPT 7 ;1ST 7 ARE UNSUPPORTED DW ILLINT ENDM DW ITRAP ;RY- C= CHAR TO OUTPUT ; ;************************************ LO: IF USEMON CALL GETMON JP 0F80FH ELSE CALL LIS************* ; ; CLOCK SET FUNCTION 91H ; ENTRY- DE= CLOCK IMAGE BUFR PTR (13 BYTES LONG) ; ;*****************************---------------------------------- ; ; USER INTERRUPT ; ;-------------------------------------- ITRAP: PUSH AF ;SAVE USER READY ; ;**************************************** CNSCK: IF USEMON CALL GETMON JP 0F812H ELSE IN A,NTS ;IF DINT 8 IS USER INTERRUPT ENDIF ;-------------------------------------- ; ; 3740 SECTOR TRANSLATION TABLE ; **** CP/M STST ;IF BUSY THEN WAIT JR Z,LO LD A,C ;OUTPUT CHAR SET 7,A OUT CENTOUT,A RES 7,A ;OUTPUT LOW TRUE STROBE OUT ***************************** CLKSET: LD C,E ;SET UP PARAMETERS LD B,D LD HL,SETENT CLK2: LD A,CALROM ;***********D REGISTERS PUSH HL PUSH BC LD HL,ITMSG ;NOTIFY USER IQCONT: CALL EDITOR LD HL,IQMSG ;QUERY USER CALL EDITOR CAATA NOT READY THEN RETURN 0 AND 1 SHL NTRDY TTOST1: RET Z LD A,-1 ;ELSE RETURN -1 RET ENDIF ;******************INGLE DENSITY **** ; ;-------------------------------------- SDTRAN: DB 1,7,13,19,25,5,11,17,23,3,9,15 DB 21,2,8,14,20,26,6CENTOUT,A SET 7,A OUT CENTOUT,A RET ENDIF ;***************************************** ; ; RETURN LIST DEVICE STA*********************************************** ; ; EXECUTE ROM ROUTINE ; ENTRY- HL= ENTRY ADDRESS ; A= ROM # ; EXIT - ENTLL CI CP 3 ;IF CTRL-C THEN WARM BOOT JP Z,PAGE0 AND 5FH ;IGNORE CASE CP 'Y' ;IF YES THEN ABORT JP Z,PAGE0 C********************* ; ; CONSOLE OUTPUT ; ENTRY- C= CHAR TO OUTPUT ; ;*************************************** COC: IF,12,18,24,4,10 DB 16,22 ;------------------------------------------- ; ; DEFAULT FLOPPY DISK PARAMETER BLOCK ; IBM 374TUS ; EXIT - A= 0: BUSY, FFH:READY ; ;***************************************** LISTST: IF USEMON CALL GETMON JP 0F8RY ROM RE-SELECTED ; ;********************************************************** EXROM: PUSH AF ;SAVE NEW ROM IN A,ROMP 'I' JR NZ,ITRAP1 POP BC ;ELSE RESTORE & GOTO MONITOR TRAP POP HL POP AF JP 0038H ITRAP1: CP 'M' ;IF MONITOR T USEMON CALL GETMON JP 0F809H ELSE CALL NTOST ;IF BUSY THEN WAIT OR A JR Z,COC LD A,C OUT NTD,A RET 0 SINGLE DENSITY FORMAT ; ;------------------------------------------- SDPBK: DW 26 ;SECTORS PER TRACK DB 3 ;BLOCK SHIFT 27H ELSE IN A,CENTS ;IF BUSY THEN RETURN 0 CPL ;INVERT THE SENSE AND 1 SHL CENTBSY RET Z LD A,0FFH ;ELSE RETSEL ;SAVE CURRENT ROM LD (ROMSAV),A POP AF ;SELECT NEW ROM AND ROMSMK OUT ROMSEL,A PUSH HL ;SAVE ENTRY LD HLHEN GOTO MONITOR TRAP JR NZ,ITRAPR CALL GETMON ;INSURE MONITOR THERE POP BC POP HL POP AF JP 0F824H ITRAPR: PO;*********************************************** ; ; RETURN CONSOLE OUTPUT READY STATUS ; EXIT - A= 0: BUSY, FFH: READY ; ;******* CLKTIM: LD HL,TIMENT JR CLK1 ;************************************************************ ; ; READ CLOCK TI*********************************************** NTOST: IN A,NTS CPL ;REVERSE SENSE AND 1 SHL NTBSY JR TTOST1 ENDIF T ENDIF ;**************************************** ; ; RETURN CONSOLE STATUS ; EXIT - A= 0: NOT READY ; FFH: CHA0 ( ) *!+",#-$.%/ &0 'FACTOR DB 7 ;BLOCK MASK DB 0 ;NULL MASK DW 242 ;DISK SIZE -1 DW 63 ;DIRECTORY MAX DB 11000000B ;ALLOC 0 DB 0 ;A 1 ;EXM- EXTENT MASK ; DSM < 256 : 1K= 0, 2K= 1, 4K= 3, 8K= 7, 16K= 15 ; DSM > 255 : 2K= 0, 4K= 1, 8K= 3, 16K= 7 DS 2 ---------- MSGLE: DM CR,LF,'LOAD ERROR' DSKEM: DB CR,LF,'Disk Error Status: ' DSKEB: DB '00H',CR,LF DM 'Abort, Ignore, RetråLLOC 1 DW 16 ;CHECK SIZE DW 2 ;TRACK OFFSET ;------------------------------------------- ; ; DEFAULT HARD DISK PARA;DSM- DRIVE STORAGE SIZE (IN CLUSTERS) ; INT(((#_TRACKS - OFF) * SPT * BYTES PER SECTOR) / CLUSTER SIZE) -1 DS 2 ;DRM- DIREy, (BDOS) - ' IF INTCPTS ISCMSG: DM CR,LF,'ILL. SYS. CALL',CR,LF ENDIF IF INTRPTS ITMSG DM CR,LF,'User' ILLIM DM å-------------------------- CLKBFR: DS 13 ROMSAV DS 1 ;ROM SWAP SAVE OF ORIGINAL ROM ENDIF ;----------------------CTORY SIZE -1 DS 2 ;AL0,1- DIRECTORY ALLOCATION ; 1 MSB PER DIRECTORY CLUSTER ALLOCATED DS 2 ;CKS- # DIRECTORY SECTORS CCR,LF,'Unsupported' IQMSG DM ' Interrupt: Abort? (Y/N) - ' ENDIF ;---------------------------- ; ; ID SECTOR LABEL å-------------------------- ; ; DRIVE ALLOCATION AREAS DECLARED ; ;------------------------------------------------ ALLDALHIFT FACTOR (BSH) DB 31 ;BLOCK MASK (BLM) DB 1 ;NULL MASK (EXM) DW 1015 ;DISK SIZE (CLUSTERS -1) (DSM) DW 1152 /HECKED ; (DRM +1) / 4 DS 2 ;OFF- # RESERVED TRACKS (USUALLY 2) DPBSZ EQU $ - D0DPB ELSE DS DPBSZ ENDIF ENDM ; ;---------------------------- JADEID: DB 'Jade DD ' IDSZE: EQU $-JADEID ;-------------------------------------- ; ; å: MACRO #D IF (HARDBT AND (DD < 5)) OR (NOT HARDBT AND (DD > 2)) D#D(DD)ALL: DS 128 ;ALLOCATION FOR DRIVE #D(DD) ELSE  2 ;DIRECTORY MAX (DRM) DB 0FFH ;ALLOCATION 0 (AL0) DB 10000000B ;ALLOCATION 1 (AL1) DW 0 ;CHECK SIZE (CKS) DW DD DL 1 REPT NDRVS ALLDPB 0123456789ABCDEF DD DL DD + 1 ENDM IF ($ > 0F800H) OR ($ < 8000H) CONMSG BIOS TOO BåD#D(DD)ALL: DS ALLSIZ ;DISK CLUSTER ALLOCATION BIT MAP FOR DRIVE #D(DD) D#D(DD)CHK DS CHKSIZ ;DIRECTORY CHECKSUMS STORAGE (1 BY 2 ;TRACK OFFSET (OFF) ;--------------------------------- ; ; HARD DISK DATA ; ;--------------------------------- IIG ENDIF END ARAMETER HEADER FOR DRIVE #D(DD) DW 0 ;SECTOR TRAN TBL (OR 0 IF NO XLATE) DW 0 ;SCRATCH AREA DW 0 ;" DW 0 ;" DW DIåTE PER DIR SECTOR) ENDIF ENDM DD DL 1 REPT NDRVS ALLDAL 0123456789ABCDEF DD DL DD + 1 ENDM ;-----------------OPB: REPT 16 ;;HARD DISK IOPB DB 0 ENDM IOPBADR: DB LOW IOPB ;HARD DISK IOPB POINTER TABLE DB HIOPBL DB HIGH IOPB åRBF ;DIRECTORY BUFFER PTR DW D#D(DD)DPB ;DRIVE PARAMETER BLK PTR IF (HARDBT AND (DD < 5)) OR (NOT HARDBT AND (DD > 2)) å--------------------- ; ; RESERVE DRIVE PARAMETER BLOCKS ; ;-------------------------------------- ALLDPB: MACRO #D D#D( DB HIOPBH DB 0 DB HIOPBX LOGIOPB: DB LOGCMD ;READ COMMAND DB 4 ;DRIVE DW 0 ;TRACK DW 0 ;SECTOR DB 0 ;FLAå DW 0 ;NO CHECKS ON HARD DISK ELSE DW D#D(DD)CHK ;DRIVE DISK CHECKSUMS ARRAY PTR ENDIF DW D#D(DD)ALL ;DRIVE CLUSTåDD)DPB: ;ALLOCATION FOR DRIVE #D(DD) IF DD = 1 DS 2 ;SPT- SECTORS/TRACK DS 1 ;BSH- BLOCK SHIFT FACTOR DETERMINED BY CGS (LOGON) DW DEFBFR ;DMA ADDR DB 0 ;BANK ADDR DS (LOGIOPB + 16) - $ LIOPBAD: DB LOW LOGIOPB ;LOGON DISK IOPB POINTåER ALLOCATION BIT MAP PTR ENDM DD DL 1 REPT NDRVS ALLDPH 0123456789ABCDEF DD DL DD + 1 ENDM BIOSND EQU $ SUBTTLåLUSTER SIZE ; 1K= 3, 2K= 4, 4K= 5, 8K= 6, 16K= 7 DS 1 ;BLM- BLOCK MASK ; 1K = 7, 2K= 15, 4K= 31, 8K= 63, 16K= 127 DSER TABLE DB HIOPBL DB HIGH LOGIOPB DB HIOPBH DB 0 DB HIOPBX ;------------------ ; ; MESSAGES ; ;--------å DATA AREA ;------------------------------------------------ ; ; THE REMAINING AREA DOES NOT HAVE TO ; BELONG ON THE DISK. METER BLOCK ; ;------------------------------------------- HDPBK: DW 128 ;SECTORS PER TRACK (LOGICAL) (SPT) DB 5 ;BLOCK S ; ;------------------------------------------------ IF INTCPTS ;---------------------------- ; ; CLOCK BUFFER ; ;--DRIVE PARAMETER HEADER AREA ; 1 PER DRIVE ; ;-------------------------------------- ALLDPH: MACRO #D D#D(DD)DPH: ;DRIVE P0 ( ) *!+",#-$.%/ &0 ' TITLE CUSTOMIZED BIOS FOR M5B LIST NOCOND ;************************************************************* ; ; (c) 1981  STATUS JP CI ;CONSOLE INPUT JP COC ;CONSOLE OUTPUT JP LO ;PRINTER OUTPUT JP PUNCH JP READER JP HOME ;HOME SELEC************************************************************** ; This BIOS contains disk subroutines which are compatable DIF IF NDRVS GT 2 D2DPB: DS DPBSZ ENDIF IF NDRVS GT 3 D3DPB: DS DPBSZ ENDIF ;---------------------------------- GRH Electronics, CUPERTINO, CA ; ;************************************************************* ; ; REVISIONS: ; ; 2.2.0TED DRIVE JP SELDSK ;SELECT DISK DRIVE JP SETTRK ;SET TRACK # JP SETSEC ;SET SECTOR # JP SETDMA ;SET TRANSFER ADDR with the ; DCM-2.2 module and the Jade Double D disk controller. This combination ; will interface up to four 8" drives in sin; ; DISK CONTROLLER COMMAND BLOCK ; ;---------------------------------- BTCMD: DB 0 ;DCM COMMAND BTDRV: DB 0 ;DRIVE # BX DIRECTORY SIZE. ; ;************************************************************************* ALLSIZ EQU 33 ;ALLOCATION BIT  JP DISKRD ;PERFORM DISK READ JP DISKWR ;PERFORM DISK WRITE JP LISTST ;RETURN LIST STATUS JP SECTRN ;TRANSLATE SECTOR gle and double density. The ; console, reader/punch, and printer interfaces should be altered for ; specific end user systems TTRK: DB 0 ;TRACK # BTSEC: DB 0 ;SECTOR # BTSP0: DB 0 ;SPARE BTSP1: DB 0 ;" BTMOD: DB 00000000B ;MODE CONTROLS BTSTS: DMAP SIZE (1 BYTE PER 8 CLUSTERS) CHKSIZ EQU 32 ;DIRECTORY CHECKSUMS ARRAY SIZE (1 BYTE PER DIR. SECTOR) ;******************* ADDED NAKED TERMINAL DRIVERS & IOBYTE IN ; ANTICIPATION OF THE MONITOR. ALSO, ALL REFERENCES ; REQUIRING THE I/O PROM JP FORMAT ;FORMAT A TRACK ;-------------------------------------- ; ; RESERVE DRIVE PARAMETER BLOCKS ; ;----------as needed. ;************************************************************************* SUBTTL SYSTEM DECLARATIONS FALSE EQUB 0 ;COMMAND STATUS BTLAD: DW 0 ;LOAD ADDR BTLNG: DW 0 ;LOAD LENGTH ;-------------------------------------- ; ; OTHE********* ; ; ADDRESSES ; ;**************************** CALROM EQU 7 ;CALENDAR ROM SELECT # RDBENT EQU 0F800H ;READ CLOCS TO BOOT HAS BEEN REMOVED. ; ; 2.2.5 - RECONFIGURE FOR 62K SYSTEM. ; ; 2.2.6 - 20 FEB 83 ; DOUBLE D REV C UPGRADE. CHANGE ---------------------------- D0DPB: DS 2 ;SPT- SECTORS/TRACK DS 1 ;BSH- BLOCK SHIFT FACTOR DETERMINED BY CLUSTER SIZE R BIOS VARS NEEDING INIT ; ;-------------------------------------- BTDMA: DW 0 ;SYSTEM TRANSFER ADDR DTPTR: DW 0 ;DRIVE TAK BUFFER ENTRY SETENT EQU RDBENT + 3 ;SET CLOCK ENTRY CALENT EQU RDBENT + 6 ;RETURN CALENDAR ENTRY TIMENT EQU RDBENT + 9 ;RETBOARD STATUS PORT BITS. ; ; 2.2.7 - 8 MAR 83 GRH ; ADDED CLOCK/CALENDAR DRIVER, SYSTEM CALL INTERCEPT, ; ILLEGAL SYSTEM CALL ; 1K= 3, 2K= 4, 4K= 5, 8K= 6, 16K= 7 DS 1 ;BLM- BLOCK MASK ; 1K = 7, 2K= 15, 4K= 31, 8K= 63, 16K= 127 DS 1 ;EXM- EX--------------------------------- NKSYS: EQU 62 ;SYSTEM SIZE IN K BYTES KBYTE: EQU 1024 CPMSZ: EQU KBYTE*NKSYS CPMBS: EQU CBLE PTR LOGRQ: DB 0 ;LOG ON REQUEST REG. ;-------------------------------------------------------------------------- ; URN TIME ENTRY ;**************************** ; ; ASCII CHARS ; ;**************************** LF: EQU 0AH CR: EQU 0DH  MESSAGE, CHANGED BIOS SIZE TO END ; OF INITIALIZED DATA AREA. RESTRUCTURE MODULES. ; ; 2.28 - 22 APR 83 GRH ; CHANGED DEFTENT MASK ; DSM < 256 : 1K= 0, 2K= 1, 4K= 3, 8K= 7, 16K= 15 ; DSM > 255 : 2K= 0, 4K= 1, 8K= 3, 16K= 7 DS 2 ;DSM- DRIPMSZ - (20 * KBYTE) ; CP/M BIAS VALUE CCP: EQU CPMBS+3400H ;ADDR OF CCP BDOS: EQU CPMBS+3C00H ;ADDRESS OF BDOS BIOS: EQU CPMB; DIRECTORY SECTOR BUFFER STARTS HERE AFTER CRUNCHING COLD START ; CODE. THIS BUFFER IS USED BY THE CP/M DIRECTORY CHECK ROUTI CTRLZ: EQU 1AH ; ; INCLUDE THE GLOBAL DEFINITIONS: SYSPARAM.INC, DDSYSTEM.INC ; IF NOT LSTINC LIST OFF ENDIF *INCLUINITIONS TO ALLOW BIG DIRECTORIES. ; DISALLOWED DRIVES C & D. ; ; 2.29 - 3 SEP 83 GRH ; Changed Rev # for blocked DCM. EnaVE STORAGE SIZE (IN CLUSTERS) ; INT(((#_TRACKS - OFF) * SPT * BYTES PER SECTOR) / CLUSTER SIZE) -1 DS 2 ;DRM- DIRECTORY SS+4A00H ;ADDRESS OF BDOS BIOSR: EQU 1000H-BIOS ; PAGE0: EQU 0 ;START OF CP/M RAM IOBYTE: EQU PAGE0 + 3 ;IOBYTE ADDR DEFDRVNES THAT ; CHECK FOR DISK CHANGE. ; ;-------------------------------------------------------------------------- DIRBF: EQU DE SYSPARAM.INC *INCLUDE DDSYSTEM.INC LIST ON SUBTTL BIOS CODE ORG BIOS ;---------------------------- ; ; BIOS JUMP bles IBM system 34 ; 256 bytes per sector disks to be read. ; ; 1.10 - 23 SEP 83 GRH ; Move clock-calendar routines to ROMIZE -1 DS 2 ;AL0,1- DIRECTORY ALLOCATION ; 1 MSB PER DIRECTORY CLUSTER ALLOCATED DS 2 ;CKS- # DIRECTORY SECTORS CHEC: EQU PAGE0 + 4 ;DEFAULT DRIVE PARAM ADDR TPA: EQU 100H ; ; OTHER DECLARATIONS ; DEFIOB: EQU 0 ;INITIAL IOBYTE VALUE DF$ ;BUFFER BEGINNING ;************************************************************************** ; ; THESE BOOT PARAMS MUVECTOR TABLE ; ;---------------------------- JP INIT ;COLD START ENTRY JP WARM ;RELOAD CCP/BDOS JP CNSCK ;GET CONSOLE. Add Interrupt handler ; (Mode 2). Change Revision display of sign-on (separate CBIOS rev). VERSN EQU '10' ; ;***********KED ; (DRM +1) / 4 DS 2 ;OFF- # RESERVED TRACKS (USUALLY 2) DPBSZ EQU $ - D0DPB IF NDRVS GT 1 D1DPB: DS DPBSZ ENDRV: EQU 0 ;INITIAL DEFAULT DRIVE SECSZ: EQU 128 FMTSZ: EQU 100H ;FORMAT BUFFER SIZE NDRVS: EQU 2 ;********************* - RELEASE ; ; 2.2.3 - SWAPPED DCM & BIOS SECTORS ON DISK, ALLOWING A ; LARGER BIOS ALLOCATION ON THE DISK. ; ; 2.2.4 -**************************************************** ; ; THE FOLLOWING 2 PARAMETERS MUST REFLECT THE MAX DISK SIZE & ; THE MA 0 TRUE EQU 1 LSTINC EQU FALSE ;-------------------------------------- ; ; DISK OPERATING SYSTEM ADDRESSES ; ;-----0 ( ) *!+",#-$.%/ &0 'ST RESIDE AS DEFINED RIGHT BEFORE THE COLD ; INIT ROUTINE START. THESE 2 WORDS ARE REFERENCED BY THE BOOT CODE IN ; ORDER TOL,DE EX DE,HL LD HL,(BTDMA) LDIR LD A,DDWRS ;ISSUE WRITE SECTOR CMD CALL DSKEX JR NZ,DSKER ;****************--------------------------- ; ; WARM REBOOT ENTRY LOADS CCP,BDOS FROM DISK & ; SETS UP VARIABLES ; ;----------------------- ; ; DOUBLE D EXECUTION SUBR ; ENTRY- A= COMMAND ; DD WINDOW 'ON' ; EXIT - A= DISK CONTROLLER STATUS ; Z= OK, NZ= ERRO FIND THE LOAD ADDRESS FOR THE BIOS & IT'S LENGTH. ; ;************************************************************************************************* ; ; DISK READ/WRITE/FORMAT EXITS ; ;***************************************** ; ; NORMAL EXIT ;----------------------------------- WARM: LD A,HIGH INTABL ;INIT INTERRUPT VECTORS LD I,A IM 2 ;USE MODE 2 IN A,INTMR ; BC,DE,HL= ? ; ;******************************* DSKEX: EI ;ALLOW INTERRUPTS LD (BTCMD),A ;SAVE CMD LD BC,7 ;M VECTOR LD (BDOS + 7),HL IN A,(CLKDAT) ;IF CLOCK NOT PRESENT THEN TURN OFF CLOCK DRIVE AND 11000000B ;TEST UNUSED BUT DR EXIT - A= 0 ; ;***************************************** DSKOK: LD A,DDOUT ;SWITCH DD OUT OF SYSTEM OUT DDPORT,A XOR A SK AND 7FH ;ENABLE INT 7 OUT INTMSK,A IN A,MONSTS ;ENABLE MONITOR BOARD INTERRUPTS OR MONIE OUT MONSTS,A EI LOVE COMMAND BLOCK INTO WINDOW LD DE,DDCMD LD HL,(DADDR) ADD HL,DE EX DE,HL LD HL,BTCMD LDIR LD A,DDEXC ;LOAD DDIVEN BITS (1S IF NOT THERE) LD A,38H ;COND. JR (ON) JR Z,CLKON LD A,18H ;UNCOND. JR (OFF) (CAUSES JUMP TO ILLEGAL) CLKO--------------------------------------------------- ; ; INIT - COLD START ENTRY FROM BOOT MUST SET ALL BIOS PARAMS ; ;-- ;RETURN 0 RET ;********************************** ; ; DISK ERROR EXIT ; EXIT - A= FFH ; ;**************************D A,XMONROM ;SELECT MONITOR ROM OUT ROMSEL,A LD SP,0080H LD A,0 ;SET DRIVE 0 LD (BTDRV),A LD BC,CCP ;SET LOAD  INTERRUPT OUT DDPORT,A EX DE,HL ;SET UP TO MOVE DOWN REMAINDER OF CMD BLK (STATUS) LD BC,5 DSKWT: IN A,DDPORT ;IF N: LD (INHCLK),A LD A,(DEFDRV) ;PASS IN DEFAULT DISK TO CCP LD C,A JP CCP SUBTTL DISK ROUTINES ;*******************------------------------------------------------------------------ INIT: LD A,XMONROM ;MAKE SURE BOOT ROM IS DISABLED OUT ROM******** DSKER: LD A,DDOUT ;SWITCH DD OUT OF SYSTEM OUT DDPORT,A LD A,0FFH ;RETURN -1 RET ;***********************NOT DONE THEN WAIT AND DDSHLT JR NZ,DSKWT LD A,DDMRQ ;SWITCH DD INTO SYSTEM OUT DDPORT,A LDIR LD A,(BTSTS) ;RET******** ; ; READ A DISK SECTOR ; ;*************************** DISKRD: LD A,DDMRQ ;SWITCH DD INTO SYSTEM OUT DDPORT,A SEL,A LD A,DDOUT ;REMOVE DD FROM SYSTEM OUT DDPORT,A LD SP,0080H LD A,DEFIOB ;INIT I/O BYTE LD (IOBYTE),A L***************************************************** ; ; FORMAT A DISK TRACK ; ENTRY- (SETDMA) POINTS TO FIRMWARE PGM TO LOAEAD: CALL DISKRD AND A ;IF ERROR THEN EXIT JR NZ,WEROR LD A,(BTSEC) ;IF LAST SECTOR THEN DONE CP 45 JR Z,WZRPG URN STATUS OR A RET ;************************************************* ; ; SELECT DRIVE ; LOG-ON - SET DISK PARAMET LD A,DDRDS ;ISSUE READ SECTOR COMMAND CALL DSKEX ;PERFORM OPERATION JR NZ,DSKER ;IF ERR THEN EXIT LD HL,(BTDMA) ;MD A,DFDRV ;INIT DEFAULT DRIVE LD (DEFDRV),A ; ; SEND SYSTEM SIGN-ON ; CLOGO: LD HL,MSGSO CALL EDITOR LD HL,(BIOS+D INTO DISK CONTROLLER ; FOR EXECUTION. ; ;**************************************************************************** FOINC A ;NEXT SECTOR LD (BTSEC),A LD DE,SECSZ ;DMA := DMA + SECTOR SIZE LD HL,(BTDMA) ADD HL,DE LD (BTDMA),HL JR WREAER BLOCK ; ENTRY- C= DRIVE # ; E= 0 IF NEVER LOGGED BEFORE ; EXIT - HL= PTR TO DPT OR 0 FOR ERROR ; ;*********************OVE SECTOR TO USER MEMORY EX DE,HL LD BC,DDBUF LD HL,(DADDR) ;SET SOURCE ADD HL,BC LD BC,SECSZ ;COUNT LDIR JR DSKO4) ;MODIFY COLD START TO WARM START LD (BIOS+1),HL JP WARM ; ; SIGN-ON MESSAGE ; MSGSO: DB CR,LF DB CPMSZ / (KBYTE *RMAT: LD A,DDMRQ ;SWITCH DD INTO SYSTEM OUT DDPORT,A LD A,DDMB1 ;SELECT BANK 1 OUT DDPORT,A LD BC,FMTSZ ;MOVE FORMD ; WARM BOOT ERROR, OUTPUT MSG & HALT WEROR: LD HL,MSGLE ;OUTPUT ERROR MESSAGE CALL EDITOR HALT ; BOOT OK, INI**************************** SELDSK: LD HL,0 ;ASSUME ERROR LD A,C ;SET DRIVE # LD (BTDRV),A CP NDRVS ;RETURN IF ILLEK ;**************************** ; ; WRITE A DISK SECTOR ; ;**************************** DISKWR: LD A,DDMRQ ;SWITCH  10) + '0' DB (CPMSZ MOD (KBYTE * 10)) / KBYTE + '0' DB 'K CP/M-80 Vers 2.2',CR,LF DB 'M5b CBIOS Vers 1.' DB HIGH VEAT DATA INTO WINDOW LD HL,(DADDR) LD DE,DDFBF ADD HL,DE EX DE,HL LD HL,(BTDMA) LDIR LD A,DDMRQ ;RESELECT BANK 0T PAGE 0 WZRPG: LD A,0C3H ;INITIALIZE BIOS WARM START VECTOR LD HL,BIOS + 3 LD (PAGE0),A LD (PAGE0 + 1),HL LD HL,BGAL DRIVE # RET NC LD A,E ;SET LOG REQUEST VECTOR LD (LOGRQ),A RETDSK: LD A,(BTDRV) ;COMPUTE TABLE PTR LD L,A LDDD INTO SYSTEM OUT DDPORT,A LD BC,SECSZ ;MOVE WRITE DATA INTO DISK CONTROLLER WINDOW LD HL,(DADDR) LD DE,DDBUF ADD HRSN , LOW VERSN,CR,LF,0 DS DIRBF+SECSZ-$ ;FILL OUT DIRECTORY BUFFER TO 1 SECTOR SIZE ;------------------------------- OUT DDPORT,A LD A,DDFMT ;ISSUE FORMAT COMMAND CALL DSKEX JR Z,DSKOK JR DSKER ;*******************************DOS + 6 ;INIT BDOS CALL VECTOR LD (PAGE0 + 5),A LD (PAGE0 + 6),HL LD HL,0080H ;SET DEFAULT SECTOR BUFFER LD (BTDMA),HL** BIOSSZ: DW BIOSND - BIOS ;BIOS MODULE SIZE IN BYTES BIOSST: DW BIOS ;BIOS MODULE LOAD ADDR FOR SBD ;----------------- LD HL,(BDOS + 7) ;GET BDOS VECTOR LD (BDOSV),HL ;PUT IN INTERCEPT CODE LD HL,INTCPT ;NOW PUT INTERCEPT VECTOR INTO BDOSADDR CALL SETDMA LD C,2 ;START WITH SECTOR #2 CALL SETSEC LD C,1 ;TRACK 1 CALL SETTRK ; READ CCP/BDOS WR0 ( ) *!+",#-$.%/ &0 ' H,0 ADD HL,HL ;DISK # * 16 ADD HL,HL ADD HL,HL ADD HL,HL LD DE,D0DPH ADD HL,DE LD A,(LOGRQ) ;RETURN TABLE PTR CLKSET ;IF SET FUNCTION THEN SET CLOCK JR Z,CLKTIM ;IF TIME THEN GET IT CP 93H JR Z,CLKRDC ;IF READ CLOCK THEN GET IT --------------- TR3740: LD DE,SDTRAN LD HL,(DTPTR) LD (HL),E INC HL LD (HL),D RET ;-----------------------------; ;************************************************************ CLKRDC: LD C,E ;SET UP PARAMETERS LD B,D LD HL,RDBENT IF NOT 1ST LOG-ON AND 1 JP NZ,DSKOK ; READ IDENTITY SECTOR LD (DTPTR),HL ;SAVE DRIVE TABLE PTR LD A,DDMRQ ;SWIT ; ; ILLEGAL SYSTEM CALL ; ILLEGC: LD HL,ISCMSG ;OUTPUT WARNING CALL EDITOR LD L,A ;BC = HL = A = 0 LD H,A PUSH HL --- ; ; SET NO SECTOR TRANSLATION ; ;-------------------------------- TRNONE: XOR A LD HL,(DTPTR) LD (HL),A INC HL  LD A,CALROM JR EXROM ;********************************************************** ; ; CLOCK SET FUNCTION 91H ; ENTRY- EN NO TRANSLATION OR E JR Z,NOTRAN EX DE,HL ADD HL,BC LD L,(HL) LD H,0 RET ; NOTRAN: LD HL,1 ADD HL,BC R POP BC RET ;***************************************** ; ; CDOS RETURN VERSION SYSTEM CALL ; MAKES CLOCK/CALENDAR WO LD (HL),A RET ;************************************** ; ; GET DRIVE PARAMETER BLOCK ADDR ; ;*********************DE= CLOCK IMAGE BUFR PTR (13 BYTES LONG) ; ;********************************************************** CLKSET: LD C,E ;SETET ;*************************************************************************** ; ; SYSTEM CALL INTERCEPT ROUTINE CHECKS  JP DSKER ; CHECK FOR JADE ID LOGCK: LD DE,DDBUF LD HL,(DADDR) ADD HL,DE LD DE,JADEID LD B,IDSZE LOGID: LD A,(RK. ; EXIT - B= 1 ; ;***************************************** RETVER: LD B,1 RET SUBTTL MISC I/O DRIVERS ;*************************** DPBAD: LD HL,(DTPTR) LD DE,10 ADD HL,DE LD E,(HL) INC HL LD D,(HL) RET ;******************** UP PARAMETERS LD B,D LD HL,SETENT LD A,CALROM ;********************************************************** ; ; EXECFOR ILLEGAL BDOS CALLS & ; PRINTS MESSAGE IF ILLEGAL. ALSO IMPLEMENTS CDOS CLOCK/CALENDAR ; SYSTEM CALLS FOR ASMB. ; ;****DE) ;IF NO MATCH THEN ASSUME 3740 FORMAT CP (HL) JR NZ,LG3740 INC HL INC DE DJNZ LOGID ; DISKETTE CONTAINS ID ******************************* ; ; CLOCK ROUTINES ; ;***************************************** ; ; RETURN CALENDAR FUNCTIUTE ROM ROUTINE ; ENTRY- HL= ENTRY ADDRESS ; A= ROM # ; EXIT - ENTRY ROM RE-SELECTED ; ;********************************************************************************************************* INTCPT: LD A,C ;CHECK CALL VALIDITY CP 41 ;IF <= 40 CALL TRNONE ;ASSUME DDENS CALL DPBAD ;GET ADDR OF DPB & MOVE DOWN DISK INFO TO IT LD BC,DDDPB LD HL,(DADDR) ADD HON 90H ; EXIT - A= DAY ; B= MONTH ; C= YEAR ; L= DAY OF WEEK ; ;***************************************** CLKCAL: *************************** ; ; SET TRACK # ; ENTRY- C= TRACK # ; ;***************************** SETTRK: LD A,C LD (BTTR************************ EXROM: PUSH AF ;SAVE NEW ROM IN A,ROMSEL ;SAVE CURRENT ROM LD (ROMSAV),A POP AF ;SELECT  THEN OK BDOSV EQU $ + 1 JP C,BDOS + 11H ;THIS ADDR MODIFIED BY WARM BOOT RTN ; ; THE FOLLOWING CONDITIONAL JUMP IS MODIL,BC LD BC,DPBSZ LDIR LD DE,DDDDF ;IF DENSITY FLAG = 0 THEN USE 3740 LD HL,(DADDR) ADD HL,DE LD A,(HL) AND 4 CLD BC,CLKBFR ;READ CLOCK LD HL,CALENT ;ROM ENTRY POINT LD A,CALROM ;CALENDAR OFFSET JR EXROM ;***********************K),A RET ;***************************** ; ; SET SECTOR ; ENTRY- C= SECTOR # ; ;***************************** SETSECNEW ROM AND ROMSMK OUT ROMSEL,A PUSH HL ;SAVE ENTRY LD HL,EXROMR ;PUT RETURN ADDR ON STACK EX (SP),HL JP (HL) FIED TO AN UNCONDITIONAL JUMP BY ; THE WARM BOOT ROUTINE IF THE CLOCK/CALENDAR BOARD IS NOT PRESENT ; IF NOT MODIFIED, THEN ALL Z,TR3740 LD HL,(DTPTR) ;ELSE RETURN PTR TO TABLE JP DSKOK ; ASSUME 3740 FORMAT DISKETTE LG3740: CALL TR3740 ;************** ; ; RETURN TIME FUNCTION 92H ; EXIT - A= SECONDS ; B= MINITS ; C= HOURS ; ;*****************************: LD A,C LD (BTSEC),A RET ;***************************** ; ; SET TRANSFER ADDR ; ENTRY- BC= ADDRESS ; ;***********;EXECUTE ROM EXROMR: PUSH AF ;SAVE RETURN VALUE LD A,(ROMSAV) ;RESELECT ORIGINAL ROM OUT ROMSEL,A POP AF ;RETURN VAIT IS ALLWAYS FALSE (NOP). ; INHCLK: JR C,ILLEGC ; ; NOW CHECK FOR EXTENDED CALLS ; CP 8DH ;IF RETURN VERSION THEN RETUSET SECTOR TRANSLATE CALL DPBAD ;MOVE PARAMETERS INTO DISK PAR BLK LD BC,DPBSZ LD HL,SDPBK LDIR LD HL,(DTPTR) ;RE******** CLKTIM: LD BC,CLKBFR ;READ CLOCK INFO INTO BUFFER LD HL,TIMENT LD A,CALROM JR EXROM ;************************************** SETDMA: LD H,B LD L,C LD (BTDMA),HL RET ;********************************************************LUE RET SUBTTL CHAR I/O ROUTINES ;************************** ; ; CONSOLE INPUT ; EXIT - A= CHAR ; ;**************RN IT JR Z,RETVER CP 90H ;IF NOT CLOCK THEN ERR JR C,ILLEGC JR Z,CLKCAL ;IF CALENDAR THEN GET IT CP 92H JR C,TURN PTR TO TABLE JP DSKOK ;--------------------------------- ; ; SET 3740 SECTOR TRANSLATION ; ;------------------**************************************** ; ; READ CLOCK TIME FUNCTION 93H ; ENTRY- DE= PTR TO 13 BYTE BUFFER FOR CLOCK DATA ******* ; ; SECTOR TRANSLATION ; ENTRY- DE= 0: NO XLATE, ELSE PTR TO XLATE TABLE ; BC= SECTOR # TO XLATE ; EXIT - HL= XLATCH DD INTO SYSTEM OUT DDPORT,A LD A,DDLOG ;PERFORM DCM LOG-ON CALL DSKEX JR Z,LOGCK LD HL,0 ;ERROR- BAD LOG-ON ED SECTOR OR (BC) + 1 ; ;*************************************************************** SECTRN: LD A,D ;IF TABLE ADDR = 0 TH******************* ; ; HOME DRIVE - TREAT AS SEEK TRK 0 ; ;*************************************** HOME: LD C,0 ;**0 ( ) *!+",#-$.%/ &0 '************ CI: CALL CNSCK ;IF NO CHAR RDY THEN WAIT JR Z,CI IN A,NTD ;ELSE RETURN CHAR RET ;*****************SINGLE DENSITY **** ; ;-------------------------------------- SDTRAN: DB 1,7,13,19,25,5,11,17,23,3,9,15 DB 21,2,8,14,20,26,********************************** LO: CALL LISTST ;IF BUSY THEN WAIT JR NZ,LO LD A,C ;OUTPUT CHAR SET 7,A OUT CENT;DRIVE CLUSTER ALLOCATION BIT MAP PTR IF NDRVS GT 1 D1DPH: DW 0 DW 0 DW 0 DW 0 DW DIRBF DW D1DPB DW D1CHK DW *********************** ; ; RETURN CONSOLE STATUS ; EXIT - A= 0: NOT READY ; FFH: CHAR READY ; ;**********************6,12,18,24,4,10 DB 16,22 ;-------------------------------------- ; ; DEFAULT DISK PARAMETER BLOCK ; IBM 3740 SINGLE DED,A RES 7,A ;OUTPUT LOW TRUE STROBE OUT CENTD,A SET 7,A OUT CENTD,A RET ;*************************************D1ALL ENDIF IF NDRVS GT 2 D2DPH: DW 0 DW 0 DW 0 DW 0 DW DIRBF DW D2DPB DW D2CHK DW D2ALL ENDIF IF NDR** ; ; UNSUPPORTED INTERRUPT ; ;************************************** ILLINT: CALL SAVE ;SAVE ALL 8080 REGS LD HL,ILLNSITY FORMAT ; ;-------------------------------------- SDPBK: DW 26 ;SECTORS PER TRACK DB 3 ;BLOCK SHIFT FACTOR DB 7 ;**** ; ; RETURN LIST DEVICE STATUS ; EXIT - A= 0: BUSY, FFH:READY ; ;***************************************** LISTST: IVS GT 3 D3DPH: DW 0 DW 0 DW 0 DW 0 DW DIRBF DW D3DPB DW D3CHK DW D3ALL ENDIF BIOSND EQU $ SUBTTL DATA AREAIM ;NOTIFY USER OF INT JR IQCONT ;************************************** ; ; SAVE 8080 TYPE REGS SUBR ; ;************1 RET ;*************************************** ; ; CONSOLE OUTPUT ; ENTRY- C= CHAR TO OUTPUT ; ;********************BLOCK MASK DB 0 ;NULL MASK DW 242 ;DISK SIZE -1 DW 63 ;DIRECTORY MAX DB 11000000B ;ALLOC 0 DB 0 ;ALLOC 1 DW 16 N A,CENTS ;IF BUSY THEN RETURN 0 AND 1 SHL CENTBSY RET Z LD A,0FFH ;ELSE RETURN -1 RET ;*********************** ;------------------------------------------------ ; ; THE REMAINING AREA DOES NOT HAVE TO ; BELONG ON THE DISK. ; ;-----************************** SAVE: EX (SP),HL ;RETURN ADDR <-> HL PUSH DE PUSH BC PUSH AF JP (HL) ;*********************************** COC: CALL NTOST ;IF BUSY THEN WAIT OR A JR Z,COC LD A,C OUT NTD,A RET ;******************;CHECK SIZE DW 2 ;TRACK OFFSET ;------------------ ; ; MESSAGES ; ;------------------ MSGLE: DB CR,LF,'LOAD ERROR------------------------------------------- ; ; DRIVE ALLOCATION AREAS DECLARED ; ;---------------------------------------********************** ; ; RESTORE 8080 TYPE REGS SUBR ; ;************************************** RESTORE: POP HL ;RETURN***************************** ; ; RETURN CONSOLE OUTPUT READY STATUS ; EXIT - A= 0: BUSY, FFH: READY ; ;*******************',0 ISCMSG: DB CR,LF,'ILL. SYS. CALL',CR,LF,0 ITMSG DB CR,LF,'User',0 ILLIM DB CR,LF,'Unsupported',0 IQMSG DB ' Interrupt: AL CALL COC POP HL INC HL JR EDITOR SUBTTL INTERRUPTS ;-------------------------------------- ; ; USER INTERRUPT --------- D0ALL: DS ALLSIZ ;DISK CLUSTER ALLOCATION BIT MAP D0CHK DS CHKSIZ ;DIRECTORY CHECKSUMS STORAGE (1 BYTE PER DIR SEC ADDR POP AF POP BC POP DE EX (SP),HL ;RETURN ADDR <-> HL RET SUBTTL DATA CONSTANTS ;---------------------------**************************** NTOST: IN A,NTS CPL ;REVERSE SENSE AND 1 SHL NTBSY JR TTOST1 ;***********************bort? (Y/N) - ',0 ;---------------------------- ; ; ID SECTOR LABEL ; ;---------------------------- JADEID: DB 'Jade D; ;-------------------------------------- ITRAP: CALL SAVE ;SAVE ALL 8080 REGS LD HL,ITMSG ;NOTIFY USER IQCONT: CALL ETOR) IF NDRVS GT 1 D1ALL: DS ALLSIZ D1CHK DS CHKSIZ ENDIF IF NDRVS GT 2 D2ALL: DS ALLSIZ D2CHK DS CHKSIZ ENDIF --------------------- ; ; MODE 2 INTERRUPT VECTOR TABLE ; ;------------------------------------------------ IF $ AND 0FFH *********** ; ; READER DRIVER - DUMMY ; EXIT - A= CTRL-Z ; ;********************************** READER: LD A,CTRLZ ;FAKE ED ' IDSZE: EQU $-JADEID ;-------------------------------------- ; ; DRIVE PARAMETER HEADER AREA ; 1 PER DRIVE ; ;----DITOR LD HL,IQMSG ;QUERY USER CALL EDITOR CALL CI CP 3 ;IF CTRL-C THEN WARM BOOT JR Z,ITRAP1 AND 5FH ;IGNORE C IF NDRVS GT 3 D3ALL: DS ALLSIZ D3CHK DS CHKSIZ ENDIF ;---------------------------- ; ; CLOCK BUFFER ; ;---------;START ON EVEN PAGE BOUNDARY DS 100H - ($ AND 0FFH) ENDIF INTABL: REPT 7 ;1ST 7 ARE UNSUPPORTED DW ILLINT ENDM DOF RET ;************************************** ; ; PUNCH DRIVER ; ENTRY- C= CHAR TO OUTPUT ; ;**********************---------------------------------- D0DPH: DW 0 ;SECTOR TRAN TBL (OR 0 IF NO XLATE) DW 0 ;SCRATCH AREA DW 0 ;" DW 0 ;"ASE CP 'Y' ;IF YES THEN ABORT JR NZ,ITRAP2 ITRAP1: CALL RESTORE ;RESTORE 8080 REGS POP HL ;RET ADDR (BALANCE STACK------------------- CLKBFR: DS 13 ROMSAV DS 1 ;ROM SWAP SAVE OF ORIGINAL ROM END W ITRAP ;INT 8 IS USER INTERRUPT ;-------------------------------------- ; ; 3740 SECTOR TRANSLATION TABLE ; **** CP/M **************** PUNCH: RET ;************************************ ; ; PRINTER DRIVER ; ENTRY- C= CHAR TO OUTPUT ; ;** DW DIRBF ;DIRECTORY BUFFER PTR DW D0DPB ;DRIVE PARAMETER BLK PTR DW D0CHK ;DRIVE DISK CHECKSUMS ARRAY PTR DW D0ALL ) JP 0 ;DO WARM BOOT ITRAP2: CP 'I' JR NZ,ITRAPR ;IF CONTINUE THEN RESTORE & RETURN CALL RESTORE ;ELSE RESTORE & GO****************** CNSCK: IN A,NTS ;IF DATA NOT READY THEN RETURN 0 AND 1 SHL NTRDY TTOST1: RET Z LD A,-1 ;ELSE RETURN -TO MONITOR TRAP JP 0038H ITRAPR: CALL RESTORE EI ;RE-ENABLE INTERRUPTS RET ;*************************************** ; ; MESSAGE EDITOR ; ;************************** EDITOR: LD A,(HL) ;MESSAGE EDIT LOOP OR A RET Z LD C,A PUSH H0 ( ) *!+",#-$.%/ &0 ' TITLE CUSTOMIZED BIOS FOR M5B LIST NOCOND LIST OFF ;********************************* ; ; ASSEMBLY PARAMETERS ; ;********* SUBTTL SYSTEM DECLARATIONS ;-------------------------------------- ; ; DISK OPERATING SYSTEM ADDRESSES ; ;------ ELSE ; A 4 JADE FLOPPY PHYSICAL DRIVE 0 ; B 5 JADE FLOPPY PHYSICAL DRIVE 1 ; 6 JADE FLOPPY PHYSICAL DRIVE 2 1ST LOGICAL 5" FLOPPY DRIVE ND5FD EQU ST5FD + 1 ;LAST LOGICAL 5" FLOPPY DRIVE ;*********************************************************************** FALSE EQU 0 TRUE EQU NOT FALSE ;====================================== ; ; CONDITIONAL ASSEMBL-------------------------------- NKSYS: EQU 61 ;SYSTEM SIZE IN K BYTES KBYTE: EQU 1024 CPMSZ: EQU KBYTE*NKSYS CPMBS: EQU CP ; 7 JADE FLOPPY PHYSICAL DRIVE 3 ; C 0 SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; D 1 SIDE 2 & 3 OF HARD DISK PH****************************** ; ; THE FOLLOWING 2 PARAMETERS MUST REFLECT THE MAX DISK SIZE & ; THE MAX DIRECTORY SIZE. ; 2). Change Revision display of sign-on (separate CBIOS rev). ; ; 2.00 - 24 MAR 84 GRH ; Modify for hard disk ; ; 2.01 - 2MSZ - (20 * KBYTE) ; CP/M BIAS VALUE CCP: EQU CPMBS+3400H ;ADDR OF CCP BDOS: EQU CPMBS+3C00H ;ADDRESS OF BDOS BIOS: EQU CPMBSYSICAL DRIVE 0 ; E 2 SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; F 3 SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ENDIF;************************************************************************* ALLSIZ EQU 33 ;ALLOCATION BIT MAP SIZE (1 BYTE PER 88 APR 84 GRH ; Change hard disk DPB to reflect half size directory, but keep ; allocation for 1k directory ; ; 2.02 - 2 JUIST INCLUDE FILES HARDBT EQU TRUE ;HARD DISK BOOT (FALSE= FLOPPY BOOT) USEMON EQU TRUE ;USE MONITOR ROM I/O ROUTINES IF TRUE+4A00H ;ADDRESS OF BDOS BIOSR: EQU 1000H-BIOS ; PAGE0: EQU 0 ;START OF CP/M RAM IOBYTE: EQU PAGE0 + 3 ;IOBYTE ADDR DEFDRV: ; ;************************************************************* ; REVISIONS: ; ; 2.2.0 - RELEASE ; ; 2.2.3 - SWAPPED  CLUSTERS) CHKSIZ EQU 32 ;DIRECTORY CHECKSUMS ARRAY SIZE (1 BYTE PER DIR. SECTOR) ;**************************** ; ; ADDRESN 84 GRH ; Change floppy disk drivers to relate to ISASI control of JADE ; FDC. ; Change IOPB sector value from physical INTRPTS EQU TRUE ;ENABLE INTERRUPT PROCESSING WHISTLE INTCPTS EQU TRUE ;ENABLE SYSTEM CALL INTERCEPT WHISTLE LIST ON ;** EQU PAGE0 + 4 ;DEFAULT DRIVE PARAM ADDR DKPROM EQU PAGE0 + 40H ;DISK PRIMITIVES PROM # (STORED BY DKBOOT) DEFBFR EQU PAGE0 + SES ; ;**************************** CALROM EQU 7 ;CALENDAR ROM SELECT # RDBENT EQU 0F800H ;READ CLOCK BUFFER ENTRY SETENT sector (1..n) to logical ; sector value (0..n-1). This maintains more uniformity in ; parameter passing between hard di*********************************************************** ; ; (c) 1981 GRH Electronics, CUPERTINO, CA ; ;*************80H ;DEFAULT BUFFER TPA: EQU 100H ; ; OTHER DECLARATIONS ; DEFIOB: EQU 80H ;INITIAL IOBYTE VALUE (LPT ON) DFDRV: EQU 0 OBYTE IN ; ANTICIPATION OF THE MONITOR. ALSO, ALL REFERENCES ; REQUIRING THE I/O PROMS TO BOOT HAS BEEN REMOVED. ; ; EQU RDBENT + 3 ;SET CLOCK ENTRY CALENT EQU RDBENT + 6 ;RETURN CALENDAR ENTRY TIMENT EQU RDBENT + 9 ;RETURN TIME ENTRY DKPENTsk & JADE floppy IOPBs. ; Vector I/O routines to monitor rom routines. ; ; 2.03 - 4 JUN 84 GRH ; Add bells & whistles agai************************************************ ; ; CONFIGURATION: ; ; CPM ISASI ; DRIVE DRIVE USAGE IF HARDBT ;HARD  ;INITIAL DEFAULT DRIVE SECSZ: EQU 128 FMTSZ: EQU 100H ;FORMAT BUFFER SIZE NDRVS: EQU 6 BTDIRS EQU 2 + 1 ;HARD DISK SYSTEM 2.2.5 - RECONFIGURE FOR 62K SYSTEM. ; ; 2.2.6 - 20 FEB 83 ; DOUBLE D REV C UPGRADE. CHANGE BOARD STATUS PORT BITS. ; ; 2.2 EQU RDBENT + 0CH ;DISK PRIMITIVES ENTRY ;**************************** ; ; ASCII CHARS ; ;**************************** n. ; Move to 61k system. ; ; 2.04 - 30 MAR 85 GRH ; Implemented hard disk drive 1 as C: & D:. ; Implemented the Logon funDISK BOOT CONFIG. ; A 0 SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; B 1 SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 0 ; C TRACKS DIRECTORY SECTOR BTCCPO EQU 3 ;OFFSET TO CCP ENTRY IN SYS TRKS DIRECTORY IF HARDBT LASTSEC EQU 46 + 1 ;LAST BOOT S.7 - 8 MAR 83 GRH ; ADDED CLOCK/CALENDAR DRIVER, SYSTEM CALL INTERCEPT, ; ILLEGAL SYSTEM CALL MESSAGE, CHANGED BIOS SIZE TO EN LF: EQU 0AH CR: EQU 0DH CTRLZ: EQU 1AH ; ; INCLUDE JDDCONT.DEF ; INCLUDE MONBOARD.DEF ; INCLUDE IOBOARD.DEF ; INCLUDE ction for the hard disk. ; Implemented user friendly disk error options: Abort, Retry, Ignore. ; Solved warm boot hang problem 2 SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; D 3 SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ; E 4 JADE FLOPPY PHYSICAECTOR ELSE LASTSEC EQU 45 ;LAST BOOT SECTOR ENDIF STHD EQU 0 ;1ST LOGICAL HARD DISK DRIVE NDHD EQU STHD + 3 ;LAST LOGICD ; OF INITIALIZED DATA AREA. RESTRUCTURE MODULES. ; ; 2.28 - 22 APR 83 GRH ; CHANGED DEFINITIONS TO ALLOW BIG DIRECTORIESNAKEDT.DEF ; INCLUDE ISHA.DEF ; INCLUDE CLOCK.DEF ; INCLUDE COMIOPB.DEF ; INCLUDE JDDDISK.DEF IF NOT LSTINC LIST OFF  by reseting host adapter if busy. ; VERSN EQU 'X2' ; ;*********************************************************************L DRIVE 0 ; F 5 JADE FLOPPY PHYSICAL DRIVE 1 ; 6 JADE FLOPPY PHYSICAL DRIVE 2 ; 7 JADE FLOPPY PHYSICAL DRIVE 3 AL HARD DISK DRIVE ST8FD EQU 4 ;1ST LOCICAL 8" FLOPPY DRIVE ND8FD EQU ST8FD + 3 ;LAST LOGICAL 8" FLOPPY DRIVE ST5FD EQU 6 ;. ; DISALLOWED DRIVES C & D. ; ; 2.29 - 3 SEP 83 GRH ; Changed Rev # for blocked DCM. Enables IBM system 34 ; 256 bytes pY FLAGS ; ;====================================== SHORT EQU TRUE ;SHORT BIOS (REMOVES UNESENTIAL CODE) LSTINC EQU FALSE ;Ler sector disks to be read. ; ; 1.10 - 23 SEP 83 GRH ; Move clock-calendar routines to ROM. Add Interrupt handler ; (Mode DCM & BIOS SECTORS ON DISK, ALLOWING A ; LARGER BIOS ALLOCATION ON THE DISK. ; ; 2.2.4 - ADDED NAKED TERMINAL DRIVERS & I0 ( ) *!+",#-$.%/ &0 ' ENDIF *INCLUDE JDDCONT.DEF *INCLUDE MONBOARD.DEF *INCLUDE IOBOARD.DEF *INCLUDE NAKEDT.DEF *INCLUDE ISHA.DEF *INCLUDE CLOCK UP START OF CP/M IMAGE FROM DIRECTORY INC A ;OFFSET FOR READ DECRIMENT LD C,A LD B,0 ELSE LD BC,2 ;START WITH SEIOS MODULE LOAD ADDR FOR SBD INIT1: JR INIT ;-------------------------------------------------------------------------- ;RV) ;PASS IN DEFAULT DISK TO CCP LD C,A JP CCP SUBTTL DISK ROUTINES ;*************************** ; ; READ A DISK SEK.DEF *INCLUDE COMIOPB.DEF *INCLUDE JDDDISK.DEF LIST ON SUBTTL BIOS CODE ORG BIOS ;---------------------------- ; ;CTOR #2 ENDIF CALL SETSEC ; ; READ CCP/BDOS ; WREAD: CALL DISKRD JR NZ,WEROR ;IF ERROR THEN EXIT LD A,(BTSEC)  ; DIRECTORY SECTOR BUFFER STARTS HERE AFTER CRUNCHING COLD START ; CODE. THIS BUFFER IS USED BY THE CP/M DIRECTORY CHECK ROUCTOR ; ;*************************** DISKRD: LD A,DDRDS JR HDDO DISKLOG: LD HL,LOGIOPB LD DE,IOPB LD BC,IOPBSZ INTRPTS LD A,HIGH INTABL ;INIT INTERRUPT VECTORS LD I,A IM 2 ;USE MODE 2 IN A,INTMSK AND 7FH ;ENABLE INT 7 OUT I;IF LAST SECTOR THEN DONE CP LASTSEC JR NC,WZRPG INC A ;NEXT SECTOR LD (BTSEC),A LD DE,SECSZ ;DMA := DMA + SECTORTINES THAT ; CHECK FOR DISK CHANGE. ; ;-------------------------------------------------------------------------- DIRBF: EQ LDIR LD A,(BTDRV) RRCA PUSH AF AND 80H LD (IOPB + PBSECO),A POP AF AND 7FH LD (IOPB + PBDRVO),A LD A,DDLNTMSK,A IN A,MONSTS ;ENABLE MONITOR BOARD INTERRUPTS OR MONIE OUT MONSTS,A EI ENDIF LD SP,DEFBFR ;SELECT TEMPOR ;GET CONSOLE STATUS JP CI ;CONSOLE INPUT JP COC ;CONSOLE OUTPUT JP LO ;PRINTER OUTPUT JP PUNCH JP READER JP HOM SIZE LD HL,(BTDMA) ADD HL,DE LD (BTDMA),HL JR WREAD ; ; WARM BOOT ERROR, OUTPUT MSG & HALT ; WEROR: LD HL,MSGLE ;U $ ;BUFFER BEGINNING ;-------------------------------------------------------------------- ; ; INIT - COLD START ENOG LD (IOPB + PBCMDO),A JR RWOP2 JR DISKOP2 ;**************************** ; ; WRITE A DISK SECTOR ; ;********ARY STACK CALL GETMON ;SELECT MONITOR ROM LD A,0 ;SET DRIVE 0 LD (BTDRV),A IF HARDBT IN A,(HSTATUS) ;IF HOSTE ;HOME SELECTED DRIVE JP SELDSK ;SELECT DISK DRIVE JP SETTRK ;SET TRACK # JP SETSEC ;SET SECTOR # JP SETDMA ;SET TOUTPUT ERROR MESSAGE CALL EDITOR HALT ; ; BOOT OK, INIT PAGE 0 ; WZRPG: LD A,0C3H ;INITIALIZE BIOS WARM START VECTOR ******************** DISKWR: LD A,DDWRS HDDO: LD HL,BTTRK LD DE,IOPB + PBTRKO LD BC,PBSTATO - PBTRKO LDIR LD HL,LO ADAPTER BUSY THEN BIT HBUSYB,A JR Z,NTHUNG LD A,1 SHL HRESET ; RESET HOST ADAPTER TO CLEAR HANG OUT (HCMD),A XOR ARANSFER ADDR JP DISKRD ;PERFORM DISK READ JP DISKWR ;PERFORM DISK WRITE JP LISTST ;RETURN LIST STATUS JP SECTRN ;TRA LD HL,BIOS + 3 LD (PAGE0),A LD (PAGE0 + 1),HL LD HL,BDOS + 6 ;INIT BDOS CALL VECTOR LD (PAGE0 + 5),A LD (PAGE0 + 6DEFBFR ;USE PAGE 0 FOR STACK CALL GETMON ;MAKE SURE BOOT ROM IS DISABLED LD A,DFDRV ;INIT DEFAULT DRIVE LD (DEFDRV),GSTAT LD BC,IOPBSZ - PBSTATO LDIR DISKOP2: LD (IOPB + PBCMDO),A LD A,(BTDRV) CP NDRVS ;IF RANGE ERROR THEN ABOR OUT (HCMD),A EX (SP),HL ; DELAY FOR HOST ADAPTER TO CATCH UP EX (SP),HL WARM1: IN A,(HSTATUS) ; WHILE BUSY THEN WNSLATE SECTOR JP ITRAP ;FORMAT VECTOR ;************************************************************************** ; ; TH),HL LD BC,DEFBFR ;SET DEFAULT SECTOR BUFFER CALL SETDMA IF INTCPTS LD HL,(BDOS + 7) ;GET BDOS VECTOR LD (BDOSV),A ; ; SEND SYSTEM SIGN-ON ; CLOGO: LD HL,MSGSO CALL EDITOR LD HL,(BIOS+4) ;MODIFY COLD START TO WARM START LD (BIOT JP NC,FDSKER CP 4 JR NC,DOFLOP SRL A ;0,1: DRV 0, 2,3: DRV 1 LD (IOPB + PBDRVO),A LD D,0 ;COMPUTE SECTORAIT BIT HBUSYB,A JR NZ,WARM1 NTHUNG: LD C,0 LD E,C CALL SELDSK LD A,L OR A,H JR Z,WEROR LD BC,DEFBFR ;REAESE BOOT PARAMS MUST RESIDE AS DEFINED RIGHT BEFORE THE COLD ; INIT ROUTINE START AND MUST BE IN THE 1ST SECTOR. ; THESE 2 WHL ;PUT IN INTERCEPT CODE LD HL,INTCPT ;NOW PUT INTERCEPT VECTOR INTO BDOS VECTOR LD (BDOS + 7),HL IN A,(CLKDAT) ;IF S+1),HL JP WARM ; ; SIGN-ON MESSAGE ; MSGSO: DB CR,LF DB CPMSZ / (KBYTE * 10) + '0' DB (CPMSZ MOD (KBYTE * 10)) / KB RR D ;DRIVE BIT 0 -> SECTOR BIT 7 LD A,(BTSEC) DEC A ;CHANGE TO LOGICAL SECTOR AND 7FH OR D RWOPC: LD (IOPB + D BOOT DIRECTORY CALL SETDMA LD BC,BTDIRS CALL SETSEC LD BC,0 ELSE LD BC,1 ENDIF CALL SETTRK IF HARDBTORDS ARE REFERENCED BY THE BOOT CODE IN ; ORDER TO FIND THE LOAD ADDRESS FOR THE BIOS & IT'S LENGTH. ; ;********************CLOCK NOT PRESENT THEN TURN OFF CLOCK DRIVE AND 11000000B ;TEST UNUSED BUT DRIVEN BITS (1S IF NOT THERE) LD A,38H ;CONYTE + '0' DB 'K CP/M-80 Vers 2.2',CR,LF DB 'M5b CBIOS Vers 3.' DM HIGH VERSN , LOW VERSN,CR,LF DS DIRBF+SECSZ-$ ;FPBSECO),A RWOP2: XOR A,A LD (IOPB + PBFLGO),A ;NO FLAGS FOR NOW RWOPR: CALL HDEXEC ; DO OP RET Z ;IF NO_ERROR THEN CALL DISKRD JR NZ,WEROR ENDIF LD BC,CCP ;SET LOAD ADDR CALL SETDMA IF HARDBT LD A,(DEFBFR + BTCCPO) ;PIC****************************************************** BIOSSZ: DW BIOSND - BIOS ;BIOS MODULE SIZE IN BYTES BIOSST: DW BIOS ;BD. JR (ON) JR Z,CLKON LD A,18H ;UNCOND. JR (OFF) (CAUSES JUMP TO ILLEGAL) CLKON: LD (INHCLK),A ENDIF LD A,(DEFDILL OUT DIRECTORY BUFFER TO 1 SECTOR SIZE ;---------------------------------------------------------- ; ; WARM REBOOT ENT BIOS JUMP VECTOR TABLE ; ;---------------------------- JP INIT1 ;COLD START ENTRY JP WARM ;RELOAD CCP/BDOS JP CNSCKRY LOADS CCP,BDOS FROM DISK & ; SETS UP VARIABLES ; ;---------------------------------------------------------- WARM: IF TRY FROM BOOT MUST SET ALL BIOS PARAMS ; ;-------------------------------------------------------------------- INIT: LD SP,0 ( ) *!+",#-$.%/ &0 ' RETURN LD A,(IOPB + PBSTATO) ;PASS STATUS BYTE TO DISK_ERROR() CALL DSKER JR RWOPR ;SINCE RETURNED, DO RETRY DOFSLATION ; EXIT - DE, HL= ? ; ;********************************* TR3740: LD DE,SDTRAN SETTR LD HL,(DTPTR) LD (HL),E INC  LD A,-1 ;RETURN -1 TO BDOS OR A RET ;************************************************* ; ; SELECT DRIVE ; LOG-ON RET ;*************************************************************** ; ; SECTOR TRANSLATION ; ENTRY- DE= 0: NO XLATE,LOP: LD (IOPB + PBDRVO),A LD A,(BTSEC) DEC A ;CHANGE TO LOGICAL SECTOR JR RWOPC ;----------------------------------HL LD (HL),D RET ;********************************* ; ; SET NO SECTOR TRANSLATION ; EXIT - HL, DE= ? ; ;********** - SET DISK PARAMETER BLOCK ; ENTRY- C= DRIVE # ; E= 0 IF NEVER LOGGED BEFORE ; EXIT - HL= PTR TO DPT OR 0 FOR ERROR ; ;** ELSE PTR TO XLATE TABLE ; BC= SECTOR # TO XLATE ; EXIT - HL= XLATED SECTOR OR (BC) + 1 ; BC= UNCHANGED ; A, DE= ? ; ;*N ASSUME 3740 FORMAT CP (HL) JR NZ,LG3740 INC HL INC DE DJNZ LOGID ; ; DISKETTE CONTAINS ID. ASSUME NO SECTOR TR*********************** TRNONE: LD DE,0 JR SETTR ;************************************** ; ; GET DRIVE PARAMETER BLO*********************************************** SELDSK: LD HL,0 ;ASSUME ERROR LD A,C ;SET DRIVE # CP NDRVS ;IF NOT 0..************************************************************** SECTRN: LD A,D ;IF TABLE ADDR = 0 THEN NO TRANSLATION OR E JANSLATION ; CALL TRNONE CALL DPBAD ;GET ADDR OF DPB & MOVE DOWN DISK INFO TO IT LD HL,DEFBFR + IDSPTO CALL MOVDPB ;----------------------------------------------------------------- ; ; DISK ERROR SUBR. ; QUERIES USER FOR ABORT (REBOOT), IGNCK ADDR ; EXIT - DE= DPB PTR ; HL= ? ; ;************************************** DPBAD: LD HL,(DTPTR) ;FETCH BASE ADDR LD (NUMBER_OF_DRIVES -1) THEN ERROR RET NC LD (BTDRV),A ;STORE DRIVE # LD A,E ;SET LOG REQUEST VECTOR LD (LOGRQ),A R Z,NOTRAN EX DE,HL ADD HL,BC LD L,(HL) LD H,0 RET ; NOTRAN: LD HL,1 ADD HL,BC RET ;******************* ; IF DENSITY FLAG = SINGLE (0) AND HARD DISK FLAG = FALSE (0) THEN USE ; 3740 FORMAT ; LD A,(DEFBFR + IDFLGO) AND [1 ORE (RETURN OK TO BDOS), ; RETRY (RETURNS TO CALLER) OR NORMAL BDOS ERROR (DEFAULT). ; ENTRY- A= ERROR CODE ; EXIT - A= FFHDE,10 ;ADD OFFSET OF DPB PTR ADD HL,DE LD E,(HL) ;FETCH DPB PTR INC HL LD D,(HL) RET ;******************************************** ; ; LOAD HEX DATA INTO MEMORY SUBR ; ENTRY- A= DATA ; HL= PTR TO MEMORY ; EXIT - A= DATA ; HL= HL + SHL DFDTDB] OR [1 SHL DFHARDB] CALL Z,TR3740 LOGDON: LD HL,(DTPTR) ;ELSE RETURN PTR TO TABLE XOR A RET ; ; ASSUME 3 (DEFAULT), CHAR OTHERWISE ; HL= ? ; ;-------------------------------------------------------------------- DSKER: LD HL,D************** ; ; HOME DRIVE - TREAT AS SEEK TRK 0 ; ;*************************************** HOME: LD BC,0 ;******D0DPH ADD HL,DE LD A,(LOGRQ) ;IF NOT_1ST_LOG_ON THEN RETURN TABLE PTR AND 1 XOR 1 RET Z ; ; READ IDENTITY SECTOR 2 ; ;************************************** PRHEX: CALL PRDIG ;DO HIGH NIBBLE PRDIG: RLCA ;POSITION NIBBLE INTO LOW 4 B740 FORMAT DISKETTE ; LG3740: LD A,(BTDRV) ;IF HARD DISK THEN IF HARDBT CP 4 JR NC,LG371 ELSE CP 2 JR C,LG37SKEB ;POINT TO ERROR BYTE CALL PRHEX ;LOAD ERROR CODE INTO MESSAGE LD HL,DSKEM ;OUTPUT ERROR MESSAGE CALL EDITOR CA*********************** ; ; SET TRACK # ; ENTRY- BC= TRACK # ; EXIT - A= C= TRACK # ; ;***************************** SETT ; LD (DTPTR),HL ;SAVE DRIVE TABLE PTR LD A,(BTDRV) ;PERFORM DCM LOG-ON IF NOT HARDBT CP 2 ;IF FLOPPIES THEN JRITS RLCA RLCA RLCA PUSH AF ;SAVE DATA AND 0FH ;MASK OFF OTHER NIBBLE CP 10 ;OFFSET IF > 9 JR C,NTALPH A1 ENDIF CALL TRNONE ; NO XLATE CALL DPBAD ; USE DEFAULT TABLE LD HL,HDPBK JR MOVDPB LG371: CALL TR3740 ;SELL CI ;GET USER RESPONSE PUSH AF ;SAVE CHAR LD C,A ;ECHO CHAR CALL COC POP AF AND 5FH ;INSURE UPPER CASE CRK: LD (BTTRK),BC RET ;***************************** ; ; SET SECTOR ; ENTRY- BC= SECTOR # ; EXIT - A= C= SECTOR #  NC,LOG2 ADD 4 ;BIAS UP TO FDC DRIVES JR LOG3 LOG2: SUB 2 ;ELSE BIAS DOWN TO HARD DISKS LOG3: ENDIF LD HL,LODD 7 NTALPH: ADD '0' ;CONVERT TO ASCII LD (HL),A ;STORE CHAR POP AF ;DATA INC HL ;NEXT CHAR RET ;***********T SECTOR TRANSLATE CALL DPBAD ;MOVE PARAMETERS INTO DISK PAR BLK LD HL,SDPBK MOVDPB: LD BC,DPBSZ ;MOVE DRIVE TABLE TO P 'R' ;IF RETRY THEN RETURN TO CALLER RET Z POP HL ;NOT RETURNING, WASTE ADDRESS TO CALLER CP 'A' ;IF ABORT THEN RE; ;***************************** SETSEC: LD (BTSEC),BC RET ;***************************** ; ; SET TRANSFER ADDR ; GIOPB + PBSECO LD (HL),0 CP A,4 JR NC,LOG4 RRCA PUSH AF AND 80H LD (HL),A POP AF AND 7FH LOG4: LD (LOGI********************** ; ; HARD DISK EXECUTE SUBR ; EXIT - NZ= ERRORS ; ;********************************* HDEXEC: LD HLCP/M DRIVE TABLE LDIR JR LOGDON ;RETURN PTR TO TABLE ;********************************* ; ; SET 3740 SECTOR TRAN-BOOT JP Z,0 SUB 'I' ;IF IGNORE THEN RETURN NO ERROR RET Z FDSKER: LD HL,0 ;RETURN DPB_PTR = 0 FOR SELECT FUNCTION ENTRY- BC= ADDRESS ; EXIT - HL= BC= ADDRESS ; ;***************************** SETDMA: LD (BTDMA),BC XOR A,A LD (BTDMAX),AOPB + PBDRVO),A FDLOGR: CALL DISKLOG ;LOG ON DRIVE & RETURN IDENTITY SECTOR DATA JR Z,LOGCK JR FDLOGR ;RETURN HERE ME------- ; ; NORMAL EXIT ; EXIT - A= 0 ; ;----------------------------------------- DSKOK: XOR A ;RETURN 0 RET ;---ANS TO RETRY ; ; CHECK FOR JADE ID ; LOGCK: LD HL,DEFBFR LD DE,JADEID LD B,IDSZE LOGID: LD A,(DE) ;IF NO MATCH THERETDSK: LD A,(BTDRV) ;COMPUTE TABLE PTR LD L,A LD H,0 ADD HL,HL ;DISK # * 16 ADD HL,HL ADD HL,HL ADD HL,HL LD DE,0 ( ) *!+",#-$.%/ &0 ',IOPBADR ;OUTPUT IOPB ADDRESS TO ISASI LD B,3 HDX1: LD A,(HL) INC HL OUT (HDATA),A LD A,(HL) INC HL OUT (HCMD),ONITOR ELSE CALL CNSCK ;IF NO CHAR RDY THEN WAIT JR Z,CI IN A,NTD ;ELSE RETURN CHAR RET ENDIF ;**********F SET FUNCTION THEN SET CLOCK JR Z,CLKTIM ;IF TIME THEN GET IT CP 93H JR Z,CLKRDC ;IF READ CLOCK THEN GET IT ; ; IL***************** PUNCH: RET ;************************************ ; ; PRINTER DRIVER ; ENTRY- C= CHAR TO OUTPUT ; ;*A HDX2: IN A,(HSTATUS) BIT HBUSYB,A JR NZ,HDX2 DJNZ HDX1 LD A,HEXEC ;NOW EXECUTE THE IOPB OUT (HCMD),A HDX3****************************** ; ; RETURN CONSOLE STATUS ; EXIT - A= 0: NOT READY ; FFH: CHAR READY ; ;***************LEGAL SYSTEM CALL ; ILLEGC: LD HL,ISCMSG ;OUTPUT WARNING CALL EDITOR XOR A ;BC = HL = A = 0 LD L,A LD H,A LD C,A *********************************** LO: IF USEMON CALL GETMON JP 0F80FH ELSE CALL LISTST ;IF BUSY THEN WAIT JRT FUNCTION 91H ; ENTRY- DE= CLOCK IMAGE BUFR PTR (13 BYTES LONG) ; ;********************************************************************************** CNSCK: IF USEMON CALL GETMON JP 0F812H ELSE IN A,NTS ;IF DATA NOT READY THEN RETURN 0 LD B,A RET ;***************************************** ; ; CDOS RETURN VERSION SYSTEM CALL ; MAKES CLOCK/CALENDAR WORK Z,LO LD A,C ;OUTPUT CHAR SET 7,A OUT CENTOUT,A RES 7,A ;OUTPUT LOW TRUE STROBE OUT CENTOUT,A SET 7,A OUT CE* CLKSET: LD C,E ;SET UP PARAMETERS LD B,D LD HL,SETENT CLK2: LD A,CALROM ;****************************************************************************************************************** ; ; SYSTEM CALL INTERCEPT ROUTINE CHECKS FOR ILLEG AND 1 SHL NTRDY TTOST1: RET Z LD A,-1 ;ELSE RETURN -1 RET ENDIF ;*************************************** ; ; . ; EXIT - B= 1 ; ;***************************************** RETVER: LD B,1 RET SUBTTL MISC I/O DRIVERS ;************NTOUT,A RET ENDIF ;***************************************** ; ; RETURN LIST DEVICE STATUS ; EXIT - A= 0: BUSY, FF******************* ; ; EXECUTE ROM ROUTINE ; ENTRY- HL= ENTRY ADDRESS ; A= ROM # ; EXIT - ENTRY ROM RE-SELECTED ; ;****AL BDOS CALLS & ; PRINTS MESSAGE IF ILLEGAL. ALSO IMPLEMENTS CDOS CLOCK/CALENDAR ; SYSTEM CALLS FOR ASMB. ; ;*************CONSOLE OUTPUT ; ENTRY- C= CHAR TO OUTPUT ; ;*************************************** COC: IF USEMON CALL GETMON JP 0H:READY ; ;***************************************** LISTST: IF USEMON CALL GETMON JP 0F827H ELSE IN A,CENTS ;****************************************************** EXROM: PUSH AF ;SAVE NEW ROM IN A,ROMSEL ;SAVE CURRENT ROM LD (************************************************************** INTCPT: LD A,C ;CHECK CALL VALIDITY CP 41 ;IF <= 40 THEN OK F809H ELSE CALL NTOST ;IF BUSY THEN WAIT OR A JR Z,COC LD A,C OUT NTD,A RET ;*************************** 90H ; EXIT - A= DAY ; B= MONTH ; C= YEAR ; L= DAY OF WEEK ; ;***************************************** CLKCAL: LD HIF BUSY THEN RETURN 0 CPL ;INVERT THE SENSE AND 1 SHL CENTBSY RET Z LD A,0FFH ;ELSE RETURN -1 RET ENDIF ROMSAV),A POP AF ;SELECT NEW ROM AND ROMSMK OUT ROMSEL,A PUSH HL ;SAVE ENTRY LD HL,EXROMR ;PUT RETURN ADDR ON  BDOSV EQU $ + 1 JP C,BDOS + 11H ;THIS ADDR MODIFIED BY WARM BOOT RTN ; ; THE FOLLOWING CONDITIONAL JUMP IS MODIFIED TO A******************** ; ; RETURN CONSOLE OUTPUT READY STATUS ; EXIT - A= 0: BUSY, FFH: READY ; ;****************************L,CALENT ;ROM ENTRY POINT CLK1: LD BC,CLKBFR ;READ CLOCK JR CLK2 ;************************************* ; ; RETURN T;**************************** ; ; GET MONITOR PROM SUBR ; EXIT - A= ? ; ;**************************** GETMON: LD A,XMONRSTACK EX (SP),HL JP (HL) ;EXECUTE ROM EXROMR: PUSH AF ;SAVE RETURN VALUE LD A,(ROMSAV) ;RESELECT ORIGINAL ROM OUT RN UNCONDITIONAL JUMP BY ; THE WARM BOOT ROUTINE IF THE CLOCK/CALENDAR BOARD IS NOT PRESENT ; IF NOT MODIFIED, THEN IT IS ALL******************* NTOST: IN A,NTS CPL ;REVERSE SENSE AND 1 SHL NTBSY JR TTOST1 ENDIF ;**********************IME FUNCTION 92H ; EXIT - A= SECONDS ; B= MINITS ; C= HOURS ; ;************************************* CLKTIM: LD HL,TIMOM OUT (ROMSEL),A RET ;***************************************************** ; ; MESSAGE EDITOR ; ENTRY- HL= TEXT PTOMSEL,A POP AF ;RETURN VALUE RET ENDIF SUBTTL CHAR I/O ROUTINES ;************************** ; ; CONSOLE INPUWAYS FALSE (NOP). ; INHCLK: JR C,ILLEGC ; ; NOW CHECK FOR EXTENDED CALLS ; CP 8DH ;IF RETURN VERSION THEN RETURN IT J************ ; ; READER DRIVER - DUMMY ; EXIT - A= CTRL-Z ; ;********************************** READER: LD A,CTRLZ ;FAKE ENT JR CLK1 ;************************************************************ ; ; READ CLOCK TIME FUNCTION 93H ; ENTRY- DER (BIT 7= 1: TERMINATOR) ; EXIT - REGS= ? ; ;***************************************************** EDITOR: LD C,(HL) ;MESSAT ; EXIT - A= CHAR ; ;************************** CI: IF USEMON CALL GETMON ;SWITCH IN MONITOR ROM JP 0F803H ;USE MR Z,RETVER CP 90H ;IF NOT CLOCK THEN ERR JR C,ILLEGC JR Z,CLKCAL ;IF CALENDAR THEN GET IT CP 92H JR C,CLKSET ;IEOF RET ;************************************** ; ; PUNCH DRIVER ; ENTRY- C= CHAR TO OUTPUT ; ;*********************= PTR TO 13 BYTE BUFFER FOR CLOCK DATA ; ;************************************************************ CLKRDC: LD C,E ;SET: IN A,(HSTATUS) BIT HBUSYB,A JR NZ,HDX3 AND (1 SHL HERRB) + (1 SHL HFERRB) ;CHECK FOR ERRORS RET IF INTCPTS ; UP PARAMETERS LD B,D LD HL,RDBENT JR CLK2 ;********************************************************** ; ; CLOCK SE***************************** ; ; CLOCK ROUTINES ; ;***************************************** ; ; RETURN CALENDAR FUNCTION 0 ( ) *!+",#-$.%/ &0 'GE EDIT LOOP PUSH HL ;SAVE PTR RES 7,C ;CLEAR BIT 7 FOR OUTPUT CALL COC POP HL BIT 7,(HL) ;IF BIT 7 SET THEN RETUH: ;DRIVE PARAMETER HEADER FOR DRIVE #D(DD) DW 0 ;SECTOR TRAN TBL (OR 0 IF NO XLATE) DW 0 ;SCRATCH AREA DW 0 ;" DW ERRUPT VECTOR TABLE ; ;------------------------------------------------ IF $ AND 0FFH ;START ON EVEN PAGE BOUNDARY DS 100H-------------------------------- ; ; DRIVE ALLOCATION AREAS DECLARED ; ;------------------------------------------------ RN RET NZ INC HL ;ELSE PRINT NEXT CHAR JR EDITOR IF INTRPTS SUBTTL INTERRUPTS ;--------------------------------0 ;" DW DIRBF ;DIRECTORY BUFFER PTR DW D#D(DD)DPB ;DRIVE PARAMETER BLK PTR IF (HARDBT AND (DD < 5)) OR (NOT HARDBT AN - ($ AND 0FFH) ENDIF INTABL: REPT 7 ;1ST 7 ARE UNSUPPORTED DW ILLINT ENDM DW ITRAP ;INT 8 IS USER INTERRUPT ALLDAL: MACRO #D IF (HARDBT AND (DD < 5)) OR (NOT HARDBT AND (DD > 2)) D#D(DD)ALL: DS 128 ;ALLOCATION FOR DRIVE #D(DD)  ;--------------------------------- ; ; HARD DISK DATA ; ;--------------------------------- IOPB: REPT 16 ;;HARD DISK IOD (DD > 2)) DW 0 ;NO CHECKS ON HARD DISK ELSE DW D#D(DD)CHK ;DRIVE DISK CHECKSUMS ARRAY PTR ENDIF DW D#D(DD)ALL  ENDIF ;-------------------------------------- ; ; 3740 SECTOR TRANSLATION TABLE ; **** CP/M SINGLE DENSITY **** ; ;----ELSE D#D(DD)ALL: DS ALLSIZ ;DISK CLUSTER ALLOCATION BIT MAP FOR DRIVE #D(DD) D#D(DD)CHK DS CHKSIZ ;DIRECTORY CHECKSUMS STORAGEPB DB 0 ENDM IOPBADR: DB LOW IOPB ;HARD DISK IOPB POINTER TABLE DB HIOPBL DB HIGH IOPB DB HIOPBH DB 0 DB HIOP BC LD HL,ITMSG ;NOTIFY USER IQCONT: CALL EDITOR LD HL,IQMSG ;QUERY USER CALL EDITOR CALL CI CP 3 ;IF CTRL-C THE ;DRIVE CLUSTER ALLOCATION BIT MAP PTR ENDM DD DL 1 REPT NDRVS ALLDPH 0123456789ABCDEF DD DL DD + 1 ENDM BIOSND E---------------------------------- SDTRAN: DB 1,7,13,19,25,5,11,17,23,3,9,15 DB 21,2,8,14,20,26,6,12,18,24,4,10 DB 16,22  (1 BYTE PER DIR SECTOR) ENDIF ENDM DD DL 1 REPT NDRVS ALLDAL 0123456789ABCDEF DD DL DD + 1 ENDM ;-----------BX LOGIOPB: DB DDLOG,0 DW 0,0 DB 0 DW DEFBFR DB 0 LOGSTAT: DW 0,0,0 ;------------------ ; ; MESSAGES N WARM BOOT JP Z,PAGE0 AND 5FH ;IGNORE CASE CP 'Y' ;IF YES THEN ABORT JP Z,PAGE0 CP 'I' JR NZ,ITRAP1 POPQU $ SUBTTL DATA AREA ;------------------------------------------------ ; ; THE REMAINING AREA DOES NOT HAVE TO ; BELONG --------------------------- ; ; RESERVE DRIVE PARAMETER BLOCKS ; ;-------------------------------------- ALLDPB: MACRO #D ; ;------------------ MSGLE: DM CR,LF,'LOAD ERROR' DSKEM: DB CR,LF,'Disk Error Status: ' DSKEB: DB '00H',CR,LF DM 'Abort, BC ;ELSE RESTORE & GOTO MONITOR TRAP POP HL POP AF JP 0038H ITRAP1: CP 'M' ;IF MONITOR THEN GOTO MONITOR TRAP JR NON THE DISK. ; ;------------------------------------------------ ;---------------------------------- ; ; DISK CONTROLLER;------------------------------------------- SDPBK: DW 26 ;SECTORS PER TRACK DB 3 ;BLOCK SHIFT FACTOR DB 7 ;BLOCK MASK  D#D(DD)DPB: ;ALLOCATION FOR DRIVE #D(DD) IF DD = 1 DS 2 ;SPT- SECTORS/TRACK DS 1 ;BSH- BLOCK SHIFT FACTOR DETERMINE Ignore, Retry, (BDOS) - ' IF INTCPTS ISCMSG: DM CR,LF,'ILL. SYS. CALL',CR,LF ENDIF IF INTRPTS ITMSG DM CR,LF,'UseZ,ITRAPR CALL GETMON ;INSURE MONITOR THERE POP BC POP HL POP AF JP 0F824H ITRAPR: POP BC ;IF CONTINUE THEN REST COMMAND BLOCK ; ;---------------------------------- BTDRV: DS 1 ;DRIVE # BTTRK: DS 2 ;TRACK # BTSEC: DS 2 ;SECTOR # BT DB 0 ;NULL MASK DW 242 ;DISK SIZE -1 DW 63 ;DIRECTORY MAX DB 11000000B ;ALLOC 0 DB 0 ;ALLOC 1 DW 16 ;CHECK SIZE D BY CLUSTER SIZE ; 1K= 3, 2K= 4, 4K= 5, 8K= 6, 16K= 7 DS 1 ;BLM- BLOCK MASK ; 1K = 7, 2K= 15, 4K= 31, 8K= 63, 16K= 12r' ILLIM DM CR,LF,'Unsupported' IQMSG DM ' Interrupt: Abort? (Y/N) - ' ENDIF ;---------------------------- ; ; ID SORE & RETURN POP HL POP AF EI ;RE-ENABLE INTERRUPTS RET ;************************************** ; ; UNSUPPORTEDFLG DS 1 ;FLAGS BTDMA: DS 2 ;SYSTEM TRANSFER ADDR BTDMAX DS 1 ;DMA EXTENDED ADDRESS ; DTPTR: DS 2 ;DRIVE TABLE PTR LOGR DW 2 ;TRACK OFFSET ;------------------------------------------- ; ; DEFAULT HARD DISK PARAMETER BLOCK ; ;-----------7 DS 1 ;EXM- EXTENT MASK ; DSM < 256 : 1K= 0, 2K= 1, 4K= 3, 8K= 7, 16K= 15 ; DSM > 255 : 2K= 0, 4K= 1, 8K= 3, 16K= 7 ECTOR LABEL ; ;---------------------------- JADEID: DB 'Jade DD ' IDSZE: EQU $-JADEID ;-------------------------------- INTERRUPT ; ;************************************** ILLINT: PUSH AF ;SAVE ALL 8080 REGS PUSH HL PUSH BC LD HL,ILLIMQ: DS 1 ;LOG ON REQUEST REG. DVRTPTR DS 2 DVRXADR DS 2 IF INTCPTS ;---------------------------- ; ; CLOCK BUFFER -------------------------------- HDPBK: DW 128 ;SECTORS PER TRACK (LOGICAL) (SPT) DB 5 ;BLOCK SHIFT FACTOR (BSH) DB 31  DS 2 ;DSM- DRIVE STORAGE SIZE (IN CLUSTERS) ; INT(((#_TRACKS - OFF) * SPT * BYTES PER SECTOR) / CLUSTER SIZE) -1 DS 2 ;DRM------ ; ; DRIVE PARAMETER HEADER AREA ; 1 PER DRIVE ; ;-------------------------------------- ALLDPH: MACRO #D D#D(DD)DP ;NOTIFY USER OF INT JR IQCONT SUBTTL DATA CONSTANTS ;------------------------------------------------ ; ; MODE 2 INT; ;---------------------------- CLKBFR: DS 13 ROMSAV DS 1 ;ROM SWAP SAVE OF ORIGINAL ROM ENDIF ;----------------;BLOCK MASK (BLM) DB 1 ;NULL MASK (EXM) DW 1015 ;DISK SIZE (CLUSTERS -1) (DSM) DW 1152 / 2 ;DIRECTORY MAX (DRM) ------ ; ; USER INTERRUPT ; ;-------------------------------------- ITRAP: PUSH AF ;SAVE USED REGISTERS PUSH HL PUSHDB 0FFH ;ALLOCATION 0 (AL0) DB 10000000B ;ALLOCATION 1 (AL1) DW 0 ;CHECK SIZE (CKS) DW 2 ;TRACK OFFSET (OFF)  ;------------------------------------------- ; ; DEFAULT FLOPPY DISK PARAMETER BLOCK ; IBM 3740 SINGLE DENSITY FORMAT ; !0 ( ) *!+",#-$.%/ &0 '- DIRECTORY SIZE -1 DS 2 ;AL0,1- DIRECTORY ALLOCATION ; 1 MSB PER DIRECTORY CLUSTER ALLOCATED DS 2 ;CKS- # DIRECTORY SEC ; ;************************************************************* ; REVISIONS: ; ; 2.2.0 - RELEASE ; ; 2.2.3 - SWAPPED åN 84 GRH ; Change floppy disk drivers to relate to ISASI control of JADE ; FDC. ; Change IOPB sector value from physicalTORS CHECKED ; (DRM +1) / 4 DS 2 ;OFF- # RESERVED TRACKS (USUALLY 2) DPBSZ EQU $ - D0DPB ELSE DS DPBSZ ENDIF DCM & BIOS SECTORS ON DISK, ALLOWING A ; LARGER BIOS ALLOCATION ON THE DISK. ; ; 2.2.4 - ADDED NAKED TERMINAL DRIVERS & Iå sector (1..n) to logical ; sector value (0..n-1). This maintains more uniformity in ; parameter passing between hard di*********************************************************** ; ; (c) 1981 GRH Electronics, CUPERTINO, CA ; ;*************OBYTE IN ; ANTICIPATION OF THE MONITOR. ALSO, ALL REFERENCES ; REQUIRING THE I/O PROMS TO BOOT HAS BEEN REMOVED. ; ;åsk & JADE floppy IOPBs. ; Vector I/O routines to monitor rom routines. ; ; 2.03 - 4 JUN 84 GRH ; Add bells & whistles agai************************************************ ; ; CONFIGURATION: ; ; CPM ISASI ; DRIVE DRIVE USAGE IF HARDBT ;HARD  CONMSG BIOS TOO BIG ENDIF END  2.2.5 - RECONFIGURE FOR 62K SYSTEM. ; ; 2.2.6 - 20 FEB 83 ; DOUBLE D REV C UPGRADE. CHANGE BOARD STATUS PORT BITS. ; ; 2.2ån. ; Move to 61k system. ; ; 2.04 - 30 MAR 85 GRH ; Implemented hard disk drive 1 as C: & D:. ; Implemented the Logon funDISK BOOT CONFIG. ; A 0 SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; B 1 SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 0 ; Cå.7 - 8 MAR 83 GRH ; ADDED CLOCK/CALENDAR DRIVER, SYSTEM CALL INTERCEPT, ; ILLEGAL SYSTEM CALL MESSAGE, CHANGED BIOS SIZE TO ENction for the hard disk. ; Implemented user friendly disk error options: Abort, Retry, Ignore. ; VERSN EQU '04' ; ;******** 2 SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; D 3 SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ; E 4 JADE FLOPPY PHYSICAåD ; OF INITIALIZED DATA AREA. RESTRUCTURE MODULES. ; ; 2.28 - 22 APR 83 GRH ; CHANGED DEFINITIONS TO ALLOW BIG DIRECTORIESå***************************************************************** SUBTTL SYSTEM DECLARATIONS ;-----------------------------L DRIVE 0 ; F 5 JADE FLOPPY PHYSICAL DRIVE 1 ; 6 JADE FLOPPY PHYSICAL DRIVE 2 ; 7 JADE FLOPPY PHYSICAL DRIVE 3 å. ; DISALLOWED DRIVES C & D. ; ; 2.29 - 3 SEP 83 GRH ; Changed Rev # for blocked DCM. Enables IBM system 34 ; 256 bytes p TITLE CUSTOMIZED BIOS FOR M5B LIST NOCOND LIST OFF ;********************************* ; ; ASSEMBLY PARAMETERS ; ;*****--------- ; ; DISK OPERATING SYSTEM ADDRESSES ; ;-------------------------------------- NKSYS: EQU 61 ;SYSTEM SIZE IN K  ELSE ; A 4 JADE FLOPPY PHYSICAL DRIVE 0 ; B 5 JADE FLOPPY PHYSICAL DRIVE 1 ; 6 JADE FLOPPY PHYSICAL DRIVE 2 åer sector disks to be read. ; ; 1.10 - 23 SEP 83 GRH ; Move clock-calendar routines to ROM. Add Interrupt handler ; (Mode **************************** FALSE EQU 0 TRUE EQU NOT FALSE ;====================================== ; ; CONDITIONAL ASSEMBLBYTES KBYTE: EQU 1024 CPMSZ: EQU KBYTE*NKSYS CPMBS: EQU CPMSZ - (20 * KBYTE) ; CP/M BIAS VALUE CCP: EQU CPMBS+3400H ;ADDR OF ; 7 JADE FLOPPY PHYSICAL DRIVE 3 ; C 0 SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; D 1 SIDE 2 & 3 OF HARD DISK PHå2). Change Revision display of sign-on (separate CBIOS rev). ; ; 2.00 - 24 MAR 84 GRH ; Modify for hard disk ; ; 2.01 - 2Y FLAGS ; ;====================================== SHORT EQU TRUE ;SHORT BIOS (REMOVES UNESENTIAL CODE) LSTINC EQU FALSE ;L CCP BDOS: EQU CPMBS+3C00H ;ADDRESS OF BDOS BIOS: EQU CPMBS+4A00H ;ADDRESS OF BDOS BIOSR: EQU 1000H-BIOS ; PAGE0: EQU 0 ;SYSICAL DRIVE 0 ; E 2 SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; F 3 SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ENDIFå8 APR 84 GRH ; Change hard disk DPB to reflect half size directory, but keep ; allocation for 1k directory ; ; 2.02 - 2 JUIST INCLUDE FILES HARDBT EQU TRUE ;HARD DISK BOOT (FALSE= FLOPPY BOOT) USEMON EQU TRUE ;USE MONITOR ROM I/O ROUTINES IF TRUEENDM DD DL 1 REPT NDRVS ALLDPB 0123456789ABCDEF DD DL DD + 1 ENDM IF (($ AND 7FFFH) >= 7800H) OR ($ < 7FFFH)  INTRPTS EQU TRUE ;ENABLE INTERRUPT PROCESSING WHISTLE INTCPTS EQU TRUE ;ENABLE SYSTEM CALL INTERCEPT WHISTLE LIST ON ;**å"0 ( ) *!+",#-$.%/ &0 'TART OF CP/M RAM IOBYTE: EQU PAGE0 + 3 ;IOBYTE ADDR DEFDRV: EQU PAGE0 + 4 ;DEFAULT DRIVE PARAM ADDR DEFBFR EQU PAGE0 + 80H ;D ALL BIOS PARAMS ; ;-------------------------------------------------------------------- INIT: LD SP,DEFBFR ;USE PAGE 0 FOR CHARS ; ;**************************** LF: EQU 0AH CR: EQU 0DH CTRLZ: EQU 1AH ; ; INCLUDE JDDCONT.DEF ; INCLUDE MONBOA LD BC,DEFBFR ;READ BOOT DIRECTORY CALL SETDMA LD C,BTDIRS CALL SETSEC LD C,0 ELSE LD C,1 ENDIF CALL SETTRKEFAULT BUFFER TPA: EQU 100H ; ; OTHER DECLARATIONS ; DEFIOB: EQU 80H ;INITIAL IOBYTE VALUE (LPT ON) DFDRV: EQU 0 ;INIT STACK CALL GETMON ;MAKE SURE BOOT ROM IS DISABLED LD A,DEFIOB ;INIT I/O BYTE LD (IOBYTE),A LD A,DFDRV ;INIT DEFRD.DEF ; INCLUDE IOBOARD.DEF ; INCLUDE NAKEDT.DEF ; INCLUDE ISASI.DEF ; INCLUDE CLOCK.DEF IF NOT LSTINC LIST OFF END IF HARDBT CALL DISKRD JR NZ,WEROR ENDIF LD BC,CCP ;SET LOAD ADDR CALL SETDMA IF HARDBT LD A,(DEFBF** BIOSSZ: DW BIOSND - BIOS ;BIOS MODULE SIZE IN BYTES BIOSST: DW BIOS ;BIOS MODULE LOAD ADDR FOR SBD INIT1: JR INIT ;-AULT DRIVE LD (DEFDRV),A ; ; SEND SYSTEM SIGN-ON ; CLOGO: LD HL,MSGSO CALL EDITOR LD HL,(BIOS+4) ;MODIFY COLD STARIF *INCLUDE JDDCONT.DEF *INCLUDE MONBOARD.DEF *INCLUDE IOBOARD.DEF *INCLUDE NAKEDT.DEF *INCLUDE ISASI.DEF *INCLUDE CLOCK.DR + BTCCPO) ;PICK UP START OF CP/M IMAGE FROM DIRECTORY INC A ;OFFSET FOR READ DECRIMENT LD C,A ELSE LD C,2 ;START W--------------------------------- ; ; DISK CONTROLLER COMMAND BLOCK ; ;---------------------------------- BTDRV: DB 0 ;DRRECTORY SECTOR BTCCPO EQU 3 ;OFFSET TO CCP ENTRY IN SYS TRKS DIRECTORY IF HARDBT LASTSEC EQU 47 ;LAST BOOT SECTOR ELSE T TO WARM START LD (BIOS+1),HL JP WARM ; ; SIGN-ON MESSAGE ; MSGSO: DB CR,LF DB CPMSZ / (KBYTE * 10) + '0' DB (CPMEF LIST ON SUBTTL BIOS CODE ORG BIOS ;---------------------------- ; ; BIOS JUMP VECTOR TABLE ; ;----------------ITH SECTOR #2 ENDIF CALL SETSEC ; ; READ CCP/BDOS ; WREAD: CALL DISKRD JR NZ,WEROR ;IF ERROR THEN EXIT LD A,(BIVE # BTTRK: DB 0 ;TRACK # BTSEC: DB 0 ;SECTOR # ;-------------------------------------- ; ; OTHER BIOS VARS NEEDING LASTSEC EQU 45 ;LAST BOOT SECTOR ENDIF ;************************************************************************* ; ; THSZ MOD (KBYTE * 10)) / KBYTE + '0' DB 'K CP/M-80 Vers 2.2',CR,LF DB 'M5b CBIOS Vers 2.' DM HIGH VERSN , LOW VERSN,CR,LTSEC) ;IF LAST SECTOR THEN DONE CP LASTSEC JR NC,WZRPG INC A ;NEXT SECTOR LD (BTSEC),A LD DE,SECSZ ;DMA := DMA + SEINIT ; ;-------------------------------------- BTDMA: DW 0 ;SYSTEM TRANSFER ADDR DTPTR: DW 0 ;DRIVE TABLE PTR LOGRQ: DB 0E FOLLOWING 2 PARAMETERS MUST REFLECT THE MAX DISK SIZE & ; THE MAX DIRECTORY SIZE. ; ;**************************************F DS DIRBF+SECSZ-$ ;FILL OUT DIRECTORY BUFFER TO 1 SECTOR SIZE ;------------------------------------------------------- JP COC ;CONSOLE OUTPUT JP LO ;PRINTER OUTPUT JP PUNCH JP READER JP HOME ;HOME SELECTED DRIVE JP SELDSK ;SELECT DICTOR SIZE LD HL,(BTDMA) ADD HL,DE LD (BTDMA),HL JR WREAD ; ; WARM BOOT ERROR, OUTPUT MSG & HALT ; WEROR: LD HL,MSG ;LOG ON REQUEST REG. ;-------------------------------------------------------------------------- ; ; DIRECTORY SECTOR B*********************************** ALLSIZ EQU 33 ;ALLOCATION BIT MAP SIZE (1 BYTE PER 8 CLUSTERS) CHKSIZ EQU 32 ;DIRECTORY CH--- ; ; WARM REBOOT ENTRY LOADS CCP,BDOS FROM DISK & ; SETS UP VARIABLES ; ;-----------------------------------------------SK DRIVE JP SETTRK ;SET TRACK # JP SETSEC ;SET SECTOR # JP SETDMA ;SET TRANSFER ADDR JP DISKRD ;PERFORM DISK READ LE ;OUTPUT ERROR MESSAGE CALL EDITOR HALT ; ; BOOT OK, INIT PAGE 0 ; WZRPG: LD A,0C3H ;INITIALIZE BIOS WARM START VECUFFER STARTS HERE AFTER CRUNCHING COLD START ; CODE. THIS BUFFER IS USED BY THE CP/M DIRECTORY CHECK ROUTINES THAT ; CHECK FECKSUMS ARRAY SIZE (1 BYTE PER DIR. SECTOR) ;**************************** ; ; ADDRESSES ; ;**************************** ----------- WARM: IF INTRPTS LD A,HIGH INTABL ;INIT INTERRUPT VECTORS LD I,A IM 2 ;USE MODE 2 IN A,INTMSK AND 7JP DISKWR ;PERFORM DISK WRITE JP LISTST ;RETURN LIST STATUS JP SECTRN ;TRANSLATE SECTOR RET ;FORMAT DUMMY ;*******TOR LD HL,BIOS + 3 LD (PAGE0),A LD (PAGE0 + 1),HL LD HL,BDOS + 6 ;INIT BDOS CALL VECTOR LD (PAGE0 + 5),A LD (PAGE0OR DISK CHANGE. ; ;-------------------------------------------------------------------------- DIRBF: EQU $ ;BUFFER BEGINNINGCALROM EQU 7 ;CALENDAR ROM SELECT # RDBENT EQU 0F800H ;READ CLOCK BUFFER ENTRY SETENT EQU RDBENT + 3 ;SET CLOCK ENTRY CALENFH ;ENABLE INT 7 OUT INTMSK,A IN A,MONSTS ;ENABLE MONITOR BOARD INTERRUPTS OR MONIE OUT MONSTS,A EI ENDIF LD******************************************************************* ; ; THESE BOOT PARAMS MUST RESIDE AS DEFINED RIGHT BEFORE  + 6),HL LD HL,DEFBFR ;SET DEFAULT SECTOR BUFFER LD (BTDMA),HL IF INTCPTS LD HL,(BDOS + 7) ;GET BDOS VECTOR LD (B ;-------------------------------------------------------------------- ; ; INIT - COLD START ENTRY FROM BOOT MUST SETT EQU RDBENT + 6 ;RETURN CALENDAR ENTRY TIMENT EQU RDBENT + 9 ;RETURN TIME ENTRY ;**************************** ; ; ASCII SP,DEFBFR ;SELECT TEMPORARY STACK CALL GETMON ;SELECT MONITOR ROM LD A,0 ;SET DRIVE 0 LD (BTDRV),A IF HARDBT THE COLD ; INIT ROUTINE START AND MUST BE IN THE 1ST SECTOR. ; THESE 2 WORDS ARE REFERENCED BY THE BOOT CODE IN ; ORDER TOIAL DEFAULT DRIVE SECSZ: EQU 128 FMTSZ: EQU 100H ;FORMAT BUFFER SIZE NDRVS: EQU 6 BTDIRS EQU 3 ;HARD DISK SYSTEM TRACKS DI FIND THE LOAD ADDRESS FOR THE BIOS & IT'S LENGTH. ; ;************************************************************************------------ JP INIT1 ;COLD START ENTRY JP WARM ;RELOAD CCP/BDOS JP CNSCK ;GET CONSOLE STATUS JP CI ;CONSOLE INPUT #0 ( ) *!+",#-$.%/ &0 'DOSV),HL ;PUT IN INTERCEPT CODE LD HL,INTCPT ;NOW PUT INTERCEPT VECTOR INTO BDOS VECTOR LD (BDOS + 7),HL IN A,(CLKDAT) ES JR LOG3 LOG2: SUB 2 ;ELSE BIAS DOWN TO HARD DISKS LOG3: ENDIF LD HL,LOGIOPB + PBSEC ;START WITH SECTOR 0 LD (H FLAGS FOR NOW LD HL,(BTDMA) ;SET DMA ADDR LD (IY + PBDMA),L LD (IY + [PBDMA + 1]),H LD (IY + PBDMAX),0 ;THIS BANK FTRNONE CALL DPBAD LD HL,HDPBK JR MOVDPB LG371: CALL TR3740 ;SET SECTOR TRANSLATE CALL DPBAD ;MOVE PARAMETERS INTO ;IF CLOCK NOT PRESENT THEN TURN OFF CLOCK DRIVE AND 11000000B ;TEST UNUSED BUT DRIVEN BITS (1S IF NOT THERE) LD A,38HL),0 CP 4 ;IF HARD DISK THEN JR NC,LOG4 RRCA ;IF ODD LOGICAL DRIVE THEN PUSH AF AND 80H ;SECTOR = 128 LD (HLOR NOW RWOPR: CALL HDEXEC ; DO OP LD A,(IY + PBSTAT) ;PASS STATUS BYTE TO DISK_ERROR() JR Z,DSKOK ;EXIT IF NO ERROR  DISK PAR BLK LD HL,SDPBK MOVDPB: LD BC,DPBSZ ;MOVE DRIVE TABLE TO CP/M DRIVE TABLE LDIR LD HL,(DTPTR) ;RETURN PTR TO RET Z POP HL ;BALANCE STACK FDSKER: LD HL,0 ;RETURN DPB_PTR = 0 FOR SELECT FUNCTION LD A,-1 ;RETURN -1 TO BDOS O),A POP AF AND 7FH ;MASK OUT BIT 7 LOG4: LD (LOGIOPB + PBDRV),A FDLOGR: CALL HDEXECL ;LOG ON DRIVE & RETURN IDENTITY CALL DSKER JR RWOPR ;SINCE RETURNED, DO RETRY DOFLOP: LD (IY + PBDRV),A LD A,(BTSEC) DEC A ;CHANGE TO LOGICAL S TABLE JP DSKOK ;********************************* ; ; SET 3740 SECTOR TRANSLATION ; EXIT - DE, HL= ? ; ;*********R A RET ;************************************************* ; ; SELECT DRIVE ; LOG-ON - SET DISK PARAMETER BLOCK ; ENFDRV) ;PASS IN DEFAULT DISK TO CCP LD C,A JP CCP SUBTTL DISK ROUTINES ;*************************** ; ; READ A DISK  SECTOR DATA JR Z,LOGCK LD A,(LOGIOPB + PBSTAT) ;PASS ERROR CODE TO DISK_ERROR() CALL DSKER JR FDLOGR ;RETURN HERE MEECTOR JR RWOPC ;----------------------------------------- ; ; NORMAL EXIT ; EXIT - A= 0 ; ;-------------------------************************ TR3740: LD DE,SDTRAN SETTR LD HL,(DTPTR) LD (HL),E INC HL LD (HL),D RET ;***************TRY- C= DRIVE # ; E= 0 IF NEVER LOGGED BEFORE ; EXIT - HL= PTR TO DPT OR 0 FOR ERROR ; ;***********************************SECTOR ; ;*************************** DISKRD: LD IY,IOPB ;SELECT READ OP LD (IY + PBCMD),RDCMD JR HDDO ;*********ANS TO RETRY ; ; CHECK FOR JADE ID ; LOGCK: LD HL,DEFBFR LD DE,JADEID LD B,IDSZE LOGID: LD A,(DE) ;IF NO MATCH THE****************** ; ; SET NO SECTOR TRANSLATION ; EXIT - HL, DE= ? ; ;********************************* TRNONE: LD DE,0 ************** SELDSK: LD HL,0 ;ASSUME ERROR LD A,C ;SET DRIVE # CP NDRVS ;IF NOT 0..(NUMBER_OF_DRIVES -1) THEN ERROR ******************* ; ; WRITE A DISK SECTOR ; ;**************************** DISKWR: LD IY,IOPB ;SELECT WRITE OP LD N ASSUME 3740 FORMAT CP (HL) JR NZ,LG3740 INC HL INC DE DJNZ LOGID ; ; DISKETTE CONTAINS ID. SET NO SECTOR TRANS DISK ERROR SUBR. ; QUERIES USER FOR ABORT (REBOOT), IGNORE (RETURN OK TO BDOS), ; RETRY (RETURNS TO CALLER) OR NORMAL BDOS  JR SETTR ;************************************** ; ; GET DRIVE PARAMETER BLOCK ADDR ; EXIT - DE= DPB PTR ; HL= ? ; RET NC LD (BTDRV),A ;STORE DRIVE # LD A,E ;SET LOG REQUEST VECTOR LD (LOGRQ),A RETDSK: LD A,(BTDRV) ;COMPUTE TAB(IY + PBCMD),WRCMD HDDO: LD A,(BTDRV) CP NDRVS ;IF RANGE ERROR THEN ABORT JP NC,FDSKER IF HARDBT CP 4 JR NC,DLATION ; CALL TRNONE CALL DPBAD ;GET ADDR OF DPB & MOVE DOWN DISK INFO TO IT LD HL,DEFBFR + DDDPB - DDBUF CALL MOVDPERROR (DEFAULT). ; ENTRY- A= ERROR CODE ; EXIT - A= FFH (DEFAULT), CHAR OTHERWISE ; HL= ? ; ;----------------------------- ;************************************** DPBAD: LD HL,(DTPTR) ;FETCH BASE ADDR LD DE,10 ;ADD OFFSET OF DPB PTR ADD HL,DE LE PTR LD L,A LD H,0 ADD HL,HL ;DISK # * 16 ADD HL,HL ADD HL,HL ADD HL,HL LD DE,D0DPH ADD HL,DE LD A,(LOGRQOFLOP ELSE CP 2 JR C,DOFLOP SUB 2 ;BIAS DOWN TO HARD DISK ADDRESS ENDIF SRL A ;0,1: DRV 0, 2,3: DRV 1 B ; ; IF DENSITY FLAG = SINGLE (0) AND HARD DISK FLAG = FALSE (0) THEN USE ; 3740 FORMAT ; LD A,(DEFBFR + DDDDF - DDBUF--------------------------------------- DSKER: LD HL,DSKEB ;POINT TO ERROR BYTE CALL PRHEX ;LOAD ERROR CODE INTO MESSAGE  LD E,(HL) ;FETCH DPB PTR INC HL LD D,(HL) RET ;*************************************** ; ; HOME DRIVE - TREAT ) ;RETURN TABLE PTR IF NOT 1ST LOG-ON AND 1 JR NZ,DSKOK ; ; READ IDENTITY SECTOR ; LD (DTPTR),HL ;SAVE DRIVE TABLE PTRLD (IY + PBDRV),A LD D,0 ;COMPUTE SECTOR RR D ;DRIVE BIT 0 -> SECTOR BIT 7 LD A,(BTSEC) DEC A ;CHANGE TO LOGICAL) AND 8 OR 4 CALL Z,TR3740 LD HL,(DTPTR) ;ELSE RETURN PTR TO TABLE JP DSKOK ; ; ASSUME 3740 FORMAT DISKETTE ; LG LD HL,DSKEM ;OUTPUT ERROR MESSAGE CALL EDITOR CALL CI ;GET USER RESPONSE PUSH AF ;SAVE CHAR LD C,A ;ECHO CHAR AS SEEK TRK 0 ; ;*************************************** HOME: LD C,0 ;***************************** ; ; SET TRACK #  LD A,(BTDRV) ;PERFORM DCM LOG-ON IF NOT HARDBT CP 2 ;IF FLOPPIES THEN JR NC,LOG2 ADD 4 ;BIAS UP TO FDC DRIV SECTOR AND 7FH OR D RWOPC: LD (IY + PBSEC),A LD A,(BTTRK) ;SET TRACK LD (IY + PBTRK),A LD (IY + PBFLG),0 ;NO3740: LD A,(BTDRV) ;IF HARD DISK THEN SKIP IF HARDBT CP 4 JR NC,LG371 ELSE CP 2 JR C,LG371 ENDIF CALL  CALL COC POP AF POP HL ;RETURN ADDRESS TO CALLING ROUTINE AND 5FH ;INSURE UPPER CASE CP 'I' ;IF IGNORE THEN R ;COND. JR (ON) JR Z,CLKON LD A,18H ;UNCOND. JR (OFF) (CAUSES JUMP TO ILLEGAL) CLKON: LD (INHCLK),A ENDIF LD A,(DEETURN NO ERROR JR Z,DSKOK CP 'A' ;IF ABORT THEN RE-BOOT JP Z,0 CP 'R' ;IF RETRY THEN PUSH HL ;RETURN TO CALLER ---------------- DSKOK: XOR A ;RETURN 0 RET ;-------------------------------------------------------------------- ; ;$0 ( ) *!+",#-$.%/ &0 '; ENTRY- C= TRACK # ; EXIT - A= C= TRACK # ; ;***************************** SETTRK: LD A,C LD (BTTRK),A RET ;******CALENT ;ROM ENTRY POINT CLK1: LD BC,CLKBFR ;READ CLOCK JR CLK2 ;************************************* ; ; RETURN TIMH ;MASK OFF OTHER NIBBLE CP 10 ;OFFSET IF > 9 JR C,NTALPH ADD 7 NTALPH: ADD '0' ;CONVERT TO ASCII LD (HL),A ;STACK EX (SP),HL JP (HL) ;EXECUTE ROM EXROMR: PUSH AF ;SAVE RETURN VALUE LD A,(ROMSAV) ;RESELECT ORIGINAL ROM OUT ROM*********************** ; ; SET SECTOR ; ENTRY- C= SECTOR # ; EXIT - A= C= SECTOR # ; ;***************************** SETSE FUNCTION 92H ; EXIT - A= SECONDS ; B= MINITS ; C= HOURS ; ;************************************* CLKTIM: LD HL,TIMENORE CHAR POP AF ;DATA INC HL ;NEXT CHAR RET ;********************************* ; ; HARD DISK EXECUTE SUBR ; EXITSEL,A POP AF ;RETURN VALUE RET ENDIF SUBTTL CHAR I/O ROUTINES ;************************** ; ; CONSOLE INPUT IS ALLWAYS FALSE (NOP). ; INHCLK: JR C,ILLEGC ; ; NOW CHECK FOR EXTENDED CALLS ; CP 8DH ;IF RETURN VERSION THEN RETURN T JR CLK1 ;************************************************************ ; ; READ CLOCK TIME FUNCTION 93H ; ENTRY- DE=  - NZ= ERRORS ; ;********************************* HDEXECL: LD HL,LIOPBAD ;USE LOGON IOPB JR HDEXEC1 HDEXEC: LD HL,I ; EXIT - A= CHAR ; ;************************** CI: IF USEMON CALL GETMON ;SWITCH IN MONITOR ROM JP 0F803H ;USE MONIT JR Z,RETVER CP 90H ;IF NOT CLOCK THEN ERR JR C,ILLEGC JR Z,CLKCAL ;IF CALENDAR THEN GET IT CP 92H JR C,CLKBC= ADDRESS ; ;***************************** SETDMA: LD (BTDMA),BC RET ;**********************************************PTR TO 13 BYTE BUFFER FOR CLOCK DATA ; ;************************************************************ CLKRDC: LD C,E ;SET UOPBADR ;OUTPUT IOPB ADDRESS TO ISASI HDEXEC1: LD B,3 HDX1: LD A,(HL) INC HL OUT (HDATA),A LD A,(HL) INC HL OUT (ITOR ELSE CALL CNSCK ;IF NO CHAR RDY THEN WAIT JR Z,CI IN A,NTD ;ELSE RETURN CHAR RET ENDIF ;************SET ;IF SET FUNCTION THEN SET CLOCK JR Z,CLKTIM ;IF TIME THEN GET IT CP 93H JR Z,CLKRDC ;IF READ CLOCK THEN GET IT ; ***************** ; ; SECTOR TRANSLATION ; ENTRY- DE= 0: NO XLATE, ELSE PTR TO XLATE TABLE ; BC= SECTOR # TO XLATE ; EXIT P PARAMETERS LD B,D LD HL,RDBENT JR CLK2 ;********************************************************** ; ; CLOCK SET **************************** ; ; RETURN CONSOLE STATUS ; EXIT - A= 0: NOT READY ; FFH: CHAR READY ; ;***************** ; ILLEGAL SYSTEM CALL ; ILLEGC: LD HL,ISCMSG ;OUTPUT WARNING CALL EDITOR LD L,A ;BC = HL = A = 0 LD H,A LD C,A LD- HL= XLATED SECTOR OR (BC) + 1 ; BC= UNCHANGED ; A, DE= ? ; ;************************************************************FUNCTION 91H ; ENTRY- DE= CLOCK IMAGE BUFR PTR (13 BYTES LONG) ; ;**********************************************************  HDX3: IN A,(HSTATUS) BIT HBUSYB,A JR NZ,HDX3 AND (1 SHL HERRB) + (1 SHL HFERRB) ;CHECK FOR ERRORS RET IF INTCPT*********************** CNSCK: IF USEMON CALL GETMON JP 0F812H ELSE IN A,NTS ;IF DATA NOT READY THEN RETURN 0  B,A RET ;***************************************** ; ; CDOS RETURN VERSION SYSTEM CALL ; MAKES CLOCK/CALENDAR WORK. *** SECTRN: LD A,D ;IF TABLE ADDR = 0 THEN NO TRANSLATION OR E JR Z,NOTRAN EX DE,HL ADD HL,BC LD L,(HL) LD H,0  CLKSET: LD C,E ;SET UP PARAMETERS LD B,D LD HL,SETENT CLK2: LD A,CALROM ;*****************************************S ;*************************************************************************** ; ; SYSTEM CALL INTERCEPT ROUTINE CHECKS FORAND 1 SHL NTRDY TTOST1: RET Z LD A,-1 ;ELSE RETURN -1 RET ENDIF ;*************************************** ; ; CO ; EXIT - B= 1 ; ;***************************************** RETVER: LD B,1 RET SUBTTL MISC I/O DRIVERS ;************** RET ; NOTRAN: LD HL,1 ADD HL,BC RET ;************************************** ; ; LOAD HEX DATA INTO MEMORY SUBR ;***************** ; ; EXECUTE ROM ROUTINE ; ENTRY- HL= ENTRY ADDRESS ; A= ROM # ; EXIT - ENTRY ROM RE-SELECTED ; ;****** ILLEGAL BDOS CALLS & ; PRINTS MESSAGE IF ILLEGAL. ALSO IMPLEMENTS CDOS CLOCK/CALENDAR ; SYSTEM CALLS FOR ASMB. ; ;*******NSOLE OUTPUT ; ENTRY- C= CHAR TO OUTPUT ; ;*************************************** COC: IF USEMON CALL GETMON JP 0F8*************************** ; ; CLOCK ROUTINES ; ;***************************************** ; ; RETURN CALENDAR FUNCTION 9 ENTRY- A= DATA ; HL= PTR TO MEMORY ; EXIT - A= DATA ; HL= HL + 2 ; ;************************************** PRHEX: CALL **************************************************** EXROM: PUSH AF ;SAVE NEW ROM IN A,ROMSEL ;SAVE CURRENT ROM LD (RO******************************************************************** INTCPT: LD A,C ;CHECK CALL VALIDITY CP 41 ;IF <= 40 TH09H ELSE CALL NTOST ;IF BUSY THEN WAIT OR A JR Z,COC LD A,C OUT NTD,A RET ;*****************************0H ; EXIT - A= DAY ; B= MONTH ; C= YEAR ; L= DAY OF WEEK ; ;***************************************** CLKCAL: LD HL,PRDIG ;DO HIGH NIBBLE PRDIG: RLCA ;POSITION NIBBLE INTO LOW 4 BITS RLCA RLCA RLCA PUSH AF ;SAVE DATA AND 0FMSAV),A POP AF ;SELECT NEW ROM AND ROMSMK OUT ROMSEL,A PUSH HL ;SAVE ENTRY LD HL,EXROMR ;PUT RETURN ADDR ON STEN OK BDOSV EQU $ + 1 JP C,BDOS + 11H ;THIS ADDR MODIFIED BY WARM BOOT RTN ; ; THE FOLLOWING CONDITIONAL JUMP IS MODIFIEEC: LD A,C LD (BTSEC),A RET ;***************************** ; ; SET TRANSFER ADDR ; ENTRY- BC= ADDRESS ; EXIT - HL= D TO AN UNCONDITIONAL JUMP BY ; THE WARM BOOT ROUTINE IF THE CLOCK/CALENDAR BOARD IS NOT PRESENT ; IF NOT MODIFIED, THEN IT HCMD),A HDX2: IN A,(HSTATUS) BIT HBUSYB,A JR NZ,HDX2 DJNZ HDX1 LD A,HEXEC ;NOW EXECUTE THE IOPB OUT (HCMD),A %0 ( ) *!+",#-$.%/ &0 '****************** ; ; RETURN CONSOLE OUTPUT READY STATUS ; EXIT - A= 0: BUSY, FFH: READY ; ;******************************E -1 DW 63 ;DIRECTORY MAX DB 11000000B ;ALLOC 0 DB 0 ;ALLOC 1 DW 16 ;CHECK SIZE DW 2 ;TRACK OFFSET ;---------*************************** ; ; GET MONITOR PROM SUBR ; EXIT - A= ? ; ;**************************** GETMON: LD A,XMONROMrror Status' DSKEB: DB '00H',CR,LF DM 'Abort, Ignore, Retry, (BDOS) : ' IF INTCPTS ISCMSG: DM CR,LF,'ILL. SYS. CALL',CR,***************** NTOST: IN A,NTS CPL ;REVERSE SENSE AND 1 SHL NTBSY JR TTOST1 ENDIF ;************************---------------------------------- ; ; DEFAULT HARD DISK PARAMETER BLOCK ; ;------------------------------------------- HDP OUT (ROMSEL),A RET ;***************************************************** ; ; MESSAGE EDITOR ; ENTRY- HL= TEXT PTR LF ENDIF IF INTRPTS ITMSG DM CR,LF,'User' ILLIM DM CR,LF,'Unsupported' IQMSG DM ' Interrupt: Abort? (Y/N) - ' END***************** ILLINT: PUSH AF ;SAVE ALL 8080 REGS PUSH HL PUSH BC LD HL,ILLIM ;NOTIFY USER OF INT JR IQCONT BK: DW 128 ;SECTORS PER TRACK (LOGICAL) (SPT) DB 5 ;BLOCK SHIFT FACTOR (BSH) DB 31 ;BLOCK MASK (BLM) DB 1 ;NULL MAS(BIT 7= 1: TERMINATOR) ; EXIT - REGS= ? ; ;***************************************************** EDITOR: LD C,(HL) ;MESSAGEIF ;---------------------------- ; ; ID SECTOR LABEL ; ;---------------------------- JADEID: DB 'Jade DD ' IDSZE: EQU SUBTTL DATA CONSTANTS ;------------------------------------------------ ; ; MODE 2 INTERRUPT VECTOR TABLE ; ;------------F RET ;************************************** ; ; PUNCH DRIVER ; ENTRY- C= CHAR TO OUTPUT ; ;***********************K (EXM) DW 1015 ;DISK SIZE (CLUSTERS -1) (DSM) DW 1152 / 2 ;DIRECTORY MAX (DRM) DB 0FFH ;ALLOCATION 0 (AL0) DB 1 EDIT LOOP PUSH HL ;SAVE PTR CALL COC POP HL BIT 7,(HL) ;IF BIT 7 SET THEN RETURN RET NZ INC HL ;ELSE PRINT N $-JADEID ;-------------------------------------- ; ; DRIVE PARAMETER HEADER AREA ; 1 PER DRIVE ; ;------------------------------------------------------- IF $ AND 0FFH ;START ON EVEN PAGE BOUNDARY DS 100H - ($ AND 0FFH) ENDIF INTABL: RE*************** PUNCH: RET ;************************************ ; ; PRINTER DRIVER ; ENTRY- C= CHAR TO OUTPUT ; ;***0000000B ;ALLOCATION 1 (AL1) DW 0 ;CHECK SIZE (CKS) DW 2 ;TRACK OFFSET (OFF) ;---------------------------------------------------- ALLDPH: MACRO #D D#D(DD)DPH: ;DRIVE PARAMETER HEADER FOR DRIVE #D(DD) DW 0 ;SECTOR TRAN TBL (OR 0 IF PT 7 ;1ST 7 ARE UNSUPPORTED DW ILLINT ENDM DW ITRAP ;INT 8 IS USER INTERRUPT ENDIF ;--------------------------********************************* LO: IF USEMON CALL GETMON JP 0F80FH ELSE CALL LISTST ;IF BUSY THEN WAIT JR Z ; ; HARD DISK DATA ; ;--------------------------------- IOPB: REPT 16 ;;HARD DISK IOPB DB 0 ENDM IOPBADR: DB LOW---------------------------------- ITRAP: PUSH AF ;SAVE USED REGISTERS PUSH HL PUSH BC LD HL,ITMSG ;NOTIFY USER IQCNO XLATE) DW 0 ;SCRATCH AREA DW 0 ;" DW 0 ;" DW DIRBF ;DIRECTORY BUFFER PTR DW D#D(DD)DPB ;DRIVE PARAMETER BLK PT------------ ; ; 3740 SECTOR TRANSLATION TABLE ; **** CP/M SINGLE DENSITY **** ; ;-------------------------------------- S,LO LD A,C ;OUTPUT CHAR SET 7,A OUT CENTOUT,A RES 7,A ;OUTPUT LOW TRUE STROBE OUT CENTOUT,A SET 7,A OUT CENT IOPB ;HARD DISK IOPB POINTER TABLE DB HIOPBL DB HIGH IOPB DB HIOPBH DB 0 DB HIOPBX LOGIOPB: DB LOGCMD ;READ COMONT: CALL EDITOR LD HL,IQMSG ;QUERY USER CALL EDITOR CALL CI CP 3 ;IF CTRL-C THEN WARM BOOT JP Z,PAGE0 AND 5FH R IF (HARDBT AND (DD < 5)) OR (NOT HARDBT AND (DD > 2)) DW 0 ;NO CHECKS ON HARD DISK ELSE DW D#D(DD)CHK ;DRIVE DISDTRAN: DB 1,7,13,19,25,5,11,17,23,3,9,15 DB 21,2,8,14,20,26,6,12,18,24,4,10 DB 16,22 ;---------------------------------OUT,A RET ENDIF ;***************************************** ; ; RETURN LIST DEVICE STATUS ; EXIT - A= 0: BUSY, FFH:MAND DB 4 ;DRIVE DW 0 ;TRACK DW 0 ;SECTOR DB 0 ;FLAGS (LOGON) DW DEFBFR ;DMA ADDR DB 0 ;BANK ADDR DS (LOGIOP ;IGNORE CASE CP 'Y' ;IF YES THEN ABORT JP Z,PAGE0 CP 'I' JR NZ,ITRAP1 POP BC ;ELSE RESTORE & GOTO MONITOR TRAK CHECKSUMS ARRAY PTR ENDIF DW D#D(DD)ALL ;DRIVE CLUSTER ALLOCATION BIT MAP PTR ENDM DD DL 1 REPT NDRVS ALLDPH 0---------- ; ; DEFAULT FLOPPY DISK PARAMETER BLOCK ; IBM 3740 SINGLE DENSITY FORMAT ; ;------------------------------------READY ; ;***************************************** LISTST: IF USEMON CALL GETMON JP 0F827H ELSE IN A,CENTS ;IFB + 16) - $ LIOPBAD: DB LOW LOGIOPB ;LOGON DISK IOPB POINTER TABLE DB HIOPBL DB HIGH LOGIOPB DB HIOPBH DB 0 DB HIP POP HL POP AF JP 0038H ITRAP1: CP 'M' ;IF MONITOR THEN GOTO MONITOR TRAP JR NZ,ITRAPR CALL GETMON ;INSURE MON123456789ABCDEF DD DL DD + 1 ENDM BIOSND EQU $ SUBTTL DATA AREA ;------------------------------------------------ ; ;------- SDPBK: DW 26 ;SECTORS PER TRACK DB 3 ;BLOCK SHIFT FACTOR DB 7 ;BLOCK MASK DB 0 ;NULL MASK DW 242 ;DISK SIZ BUSY THEN RETURN 0 CPL ;INVERT THE SENSE AND 1 SHL CENTBSY RET Z LD A,0FFH ;ELSE RETURN -1 RET ENDIF ;*OPBX ;------------------ ; ; MESSAGES ; ;------------------ MSGLE: DM CR,LF,'LOAD ERROR' DSKEM: DB CR,LF,'Disk EITOR THERE POP BC POP HL POP AF JP 0F824H ITRAPR: POP BC ;IF CONTINUE THEN RESTORE & RETURN POP HL POP AF EI ********** ; ; READER DRIVER - DUMMY ; EXIT - A= CTRL-Z ; ;********************************** READER: LD A,CTRLZ ;FAKE EO ;RE-ENABLE INTERRUPTS RET ;************************************** ; ; UNSUPPORTED INTERRUPT ; ;*********************EXT CHAR JR EDITOR IF INTRPTS SUBTTL INTERRUPTS ;-------------------------------------- ; ; USER INTERRUPT ; ;----&0 ( ) *!+",#-$.%/ &0 ' THE REMAINING AREA DOES NOT HAVE TO ; BELONG ON THE DISK. ; ;------------------------------------------------ IF INTCå16K= 15 ; DSM > 255 : 2K= 0, 4K= 1, 8K= 3, 16K= 7 DS 2 ;DSM- DRIVE STORAGE SIZE (IN CLUSTERS) ; INT(((#_TRACKS - OFF) *åPTS ;---------------------------- ; ; CLOCK BUFFER ; ;---------------------------- CLKBFR: DS 13 ROMSAV DS 1 ;ROM SWAå SPT * BYTES PER SECTOR) / CLUSTER SIZE) -1 DS 2 ;DRM- DIRECTORY SIZE -1 DS 2 ;AL0,1- DIRECTORY ALLOCATION ; 1 MSB PER DåååIRECTORY CLUSTER ALLOCATED DS 2 ;CKS- # DIRECTORY SECTORS CHECKED ; (DRM +1) / 4 DS 2 ;OFF- # RESERVED TRACKS (USUALLY 2åå ; ;------------------------------------------------ ALLDAL: MACRO #D IF (HARDBT AND (DD < 5)) OR (NOT HARDBT AND (DD > 2)å) DPBSZ EQU $ - D0DPB ELSE DS DPBSZ ENDIF ENDM DD DL 1 REPT NDRVS ALLDPB 0123456789ABCDEF DD DL DD + 1 ENåå) D#D(DD)ALL: DS 128 ;ALLOCATION FOR DRIVE #D(DD) ELSE D#D(DD)ALL: DS ALLSIZ ;DISK CLUSTER ALLOCATION BIT MAP FOR DRIVE #Dååå(DD) D#D(DD)CHK DS CHKSIZ ;DIRECTORY CHECKSUMS STORAGE (1 BYTE PER DIR SECTOR) ENDIF ENDM DD DL 1 REPT NDRVS ALLDAååååL 0123456789ABCDEF DD DL DD + 1 ENDM ;-------------------------------------- ; ; RESERVE DRIVE PARAMETER BLOCKS ; ;-åååå------------------------------------- ALLDPB: MACRO #D D#D(DD)DPB: ;ALLOCATION FOR DRIVE #D(DD) IF DD = 1 DS 2 ;SPT- SEååååCTORS/TRACK DS 1 ;BSH- BLOCK SHIFT FACTOR DETERMINED BY CLUSTER SIZE ; 1K= 3, 2K= 4, 4K= 5, 8K= 6, 16K= 7 DS 1 ;BLM- BååååLOCK MASK ; 1K = 7, 2K= 15, 4K= 31, 8K= 63, 16K= 127 DS 1 ;EXM- EXTENT MASK ; DSM < 256 : 1K= 0, 2K= 1, 4K= 3, 8K= 7, ååP SAVE OF ORIGINAL ROM ENDIF ;------------------------------------------------ ; ; DRIVE ALLOCATION AREAS DECLARED åDM IF ($ > 0F800H) OR ($ < 8000H) CONMSG BIOS TOO BIG ENDIF END '0 ( ) *!+",#-$.%/ &0 'åååååååååååååååååååååååååååååååååååååååååååååååå(0 ( ) *!+",#-$.%/ &0 'åååååååååååååååååååååååååååååååååååååååååååååååå)0 ( ) *!+",#-$.%/ &0 'åååååååååååååååååååååååååååååååååååååååååååååååå*0 ( ) *!+",#-$.%/ &0 'åååååååååååååååååååååååååååååååååååååååååååååååå+0 ( ) *!+",#-$.%/ &0 'åååååååååååååååååååååååååååååååååååååååååååååååå,0 ( ) *!+",#-$.%/ &0 'åååååååååååååååååååååååååååååååååååååååååååååååå-0 ( ) *!+",#-$.%/ &0 'åååååååååååååååååååååååååååååååååååååååååååååååå.0 ( ) *!+",#-$.%/ &0 'åååååååååååååååååååååååååååååååååååååååååååååååå/0 ( ) *!+",#-$.%/ &0 'åååååååååååååååååååååååååååååååååååååååååååååååå00 ( ) *!+",#-$.%/ &0 'åååååååååååååååååååååååååååååååååååååååååååååååå10 ( ) *!+",#-$.%/ &0 'åååååååååååååååååååååååååååååååååååååååååååååååå20 ( ) *!+",#-$.%/ &0 'åååååååååååååååååååååååååååååååååååååååååååååååå30 ( ) *!+",#-$.%/ &0 'åååååååååååååååååååååååååååååååååååååååååååååååå40 ( ) *!+",#-$.%/ &0 'åååååååååååååååååååååååååååååååååååååååååååååååå50 ( ) *!+",#-$.%/ &0 'åååååååååååååååååååååååååååååååååååååååååååååååå60 ( ) *!+",#-$.%/ &0 'åååååååååååååååååååååååååååååååååååååååååååååååå70 ( ) *!+",#-$.%/ &0 'åååååååååååååååååååååååååååååååååååååååååååååååå80 ( ) *!+",#-$.%/ &0 'åååååååååååååååååååååååååååååååååååååååååååååååå90 ( ) *!+",#-$.%/ &0 'åååååååååååååååååååååååååååååååååååååååååååååååå:0 ( ) *!+",#-$.%/ &0 'åååååååååååååååååååååååååååååååååååååååååååååååå;0 ( ) *!+",#-$.%/ &0 'åååååååååååååååååååååååååååååååååååååååååååååååå<0 ( ) *!+",#-$.%/ &0 'åååååååååååååååååååååååååååååååååååååååååååååååå=0 ( ) *!+",#-$.%/ &0 'åååååååååååååååååååååååååååååååååååååååååååååååå>0 ( ) *!+",#-$.%/ &0 'åååååååååååååååååååååååååååååååååååååååååååååååå?0 ( ) *!+",#-$.%/ &0 'åååååååååååååååååååååååååååååååååååååååååååååååå@0 ( ) *!+",#-$.%/ &0 'ååååååååååååååååååååååååååååååååååååååååååååååååA0 ( ) *!+",#-$.%/ &0 'ååååååååååååååååååååååååååååååååååååååååååååååååB0 ( ) *!+",#-$.%/ &0 'ååååååååååååååååååååååååååååååååååååååååååååååååC0 ( ) *!+",#-$.%/ &0 'ååååååååååååååååååååååååååååååååååååååååååååååååD0 ( ) *!+",#-$.%/ &0 'ååååååååååååååååååååååååååååååååååååååååååååååååE0 ( ) *!+",#-$.%/ &0 'ååååååååååååååååååååååååååååååååååååååååååååååååF0 ( ) *!+",#-$.%/ &0 'ååååååååååååååååååååååååååååååååååååååååååååååååG0 ( ) *!+",#-$.%/ &0 'ååååååååååååååååååååååååååååååååååååååååååååååååH0 ( ) *!+",#-$.%/ &0 'ååååååååååååååååååååååååååååååååååååååååååååååååI0 ( ) *!+",#-$.%/ &0 'ååååååååååååååååååååååååååååååååååååååååååååååååJ0 ( ) *!+",#-$.%/ &0 'ååååååååååååååååååååååååååååååååååååååååååååååååK0 ( ) *!+",#-$.%/ &0 'ååååååååååååååååååååååååååååååååååååååååååååååååL0 ( ) *!+",#-$.%/ &0 'åååååååååååååååååååååååååååååååååååååååååååååååå