;       MYDDBIOS.Z80
;
; THIS IS A ROM BASED BIOS SUITABLE TO RUN 2.2 CP/M ON A VERSAFLOPPY II BOARD
; THE BIOS AUTOMATICALLY FIGURES OUT THE DENSITY OF DRIVES A: & B:
; IT IS SETUP TO TALK TO A ZAPPLE LIKE MONITOR AT 0F000H
;
;       VERSION 1.0     JOHN J.MONAHAN  (201)779-0635   1/15/1981
;
ZCI     EQU     0F003H  ;CONSOLE INPUT
ZCO     EQU     0F009H  ;CONSOLE OUTPUT
ZCSTS   EQU     0F012H  ;CONSOLE STATUS
ZRI     EQU     0F006H  ;READER TO MONITOR
ZPOO    EQU     0F00CH  ;PUNCH TO MONITOR
ZLO     EQU     0F00FH  ;LIST TO MONITOR
ZLISTS  EQU     0F027H  ;LIST STATUS TO MONITOR
SSMVID  EQU     0ED00H  ;LOCATION FOR DUMP OF DISK INFO ON SCREEN
SSMDSK  EQU     SSMVID+06H      ;LOCATION TO PLACE UNIT#
SSMTRK  EQU     SSMVID+12H      ;LOCATION TO PLACE TRACK#
SSMSEC  EQU     SSMVID+1FH      ;LOCATION TO PLACE SECTOR#
SSMDMA  EQU     SSMVID+2EH      ;LOCATION TO PLACE DMA ADDRESS
MONITOR EQU     0F000H  ;ZAPPLE LIKE MONITOR (NOTE IT IS NOT ZAPPLE ITSELF)
PANNEL  EQU     0FFH    ;FRONT PANEL SWITCH USED TO SWITCH ON/OFF DUMP TO VDM
STORE   EQU     0D8H    ;PORT USED AS KIND OF IOBYTE WITHIN MY MONITOR (CAN BE
;                       ;REMOVED FROM CODE IF YOU LIKE )
;
;
LF      EQU     0AH
CR      EQU     0DH
BELL    EQU     07H
CLEAR   EQU     1AH
TAB     EQU     09H
;
;
IOBYTE  EQU     03H
CDISK   EQU     04H
TADDR   EQU     40H
UNIT    EQU     42H     ;NEW UNIT BYTE
SCTR    EQU     43H     ;SECTOR
TRK     EQU     44H     ;TRACK
NREC    EQU     45H     ;# OF SECTORS
ERMASK  EQU     46H     ;ERROR MASK
ERSTAT  EQU     47H     ;ERROR FLAG STORE
IDSV    EQU     48H     ;6 BYTES (USED FOR TRACK ID COMMAND)
CMDSV   EQU     4EH     ;COMMAND SAVE
SPSV    EQU     4FH     ;SP SAVE
TEMP2   EQU     51H     ;2 BYTE TEMP RECORD
COUNT   EQU     53H     ;SECTORS/TRACK STORE
VDMFLG  EQU     54H     ;FLAG TO INDICATE ASCII TO VDM BOARD HAS BEEN PLACED
UNITCK  EQU     55H     ;OLD UNIT BYTE
RSEEK   EQU     56H     ;NBR OF RESEEKS
RTRY    EQU     57H     ;NBR OF RTRYS
ADRIVE  EQU     58H     ;STORE OF A: DRIVE DENSITY ETC TYPE
BDRIVE  EQU     59H     ;STORE OF B: DRIVE TYPE
CBFLAG  EQU     5AH     ;FLAG TO INDICATE WBOOT OR CBOOT FOR LOADER ON DISK
SSTACK  EQU     80H     ;SYSTEM STACK
COLD    EQU     80H     ;COLD START ADDRESS
;
X       EQU     60H             ;PORTS FOR 1791
RSET    EQU     X+0             ;CONTROLLER RESET ADDRESS
SELECT  EQU     X+3             ;DRIVE SELECT PORT
STATUS  EQU     X+4             ;STATUS PORT
TRACK   EQU     X+5             ;TRACK PORT
SECTOR  EQU     X+6             ;SECTOR PORT
DATA    EQU     X+7             ;DATA PORT
CMD     EQU     X+4             ;COMMAND PORT
;
RDACMD  EQU     0C0H            ;READ ADDRESS CODE
RDCMD   EQU     088H            ;READ SECTOR CODE
WRCMD   EQU     0A8H            ;WRITE SECTOR CODE
WRTCMD  EQU     0F4H            ;WRITE TRACK CODE
RSCMD   EQU     009H            ;RESTORE COMMAND
SKNCMD  EQU     019H            ;SEEK NO VERIFY
SKCMD   EQU     1DH             ;SEEK WITH VERIFY
;
STDSDT  EQU     26              ;STANDARD 8" 26 SECTORS/TRACK
STDDDT  EQU     50              ;STANDARD DD 8" 50 SECTORS/TRACK
NBYTES  EQU     128             ;BYTES/SECTOR
NTRKS   EQU     77              ;TRACKS/DISK
;
;
;
;
       ORG     0F800H          ;<--------- LOCATION OF 2716 PROM
;
;       DOS SYSTEM LINKAGES     (USED BY SDOS & 2.2 CP/M DO NOT CHANGE ORDER)
;
CBOOT:  JP      BOOT    ;COLD START ENTRY
WBOOT:  JP      BOOTW   ;WARM START ENTRY
CSE:    JP      ZCSTS   ;CONSOLE STATUS
CIE:    JP      ZCI     ;CONSOLE IN
COE:    JP      ZCO     ;CONSOLE OUT
LIST:   JP      ZLO     ;TO MONITOR FOR PRINTER
PUNCH:  JP      ZPOO    ;TO MONITOR FOR PUNCH
READR:  JP      ZRI     ;TO MONITOR FOR READER
HME:    JP      HOME    ;MOVE TO TRACK 0
SDSKE:  JP      SELDSK
STRKE:  JP      SETTRK
SSECE:  JP      SETSEC
SDMAE:  JP      SETDMA
RDE:    JP      READ
WRE:    JP      WRITE
LISTS:  JP      ZLISTS  ;LIST STATUS
SECTR:  JP      SECTRAN ;FOR 2.2 SECTOR TRANSLATION TABLE
;
DTYPE:  JP      UNITSL  ;SET UP UNIT BYTE (DISK DENSITY)
SVE:    JP      SAVER   ;SAVE N RECORDS
LDE:    JP      LOADER  ;LOAD N SECTORS
;
;----------------------------------------------------------------------
;
;BOOT LOADS A SECTOR TO 80H AFTER CHECKING DISK TYPE THEN JUMPS TO 80H
;
BOOT:   XOR     A
       LD      (CDISK),A       ;MAKE CURRENT DISK A:
       LD      (IOBYTE),A      ;CLEANUP IOBYTE
       LD      (VDMFLG),A      ;ASCII TO VDM BOARD NOT YET SENT
       DEC     A
       LD      (CBFLAG),A      ;INDICATE A COLD BOOT TO LOADER
       LD      HL,MSG0         ;SEND SIGNON MESSAGE
       CALL    ZTOMM
       IN      A,(STORE);---FOR MY SYSTEM I/O (CAN REMOVE THIS & NEXT 2 LINES)
       LD      E,A
       CALL    ZBITS
       JR      BOOTW1
;
BOOTW:  XOR     A               ;INDICATE TO LOADER A WARM BOOT
       LD      B,A
       LD      (CBFLAG),A
BOOTW1: LD      SP,SSTACK
       LD      A,8EH           ;SWITCH ON DRIVE A DISABLE ANY WAIT STATES
       OUT     (SELECT),A
       LD      A,08H           ;LOAD HEAD WITH A RESTORE (NO VERIFY)
       OUT     (CMD),A         ;THE HEAD LOAD STARTS MY DRIVE MOTOR
BOOTW2: DJNZ    BOOTW2          ;DELAY A LITTLE TO LET MOTOR GET TO SPEED
       PUSH    HL              ;SAVE [SP] HERE FOR ALL ERRORS ETC
       LD      (SPSV),SP
       POP     HL
       CALL    FRCINT
       XOR     A
       OUT     (TRACK),A
       LD      A,2
       LD      (TRK),A
       LD      A,SKNCMD
       CALL    SEEK4
BT2:    XOR     A               ;COME UP ON A: DRIVE
       CALL    UNITSL          ;IS IT SD OR DD
       JR      NZ,GOMON        ;IF NONE OF THE ABOVE QUIT
;
BT4:    LD      A,(UNIT)
       AND     01000000B       ;ISOLATE ALL BUT DENSITY BIT
       LD      (ADRIVE),A      ;SO ADRIVE= 0H IF SD   & 40H IF DD
       LD      A,0FFH          ;FLAG B: AS NOT YET OBTAINED
       LD      (BDRIVE),A
       CALL    BOOTLD
       LD      HL,COLD
       LD      A,(HL)
       CP      31H             ;EXPECT TO HAVE 31H @80H IE. LD SP,80H
       JR      NZ,GOMON1       ;AS THE FIRST INSTRUCTION
       JP      COLD            ;IF ALL IS OK. JUMP TO 80H AND LOAD CP/M
;
GOMON:  LD      HL,MSG1         ;"CANNOT SELECT DISK"
       JR      GOMON2
GOMON1: LD      HL,MSG2         ;"ERROR READING LOADER"
GOMON2: CALL    ZTOMM
       JP      MONITOR
;
BOOTLD: LD      HL,COLD
BOOT1:  LD      (TADDR),HL
BOOT2:  XOR     A
       LD      (TRK),A         ;SET TRACK 0
       INC     A
       LD      (SCTR),A
       CALL    READ
       RET     Z
       JR      GOMON1
;
; THIS ROUTINE SETS UP THE UNIT BYTE
; THE REQUIRED DRIVE IS IN [A]
;
UNITSL: LD      B,5
       AND     0FH
       OR      40H             ;COME UP DEFALT IN 8" DD
       LD      (UNIT),A
       LD      HL,(TADDR)
       LD      (TEMP2),HL
       CALL    USL1
       LD      HL,(TEMP2)
       LD      (TADDR),HL
       LD      A,(UNIT)
       RET
;
USL1:   PUSH    BC
       PUSH    HL
       LD      (SPSV),SP
       POP     HL
       CALL    DRVSET          ;SELECT DRIVE IN HARDWARE
       CALL    IDRD
       POP     BC
       LD      A,(IDSV+3)      ;THIS CHECKS FOR 256 BYTES/SECTOR NOT
       RRCA                    ;USED IN THIS BIOS. IF CORRECT DENSITY
       RET     Z               ;IT WILL BE Z
                               ;@ IDSV)
       DEC     B               ;DECREASE 5.......0 IF Z THEN ERROR
       JP      Z,SPECIAL
       CALL    CHGTYP
       JR      USL1
;
SPECIAL:XOR     A               ;COULD BE LATER USED FOR SPECIAL SECTOR SIZE
       DEC     A
       RET                     ;RET NZ SO SELDSK KNOWS THERE IS A PROBLEM
;
CHGTYP: LD      A,(UNIT)
       ADD     01000000B       ;TOGGLE DENSITY BIT
       AND     01111111B       ;CLEAR BIT 7
       LD      (UNIT),A
       RET
;
;       DISK CONTROLLER LINKAGES
;
HOME:   XOR     A               ;THIS CUTS DOWN ON HEAD MOVEMENT SINCE MANY
       LD      (TRK),A         ;TIMES RESTORE IS NOT REQ
       RET
;
;
SELDSK: LD      A,C
       CP      2
       JP      NC,HDBIO1       ;THIS WILL RETURN 0000 IN [HL] TO TELL CPM
       OR      A               ;THERE IS A PROBLEM
       JP      NZ,BBBB         ;IS B DRIVE
       LD      A,(ADRIVE)
       OR      C
       LD      (UNIT),A        ;SET A: TO CORRECT DENSITY
       JP      ALLOK
BBBB:   LD      A,(BDRIVE)
       CP      0FFH            ;IS THIS FIRST TIME
       JP      NZ,BBB1
       LD      A,C             ;IF SO GET DISK TYPE (AND SIZE)
       CALL    UNITSL
       JP      NZ,HDBIO1       ;BACK TO CPM WITH [HL]=0 & ERROR
       LD      A,(UNIT)
       AND     01000000B
       LD      (BDRIVE),A
BBB1:   OR      C
       LD      (UNIT),A
;
ALLOK:  BIT     6,A
       JP      Z,ALLOK1        ;IS IT DD OR SD
       LD      A,00000010B     ;YES DD THEN CONVERT TO DD
       ADD     C               ;IE MAKE A:=C: AND B:=D:
       LD      C,A             ;NOTE THIS IS ONLY FOR CPM SOFTWARE
ALLOK1: LD      L,C
       LD      H,0             ;ACTUAL DISK PARAMETER BLOCK IS GOT IN DDSKBIOS
       RET
;
;
SETTRK: LD      A,C
       LD      (TRK),A
       RET
;
SETSEC: LD      A,C
       LD      (SCTR),A
       RET
;
SETDMA: LD      (TADDR),BC
       RET
;
SECTRAN:LD      B,0
       EX      DE,HL
       ADD     HL,BC
       LD      L,(HL)
       LD      H,0
       RET
;
;       READ A SECTOR
READ:   LD      BC,301H
READBT: LD      (RSEEK),BC
READ1:  PUSH    BC
       CALL    RDSC
       POP     BC
       RET     Z
       CALL    RETRY
       JR      READ1
;
;       WRITE A SECTOR
WRITE:  LD      BC,301H
WRBT:   LD      (RSEEK),BC
WRITE1: PUSH    BC
       CALL    WRSC
       POP     BC
       RET     Z
       CALL    RETRY
       JR      WRITE1
;
RETRY:  DJNZ    RETRY2
       LD      A,(RTRY)
       LD      B,A
       DEC     C
       JP      P,RETRY1
       POP     AF
       XOR     A
       INC     A
       RET
RETRY1: PUSH    BC
       CALL    HOME1
       POP     BC
RETRY2: RET
HOME1:  LD      (SPSV),SP
       LD      A,RSCMD
       CALL    SEEK4
       XOR     A
       RET
;
;       SELECT DRIVE IN HARDWARE
;
DRVSET:LD       DE,UNIT
       LD      A,(DE)
       AND     0E0H
       LD      C,A             ;STORE DRIVE TYPE IN [C]
       LD      A,(DE)
       AND     03
       LD      B,A             ;STORE DRIVE # IN [B]
       LD      A,1
       JR      Z,DRVSEL
CKDRV1: RLCA
       DJNZ    CKDRV1
DRVSEL: OR      C               ;COMBINE TYPE & DRIVE#
       AND     7FH
       LD      B,A             ;[B] CONTAINS INFO FOR HARDWARE
       LD      A,STDSDT        ;SETUP FOR SD
       LD      (COUNT),A       ;STORE AS 26 SECTORS/TRACK
       LD      A,40H           ;WAS IT DD
DRV1:   CP      C
       JR      NZ,CKDRV
       LD      A,STDDDT        ;SETUP FOR DD
       LD      (COUNT),A       ;SET TO 50 SECTORS/TRACK
CKDRV:  LD      A,B             ;GET HARDWARE SELECT DATA
       CPL                     ;HARDWARE IS INVERTED
       OUT     (SELECT),A
       LD      A,(DE)
       LD      (UNITCK),A
       CALL    DELAY
RDYCK:  IN      A,(STATUS)
       AND     80H
       JP      NZ,END2
       RET
;
;       READ PRESENT DISK ADDRESS
IDRD:   CALL    WAIT
       LD      HL,IDSV
       LD      BC,600H+DATA    ;READ 6 BYTES
       LD      A,0F8H
       LD      (ERMASK),A
       CALL    SWEB
       LD      A,RDACMD        ;DO THE ID READ
       CALL    RDSCO
       LD      A,(IDSV)
       CP      NTRKS           ;IS IT REASONABLE
       JP      NC,SEEK0
       OUT     (TRACK),A
       XOR     A
       RET
;
DELAY:  LD      A,40            ;DELAY ~32 MS (DOES NOT SEEM TO BE CRITICAL)
DELAY1: LD      B,0
M0:     DJNZ    M0
       DEC     A
       JR      NZ,DELAY1
       RET
;
;       READ SECTOR COMMAND
RDSC:   CALL    DRINIT
       LD      A,RDCMD
RDSCO:  LD      (CMDSV),A
       DI
       OUT     (CMD),A
       JR      M2
M2:     JR      MM2
MM2:    INIR
       EI
       JR      END
;
;
;       WRITE SECTOR COMMAND
WRSC:   CALL    DRINIT
       LD      A,WRCMD
       LD      (CMDSV),A
       DI
       OUT     (CMD),A
       JR      H2
H2:     JR      HM2
HM2:    OTIR
       EI
;
;       END  OF COMMAND
END:    CALL    WAIT
       IN      A,(STATUS)
       LD      D,A
       LD      A,(ERMASK)
       AND     D
       RET     Z
END1:   LD      A,D
END2:   LD      (ERSTAT),A
       CALL    DELAY
       OR      1
       LD      SP,(SPSV)
       CALL    UNITFX
       RET
;
;
;       DRIVE INITIALIZATION
;
DRINIT: CALL    VDMDUMP         ;WILL SEE IF DISK TRACK/SECTOR INFO IS REQ.
       POP     HL
       LD      (SPSV),SP
       PUSH    HL
       LD      A,(UNIT)
       LD      D,A
       LD      A,(UNITCK)
       CP      D
       JR      Z,DINIT1
       CALL    DRVSET
       CALL    IDRD
DINIT1: CALL    SEEK
       LD      A,0FEH
       LD      (ERMASK),A
;
TRINT:  LD      HL,(TADDR)      ;SETUP DMA ADDRESS AND BYTE COUNT
       LD      A,(SCTR)
       OUT     (SECTOR),A
       LD      BC,NBYTES*100H+DATA
;
SWEB:   IN      A,(SELECT)      ;ENABLE WAIT STATES
       AND     7FH
       OUT     (SELECT),A
       RET
;
;
;
;       SEEK TRACK
;
SEEK:   CALL    RDYCK
       LD      C,NTRKS         ;MUST BE REASONABLE TRACK #
       LD      A,(TRK)
       CP      C
       JR      C,SEEK1
SEEK0:  LD      A,0FH
       JR      END2
SEEK1:  LD      C,A
       IN      A,(TRACK)
       CP      C
       RET     Z               ;IF SAME TRACK NO NEED TO SEEK
       LD      A,SKCMD
SEEK4:  LD      (CMDSV),A
       LD      B,210
S0:     DJNZ    S0
       CALL    WAIT
       LD      A,(TRK)
       OUT     (DATA),A
       LD      A,80H
       LD      (ERMASK),A
       LD      A,(CMDSV)
       OUT     (CMD),A
       LD      B,10
D0:     DJNZ    D0
       CALL    END
       CALL    DELAY
       LD      A,(CMDSV)
       CP      RSCMD           ;NO NEED TO CHECK RESTORE COMMAND
       RET     Z
       IN      A,(STATUS)
       AND     10H
       JR      NZ,SEEK2
       IN      A,(TRACK)
       CP      C
       RET     Z
SEEK2:  LD      A,20H
END2JP: JP      END2
;
WAIT:   LD      E,0
       PUSH    BC
       LD      C,2
WAIT2:  IN      A,(STATUS)
       AND     1
       JR      Z,DWAIT
       DJNZ    WAIT2
       DEC     E
       JR      NZ,WAIT2
       DEC     C
       JR      NZ,WAIT2
       POP     BC
       IN      A,(SELECT)              ;IF BY THIS TIME NOT READY FORCE
       OR      80H                     ;A HARDWARE RESET
       OUT     (RSET),A
F0:     DJNZ    F0
       IN      A,(RSET)
       CALL    FRCINT
       LD      A,RSCMD
       CALL    SEEK4
       LD      A,0FEH
       JP      END2JP
;
;       DISABLE WAIT STATES
DWAIT:  POP     BC                      ;TO BALANCE THE ABOVE PUSH IN WAIT
       IN      A,(SELECT)
       OR      80H
       OUT     (SELECT),A
       RET
;
;
;
;       FORCE CHIP INTERUPT
FRCINT: LD      A,0D0H
       OUT     (CMD),A
       LD      A,10
FRC1:   DEC     A
       JR      NZ,FRC1
       IN      A,(STATUS)
       RET
;
;       LOAD A NUMBER OF SECTORS
LOADER: CALL    UNITFX
LD1:    CALL    READ
       RET     NZ
       CALL    INCP
       JR      NZ,LD1
       RET
;
;       SAVE A NUMBER OF SECTORS
SAVER:  CALL    UNITFX
SV1:    CALL    WRITE
       RET     NZ
       CALL    INCP
       JR      NZ,SV1
       RET
;
;       INC SECTOR AND TRACK
INCP:   LD      HL,(TADDR)
       LD      DE,NBYTES
INCP2:  ADD     HL,DE
       LD      (TADDR),HL
       LD      HL,NREC
       DEC     (HL)
       RET     Z
       LD      HL,SCTR
       INC     (HL)
       LD      A,(COUNT)       ;IS ONE TRACK DONE YET
       INC     A
       CP      (HL)
       RET     NZ              ;IF FULL GO TO NEXT TRACK
       LD      (HL),1          ;SET SECTOR COUNT BACK TO 1
       INC     HL              ;ASSUMES TRK=SECTOR+1 IE 44H
       INC     (HL)
       OR      A               ;MAKE SURE TO RETURN NZ
       RET
;
;
UNITFX: LD      A,0FFH
       LD      (UNITCK),A
       RET
;
;THE FOLLOWING ARE MONITOR LIKE COMMANDS I HAVE ADDED
;
ZTOMM:  LD      A,(HL)
       CP      '$'
       RET     Z
       LD      C,A
       INC     HL
       CALL    ZCO
       JR      ZTOMM
;
ZBITS:  PUSH    BC              ;DISPLAY BIT PATTERN IN [E]
       LD      B,8
BQ2:    SLA     E
       LD      A,18H
       ADC     A,A
       LD      C,A
       CALL    ZCO
       DJNZ    BQ2
       POP     BC
       RET
;
; THIS IS A ROUTINE THAT WILL PLACE ON A VDM THE CURRENT SELECTED TRACK/SECTOR
; INFORMATION. IT IS CONTINOUSLY UPDATED FOR EACH SECTOR READ OR WRITE IF BIT 7
; OF PORT "PANEL" IS RESET. NOTE IT ADDS EXTRA TIME TO DISK ASCESS SO BIT 7
; SHOULD BE USED ONLY FOR DEBUGGING ETC.
;
VDMDUMP:IN      A,(PANNEL)      ;FIND OUT IF DISPLAY IS REQ
       BIT     7,A
       RET     NZ              ;NZ IF NO DISPLAY WANTED
       PUSH    HL              ;JUST IN CASE
       PUSH    DE
       PUSH    BC              ;[AF] DOES NOT MATTER
       LD      A,(VDMFLG)      ;IS ASCII ALREADY THERE
       OR      A
       JR      NZ,VDM1
       LD      HL,MSG3         ;DROP IN ASCII
       LD      DE,SSMVID
       LD      BC,MSGL-MSG3
       LDIR
       XOR     A
       LD      (VDMFLG),A      ;SO NO UPDATE NEXT TIME
VDM1:   LD      HL,SSMDSK
       LD      A,(UNIT)
       CALL    DUMP
       LD      HL,SSMTRK
       LD      A,(TRK)
       CALL    DUMP
       LD      HL,SSMSEC
       LD      A,(SCTR)
       CALL    DUMP
       LD      HL,SSMDMA
       LD      A,(TADDR+1)
       CALL    DUMP
       LD      HL,SSMDMA+2
       LD      A,(TADDR)
       CALL    DUMP
       POP     BC
       POP     DE
       POP     HL
       RET
;
DUMP:   LD      B,A             ;STORE [A] FOR BELOW
       CALL    CONVII
       LD      A,B
       DEC     HL              ;DEC BECAUSE PRINTS RIGHT TO LEFT
       RRCA                    ;GET UPPER NIBBLE
       RRCA
       RRCA
       RRCA
CONVII: AND     0FH             ;CONVERT HEX TO ASCII
       ADD     A,90H
       DAA
       ADC     A,40H
       DAA
       LD      (HL),A
       RET
;
;
;
HDBIO1: LD      HL,0H
       POP     AF              ;THIS POPS OFF THE RETURN THAT WOULD GO
                               ;TO DSKBIOS INSTEAD IT RETURNS TO CP/M WITH
       XOR     A               ;0000 IN [HL]. THIS IS TAKEN AS AN ERROR BY CPM
       LD      (CDISK),A       ;SO WARMSTART WILL COME UP ON A:
       INC     A
       RET
;
MSG0:   DB      CLEAR,LF,01H,10H,11H,CR,TAB,TAB,'DISK LOADING'
       DB      TAB,TAB,TAB,TAB,'STORE BYTE--',03H,5DH,' $'
MSG1:   DB      CR,LF,BELL,'Cannot select disk',CR,LF,'$'
MSG2:   DB      CR,LF,BELL,'Error reading CP/M loader',CR,LF,'$'
MSG3:   DB      'Disk      Track       Sector '
       DB      '      Taddress '
MSGL    EQU     $
;
;
;END DDBIOS.Z80