IMD DMK Tracks:77x10816 DSMD  Disk Descriptor30 00M4 0 %+ &, !'- "(. #)/ $*00 %+ &, !'- "(. #)/ $*00 %+ &, !'- "(. #)/ $*0HBIO300 Z80 HBIO300 Z80 HBIO305 Z80HBIO305 Z80 !HBIO310 Z80HBIO310 Z80wHBIO311 Z80HBIO311 Z80FBIO306 Z80STUVWXYZFBIO306 Z80[\]^_`abFBIO306 Z80cdefghijFBIO306 Z800klmENTIAL CODE) LSTINC EQU FALSE ;LIST INCLUDE FILES HARDBT EQU TRUE ;HARD DISK BOOT (FALSE= FLOPPY BOOT) USEMON EQU TRUE ;US3 OF HARD DISK PHYSICAL DRIVE 0 ; C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; D SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 HBIO305 Z80n"#$%&'(BIOSFUNSDOC)*HBIO314 Z80+,-./01uHBIO313 Z8023456789HBIO311 Z80UFBIO305 Z80FBIO305 Z80FBIO305 Z80nBFTST C hnopqrstHBIO314 Z80vwxyz{|}HBIO314 Z80~HBIO314 Z80'E MONITOR ROM I/O ROUTINES IF TRUE INTRPTS EQU TRUE ;ENABLE INTERRUPT PROCESSING WHISTLE INTCPTS EQU TRUE ;ENABLE SYSTEM CAL ; E JADE 8" FLOPPY PHYSICAL DRIVE 0 ; F JADE 8" FLOPPY PHYSICAL DRIVE 1 ; G JADE 5" FLOPPY PHYSICAL DRIVE 0 ; H JADEHBIO313 Z80:;<=>?@AHBIO313 Z80BCDEFGHIHBIO313 Z80&JKLHBIO315 Z80MNOPQRSTFBIO313 Z80FBIO313 Z80FBIO313 Z80FBIO313 Z80/HBIO302 Z80HBIO302 Z80HBIO302 Z80lFBIO301 Z80 TITLE CUSTOMIZED BIOS FOR M5B LIST NOCOND LIST OFF ;======================================================================L INTERCEPT WHISTLE BOOT EQU 'H' ;'H': HARD DISK, 8: 8" FLOPPY, 5: 5" FLOPPY DEBUG EQU FALSE ;TRUE TO DUMP THE IOPB DATA TO  5" FLOPPY PHYSICAL DRIVE 1 ENDIF IF BOOT = 8 ; A JADE 8" FLOPPY PHYSICAL DRIVE 0 ; B JADE 8" FLOPPY PHYSICAL DRIVHBIO315 Z80UVWXYZ[\HBIO315 Z80]^_`abcdHBIO315 Z807efgFBIO400 Z80hijklmnoBIOSF316DOCFBIO301 Z80     FBIO301 Z80bHBIO312 Z80FBIO301 Z80FBIO301 Z80h====== ; ; ASSEMBLY PARAMETERS ; ;============================================================================ FALSE EQU 0 PRINTER LIST ON ;**************************************************************************** ; ; (c) 1981 GRH ElectrE 1 ; G JADE 5" FLOPPY PHYSICAL DRIVE 0 ; H JADE 5" FLOPPY PHYSICAL DRIVE 1 ; C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE FBIO400 Z80pqrstuvwFBIO400 Z80xyz{|}~FBIO400 Z80/HBIO316 Z80HBIO312 Z80 !"#$HBIO312 Z80%&'()*+,HBIO312 Z80%-./DBLK101 Z80a0123456 TRUE EQU NOT FALSE ;============================================================================ ; ; CONDITIONAL ASSEMBLY FLonics, CUPERTINO, CA ; ;**************************************************************************** ; ; CONFIGURATION: ; 0 ; D SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 0 ; E SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; F SIDE 2 & 3 OF HARD DISKHBIO316 Z80HBIO316 Z80HBIO316 Z80KHBIO310 Z80HBIO309 Z80789:;<=>HBIO309 Z80?@ABCDEFHBIO309 Z80tGHIJKLMNHBIO300 Z80^OPQRAGS ; ;============================================================================ SHORT EQU TRUE ;SHORT BIOS (REMOVES UNES; CPM ; DRIVE USAGE IF BOOT = 'H' ;HARD DISK BOOT CONFIG. ; A SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; B SIDE 2 &  PHYSICAL DRIVE 1 ENDIF IF BOOT = 5 ; G JADE 8" FLOPPY PHYSICAL DRIVE 0 ; H JADE 8" FLOPPY PHYSICAL DRIVE 1 ; A0 %+ &, !'- "(. #)/ $*0 JADE 5" FLOPPY PHYSICAL DRIVE 0 ; B JADE 5" FLOPPY PHYSICAL DRIVE 1 ; C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; D SORT BITS. ; ; 2.2.7 - 8 MAR 83 GRH ; ADDED CLOCK/CALENDAR DRIVER, SYSTEM CALL INTERCEPT, ; ILLEGAL SYSTEM CALL MESSAGE, CHANy ; ; 2.02 - 2 JUN 84 GRH ; Change floppy disk drivers to relate to ISASI control of JADE ; FDC. ; Change IOPB sector oppy firmware support. ; Implemented disk drive driver tables and new function to return ; a ptr to a drive table. ; Removed3C00H ;ADDRESS OF BDOS BIOS: EQU CPMBS + 4A00H ;ADDRESS OF BDOS BIOSR: EQU 1000H - BIOS ; PAGE0: EQU 0 ;START OF CP/M RAM OOT = 'H' LASTSEC EQU 46 + 1 ;LAST BOOT SECTOR ; STHD EQU 0 ;START LOGICAL DRIVE OF HARD DISK NDHD EQU 3 ;LAST LOGICAL DRGICAL DRIVE OF HARD DISK NDHD EQU 3 ;LAST LOGICAL DRIVE OF HARD DISK ST8FD EQU 4 ;START LOGICAL DRIVE OF 8" FLOPPY ND8FD EQ;============================================================================ CALROM EQU 7 ;CALENDAR ROM SELECT # RDBENT EQU IDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 0 ; E SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; F SIDE 2 & 3 OF HARD DISK PHYSICAL GED BIOS SIZE TO END ; OF INITIALIZED DATA AREA. RESTRUCTURE MODULES. ; ; 2.28 - 22 APR 83 GRH ; CHANGED DEFINITIONS TO ALvalue from physical sector (1..n) to logical ; sector value (0..n-1). This maintains more uniformity in ; parameter pass init of IOBYTE. ; Implemented 5" floppy driver. ; Implemented use of ROM primitives. ; Moved system down to 60k. ; VERSN EIOBYTE: EQU PAGE0 + 3 ;IOBYTE ADDR DEFDRV: EQU PAGE0 + 4 ;DEFAULT DRIVE PARAM ADDR DKPROM EQU PAGE0 + 40H ;DISK PRIMITIVES PROIVE OF HARD DISK ST8FD EQU 4 ;START LOGICAL DRIVE OF 8" FLOPPY ND8FD EQU 5 ;LAST LOGICAL DRIVE OF 8" FLOPPY ST5FD EQU 6 ;SU 5 ;LAST LOGICAL DRIVE OF 8" FLOPPY ST5FD EQU 6 ;START LOGICAL DRIVE OF 5" FLOPPY ND5FD EQU 7 ;LAST LOGICAL DRIVE OF 5" FL0F800H ;READ CLOCK BUFFER ENTRY SETENT EQU RDBENT + 3 ;SET CLOCK ENTRY CALENT EQU RDBENT + 6 ;RETURN CALENDAR ENTRY TIMENT EDRIVE 1 ENDIF ; ;************************************************************* ; REVISIONS: ; ; 2.2.0 - RELEASE ; LOW BIG DIRECTORIES. ; DISALLOWED DRIVES C & D. ; ; 2.29 - 3 SEP 83 GRH ; Changed Rev # for blocked DCM. Enables IBM systeing between hard disk & JADE floppy IOPBs. ; Vector I/O routines to monitor rom routines. ; ; 2.03 - 4 JUN 84 GRH ; Add beQU '00' ; ;**************************************************************************** SUBTTL SYSTEM DECLARATIONS ;=====M # (STORED BY DKBOOT) DEFBFR EQU PAGE0 + 80H ;DEFAULT BUFFER TPA: EQU 100H ;============================================TART LOGICAL DRIVE OF 5" FLOPPY ND5FD EQU 7 ;LAST LOGICAL DRIVE OF 5" FLOPPY ENDIF IF BOOT = 8 LASTSEC EQU 45 ;LAST OPPY ENDIF ;============================================================================ ; ; THE FOLLOWING 2 PARAMETEQU RDBENT + 9 ;RETURN TIME ENTRY DKPENT EQU RDBENT + 0CH ;DISK PRIMITIVES ENTRY ;========================================= ; 2.2.3 - SWAPPED DCM & BIOS SECTORS ON DISK, ALLOWING A ; LARGER BIOS ALLOCATION ON THE DISK. ; ; 2.2.4 - ADDED NAKED Tm 34 ; 256 bytes per sector disks to be read. ; ; 1.10 - 23 SEP 83 GRH ; Move clock-calendar routines to ROM. Add Interruplls & whistles again. ; Move to 61k system. ; ; 2.04 - 30 MAR 85 GRH ; Implemented hard disk drive 1 as C: & D:. ; Implem======================================================================= ; ; DISK OPERATING SYSTEM ADDRESSES ; ;=========================================== ; ; OTHER DECLARATIONS ; ;=================================================================BOOT SECTOR ; STHD EQU 0 ;START LOGICAL DRIVE OF HARD DISK NDHD EQU 3 ;LAST LOGICAL DRIVE OF HARD DISK ST8FD EQU 4 ;STARTRS MUST REFLECT THE MAX DISK SIZE & ; THE MAX DIRECTORY SIZE. ; ;=============================================================================================== ; ; ASCII CHARS ; ;=====================================================================ERMINAL DRIVERS & IOBYTE IN ; ANTICIPATION OF THE MONITOR. ALSO, ALL REFERENCES ; REQUIRING THE I/O PROMS TO BOOT HAS t handler ; (Mode 2). Change Revision display of sign-on (separate CBIOS rev). ; ; 2.00 - 24 MAR 84 GRH ; Modify for hard ented the Logon function for the hard disk. ; Implemented user friendly disk error options: Abort, Retry, Ignore. ; Solved war================================================================= NKSYS: EQU 60 ;SYSTEM SIZE IN K BYTES KBYTE: EQU 1024 CPMS=========== DEFIOB: EQU 80H ;INITIAL IOBYTE VALUE (LPT ON) DFDRV: EQU 0 ;INITIAL DEFAULT DRIVE SECSZ: EQU 128 NDRVS: EQU 8 LOGICAL DRIVE OF 8" FLOPPY ND8FD EQU 5 ;LAST LOGICAL DRIVE OF 8" FLOPPY ST5FD EQU 6 ;START LOGICAL DRIVE OF 5" FLOPPY ND5F================ ALLSIZ EQU 33 ;ALLOCATION BIT MAP SIZE (1 BYTE PER 8 CLUSTERS) CHKSIZ EQU 32 ;DIRECTORY CHECKSUMS ARRAY SIZ======= LF: EQU 0AH CR: EQU 0DH CTRLZ: EQU 1AH ;==========================================================================BEEN REMOVED. ; ; 2.2.5 - RECONFIGURE FOR 62K SYSTEM. ; ; 2.2.6 - 20 FEB 83 ; DOUBLE D REV C UPGRADE. CHANGE BOARD STATUS Pdisk ; ; 2.01 - 28 APR 84 GRH ; Change hard disk DPB to reflect half size directory, but keep ; allocation for 1k directorm boot hang problem by reseting host adapter if busy. ; ; 3.00 - 26 JAN 87 GRH ; Implemented new common IOPB code & Jade flZ: EQU KBYTE * NKSYS CPMBS: EQU CPMSZ - (20 * KBYTE) ; CP/M BIAS VALUE CCP: EQU CPMBS + 3400H ;ADDR OF CCP BDOS: EQU CPMBS +  BTDIRS EQU 2 + 1 ;HARD DISK SYSTEM TRACKS DIRECTORY SECTOR BTCCPO EQU 3 ;OFFSET TO CCP ENTRY IN SYS TRKS DIRECTORY IF BD EQU 7 ;LAST LOGICAL DRIVE OF 5" FLOPPY ENDIF IF BOOT = 5 LASTSEC EQU 19 ;LAST BOOT SECTOR ; STHD EQU 0 ;START LOE (1 BYTE PER DIR. SECTOR) ;============================================================================ ; ; ADDRESSES ; == ; ; INCLUDE JDDCONT.DEF ; INCLUDE COMIOPB.DEF ; INCLUDE JDDDISK.DEF ; INCLUDE MONBOARD.DEF ; INCLUDE IOBOARD.DEF ; INC0 %+ &, !'- "(. #)/ $*0LUDE NAKEDT.DEF ; INCLUDE ISHA.DEF ; INCLUDE CLOCK.DEF ; ;==================================================================RFLOW NXTSEC DL NXTSEC - #SECTORS ;; IF NXTSEC <= LOWEST ;CHECK FOR REPEAT NXTSEC DL LOWEST + 1 LOWEST DL NXTSEC ENDISKWR ;PERFORM DISK WRITE JP LISTST ;RETURN LIST STATUS JP SECTRN ;TRANSLATE SECTOR JP RETDVRT ;RETURN DRIVER TABLE ADSECTOR BUFFER STARTS HERE AFTER CRUNCHING COLD START ; CODE. THIS BUFFER IS USED BY THE CP/M DIRECTORY CHECK ROUTINES THAT ; O: LD HL,MSGSO CALL EDITOR ; ; MODIFY COLD START VECTOR TO WARM START ; LD HL,(BIOS+4) LD (BIOS+1),HL ; ; BOOT CC- ; ; WARM REBOOT ENTRY LOADS CCP,BDOS FROM DISK & ; SETS UP VARIABLES ; ;-------------------------------------------------PTER TO CLEAR HANG OUT (HCMD),A XOR A,A OUT (HCMD),A ; EX (SP),HL ; DELAY FOR HOST ADAPTER TO CATCH UP EX (SP),HL C,2 ;START WITH SECTOR #2 ENDIF LD B,0 CALL SETSEC ; ; READ CCP/BDOS ; WREAD: CALL DISKRD JR NZ,WEROR ;IF ERROR========== LIST OFF *INCLUDE JDDCONT.DEF *INCLUDE COMIOPB.DEF *INCLUDE JDDDISK.DEF *INCLUDE MONBOARD.DEF *INCLUDE IOBOARDIF ENDIF ;; ENDM LIST ON ENDM SUBTTL BIOS CODE ORG BIOS ;-----------------------------------------------------DR INDEXED BY C FUNC ;############################################################################ ; ; THESE BOOT PARAMS MU CHECK FOR DISK CHANGE. ; ;############################################################################ DIRBF: EQU $ ;BUFFERP & BDOS ; JR WARM ;############################################################################ ; ; SIGN-ON MESSAGE --------- WARM: IF INTRPTS ; ; SET INTERRUPT VECTOR TABLE BASE ; LD A,HIGH INTABL LD I,A ; ; SET INTERRUPT MODE; CALL HDXWT ; WHILE BUSY THEN WAIT NTHUNG: ENDIF ; ; LOG ON DRIVE TO INIT TABLES ; LD A,(DKPROM + 1) AND A,3  THEN EXIT ; LD A,(BTSEC) ;IF LAST SECTOR THEN DONE CP A,LASTSEC JR NC,WZRPG ; INC A ;NEXT SECTOR LD (BTSEC),A ; .DEF *INCLUDE NAKEDT.DEF *INCLUDE ISHA.DEF *INCLUDE CLOCK.DEF LIST ON ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@----------------------- ; ; BIOS JUMP VECTOR TABLE ; ;--------------------------------------------------------------------ST RESIDE AS DEFINED RIGHT BEFORE THE COLD ; INIT ROUTINE START AND MUST BE IN THE 1ST SECTOR. ; THESE 2 WORDS ARE REFERENCE BEGINNING ;---------------------------------------------------------------------------- ; ; INIT - COLD START ENTRY ; ;############################################################################ MSGSO: DB CR,LF DB CPMSZ / (KBYTE * 10) + '0 TO 2 ; IM 2 ; ; ENABLE INTERRUPT VECTOR 7 ; IN A,(INTMSK) AND A,7FH OUT (INTMSK),A ; ; FINALLY ENABLE VECTORE ;MODULO 4 LD C,A LD E,0 CALL SELDSK LD A,L ;IF ERROR THEN ABORT OR A,H JR Z,WEROR IF BOOT = 'H' ; ; READ B LD DE,SECSZ ;DMA := DMA + SECTOR SIZE LD HL,(BTDMA) ADD HL,DE LD (BTDMA),HL JR WREAD ; ; ; WARM BOOT ERROR, OUTPUT@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE THE TRANSLATION TABLE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@-------- JP INIT1 ;COLD START ENTRY JP WARM ;RELOAD CCP/BDOS JP CNSCK ;GET CONSOLE STATUS JP CI ;CONSOLE INPUT JP D BY THE BOOT CODE IN ; ORDER TO FIND THE LOAD ADDRESS FOR THE BIOS & IT'S LENGTH. ; ;######################################FROM BOOT MUST SET ALL BIOS PARAMS ; ;---------------------------------------------------------------------------- INIT: ; ' DB (CPMSZ MOD (KBYTE * 10)) / KBYTE + '0' DB 'K CP/M-80 Vers 2.2',CR,LF DB 'M5b CBIOS Vers 3.' DM HIGH VERSN , LOWD INTERRUPTS ; IN A,(MONSTS) OR A,MONIE OUT (MONSTS),A EI ENDIF ; ; SET TEMPORARY STACK ; LD SP,DEFBFR ; ; OOT DIRECTORY ; LD BC,DEFBFR CALL SETDMA LD BC,BTDIRS CALL SETSEC LD BC,0 ELSE LD BC,1 ENDIF CALL SETTR MSG & HALT ; WEROR: LD HL,MSGLE ;OUTPUT ERROR MESSAGE CALL EDITOR HALT ; ; ; BOOT OK, INIT PAGE 0 ; WZRPG: ; ; @@@@@@@@@@@@@@@@@@@@@@@@@@ GXLATE MACRO #SECTORS, #SKEW LIST OFF NXTSEC DL 1 ;;START WITH SECTOR 1 LOWEST DL 1 ;; REPT COC ;CONSOLE OUTPUT JP LO ;PRINTER OUTPUT JP PUNCH JP READER JP HOME ;HOME SELECTED DRIVE JP SELDSK ;SELECT DISK D###################################### BIOSSZ: DW BIOSND - BIOS ;BIOS MODULE SIZE IN BYTES BIOSST: DW BIOS ;BIOS MODULE LOAD ; SET TEMPORARY STACK ; LD SP,DEFBFR ;USE PAGE 0 FOR STACK ; ; MAKE SURE ROM IS ENABLED ; CALL GETMON ; ; INIT D VERSN,CR,LF IF $ > (DIRBF + SECSZ) CONMSG **** WARNING! COLD INIT CODE BIGGER THAN DIR BUFFER **** ELSE DS DIR INSURE MONITOR ROM STILL ENABLED ; CALL GETMON ; IF BOOT = 'H' ; TEST ISHA HOST ADAPTER FOR A HUNG CONDITION AND CLK ; IF BOOT = 'H' CALL DISKRD JR NZ,WEROR ; ENDIF LD BC,CCP ;SET LOAD ADDR CALL SETDMA ; IF BOOT = 'H'  INIT BIOS WARM START IN PAGE 0 ; LD A,0C3H LD HL,BIOS + 3 LD (PAGE0),A LD (PAGE0 + 1),HL ; ; INIT BDOS CALL VECTOR#SECTORS LIST ON DB NXTSEC LIST OFF NXTSEC DL NXTSEC + #SKEW ;ADD SKEW FACTOR ;; IF NXTSEC > #SECTORS ;CHECK FOR OVERIVE JP SETTRK ;SET TRACK # JP SETSEC ;SET SECTOR # JP SETDMA ;SET TRANSFER ADDR JP DISKRD ;PERFORM DISK READ JP DADDR FOR SBD INIT1: JR INIT ;############################################################################ ; ; DIRECTORY EFAULT DRIVE ; LD A,(DKPROM + 1) ;USE DRIVE # PASSED IN PAGE 0 AND A,3 LD (DEFDRV),A ; ; SEND SYSTEM SIGN-ON ; CLOGBF+SECSZ-$ ;FILL OUT DIRECTORY BUFFER TO 1 SECTOR SIZE ENDIF ;---------------------------------------------------------EAR IF TRUE ; IN A,(HSTATUS) ;IF HOST ADAPTER BUSY THEN BIT HBUSYB,A JR Z,NTHUNG ; LD A,1 SHL HRESET ; RESET HOST ADA LD A,(DEFBFR + BTCCPO) ;GET START OF CP/M IMAGE FROM DIRECTORY INC A ;MAKE SECTOR {0..N} -> {1..N+1} LD C,A ELSE LD  IN PAGE 0 ; LD HL,BDOS + 6 LD (PAGE0 + 5),A LD (PAGE0 + 6),HL ; ; SET DEFAULT SECTOR BUFFER ; LD BC,DEFBFR CALL0 %+ &, !'- "(. #)/ $*0 SETDMA ; IF INTCPTS ; ; PUT BDOS VECTOR INTO INTERCEPT CODE ; LD HL,(BDOS + 7) LD (BDOSV),HL ; ; NOW PUT INTER+++++++++++++++++++++++++++++++++++++++++++++++++++++++ DISKRD: LD A,DDRDS ;SELECT READ OP JR DISKOP ;+++++++++++++++O),HL ; LD A,DDLOG JR DISKOP2 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; COER RETURNS HERE ; DKOPRET: POP IY ; ; IF NO ERRORS THEN RETURN ZF ; RET Z ;IF NO_ERROR THEN RETURN ; ; PRINT ERRN TO CALLER JR Z,DKOPLP ; ; ELSE IF ABORT THEN DO WARM BOOT ; CP A,'A' ;IF ABORT THEN RE-BOOT JP Z,0 ; ; ELSE I LOGICAL DRIVE ; LD A,(BTDRV) ;IF EVEN THEN ADD 0 ELSE ADD 128 RRCA AND A,80H LD E,A ;COMPUTE SECTOR LD D,0 LD HL******************************************* HDXWT: IN A,(HSTATUS) BIT HBUSYB,A RET Z JR HDXWT ;+++++++++++++++++++++ FETCH DRIVER EXECUTION ADDRESS ; CALL RETDVRT ;DRIVE IS STILL IN C REGISTER LD (DVRTPTR),HL ; ; PREFETCH DRIVER EXECCEPT VECTOR INTO BDOS CODE ; LD HL,INTCPT LD (BDOS + 7),HL ; ; INITIALIZE CLOCK VECTORS IF CLOCK INSTALLED ; IN A,(C+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; WRITE A DISK SECTOR ; EXIT - A= 0: OK; /0: ERROR ; ;+++MMON DISK I/O CODE ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ROR ; LD HL,DSKEM ;OUTPUT PREFIX CALL EDITOR ; LD DE,IOPB + PBSTATO ;POINT TO ERROR BYTE LD B,6 ;OUTPUT 6 BYTES DSKEF IGNORE THEN RETURN NO ERROR ; SUB A,'I' ;IF IGNORE THEN RETURN NO ERROR RET Z ; ; ELSE RETURN ERROR TO BDOS ; FDSK,(IOPB + PBSECO) ADD HL,DE LD (IOPB + PBSECO),HL ; ; FINISH SETTING UP THE IOPB ; XPRIM: XOR A,A LD (IOPB + PBFLGO),+++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SELECT DRIVE FUNCTION ; LOG-ON - SET DISK PARAMETER BLOCK ; ENTRUTION ADDRESS ; LD E,(HL) ;STORE ADDRESS INC HL LD D,(HL) INC HL LD (DVRXADR),DE ; ; FETCH FLAGS ; LD C,(HL) LKDAT) ;IF CLOCK NOT PRESENT THEN TURN OFF CLOCK DRIVE AND A,11000000B ;TEST UNUSED BUT DRIVEN BITS (1S IF NOT THERE) LD A,3+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DISKWR: LD A,DDWRS ;SELECT WRITE OP JR DISKOP ++ DISKOP: ; ; SET UP IOPB ; LD HL,BTTRK LD DE,IOPB + PBTRKO LD BC,PBSTATO - PBTRKO LDIR ; DISKOP2: LD (IOPB +R1: LD A,(DE) ;FETCH ERROR BYTE PUSH DE ;SAVE REGS PUSH BC CALL PRHEX ;OUTPUT ERROR CODE ; LD C,' ' CALL COC ; ER: LD HL,0 ;RETURN DPB_PTR = 0 FOR SELECT FUNCTION LD A,-1 ;RETURN -1 TO BDOS OR A,A RET ;++++++++++++++++++++++++A ;NO FLAGS FOR NOW ; LD HL,SECSZ ;SET XFER COUNT LD (IOPB + PBST4O),HL ; ; EXECUTE THE PRIMITIVE IN ROM ; PUSH IX Y- C= DRIVE # ; E= 0 IF NEVER LOGGED BEFORE ; EXIT - HL= PTR TO DPT OR 0 FOR ERROR ; ;+++++++++++++++++++++++++++++++++++++ ; ; COMPUTE DISK PARAMETER TABLE ADDRESS ; LD HL,(BTDRV) LD H,0 ADD HL,HL ;DISK # * 16 ADD HL,HL ADD HL,HL ADD8H ;COND. JR (ON) JR Z,CLKON ; LD A,18H ;UNCOND. JR (OFF) (CAUSES JUMP TO ILLEGAL) ; CLKON: LD (INHCLK),A ; ENDIF  ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; LOGON DISK FUNCTION ; EXIT - A= 0: OK; PBCMDO),A ; ; DOUBLE CHECK DRIVE VALIDITY ; LD A,(BTDRV) CP A,NDRVS ;IF RANGE ERROR THEN ABORT JR NC,FDSKER ; ;  POP BC ;RESTORE REGS POP DE INC DE ;NEXT ERROR BYTE DJNZ DSKER1 ;IF NOT DONE THEN LOOP ; LD HL,DSKEB ;OUTPUT ERROR++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; HARD DISK DRIVER ; ENTRY- IY= DRIVER TABLE PTR ; EXIT - A= 0: OK; / LD IX,IOPB ;PASS PTR TO IOPB LD HL,DKPENT ;PRIMITIVE ENTRY LD A,(DKPROM) ;FETCH PROM # CALL EXROM ;EXECUTE THE PRIMITI+++++++++++++++++++++++++++++++++++++++ SELDSK: LD HL,0 ;ASSUME ERROR ; ; CHECK FOR LEGAL DRIVE ; LD A,C ;SET DRIVE #  HL,HL LD DE,D0DPH ADD HL,DE ; ; IF NO LOGON REQUEST THEN RETURN WITH TABLE PTR ; LD A,(LOGRQ) ;IF NOT_1ST_LOG_ON THE; ; PASS DEFAULT DISK TO CCP ; LD A,(DEFDRV) LD C,A JP CCP SUBTTL DISK ROUTINES ;++++++++++++++++++++++++++++++++ /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DISKLOG: LD HL,DEFBFR ;SET UP D FETCH DRIVER VECTOR & EXECUTE DISK DRIVER ; DKOPLP: PUSH IY ;SAVE IY LD IY,(DVRTPTR) ;FETCH TABLE BASE ; LD HL,DKOPRE MESSAGE CALL EDITOR ; ; GET USER RESPONSE ; CALL CI ;GET USER RESPONSE ; PUSH AF ;SAVE CHAR LD C,A ;ECHO CHAR 0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ HDEXEC: ; ; CONVERGE LOGICAL DRIVE POP IX ; ; RETURN THE COMMAND RESULTS STATUS ; LD A,(IOPB + PBSTATO) OR A,A RET ;************************** CP NDRVS ;IF NOT 0..(NUMBER_OF_DRIVES -1) THEN ERROR RET NC ; ; STORE DRIVE # FOR FUTURE USE ; LD (BTDRV),A ;STORE DN RETURN TABLE PTR CPL OR A,C ;OR IF LOGON INHIBIT SET THEN RETURN AND 1 RET Z ; ; ELSE LOG DRIVE ; LD (DTPTR),HL++++++++++++++++++++++++++++++++++++++++++++ ; ; READ A DISK SECTOR ; EXIT - A= 0: OK; /0: ERROR ; ;+++++++++++++++++++++MA FOR DESCRIPTOR SECTOR LD (IOPB + PBDMAO),HL XOR A,A LD (IOPB + PBDMAXO),A ; LD HL,1 ;SET SECTOR LD (IOPB + PBSECT ;PUT RETURN ADDRESS ON STACK PUSH HL ; LD HL,(DVRXADR) ;FETCH DRIVER ADDRESS PREFETCHED FROM TABLE JP (HL) ; ; DRIV CALL COC POP AF ; AND A,5FH ;INSURE UPPER CASE ; ; IF RETRY THEN RETURN TO CALLER ; CP A,'R' ;IF RETRY THEN RETUVE TO PHYSICAL DRIVE ; LD A,(IY + DVRPDRV) ;0,1: DRV 0, 2,3: DRV 1 LD (IOPB + PBDRVO),A ; ; OFFSET LOGICAL ADDRESS WITH************************************************** ; ; WAIT FOR ISHA NOT BUSY PROCEDURE ; ;*********************************RIVE # ; ; SAVE LOGON REQUEST FLAG ; LD A,E ;SET LOG REQUEST VECTOR LD (LOGRQ),A ; ; COMPUTE DISK TABLE PTR ; ;  ;SAVE DRIVE TABLE PTR ; ; 1ST ATTEMPT TO READ ID SECTOR ; XOR A,A ;INIT FLAG BYTE UNTIL FIRMWARE REVISED LD (IOPB + P0 %+ &, !'- "(. #)/ $*0BST2O),A ; CALL DISKLOG JP NZ,FDSKER ; ; IF NO ID SECTOR THEN USE DEFAULTS ; LD A,(IOPB + PBST2O) CP A,-2 ;0: NO ,(DVRTPTR) LD DE,DVRFLG ADD HL,DE EX DE,HL POP HL LD BC,DVRSIZ - DVRFLG LDIR ; ; RETURN DRIVE TABLE PTR ; LD R SEL2 ;**************************************************************************** ; ; SET 3740 SECTOR TRANSLATION ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DPBAD: LD HL,(DTPTR) ;FETCH BASE ADDR LD DE,10 ;ADD OFFSET SET SECTOR ; ENTRY- BC= SECTOR # ; ;**************************************************************************** SETSEC: +++++++ 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) ; L LD A,(IY + DVRPDRV) LD (IOPB + PBDRVO),A ; ; IF LOGON THEN SKIP SIDE SELECT BECAUSE SECTOR DATA MAY NOT BE VALID ; LD ++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN DRIVER TABLE PTR FUNCTION ; ENTRY- C= DRIVE # ; EXIT - HL= DRIVER ID, -1: JADE ID, -2: EXTENDED ID JR NZ,LGDEF ; ; DISKETTE CONTAINS ID. XFER ID SECTOR DATA ; CALL TRNONE ;ASSUME NO TRHL,(DTPTR) XOR A,A RET ; ; ; SELECT PROPER DEFAULT TABLES ; LGDEF: LD A,(BTDRV) IF STHD <> 0 CP A,STHD JR C,L EXIT - DE, HL= ? ; ;**************************************************************************** TR5: LD DE,SD5TRAN JR SET OF DPB PTR ADD HL,DE LD E,(HL) ;FETCH DPB PTR INC HL LD D,(HL) RET ;*******************************************LD (BTSEC),BC RET ;**************************************************************************** ; ; SET TRANSFER ADDR D H,0 RET ; ; NOTRAN: LD HL,1 ADD HL,BC RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++A,(IOPB + PBCMDO) SUB A,DDLOG JR Z,FD8X1 ; ; SELECT SIDE ; LD A,(IOPB + PBTRKO) CP A,1 LD A,(IOPB + PBSECO) JR TABLE BASE PTR ; A, C= 0 ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ RETDVRT: LD HL,DANSLATION ; ; TEST FOR SECTOR XLATION ; LD A,(DEFBFR + IDFLGO) AND A,[1 SHL DFDTDB] OR [1 SHL DFHARDB] JR NZ,NOX ; GCKFD ENDIF CP A,NDHD + 1 JR NC,LGCKFD ; ; HARD DISK DEFAULTS ; CALL TRNONE ; NO XLATE LD HL,HDPBK ; ; COTR ; TR8: TR3740: LD DE,SDTRAN ; SETTR LD HL,(DTPTR) LD (HL),E INC HL LD (HL),D RET ;********************************************************** ; ; HOME DRIVE - TREAT AS SEEK TRK 0 ; EXIT - BC= 0 ; ;********************************; ENTRY- BC= ADDRESS ; EXIT - A= 0 ; ;**************************************************************************** SETDMA: L+++++++ ; ; JADE 5" FLOPPY DISK DRIVER FUNCTION ; ENTRY- IY= DRIVER TABLE PTR ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++++++C,FD8X20 JR Z,FD8X21 ; ; DATA TRACKS ; LD C,(IY + DVRDSPT) ; ; COMMON SIDE SELECT CODE ; FD8X2: INC C SUB A,C VR0 ;START AT 1ST TABLE ; ; TEST FOR DONE ; RETDVL: LD A,C OR A,A RET Z ; ; COMPUTE NEXT TABLE ENTRY ; LD A,DV; SELECT SIZE OF XLATE TABLE ; LD A,(DEFBFR + IDSPTDO) CP A,26 JR NZ,LGNT8X ; ; SELECT 8" XLATE TABLE ; CALL TR8MMON CODE ; SEL2: PUSH HL CALL DPBAD ; USE DEFAULT TABLE POP HL LD BC,DPBSZ LDIR JR SEL1 ; ; CHECK FOR 8" FLOP*************************************************** ; ; SET NO SECTOR TRANSLATION ; EXIT - HL, DE= ? ; ;*************************************************************** HOME: LD BC,0 ;**************************************************************D (BTDMA),BC XOR A,A LD (BTDMAX),A RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ FD5EXEC: ;+++++++++++++++++++++++++++++++++++++++++++++++ JR C,SPTOK ; INC A ;MUST START AT 1 LD (IOPB + PBSECO),A ; ; SELECT SIDE 1 ; LD A,80H FD8X1: LD (IOPB + PBSECO + RSIZ ADD A,L LD L,A LD A,0 ADC A,H LD H,A DEC C JR RETDVL SUBTTL NON-DISK PROCEDURES ;*********************** JR NOX ; ; SELECT 5" XLATE TABLE ; LGNT8X: CALL TR5 ; NOX: CALL DPBAD ;GET ADDR OF DPB & MOVE DOWN DISK INFO TO IT PY DEFAULTS ; LGCKFD: IF ST8FD <> 0 CP A,ST8FD JR C,LGCKFD5 ENDIF CP A,ND8FD + 1 JR NC,LGCKFD5 ; ; USE 8" ********************************************************* TRNONE: LD DE,0 JR SETTR ;++++++++++++++++++++++++++++++++++++************** ; ; SET TRACK # ; ENTRY- BC= TRACK # ; ;******************************************************************** ; ; SECTOR TRANSLATION FUNCTION ; ENTRY- DE= 0: NO XLATE, ELSE PTR TO XLATE TABLE ; BC= SECTOR # TO XLATE ; EXIT - HL= XLA+++++++++++++++++++++++++++++ ; ; JADE 8" FLOPPY DISK DRIVER FUNCTION ; ENTRY- IY= DRIVER TABLE PTR ; EXIT - A= 0: OK; /0: E1),A ; ; EXECUTE THE IOPB ; JP XPRIM ; ; ; TRACK 0 ; FD8X20: LD C,(IY + DVR0SPT) JP FD8X2 ; ; ; TRACK 1 ; ***************************************************** ; ; OUTPUT HEX DATA TO CONSOLE SUBR ; ENTRY- A= DATA ; EXIT - A, C= ?  LD HL,DEFBFR + IDSPTO LD BC,DPBSZ LDIR ; LD HL,DEFBFR + IDFLGO ; ; XFER DISK PHYSICAL DATA ; SEL1: PUSH HL LD HLFLOPPY DEFAULTS ; CALL TR8 LD HL,SD8PBK JR SEL2 ; ; USE 5" FLOPPY DEFAULTS ; LGCKFD5: CALL TR5 LD HL,SD5PBK J++++++++++++++++++++++++++++++++++++++++ ; ; GET DRIVE PARAMETER BLOCK ADDR ; EXIT - DE= DPB PTR ; HL= ? ; ;+++++++++++******** SETTRK: LD (BTTRK),BC RET ;**************************************************************************** ; ;TED SECTOR OR (BC) + 1 ; BC= UNCHANGED ; A, DE= ? ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++RROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ FD8EXEC: ; ; SET PHYSICAL DRIVE ;  FD8X21: LD C,(IY + DVR1SPT) JP FD8X2 ; ; ; SECTORS OK ; SPTOK: XOR A,A JP FD8X1 ;++++++++++++++++++++++++++++++ ; ;**************************************************************************** PRHEX: CALL PRDIG ;DO HIGH NIBBLE ; PRDIG:0 %+ &, !'- "(. #)/ $*0 RLCA ;POSITION NIBBLE INTO LOW 4 BITS RLCA RLCA RLCA ; PUSH AF ;SAVE DATA ; AND A,0FH ;MASK OFF OTHER NIBBLE  BOOT RTN ; ; THE FOLLOWING CONDITIONAL JUMP IS MODIFIED TO AN UNCONDITIONAL JUMP BY ; THE WARM BOOT ROUTINE IF THE CLOCK/C++++++++++++++++++++++++++++++++++++++++++++++ ; ; CDOS RETURN VERSION FUNCTION ; MAKES CLOCK/CALENDAR WORK. ; EXIT - B= 1 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ CLKTIM: LD HL,TIMENT JR CLK1 ;+++++++++++F ;**************************************************************************** ; ; EXECUTE ROM ROUTINE ; ENTRY- HL= ENT+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ CI: IF USEMON CALL GETMON ;SWITCH IN MONITOR**** ; ; CONSOLE OUTPUT ; ENTRY- C= CHAR TO OUTPUT ; ;*********************************************************************++++++++++++++++++++++++++++++++++++++++++ READER: LD A,CTRLZ ;FAKE EOF ;************************************************ADD A,90H ;CONVERT TO ASCII DAA ADC A,40H DAA ; LD C,A ;STORE CHAR CALL COC ; POP AF ;DATA RET IF INTCALENDAR BOARD IS NOT PRESENT ; IF NOT MODIFIED, THEN IT IS ALLWAYS FALSE (NOP). ; INHCLK: JR C,ILLEGC ; ; NOW CHECK FOR E ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ RETVER: LD B,1 RET SUBTTL CLOCK ROUTINE+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; READ CLOCK TIME FUNCTION 93H ; ENTRY- DE= PTR TO 13 BYTRY ADDRESS ; A= ROM # ; EXIT - ? ; ;**************************************************************************** EXROM:  ROM JP 0F803H ;USE MONITOR ELSE CALL CNSCK ;IF NO CHAR RDY THEN WAIT JR Z,CI IN A,(NTD) ;ELSE RETURN CHAR RET ******* COC: IF USEMON CALL GETMON JP 0F809H ELSE CALL NTOST ;IF BUSY THEN WAIT OR A,A JR Z,COC LD A,C **************************** ; ; PUNCH DRIVER ; ENTRY- C= CHAR TO OUTPUT ; ;***********************************************PTS SUBTTL ADDITIONAL FUNCTIONS TO SUPPORT CDOS PROGRAMS ;*******************************************************************XTENDED CALLS ; CP A,8DH ;IF RETURN VERSION THEN RETURN IT JR Z,RETVER ; CP A,90H ;IF NOT CLOCK THEN ERR JR C,ILLEGCS ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN CALENDAR FUNCTION 90H ; EXIT - A=E BUFFER FOR CLOCK DATA ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ CLKRDC: LD C,E ;SEAND A,ROMSMK ;MASK OUT UNUSED BITS OUT (ROMSEL),A ; PUSH HL ;SAVE ROM ENTRY VECTOR ; LD HL,EXROMR ;PUT RETURN ADDR ON S ENDIF ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN CONSOLE STATUS ; EXIT OUT (NTD),A RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN CONSOLE OUTPU***************************** PUNCH: RET ;**************************************************************************** ; ******** ; ; SYSTEM CALL INTERCEPT ROUTINE CHECKS FOR ILLEGAL BDOS CALLS & ; PRINTS MESSAGE IF ILLEGAL. ALSO IMPLEMENTS CDOS ; JR Z,CLKCAL ;IF CALENDAR THEN GET IT ; CP A,92H JR C,CLKSET ;IF SET FUNCTION THEN SET CLOCK ; JR Z,CLKTIM ;IF TIME DAY ; B= MONTH ; C= YEAR ; L= DAY OF WEEK ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++T UP PARAMETERS LD B,D LD HL,RDBENT JR CLK2 ;************************************************************************TACK EX (SP),HL ;SWAP RETURN ADDRESS WITH ROM ENTRY VECTOR JP (HL) ;EXECUTE ROM ; ; ROM PROCEDURE RETURNS HERE ; EXR - A= 0: NOT READY ; FFH: CHAR READY ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ CNST READY STATUS ; EXIT - A= 0: BUSY, FFH: READY ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; PRINTER DRIVER ; ENTRY- C= CHAR TO OUTPUT ; ;****************************************************************************  CLOCK/CALENDAR ; SYSTEM CALLS FOR ASMB. ; ;*************************************************************************** INT THEN GET IT ; CP A,93H JR Z,CLKRDC ;IF READ CLOCK THEN GET IT ; ; ILLEGAL SYSTEM CALL ; ILLEGC: LD HL,ISCMSG ;OUTPUT ++ CLKCAL: LD HL,CALENT ;ROM ENTRY POINT ; CLK1: LD BC,CLKBFR ;READ CLOCK JR CLK2 ;+++++++++++++++++++++++++++++++++**** ; ; CLOCK SET FUNCTION 91H ; ENTRY- DE= CLOCK IMAGE BUFR PTR (13 BYTES LONG) ; ;**************************************OMR: PUSH AF ;SAVE RETURN VALUE CALL GETMON ;RESELECT MONITOR ROM ; POP AF ;RETURN VALUE RET SUBTTL CHAR I/O ROUTCK: IF USEMON CALL GETMON JP 0F812H ELSE IN A,(NTS) ;IF DATA NOT READY THEN RETURN 0 AND A,1 SHL NTRDY TTOST1:+ NTOST: IN A,(NTS) CPL ;REVERSE SENSE AND A,1 SHL NTBSY JR TTOST1 ENDIF ;++++++++++++++++++++++++++++++++++++ LO: IF USEMON CALL GETMON JP 0F80FH ELSE CALL LISTST ;IF BUSY THEN WAIT JR Z,LO ; LD A,C ;OUTPUT CHAR SECPT: LD A,C ;CHECK CALL VALIDITY CP A,41 ;IF <= 40 THEN OK ; BDOSV EQU $ + 1 JP C,BDOS + 11H ;THIS ADDR MODIFIED BY WARMWARNING CALL EDITOR XOR A,A ;BC = HL = A = 0 LD L,A LD H,A LD C,A LD B,A RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN TIME FUNCTION 92H ; EXIT - A= SECONDS ; B= MINITS ; C= HOURS ; ;************************************** CLKSET: LD C,E ;SET UP PARAMETERS LD B,D LD HL,SETENT CLK2: LD A,CALROM ENDIINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CONSOLE INPUT ; EXIT - A= CHAR ; ;+ RET Z LD A,-1 ;ELSE RETURN -1 RET ENDIF ;************************************************************************++++++++++++++++++++++++++++++++++++++++ ; ; READER DRIVER - DUMMY ; EXIT - A= CTRL-Z ; ;++++++++++++++++++++++++++++++++++T 7,A OUT (CENTOUT),A ; RES 7,A ;OUTPUT LOW TRUE STROBE OUT (CENTOUT),A SET 7,A OUT (CENTOUT),A RET ENDIF 0 %+ &, !'- "(. #)/ $*0 TITLE CUSTOMIZED BIOS FOR M5B LIST NOCOND ;============================================================================ ; Y, 20H: 5" FLOPPY DEBUG EQU FALSE ;TRUE TO DUMP THE IOPB DATA TO PRINTER FORM ;****************************************** PHYSICAL DRIVE 1 ; C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; D SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 0 ; E SIDE 0  LARGER BIOS ALLOCATION ON THE DISK. ; ; 2.2.4 - ADDED NAKED TERMINAL DRIVERS & IOBYTE IN ; ANTICIPATION OF THE MONITOR. EP 83 GRH ; Move clock-calendar routines to ROM. Add Interrupt handler ; (Mode 2). Change Revision display of sign-on (separ 85 GRH ; Implemented hard disk drive 1 as C: & D:. ; Implemented the Logon function for the hard disk. ; Implemented user OGON to specify the ID sector & track. At same time, fix bug ; which did not specify the logon track. ; ; 3.02 7 JUL 88 G********************************** SUBTTL SYSTEM DECLARATIONS ;==========================================================; ASSEMBLY PARAMETERS ; ;============================================================================ FALSE EQU 0 TRUE EQU N********************************** ; ; CUSTOMIZED BIOS FOR M5B ; (c) 1981 GRH Electronics, CUPERTINO, CA ; ;**********& 1 OF HARD DISK PHYSICAL DRIVE 1 ; F SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ENDIF IF BOOT = 20H ; A JADE 5" FLOALSO, ALL REFERENCES ; REQUIRING THE I/O PROMS TO BOOT HAS BEEN REMOVED. ; ; 2.2.5 - RECONFIGURE FOR 62K SYSTEM. ; ; 2.ate CBIOS rev). ; ; 2.00 - 24 MAR 84 GRH ; Modify for hard disk ; ; 2.01 - 28 APR 84 GRH ; Change hard disk DPB to reffriendly disk error options: Abort, Retry, Ignore. ; Solved warm boot hang problem by reseting host adapter if busy. ; ; 3.00RH ; Add '?' to include file names. ; Change hard disk system tracks directory reference to new format. ; Correct bug in driv================== ; ; INCLUDE JDDCONT.DEF ; INCLUDE COMIOPB.DEF ; INCLUDE DISKS.DEF ; INCLUDE MONBOARD.DEF ; INCLUDE ZMONOT FALSE ;============================================================================ ; ; CONDITIONAL ASSEMBLY FLAGS ; ;****************************************************************** ; ; CONFIGURATION: ; ; CPM ; DRIVE USAGE IF BOOT = 1PPY PHYSICAL DRIVE 0 ; B JADE 5" FLOPPY PHYSICAL DRIVE 1 ; C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; D SIDE 2 & 3 OF2.6 - 20 FEB 83 ; DOUBLE D REV C UPGRADE. CHANGE BOARD STATUS PORT BITS. ; ; 2.2.7 - 8 MAR 83 GRH ; ADDED CLOCK/CALENDAR DRIlect half size directory, but keep ; allocation for 1k directory ; ; 2.02 - 2 JUN 84 GRH ; Change floppy disk drivers to r - 26 JAN 87 GRH ; Implemented new common IOPB code & Jade floppy firmware support. ; Implemented disk drive driver tables aers which caused retry to fail. (sector remained ; corrupted) ; Stubbed out new Clock routines for present. ; ; 3.03 31 JUROM.DEF ; INCLUDE DKBTROM.DEF ; INCLUDE NAKEDT.DEF ; INCLUDE ISHA.DEF ; INCLUDE CLOKROM.DEF ; ;======================================================================================================= SHORT EQU FALSE ;SHORT BIOS (REMOVES UNESENTIAL C0H ;HARD DISK BOOT CONFIG. ; A SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; B SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 0 ;  HARD DISK PHYSICAL DRIVE 0 ; E SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; F SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ; VER, SYSTEM CALL INTERCEPT, ; ILLEGAL SYSTEM CALL MESSAGE, CHANGED BIOS SIZE TO END ; OF INITIALIZED DATA AREA. RESTRUCTURE MOelate to ISASI control of JADE ; FDC. ; Change IOPB sector value from physical sector (1..n) to logical ; sector value nd new function to return ; a ptr to a drive table. ; Removed init of IOBYTE. ; Implemented 5" floppy driver. ; ImplementedL 88 GRH ; Unstub Clock routines. ; ; 3.04 6 AUG 88 GRH ; Remove floppy side select from BIOS & move to controller. ; I================================================= LIST OFF *INCLUDE JDDCONT.DEF *INCLUDE COMIOPB.DEF *INCLUDE DISKS.DEF *IODE) LSTINC EQU FALSE ;LIST INCLUDE FILES USEMON EQU TRUE ;USE MONITOR ROM I/O ROUTINES IF TRUE INTRPTS EQU TRUE ;ENABLE I C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; D SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ; E JADE 8" FLOPPY PHYSICAL DRIVE G JADE 8" FLOPPY PHYSICAL DRIVE 0 ; H JADE 8" FLOPPY PHYSICAL DRIVE 1 ENDIF ; ;***************************************DULES. ; ; 2.28 - 22 APR 83 GRH ; CHANGED DEFINITIONS TO ALLOW BIG DIRECTORIES. ; DISALLOWED DRIVES C & D. ; ; 2.29 - 3 (0..n-1). This maintains more uniformity in ; parameter passing between hard disk & JADE floppy IOPBs. ; Vector I/O routine use of ROM primitives. ; Moved system down to 60k. ; ; 3.01 26 JUN 88 GRH ; Remove 5" floppy support. Implement in CP/M-86mplement new ID sector format. ; Implement CP/M 3.0 DPB structure in preparation for deblocking. ; ; 3.05 11-3-88 GRH ; ChNCLUDE MONBOARD.DEF *INCLUDE ZMONROM.DEF *INCLUDE DKBTROM.DEF *INCLUDE NAKEDT.DEF *INCLUDE ISHA.DEF *INCLUDE CLOKROM.DEF NTERRUPT PROCESSING WHISTLE INTCPTS EQU TRUE ;ENABLE SYSTEM CALL INTERCEPT WHISTLE BOOT EQU 10H ;10H: HARD DISK, 3: 8" FLOPP 0 ; F JADE 8" FLOPPY PHYSICAL DRIVE 1 ENDIF IF BOOT = 3 ; A JADE 8" FLOPPY PHYSICAL DRIVE 0 ; B JADE 8" FLOPPY********************** ; REVISIONS: ; ; 2.2.0 - RELEASE ; ; 2.2.3 - SWAPPED DCM & BIOS SECTORS ON DISK, ALLOWING A ; SEP 83 GRH ; Changed Rev # for blocked DCM. Enables IBM system 34 ; 256 bytes per sector disks to be read. ; ; 1.10 - 23 Ss to monitor rom routines. ; ; 2.03 - 4 JUN 84 GRH ; Add bells & whistles again. ; Move to 61k system. ; ; 2.04 - 30 MAR BIOS. ; Change single function to return drive table ptr into a BIOS function ; call using restart instruction. ; Change Lange included data to update IOPB.PBSTAT to new configuration. ; VERSN EQU 305 ; ;******************************************LIST ON ;============================================================================ ; ; DISK OPERATING SYSTEM ADDRESS0 %+ &, !'- "(. #)/ $*0ES ; ;============================================================================ NKSYS: EQU 60 ;SYSTEM SIZE IN K BYTES KB================================================= ; ; OTHER DECLARATIONS ; ;================================================ ; ASCII CHARS ; ;============================================================================ LF: EQU 0AH CR: EQU 0DH CTRL@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; INITIALIZE VERSION TEXT IN RAM MACRO ; ;@@@@@@@@@@@@@@@@@@@@NSOLE INPUT JP COC ;CONSOLE OUTPUT JP LO ;PRINTER OUTPUT JP PUNCH JP READER JP HOME ;HOME SELECTED DRIVE JP SELDS#################################### BIOSSZ: DW BIOSND - BIOS ;BIOS MODULE SIZE IN BYTES BIOSST: DW BIOS ;BIOS MODULE LOAD AD------------------- INIT: ; ; SET TEMPORARY STACK ; LD SP,DEFBFR ;USE PAGE 0 FOR STACK ; ; MAKE SURE ROM IS ENABLED  Vers ' PVERS VERSN DM CR,LF IF $ > (DIRBF + SECSZ) CONMSG **** WARNING! COLD INIT CODE BIGGER THAN DIR BUFFER *YTE: EQU 1024 CPMSZ: EQU KBYTE * NKSYS CPMBS: EQU CPMSZ - (20 * KBYTE) ; CP/M BIAS VALUE CCP: EQU CPMBS + 3400H ;ADDR OF CCP ============================ SECSZ: EQU 128 NDRVS: EQU 6 IF BOOT = 10H ; ; 8" HARD DISK BOOT DATA ; STHD EQU 0 ;STAZ: EQU 1AH ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE THE TRANSLATION TAB@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ PVERS MACRO #VERS DD DL #VERS IF DD > 9999 DB (DD / 10000) + '0K ;SELECT DISK DRIVE JP SETTRK ;SET TRACK # JP SETSEC ;SET SECTOR # JP SETDMA ;SET TRANSFER ADDR JP DISKRD ;PERFORMDR FOR SBD ; ; CONTINUE ON WITH INIT ; INIT1: JR INIT ;############################################################## ; CALL GETMON ; ; INIT DEFAULT DRIVE ; LD A,(DK_PROM + 1) ;USE DRIVE # PASSED IN PAGE 0 AND A,3 LD (DEFDRV),A ; *** ELSE DS DIRBF+SECSZ-$ ;FILL OUT DIRECTORY BUFFER TO 1 SECTOR SIZE ENDIF ;------------------------------------ BDOS: EQU CPMBS + 3C00H ;ADDRESS OF BDOS BIOS: EQU CPMBS + 4A00H ;ADDRESS OF BDOS BIOSR: EQU 1000H - BIOS ; ; PAGE 0 LOCART LOGICAL DRIVE OF HARD DISK NDHD EQU 3 ;LAST LOGICAL DRIVE OF HARD DISK ST8FD EQU 4 ;START LOGICAL DRIVE OF 8" FLOPPY ND8LE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ GXLATE MACRO #SECTORS, #SKEW LIST ' DD DL DD % 10000 ENDIF IF DD > 999 DB (DD / 1000) + '0' DD DL DD % 1000 ENDIF DB (DD / 100) + '0' DB '.'  DISK READ JP DISKWR ;PERFORM DISK WRITE JP LISTST ;RETURN LIST STATUS JP SECTRN ;TRANSLATE SECTOR JP BIOFUNC ;EXECU############## ; ; DIRECTORY SECTOR BUFFER STARTS HERE AFTER CRUNCHING COLD START ; CODE. THIS BUFFER IS USED BY THE CP/M DI; SEND SYSTEM SIGN-ON ; CLOGO: LD HL,MSGSO CALL EDITOR ; ; MODIFY COLD START VECTOR TO WARM START ; LD HL,(BIOS+4) ---------------------- ; ; WARM REBOOT ENTRY LOADS CCP,BDOS FROM DISK & ; SETS UP VARIABLES ; ;----------------------------TIONS ; PAGE0: EQU 0 ;START OF CP/M RAM IOBYTE: EQU PAGE0 + 3 ;IOBYTE ADDR DEFDRV: EQU PAGE0 + 4 ;DEFAULT DRIVE PARAM ADDR FD EQU 5 ;LAST LOGICAL DRIVE OF 8" FLOPPY ENDIF IF BOOT = 3 ; ; 8" FLOPPY BOOT DATA ; STHD EQU 2 ;START LOGICAL OFF NXTSEC DL 1 ;;START WITH SECTOR 1 LOWEST DL 1 ;; REPT #SECTORS LIST ON DB NXTSEC LIST OFF NXTSEC DL NXTSEC + #S DB ((DD % 100) / 10) + '0' DB (DD % 10) + '0' ENDM SUBTTL BIOS CODE ORG BIOS ;------------------------------------TE FUNCTION CALL ;############################################################################ ; ; THESE BOOT PARAMS MUSTRECTORY CHECK ROUTINES THAT ; CHECK FOR DISK CHANGE. ; ;#################################################################### LD (BIOS+1),HL ; ; BOOT CCP & BDOS ; JR WARM ;####################################################################------------------------------ WARM: IF INTRPTS ; ; SET INTERRUPT VECTOR TABLE BASE ; LD A,HIGH INTABL LD I,A ; ; BDOSJV EQU PAGE0 + 5 ;BDOS SYSTEM CALL ENTRY DEFBFR EQU PAGE0 + 80H ;DEFAULT BUFFER ; ; BIOS FUNCTION CALL RESTART VECTOR DRIVE OF HARD DISK NDHD EQU 5 ;LAST LOGICAL DRIVE OF HARD DISK ST8FD EQU 0 ;START LOGICAL DRIVE OF 8" FLOPPY ND8FD EQU 1 ;KEW ;ADD SKEW FACTOR ;; IF NXTSEC > #SECTORS ;CHECK FOR OVERFLOW NXTSEC DL NXTSEC - #SECTORS ;; IF NXTSEC <= LOWEST ;---------------------------------------- ; ; BIOS JUMP VECTOR TABLE ; ;--------------------------------------------------- RESIDE AS DEFINED RIGHT BEFORE THE COLD INIT ; ROUTINE START AND MUST BE IN THE 1ST SECTOR. THESE 2 WORDS ARE REFERENCED ; ######## DIRBF: EQU $ ;BUFFER BEGINNING ;---------------------------------------------------------------------------- ; ######## ; ; SIGN-ON MESSAGE ; ;############################################################################ MSGSO: DB CR,L SET INTERRUPT MODE TO 2 ; IM 2 ; ; ENABLE INTERRUPT VECTOR 7 ; IN A,(M2_IMASK) AND A,7FH OUT (M2_IMASK),A ; ; ; BFUNRST EQU 28H BFUNRSV EQU PAGE0 + BFUNRST BFUNRSI EQU 0C7H + BFUNRST ; TPA: EQU 100H ;===========================LAST LOGICAL DRIVE OF 8" FLOPPY ENDIF ;============================================================================ ; CHECK FOR REPEAT NXTSEC DL LOWEST + 1 LOWEST DL NXTSEC ENDIF ENDIF ;; ENDM LIST ON ENDM ;@@@@@@@@@@@@@@@@@------------------------- JP INIT1 ;COLD START ENTRY JP WARM ;RELOAD CCP/BDOS JP CNSCK ;GET CONSOLE STATUS JP CI ;COBY THE BOOT CODE IN ORDER TO FIND THE LOAD ADDRESS FOR THE BIOS & IT'S ; LENGTH. ; ;######################################## ; INIT - COLD START ENTRY FROM BOOT MUST SET ALL BIOS PARAMS ; ;---------------------------------------------------------F DB CPMSZ / (KBYTE * 10) + '0' DB (CPMSZ MOD (KBYTE * 10)) / KBYTE + '0' DB 'K CP/M-80 Vers 2.2',CR,LF DB 'M5b CBIOS  FINALLY ENABLE VECTORED INTERRUPTS ; IN A,(M2_STAT) OR A,M2_IEN OUT (M2_STAT),A EI ENDIF ; ; SET TEMPORARY ST0 %+ &, !'- "(. #)/ $*0ACK ; LD SP,DEFBFR ; ; INSURE MONITOR ROM STILL ENABLED ; CALL GETMON ; IF BOOT = 10H ; TEST ISHA HOST ADAPTER A,(DEFBFR) CP A,86H JR C,WEROR ; ; SET UP TO LOAD CCP/BDOS ; LD HL,(DEFBFR + BD_SBDSS) ;PREFETCH BDOS TRK/SECTOR PD ; ; ELSE DONE READING SYSTEM ; JP WZRPG ; ; ; ELSE SET UP & READ BDOS ; RDBDOS: POP HL ;RESTORE BDOS TRK/SECTORINTCPTS ; ; PUT BDOS VECTOR INTO INTERCEPT CODE ; LD HL,(BDOS + 7) LD (BDOSV),HL ; ; NOW PUT INTERCEPT VECTOR INTO ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DISKRD: LD A,PB_READC ;SELECT READ OP JP DISKOP ;UPPORTED DRIVE REQUESTED THEN RETURN 0 (ERROR) ; LD A,C CP A,NDRVS RET NC ; ; STORE DRIVE # FOR FUTURE USE ; LD (BDRIVE ; LD (DTPTR),HL ;SAVE DRIVE TABLE PTR ; ; ATTEMPT TO READ ID SECTOR ; XOR A,A ;INIT FLAG BYTE UNTIL FIRMWARE REO ; SEL1: PUSH HL LD HL,(DVRTPTR) LD DE,DVRFLG ADD HL,DE EX DE,HL POP HL LD BC,DVRSIZ - DVRFLG LDIR ; ; RETU FOR A HUNG CONDITION AND CLEAR IF TRUE ; IN A,(ISH_STATUS) ;IF HOST ADAPTER BUSY THEN BIT ISH_BSYB,A JR Z,NTHUNG ; LDUSH HL ; LD HL,(DEFBFR + BD_SCCPS) ;FETCH CCP TRK/SECTOR LD C,L LD B,0 CALL SETSEC ; LD C,H CALL SETTRK ; LD BC FROM DIRECTORY LD C,L LD B,A ;A STILL CONTAINS 0 CALL SETSEC ; LD C,H CALL SETTRK ; JR WREAD ; ; ; WARM BOOBDOS CODE ; LD HL,INTCPT LD (BDOS + 7),HL ; ; INITIALIZE CLOCK VECTORS IF CLOCK INSTALLED ; LD C,CLK_F7 ;TEST FOR BO++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; WRITE A DISK SECTOR ; EXIT - A= 0: OK; /0: ETDRV),A ; ; SAVE LOGON REQUEST FLAG ; LD A,E LD (LOGRQ),A ; ; COMPUTE DISK DRIVER TABLE PTR ; CALL RETDVRT ;DRIVISED LD (IOPB + PB_ST2O),A ; CALL DISKLOG JP NZ,FDSKER ; ; IF NO ID SECTOR THEN USE DEFAULTS ; LD A,(IOPB + PB_STRN DRIVE TABLE PTR ; LD HL,(DTPTR) XOR A,A RET ; ; ; IF NOT HARD DISK THEN GO DO FLOPPY TEST ; LGDEF: LD A,(BTDRV) A,PB_CLRC LD (IOPB + PB_CMDO),A CALL XPRIM ; NTHUNG: ENDIF ; ; LOG ON DRIVE TO INIT TABLES ; LD A,(DK_PROM + 1,CCP CALL SETDMA ; ; READ CCP/BDOS ; WREAD: CALL DISKRD JR NZ,WEROR ;IF ERROR THEN EXIT ; ; NEXT SECTOR ; LD HLT ERROR, OUTPUT MSG & HALT ; WEROR: LD HL,MSGLE ;OUTPUT ERROR MESSAGE CALL EDITOR HALT ; ; ; BOOT OK, INIT PAGE 0 ; ARD PRESENT CALL CLK1 ; ; IF CLOCK PRESENT THEN TURN ON CLOCK DRIVE ; OR A,A LD A,38H ;COND. JR (ON) JR NZ,CLKON RROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DISKWR: LD A,PB_WRITC ;SELECT WRITE OPVE IS STILL IN C REGISTER LD (DVRTPTR),HL ; ; PREFETCH DRIVER EXECUTION ADDRESS FROM TABLE ; LD E,(HL) ;STORE ADDRESS 2O) CP A,-2 ;0: NO ID, -1: JADE ID, -2: EXTENDED ID JR NZ,LGDEF ; ; ELSE XFER ID SECTOR DATA TO TABLES ; CALL TRNONE IF STHD <> 0 CP A,STHD JR C,LGCKFD ENDIF CP A,NDHD + 1 JR NC,LGCKFD ; ; ELSE USE HARD DISK DEFAULTS ; CA) AND A,3 ;MODULO 4 LD C,A LD E,0 CALL SELDSK LD A,L ;IF ERROR THEN ABORT OR A,H JR Z,WEROR ; ; READ BOOT DI,BTSEC INC (HL) ; LD DE,SECSZ ;DMA := DMA + SECTOR SIZE LD HL,(BTDMA) ADD HL,DE LD (BTDMA),HL ; ; IF NOT INTO BDO WZRPG: ; ; INIT BIOS WARM START IN PAGE 0 ; LD A,0C3H LD HL,BIOS + 3 LD (PAGE0),A LD (PAGE0 + 1),HL ; ; INIT B; ; ELSE TURN OFF CLOCK DRIVE ; LD A,18H ;UNCOND. JR (OFF) (CAUSES JUMP TO ILLEGAL) ; CLKON: LD (INHCLK),A ; ENDIF  JP DISKOP ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SELECT DRIVE FUNCTION ; L INC HL LD D,(HL) INC HL LD (DVRXADR),DE ; ; FETCH FLAGS ; LD C,(HL) ; ; COMPUTE DISK PARAMETER TABLE ADDRESS  ;ASSUME NO TRANSLATION ; ; IF HARD DISK OR DOUBLE DENSITY THEN NO TRANSLATION ; LD A,(DEFBFR + ID_FLGO) AND A,[1 SHL LL TRNONE ; NO XLATE LD HL,HDPBK ; ; XFER DATA TO TABLES ; SEL2: PUSH HL CALL DPBAD ; USE DEFAULT TABLE POP HL RECTORY ; LD BC,DEFBFR ;SET XFER ADDRESS (USE DEFAULT BUFFER) CALL SETDMA ; LD BC,BD_SEC ;SET DIRECTORY SECTOR CALL S THEN READ NEXT SECTOR ; LD DE,BDOS XOR A,A SBC HL,DE JR C,WREAD ; ; ELSE IF AT BEGINNING OF BDOS THEN SET UP NEW DOS CALL VECTOR IN PAGE 0 ; LD HL,BDOS + 6 LD (BDOSJV),A LD (BDOSJV + 1),HL ; ; INIT BIOS CALL VECTOR IN PAGE 0 ;  ; ; PASS DEFAULT DISK TO CCP ; LD A,(DEFDRV) LD C,A JP CCP SUBTTL BIOS DISK FUNCTION ROUTINES ;+++++++++++++++++OG-ON - SET DISK PARAMETER BLOCK ; ENTRY- C= DRIVE # ; E= 0 IF NEW SELECT ; EXIT - HL= PTR TO DPT OR 0 FOR ERROR ; ;++++++ ; LD HL,(BTDRV) LD H,0 ADD HL,HL ;DISK # * 16 ADD HL,HL ADD HL,HL ADD HL,HL LD DE,D0DPH ADD HL,DE ; ; IF NDF_DTDB] OR [1 SHL DF_HARDB] ; ; ELSE SET TRANSLATION ; CALL Z,TR8 ; ; XFER DISK DATA TO DPB ; NOX: CALL DPBAD ;G LD BC,DPBSZ LDIR JR SEL1 ; ; ; USE 8" FLOPPY DEFAULTS ; LGCKFD: CALL TR8 LD HL,SD8PBK JR SEL2 ;************SETSEC ; LD BC,0 ;SET TRACK TO 0 CALL SETTRK ; CALL DISKRD JR NZ,WEROR ; ; CHECK FOR VALID BOOT DIRECTORY ; LDTRACK & SECTOR ; JR Z,RDBDOS ; ; ELSE IF NOT AT BIOS THEN READ NEXT SECTOR ; LD DE,BIOS - BDOS SBC HL,DE JP C,WREALD HL,BIOFUNC LD (BFUNRSV),A LD (BFUNRSV + 1),HL ; ; SET DEFAULT SECTOR BUFFER ; LD BC,DEFBFR CALL SETDMA ; IF +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; READ A DISK SECTOR ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ SELDSK: ; ; ASSUME ERROR ; LD HL,0 ; ; IF UNSOT FIRST SELECT OR LOGON INHIBITED THEN RETURN TABLE PTR ; LD A,(LOGRQ) OR A,C CPL AND A,1 RET Z ; ; ELSE LOG ON ET ADDR OF DPB LD HL,DEFBFR + ID_SPTO LD BC,DPBSZ LDIR ; ; XFER DISK PHYSICAL DATA TO TABLE ; LD HL,DEFBFR + ID_FLG**************************************************************** ; ; HOME DRIVE - TREAT AS SEEK TRK 0 ; EXIT - BC= 0 ; ;*0 %+ &, !'- "(. #)/ $*0*************************************************************************** HOME: LD BC,0 ;*************************************************** SETDMA: LD (BTDMA),BC XOR A,A LD (BTDMAX),A RET ;++++++++++++++++++++++++++++++++++++++++++++++C RET SUBTTL DISK SUPPORT ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ;  CODE ; ENTRY- A= IOPB COMMAND ; EXIT - A= 0: OK; /0: ERROR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++D A,(DE) ;FETCH BYTE PUSH DE ;SAVE REGS PUSH BC CALL PRHEX ;OUTPUT ERROR CODE ; LD C,' ' CALL COC ; POP BC ;RE;RETURN DPB_PTR = 0 FOR SELECT FUNCTION LD A,-1 ;RETURN -1 TO BDOS OR A,A RET ;*************************************+++++++++++++ ; ; RETURN DRIVE PARAMETER BLOCK ADDR FUNCTION ; EXIT - DE= DPB PTR ; HL= ? ; ;++++++++++++++++++++++++++++H LOGICAL DRIVE ; LD A,(BTDRV) ;IF EVEN THEN ADD 0 ELSE ADD 128 RRCA AND A,80H LD E,A ;COMPUTE SECTOR LD D,0 LD H********************************************* ; ; SET TRACK # ; ENTRY- BC= TRACK # ; ;*************************************++++++++++++++++++++++++++++++ ; ; SECTOR TRANSLATION FUNCTION ; ENTRY- DE= 0: NO XLATE, ELSE PTR TO XLATE TABLE ; BC= SECTLOGON DISK FUNCTION ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DISKOP: ; ; SET UP IOPB ; LD HL,BTTRK LD DE,IOPB + PB_TRKO LD BC,PB_BCNTO - PB_TRKO LDIR ; DISKOSTORE REGS POP DE INC DE ;NEXT ERROR BYTE DJNZ DSKER1 ;IF NOT DONE THEN LOOP ; LD HL,DSKEB ;OUTPUT ERROR MESSAGE CA*************************************** ; ; SET 3740 SECTOR TRANSLATION PROCEDURE ; ENTRY- (DTPTR)= MUST BE PTR TO DTP ; EXI++++++++++++++++++++++++++++++++++++++++++++++++ DPBAD: LD HL,(DTPTR) ;FETCH BASE ADDR LD DE,10 ;ADD OFFSET OF DPB PTR ADDL,(IOPB + PB_SECO) ; PUSH HL ;SAVE SECTOR TO RESTORE LATER ; ADD HL,DE LD (IOPB + PB_SECO),HL ; ; EXECUTE IOPB ; *************************************** SETTRK: LD (BTTRK),BC RET ;***************************************************OR # TO XLATE ; EXIT - HL= XLATED SECTOR OR (BC) + 1 ; BC= UNCHANGED ; A, DE= ? ; ;+++++++++++++++++++++++++++++++++++++++++ DISKLOG: ; ; SET DESCRIPTOR SECTOR XFER ADDRESS TO DEFAULT BUFFER ; LD HL,DEFBFR LD (IOPB + PB_DMAO),HL XOR A,A P2: LD (IOPB + PB_CMDO),A ; ; FETCH DRIVER VECTOR & EXECUTE DISK DRIVER ; DKOPLP: PUSH IY ;SAVE IY LD IY,(DVRTPTR) LL EDITOR ; ; GET USER RESPONSE ; CALL CI ;GET USER RESPONSE ; PUSH AF ;SAVE CHAR LD C,A ;ECHO CHAR CALL COC T - DE, HL= ? ; ;**************************************************************************** TR8: TR3740: LD DE,SDTRAN ;  HL,DE LD E,(HL) ;FETCH DPB PTR INC HL LD D,(HL) RET SUBTTL HARD DISK ROUTINES ;++++++++++++++++++++++++++++++++ CALL XPRIM ; ; RESTORE SECTOR ; POP HL LD (IOPB + PB_SECO),HL ; ; DONE ; RET ;+++++++++++++++++++++++++************************* ; ; SET SECTOR ; ENTRY- BC= SECTOR # ; ;*********************************************************++++++++++++++++++++++++++++++++++++++ SECTRN: ; ; IF NO TRANSLATION THEN RETURN SECTOR++ ; LD A,D ;IF TABLE ADDR = 0 TH LD (IOPB + PB_DMAXO),A ; ; SET DESCRIPTOR SECTOR SECTOR ; LD HL,ID_SECT LD (IOPB + PB_SECO),HL ; ; SET DESCRIPTOR;FETCH TABLE BASE ; LD HL,DKOPRET ;PUT RETURN ADDRESS ON STACK PUSH HL ; LD HL,(DVRXADR) ;FETCH DRIVER ADDRESS PREFETCHEPOP AF ; AND A,5FH ;INSURE UPPER CASE ; ; IF RETRY THEN RETURN TO CALLER ; CP A,'R' ;IF RETRY THEN RETURN TO CALLER SETTR: LD HL,(DTPTR) LD (HL),E INC HL LD (HL),D RET ;**************************************************************++++++++++++++++++++++++++++++++++++++++++++ ; ; HARD DISK DRIVER FUNCTION ; ENTRY- IY= DRIVER TABLE PTR ; EXIT - A= 0: OK; +++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE IOPB PRIMITIVE ; EXIT - A= 0: OK, /0: ERROR ; ;++++++++******************* SETSEC: LD (BTSEC),BC RET ;***********************************************************************EN NO TRANSLATION OR A,E JP Z,NOTRAN ; ; ELSE CALCULATE NEW SECTOR FROM TABLE ; EX DE,HL ADD HL,BC LD L,(HL) ;  SECTOR TRACK ; LD L,H ;H == 0 FROM LAST OPERATION (HL= 0) LD (IOPB + PB_TRKO),HL ; ; PASS COMMAND TO EXECUTOR ; LDD FROM TABLE JP (HL) ; ; DRIVER RETURNS HERE ; DKOPRET: POP IY ; ; IF NO ERRORS THEN RETURN ZF ; RET Z ;IF NO JR Z,DKOPLP ; ; ELSE IF ABORT THEN DO WARM BOOT ; CP A,'A' ;IF ABORT THEN RE-BOOT JP Z,0 ; ; ELSE IF IGNORE THEN************** ; ; SET NO SECTOR TRANSLATION PROCEDURE ; EXIT - HL, DE= ? ; ;**********************************************/0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ HDEXEC: ; ; CONVERT LOGICAL DRI++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ XPRIM: ; ; SET FLAGS TO NONE FOR NOW ; XOR A,A LD***** ; ; SET TRANSFER ADDR ; ENTRY- BC= ADDRESS ; EXIT - A= 0 ; ;******************************************************** LD H,0 RET ; ; ; CONVERT FROM CP/M'S LOGICAL SECTOR {0..N-1} TO PHYSICAL SECTOR {1..N} ; NOTRAN: LD HL,1 ADD HL,B A,PB_LOGC JR DISKOP2 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; COMMON DISK I/O_ERROR THEN RETURN ; ; PRINT ERROR ; LD HL,DSKEM ;OUTPUT PREFIX CALL EDITOR ; LD DE,IOPB LD B,PB_SIZE DSKER1: L RETURN NO ERROR ; SUB A,'I' ;IF IGNORE THEN RETURN NO ERROR RET Z ; ; ELSE RETURN ERROR TO BDOS ; FDSKER: LD HL,0 ****************************** TRNONE: LD DE,0 JR SETTR ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++VE TO PHYSICAL DRIVE ; LD A,(IY + DVRPDRV) ;0,1: DRV 0, 2,3: DRV 1 LD (IOPB + PB_DRVO),A ; ; OFFSET LOGICAL ADDRESS WIT (IOPB + PB_FLGO),A ; ; SET XFER COUNT ; LD HL,SECSZ LD (IOPB + PB_BCNTO),HL ; ; EXECUTE THE PRIMITIVE IN ROM ; 0 %+ &, !'- "(. #)/ $*0PUSH IX LD IX,IOPB ;PASS PTR TO IOPB LD HL,DK_DSKX ;PRIMITIVE ENTRY LD A,(DK_PROM) ;FETCH PROM # CALL EXROM ;EXECUTE T CALL XPRIM ; ; RESTORE THE MODIFIED SECTOR SO RETRY WILL WORK ; POP HL LD (IOPB + PB_SECO),HL ; ; DONE ; RET ON RET ; STACK, EXECUTE FUNCTION ADDRESS ON STACK ;####################################################################++++++++++++++++++++++++++++++++ ; ; RETURN DRIVER TABLE PTR FUNCTION ; ENTRY- C= DRIVE # (E FOR FUNCTION CALL) ; EXIT - HL=UNCTION ; ENTRY- IX= IOPB PTR ; EXIT - A= 0: OK ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ TO ASCII USING DAA TRICK ; AND A,0FH ADD A,90H DAA ADC A,40H DAA ; ; OUTPUT CHAR TO CONSOLE ; LD C,A CALL C************************** INTCPT: LD A,C ;CHECK CALL VALIDITY CP A,41 ;IF <= 40 THEN OK ; BDOSV EQU $ + 1 JP C,BDOS + ; ILLEGC: PUSH BC ;SAVE FUNCTION # ; ; OUTPUT WARNING MESSAGE ; LD HL,ISCMSG ;OUTPUT WARNING CALL EDITOR ; ; OUTPHE PRIMITIVE POP IX ; ; RETURN THE COMMAND RESULTS STATUS ; LD A,(IOPB + PB_STATO) OR A,A RET SUBTTL JADE FLO SUBTTL BIOS FUNCTION CALLS ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; FUNCTION DI######## ; ; BIOS FUNCTION TABLE ; ;############################################################################ BFUNTBL:  DRIVER TABLE BASE PTR ; A, C= 0 ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; BIO+++ EXIOPB: ; ; SET UP FOR CALL ; LD HL,DK_DSKX LD A,(DK_PROM) CALL EXROM ; ; FETCH & RETURN RESULT STATUS ; OC ; ; RETURN DATA ; POP AF RET ;*************************************************************************** ; ;11H ;THIS ADDR MODIFIED BY WARM BOOT RTN ; ; THE FOLLOWING CONDITIONAL JUMP IS MODIFIED TO AN UNCONDITIONAL JUMP BY ; THE WUT FUNCTION # ; POP HL LD A,L CALL PRHEX ; ; OUTPUT NEW LINE ; CALL CRLF ; ; RETURN NULLS ; XOR A,A ;BC = PPY DRIVER ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; JADE 8" FLOPPY DISK DRISPATCHER ; EXIT - A= -1: ERROR, 0: OK ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ BIOFUN DW RETVERS ;0:RETURN VERSION # DW RETDVRTF ;1:RETURN DISK PHYSICAL CONFIGURATION TABLE PTR DW EXIOPB ;2:EXECUTE THE IOPB S CALL ENTRY (E= DRIVE #) ; RETDVRTF: LD C,E ; RETDVRT: LD HL,DVR0 ;START AT 1ST TABLE ; ; IF DRIVE == 0 THEN ALREALD A,(IX + PB_STATO) OR A,A ;TEST RESULT FOR RETURN RET SUBTTL NON-DISK PROCEDURES ;******************************* NEWLINE PROCEDURE ; ;*************************************************************************** CRLF: LD C,CR CALL COC ARM BOOT ROUTINE IF THE CLOCK/CALENDAR BOARD IS NOT PRESENT ; IF NOT MODIFIED, THEN IT IS ALLWAYS FALSE (NOP). ; INHCLK: JR HL = A = 0 LD L,A LD H,A LD C,A LD B,A RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++VER FUNCTION ; ENTRY- IY= DRIVER TABLE PTR ; EXIT - A= 0: OK; /0: ERROR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++C: ; ; IF FUNCTION # NOT IN TABLE THEN RETURN -1 ; LD A,C CP A,MAXFUNCS LD A,-1 RET NC ; ; ELSE COMPUTE TABLE E MAXFUNCS EQU ($ - BFUNTBL) / 2 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN DY THERE ; LD A,C OR A,A RET Z ; ; ELSE IF ILLEGAL DRIVE THEN RETURN ERROR ; CP A,NDRVS JR C,RETDV2 ; OR A,A ********************************************* ; ; OUTPUT HEX DATA TO CONSOLE SUBR ; ENTRY- A= DATA ; EXIT - A, C= ? ; ;***LD C,LF JP COC IF INTCPTS SUBTTL ADDITIONAL FUNCTIONS TO SUPPORT CDOS PROGRAMS ;************************************C,ILLEGC ; ; NOW CHECK FOR EXTENDED CALLS ; CP A,8DH ;IF RETURN VERSION THEN RETURN IT JR Z,RETCVER ; CP A,90H ;IF +++++++ ; ; CDOS RETURN VERSION FUNCTION ; MAKES CLOCK/CALENDAR WORK. ; EXIT - B= 1 ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ FD8EXEC: ; ; CONVERT LOGICAL DRIVE TO PHYSICAL DRIVE ; LD A,(IY + DVRPDRV) LD (IOPB + PB_DNTRY ; PUSH HL ;SAVE POSSIBLE DATA ; LD HL,BFUNTBL LD A,C ADD A,A ADD A,L LD L,A LD A,0 ADC A,H LD H,A ; BIOS VERSION # ; EXIT - HL= VERSION # IN BINARY {0.00,..655.35} ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ RET ; ; ; ELSE COMPUTE TABLE PTR ; RETDV2: LD B,C LD DE,DVRSIZ ; RETDVL: ADD HL,DE DJNZ RETDVL ; ; RETURN NO ************************************************************************* PRHEX: ; ; PROCESS HIGH NIBBLE 1ST ; CALL PRDI*************************************** ; ; SYSTEM CALL INTERCEPT ROUTINE CHECKS FOR ILLEGAL BDOS CALLS & ; PRINTS MESSAGE INOT CLOCK THEN ERR JR C,ILLEGC ; JR Z,CLKCAL ;IF CALENDAR THEN GET IT ; CP A,92H JR C,CLKSET ;IF SET FUNCTION THEN SET++++++++++++++++++++++++++++++++++++++++++ RETCVER: LD B,1 RET SUBTTL CLOCK ROUTINES ;++++++++++++++++++++++++++++++++RVO),A ; ; FETCH SECTOR DATA ; LD HL,(IOPB + PB_SECO) PUSH HL ;SAVE FOR XPRIM RESTORE ; ; ; EXECUTE THE IOPB ; ; EXECUTE TABLE ADDRESS ; LD A,(HL) INC HL LD H,(HL) LD L,A ; EX (SP),HL ;PUT CALLER'S DATA IN HL, FUNCTION ADDR ++++++++++++++++++ RETVERS: LD HL,VERSN XOR A,A ;RETURN NO ERROR RET ;++++++++++++++++++++++++++++++++++++++++++++ERROR ; XOR A,A RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE IOPB FG ; ; SWAP HIGH & LOW NIBBLES ; PRDIG: RLCA RLCA RLCA RLCA ; ; SAVE DATA FOR RETURN ; PUSH AF ; ; CONVERTF ILLEGAL. ALSO IMPLEMENTS CDOS CLOCK/CALENDAR ; SYSTEM CALLS FOR ASMB. ; ;************************************************* CLOCK ; JR Z,CLKTIM ;IF TIME THEN GET IT ; CP A,93H JR Z,CLKRDC ;IF READ CLOCK THEN GET IT ; ; ILLEGAL SYSTEM CALL ++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN CALENDAR FUNCTION 90H ; EXIT - A= DAY ; B= MONTH ; C= YEAR ; L=0 %+ &, !'- "(. #)/ $*0 DAY OF WEEK ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ CLKCAL: LD HL,CLK_CAL ;ROM ENT************************* ; ; CLOCK SET FUNCTION 91H ; ENTRY- DE= CLOCK IMAGE BUFR PTR (13 BYTES LONG) ; ;*****************ROM ; ; ROM PROCEDURE RETURNS HERE ; EXROMR: PUSH AF ;SAVE RETURN VALUE CALL GETMON ;RESELECT MONITOR ROM ; POP AF +++++++++++++++++++++++++++++++++++++++++++++ CNSCK: IF USEMON CALL GETMON JP MR_CONSTS ELSE IN A,(NT_STAT) ;IF D+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ NTOST: IN A,(NT_STAT) CPL ;REVERSE SENSE AND A,1 SHL *********************************************************************** LO: IF USEMON CALL GETMON JP MR_LSTOUT ELSE******************************* ; ; MESSAGE EDITOR ; ENTRY- HL= TEXT PTR (BIT 7= 1: TERMINATOR) ; EXIT - REGS= ? ; ;******SAV),A CALL GETMON ; ; PRINT PROMPT ; LD HL,ITMSG IQCONT: CALL EDITOR ; LD HL,IQMSG ;QUERY USER CALL EDITOR ; ;RY POINT JR CLK2 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN TIME FUNCTION*********************************************************** CLKSET: LD C,CLK_F2 ; CLK1: LD HL,CLK_FUN ; CLK2: LD A,CLK_RO ;RETURN VALUE RET SUBTTL CHAR I/O ROUTINES ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ATA NOT READY THEN RETURN 0 AND A,1 SHL NT_READY TTOST1: RET Z LD A,-1 ;ELSE RETURN -1 RET ENDIF ;*************NT_BUSY JR TTOST1 ENDIF ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; READER DR RET ENDIF ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN LIST DEVICE STA********************************************************************** EDITOR: LD C,(HL) ;MESSAGE EDIT LOOP PUSH HL ;SAVE P GET & ECHO USER INPUT ; CALL CI ; PUSH AF LD C,A CALL COC POP AF ; ; IF OPTION IS CTRL-C THEN WARM BOOT ;  92H ; EXIT - A= SECONDS ; B= MINITS ; C= HOURS ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++M ; ; FALL INTO ROM EXECUTER ; ENDIF ;****************************************************************************+ ; ; CONSOLE INPUT ; EXIT - A= CHAR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ CI: *************************************************************** ; ; CONSOLE OUTPUT ; ENTRY- C= CHAR TO OUTPUT ; ;**********IVER - DUMMY ; EXIT - A= CTRL-Z ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ READER: LD ATUS ; EXIT - A= 0: BUSY, FFH:READY ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ LISTST: TR 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 ;ELSECP A,3 ;IF CTRL-C THEN WARM BOOT JP Z,PAGE0 ; ; IF OPTION IS YES THEN WARM BOOT ; AND A,5FH ;IGNORE CASE ; CP A,'Y++++++ CLKTIM: LD HL,CLK_TIM JR CLK2 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; ; EXECUTE ROM ROUTINE ; ENTRY- HL= ENTRY ADDRESS ; A= ROM # ; EXIT - ? ; ;******************************************* IF USEMON CALL GETMON ;SWITCH IN MONITOR ROM JP MR_CONIN ;USE MONITOR ELSE CALL CNSCK ;IF NO CHAR RDY THEN WAIT ****************************************************************** COC: IF USEMON CALL GETMON JP MR_CONOUT ELSE C,CTRLZ ;FAKE EOF ;**************************************************************************** ; ; PUNCH DRIVER ; ENTRY IF USEMON CALL GETMON JP MR_LSTSTS ELSE LD A,-1 RET ENDIF ;********************************************* PRINT NEXT CHAR JR EDITOR IF INTRPTS SUBTTL INTERRUPTS ;-------------------------------------------------------------' JP Z,PAGE0 ; ; IF OPTION IS INTERRUPT THEN EXECUTE RESTART 7 ; CP A,'I' JR NZ,ITRAP1 ; POP BC ;RESTORE REGS 1ST ; READ CLOCK TIME FUNCTION 93H ; ENTRY- DE= PTR TO 13 BYTE BUFFER FOR CLOCK DATA ; ;+++++++++++++++++++++++++++++++++++++++********************************* EXROM: AND A,M2_RSMK ;MASK OUT UNUSED BITS OUT (M2_RSEL),A ; PUSH HL ;SAVE ROM ENTRY  JR Z,CI IN A,(NT_DATA) ;ELSE RETURN CHAR RET ENDIF ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ALL NTOST ;IF BUSY THEN WAIT OR A,A JR Z,COC LD A,C OUT (NT_DATA),A RET ;+++++++++++++++++++++++++++++++++++++- C= CHAR TO OUTPUT ; ;**************************************************************************** PUNCH: RET ;*************************************** ; ; GET MONITOR PROM SUBR ; EXIT - A= ? ; ;************************************************--------------- ; ; USER INTERRUPT ; ;---------------------------------------------------------------------------- ITRAP:  POP HL POP AF JP 0038H ; ; IF OPTION IS MONITOR THEN EXECUTE MONITOR TRAP ; ITRAP1: CP A,'M' JR NZ,ITRAPR ; PO+++++++++++++++++++++++++++++++++++++ CLKRDC: LD C,CLK_F1 JR CLK1 ;***************************************************VECTOR ; LD HL,EXROMR ;PUT RETURN ADDR ON STACK EX (SP),HL ;SWAP RETURN ADDRESS WITH ROM ENTRY VECTOR JP (HL) ;EXECUTE ++++++++++++++ ; ; RETURN CONSOLE STATUS ; EXIT - A= 0: NOT READY ; FFH: CHAR READY ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN CONSOLE OUTPUT READY STATUS ; EXIT - A= 0: BUSY, FFH: READY ; ;+++++++++******************************************************************** ; ; PRINTER DRIVER ; ENTRY- C= CHAR TO OUTPUT ; ;********************************* GETMON: LD A,MR_RNUM OUT (M2_RSEL),A RET ;*********************************************; ; SAVE REGS FIRST ; PUSH AF PUSH HL PUSH BC ; ; SAVE CURRENT ROM & GET MONITOR ROM ; IN A,(M2_RSEL) LD (ROMP BC POP HL POP AF JP 0F824H ; ; ELSE RESTORE REGS & RETURN ; ITRAPR: LD A,(ROMSAV) ;RESTORE ROM # OUT (M2_RSEL)0 %+ &, !'- "(. #)/ $*0,A ; POP BC POP HL POP AF EI ;RE-ENABLE INTERRUPTS RET ;------------------------------------------------------################################################### ; ; COMMON I/O PARAMETER BLOCK ; ;######################################S 1 DVRDTYP DS 1 ;RESERVED FOR DISK TYPE DVRCYLS DS 2 ;DISK CYLINDERS DVRHDS DS 1 ;HEADS ; ; DEFINE THE STRUCTURE SIZE ;YPE DW #CY ;;CYLS DB #HD ;;HEADS LIST OFF ENDM DVR0: IF BOOT = 10H ALLDRV HDEXEC,4,60H,32,1,32,1,32,1,10H,256,4AULT 8" FLOPPY DISK PARAMETER BLOCK ; IBM 3740 SINGLE DENSITY FORMAT ; ;########################################################################################################### HDPBK: DW 128 ;SECTORS PER TRACK (LOGICAL) (SPT) DB 5 ;BLOCK SHIFT FE BOUNDARY ; IF $ AND 0FFH DS 100H - ($ AND 0FFH) ENDIF INTABL: REPT 7 ;1ST 7 ARE UNSUPPORTED LIST OFF DW ILLINT ###################################################### ; ; DRIVE PARAMETER HEADER AREA ; 1 PER DRIVE ; ;###################---------------------- ; ; UNSUPPORTED INTERRUPT ; ;------------------------------------------------------------------------###################################### IOPB: REPT PB_SIZE LIST OFF DB 0 LIST ON ENDM ;############################ DVRSIZ DS 0 ENDM ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; MACRO TO DEFINE THE  ALLDRV HDEXEC,4,60H,32,1,32,1,32,1,10H,256,4 ALLDRV HDEXEC,5,60H,32,1,32,1,32,1,10H,256,4 ALLDRV HDEXEC,5,60H,32,1,32,1,3####################### SD8PBK: DW 26 ;SECTORS PER TRACK DB 3 ;BLOCK SHIFT FACTOR DB 7 ;BLOCK MASK DB 0 ;NULL MASK ACTOR (BSH) DB 31 ;BLOCK MASK (BLM) DB 1 ;NULL MASK (EXM) DW 1015 ;DISK SIZE (CLUSTERS -1) (DSM) DW 1152 / 2 ;DI LIST ON ENDM ; DW ITRAP ;INT 8 IS USER INTERRUPT ENDIF ;################################################################################################################# ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@---- ILLINT: PUSH AF ;SAVE ALL 8080 REGS PUSH HL PUSH BC LD HL,ILLIM ;NOTIFY USER OF INT JR IQCONT SUBTTL INIT################################################ ; ; DISK DRIVER TABLES ; ;#################################################DRIVER TABLE RECORD ; ENTRY- #DADD= DRIVER ADDRESS ; #PD= PHYSICAL DRIVE # ; #FG= DRIVE FLAGS (IDFLGO) ; #S0= TRK 0 SPT 2,1,10H,256,4 ALLDRV FD8EXEC,0,0,26,0,26,0,26,0,0,77,1 ALLDRV FD8EXEC,1,0,26,0,26,0,26,0,0,77,1 ENDIF IF BOOT = 3 DW 242 ;DISK SIZE -1 DW 63 ;DIRECTORY MAX DB 11000000B ;ALLOC 0 DB 0 ;ALLOC 1 DW 16 ;CHECK SIZE DW 2 ;TRACK OFFSERECTORY MAX (DRM) DB 0FFH ;ALLOCATION 0 (AL0) DB 10000000B ;ALLOCATION 1 (AL1) DW 0 ;CHECK SIZE (CKS) DW 2 ;T#################### ; ; MESSAGES ; ;############################################################################ MSGLE: @@@@@@@@@@@ ; ; GENERATE A DISK PARAMETER TABLE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@IALIZED DATA ;############################################################################ ; ; 3740 SECTOR TRANSLATION TABLE ########################### STRUCT 0 DVRADD DS 2 ;START ADDRESS OF DISK DRIVER DVRFG DS 1 ;FLAGS (BIT 0= 1: INHIBIT LOGON) ; #Z0= TRK 0 SIZE ; #S1= TRK 1 SPT ; #Z1= TRK 1 SIZE ; #SD= DATA TRKS SPT ; #ZD= DATA TRKS SIZE ; ;@@@@@@@@@@@@@@@@@@ALLDRV FD8EXEC,0,0,26,0,26,0,26,0,0,77,1 ALLDRV FD8EXEC,1,0,26,0,26,0,26,0,0,77,1 ALLDRV HDEXEC,4,60H,32,1,32,1,32,1,10H,256T DB 0 ;PHYSICAL RECORD SHIFT FACTOR DB 0 ;PHYSICAL RECORD MASK ; ; DEFAULT DISK PHYSICAL PARAMETERS ; DB 0 ;FLAGSRACK OFFSET (OFF) ; ; ; DB 01100000B ;FLAGS 256 BPS, HARD, SSSD DB 32,1,32,1,32,1 ;32 SPT, 256 BPS DB 10H ;TYPE DWDM CR,LF,'LOAD ERROR' ; DSKEM: DB CR,LF,'Disk Error Status:' DM CR,LF,'CM DR TL TH SL SH FG AL AH AX CL CH ST S1 S2 S3',CR,L@@@@@@@@@ ALLDPH: MACRO #D LIST ON D#D(DD)DPH: ;DRIVE PARAMETER HEADER FOR DRIVE #D(DD) DW 0 ;;SECTOR TRAN TBL (OR 0 IF ; **** CP/M SINGLE DENSITY **** ; ;############################################################################ SDTRAN: GXLADVRPDRV DS 1 ;PHYSICAL DRIVE ; ; THE FOLLOWING MAY BE BROUGHT OFF DISK DESCRIPTOR OR FROM DEFAULT TABLES ; DVRFLG DS 1 ;DI@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ALLDRV MACRO #DADD,#PD,#FG,#S0,#Z0,#S1,#Z1,#SD,#ZD,#DT,#CY,#HD L,4 ALLDRV HDEXEC,4,60H,32,1,32,1,32,1,10H,256,4 ALLDRV HDEXEC,5,60H,32,1,32,1,32,1,10H,256,4 ALLDRV HDEXEC,5,60H,32,1,32,1 DB 26,0,26,0,26,0 ;SECTORS PER TRACK, SECTOR SIZE (128) DB 0 ;TYPE DW 77 ;CYLS DB 1 ;HEADS ;################### 256 ;CYLS DB 4 ;HEADS ;############################################################################ ; ; MODE 2 INTERF DSKEB: DM CR,LF,'Abort, Ignore, Retry, (BDOS) - ' ; IF INTCPTS ISCMSG: DM CR,LF,'ILL SYS CALL, #= ' ENDIF IF IN NO XLATE) DW 0 ;;SCRATCH AREA DW 0 ;;" DW 0 ;;" DW DIRBF ;;DIRECTORY BUFFER PTR DW D#D(DD)DPB ;;DRIVE PARAMETER BTE 26,6 ; 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 ;#########################SK FLAGS DVR0SPT DS 1 ;TRK 0 SECTORS PER TRK DVR0SZ DS 1 ;TRK 0 SECTOR SIZE DVR1SPT DS 1 DVR1SZ DS 1 DVRDSPT DS 1 DVRDSZ DIST ON DW #DADD DB 0 ;;LOGON INHIBIT FLAG (LOGON ENABLED) DB #PD DB #FG DB #S0,#Z0,#S1,#Z1,#SD,#ZD DB #DT ;;DISK T,32,1,10H,256,4 ENDIF LIST ON ;############################################################################ ; ; DEF######################################################### ; ; DEFAULT 8" HARD DISK PARAMETER BLOCK ; ;######################RUPT VECTOR TABLE ; ;############################################################################ ; ; START ON AN EVEN PAGTRPTS ITMSG DM CR,LF,'User' ILLIM DM CR,LF,'Ill.' IQMSG DM ' Int. Abort? (Y/N/I/M) - ' ENDIF ;######################LK PTR IF ((DD - 1) <= NDHD) AND ((DD - 1) >= STHD) DW 0 ;;NO CHECKS ON HARD DISK ELSE DW D#D(DD)CHK ;;DRIVE DISK C0 %+ &, !'- "(. #)/ $*0HECKSUMS ARRAY PTR ENDIF DW D#D(DD)ALL ;;DRIVE CLUSTER ALLOCATION BIT MAP PTR LIST OFF ENDM ; ; DEFINE THE DATA ;############################# ; ; VARIABLES ; ;########################################################################### #D LIST ON IF ((DD - 1) >= STHD) AND ((DD - 1) <= NDHD) D#D(DD)ALL: DS 127 ;ALLOCATION BIT MAP FOR 8" HARD DRIVE #D(DD) Y CLUSTER SIZE ; 1K= 3, 2K= 4, 4K= 5, 8K= 6, 16K= 7 DPBBLM DS 1 ;BLM- BLOCK MASK ; 1K = 7, 2K= 15, 4K= 31, 8K= 63, 16K=/SEC ; 0: 128, 1: 256, 2: 512, 3: 1024 DPBPHM DS 1 ;PHM- PHYSICAL RECORD MASK BASED ON BYTES/SEC ; 0: 128, 1: 256, 3: 5 FUNCTION DEFINITIONS Th M5 BIO function allo program t modif BIO privat dat withou knowin wher -1 th functio i no implemente (illegal I th erro cod i - the on o mor argument ar i error.  DD DL 1 REPT NDRVS LIST OFF ALLDPH 0123456789ABCDEF DD DL DD + 1 LIST ON ENDM ; ; LAST OF INITIALIZED CODE RE# DTPTR: DS 2 ;DRIVE TABLE PTR LOGRQ: DS 1 ;LOG ON REQUEST REG. DVRTPTR DS 2 ;DRIVE DRIVER TABLE BASE ADDRESS PTR DVRXADR DS ENDIF IF ((DD - 1) >= ST8FD) AND ((DD - 1) <= ND8FD) D#D(DD)ALL: DS 57 ;ALLOCATION BIT MAP FOR 8" DRIVE #D(DD) D#D(DD) 127 DPBEXM 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,12, 7: 1024 DPBSZ DS 0 ENDM ; ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERA th dat i locate withi th BIOS Thes function ar accesse vi th RESTAR 28 vecto i lo memor (0028H) TNo. Description  0 Return BIOS Version Number Entry- A= 0 Exit - HL= Version Number in hundredthAD FROM DISK ; BIOSND EQU $ SUBTTL UNINITIALIZED DATA AREA ;############################################################# 2 ;DRIVE DRIVER EXECUTION ADDRESS ROMSAV DS 1 ;ROM SWAP SAVE OF ORIGINAL ROM ;###########################################CHK DS 32 ;DIRECTORY CHECKSUMS STORAGE (1 BYTE PER SECTOR) ENDIF LIST OFF ENDM ; ; RESERVE THE DATA SPACE ; DD  16K= 7 DPBDSM DS 2 ;DSM- DRIVE STORAGE SIZE (IN CLUSTERS) ; INT(((#_TRACKS - OFF) * SPT * BYTES PER SECTOR) / CLUSTER SIZE)TE THE DPB FOR DRIVE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ALLDPB: MACRO #D  M5b BIOS v3.16 FUNCTIONS INTERFACE SPECIFICAhi vecto i initialize t Jum instructio b th BIO War Boo code Th function ar use b puttin th functio s {0.00 to 655.35} 1 Return Monitor Drive Number for CP/M Drive Number Entry- A= 1 C= CP/M driv############### ; ; THE FOLLOWING DATA MUST RESIDE IN THIS ORDER TO MATCH THE IOPB DATA ; ;################################################################ ; ; DRIVE ALLOCATION AREAS ; ;##########################################################DL 1 REPT NDRVS LIST OFF ALLDAL 0123456789ABCDEF DD DL DD + 1 LIST ON ENDM ;#################################### -1 DPBDRM DS 2 ;DRM- DIRECTORY SIZE -1 DPBAL0 DS 2 ;AL0,1- DIRECTORY ALLOCATION ; 1 MSB PER DIRECTORY CLUSTER ALLOCATED  LIST ON D#D(DD)DPB: DS DPBSZ ;ALLOCATION FOR DRIVE #D(DD) LIST OFF ENDM ; ; RESERVE THE DATA SPACE ; DD DL 1 REPTTION May 1,1992 REV. NC numbe i th A-register an othe require argument i th specifie registers an executin eithe RESTARԠ 28 ine number {0..15} Exit - A= {0..254}: Monitor drive number -2: Drive error BC,DE,HL############################################# BTDRV: DS 1 ;DRIVE # BTTRK DS 2 ;TRACK # BTSEC DS 2 ;SECTOR # BTFLG DS 1 ;RESE################## ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; MACRO TO DEFINE THE DR######################################## ; ; RESERVE DRIVE PARAMETER BLOCKS ; ;###########################################DPBCKS DS 2 ;CKS- # DIRECTORY SECTORS CHECKED ; (DRM +1) / 4 DPBOFF DS 2 ;OFF- # RESERVED TRACKS (USUALLY 2) ; ; ADDITI NDRVS LIST OFF ALLDPB 0123456789ABCDEF DD DL DD + 1 LIST ON ENDM IF (($ - 8000H) > 07800H) OR ($ < 8000H) CO GRH Enterprises 1129 Stonylake Ct Sunnyvale, CA .PA .structio o Callin (executing th locatio a 0028H Al function retur valu i th A-registe an flags I th Z= ? 2 Disable Logon Entry- A= 2 C= CP/M drive number {0..15} Exit - A= 0: Ok, /0: IlleRVED FOR FLAGS BTDMA DS 2 ;DMA ADDRESS BTDMAX DS 1 ;DMA EXTENDED ADDRESS ;###############################################IVE ALLOCATION & CHECKSUMS AREA ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ALLDAL: MACRO################################# STRUCT 0 DPBSPT DS 2 ;SPT- SECTORS/TRACK DPBBSH DS 1 ;BSH- BLOCK SHIFT FACTOR DETERMINED BONAL CP/M 3.0 DATA (ALSO COULD BE USED BY CP/M 2.2 DEBLOCKING) ; DPBPSH DS 1 ;PSH- PHYSICAL RECORD SHIFT FACTOR BASED ON BYTESNMSG **** BIOS TOO BIG, USE MOVCPM & RE-ADJUST! **** ENDIF END HE REVISION HISTORY REV DATE COMMENT NC 5-1-92 Initial release. .PA .HE er fla i set the n erro ha occured i cleared the th A- registe contain a erro code I th erro cod igal drive BC,DE,HL= ? 3 Enable Logon Entry- A= 3 C= CP/M drive number {0..15}  0 %+ &, !'- "(. #)/ $*0 Exit - A= 0: Ok, /0: Illegal drive BC,DE,HL= ? 4 Set Disk Format Entry- A= 4 File Control Block */ struct fcb *srch_fst(), *srch_nxt(), f_cb, *fcb_ptr; /* farcall registers */ struct regs  { puts("\nInsufficient Memory...Aborting!"); exit(1); } (BYTE *) fmt_buf = ((BYTE *) fov_file) + 5976NO, CA ; ;**************************************************************************** ; ; CONFIGURATION: ; ; CPM ; DRIVE20H ; A JADE 5" FLOPPY PHYSICAL DRIVE 0 ; B JADE 5" FLOPPY PHYSICAL DRIVE 1 ; C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE  system down to 60k. ; 3.01 26 JUN 88 GRH ; Remove 5" floppy support. Implement in CP/M-86 BIOS. ; Change single function toCP/M 3.0 DPB structure in preparation for deblocking. ; 3.05 11-3-88 GRH ; Change included data to update IOPB.PBSTAT to newrupted PB_FLG. ; 3.08 2-22-91 GRH ; Remove references to THIS_BNK & use monitor function #7 instead. ; Add track-head shift C= CP/M drive number {0..15} E:HL= Disk descriptor sector image ptr Exit - A= 0: Ok, /0: Illegal  cpui, cpuo; /**************************************************************************** main program *****; /* Allocate format overlay buffer */ /* Top of command loop */ while (TRUE) { /**** Display Options */ printf USAGE IF BOOT = 10H ;HARD DISK BOOT CONFIG. ; A SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; B SIDE 2 & 3 OF HARD DISK0 ; D SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 0 ; E SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; F SIDE 2 & 3 OF HARD DISK return drive table ptr into a BIOS function ; call using restart instruction. ; Change LOGON to specify the ID sector & tra configuration. ; 3.06 1-28-89 GRH ; Revised primitive calling procedures to use the monitor rom function ; rather than sw factor to DPBs for future use. ; 3.09 5-15-91 GRH ; Change 8" floppy side select to track bit 0. Move calculation from ; drive BC,DE,HL= ? ***********************************************************************/ main () { /* Display signon */ printf(signon); ("\n\n\ Command Options:\n\ 0 Display BIOS Version\n\ 1 Display monitor drive number assigned to CP/M drive\n\ 2 Disab PHYSICAL DRIVE 0 ; C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; D SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ; E JADE 8" PHYSICAL DRIVE 1 ; G JADE 8" FLOPPY PHYSICAL DRIVE 0 ; H JADE 8" FLOPPY PHYSICAL DRIVE 1 ENDIF ; ;*****************ck. At same time, fix bug ; which did not specify the logon track. ; 3.02 7 JUL 88 GRH ; Add '?' to include file names. apping Roms itself. ; 3.07 11-25-90 GRH ; Modify for Ver. 1.22 Monitor. ; Fix bug in 8" Hard Disk table which benignly (at DCM8 to CBIOS. ; Remove IOPB ptr passing in IX redundancy. ; Change DPB track-head shift factor to Sector Offset like track ; } *fmt_buf, /* Ptr to the structure */ *fov_p; /* Format overlay file data ptrs */ struct { BYTE fil_name[11];  /* Initialize data */ cpui.AF = (MF_GBNK) << 8; /* get current bank # */ farcall( (WORD) MR_FUN, 0, &cpui, &cpui); le dynamic format selection (LOGON)\n\ 3 Enable dynamic format selection\n\ 4 Set disk format\n\ \n\ ^C Exit to DOS\n\  FLOPPY PHYSICAL DRIVE 0 ; F JADE 8" FLOPPY PHYSICAL DRIVE 1 ENDIF IF BOOT = 3 ; A JADE 8" FLOPPY PHYSICAL DRIVE 0*********************************************************** ; ; REVISION HISTORY: ; ; 3.00 - 26 JAN 87 GRH ; Implemente; Change hard disk system tracks directory reference to new format. ; Correct bug in drivers which caused retry to fail. (sectocurrent level) ; caused the drive table to have bad data (default table was missing ; the 2 deblocking extension bytes). ;  offset. Disk partitioning will add this value to sector word. It ; will be stored in the ID sector data to be dynamic. ; 3./* FCB filename */ char fil_txt[]; /* File text description */ } *fov_file, /* Base ptr to array */ *fov_ptr[64]; /* P this_bnk = cpui.AF >> 8; /* drive = -1; Assume no controller */ cmd_blk.pb_sts = -1; /* Force error if not access TITLE CUSTOMIZED BIOS FOR M5B LIST NOCOND BOOT EQU 10H ;10H: HARD DISK, 3: 8" FLOPPY, 20H: 5" FLOPPY ;******************** ; B JADE 8" FLOPPY PHYSICAL DRIVE 1 ; C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; D SIDE 2 & 3 OF HARD DISK PHYSICAL d new common IOPB code & Jade floppy firmware support. ; Implemented disk drive driver tables and new function to return ; a r remained ; corrupted) ; Stubbed out new Clock routines for present. ; 3.03 31 JUL 88 GRH ; Unstub Clock routines. ; 3Implement data xfer inhibit schemes with PB_FLG & PB_BCNT. ; Add pick-up of THIS_BNK data in all iopb cases. ; Remove clock bu10 5-20-91 GRH ; Change LOGON to attempt to recover from old disks better, using ; DCM8301 version controller firmware. ; trs to each file data */ BYTE *file_bp; /* Ptr into array */ unsigned int max_files; /* max files found */ /* CP/M ed */ /* Allocate heap buffer */ file_bp = fov_file = malloc(7000); /* Allocate Filename buffer */ if (fov_file == 0)******************************************************** ; ; CUSTOMIZED BIOS FOR M5B ; (c) 1981 GRH Electronics, CUPERTIDRIVE 0 ; E SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; F SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ENDIF IF BOOT = ptr to a drive table. ; Removed init of IOBYTE. ; Implemented 5" floppy driver. ; Implemented use of ROM primitives. ; Moved.04 6 AUG 88 GRH ; Remove floppy side select from BIOS & move to controller. ; Implement new ID sector format. ; Implement ffer set/read system calls. ; 12-5-90 GRH ; Remove IX IOPB ptr passing to disk drivers. ; 1-13-91 GRH ; Fix bug which cor3.11 9-2-91 GRH ; Add redlines & change for M5ZMON v.2.00. ; 3.12 9-11-91 GRH ; Add deblocking code. ; 9-17-91 GRH Ad 0 %+ &, !'- "(. #)/ $*0d r/ls & move to 59k system. ; 9-19-91 GRH Fix bug which destroyed my root directories! ; BUF_RD was writing. ; Patch ================== ; ; ASSEMBLY PARAMETERS ; ;============================================================================  BDIR.DEF *INCLUDE B:M5ZF2.DEF LIST ON ;=========================================================================TACK FRAME PTR DK_BDRV EQU 0041H ;BOOT DRIVE # FROM PROM DEFBFR EQU PAGE0 + 80H ;DEFAULT BUFFER ; ; BIOS FUNCTION CALL REIVE OF HARD DISK NDHD EQU 5 ;LAST LOGICAL DRIVE OF HARD DISK ST8FD EQU 0 ;START LOGICAL DRIVE OF 8" FLOPPY ND8FD EQU 1 ;LA@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE THE TRANSLATION TABLE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@S MACRO #VERS DD DL #VERS IF DD > 9999 DB (DD / 10000) + '0' DD DL DD % 10000 ENDIF IF DD > 999 DB (DD / 1000) ;SET SECTOR # JP SETDMA ;SET TRANSFER ADDR JP DISKRD ;PERFORM DISK READ JP DISKWR ;PERFORM DISK WRITE JP LISTST ;Rproblems with partitioning until 20MB drive installed. ; Fix TPA corruption by LOGON problem by using ROMBNK sector buffer fo; FALSE EQU 0 TRUE EQU NOT FALSE ;============================================================================ ; ; COND=== ; ; DISK OPERATING SYSTEM ADDRESSES ; ;============================================================================ ;START VECTOR ; BFUNRST EQU 28H BFUNRSV EQU PAGE0 + BFUNRST BFUNRSI EQU 0C7H + BFUNRST ;================================ST LOGICAL DRIVE OF 8" FLOPPY ENDIF ;============================================================================ ; ;@@@@@@@@@@@@@@@@@@@@@@ ; GXLATE MACRO #SECTORS, #SKEW LIST OFF NXTSEC DL 1 ;;START WITH SECTOR 1 LOWEST DL 1 ;; REPT # + '0' DD DL DD % 1000 ENDIF DB (DD / 100) + '0' DB '.' DB ((DD % 100) / 10) + '0' DB (DD % 10) + '0' ENDM ETURN LIST STATUS JP SECTRN ;TRANSLATE SECTOR JP BIOFUNC ;EXECUTE FUNCTION CALL ;####################################r ; ID sector read. ; 9-20-91 GRH Fold in redlines. ; 10-21-91 GRH Fix bugs ; 10-22-91 GRH Fix bugs ; 10-23-91 ITIONAL ASSEMBLY FLAGS ; ;============================================================================ ; INTCPTS EQU TRUE ; SYS EQU 2 ;CP/M VERSION {2,3} ; NKSYS: EQU 59 ;SYSTEM SIZE IN K BYTES KBYTE: EQU 1024 CPMSZ: EQU KBYTE * NKSYS CPMBS: E============================================ ; ; OTHER DECLARATIONS ; ;===================================================== BDOS CONSTANTS ON ENTRY TO WRITE ; ;============================================================================ ; WSECTORS LIST ON DB NXTSEC LIST OFF NXTSEC DL NXTSEC + #SKEW ;ADD SKEW FACTOR ;; IF NXTSEC > #SECTORS ;CHECK FOR OVERSUBTTL BIOS CODE ORG BIOS ;---------------------------------------------------------------------------- ; ; BIOS JUMP VEC######################################## ; ; THE FOLLOWING BOOT DATA MUST RESIDE AS DEFINED RIGHT BEFORE THE COLD ; INIT ROUT GRH Fix bugs ; 3.13 1-15-92 GRH ; Change hard disk translation to Monitor disks 4 & 5 from 6 & 7. ; ; 3.14 2-9-92 GRHENABLE SYSTEM CALL INTERCEPT WHISTLE ;============================================================================ ; ; INQU CPMSZ - (20 * KBYTE) ;CP/M BIAS VALUE CCP: EQU CPMBS + 3400H ;ADDR OF CCP BDOS: EQU CPMBS + 3C00H ;ADDRESS OF BDOS BIOS======================= ; SECSZ: EQU 128 NDRVS: EQU 6 IF BOOT = 10H ; ; 8" HARD DISK BOOT DATA ; STHD EQU 0 ;STARTRALL EQU 0 ;WRITE TO ALLOCATED WRDIR EQU 1 ;WRITE TO DIRECTORY WRUAL EQU 2 ;WRITE TO UNALLOCATED ;=======================FLOW NXTSEC DL NXTSEC - #SECTORS ;; IF NXTSEC <= LOWEST ;CHECK FOR REPEAT NXTSEC DL LOWEST + 1 LOWEST DL NXTSEC ENDITOR TABLE ; ;---------------------------------------------------------------------------- ; JP INIT1 ;COLD START ENTRY JINE START AND MUST BE IN THE 1ST SECTOR. THESE 2 WORDS ARE ; REFERENCED BY THE BOOT LOADER CODE IN ORDER TO DETERMINE THE LOAD  ; Add additional floppy disk allocation size for 1.22Mb disks. ; VERSN EQU 314 ; ;****************************************CLUDE COMIOPB3.DEF ; INCLUDE DISKS3.DEF ; INCLUDE BDIR.DEF ; INCLUDE M5ZF2.DEF ; ;========================: EQU CPMBS + 4A00H ;ADDRESS OF BDOS BIOSR: EQU 1000H - BIOS ; ; PAGE 0 LOCATIONS ; PAGE0: EQU 0 ;START OF CP/M RAM DE LOGICAL DRIVE OF HARD DISK NDHD EQU 3 ;LAST LOGICAL DRIVE OF HARD DISK ST8FD EQU 4 ;START LOGICAL DRIVE OF 8" FLOPPY ND8FD===================================================== ; ; ASCII CHARS ; ;===================================================F ENDIF ;; ENDM LIST ON ENDM ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ;P WARM ;RELOAD CCP/BDOS JP CNSCK ;GET CONSOLE STATUS JP CI ;CONSOLE INPUT JP COC ;CONSOLE OUTPUT JP LO ;PRINTER OUTADDRESS ; AND LENGTH OF THE BIOS. ; ;############################################################################ ; DB 0 ************************************ SUBTTL SYSTEM DECLARATIONS ;============================================================================================================== ; LIST OFF *INCLUDE COMIOPB3.DEF *INCLUDE DISKS3.DEF *INCLUDE FDRV: EQU PAGE0 + 4 ;DEFAULT DRIVE PARAM ADDR BDOSJV EQU PAGE0 + 5 ;BDOS SYSTEM CALL ENTRY THIS_STK EQU PAGE0 + 1CH ;CURRENT S EQU 5 ;LAST LOGICAL DRIVE OF 8" FLOPPY ENDIF IF BOOT = 3 ; ; 8" FLOPPY BOOT DATA ; STHD EQU 2 ;START LOGICAL DR========================= ; LF: EQU 0AH CR: EQU 0DH CTRLZ: EQU 1AH ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ INITIALIZE VERSION TEXT IN RAM MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; PVERPUT JP PUNCH JP READER JP HOME ;HOME SELECTED DRIVE JP SELDSK ;SELECT DISK DRIVE JP SETTRK ;SET TRACK # JP SETSEC;Z80 CPU DB 0 ;SPARE BIOSSZ: DW BIOSND - BIOS ;BIOS MODULE SIZE IN BYTES BIOSST: DW BIOS ;BIOS MODULE LOAD ADDR FOR SBD ; 0 %+ &, !'- "(. #)/ $*0 ; CONTINUE ON WITH INIT ; INIT1: JR INIT ;###########################################################################T DEFAULT DRIVE ; LD A,(DK_BDRV) ;USE DRIVE # PASSED IN PAGE 0 AND A,3 LD (DEFDRV),A ; ; SEND SYSTEM SIGN-ON ; LD ########################################################################## ; MSGSO: DB CR,LF DB CPMSZ / (KBYTE * 10) + '0' CT),A ;ASSUME NO DATA IN BUFFER ; LD (UNA_CNT),A ;CLEAR UNALLOCATED SECTOR COUNT ; LD (BUF_MOD),A ;CLEAN BUFFER ; LD HLSCCPS) ;FETCH CCP TRK/SECTOR LD C,L LD B,0 CALL SETSEC ; LD C,H CALL SETTRK ; LD BC,CCP CALL SETDMA ; ; READA ;A STILL CONTAINS 0 CALL SETSEC ; LD C,H CALL SETTRK ; JR WREAD ; ; ; WARM BOOT ERROR, OUTPUT MSG & GO TO DEBU PHYSICAL DRIVE 0 ; C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; D SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ; E JADE 8" PHYSICAL DRIVE 1 ; G JADE 8" FLOPPY PHYSICAL DRIVE 0 ; H JADE 8" FLOPPY PHYSICAL DRIVE 1 ENDIF ; ;*****************# ; ; DIRECTORY SECTOR BUFFER STARTS HERE AFTER CRUNCHING COLD START ; CODE. THIS BUFFER IS USED BY THE CP/M DIRECTORY CHECKHL,MSGSO CALL EDITOR ; ; MODIFY COLD START VECTOR TO WARM START ; LD HL,(BIOS+4) LD (BIOS+1),HL ; ; INIT OUR STUF DB (CPMSZ MOD (KBYTE * 10)) / KBYTE + '0' DB 'K CP/M-80 Vers 2.2',CR,LF DB 'M5b CBIOS Vers ' PVERS VERSN DM CR,LF ,BLKBUF ;INIT BUFFER PTR LD (BUF_DMA),HL ; ; LOG ON DRIVE TO INIT TABLES ; LD A,(DK_BDRV) AND A,3 ;MODULO 4 LD C,A CCP/BDOS ; WREAD: CALL DISKRD JR NZ,WEROR ;IF ERROR THEN EXIT ; ; NEXT SECTOR ; LD HL,CPM_SEC INC (HL) ; LD DE,GGER ; WEROR: LD HL,MSGLE ;OUTPUT ERROR MESSAGE CALL EDITOR CALL MR_BRK HALT ; ; ; BOOT OK, INIT PAGE 0 ; WZRPG:  FLOPPY PHYSICAL DRIVE 0 ; F JADE 8" FLOPPY PHYSICAL DRIVE 1 ENDIF IF BOOT = 3 ; A JADE 8" FLOPPY PHYSICAL DRIVE 0*********************************************************** ; ; REVISION HISTORY: ; ; 3.00 - 26 JAN 87 GRH ; Implemente ROUTINES THAT ; CHECK FOR DISK CHANGE. ; ;############################################################################ ; F ; CALL GETBNK LD (BUF_DMAB),A ; ; INITIALIZE CLOCK VECTORS IF CLOCK INSTALLED ; LD A,MF_CSYN ;TEST FOR BOARD PRESE IF $ > (DIRBF + SECSZ) CONMSG **** WARNING! COLD INIT CODE BIGGER THAN DIR BUFFER **** ELSE DS DIRBF+SECSZ-$ ;FI LD E,0 CALL SELDSK LD A,L ;IF ERROR THEN ABORT OR A,H JR Z,WEROR ; ; READ BOOT DIRECTORY ; LD BC,DEFBFR ;SE128 ;DMA += SECTOR SIZE LD HL,(CPM_DMA) ADD HL,DE LD (CPM_DMA),HL ; ; IF NOT INTO BDOS THEN READ NEXT SECTOR ; LD  TITLE CUSTOMIZED BIOS FOR M5B LIST NOCOND BOOT EQU 10H ;10H: HARD DISK, 3: 8" FLOPPY, 20H: 5" FLOPPY ;******************** ; B JADE 8" FLOPPY PHYSICAL DRIVE 1 ; C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; D SIDE 2 & 3 OF HARD DISK PHYSICAL d new common IOPB code & Jade floppy firmware support. ; Implemented disk drive driver tables and new function to return ; a DIRBF: EQU $ ;BUFFER BEGINNING ;---------------------------------------------------------------------------- ; ; INITNT CALL XMROM ; ; IF CLOCK PRESENT THEN TURN ON CLOCK DRIVE ; OR A,A LD A,38H ;COND. JR (ON) JR Z,CLKON ; ; ELLL OUT DIRECTORY BUFFER TO 1 SECTOR SIZE ENDIF ;---------------------------------------------------------- ; ; WARM RT XFER ADDRESS (USE DEFAULT BUFFER) CALL SETDMA ; LD BC,BD_SEC ;SET DIRECTORY SECTOR CALL SETSEC ; LD BC,0 ;SET TRACKDE,BDOS XOR A,A SBC HL,DE JR C,WREAD ; ; ELSE IF AT BEGINNING OF BDOS THEN SET UP NEW TRACK & SECTOR ; JR Z,RDBDOS ******************************************************** ; ; CUSTOMIZED BIOS FOR M5B ; (c) 1981 GRH Electronics, CUPERTIDRIVE 0 ; E SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; F SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ENDIF IF BOOT = ptr to a drive table. ; Removed init of IOBYTE. ; Implemented 5" floppy driver. ; Implemented use of ROM primitives. ; Moved - COLD START ENTRY FROM BOOT MUST SET ALL BIOS PARAMS ; ;-------------------------------------------------------------------SE TURN OFF CLOCK DRIVE ; LD A,18H ;UNCOND. JR (OFF) (CAUSES JUMP TO ILLEGAL) ; CLKON: LD (INHCLK),A ; ; BOOT CCP & BDEBOOT ENTRY LOADS CCP,BDOS FROM DISK & ; SETS UP VARIABLES ; ;---------------------------------------------------------- ;  TO 0 CALL SETTRK ; CALL DISKRD JR NZ,WEROR ; ; CHECK FOR VALID BOOT DIRECTORY ; LD A,(DEFBFR) CP A,86H JR C,W ; ; ELSE IF NOT AT BIOS THEN READ NEXT SECTOR ; LD DE,BIOS - BDOS SBC HL,DE JP C,WREAD ; ; ELSE DONE READING SYSTNO, CA ; ;**************************************************************************** ; ; CONFIGURATION: ; ; CPM ; DRIVE20H ; A JADE 5" FLOPPY PHYSICAL DRIVE 0 ; B JADE 5" FLOPPY PHYSICAL DRIVE 1 ; C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE  system down to 60k. ; 3.01 26 JUN 88 GRH ; Remove 5" floppy support. Implement in CP/M-86 BIOS. ; Change single function to--------- ; INIT: ; ; SET TEMPORARY STACK ; DI LD SP,DEFBFR ;USE PAGE 0 FOR STACK LD (THIS_STK),SP EI ; ; INIOS ; JR WARM ;############################################################################ ; ; SIGN-ON MESSAGE ; ;##WARM: ; ; SET TEMPORARY STACK ; DI LD SP,DEFBFR LD (THIS_STK),SP EI ; ; INIT OUR STUFF ; XOR A,A LD (BUF_AEROR ; ; SET UP TO LOAD CCP/BDOS ; LD HL,(DEFBFR + BD_SBDSS) ;PREFETCH BDOS TRK/SECTOR PUSH HL ; LD HL,(DEFBFR + BD_EM ; JR WZRPG ; ; ; ELSE SET UP & READ BDOS ; RDBDOS: POP HL ;RESTORE BDOS TRK/SECTOR FROM DIRECTORY LD C,L LD B, USAGE IF BOOT = 10H ;HARD DISK BOOT CONFIG. ; A SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; B SIDE 2 & 3 OF HARD DISK0 ; D SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 0 ; E SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; F SIDE 2 & 3 OF HARD DISK return drive table ptr into a BIOS function ; call using restart instruction. ; Change LOGON to specify the ID sector & tra 0 %+ &, !'- "(. #)/ $*0ck. At same time, fix bug ; which did not specify the logon track. ; 3.02 7 JUL 88 GRH ; Add '?' to include file names. apping Roms itself. ; 3.07 11-25-90 GRH ; Modify for Ver. 1.22 Monitor. ; Fix bug in 8" Hard Disk table which benignly (at DCM8 to CBIOS. ; Remove IOPB ptr passing in IX redundancy. ; Change DPB track-head shift factor to Sector Offset like track ;buffer for ; ID sector read. ; 9-20-91 GRH Fold in redlines. ; 10-21-91 GRH Fix bugs ; 10-22-91 GRH Fix bugs ; ============================ ; INTCPTS EQU TRUE ;ENABLE SYSTEM CALL INTERCEPT WHISTLE ;================================= KBYTE: EQU 1024 CPMSZ: EQU KBYTE * NKSYS CPMBS: EQU CPMSZ - (20 * KBYTE) ;CP/M BIAS VALUE CCP: EQU CPMBS + 3400H ;ADDR OF =========================================================================== ; SECSZ: EQU 128 NDRVS: EQU 6 IF BOOT = 10H ============================================== ; WRALL EQU 0 ;WRITE TO ALLOCATED WRDIR EQU 1 ;WRITE TO DIRECTORY WRUAL EQU 2; Change hard disk system tracks directory reference to new format. ; Correct bug in drivers which caused retry to fail. (sectocurrent level) ; caused the drive table to have bad data (default table was missing ; the 2 deblocking extension bytes). ;  offset. Disk partitioning will add this value to sector word. It ; will be stored in the ID sector data to be dynamic. ; ;10-23-91 GRH Fix bugs ; ; 3.13 1-15-92 GRH ; Change hard disk translation to Monitor disks 4 & 5 from 6 & 7. ; VERSN E=========================================== ; ; INCLUDE COMIOPB3.DEF ; INCLUDE DISKS3.DEF ; INCLUDE BDIR.DEF ; CCP BDOS: EQU CPMBS + 3C00H ;ADDRESS OF BDOS BIOS: EQU CPMBS + 4A00H ;ADDRESS OF BDOS BIOSR: EQU 1000H - BIOS ; ; PAGE ; ; 8" HARD DISK BOOT DATA ; STHD EQU 0 ;START LOGICAL DRIVE OF HARD DISK NDHD EQU 3 ;LAST LOGICAL DRIVE OF HARD DISK S ;WRITE TO UNALLOCATED ;============================================================================ ; ; ASCII CHARS ; r remained ; corrupted) ; Stubbed out new Clock routines for present. ; 3.03 31 JUL 88 GRH ; Unstub Clock routines. ; 3Implement data xfer inhibit schemes with PB_FLG & PB_BCNT. ; Add pick-up of THIS_BNK data in all iopb cases. ; Remove clock bu 3.10 5-20-91 GRH ; Change LOGON to attempt to recover from old disks better, using ; DCM8301 version controller firmware. QU 313 ; ;**************************************************************************** SUBTTL SYSTEM DECLARATIONS ;======INCLUDE M5ZF2.DEF ; ;============================================================================ ; LIST OFF *INCLUDE0 LOCATIONS ; PAGE0: EQU 0 ;START OF CP/M RAM DEFDRV: EQU PAGE0 + 4 ;DEFAULT DRIVE PARAM ADDR BDOSJV EQU PAGE0 + 5 ;BDOS SYT8FD EQU 4 ;START LOGICAL DRIVE OF 8" FLOPPY ND8FD EQU 5 ;LAST LOGICAL DRIVE OF 8" FLOPPY ENDIF IF BOOT = 3 ; ; 8;============================================================================ ; LF: EQU 0AH CR: EQU 0DH CTRLZ: EQU 1AH .04 6 AUG 88 GRH ; Remove floppy side select from BIOS & move to controller. ; Implement new ID sector format. ; Implement ffer set/read system calls. ; 12-5-90 GRH ; Remove IX IOPB ptr passing to disk drivers. ; 1-13-91 GRH ; Fix bug which cor ; ; 3.11 9-2-91 GRH ; Add redlines & change for M5ZMON v.2.00. ; ; 3.12 9-11-91 GRH ; Add deblocking code. ; 9-17-91 ====================================================================== ; ; ASSEMBLY PARAMETERS ; ;========================== COMIOPB3.DEF *INCLUDE DISKS3.DEF *INCLUDE BDIR.DEF *INCLUDE M5ZF2.DEF LIST ON ;=====================STEM CALL ENTRY THIS_STK EQU PAGE0 + 1CH ;CURRENT STACK FRAME PTR DK_BDRV EQU 0041H ;BOOT DRIVE # FROM PROM DEFBFR EQU PAGE0" FLOPPY BOOT DATA ; STHD EQU 2 ;START LOGICAL DRIVE OF HARD DISK NDHD EQU 5 ;LAST LOGICAL DRIVE OF HARD DISK ST8FD EQU 0 ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE THE TRANSLATION TABLE MACRO ; ;@@CP/M 3.0 DPB structure in preparation for deblocking. ; 3.05 11-3-88 GRH ; Change included data to update IOPB.PBSTAT to newrupted PB_FLG. ; 3.08 2-22-91 GRH ; Remove references to THIS_BNK & use monitor function #7 instead. ; Add track-head shift GRH Add r/ls & move to 59k system. ; 9-19-91 GRH Fix bug which destroyed my root directories! ; BUF_RD was writing. ;================================================== ; FALSE EQU 0 TRUE EQU NOT FALSE ;========================================================================================== ; ; DISK OPERATING SYSTEM ADDRESSES ; ;=========================== + 80H ;DEFAULT BUFFER ; ; BIOS FUNCTION CALL RESTART VECTOR ; BFUNRST EQU 28H BFUNRSV EQU PAGE0 + BFUNRST BFUNRSI EQU 0 ;START LOGICAL DRIVE OF 8" FLOPPY ND8FD EQU 1 ;LAST LOGICAL DRIVE OF 8" FLOPPY ENDIF ;==============================@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; GXLATE MACRO #SECTORS, #SKEW LIST OFF NXTSEC D configuration. ; 3.06 1-28-89 GRH ; Revised primitive calling procedures to use the monitor rom function ; rather than sw factor to DPBs for future use. ; 3.09 5-15-91 GRH ; Change 8" floppy side select to track bit 0. Move calculation from ;  Patch problems with partitioning until 20MB drive installed. ; Fix TPA corruption by LOGON problem by using ROMBNK sector ========================================= ; ; CONDITIONAL ASSEMBLY FLAGS ; ;================================================================================================= ; SYS EQU 2 ;CP/M VERSION {2,3} ; NKSYS: EQU 59 ;SYSTEM SIZE IN K BYTES C7H + BFUNRST ;============================================================================ ; ; OTHER DECLARATIONS ; ;=============================================== ; ; BDOS CONSTANTS ON ENTRY TO WRITE ; ;==============================L 1 ;;START WITH SECTOR 1 LOWEST DL 1 ;; REPT #SECTORS LIST ON DB NXTSEC LIST OFF NXTSEC DL NXTSEC + #SKEW ;ADD SKEW 0 %+ &, !'- "(. #)/ $*0 FACTOR ;; IF NXTSEC > #SECTORS ;CHECK FOR OVERFLOW NXTSEC DL NXTSEC - #SECTORS ;; IF NXTSEC <= LOWEST ;CHECK FOR REP------------------------------ ; ; BIOS JUMP VECTOR TABLE ; ;-------------------------------------------------------------RESIDE AS DEFINED RIGHT BEFORE THE COLD ; INIT ROUTINE START AND MUST BE IN THE 1ST SECTOR. THESE 2 WORDS ARE ; REFERENCED BY ############################################### ; DIRBF: EQU $ ;BUFFER BEGINNING ;--------------------------------------CK INSTALLED ; LD A,MF_CSYN ;TEST FOR BOARD PRESENT CALL XMROM ; ; IF CLOCK PRESENT THEN TURN ON CLOCK DRIVE ; OR A,THAN DIR BUFFER **** ELSE DS DIRBF+SECSZ-$ ;FILL OUT DIRECTORY BUFFER TO 1 SECTOR SIZE ENDIF ;------------------- ; ; READ BOOT DIRECTORY ; LD BC,DEFBFR ;SET XFER ADDRESS (USE DEFAULT BUFFER) CALL SETDMA ; LD BC,BD_SEC ;SET DIR ; IF NOT INTO BDOS THEN READ NEXT SECTOR ; LD DE,BDOS XOR A,A SBC HL,DE JR C,WREAD ; ; ELSE IF AT BEGINNING OF BEAT NXTSEC DL LOWEST + 1 LOWEST DL NXTSEC ENDIF ENDIF ;; ENDM LIST ON ENDM ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@--------------- ; JP INIT1 ;COLD START ENTRY JP WARM ;RELOAD CCP/BDOS JP CNSCK ;GET CONSOLE STATUS JP CI ;CONSOLE ITHE BOOT LOADER CODE IN ORDER TO DETERMINE THE LOAD ADDRESS ; AND LENGTH OF THE BIOS. ; ;####################################-------------------------------------- ; ; INIT - COLD START ENTRY FROM BOOT MUST SET ALL BIOS PARAMS ; ;---------------A LD A,38H ;COND. JR (ON) JR Z,CLKON ; ; ELSE TURN OFF CLOCK DRIVE ; LD A,18H ;UNCOND. JR (OFF) (CAUSES JUMP TO ILL--------------------------------------- ; ; WARM REBOOT ENTRY LOADS CCP,BDOS FROM DISK & ; SETS UP VARIABLES ; ;-----------ECTORY SECTOR CALL SETSEC ; LD BC,0 ;SET TRACK TO 0 CALL SETTRK ; CALL DISKRD JR NZ,WEROR ; ; CHECK FOR VALID BDOS THEN SET UP NEW TRACK & SECTOR ; JR Z,RDBDOS ; ; ELSE IF NOT AT BIOS THEN READ NEXT SECTOR ; LD DE,BIOS - BDOS S@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; INITIALIZE VERSION TEXT IN RAM MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@NPUT JP COC ;CONSOLE OUTPUT JP LO ;PRINTER OUTPUT JP PUNCH JP READER JP HOME ;HOME SELECTED DRIVE JP SELDSK ;SEL######################################## ; DB 0 ;Z80 CPU DB 0 ;SPARE BIOSSZ: DW BIOSND - BIOS ;BIOS MODULE SIZE IN BYTES------------------------------------------------------------- ; INIT: ; ; SET TEMPORARY STACK ; DI LD SP,DEFBFR ;USE EGAL) ; CLKON: LD (INHCLK),A ; ; BOOT CCP & BDOS ; JR WARM ;######################################################----------------------------------------------- ; WARM: ; ; SET TEMPORARY STACK ; DI LD SP,DEFBFR LD (THIS_STK),SP OOT DIRECTORY ; LD A,(DEFBFR) CP A,86H JR C,WEROR ; ; SET UP TO LOAD CCP/BDOS ; LD HL,(DEFBFR + BD_SBDSS) ;PREFETCBC HL,DE JP C,WREAD ; ; ELSE DONE READING SYSTEM ; JR WZRPG ; ; ; ELSE SET UP & READ BDOS ; RDBDOS: POP HL ;RES@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; PVERS MACRO #VERS DD DL #VERS IF DD > 9999 DB (DD / 10000) + '0' DD DL DECT DISK DRIVE JP SETTRK ;SET TRACK # JP SETSEC ;SET SECTOR # JP SETDMA ;SET TRANSFER ADDR JP DISKRD ;PERFORM DISK R BIOSST: DW BIOS ;BIOS MODULE LOAD ADDR FOR SBD ; ; CONTINUE ON WITH INIT ; INIT1: JR INIT ;#######################PAGE 0 FOR STACK LD (THIS_STK),SP EI ; ; INIT DEFAULT DRIVE ; LD A,(DK_BDRV) ;USE DRIVE # PASSED IN PAGE 0 AND A,3 ###################### ; ; SIGN-ON MESSAGE ; ;############################################################################  EI ; ; INIT OUR STUFF ; XOR A,A LD (BUF_ACT),A ;ASSUME NO DATA IN BUFFER ; LD (UNA_CNT),A ;CLEAR UNALLOCATED SECTOH BDOS TRK/SECTOR PUSH HL ; LD HL,(DEFBFR + BD_SCCPS) ;FETCH CCP TRK/SECTOR LD C,L LD B,0 CALL SETSEC ; LD C,H CTORE BDOS TRK/SECTOR FROM DIRECTORY LD C,L LD B,A ;A STILL CONTAINS 0 CALL SETSEC ; LD C,H CALL SETTRK ; JR WREADD % 10000 ENDIF IF DD > 999 DB (DD / 1000) + '0' DD DL DD % 1000 ENDIF DB (DD / 100) + '0' DB '.' DB ((DD %EAD JP DISKWR ;PERFORM DISK WRITE JP LISTST ;RETURN LIST STATUS JP SECTRN ;TRANSLATE SECTOR JP BIOFUNC ;EXECUTE FUNC##################################################### ; ; DIRECTORY SECTOR BUFFER STARTS HERE AFTER CRUNCHING COLD START ; C LD (DEFDRV),A ; ; SEND SYSTEM SIGN-ON ; LD HL,MSGSO CALL EDITOR ; ; MODIFY COLD START VECTOR TO WARM START ; L; 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 R COUNT ; LD (BUF_MOD),A ;CLEAN BUFFER ; LD HL,BLKBUF ;INIT BUFFER PTR LD (BUF_DMA),HL ; ; LOG ON DRIVE TO INIT TABLALL SETTRK ; LD BC,CCP CALL SETDMA ; ; READ CCP/BDOS ; WREAD: CALL DISKRD JR NZ,WEROR ;IF ERROR THEN EXIT ; ; N ; ; ; WARM BOOT ERROR, OUTPUT MSG & GO TO DEBUGGER ; WEROR: LD HL,MSGLE ;OUTPUT ERROR MESSAGE CALL EDITOR CALL MR_BR 100) / 10) + '0' DB (DD % 10) + '0' ENDM SUBTTL BIOS CODE ORG BIOS ;----------------------------------------------TION CALL ;############################################################################ ; ; THE FOLLOWING BOOT DATA MUST ODE. THIS BUFFER IS USED BY THE CP/M DIRECTORY CHECK ROUTINES THAT ; CHECK FOR DISK CHANGE. ; ;#############################D HL,(BIOS+4) LD (BIOS+1),HL ; ; INIT OUR STUFF ; CALL GETBNK LD (BUF_DMAB),A ; ; INITIALIZE CLOCK VECTORS IF CLO DB 'M5b CBIOS Vers ' PVERS VERSN DM CR,LF IF $ > (DIRBF + SECSZ) CONMSG **** WARNING! COLD INIT CODE BIGGER ES ; LD A,(DK_BDRV) AND A,3 ;MODULO 4 LD C,A LD E,0 CALL SELDSK LD A,L ;IF ERROR THEN ABORT OR A,H JR Z,WEROREXT SECTOR ; LD HL,CPM_SEC INC (HL) ; LD DE,128 ;DMA += SECTOR SIZE LD HL,(CPM_DMA) ADD HL,DE LD (CPM_DMA),HL ; K HALT ; ; ; BOOT OK, INIT PAGE 0 ; WZRPG: ; ; INIT BIOS WARM START IN PAGE 0 ; LD A,0C3H LD HL,BIOS + 3 LD  0 %+ &, !'- "(. #)/ $*0(PAGE0),A LD (PAGE0 + 1),HL ; ; INIT BDOS CALL VECTOR IN PAGE 0 ; LD HL,BDOS + 6 LD (BDOSJV),A LD (BDOSJV + 1),HL ++++++++++++++++++++++++++++++++++++++++++ ; DISKRD: ; ; SET UP DATA TABLE PTRS ; PUSH IX LD IX,(CUR_DDT) ; PUSH I 0: WRITE TO ALLOCATED BLOCK (UPDATE) ; 1: WRITE TO DIRECTORY BLOCK (ALLWAYS WRITE) ; 2: WRITE TO UNALLOCATED BLOCK (NO CK ; LD A,(IY + DPB_BLM) ;CUR_DPB.DPBBLM + 1 ::= (BLKSIZ/128) INC A LD (UNA_CNT),A ; ; SET DISK TO SEEK ; LD A,(CP NEXT SECTOR FOR FUTURE REF ; EX DE,HL ;UNASEC += 1 INC HL LD (UNA_SEC),HL ; ; IF PAST LAST SECTOR ON TRACK THEN USERS ; XOR A,A LD (IOPB + PB_STATO),A ; ; COMPUTE BUFFER SECTOR ; LD HL,(CPM_SEC) DEC HL ;CONVERT PHYSICAL SECTOR NZ,NOMATCH ; LD HL,(BUF_TRK) ;SAME TRACK? LD DE,(CPM_TRK) SBC HL,DE JR NZ,NOMATCH ; LD DE,(BUF_PSEC) ;SAME SECTOR? ALCULATE INDEX INTO BUFFER DEC HL ;CONVERT TO LOGICAL SECTOR (0..N-1) LD A,L ; AND A,(IY + DPB_PHM) ;USE PHYSICAL RECO; ; INIT BIOS CALL VECTOR IN PAGE 0 ; LD HL,BIOFUNC LD (BFUNRSV),A LD (BFUNRSV + 1),HL ; ; SET DEFAULT SECTOR BUFFY LD IY,(CUR_DPB) ; ; IF NOT BLOCKED THEN USE CPM READ ; LD A,(IY + DPB_PSH) ;0= 128-BYTE SECTORS OR A,A JP Z,DISKRNEED TO PRE-READ) ; ;**************************************************************************** ; DISKWR: ; ; REMOVE BM_DSK) LD (UNA_DSK),A ; ; SET TRACK TO SEEK ; LD HL,(CPM_TRK) LD (UNA_TRK),HL ; ; SET SECTOR TO SEEK ; LD HL,( 1ST SECTOR OF NEXT TRACK ; LD E,(IY + DPB_SPT) LD D,(IY + DPB_SPT +1) SBC HL,DE JP C,NOOVF ; LD HL,0 ;SECTOR = 1 TO LOGICAL ; LD A,(IY + DPB_PSH) ;USE PHYSICAL SHIFT FACTOR (CP/M 3.X) AND A,3 ;LIMIT TO 1024 BYTE SECTORS JP Z,NOSECSH LD HL,(BUF_SEC) SBC HL,DE JR Z,MATCH ;SKIP IF MATCH ; NOMATCH: ; ; IF BUFFER == DIRTY THEN WRITE IT OUT BEFORE READIRD MASK DATA (CP/M 3.X) ; RRA ;BITS <7..1> -> BITS <14..8> LD H,A ; LD A,0 ;BIT 0 -> BIT 7 RRA LD L,A ; ; HL ER ; LD BC,DEFBFR CALL SETDMA ; IF INTCPTS ; ; PUT BDOS VECTOR INTO INTERCEPT CODE ; LD HL,(BDOS + 7) LD (BDOSDN ; ; READS DON'T NEED ALLOCATION ; XOR A,A LD (UNA_CNT),A ; ; READ_OPERATION_FLAG = TRUE (1) ; INC A LD (REAOOT WRITE PROTECTION ; XOR A,A LD (WR_PROT),A ; ; SET PTRS TO DISK DATA ; PUSH IX LD IX,(CUR_DDT) ; PUSH IY LCPM_SEC) LD (UNA_SEC),HL ; ; IF NO UNALLOCATED SECTORS REMAIN THEN PREREAD ; CHKUNA: LD A,(UNA_CNT) OR A,A JP Z,ALLO LD (UNA_SEC),HL ; LD HL,(UNA_TRK) ;TRACK++ INC HL LD (UNA_TRK),HL ; NOOVF: ; ; MATCH FOUND, MARK AS UNNECESSARY REF ;IF ALREADY 0 THEN SECTOR SIZE IS 128 ; SECSHFLP: SRL H ;ELSE SHIFT OVER TO PHYSICAL SECTOR RR L DEC A JP NZ,SECSNG NEW ONE ; CALL BUF_FLSH ;CLEAR HOST BUFF ; JR NZ,RW_RET ;IF ERROR THEN ABORT ; FILHST: ; ; READ THE SECTOR BUFFERHAS RELATIVE HOST BUFFER ADDRESS ; LD DE,BLKBUF ADD HL,DE ;HL = HOST ADDRESS ; LD DE,(CPM_DMA) ;GET/PUT CP/M DATA LD V),HL ; ; NOW PUT INTERCEPT VECTOR INTO BDOS CODE ; LD HL,INTCPT LD (BDOS + 7),HL ENDIF ; ; PASS DEFAULT DISK TODOP),A ; ; PRE-READ_OF_DATA_FLAG = TRUE ; LD (RSFLAG),A ; ; TREAT AS UNALLOCATED BLOCK ; LD A,WRUAL LD (WRTYPE),D IY,(CUR_DPB) ; ; IF NOT BLOCKED THEN USE CPM WRITE ; LD A,(IY + DPB_PSH) ;0= 128-BYTE SECTORS OR A,A JP Z,DISKWRN C ; ; ELSE MORE UNALLOCATED RECORDS REMAIN, COUNT-- ; DEC A LD (UNA_CNT),A ; ; IF REQUESTED SECTOR != UNALLOCATED SAD ; XOR A,A ;PREREAD FLAG = FALSE LD (RSFLAG),A JP RWOPER ; ; ; NORMAL NON-BLOCKED WRITE ; DISKWRN: CALL CPM_WHFLP ; NOSECSHF: INC HL ;SET BACK TO PHYSICAL SECTOR LD (BUF_PSEC),HL ;BUFFER PHYSICAL SECTOR TO ACCESS ; ; IF BUFFER ; LD A,(CPM_DSK) ;BUFFER SECTOR = PHYSICAL SECTOR LD (BUF_DSK),A ; LD HL,(CPM_TRK) LD (BUF_TRK),HL ; LD HL,(BUF_PSBC,128 ;LENGTH OF MOVE ; LD A,(READOP) ;WHICH WAY? OR A,A JP NZ,RWMOVE ;SKIP IF READ ; ; WRITE OPERATION, MARK AND S CCP ; LD A,(DEFDRV) LD C,A JP CCP SUBTTL BIOS DISK FUNCTION ROUTINES ;+++++++++++++++++++++++++++++++++++++++++++A ; JP RWOPER ;TO PERFORM THE READ ; ; ; NORMAL NON-BLOCKED READ ; DISKRDN: CALL CPM_RD JP RW_RET ;*********; ; READ_OP_FLAG = FALSE ; XOR A,A LD (READOP),A ; ; SAVE WRITE TYPE ; LD A,C LD (WRTYPE),A ; ; IF 1ST WRITECTOR THEN PURGE ; LD A,(CPM_DSK) ;SAME DISK? LD HL,UNA_DSK CP A,(HL) JR NZ,ALLOC ; LD HL,(UNA_TRK) ;SAME TRACK? LR JP RW_RET ; ; ; NOT AN UNALLOCATED RECORD, REQUIRES PRE-READ ; ALLOC: XOR A,A ;COUNT = 0 LD (UNA_CNT),A ; INC == EMPTY THEN READ THE PHYSICAL SECTOR ; LD HL,BUF_ACT LD A,(HL) ; LD (HL),1 ;BUFFER = ACTIVE IN ANY CASE ; OR A,A EC) LD (BUF_SEC),HL ; ; IF REQUIRED TO READ THEN READ ; LD A,(RSFLAG) ;NEED TO READ? OR A,A CALL NZ,BUF_RD ;YES, WITCH DIRECTION ; LD A,1 ;BUFFER = DIRTY LD (BUF_MOD),A ; ; SAVE BUFFER DATA PTRS FOR LATER FLUSHES ; LD (BUF_DDT),+++++++++++++++++++++++++++++++++ ; ; READ A DISK SECTOR ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++++++++++++++++++++++++++++******************************************************************* ; ; WRITE DISK SECTOR FUNCTION ; ENTRY- C= WRITE TYPE: ;E TO UNALLOCATED (NEW, UNUSED) BLOCK THEN SET PARAMETERS ; CP A,WRUAL JP NZ,CHKUNA ; ; COUNT = NUMBER_OF_SECTORS_IN_BLOD DE,(CPM_TRK) SBC HL,DE JR NZ,ALLOC ; LD HL,(CPM_SEC) LD DE,(UNA_SEC) SBC HL,DE JR NZ,ALLOC ; ; MATCH, MOVE TO A ;PREREAD FLAG = TRUE LD (RSFLAG),A ; ; ; ; COMMON CODE FOR READ AND WRITE FOLLOWS ; RWOPER: ; ; ASSUME NO ERRO JR Z,FILHST ; ; HOST BUFFER ACTIVE, SAME AS SEEK BUFFER? ; LD A,(CPM_DSK) LD HL,BUF_DSK ;SAME DISK? CP A,(HL) JR IF 1 ; ; BUFFER = CLEAN ; XOR A,A LD (BUF_MOD),A ; MATCH: ; ; COPY DATA TO OR FROM BUFFER ; LD HL,(CPM_SEC) ;CIX LD (BUF_DPB),IY ; EX DE,HL ;SOURCE/DEST SWAP ; RWMOVE: ; ; BC INITIALLY 128, DE IS SOURCE, HL IS DEST ; LDIR  0 %+ &, !'- "(. #)/ $*0; ; DATA HAS BEEN MOVED TO/FROM HOST BUFFER, IF NOT DIRECTORY THEN DELAY WRITE ; LD A,(WRTYPE) ;IF NOT DIRECTORY THEN DELSEC)= SECTOR # TO WRITE TO ; (CPM_DMA)= XFER ADDRESS ; IX= DDT PTR ; IY= DPB PTR ; EXIT - (IOPB.PB_STATO)= 0: OK, /0: ERRT) LD IY,(CUR_DPB) ; ; EXECUTE READ SECTOR ; CALL CPM_RD ; ; RESTORE PTRS & RETURN ; POP IY POP IX RET ************* ; ; SET UP IOPB FOR EXECUTION ; ENTRY- HL= PTR TO IOPB IMAGE TRACK DATA ; IX= DDT PTR ; IY= DPB PTR ; (SP************************** ; BUF_FLSH: ; ; IF UNMODIFIED THEN RETURN ; LD A,(BUF_MOD) OR A,A RET Z ; ; ELSE SET************************************************************ ; BUF_WR: ; LD HL,LL_WRIT JP BUF_RW ;******************R BLOCK ; ENTRY- C= DRIVE # ; E= 0 IF NEW SELECT ; EXIT - HL= PTR TO DPT OR 0 FOR ERROR ; ;+++++++++++++++++++++++++++++++,(HL) INC HL LD D,(HL) LD (CUR_DPH),DE EX DE,HL ;PUT DPH PTR IN HL FOR RETURN ; ; IF NOT FIRST SELECT OR LOGON INHIAY WRITE CP A,WRDIR LD A,(IOPB + PB_STATO) ;RETURN ANY ERRORS ANYWAY JR NZ,RW_RET ; ; IF ERROR THEN ABORT ; OR A,A OR ; ;**************************************************************************** ; CPM_WR: ; LD HL,LL_WRIT JP CPM_RW ;**************************************************************************** ; ; CPM_RD PERFORMS THE PHYSICAL READ FROM THE D)= ADDRESS {LL_READ, LLWRIT} OF EXECUTOR ; ;**************************************************************************** ; R PTRS TO BUFFER DATA ; PUSH IX PUSH IY LD IX,(BUF_DDT) LD IY,(BUF_DPB) ; ; WRITE THE BUFFER DATA ; CALL BUF_WR ********************************************************** ; ; RDBUF PERFORMS THE PHYSICAL READ FROM THE HOST DISK INTO BLKBUF+++++++++++++++++++++++++++++++++++++++++++++ ; SELDSK: ; ; STORE DRIVE # FOR FUTURE USE ; LD A,C LD (CPM_DSK),A ; BITED THEN RETURN TABLE PTR ; LD A,(LOGRQ) ;0: LOGON, 1:INHIBIT OR A,C ;0: NORMAL, 1: INHIBIT CPL AND A,1 RET Z ;  JR NZ,RW_RET ; ; NO ERROR/DIRECTORY WRITE ; XOR A,A ;BUFFER = CLEAN LD (BUF_MOD),A ; CALL BUF_WR ;WRITE TO DIS ;**************************************************************************** ; ; CPM_RD2 PERFORMS THE PHYSICAL READ FROMISK INTO CPM_DMA. ; ENTRY- (CPM_DSK)= DISK # TO READ FROM ; (CPM_TRK)= TRACK # TO READ FROM ; (CPM_SEC)= SECTOR # TO READ FD_WR: LD DE,IOPB + PB_TRKO LD BC,PB_BCNTO - PB_TRKO LDIR ; ; EXECUTE LOW LEVEL READ OR WRITE (ON STACK) ; RET ;*; ; RESTORE THE PTRS ; POP IY POP IX ; ; IF ERROR THEN RETURN IT ; OR A,A RET NZ ; ; ELSE CLEAN BUFFER ; . ; ENTRY- (BUF_DSK)= DISK # TO READ FROM ; (BUF_TRK)= TRACK # TO READ FROM ; (BUF_SEC)= SECTOR # TO READ FROM ; IX= DDT ; SAVE LOGON REQUEST FLAG ; LD A,E LD (LOGRQ),A ; ; COMPUTE DISK DRIVER TABLE PTR ; CALL RETDVRT ;DRIVE IS STILL ; ELSE LOG ON DRIVE ; PUSH IX ;SAVE REGS PUSH IY ; LD IX,(CUR_DDT) ;SET REGS LD IY,(CUR_DPB) ; ; ATTEMPT TO REAK ; LD A,(IOPB + PB_STATO) ;RETURN ANY ERRORS ; ; DONE, RESTORE & RETURN ; RW_RET: OR A,A ;SET RESULT STATUS FLAG POP THE DISK INTO CPM_DMA, ; WITHOUT BLOCKING. ; ENTRY- (CPM_DSK)= DISK # TO READ FROM ; (CPM_TRK)= TRACK # TO READ FROM ; (CROM ; (CPM_DMA)= XFER ADDRESS ; IX= DDT PTR ; IY= DPB PTR ; EXIT - (IOPB.PB_STATO)= 0: OK, /0: ERROR ; ;****************************************************************************************** ; ; BUF_FLSH FLUSHES THE BUFFER DATA IF MODIFIED  LD (BUF_MOD),A RET ;**************************************************************************** ; ; BUF_WR PERFORMS TPTR ; IY= DPB PTR ; EXIT - (IOPB.PB_STATO)= 0: OK, /0: ERROR ; ;***********************************************************IN C REGISTER ; ; IF DRIVE ERROR THEN RETURN (HL= 0) ; RET NZ ; ; ELSE SAVE PTR ; LD (CUR_DDT),HL ; ; FETCH FLD ID SECTOR ; CALL BUF_FLSH ;FLUSH BUFFER 1ST JR NZ,LOGERR ; CALL DISKLOG JR NZ,LOGERR ; ; IF NO ID SECTOR THEN US IY POP IX ; RET ;**************************************************************************** ; ; CPM_WR PERFORMS TPM_SEC)= SECTOR # TO READ FROM ; (CPM_DMA)= XFER ADDRESS ; EXIT - (IOPB.PB_STATO)= 0: OK, /0: ERROR ; ;********************************************************************************* ; CPM_RD: ; LD HL,LL_READ ; ; COMMON CODE ; CPM_RW: PUS; ENTRY- (BUF_DSK)= DISK # TO WRITE TO ; (BUF_TRK)= TRACK # TO WRITE TO ; (BUF_PSEC)= SECTOR # TO WRITE TO ; (BUF_DDT)= DDHE PHYSICAL WRITE FROM BLKBUF TO THE HOST DISK. ; ENTRY- (BUF_DSK)= DISK # TO WRITE TO ; (BUF_TRK)= TRACK # TO WRITE TO ; (***************** ; BUF_RD: ; LD HL,LL_READ ; ; COMMON CODE ; BUF_RW: PUSH HL LD HL,BUF_TRK JP RD_WR ;++++++AGS ; INC HL ;EXE +1 INC HL ;FLGS LD C,(HL) ; ; FETCH DISK PARAMETER BLOCK ADDRESS ; INC HL ;DRV INC HL ;DPBE DEFAULT DPB ; (NOTE: CONTROLLER HAS SET IT'S DISK DEFAULTS IN DEFBFR IN ALL CASES) ; LD A,(IOPB + PB_ST2O) CP A,-1 ;-1:HE PHYSICAL WRITE FROM CPM_DMA TO THE DISK. ; ENTRY- (CPM_DSK)= DISK # TO WRITE TO ; (CPM_TRK)= TRACK # TO WRITE TO ; (CPM_******************************************************** ; CPM_RD2: ; ; SET UP PTRS ; PUSH IX PUSH IY LD IX,(CUR_DDH HL LD HL,CPM_TRK ; ; FALL INTO COMMON XFER CODE ; ;***************************************************************T PTR ; (BUF_DPB)= DPB PTR ; EXIT - (IOPB.PB_STATO)= 0: OK, /0: ERROR ; ;**************************************************BUF_SEC)= SECTOR # TO WRITE TO ; IX= DDT PTR ; IY= DPB PTR ; EXIT - (IOPB.PB_STATO)= 0: OK, /0: ERROR ; ;****************++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SELECT DRIVE FUNCTION ; LOG-ON - SET DISK PARAMETE_PTR LD E,(HL) INC HL LD D,(HL) LD (CUR_DPB),DE ; ; FETCH DISK PARAMETER HEADER ADDRESS ; INC HL ;DPH PTR LD ENONE, 0:JADE, 1:DESCRIPTOR, 2: EXTENDED, ; 3: PARTITIONED, ID JR Z,LGDEF ; ; ELSE IF OLD FORMATS THEN PAD DPB DATA  0 %+ &, !'- "(. #)/ $*0; CP A,3 JR NC,IDOK ; LD HL,BLKBUF + ID_PSHO ;FILL DATA WITH 0S LD B,ID_FLGO - ID_PSHO ; PADIDL: LD (HL),0 INC HL ; LGDEF: BIT 4,(IX + DDT_FLG) JR Z,LGCKFD ; ; ELSE USE HARD DISK DEFAULTS ; CALL TRNONE ; NO XLATE LD HL,HDPBK ;  ; ; ELSE PURGE BUFFER ; LD (BUF_ACT),A ; HOME2: ; ; JUST SET TRACK TO 0 ; LD BC,0 ; ; FALL INTO SET TRACK ;******************************************************************** ; SETDMA: LD (CPM_DMA),BC ; LD A,(BUF_DMAB) ;FETCH BAN RET ; ; ; CONVERT FROM CP/M'S LOGICAL SECTOR {0..N-1} TO PHYSICAL SECTOR {1..N} ; NOTRAN: LD HL,1 ADD HL,BC RET+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; LL_READ: ; ; ENABLE UPLOAD ; XOR A,A LD (IOPB + PTOR {0:128, 1:256, 2:512, 3:1024} LD HL,128 ;START WITH 128 BYTES ; AND A,3 ;LIMIT TO 1024-BYTE SECTORS ; JR Z,LL_WR2 + PB_SECO),HL ; ; SET PHYSICAL DRIVE ; LL_DO: LD A,(IX + DDT_DRV) LD (IOPB + PB_DRVO),A ; ; FETCH DRIVER VECTOR & EX DJNZ PADIDL ; ; ELSE XFER ID SECTOR DATA TO TABLES ; IDOK: CALL TRNONE ;ASSUME NO TRANSLATION ; ; IF HARD DISK OR DO ; XFER DATA TO TABLES ; SEL2: LD DE,(CUR_DPB) ; USE DEFAULT TABLE LD BC,DPB_SZ LDIR ; LD A,(HL) ;HEADS VALUE JR  ;**************************************************************************** ; ; SET TRACK # ; ENTRY- BC= TRACK # ; K ADDRESS SET BY COLD START LD (CPM_DMAB),A ; ; DONE ; RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++ SUBTTL DISK SUPPORT ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; LOGON DB_FLGO),A ; ; DISABLE DOWNLOAD ; LD HL,0 LD (IOPB + PB_BCNTO),HL ; ; PASS READ SECTOR COMMAND ; LD A,PB_READC ;IF SHIFT_FACTOR == 0 THEN DONE ; LL_WR3: ADD HL,HL ;DOUBLE COUNT DEC A JP NZ,LL_WR3 ; LL_WR2: LD (IOPB + PB_BCNTO),HL ECUTE DISK DRIVER ; LL_OPLP: LD HL,LL_OPRET ;PUT RETURN ADDRESS ON STACK PUSH HL ; LD L,(IX + DDT_EXE) ;FETCH DRIVER AUBLE DENSITY THEN NO TRANSLATION ; LD A,(BLKBUF + ID_FLGO) AND A,[1 SHL DF_DTDB] OR [1 SHL DF_HARDB] ; ; ELSE SET TRANSSEL1 ; ; ; USE 8" FLOPPY DEFAULTS ; LGCKFD: CALL TR8 LD HL,SD8PBK JR SEL2 ; ; ERROR EXIT ; LOGERR: LD HL,0 ; ;**************************************************************************** ; SETTRK: LD (CPM_TRK),BC RET ;********++++++++++++++++++++++ ; ; SECTOR TRANSLATION FUNCTION ; ENTRY- DE= 0: NO XLATE, ELSE PTR TO XLATE TABLE ; BC= SECTOR # TO ISK FUNCTION ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; JP LL_RW ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; LOW LEVEL WRITE ; ENTRY- IX=  ; ; PASS WRITE COMMAND ; LD A,PB_WRITC ; ; FALL INTO COMMON CODE ; ;+++++++++++++++++++++++++++++++++++++++++++DDRESS FROM TABLE LD H,(IX + DDT_EXE + 1) JP (HL) ; ; DRIVER RETURNS HERE ; LL_OPRET: ; ; IF NO ERRORS THEN RETURNLATION ; CALL Z,TR8 ; ; XFER DISK DATA TO DPB ; LD DE,(CUR_DPB) ;GET ADDR OF DPB LD HL,BLKBUF + ID_SPTO LD BC,DPB; DONE ; LGDONE: POP IY ;RESTORE REGS POP IX RET ;************************************************************************************************************************************* ; ; SET SECTOR ; ENTRY- BC= SECTOR # ; ;**************XLATE ; EXIT - HL= XLATED SECTOR OR BC + 1 ; BC= UNCHANGED ; A, DE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++ DISKLOG: ; ; SET UP READ IOPB ; LD A,(BUF_DMAB) LD (LOGIOPB + PB_DMAXO),A ; LD HL,LOGIOPB LD DE,IOPB LD BC,PB_SDDT PTR ; IY= DPB PTR ; EXIT - IOPB.PB_STATO, A= STATUS ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; COMMON IOPB EXECUTER ; ENTRY- A= COMMAND ; IX= DRIVE TABLE PTR ; IY= DPB PTR ; ;+ ZF ; RET Z ;IF NO_ERROR THEN RETURN ; ; PRINT ERROR ; IOPBDMP: LD A,(BUF_DMAB) ;SET BANK LD E,A ; LD HL,IOPB _SZ LDIR ; ; XFER DISK PHYSICAL DATA TO TABLE ; LD A,(BLKBUF + ID_HEADS) ; SEL1: LD (IX + DDT_HDS),A ; ; RETURN D*********** ; ; HOME DRIVE - TREAT AS SEEK TRK 0 ; EXIT - BC= 0 ; ;******************************************************************************************************************** ; SETSEC: LD (CPM_SEC),BC RET ;***********************++++++++++++++++++++++++++++ ; SECTRN: ; ; IF NO TRANSLATION THEN RETURN SECTOR++ ; LD A,D ;IF TABLE ADDR = 0 THEN NO TTATO LDIR ; ; EXECUTE WITHOUT COMPENSATION ; JR LL_DO ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; LL_WRIT: ; ; IF STILL PROTECTED THEN ERROR ; LD A,(WR_PROT) OR A,A JR NZ,DO_ERR ; ; INHIBIT UPLO+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; LL_RW: LD (IOPB + PB_CMDO),A ; ; OFFSET SECTLD A,MF_DIOB ;USE DISPLAY IOPB DATA FUNCTION CALL XMROM ; ; QUERY USER FOR OPTION ; LD HL,DSKEB CALL EDITOR ; ; GRIVE TABLE PTR ; LD HL,(CUR_DPH) XOR A,A ;RETURN NO-ERROR JR LGDONE ; ; ; IF NOT HARD DISK THEN GO DO FLOPPY TEST ********************** ; HOME: ; ; IF PENDING WRITE (BUFFER DIRTY) THEN IGNORE ; LD A,(BUF_MOD) OR A,A JR NZ,HOME2 ***************************************************** ; ; SET TRANSFER ADDR ; ENTRY- BC= ADDRESS ; EXIT - A= ? ; ;********RANSLATION OR A,E JP Z,NOTRAN ; ; ELSE CALCULATE NEW SECTOR FROM TABLE ; EX DE,HL ADD HL,BC LD L,(HL) ; LD H,0+++++++++++++++++ ; ; LOW LEVEL READ ; ENTRY- IX= DDT PTR ; IY= DPB PTR ; EXIT - IOPB.PB_STATO, A= STATUS ; ;+++++++++++AD ; LD A,1 SHL PB_INHX LD (IOPB + PB_FLGO),A ; ; CALCULATE DOWNLOAD BYTE COUNT ; LD A,(IY + DPB_PSH) ;USE SHIFT FACOR ; LD HL,(IOPB + PB_SECO) LD A,L ADD A,(IX + DDT_SOF) LD L,A LD A,H ADC A,(IX + DDT_SOF + 1) LD H,A LD (IOPB ET USER RESPONSE ; CALL CI ;GET USER RESPONSE ; PUSH AF ;SAVE CHAR LD C,A ;ECHO CHAR CALL COC CALL CRLF ;NEW LIN 0 %+ &, !'- "(. #)/ $*0E POP AF ; AND A,5FH ;INSURE UPPER CASE ; ; IF RETRY THEN TRY AGAIN ; CP A,'R' ;IF RETRY THEN RETURN TO CALLER J;**************************************************************************** ; TR8: LD DE,SDTRAN ; SETTR: LD HL,(CUR_DPH) LD E,A ; LD HL,IOPB CALL MR_XIOB ;EXECUTE THE FUNCTION ; OR A,A ;FUNCTION ERR? RET NZ ; ; RETURN THE COMMAND ++ ; FD8EXEC: ; ; IF HEADS == 1 THEN EXECUTE IOPB ; LD A,(IX + DDT_HDS) DEC A JP Z,XPRIM ; ; ELSE SELECT SIDE FUNCTION # ; EXIT - A= -1: ERROR, 0: OK ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; BINTBL: DW RETVERS ;0:RETURN VERSION # DW RETDVRTF ;1:RETURN DISK PHYSICAL CONFIGURATION TABLE PTR MAXFUNCS EQU ($ - BFUNTBL++ ; RETDVRTF: ; ; ADJUST REGISTER ; LD C,E ; ; FALL INTO LOCAL ENTRY ; ;++++++++++++++++++++++++++++++++++++BUF_DMAB) LD E,A ; ; RETURN NO ERROR ; XOR A,A RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++R Z,LL_OPLP ; ; ELSE IF ABORT THEN DO WARM BOOT ; CP A,'A' ;IF ABORT THEN RE-BOOT JP Z,0 ; ; ELSE IF DEBUGGER THEN LD (HL),E INC HL LD (HL),D RET ;**************************************************************************** ; ;RESULTS STATUS ; LD A,(IOPB + PB_STATO) OR A,A RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ROM TRACK BIT 0 ; LD HL,(IOPB + PB_TRKO) PUSH HL ;SAVE ORIGINAL DATA ; LD A,(IOPB + PB_SECO + 1) ADD A,A ;BIT 15 -OFUNC: ; ; IF FUNCTION # NOT IN TABLE THEN RETURN -1 ; LD A,C CP A,MAXFUNCS LD A,-1 RET NC ; ; ELSE COMPUTE TAB) / 2 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN BIOS VERSION # FUNCTION #0++++++++++++++++++++++++++++++++++++++++ ; ; RETURN DRIVER TABLE PTR FUNCTION ; ENTRY- C= DRIVE # ; EXIT - E:HL= DRIVER TABL++++++++++++++++ ; ; GET BANK NUMBER FUNCTION ; EXIT - A= BANK # ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++ EXECUTE IT ; CP A,'M' JP Z,MR_BRK ; ; ELSE IF IGNORE THEN RETURN NO ERROR ; SUB A,'I' ;IF IGNORE THEN RETURN NO ER SET NO SECTOR TRANSLATION PROCEDURE ; EXIT - HL, DE= ? ; ;******************************************************************++++++++++++ ; ; HARD DISK DRIVER FUNCTION ; ENTRY- IX= DRIVER TABLE PTR ; EXIT - A= 0: OK; /0: ERROR ; ;+++++++++++++++++> BIT_BUCKET ; SRL H RR L RRA ;TRK BIT 0 -> SECTOR BIT 15 LD (IOPB + PB_SECO + 1),A ; LD (IOPB + PB_TRKO),HL ;TRALE ENTRY ; PUSH HL ;SAVE POSSIBLE DATA ; LD HL,BFUNTBL LD A,C ADD A,A ADD A,L LD L,A LD A,0 ADC A,H LD H,A  ; EXIT - HL= VERSION # IN BINARY {0.00,..655.35} ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++E BASE PTR ; NZ= ILLEGAL DRIVE (HL= 0) ; A, B, C= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; GETBNK: LD A,MF_GBNK JP MR_FUN SUBTTL NON-DISK PROCEDURES ;*******************************ROR RET Z ; ; ELSE RETURN ERROR TO BDOS ; LD A,-1 ;RETURN -1 TO BDOS OR A,A RET ; ; ; DISPLAY WRITE PROTECT E********** ; TRNONE: LD DE,0 JR SETTR SUBTTL HARD DISK ROUTINES ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; HDEXEC: EQU XPRIM SUBTTL JADE FLOPPY DRIVER ROUTINES ;+++CK = RESIDUAL ; ; EXECUTE THE IOPB ; CALL XPRIM ; ; RESTORE THE MODIFIED IOPB SO RETRY WILL WORK ; POP HL ;TRACK ; ; EXECUTE TABLE ADDRESS ; LD A,(HL) INC HL LD H,(HL) LD L,A ; EX (SP),HL ;PUT CALLER'S DATA IN HL, FUNCTION A++++ ; RETVERS: LD HL,VERSN XOR A,A ;RETURN NO ERROR RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; RETDVRT: ; ; ASSUME DRIVE 0 ; LD HL,DDT_0 ;START AT 1ST TABLE ; ; IF DRIVE == 0 THEN ALREADY THERE ; ******************************************** ; ; NEWLINE PROCEDURE ; ;******************************************************RROR MESSAGE ; DO_ERR: LD HL,WP_ERM CALL EDITOR JR IOPBDMP ;*********************************************************++++++++++++++++++++++++ ; ; EXECUTE THE IOPB PRIMITIVE ; EXIT - A= 0: OK, /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; JADE 8" FLOPPY DISK DRIVER FUNCTION ; ENTRY- IY LD (IOPB + PB_TRKO),HL ; LD HL,IOPB + PB_SECO +1 ;CLEAR BIT 15 RES 7,(HL) ; ; DONE ; RET SUBTTL BIOS FUNCTIDDR ON RET ; STACK, EXECUTE FUNCTION ADDRESS ON STACK ;################################################################+++++++++++++++++++++ ; ; RETURN DRIVER TABLE PTR FUNCTION #1 ; ENTRY- E= DRIVE # ; EXIT - E:HL= DRIVER TABLE BASE PTR ; N LD A,C OR A,A RET Z ; ; ELSE IF ILLEGAL DRIVE THEN RETURN ERROR ; CP A,NDRVS JR C,RETDV2 ; LD HL,0 OR A,A ;S********************* ; CRLF: LD C,CR CALL COC LD C,LF JP COC IF INTCPTS SUBTTL ADDITIONAL FUNCTIONS TO SUPPORT******************* ; ; SET 3740 SECTOR TRANSLATION PROCEDURE ; ENTRY- (CUR_DPH)= MUST BE PTR TO DPH ; EXIT - DE, HL= ? ; +++++++++++++++++++++++++++++++++++++++++ ; XPRIM: ; ; EXECUTE THE PRIMITIVE IN ROM ; LD A,(BUF_DMAB) ;PRESET IOPB BANK= DRIVER TABLE PTR ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ON CALLS ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; FUNCTION DISPATCHER ; ENTRY- C= F############ ; ; BIOS FUNCTION TABLE ; ;############################################################################ ; BFUZ= ILLEGAL DRIVE REQUESTED (HL=0) ; A, B, C= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ET NZ RET ; ; ; ELSE COMPUTE TABLE PTR ; RETDV2: LD B,C LD DE,DDT_SIZ ; RETDVL: ADD HL,DE DJNZ RETDVL ; LD A,( CDOS PROGRAMS ;*************************************************************************** ; ; SYSTEM CALL INTERCEPT ROUTINE 0 %+ &, !'- "(. #)/ $*0 CHECKS FOR ILLEGAL BDOS CALLS & ; PRINTS MESSAGE IF ILLEGAL. ALSO IMPLEMENTS CDOS CLOCK/CALENDAR ; SYSTEM CALLS FOR ASMB.  ; CP A,92H JR Z,CLKTIM ;IF TIME THEN GET IT ; ; ILLEGAL SYSTEM CALL ; ILLEGC: PUSH BC ;SAVE FUNCTION # ; ; OUTPUT++ ; ; RETURN CALENDAR FUNCTION 90H ; EXIT - A= DAY ; B= MONTH ; C= YEAR ; L= DAY OF WEEK ; ;++++++++++++++++++++++++I/O ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CONSOLE INPUT ; EXIT - A= CHA ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; READER DRIVER - DUMMY ; EXIT - A= CTR+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN LIST DEVICE STATUS ; EXIT - A= 0: BUSY, FFH:####################################################### ; SDTRAN: GXLATE 26,6 ;##########################################S FOR THIS DRIVE DDT_DPH DS 2 ;DPH ADDRESS FOR THIS DRIVE ; ; THE FOLLOWING MAY BE BROUGHT OFF DISK DESCRIPTOR OR FROM DEFA; ;*************************************************************************** INTCPT: LD A,C ;CHECK CALL VALIDITY CP A,41  WARNING MESSAGE ; LD HL,ISCMSG ;OUTPUT WARNING CALL EDITOR ; ; OUTPUT FUNCTION # ; POP BC LD A,MF_PHXB CALL XMR++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKCAL: LD A,MF_GCAL JP XMROM ;+++++++++++++++++++++++++++++++R ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CI: LD A,MF_CI JP XMROM ;++++++L-Z ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; READER: LD A,CTRLZ ;FAKE EOF ; ; READY ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; LISTST: LD A,MF_LOS JP XMROM ################################## ; ; COMMON I/O PARAMETER BLOCK ; ;#######################################################ULT TABLES ; DDT_HDS DS 1 ;HEADS DDT_SOF DS 2 ;SECTOR OFFSET ; ; DEFINE THE STRUCTURE SIZE ; DDT_SIZ DS 0 ENDM ; ;IF <= 40 THEN OK ; BDOSV EQU $ + 1 JP C,BDOS + 11H ;THIS ADDR MODIFIED BY WARM BOOT RTN ; ; THE FOLLOWING CONDITIONAL JOM ; ; OUTPUT NEW LINE ; CALL CRLF ; ; RETURN NULLS ; XOR A,A ;BC = HL = A = 0 LD L,A LD H,A LD C,A LD B,+++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN TIME FUNCTION 92H ; EXIT - A= SECONDS ; B= MINUTES ; C= HOURS ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN CONSOLE STATUS ; EXIT - A= 0: NOT READY ; FALL INTO PUNCH RETURN ; ;**************************************************************************** ; ; PUNCH DRIVER  ;**************************************************************************** ; ; MESSAGE EDITOR ; ENTRY- HL= TEXT PTR (BIT##################### ; IOPB: REPT PB_SIZE LIST OFF DB 0 LIST ON ENDM ;##########################################@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; MACRO TO DEFINE THE DRIVER TABLE RECORD ; ENUMP IS MODIFIED TO AN UNCONDITIONAL JUMP BY ; THE WARM BOOT ROUTINE IF THE CLOCK/CALENDAR BOARD IS NOT PRESENT ; IF NOT MODIA RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CDOS RETURN VERSION FUNCTION ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKTIM: LD A,MF_GTIM JP XMROM ENDI FFH: CHAR READY ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CNSCK: LD A,MF_CIS  ; ENTRY- C= CHAR TO OUTPUT ; ;**************************************************************************** ; PUNCH: RET  7= 1: TERMINATOR) ; EXIT - REGS= ? ; ;**************************************************************************** ; EDITO################################## ; ; DISK DRIVER TABLES (DDT) ; ;#########################################################TRY- #DADD= DRIVER ADDRESS ; #PD= PHYSICAL DRIVE # ; #FLG= DRIVE FLAGS ; #DPB= DPB ADDRESS ; #DPH= DPH ADDRESS ; #HDS=FIED, THEN IT IS ALLWAYS FALSE (NOP). ; INHCLK: JR C,ILLEGC ; ; NOW CHECK FOR EXTENDED CALLS ; CP A,8DH ;IF RETURN VERS MAKES CLOCK/CALENDAR WORK. ; EXIT - B= 1 ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ;F ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; MONITOR ROM EXECUTER ; ENTRY- A= FUNCT JP XMROM ;**************************************************************************** ; ; CONSOLE OUTPUT ; ENTRY- C= C ;**************************************************************************** ; ; PRINTER DRIVER ; ENTRY- C= CHAR TO OUTPUTR: CALL GETBNK LD E,A LD A,MF_PUTS JP XMROM SUBTTL INITIALIZED DATA ;############################################################### ; STRUCT 0 DDT_EXE DS 2 ;START ADDRESS OF DISK DRIVER DDT_FLG DS 1 ;FLAGS BIT DEF. ; 0 1: INHIBIT  HEADS ; #SOF= SECTOR OFFSET ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ALLDRV MACRION THEN RETURN IT JR Z,RETCVER ; CP A,90H ;IF NOT CLOCK THEN ERR JR C,ILLEGC ; JR Z,CLKCAL ;IF CALENDAR THEN GET IT  RETCVER: LD B,1 RET SUBTTL CLOCK ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; XMROM: EQU MR_FUN SUBTTL CHAR HAR TO OUTPUT ; ;**************************************************************************** ; COC: LD A,MF_CO JP XMROM ; ;**************************************************************************** ; LO: LD A,MF_LO JP XMROM ;+++++++################################ ; ; 3740 SECTOR TRANSLATION TABLE ; **** CP/M SINGLE DENSITY **** ; ;#####################LOGON ; 1..3 PARTITION # {0,..7} ; 4 1: HARD DISK DRIVE ; DDT_DRV DS 1 ;PHYSICAL DRIVE # DDT_DPB DS 2 ;DPB ADDRESO #DADD,#PD,#FLG,#DPB,#DPH,#HDS,#SOF DW #DADD ;DRIVER EXECUTION ADDR DB #FLG ;FLAGS DB #PD ;MONITOR PHYSICAL DRIVE # 0 %+ &, !'- "(. #)/ $*0DW #DPB ;DISK PARAMETER BLOCK PTR DW #DPH ;DISK PARAMETER HEADER PTR DB #HDS ;HEADS DW #SOF ;SECTOR OFFSET ; ENDM EC,5,12H,D5DPB,D5DPH,4,8000H ENDIF ;############################################################################ ; ;  ;DISK SIZE -1 DW 63 ;DIRECTORY MAX DB 11000000B ;ALLOC 0 DB 0 ;ALLOC 1 DW 16 ;CHECK SIZE DW 2 ;TRACK OFFSET DB;ALLOCATION 1 (AL1) DW 0 ;CHECK SIZE (CKS) DW 2 ;TRACK OFFSET (OFF) DB 1 ;PHYSICAL RECORD SHIFT FACTOR (PSH) DB IF NO XLATE) DW 0 ;;SCRATCH AREA DW 0 ;;" DW 0 ;;" DW DIRBF ;;DIRECTORY BUFFER PTR DW D#D(DD)DPB ;;DRIVE PARAMETEDW BLKBUF ;DMA DB 0 ;BANK DW 0 ;COUNT ; WR_PROT DB -1 ;/0: WRITE PROTECTION ENABLED ; ; LAST OF INITIALIZED CODE RDS 1 ;FLAGS BUF_DMA DS 2 BUF_DMAB DS 1 ;BANK # ; ; ; BLOCKING BUFFER MAINTENANCE ; BUF_PSEC DS 2 ;BUFFER PHYSICAL SECTO: DS 2 ;LAST UNALLOC SECTOR ;############################################################################ ; ; VARIABLES IF BOOT = 10H ; A DDT_0: ALLDRV HDEXEC,4,10H,D0DPB,D0DPH,4,0 ; B DDT_1: ALLDRV HDEXEC,4,12H,D1DPB,D1DPH,4,8000H ;  MESSAGES ; ;############################################################################ ; MSGLE: DM CR,LF,'LOAD ERROR' ; 0 ;PHYSICAL RECORD SHIFT FACTOR DB 0 ;PHYSICAL RECORD MASK DW 0 ;LOGICAL DRIVE SECTOR OFFSET ; ; DEFAULT DISK PHYSIC 1 ;PHYSICAL RECORD MASK (PRM) DW 0 ;LOGICAL DRIVE SECTOR OFFSET (SOF) ; ; ; DB 4 ;HEADS ;######################R BLK PTR IF ((DD - 1) <= NDHD) AND ((DD - 1) >= STHD) DW 0 ;;NO CHECKS ON HARD DISK ELSE DW D#D(DD)CHK ;;DRIVE DISEAD FROM DISK ; BIOSND EQU $ SUBTTL UNINITIALIZED DATA AREA ;############################################################R BUF_ACT DS 1 ;0: BUFFER FLUSHED, /0: DATA IN BUFFER BUF_MOD DS 1 ;0: BUFFER CLEAN, /0: BUFFER DIRTY (MODIFIED) ; BUF_DDT D ; ;############################################################################ ; CUR_DPB DS 2 ;DRIVE TABLE PTR CUR_DDT DS C DDT_2: ALLDRV HDEXEC,5,10H,D2DPB,D2DPH,4,0 ; D DDT_3: ALLDRV HDEXEC,5,12H,D3DPB,D3DPH,4,8000H ; E DDT_4: ALLDRV FD8 DSKEB: DM CR,LF,'Abort, Ignore, Retry, (BDOS) - ' ; WP_ERM: DM CR,LF,'W-PROT Error!' ; IF INTCPTS ISCMSG: DM CR,LF,'ILAL PARAMETERS ; DB 1 ;HEADS ;############################################################################ ; ; DEFAULT###################################################### ; ; DRIVE PARAMETER HEADER AREA ; 1 PER DRIVE ; ;###################K CHECKSUMS ARRAY PTR ENDIF DW D#D(DD)ALL ;;DRIVE CLUSTER ALLOCATION BIT MAP PTR LIST OFF ENDM ; ; DEFINE THE DATA################ ; ; THE FOLLOWING DATA MUST RESIDE IN THIS ORDER TO MATCH THE IOPB DATA ; ;##############################S 2 ;BUFFER DDT PTR BUF_DPB DS 2 ;BUFFER DPB PTR ; RSFLAG: DS 1 ;0: NO PREREAD REQ'D, /0: PREREAD REQ'D READOP: DS 1 ;0: WRI 2 ;DRIVE DRIVER TABLE BASE ADDRESS PTR CUR_DPH DS 2 ;DPH PTR ; LOGRQ: DS 1 ;LOG ON REQUEST REG. ;######################EXEC,0,0,D4DPB,D4DPH,1,0 ; F DDT_5: ALLDRV FD8EXEC,1,0,D5DPB,D5DPH,1,0 ENDIF IF BOOT = 3 ; A DDT_0: ALLDRV FD8EXL SYS CALL, #= ' ENDIF ;############################################################################ ; ; DEFAULT 8" F 8" HARD DISK PARAMETER BLOCK ; ;############################################################################ ; HDPBK: DW 12######################################################### ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; DD DL 1 REPT NDRVS LIST OFF ALLDPH 0123456789ABCDEF DD DL DD + 1 LIST ON ENDM ;########################################################################## ; ; CP/M IOPB OVERLAY ; CPM_DSK DS 1 ;LOGICAL DRIVE CPM_TRK DS 2 ;LOGICAL TE OPERATION, 1: READ OPERATION WRTYPE: DS 1 ;WRITE OPERATION TYPE FROM BDOS: ; 0: WRITE TO ALLOCATED (USED) BLOCK (PREREAD###################################################### ; ; DRIVE ALLOCATION AREAS ; ;#####################################EC,0,0,D0DPB,D0DPH,1,0 ; B DDT_1: ALLDRV FD8EXEC,1,0,D1DPB,D1DPH,1,0 ; C DDT_2: ALLDRV HDEXEC,4,10H,D2DPB,D2DPH,4,0 ; LOPPY DISK PARAMETER BLOCK ; IBM 3740 SINGLE DENSITY FORMAT ; ;##############################################################8 ;SECTORS PER TRACK (LOGICAL) (SPT) DB 5 ;BLOCK SHIFT FACTOR (BSH) DB 31 ;BLOCK MASK (BLM) DB 1 ;NULL MASK (EXM)@@@@@@@@@@@ ; ; GENERATE A DISK PARAMETER TABLE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@################################################ ; ; LOGON IOPB OVERLAY ; ;#################################################TRACK NUMBER CPM_SEC DS 2 ;LOGICAL SECTOR NUMBER DS 1 ;FLAGS CPM_DMA DS 2 ;XFER ADDR CPM_DMAB DS 1 ;XFER BANK ; ; ; BU) ; 1: WRITE TO DIRECTORY (PREREAD & WRITE) ; 2: WRITE TO UNALLOCATED (UNUSED) BLOCK (NO ; PREREAD REQ'D) ; ; UNA####################################### ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ;  D DDT_3: ALLDRV HDEXEC,4,12H,D3DPB,D3DPH,4,8000H ; E DDT_4: ALLDRV HDEXEC,5,10H,D4DPB,D4DPH,4,0 ; F DDT_5: ALLDRV HDEX############## ; SD8PBK: DW 26 ;SECTORS PER TRACK DB 3 ;BLOCK SHIFT FACTOR DB 7 ;BLOCK MASK DB 0 ;NULL MASK DW 242 DW 1015 ;DISK SIZE (CLUSTERS -1) (DSM) DW 1152 / 2 ;DIRECTORY MAX (DRM) DB 0FFH ;ALLOCATION 0 (AL0) DB 10000000B @@@@@@@@@ ; ALLDPH: MACRO #D LIST ON D#D(DD)DPH: ;DRIVE PARAMETER HEADER FOR DRIVE #D(DD) DW 0 ;;SECTOR TRAN TBL (OR 0########################### ; LOGIOPB: DB PB_LOGC ;COMMAND DB 0 ;DRIVE DW 0 ;TRACK DW ID_SECT ;SECTOR DB 0 ;FLAGS FFER IOPB OVERLAY ; BUF_DSK DS 1 ;BUFFER DISK NUMBER BUF_TRK DS 2 ;BUFFER TRACK NUMBER BUF_SEC DS 2 ;BUFFER SECTOR NUMBER _CNT: DS 1 ;# SECTORS REMAINING IN BLOCK (CLUSTER) UNA_DSK: DS 1 ;LAST UNALLOC DISK UNA_TRK: DS 2 ;LAST UNALLOC TRACK UNA_SECMACRO TO DEFINE THE DRIVE ALLOCATION & CHECKSUMS AREA ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0 %+ &, !'- "(. #)/ $*0@@@@@@@ ; ; ALL = (DSM / 8) + 1 ; CHK = DPB.CKS ; ALLDAL: MACRO #D LIST ON IF ((DD - 1) >= STHD) AND ((DD - 1) <= NDH2 ;SPT- SECTORS/TRACK DPB_BSH DS 1 ;BSH- BLOCK SHIFT FACTOR DETERMINED BY CLUSTER SIZE ; 1K= 3, 2K= 4, 4K= 5, 8K= 6, 16K= 7.2 DEBLOCKING) ; DPB_PSH DS 1 ;PSH- PHYSICAL RECORD SHIFT FACTOR BASED ON BYTES/SEC ; 0: 128, 1: 256, 2: 512, 3: 1024 DPB@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ALLDPB: MACRO #D LIST ON D#D(DD)DPB: DS DPB_SZ ;ALLOCATION FOR DRIVE #D(DD) ARD DISK PHYSICAL DRIVE 0 ; C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; D SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ; EARD DISK PHYSICAL DRIVE 1 ; G JADE 8" FLOPPY PHYSICAL DRIVE 0 ; H JADE 8" FLOPPY PHYSICAL DRIVE 1 ENDIF ; ;*********D) D#D(DD)ALL: DS 128 ;ALLOCATION BIT MAP FOR 8" HARD DRIVE #D(DD) ENDIF IF ((DD - 1) >= ST8FD) AND ((DD - 1) <= ND8FD) DPB_BLM DS 1 ;BLM- BLOCK MASK ; 1K = 7, 2K= 15, 4K= 31, 8K= 63, 16K= 127 DPB_EXM DS 1 ;EXM- EXTENT MASK ; DSM < 256 :_PHM DS 1 ;PHM- PHYSICAL RECORD MASK BASED ON BYTES/SEC ; 0: 128, 1: 256, 3: 512, 7: 1024 ; ; ADDITIONAL DISK PARTITIONI LIST OFF ENDM ; ; RESERVE THE DATA SPACE ; DD DL 1 REPT NDRVS LIST OFF ALLDPB 0123456789ABCDEF DD DL DD + 1 LI JADE 8" FLOPPY PHYSICAL DRIVE 0 ; F JADE 8" FLOPPY PHYSICAL DRIVE 1 ENDIF IF BOOT = 3 ; A JADE 8" FLOPPY PHYSICAL******************************************************************* ; ; REVISION HISTORY: ; ; 3.00 - 26 JAN 87 GRH ; Im D#D(DD)ALL: DS 57 ;ALLOCATION BIT MAP FOR 8" DRIVE #D(DD) D#D(DD)CHK DS 32 ;DIRECTORY CHECKSUMS STORAGE (1 BYTE PER SECTOR 1K= 0, 2K= 1, 4K= 3, 8K= 7, 16K= 15 ; DSM > 255 : 2K= 0, 4K= 1, 8K= 3, 16K= 7 DPB_DSM DS 2 ;DSM- DRIVE STORAGE SIZE (IN CLNG DATA FOR THE LOGICAL DRIVE SELECTION. ; PARTITIONING BY TRACKS ARE IMPLIMENTED THRU BDOS USING DPBOFF ABOVE. ; PARTITIONINGST ON ENDM ; ; BLOCKING BUFFER ; BLKBUF: DS 1024 ;HOST BUFFER IF (($ - 8000H) > 07700H) OR ($ < 8000H) CONMS TITLE CUSTOMIZED BIOS FOR M5B LIST NOCOND BOOT EQU 10H ;10H: SA1004, 11H: PYX27, 3: 8" FLOPPY, 20H: 5" FLOPPY ;************ DRIVE 0 ; B JADE 8" FLOPPY PHYSICAL DRIVE 1 ; C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; D SIDE 2 & 3 OF HARD DISK Pplemented new common IOPB code & Jade floppy firmware support. ; Implemented disk drive driver tables and new function to retur) ENDIF LIST OFF ENDM ; ; RESERVE THE DATA SPACE ; DD DL 1 REPT NDRVS LIST OFF ALLDAL 0123456789ABCDEF DD DUSTERS) ; INT(((#_TRACKS - OFF) * SPT * BYTES PER SECTOR) / CLUSTER SIZE) -1 DPB_DRM DS 2 ;DRM- DIRECTORY SIZE -1 DPB_AL0 D BY HEADS ARE IMPLIMENTED BY USING THE FOLLOWING DATA. ; (HEAD BITS ARE INCLUDED IN SECTOR WORD UPPER BITS) ; DPB_SECO DS 2G **** BIOS TOO BIG, USE MOVCPM & RE-ADJUST! **** ENDIF END **************************************************************** ; ; CUSTOMIZED BIOS FOR M5B ; (c) 1981 GRH Electronics,HYSICAL DRIVE 0 ; E SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; F SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ENDIF IFn ; a ptr to a drive table. ; Removed init of IOBYTE. ; Implemented 5" floppy driver. ; Implemented use of ROM primitives. L DD + 1 LIST ON ENDM ;############################################################################ ; ; RESERVE DRIS 2 ;AL0,1- DIRECTORY ALLOCATION ; 1 MSB PER DIRECTORY CLUSTER ALLOCATED DPB_CKS DS 2 ;CKS- # DIRECTORY SECTORS CHECKED  ;SOF- SECTOR OFFSET (FOR LOGICAL DRIVE) ; 0: NONE, 1..65535: OFFSET DPB_SZ DS 0 ENDM ; ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@ ENDIF END  CUPERTINO, CA ; ;**************************************************************************** ; ; CONFIGURATION: ; ; CPM  BOOT = 20H ; A JADE 5" FLOPPY PHYSICAL DRIVE 0 ; B JADE 5" FLOPPY PHYSICAL DRIVE 1 ; C SIDE 0 & 1 OF HARD DISK PHYSICA ; Moved system down to 60k. ; 3.01 26 JUN 88 GRH ; Remove 5" floppy support. Implement in CP/M-86 BIOS. ; Change single funVE PARAMETER BLOCKS ; ;############################################################################ ; STRUCT 0 DPB_SPT DS  ; (DRM +1) / 4 DPB_OFF DS 2 ;OFF- # RESERVED TRACKS (USUALLY 2) ; ; ADDITIONAL CP/M 3.0 DATA (ALSO COULD BE USED BY CP/M 2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE THE DPB FOR DRIVE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; DRIVE USAGE IF BOOT = 10H ;HARD DISK BOOT CONFIG. ; A SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; B SIDE 2 & 3 OF HL DRIVE 0 ; D SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 0 ; E SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; F SIDE 2 & 3 OF Hction to return drive table ptr into a BIOS function ; call using restart instruction. ; Change LOGON to specify the ID sect0 %+ &, !'- "(. #)/ $*0or & track. At same time, fix bug ; which did not specify the logon track. ; 3.02 7 JUL 88 GRH ; Add '?' to include file  than swapping Roms itself. ; 3.07 11-25-90 GRH ; Modify for Ver. 1.22 Monitor. ; Fix bug in 8" Hard Disk table which benigrom ; DCM8 to CBIOS. ; Remove IOPB ptr passing in IX redundancy. ; Change DPB track-head shift factor to Sector Offset like uffer for ; ID sector read. ; 9-20-91 GRH Fold in redlines. ; 10-21-91 GRH Fix bugs ; 10-22-91 GRH Fix bugs ; 1 ;============================================================================ ; ; CONDITIONAL ASSEMBLY FLAGS ; ;=========RESSES ; ;============================================================================ ; SYS EQU 2 ;CP/M VERSION {2,3} ; NNRSV EQU PAGE0 + BFUNRST BFUNRSI EQU 0C7H + BFUNRST ;=====================================================================;E DSK_5 EQU 10H ;F NDRVS: EQU 6 ENDIF IF BOOT = 11H ; ; 5.25" PYX-27 BOOT ; DSK_0 EQU 11H ;A DSK_1 EQU 10H ;B names. ; Change hard disk system tracks directory reference to new format. ; Correct bug in drivers which caused retry to failnly (at current level) ; caused the drive table to have bad data (default table was missing ; the 2 deblocking extension byttrack ; offset. Disk partitioning will add this value to sector word. It ; will be stored in the ID sector data to be dynami0-23-91 GRH Fix bugs ; 3.13 1-15-92 GRH ; Change hard disk translation to Monitor disks 4 & 5 from 6 & 7. ; ; 3.14 2-9-=================================================================== ; INTCPTS EQU TRUE ;ENABLE SYSTEM CALL INTERCEPT WHISTLE KSYS: EQU 59 ;SYSTEM SIZE IN K BYTES KBYTE: EQU 1024 CPMSZ: EQU KBYTE * NKSYS CPMBS: EQU CPMSZ - (20 * KBYTE) ;CP/M BIAS V======= ; ; OTHER DECLARATIONS ; ;============================================================================ ; SKTSZ EQU DSK_2 EQU 10H ;C DSK_3 EQU 0H ;D DSK_4 EQU 0 ;E NDRVS: EQU 5 ENDIF ;===============================================. (sector remained ; corrupted) ; Stubbed out new Clock routines for present. ; 3.03 31 JUL 88 GRH ; Unstub Clock routines). ; Implement data xfer inhibit schemes with PB_FLG & PB_BCNT. ; Add pick-up of THIS_BNK data in all iopb cases. ; Remove c. ; 3.10 5-20-91 GRH ; Change LOGON to attempt to recover from old disks better, using ; DCM8301 version controller firmw92 GRH ; Add additional floppy disk allocation size for 1.22Mb disks. ; ; 3.15 3-17-92 GRH ; Add dynamic sector skew tab ;============================================================================ ; ; INCLUDE COMIOPB3.DEF ; INCLUDE DALUE CCP: EQU CPMBS + 3400H ;ADDR OF CCP BDOS: EQU CPMBS + 3C00H ;ADDRESS OF BDOS BIOS: EQU CPMBS + 4A00H ;ADDRESS OF BDOS 26 ;SKEW TABLE SIZE IF BOOT = 10H ; ; 8" HARD DISK BOOT DATA ; DSK_0 EQU 10H ;A DSK_1 EQU 10H ;B DSK_2 EQU 10H ;C ============================= ; ; BDOS CONSTANTS ON ENTRY TO WRITE ; ;===============================================es. ; 3.04 6 AUG 88 GRH ; Remove floppy side select from BIOS & move to controller. ; Implement new ID sector format. ; Imclock buffer set/read system calls. ; 12-5-90 GRH ; Remove IX IOPB ptr passing to disk drivers. ; 1-13-91 GRH ; Fix bug ware. ; 3.11 9-2-91 GRH ; Add redlines & change for M5ZMON v.2.00. ; 3.12 9-11-91 GRH ; Add deblocking code. ; 9-17-91 le selection to login code. ; VERSN EQU 315 ; ;**************************************************************************** ISKS3.DEF ; INCLUDE BDIR.DEF ; INCLUDE M5ZF2.DEF ; ;============================================================= BIOSR: EQU 1000H - BIOS ; ; PAGE 0 LOCATIONS ; PAGE0: EQU 0 ;START OF CP/M RAM DEFDRV: EQU PAGE0 + 4 ;DEFAULT DRIVE PADSK_3 EQU 10H ;D DSK_4 EQU 0 ;E DSK_5 EQU 0 ;F NDRVS: EQU 6 ENDIF IF BOOT = 3 ; ; 8" FLOPPY BOOT DATA ; DSK_0 E============================= ; WRALL EQU 0 ;WRITE TO ALLOCATED WRDIR EQU 1 ;WRITE TO DIRECTORY WRUAL EQU 2 ;WRITE TO UNALLOplement CP/M 3.0 DPB structure in preparation for deblocking. ; 3.05 11-3-88 GRH ; Change included data to update IOPB.PBSTAhich corrupted PB_FLG. ; 3.08 2-22-91 GRH ; Remove references to THIS_BNK & use monitor function #7 instead. ; Add track-he GRH Add r/ls & move to 59k system. ; 9-19-91 GRH Fix bug which destroyed my root directories! ; BUF_RD was writing. ;  SUBTTL SYSTEM DECLARATIONS ;============================================================================ ; ; ASSEMBLY PAR=============== ; LIST OFF *INCLUDE COMIOPB3.DEF *INCLUDE DISKS3.DEF *INCLUDE BDIR.DEF *INCLUDE B:M5ZF2.DERAM ADDR BDOSJV EQU PAGE0 + 5 ;BDOS SYSTEM CALL ENTRY THIS_STK EQU PAGE0 + 1CH ;CURRENT STACK FRAME PTR DK_BDRV EQU 0041H ;BQU 0H ;A DSK_1 EQU 0H ;B DSK_2 EQU 10H ;C DSK_3 EQU 10H ;D DSK_4 EQU 10H ;E DSK_5 EQU 10H ;F NDRVS: EQU 6 ENDIF IFCATED ;============================================================================ ; ; ASCII CHARS ; ;================T to new configuration. ; 3.06 1-28-89 GRH ; Revised primitive calling procedures to use the monitor rom function ; ratherad shift factor to DPBs for future use. ; 3.09 5-15-91 GRH ; Change 8" floppy side select to track bit 0. Move calculation f Patch problems with partitioning until 20MB drive installed. ; Fix TPA corruption by LOGON problem by using ROMBNK sector bAMETERS ; ;============================================================================ ; FALSE EQU 0 TRUE EQU NOT FALSE F LIST ON ;============================================================================ ; ; DISK OPERATING SYSTEM ADDOOT DRIVE # FROM PROM DEFBFR EQU PAGE0 + 80H ;DEFAULT BUFFER ; ; BIOS FUNCTION CALL RESTART VECTOR ; BFUNRST EQU 28H BFU BOOT = 20H ; ; 5.25" FLOPPY BOOT ; DSK_0 EQU 20H ;A DSK_1 EQU 20H ;B DSK_2 EQU 20H ;C DSK_3 EQU 20H ;D DSK_4 EQU 10H ============================================================ ; LF: EQU 0AH CR: EQU 0DH CTRLZ: EQU 1AH ;@@@@@@@@@@@@@@@@0 %+ &, !'- "(. #)/ $*0@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE THE TRANSLATION TABLE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; PVERS MACRO #VERS DD DL #VERS IF DD > 9999 DB (DD / 10000) + '0' DD DL DD % 10000 ENDJP SETTRK ;SET TRACK # JP SETSEC ;SET SECTOR # JP SETDMA ;SET TRANSFER ADDR JP DISKRD ;PERFORM DISK READ JP DISKWR  ;BIOS MODULE LOAD ADDR FOR SBD ; ; CONTINUE ON WITH INIT ; INIT1: JR INIT ;######################################## LD (THIS_STK),SP EI ; ; INIT DEFAULT DRIVE ; LD A,(DK_BDRV) ;USE DRIVE # PASSED IN PAGE 0 AND A,3 LD (DEFDRV),A ##### ; ; SIGN-ON MESSAGE ; ;############################################################################ ; MSGSO: DB CR,LD (THIS_STK),SP EI ; ; INIT OUR STUFF ; XOR A,A LD (BUF_ACT),A ;ASSUME NO DATA IN BUFFER ; LD (UNA_CNT),A ;CLEAR U_SBDSS) ;PREFETCH BDOS TRK/SECTOR PUSH HL ; LD HL,(DEFBFR + BD_SCCPS) ;FETCH CCP TRK/SECTOR LD C,L LD B,0 CALL SETSEC@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; GXLATE MACRO #SECTORS, #SKEW LIST OFF NXTSEC DL 1 ;;START WITHIF IF DD > 999 DB (DD / 1000) + '0' DD DL DD % 1000 ENDIF DB (DD / 100) + '0' DB '.' DB ((DD % 100) / 10) + '0';PERFORM DISK WRITE JP LISTST ;RETURN LIST STATUS JP SECTRN ;TRANSLATE SECTOR JP BIOFUNC ;EXECUTE FUNCTION CALL ;##################################### ; ; DIRECTORY SECTOR BUFFER STARTS HERE AFTER CRUNCHING COLD START ; CODE. THIS BUFFER ; ; SEND SYSTEM SIGN-ON ; LD HL,MSGSO CALL EDITOR ; ; MODIFY COLD START VECTOR TO WARM START ; LD HL,(BIOS+4) LF DB CPMSZ / (KBYTE * 10) + '0' DB (CPMSZ MOD (KBYTE * 10)) / KBYTE + '0' DB 'K CP/M-80 Vers 2.2',CR,LF DB 'M5b CBIOS NALLOCATED SECTOR COUNT ; LD (BUF_MOD),A ;CLEAN BUFFER ; LD HL,BLKBUF ;INIT BUFFER PTR LD (BUF_DMA),HL ; ; LOG ON DR ; LD C,H CALL SETTRK ; LD BC,CCP CALL SETDMA ; ; READ CCP/BDOS ; WREAD: CALL DISKRD JR NZ,WEROR ;IF ERROR THE SECTOR 1 LOWEST DL 1 ;; REPT #SECTORS LIST ON DB NXTSEC LIST OFF NXTSEC DL NXTSEC + #SKEW ;ADD SKEW FACTOR ;; I DB (DD % 10) + '0' ENDM SUBTTL BIOS CODE ORG BIOS ;---------------------------------------------------------------########################################################################### ; ; THE FOLLOWING BOOT DATA MUST RESIDE AS DEFINEDIS USED BY THE CP/M DIRECTORY CHECK ROUTINES THAT ; CHECK FOR DISK CHANGE. ; ;##############################################D (BIOS+1),HL ; ; INIT OUR STUFF ; CALL GETBNK LD (BUF_DMAB),A ; ; INITIALIZE CLOCK VECTORS IF CLOCK INSTALLED ;  Vers ' PVERS VERSN DM CR,LF IF $ > (DIRBF + 128) CONMSG **** WARNING! COLD INIT CODE BIGGER THAN DIR BUFFER ***IVE TO INIT TABLES ; LD A,(DK_BDRV) AND A,3 ;MODULO 4 LD C,A LD E,0 CALL SELDSK LD A,L ;IF ERROR THEN ABORT OR N EXIT ; ; NEXT SECTOR ; LD HL,CPM_SEC INC (HL) ; LD DE,128 ;DMA += SECTOR SIZE LD HL,(CPM_DMA) ADD HL,DE LD F NXTSEC > #SECTORS ;CHECK FOR OVERFLOW NXTSEC DL NXTSEC - #SECTORS ;; IF NXTSEC <= LOWEST ;CHECK FOR REPEAT NXTSEC DL LO------------- ; ; BIOS JUMP VECTOR TABLE ; ;----------------------------------------------------------------------------  RIGHT BEFORE THE COLD ; INIT ROUTINE START AND MUST BE IN THE 1ST SECTOR. THESE 2 WORDS ARE ; REFERENCED BY THE BOOT LOADER C############################## ; DIRBF: EQU $ ;BUFFER BEGINNING ;------------------------------------------------------- LD A,MF_CSYN ;TEST FOR BOARD PRESENT CALL XMROM ; ; IF CLOCK PRESENT THEN TURN ON CLOCK DRIVE ; OR A,A LD A,38H ;CO* ELSE DS DIRBF + 128 - $ ;FILL OUT DIRECTORY BUFFER TO 1 SECTOR SIZE ENDIF ;------------------------------------A,H JR Z,WEROR ; ; READ BOOT DIRECTORY ; LD BC,DEFBFR ;SET XFER ADDRESS (USE DEFAULT BUFFER) CALL SETDMA ; LD BC(CPM_DMA),HL ; ; IF NOT INTO BDOS THEN READ NEXT SECTOR ; LD DE,BDOS XOR A,A SBC HL,DE JR C,WREAD ; ; ELSE IF AWEST + 1 LOWEST DL NXTSEC ENDIF ENDIF ;; ENDM LIST ON ENDM ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@; JP INIT1 ;COLD START ENTRY JP WARM ;RELOAD CCP/BDOS JP CNSCK ;GET CONSOLE STATUS JP CI ;CONSOLE INPUT JP COC ;CODE IN ORDER TO DETERMINE THE LOAD ADDRESS ; AND LENGTH OF THE BIOS. ; ;#####################################################--------------------- ; ; INIT - COLD START ENTRY FROM BOOT MUST SET ALL BIOS PARAMS ; ;--------------------------------ND. JR (ON) JR Z,CLKON ; ; ELSE TURN OFF CLOCK DRIVE ; LD A,18H ;UNCOND. JR (OFF) (CAUSES JUMP TO ILLEGAL) ; CLKON: ---------------------------------------- ; ; WARM REBOOT ENTRY LOADS CCP,BDOS FROM DISK & SETS UP VARIABLES ; ;-------------,BD_SEC ;SET DIRECTORY SECTOR CALL SETSEC ; LD BC,0 ;SET TRACK TO 0 CALL SETTRK ; CALL DISKRD JR NZ,WEROR ; ; CT BEGINNING OF BDOS THEN SET UP NEW TRACK & SECTOR ; JR Z,RDBDOS ; ; ELSE IF NOT AT BIOS THEN READ NEXT SECTOR ; LD DE@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; INITIALIZE VERSION TEXT IN RAM MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ONSOLE OUTPUT JP LO ;PRINTER OUTPUT JP PUNCH JP READER JP HOME ;HOME SELECTED DRIVE JP SELDSK ;SELECT DISK DRIVE ####################### ; DB 0 ;Z80 CPU DB 0 ;SPARE BIOSSZ: DW BIOSND - BIOS ;BIOS MODULE SIZE IN BYTES BIOSST: DW BIOS-------------------------------------------- ; INIT: ; ; SET TEMPORARY STACK ; DI LD SP,DEFBFR ;USE PAGE 0 FOR STACK LD (INHCLK),A ; ; BOOT CCP & BDOS ; JR WARM ;#######################################################################--------------------------------------------------------------- ; WARM: ; ; SET TEMPORARY STACK ; DI LD SP,DEFBFR LHECK FOR VALID BOOT DIRECTORY ; LD A,(DEFBFR) CP A,86H JR C,WEROR ; ; SET UP TO LOAD CCP/BDOS ; LD HL,(DEFBFR + BD,BIOS - BDOS SBC HL,DE JP C,WREAD ; ; ELSE DONE READING SYSTEM ; JR WZRPG ; ; ; ELSE SET UP & READ BDOS ; RDBD0 %+ &, !'- "(. #)/ $*0OS: POP HL ;RESTORE BDOS TRK/SECTOR FROM DIRECTORY LD C,L LD B,A ;A STILL CONTAINS 0 CALL SETSEC ; LD C,H CALL SETT + 7) LD (BDOSV),HL ; ; NOW PUT INTERCEPT VECTOR INTO BDOS CODE ; LD HL,INTCPT LD (BDOS + 7),HL ENDIF ; ; PASS INC A LD (READOP),A ; ; PRE-READ_OF_DATA_FLAG = TRUE ; LD (RSFLAG),A ; ; TREAT AS UNALLOCATED BLOCK ; LD A,WRUA ; PUSH IY LD IY,(CUR_DPB) ; ; IF NOT BLOCKED THEN USE CPM WRITE ; LD A,(IY + DPB_PSH) ;0= 128-BYTE SECTORS OR A,A  A,A JP Z,ALLOC ; ; ELSE MORE UNALLOCATED RECORDS REMAIN, COUNT-- ; DEC A LD (UNA_CNT),A ; ; IF REQUESTED SECTOR S UNNECESSARY READ ; XOR A,A ;PREREAD FLAG = FALSE LD (RSFLAG),A JP RWOPER ; ; ; NORMAL NON-BLOCKED WRITE ; DISKWC A JP NZ,SECSHFLP ; NOSECSHF: INC HL ;SET BACK TO PHYSICAL SECTOR LD (BUF_PSEC),HL ;BUFFER PHYSICAL SECTOR TO ACCESS HE SECTOR BUFFER ; LD A,(CPM_DSK) ;BUFFER SECTOR = PHYSICAL SECTOR LD (BUF_DSK),A ; LD HL,(CPM_TRK) LD (BUF_TRK),HL ;RK ; JR WREAD ; ; ; WARM BOOT ERROR, OUTPUT MSG & GO TO DEBUGGER ; WEROR: LD HL,MSGLE ;OUTPUT ERROR MESSAGE CALL EDI DEFAULT DISK TO CCP ; LD A,(DEFDRV) LD C,A JP CCP SUBTTL BIOS DISK FUNCTION ROUTINES ;+++++++++++++++++++++++++++L LD (WRTYPE),A ; JP RWOPER ;TO PERFORM THE READ ; ; ; NORMAL NON-BLOCKED READ ; DISKRDN: CALL CPM_RD JP RW_RET JP Z,DISKWRN ; ; READ_OP_FLAG = FALSE ; XOR A,A LD (READOP),A ; ; SAVE WRITE TYPE ; LD A,C LD (WRTYPE),A ; != UNALLOCATED SECTOR THEN PURGE ; LD A,(CPM_DSK) ;SAME DISK? LD HL,UNA_DSK CP A,(HL) JR NZ,ALLOC ; LD HL,(UNA_TRK) RN: CALL CPM_WR JP RW_RET ; ; ; NOT AN UNALLOCATED RECORD, REQUIRES PRE-READ ; ALLOC: XOR A,A ;COUNT = 0 LD (UNA; ; IF BUFFER == EMPTY THEN READ THE PHYSICAL SECTOR ; LD HL,BUF_ACT LD A,(HL) ; LD (HL),1 ;BUFFER = ACTIVE IN ANY C LD HL,(BUF_PSEC) LD (BUF_SEC),HL ; ; IF REQUIRED TO READ THEN READ ; LD A,(RSFLAG) ;NEED TO READ? OR A,A CALL NTOR CALL MR_BRK HALT ; ; ; BOOT OK, INIT PAGE 0 ; WZRPG: ; ; INIT BIOS WARM START IN PAGE 0 ; LD A,0C3H LD H+++++++++++++++++++++++++++++++++++++++++++++++++ ; ; READ A DISK SECTOR ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++++++++++++ ;**************************************************************************** ; ; WRITE DISK SECTOR FUNCTION ; ENTRY- C ; IF 1ST WRITE TO UNALLOCATED (NEW, UNUSED) BLOCK THEN SET PARAMETERS ; CP A,WRUAL JP NZ,CHKUNA ; ; COUNT = NUMBER_O;SAME TRACK? LD DE,(CPM_TRK) SBC HL,DE JR NZ,ALLOC ; LD HL,(CPM_SEC) LD DE,(UNA_SEC) SBC HL,DE JR NZ,ALLOC ; ; _CNT),A ; INC A ;PREREAD FLAG = TRUE LD (RSFLAG),A ; ; ; ; COMMON CODE FOR READ AND WRITE FOLLOWS ; RWOPER: ; ; ASE ; OR A,A JR Z,FILHST ; ; HOST BUFFER ACTIVE, SAME AS SEEK BUFFER? ; LD A,(CPM_DSK) LD HL,BUF_DSK ;SAME DISK? Z,BUF_RD ;YES, IF 1 ; ; BUFFER = CLEAN ; XOR A,A LD (BUF_MOD),A ; MATCH: ; ; COPY DATA TO OR FROM BUFFER ; LDL,BIOS + 3 LD (PAGE0),A LD (PAGE0 + 1),HL ; ; INIT BDOS CALL VECTOR IN PAGE 0 ; LD HL,BDOS + 6 LD (BDOSJV),A LD (++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; DISKRD: ; ; SET UP DATA TABLE PTRS ; PUSH IX LD IX,(CUR_= WRITE TYPE: ; 0: WRITE TO ALLOCATED BLOCK (UPDATE) ; 1: WRITE TO DIRECTORY BLOCK (ALLWAYS WRITE) ; 2: WRITE TO UNALLOF_SECTORS_IN_BLOCK ; LD A,(IY + DPB_BLM) ;CUR_DPB.DPBBLM + 1 ::= (BLKSIZ/128) INC A LD (UNA_CNT),A ; ; SET DISK TO SE MATCH, MOVE TO NEXT SECTOR FOR FUTURE REF ; EX DE,HL ;UNASEC += 1 INC HL LD (UNA_SEC),HL ; ; IF PAST LAST SECTOR O ASSUME NO ERRORS ; XOR A,A LD (IOPB + PB_STATO),A ; ; COMPUTE BUFFER SECTOR ; LD HL,(CPM_SEC) DEC HL ;CONVERT  CP A,(HL) JR NZ,NOMATCH ; LD HL,(BUF_TRK) ;SAME TRACK? LD DE,(CPM_TRK) SBC HL,DE JR NZ,NOMATCH ; LD DE,(BUF_PSEC) HL,(CPM_SEC) ;CALCULATE INDEX INTO BUFFER DEC HL ;CONVERT TO LOGICAL SECTOR (0..N-1) LD A,L ; AND A,(IY + DPB_PHM) ;UBDOSJV + 1),HL ; ; INIT BIOS CALL VECTOR IN PAGE 0 ; LD HL,BIOFUNC LD (BFUNRSV),A LD (BFUNRSV + 1),HL ; ; SET DEFDDT) ; PUSH IY LD IY,(CUR_DPB) ; ; IF NOT BLOCKED THEN USE CPM READ ; LD A,(IY + DPB_PSH) ;0= 128-BYTE SECTORS OR CATED BLOCK (NO NEED TO PRE-READ) ; ;**************************************************************************** ; DISKWR: EK ; LD A,(CPM_DSK) LD (UNA_DSK),A ; ; SET TRACK TO SEEK ; LD HL,(CPM_TRK) LD (UNA_TRK),HL ; ; SET SECTOR TO SN TRACK THEN USE 1ST SECTOR OF NEXT TRACK ; LD E,(IY + DPB_SPT) LD D,(IY + DPB_SPT +1) SBC HL,DE JP C,NOOVF ; LD HL,PHYSICAL SECTOR TO LOGICAL ; LD A,(IY + DPB_PSH) ;USE PHYSICAL SHIFT FACTOR (CP/M 3.X) AND A,3 ;LIMIT TO 1024 BYTE SECTOR ;SAME SECTOR? LD HL,(BUF_SEC) SBC HL,DE JR Z,MATCH ;SKIP IF MATCH ; NOMATCH: ; ; IF BUFFER == DIRTY THEN WRITE IT SE PHYSICAL RECORD MASK DATA (CP/M 3.X) ; RRA ;BITS <7..1> -> BITS <14..8> LD H,A ; LD A,0 ;BIT 0 -> BIT 7 RRA LDAULT SECTOR BUFFER ; LD BC,DEFBFR CALL SETDMA ; IF INTCPTS ; ; PUT BDOS VECTOR INTO INTERCEPT CODE ; LD HL,(BDOSA,A JP Z,DISKRDN ; ; READS DON'T NEED ALLOCATION ; XOR A,A LD (UNA_CNT),A ; ; READ_OPERATION_FLAG = TRUE (1) ;  ; ; REMOVE BOOT WRITE PROTECTION ; XOR A,A LD (WR_PROT),A ; ; SET PTRS TO DISK DATA ; PUSH IX LD IX,(CUR_DDT) EEK ; LD HL,(CPM_SEC) LD (UNA_SEC),HL ; ; IF NO UNALLOCATED SECTORS REMAIN THEN PREREAD ; CHKUNA: LD A,(UNA_CNT) OR0 ;SECTOR = 1 LD (UNA_SEC),HL ; LD HL,(UNA_TRK) ;TRACK++ INC HL LD (UNA_TRK),HL ; NOOVF: ; ; MATCH FOUND, MARK AS JP Z,NOSECSHF ;IF ALREADY 0 THEN SECTOR SIZE IS 128 ; SECSHFLP: SRL H ;ELSE SHIFT OVER TO PHYSICAL SECTOR RR L DEOUT BEFORE READING NEW ONE ; CALL BUF_FLSH ;CLEAR HOST BUFF ; JR NZ,RW_RET ;IF ERROR THEN ABORT ; FILHST: ; ; READ T L,A ; ; HL HAS RELATIVE HOST BUFFER ADDRESS ; LD DE,BLKBUF ADD HL,DE ;HL = HOST ADDRESS ; LD DE,(CPM_DMA) ;GET/PUT0 %+ &, !'- "(. #)/ $*0 CP/M DATA LD BC,128 ;LENGTH OF MOVE ; LD A,(READOP) ;WHICH WAY? OR A,A JP NZ,RWMOVE ;SKIP IF READ ; ; WRITE OPERA ;WRITE TO DISK ; LD A,(IOPB + PB_STATO) ;RETURN ANY ERRORS ; ; DONE, RESTORE & RETURN ; RW_RET: OR A,A ;SET RESULT SYSICAL READ FROM THE DISK INTO CPM_DMA, ; WITHOUT BLOCKING. ; ENTRY- (CPM_DSK)= DISK # TO READ FROM ; (CPM_TRK)= TRACK # TO CTOR # TO READ FROM ; (CPM_DMA)= XFER ADDRESS ; IX= DDT PTR ; IY= DPB PTR ; EXIT - (IOPB.PB_STATO)= 0: OK, /0: ERROR ;  ; RET ;**************************************************************************** ; ; BUF_FLSH FLUSHES THE BUFFER DALEAN BUFFER ; LD (BUF_MOD),A RET ;**************************************************************************** ; ; BROM ; IX= DDT PTR ; IY= DPB PTR ; EXIT - (IOPB.PB_STATO)= 0: OK, /0: ERROR ; ;*******************************************;DRIVE IS STILL IN C REGISTER ; ; IF DRIVE ERROR THEN RETURN (HL= 0) ; RET NZ ; ; ELSE SAVE PTR ; LD (CUR_DDT),HL TION, MARK AND SWITCH DIRECTION ; LD A,1 ;BUFFER = DIRTY LD (BUF_MOD),A ; ; SAVE BUFFER DATA PTRS FOR LATER FLUSHES ;TATUS FLAG POP IY POP IX ; RET ;**************************************************************************** ; ; CREAD FROM ; (CPM_SEC)= SECTOR # TO READ FROM ; (CPM_DMA)= XFER ADDRESS ; EXIT - (IOPB.PB_STATO)= 0: OK, /0: ERROR ; ;****;**************************************************************************** ; CPM_RD: ; LD HL,LL_READ ; ; COMMON CODETA IF MODIFIED ; ENTRY- (BUF_DSK)= DISK # TO WRITE TO ; (BUF_TRK)= TRACK # TO WRITE TO ; (BUF_PSEC)= SECTOR # TO WRITE TO UF_WR PERFORMS THE PHYSICAL WRITE FROM BLKBUF TO THE HOST DISK. ; ENTRY- (BUF_DSK)= DISK # TO WRITE TO ; (BUF_TRK)= TRACK # T********************************* ; BUF_RD: ; LD HL,LL_READ ; ; COMMON CODE ; BUF_RW: PUSH HL LD HL,BUF_TRK JP RD ; ; FETCH FLAGS ; INC HL ;EXE +1 INC HL ;FLGS LD C,(HL) ; ; FETCH DISK PARAMETER BLOCK ADDRESS ; INC HL ;DR LD (BUF_DDT),IX LD (BUF_DPB),IY ; EX DE,HL ;SOURCE/DEST SWAP ; RWMOVE: ; ; BC INITIALLY 128, DE IS SOURCE, HL IS PM_WR PERFORMS THE PHYSICAL WRITE FROM CPM_DMA TO THE DISK. ; ENTRY- (CPM_DSK)= DISK # TO WRITE TO ; (CPM_TRK)= TRACK # TO WR************************************************************************ ; CPM_RD2: ; ; SET UP PTRS ; PUSH IX PUSH IY ; CPM_RW: PUSH HL LD HL,CPM_TRK ; ; FALL INTO COMMON XFER CODE ; ;***********************************************; (BUF_DDT)= DDT PTR ; (BUF_DPB)= DPB PTR ; EXIT - (IOPB.PB_STATO)= 0: OK, /0: ERROR ; ;**********************************O WRITE TO ; (BUF_SEC)= SECTOR # TO WRITE TO ; IX= DDT PTR ; IY= DPB PTR ; EXIT - (IOPB.PB_STATO)= 0: OK, /0: ERROR ; ;_WR ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SELECT DRIVE FUNCTION ; LOG-ON - SV INC HL ;DPB_PTR LD E,(HL) INC HL LD D,(HL) LD (CUR_DPB),DE ; ; FETCH DISK PARAMETER HEADER ADDRESS ; INC HL DEST ; LDIR ; ; DATA HAS BEEN MOVED TO/FROM HOST BUFFER, IF NOT DIRECTORY THEN DELAY WRITE ; LD A,(WRTYPE) ;IF NOT DIITE TO ; (CPM_SEC)= SECTOR # TO WRITE TO ; (CPM_DMA)= XFER ADDRESS ; IX= DDT PTR ; IY= DPB PTR ; EXIT - (IOPB.PB_STATO) LD IX,(CUR_DDT) LD IY,(CUR_DPB) ; ; EXECUTE READ SECTOR ; CALL CPM_RD ; ; RESTORE PTRS & RETURN ; POP IY PO***************************** ; ; SET UP IOPB FOR EXECUTION ; ENTRY- HL= PTR TO IOPB IMAGE TRACK DATA ; IX= DDT PTR ; IY=****************************************** ; BUF_FLSH: ; ; IF UNMODIFIED THEN RETURN ; LD A,(BUF_MOD) OR A,A RET Z **************************************************************************** ; BUF_WR: ; LD HL,LL_WRIT JP BUF_RW ;**ET DISK PARAMETER BLOCK ; ENTRY- C= DRIVE # ; E= 0 IF NEW SELECT ; EXIT - HL= PTR TO DPT OR 0 FOR ERROR ; ;+++++++++++++++ ;DPH PTR LD E,(HL) INC HL LD D,(HL) LD (CUR_DPH),DE EX DE,HL ;PUT DPH PTR IN HL FOR RETURN ; ; IF NOT FIRST SELERECTORY THEN DELAY WRITE CP A,WRDIR LD A,(IOPB + PB_STATO) ;RETURN ANY ERRORS ANYWAY JR NZ,RW_RET ; ; IF ERROR THEN AB= 0: OK, /0: ERROR ; ;**************************************************************************** ; CPM_WR: ; LD HL,LL_WP IX RET ;**************************************************************************** ; ; CPM_RD PERFORMS THE PHYSICAL DPB PTR ; (SP)= ADDRESS {LL_READ, LLWRIT} OF EXECUTOR ; ;****************************************************************** ; ; ELSE SET PTRS TO BUFFER DATA ; PUSH IX PUSH IY LD IX,(BUF_DDT) LD IY,(BUF_DPB) ; ; WRITE THE BUFFER DATA ;************************************************************************** ; ; RDBUF PERFORMS THE PHYSICAL READ FROM THE HOST +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; SELDSK: ; ; STORE DRIVE # FOR FUTURE USE ; LD A,C LD CT OR LOGON INHIBITED THEN RETURN TABLE PTR ; LD A,(LOGRQ) ;0: LOGON, 1:INHIBIT OR A,C ;0: NORMAL, 1: INHIBIT CPL AND ORT ; OR A,A JR NZ,RW_RET ; ; NO ERROR/DIRECTORY WRITE ; XOR A,A ;BUFFER = CLEAN LD (BUF_MOD),A ; CALL BUF_WRRIT JP CPM_RW ;**************************************************************************** ; ; CPM_RD2 PERFORMS THE PH READ FROM THE DISK INTO CPM_DMA. ; ENTRY- (CPM_DSK)= DISK # TO READ FROM ; (CPM_TRK)= TRACK # TO READ FROM ; (CPM_SEC)= SE********** ; RD_WR: LD DE,IOPB + PB_TRKO LD BC,PB_BCNTO - PB_TRKO LDIR ; ; EXECUTE LOW LEVEL READ OR WRITE (ON STACK)  CALL BUF_WR ; ; RESTORE THE PTRS ; POP IY POP IX ; ; IF ERROR THEN RETURN IT ; OR A,A RET NZ ; ; ELSE CDISK INTO BLKBUF. ; ENTRY- (BUF_DSK)= DISK # TO READ FROM ; (BUF_TRK)= TRACK # TO READ FROM ; (BUF_SEC)= SECTOR # TO READ F(CPM_DSK),A ; ; SAVE LOGON REQUEST FLAG ; LD A,E LD (LOGRQ),A ; ; COMPUTE DISK DRIVER TABLE PTR ; CALL RETDVRT A,1 RET Z ; ; ELSE LOG ON DRIVE ; PUSH IX ;SAVE REGS PUSH IY ; LD IX,(CUR_DDT) ;SET REGS LD IY,(CUR_DPB) ; L0 %+ &, !'- "(. #)/ $*0D (IY + DPB_SKT),0 ;ASSUME NO SKEW ; ; ATTEMPT TO READ ID SECTOR ; CALL BUF_FLSH ;FLUSH BUFFER 1ST JR NZ,LOGERR ; CAFLOPPY THEN ASSUME 3740 TRANSLATION ; LD A,(BLKBUF + ID_FLGO) AND A,[1 SHL DF_DTDB] OR [1 SHL DF_HARDB] CALL Z,TR8 ; ; IX + DDT_HDS),A ; ; RETURN DRIVE TABLE PTR ; LD HL,(CUR_DPH) XOR A,A ;RETURN NO-ERROR JR LGDONE ; ; ; NO ID SEC TRK 0 ; EXIT - BC= 0 ; ;**************************************************************************** ; HOME: ; ; IF PE**************** ; SETSEC: LD (CPM_SEC),BC RET ;********************************************************************* IF NO TRANSLATION THEN RETURN SECTOR++ ; LD A,D ;IF TABLE ADDR = 0 THEN NO TRANSLATION OR A,E JP Z,NOTRAN ; ; ELSEDIR ; ; EXECUTE WITHOUT COMPENSATION ; JR LL_DO ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; LL_WRIT: ; ; IF STILL PROTECTED THEN ERROR ; LD A,(WR_PROT) OR A,A JR NZ,DO_ERR ; ; INHIBIT UPLOAD ; LL DISKLOG JR NZ,LOGERR ; ; IF NO ID SECTOR THEN USE DEFAULT DPB ; (NOTE: CONTROLLER HAS SET IT'S DISK DEFAULTS IN DEFBFR IF NO DYNAMIC SKEW TABLE SPECIFIED THEN TRANSLATION IS DONE ; LD A,(BLKBUF + ID_SKWO) LD (IY + DPB_SKT),A ;IF 0 THEN DISATOR, USE DEFAULT DATA ; LGDEF: ; ; IF NOT HARD DISK THEN GO DO FLOPPY TEST ; BIT DDT_HDB,(IX + DDT_FLG) JR Z,LGCKFD NDING WRITE (BUFFER DIRTY) THEN IGNORE ; LD A,(BUF_MOD) OR A,A JR NZ,HOME2 ; ; ELSE PURGE BUFFER ; LD (BUF_ACT),A ******* ; ; SET TRANSFER ADDR ; ENTRY- BC= ADDRESS ; EXIT - A= ? ; ;****************************************************** CALCULATE NEW SECTOR FROM TABLE ; EX DE,HL ADD HL,BC LD L,(HL) ; LD H,0 RET ; ; ; CONVERT FROM CP/M'S LOGICAL +++++++++ ; ; LOW LEVEL READ ; ENTRY- IX= DDT PTR ; IY= DPB PTR ; EXIT - IOPB.PB_STATO, A= STATUS ; ;+++++++++++++++++++LD A,1 SHL PB_INHX LD (IOPB + PB_FLGO),A ; ; CALCULATE DOWNLOAD BYTE COUNT ; LD A,(IY + DPB_PSH) ;USE SHIFT FACTOR {0:1 IN ALL CASES) ; ID SECTOR TYPES ARE: ; -1: NONE 0: OLD JADE DD ; 2: EXTENDED 3: PARTITIONED, 0-FILLED ; LD A,(IOPB + BLES SKEW ADDITION OR A,A JR Z,NO_SKW ; ; ELSE VALID SKEW TABLE ON DISK, TRANSFER TO SKEW BUFFER ; LD HL,BLKBUF ;CALC; ; ELSE USE HARD DISK DEFAULTS ; CALL TRNONE ; NO XLATE LD HL,HDPBK ; ; XFER DATA TO TABLES ; SEL2: LD DE,(CUR_ ; HOME2: ; ; JUST SET TRACK TO 0 ; LD BC,0 ; ; FALL INTO SET TRACK ; ;************************************************************* ; SETDMA: LD (CPM_DMA),BC ; LD A,(BUF_DMAB) ;FETCH BANK ADDRESS SET BY COLD START LD (CPM_DMAB),A SECTOR {0..N-1} TO PHYSICAL SECTOR {1..N} ; NOTRAN: LD HL,1 ADD HL,BC RET SUBTTL DISK SUPPORT ROUTINES ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; LL_READ: ; ; ENABLE UPLOAD ; XOR A,A LD (IOPB + PB_FLGO),28, 1:256, 2:512, 3:1024} LD HL,128 ;START WITH 128 BYTES ; AND A,3 ;LIMIT TO 1024-BYTE SECTORS ; JR Z,LL_WR2 ;IF SHIFPB_ST2O) CP A,-1 JR Z,LGDEF ; ; ELSE IF TYPE == 3 THEN OK ; CP A,3 JR NC,TYPE3_ID ; ; ELSE PAD UNINITIALIZED DAULATE PTR TO TABLE LD E,A LD D,0 ADD HL,DE ; EX DE,HL ;CALCULATE BUFFER PTR LD HL,(CUR_DPB) LD BC,DPB_SKT ADD HLDPB) ; USE DEFAULT TABLE LD BC,DPB_SZ LDIR ; LD A,(HL) ;HEADS VALUE JR SEL1 ; ; ; USE 8" FLOPPY DEFAULTS ; LGC************************************* ; ; SET TRACK # ; ENTRY- BC= TRACK # ; ;********************************************* ; ; DONE ; RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SECTOR TRANSLATIO++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; LOGON DISK FUNCTION ; ENTRY- IX= DDT PTR ; IY= DPBA ; ; DISABLE DOWNLOAD ; LD HL,0 LD (IOPB + PB_BCNTO),HL ; ; PASS READ SECTOR COMMAND ; LD A,PB_READC JP LL_RWT_FACTOR == 0 THEN DONE ; LL_WR3: ADD HL,HL ;DOUBLE COUNT DEC A JP NZ,LL_WR3 ; LL_WR2: LD (IOPB + PB_BCNTO),HL ; ; TA TO 0 ; LD HL,BLKBUF + ID_PSHO ;FILL DATA WITH 0S LD B,ID_FLGO - ID_PSHO ; PADIDL: LD (HL),0 INC HL DJNZ PADIDL ; ,BC EX DE,HL ; LD BC,SKTSZ LDIR ; NO_SKW: ; ; XFER DISK DATA TO DPB ; LD DE,(CUR_DPB) ;GET ADDR OF DPB LD HL,KFD: CALL TR8 LD HL,SD8PBK JR SEL2 ; ; ERROR EXIT ; LOGERR: LD HL,0 ; ; DONE ; LGDONE: POP IY ;RESTORE REGS PO******************************* ; SETTRK: LD (CPM_TRK),BC RET ;******************************************************N FUNCTION ; ENTRY- DE= 0: NO XLATE, ELSE PTR TO XLATE TABLE ; BC= SECTOR # TO XLATE ; EXIT - HL= XLATED SECTOR OR BC + 1 ; PTR ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; DISKLOG ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; LOW LEVEL WRITE ; ENTRY- IX= DDT PTR PASS WRITE COMMAND ; LD A,PB_WRITC ; ; FALL INTO COMMON CODE ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++ ; PROCESS TYPE-3 ID SECTOR ; TYPE3_ID: ; ; ASSUME NO TRANSLATION AS DEFAULT ; CALL TRNONE ; ; IF SINGLE-DENSITY BLKBUF + ID_SPTO LD BC,DPB_SZ - 1 LDIR ; ; XFER DISK PHYSICAL DATA TO TABLE ; LD A,(BLKBUF + ID_HEADS) ; SEL1: LD (P IX RET ;**************************************************************************** ; ; HOME DRIVE - TREAT AS SEEK********************** ; ; SET SECTOR ; ENTRY- BC= SECTOR # ; ;************************************************************ BC= UNCHANGED ; A, DE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; SECTRN: ; ;: ; ; SET UP READ IOPB ; LD A,(BUF_DMAB) LD (LOGIOPB + PB_DMAXO),A ; LD HL,LOGIOPB LD DE,IOPB LD BC,PB_STATO L ; IY= DPB PTR ; EXIT - IOPB.PB_STATO, A= STATUS ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; COMMON IOPB EXECUTER ; ENTRY- A= COMMAND ; IX= DRIVE TABLE PTR ; IY= DPB PTR ; ;+++++++++0 %+ &, !'- "(. #)/ $*0+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; LL_RW: LD (IOPB + PB_CMDO),A ; ; OFFSET SECTOR ; DIOB ;USE DISPLAY IOPB DATA FUNCTION CALL XMROM ; ; QUERY USER FOR OPTION ; LD HL,DSKEB CALL EDITOR ; ; GET USER SAGE ; DO_ERR: LD HL,WP_ERM CALL EDITOR JR IOPBDMP ;*****************************************************************++++++++++++++++ ; ; EXECUTE THE IOPB PRIMITIVE ; EXIT - A= 0: OK, /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; JADE 8" FLOPPY DISK DRIVER FUNCTION ; ENTRY- IY= DRIVER POP HL LD DE,DPB_SKT ADD HL,DE ; LD DE,(IOPB + PB_SECO) ;SAVE CURRENT SECTOR FOR RESTORATION PUSH DE ; LD A,(IY + TION DISPATCHER ; ENTRY- C= FUNCTION # ; EXIT - A= -1: ERROR, 0: OK ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++################################### ; ; BIOS FUNCTION TABLE ; ;#############################################################LD HL,(IOPB + PB_SECO) LD A,L ADD A,(IX + DDT_SOF) LD L,A LD A,H ADC A,(IX + DDT_SOF + 1) LD H,A LD (IOPB + PB_SECRESPONSE ; CALL CI ;GET USER RESPONSE ; PUSH AF ;SAVE CHAR LD C,A ;ECHO CHAR CALL COC CALL CRLF ;NEW LINE POP *********** ; ; SET 3740 SECTOR TRANSLATION PROCEDURE ; ENTRY- (CUR_DPH)= MUST BE PTR TO DPH ; EXIT - DE, HL= ? ; ;*******+++++++++++++++++++++++++++++++++ ; XPRIM: ; ; EXECUTE THE PRIMITIVE IN ROM ; LD A,(BUF_DMAB) ;PRESET IOPB BANK LD E, TABLE PTR ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; FDPB_SKT) ;IF 1ST ENTRY == 0 THEN NONE OR A,A ; (ILLEGAL SECTOR) JR Z,NOSKEW ; DEC DE ;ELSE USE SECTOR TO INDEX INTO +++++++++++++++++++++++ ; BIOFUNC: ; ; SELECT FUNCTION ; LD A,C CP A,1 JR C,RETVERS ; JR Z,RETDVRTF ; ; ERRO############### ; BFUNTBL: DW RETVERS ;0:RETURN VERSION # DW RETDVRTF ;1:RETURN DISK PHYSICAL CONFIGURATION TABLE PTR MAO),HL ; ; SET PHYSICAL DRIVE ; LL_DO: LD A,(IX + DDT_DRV) LD (IOPB + PB_DRVO),A ; ; FETCH DRIVER VECTOR & EXECUTE DIAF ; AND A,5FH ;INSURE UPPER CASE ; ; IF RETRY THEN TRY AGAIN ; CP A,'R' ;IF RETRY THEN RETURN TO CALLER JR Z,LL_O********************************************************************* ; TR8: LD DE,SDTRAN ; SETTR: LD HL,(CUR_DPH) LD (HA ; LD HL,IOPB CALL MR_XIOB ;EXECUTE THE FUNCTION ; OR A,A ;FUNCTION ERR? RET NZ ; ; RETURN THE COMMAND RESULTS D8EXEC: ; ; SELECT SIDE FROM TRACK BIT 0 ; LD HL,(IOPB + PB_TRKO) ;FETCH CURRENT TRACK PUSH HL ;SAVE CURRENT TRACK FOTABLE LD D,0 ADD HL,DE LD A,(HL) ;FETCH TRANSLATED SECTOR # FROM TABLE LD (IOPB + PB_SECO),A ; NOSKEW: ; ; EXECUR ; LD A,-1 RET IF 0 ; ; IF FUNCTION # NOT IN TABLE THEN RETURN -1 ; LD A,C CP A,MAXFUNCS LD A,-1 RET NC XFUNCS EQU ($ - BFUNTBL) / 2 ENDIF ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SK DRIVER ; LL_OPLP: LD HL,LL_OPRET ;PUT RETURN ADDRESS ON STACK PUSH HL ; LD L,(IX + DDT_EXE) ;FETCH DRIVER ADDRESS FPLP ; ; ELSE IF ABORT THEN DO WARM BOOT ; CP A,'A' ;IF ABORT THEN RE-BOOT JP Z,0 ; ; ELSE IF DEBUGGER THEN EXECUTEL),E INC HL LD (HL),D RET ;**************************************************************************** ; ; SET NO STATUS ; LD A,(IOPB + PB_STATO) OR A,A RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++R RESTORATION ; LD A,(IX + DDT_HDS) ;IF HEADS == 1 THEN SKIP MODIFICATION DEC A JR Z,FD8SNGL ; LD A,(IOPB + PB_SECO + TE THE IOPB ; CALL XPRIM ; ; RESTORE THE MODIFIED IOPB SO RETRY WILL WORK ; POP HL ;RESTORE ORIGINAL SECTOR RES 7,; ; ELSE COMPUTE TABLE ENTRY ; PUSH HL ;SAVE POSSIBLE DATA ; LD HL,BFUNTBL LD A,C ADD A,A ADD A,L LD L,A LD RETURN BIOS VERSION # FUNCTION #0 ; EXIT - HL= VERSION # IN BINARY {0.00,..655.35} ; ;+++++++++++++++++++++++++++++++++++++++ROM TABLE LD H,(IX + DDT_EXE + 1) JP (HL) ; ; DRIVER RETURNS HERE ; LL_OPRET: ; ; IF NO ERRORS THEN RETURN ZF ;  IT ; CP A,'M' JP Z,MR_BRK ; ; ELSE IF IGNORE THEN RETURN NO ERROR ; SUB A,'I' ;IF IGNORE THEN RETURN NO ERROR RESECTOR TRANSLATION PROCEDURE ; EXIT - HL, DE= ? ; ;**************************************************************************++++ ; ; HARD DISK DRIVER FUNCTION ; ENTRY- IX= DRIVER TABLE PTR ; EXIT - A= 0: OK; /0: ERROR ; ;+++++++++++++++++++++++++1) ADD A,A ;BIT 15 -> BIT_BUCKET ; SRL H RR L RRA ;TRK BIT 0 -> SECTOR BIT 15 LD (IOPB + PB_SECO + 1),A ; LD H ;CLEAR SIDE BIT 1ST LD (IOPB + PB_SECO),HL ; POP HL ;RESTORE ORIGINAL TRACK LD (IOPB + PB_TRKO),HL ; ; DONE ; A,0 ADC A,H LD H,A ; ; EXECUTE TABLE ADDRESS ; LD A,(HL) INC HL LD H,(HL) LD L,A ; EX (SP),HL ;PUT CALLER'S+++++++++++++++++++++++++++++++++++++ ; RETVERS: LD HL,VERSN XOR A,A ;RETURN NO ERROR RET ;++++++++++++++++++++++ RET Z ;IF NO_ERROR THEN RETURN ; ; PRINT ERROR ; IOPBDMP: LD A,(BUF_DMAB) ;SET BANK LD E,A ; LD HL,IOPB LD A,MF_T Z ; ; ELSE RETURN ERROR TO BDOS ; LD A,-1 ;RETURN -1 TO BDOS OR A,A RET ; ; ; DISPLAY WRITE PROTECT ERROR MES** ; TRNONE: LD DE,0 JR SETTR SUBTTL HARD DISK ROUTINES ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; HDEXEC: EQU XPRIM SUBTTL JADE FLOPPY DRIVER ROUTINES ;+++++++++++(IOPB + PB_TRKO),HL ;TRACK = RESIDUAL ; ; IF SKEW ENABLED THEN TRANSLATE IT ; FD8SNGL: PUSH IY ;CALCULATE PTR TO TABLE  RET SUBTTL BIOS FUNCTION CALLS ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; FUNC DATA IN HL, FUNCTION ADDR ON RET ; STACK, EXECUTE FUNCTION ADDRESS ON STACK ;#########################################++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN DRIVER TABLE PTR FUNCTION #1 ; ENTRY- E= DRIVE # ; EXIT - 0 %+ &, !'- "(. #)/ $*0E:HL= DRIVER TABLE BASE PTR ; NZ= ILLEGAL DRIVE REQUESTED (HL=0) ; A, B, C= ? ; ;+++++++++++++++++++++++++++++++++++++++++,RETDV2 ; LD HL,0 OR A,A ;SET NZ RET ; ; ; ELSE COMPUTE TABLE PTR ; RETDV2: LD B,C LD DE,DDT_SIZ ; RETDVL: ADL ADDITIONAL FUNCTIONS TO SUPPORT CDOS PROGRAMS ;*************************************************************************** ;LS ; CP A,8DH ;IF RETURN VERSION THEN RETURN IT JR Z,RETCVER ; CP A,90H ;IF NOT CLOCK THEN ERR JR C,ILLEGC ; JR Z++++++++++++++++++++++++++++++ ; RETCVER: LD B,1 RET SUBTTL CLOCK ROUTINES ;+++++++++++++++++++++++++++++++++++++++++R ROM EXECUTER ; ENTRY- A= FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; XMR ; CONSOLE OUTPUT ; ENTRY- C= CHAR TO OUTPUT ; ;****************************************************************************RIVER ; ENTRY- C= CHAR TO OUTPUT ; ;**************************************************************************** ; LO: LD+++++++++++++++++++++++++++++++++++ ; RETDVRTF: ; ; ADJUST REGISTER ; LD C,E ; ; FALL INTO LOCAL ENTRY ; ;+++D HL,DE DJNZ RETDVL ; LD A,(BUF_DMAB) LD E,A ; ; RETURN NO ERROR ; XOR A,A RET ;+++++++++++++++++++++++++++ ; SYSTEM CALL INTERCEPT ROUTINE CHECKS FOR ILLEGAL BDOS CALLS & ; PRINTS MESSAGE IF ILLEGAL. ALSO IMPLEMENTS CDOS CLOCK/CALE,CLKCAL ;IF CALENDAR THEN GET IT ; CP A,92H JR Z,CLKTIM ;IF TIME THEN GET IT ; ; ILLEGAL SYSTEM CALL ; ILLEGC: PUSH BC+++++++++++++++++++++++++++++++++++ ; ; RETURN CALENDAR FUNCTION 90H ; EXIT - A= DAY ; B= MONTH ; C= YEAR ; L= DAY OF WOM: EQU MR_FUN SUBTTL CHAR I/O ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ;  ; COC: LD A,MF_CO JP XMROM ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; READE A,MF_LO JP XMROM ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN LIST DEVICE +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN DRIVER TABLE PTR FUNCTION ; ENTRY- C= DR+++++++++++++++++++++++++++++++++++++++++++++++++ ; ; GET BANK NUMBER FUNCTION ; EXIT - A= BANK # ; ;++++++++++++++++++++++NDAR ; SYSTEM CALLS FOR ASMB. ; ;*************************************************************************** INTCPT: LD A,C ;SAVE FUNCTION # ; ; OUTPUT WARNING MESSAGE ; LD HL,ISCMSG ;OUTPUT WARNING CALL EDITOR ; ; OUTPUT FUNCTION # ; EEK ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKCAL: LD A,MF_GCAL JP XMROM  ; CONSOLE INPUT ; EXIT - A= CHAR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CI: LR DRIVER - DUMMY ; EXIT - A= CTRL-Z ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; READESTATUS ; EXIT - A= 0: BUSY, FFH:READY ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; LISIVE # ; EXIT - E:HL= DRIVER TABLE BASE PTR ; NZ= ILLEGAL DRIVE (HL= 0) ; A, B, C= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; GETBNK: LD A,MF_GBNK JP MR_FUN SUBTTL NON-DISK PROCEDURES  ;CHECK CALL VALIDITY CP A,41 ;IF <= 40 THEN OK ; BDOSV EQU $ + 1 JP C,BDOS + 11H ;THIS ADDR MODIFIED BY WARM BOOT RTN  POP BC LD A,MF_PHXB CALL XMROM ; ; OUTPUT NEW LINE ; CALL CRLF ; ; RETURN NULLS ; XOR A,A ;BC = HL = A = 0  ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN TIME FUNCTION 92H ; EXIT - A= SECOND A,MF_CI JP XMROM ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN CONSOLE STAR: LD A,CTRLZ ;FAKE EOF ; ; FALL INTO PUNCH RETURN ; ;***************************************************************TST: LD A,MF_LOS JP XMROM ;**************************************************************************** ; ; MESSAGE E++++++++++++++++++++++++++++++++++++++++++ ; RETDVRT: ; ; ASSUME DRIVE 0 ; LD HL,DDT_0 ;START AT 1ST TABLE ; ; IF D ;*************************************************************************** ; ; NEWLINE PROCEDURE ; ;*********************; ; THE FOLLOWING CONDITIONAL JUMP IS MODIFIED TO AN UNCONDITIONAL JUMP BY ; THE WARM BOOT ROUTINE IF THE CLOCK/CALENDAR BOA LD L,A LD H,A LD C,A LD B,A RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; DS ; B= MINUTES ; C= HOURS ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKTIM: LTUS ; EXIT - A= 0: NOT READY ; FFH: CHAR READY ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++************* ; ; PUNCH DRIVER ; ENTRY- C= CHAR TO OUTPUT ; ;**************************************************************DITOR ; ENTRY- HL= TEXT PTR (BIT 7= 1: TERMINATOR) ; EXIT - REGS= ? ; ;*****************************************************RIVE == 0 THEN ALREADY THERE ; LD A,C OR A,A RET Z ; ; ELSE IF ILLEGAL DRIVE THEN RETURN ERROR ; CP A,NDRVS JR C****************************************************** ; CRLF: LD C,CR CALL COC LD C,LF JP COC IF INTCPTS SUBTTRD IS NOT PRESENT ; IF NOT MODIFIED, THEN IT IS ALLWAYS FALSE (NOP). ; INHCLK: JR C,ILLEGC ; ; NOW CHECK FOR EXTENDED CAL; CDOS RETURN VERSION FUNCTION ; MAKES CLOCK/CALENDAR WORK. ; EXIT - B= 1 ; ;++++++++++++++++++++++++++++++++++++++++++++++D A,MF_GTIM JP XMROM ENDIF ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; MONITO++++++ ; CNSCK: LD A,MF_CIS JP XMROM ;**************************************************************************** ;************** ; PUNCH: RET ;**************************************************************************** ; ; PRINTER D*********************** ; EDITOR: CALL GETBNK LD E,A LD A,MF_PUTS JP XMROM SUBTTL INITIALIZED DATA ;###########0 %+ &, !'- "(. #)/ $*0################################################################# ; ; 3740 SECTOR TRANSLATION TABLE ; **** CP/M SINGLE DENSITAGS BIT DEF. ; 0 1: INHIBIT LOGON ; 1..3 PARTITION # {0,..7} DDT_HDB EQU 4 ;1: HARD DISK DRIVE ; DDT_DRV DS 1 ;P@@@@@@@@@@@@@@@@@@@@@@@@@ ; ALLDRV MACRO #DADD,#PD,#FLG,#DPB,#DPH,#HDS,#SOF DW #DADD ;DRIVER EXECUTION ADDR DB #FLG ;FLA DDT_2: ALLDRV HDEXEC,4,10H,D2DPB,D2DPH,4,0 ; D DDT_4: ALLDRV FD8EXEC,0,0,D4DPB,D4DPH,1,0 ; E DDT_5: ALLDRV FD8EXEC,1,0_ERM: DM CR,LF,'W-PROT Error!' ; IF INTCPTS ISCMSG: DM CR,LF,'ILL SYS CALL, #= ' ENDIF ;################################################################################################### ; ; DEFAULT 8" HARD DISK PARAMETER BLOCK ; ;##################################### ; ; DRIVE PARAMETER HEADER AREA ; 1 PER DRIVE ; ;######################################### D#D(DD)ALL ;;DRIVE CLUSTER ALLOCATION BIT MAP PTR LIST OFF ENDM ; ; DEFINE THE DATA ; DD DL 1 REPT NDRVS LIST OFFY **** ; ;############################################################################ ; SDTRAN: GXLATE 26,6 ;#########HYSICAL DRIVE # DDT_DPB DS 2 ;DPB ADDRESS FOR THIS DRIVE DDT_DPH DS 2 ;DPH ADDRESS FOR THIS DRIVE ; ; THE FOLLOWING MAY BEGS DB #PD ;MONITOR PHYSICAL DRIVE # DW #DPB ;DISK PARAMETER BLOCK PTR DW #DPH ;DISK PARAMETER HEADER PTR DB #HDS ;HE,D5DPB,D5DPH,1,0 ENDIF IF BOOT = 3 ; A DDT_0: ALLDRV FD8EXEC,0,0,D0DPB,D0DPH,1,0 ; B DDT_1: ALLDRV FD8EXEC,1,0,D################################################### ; ; DEFAULT 8" FLOPPY DISK PARAMETER BLOCK ; IBM 3740 SINGLE DENSITY FORM####################################################################### ; HDPBK: DW 128 ;SECTORS PER TRACK (LOGICAL) (SPT) ################################### ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENE ALLDPH 0123456789ABCDEF DD DL DD + 1 LIST ON ENDM ;################################################################################################################################### ; ; COMMON I/O PARAMETER BLOCK ; ;###################### BROUGHT OFF DISK DESCRIPTOR OR FROM DEFAULT TABLES ; DDT_HDS DS 1 ;HEADS DDT_SOF DS 2 ;SECTOR OFFSET ; ; DEFINE THE STRUADS DW #SOF ;SECTOR OFFSET ; ENDM IF BOOT = 10H ; A DDT_0: ALLDRV HDEXEC,4,10H,D0DPB,D0DPH,4,0 ; B DDT_1: AL1DPB,D1DPH,1,0 ; C DDT_2: ALLDRV HDEXEC,4,10H,D2DPB,D2DPH,4,0 ; D DDT_3: ALLDRV HDEXEC,4,12H,D3DPB,D3DPH,4,8000H ; E AT ; ;############################################################################ ; SD8PBK: DW 26 ;SECTORS PER TRACK DB DB 5 ;BLOCK SHIFT FACTOR (BSH) DB 31 ;BLOCK MASK (BLM) DB 1 ;NULL MASK (EXM) DW 1015 ;DISK SIZE (CLUSTERS -1) (DSRATE A DISK PARAMETER TABLE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ALLDPH: ############ ; ; LOGON IOPB OVERLAY ; ;############################################################################ ; LOGI###################################################### ; IOPB: REPT PB_SIZE LIST OFF DB 0 LIST ON ENDM ;#########CTURE SIZE ; DDT_SIZ DS 0 ENDM ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; MACRLDRV HDEXEC,4,12H,D1DPB,D1DPH,4,8000H ; C DDT_2: ALLDRV HDEXEC,5,10H,D2DPB,D2DPH,4,0 ; D DDT_3: ALLDRV HDEXEC,5,12H,D3DP DDT_4: ALLDRV HDEXEC,5,10H,D4DPB,D4DPH,4,0 ; F DDT_5: ALLDRV HDEXEC,5,12H,D5DPB,D5DPH,4,8000H ENDIF ;#############3 ;BLOCK SHIFT FACTOR DB 7 ;BLOCK MASK DB 0 ;NULL MASK DW 242 ;DISK SIZE -1 DW 63 ;DIRECTORY MAX DB 11000000B ;ALM) DW 1152 / 2 ;DIRECTORY MAX (DRM) DB 0FFH ;ALLOCATION 0 (AL0) DB 10000000B ;ALLOCATION 1 (AL1) DW 0 ;CHECK SIZMACRO #D LIST ON D#D(DD)DPH: ;DRIVE PARAMETER HEADER FOR DRIVE #D(DD) DW 0 ;;SECTOR TRAN TBL (OR 0 IF NO XLATE) DW 0 OPB: DB PB_LOGC ;COMMAND DB 0 ;DRIVE DW 0 ;TRACK DW ID_SECT ;SECTOR DB 0 ;FLAGS DW BLKBUF ;DMA DB 0 ;BANK DW 0 ;################################################################### ; ; DISK DRIVER TABLES (DDT) ; ;########################O TO DEFINE THE DRIVER TABLE RECORD ; ENTRY- #DADD= DRIVER ADDRESS ; #PD= PHYSICAL DRIVE # ; #FLG= DRIVE FLAGS ; #DPB= DPB,D3DPH,4,8000H ; E DDT_4: ALLDRV FD8EXEC,0,0,D4DPB,D4DPH,1,0 ; F DDT_5: ALLDRV FD8EXEC,1,0,D5DPB,D5DPH,1,0 ENDIF ############################################################### ; ; MESSAGES ; ;##########################################LOC 0 DB 0 ;ALLOC 1 DW 16 ;CHECK SIZE DW 2 ;TRACK OFFSET DB 0 ;PHYSICAL RECORD SHIFT FACTOR DB 0 ;PHYSICAL RECORDE (CKS) DW 2 ;TRACK OFFSET (OFF) DB 1 ;PHYSICAL RECORD SHIFT FACTOR (PSH) DB 1 ;PHYSICAL RECORD MASK (PRM) DW 0 ;;SCRATCH AREA DW 0 ;;" DW 0 ;;" DW DIRBF ;;DIRECTORY BUFFER PTR DW D#D(DD)DPB ;;DRIVE PARAMETER BLK PTR IF (DSK_COUNT ; WR_PROT DB -1 ;/0: WRITE PROTECTION ENABLED ; ; LAST OF INITIALIZED CODE READ FROM DISK ; BIOSND EQU $ S#################################################### ; STRUCT 0 DDT_EXE DS 2 ;START ADDRESS OF DISK DRIVER DDT_FLG DS 1 ;FLB ADDRESS ; #DPH= DPH ADDRESS ; #HDS= HEADS ; #SOF= SECTOR OFFSET ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ IF BOOT = 11H ; A DDT_0: ALLDRV HDEXEC,6,10H,D0DPB,D0DPH,4,0 ; B DDT_1: ALLDRV HDEXEC,6,12H,D1DPB,D1DPH,4,8000H ; C################################## ; MSGLE: DM CR,LF,'LOAD ERROR' ; DSKEB: DM CR,LF,'Abort, Ignore, Retry, (BDOS) - ' ; WP MASK DW 0 ;LOGICAL DRIVE SECTOR OFFSET DB 0 ;SKEW = 0 ; ; DEFAULT DISK PHYSICAL PARAMETERS ; DB 1 ;HEADS ;## ;LOGICAL DRIVE SECTOR OFFSET (SOF) DB 0 ;SKEW = 0 ; ; ; DB 4 ;HEADS ;#############################################D(DD) AND 0F0H) = 10H DW 0 ;;NO CHECKS ON HARD DISK ELSE DW D#D(DD)CHK ;;DRIVE DISK CHECKSUMS ARRAY PTR ENDIF DWUBTTL UNINITIALIZED DATA AREA ;############################################################################ ; ; THE FOLLOWI0 %+ &, !'- "(. #)/ $*0NG DATA MUST RESIDE IN THIS ORDER TO MATCH THE IOPB DATA ; ;##################################################################UFFER DPB PTR ; RSFLAG: DS 1 ;0: NO PREREAD REQ'D, /0: PREREAD REQ'D READOP: DS 1 ;0: WRITE OPERATION, 1: READ OPERATION WRTPTR CUR_DPH DS 2 ;DPH PTR ; LOGRQ: DS 1 ;LOG ON REQUEST REG. ;##########################################################_#D(DD) AND 0F0H) = 0 D#D(DD)ALL: DS 75 ;ALLOCATION BIT MAP FOR 8" FLOPPY DRIVE #D(DD) D#D(DD)CHK DS 64 ;DIRECTORY CHECKSUMXTENT MASK ; DSM < 256 : 1K= 0, 2K= 1, 4K= 3, 8K= 7, 16K= 15 ; DSM > 255 : 2K= 0, 4K= 1, 8K= 3, 16K= 7 DPB_DSM DS 2 ;DS ADDITIONAL DISK PARTITIONING DATA FOR THE LOGICAL DRIVE SELECTION. ; PARTITIONING BY TRACKS ARE IMPLIMENTED THRU BDOS USING DAL DRIVE 0 ; B SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 0 ; C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; D SIDE 2 & 3 OF AL DRIVE 1 ; F SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ; G JADE 8" FLOPPY PHYSICAL DRIVE 0 ; H JADE 8" FLOPPY PHYSICAL########## ; ; CP/M IOPB OVERLAY ; CPM_DSK DS 1 ;LOGICAL DRIVE CPM_TRK DS 2 ;LOGICAL TRACK NUMBER CPM_SEC DS 2 ;LOGICAL YPE: DS 1 ;WRITE OPERATION TYPE FROM BDOS: ; 0: WRITE TO ALLOCATED (USED) BLOCK (PREREAD) ; 1: WRITE TO DIRECTORY (PRERE################## ; ; DRIVE ALLOCATION AREAS ; ;#########################################################################S STORAGE (1 BYTE PER SECTOR) ENDIF LIST OFF ENDM ; ; RESERVE THE DATA SPACE ; DD DL 1 REPT NDRVS LIST OFF AM- DRIVE STORAGE SIZE (IN CLUSTERS) ; INT(((#_TRACKS - OFF) * SPT * BYTES PER SECTOR) / CLUSTER SIZE) -1 DPB_DRM DS 2 ;DRM- PBOFF ABOVE. ; PARTITIONING BY HEADS ARE IMPLIMENTED BY USING THE FOLLOWING DATA. ; (HEAD BITS ARE INCLUDED IN SECTOR WORD UHARD DISK PHYSICAL DRIVE 1 ; E JADE 8" FLOPPY PHYSICAL DRIVE 0 ; F JADE 8" FLOPPY PHYSICAL DRIVE 1 ENDIF IF BOOT = DRIVE 1 ENDIF ; ;************************************************************* ; ; REVISION HISTORY: ; ; 3.00 - 26 SECTOR NUMBER DS 1 ;FLAGS CPM_DMA DS 2 ;XFER ADDR CPM_DMAB DS 1 ;XFER BANK ; ; ; BUFFER IOPB OVERLAY ; BUF_DSK DS 1 ;AD & WRITE) ; 2: WRITE TO UNALLOCATED (UNUSED) BLOCK (NO ; PREREAD REQ'D) ; ; UNA_CNT: DS 1 ;# SECTORS REMAINING IN B### ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; MACRO TO DEFINE THE DRIVE ALLOCATIONLLDAL 0123456789ABCDEF DD DL DD + 1 LIST ON ENDM ;####################################################################DIRECTORY SIZE -1 DPB_AL0 DS 2 ;AL0,1- DIRECTORY ALLOCATION ; 1 MSB PER DIRECTORY CLUSTER ALLOCATED DPB_CKS DS 2 ;CKS- # D TITLE CUSTOMIZED BIOS FOR M5B LIST NOCOND BOOT EQU 3H ;10H: HARD DISK, 3: 8" FLOPPY, 20H: 5" FLOPPY ;********************* 3 ; A JADE 8" FLOPPY PHYSICAL DRIVE 0 ; B JADE 8" FLOPPY PHYSICAL DRIVE 1 ; C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0JAN 87 GRH ; Implemented new common IOPB code & Jade floppy firmware support. ; Implemented disk drive driver tables and newBUFFER DISK NUMBER BUF_TRK DS 2 ;BUFFER TRACK NUMBER BUF_SEC DS 2 ;BUFFER SECTOR NUMBER DS 1 ;FLAGS BUF_DMA DS 2 BUF_DMAB LOCK (CLUSTER) UNA_DSK: DS 1 ;LAST UNALLOC DISK UNA_TRK: DS 2 ;LAST UNALLOC TRACK UNA_SEC: DS 2 ;LAST UNALLOC SECTOR ;## & CHECKSUMS AREA ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; ALL = (DSM / 8) + 1 ;######## ; ; RESERVE DRIVE PARAMETER BLOCKS ; ;###########################################################################IRECTORY SECTORS CHECKED ; (DRM +1) / 4 DPB_OFF DS 2 ;OFF- # RESERVED TRACKS (USUALLY 2) ; ; ADDITIONAL CP/M 3.0 DATA (******************************************************* ; ; CUSTOMIZED BIOS FOR M5B ; Copyright (C) 1981..1992 GRH Enter ; D SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 0 ; E SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; F SIDE 2 & 3 OF HARD DISK  function to return ; a ptr to a drive table. ; Removed init of IOBYTE. ; Implemented 5" floppy driver. ; Implemented use oDS 1 ;BANK # ; ; ; BLOCKING BUFFER MAINTENANCE ; BUF_PSEC DS 2 ;BUFFER PHYSICAL SECTOR BUF_ACT DS 1 ;0: BUFFER FLUSHED, ########################################################################## ; ; VARIABLES ; ;############################## CHK = DPB.CKS ; ALLDAL: MACRO #D LIST ON IF DSK_#D(DD) = 10H D#D(DD)ALL: DS 128 ;ALLOCATION BIT MAP FOR 4MB HARD DRIVE# ; STRUCT 0 DPB_SPT DS 2 ;SPT- SECTORS/TRACK DPB_BSH DS 1 ;BSH- BLOCK SHIFT FACTOR DETERMINED BY CLUSTER SIZE ; 1K= 3,ALSO COULD BE USED BY CP/M 2.2 DEBLOCKING) ; DPB_PSH DS 1 ;PSH- PHYSICAL RECORD SHIFT FACTOR BASED ON BYTES/SEC ; 0: 128, prises, SUNNYVALE, CA ; ; AUTHOR: Girvin Herr ; ;***************************************************************************PHYSICAL DRIVE 1 ENDIF IF BOOT = 20H ; A JADE 5" FLOPPY PHYSICAL DRIVE 0 ; B JADE 5" FLOPPY PHYSICAL DRIVE 1 ; f ROM primitives. ; Moved system down to 60k. ; 3.01 26 JUN 88 GRH ; Remove 5" floppy support. Implement in CP/M-86 BIOS. ;/0: DATA IN BUFFER BUF_MOD DS 1 ;0: BUFFER CLEAN, /0: BUFFER DIRTY (MODIFIED) ; BUF_DDT DS 2 ;BUFFER DDT PTR BUF_DPB DS 2 ;B############################################## ; CUR_DPB DS 2 ;DRIVE TABLE PTR CUR_DDT DS 2 ;DRIVE DRIVER TABLE BASE ADDRESS  #D(DD) ENDIF IF DSK_#D(DD) = 11H D#D(DD)ALL: DS 256 ;ALLOCATION BIT MAP FOR 8MB HARD DISK #D(DD) ENDIF IF (DSK 2K= 4, 4K= 5, 8K= 6, 16K= 7 DPB_BLM DS 1 ;BLM- BLOCK MASK ; 1K = 7, 2K= 15, 4K= 31, 8K= 63, 16K= 127 DPB_EXM DS 1 ;EXM- E1: 256, 2: 512, 3: 1024 DPB_PHM DS 1 ;PHM- PHYSICAL RECORD MASK BASED ON BYTES/SEC ; 0: 128, 1: 256, 3: 512, 7: 1024 ; ; * ; ; CONFIGURATION: ; ; CPM ; DRIVE USAGE IF BOOT = 10H ;HARD DISK BOOT CONFIG. ; A SIDE 0 & 1 OF HARD DISK PHYSICC SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; D SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 0 ; E SIDE 0 & 1 OF HARD DISK PHYSIC Change single function to return drive table ptr into a BIOS function ; call using restart instruction. ; Change LOGON to s0 %+ &, !'- "(. #)/ $*0pecify the ID sector & track. At same time, fix bug ; which did not specify the logon track. ; 3.02 7 JUL 88 GRH ; Add '?unction ; rather than swapping Roms itself. ; 3.07 11-25-90 GRH ; Modify for Ver. 1.22 Monitor. ; Fix bug in 8" Hard DiskMove calculation from ; DCM8 to CBIOS. ; Remove IOPB ptr passing in IX redundancy. ; Change DPB track-head shift factor to Sem by using ROMBNK sector buffer for ; ID sector read. ; 9-20-91 GRH Fold in redlines. ; 10-21-91 GRH Fix bugs ; 10================================================================== ; INTCPTS EQU TRUE ;ENABLE SYSTEM CALL INTERCEPT WHISTLE SYS: EQU 59 ;SYSTEM SIZE IN K BYTES KBYTE: EQU 1024 CPMSZ: EQU KBYTE * NKSYS CPMBS: EQU CPMSZ - (20 * KBYTE) ;CP/M BIAS VABFUNRST ;============================================================================ ; ; OTHER DECLARATIONS ; ;=============================================== ; ; BDOS CONSTANTS ON ENTRY TO WRITE ; ;====================================' to include file names. ; Change hard disk system tracks directory reference to new format. ; Correct bug in drivers which ca table which benignly (at current level) ; caused the drive table to have bad data (default table was missing ; the 2 deblocector Offset like track ; offset. Disk partitioning will add this value to sector word. It ; will be stored in the ID sector-22-91 GRH Fix bugs ; 10-23-91 GRH Fix bugs ; 10-24-91 GRH Fix bugs ; ; 4.00 1-4-92 GRH ; Change boot code to us ;============================================================================ ; ; INCLUDE COMIOPB3.DEF ; INCLUDE DILUE CCP: EQU CPMBS + 3400H ;ADDR OF CCP BDOS: EQU CPMBS + 3C00H ;ADDRESS OF BDOS BIOS: EQU CPMBS + 4A00H ;ADDRESS OF BDOS ===================================================================== ; SECSZ: EQU 128 NDRVS: EQU 6 IF BOOT = 10H ; ; ======================================== ; WRALL EQU 0 ;WRITE TO ALLOCATED WRDIR EQU 1 ;WRITE TO DIRECTORY WRUAL EQU 2 ;WRITused retry to fail. (sector remained ; corrupted) ; Stubbed out new Clock routines for present. ; 3.03 31 JUL 88 GRH ; Uking extension bytes). ; Implement data xfer inhibit schemes with PB_FLG & PB_BCNT. ; Add pick-up of THIS_BNK data in all iopb data to be dynamic. ; ; 3.10 5-20-91 GRH ; Change LOGON to attempt to recover from old disks better, using ; DCM8301 vere type 0 boot directories. ; VERSN EQU 400 ; ;**************************************************************************** SKS3.DEF ; INCLUDE BDIR.DEF ; INCLUDE M5ZF2.DEF ; ;============================================================== BIOSR: EQU 1000H - BIOS ; ; PAGE 0 LOCATIONS ; PAGE0: EQU 0 ;START OF CP/M RAM DEFDRV: EQU PAGE0 + 4 ;DEFAULT DRIVE PAR 8" HARD DISK BOOT DATA ; STHD EQU 0 ;START LOGICAL DRIVE OF HARD DISK NDHD EQU 3 ;LAST LOGICAL DRIVE OF HARD DISK ST8FD EE TO UNALLOCATED ;============================================================================ ; ; ASCII CHARS ; ;=====nstub Clock routines. ; 3.04 6 AUG 88 GRH ; Remove floppy side select from BIOS & move to controller. ; Implement new ID se cases. ; Remove clock buffer set/read system calls. ; 12-5-90 GRH ; Remove IX IOPB ptr passing to disk drivers. ; 1-13-91 sion controller firmware. ; ; 3.11 9-2-91 GRH ; Add redlines & change for M5ZMON v.2.00. ; ; 3.12 9-11-91 GRH ; Add de SUBTTL SYSTEM DECLARATIONS ;============================================================================ ; ; ASSEMBLY PARA============== ; LIST OFF *INCLUDE COMIOPB3.DEF *INCLUDE DISKS3.DEF *INCLUDE BDIR.DEF *INCLUDE M5ZF2.DEFAM ADDR BDOSJV EQU PAGE0 + 5 ;BDOS SYSTEM CALL ENTRY THIS_STK EQU PAGE0 + 1CH ;CURRENT STACK FRAME PTR ; ; BIOS DATA ; QU 4 ;START LOGICAL DRIVE OF 8" FLOPPY ND8FD EQU 5 ;LAST LOGICAL DRIVE OF 8" FLOPPY ENDIF IF BOOT = 3 ; ; 8" FLOP======================================================================= ; LF: EQU 0AH CR: EQU 0DH CTRLZ: EQU 1AH ;@@@@@ctor format. ; Implement CP/M 3.0 DPB structure in preparation for deblocking. ; 3.05 11-3-88 GRH ; Change included data to GRH ; Fix bug which corrupted PB_FLG. ; 3.08 2-22-91 GRH ; Remove references to THIS_BNK & use monitor function #7 insteablocking code. ; 9-17-91 GRH Add r/ls & move to 59k system. ; 9-19-91 GRH Fix bug which destroyed my root directories! METERS ; ;============================================================================ ; FALSE EQU 0 TRUE EQU NOT FALSE  LIST ON ;============================================================================ ; ; DISK OPERATING SYSTEM ADDRORG PAGE0 + 40H BTARG DS 2 ;BOOT ARGUMENT SYSPTR DS 2 ;BOOT DIRECTORY SYSTEM LOAD DATA OFFSET PTR ; DEFBFR EQU PAGE0 + 80HPY BOOT DATA ; STHD EQU 2 ;START LOGICAL DRIVE OF HARD DISK NDHD EQU 5 ;LAST LOGICAL DRIVE OF HARD DISK ST8FD EQU 0 ;STAR@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE THE TRANSLATION TABLE MACRO ; ;@@@@@@@@ update IOPB.PBSTAT to new configuration. ; 3.06 1-28-89 GRH ; Revised primitive calling procedures to use the monitor rom fd. ; Add track-head shift factor to DPBs for future use. ; 3.09 5-15-91 GRH ; Change 8" floppy side select to track bit 0. ; BUF_RD was writing. ; Patch problems with partitioning until 20MB drive installed. ; Fix TPA corruption by LOGON probl ;============================================================================ ; ; CONDITIONAL ASSEMBLY FLAGS ; ;==========ESSES ; ;============================================================================ ; SYS EQU 2 ;CP/M VERSION {2,3} ; NK ;DEFAULT BUFFER ; ; BIOS FUNCTION CALL RESTART VECTOR ; BFUNRST EQU 28H BFUNRSV EQU PAGE0 + BFUNRST BFUNRSI EQU 0C7H + T LOGICAL DRIVE OF 8" FLOPPY ND8FD EQU 1 ;LAST LOGICAL DRIVE OF 8" FLOPPY ENDIF ;====================================@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; GXLATE MACRO #SECTORS, #SKEW LIST OFF NXTSEC DL 1 ;0 %+ &, !'- "(. #)/ $*0;START WITH SECTOR 1 LOWEST DL 1 ;; REPT #SECTORS LIST ON DB NXTSEC LIST OFF NXTSEC DL NXTSEC + #SKEW ;ADD SKEW FACTO/ 10) + '0' DB (DD % 10) + '0' ENDM SUBTTL BIOS CODE ORG BIOS ;----------------------------------------------------ALL ;############################################################################ ; ; THE FOLLOWING BOOT DATA MUST RESIDE ; CODE. THIS BUFFER IS USED BY THE CP/M DIRECTORY CHECK ROUTINES THAT ; CHECK FOR DISK CHANGE. ; ;######################## ;USE DRIVE # PASSED IN PAGE 0 AND A,3 LD (DEFDRV),A ; ; SEND SYSTEM SIGN-ON ; LD HL,MSGSO CALL EDITOR ; ; MODI####################################### ; MSGSO: DB CR,LF DB CPMSZ / (KBYTE * 10) + '0' DB (CPMSZ MOD (KBYTE * 10)) / KBYT LD (UNA_CNT),A ;CLEAR UNALLOCATED SECTOR COUNT ; LD (BUF_MOD),A ;CLEAN BUFFER ; LD HL,BLKBUF ;INIT BUFFER PTR LD (BUF_TSEG: LD E,(HL) ;FETCH TRACK INC HL LD D,(HL) LD (IOPB + PB_TRKO),DE ; INC HL ;FETCH SECTOR LD E,(HL) INC HL R ;; IF NXTSEC > #SECTORS ;CHECK FOR OVERFLOW NXTSEC DL NXTSEC - #SECTORS ;; IF NXTSEC <= LOWEST ;CHECK FOR REPEAT N------------------------ ; ; BIOS JUMP VECTOR TABLE ; ;------------------------------------------------------------------- AS DEFINED RIGHT BEFORE THE COLD ; INIT ROUTINE START AND MUST BE IN THE 1ST SECTOR. THESE 2 WORDS ARE ; REFERENCED BY THE BO#################################################### ; DIRBF: EQU $ ;BUFFER BEGINNING ;---------------------------------FY COLD START VECTOR TO WARM START ; LD HL,(BIOS+4) LD (BIOS+1),HL ; ; INIT OUR STUFF ; CALL GETBNK LD (BUF_DMAB),E + '0' DB 'K CP/M-80 Vers 2.2',CR,LF DB 'M5b CBIOS Vers ' PVERS VERSN DM CR,LF IF $ > (DIRBF + SECSZ) CONDMA),HL ; ; LOG ON DRIVE TO INIT TABLES ; LD A,(BTARG) AND A,3 ;MODULO 4 LD C,A LD E,0 CALL SELDSK LD A,L ;IF LD D,(HL) LD (IOPB + PB_SECO),DE ; INC HL ;FETCH SEGMENT SECTOR COUNT LD A,(HL) LD (SECCNT),A ; INC HL ;SAVE CXTSEC DL LOWEST + 1 LOWEST DL NXTSEC ENDIF ENDIF ;; ENDM LIST ON ENDM ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@--------- ; JP INIT1 ;COLD START ENTRY JP WARM ;RELOAD CCP/BDOS JP CNSCK ;GET CONSOLE STATUS JP CI ;CONSOLE INPUT OT LOADER CODE IN ORDER TO DETERMINE THE LOAD ADDRESS ; AND LENGTH OF THE BIOS. ; ;##########################################------------------------------------------- ; ; INIT - COLD START ENTRY FROM BOOT MUST SET ALL BIOS PARAMS ; ;----------A ; ; INITIALIZE CLOCK VECTORS IF CLOCK INSTALLED ; LD A,MF_CSYN ;TEST FOR BOARD PRESENT CALL XMROM ; ; IF CLOCK PRMSG **** WARNING! COLD INIT CODE BIGGER THAN DIR BUFFER **** ELSE DS DIRBF+SECSZ-$ ;FILL OUT DIRECTORY BUFFER TO 1 SECTOR ERROR THEN ABORT OR A,H JR Z,W_EROR ; ; SETUP IOPB ; LD A,PB_READC LD (IOPB + PB_CMDO),A ; LD A,(BTARG) LD (IURRENT DATA PTR LD (LDRPTR),HL ; ; READ SYSTEM ; W_READ: CALL XPRIM LD A,2 JR NZ,W_EROR ;IF ERROR THEN EXIT ; ; @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; INITIALIZE VERSION TEXT IN RAM MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ JP COC ;CONSOLE OUTPUT JP LO ;PRINTER OUTPUT JP PUNCH JP READER JP HOME ;HOME SELECTED DRIVE JP SELDSK ;SELECT DI################################## ; DB 0 ;CPU TYPE (Z80 CPU) DB 0 ;SPARE BIOSSZ: DW BIOSND - BIOS ;BIOS MODULE SIZE IN ------------------------------------------------------------------ ; INIT: ; ; SET TEMPORARY STACK ; DI LD SP,DEFBFR ESENT THEN TURN ON CLOCK DRIVE ; OR A,A LD A,38H ;COND. JR (ON) JR Z,CLKON ; ; ELSE TURN OFF CLOCK DRIVE ; LD A,1 SIZE ENDIF ;---------------------------------------------------------- ; ; WARM REBOOT ENTRY LOADS CCP,BDOS FROM DISOPB + PB_DRVO),A ; XOR A,A LD (IOPB + PB_FLGO),A ; LD HL,0 LD (IOPB + PB_BCNTO),HL ; LD HL,CCP LD (IOPB + PB_DMAONEXT SECTOR ; LD HL,(IOPB + PB_SECO) INC HL LD (IOPB + PB_SECO),HL ; LD DE,(IOPB + PB_BCNTO) ;DMA += SECTOR SIZE LD@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; PVERS MACRO #VERS DD DL #VERS IF DD > 9999 DB (DD / 10000) + '0' DD DL DD % 10SK DRIVE JP SETTRK ;SET TRACK # JP SETSEC ;SET SECTOR # JP SETDMA ;SET TRANSFER ADDR JP DISKRD ;PERFORM DISK READ BYTES BIOSST: DW BIOS ;BIOS MODULE LOAD ADDR FOR SBD ; ; CONTINUE ON WITH INIT ; INIT1: JR INIT ;##################;USE PAGE 0 FOR STACK LD (THIS_STK),SP EI ; ; UPLOAD BOOT DIRECTORY DATA FOR WARM BOOT ; LD HL,0080H LD A,(HL) ;IF8H ;UNCOND. JR (OFF) (CAUSES JUMP TO ILLEGAL) ; CLKON: LD (INHCLK),A ; ; BOOT CCP & BDOS ; JR WARM ;#############K & ; SETS UP VARIABLES ; ;---------------------------------------------------------- ; WARM: ; ; SET TEMPORARY STACK ),HL ; ; IF NO SYSTEM THEN ERROR ; LD HL,BT_DATA LD A,(HL) ;FETCH SEGMENT COUNT OR A,A LD A,1 JR Z,W_EROR ; ;  HL,(IOPB + PB_DMAO) ADD HL,DE LD (IOPB + PB_DMAO),HL ; ; IF INTO BIOS THEN EXIT ; LD A,H CP A,HIGH BIOS JR NC,WZ000 ENDIF IF DD > 999 DB (DD / 1000) + '0' DD DL DD % 1000 ENDIF DB (DD / 100) + '0' DB '.' DB ((DD % 100) JP DISKWR ;PERFORM DISK WRITE JP LISTST ;RETURN LIST STATUS JP SECTRN ;TRANSLATE SECTOR JP BIOFUNC ;EXECUTE FUNCTION C########################################################## ; ; DIRECTORY SECTOR BUFFER STARTS HERE AFTER CRUNCHING COLD START  > MAX THEN ERROR CP A,6 JP NC,W_EROR ; LD DE,BT_DATA LD BC,BD_SIZE LDIR ; ; INIT DEFAULT DRIVE ; LD A,(BTARG)############################################################### ; ; SIGN-ON MESSAGE ; ;#####################################; DI LD SP,DEFBFR LD (THIS_STK),SP EI ; ; INIT OUR STUFF ; XOR A,A LD (BUF_ACT),A ;ASSUME NO DATA IN BUFFER ;  ELSE USE DATA TO LOAD SYSTEM ; LD A,(HL) LD (SEGCNT),A ; INC HL ;POINT TO TRACK ; ; TOP OF SEGMENT LOOP ; W_NXRPG ; ; ELSE IF SEGMENT_SECTOR_COUNT != EXHAUSTED THEN READ_NEXT_SECTOR ; LD A,(SECCNT) DEC A LD (SECCNT),A JR NZ,W0 %+ &, !'- "(. #)/ $*0_READ ; ; ELSE IF SEGMENTS == COMPLETE THEN DONE ; LD A,(SEGCNT) DEC A LD (SEGCNT),A JP Z,WZRPG ; ; ELSE DO NEX JR C,W_LOK ; LD A,L CP A,LOW BIOS LD A,3 JR NZ,W_EROR ; W_LOK: ; ; INIT BIOS WARM START IN PAGE 0 ; LD A,0+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; READ A DISK SECTOR ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++ JP RW_RET ;**************************************************************************** ; ; WRITE DISK SECTOR FUNCTION YPE),A ; ; IF 1ST WRITE TO UNALLOCATED (NEW, UNUSED) BLOCK THEN SET PARAMETERS ; CP A,WRUAL JP NZ,CHKUNA ; ; COUNT (UNA_TRK) ;SAME TRACK? LD DE,(CPM_TRK) SBC HL,DE JR NZ,ALLOC ; LD HL,(CPM_SEC) LD DE,(UNA_SEC) SBC HL,DE JR NZ,AL LD (UNA_CNT),A ; INC A ;PREREAD FLAG = TRUE LD (RSFLAG),A ; ; ; ; COMMON CODE FOR READ AND WRITE FOLLOWS ; RWOPE IN ANY CASE ; OR A,A JR Z,FILHST ; ; HOST BUFFER ACTIVE, SAME AS SEEK BUFFER? ; LD A,(CPM_DSK) LD HL,BUF_DSK ;SAT SEGMENT ; LD HL,(LDRPTR) JR W_NXTSEG ; ; ; WARM BOOT ERROR, OUTPUT MSG & GO TO DEBUGGER ; ENTRY- A= ERROR CODE: ; C3H LD HL,BIOS + 3 LD (PAGE0),A LD (PAGE0 + 1),HL ; ; INIT BDOS CALL VECTOR IN PAGE 0 ; LD HL,BDOS + 6 LD (BDOSJV++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; DISKRD: ; ; SET UP DATA TABLE PTRS ; PUSH IX L; ENTRY- C= WRITE TYPE: ; 0: WRITE TO ALLOCATED BLOCK (UPDATE) ; 1: WRITE TO DIRECTORY BLOCK (ALLWAYS WRITE) ; 2: WRITE= NUMBER_OF_SECTORS_IN_BLOCK ; LD A,(IY + DPB_BLM) ;CUR_DPB.DPBBLM + 1 ::= (BLKSIZ/128) INC A LD (UNA_CNT),A ; ; SET LOC ; ; MATCH, MOVE TO NEXT SECTOR FOR FUTURE REF ; EX DE,HL ;UNASEC += 1 INC HL LD (UNA_SEC),HL ; ; IF PAST LASER: ; ; ASSUME NO ERRORS ; XOR A,A LD (IOPB + PB_STATO),A ; ; COMPUTE BUFFER SECTOR ; LD HL,(CPM_SEC) DEC HL ME DISK? CP A,(HL) JR NZ,NOMATCH ; LD HL,(BUF_TRK) ;SAME TRACK? LD DE,(CPM_TRK) SBC HL,DE JR NZ,NOMATCH ; LD DE, 0: SELECT DISK ERROR ; 1: NO SYSTEM SEGMENTS IN BOOT DIRECTORY ; 2: READ ERROR ; 3: BIOS OVERWRITTEN ; 4,5: SPARES),A LD (BDOSJV + 1),HL ; ; INIT BIOS CALL VECTOR IN PAGE 0 ; LD HL,BIOFUNC LD (BFUNRSV),A LD (BFUNRSV + 1),HL ; ;D IX,(CUR_DDT) ; PUSH IY LD IY,(CUR_DPB) ; ; IF NOT BLOCKED THEN USE CPM READ ; LD A,(IY + DPB_PSH) ;0= 128-BYTE SEC TO UNALLOCATED BLOCK (NO NEED TO PRE-READ) ; ;**************************************************************************** ;DISK TO SEEK ; LD A,(CPM_DSK) LD (UNA_DSK),A ; ; SET TRACK TO SEEK ; LD HL,(CPM_TRK) LD (UNA_TRK),HL ; ; SET ST SECTOR ON TRACK THEN USE 1ST SECTOR OF NEXT TRACK ; LD E,(IY + DPB_SPT) LD D,(IY + DPB_SPT +1) SBC HL,DE JP C,NOOVF  ;CONVERT PHYSICAL SECTOR TO LOGICAL ; LD A,(IY + DPB_PSH) ;USE PHYSICAL SHIFT FACTOR (CP/M 3.X) AND A,3 ;LIMIT TO 1024 B(BUF_PSEC) ;SAME SECTOR? LD HL,(BUF_SEC) SBC HL,DE JR Z,MATCH ;SKIP IF MATCH ; NOMATCH: ; ; IF BUFFER == DIRTY THEN ; 6..255: SEGMENT COUNT (TOO MANY SEGMENTS) ; W_EROR: PUSH AF ;SAVE ERROR CODE ; LD HL,MSGLE ;OUTPUT ERROR MESSAGE C SET DEFAULT SECTOR BUFFER ; LD BC,DEFBFR CALL SETDMA ; IF INTCPTS ; ; PUT BDOS VECTOR INTO INTERCEPT CODE ; LTORS OR A,A JP Z,DISKRDN ; ; READS DON'T NEED ALLOCATION ; XOR A,A LD (UNA_CNT),A ; ; READ_OPERATION_FLAG = TRU DISKWR: ; ; REMOVE BOOT WRITE PROTECTION ; XOR A,A LD (WR_PROT),A ; ; SET PTRS TO DISK DATA ; PUSH IX LD IX,ECTOR TO SEEK ; LD HL,(CPM_SEC) LD (UNA_SEC),HL ; ; IF NO UNALLOCATED SECTORS REMAIN THEN PREREAD ; CHKUNA: LD A,(UNA; LD HL,0 ;SECTOR = 1 LD (UNA_SEC),HL ; LD HL,(UNA_TRK) ;TRACK++ INC HL LD (UNA_TRK),HL ; NOOVF: ; ; MATCH FOUYTE SECTORS JP Z,NOSECSHF ;IF ALREADY 0 THEN SECTOR SIZE IS 128 ; SECSHFLP: SRL H ;ELSE SHIFT OVER TO PHYSICAL SECTOR  WRITE IT OUT BEFORE READING NEW ONE ; CALL BUF_FLSH ;CLEAR HOST BUFF ; JR NZ,RW_RET ;IF ERROR THEN ABORT ; FILHST: ; ALL EDITOR ; ; DISPLAY ERROR CODE ; POP AF LD C,A LD A,MF_PHXB CALL MR_FUN ; ; EXECUTE DEBUGGER ; CALL MR_BRD HL,(BDOS + 7) LD (BDOSV),HL ; ; NOW PUT INTERCEPT VECTOR INTO BDOS CODE ; LD HL,INTCPT LD (BDOS + 7),HL ENDIF ;E (1) ; INC A LD (READOP),A ; ; PRE-READ_OF_DATA_FLAG = TRUE ; LD (RSFLAG),A ; ; TREAT AS UNALLOCATED BLOCK ; (CUR_DDT) ; PUSH IY LD IY,(CUR_DPB) ; ; IF NOT BLOCKED THEN USE CPM WRITE ; LD A,(IY + DPB_PSH) ;0= 128-BYTE SECTORS_CNT) OR A,A JP Z,ALLOC ; ; ELSE MORE UNALLOCATED RECORDS REMAIN, COUNT-- ; DEC A LD (UNA_CNT),A ; ; IF REQUESTND, MARK AS UNNECESSARY READ ; XOR A,A ;PREREAD FLAG = FALSE LD (RSFLAG),A JP RWOPER ; ; ; NORMAL NON-BLOCKED WRITE RR L DEC A JP NZ,SECSHFLP ; NOSECSHF: INC HL ;SET BACK TO PHYSICAL SECTOR LD (BUF_PSEC),HL ;BUFFER PHYSICAL SECTOR T; READ THE SECTOR BUFFER ; LD A,(CPM_DSK) ;BUFFER SECTOR = PHYSICAL SECTOR LD (BUF_DSK),A ; LD HL,(CPM_TRK) LD (BUF_K HALT ; ; ; BOOT OK, INIT PAGE 0 ; WZRPG: ; ; IF FRONT OF BIOS OVERWRITTEN THEN ERROR ; LD A,H CP A,HIGH BIOS ; PASS DEFAULT DISK TO CCP ; LD A,(DEFDRV) LD C,A JP CCP SUBTTL BIOS DISK FUNCTION ROUTINES ;+++++++++++++++++ LD A,WRUAL LD (WRTYPE),A ; JP RWOPER ;TO PERFORM THE READ ; ; ; NORMAL NON-BLOCKED READ ; DISKRDN: CALL CPM_RD  OR A,A JP Z,DISKWRN ; ; READ_OP_FLAG = FALSE ; XOR A,A LD (READOP),A ; ; SAVE WRITE TYPE ; LD A,C LD (WRTED SECTOR != UNALLOCATED SECTOR THEN PURGE ; LD A,(CPM_DSK) ;SAME DISK? LD HL,UNA_DSK CP A,(HL) JR NZ,ALLOC ; LD HL, ; DISKWRN: CALL CPM_WR JP RW_RET ; ; ; NOT AN UNALLOCATED RECORD, REQUIRES PRE-READ ; ALLOC: XOR A,A ;COUNT = 0O ACCESS ; ; IF BUFFER == EMPTY THEN READ THE PHYSICAL SECTOR ; LD HL,BUF_ACT LD A,(HL) ; LD (HL),1 ;BUFFER = ACTIVTRK),HL ; LD HL,(BUF_PSEC) LD (BUF_SEC),HL ; ; IF REQUIRED TO READ THEN READ ; LD A,(RSFLAG) ;NEED TO READ? OR A,0 %+ &, !'- "(. #)/ $*0A CALL NZ,BUF_RD ;YES, IF 1 ; ; BUFFER = CLEAN ; XOR A,A LD (BUF_MOD),A ; MATCH: ; ; COPY DATA TO OR FROM BUFFFLUSHES ; LD (BUF_DDT),IX LD (BUF_DPB),IY ; EX DE,HL ;SOURCE/DEST SWAP ; RWMOVE: ; ; BC INITIALLY 128, DE IS SOUR** ; ; CPM_WR PERFORMS THE PHYSICAL WRITE FROM CPM_DMA TO THE DISK. ; ENTRY- (CPM_DSK)= DISK # TO WRITE TO ; (CPM_TRK)= TRA ; ;**************************************************************************** ; CPM_RD2: ; ; SET UP PTRS ; PUSH IXOMMON CODE ; CPM_RW: PUSH HL LD HL,CPM_TRK ; ; FALL INTO COMMON XFER CODE ; ;*************************************WRITE TO ; (BUF_DDT)= DDT PTR ; (BUF_DPB)= DPB PTR ; EXIT - (IOPB.PB_STATO)= 0: OK, /0: ERROR ; ;************************ TRACK # TO WRITE TO ; (BUF_SEC)= SECTOR # TO WRITE TO ; IX= DDT PTR ; IY= DPB PTR ; EXIT - (IOPB.PB_STATO)= 0: OK, /0: ERK JP RD_WR ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SELECT DRIVE FUNCTION ; ER ; LD HL,(CPM_SEC) ;CALCULATE INDEX INTO BUFFER DEC HL ;CONVERT TO LOGICAL SECTOR (0..N-1) LD A,L ; AND A,(IY + DPBCE, HL IS DEST ; LDIR ; ; DATA HAS BEEN MOVED TO/FROM HOST BUFFER, IF NOT DIRECTORY THEN DELAY WRITE ; LD A,(WRTYPE) CK # TO WRITE TO ; (CPM_SEC)= SECTOR # TO WRITE TO ; (CPM_DMA)= XFER ADDRESS ; IX= DDT PTR ; IY= DPB PTR ; EXIT - (IOPB PUSH IY LD IX,(CUR_DDT) LD IY,(CUR_DPB) ; ; EXECUTE READ SECTOR ; CALL CPM_RD ; ; RESTORE PTRS & RETURN ; P*************************************** ; ; SET UP IOPB FOR EXECUTION ; ENTRY- HL= PTR TO IOPB IMAGE TRACK DATA ; IX= DDT P**************************************************** ; BUF_FLSH: ; ; IF UNMODIFIED THEN RETURN ; LD A,(BUF_MOD) OR A,RROR ; ;**************************************************************************** ; BUF_WR: ; LD HL,LL_WRIT JP BUF_RLOG-ON - SET DISK PARAMETER BLOCK ; ENTRY- C= DRIVE # ; E= 0 IF NEW SELECT ; EXIT - HL= PTR TO DPT OR 0 FOR ERROR ; ;+++++_PHM) ;USE PHYSICAL RECORD MASK DATA (CP/M 3.X) ; RRA ;BITS <7..1> -> BITS <14..8> LD H,A ; LD A,0 ;BIT 0 -> BIT 7 ;IF NOT DIRECTORY THEN DELAY WRITE CP A,WRDIR LD A,(IOPB + PB_STATO) ;RETURN ANY ERRORS ANYWAY JR NZ,RW_RET ; ; IF ERR.PB_STATO)= 0: OK, /0: ERROR ; ;**************************************************************************** ; CPM_WR: ; OP IY POP IX RET ;**************************************************************************** ; ; CPM_RD PERFORMS THTR ; IY= DPB PTR ; (SP)= ADDRESS {LL_READ, LLWRIT} OF EXECUTOR ; ;********************************************************A RET Z ; ; ELSE SET PTRS TO BUFFER DATA ; PUSH IX PUSH IY LD IX,(BUF_DDT) LD IY,(BUF_DPB) ; ; WRITE THE BUFFW ;**************************************************************************** ; ; RDBUF PERFORMS THE PHYSICAL READ FROM+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; SELDSK: ; ; STORE DRIVE # FOR FUTURE USE ; LD RRA LD L,A ; ; HL HAS RELATIVE HOST BUFFER ADDRESS ; LD DE,BLKBUF ADD HL,DE ;HL = HOST ADDRESS ; LD DE,(CPM_DMAOR THEN ABORT ; OR A,A JR NZ,RW_RET ; ; NO ERROR/DIRECTORY WRITE ; XOR A,A ;BUFFER = CLEAN LD (BUF_MOD),A ; CLD HL,LL_WRIT JP CPM_RW ;**************************************************************************** ; ; CPM_RD2 PERFOE PHYSICAL READ FROM THE DISK INTO CPM_DMA. ; ENTRY- (CPM_DSK)= DISK # TO READ FROM ; (CPM_TRK)= TRACK # TO READ FROM ; (CP******************** ; RD_WR: LD DE,IOPB + PB_TRKO LD BC,PB_BCNTO - PB_TRKO LDIR ; ; EXECUTE LOW LEVEL READ OR WRITE (ER DATA ; CALL BUF_WR ; ; RESTORE THE PTRS ; POP IY POP IX ; ; IF ERROR THEN RETURN IT ; OR A,A RET NZ ;  THE HOST DISK INTO BLKBUF. ; ENTRY- (BUF_DSK)= DISK # TO READ FROM ; (BUF_TRK)= TRACK # TO READ FROM ; (BUF_SEC)= SECTOR # A,C LD (CPM_DSK),A ; ; SAVE LOGON REQUEST FLAG ; LD A,E LD (LOGRQ),A ; ; COMPUTE DISK DRIVER TABLE PTR ; CALL) ;GET/PUT CP/M DATA LD BC,128 ;LENGTH OF MOVE ; LD A,(READOP) ;WHICH WAY? OR A,A JP NZ,RWMOVE ;SKIP IF READ ; ; WALL BUF_WR ;WRITE TO DISK ; LD A,(IOPB + PB_STATO) ;RETURN ANY ERRORS ; ; DONE, RESTORE & RETURN ; RW_RET: OR A,A ;SERMS THE PHYSICAL READ FROM THE DISK INTO CPM_DMA, ; WITHOUT BLOCKING. ; ENTRY- (CPM_DSK)= DISK # TO READ FROM ; (CPM_TRK)= TM_SEC)= SECTOR # TO READ FROM ; (CPM_DMA)= XFER ADDRESS ; IX= DDT PTR ; IY= DPB PTR ; EXIT - (IOPB.PB_STATO)= 0: OK, /0: ON STACK) ; RET ;**************************************************************************** ; ; BUF_FLSH FLUSHES THE; ELSE CLEAN BUFFER ; LD (BUF_MOD),A RET ;************************************************************************** TO READ FROM ; IX= DDT PTR ; IY= DPB PTR ; EXIT - (IOPB.PB_STATO)= 0: OK, /0: ERROR ; ;********************************* RETDVRT ;DRIVE IS STILL IN C REGISTER ; ; IF DRIVE ERROR THEN RETURN (HL= 0) ; RET NZ ; ; ELSE SAVE PTR ; LD (CURITE OPERATION, MARK AND SWITCH DIRECTION ; LD A,1 ;BUFFER = DIRTY LD (BUF_MOD),A ; ; SAVE BUFFER DATA PTRS FOR LATER T RESULT STATUS FLAG POP IY POP IX ; RET ;**************************************************************************RACK # TO READ FROM ; (CPM_SEC)= SECTOR # TO READ FROM ; (CPM_DMA)= XFER ADDRESS ; EXIT - (IOPB.PB_STATO)= 0: OK, /0: ERRORERROR ; ;**************************************************************************** ; CPM_RD: ; LD HL,LL_READ ; ; C BUFFER DATA IF MODIFIED ; ENTRY- (BUF_DSK)= DISK # TO WRITE TO ; (BUF_TRK)= TRACK # TO WRITE TO ; (BUF_PSEC)= SECTOR # TO ** ; ; BUF_WR PERFORMS THE PHYSICAL WRITE FROM BLKBUF TO THE HOST DISK. ; ENTRY- (BUF_DSK)= DISK # TO WRITE TO ; (BUF_TRK)=******************************************* ; BUF_RD: ; LD HL,LL_READ ; ; COMMON CODE ; BUF_RW: PUSH HL LD HL,BUF_TR_DDT),HL ; ; FETCH FLAGS ; INC HL ;EXE +1 INC HL ;FLGS LD C,(HL) ; ; FETCH DISK PARAMETER BLOCK ADDRESS ; I0 %+ &, !'- "(. #)/ $*0NC HL ;DRV INC HL ;DPB_PTR LD E,(HL) INC HL LD D,(HL) LD (CUR_DPB),DE ; ; FETCH DISK PARAMETER HEADER ADDRESS ;+ PB_ST2O) CP A,-1 ;-1:NONE, 0:JADE, 1:DESCRIPTOR, 2: EXTENDED, ; 3: PARTITIONED, ID JR Z,LGDEF ; ; ELSE IF OLD FDT_HDS),A ; ; RETURN DRIVE TABLE PTR ; LD HL,(CUR_DPH) XOR A,A ;RETURN NO-ERROR JR LGDONE ; ; ; IF NOT HARD DIS************************************************ ; HOME: ; ; IF PENDING WRITE (BUFFER DIRTY) THEN IGNORE ; LD A,(BUF_MO ;**************************************************************************** ; ; SET TRANSFER ADDR ; ENTRY- BC= ADDRESS ;F TABLE ADDR = 0 THEN NO TRANSLATION OR A,E JP Z,NOTRAN ; ; ELSE CALCULATE NEW SECTOR FROM TABLE ; EX DE,HL ADD HL,+++++++++++++++++++++++++++++++++++++++++++ ; ; LOW LEVEL READ ; ENTRY- IX= DDT PTR ; IY= DPB PTR ; EXIT - IOPB.PB_STATO, O_ERR ; ; INHIBIT UPLOAD ; LD A,1 SHL PB_INHX LD (IOPB + PB_FLGO),A ; ; CALCULATE DOWNLOAD BYTE COUNT ; LD A,(IY INC HL ;DPH PTR LD E,(HL) INC HL LD D,(HL) LD (CUR_DPH),DE EX DE,HL ;PUT DPH PTR IN HL FOR RETURN ; ; IF NOT ORMATS THEN PAD DPB DATA ; CP A,3 JR NC,IDOK ; LD HL,BLKBUF + ID_PSHO ;FILL DATA WITH 0S LD B,ID_FLGO - ID_PSHO ; PAK THEN GO DO FLOPPY TEST ; LGDEF: BIT 4,(IX + DDT_FLG) JR Z,LGCKFD ; ; ELSE USE HARD DISK DEFAULTS ; CALL TRNONE ; D) OR A,A JR NZ,HOME2 ; ; ELSE PURGE BUFFER ; LD (BUF_ACT),A ; HOME2: ; ; JUST SET TRACK TO 0 ; LD BC,0 ;  EXIT - A= ? ; ;**************************************************************************** ; SETDMA: LD (CPM_DMA),BC ; BC LD L,(HL) ; LD H,0 RET ; ; ; CONVERT FROM CP/M'S LOGICAL SECTOR {0..N-1} TO PHYSICAL SECTOR {1..N} ; NOTRAN:A= STATUS ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; LL_READ: ; ; ENABLE UPLOAD  + DPB_PSH) ;USE SHIFT FACTOR {0:128, 1:256, 2:512, 3:1024} LD HL,128 ;START WITH 128 BYTES ; AND A,3 ;LIMIT TO 1024-BYTEFIRST SELECT OR LOGON INHIBITED THEN RETURN TABLE PTR ; LD A,(LOGRQ) ;0: LOGON, 1:INHIBIT OR A,C ;0: NORMAL, 1: INHIBIT DIDL: LD (HL),0 INC HL DJNZ PADIDL ; ; ELSE XFER ID SECTOR DATA TO TABLES ; IDOK: CALL TRNONE ;ASSUME NO TRANSLATION NO XLATE LD HL,HDPBK ; ; XFER DATA TO TABLES ; SEL2: LD DE,(CUR_DPB) ; USE DEFAULT TABLE LD BC,DPB_SZ LDIR ; LD ; FALL INTO SET TRACK ; ;**************************************************************************** ; ; SET TRACK # LD A,(BUF_DMAB) ;FETCH BANK ADDRESS SET BY COLD START LD (CPM_DMAB),A ; ; DONE ; RET ;++++++++++++++++++++++++++++ LD HL,1 ADD HL,BC RET SUBTTL DISK SUPPORT ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++; XOR A,A LD (IOPB + PB_FLGO),A ; ; DISABLE DOWNLOAD ; LD HL,0 LD (IOPB + PB_BCNTO),HL ; ; PASS READ SECTOR COM SECTORS ; JR Z,LL_WR2 ;IF SHIFT_FACTOR == 0 THEN DONE ; LL_WR3: ADD HL,HL ;DOUBLE COUNT DEC A JP NZ,LL_WR3 ; LL_WR2CPL AND A,1 RET Z ; ; ELSE LOG ON DRIVE ; PUSH IX ;SAVE REGS PUSH IY ; LD IX,(CUR_DDT) ;SET REGS LD IY,(CUR_D ; ; IF HARD DISK OR DOUBLE DENSITY THEN NO TRANSLATION ; LD A,(BLKBUF + ID_FLGO) AND A,[1 SHL DF_DTDB] OR [1 SHL DF_HARA,(HL) ;HEADS VALUE JR SEL1 ; ; ; USE 8" FLOPPY DEFAULTS ; LGCKFD: CALL TR8 LD HL,SD8PBK JR SEL2 ; ; ERROR EXI ; ENTRY- BC= TRACK # ; ;**************************************************************************** ; SETTRK: LD (CPM_TR++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SECTOR TRANSLATION FUNCTION ; ENTRY- DE= 0: NO XLATE, ELSE PTR TO XLATE ++++++++++++ ; ; LOGON DISK FUNCTION ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++MAND ; LD A,PB_READC JP LL_RW ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; LOW : LD (IOPB + PB_BCNTO),HL ; ; PASS WRITE COMMAND ; LD A,PB_WRITC ; ; FALL INTO COMMON CODE ; ;+++++++++++++++++PB) ; ; ATTEMPT TO READ ID SECTOR ; CALL BUF_FLSH ;FLUSH BUFFER 1ST JR NZ,LOGERR ; CALL DISKLOG JR NZ,LOGERR ; ;DB] ; ; ELSE SET TRANSLATION ; CALL Z,TR8 ; ; XFER DISK DATA TO DPB ; LD DE,(CUR_DPB) ;GET ADDR OF DPB LD HL,BLT ; LOGERR: LD HL,0 ; ; DONE ; LGDONE: POP IY ;RESTORE REGS POP IX RET ;***************************************K),BC RET ;**************************************************************************** ; ; SET SECTOR ; ENTRY- BC= SETABLE ; BC= SECTOR # TO XLATE ; EXIT - HL= XLATED SECTOR OR BC + 1 ; BC= UNCHANGED ; A, DE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++ ; DISKLOG: ; ; SET UP READ IOPB ; LD A,(BUF_DMAB) LD (LOGIOPB + PB_DMAXO),A ; LD HL,LOGIOPBLEVEL WRITE ; ENTRY- IX= DDT PTR ; IY= DPB PTR ; EXIT - IOPB.PB_STATO, A= STATUS ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; COMMON IOPB EXECUTER ; ENTRY- A= COMMAND ; IX= DRIVE TABLE  IF NO ID SECTOR THEN USE DEFAULT DPB ; (NOTE: CONTROLLER HAS SET IT'S DISK DEFAULTS IN DEFBFR IN ALL CASES) ; LD A,(IOPB KBUF + ID_SPTO LD BC,DPB_SZ LDIR ; ; XFER DISK PHYSICAL DATA TO TABLE ; LD A,(BLKBUF + ID_HEADS) ; SEL1: LD (IX + D************************************* ; ; HOME DRIVE - TREAT AS SEEK TRK 0 ; EXIT - BC= 0 ; ;****************************CTOR # ; ;**************************************************************************** ; SETSEC: LD (CPM_SEC),BC RET ++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; SECTRN: ; ; IF NO TRANSLATION THEN RETURN SECTOR++ ; LD A,D ;I LD DE,IOPB LD BC,PB_STATO LDIR ; ; EXECUTE WITHOUT COMPENSATION ; JR LL_DO ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; LL_WRIT: ; ; IF STILL PROTECTED THEN ERROR ; LD A,(WR_PROT) OR A,A JR NZ,DPTR ; IY= DPB PTR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; LL_RW: LD (IOPB + PB_C0 %+ &, !'- "(. #)/ $*0MDO),A ; ; OFFSET SECTOR ; LD HL,(IOPB + PB_SECO) LD A,L ADD A,(IX + DDT_SOF) LD L,A LD A,H ADC A,(IX + DDT_SOFEB CALL EDITOR ; ; GET USER RESPONSE ; CALL CI ;GET USER RESPONSE ; PUSH AF ;SAVE CHAR LD C,A ;ECHO CHAR CALL********************************************* ; ; SET 3740 SECTOR TRANSLATION PROCEDURE ; ENTRY- (CUR_DPH)= MUST BE PTR TO DP+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; XPRIM: ; ; EXECUTE THE PRIMITIVE IN ROM ; LD A,(BIVER FUNCTION ; ENTRY- IY= DRIVER TABLE PTR ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++T SUBTTL BIOS FUNCTION CALLS ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; FUNCTION###################################### ; ; BIOS FUNCTION TABLE ; ;##########################################################RIVER TABLE BASE PTR ; NZ= ILLEGAL DRIVE REQUESTED (HL=0) ; A, B, C= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++ + 1) LD H,A LD (IOPB + PB_SECO),HL ; ; SET PHYSICAL DRIVE ; LL_DO: LD A,(IX + DDT_DRV) LD (IOPB + PB_DRVO),A ; ;  COC CALL CRLF ;NEW LINE POP AF ; AND A,5FH ;INSURE UPPER CASE ; ; IF RETRY THEN TRY AGAIN ; CP A,'R' ;IF RETRYH ; EXIT - DE, HL= ? ; ;**************************************************************************** ; TR8: LD DE,SDTRAN UF_DMAB) ;PRESET IOPB BANK LD E,A ; LD HL,IOPB CALL MR_XIOB ;EXECUTE THE FUNCTION ; OR A,A ;FUNCTION ERR? RET NZ ++++++++++++++++++++++++++++ ; FD8EXEC: ; ; IF HEADS == 1 THEN EXECUTE IOPB ; LD A,(IX + DDT_HDS) DEC A JP Z,XPRIM  DISPATCHER ; ENTRY- C= FUNCTION # ; EXIT - A= -1: ERROR, 0: OK ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++################## ; BFUNTBL: DW RETVERS ;0:RETURN VERSION # DW RETDVRTF ;1:RETURN DISK PHYSICAL CONFIGURATION TABLE PTR ++++++++++++++++++++++++++++ ; RETDVRTF: ; ; ADJUST REGISTER ; LD C,E ; ; FALL INTO LOCAL ENTRY ; ;++++++++++ FETCH DRIVER VECTOR & EXECUTE DISK DRIVER ; LL_OPLP: LD HL,LL_OPRET ;PUT RETURN ADDRESS ON STACK PUSH HL ; LD L,(IX  THEN RETURN TO CALLER JR Z,LL_OPLP ; ; ELSE IF ABORT THEN DO WARM BOOT ; CP A,'A' ;IF ABORT THEN RE-BOOT JP Z,0 ;  ; SETTR: LD HL,(CUR_DPH) LD (HL),E INC HL LD (HL),D RET ;********************************************************; ; RETURN THE COMMAND RESULTS STATUS ; LD A,(IOPB + PB_STATO) OR A,A RET ;++++++++++++++++++++++++++++++++++++++ ; ; ELSE SELECT SIDE FROM TRACK BIT 0 ; LD HL,(IOPB + PB_TRKO) PUSH HL ;SAVE ORIGINAL DATA ; LD A,(IOPB + PB_SECO +++++++++++++++++++ ; BIOFUNC: ; ; IF FUNCTION # NOT IN TABLE THEN RETURN -1 ; LD A,C CP A,MAXFUNCS LD A,-1 RET N MAXFUNCS EQU ($ - BFUNTBL) / 2 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN DRIVER TABLE PTR FUNCTION ; ENTRY- C= DRIVE # + DDT_EXE) ;FETCH DRIVER ADDRESS FROM TABLE LD H,(IX + DDT_EXE + 1) JP (HL) ; ; DRIVER RETURNS HERE ; LL_OPRET: ; ;  ; ELSE IF DEBUGGER THEN EXECUTE IT ; CP A,'M' JP Z,MR_BRK ; ; ELSE IF IGNORE THEN RETURN NO ERROR ; SUB A,'I' ;I******************** ; ; SET NO SECTOR TRANSLATION PROCEDURE ; EXIT - HL, DE= ? ; ;****************************************++++++++++++++++++++++++++++++++++++++ ; ; HARD DISK DRIVER FUNCTION ; ENTRY- IX= DRIVER TABLE PTR ; EXIT - A= 0: OK; /0: ER+ 1) ADD A,A ;BIT 15 -> BIT_BUCKET ; SRL H RR L RRA ;TRK BIT 0 -> SECTOR BIT 15 LD (IOPB + PB_SECO + 1),A ; LC ; ; ELSE COMPUTE TABLE ENTRY ; PUSH HL ;SAVE POSSIBLE DATA ; LD HL,BFUNTBL LD A,C ADD A,A ADD A,L LD L,A BIOS VERSION # FUNCTION #0 ; EXIT - HL= VERSION # IN BINARY {0.00,..655.35} ; ;++++++++++++++++++++++++++++++++++++++++++++++; EXIT - E:HL= DRIVER TABLE BASE PTR ; NZ= ILLEGAL DRIVE (HL= 0) ; A, B, C= ? ; ;+++++++++++++++++++++++++++++++++++++++++ IF NO ERRORS THEN RETURN ZF ; RET Z ;IF NO_ERROR THEN RETURN ; ; PRINT ERROR ; IOPBDMP: LD A,(BUF_DMAB) ;SET BANK F IGNORE THEN RETURN NO ERROR RET Z ; ; ELSE RETURN ERROR TO BDOS ; LD A,-1 ;RETURN -1 TO BDOS OR A,A RET ; ; ;************************************ ; TRNONE: LD DE,0 JR SETTR SUBTTL HARD DISK ROUTINES ;++++++++++++++++++++++++++ROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; HDEXEC: EQU XPRIM SUBTTL JADE FLD (IOPB + PB_TRKO),HL ;TRACK = RESIDUAL ; ; EXECUTE THE IOPB ; CALL XPRIM ; ; RESTORE THE MODIFIED IOPB SO RETRY WILLLD A,0 ADC A,H LD H,A ; ; EXECUTE TABLE ADDRESS ; LD A,(HL) INC HL LD H,(HL) LD L,A ; EX (SP),HL ;PUT CALLE++++++++++++++++++++++++++++++ ; RETVERS: LD HL,VERSN XOR A,A ;RETURN NO ERROR RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; RETDVRT: ; ; ASSUME DRIVE 0 ; LD HL,DDT_0 ;START AT 1ST TABLE ; ; IF DRIVE == LD E,A ; LD HL,IOPB LD A,MF_DIOB ;USE DISPLAY IOPB DATA FUNCTION CALL XMROM ; ; QUERY USER FOR OPTION ; LD HL,DSK DISPLAY WRITE PROTECT ERROR MESSAGE ; DO_ERR: LD HL,WP_ERM CALL EDITOR JR IOPBDMP ;*******************************++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE IOPB PRIMITIVE ; EXIT - A= 0: OK, /0: ERROR ; ;+++++++++OPPY DRIVER ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; JADE 8" FLOPPY DISK DR WORK ; POP HL ;TRACK LD (IOPB + PB_TRKO),HL ; LD HL,IOPB + PB_SECO +1 ;CLEAR BIT 15 RES 7,(HL) ; ; DONE ; RER'S DATA IN HL, FUNCTION ADDR ON RET ; STACK, EXECUTE FUNCTION ADDRESS ON STACK ;######################################+++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN DRIVER TABLE PTR FUNCTION #1 ; ENTRY- E= DRIVE # ; EXIT - E:HL= D 0 THEN ALREADY THERE ; LD A,C OR A,A RET Z ; ; ELSE IF ILLEGAL DRIVE THEN RETURN ERROR ; CP A,NDRVS JR C,RETDV20 %+ &, !'- "(. #)/ $*0 ; LD HL,0 OR A,A ;SET NZ RET ; ; ; ELSE COMPUTE TABLE PTR ; RETDV2: LD B,C LD DE,DDT_SIZ ; RETDVL: ADD HL,DEIONAL FUNCTIONS TO SUPPORT CDOS PROGRAMS ;*************************************************************************** ; ; SYS CP A,8DH ;IF RETURN VERSION THEN RETURN IT JR Z,RETCVER ; CP A,90H ;IF NOT CLOCK THEN ERR JR C,ILLEGC ; JR Z,CLKCAL+++++++++++++++++++++++ ; RETCVER: LD B,1 RET SUBTTL CLOCK ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++XECUTER ; ENTRY- A= FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; XMROM: EQUSOLE OUTPUT ; ENTRY- C= CHAR TO OUTPUT ; ;**************************************************************************** ; CO; ENTRY- C= CHAR TO OUTPUT ; ;**************************************************************************** ; LO: LD A,MF_L########################################################## ; ; 3740 SECTOR TRANSLATION TABLE ; **** CP/M SINGLE DENSITY ****  DJNZ RETDVL ; LD A,(BUF_DMAB) LD E,A ; ; RETURN NO ERROR ; XOR A,A RET ;++++++++++++++++++++++++++++++++++TEM CALL INTERCEPT ROUTINE CHECKS FOR ILLEGAL BDOS CALLS & ; PRINTS MESSAGE IF ILLEGAL. ALSO IMPLEMENTS CDOS CLOCK/CALENDAR ; ;IF CALENDAR THEN GET IT ; CP A,92H JR Z,CLKTIM ;IF TIME THEN GET IT ; ; ILLEGAL SYSTEM CALL ; ILLEGC: PUSH BC ;SAVE++++++++++++++++++++++++++++ ; ; RETURN CALENDAR FUNCTION 90H ; EXIT - A= DAY ; B= MONTH ; C= YEAR ; L= DAY OF WEEK ;  MR_FUN SUBTTL CHAR I/O ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CONSC: LD A,MF_CO JP XMROM ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; READER DRIVEO JP XMROM ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN LIST DEVICE STATUS  ; ;############################################################################ ; SDTRAN: GXLATE 26,6 ;################++++++++++++++++++++++++++++++++++++++++++ ; ; GET BANK NUMBER FUNCTION ; EXIT - A= BANK # ; ;+++++++++++++++++++++++++++++ SYSTEM CALLS FOR ASMB. ; ;*************************************************************************** INTCPT: LD A,C ;CHEC FUNCTION # ; ; OUTPUT WARNING MESSAGE ; LD HL,ISCMSG ;OUTPUT WARNING CALL EDITOR ; ; OUTPUT FUNCTION # ; POP BC ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKCAL: LD A,MF_GCAL JP XMROM ;+++++OLE INPUT ; EXIT - A= CHAR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CI: LD A,MF_R - DUMMY ; EXIT - A= CTRL-Z ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; READER: LD A ; EXIT - A= 0: BUSY, FFH:READY ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; LISTST: ############################################################ ; ; COMMON I/O PARAMETER BLOCK ; ;#############################+++++++++++++++++++++++++++++++++++++++++++++++ ; GETBNK: LD A,MF_GBNK JP MR_FUN SUBTTL NON-DISK PROCEDURES ;*****K CALL VALIDITY CP A,41 ;IF <= 40 THEN OK ; BDOSV EQU $ + 1 JP C,BDOS + 11H ;THIS ADDR MODIFIED BY WARM BOOT RTN ; ; T LD A,MF_PHXB CALL XMROM ; ; OUTPUT NEW LINE ; CALL CRLF ; ; RETURN NULLS ; XOR A,A ;BC = HL = A = 0 LD L,A+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN TIME FUNCTION 92H ; EXIT - A= SECONDS ; CI JP XMROM ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN CONSOLE STATUS ; ,CTRLZ ;FAKE EOF ; ; FALL INTO PUNCH RETURN ; ;**********************************************************************LD A,MF_LOS JP XMROM ;**************************************************************************** ; ; MESSAGE EDITOR ############################################### ; IOPB: REPT PB_SIZE LIST OFF DB 0 LIST ON ENDM ;################********************************************************************** ; ; NEWLINE PROCEDURE ; ;****************************HE FOLLOWING CONDITIONAL JUMP IS MODIFIED TO AN UNCONDITIONAL JUMP BY ; THE WARM BOOT ROUTINE IF THE CLOCK/CALENDAR BOARD IS N LD H,A LD C,A LD B,A RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CDOS B= MINUTES ; C= HOURS ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKTIM: LD A,MF_EXIT - A= 0: NOT READY ; FFH: CHAR READY ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ****** ; ; PUNCH DRIVER ; ENTRY- C= CHAR TO OUTPUT ; ;*********************************************************************; ENTRY- HL= TEXT PTR (BIT 7= 1: TERMINATOR) ; EXIT - REGS= ? ; ;************************************************************############################################################ ; ; DISK DRIVER TABLES (DDT) ; ;###############################*********************************************** ; CRLF: LD C,CR CALL COC LD C,LF JP COC IF INTCPTS SUBTTL ADDITOT PRESENT ; IF NOT MODIFIED, THEN IT IS ALLWAYS FALSE (NOP). ; INHCLK: JR C,ILLEGC ; ; NOW CHECK FOR EXTENDED CALLS ; RETURN VERSION FUNCTION ; MAKES CLOCK/CALENDAR WORK. ; EXIT - B= 1 ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++GTIM JP XMROM ENDIF ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; MONITOR ROM E ; CNSCK: LD A,MF_CIS JP XMROM ;**************************************************************************** ; ; CON******* ; PUNCH: RET ;**************************************************************************** ; ; PRINTER DRIVER **************** ; EDITOR: CALL GETBNK LD E,A LD A,MF_PUTS JP XMROM SUBTTL INITIALIZED DATA ;############################################################### ; STRUCT 0 DDT_EXE DS 2 ;START ADDRESS OF DISK DRIVER DDT_FLG DS 1 ;FLAGS BI0 %+ &, !'- "(. #)/ $*0T DEF. ; 0 1: INHIBIT LOGON ; 1..3 PARTITION # {0,..7} ; 4 1: HARD DISK DRIVE ; DDT_DRV DS 1 ;PHYSICAL DRIVE #@@@@@@@@@@ ; ALLDRV MACRO #DADD,#PD,#FLG,#DPB,#DPH,#HDS,#SOF DW #DADD ;DRIVER EXECUTION ADDR DB #FLG ;FLAGS DB #PD ;M6,10H,D2DPB,D2DPH,4,0 ; D DDT_3: ALLDRV HDEXEC,6,12H,D3DPB,D3DPH,4,8000H ; E DDT_4: ALLDRV HDEXEC,7,10H,D4DPB,D4DPH,4,0 ########################################## ; SD8PBK: DW 26 ;SECTORS PER TRACK DB 3 ;BLOCK SHIFT FACTOR DB 7 ;BLOCK MASK) DB 1 ;NULL MASK (EXM) DW 1015 ;DISK SIZE (CLUSTERS -1) (DSM) DW 1152 / 2 ;DIRECTORY MAX (DRM) DB 0FFH ;ALLOCATI@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ALLDPH: MACRO #D LIST ON D#D(DD)DPH: ;DRIVE PARAMETER HEADER FOR DRIVE #D(DD) D####################################################### ; LOGIOPB: DB PB_LOGC ;COMMAND DB 0 ;DRIVE DW 0 ;TRACK DW ID_SS 1 ;XFER BANK ; ; ; BUFFER IOPB OVERLAY ; BUF_DSK DS 1 ;BUFFER DISK NUMBER BUF_TRK DS 2 ;BUFFER TRACK NUMBER BUF_SEC D DDT_DPB DS 2 ;DPB ADDRESS FOR THIS DRIVE DDT_DPH DS 2 ;DPH ADDRESS FOR THIS DRIVE ; ; THE FOLLOWING MAY BE BROUGHT OFF DIONITOR PHYSICAL DRIVE # DW #DPB ;DISK PARAMETER BLOCK PTR DW #DPH ;DISK PARAMETER HEADER PTR DB #HDS ;HEADS DW #SOF  ; F DDT_5: ALLDRV HDEXEC,7,12H,D5DPB,D5DPH,4,8000H ENDIF ;######################################################### DB 0 ;NULL MASK DW 242 ;DISK SIZE -1 DW 63 ;DIRECTORY MAX DB 11000000B ;ALLOC 0 DB 0 ;ALLOC 1 DW 16 ;CHECK SIZON 0 (AL0) DB 10000000B ;ALLOCATION 1 (AL1) DW 0 ;CHECK SIZE (CKS) DW 2 ;TRACK OFFSET (OFF) DB 1 ;PHYSICAL REW 0 ;;SECTOR TRAN TBL (OR 0 IF NO XLATE) DW 0 ;;SCRATCH AREA DW 0 ;;" DW 0 ;;" DW DIRBF ;;DIRECTORY BUFFER PTR DWECT ;SECTOR DB 0 ;FLAGS DW BLKBUF ;DMA DB 0 ;BANK DW 0 ;COUNT ; WR_PROT DB -1 ;/0: WRITE PROTECTION ENABLED ; ; S 2 ;BUFFER SECTOR NUMBER DS 1 ;FLAGS BUF_DMA DS 2 BUF_DMAB DS 1 ;BANK # ; ; ; BLOCKING BUFFER MAINTENANCE ; BUF_PSECSK DESCRIPTOR OR FROM DEFAULT TABLES ; DDT_HDS DS 1 ;HEADS DDT_SOF DS 2 ;SECTOR OFFSET ; ; DEFINE THE STRUCTURE SIZE ; ;SECTOR OFFSET ; ENDM IF BOOT = 10H ; A DDT_0: ALLDRV HDEXEC,6,10H,D0DPB,D0DPH,4,0 ; B DDT_1: ALLDRV HDEXEC,6,1################### ; ; MESSAGES ; ;############################################################################ ; MSGLEE DW 2 ;TRACK OFFSET DB 0 ;PHYSICAL RECORD SHIFT FACTOR DB 0 ;PHYSICAL RECORD MASK DW 0 ;LOGICAL DRIVE SECTOR OFFSETCORD SHIFT FACTOR (PSH) DB 1 ;PHYSICAL RECORD MASK (PRM) DW 0 ;LOGICAL DRIVE SECTOR OFFSET (SOF) ; ; ; DB 4 ;HEADS  D#D(DD)DPB ;;DRIVE PARAMETER BLK PTR IF ((DD - 1) <= NDHD) AND ((DD - 1) >= STHD) DW 0 ;;NO CHECKS ON HARD DISK ELSE LAST OF INITIALIZED CODE READ FROM DISK ; BIOSND EQU $ SUBTTL UNINITIALIZED DATA AREA ;################################ DS 2 ;BUFFER PHYSICAL SECTOR BUF_ACT DS 1 ;0: BUFFER FLUSHED, /0: DATA IN BUFFER BUF_MOD DS 1 ;0: BUFFER CLEAN, /0: BUFFER DIDDT_SIZ DS 0 ENDM ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; MACRO TO DEFINE THE2H,D1DPB,D1DPH,4,8000H ; C DDT_2: ALLDRV HDEXEC,7,10H,D2DPB,D2DPH,4,0 ; D DDT_3: ALLDRV HDEXEC,7,12H,D3DPB,D3DPH,4,8000H: DM CR,LF,'LOAD ERROR: ' ; DSKEB: DM CR,LF,'Abort, Ignore, Retry, (BDOS) - ' ; WP_ERM: DM CR,LF,'W-PROT Error!' ; IF I ; ; DEFAULT DISK PHYSICAL PARAMETERS ; DB 1 ;HEADS ;############################################################## ;############################################################################ ; ; DRIVE PARAMETER HEADER AREA ; 1 PER DR DW D#D(DD)CHK ;;DRIVE DISK CHECKSUMS ARRAY PTR ENDIF DW D#D(DD)ALL ;;DRIVE CLUSTER ALLOCATION BIT MAP PTR LIST OFF ############################################ ; ; THE FOLLOWING DATA MUST RESIDE IN THIS ORDER TO MATCH THE IOPB DATA ; ;##RTY (MODIFIED) ; BUF_DDT DS 2 ;BUFFER DDT PTR BUF_DPB DS 2 ;BUFFER DPB PTR ; RSFLAG: DS 1 ;0: NO PREREAD REQ'D, /0: PREREAD DRIVER TABLE RECORD ; ENTRY- #DADD= DRIVER ADDRESS ; #PD= PHYSICAL DRIVE # ; #FLG= DRIVE FLAGS ; #DPB= DPB ADDRESS ; # ; E DDT_4: ALLDRV FD8EXEC,0,0,D4DPB,D4DPH,1,0 ; F DDT_5: ALLDRV FD8EXEC,1,0,D5DPB,D5DPH,1,0 ENDIF IF BOOT = 3 NTCPTS ISCMSG: DM CR,LF,'ILL SYS CALL, #= ' ENDIF ;################################################################################# ; ; DEFAULT 8" HARD DISK PARAMETER BLOCK ; ;#################################################################IVE ; ;############################################################################ ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ENDM ; ; DEFINE THE DATA ; DD DL 1 REPT NDRVS LIST OFF ALLDPH 0123456789ABCDEF DD DL DD + 1 LIST ON ENDM ;########################################################################## ; ; CP/M IOPB OVERLAY ; CPM_DSK DS 1 ;LOGICAL D REQ'D READOP: DS 1 ;0: WRITE OPERATION, 1: READ OPERATION WRTYPE: DS 1 ;WRITE OPERATION TYPE FROM BDOS: ; 0: WRITE TO ALLDPH= DPH ADDRESS ; #HDS= HEADS ; #SOF= SECTOR OFFSET ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@; A DDT_0: ALLDRV FD8EXEC,0,0,D0DPB,D0DPH,1,0 ; B DDT_1: ALLDRV FD8EXEC,1,0,D1DPB,D1DPH,1,0 ; C DDT_2: ALLDRV HDEXEC,######### ; ; DEFAULT 8" FLOPPY DISK PARAMETER BLOCK ; IBM 3740 SINGLE DENSITY FORMAT ; ;############################################# ; HDPBK: DW 128 ;SECTORS PER TRACK (LOGICAL) (SPT) DB 5 ;BLOCK SHIFT FACTOR (BSH) DB 31 ;BLOCK MASK (BLM@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE A DISK PARAMETER TABLE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@############################################################################ ; ; LOGON IOPB OVERLAY ; ;#####################RIVE CPM_TRK DS 2 ;LOGICAL TRACK NUMBER CPM_SEC DS 2 ;LOGICAL SECTOR NUMBER DS 1 ;FLAGS CPM_DMA DS 2 ;XFER ADDR CPM_DMAB DOCATED (USED) BLOCK (PREREAD) ; 1: WRITE TO DIRECTORY (PREREAD & WRITE) ; 2: WRITE TO UNALLOCATED (UNUSED) BLOCK (NO ; 0 %+ &, !'- "(. #)/ $*0 PREREAD REQ'D) ; ; UNA_CNT: DS 1 ;# SECTORS REMAINING IN BLOCK (CLUSTER) UNA_DSK: DS 1 ;LAST UNALLOC DISK UNA_TRK: DS 2 ########################################################### ; ; DRIVE ALLOCATION AREAS ; ;################################ECTOR) ENDIF LIST OFF ENDM ; ; RESERVE THE DATA SPACE ; DD DL 1 REPT NDRVS LIST OFF ALLDAL 0123456789ABCDEF IN CLUSTERS) ; INT(((#_TRACKS - OFF) * SPT * BYTES PER SECTOR) / CLUSTER SIZE) -1 DPB_DRM DS 2 ;DRM- DIRECTORY SIZE -1 DPB_ONING BY HEADS ARE IMPLIMENTED BY USING THE FOLLOWING DATA. ; (HEAD BITS ARE INCLUDED IN SECTOR WORD UPPER BITS) ; DPB_SECOCONMSG **** BIOS TOO BIG, USE MOVCPM & RE-ADJUST! **** ENDIF END ARD DISK PHYSICAL DRIVE 0 ; C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; D SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ; EARD DISK PHYSICAL DRIVE 1 ; G JADE 8" FLOPPY PHYSICAL DRIVE 0 ; H JADE 8" FLOPPY PHYSICAL DRIVE 1 ENDIF ; ;*********;LAST UNALLOC TRACK UNA_SEC: DS 2 ;LAST UNALLOC SECTOR ;############################################################################################################## ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@  DD DL DD + 1 LIST ON ENDM ;############################################################################ ; ; RESERVAL0 DS 2 ;AL0,1- DIRECTORY ALLOCATION ; 1 MSB PER DIRECTORY CLUSTER ALLOCATED DPB_CKS DS 2 ;CKS- # DIRECTORY SECTORS CHECKE DS 2 ;SOF- SECTOR OFFSET (FOR LOGICAL DRIVE) ; 0: NONE, 1..65535: OFFSET DPB_SZ DS 0 ENDM ; ; ;@@@@@@@@@@@@@@@@@@@@@@PBOFF ABOVE. ; PARTITIONING BY HEADS ARE IMPLIMENTED BY USING THE FOLLOWING DATA. ; (HEAD BITS ARE INCLUDED IN SECTOR WORD U JADE 8" FLOPPY PHYSICAL DRIVE 0 ; F JADE 8" FLOPPY PHYSICAL DRIVE 1 ENDIF IF BOOT = 3 ; A JADE 8" FLOPPY PHYSICAL******************************************************************* ; ; REVISION HISTORY: ; ; 3.00 - 26 JAN 87 GRH ; Im########## ; ; VARIABLES ; ;############################################################################ ; CUR_DPB DS 2 ; ; MACRO TO DEFINE THE DRIVE ALLOCATION & CHECKSUMS AREA ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@E DRIVE PARAMETER BLOCKS ; ;############################################################################ ; STRUCT 0 DPB_SPD ; (DRM +1) / 4 DPB_OFF DS 2 ;OFF- # RESERVED TRACKS (USUALLY 2) ; ; ADDITIONAL CP/M 3.0 DATA (ALSO COULD BE USED BY C@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE THE DPB FOR DRIVE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ TITLE CUSTOMIZED BIOS FOR M5B LIST NOCOND BOOT EQU 10H ;10H: SA1004, 11H: PYX27, 3: 8" FLOPPY, 20H: 5" FLOPPY ;************ DRIVE 0 ; B JADE 8" FLOPPY PHYSICAL DRIVE 1 ; C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; D SIDE 2 & 3 OF HARD DISK Pplemented new common IOPB code & Jade floppy firmware support. ; Implemented disk drive driver tables and new function to retur;DRIVE TABLE PTR CUR_DDT DS 2 ;DRIVE DRIVER TABLE BASE ADDRESS PTR CUR_DPH DS 2 ;DPH PTR ; LOGRQ: DS 1 ;LOG ON REQUEST REG. @@@@@@@@@@@@ ; ; ALL = (DSM / 8) + 1 ; CHK = DPB.CKS ; ALLDAL: MACRO #D LIST ON IF ((DD - 1) >= STHD) AND ((DD - 1) <T DS 2 ;SPT- SECTORS/TRACK DPB_BSH DS 1 ;BSH- BLOCK SHIFT FACTOR DETERMINED BY CLUSTER SIZE ; 1K= 3, 2K= 4, 4K= 5, 8K= 6, 1P/M 2.2 DEBLOCKING) ; DPB_PSH DS 1 ;PSH- PHYSICAL RECORD SHIFT FACTOR BASED ON BYTES/SEC ; 0: 128, 1: 256, 2: 512, 3: 1024@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ALLDPB: MACRO #D LIST ON D#D(DD)DPB: DS DPB_SZ ;ALLOCATION FOR DRIVE #D(**************************************************************** ; ; CUSTOMIZED BIOS FOR M5B ; (c) 1981 GRH Electronics,HYSICAL DRIVE 0 ; E SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; F SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ENDIF IFn ; a ptr to a drive table. ; Removed init of IOBYTE. ; Implemented 5" floppy driver. ; Implemented use of ROM primitives.  ; ; BOOT DATA ; BD_SIZE EQU 16 ;MAX SIZE OF SYSTEM BOOT DATA BT_DATA DS BD_SIZE ;BOOT DIRECTORY SYSTEM DATA SEGCNT DS = NDHD) D#D(DD)ALL: DS 128 ;ALLOCATION BIT MAP FOR 8" HARD DRIVE #D(DD) ENDIF IF ((DD - 1) >= ST8FD) AND ((DD - 1) <= N6K= 7 DPB_BLM DS 1 ;BLM- BLOCK MASK ; 1K = 7, 2K= 15, 4K= 31, 8K= 63, 16K= 127 DPB_EXM DS 1 ;EXM- EXTENT MASK ; DSM <  DPB_PHM DS 1 ;PHM- PHYSICAL RECORD MASK BASED ON BYTES/SEC ; 0: 128, 1: 256, 3: 512, 7: 1024 ; ; ADDITIONAL DISK PARTIDD) LIST OFF ENDM ; ; RESERVE THE DATA SPACE ; DD DL 1 REPT NDRVS LIST OFF ALLDPB 0123456789ABCDEF DD DL DD + 1 CUPERTINO, CA ; ;**************************************************************************** ; ; CONFIGURATION: ; ; CPM  BOOT = 20H ; A JADE 5" FLOPPY PHYSICAL DRIVE 0 ; B JADE 5" FLOPPY PHYSICAL DRIVE 1 ; C SIDE 0 & 1 OF HARD DISK PHYSICA ; Moved system down to 60k. ; 3.01 26 JUN 88 GRH ; Remove 5" floppy support. Implement in CP/M-86 BIOS. ; Change single fun1 ;NUMBER OF BOOT DIRECTORY SEGMENTS SECCNT DS 1 ;SEGMENT SECTOR COUNT LDRPTR DS 2 ;SYSTEM DATA PTR ;#################D8FD) D#D(DD)ALL: DS 57 ;ALLOCATION BIT MAP FOR 8" DRIVE #D(DD) D#D(DD)CHK DS 32 ;DIRECTORY CHECKSUMS STORAGE (1 BYTE PER S256 : 1K= 0, 2K= 1, 4K= 3, 8K= 7, 16K= 15 ; DSM > 255 : 2K= 0, 4K= 1, 8K= 3, 16K= 7 DPB_DSM DS 2 ;DSM- DRIVE STORAGE SIZE (TIONING DATA FOR THE LOGICAL DRIVE SELECTION. ; PARTITIONING BY TRACKS ARE IMPLIMENTED THRU BDOS USING DPBOFF ABOVE. ; PARTITI LIST ON ENDM ; ; BLOCKING BUFFER ; BLKBUF: DS 1024 ;HOST BUFFER IF (($ - 8000H) > 07700H) OR ($ < 8000H)  ; DRIVE USAGE IF BOOT = 10H ;HARD DISK BOOT CONFIG. ; A SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; B SIDE 2 & 3 OF HL DRIVE 0 ; D SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 0 ; E SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; F SIDE 2 & 3 OF Hction to return drive table ptr into a BIOS function ; call using restart instruction. ; Change LOGON to specify the ID sect0 %+ &, !'- "(. #)/ $*0or & track. At same time, fix bug ; which did not specify the logon track. ; 3.02 7 JUL 88 GRH ; Add '?' to include file  than swapping Roms itself. ; 3.07 11-25-90 GRH ; Modify for Ver. 1.22 Monitor. ; Fix bug in 8" Hard Disk table which benigrom ; DCM8 to CBIOS. ; Remove IOPB ptr passing in IX redundancy. ; Change DPB track-head shift factor to Sector Offset like uffer for ; ID sector read. ; 9-20-91 GRH Fold in redlines. ; 10-21-91 GRH Fix bugs ; 10-22-91 GRH Fix bugs ; 1======================================= ; FALSE EQU 0 TRUE EQU NOT FALSE ;========================================================================================== ; ; DISK OPERATING SYSTEM ADDRESSES ; ;======================================AULT BUFFER ; ; BIOS FUNCTION CALL RESTART VECTOR ; BFUNRST EQU 28H BFUNRSV EQU PAGE0 + BFUNRST BFUNRSI EQU 0C7H + BFUNRU 20H ;A DSK_1 EQU 20H ;B DSK_2 EQU 20H ;C DSK_3 EQU 20H ;D DSK_4 EQU 10H ;E DSK_5 EQU 10H ;F NDRVS: EQU 6 ENDIF Inames. ; Change hard disk system tracks directory reference to new format. ; Correct bug in drivers which caused retry to failnly (at current level) ; caused the drive table to have bad data (default table was missing ; the 2 deblocking extension byttrack ; offset. Disk partitioning will add this value to sector word. It ; will be stored in the ID sector data to be dynami0-23-91 GRH Fix bugs ; 3.13 1-15-92 GRH ; Change hard disk translation to Monitor disks 4 & 5 from 6 & 7. ; 3.14 2-9-92 ============================== ; ; CONDITIONAL ASSEMBLY FLAGS ; ;================================================================================================= ; SYS EQU 2 ;CP/M VERSION {2,3} ; NKSYS: EQU 59 ;SYSTEM SIZE IN K BYTES KBYTE: EQUST ;============================================================================ ; ; OTHER DECLARATIONS ; ;============F BOOT = 11H ; ; 5.25" PYX-27 BOOT ; DSK_0 EQU 11H ;A DSK_1 EQU 10H ;B DSK_2 EQU 10H ;C DSK_3 EQU 0H ;D DSK_4 EQU 0 ;E. (sector remained ; corrupted) ; Stubbed out new Clock routines for present. ; 3.03 31 JUL 88 GRH ; Unstub Clock routines). ; Implement data xfer inhibit schemes with PB_FLG & PB_BCNT. ; Add pick-up of THIS_BNK data in all iopb cases. ; Remove c. ; 3.10 5-20-91 GRH ; Change LOGON to attempt to recover from old disks better, using ; DCM8301 version controller firmw GRH ; Add additional floppy disk allocation size for 1.22Mb disks. ; ; 3.15 3-17-92 GRH ; Add dynamic sector skew table ================= ; INTCPTS EQU TRUE ;ENABLE SYSTEM CALL INTERCEPT WHISTLE ;============================================ 1024 CPMSZ: EQU KBYTE * NKSYS CPMBS: EQU CPMSZ - (20 * KBYTE) ;CP/M BIAS VALUE CCP: EQU CPMBS + 3400H ;ADDR OF CCP BDOS: ================================================================ ; SKTSZ EQU 26 ;SKEW TABLE SIZE IF BOOT = 10H ; ; 8"  NDRVS: EQU 5 ENDIF ;============================================================================ ; ; BDOS COes. ; 3.04 6 AUG 88 GRH ; Remove floppy side select from BIOS & move to controller. ; Implement new ID sector format. ; Imclock buffer set/read system calls. ; 12-5-90 GRH ; Remove IX IOPB ptr passing to disk drivers. ; 1-13-91 GRH ; Fix bug ware. ; 3.11 9-2-91 GRH ; Add redlines & change for M5ZMON v.2.00. ; 3.12 9-11-91 GRH ; Add deblocking code. ; 9-17-91 selection to login code. ; ; 3.16 5-1-92 GRH ; Add bios functions to allow 'fix'ing the disk format. ; VERSN EQU 316 ; ================================ ; ; INCLUDE COMIOPB3.DEF ; INCLUDE DISKS3.DEF ; INCLUDE BDIR.DEF ; INCLUDE EQU CPMBS + 3C00H ;ADDRESS OF BDOS BIOS: EQU CPMBS + 4A00H ;ADDRESS OF BDOS BIOSR: EQU 1000H - BIOS ; ; PAGE 0 LOCATIONSHARD DISK BOOT DATA ; DSK_0 EQU 10H ;A DSK_1 EQU 10H ;B DSK_2 EQU 10H ;C DSK_3 EQU 10H ;D DSK_4 EQU 0 ;E DSK_5 EQU 0 ;F NSTANTS ON ENTRY TO WRITE ; ;============================================================================ ; WRALL EQU 0 ;WRIplement CP/M 3.0 DPB structure in preparation for deblocking. ; 3.05 11-3-88 GRH ; Change included data to update IOPB.PBSTAhich corrupted PB_FLG. ; 3.08 2-22-91 GRH ; Remove references to THIS_BNK & use monitor function #7 instead. ; Add track-he GRH Add r/ls & move to 59k system. ; 9-19-91 GRH Fix bug which destroyed my root directories! ; BUF_RD was writing. ; ;**************************************************************************** SUBTTL SYSTEM DECLARATIONS ;================= M5ZF2.DEF ; ;============================================================================ ; LIST OFF *INCLUDE COMIOPB3 ; PAGE0: EQU 0 ;START OF CP/M RAM DEFDRV: EQU PAGE0 + 4 ;DEFAULT DRIVE PARAM ADDR BDOSJV EQU PAGE0 + 5 ;BDOS SYSTEM CALL ENDRVS: EQU 6 ENDIF IF BOOT = 3 ; ; 8" FLOPPY BOOT DATA ; DSK_0 EQU 0H ;A DSK_1 EQU 0H ;B DSK_2 EQU 10H ;C DSK_3TE TO ALLOCATED WRDIR EQU 1 ;WRITE TO DIRECTORY WRUAL EQU 2 ;WRITE TO UNALLOCATED ;======================================T to new configuration. ; 3.06 1-28-89 GRH ; Revised primitive calling procedures to use the monitor rom function ; ratherad shift factor to DPBs for future use. ; 3.09 5-15-91 GRH ; Change 8" floppy side select to track bit 0. Move calculation f Patch problems with partitioning until 20MB drive installed. ; Fix TPA corruption by LOGON problem by using ROMBNK sector b=========================================================== ; ; ASSEMBLY PARAMETERS ; ;=====================================.DEF *INCLUDE DISKS3.DEF *INCLUDE BDIR.DEF *INCLUDE B:M5ZF2.DEF LIST ON ;================================NTRY THIS_STK EQU PAGE0 + 1CH ;CURRENT STACK FRAME PTR DK_BDRV EQU 0041H ;BOOT DRIVE # FROM PROM DEFBFR EQU PAGE0 + 80H ;DEF EQU 10H ;D DSK_4 EQU 10H ;E DSK_5 EQU 10H ;F NDRVS: EQU 6 ENDIF IF BOOT = 20H ; ; 5.25" FLOPPY BOOT ; DSK_0 EQ====================================== ; ; ASCII CHARS ; ;==================================================================0 %+ &, !'- "(. #)/ $*0========== ; LF: EQU 0AH CR: EQU 0DH CTRLZ: EQU 1AH ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@SION TEXT IN RAM MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; PVERS MACRO #VERS  JP READER JP HOME ;HOME SELECTED DRIVE JP SELDSK ;SELECT DISK DRIVE JP SETTRK ;SET TRACK # JP SETSEC ;SET SECTOR # ;SPARE BIOSSZ: DW BIOSND - BIOS ;BIOS MODULE SIZE IN BYTES BIOSST: DW BIOS ;BIOS MODULE LOAD ADDR FOR SBD ; ; CONTINUE NIT: ; ; SET TEMPORARY STACK ; DI LD SP,DEFBFR ;USE PAGE 0 FOR STACK LD (THIS_STK),SP EI ; ; INIT DEFAULT DRIVE ;############################################################################ ; ; SIGN-ON MESSAGE ; ;#################------------- ; WARM: ; ; SET TEMPORARY STACK ; DI LD SP,DEFBFR LD (THIS_STK),SP EI ; ; INIT OUR STUFF ; X CP A,86H JR C,WEROR ; ; SET UP TO LOAD CCP/BDOS ; LD HL,(DEFBFR + BD_SBDSS) ;PREFETCH BDOS TRK/SECTOR PUSH HL ; L@@@@@@@@@@ ; ; GENERATE THE TRANSLATION TABLE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@DD DL #VERS IF DD > 9999 DB (DD / 10000) + '0' DD DL DD % 10000 ENDIF IF DD > 999 DB (DD / 1000) + '0' DD DL D JP SETDMA ;SET TRANSFER ADDR JP DISKRD ;PERFORM DISK READ JP DISKWR ;PERFORM DISK WRITE JP LISTST ;RETURN LIST STATON WITH INIT ; INIT1: JR INIT ;############################################################################ ; ; DIRECTO ; LD A,(DK_BDRV) ;USE DRIVE # PASSED IN PAGE 0 AND A,3 LD (DEFDRV),A ; ; SEND SYSTEM SIGN-ON ; LD HL,MSGSO CALL########################################################### ; MSGSO: DB CR,LF DB CPMSZ / (KBYTE * 10) + '0' DB (CPMSZ MOD OR A,A LD (BUF_ACT),A ;ASSUME NO DATA IN BUFFER ; LD (UNA_CNT),A ;CLEAR UNALLOCATED SECTOR COUNT ; LD (BUF_MOD),A ;CLEAND HL,(DEFBFR + BD_SCCPS) ;FETCH CCP TRK/SECTOR LD C,L LD B,0 CALL SETSEC ; LD C,H CALL SETTRK ; LD BC,CCP CALL S@@@@@@@ ; GXLATE MACRO #SECTORS, #SKEW LIST OFF NXTSEC DL 1 ;;START WITH SECTOR 1 LOWEST DL 1 ;; REPT #SECTORS LIST D % 1000 ENDIF DB (DD / 100) + '0' DB '.' DB ((DD % 100) / 10) + '0' DB (DD % 10) + '0' ENDM SUBTTL BIOS CODUS JP SECTRN ;TRANSLATE SECTOR JP BIOFUNC ;EXECUTE FUNCTION CALL ;###################################################RY SECTOR BUFFER STARTS HERE AFTER CRUNCHING COLD START ; CODE. THIS BUFFER IS USED BY THE CP/M DIRECTORY CHECK ROUTINES THAT  EDITOR ; ; MODIFY COLD START VECTOR TO WARM START ; LD HL,(BIOS+4) LD (BIOS+1),HL ; ; INIT OUR STUFF ; CALL GET(KBYTE * 10)) / KBYTE + '0' DB 'K CP/M-80 Vers 2.2',CR,LF DB 'M5b CBIOS Vers ' PVERS VERSN DM CR,LF IF $ > ( BUFFER ; LD HL,BLKBUF ;INIT BUFFER PTR LD (BUF_DMA),HL ; ; LOG ON DRIVE TO INIT TABLES ; LD A,(DK_BDRV) AND A,3 ETDMA ; ; READ CCP/BDOS ; WREAD: CALL DISKRD JR NZ,WEROR ;IF ERROR THEN EXIT ; ; NEXT SECTOR ; LD HL,CPM_SEC INON DB NXTSEC LIST OFF NXTSEC DL NXTSEC + #SKEW ;ADD SKEW FACTOR ;; IF NXTSEC > #SECTORS ;CHECK FOR OVERFLOW NXTSEC DLE ORG BIOS ;---------------------------------------------------------------------------- ; ; BIOS JUMP VECTOR TABLE ; ;######################### ; ; THE FOLLOWING BOOT DATA MUST RESIDE AS DEFINED RIGHT BEFORE THE COLD ; INIT ROUTINE START AND M ; CHECK FOR DISK CHANGE. ; ;############################################################################ ; DIRBF: EQU $ ;BNK LD (BUF_DMAB),A ; ; INITIALIZE CLOCK VECTORS IF CLOCK INSTALLED ; LD A,MF_CSYN ;TEST FOR BOARD PRESENT CALL XMROMDIRBF + 128) CONMSG **** WARNING! COLD INIT CODE BIGGER THAN DIR BUFFER **** ELSE DS DIRBF + 128 - $ ;FILL OUT DIRECTOR;MODULO 4 LD C,A LD E,0 CALL SELDSK LD A,L ;IF ERROR THEN ABORT OR A,H JR Z,WEROR ; ; READ BOOT DIRECTORY ; C (HL) ; LD DE,128 ;DMA += SECTOR SIZE LD HL,(CPM_DMA) ADD HL,DE LD (CPM_DMA),HL ; ; IF NOT INTO BDOS THEN READ NE NXTSEC - #SECTORS ;; IF NXTSEC <= LOWEST ;CHECK FOR REPEAT NXTSEC DL LOWEST + 1 LOWEST DL NXTSEC ENDIF ENDIF ;;---------------------------------------------------------------------------- ; JP INIT1 ;COLD START ENTRY JP WARM ;RELOADUST BE IN THE 1ST SECTOR. THESE 2 WORDS ARE ; REFERENCED BY THE BOOT LOADER CODE IN ORDER TO DETERMINE THE LOAD ADDRESS ; AND BUFFER BEGINNING ;---------------------------------------------------------------------------- ; ; INIT - COLD START  ; ; IF CLOCK PRESENT THEN TURN ON CLOCK DRIVE ; OR A,A LD A,38H ;COND. JR (ON) JR Z,CLKON ; ; ELSE TURN OFF CLOY BUFFER TO 1 SECTOR SIZE ENDIF ;---------------------------------------------------------------------------- ; ; WAR LD BC,DEFBFR ;SET XFER ADDRESS (USE DEFAULT BUFFER) CALL SETDMA ; LD BC,BD_SEC ;SET DIRECTORY SECTOR CALL SETSEC ; LXT SECTOR ; LD DE,BDOS XOR A,A SBC HL,DE JR C,WREAD ; ; ELSE IF AT BEGINNING OF BDOS THEN SET UP NEW TRACK & SECTOR ENDM LIST ON ENDM ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; INITIALIZE VER CCP/BDOS JP CNSCK ;GET CONSOLE STATUS JP CI ;CONSOLE INPUT JP COC ;CONSOLE OUTPUT JP LO ;PRINTER OUTPUT JP PUNCH LENGTH OF THE BIOS. ; ;############################################################################ ; DB 0 ;Z80 CPU DB 0ENTRY FROM BOOT MUST SET ALL BIOS PARAMS ; ;---------------------------------------------------------------------------- ; ICK DRIVE ; LD A,18H ;UNCOND. JR (OFF) (CAUSES JUMP TO ILLEGAL) ; CLKON: LD (INHCLK),A ; ; BOOT CCP & BDOS ; JR WARMM REBOOT ENTRY LOADS CCP,BDOS FROM DISK & SETS UP VARIABLES ; ;---------------------------------------------------------------D BC,0 ;SET TRACK TO 0 CALL SETTRK ; CALL DISKRD JR NZ,WEROR ; ; CHECK FOR VALID BOOT DIRECTORY ; LD A,(DEFBFR)  ; JR Z,RDBDOS ; ; ELSE IF NOT AT BIOS THEN READ NEXT SECTOR ; LD DE,BIOS - BDOS SBC HL,DE JP C,WREAD ; ; ELSE0 %+ &, !'- "(. #)/ $*0 DONE READING SYSTEM ; JR WZRPG ; ; ; ELSE SET UP & READ BDOS ; RDBDOS: POP HL ;RESTORE BDOS TRK/SECTOR FROM DIRECTOR ; IF INTCPTS ; ; PUT BDOS VECTOR INTO INTERCEPT CODE ; LD HL,(BDOS + 7) LD (BDOSV),HL ; ; NOW PUT INTERCEPT VETION ; XOR A,A LD (UNA_CNT),A ; ; READ_OPERATION_FLAG = TRUE (1) ; INC A LD (READOP),A ; ; PRE-READ_OF_DATA_FL LD (WR_PROT),A ; ; SET PTRS TO DISK DATA ; PUSH IX LD IX,(CUR_DDT) ; PUSH IY LD IY,(CUR_DPB) ; ; IF NOT BLOC IF NO UNALLOCATED SECTORS REMAIN THEN PREREAD ; CHKUNA: LD A,(UNA_CNT) OR A,A JP Z,ALLOC ; ; ELSE MORE UNALLOCATED RERK) ;TRACK++ INC HL LD (UNA_TRK),HL ; NOOVF: ; ; MATCH FOUND, MARK AS UNNECESSARY READ ; XOR A,A ;PREREAD FLAG = FIS 128 ; SECSHFLP: SRL H ;ELSE SHIFT OVER TO PHYSICAL SECTOR RR L DEC A JP NZ,SECSHFLP ; NOSECSHF: INC HL ;SET AR HOST BUFF ; JR NZ,RW_RET ;IF ERROR THEN ABORT ; FILHST: ; ; READ THE SECTOR BUFFER ; LD A,(CPM_DSK) ;BUFFER SECTOY LD C,L LD B,A ;A STILL CONTAINS 0 CALL SETSEC ; LD C,H CALL SETTRK ; JR WREAD ; ; ; WARM BOOT ERROR, OUTPUCTOR INTO BDOS CODE ; LD HL,INTCPT LD (BDOS + 7),HL ENDIF ; ; PASS DEFAULT DISK TO CCP ; LD A,(DEFDRV) LD C,A AG = TRUE ; LD (RSFLAG),A ; ; TREAT AS UNALLOCATED BLOCK ; LD A,WRUAL LD (WRTYPE),A ; JP RWOPER ;TO PERFORM THE KED THEN USE CPM WRITE ; LD A,(IY + DPB_PSH) ;0= 128-BYTE SECTORS OR A,A JP Z,DISKWRN ; ; READ_OP_FLAG = FALSE ; XCORDS REMAIN, COUNT-- ; DEC A LD (UNA_CNT),A ; ; IF REQUESTED SECTOR != UNALLOCATED SECTOR THEN PURGE ; LD A,(CPM_DSALSE LD (RSFLAG),A JP RWOPER ; ; ; NORMAL NON-BLOCKED WRITE ; DISKWRN: CALL CPM_WR JP RW_RET ; ; ; NOT AN UNBACK TO PHYSICAL SECTOR LD (BUF_PSEC),HL ;BUFFER PHYSICAL SECTOR TO ACCESS ; ; IF BUFFER == EMPTY THEN READ THE PHYSICAL SR = PHYSICAL SECTOR LD (BUF_DSK),A ; LD HL,(CPM_TRK) LD (BUF_TRK),HL ; LD HL,(BUF_PSEC) LD (BUF_SEC),HL ; ; IF RT MSG & GO TO DEBUGGER ; WEROR: LD HL,MSGLE ;OUTPUT ERROR MESSAGE CALL EDITOR CALL MR_BRK HALT ; ; ; BOOT OK, INIT  JP CCP SUBTTL BIOS DISK FUNCTION ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ READ ; ; ; NORMAL NON-BLOCKED READ ; DISKRDN: CALL CPM_RD JP RW_RET ;*******************************************OR A,A LD (READOP),A ; ; SAVE WRITE TYPE ; LD A,C LD (WRTYPE),A ; ; IF 1ST WRITE TO UNALLOCATED (NEW, UNUSED) BLOK) ;SAME DISK? LD HL,UNA_DSK CP A,(HL) JR NZ,ALLOC ; LD HL,(UNA_TRK) ;SAME TRACK? LD DE,(CPM_TRK) SBC HL,DE JR NZALLOCATED RECORD, REQUIRES PRE-READ ; ALLOC: XOR A,A ;COUNT = 0 LD (UNA_CNT),A ; INC A ;PREREAD FLAG = TRUE LD (RSFECTOR ; LD HL,BUF_ACT LD A,(HL) ; LD (HL),1 ;BUFFER = ACTIVE IN ANY CASE ; OR A,A JR Z,FILHST ; ; HOST BUFFER EQUIRED TO READ THEN READ ; LD A,(RSFLAG) ;NEED TO READ? OR A,A CALL NZ,BUF_RD ;YES, IF 1 ; ; BUFFER = CLEAN ; XPAGE 0 ; WZRPG: ; ; INIT BIOS WARM START IN PAGE 0 ; LD A,0C3H LD HL,BIOS + 3 LD (PAGE0),A LD (PAGE0 + 1),HL ;  ; ; READ A DISK SECTOR ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++********************************* ; ; WRITE DISK SECTOR FUNCTION ; ENTRY- C= WRITE TYPE: ; 0: WRITE TO ALLOCATED BLOCK (UPCK THEN SET PARAMETERS ; CP A,WRUAL JP NZ,CHKUNA ; ; COUNT = NUMBER_OF_SECTORS_IN_BLOCK ; LD A,(IY + DPB_BLM) ;CUR_D,ALLOC ; LD HL,(CPM_SEC) LD DE,(UNA_SEC) SBC HL,DE JR NZ,ALLOC ; ; MATCH, MOVE TO NEXT SECTOR FOR FUTURE REF ; ELAG),A ; ; ; ; COMMON CODE FOR READ AND WRITE FOLLOWS ; RWOPER: ; ; ASSUME NO ERRORS ; XOR A,A LD (IOPB + PB_STACTIVE, SAME AS SEEK BUFFER? ; LD A,(CPM_DSK) LD HL,BUF_DSK ;SAME DISK? CP A,(HL) JR NZ,NOMATCH ; LD HL,(BUF_TRK) ;SOR A,A LD (BUF_MOD),A ; MATCH: ; ; COPY DATA TO OR FROM BUFFER ; LD HL,(CPM_SEC) ;CALCULATE INDEX INTO BUFFER DEC H; INIT BDOS CALL VECTOR IN PAGE 0 ; LD HL,BDOS + 6 LD (BDOSJV),A LD (BDOSJV + 1),HL ; ; INIT BIOS CALL VECTOR IN PA++++++++ ; DISKRD: ; ; SET UP DATA TABLE PTRS ; PUSH IX LD IX,(CUR_DDT) ; PUSH IY LD IY,(CUR_DPB) ; ; IF NOTDATE) ; 1: WRITE TO DIRECTORY BLOCK (ALLWAYS WRITE) ; 2: WRITE TO UNALLOCATED BLOCK (NO NEED TO PRE-READ) ; ;***********PB.DPBBLM + 1 ::= (BLKSIZ/128) INC A LD (UNA_CNT),A ; ; SET DISK TO SEEK ; LD A,(CPM_DSK) LD (UNA_DSK),A ; ; SEX DE,HL ;UNASEC += 1 INC HL LD (UNA_SEC),HL ; ; IF PAST LAST SECTOR ON TRACK THEN USE 1ST SECTOR OF NEXT TRACK ; LD ATO),A ; ; COMPUTE BUFFER SECTOR ; LD HL,(CPM_SEC) DEC HL ;CONVERT PHYSICAL SECTOR TO LOGICAL ; LD A,(IY + DPB_PSHAME TRACK? LD DE,(CPM_TRK) SBC HL,DE JR NZ,NOMATCH ; LD DE,(BUF_PSEC) ;SAME SECTOR? LD HL,(BUF_SEC) SBC HL,DE JR L ;CONVERT TO LOGICAL SECTOR (0..N-1) LD A,L ; AND A,(IY + DPB_PHM) ;USE PHYSICAL RECORD MASK DATA (CP/M 3.X) ; RRA GE 0 ; LD HL,BIOFUNC LD (BFUNRSV),A LD (BFUNRSV + 1),HL ; ; SET DEFAULT SECTOR BUFFER ; LD BC,DEFBFR CALL SETDMA BLOCKED THEN USE CPM READ ; LD A,(IY + DPB_PSH) ;0= 128-BYTE SECTORS OR A,A JP Z,DISKRDN ; ; READS DON'T NEED ALLOCA***************************************************************** ; DISKWR: ; ; REMOVE BOOT WRITE PROTECTION ; XOR A,A T TRACK TO SEEK ; LD HL,(CPM_TRK) LD (UNA_TRK),HL ; ; SET SECTOR TO SEEK ; LD HL,(CPM_SEC) LD (UNA_SEC),HL ; ; E,(IY + DPB_SPT) LD D,(IY + DPB_SPT +1) SBC HL,DE JP C,NOOVF ; LD HL,0 ;SECTOR = 1 LD (UNA_SEC),HL ; LD HL,(UNA_T) ;USE PHYSICAL SHIFT FACTOR (CP/M 3.X) AND A,3 ;LIMIT TO 1024 BYTE SECTORS JP Z,NOSECSHF ;IF ALREADY 0 THEN SECTOR SIZE Z,MATCH ;SKIP IF MATCH ; NOMATCH: ; ; IF BUFFER == DIRTY THEN WRITE IT OUT BEFORE READING NEW ONE ; CALL BUF_FLSH ;CLE ;BITS <7..1> -> BITS <14..8> LD H,A ; LD A,0 ;BIT 0 -> BIT 7 RRA LD L,A ; ; HL HAS RELATIVE HOST BUFFER ADDRESS 0 %+ &, !'- "(. #)/ $*0; LD DE,BLKBUF ADD HL,DE ;HL = HOST ADDRESS ; LD DE,(CPM_DMA) ;GET/PUT CP/M DATA LD BC,128 ;LENGTH OF MOVE ; LD A,RECTORY WRITE ; XOR A,A ;BUFFER = CLEAN LD (BUF_MOD),A ; CALL BUF_WR ;WRITE TO DISK ; LD A,(IOPB + PB_STATO) ;RET************************************************ ; ; CPM_RD2 PERFORMS THE PHYSICAL READ FROM THE DISK INTO CPM_DMA, ; WITHOUTSK)= DISK # TO READ FROM ; (CPM_TRK)= TRACK # TO READ FROM ; (CPM_SEC)= SECTOR # TO READ FROM ; (CPM_DMA)= XFER ADDRESS ;,PB_BCNTO - PB_TRKO LDIR ; ; EXECUTE LOW LEVEL READ OR WRITE (ON STACK) ; RET ;***********************************Y POP IX ; ; IF ERROR THEN RETURN IT ; OR A,A RET NZ ; ; ELSE CLEAN BUFFER ; LD (BUF_MOD),A RET ;******EAD FROM ; (BUF_TRK)= TRACK # TO READ FROM ; (BUF_SEC)= SECTOR # TO READ FROM ; IX= DDT PTR ; IY= DPB PTR ; EXIT - (IOPD A,E LD (LOGRQ),A ; ; COMPUTE DISK DRIVER TABLE PTR ; CALL RETDVRT ;DRIVE IS STILL IN C REGISTER ; ; IF DRIVE ERR(READOP) ;WHICH WAY? OR A,A JP NZ,RWMOVE ;SKIP IF READ ; ; WRITE OPERATION, MARK AND SWITCH DIRECTION ; LD A,1 ;BUFFURN ANY ERRORS ; ; DONE, RESTORE & RETURN ; RW_RET: OR A,A ;SET RESULT STATUS FLAG POP IY POP IX ; RET ;****** BLOCKING. ; ENTRY- (CPM_DSK)= DISK # TO READ FROM ; (CPM_TRK)= TRACK # TO READ FROM ; (CPM_SEC)= SECTOR # TO READ FROM ;  IX= DDT PTR ; IY= DPB PTR ; EXIT - (IOPB.PB_STATO)= 0: OK, /0: ERROR ; ;****************************************************************************************** ; ; BUF_FLSH FLUSHES THE BUFFER DATA IF MODIFIED ; ENTRY- (BUF_DSK)= DISK # TO WRIT********************************************************************** ; ; BUF_WR PERFORMS THE PHYSICAL WRITE FROM BLKBUF TO TB.PB_STATO)= 0: OK, /0: ERROR ; ;**************************************************************************** ; BUF_RD: ; OR THEN RETURN (HL= 0) ; RET NZ ; ; ELSE SAVE PTR ; LD (CUR_DDT),HL ; ; FETCH FLAGS ; INC HL ;EXE +1 INC HL ER = DIRTY LD (BUF_MOD),A ; ; SAVE BUFFER DATA PTRS FOR LATER FLUSHES ; LD (BUF_DDT),IX LD (BUF_DPB),IY ; EX DE,HL********************************************************************** ; ; CPM_WR PERFORMS THE PHYSICAL WRITE FROM CPM_DMA TO  (CPM_DMA)= XFER ADDRESS ; EXIT - (IOPB.PB_STATO)= 0: OK, /0: ERROR ; ;********************************************************************************* ; CPM_RD: ; LD HL,LL_READ ; ; COMMON CODE ; CPM_RW: PUSH HL LD HL,CPM_TRK ; ; FALL E TO ; (BUF_TRK)= TRACK # TO WRITE TO ; (BUF_PSEC)= SECTOR # TO WRITE TO ; (BUF_DDT)= DDT PTR ; (BUF_DPB)= DPB PTR ; EXHE HOST DISK. ; ENTRY- (BUF_DSK)= DISK # TO WRITE TO ; (BUF_TRK)= TRACK # TO WRITE TO ; (BUF_SEC)= SECTOR # TO WRITE TO ;  LD HL,LL_READ ; ; COMMON CODE ; BUF_RW: PUSH HL LD HL,BUF_TRK JP RD_WR ;++++++++++++++++++++++++++++++++++++++++ ;FLGS LD C,(HL) ; ; FETCH DISK PARAMETER BLOCK ADDRESS ; INC HL ;DRV INC HL ;DPB_PTR LD E,(HL) INC HL LD D,( ;SOURCE/DEST SWAP ; RWMOVE: ; ; BC INITIALLY 128, DE IS SOURCE, HL IS DEST ; LDIR ; ; DATA HAS BEEN MOVED TO/FROMTHE DISK. ; ENTRY- (CPM_DSK)= DISK # TO WRITE TO ; (CPM_TRK)= TRACK # TO WRITE TO ; (CPM_SEC)= SECTOR # TO WRITE TO ; (CP********************** ; CPM_RD2: ; ; SET UP PTRS ; PUSH IX PUSH IY LD IX,(CUR_DDT) LD IY,(CUR_DPB) ; ; EXECUINTO COMMON XFER CODE ; ;**************************************************************************** ; ; SET UP IOPB FOIT - (IOPB.PB_STATO)= 0: OK, /0: ERROR ; ;**************************************************************************** ; BUF IX= DDT PTR ; IY= DPB PTR ; EXIT - (IOPB.PB_STATO)= 0: OK, /0: ERROR ; ;**************************************************++++++++++++++++++++++++++++++++++++ ; ; SELECT DRIVE FUNCTION ; LOG-ON - SET DISK PARAMETER BLOCK ; ENTRY- C= DRIVE # ; EHL) LD (CUR_DPB),DE ; ; FETCH DISK PARAMETER HEADER ADDRESS ; INC HL ;DPH PTR LD E,(HL) INC HL LD D,(HL) LD (C HOST BUFFER, IF NOT DIRECTORY THEN DELAY WRITE ; LD A,(WRTYPE) ;IF NOT DIRECTORY THEN DELAY WRITE CP A,WRDIR LD A,(IOPBM_DMA)= XFER ADDRESS ; IX= DDT PTR ; IY= DPB PTR ; EXIT - (IOPB.PB_STATO)= 0: OK, /0: ERROR ; ;**************************TE READ SECTOR ; CALL CPM_RD ; ; RESTORE PTRS & RETURN ; POP IY POP IX RET ;*********************************R EXECUTION ; ENTRY- HL= PTR TO IOPB IMAGE TRACK DATA ; IX= DDT PTR ; IY= DPB PTR ; (SP)= ADDRESS {LL_READ, LLWRIT} OF EX_FLSH: ; ; IF UNMODIFIED THEN RETURN ; LD A,(BUF_MOD) OR A,A RET Z ; ; ELSE SET PTRS TO BUFFER DATA ; PUSH IX ************************** ; BUF_WR: ; LD HL,LL_WRIT JP BUF_RW ;****************************************************= 0 IF NEW SELECT ; EXIT - HL= PTR TO DPT OR 0 FOR ERROR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++UR_DPH),DE EX DE,HL ;PUT DPH PTR IN HL FOR RETURN ; ; IF NOT FIRST SELECT OR LOGON INHIBITED THEN RETURN TABLE PTR ; L + PB_STATO) ;RETURN ANY ERRORS ANYWAY JR NZ,RW_RET ; ; IF ERROR THEN ABORT ; OR A,A JR NZ,RW_RET ; ; NO ERROR/DI************************************************** ; CPM_WR: ; LD HL,LL_WRIT JP CPM_RW ;*********************************************************************** ; ; CPM_RD PERFORMS THE PHYSICAL READ FROM THE DISK INTO CPM_DMA. ; ENTRY- (CPM_DECUTOR ; ;**************************************************************************** ; RD_WR: LD DE,IOPB + PB_TRKO LD BC PUSH IY LD IX,(BUF_DDT) LD IY,(BUF_DPB) ; ; WRITE THE BUFFER DATA ; CALL BUF_WR ; ; RESTORE THE PTRS ; POP I************************ ; ; RDBUF PERFORMS THE PHYSICAL READ FROM THE HOST DISK INTO BLKBUF. ; ENTRY- (BUF_DSK)= DISK # TO R+++++++++++ ; SELDSK: ; ; STORE DRIVE # FOR FUTURE USE ; LD A,C LD (CPM_DSK),A ; ; SAVE LOGON REQUEST FLAG ; LD A,(LOGRQ) ;0: LOGON, 1:INHIBIT OR A,C ;0: NORMAL, 1: INHIBIT CPL AND A,1 RET Z ; ; ELSE LOG ON DRIVE ; PUSH IX0 %+ &, !'- "(. #)/ $*0 ;SAVE REGS PUSH IY ; LD IX,(CUR_DDT) ;SET REGS LD IY,(CUR_DPB) ; LD (IY + DPB_SKT),0 ;ASSUME NO SKEW ; ; ATTEMPT ASSUME NO TRANSLATION AS DEFAULT ; CALL TRNONE ; ; IF SINGLE-DENSITY FLOPPY THEN ASSUME 3740 TRANSLATION ; LD A,(BLK XFER DISK PHYSICAL DATA TO TABLE ; LD A,(BLKBUF + ID_HEADS) ; SEL1: LD (IX + DDT_HDS),A ; ; RETURN DRIVE TABLE PTR ; ******************************************* ; ; HOME DRIVE - TREAT AS SEEK TRK 0 ; EXIT - BC= 0 ; ;**********************BC= SECTOR # ; ;**************************************************************************** ; SETSEC: LD (CPM_SEC),BC R++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; SECTRN: ; ; IF NO TRANSLATION THEN RETURN SECTOR++ ; LD LD (LOGIOPB + PB_DMAXO),A ; LD HL,LOGIOPB LD DE,IOPB LD BC,PB_STATO LDIR ; ; EXECUTE WITHOUT COMPENSATION ; JR L ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; LL_WRIT: ; ; IF STILL PROTECTED THEN  TO READ ID SECTOR ; CALL BUF_FLSH ;FLUSH BUFFER 1ST JR NZ,LOGERR ; CALL DISKLOG JR NZ,LOGERR ; ; IF NO ID SECTOR BUF + ID_FLGO) AND A,[1 SHL DF_DTDB] OR [1 SHL DF_HARDB] CALL Z,TR8 ; ; IF NO DYNAMIC SKEW TABLE SPECIFIED THEN TRANSLAT LD HL,(CUR_DPH) XOR A,A ;RETURN NO-ERROR JR LGDONE ; ; ; NO ID SECTOR, USE DEFAULT DATA ; LGDEF: ; ; IF NOT HA****************************************************** ; HOME: ; ; IF PENDING WRITE (BUFFER DIRTY) THEN IGNORE ; LD A,(ET ;**************************************************************************** ; ; SET TRANSFER ADDR ; ENTRY- BC= ADDRA,D ;IF TABLE ADDR = 0 THEN NO TRANSLATION OR A,E JP Z,NOTRAN ; ; ELSE CALCULATE NEW SECTOR FROM TABLE ; EX DE,HL AL_DO ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; LOW LEVEL READ ; ENTRY- IX= DDT PERROR ; LD A,(WR_PROT) OR A,A JR NZ,DO_ERR ; ; INHIBIT UPLOAD ; LD A,1 SHL PB_INHX LD (IOPB + PB_FLGO),A ; ; THEN USE DEFAULT DPB ; (NOTE: CONTROLLER HAS SET IT'S DISK DEFAULTS IN DEFBFR IN ALL CASES) ; ID SECTOR TYPES ARE: ; -1: NONION IS DONE ; LD A,(BLKBUF + ID_SKWO) LD (IY + DPB_SKT),A ;IF 0 THEN DISABLES SKEW ADDITION OR A,A JR Z,NO_SKW ; ; RD DISK THEN GO DO FLOPPY TEST ; BIT DDT_HDB,(IX + DDT_FLG) JR Z,LGCKFD ; ; ELSE USE HARD DISK DEFAULTS ; CALL TRNONBUF_MOD) OR A,A JR NZ,HOME2 ; ; ELSE PURGE BUFFER ; LD (BUF_ACT),A ; HOME2: ; ; JUST SET TRACK TO 0 ; LD BC,ESS ; EXIT - A= ? ; ;**************************************************************************** ; SETDMA: LD (CPM_DMA),BCDD HL,BC LD L,(HL) ; LD H,0 RET ; ; ; CONVERT FROM CP/M'S LOGICAL SECTOR {0..N-1} TO PHYSICAL SECTOR {1..N} ; NTR ; IY= DPB PTR ; EXIT - IOPB.PB_STATO, A= STATUS ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ CALCULATE DOWNLOAD BYTE COUNT ; LD A,(IY + DPB_PSH) ;USE SHIFT FACTOR {0:128, 1:256, 2:512, 3:1024} LD HL,128 ;START WITHE 0: OLD JADE DD ; 2: EXTENDED 3: PARTITIONED, 0-FILLED ; LD A,(IOPB + PB_ST2O) CP A,-1 JR Z,LGDEF ; ; ELSE IF TYELSE VALID SKEW TABLE ON DISK, TRANSFER TO SKEW BUFFER ; LD HL,BLKBUF ;CALCULATE PTR TO TABLE LD E,A LD D,0 ADD HL,DE E ; NO XLATE LD HL,HDPBK ; ; XFER DATA TO TABLES ; SEL2: LD DE,(CUR_DPB) ; USE DEFAULT TABLE LD BC,DPB_SZ LDIR ;0 ; ; FALL INTO SET TRACK ; ;**************************************************************************** ; ; SET TR ; LD A,(BUF_DMAB) ;FETCH BANK ADDRESS SET BY COLD START LD (CPM_DMAB),A ; ; DONE ; RET ;++++++++++++++++++++++OTRAN: LD HL,1 ADD HL,BC RET SUBTTL DISK SUPPORT ROUTINES ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; LL_READ: ; ; ENABLE UPLOAD ; XOR A,A LD (IOPB + PB_FLGO),A ; ; DISABLE DOWNLOAD ; LD HL,0 LD (IOPB 128 BYTES ; AND A,3 ;LIMIT TO 1024-BYTE SECTORS ; JR Z,LL_WR2 ;IF SHIFT_FACTOR == 0 THEN DONE ; LL_WR3: ADD HL,HL ;DOPE == 3 THEN OK ; CP A,3 JR NC,TYPE3_ID ; ; ELSE PAD UNINITIALIZED DATA TO 0 ; LD HL,BLKBUF + ID_PSHO ;FILL DATA WIT; EX DE,HL ;CALCULATE BUFFER PTR LD HL,(CUR_DPB) LD BC,DPB_SKT ADD HL,BC EX DE,HL ; LD BC,SKTSZ LDIR ; NO_SKW: LD A,(HL) ;HEADS VALUE JR SEL1 ; ; ; USE 8" FLOPPY DEFAULTS ; LGCKFD: CALL TR8 LD HL,SD8PBK JR SEL2 ; ; ERRACK # ; ENTRY- BC= TRACK # ; ;**************************************************************************** ; SETTRK: LD (++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SECTOR TRANSLATION FUNCTION ; ENTRY- DE= 0: NO XLATE, ELSE PTR TO ++++++++++++++++++ ; ; LOGON DISK FUNCTION ; ENTRY- IX= DDT PTR ; IY= DPB PTR ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++++ + PB_BCNTO),HL ; ; PASS READ SECTOR COMMAND ; LD A,PB_READC JP LL_RW ;+++++++++++++++++++++++++++++++++++++++++++UBLE COUNT DEC A JP NZ,LL_WR3 ; LL_WR2: LD (IOPB + PB_BCNTO),HL ; ; PASS WRITE COMMAND ; LD A,PB_WRITC ; ; FALLH 0S LD B,ID_FLGO - ID_PSHO ; PADIDL: LD (HL),0 INC HL DJNZ PADIDL ; ; PROCESS TYPE-3 ID SECTOR ; TYPE3_ID: ; ;  ; ; XFER DISK DATA TO DPB ; LD DE,(CUR_DPB) ;GET ADDR OF DPB LD HL,BLKBUF + ID_SPTO LD BC,DPB_SZ - 1 LDIR ; ; OR EXIT ; LOGERR: LD HL,0 ; ; DONE ; LGDONE: POP IY ;RESTORE REGS POP IX RET ;*********************************CPM_TRK),BC RET ;**************************************************************************** ; ; SET SECTOR ; ENTRY- XLATE TABLE ; BC= SECTOR # TO XLATE ; EXIT - HL= XLATED SECTOR OR BC + 1 ; BC= UNCHANGED ; A, DE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; DISKLOG: ; ; SET UP READ IOPB ; LD A,(BUF_DMAB) +++++++++++++++++++++++++++++++++ ; ; LOW LEVEL WRITE ; ENTRY- IX= DDT PTR ; IY= DPB PTR ; EXIT - IOPB.PB_STATO, A= STATUS INTO COMMON CODE ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; COMMON IOPB EXECUT0 %+ &, !'- "(. #)/ $*0ER ; ENTRY- A= COMMAND ; IX= DRIVE TABLE PTR ; IY= DPB PTR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++R ; IOPBDMP: LD A,(BUF_DMAB) ;SET BANK LD E,A ; LD HL,IOPB LD A,MF_DIOB ;USE DISPLAY IOPB DATA FUNCTION CALL XMROM  ;RETURN -1 TO BDOS OR A,A RET ; ; ; DISPLAY WRITE PROTECT ERROR MESSAGE ; DO_ERR: LD HL,WP_ERM CALL EDITOR JR ID DISK ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE IOPB PRIMITIVE + ; HDEXEC: EQU XPRIM SUBTTL JADE FLOPPY DRIVER ROUTINES ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++KEW ENABLED THEN TRANSLATE IT ; FD8SNGL: PUSH IY ;CALCULATE PTR TO TABLE POP HL LD DE,DPB_SKT ADD HL,DE ; LD DE,(I+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; FUNCTION DISPATCHER ; ENTRY- A= FUNCTION # ; EXIT - ################################################ ; ; BIOS FUNCTION TABLE ; ;################################################+++++++++++++++++ ; LL_RW: LD (IOPB + PB_CMDO),A ; ; OFFSET SECTOR ; LD HL,(IOPB + PB_SECO) LD A,L ADD A,(IX + DDT_ ; ; QUERY USER FOR OPTION ; LD HL,DSKEB CALL EDITOR ; ; GET USER RESPONSE ; CALL CI ;GET USER RESPONSE ; PUSOPBDMP ;**************************************************************************** ; ; SET 3740 SECTOR TRANSLATION PROC ; EXIT - A= 0: OK, /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; XPRIM: ; ;+++++++++++++++ ; ; JADE 8" FLOPPY DISK DRIVER FUNCTION ; ENTRY- IY= DRIVER TABLE PTR ; EXIT - A= 0: OK; /0: ERROR ; ;++++OPB + PB_SECO) ;SAVE CURRENT SECTOR FOR RESTORATION PUSH DE ; LD A,(IY + DPB_SKT) ;IF 1ST ENTRY == 0 THEN NONE OR A,A ;A= -1: ILLEGAL FUNCTION ; -2: ILLEGAL ARGUMENT ; 0..253: OK ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++############################ ; BFUNTBL: DW BF_RVERS ;0: RETURN VERSION # DW BF_RDRV ;1: RETURN MONITOR DRIVE # FOR CP/M DSOF) LD L,A LD A,H ADC A,(IX + DDT_SOF + 1) LD H,A LD (IOPB + PB_SECO),HL ; ; SET PHYSICAL DRIVE ; LL_DO: LD A,(H AF ;SAVE CHAR LD C,A ;ECHO CHAR CALL COC CALL CRLF ;NEW LINE POP AF ; AND A,5FH ;INSURE UPPER CASE ; ; IF REDURE ; ENTRY- (CUR_DPH)= MUST BE PTR TO DPH ; EXIT - DE, HL= ? ; ;********************************************************* EXECUTE THE PRIMITIVE IN ROM ; LD A,(BUF_DMAB) ;PRESET IOPB BANK LD E,A ; LD HL,IOPB CALL MR_XIOB ;EXECUTE THE FUN++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; FD8EXEC: ; ; SELECT SIDE FROM TRACK BIT 0 ;  (ILLEGAL SECTOR) JR Z,NOSKEW ; DEC DE ;ELSE USE SECTOR TO INDEX INTO TABLE LD D,0 ADD HL,DE LD A,(HL) ;FETCH TR+++++++++++++++++++++++ ; BIOFUNC: ; ; IF FUNCTION # NOT IN TABLE THEN RETURN -1 ; CP A,MAXFUNCS JR C,BF_OK ; LD ARIVE DW BF_DLOG ;2: DISABLE LOGON DW BF_ELOG ;3: ENABLE LOGON DW BF_STFMT ;4: SET DISK FORMAT ; MAXFUNCS EQU ($ - BFUNIX + DDT_DRV) LD (IOPB + PB_DRVO),A ; ; FETCH DRIVER VECTOR & EXECUTE DISK DRIVER ; LL_OPLP: LD HL,LL_OPRET ;PUT RETUETRY THEN TRY AGAIN ; CP A,'R' ;IF RETRY THEN RETURN TO CALLER JR Z,LL_OPLP ; ; ELSE IF ABORT THEN DO WARM BOOT ; C******************* ; TR8: LD DE,SDTRAN ; SETTR: LD HL,(CUR_DPH) LD (HL),E INC HL LD (HL),D RET ;************CTION ; OR A,A ;FUNCTION ERR? RET NZ ; ; RETURN THE COMMAND RESULTS STATUS ; LD A,(IOPB + PB_STATO) OR A,A RET LD HL,(IOPB + PB_TRKO) ;FETCH CURRENT TRACK PUSH HL ;SAVE CURRENT TRACK FOR RESTORATION ; LD A,(IX + DDT_HDS) ;IF HEADS =ANSLATED SECTOR # FROM TABLE LD (IOPB + PB_SECO),A ; NOSKEW: ; ; EXECUTE THE IOPB ; CALL XPRIM ; ; RESTORE THE MO,-1 RET ; BF_OK: ; ; ELSE COMPUTE TABLE ENTRY ; PUSH HL ;SAVE POSSIBLE DATA ; LD HL,BFUNTBL ADD A,A ADD A,L TBL) / 2 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN BIOS VERSION # - FUNCTIRN ADDRESS ON STACK PUSH HL ; LD L,(IX + DDT_EXE) ;FETCH DRIVER ADDRESS FROM TABLE LD H,(IX + DDT_EXE + 1) JP (HL) ; P A,'A' ;IF ABORT THEN RE-BOOT JP Z,0 ; ; ELSE IF DEBUGGER THEN EXECUTE IT ; CP A,'M' JP Z,MR_BRK ; ; ELSE IF IG**************************************************************** ; ; SET NO SECTOR TRANSLATION PROCEDURE ; EXIT - HL, DE= ?  ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; HARD DISK DRIVER FUNCTION ; ENTRY- IX== 1 THEN SKIP MODIFICATION DEC A JR Z,FD8SNGL ; LD A,(IOPB + PB_SECO + 1) ADD A,A ;BIT 15 -> BIT_BUCKET ; SRL H DIFIED IOPB SO RETRY WILL WORK ; POP HL ;RESTORE ORIGINAL SECTOR RES 7,H ;CLEAR SIDE BIT 1ST LD (IOPB + PB_SECO),HL  LD L,A LD A,0 ADC A,H LD H,A ; ; EXECUTE TABLE ADDRESS ; LD A,(HL) INC HL LD H,(HL) LD L,A ; EX (SP),HL ON #0 ; EXIT - HL= VERSION # IN BINARY {0.00,..655.35} ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++; DRIVER RETURNS HERE ; LL_OPRET: ; ; IF NO ERRORS THEN RETURN ZF ; RET Z ;IF NO_ERROR THEN RETURN ; ; PRINT ERRONORE THEN RETURN NO ERROR ; SUB A,'I' ;IF IGNORE THEN RETURN NO ERROR RET Z ; ; ELSE RETURN ERROR TO BDOS ; LD A,-1; ;**************************************************************************** ; TRNONE: LD DE,0 JR SETTR SUBTTL HAR DRIVER TABLE PTR ; EXIT - A= 0: OK; /0: ERROR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++RR L RRA ;TRK BIT 0 -> SECTOR BIT 15 LD (IOPB + PB_SECO + 1),A ; LD (IOPB + PB_TRKO),HL ;TRACK = RESIDUAL ; ; IF S; POP HL ;RESTORE ORIGINAL TRACK LD (IOPB + PB_TRKO),HL ; ; DONE ; RET SUBTTL BIOS FUNCTION CALLS ;+++++++++;PUT CALLER'S DATA IN HL, FUNCTION ADDR ON RET ; STACK, EXECUTE FUNCTION ADDRESS ON STACK ;############################+++++++++ ; BF_RVERS: ; ; RETURN VERSION ; LD HL,VERSN ; ; RETURN NO ERROR ; XOR A,A RET ;+++++++++++++++0 %+ &, !'- "(. #)/ $*0+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN MONITOR DRIVE # - FUNCTION #1 ; ENTRY- C= CP/M DRIVE 0: OK, /0: ERROR ; BC,DE,HL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; BF_DLOG:; ELSE ENABLE LOGON ; LD DE,DDT_FLG ;OFFSET TO FLAGS ADD HL,DE RES 0,(HL) ; ; RETURN NO ERROR ; XOR A,A RET F LOGON DID IT ; EX DE,HL ;HL=SRC LD DE,BLKBUF ;DEST LD BC,128 ;MUST BE IN 1ST 128 BYTES LDIR ; ; IF ID-TYPE NOT +++++++++++++++++++++ ; RETDVRT: ; ; ASSUME DRIVE 0 ; LD HL,DDT_0 ;START AT 1ST TABLE ; ; IF DRIVE == 0 THEN ALREAD******************************************************** ; ; NEWLINE PROCEDURE ; ;******************************************ONDITIONAL JUMP IS MODIFIED TO AN UNCONDITIONAL JUMP BY ; THE WARM BOOT ROUTINE IF THE CLOCK/CALENDAR BOARD IS NOT PRESENT ;  C,A LD B,A RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CDOS RETURN VERSION # {0..15} ; EXIT - A= {0..253}: MONITOR DRIVE # ; -2: DRIVE ERROR ; BC,DE,HL= ? ; ;++++++++++++++++++++++++++++++++++ ; ; FETCH TABLE PTR ; CALL RETDVRT ; ; IF ILLEGAL DRIVE THEN RETURN ERROR ; JR NZ,ARGERR ; ; ELSE SET LOGON D ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SET DISK FORMAT - FUNCTION #4 ; ENTRY- C3 THEN ERROR ; LD A,(BLKBUF + 1FH) ;FETCH TYPE SUB A,'3' RET C ; ; SET DATA USING LOGON CODE ; LD HL,BF_SRET ;FAKEY THERE ; LD A,C OR A,A RET Z ; ; ELSE IF ILLEGAL DRIVE THEN RETURN ERROR ; CP A,NDRVS JR C,RETDV2 ; LD HL,0 ********************************* ; CRLF: LD C,CR CALL COC LD C,LF JP COC IF INTCPTS SUBTTL ADDITIONAL FUNCTION IF NOT MODIFIED, THEN IT IS ALLWAYS FALSE (NOP). ; INHCLK: JR C,ILLEGC ; ; NOW CHECK FOR EXTENDED CALLS ; CP A,8DH ;IF FUNCTION ; MAKES CLOCK/CALENDAR WORK. ; EXIT - B= 1 ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; BF_RDRV: ; ; FETCH TABLE PTR ; CALL RETDVRT ; ; IF ILLEGAL DRIVE THEN ISABLE FLAG ; LD DE,DDT_FLG ;OFFSET TO FLAGS ADD HL,DE SET 0,(HL) ; ; RETURN NO ERROR ; XOR A,A RET ;++++++= CP/M DRIVE {0..15} ; E:HL= DISK DESCRIPTOR SECTOR IMAGE PTR ; EXIT - A= 0: OK, /0: ERROR ; BC,DE,HL= ? ; ;+++++++++++++ RETURN ADDRESS TO CALL INSIDE CODE PUSH HL ; PUSH IX ;BALANCE STACK, CODE WILL POP THESE PUSH IY JP TYPE3_ID ;EXECUTE OR A,A ;SET NZ RET ; ; ; ELSE COMPUTE TABLE PTR ; RETDV2: LD B,C LD DE,DDT_SIZ ; RETDVL: ADD HL,DE DJNZ RETDVLS TO SUPPORT CDOS PROGRAMS ;*************************************************************************** ; ; SYSTEM CALL INTER RETURN VERSION THEN RETURN IT JR Z,RETCVER ; CP A,90H ;IF NOT CLOCK THEN ERR JR C,ILLEGC ; JR Z,CLKCAL ;IF CALENDAR +++++++++ ; RETCVER: LD B,1 RET SUBTTL CLOCK ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++RETURN ERROR ; JR Z,BF_DROK ; ARGERR: LD A,-2 OR A,A RET ; ; BF_DROK: ; ; ELSE RETURN DATA ; LD DE,DDT_DRV ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; ENABLE LOGON - FUNCTION #3 ; ENTRY- C= CP/M DRIVE +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; BF_STFMT: ; ; SAVE REGS ; PUSH HL ;PTR ; ; SELECT INSIDE CODE ; ; DATA ALL SETUP BY LOGON CODE, RETURN NO ERROR ; BF_SRET: XOR A,A RET ;++++++++++++++++++++++++ ; LD A,(BUF_DMAB) LD E,A ; ; RETURN NO ERROR ; XOR A,A RET ;++++++++++++++++++++++++++++++++++++++++++++++++CEPT ROUTINE CHECKS FOR ILLEGAL BDOS CALLS & ; PRINTS MESSAGE IF ILLEGAL. ALSO IMPLEMENTS CDOS CLOCK/CALENDAR ; SYSTEM CALLSTHEN GET IT ; CP A,92H JR Z,CLKTIM ;IF TIME THEN GET IT ; ; ILLEGAL SYSTEM CALL ; ILLEGC: PUSH BC ;SAVE FUNCTION # ;++++++++++++++ ; ; RETURN CALENDAR FUNCTION 90H ; EXIT - A= DAY ; B= MONTH ; C= YEAR ; L= DAY OF WEEK ; ;++++++++++++;OFFSET TO DRIVE # ADD HL,DE LD A,(HL) ; ; RETURN NO ERROR ; CP A,A ;CLEAR ZF RET ;+++++++++++++++++++++++++++{0..15} ; EXIT - A= 0: OK, /0: ERROR ; BC,DE,HL= ? ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DISK ; LD E,1 ;INHIBIT LOGON CALL SELDSK ; ; IF DRIVE ERROR THEN RETURN ERROR ; POP DE ;PTR ; LD A,L ;HL= 0 ON E++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN DRIVER TABLE PTR FUNCTION ; ENTRY- C= DRIVE # ; EXIT - E:HL=++++++++++++++++++++++++++++ ; ; GET BANK NUMBER FUNCTION ; EXIT - A= BANK # ; ;+++++++++++++++++++++++++++++++++++++++++++ FOR ASMB. ; ;*************************************************************************** INTCPT: LD A,C ;CHECK CALL VALIDIT ; OUTPUT WARNING MESSAGE ; LD HL,ISCMSG ;OUTPUT WARNING CALL EDITOR ; ; OUTPUT FUNCTION # ; POP BC LD A,MF_PHX++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKCAL: LD A,MF_GCAL JP XMROM ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; DISABLE LOGON - FUNCTION #2 ; ENTRY- C= CP/M DRIVE {0..15} ; EXIT - A=+++++++ ; BF_ELOG: ; ; FETCH TABLE PTR ; CALL RETDVRT ; ; IF ILLEGAL DRIVE THEN RETURN ERROR ; JR NZ,ARGERR ; RROR OR A,H JR Z,ARGERR ; ; CLEAR BUFFER ; PUSH DE CALL BUF_FLSH POP DE RET NZ ; ; MOVE DATA TO BUFFER AS I DRIVER TABLE BASE PTR ; NZ= ILLEGAL DRIVE (HL= 0) ; A, B, C= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; GETBNK: LD A,MF_GBNK JP MR_FUN SUBTTL NON-DISK PROCEDURES ;*******************Y CP A,41 ;IF <= 40 THEN OK ; BDOSV EQU $ + 1 JP C,BDOS + 11H ;THIS ADDR MODIFIED BY WARM BOOT RTN ; ; THE FOLLOWING CB CALL XMROM ; ; OUTPUT NEW LINE ; CALL CRLF ; ; RETURN NULLS ; XOR A,A ;BC = HL = A = 0 LD L,A LD H,A LD+++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN TIME FUNCTION 92H ; EXIT - A= SECONDS ; B= MINUTES ; 0 %+ &, !'- "(. #)/ $*0 C= HOURS ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKTIM: LD A,MF_GTIM JP XMROOT READY ; FFH: CHAR READY ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CNSCK: LUNCH DRIVER ; ENTRY- C= CHAR TO OUTPUT ; ;**************************************************************************** ; PUEXT PTR (BIT 7= 1: TERMINATOR) ; EXIT - REGS= ? ; ;**************************************************************************############################################## ; ; DISK DRIVER TABLES (DDT) ; ;#############################################R TABLE RECORD ; ENTRY- #DADD= DRIVER ADDRESS ; #PD= PHYSICAL DRIVE # ; #FLG= DRIVE FLAGS ; #DPB= DPB ADDRESS ; #DPH= DE DDT_4: ALLDRV FD8EXEC,0,0,D4DPB,D4DPH,1,0 ; F DDT_5: ALLDRV FD8EXEC,1,0,D5DPB,D5DPH,1,0 ENDIF IF BOOT = 11H ; ########################################## ; ; MESSAGES ; ;###############################################################M ENDIF ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; MONITOR ROM EXECUTER ; ENTD A,MF_CIS JP XMROM ;**************************************************************************** ; ; CONSOLE OUTPUT ;NCH: RET ;**************************************************************************** ; ; PRINTER DRIVER ; ENTRY- C= CH** ; EDITOR: CALL GETBNK LD E,A LD A,MF_PUTS JP XMROM SUBTTL INITIALIZED DATA ;############################################################### ; STRUCT 0 DDT_EXE DS 2 ;START ADDRESS OF DISK DRIVER DDT_FLG DS 1 ;FLAGS BIT DEF. ; 0PH ADDRESS ; #HDS= HEADS ; #SOF= SECTOR OFFSET ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@A DDT_0: ALLDRV HDEXEC,6,10H,D0DPB,D0DPH,4,0 ; B DDT_1: ALLDRV HDEXEC,6,12H,D1DPB,D1DPH,4,8000H ; C DDT_2: ALLDRV HDEXE############# ; MSGLE: DM CR,LF,'LOAD ERROR' ; DSKEB: DM CR,LF,'Abort, Ignore, Retry, (BDOS) - ' ; WP_ERM: DM CR,LF,'W-PRORY- A= FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; XMROM: EQU MR_FUN  ENTRY- C= CHAR TO OUTPUT ; ;**************************************************************************** ; COC: LD A,MF_CAR TO OUTPUT ; ;**************************************************************************** ; LO: LD A,MF_LO JP XMROM ############################################ ; ; 3740 SECTOR TRANSLATION TABLE ; **** CP/M SINGLE DENSITY **** ; ;######### 1: INHIBIT LOGON ; 1..3 PARTITION # {0,..7} DDT_HDB EQU 4 ;1: HARD DISK DRIVE ; DDT_DRV DS 1 ;PHYSICAL DRIVE # DDT_@@@@ ; ALLDRV MACRO #DADD,#PD,#FLG,#DPB,#DPH,#HDS,#SOF DW #DADD ;DRIVER EXECUTION ADDR DB #FLG ;FLAGS DB #PD ;MONITORC,4,10H,D2DPB,D2DPH,4,0 ; D DDT_4: ALLDRV FD8EXEC,0,0,D4DPB,D4DPH,1,0 ; E DDT_5: ALLDRV FD8EXEC,1,0,D5DPB,D5DPH,1,0 T Error!' ; IF INTCPTS ISCMSG: DM CR,LF,'ILL SYS CALL, #= ' ENDIF ;##############################################SUBTTL CHAR I/O ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CONSOLE INPUT ; EO JP XMROM ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; READER DRIVER - DUMMY ; E ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN LIST DEVICE STATUS ; EXIT - A= 0################################################################### ; SDTRAN: GXLATE 26,6 ;##############################DPB DS 2 ;DPB ADDRESS FOR THIS DRIVE DDT_DPH DS 2 ;DPH ADDRESS FOR THIS DRIVE ; ; THE FOLLOWING MAY BE BROUGHT OFF DISK DES PHYSICAL DRIVE # DW #DPB ;DISK PARAMETER BLOCK PTR DW #DPH ;DISK PARAMETER HEADER PTR DB #HDS ;HEADS DW #SOF ;SECTOENDIF IF BOOT = 3 ; A DDT_0: ALLDRV FD8EXEC,0,0,D0DPB,D0DPH,1,0 ; B DDT_1: ALLDRV FD8EXEC,1,0,D1DPB,D1DPH,1,0 ; C############################## ; ; DEFAULT 8" FLOPPY DISK PARAMETER BLOCK ; IBM 3740 SINGLE DENSITY FORMAT ; ;#############XIT - A= CHAR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CI: LD A,MF_CI JP XMROM XIT - A= CTRL-Z ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; READER: LD A,CTRLZ ;FAKE : BUSY, FFH:READY ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; LISTST: LD A,MF_LOS ############################################## ; ; COMMON I/O PARAMETER BLOCK ; ;###########################################CRIPTOR OR FROM DEFAULT TABLES ; DDT_HDS DS 1 ;HEADS DDT_SOF DS 2 ;SECTOR OFFSET ; ; DEFINE THE STRUCTURE SIZE ; DDT_SIR OFFSET ; ENDM IF BOOT = 10H ; A DDT_0: ALLDRV HDEXEC,4,10H,D0DPB,D0DPH,4,0 ; B DDT_1: ALLDRV HDEXEC,4,12H,D1D DDT_2: ALLDRV HDEXEC,4,10H,D2DPB,D2DPH,4,0 ; D DDT_3: ALLDRV HDEXEC,4,12H,D3DPB,D3DPH,4,8000H ; E DDT_4: ALLDRV HDEXEC############################################################### ; SD8PBK: DW 26 ;SECTORS PER TRACK DB 3 ;BLOCK SHIFT FACTO ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN CONSOLE STATUS ; EXIT - A= 0: NEOF ; ; FALL INTO PUNCH RETURN ; ;**************************************************************************** ; ; PJP XMROM ;**************************************************************************** ; ; MESSAGE EDITOR ; ENTRY- HL= T################################# ; IOPB: REPT PB_SIZE LIST OFF DB 0 LIST ON ENDM ;##############################Z DS 0 ENDM ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; MACRO TO DEFINE THE DRIVEPB,D1DPH,4,8000H ; C DDT_2: ALLDRV HDEXEC,5,10H,D2DPB,D2DPH,4,0 ; D DDT_3: ALLDRV HDEXEC,5,12H,D3DPB,D3DPH,4,8000H ; ,5,10H,D4DPB,D4DPH,4,0 ; F DDT_5: ALLDRV HDEXEC,5,12H,D5DPB,D5DPH,4,8000H ENDIF ;##################################R DB 7 ;BLOCK MASK DB 0 ;NULL MASK DW 242 ;DISK SIZE -1 DW 63 ;DIRECTORY MAX DB 11000000B ;ALLOC 0 DB 0 ;ALLOC 0 %+ &, !'- "(. #)/ $*01 DW 16 ;CHECK SIZE DW 2 ;TRACK OFFSET DB 0 ;PHYSICAL RECORD SHIFT FACTOR DB 0 ;PHYSICAL RECORD MASK DW 0 ;LOGICAACK OFFSET (OFF) DB 1 ;PHYSICAL RECORD SHIFT FACTOR (PSH) DB 1 ;PHYSICAL RECORD MASK (PRM) DW 0 ;LOGICAL DRIVE SECTO ;;" DW 0 ;;" DW DIRBF ;;DIRECTORY BUFFER PTR DW D#D(DD)DPB ;;DRIVE PARAMETER BLK PTR IF (DSK_#D(DD) AND 0F0H) = 10B -1 ;/0: WRITE PROTECTION ENABLED ; ; LAST OF INITIALIZED CODE READ FROM DISK ; BIOSND EQU $ SUBTTL UNINITIALIZED D BLOCKING BUFFER MAINTENANCE ; BUF_PSEC DS 2 ;BUFFER PHYSICAL SECTOR BUF_ACT DS 1 ;0: BUFFER FLUSHED, /0: DATA IN BUFFER B##################################################### ; ; VARIABLES ; ;###################################################ODE) LSTINC EQU FALSE ;LIST INCLUDE FILES USEMON EQU TRUE ;USE MONITOR ROM I/O ROUTINES IF TRUE INTRPTS EQU TRUE ;ENABLE I C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; D SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ; E JADE 8" FLOPPY PHYSICAL DRIVEL DRIVE SECTOR OFFSET DB 0 ;SKEW = 0 ; ; DEFAULT DISK PHYSICAL PARAMETERS ; DB 1 ;HEADS ;#######################R OFFSET (SOF) DB 0 ;SKEW = 0 ; ; ; DB 4 ;HEADS ;#################################################################H 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 CATA AREA ;############################################################################ ; ; THE FOLLOWING DATA MUST RESIDE IUF_MOD DS 1 ;0: BUFFER CLEAN, /0: BUFFER DIRTY (MODIFIED) ; BUF_DDT DS 2 ;BUFFER DDT PTR BUF_DPB DS 2 ;BUFFER DPB PTR ; RSF######################### ; CUR_DPB DS 2 ;DRIVE TABLE PTR CUR_DDT DS 2 ;DRIVE DRIVER TABLE BASE ADDRESS PTR CUR_DPH DS 2 ;DPNTERRUPT PROCESSING WHISTLE INTCPTS EQU TRUE ;ENABLE SYSTEM CALL INTERCEPT WHISTLE BOOT EQU 10H ;10H: HARD DISK, 3: 8" FLOPP 0 ; F JADE 8" FLOPPY PHYSICAL DRIVE 1 ENDIF IF BOOT = 3 ; A JADE 8" FLOPPY PHYSICAL DRIVE 0 ; B JADE 8" FLOPPY##################################################### ; ; DEFAULT 8" HARD DISK PARAMETER BLOCK ; ;##################################### ; ; DRIVE PARAMETER HEADER AREA ; 1 PER DRIVE ; ;##############################################################LUSTER ALLOCATION BIT MAP PTR LIST OFF ENDM ; ; DEFINE THE DATA ; DD DL 1 REPT NDRVS LIST OFF ALLDPH 0123456789AN THIS ORDER TO MATCH THE IOPB DATA ; ;############################################################################ ; ; CPLAG: DS 1 ;0: NO PREREAD REQ'D, /0: PREREAD REQ'D READOP: DS 1 ;0: WRITE OPERATION, 1: READ OPERATION WRTYPE: DS 1 ;WRITE OPER TITLE CUSTOMIZED BIOS FOR M5B LIST NOCOND ;============================================================================ ; Y, 20H: 5" FLOPPY DEBUG EQU FALSE ;TRUE TO DUMP THE IOPB DATA TO PRINTER FORM ;****************************************** PHYSICAL DRIVE 1 ; C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; D SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 0 ; E SIDE 0 ################################################## ; HDPBK: DW 128 ;SECTORS PER TRACK (LOGICAL) (SPT) DB 5 ;BLOCK SHIFT FA############## ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE A DISK PARAMETERBCDEF DD DL DD + 1 LIST ON ENDM ;############################################################################ ; ; LO/M IOPB OVERLAY ; CPM_DSK DS 1 ;LOGICAL DRIVE CPM_TRK DS 2 ;LOGICAL TRACK NUMBER CPM_SEC DS 2 ;LOGICAL SECTOR NUMBER DS 1 ATION TYPE FROM BDOS: ; 0: WRITE TO ALLOCATED (USED) BLOCK (PREREAD) ; 1: WRITE TO DIRECTORY (PREREAD & WRITE) ; 2: ; ASSEMBLY PARAMETERS ; ;============================================================================ FALSE EQU 0 TRUE EQU N********************************** ; ; CUSTOMIZED BIOS FOR M5B ; (c) 1981 GRH Electronics, CUPERTINO, CA ; ;**********& 1 OF HARD DISK PHYSICAL DRIVE 1 ; F SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ENDIF IF BOOT = 20H ; A JADE 5" FLOCTOR (BSH) DB 31 ;BLOCK MASK (BLM) DB 1 ;NULL MASK (EXM) DW 1015 ;DISK SIZE (CLUSTERS -1) (DSM) DW 1152 / 2 ;DIR TABLE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ALLDPH: MACRO #D LIST ON DGON IOPB OVERLAY ; ;############################################################################ ; LOGIOPB: DB PB_LOGC ;CO;FLAGS CPM_DMA DS 2 ;XFER ADDR CPM_DMAB DS 1 ;XFER BANK ; ; ; BUFFER IOPB OVERLAY ; BUF_DSK DS 1 ;BUFFER DISK NUMBER BWRITE TO UNALLOCATED (UNUSED) BLOCK (NO ; PREREAD REQ'D) ; ; UNA_CNT: DS 1 ;# SECTORS REMAINING IN BLOCK (CLUSTER) UNA_DOT FALSE ;============================================================================ ; ; CONDITIONAL ASSEMBLY FLAGS ; ;****************************************************************** ; ; CONFIGURATION: ; ; CPM ; DRIVE USAGE IF BOOT = 1PPY PHYSICAL DRIVE 0 ; B JADE 5" FLOPPY PHYSICAL DRIVE 1 ; C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; D SIDE 2 & 3 OFECTORY MAX (DRM) DB 0FFH ;ALLOCATION 0 (AL0) DB 10000000B ;ALLOCATION 1 (AL1) DW 0 ;CHECK SIZE (CKS) DW 2 ;TR#D(DD)DPH: ;DRIVE PARAMETER HEADER FOR DRIVE #D(DD) DW 0 ;;SECTOR TRAN TBL (OR 0 IF NO XLATE) DW 0 ;;SCRATCH AREA DW 0MMAND DB 0 ;DRIVE DW 0 ;TRACK DW ID_SECT ;SECTOR DB 0 ;FLAGS DW BLKBUF ;DMA DB 0 ;BANK DW 0 ;COUNT ; WR_PROT DUF_TRK DS 2 ;BUFFER TRACK NUMBER BUF_SEC DS 2 ;BUFFER SECTOR NUMBER DS 1 ;FLAGS BUF_DMA DS 2 BUF_DMAB DS 1 ;BANK # ; ; ;SK: DS 1 ;LAST UNALLOC DISK UNA_TRK: DS 2 ;LAST UNALLOC TRACK UNA_SEC: DS 2 ;LAST UNALLOC SECTOR ;#######################============================================================================ SHORT EQU FALSE ;SHORT BIOS (REMOVES UNESENTIAL C0H ;HARD DISK BOOT CONFIG. ; A SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; B SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 0 ;  HARD DISK PHYSICAL DRIVE 0 ; E SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; F SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ; 0 %+ &, !'- "(. #)/ $*0 G JADE 8" FLOPPY PHYSICAL DRIVE 0 ; H JADE 8" FLOPPY PHYSICAL DRIVE 1 ENDIF ; ;***************************************- 22 APR 83 GRH ; CHANGED DEFINITIONS TO ALLOW BIG DIRECTORIES. ; DISALLOWED DRIVES C & D. ; 2.29 - 3 SEP 83 GRH ; Changformity in ; parameter passing between hard disk & JADE floppy IOPBs. ; Vector I/O routines to monitor rom routines. ; 2.0wn to 60k. ; 3.01 26 JUN 88 GRH ; Remove 5" floppy support. Implement in CP/M-86 BIOS. ; Change single function to return drPB structure in preparation for deblocking. ; 3.05 11-3-88 GRH ; Change included data to update IOPB.PBSTAT to new configuraFLG. ; 3.08 2-22-91 GRH ; Remove references to THIS_BNK & use monitor function #7 instead. ; Add track-head shift factor to========================================================================= ; ; INCLUDE JDDCONT.DEF ; INCLUDE COMIOPB3.DEF TE: EQU 1024 CPMSZ: EQU KBYTE * NKSYS CPMBS: EQU CPMSZ - (20 * KBYTE) ; CP/M BIAS VALUE CCP: EQU CPMBS + 3400H ;ADDR OF CCP ********************** ; REVISIONS: ; ; 2.2.0 - RELEASE ; 2.2.3 - SWAPPED DCM & BIOS SECTORS ON DISK, ALLOWING A ; LAed Rev # for blocked DCM. Enables IBM system 34 ; 256 bytes per sector disks to be read. ; 1.10 - 23 SEP 83 GRH ; Move cloc3 - 4 JUN 84 GRH ; Add bells & whistles again. ; Move to 61k system. ; 2.04 - 30 MAR 85 GRH ; Implemented hard disk drivive table ptr into a BIOS function ; call using restart instruction. ; Change LOGON to specify the ID sector & track. At samtion. ; 3.06 1-28-89 GRH ; Revised primitive calling procedures to use the monitor rom function ; rather than swapping Rom DPBs for future use. ; 3.09 5-15-91 GRH ; Change 8" floppy side select to track bit 0. Move calculation from ; DCM8 to CB ; INCLUDE DISKS3.DEF ; INCLUDE BDIR.DEF ; INCLUDE MONBOARD.DEF ; INCLUDE ISHA.DEF ; INCLUDE B:M5ZF101.DEF ; ;====BDOS: EQU CPMBS + 3C00H ;ADDRESS OF BDOS BIOS: EQU CPMBS + 4A00H ;ADDRESS OF BDOS BIOSR: EQU 1000H - BIOS ; ; PAGE 0 LOCATRGER BIOS ALLOCATION ON THE DISK. ; 2.2.4 - ADDED NAKED TERMINAL DRIVERS & IOBYTE IN ; ANTICIPATION OF THE MONITOR. ALSO, k-calendar routines to ROM. Add Interrupt handler ; (Mode 2). Change Revision display of sign-on (separate CBIOS rev). ; 2.00 e 1 as C: & D:. ; Implemented the Logon function for the hard disk. ; Implemented user friendly disk error options: Abort, Rete time, fix bug ; which did not specify the logon track. ; 3.02 7 JUL 88 GRH ; Add '?' to include file names. ; Change hs itself. ; 3.07 11-25-90 GRH ; Modify for Ver. 1.22 Monitor. ; Fix bug in 8" Hard Disk table which benignly (at current leIOS. ; Remove IOPB ptr passing in IX redundancy. ; Change DPB track-head shift factor to Sector Offset like track ; offset. ======================================================================== ; LIST OFF *INCLUDE JDDCONT.DEF *INCLUDE COMIOIONS ; PAGE0: EQU 0 ;START OF CP/M RAM IOBYTE: EQU PAGE0 + 3 ;IOBYTE ADDR DEFDRV: EQU PAGE0 + 4 ;DEFAULT DRIVE PARAM ADDR ALL REFERENCES ; REQUIRING THE I/O PROMS TO BOOT HAS BEEN REMOVED. ; 2.2.5 - RECONFIGURE FOR 62K SYSTEM. ; 2.2.6 - 20 FEB- 24 MAR 84 GRH ; Modify for hard disk ; 2.01 - 28 APR 84 GRH ; Change hard disk DPB to reflect half size directory, but ry, Ignore. ; Solved warm boot hang problem by reseting host adapter if busy. ; 3.00 - 26 JAN 87 GRH ; Implemented new commard disk system tracks directory reference to new format. ; Correct bug in drivers which caused retry to fail. (sector remainedvel) ; caused the drive table to have bad data (default table was missing ; the 2 deblocking extension bytes). ; Implement Disk partitioning will add this value to sector word. It ; will be stored in the ID sector data to be dynamic. ; ; 3.10 5-20PB3.DEF *INCLUDE DISKS3.DEF *INCLUDE BDIR.DEF *INCLUDE MONBOARD.DEF *INCLUDE ISHA.DEF *INCLUDE B:M5ZF101.DEF LISTBDOSJV EQU PAGE0 + 5 ;BDOS SYSTEM CALL ENTRY THIS_BNK EQU PAGE0 + 001BH ;BANK # OF THE CURRENT BANK DK_BDRV EQU 0041H ;BOOT D 83 ; DOUBLE D REV C UPGRADE. CHANGE BOARD STATUS PORT BITS. ; 2.2.7 - 8 MAR 83 GRH ; ADDED CLOCK/CALENDAR DRIVER, SYSTEM CALkeep ; allocation for 1k directory ; 2.02 - 2 JUN 84 GRH ; Change floppy disk drivers to relate to ISASI control of JADE ;on IOPB code & Jade floppy firmware support. ; Implemented disk drive driver tables and new function to return ; a ptr to a d ; corrupted) ; Stubbed out new Clock routines for present. ; 3.03 31 JUL 88 GRH ; Unstub Clock routines. ; 3.04 6 AUG data xfer inhibit schemes with PB_FLG & PB_BCNT. ; Add pick-up of THIS_BNK data in all iopb cases. ; Remove clock buffer set/r-91 GRH ; Change LOGON to attempt to recover from old disks better, using ; DCM8301 version controller firmware. ; VERSN  ON ;============================================================================ ; ; DISK OPERATING SYSTEM ADDRESSES RIVE # FROM PROM DEFBFR EQU PAGE0 + 80H ;DEFAULT BUFFER ; ; BIOS FUNCTION CALL RESTART VECTOR ; BFUNRST EQU 28H BFUNRSV L INTERCEPT, ; ILLEGAL SYSTEM CALL MESSAGE, CHANGED BIOS SIZE TO END ; OF INITIALIZED DATA AREA. RESTRUCTURE MODULES. ; 2.28  FDC. ; Change IOPB sector value from physical sector (1..n) to logical ; sector value (0..n-1). This maintains more unirive table. ; Removed init of IOBYTE. ; Implemented 5" floppy driver. ; Implemented use of ROM primitives. ; Moved system do88 GRH ; Remove floppy side select from BIOS & move to controller. ; Implement new ID sector format. ; Implement CP/M 3.0 Dead system calls. ; 12-5-90 GRH ; Remove IX IOPB ptr passing to disk drivers. ; 1-13-91 GRH ; Fix bug which corrupted PB_EQU 310 ; ;**************************************************************************** SUBTTL SYSTEM DECLARATIONS ;===; ;============================================================================ ; NKSYS: EQU 60 ;SYSTEM SIZE IN K BYTES KBYEQU PAGE0 + BFUNRST BFUNRSI EQU 0C7H + BFUNRST ; TPA: EQU 100H ;========================================================0 %+ &, !'- "(. #)/ $*0==================== ; ; OTHER DECLARATIONS ; ;============================================================================ ================================ ; ; ASCII CHARS ; ;========================================================================M LIST ON ENDM ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; INITIALIZE VERSION TDOS JP CNSCK ;GET CONSOLE STATUS JP CI ;CONSOLE INPUT JP COC ;CONSOLE OUTPUT JP LO ;PRINTER OUTPUT JP PUNCH JP R OF THE BIOS. ; ;############################################################################ ; DB 0 ;Z80 CPU DB 0 ;SPAFROM BOOT MUST SET ALL BIOS PARAMS ; ;---------------------------------------------------------------------------- ; INIT:  DB 'K CP/M-80 Vers 2.2',CR,LF DB 'M5b CBIOS Vers ' PVERS VERSN DM CR,LF IF $ > (DIRBF + SECSZ) CONMSG **** ERRUPTS ; IN A,(M2_STAT) OR A,M2_IEN OUT (M2_STAT),A EI ENDIF ; ; LOG ON DRIVE TO INIT TABLES ; LD A,(DK_BDRV ; MR_RNUM EQU 0 ;INTERIM DEFINITION FOR INTERRUPT ROM SWAP ; SECSZ: EQU 128 NDRVS: EQU 6 IF BOOT = 10H ; ; 8" HARD==== ; LF: EQU 0AH CR: EQU 0DH CTRLZ: EQU 1AH ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@EXT IN RAM MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; PVERS MACRO #VERS DD DL EADER JP HOME ;HOME SELECTED DRIVE JP SELDSK ;SELECT DISK DRIVE JP SETTRK ;SET TRACK # JP SETSEC ;SET SECTOR # JP RE BIOSSZ: DW BIOSND - BIOS ;BIOS MODULE SIZE IN BYTES BIOSST: DW BIOS ;BIOS MODULE LOAD ADDR FOR SBD ; ; CONTINUE ON WIT; ; SET TEMPORARY STACK ; LD SP,DEFBFR ;USE PAGE 0 FOR STACK ; ; INIT DEFAULT DRIVE ; LD A,(DK_BDRV) ;USE DRIVE # PWARNING! COLD INIT CODE BIGGER THAN DIR BUFFER **** ELSE DS DIRBF+SECSZ-$ ;FILL OUT DIRECTORY BUFFER TO 1 SECTOR SIZE ) AND A,3 ;MODULO 4 LD C,A LD E,0 CALL SELDSK LD A,L ;IF ERROR THEN ABORT OR A,H JR Z,WEROR ; ; READ BOOT DI DISK BOOT DATA ; STHD EQU 0 ;START LOGICAL DRIVE OF HARD DISK NDHD EQU 3 ;LAST LOGICAL DRIVE OF HARD DISK ST8FD EQU 4 ;S@@@@ ; ; GENERATE THE TRANSLATION TABLE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#VERS IF DD > 9999 DB (DD / 10000) + '0' DD DL DD % 10000 ENDIF IF DD > 999 DB (DD / 1000) + '0' DD DL DD % 10SETDMA ;SET TRANSFER ADDR JP DISKRD ;PERFORM DISK READ JP DISKWR ;PERFORM DISK WRITE JP LISTST ;RETURN LIST STATUS JH INIT ; INIT1: JR INIT ;############################################################################ ; ; DIRECTORY SECASSED IN PAGE 0 AND A,3 LD (DEFDRV),A ; ; SEND SYSTEM SIGN-ON ; CLOGO: LD HL,MSGSO CALL EDITOR ; ; MODIFY COLD S ENDIF ;---------------------------------------------------------- ; ; WARM REBOOT ENTRY LOADS CCP,BDOS FROM DISK & ; SERECTORY ; LD BC,DEFBFR ;SET XFER ADDRESS (USE DEFAULT BUFFER) CALL SETDMA ; LD BC,BD_SEC ;SET DIRECTORY SECTOR CALL TART LOGICAL DRIVE OF 8" FLOPPY ND8FD EQU 5 ;LAST LOGICAL DRIVE OF 8" FLOPPY ENDIF IF BOOT = 3 ; ; 8" FLOPPY BOOT @ ; GXLATE MACRO #SECTORS, #SKEW LIST OFF NXTSEC DL 1 ;;START WITH SECTOR 1 LOWEST DL 1 ;; REPT #SECTORS LIST ON D00 ENDIF DB (DD / 100) + '0' DB '.' DB ((DD % 100) / 10) + '0' DB (DD % 10) + '0' ENDM SUBTTL BIOS CODE ORP SECTRN ;TRANSLATE SECTOR JP BIOFUNC ;EXECUTE FUNCTION CALL ;#########################################################TOR BUFFER STARTS HERE AFTER CRUNCHING COLD START ; CODE. THIS BUFFER IS USED BY THE CP/M DIRECTORY CHECK ROUTINES THAT ; CHTART VECTOR TO WARM START ; LD HL,(BIOS+4) LD (BIOS+1),HL ; ; BOOT CCP & BDOS ; JR WARM ;######################TS UP VARIABLES ; ;---------------------------------------------------------- ; WARM: ; ; SET TEMPORARY STACK ; LD SPSETSEC ; LD BC,0 ;SET TRACK TO 0 CALL SETTRK ; CALL DISKRD JR NZ,WEROR ; ; CHECK FOR VALID BOOT DIRECTORY ; LDDATA ; STHD EQU 2 ;START LOGICAL DRIVE OF HARD DISK NDHD EQU 5 ;LAST LOGICAL DRIVE OF HARD DISK ST8FD EQU 0 ;START LOGICAB NXTSEC LIST OFF NXTSEC DL NXTSEC + #SKEW ;ADD SKEW FACTOR ;; IF NXTSEC > #SECTORS ;CHECK FOR OVERFLOW NXTSEC DL NXTSEG BIOS ;---------------------------------------------------------------------------- ; ; BIOS JUMP VECTOR TABLE ; ;------################### ; ; THE FOLLOWING BOOT DATA MUST RESIDE AS DEFINED RIGHT BEFORE THE COLD ; INIT ROUTINE START AND MUST BEECK FOR DISK CHANGE. ; ;############################################################################ ; DIRBF: EQU $ ;BUFFER###################################################### ; ; SIGN-ON MESSAGE ; ;##############################################,DEFBFR IF INTRPTS ; ; SET INTERRUPT VECTOR TABLE BASE ; LD A,HIGH INTABL LD I,A ; ; SET INTERRUPT MODE TO 2 ;  A,(DEFBFR) CP A,86H JR C,WEROR ; ; SET UP TO LOAD CCP/BDOS ; LD HL,(DEFBFR + BD_SBDSS) ;PREFETCH BDOS TRK/SECTOR PL DRIVE OF 8" FLOPPY ND8FD EQU 1 ;LAST LOGICAL DRIVE OF 8" FLOPPY ENDIF ;============================================C - #SECTORS ;; IF NXTSEC <= LOWEST ;CHECK FOR REPEAT NXTSEC DL LOWEST + 1 LOWEST DL NXTSEC ENDIF ENDIF ;; END---------------------------------------------------------------------- ; JP INIT1 ;COLD START ENTRY JP WARM ;RELOAD CCP/B IN THE 1ST SECTOR. THESE 2 WORDS ARE ; REFERENCED BY THE BOOT LOADER CODE IN ORDER TO DETERMINE THE LOAD ADDRESS ; AND LENGTH BEGINNING ;---------------------------------------------------------------------------- ; ; INIT - COLD START ENTRY ############################## ; MSGSO: DB CR,LF DB CPMSZ / (KBYTE * 10) + '0' DB (CPMSZ MOD (KBYTE * 10)) / KBYTE + '0'  IM 2 ; ; ENABLE INTERRUPT VECTOR 7 ; IN A,(M2_IMASK) AND A,7FH OUT (M2_IMASK),A ; ; FINALLY ENABLE VECTORED INTUSH HL ; LD HL,(DEFBFR + BD_SCCPS) ;FETCH CCP TRK/SECTOR LD C,L LD B,0 CALL SETSEC ; LD C,H CALL SETTRK ; LD BC0 %+ &, !'- "(. #)/ $*0,CCP CALL SETDMA ; ; READ CCP/BDOS ; WREAD: CALL DISKRD JR NZ,WEROR ;IF ERROR THEN EXIT ; ; NEXT SECTOR ; LD HL ; ; ; WARM BOOT ERROR, OUTPUT MSG & HALT ; WEROR: LD HL,MSGLE ;OUTPUT ERROR MESSAGE CALL EDITOR HALT ; ; ; BOOT MF_CSYN ;TEST FOR BOARD PRESENT CALL XMROM ; ; IF CLOCK PRESENT THEN TURN ON CLOCK DRIVE ; OR A,A LD A,38H ;COND. JRA ; ; PASS READ COMMAND ; LD A,PB_READC ;SELECT READ OP JP DISKOP ;+++++++++++++++++++++++++++++++++++++++++++++++ ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; SELDSK: ; ; ASSUME ERROR ; LD HL,0DE ; ; IF NOT FIRST SELECT OR LOGON INHIBITED THEN RETURN TABLE PTR ; LD A,(LOGRQ) OR A,C CPL AND A,1 RET Z ; ; ELSE XFER ID SECTOR DATA TO TABLES ; IDOK: CALL TRNONE ;ASSUME NO TRANSLATION ; ; IF HARD DISK OR DOUBLE DENSITY THEN N JR NC,LGCKFD ; ; ELSE USE HARD DISK DEFAULTS ; CALL TRNONE ; NO XLATE LD HL,HDPBK ; ; XFER DATA TO TABLES ; S,BTSEC INC (HL) ; LD DE,(IOPB + PB_BCNTO) ;SECSZ ;DMA := DMA + SECTOR SIZE LD HL,(BTDMA) ADD HL,DE LD (BTDMA),HL ; OK, INIT PAGE 0 ; WZRPG: ; ; INIT BIOS WARM START IN PAGE 0 ; LD A,0C3H LD HL,BIOS + 3 LD (PAGE0),A LD (PAGE0 + 1 (ON) JR Z,CLKON ; ; ELSE TURN OFF CLOCK DRIVE ; LD A,18H ;UNCOND. JR (OFF) (CAUSES JUMP TO ILLEGAL) ; CLKON: LD (IN+++++++++++++++++++++++++++++ ; ; WRITE A DISK SECTOR ; EXIT - A= 0: OK; /0: ERROR ; ;+++++++++++++++++++++++++++++++++++++ ; ; IF UNSUPPORTED DRIVE REQUESTED THEN RETURN 0 (ERROR) ; LD A,C CP A,NDRVS RET NC ; ; STORE DRIVE # FOR FUTURE ELSE LOG ON DRIVE ; LD (DTPTR),HL ;SAVE DRIVE TABLE PTR ; ; ATTEMPT TO READ ID SECTOR ; XOR A,A ;INIT FLAG BYTE UNO TRANSLATION ; LD A,(DEFBFR + ID_FLGO) AND A,[1 SHL DF_DTDB] OR [1 SHL DF_HARDB] ; ; ELSE SET TRANSLATION ; CALL Z,EL2: PUSH HL CALL DPBAD ; USE DEFAULT TABLE POP HL LD BC,DPBSZ LDIR JR SEL1 ; ; ; USE 8" FLOPPY DEFAULTS ; LG; IF NOT INTO BDOS THEN READ NEXT SECTOR ; LD DE,BDOS XOR A,A SBC HL,DE JR C,WREAD ; ; ELSE IF AT BEGINNING OF BD),HL ; ; INIT BDOS CALL VECTOR IN PAGE 0 ; LD HL,BDOS + 6 LD (BDOSJV),A LD (BDOSJV + 1),HL ; ; INIT BIOS CALL VECHCLK),A ; ENDIF ; ; PASS DEFAULT DISK TO CCP ; LD A,(DEFDRV) LD C,A JP CCP SUBTTL BIOS DISK FUNCTION ROUTINES+++++++++++++++++++++++++++++++++++++++ ; DISKWR: ; ; DISABLE UPLOAD (READ DATA) ; LD A,1 SHL PB_INHX LD (BTFLG),A ; USE ; LD (BTDRV),A ; ; SAVE LOGON REQUEST FLAG ; LD A,E LD (LOGRQ),A ; ; COMPUTE DISK DRIVER TABLE PTR ; CALTIL FIRMWARE REVISED LD (IOPB + PB_ST2O),A ; CALL DISKLOG JP NZ,FDSKER ; ; IF NO ID SECTOR THEN USE DEFAULT DPB ; (NTR8 ; ; XFER DISK DATA TO DPB ; NOX: CALL DPBAD ;GET ADDR OF DPB LD HL,DEFBFR + ID_SPTO LD BC,DPBSZ LDIR ; ; XCKFD: CALL TR8 LD HL,SD8PBK JR SEL2 ;**************************************************************************** ; ;OS THEN SET UP NEW TRACK & SECTOR ; JR Z,RDBDOS ; ; ELSE IF NOT AT BIOS THEN READ NEXT SECTOR ; LD DE,BIOS - BDOS SBTOR IN PAGE 0 ; LD HL,BIOFUNC LD (BFUNRSV),A LD (BFUNRSV + 1),HL ; ; SET DEFAULT SECTOR BUFFER ; LD BC,DEFBFR CA ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; READ A DISK SECTOR ; EXIT - A= 0: OK; /0: ; ENABLE DOWNLOAD (WRITE DATA) ; LD HL,SECSZ LD (IOPB + PB_BCNTO),HL ; ; PASS WRITE COMMAND ; LD A,PB_WRITC ;SELL RETDVRT ;DRIVE IS STILL IN C REGISTER LD (DVRTPTR),HL ; ; PREFETCH DRIVER EXECUTION ADDRESS FROM TABLE ; LD E,(HL) OTE: CONTROLLER HAS SET IT'S DISK DEFAULTS IN DEFBFR IN ALL CASES) ; LD A,(IOPB + PB_ST2O) CP A,-1 ;-1:NONE, 0:JADE, 1:DESFER DISK PHYSICAL DATA TO TABLE ; LD HL,DEFBFR + ID_FLGO ; SEL1: PUSH HL LD HL,(DVRTPTR) LD DE,DVRFLG ADD HL,DE EX  HOME DRIVE - TREAT AS SEEK TRK 0 ; EXIT - BC= 0 ; ;***********************************************************************C HL,DE JP C,WREAD ; ; ELSE DONE READING SYSTEM ; JP WZRPG ; ; ; ELSE SET UP & READ BDOS ; RDBDOS: POP HL ;RESTLL SETDMA ; IF INTCPTS ; ; PUT BDOS VECTOR INTO INTERCEPT CODE ; LD HL,(BDOS + 7) LD (BDOSV),HL ; ; NOW PUT INT ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; DISKRD: ; ; ENABLE UPLOAD (READECT WRITE OP JP DISKOP ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SELECT DRIVE F;STORE ADDRESS INC HL LD D,(HL) INC HL LD (DVRXADR),DE ; ; FETCH FLAGS ; LD C,(HL) ; ; COMPUTE DISK PARAMETERCRIPTOR, 2: EXTENDED, ; 3: PARTITIONED, ID JR Z,LGDEF ; ; ELSE IF OLD FORMATS THEN PAD DPB DATA ; CP A,3 JR NC,DE,HL POP HL LD BC,DVRSIZ - DVRFLG LDIR ; ; RETURN DRIVE TABLE PTR ; LD HL,(DTPTR) XOR A,A RET ; ; ; IF NO***** ; HOME: LD BC,0 ; ; FALL INTO SET TRACK ; ;*******************************************************************ORE BDOS TRK/SECTOR FROM DIRECTORY LD C,L LD B,A ;A STILL CONTAINS 0 CALL SETSEC ; LD C,H CALL SETTRK ; JR WREAD ERCEPT VECTOR INTO BDOS CODE ; LD HL,INTCPT LD (BDOS + 7),HL ; ; INITIALIZE CLOCK VECTORS IF CLOCK INSTALLED ; LD A, DATA) ; XOR A,A LD (BTFLG),A ; ; DISABLE DOWNLOAD (WRITE DATA) ; LD (IOPB + PB_BCNTO),A LD (IOPB + PB_BCNTO + 1),UNCTION ; LOG-ON - SET DISK PARAMETER BLOCK ; ENTRY- C= DRIVE # ; E= 0 IF NEW SELECT ; EXIT - HL= PTR TO DPT OR 0 FOR ERROR TABLE ADDRESS ; LD HL,(BTDRV) LD H,0 ADD HL,HL ;DISK # * 16 ADD HL,HL ADD HL,HL ADD HL,HL LD DE,D0DPH ADD HL,IDOK ; LD HL,DEFBFR + ID_PSHO ;FILL DATA WITH 0S LD B,ID_FLGO - ID_PSHO ; PADIDL: LD (HL),0 INC HL DJNZ PADIDL ; ; T HARD DISK THEN GO DO FLOPPY TEST ; LGDEF: LD A,(BTDRV) IF STHD <> 0 CP A,STHD JR C,LGCKFD ENDIF CP A,NDHD + 1 ********* ; ; SET TRACK # ; ENTRY- BC= TRACK # ; ;*************************************************************************0 %+ &, !'- "(. #)/ $*0*** ; SETTRK: LD (BTTRK),BC RET ;**************************************************************************** ; ; S; BC= SECTOR # TO XLATE ; EXIT - HL= XLATED SECTOR OR BC + 1 ; BC= UNCHANGED ; A, DE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++ ; DISKLOG: ; ; SET DESCRIPTOR SECTOR XFER ADDRESS TO DEFAULT BUFFER ; LD HL,DEFBFR LD (IOPB + PB_DMAO+++++++++++++++++++++++++ ; DISKOP: ; ; SET UP IOPB ; LD HL,BTTRK LD DE,IOPB + PB_TRKO LD BC,PB_BCNTO - PB_TRKO L GET USER RESPONSE ; CALL CI ;GET USER RESPONSE ; PUSH AF ;SAVE CHAR LD C,A ;ECHO CHAR CALL COC POP AF ; AND  ;**************************************************************************** ; TR8: TR3740: LD DE,SDTRAN ; SETTR: LD HL, LD E,(HL) ;FETCH DPB PTR INC HL LD D,(HL) RET SUBTTL HARD DISK ROUTINES ;+++++++++++++++++++++++++++++++++++++++LL XPRIM ; ; RESTORE SECTOR ; POP HL LD (IOPB + PB_SECO),HL ; ; DONE ; RET ;+++++++++++++++++++++++++++++ET SECTOR ; ENTRY- BC= SECTOR # ; ;**************************************************************************** ; SETSEC: +++++++++++++++++++++++++++++++++++++++++++++++ ; SECTRN: ; ; IF NO TRANSLATION THEN RETURN SECTOR++ ; LD A,D ;IF TABLE),HL CALL GETBNK LD (IOPB + PB_DMAXO),A ; ; SET DESCRIPTOR SECTOR SECTOR ; LD HL,ID_SECT LD (IOPB + PB_SECO),HL ; DIR ; DISKOP2: LD (IOPB + PB_CMDO),A ; ; FETCH DRIVER VECTOR & EXECUTE DISK DRIVER ; DKOPLP: PUSH IY ;SAVE IY LD A,5FH ;INSURE UPPER CASE ; ; IF RETRY THEN RETURN TO CALLER ; CP A,'R' ;IF RETRY THEN RETURN TO CALLER JR Z,DKOPLP ;(DTPTR) LD (HL),E INC HL LD (HL),D RET ;***************************************************************************+++++++++++++++++++++++++++++++++++++ ; ; HARD DISK DRIVER FUNCTION ; ENTRY- IY= DRIVER TABLE PTR ; EXIT - A= 0: OK; /0: ERR+++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE IOPB PRIMITIVE ; EXIT - A= 0: OK, /0: ERROR ; ;++++++++++++ LD (BTSEC),BC RET ;**************************************************************************** ; ; SET TRANSFER ADDR  ADDR = 0 THEN NO TRANSLATION OR A,E JP Z,NOTRAN ; ; ELSE CALCULATE NEW SECTOR FROM TABLE ; EX DE,HL ADD HL,BC LD ; SET DESCRIPTOR SECTOR TRACK ; LD L,H ;H == 0 FROM LAST OPERATION (HL= 0) LD (IOPB + PB_TRKO),HL ; ; ENABLE UPLOADIY,(DVRTPTR) ;FETCH TABLE BASE ; LD HL,DKOPRET ;PUT RETURN ADDRESS ON STACK PUSH HL ; LD HL,(DVRXADR) ;FETCH DRIVER ADDR ; ELSE IF ABORT THEN DO WARM BOOT ; CP A,'A' ;IF ABORT THEN RE-BOOT JP Z,0 ; ; ELSE IF IGNORE THEN RETURN NO ERROR* ; ; SET NO SECTOR TRANSLATION PROCEDURE ; EXIT - HL, DE= ? ; ;***********************************************************OR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; HDEXEC: ; ; CONVERT LOGICAL DRIVE T++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; XPRIM: ; ; SET BANK ADDRESS TO THIS BANK FOR NOW ; C ; ENTRY- BC= ADDRESS ; EXIT - A= ? ; ;**************************************************************************** ; SETDM L,(HL) ; LD H,0 RET ; ; ; CONVERT FROM CP/M'S LOGICAL SECTOR {0..N-1} TO PHYSICAL SECTOR {1..N} ; NOTRAN: LD HL, ; LD A,L ;L= 0 LD (IOPB + PB_FLGO),A ; ; DISABLE DOWNLOAD ; LD (IOPB + PB_BCNTO),HL ; ; PASS COMMAND TO EXECUTESS PREFETCHED FROM TABLE JP (HL) ; ; DRIVER RETURNS HERE ; DKOPRET: POP IY ; ; IF NO ERRORS THEN RETURN ZF ; R ; SUB A,'I' ;IF IGNORE THEN RETURN NO ERROR RET Z ; ; ELSE RETURN ERROR TO BDOS ; FDSKER: LD HL,0 ;RETURN DPB_PTR ***************** ; TRNONE: LD DE,0 JR SETTR ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++O PHYSICAL DRIVE ; LD A,(IY + DVRPDRV) ;0,1: DRV 0, 2,3: DRV 1 LD (IOPB + PB_DRVO),A ; ; OFFSET LOGICAL ADDRESS WITH LOALL GETBNK LD E,A ;PRESET IOPB BANK LD (IOPB + PB_DMAXO),A ; ; EXECUTE THE PRIMITIVE IN ROM ; LD HL,IOPB ;BANKED COA: LD (BTDMA),BC CALL GETBNK ;FETCH BANK ADDRESS FROM MONITOR LD (BTDMAX),A RET ;+++++++++++++++++++++++++++++++++++1 ADD HL,BC RET SUBTTL DISK SUPPORT ROUTINES ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++OR ; LD A,PB_LOGC JR DISKOP2 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; COMMOET Z ;IF NO_ERROR THEN RETURN ; ; PRINT ERROR ; CALL GETBNK ;SETUP BANK FOR FUTURE COMPATABILITY LD E,A LD HL,IOPB= 0 FOR SELECT FUNCTION LD A,-1 ;RETURN -1 TO BDOS OR A,A RET ;*****************************************************+++ ; ; RETURN DRIVE PARAMETER BLOCK ADDR FUNCTION ; EXIT - DE= DPB PTR ; HL= ? ; ;++++++++++++++++++++++++++++++++++++++GICAL DRIVE ; LD A,(BTDRV) ;IF EVEN THEN ADD 0 ELSE ADD 128 RRCA AND A,80H LD E,A ;COMPUTE SECTOR LD D,0 LD HL,(IMPATABILITY LD DE,(THIS_BNK) LD A,MF_XIOB ;SET MONITOR FUNCTION # CALL XMROM ;EXECUTE THE FUNCTION ; OR A,A ;FUNCTION+++++++++++++++++++++++++++++++++++++++++ ; ; SECTOR TRANSLATION FUNCTION ; ENTRY- DE= 0: NO XLATE, ELSE PTR TO XLATE TABLE +++++ ; ; LOGON DISK FUNCTION ; EXIT - A= 0: OK; /0: ERROR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++N DISK I/O CODE ; ENTRY- A= IOPB COMMAND ; EXIT - A= 0: OK; /0: ERROR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++ LD A,MF_DIOB ;USE DISPLAY IOPB DATA FUNCTION CALL XMROM ; ; QUERY USER FOR OPTION ; LD HL,DSKEB CALL EDITOR ; ; *********************** ; ; SET 3740 SECTOR TRANSLATION PROCEDURE ; ENTRY- (DTPTR)= MUST BE PTR TO DTP ; EXIT - DE, HL= ? ;++++++++++++++++++++++++++++++++++++++ ; DPBAD: LD HL,(DTPTR) ;FETCH BASE ADDR LD DE,10 ;ADD OFFSET OF DPB PTR ADD HL,DE OPB + PB_SECO) ; PUSH HL ;SAVE SECTOR TO RESTORE LATER ; ADD HL,DE LD (IOPB + PB_SECO),HL ; ; EXECUTE IOPB ; CA ERR? RET NZ ; ; RETURN THE COMMAND RESULTS STATUS ; LD A,(IOPB + PB_STATO) OR A,A RET SUBTTL JADE FLOPPY DRI0 %+ &, !'- "(. #)/ $*0VER ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; JADE 8" FLOPPY DISK DRIVER FUNTO SECTOR BIT 15 LD (IOPB + PB_SECO +1),A ; LD (IOPB + PB_TRKO),HL ;STORE SHIFTED TRACK ; ; EXECUTE THE IOPB ; CALL ADD A,A ADD A,L LD L,A LD A,0 ADC A,H LD H,A ; ; EXECUTE TABLE ADDRESS ; LD A,(HL) INC HL LD H,(HL) LD L,; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; RETVERS: LD HL,VERSN XOR A,A ;RETURN N DE,DVRSIZ ; RETDVL: ADD HL,DE DJNZ RETDVL ; ; RETURN NO ERROR ; XOR A,A RET ;+++++++++++++++++++++++++++++++++++++++++ ; ; GET BANK NUMBER FUNCTION ; EXIT - A= BANK # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++L FUNCTIONS TO SUPPORT CDOS PROGRAMS ;*************************************************************************** ; ; SYSTEM A,8DH ;IF RETURN VERSION THEN RETURN IT JR Z,RETCVER ; CP A,90H ;IF NOT CLOCK THEN ERR JR C,ILLEGC ; JR Z,CLKCAL ;IFCTION ; ENTRY- IY= DRIVER TABLE PTR ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++XPRIM ; ; RESTORE THE MODIFIED IOPB SO RETRY WILL WORK ; POP HL ;TRACK LD (IOPB + PB_TRKO),HL ; LD HL,IOPB + PB_SEA ; EX (SP),HL ;PUT CALLER'S DATA IN HL, FUNCTION ADDR ON RET ; STACK, EXECUTE FUNCTION ADDRESS ON STACK ;#########O ERROR RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN DRIVER TABLE PTR ++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE IOPB FUNCTION ; ENTRY- IX= IOPB PTR ; EXIT - A= 0: OK ; ;++++++++++++++++++++++ ; GETBNK: LD A,MF_GBNK JP MR_FUN SUBTTL NON-DISK PROCEDURES ;**************************************CALL INTERCEPT ROUTINE CHECKS FOR ILLEGAL BDOS CALLS & ; PRINTS MESSAGE IF ILLEGAL. ALSO IMPLEMENTS CDOS CLOCK/CALENDAR ; SY CALENDAR THEN GET IT ; CP A,92H JR Z,CLKTIM ;IF TIME THEN GET IT ; ; ILLEGAL SYSTEM CALL ; ILLEGC: PUSH BC ;SAVE FUN++++++++++++++++++++ ; FD8EXEC: ; ; CONVERT LOGICAL DRIVE TO PHYSICAL DRIVE ; LD A,(IY + DVRPDRV) LD (IOPB + PB_DRVO)CO +1 ;CLEAR BIT 15 RES 7,(HL) ; ; DONE ; RET SUBTTL BIOS FUNCTION CALLS ;++++++++++++++++++++++++++++++++++++++################################################################### ; ; BIOS FUNCTION TABLE ; ;#############################FUNCTION ; ENTRY- C= DRIVE # (E FOR FUNCTION CALL) ; EXIT - HL= DRIVER TABLE BASE PTR ; A, C= 0 ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; EXIOPB: ; ; SET UP FOR CALL ; CALL GETBNK ;E= I************************************** ; ; OUTPUT HEX DATA TO CONSOLE SUBR ; ENTRY- A= DATA ; EXIT - A, C= ? ; ;**********STEM CALLS FOR ASMB. ; ;*************************************************************************** INTCPT: LD A,C ;CHECK CACTION # ; ; OUTPUT WARNING MESSAGE ; LD HL,ISCMSG ;OUTPUT WARNING CALL EDITOR ; ; OUTPUT FUNCTION # ; POP HL L,A ; ; IF HEADS == 1 THEN EXECUTE IOPB ; LD A,(IY + DVRHDS) DEC A JP Z,XPRIM ; ; ELSE SELECT SIDE FROM TRACK BIT ++++++++++++++++++++++++++++++++++++++ ; ; FUNCTION DISPATCHER ; EXIT - A= -1: ERROR, 0: OK ; ;++++++++++++++++++++++++++++############################################### ; BFUNTBL: DW RETVERS ;0:RETURN VERSION # DW RETDVRTF ;1:RETURN DISK PHYS+++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; BIOS CALL ENTRY (E= DRIVE #) ; RETDVRTF: LD C,E ; RETDVRT: OPB PTR IS IN THIS BANK LD E,A PUSH IX ;MAKE HL = IX FOR NOW POP HL ; LD A,MF_XIOB ;MONITOR FUNCTION # (DISK FUNCTION)****************************************************************** ; PRHEX: LD C,A LD A,MF_PHXB JP XMROM ;*********LL VALIDITY CP A,41 ;IF <= 40 THEN OK ; BDOSV EQU $ + 1 JP C,BDOS + 11H ;THIS ADDR MODIFIED BY WARM BOOT RTN ; ; THE FD A,L CALL PRHEX ; ; OUTPUT NEW LINE ; CALL CRLF ; ; RETURN NULLS ; XOR A,A ;BC = HL = A = 0 LD L,A LD H,A 0 ; LD HL,(IOPB + PB_TRKO) PUSH HL ;SAVE FOR ERROR RESTORE ; LD A,(IOPB + PB_SECO +1) ;FETCH SIDE SELECT BYTE ADD A,++++++++++++++++++++++++++++++++++++++++++++++++ ; BIOFUNC: ; ; IF FUNCTION # NOT IN TABLE THEN RETURN -1 ; LD A,C CPICAL CONFIGURATION TABLE PTR DW EXIOPB ;2:EXECUTE THE IOPB MAXFUNCS EQU ($ - BFUNTBL) / 2 ;++++++++++++++++++++++++++++ LD HL,DVR0 ;START AT 1ST TABLE ; ; IF DRIVE == 0 THEN ALREADY THERE ; LD A,C OR A,A RET Z ; ; ELSE IF ILLEGAL D CALL XMROM ;EXECUTE MONITOR FUNCTION ; OR A,A ;FUNCTION ERROR? RET NZ ; ; FETCH & RETURN RESULT STATUS ; LD A,(****************************************************************** ; ; NEWLINE PROCEDURE ; ;********************************OLLOWING CONDITIONAL JUMP IS MODIFIED TO AN UNCONDITIONAL JUMP BY ; THE WARM BOOT ROUTINE IF THE CLOCK/CALENDAR BOARD IS NOT P LD C,A LD B,A RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CDOS RETURN VERA ;SHIFT OUT BIT 7 ; SRL H ;SHIFT TRACK HIGH BYTE RR L ;ROTATE BIT 8 TO 7 AND 0 TO CF RRA ;ROTATE TRACK BIT 0 IN A,MAXFUNCS LD A,-1 RET NC ; ; ELSE COMPUTE TABLE ENTRY ; PUSH HL ;SAVE POSSIBLE DATA ; LD HL,BFUNTBL LD A,C ++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN BIOS VERSION # ; EXIT - HL= VERSION # IN BINARY {0.00,..655.35} RIVE THEN RETURN ERROR ; CP A,NDRVS JR C,RETDV2 ; OR A,A RET ; ; ; ELSE COMPUTE TABLE PTR ; RETDV2: LD B,C LDIX + PB_STATO) OR A,A ;TEST RESULT FOR RETURN RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++******************************************* ; CRLF: LD C,CR CALL COC LD C,LF JP COC IF INTCPTS SUBTTL ADDITIONARESENT ; IF NOT MODIFIED, THEN IT IS ALLWAYS FALSE (NOP). ; INHCLK: JR C,ILLEGC ; ; NOW CHECK FOR EXTENDED CALLS ; CP SION FUNCTION ; MAKES CLOCK/CALENDAR WORK. ; EXIT - B= 1 ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++0 %+ &, !'- "(. #)/ $*0+++++++++++++ ; RETCVER: LD B,1 RET SUBTTL CLOCK ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ENTRY- A= FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; XMROM: ; ; SWIT++++++++++++++++++++++++++++++++++++++++++++++++ ; CNSCK: LD A,MF_CIS JR XMROM ;********************************************************************************************* ; PUNCH: RET ;******************************************************************************************************************* ; EDITOR: CALL GETBNK LD E,A LD A,MF_PUTS JR XMROM LL MR_FUN POP AF ; ; IF OPTION IS CTRL-C THEN WARM BOOT ; CP A,3 ;IF CTRL-C THEN WARM BOOT JP Z,PAGE0 ; ; IF OPT ; ; UNSUPPORTED INTERRUPT ; ;---------------------------------------------------------------------------- ; ILLINT: PUSH ;############################################################################ ; ; DISK DRIVER TABLES ; ;##############++++++++++++++++++ ; ; RETURN CALENDAR FUNCTION 90H ; EXIT - A= DAY ; B= MONTH ; C= YEAR ; L= DAY OF WEEK ; ;++++++++CH TO LOCAL (LARGER) STACK ; LD (SPSAV),SP LD SP,LSTACK ; ; EXECUTE THE FUNCTION ; CALL MR_FUN ;EXECUTE MONITOR FUN*************************************** ; ; CONSOLE OUTPUT ; ENTRY- C= CHAR TO OUTPUT ; ;************************************************************ ; ; PRINTER DRIVER ; ENTRY- C= CHAR TO OUTPUT ; ;*********************************************** IF INTRPTS SUBTTL INTERRUPTS ;---------------------------------------------------------------------------- ; ; USER INTION IS YES THEN WARM BOOT ; AND A,5FH ;IGNORE CASE ; CP A,'Y' JP Z,PAGE0 ; ; IF OPTION IS INTERRUPT THEN EXECUTE RE AF ;SAVE ALL 8080 REGS PUSH HL PUSH BC PUSH DE LD HL,ILLIM ;NOTIFY USER OF INT JR IQCONT SUBTTL INITIALIZED DA############################################################## ; STRUCT 0 DVRADD DS 2 ;START ADDRESS OF DISK DRIVER DVRFG D++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKCAL: LD A,MF_GCAL JR XMROM ;+++++++++++++++CTION ; ; RESTORE THE STACK ; LD SP,(SPSAV) RET SUBTTL CHAR I/O ROUTINES ;++++++++++++++++++++++++++++++++++++++****************************************** ; COC: LD A,MF_CO JR XMROM ;++++++++++++++++++++++++++++++++++++++++++++++***************************** ; LO: LD A,MF_LO JR XMROM ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ERRUPT ; ;---------------------------------------------------------------------------- ; ITRAP: ; ; SAVE REGS FIRST ; START 7 ; CP A,'I' JR NZ,ITRAP1 ; POP DE POP BC ;RESTORE REGS 1ST POP HL POP AF JP 0038H ; ; ; IF OPTION ITA ;############################################################################ ; ; 3740 SECTOR TRANSLATION TABLE ; **** CPS 1 ;FLAGS (BIT 0= 1: INHIBIT LOGON) DVRPDRV DS 1 ;PHYSICAL DRIVE ;DVRLDRV DS 1 ;LOGICAL DRIVE {0..N-1} ; ; THE FOLLOWING +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN TIME FUNCTION 92H ; EXIT - A= SECONDS ; B= MINUTES++++++++++++++++++++++++++++++++++++++ ; ; CONSOLE INPUT ; EXIT - A= CHAR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; READER DRIVER - DUMMY ; EXIT - A= CTRL-Z ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN LIST DEVICE STATUS ; EXIT - A= 0: BUSY, FFH:READY ; ;++++++++++++++++++++++++++++++++++++++++++ PUSH AF PUSH HL PUSH BC PUSH DE ; ; SAVE CURRENT ROM & GET MONITOR ROM ; IN A,(M2_RSEL) LD (ROMSAV),A LD A,MR_S MONITOR THEN EXECUTE MONITOR BREAKPOINT ; ITRAP1: CP A,'M' JR NZ,ITRAPR ; POP DE POP BC POP HL POP AF JP 0008H /M SINGLE DENSITY **** ; ;############################################################################ ; SDTRAN: GXLATE 26,6MAY BE BROUGHT OFF DISK DESCRIPTOR OR FROM DEFAULT TABLES ; DVRFLG DS 1 ;DISK FLAGS DVR0SPT DS 1 ;TRK 0 SECTORS PER TRK DVR0 ; C= HOURS ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKTIM: LD A,MF_GTIM JR ++++++++++++++++++++++++++++++ ; CI: LD A,MF_CI JR XMROM ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; READER: LD A,CTRLZ ;FAKE EOF ; ; FALL INTO PUNCH RETURN ; ;*********************++++++++++++++++++++++++++++++++++ ; LISTST: LD A,MF_LOS JR XMROM ;**************************************************RNUM OUT (M2_RSEL),A ; ; PRINT PROMPT ; LD HL,ITMSG IQCONT: LD A,MF_PUTS CALL MR_FUN ; LD HL,IQMSG ;QUERY USER  ; ; ; ELSE RESTORE REGS & RETURN ; ITRAPR: LD A,(ROMSAV) ;RESTORE ROM # OUT (M2_RSEL),A ; POP DE POP BC POP HL ;############################################################################ ; ; COMMON I/O PARAMETER BLOCK ; ;######SZ DS 1 ;TRK 0 SECTOR SIZE DVR1SPT DS 1 DVR1SZ DS 1 DVRDSPT DS 1 DVRDSZ DS 1 DVRDTYP DS 1 ;RESERVED FOR DISK TYPE DVRCYLS XMROM ENDIF ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; MONITOR ROM EXECUTER ;+++++++++++++++++ ; ; RETURN CONSOLE STATUS ; EXIT - A= 0: NOT READY ; FFH: CHAR READY ; ;++++++++++++++++++++++++++++******************************************************* ; ; PUNCH DRIVER ; ENTRY- C= CHAR TO OUTPUT ; ;********************************************** ; ; MESSAGE EDITOR ; ENTRY- HL= TEXT PTR (BIT 7= 1: TERMINATOR) ; EXIT - REGS= ? ; ;*********** LD A,MF_PUTS CALL MR_FUN ; ; GET & ECHO USER INPUT ; LD A,MF_CI CALL MR_FUN ; PUSH AF LD C,A LD A,MF_CO CA POP AF EI ;RE-ENABLE INTERRUPTS RET ;---------------------------------------------------------------------------- ###################################################################### ; IOPB: REPT PB_SIZE LIST OFF DB 0 LIST ON ENDMDS 2 ;DISK CYLINDERS DVRHDS DS 1 ;HEADS ; ; DEFINE THE STRUCTURE SIZE ; DVRSIZ DS 0 ENDM ;@@@@@@@@@@@@@@@@@@@@@@@@0 %+ &, !'- "(. #)/ $*0@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; MACRO TO DEFINE THE DRIVER TABLE RECORD ; ENTRY- #DADD= DRIVER ADDRE LIST OFF ENDM IF BOOT = 10H DVR0: ;A ALLDRV HDEXEC,4,60H,32,1,32,1,32,1,10H,256,4 DVR1: ;B ALLDRV HDEXEC,4,60H,3################################################################## ; ; DEFAULT 8" FLOPPY DISK PARAMETER BLOCK ; IBM 3740 SING############################################# ; ; DEFAULT 8" HARD DISK PARAMETER BLOCK ; ;################################## DB 4 ;HEADS ;############################################################################ ; ; MODE 2 INTERRUPT VECTOR TDIF IF INTRPTS ITMSG DM CR,LF,'User' ILLIM DM CR,LF,'Ill.' IQMSG DM ' Int. Abort? (Y/N/I/M) - ' ENDIF ;#########RIVE PARAMETER BLK PTR IF ((DD - 1) <= NDHD) AND ((DD - 1) >= STHD) DW 0 ;;NO CHECKS ON HARD DISK ELSE DW D#D(DD)CH# BTFLG DS 1 ;RESERVED FOR FLAGS BTDMA DS 2 ;DMA ADDRESS BTDMAX DS 1 ;DMA EXTENDED ADDRESS ;############################SS ; #PD= PHYSICAL DRIVE # ; #FG= DRIVE FLAGS (IDFLGO) ; #S0= TRK 0 SPT ; #Z0= TRK 0 SIZE ; #S1= TRK 1 SPT ; #Z1= TR2,1,32,1,32,1,10H,256,4 DVR2: ;C ALLDRV HDEXEC,5,60H,32,1,32,1,32,1,10H,256,4 DVR3: ;D ALLDRV HDEXEC,5,60H,32,1,32,1,32,1,LE DENSITY FORMAT ; ;############################################################################ ; SD8PBK: DW 26 ;SECTORS ########################################## ; HDPBK: DW 128 ;SECTORS PER TRACK (LOGICAL) (SPT) DB 5 ;BLOCK SHIFT FACTOR (BABLE ; ;############################################################################ ; ; START ON AN EVEN PAGE BOUNDARY ;################################################################### ; ; DRIVE PARAMETER HEADER AREA ; 1 PER DRIVE ; ;######K ;;DRIVE DISK CHECKSUMS ARRAY PTR ENDIF DW D#D(DD)ALL ;;DRIVE CLUSTER ALLOCATION BIT MAP PTR LIST OFF ENDM ; ; DE################################################ ; ; VARIABLES ; ;########################################################K 1 SIZE ; #SD= DATA TRKS SPT ; #ZD= DATA TRKS SIZE ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@10H,256,4 DVR4: ;E ALLDRV FD8EXEC,0,0,26,0,26,0,26,0,0,77,1 DVR5: ;F ALLDRV FD8EXEC,1,0,26,0,26,0,26,0,0,77,1 ENDIF PER TRACK DB 3 ;BLOCK SHIFT FACTOR DB 7 ;BLOCK MASK DB 0 ;NULL MASK DW 242 ;DISK SIZE -1 DW 63 ;DIRECTORY MAX DSH) DB 31 ;BLOCK MASK (BLM) DB 1 ;NULL MASK (EXM) DW 1015 ;DISK SIZE (CLUSTERS -1) (DSM) DW 1152 / 2 ;DIRECTORY M IF $ AND 0FFH DS 100H - ($ AND 0FFH) ENDIF INTABL: REPT 7 ;1ST 7 ARE UNSUPPORTED LIST OFF DW ILLINT LIST ON E###################################################################### ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@FINE THE DATA ; DD DL 1 REPT NDRVS LIST OFF ALLDPH 0123456789ABCDEF DD DL DD + 1 LIST ON ENDM ; ; LAST OF INI#################### ; DTPTR: DS 2 ;DRIVE TABLE PTR LOGRQ: DS 1 ;LOG ON REQUEST REG. DVRTPTR DS 2 ;DRIVE DRIVER TABLE BASE A@@@@@@@@@ ; ALLDRV MACRO #DADD,#PD,#FG,#S0,#Z0,#S1,#Z1,#SD,#ZD,#DT,#CY,#HD LIST ON DW #DADD ;DRIVER EXECUTION ADDR DB 0 IF BOOT = 3 DVR0: ;A ALLDRV FD8EXEC,0,0,26,0,26,0,26,0,0,77,1 DVR1: ;B ALLDRV FD8EXEC,1,0,26,0,26,0,26,0,0,77,1 DVR2: ;B 11000000B ;ALLOC 0 DB 0 ;ALLOC 1 DW 16 ;CHECK SIZE DW 2 ;TRACK OFFSET DB 0 ;PHYSICAL RECORD SHIFT FACTOR DB 0 ;AX (DRM) DB 0FFH ;ALLOCATION 0 (AL0) DB 10000000B ;ALLOCATION 1 (AL1) DW 0 ;CHECK SIZE (CKS) DW 2 ;TRACK OFFSNDM ; DW ITRAP ;INT 8 IS USER INTERRUPT ENDIF ;#####################################################################@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE A DISK PARAMETER TABLE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TIALIZED CODE READ FROM DISK ; BIOSND EQU $ SUBTTL UNINITIALIZED DATA AREA ;#############################################DDRESS PTR DVRXADR DS 2 ;DRIVE DRIVER EXECUTION ADDRESS SECOFF DS 2 ;LOGICAL DRIVE SECTOR OFFSET (ADD TO SECTOR) ; ROMSAV EQ ;LOGON INHIBIT FLAG (LOGON ENABLED) DB #PD ;MONITOR PHYSICAL DRIVE # DB #FG ;DISK FLAGS DB #S0,#Z0 ;T0 SECTORS, SIZE C ALLDRV HDEXEC,4,60H,32,1,32,1,32,1,10H,256,4 DVR3: ;D ALLDRV HDEXEC,4,60H,32,1,32,1,32,1,10H,256,4 DVR4: ;E ALLDRV HDEPHYSICAL RECORD MASK DW 0 ;LOGICAL DRIVE SECTOR OFFSET ; ; DEFAULT DISK PHYSICAL PARAMETERS ; DB 0 ;FLAGS DB 26,0,2ET (OFF) DB 1 ;PHYSICAL RECORD SHIFT FACTOR (PSH) DB 1 ;PHYSICAL RECORD MASK (PRM) DW 0 ;LOGICAL DRIVE SECTOR OFFSET####### ; ; MESSAGES ; ;############################################################################ ; MSGLE: DM CR,LF,'@@@@@@@@@@@@@@@@@@@@@@ ; ALLDPH: MACRO #D LIST ON D#D(DD)DPH: ;DRIVE PARAMETER HEADER FOR DRIVE #D(DD) DW 0 ;;SECTOR T############################### ; ; THE FOLLOWING DATA MUST RESIDE IN THIS ORDER TO MATCH THE IOPB DATA ; ;###############U 0048H ;DS 1 ;ROM SWAP SAVE OF ORIGINAL ROM SPSAV DS 2 ;USER SP SAVE WHILE USING LOCAL STACK DS 64 ;LOCAL STACK (32 ENTRIES) DB #S1,#Z1 ;T1 SECTORS, SIZE DB #SD,#ZD ;DATA TRKS SECTORS, SIZE DB #DT ;DISK TYPE DW #CY ;CYLS DB #HD ;HEADS ; XEC,5,60H,32,1,32,1,32,1,10H,256,4 DVR5: ;F ALLDRV HDEXEC,5,60H,32,1,32,1,32,1,10H,256,4 ENDIF LIST ON ;##########6,0,26,0 ;SECTORS PER TRACK, SECTOR SIZE (128) DB 0 ;TYPE DW 77 ;CYLS DB 1 ;HEADS ;############################### (SOF) ; ; ; DB 01100000B ;FLAGS 256 BPS, HARD, SSSD DB 32,1,32,1,32,1 ;32 SPT, 256 BPS DB 10H ;TYPE DW 256 ;CYLS LOAD ERROR' ; DSKEB: DM CR,LF,'Abort, Ignore, Retry, (BDOS) - ' ; IF INTCPTS ISCMSG: DM CR,LF,'ILL SYS CALL, #= ' ENRAN TBL (OR 0 IF NO XLATE) DW 0 ;;SCRATCH AREA DW 0 ;;" DW 0 ;;" DW DIRBF ;;DIRECTORY BUFFER PTR DW D#D(DD)DPB ;;D############################################################# ; BTDRV: DS 1 ;DRIVE # BTTRK DS 2 ;TRACK # BTSEC DS 2 ;SECTOR  LSTACK EQU $ ;############################################################################ ; ; DRIVE ALLOCATION AREAS 0 %+ &, !'- "(. #)/ $*0 ; ;############################################################################ ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@L DD + 1 LIST ON ENDM ;############################################################################ ; ; RESERVE DRI0,1- DIRECTORY ALLOCATION ; 1 MSB PER DIRECTORY CLUSTER ALLOCATED DPBCKS DS 2 ;CKS- # DIRECTORY SECTORS CHECKED ; (DRM  OFFSET (FOR LOGICAL DRIVE) ; 0: NONE, 1..65535: OFFSET DPBSZ DS 0 ENDM ; ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@############################################## ; ; DISK DRIVER TABLES (DDT) ; ;#############################################R TABLE RECORD ; ENTRY- #DADD= DRIVER ADDRESS ; #PD= PHYSICAL DRIVE # ; #FLG= DRIVE FLAGS ; #DPB= DPB ADDRESS ; #DPH= DODE) LSTINC EQU FALSE ;LIST INCLUDE FILES USEMON EQU TRUE ;USE MONITOR ROM I/O ROUTINES IF TRUE INTRPTS EQU TRUE ;ENABLE I C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; D SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ; E JADE 8" FLOPPY PHYSICAL DRIVE@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; MACRO TO DEFINE THE DRIVE ALLOCATION & CHECKSUMS AREA ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@VE PARAMETER BLOCKS ; ;############################################################################ ; STRUCT 0 DPBSPT DS 2+1) / 4 DPBOFF DS 2 ;OFF- # RESERVED TRACKS (USUALLY 2) ; ; ADDITIONAL CP/M 3.0 DATA (ALSO COULD BE USED BY CP/M 2.2 DEBLOC@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE THE DPB FOR DRIVE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@############################### ; STRUCT 0 DDT_EXE DS 2 ;START ADDRESS OF DISK DRIVER DDT_FLG DS 1 ;FLAGS BIT DEF. ; 0PH ADDRESS ; #HDS= HEADS ; #SOF= SECTOR OFFSET ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@NTERRUPT PROCESSING WHISTLE INTCPTS EQU TRUE ;ENABLE SYSTEM CALL INTERCEPT WHISTLE BOOT EQU 10H ;10H: HARD DISK, 3: 8" FLOPP 0 ; F JADE 8" FLOPPY PHYSICAL DRIVE 1 ENDIF IF BOOT = 3 ; A JADE 8" FLOPPY PHYSICAL DRIVE 0 ; B JADE 8" FLOPPY@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ALLDAL: MACRO #D LIST ON IF ((DD - 1) >= STHD) AND ((DD - 1) <= NDH ;SPT- SECTORS/TRACK DPBBSH DS 1 ;BSH- BLOCK SHIFT FACTOR DETERMINED BY CLUSTER SIZE ; 1K= 3, 2K= 4, 4K= 5, 8K= 6, 16K= 7 KING) ; DPBPSH DS 1 ;PSH- PHYSICAL RECORD SHIFT FACTOR BASED ON BYTES/SEC ; 0: 128, 1: 256, 2: 512, 3: 1024 DPBPHM DS 1 ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ALLDPB: MACRO #D LIST ON D#D(DD)DPB: DS DPBSZ ;ALLOCATION FOR DRIVE #D(DD) LIST OFF END 1: INHIBIT LOGON ; 1..3 PARTITION # {0,..7} DDT_HDB EQU 4 ;1: HARD DISK DRIVE ; DDT_DRV DS 1 ;PHYSICAL DRIVE # DDT_ TITLE CUSTOMIZED BIOS FOR M5B LIST NOCOND ;============================================================================ ; Y, 20H: 5" FLOPPY DEBUG EQU FALSE ;TRUE TO DUMP THE IOPB DATA TO PRINTER FORM ;****************************************** PHYSICAL DRIVE 1 ; C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; D SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 0 ; E SIDE 0 D) D#D(DD)ALL: DS 127 ;ALLOCATION BIT MAP FOR 8" HARD DRIVE #D(DD) ENDIF IF ((DD - 1) >= ST8FD) AND ((DD - 1) <= ND8FD)DPBBLM DS 1 ;BLM- BLOCK MASK ; 1K = 7, 2K= 15, 4K= 31, 8K= 63, 16K= 127 DPBEXM DS 1 ;EXM- EXTENT MASK ; DSM < 256 : 1K=PHM- PHYSICAL RECORD MASK BASED ON BYTES/SEC ; 0: 128, 1: 256, 3: 512, 7: 1024 ; ; ADDITIONAL DISK PARTITIONING DATA FORM ; ; RESERVE THE DATA SPACE ; DD DL 1 REPT NDRVS LIST OFF ALLDPB 0123456789ABCDEF DD DL DD + 1 LIST ON ENDM DPB DS 2 ;DPB ADDRESS FOR THIS DRIVE DDT_DPH DS 2 ;DPH ADDRESS FOR THIS DRIVE ; ; THE FOLLOWING MAY BE BROUGHT OFF DISK DES; ASSEMBLY PARAMETERS ; ;============================================================================ FALSE EQU 0 TRUE EQU N********************************** ; ; CUSTOMIZED BIOS FOR M5B ; (c) 1981 GRH Electronics, CUPERTINO, CA ; ;**********& 1 OF HARD DISK PHYSICAL DRIVE 1 ; F SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ENDIF IF BOOT = 20H ; A JADE 5" FLO D#D(DD)ALL: DS 57 ;ALLOCATION BIT MAP FOR 8" DRIVE #D(DD) D#D(DD)CHK DS 32 ;DIRECTORY CHECKSUMS STORAGE (1 BYTE PER SECTOR 0, 2K= 1, 4K= 3, 8K= 7, 16K= 15 ; DSM > 255 : 2K= 0, 4K= 1, 8K= 3, 16K= 7 DPBDSM DS 2 ;DSM- DRIVE STORAGE SIZE (IN CLUSTER THE LOGICAL DRIVE SELECTION. ; PARTITIONING BY TRACKS ARE IMPLIMENTED THRU BDOS USING DPBOFF ABOVE. ; PARTITIONING BY HEADS A IF (($ - 8000H) > 07700H) OR ($ < 8000H) CONMSG **** BIOS TOO BIG, USE MOVCPM & RE-ADJUST! **** ENDIF END CRIPTOR OR FROM DEFAULT TABLES ; DDT_HDS DS 1 ;HEADS DDT_SOF DS 2 ;SECTOR OFFSET ; ; DEFINE THE STRUCTURE SIZE ; DDT_SIOT FALSE ;============================================================================ ; ; CONDITIONAL ASSEMBLY FLAGS ; ;****************************************************************** ; ; CONFIGURATION: ; ; CPM ; DRIVE USAGE IF BOOT = 1PPY PHYSICAL DRIVE 0 ; B JADE 5" FLOPPY PHYSICAL DRIVE 1 ; C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; D SIDE 2 & 3 OF) ENDIF LIST OFF ENDM ; ; RESERVE THE DATA SPACE ; DD DL 1 REPT NDRVS LIST OFF ALLDAL 0123456789ABCDEF DD DS) ; INT(((#_TRACKS - OFF) * SPT * BYTES PER SECTOR) / CLUSTER SIZE) -1 DPBDRM DS 2 ;DRM- DIRECTORY SIZE -1 DPBAL0 DS 2 ;ALRE IMPLIMENTED BY USING THE FOLLOWING DATA. ; (HEAD BITS ARE INCLUDED IN SECTOR WORD UPPER BITS) ; DPBSOF DS 2 ;SOF- SECTOR################################# ; IOPB: REPT PB_SIZE LIST OFF DB 0 LIST ON ENDM ;##############################Z DS 0 ENDM ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; MACRO TO DEFINE THE DRIVE============================================================================ SHORT EQU FALSE ;SHORT BIOS (REMOVES UNESENTIAL C0H ;HARD DISK BOOT CONFIG. ; A SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; B SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 0 ;  HARD DISK PHYSICAL DRIVE 0 ; E SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; F SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ;  0 %+ &, !'- "(. #)/ $*0 G JADE 8" FLOPPY PHYSICAL DRIVE 0 ; H JADE 8" FLOPPY PHYSICAL DRIVE 1 ENDIF ; ;***************************************did not specify the logon track. ; 3.02 7 JUL 88 GRH ; Add '?' to include file names. ; Change hard disk system tracks dire GRH ; Modify for Ver. 1.22 Monitor. ; Fix bug in 8" Hard Disk table which benignly (at current level) ; caused the drive tsing in IX redundancy. ; Change DPB track-head shift factor to Sector Offset like track ; offset. Disk partitioning will add 00.DEF ; ;============================================================================ ; LIST OFF *INCLUDE JDDCONT3.DEF CATIONS ; PAGE0: EQU 0 ;START OF CP/M RAM IOBYTE: EQU PAGE0 + 3 ;IOBYTE ADDR DEFDRV: EQU PAGE0 + 4 ;DEFAULT DRIVE PARAM ADDISK BOOT DATA ; STHD EQU 0 ;START LOGICAL DRIVE OF HARD DISK NDHD EQU 3 ;LAST LOGICAL DRIVE OF HARD DISK ST8FD EQU 4 ;STA@@ ; ; GENERATE THE TRANSLATION TABLE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ********************** ; ; REVISION HISTORY: ; ; 3.00 - 26 JAN 87 GRH ; Implemented new common IOPB code & Jade floppy ctory reference to new format. ; Correct bug in drivers which caused retry to fail. (sector remained ; corrupted) ; Stubbedable to have bad data (default table was missing ; the 2 deblocking extension bytes). ; Implement data xfer inhibit schemes wthis value to sector word. It ; will be stored in the ID sector data to be dynamic. ; ; 3.10 5-20-91 GRH ; Change LOGON t *INCLUDE COMIOPB3.DEF *INCLUDE DISKS3.DEF *INCLUDE BDIR.DEF *INCLUDE ISHA.DEF *INCLUDE B:M5ZF200.DEF LR BDOSJV EQU PAGE0 + 5 ;BDOS SYSTEM CALL ENTRY THIS_STK EQU PAGE0 + 1CH ;CURRENT STACK FRAME PTR DK_BDRV EQU 0041H ;BOOT DRIRT LOGICAL DRIVE OF 8" FLOPPY ND8FD EQU 5 ;LAST LOGICAL DRIVE OF 8" FLOPPY ENDIF IF BOOT = 3 ; ; 8" FLOPPY BOOT DA ; GXLATE MACRO #SECTORS, #SKEW LIST OFF NXTSEC DL 1 ;;START WITH SECTOR 1 LOWEST DL 1 ;; REPT #SECTORS LIST ON DB firmware support. ; Implemented disk drive driver tables and new function to return ; a ptr to a drive table. ; Removed init out new Clock routines for present. ; 3.03 31 JUL 88 GRH ; Unstub Clock routines. ; 3.04 6 AUG 88 GRH ; Remove floppy sith PB_FLG & PB_BCNT. ; Add pick-up of THIS_BNK data in all iopb cases. ; Remove clock buffer set/read system calls. ; 12-5-9o attempt to recover from old disks better, using ; DCM8301 version controller firmware. ; ; 3.11 9-2-91 GRH ; Add redlinIST ON ;============================================================================ ; ; DISK OPERATING SYSTEM ADDRESSEVE # FROM PROM DEFBFR EQU PAGE0 + 80H ;DEFAULT BUFFER ; ; BIOS FUNCTION CALL RESTART VECTOR ; BFUNRST EQU 28H BFUNRSV EQTA ; STHD EQU 2 ;START LOGICAL DRIVE OF HARD DISK NDHD EQU 5 ;LAST LOGICAL DRIVE OF HARD DISK ST8FD EQU 0 ;START LOGICAL NXTSEC LIST OFF NXTSEC DL NXTSEC + #SKEW ;ADD SKEW FACTOR ;; IF NXTSEC > #SECTORS ;CHECK FOR OVERFLOW NXTSEC DL NXTSEC  of IOBYTE. ; Implemented 5" floppy driver. ; Implemented use of ROM primitives. ; Moved system down to 60k. ; 3.01 26 JUN ide select from BIOS & move to controller. ; Implement new ID sector format. ; Implement CP/M 3.0 DPB structure in preparation0 GRH ; Remove IX IOPB ptr passing to disk drivers. ; 1-13-91 GRH ; Fix bug which corrupted PB_FLG. ; 3.08 2-22-91 GRH es & change for M5ZMON v.2.00. ; VERSN EQU 311 ; ;**************************************************************************S ; ;============================================================================ ; NKSYS: EQU 60 ;SYSTEM SIZE IN K BYTES U PAGE0 + BFUNRST BFUNRSI EQU 0C7H + BFUNRST ; TPA: EQU 100H ;==========================================================DRIVE OF 8" FLOPPY ND8FD EQU 1 ;LAST LOGICAL DRIVE OF 8" FLOPPY ENDIF ;==============================================- #SECTORS ;; IF NXTSEC <= LOWEST ;CHECK FOR REPEAT NXTSEC DL LOWEST + 1 LOWEST DL NXTSEC ENDIF ENDIF ;; ENDM 88 GRH ; Remove 5" floppy support. Implement in CP/M-86 BIOS. ; Change single function to return drive table ptr into a BIOS f for deblocking. ; 3.05 11-3-88 GRH ; Change included data to update IOPB.PBSTAT to new configuration. ; 3.06 1-28-89 GRH ; Remove references to THIS_BNK & use monitor function #7 instead. ; Add track-head shift factor to DPBs for future use. ; 3.** SUBTTL SYSTEM DECLARATIONS ;============================================================================ ; ; INCLUDEKBYTE: EQU 1024 CPMSZ: EQU KBYTE * NKSYS CPMBS: EQU CPMSZ - (20 * KBYTE) ; CP/M BIAS VALUE CCP: EQU CPMBS + 3400H ;ADDR OF CC================== ; ; OTHER DECLARATIONS ; ;============================================================================ ;============================== ; ; ASCII CHARS ; ;========================================================================== LIST ON ENDM ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; INITIALIZE VERSION TEXunction ; call using restart instruction. ; Change LOGON to specify the ID sector & track. At same time, fix bug ; which  ; Revised primitive calling procedures to use the monitor rom function ; rather than swapping Roms itself. ; 3.07 11-25-90 09 5-15-91 GRH ; Change 8" floppy side select to track bit 0. Move calculation from ; DCM8 to CBIOS. ; Remove IOPB ptr pas JDDCONT3.DEF ; INCLUDE COMIOPB3.DEF ; INCLUDE DISKS3.DEF ; INCLUDE BDIR.DEF ; INCLUDE ISHA.DEF ; INCLUDE B:M5ZF2P BDOS: EQU CPMBS + 3C00H ;ADDRESS OF BDOS BIOS: EQU CPMBS + 4A00H ;ADDRESS OF BDOS BIOSR: EQU 1000H - BIOS ; ; PAGE 0 LO MR_RNUM EQU 0 ;INTERIM DEFINITION FOR INTERRUPT ROM SWAP ; SECSZ: EQU 128 NDRVS: EQU 6 IF BOOT = 10H ; ; 8" HARD D== ; LF: EQU 0AH CR: EQU 0DH CTRLZ: EQU 1AH ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T IN RAM MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; PVERS MACRO #VERS DD DL #V!0 %+ &, !'- "(. #)/ $*0ERS IF DD > 9999 DB (DD / 10000) + '0' DD DL DD % 10000 ENDIF IF DD > 999 DB (DD / 1000) + '0' DD DL DD % 1000TDMA ;SET TRANSFER ADDR JP DISKRD ;PERFORM DISK READ JP DISKWR ;PERFORM DISK WRITE JP LISTST ;RETURN LIST STATUS JP INIT ; INIT1: JR INIT ;############################################################################ ; ; DIRECTORY SECTO A,(DK_BDRV) ;USE DRIVE # PASSED IN PAGE 0 AND A,3 LD (DEFDRV),A ; ; SEND SYSTEM SIGN-ON ; CLOGO: LD HL,MSGSO CALL EBUFFER TO 1 SECTOR SIZE ENDIF ;---------------------------------------------------------- ; ; WARM REBOOT ENTRY LOADS) CP A,86H JR C,WEROR ; ; SET UP TO LOAD CCP/BDOS ; LD HL,(DEFBFR + BD_SBDSS) ;PREFETCH BDOS TRK/SECTOR PUSH HL ; JP C,WREAD ; ; ELSE DONE READING SYSTEM ; JP WZRPG ; ; ; ELSE SET UP & READ BDOS ; RDBDOS: POP HL ;RESTORE BDOS T ; IF INTCPTS ; ; PUT BDOS VECTOR INTO INTERCEPT CODE ; LD HL,(BDOS + 7) LD (BDOSV),HL ; ; NOW PUT INTERCEPT VEC ENDIF DB (DD / 100) + '0' DB '.' DB ((DD % 100) / 10) + '0' DB (DD % 10) + '0' ENDM SUBTTL BIOS CODE ORG SECTRN ;TRANSLATE SECTOR JP BIOFUNC ;EXECUTE FUNCTION CALL ;###########################################################R BUFFER STARTS HERE AFTER CRUNCHING COLD START ; CODE. THIS BUFFER IS USED BY THE CP/M DIRECTORY CHECK ROUTINES THAT ; CHECDITOR ; ; MODIFY COLD START VECTOR TO WARM START ; LD HL,(BIOS+4) LD (BIOS+1),HL ; ; BOOT CCP & BDOS ; JR WARM  CCP,BDOS FROM DISK & ; SETS UP VARIABLES ; ;---------------------------------------------------------- ; WARM: ; ; SET LD HL,(DEFBFR + BD_SCCPS) ;FETCH CCP TRK/SECTOR LD C,L LD B,0 CALL SETSEC ; LD C,H CALL SETTRK ; LD BC,CCP CALRK/SECTOR FROM DIRECTORY LD C,L LD B,A ;A STILL CONTAINS 0 CALL SETSEC ; LD C,H CALL SETTRK ; JR WREAD ; ; ; TOR INTO BDOS CODE ; LD HL,INTCPT LD (BDOS + 7),HL ; ; INITIALIZE CLOCK VECTORS IF CLOCK INSTALLED ; LD A,MF_CSYN ;TBIOS ;---------------------------------------------------------------------------- ; ; BIOS JUMP VECTOR TABLE ; ;--------################# ; ; THE FOLLOWING BOOT DATA MUST RESIDE AS DEFINED RIGHT BEFORE THE COLD ; INIT ROUTINE START AND MUST BE IK FOR DISK CHANGE. ; ;############################################################################ ; DIRBF: EQU $ ;BUFFER B ;############################################################################ ; ; SIGN-ON MESSAGE ; ;################### TEMPORARY STACK ; DI LD SP,DEFBFR LD (THIS_STK),SP EI ; ; LOG ON DRIVE TO INIT TABLES ; LD A,(DK_BDRV) AND A,L SETDMA ; ; READ CCP/BDOS ; WREAD: CALL DISKRD JR NZ,WEROR ;IF ERROR THEN EXIT ; ; NEXT SECTOR ; LD HL,BTSEC I WARM BOOT ERROR, OUTPUT MSG & HALT ; WEROR: LD HL,MSGLE ;OUTPUT ERROR MESSAGE CALL EDITOR HALT ; ; ; BOOT OK, INIT PEST FOR BOARD PRESENT CALL XMROM ; ; IF CLOCK PRESENT THEN TURN ON CLOCK DRIVE ; OR A,A LD A,38H ;COND. JR (ON) JR-------------------------------------------------------------------- ; JP INIT1 ;COLD START ENTRY JP WARM ;RELOAD CCP/BDON THE 1ST SECTOR. THESE 2 WORDS ARE ; REFERENCED BY THE BOOT LOADER CODE IN ORDER TO DETERMINE THE LOAD ADDRESS ; AND LENGTH OEGINNING ;---------------------------------------------------------------------------- ; ; INIT - COLD START ENTRY FR######################################################### ; MSGSO: DB CR,LF DB CPMSZ / (KBYTE * 10) + '0' DB (CPMSZ MOD (K3 ;MODULO 4 LD C,A LD E,0 CALL SELDSK LD A,L ;IF ERROR THEN ABORT OR A,H JR Z,WEROR ; ; READ BOOT DIRECTORY ;NC (HL) ; LD DE,(IOPB + PB_BCNTO) ;SECSZ ;DMA := DMA + SECTOR SIZE LD HL,(BTDMA) ADD HL,DE LD (BTDMA),HL ; ; IF NOTAGE 0 ; WZRPG: ; ; INIT BIOS WARM START IN PAGE 0 ; LD A,0C3H LD HL,BIOS + 3 LD (PAGE0),A LD (PAGE0 + 1),HL ; ; Z,CLKON ; ; ELSE TURN OFF CLOCK DRIVE ; LD A,18H ;UNCOND. JR (OFF) (CAUSES JUMP TO ILLEGAL) ; CLKON: LD (INHCLK),A ;S JP CNSCK ;GET CONSOLE STATUS JP CI ;CONSOLE INPUT JP COC ;CONSOLE OUTPUT JP LO ;PRINTER OUTPUT JP PUNCH JP REAF THE BIOS. ; ;############################################################################ ; DB 0 ;Z80 CPU DB 0 ;SPAREOM BOOT MUST SET ALL BIOS PARAMS ; ;---------------------------------------------------------------------------- ; INIT: ; BYTE * 10)) / KBYTE + '0' DB 'K CP/M-80 Vers 2.2',CR,LF DB 'M5b CBIOS Vers ' PVERS VERSN DM CR,LF IF $ > (DI LD BC,DEFBFR ;SET XFER ADDRESS (USE DEFAULT BUFFER) CALL SETDMA ; LD BC,BD_SEC ;SET DIRECTORY SECTOR CALL SETSEC ;  INTO BDOS THEN READ NEXT SECTOR ; LD DE,BDOS XOR A,A SBC HL,DE JR C,WREAD ; ; ELSE IF AT BEGINNING OF BDOS THEN SE INIT BDOS CALL VECTOR IN PAGE 0 ; LD HL,BDOS + 6 LD (BDOSJV),A LD (BDOSJV + 1),HL ; ; INIT BIOS CALL VECTOR IN PAG ENDIF ; ; PASS DEFAULT DISK TO CCP ; LD A,(DEFDRV) LD C,A JP CCP SUBTTL BIOS DISK FUNCTION ROUTINES ;+++++DER JP HOME ;HOME SELECTED DRIVE JP SELDSK ;SELECT DISK DRIVE JP SETTRK ;SET TRACK # JP SETSEC ;SET SECTOR # JP SE BIOSSZ: DW BIOSND - BIOS ;BIOS MODULE SIZE IN BYTES BIOSST: DW BIOS ;BIOS MODULE LOAD ADDR FOR SBD ; ; CONTINUE ON WITH  ; SET TEMPORARY STACK ; DI LD SP,DEFBFR ;USE PAGE 0 FOR STACK LD (THIS_STK),SP EI ; ; INIT DEFAULT DRIVE ; LDRBF + SECSZ) CONMSG **** WARNING! COLD INIT CODE BIGGER THAN DIR BUFFER **** ELSE DS DIRBF+SECSZ-$ ;FILL OUT DIRECTORY  LD BC,0 ;SET TRACK TO 0 CALL SETTRK ; CALL DISKRD JR NZ,WEROR ; ; CHECK FOR VALID BOOT DIRECTORY ; LD A,(DEFBFRT UP NEW TRACK & SECTOR ; JR Z,RDBDOS ; ; ELSE IF NOT AT BIOS THEN READ NEXT SECTOR ; LD DE,BIOS - BDOS SBC HL,DE E 0 ; LD HL,BIOFUNC LD (BFUNRSV),A LD (BFUNRSV + 1),HL ; ; SET DEFAULT SECTOR BUFFER ; LD BC,DEFBFR CALL SETDMA +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; READ A DISK SECTOR ; EXIT - A= 0: OK; /0: ERROR !0 %+ &, !'- "(. #)/ $*0; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; DISKRD: ; ; ENABLE UPLOAD (READ DATA) E OP JP DISKOP ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SELECT DRIVE FUNCTION DDRESS INC HL LD D,(HL) INC HL LD (DVRXADR),DE ; ; FETCH FLAGS ; LD C,(HL) ; ; COMPUTE DISK PARAMETER TABLE A 2: EXTENDED, ; 3: PARTITIONED, ID JR Z,LGDEF ; ; ELSE IF OLD FORMATS THEN PAD DPB DATA ; CP A,3 JR NC,IDOK ; POP HL LD BC,DVRSIZ - DVRFLG LDIR ; ; RETURN DRIVE TABLE PTR ; LD HL,(DTPTR) XOR A,A RET ; ; ; IF NOT HARD D HOME: LD BC,0 ; ; FALL INTO SET TRACK ; ;***************************************************************************TDMA),BC CALL GETBNK ;FETCH BANK ADDRESS FROM MONITOR LD (BTDMAX),A RET ;+++++++++++++++++++++++++++++++++++++++++++HL,BC RET SUBTTL DISK SUPPORT ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ;; XOR A,A LD (BTFLG),A ; ; DISABLE DOWNLOAD (WRITE DATA) ; LD (IOPB + PB_BCNTO),A LD (IOPB + PB_BCNTO + 1),A ; ;  ; LOG-ON - SET DISK PARAMETER BLOCK ; ENTRY- C= DRIVE # ; E= 0 IF NEW SELECT ; EXIT - HL= PTR TO DPT OR 0 FOR ERROR ; ;++DDRESS ; LD HL,(BTDRV) LD H,0 ADD HL,HL ;DISK # * 16 ADD HL,HL ADD HL,HL ADD HL,HL LD DE,D0DPH ADD HL,DE ; ; LD HL,DEFBFR + ID_PSHO ;FILL DATA WITH 0S LD B,ID_FLGO - ID_PSHO ; PADIDL: LD (HL),0 INC HL DJNZ PADIDL ; ; ELSE XISK THEN GO DO FLOPPY TEST ; LGDEF: LD A,(BTDRV) IF STHD <> 0 CP A,STHD JR C,LGCKFD ENDIF CP A,NDHD + 1 JR NC,* ; ; SET TRACK # ; ENTRY- BC= TRACK # ; ;**************************************************************************** ; +++++++++++++++++++++++++++++++++ ; ; SECTOR TRANSLATION FUNCTION ; ENTRY- DE= 0: NO XLATE, ELSE PTR TO XLATE TABLE ; BC= S ; LOGON DISK FUNCTION ; EXIT - A= 0: OK; /0: ERROR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ PASS READ COMMAND ; LD A,PB_READC ;SELECT READ OP JP DISKOP ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; SELDSK: ; ; ASSUME ERROR ; LD HL,0 ; ;  IF NOT FIRST SELECT OR LOGON INHIBITED THEN RETURN TABLE PTR ; LD A,(LOGRQ) OR A,C CPL AND A,1 RET Z ; ; ELSE FER ID SECTOR DATA TO TABLES ; IDOK: CALL TRNONE ;ASSUME NO TRANSLATION ; ; IF HARD DISK OR DOUBLE DENSITY THEN NO TRANSLLGCKFD ; ; ELSE USE HARD DISK DEFAULTS ; CALL TRNONE ; NO XLATE LD HL,HDPBK ; ; XFER DATA TO TABLES ; SEL2: PUSSETTRK: LD (BTTRK),BC RET ;**************************************************************************** ; ; SET SECTOECTOR # TO XLATE ; EXIT - HL= XLATED SECTOR OR BC + 1 ; BC= UNCHANGED ; A, DE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++ ; DISKLOG: ; ; SET DESCRIPTOR SECTOR XFER ADDRESS TO DEFAULT BUFFER ; LD HL,DEFBFR LD (IOPB + PB_DMAO),HL C+++++++++++++++++++++ ; ; WRITE A DISK SECTOR ; EXIT - A= 0: OK; /0: ERROR ; ;+++++++++++++++++++++++++++++++++++++++++++++ IF UNSUPPORTED DRIVE REQUESTED THEN RETURN 0 (ERROR) ; LD A,C CP A,NDRVS RET NC ; ; STORE DRIVE # FOR FUTURE USE ; LOG ON DRIVE ; LD (DTPTR),HL ;SAVE DRIVE TABLE PTR ; ; ATTEMPT TO READ ID SECTOR ; XOR A,A ;INIT FLAG BYTE UNTIL FIRMATION ; LD A,(DEFBFR + ID_FLGO) AND A,[1 SHL DF_DTDB] OR [1 SHL DF_HARDB] ; ; ELSE SET TRANSLATION ; CALL Z,TR8 ; H HL CALL DPBAD ; USE DEFAULT TABLE POP HL LD BC,DPBSZ LDIR JR SEL1 ; ; ; USE 8" FLOPPY DEFAULTS ; LGCKFD: CAR ; ENTRY- BC= SECTOR # ; ;**************************************************************************** ; SETSEC: LD (BTS+++++++++++++++++++++++++++++++++++++++ ; SECTRN: ; ; IF NO TRANSLATION THEN RETURN SECTOR++ ; LD A,D ;IF TABLE ADDR = ALL GETBNK LD (IOPB + PB_DMAXO),A ; ; SET DESCRIPTOR SECTOR SECTOR ; LD HL,ID_SECT LD (IOPB + PB_SECO),HL ; ; SET+++++++++++++++++++++++++++++++ ; DISKWR: ; ; DISABLE UPLOAD (READ DATA) ; LD A,1 SHL PB_INHX LD (BTFLG),A ; ; EN LD (BTDRV),A ; ; SAVE LOGON REQUEST FLAG ; LD A,E LD (LOGRQ),A ; ; COMPUTE DISK DRIVER TABLE PTR ; CALL RETDVRWARE REVISED LD (IOPB + PB_ST2O),A ; CALL DISKLOG JP NZ,FDSKER ; ; IF NO ID SECTOR THEN USE DEFAULT DPB ; (NOTE: CON; XFER DISK DATA TO DPB ; NOX: CALL DPBAD ;GET ADDR OF DPB LD HL,DEFBFR + ID_SPTO LD BC,DPBSZ LDIR ; ; XFER DISKLL TR8 LD HL,SD8PBK JR SEL2 ;**************************************************************************** ; ; HOME EC),BC RET ;**************************************************************************** ; ; SET TRANSFER ADDR ; ENTRY0 THEN NO TRANSLATION OR A,E JP Z,NOTRAN ; ; ELSE CALCULATE NEW SECTOR FROM TABLE ; EX DE,HL ADD HL,BC LD L,(HL)  DESCRIPTOR SECTOR TRACK ; LD L,H ;H == 0 FROM LAST OPERATION (HL= 0) LD (IOPB + PB_TRKO),HL ; ; ENABLE UPLOAD ; LDABLE DOWNLOAD (WRITE DATA) ; LD HL,SECSZ LD (IOPB + PB_BCNTO),HL ; ; PASS WRITE COMMAND ; LD A,PB_WRITC ;SELECT WRITT ;DRIVE IS STILL IN C REGISTER LD (DVRTPTR),HL ; ; PREFETCH DRIVER EXECUTION ADDRESS FROM TABLE ; LD E,(HL) ;STORE ATROLLER HAS SET IT'S DISK DEFAULTS IN DEFBFR IN ALL CASES) ; LD A,(IOPB + PB_ST2O) CP A,-1 ;-1:NONE, 0:JADE, 1:DESCRIPTOR, PHYSICAL DATA TO TABLE ; LD HL,DEFBFR + ID_FLGO ; SEL1: PUSH HL LD HL,(DVRTPTR) LD DE,DVRFLG ADD HL,DE EX DE,HL DRIVE - TREAT AS SEEK TRK 0 ; EXIT - BC= 0 ; ;**************************************************************************** ;- BC= ADDRESS ; EXIT - A= ? ; ;**************************************************************************** ; SETDMA: LD (B ; LD H,0 RET ; ; ; CONVERT FROM CP/M'S LOGICAL SECTOR {0..N-1} TO PHYSICAL SECTOR {1..N} ; NOTRAN: LD HL,1 ADD  A,L ;L= 0 LD (IOPB + PB_FLGO),A ; ; DISABLE DOWNLOAD ; LD (IOPB + PB_BCNTO),HL ; ; PASS COMMAND TO EXECUTOR ; "0 %+ &, !'- "(. #)/ $*0LD A,PB_LOGC JR DISKOP2 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; COMMON DISK IIF NO_ERROR THEN RETURN ; ; PRINT ERROR ; CALL GETBNK ;SETUP BANK FOR FUTURE COMPATABILITY LD E,A LD HL,IOPB LD A,SELECT FUNCTION LD A,-1 ;RETURN -1 TO BDOS OR A,A RET ;*************************************************************; RETURN DRIVE PARAMETER BLOCK ADDR FUNCTION ; EXIT - DE= DPB PTR ; HL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++IVE ; LD A,(BTDRV) ;IF EVEN THEN ADD 0 ELSE ADD 128 RRCA AND A,80H LD E,A ;COMPUTE SECTOR LD D,0 LD HL,(IOPB + PBITY LD A,MF_XIOB ;SET MONITOR FUNCTION # CALL XMROM ;EXECUTE THE FUNCTION ; OR A,A ;FUNCTION ERR? RET NZ ; ; RETUO) PUSH HL ;SAVE FOR ERROR RESTORE ; LD A,(IOPB + PB_SECO +1) ;FETCH SIDE SELECT BYTE ADD A,A ;SHIFT OUT BIT 7 ; S+++++++++++++++++++++++++++++++++++++++++++++ ; BIOFUNC: ; ; IF FUNCTION # NOT IN TABLE THEN RETURN -1 ; LD A,C CP A,/O CODE ; ENTRY- A= IOPB COMMAND ; EXIT - A= 0: OK; /0: ERROR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++MF_DIOB ;USE DISPLAY IOPB DATA FUNCTION CALL XMROM ; ; QUERY USER FOR OPTION ; LD HL,DSKEB CALL EDITOR ; ; GET US*************** ; ; SET 3740 SECTOR TRANSLATION PROCEDURE ; ENTRY- (DTPTR)= MUST BE PTR TO DTP ; EXIT - DE, HL= ? ; ;*****++++++++++++++++++++++++++++++ ; DPBAD: LD HL,(DTPTR) ;FETCH BASE ADDR LD DE,10 ;ADD OFFSET OF DPB PTR ADD HL,DE LD E,(_SECO) ; PUSH HL ;SAVE SECTOR TO RESTORE LATER ; ADD HL,DE LD (IOPB + PB_SECO),HL ; ; EXECUTE IOPB ; CALL XPRIMRN THE COMMAND RESULTS STATUS ; LD A,(IOPB + PB_STATO) OR A,A RET SUBTTL JADE FLOPPY DRIVER ROUTINES ;++++++++++++RL H ;SHIFT TRACK HIGH BYTE RR L ;ROTATE BIT 8 TO 7 AND 0 TO CF RRA ;ROTATE TRACK BIT 0 INTO SECTOR BIT 15 LD (IOPBMAXFUNCS LD A,-1 RET NC ; ; ELSE COMPUTE TABLE ENTRY ; PUSH HL ;SAVE POSSIBLE DATA ; LD HL,BFUNTBL LD A,C ADD+++++++++++++++++ ; DISKOP: ; ; SET UP IOPB ; LD HL,BTTRK LD DE,IOPB + PB_TRKO LD BC,PB_BCNTO - PB_TRKO LDIR ; ER RESPONSE ; CALL CI ;GET USER RESPONSE ; PUSH AF ;SAVE CHAR LD C,A ;ECHO CHAR CALL COC POP AF ; AND A,5FH ;*********************************************************************** ; TR8: TR3740: LD DE,SDTRAN ; SETTR: LD HL,(DTPTR) HL) ;FETCH DPB PTR INC HL LD D,(HL) RET SUBTTL HARD DISK ROUTINES ;+++++++++++++++++++++++++++++++++++++++++++++++ ; ; RESTORE SECTOR ; POP HL LD (IOPB + PB_SECO),HL ; ; DONE ; RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; JADE 8" FLOPPY DISK DRIVER FUNCTION ; ENTRY- IY= DRIVER  + PB_SECO +1),A ; LD (IOPB + PB_TRKO),HL ;STORE SHIFTED TRACK ; ; EXECUTE THE IOPB ; CALL XPRIM ; ; RESTORE THE M A,A ADD A,L LD L,A LD A,0 ADC A,H LD H,A ; ; EXECUTE TABLE ADDRESS ; LD A,(HL) INC HL LD H,(HL) LD L,A DISKOP2: LD (IOPB + PB_CMDO),A ; ; FETCH DRIVER VECTOR & EXECUTE DISK DRIVER ; DKOPLP: PUSH IY ;SAVE IY LD IY,(DVRTINSURE UPPER CASE ; ; IF RETRY THEN RETURN TO CALLER ; CP A,'R' ;IF RETRY THEN RETURN TO CALLER JR Z,DKOPLP ; ; EL LD (HL),E INC HL LD (HL),D RET ;**************************************************************************** ; ; +++++++++++++++++++++++++++++ ; ; HARD DISK DRIVER FUNCTION ; ENTRY- IY= DRIVER TABLE PTR ; EXIT - A= 0: OK; /0: ERROR ; ;+++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE IOPB PRIMITIVE ; EXIT - A= 0: OK, /0: ERROR ; ;++++++++++++++++++++TABLE PTR ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; FDODIFIED IOPB SO RETRY WILL WORK ; POP HL ;TRACK LD (IOPB + PB_TRKO),HL ; LD HL,IOPB + PB_SECO +1 ;CLEAR BIT 15 RES 7; EX (SP),HL ;PUT CALLER'S DATA IN HL, FUNCTION ADDR ON RET ; STACK, EXECUTE FUNCTION ADDRESS ON STACK ;############PTR) ;FETCH TABLE BASE ; LD HL,DKOPRET ;PUT RETURN ADDRESS ON STACK PUSH HL ; LD HL,(DVRXADR) ;FETCH DRIVER ADDRESS PREFSE IF ABORT THEN DO WARM BOOT ; CP A,'A' ;IF ABORT THEN RE-BOOT JP Z,0 ; ; ELSE IF IGNORE THEN RETURN NO ERROR ; SUSET NO SECTOR TRANSLATION PROCEDURE ; EXIT - HL, DE= ? ; ;*******************************************************************++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; HDEXEC: ; ; CONVERT LOGICAL DRIVE TO PHYSIC++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; XPRIM: ; ; SET BANK ADDRESS TO THIS BANK FOR NOW ; CALL GETB8EXEC: ; ; CONVERT LOGICAL DRIVE TO PHYSICAL DRIVE ; LD A,(IY + DVRPDRV) LD (IOPB + PB_DRVO),A ; ; IF HEADS == 1 TH,(HL) ; ; DONE ; RET SUBTTL BIOS FUNCTION CALLS ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++################################################################ ; ; BIOS FUNCTION TABLE ; ;################################ETCHED FROM TABLE JP (HL) ; ; DRIVER RETURNS HERE ; DKOPRET: POP IY ; ; IF NO ERRORS THEN RETURN ZF ; RET Z ;B A,'I' ;IF IGNORE THEN RETURN NO ERROR RET Z ; ; ELSE RETURN ERROR TO BDOS ; FDSKER: LD HL,0 ;RETURN DPB_PTR = 0 FOR ********* ; TRNONE: LD DE,0 JR SETTR ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; AL DRIVE ; LD A,(IY + DVRPDRV) ;0,1: DRV 0, 2,3: DRV 1 LD (IOPB + PB_DRVO),A ; ; OFFSET LOGICAL ADDRESS WITH LOGICAL DRNK LD E,A ;PRESET IOPB BANK LD (IOPB + PB_DMAXO),A ; ; EXECUTE THE PRIMITIVE IN ROM ; LD HL,IOPB ;BANKED COMPATABILEN EXECUTE IOPB ; LD A,(IY + DVRHDS) DEC A JP Z,XPRIM ; ; ELSE SELECT SIDE FROM TRACK BIT 0 ; LD HL,(IOPB + PB_TRK+++++++++++ ; ; FUNCTION DISPATCHER ; ENTRY- C= FUNCTION # ; EXIT - A= -1: ERROR, 0: OK ; ;+++++++++++++++++++++++++++++++############################################ ; BFUNTBL: DW RETVERS ;0:RETURN VERSION # DW RETDVRTF ;1:RETURN DISK PHYSICA"0 %+ &, !'- "(. #)/ $*0L CONFIGURATION TABLE PTR DW EXIOPB ;2:EXECUTE THE IOPB MAXFUNCS EQU ($ - BFUNTBL) / 2 ;+++++++++++++++++++++++++++++++START AT 1ST TABLE ; ; IF DRIVE == 0 THEN ALREADY THERE ; LD A,C OR A,A RET Z ; ; ELSE IF ILLEGAL DRIVE THEN RETUCTION # (DISK FUNCTION) CALL XMROM ;EXECUTE MONITOR FUNCTION POP HL ; OR A,A ;FUNCTION ERROR? RET NZ ; ; FETCH & *************************************** ; PRHEX: LD C,A LD A,MF_PHXB JP XMROM ;************************************<= 40 THEN OK ; BDOSV EQU $ + 1 JP C,BDOS + 11H ;THIS ADDR MODIFIED BY WARM BOOT RTN ; ; THE FOLLOWING CONDITIONAL JUMP IOUTPUT NEW LINE ; CALL CRLF ; ; RETURN NULLS ; XOR A,A ;BC = HL = A = 0 LD L,A LD H,A LD C,A LD B,A RET ++++++++++++++++++++++++++++++++++ ; ; RETURN TIME FUNCTION 92H ; EXIT - A= SECONDS ; B= MINUTES ; C= HOURS ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN CONSOLE STATUS ; EXIT - A= 0: NOT READY ; FFH: CH+++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN BIOS VERSION # ; EXIT - HL= VERSION # IN BINARY {0.00,..655.35} ; RN ERROR ; CP A,NDRVS JR C,RETDV2 ; OR A,A RET ; ; ; ELSE COMPUTE TABLE PTR ; RETDV2: LD B,C LD DE,DVRSIZ ; RETURN RESULT STATUS ; LD A,PB_STATO ;FETCH STATUS ADD A,L LD L,A LD A,0 ADC A,H LD H,A LD A,(HL) ; OR A,A ;T*************************************** ; ; NEWLINE PROCEDURE ; ;***********************************************************S MODIFIED TO AN UNCONDITIONAL JUMP BY ; THE WARM BOOT ROUTINE IF THE CLOCK/CALENDAR BOARD IS NOT PRESENT ; IF NOT MODIFIED, ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CDOS RETURN VERSION FUNCTION ; MAKES CLO++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKTIM: LD A,MF_GTIM JP XMROM ENDIF ;+++++AR READY ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CNSCK: LD A,MF_CIS JP XMROM ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; RETVERS: LD HL,VERSN XOR A,A ;RETURN NO E RETDVL: ADD HL,DE DJNZ RETDVL ; PUSH HL CALL GETBNK LD E,A POP HL ; ; RETURN NO ERROR ; XOR A,A RET ;+EST RESULT FOR RETURN RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; GET BANK NU**************** ; CRLF: LD C,CR CALL COC LD C,LF JP COC IF INTCPTS SUBTTL ADDITIONAL FUNCTIONS TO SUPPORT CDOS THEN IT IS ALLWAYS FALSE (NOP). ; INHCLK: JR C,ILLEGC ; ; NOW CHECK FOR EXTENDED CALLS ; CP A,8DH ;IF RETURN VERSION TCK/CALENDAR WORK. ; EXIT - B= 1 ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; RETCVER: +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; MONITOR ROM EXECUTER ; ENTRY- A= FUNCTION # ; ; ;**************************************************************************** ; ; CONSOLE OUTPUT ; ENTRY- C= CHAR TO OUTPRROR RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN DRIVER TABLE PTR FUN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE IOPB FUNCTION ; ENTRY- HL= IOPB PTR MBER FUNCTION ; EXIT - A= BANK # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; GETBNK:  PROGRAMS ;*************************************************************************** ; ; SYSTEM CALL INTERCEPT ROUTINE CHECHEN RETURN IT JR Z,RETCVER ; CP A,90H ;IF NOT CLOCK THEN ERR JR C,ILLEGC ; JR Z,CLKCAL ;IF CALENDAR THEN GET IT ;  LD B,1 RET SUBTTL CLOCK ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RE++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; XMROM: EQU MR_FUN SUBTTL CHAR I/O ROUTINEUT ; ;**************************************************************************** ; COC: LD A,MF_CO JP XMROM ;++++CTION ; ENTRY- E= DRIVE # ; EXIT - E:HL= DRIVER TABLE BASE PTR ; A, C= 0 ; B= ? ; ;+++++++++++++++++++++++++++++++++++++; EXIT - A= 0: OK ; HL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; EXIOPB: ; ;  LD A,MF_GBNK JP MR_FUN SUBTTL NON-DISK PROCEDURES ;*****************************************************************KS FOR ILLEGAL BDOS CALLS & ; PRINTS MESSAGE IF ILLEGAL. ALSO IMPLEMENTS CDOS CLOCK/CALENDAR ; SYSTEM CALLS FOR ASMB. ; ;*CP A,92H JR Z,CLKTIM ;IF TIME THEN GET IT ; ; ILLEGAL SYSTEM CALL ; ILLEGC: PUSH BC ;SAVE FUNCTION # ; ; OUTPUT WARNTURN CALENDAR FUNCTION 90H ; EXIT - A= DAY ; B= MONTH ; C= YEAR ; L= DAY OF WEEK ; ;+++++++++++++++++++++++++++++++++++S ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CONSOLE INPUT ; EXIT - A= CHAR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; READER DRIVER - DUMMY ; EXIT - A= CTRL-Z ; ;+++++++++++++++++++++++++++++++++++++++++ ; ; BIOS CALL ENTRY (E= DRIVE #) ; RETDVRTF: LD C,E ; RETDVRT: LD HL,DVR0 ; SET UP FOR CALL ; PUSH HL ;SAVE PTR ; CALL GETBNK ;E= IOPB PTR IS IN THIS BANK LD E,A ; LD A,MF_XIOB ;MONITOR FUN*********** ; ; OUTPUT HEX DATA TO CONSOLE SUBR ; ENTRY- A= DATA ; EXIT - A, C= ? ; ;*************************************************************************************************************** INTCPT: LD A,C ;CHECK CALL VALIDITY CP A,41 ;IF ING MESSAGE ; LD HL,ISCMSG ;OUTPUT WARNING CALL EDITOR ; ; OUTPUT FUNCTION # ; POP HL LD A,L CALL PRHEX ; ; +++++++++++++++++++++++++++++++++++++++++ ; CLKCAL: LD A,MF_GCAL JP XMROM ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CI: LD A,MF_CI JP XMROM ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; READER: LD A,CTRLZ ;FAKE EOF ; ; FALL INTO P#0 %+ &, !'- "(. #)/ $*0UNCH RETURN ; ;**************************************************************************** ; ; PUNCH DRIVER ; ENTRY- C******************************************************************** ; ; MESSAGE EDITOR ; ENTRY- HL= TEXT PTR (BIT 7= 1: TERM########## ; IOPB: REPT PB_SIZE LIST OFF DB 0 LIST ON ENDM ;#####################################################RS DVRHDS DS 1 ;HEADS ; ; DEFINE THE STRUCTURE SIZE ; DVRSIZ DS 0 ENDM ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@SECTORS, SIZE DB #SD,#ZD ;DATA TRKS SECTORS, SIZE DB #DT ;DISK TYPE DW #CY ;CYLS DB #HD ;HEADS ; LIST OFF ENDM 1,32,1,10H,256,4 DVR5: ;F ALLDRV HDEXEC,5,60H,32,1,32,1,32,1,10H,256,4 ENDIF LIST ON ;############################NULL MASK DW 242 ;DISK SIZE -1 DW 63 ;DIRECTORY MAX DB 11000000B ;ALLOC 0 DB 0 ;ALLOC 1 DW 16 ;CHECK SIZE DW 2 15 ;DISK SIZE (CLUSTERS -1) (DSM) DW 1152 / 2 ;DIRECTORY MAX (DRM) DB 0FFH ;ALLOCATION 0 (AL0) DB 10000000B ;ALLOCAT= CHAR TO OUTPUT ; ;**************************************************************************** ; PUNCH: RET ;********INATOR) ; EXIT - REGS= ? ; ;**************************************************************************** ; EDITOR: CALL G####################### ; ; DISK DRIVER TABLES ; ;##########################################################################@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; MACRO TO DEFINE THE DRIVER TABLE RECORD ; ENTRY- #DADD= DRIVER ADDRESS ; #PD= PHYSIC IF BOOT = 10H DVR0: ;A ALLDRV HDEXEC,4,60H,32,1,32,1,32,1,10H,256,4 DVR1: ;B ALLDRV HDEXEC,4,60H,32,1,32,1,32,1,10H,################################################ ; ; MESSAGES ; ;#########################################################;TRACK OFFSET DB 0 ;PHYSICAL RECORD SHIFT FACTOR DB 0 ;PHYSICAL RECORD MASK DW 0 ;LOGICAL DRIVE SECTOR OFFSET ; ; DION 1 (AL1) DW 0 ;CHECK SIZE (CKS) DW 2 ;TRACK OFFSET (OFF) DB 1 ;PHYSICAL RECORD SHIFT FACTOR (PSH) DB 1 ;PHY******************************************************************** ; ; PRINTER DRIVER ; ENTRY- C= CHAR TO OUTPUT ; ;*****ETBNK LD E,A LD A,MF_PUTS JP XMROM SUBTTL INITIALIZED DATA ;######################################################### ; STRUCT 0 DVRADD DS 2 ;START ADDRESS OF DISK DRIVER DVRFG DS 1 ;FLAGS (BIT 0= 1: INHIBIT LOGON) DVRPDRV DS 1 ;PHYSICALAL DRIVE # ; #FG= DRIVE FLAGS (IDFLGO) ; #S0= TRK 0 SPT ; #Z0= TRK 0 SIZE ; #S1= TRK 1 SPT ; #Z1= TRK 1 SIZE ; #SD= 256,4 DVR2: ;C ALLDRV HDEXEC,5,60H,32,1,32,1,32,1,10H,256,4 DVR3: ;D ALLDRV HDEXEC,5,60H,32,1,32,1,32,1,10H,256,4 DVR4: ;################### ; MSGLE: DM CR,LF,'LOAD ERROR' ; DSKEB: DM CR,LF,'Abort, Ignore, Retry, (BDOS) - ' ; IF INTCPTS ISEFAULT DISK PHYSICAL PARAMETERS ; DB 0 ;FLAGS DB 26,0,26,0,26,0 ;SECTORS PER TRACK, SECTOR SIZE (128) DB 0 ;TYPE DW 7SICAL RECORD MASK (PRM) DW 0 ;LOGICAL DRIVE SECTOR OFFSET (SOF) ; ; ; DB 01100000B ;FLAGS 256 BPS, HARD, SSSD DB 32,1*********************************************************************** ; LO: LD A,MF_LO JP XMROM ;++++++++++++++++++##################### ; ; 3740 SECTOR TRANSLATION TABLE ; **** CP/M SINGLE DENSITY **** ; ;################################ DRIVE # ; ; THE FOLLOWING MAY BE BROUGHT OFF DISK DESCRIPTOR OR FROM DEFAULT TABLES ; DVRFLG DS 1 ;DISK FLAGS DVR0SPT DSDATA TRKS SPT ; #ZD= DATA TRKS SIZE ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ALLDE ALLDRV FD8EXEC,0,0,26,0,26,0,26,0,0,77,1 DVR5: ;F ALLDRV FD8EXEC,1,0,26,0,26,0,26,0,0,77,1 ENDIF IF BOOT = 3 DVRCMSG: DM CR,LF,'ILL SYS CALL, #= ' ENDIF ;############################################################################ 7 ;CYLS DB 1 ;HEADS ;############################################################################ ; ; DEFAULT 8" HARD,32,1,32,1 ;32 SPT, 256 BPS DB 10H ;TYPE DW 256 ;CYLS DB 4 ;HEADS ;###############################################++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN LIST DEVICE STATUS ; EXIT - A= 0: BUSY, FFH:READY ; ;############################################ ; SDTRAN: GXLATE 26,6 ;##################################################### 1 ;TRK 0 SECTORS PER TRK DVR0SZ DS 1 ;TRK 0 SECTOR SIZE DVR1SPT DS 1 ;TRK 1 SECTORS PER TRK DVR1SZ DS 1 ;TRK 1 SECTOR SIZE RV MACRO #DADD,#PD,#FG,#S0,#Z0,#S1,#Z1,#SD,#ZD,#DT,#CY,#HD LIST ON DW #DADD ;DRIVER EXECUTION ADDR DB 0 ;LOGON INHIBIT F0: ;A ALLDRV FD8EXEC,0,0,26,0,26,0,26,0,0,77,1 DVR1: ;B ALLDRV FD8EXEC,1,0,26,0,26,0,26,0,0,77,1 DVR2: ;C ALLDRV HDEXEC, ; ; DEFAULT 8" FLOPPY DISK PARAMETER BLOCK ; IBM 3740 SINGLE DENSITY FORMAT ; ;############################################ DISK PARAMETER BLOCK ; ;############################################################################ ; HDPBK: DW 128 ;SECT############################# ; ; DRIVE PARAMETER HEADER AREA ; 1 PER DRIVE ; ;############################################++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; LISTST: LD A,MF_LOS JP XMROM ;********####################### ; ; COMMON I/O PARAMETER BLOCK ; ;##################################################################DVRDSPT DS 1 ;DATA TRKS SECTORS PER TRK DVRDSZ DS 1 ;DATA TRKS SECTOR SIZE DVRDTYP DS 1 ;DISK TYPE DVRCYLS DS 2 ;DISK CYLINDELAG (LOGON ENABLED) DB #PD ;MONITOR PHYSICAL DRIVE # DB #FG ;DISK FLAGS DB #S0,#Z0 ;T0 SECTORS, SIZE DB #S1,#Z1 ;T1 4,60H,32,1,32,1,32,1,10H,256,4 DVR3: ;D ALLDRV HDEXEC,4,60H,32,1,32,1,32,1,10H,256,4 DVR4: ;E ALLDRV HDEXEC,5,60H,32,1,32,################################ ; SD8PBK: DW 26 ;SECTORS PER TRACK DB 3 ;BLOCK SHIFT FACTOR DB 7 ;BLOCK MASK DB 0 ;ORS PER TRACK (LOGICAL) (SPT) DB 5 ;BLOCK SHIFT FACTOR (BSH) DB 31 ;BLOCK MASK (BLM) DB 1 ;NULL MASK (EXM) DW 10################################ ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERAT#0 %+ &, !'- "(. #)/ $*0E A DISK PARAMETER TABLE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ALLDPH: MACD EQU $ SUBTTL UNINITIALIZED DATA AREA ;############################################################################ ; ;  EXECUTION ADDRESS SECOFF DS 2 ;LOGICAL DRIVE SECTOR OFFSET (ADD TO SECTOR) ;#############################################D)CHK DS 32 ;DIRECTORY CHECKSUMS STORAGE (1 BYTE PER SECTOR) ENDIF LIST OFF ENDM ; ; RESERVE THE DATA SPACE ; DK= 3, 16K= 7 DPBDSM DS 2 ;DSM- DRIVE STORAGE SIZE (IN CLUSTERS) ; INT(((#_TRACKS - OFF) * SPT * BYTES PER SECTOR) / CLUSTER ENTED THRU BDOS USING DPBOFF ABOVE. ; PARTITIONING BY HEADS ARE IMPLIMENTED BY USING THE FOLLOWING DATA. ; (HEAD BITS ARE INTOO BIG, USE MOVCPM & RE-ADJUST! **** ENDIF END ERRUPT ; ;---------------------------------------------------------------------------- ; ITRAP: ; ; SAVE REGS FIRST ; RO #D LIST ON D#D(DD)DPH: ;DRIVE PARAMETER HEADER FOR DRIVE #D(DD) DW 0 ;;SECTOR TRAN TBL (OR 0 IF NO XLATE) DW 0 ;;S THE FOLLOWING DATA MUST RESIDE IN THIS ORDER TO MATCH THE IOPB DATA ; ;#################################################################################### ; ; DRIVE ALLOCATION AREAS ; ;############################################################D DL 1 REPT NDRVS LIST OFF ALLDAL 0123456789ABCDEF DD DL DD + 1 LIST ON ENDM ;##################################SIZE) -1 DPBDRM DS 2 ;DRM- DIRECTORY SIZE -1 DPBAL0 DS 2 ;AL0,1- DIRECTORY ALLOCATION ; 1 MSB PER DIRECTORY CLUSTER ALLOCACLUDED IN SECTOR WORD UPPER BITS) ; DPBSOF DS 2 ;SOF- SECTOR OFFSET (FOR LOGICAL DRIVE) ; 0: NONE, 1..65535: OFFSET DPBSZ++++++++++++++++ ; ; RETURN LIST DEVICE STATUS ; EXIT - A= 0: BUSY, FFH:READY ; ;++++++++++++++++++++++++++++++++++++++++++ PUSH AF PUSH HL PUSH BC PUSH DE ; ; SAVE CURRENT ROM & GET MONITOR ROM ; IN A,(M2_RSEL) LD (ROMSAV),A LD A,MR_CRATCH AREA DW 0 ;;" DW 0 ;;" DW DIRBF ;;DIRECTORY BUFFER PTR DW D#D(DD)DPB ;;DRIVE PARAMETER BLK PTR IF ((DD - 1####################### ; BTDRV: DS 1 ;DRIVE # BTTRK DS 2 ;TRACK # BTSEC DS 2 ;SECTOR # BTFLG DS 1 ;RESERVED FOR FLAGS BTD################ ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; MACRO TO DEFINE THE DRI########################################## ; ; RESERVE DRIVE PARAMETER BLOCKS ; ;#########################################TED DPBCKS DS 2 ;CKS- # DIRECTORY SECTORS CHECKED ; (DRM +1) / 4 DPBOFF DS 2 ;OFF- # RESERVED TRACKS (USUALLY 2) ; ; A DS 0 ENDM ; ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE THE DPB FOR DRI++++++++++++++++++++++++++++++++++ ; LISTST: LD A,MF_LOS JR XMROM ;**************************************************RNUM OUT (M2_RSEL),A ; ; PRINT PROMPT ; LD HL,ITMSG IQCONT: LD A,MF_PUTS CALL MR_FUN ; LD HL,IQMSG ;QUERY USER ) <= NDHD) AND ((DD - 1) >= STHD) DW 0 ;;NO CHECKS ON HARD DISK ELSE DW D#D(DD)CHK ;;DRIVE DISK CHECKSUMS ARRAY PTR MA DS 2 ;DMA ADDRESS BTDMAX DS 1 ;DMA EXTENDED ADDRESS ;##################################################################VE ALLOCATION & CHECKSUMS AREA ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ALLDAL: MAC################################### ; STRUCT 0 DPBSPT DS 2 ;SPT- SECTORS/TRACK DPBBSH DS 1 ;BSH- BLOCK SHIFT FACTOR DETERMIDDITIONAL CP/M 3.0 DATA (ALSO COULD BE USED BY CP/M 2.2 DEBLOCKING) ; DPBPSH DS 1 ;PSH- PHYSICAL RECORD SHIFT FACTOR BASED ON VE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ALLDPB: MACRO #D LIST ON D#D(D************************** ; ; MESSAGE EDITOR ; ENTRY- HL= TEXT PTR (BIT 7= 1: TERMINATOR) ; EXIT - REGS= ? ; ;*********** LD A,MF_PUTS CALL MR_FUN ; ; GET & ECHO USER INPUT ; LD A,MF_CI CALL MR_FUN ; PUSH AF LD C,A LD A,MF_CO CA ENDIF DW D#D(DD)ALL ;;DRIVE CLUSTER ALLOCATION BIT MAP PTR LIST OFF ENDM ; ; DEFINE THE DATA ; DD DL 1 REPT NDRVS########## ; ; VARIABLES ; ;############################################################################ ; DTPTR: DS 2 ;RO #D LIST ON IF ((DD - 1) >= STHD) AND ((DD - 1) <= NDHD) D#D(DD)ALL: DS 127 ;ALLOCATION BIT MAP FOR 8" HARD DRIVE #D(DDNED BY CLUSTER SIZE ; 1K= 3, 2K= 4, 4K= 5, 8K= 6, 16K= 7 DPBBLM DS 1 ;BLM- BLOCK MASK ; 1K = 7, 2K= 15, 4K= 31, 8K= 63,BYTES/SEC ; 0: 128, 1: 256, 2: 512, 3: 1024 DPBPHM DS 1 ;PHM- PHYSICAL RECORD MASK BASED ON BYTES/SEC ; 0: 128, 1: 256,D)DPB: DS DPBSZ ;ALLOCATION FOR DRIVE #D(DD) LIST OFF ENDM ; ; RESERVE THE DATA SPACE ; DD DL 1 REPT NDRVS LIST O***************************************************************** ; EDITOR: CALL GETBNK LD E,A LD A,MF_PUTS JR XMROM LL MR_FUN POP AF ; ; IF OPTION IS CTRL-C THEN WARM BOOT ; CP A,3 ;IF CTRL-C THEN WARM BOOT JP Z,PAGE0 ; ; IF OPT LIST OFF ALLDPH 0123456789ABCDEF DD DL DD + 1 LIST ON ENDM ; ; LAST OF INITIALIZED CODE READ FROM DISK ; BIOSNDRIVE TABLE PTR LOGRQ: DS 1 ;LOG ON REQUEST REG. DVRTPTR DS 2 ;DRIVE DRIVER TABLE BASE ADDRESS PTR DVRXADR DS 2 ;DRIVE DRIVER) ENDIF IF ((DD - 1) >= ST8FD) AND ((DD - 1) <= ND8FD) D#D(DD)ALL: DS 57 ;ALLOCATION BIT MAP FOR 8" DRIVE #D(DD) D#D(D 16K= 127 DPBEXM DS 1 ;EXM- EXTENT MASK ; DSM < 256 : 1K= 0, 2K= 1, 4K= 3, 8K= 7, 16K= 15 ; DSM > 255 : 2K= 0, 4K= 1, 8 3: 512, 7: 1024 ; ; ADDITIONAL DISK PARTITIONING DATA FOR THE LOGICAL DRIVE SELECTION. ; PARTITIONING BY TRACKS ARE IMPLIMFF ALLDPB 0123456789ABCDEF DD DL DD + 1 LIST ON ENDM IF (($ - 8000H) > 07700H) OR ($ < 8000H) CONMSG **** BIOS  IF INTRPTS SUBTTL INTERRUPTS ;---------------------------------------------------------------------------- ; ; USER INTION IS YES THEN WARM BOOT ; AND A,5FH ;IGNORE CASE ; CP A,'Y' JP Z,PAGE0 ; ; IF OPTION IS INTERRUPT THEN EXECUTE RE$0 %+ &, !'- "(. #)/ $*0 TITLE CUSTOMIZED BIOS FOR M5B LIST NOCOND ;============================================================================ ;  20H: 5" FLOPPY DEBUG EQU FALSE ;TRUE TO DUMP THE IOPB DATA TO PRINTER FORM ;********************************************HYSICAL DRIVE 1 ; C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; D SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 0 ; E SIDE 0 & ARGER BIOS ALLOCATION ON THE DISK. ; ; 2.2.4 - ADDED NAKED TERMINAL DRIVERS & IOBYTE IN ; ANTICIPATION OF THE MONITOR. AL 83 GRH ; Move clock-calendar routines to ROM. Add Interrupt handler ; (Mode 2). Change Revision display of sign-on (separat5 GRH ; Implemented hard disk drive 1 as C: & D:. ; Implemented the Logon function for the hard disk. ; Implemented user frON to specify the ID sector & track. At same time, fix bug ; which did not specify the logon track. ; ; 3.02 7 JUL 88 GRH******************************** SUBTTL SYSTEM DECLARATIONS ;============================================================; ASSEMBLY PARAMETERS ; ;============================================================================ FALSE EQU 0 TRUE EQU N******************************** ; ; CUSTOMIZED BIOS FOR M5B ; (c) 1981 GRH Electronics, CUPERTINO, CA ; ;************1 OF HARD DISK PHYSICAL DRIVE 1 ; F SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ENDIF IF BOOT = 20H ; A JADE 5" FLOPPSO, ALL REFERENCES ; REQUIRING THE I/O PROMS TO BOOT HAS BEEN REMOVED. ; ; 2.2.5 - RECONFIGURE FOR 62K SYSTEM. ; ; 2.2.e CBIOS rev). ; ; 2.00 - 24 MAR 84 GRH ; Modify for hard disk ; ; 2.01 - 28 APR 84 GRH ; Change hard disk DPB to refleiendly disk error options: Abort, Retry, Ignore. ; Solved warm boot hang problem by reseting host adapter if busy. ; ; 3.00 - ; Add '?' to include file names. ; Change hard disk system tracks directory reference to new format. ; Correct bug in driver================ ; ; INCLUDE JDDCONT.DEF ; INCLUDE COMIOPB.DEF ; INCLUDE DISKS.DEF ; INCLUDE MONBOARD.DEF ; INCLUDE ZMONROOT FALSE ;============================================================================ ; ; CONDITIONAL ASSEMBLY FLAGS ; ;**************************************************************** ; ; CONFIGURATION: ; ; CPM ; DRIVE USAGE IF BOOT = 10HY PHYSICAL DRIVE 0 ; B JADE 5" FLOPPY PHYSICAL DRIVE 1 ; C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; D SIDE 2 & 3 OF H6 - 20 FEB 83 ; DOUBLE D REV C UPGRADE. CHANGE BOARD STATUS PORT BITS. ; ; 2.2.7 - 8 MAR 83 GRH ; ADDED CLOCK/CALENDAR DRIVEct half size directory, but keep ; allocation for 1k directory ; ; 2.02 - 2 JUN 84 GRH ; Change floppy disk drivers to rel 26 JAN 87 GRH ; Implemented new common IOPB code & Jade floppy firmware support. ; Implemented disk drive driver tables ands which caused retry to fail. (sector remained ; corrupted) ; Stubbed out new Clock routines for present. ; ; 3.03 31 JUL M.DEF ; INCLUDE DKBTROM.DEF ; INCLUDE NAKEDT.DEF ; INCLUDE ISHA.DEF ; INCLUDE CLOKROM.DEF ; ;========================================================================================================= SHORT EQU FALSE ;SHORT BIOS (REMOVES UNESENTIAL C ;HARD DISK BOOT CONFIG. ; A SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; B SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 0 ; CARD DISK PHYSICAL DRIVE 0 ; E SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; F SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ; GR, SYSTEM CALL INTERCEPT, ; ILLEGAL SYSTEM CALL MESSAGE, CHANGED BIOS SIZE TO END ; OF INITIALIZED DATA AREA. RESTRUCTURE MODUate to ISASI control of JADE ; FDC. ; Change IOPB sector value from physical sector (1..n) to logical ; sector value (0 new function to return ; a ptr to a drive table. ; Removed init of IOBYTE. ; Implemented 5" floppy driver. ; Implemented u88 GRH ; Unstub Clock routines. ; ; 3.04 6 AUG 88 GRH ; Remove floppy side select from BIOS & move to controller. ; Imp=============================================== LIST OFF *INCLUDE JDDCONT.DEF *INCLUDE COMIOPB.DEF *INCLUDE DISKS.DEF *INCODE) LSTINC EQU FALSE ;LIST INCLUDE FILES USEMON EQU TRUE ;USE MONITOR ROM I/O ROUTINES IF TRUE INTRPTS EQU TRUE ;ENABLE I SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; D SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ; E JADE 8" FLOPPY PHYSICAL DRIVE 0 JADE 8" FLOPPY PHYSICAL DRIVE 0 ; H JADE 8" FLOPPY PHYSICAL DRIVE 1 ENDIF ; ;*****************************************LES. ; ; 2.28 - 22 APR 83 GRH ; CHANGED DEFINITIONS TO ALLOW BIG DIRECTORIES. ; DISALLOWED DRIVES C & D. ; ; 2.29 - 3 SE..n-1). This maintains more uniformity in ; parameter passing between hard disk & JADE floppy IOPBs. ; Vector I/O routines se of ROM primitives. ; Moved system down to 60k. ; ; 3.01 26 JUN 88 GRH ; Remove 5" floppy support. Implement in CP/M-86 Blement new ID sector format. ; Implement CP/M 3.0 DPB structure in preparation for deblocking. ; ; 3.05 11-3-88 GRH ; ChanLUDE MONBOARD.DEF *INCLUDE ZMONROM.DEF *INCLUDE DKBTROM.DEF *INCLUDE NAKEDT.DEF *INCLUDE ISHA.DEF *INCLUDE CLOKROM.DEF LINTERRUPT PROCESSING WHISTLE INTCPTS EQU TRUE ;ENABLE SYSTEM CALL INTERCEPT WHISTLE BOOT EQU 3 ;10H: HARD DISK, 3: 8" FLOPPY, ; F JADE 8" FLOPPY PHYSICAL DRIVE 1 ENDIF IF BOOT = 3 ; A JADE 8" FLOPPY PHYSICAL DRIVE 0 ; B JADE 8" FLOPPY P******************** ; REVISIONS: ; ; 2.2.0 - RELEASE ; ; 2.2.3 - SWAPPED DCM & BIOS SECTORS ON DISK, ALLOWING A ; LP 83 GRH ; Changed Rev # for blocked DCM. Enables IBM system 34 ; 256 bytes per sector disks to be read. ; ; 1.10 - 23 SEPto monitor rom routines. ; ; 2.03 - 4 JUN 84 GRH ; Add bells & whistles again. ; Move to 61k system. ; ; 2.04 - 30 MAR 8IOS. ; Change single function to return drive table ptr into a BIOS function ; call using restart instruction. ; Change LOGge included data to update IOPB.PBSTAT to new configuration. ; VERSN EQU 305 ; ;********************************************ST ON ;============================================================================ ; ; DISK OPERATING SYSTEM ADDRESSES$0 %+ &, !'- "(. #)/ $*0 ; ;============================================================================ NKSYS: EQU 60 ;SYSTEM SIZE IN K BYTES KBYT=============================================== ; ; OTHER DECLARATIONS ; ;================================================== ASCII CHARS ; ;============================================================================ LF: EQU 0AH CR: EQU 0DH CTRLZ:@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; INITIALIZE VERSION TEXT IN RAM MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@OLE INPUT JP COC ;CONSOLE OUTPUT JP LO ;PRINTER OUTPUT JP PUNCH JP READER JP HOME ;HOME SELECTED DRIVE JP SELDSK ################################## BIOSSZ: DW BIOSND - BIOS ;BIOS MODULE SIZE IN BYTES BIOSST: DW BIOS ;BIOS MODULE LOAD ADDR----------------- INIT: ; ; SET TEMPORARY STACK ; LD SP,DEFBFR ;USE PAGE 0 FOR STACK ; ; MAKE SURE ROM IS ENABLED ;Vers ' PVERS VERSN DM CR,LF IF $ > (DIRBF + SECSZ) CONMSG **** WARNING! COLD INIT CODE BIGGER THAN DIR BUFFER ***E: EQU 1024 CPMSZ: EQU KBYTE * NKSYS CPMBS: EQU CPMSZ - (20 * KBYTE) ; CP/M BIAS VALUE CCP: EQU CPMBS + 3400H ;ADDR OF CCP B========================== SECSZ: EQU 128 NDRVS: EQU 6 IF BOOT = 10H ; ; 8" HARD DISK BOOT DATA ; STHD EQU 0 ;START EQU 1AH ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE THE TRANSLATION TABLE@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ PVERS MACRO #VERS DD DL #VERS IF DD > 9999 DB (DD / 10000) + '0'  ;SELECT DISK DRIVE JP SETTRK ;SET TRACK # JP SETSEC ;SET SECTOR # JP SETDMA ;SET TRANSFER ADDR JP DISKRD ;PERFORM D FOR SBD ; ; CONTINUE ON WITH INIT ; INIT1: JR INIT ;################################################################ CALL GETMON ; ; INIT DEFAULT DRIVE ; LD A,(DK_PROM + 1) ;USE DRIVE # PASSED IN PAGE 0 AND A,3 LD (DEFDRV),A ; ; * ELSE DS DIRBF+SECSZ-$ ;FILL OUT DIRECTORY BUFFER TO 1 SECTOR SIZE ENDIF ;--------------------------------------DOS: EQU CPMBS + 3C00H ;ADDRESS OF BDOS BIOS: EQU CPMBS + 4A00H ;ADDRESS OF BDOS BIOSR: EQU 1000H - BIOS ; ; PAGE 0 LOCATI LOGICAL DRIVE OF HARD DISK NDHD EQU 3 ;LAST LOGICAL DRIVE OF HARD DISK ST8FD EQU 4 ;START LOGICAL DRIVE OF 8" FLOPPY ND8FD MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ GXLATE MACRO #SECTORS, #SKEW LIST OF DD DL DD % 10000 ENDIF IF DD > 999 DB (DD / 1000) + '0' DD DL DD % 1000 ENDIF DB (DD / 100) + '0' DB '.' DISK READ JP DISKWR ;PERFORM DISK WRITE JP LISTST ;RETURN LIST STATUS JP SECTRN ;TRANSLATE SECTOR JP BIOFUNC ;EXECUTE############ ; ; DIRECTORY SECTOR BUFFER STARTS HERE AFTER CRUNCHING COLD START ; CODE. THIS BUFFER IS USED BY THE CP/M DIRE SEND SYSTEM SIGN-ON ; CLOGO: LD HL,MSGSO CALL EDITOR ; ; MODIFY COLD START VECTOR TO WARM START ; LD HL,(BIOS+4) -------------------- ; ; WARM REBOOT ENTRY LOADS CCP,BDOS FROM DISK & ; SETS UP VARIABLES ; ;------------------------------ONS ; PAGE0: EQU 0 ;START OF CP/M RAM IOBYTE: EQU PAGE0 + 3 ;IOBYTE ADDR DEFDRV: EQU PAGE0 + 4 ;DEFAULT DRIVE PARAM ADDR B EQU 5 ;LAST LOGICAL DRIVE OF 8" FLOPPY ENDIF IF BOOT = 3 ; ; 8" FLOPPY BOOT DATA ; STHD EQU 2 ;START LOGICAL DRF NXTSEC DL 1 ;;START WITH SECTOR 1 LOWEST DL 1 ;; REPT #SECTORS LIST ON DB NXTSEC LIST OFF NXTSEC DL NXTSEC + #SKEB ((DD % 100) / 10) + '0' DB (DD % 10) + '0' ENDM SUBTTL BIOS CODE ORG BIOS ;-------------------------------------- FUNCTION CALL ;############################################################################ ; ; THESE BOOT PARAMS MUST RCTORY CHECK ROUTINES THAT ; CHECK FOR DISK CHANGE. ; ;######################################################################LD (BIOS+1),HL ; ; BOOT CCP & BDOS ; JR WARM ;######################################################################---------------------------- WARM: IF INTRPTS ; ; SET INTERRUPT VECTOR TABLE BASE ; LD A,HIGH INTABL LD I,A ; ; DOSJV EQU PAGE0 + 5 ;BDOS SYSTEM CALL ENTRY DEFBFR EQU PAGE0 + 80H ;DEFAULT BUFFER ; ; BIOS FUNCTION CALL RESTART VECTOR ;IVE OF HARD DISK NDHD EQU 5 ;LAST LOGICAL DRIVE OF HARD DISK ST8FD EQU 0 ;START LOGICAL DRIVE OF 8" FLOPPY ND8FD EQU 1 ;LAW ;ADD SKEW FACTOR ;; IF NXTSEC > #SECTORS ;CHECK FOR OVERFLOW NXTSEC DL NXTSEC - #SECTORS ;; IF NXTSEC <= LOWEST ;CH-------------------------------------- ; ; BIOS JUMP VECTOR TABLE ; ;-----------------------------------------------------ESIDE AS DEFINED RIGHT BEFORE THE COLD INIT ; ROUTINE START AND MUST BE IN THE 1ST SECTOR. THESE 2 WORDS ARE REFERENCED ; BY###### DIRBF: EQU $ ;BUFFER BEGINNING ;---------------------------------------------------------------------------- ; ;###### ; ; SIGN-ON MESSAGE ; ;############################################################################ MSGSO: DB CR,LF  SET INTERRUPT MODE TO 2 ; IM 2 ; ; ENABLE INTERRUPT VECTOR 7 ; IN A,(M2_IMASK) AND A,7FH OUT (M2_IMASK),A ; ;  BFUNRST EQU 28H BFUNRSV EQU PAGE0 + BFUNRST BFUNRSI EQU 0C7H + BFUNRST ; TPA: EQU 100H ;=============================ST LOGICAL DRIVE OF 8" FLOPPY ENDIF ;============================================================================ ; ;ECK FOR REPEAT NXTSEC DL LOWEST + 1 LOWEST DL NXTSEC ENDIF ENDIF ;; ENDM LIST ON ENDM ;@@@@@@@@@@@@@@@@@@@----------------------- JP INIT1 ;COLD START ENTRY JP WARM ;RELOAD CCP/BDOS JP CNSCK ;GET CONSOLE STATUS JP CI ;CONS THE BOOT CODE IN ORDER TO FIND THE LOAD ADDRESS FOR THE BIOS & IT'S ; LENGTH. ; ;########################################## INIT - COLD START ENTRY FROM BOOT MUST SET ALL BIOS PARAMS ; ;----------------------------------------------------------- DB CPMSZ / (KBYTE * 10) + '0' DB (CPMSZ MOD (KBYTE * 10)) / KBYTE + '0' DB 'K CP/M-80 Vers 2.2',CR,LF DB 'M5b CBIOS  FINALLY ENABLE VECTORED INTERRUPTS ; IN A,(M2_STAT) OR A,M2_IEN OUT (M2_STAT),A EI ENDIF ; ; SET TEMPORARY STAC%0 %+ &, !'- "(. #)/ $*0K ; LD SP,DEFBFR ; ; INSURE MONITOR ROM STILL ENABLED ; CALL GETMON ; IF BOOT = 10H ; TEST ISHA HOST ADAPTER F,(DEFBFR) CP A,86H JR C,WEROR ; ; SET UP TO LOAD CCP/BDOS ; LD HL,(DEFBFR + BD_SBDSS) ;PREFETCH BDOS TRK/SECTOR PUS ; ; ELSE DONE READING SYSTEM ; JP WZRPG ; ; ; ELSE SET UP & READ BDOS ; RDBDOS: POP HL ;RESTORE BDOS TRK/SECTOR FTCPTS ; ; PUT BDOS VECTOR INTO INTERCEPT CODE ; LD HL,(BDOS + 7) LD (BDOSV),HL ; ; NOW PUT INTERCEPT VECTOR INTO BD++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DISKRD: LD A,PB_READC ;SELECT READ OP JP DISKOP ;++PORTED DRIVE REQUESTED THEN RETURN 0 (ERROR) ; LD A,C CP A,NDRVS RET NC ; ; STORE DRIVE # FOR FUTURE USE ; LD (BTDIVE ; LD (DTPTR),HL ;SAVE DRIVE TABLE PTR ; ; ATTEMPT TO READ ID SECTOR ; XOR A,A ;INIT FLAG BYTE UNTIL FIRMWARE REVI ; SEL1: PUSH HL LD HL,(DVRTPTR) LD DE,DVRFLG ADD HL,DE EX DE,HL POP HL LD BC,DVRSIZ - DVRFLG LDIR ; ; RETURNOR A HUNG CONDITION AND CLEAR IF TRUE ; IN A,(ISH_STATUS) ;IF HOST ADAPTER BUSY THEN BIT ISH_BSYB,A JR Z,NTHUNG ; LD AH HL ; LD HL,(DEFBFR + BD_SCCPS) ;FETCH CCP TRK/SECTOR LD C,L LD B,0 CALL SETSEC ; LD C,H CALL SETTRK ; LD BC,CROM DIRECTORY LD C,L LD B,A ;A STILL CONTAINS 0 CALL SETSEC ; LD C,H CALL SETTRK ; JR WREAD ; ; ; WARM BOOT OS CODE ; LD HL,INTCPT LD (BDOS + 7),HL ; ; INITIALIZE CLOCK VECTORS IF CLOCK INSTALLED ; LD C,CLK_F7 ;TEST FOR BOAR++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; WRITE A DISK SECTOR ; EXIT - A= 0: OK; /0: ERRRV),A ; ; SAVE LOGON REQUEST FLAG ; LD A,E LD (LOGRQ),A ; ; COMPUTE DISK DRIVER TABLE PTR ; CALL RETDVRT ;DRIVESED LD (IOPB + PB_ST2O),A ; CALL DISKLOG JP NZ,FDSKER ; ; IF NO ID SECTOR THEN USE DEFAULTS ; LD A,(IOPB + PB_ST2O DRIVE TABLE PTR ; LD HL,(DTPTR) XOR A,A RET ; ; ; IF NOT HARD DISK THEN GO DO FLOPPY TEST ; LGDEF: LD A,(BTDRV) ,PB_CLRC LD (IOPB + PB_CMDO),A CALL XPRIM ; NTHUNG: ENDIF ; ; LOG ON DRIVE TO INIT TABLES ; LD A,(DK_PROM + 1) CP CALL SETDMA ; ; READ CCP/BDOS ; WREAD: CALL DISKRD JR NZ,WEROR ;IF ERROR THEN EXIT ; ; NEXT SECTOR ; LD HL,BERROR, OUTPUT MSG & HALT ; WEROR: LD HL,MSGLE ;OUTPUT ERROR MESSAGE CALL EDITOR HALT ; ; ; BOOT OK, INIT PAGE 0 ; WD PRESENT CALL CLK1 ; ; IF CLOCK PRESENT THEN TURN ON CLOCK DRIVE ; OR A,A LD A,38H ;COND. JR (ON) JR NZ,CLKON ; OR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DISKWR: LD A,PB_WRITC ;SELECT WRITE OP  IS STILL IN C REGISTER LD (DVRTPTR),HL ; ; PREFETCH DRIVER EXECUTION ADDRESS FROM TABLE ; LD E,(HL) ;STORE ADDRESS ) CP A,-2 ;0: NO ID, -1: JADE ID, -2: EXTENDED ID JR NZ,LGDEF ; ; ELSE XFER ID SECTOR DATA TO TABLES ; CALL TRNONE  IF STHD <> 0 CP A,STHD JR C,LGCKFD ENDIF CP A,NDHD + 1 JR NC,LGCKFD ; ; ELSE USE HARD DISK DEFAULTS ; CALL AND A,3 ;MODULO 4 LD C,A LD E,0 CALL SELDSK LD A,L ;IF ERROR THEN ABORT OR A,H JR Z,WEROR ; ; READ BOOT DIRETSEC INC (HL) ; LD DE,SECSZ ;DMA := DMA + SECTOR SIZE LD HL,(BTDMA) ADD HL,DE LD (BTDMA),HL ; ; IF NOT INTO BDOS ZRPG: ; ; INIT BIOS WARM START IN PAGE 0 ; LD A,0C3H LD HL,BIOS + 3 LD (PAGE0),A LD (PAGE0 + 1),HL ; ; INIT BDO ; ELSE TURN OFF CLOCK DRIVE ; LD A,18H ;UNCOND. JR (OFF) (CAUSES JUMP TO ILLEGAL) ; CLKON: LD (INHCLK),A ; ENDIF ; JP DISKOP ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SELECT DRIVE FUNCTION ; LOGINC HL LD D,(HL) INC HL LD (DVRXADR),DE ; ; FETCH FLAGS ; LD C,(HL) ; ; COMPUTE DISK PARAMETER TABLE ADDRESS ;;ASSUME NO TRANSLATION ; ; IF HARD DISK OR DOUBLE DENSITY THEN NO TRANSLATION ; LD A,(DEFBFR + ID_FLGO) AND A,[1 SHL DF TRNONE ; NO XLATE LD HL,HDPBK ; ; XFER DATA TO TABLES ; SEL2: PUSH HL CALL DPBAD ; USE DEFAULT TABLE POP HL LCTORY ; LD BC,DEFBFR ;SET XFER ADDRESS (USE DEFAULT BUFFER) CALL SETDMA ; LD BC,BD_SEC ;SET DIRECTORY SECTOR CALL SETHEN READ NEXT SECTOR ; LD DE,BDOS XOR A,A SBC HL,DE JR C,WREAD ; ; ELSE IF AT BEGINNING OF BDOS THEN SET UP NEW TRS CALL VECTOR IN PAGE 0 ; LD HL,BDOS + 6 LD (BDOSJV),A LD (BDOSJV + 1),HL ; ; INIT BIOS CALL VECTOR IN PAGE 0 ; LD ; PASS DEFAULT DISK TO CCP ; LD A,(DEFDRV) LD C,A JP CCP SUBTTL BIOS DISK FUNCTION ROUTINES ;+++++++++++++++++++-ON - SET DISK PARAMETER BLOCK ; ENTRY- C= DRIVE # ; E= 0 IF NEW SELECT ; EXIT - HL= PTR TO DPT OR 0 FOR ERROR ; ;++++++++ LD HL,(BTDRV) LD H,0 ADD HL,HL ;DISK # * 16 ADD HL,HL ADD HL,HL ADD HL,HL LD DE,D0DPH ADD HL,DE ; ; IF NOT_DTDB] OR [1 SHL DF_HARDB] ; ; ELSE SET TRANSLATION ; CALL Z,TR8 ; ; XFER DISK DATA TO DPB ; NOX: CALL DPBAD ;GETD BC,DPBSZ LDIR JR SEL1 ; ; ; USE 8" FLOPPY DEFAULTS ; LGCKFD: CALL TR8 LD HL,SD8PBK JR SEL2 ;**************TSEC ; LD BC,0 ;SET TRACK TO 0 CALL SETTRK ; CALL DISKRD JR NZ,WEROR ; ; CHECK FOR VALID BOOT DIRECTORY ; LD AACK & SECTOR ; JR Z,RDBDOS ; ; ELSE IF NOT AT BIOS THEN READ NEXT SECTOR ; LD DE,BIOS - BDOS SBC HL,DE JP C,WREAD  HL,BIOFUNC LD (BFUNRSV),A LD (BFUNRSV + 1),HL ; ; SET DEFAULT SECTOR BUFFER ; LD BC,DEFBFR CALL SETDMA ; IF IN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; READ A DISK SECTOR ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ SELDSK: ; ; ASSUME ERROR ; LD HL,0 ; ; IF UNSUP FIRST SELECT OR LOGON INHIBITED THEN RETURN TABLE PTR ; LD A,(LOGRQ) OR A,C CPL AND A,1 RET Z ; ; ELSE LOG ON DR ADDR OF DPB LD HL,DEFBFR + ID_SPTO LD BC,DPBSZ LDIR ; ; XFER DISK PHYSICAL DATA TO TABLE ; LD HL,DEFBFR + ID_FLGO ************************************************************** ; ; HOME DRIVE - TREAT AS SEEK TRK 0 ; EXIT - BC= 0 ; ;***%0 %+ &, !'- "(. #)/ $*0************************************************************************* HOME: LD BC,0 ;*************************************************** SETDMA: LD (BTDMA),BC XOR A,A LD (BTDMAX),A RET ;++++++++++++++++++++++++++++++++++++++++++++++++ RET SUBTTL DISK SUPPORT ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; LOODE ; ENTRY- A= IOPB COMMAND ; EXIT - A= 0: OK; /0: ERROR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++A,(DE) ;FETCH BYTE PUSH DE ;SAVE REGS PUSH BC CALL PRHEX ;OUTPUT ERROR CODE ; LD C,' ' CALL COC ; POP BC ;RESTETURN DPB_PTR = 0 FOR SELECT FUNCTION LD A,-1 ;RETURN -1 TO BDOS OR A,A RET ;***************************************+++++++++++ ; ; RETURN DRIVE PARAMETER BLOCK ADDR FUNCTION ; EXIT - DE= DPB PTR ; HL= ? ; ;++++++++++++++++++++++++++++++LOGICAL DRIVE ; LD A,(BTDRV) ;IF EVEN THEN ADD 0 ELSE ADD 128 RRCA AND A,80H LD E,A ;COMPUTE SECTOR LD D,0 LD HL,******************************************* ; ; SET TRACK # ; ENTRY- BC= TRACK # ; ;***************************************++++++++++++++++++++++++++++ ; ; SECTOR TRANSLATION FUNCTION ; ENTRY- DE= 0: NO XLATE, ELSE PTR TO XLATE TABLE ; BC= SECTORGON DISK FUNCTION ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DISKOP: ; ; SET UP IOPB ; LD HL,BTTRK LD DE,IOPB + PB_TRKO LD BC,PB_BCNTO - PB_TRKO LDIR ; DISKOP2ORE REGS POP DE INC DE ;NEXT ERROR BYTE DJNZ DSKER1 ;IF NOT DONE THEN LOOP ; LD HL,DSKEB ;OUTPUT ERROR MESSAGE CALL************************************* ; ; SET 3740 SECTOR TRANSLATION PROCEDURE ; ENTRY- (DTPTR)= MUST BE PTR TO DTP ; EXIT ++++++++++++++++++++++++++++++++++++++++++++++ DPBAD: LD HL,(DTPTR) ;FETCH BASE ADDR LD DE,10 ;ADD OFFSET OF DPB PTR ADD H(IOPB + PB_SECO) ; PUSH HL ;SAVE SECTOR TO RESTORE LATER ; ADD HL,DE LD (IOPB + PB_SECO),HL ; ; EXECUTE IOPB ; ************************************* SETTRK: LD (BTTRK),BC RET ;***************************************************** # TO XLATE ; EXIT - HL= XLATED SECTOR OR (BC) + 1 ; BC= UNCHANGED ; A, DE= ? ; ;+++++++++++++++++++++++++++++++++++++++++ DISKLOG: ; ; SET DESCRIPTOR SECTOR XFER ADDRESS TO DEFAULT BUFFER ; LD HL,DEFBFR LD (IOPB + PB_DMAO),HL XOR A,A : LD (IOPB + PB_CMDO),A ; ; FETCH DRIVER VECTOR & EXECUTE DISK DRIVER ; DKOPLP: PUSH IY ;SAVE IY LD IY,(DVRTPTR) ;F EDITOR ; ; GET USER RESPONSE ; CALL CI ;GET USER RESPONSE ; PUSH AF ;SAVE CHAR LD C,A ;ECHO CHAR CALL COC PO- DE, HL= ? ; ;**************************************************************************** TR8: TR3740: LD DE,SDTRAN ; SEL,DE LD E,(HL) ;FETCH DPB PTR INC HL LD D,(HL) RET SUBTTL HARD DISK ROUTINES ;++++++++++++++++++++++++++++++++++CALL XPRIM ; ; RESTORE SECTOR ; POP HL LD (IOPB + PB_SECO),HL ; ; DONE ; RET ;+++++++++++++++++++++++++++*********************** ; ; SET SECTOR ; ENTRY- BC= SECTOR # ; ;***********************************************************++++++++++++++++++++++++++++++++++++ SECTRN: ; ; IF NO TRANSLATION THEN RETURN SECTOR++ ; LD A,D ;IF TABLE ADDR = 0 THENLD (IOPB + PB_DMAXO),A ; ; SET DESCRIPTOR SECTOR SECTOR ; LD HL,ID_SECT LD (IOPB + PB_SECO),HL ; ; SET DESCRIPTOR SETCH TABLE BASE ; LD HL,DKOPRET ;PUT RETURN ADDRESS ON STACK PUSH HL ; LD HL,(DVRXADR) ;FETCH DRIVER ADDRESS PREFETCHED P AF ; AND A,5FH ;INSURE UPPER CASE ; ; IF RETRY THEN RETURN TO CALLER ; CP A,'R' ;IF RETRY THEN RETURN TO CALLER TTR: LD HL,(DTPTR) LD (HL),E INC HL LD (HL),D RET ;****************************************************************++++++++++++++++++++++++++++++++++++++++++ ; ; HARD DISK DRIVER FUNCTION ; ENTRY- IY= DRIVER TABLE PTR ; EXIT - A= 0: OK; /0+++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE IOPB PRIMITIVE ; EXIT - A= 0: OK, /0: ERROR ; ;++++++++++***************** SETSEC: LD (BTSEC),BC RET ;************************************************************************* NO TRANSLATION OR A,E JP Z,NOTRAN ; ; ELSE CALCULATE NEW SECTOR FROM TABLE ; EX DE,HL ADD HL,BC LD L,(HL) ; LECTOR TRACK ; LD L,H ;H == 0 FROM LAST OPERATION (HL= 0) LD (IOPB + PB_TRKO),HL ; ; PASS COMMAND TO EXECUTOR ; LD AFROM TABLE JP (HL) ; ; DRIVER RETURNS HERE ; DKOPRET: POP IY ; ; IF NO ERRORS THEN RETURN ZF ; RET Z ;IF NO_EJR Z,DKOPLP ; ; ELSE IF ABORT THEN DO WARM BOOT ; CP A,'A' ;IF ABORT THEN RE-BOOT JP Z,0 ; ; ELSE IF IGNORE THEN R************ ; ; SET NO SECTOR TRANSLATION PROCEDURE ; EXIT - HL, DE= ? ; ;************************************************: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ HDEXEC: ; ; CONVERT LOGICAL DRIVE++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ XPRIM: ; ; SET FLAGS TO NONE FOR NOW ; XOR A,A LD (*** ; ; SET TRANSFER ADDR ; ENTRY- BC= ADDRESS ; EXIT - A= 0 ; ;**********************************************************D H,0 RET ; ; ; CONVERT FROM CP/M'S LOGICAL SECTOR {0..N-1} TO PHYSICAL SECTOR {1..N} ; NOTRAN: LD HL,1 ADD HL,BC ,PB_LOGC JR DISKOP2 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; COMMON DISK I/O CRROR THEN RETURN ; ; PRINT ERROR ; LD HL,DSKEM ;OUTPUT PREFIX CALL EDITOR ; LD DE,IOPB LD B,PB_SIZE DSKER1: LD ETURN NO ERROR ; SUB A,'I' ;IF IGNORE THEN RETURN NO ERROR RET Z ; ; ELSE RETURN ERROR TO BDOS ; FDSKER: LD HL,0 ;R**************************** TRNONE: LD DE,0 JR SETTR ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ TO PHYSICAL DRIVE ; LD A,(IY + DVRPDRV) ;0,1: DRV 0, 2,3: DRV 1 LD (IOPB + PB_DRVO),A ; ; OFFSET LOGICAL ADDRESS WITH IOPB + PB_FLGO),A ; ; SET XFER COUNT ; LD HL,SECSZ LD (IOPB + PB_BCNTO),HL ; ; EXECUTE THE PRIMITIVE IN ROM ; PU&0 %+ &, !'- "(. #)/ $*0SH IX LD IX,IOPB ;PASS PTR TO IOPB LD HL,DK_DSKX ;PRIMITIVE ENTRY LD A,(DK_PROM) ;FETCH PROM # CALL EXROM ;EXECUTE THECALL XPRIM ; ; RESTORE THE MODIFIED SECTOR SO RETRY WILL WORK ; POP HL LD (IOPB + PB_SECO),HL ; ; DONE ; RET  RET ; STACK, EXECUTE FUNCTION ADDRESS ON STACK ;######################################################################++++++++++++++++++++++++++++++ ; ; RETURN DRIVER TABLE PTR FUNCTION ; ENTRY- C= DRIVE # (E FOR FUNCTION CALL) ; EXIT - HL= DCTION ; ENTRY- IX= IOPB PTR ; EXIT - A= 0: OK ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++O ASCII USING DAA TRICK ; AND A,0FH ADD A,90H DAA ADC A,40H DAA ; ; OUTPUT CHAR TO CONSOLE ; LD C,A CALL COC************************ INTCPT: LD A,C ;CHECK CALL VALIDITY CP A,41 ;IF <= 40 THEN OK ; BDOSV EQU $ + 1 JP C,BDOS + 11 ILLEGC: PUSH BC ;SAVE FUNCTION # ; ; OUTPUT WARNING MESSAGE ; LD HL,ISCMSG ;OUTPUT WARNING CALL EDITOR ; ; OUTPUT PRIMITIVE POP IX ; ; RETURN THE COMMAND RESULTS STATUS ; LD A,(IOPB + PB_STATO) OR A,A RET SUBTTL JADE FLOPP SUBTTL BIOS FUNCTION CALLS ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; FUNCTION DISP###### ; ; BIOS FUNCTION TABLE ; ;############################################################################ BFUNTBL: DRIVER TABLE BASE PTR ; A, C= 0 ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; BIOS + EXIOPB: ; ; SET UP FOR CALL ; LD HL,DK_DSKX LD A,(DK_PROM) CALL EXROM ; ; FETCH & RETURN RESULT STATUS ; LD ; ; RETURN DATA ; POP AF RET ;*************************************************************************** ; ; NH ;THIS ADDR MODIFIED BY WARM BOOT RTN ; ; THE FOLLOWING CONDITIONAL JUMP IS MODIFIED TO AN UNCONDITIONAL JUMP BY ; THE WAR FUNCTION # ; POP HL LD A,L CALL PRHEX ; ; OUTPUT NEW LINE ; CALL CRLF ; ; RETURN NULLS ; XOR A,A ;BC = HLY DRIVER ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; JADE 8" FLOPPY DISK DRIVEATCHER ; EXIT - A= -1: ERROR, 0: OK ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ BIOFUNC:W RETVERS ;0:RETURN VERSION # DW RETDVRTF ;1:RETURN DISK PHYSICAL CONFIGURATION TABLE PTR DW EXIOPB ;2:EXECUTE THE IOPB MCALL ENTRY (E= DRIVE #) ; RETDVRTF: LD C,E ; RETDVRT: LD HL,DVR0 ;START AT 1ST TABLE ; ; IF DRIVE == 0 THEN ALREADY A,(IX + PB_STATO) OR A,A ;TEST RESULT FOR RETURN RET SUBTTL NON-DISK PROCEDURES ;*********************************EWLINE PROCEDURE ; ;*************************************************************************** CRLF: LD C,CR CALL COC LDM BOOT ROUTINE IF THE CLOCK/CALENDAR BOARD IS NOT PRESENT ; IF NOT MODIFIED, THEN IT IS ALLWAYS FALSE (NOP). ; INHCLK: JR C, = A = 0 LD L,A LD H,A LD C,A LD B,A RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++R FUNCTION ; ENTRY- IY= DRIVER TABLE PTR ; EXIT - A= 0: OK; /0: ERROR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; IF FUNCTION # NOT IN TABLE THEN RETURN -1 ; LD A,C CP A,MAXFUNCS LD A,-1 RET NC ; ; ELSE COMPUTE TABLE ENTAXFUNCS EQU ($ - BFUNTBL) / 2 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN BI THERE ; LD A,C OR A,A RET Z ; ; ELSE IF ILLEGAL DRIVE THEN RETURN ERROR ; CP A,NDRVS JR C,RETDV2 ; OR A,A ******************************************* ; ; OUTPUT HEX DATA TO CONSOLE SUBR ; ENTRY- A= DATA ; EXIT - A, C= ? ; ;***** C,LF JP COC IF INTCPTS SUBTTL ADDITIONAL FUNCTIONS TO SUPPORT CDOS PROGRAMS ;**************************************ILLEGC ; ; NOW CHECK FOR EXTENDED CALLS ; CP A,8DH ;IF RETURN VERSION THEN RETURN IT JR Z,RETCVER ; CP A,90H ;IF NO+++++ ; ; CDOS RETURN VERSION FUNCTION ; MAKES CLOCK/CALENDAR WORK. ; EXIT - B= 1 ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ FD8EXEC: ; ; CONVERT LOGICAL DRIVE TO PHYSICAL DRIVE ; LD A,(IY + DVRPDRV) LD (IOPB + PB_DRVRY ; PUSH HL ;SAVE POSSIBLE DATA ; LD HL,BFUNTBL LD A,C ADD A,A ADD A,L LD L,A LD A,0 ADC A,H LD H,A ; ; OS VERSION # ; EXIT - HL= VERSION # IN BINARY {0.00,..655.35} ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++RET ; ; ; ELSE COMPUTE TABLE PTR ; RETDV2: LD B,C LD DE,DVRSIZ ; RETDVL: ADD HL,DE DJNZ RETDVL ; ; RETURN NO ER*********************************************************************** PRHEX: ; ; PROCESS HIGH NIBBLE 1ST ; CALL PRDIG ************************************* ; ; SYSTEM CALL INTERCEPT ROUTINE CHECKS FOR ILLEGAL BDOS CALLS & ; PRINTS MESSAGE IF T CLOCK THEN ERR JR C,ILLEGC ; JR Z,CLKCAL ;IF CALENDAR THEN GET IT ; CP A,92H JR C,CLKSET ;IF SET FUNCTION THEN SET C++++++++++++++++++++++++++++++++++++++++ RETCVER: LD B,1 RET SUBTTL CLOCK ROUTINES ;++++++++++++++++++++++++++++++++++O),A ; ; FETCH SECTOR DATA ; LD HL,(IOPB + PB_SECO) PUSH HL ;SAVE FOR XPRIM RESTORE ; ; ; EXECUTE THE IOPB ;  EXECUTE TABLE ADDRESS ; LD A,(HL) INC HL LD H,(HL) LD L,A ; EX (SP),HL ;PUT CALLER'S DATA IN HL, FUNCTION ADDR ON++++++++++++++++ RETVERS: LD HL,VERSN XOR A,A ;RETURN NO ERROR RET ;++++++++++++++++++++++++++++++++++++++++++++++ROR ; XOR A,A RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE IOPB FUN ; ; SWAP HIGH & LOW NIBBLES ; PRDIG: RLCA RLCA RLCA RLCA ; ; SAVE DATA FOR RETURN ; PUSH AF ; ; CONVERT TILLEGAL. ALSO IMPLEMENTS CDOS CLOCK/CALENDAR ; SYSTEM CALLS FOR ASMB. ; ;***************************************************LOCK ; JR Z,CLKTIM ;IF TIME THEN GET IT ; CP A,93H JR Z,CLKRDC ;IF READ CLOCK THEN GET IT ; ; ILLEGAL SYSTEM CALL ; ++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN CALENDAR FUNCTION 90H ; EXIT - A= DAY ; B= MONTH ; C= YEAR ; L= D