home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol026 / myddbios.z80 < prev    next >
Encoding:
Text File  |  1984-04-29  |  12.8 KB  |  658 lines

  1. ;    MYDDBIOS.Z80
  2. ;
  3. ; THIS IS A ROM BASED BIOS SUITABLE TO RUN 2.2 CP/M ON A VERSAFLOPPY II BOARD
  4. ; THE BIOS AUTOMATICALLY FIGURES OUT THE DENSITY OF DRIVES A: & B:
  5. ; IT IS SETUP TO TALK TO A ZAPPLE LIKE MONITOR AT 0F000H
  6. ;
  7. ;    VERSION    1.0    JOHN J.MONAHAN    (201)779-0635    1/15/1981
  8. ;
  9. ZCI    EQU    0F003H    ;CONSOLE INPUT
  10. ZCO    EQU    0F009H    ;CONSOLE OUTPUT
  11. ZCSTS    EQU    0F012H    ;CONSOLE STATUS
  12. ZRI    EQU    0F006H    ;READER TO MONITOR
  13. ZPOO    EQU    0F00CH    ;PUNCH TO MONITOR
  14. ZLO    EQU    0F00FH    ;LIST TO MONITOR
  15. ZLISTS    EQU    0F027H    ;LIST STATUS TO MONITOR
  16. SSMVID    EQU    0ED00H    ;LOCATION FOR DUMP OF DISK INFO ON SCREEN
  17. SSMDSK    EQU    SSMVID+06H    ;LOCATION TO PLACE UNIT#
  18. SSMTRK    EQU    SSMVID+12H    ;LOCATION TO PLACE TRACK#
  19. SSMSEC    EQU    SSMVID+1FH    ;LOCATION TO PLACE SECTOR#
  20. SSMDMA    EQU    SSMVID+2EH    ;LOCATION TO PLACE DMA ADDRESS
  21. MONITOR    EQU    0F000H    ;ZAPPLE LIKE MONITOR (NOTE IT IS NOT ZAPPLE ITSELF)
  22. PANNEL    EQU    0FFH    ;FRONT PANEL SWITCH USED TO SWITCH ON/OFF DUMP TO VDM
  23. STORE    EQU    0D8H    ;PORT USED AS KIND OF IOBYTE WITHIN MY MONITOR (CAN BE
  24. ;            ;REMOVED FROM CODE IF YOU LIKE )
  25. ;
  26. ;
  27. LF    EQU    0AH
  28. CR    EQU    0DH
  29. BELL    EQU    07H
  30. CLEAR    EQU    1AH
  31. TAB    EQU    09H
  32. ;
  33. ;
  34. IOBYTE    EQU    03H
  35. CDISK    EQU    04H
  36. TADDR    EQU    40H
  37. UNIT    EQU    42H    ;NEW UNIT BYTE
  38. SCTR    EQU    43H    ;SECTOR
  39. TRK    EQU    44H    ;TRACK
  40. NREC    EQU    45H    ;# OF SECTORS
  41. ERMASK    EQU    46H    ;ERROR MASK
  42. ERSTAT    EQU    47H    ;ERROR FLAG STORE
  43. IDSV    EQU    48H    ;6 BYTES (USED FOR TRACK ID COMMAND)
  44. CMDSV    EQU    4EH    ;COMMAND SAVE 
  45. SPSV    EQU    4FH    ;SP SAVE 
  46. TEMP2    EQU    51H    ;2 BYTE TEMP RECORD
  47. COUNT    EQU    53H    ;SECTORS/TRACK STORE
  48. VDMFLG    EQU    54H    ;FLAG TO INDICATE ASCII TO VDM BOARD HAS BEEN PLACED
  49. UNITCK    EQU    55H    ;OLD UNIT BYTE
  50. RSEEK    EQU    56H    ;NBR OF RESEEKS
  51. RTRY    EQU    57H    ;NBR OF RTRYS
  52. ADRIVE    EQU    58H    ;STORE OF A: DRIVE DENSITY ETC TYPE
  53. BDRIVE    EQU    59H    ;STORE OF B: DRIVE TYPE
  54. CBFLAG    EQU    5AH    ;FLAG TO INDICATE WBOOT OR CBOOT FOR LOADER ON DISK
  55. SSTACK    EQU    80H    ;SYSTEM STACK
  56. COLD    EQU    80H    ;COLD START ADDRESS
  57. ;
  58. X    EQU    60H        ;PORTS FOR 1791
  59. RSET    EQU    X+0        ;CONTROLLER RESET ADDRESS
  60. SELECT    EQU    X+3        ;DRIVE SELECT PORT
  61. STATUS    EQU    X+4        ;STATUS PORT
  62. TRACK    EQU    X+5        ;TRACK PORT
  63. SECTOR    EQU    X+6        ;SECTOR PORT
  64. DATA    EQU    X+7        ;DATA PORT
  65. CMD    EQU    X+4        ;COMMAND PORT
  66. ;
  67. RDACMD    EQU    0C0H        ;READ ADDRESS CODE
  68. RDCMD    EQU    088H        ;READ SECTOR CODE
  69. WRCMD    EQU    0A8H        ;WRITE SECTOR CODE
  70. WRTCMD    EQU    0F4H        ;WRITE TRACK CODE
  71. RSCMD    EQU    009H        ;RESTORE COMMAND
  72. SKNCMD    EQU    019H        ;SEEK NO VERIFY
  73. SKCMD    EQU    1DH        ;SEEK WITH VERIFY
  74. ;
  75. STDSDT    EQU    26        ;STANDARD 8" 26 SECTORS/TRACK
  76. STDDDT    EQU    50        ;STANDARD DD 8" 50 SECTORS/TRACK
  77. NBYTES    EQU    128        ;BYTES/SECTOR 
  78. NTRKS    EQU    77        ;TRACKS/DISK
  79. ;
  80. ;
  81. ;
  82. ;
  83.     ORG    0F800H        ;<--------- LOCATION OF 2716 PROM
  84. ;
  85. ;    DOS SYSTEM LINKAGES    (USED BY SDOS & 2.2 CP/M DO NOT CHANGE ORDER)
  86. ;
  87. CBOOT:    JP    BOOT    ;COLD START ENTRY
  88. WBOOT:    JP    BOOTW    ;WARM START ENTRY
  89. CSE:    JP    ZCSTS    ;CONSOLE STATUS
  90. CIE:    JP    ZCI    ;CONSOLE IN
  91. COE:    JP    ZCO    ;CONSOLE OUT
  92. LIST:    JP    ZLO    ;TO MONITOR FOR PRINTER
  93. PUNCH:    JP    ZPOO    ;TO MONITOR FOR PUNCH
  94. READR:    JP    ZRI    ;TO MONITOR FOR READER
  95. HME:    JP    HOME    ;MOVE TO TRACK 0
  96. SDSKE:    JP    SELDSK
  97. STRKE:    JP    SETTRK
  98. SSECE:    JP    SETSEC
  99. SDMAE:    JP    SETDMA
  100. RDE:    JP    READ
  101. WRE:    JP    WRITE
  102. LISTS:    JP    ZLISTS    ;LIST STATUS
  103. SECTR:    JP    SECTRAN    ;FOR 2.2 SECTOR TRANSLATION TABLE
  104. ;
  105. DTYPE:    JP    UNITSL    ;SET UP UNIT BYTE (DISK DENSITY)
  106. SVE:    JP    SAVER    ;SAVE N RECORDS
  107. LDE:    JP    LOADER    ;LOAD N SECTORS
  108. ;
  109. ;----------------------------------------------------------------------
  110. ;
  111. ;BOOT LOADS A SECTOR TO 80H AFTER CHECKING DISK TYPE THEN JUMPS TO 80H
  112. ;
  113. BOOT:    XOR    A
  114.     LD    (CDISK),A    ;MAKE CURRENT DISK A:
  115.     LD    (IOBYTE),A    ;CLEANUP IOBYTE
  116.     LD    (VDMFLG),A    ;ASCII TO VDM BOARD NOT YET SENT
  117.     DEC    A
  118.     LD    (CBFLAG),A    ;INDICATE A COLD BOOT TO LOADER
  119.     LD    HL,MSG0        ;SEND SIGNON MESSAGE
  120.     CALL    ZTOMM    
  121.     IN    A,(STORE);---FOR MY SYSTEM I/O (CAN REMOVE THIS & NEXT 2 LINES)
  122.     LD    E,A
  123.     CALL    ZBITS
  124.     JR    BOOTW1
  125. ;
  126. BOOTW:    XOR    A        ;INDICATE TO LOADER A WARM BOOT
  127.     LD    B,A
  128.     LD    (CBFLAG),A
  129. BOOTW1:    LD    SP,SSTACK
  130.     LD    A,8EH        ;SWITCH ON DRIVE A DISABLE ANY WAIT STATES
  131.     OUT    (SELECT),A
  132.     LD    A,08H        ;LOAD HEAD WITH A RESTORE (NO VERIFY)
  133.     OUT    (CMD),A        ;THE HEAD LOAD STARTS MY DRIVE MOTOR
  134. BOOTW2:    DJNZ    BOOTW2        ;DELAY A LITTLE TO LET MOTOR GET TO SPEED
  135.     PUSH    HL        ;SAVE [SP] HERE FOR ALL ERRORS ETC
  136.     LD    (SPSV),SP
  137.     POP    HL
  138.     CALL    FRCINT
  139.     XOR    A
  140.     OUT    (TRACK),A
  141.     LD    A,2
  142.     LD    (TRK),A
  143.     LD    A,SKNCMD
  144.     CALL    SEEK4
  145. BT2:    XOR    A        ;COME UP ON A: DRIVE
  146.     CALL    UNITSL        ;IS IT SD OR DD 
  147.     JR    NZ,GOMON    ;IF NONE OF THE ABOVE QUIT
  148. ;
  149. BT4:    LD    A,(UNIT)
  150.     AND    01000000B    ;ISOLATE ALL BUT DENSITY BIT
  151.     LD    (ADRIVE),A    ;SO ADRIVE= 0H IF SD   & 40H IF DD
  152.     LD    A,0FFH        ;FLAG B: AS NOT YET OBTAINED
  153.     LD    (BDRIVE),A
  154.     CALL    BOOTLD
  155.     LD    HL,COLD
  156.     LD    A,(HL)
  157.     CP    31H        ;EXPECT TO HAVE 31H @80H IE. LD SP,80H
  158.     JR    NZ,GOMON1    ;AS THE FIRST INSTRUCTION
  159.     JP    COLD        ;IF ALL IS OK. JUMP TO 80H AND LOAD CP/M
  160. ;
  161. GOMON:    LD    HL,MSG1        ;"CANNOT SELECT DISK"
  162.     JR    GOMON2
  163. GOMON1:    LD    HL,MSG2        ;"ERROR READING LOADER"
  164. GOMON2:    CALL    ZTOMM
  165.     JP    MONITOR
  166. ;        
  167. BOOTLD:    LD    HL,COLD
  168. BOOT1:    LD    (TADDR),HL
  169. BOOT2:    XOR    A
  170.     LD    (TRK),A        ;SET TRACK 0
  171.     INC    A
  172.     LD    (SCTR),A
  173.     CALL    READ
  174.     RET    Z
  175.     JR    GOMON1
  176. ;
  177. ; THIS ROUTINE SETS UP THE UNIT BYTE
  178. ; THE REQUIRED DRIVE IS IN [A]
  179. ;
  180. UNITSL:    LD    B,5
  181.     AND    0FH
  182.     OR    40H        ;COME UP DEFALT IN 8" DD
  183.     LD    (UNIT),A
  184.     LD    HL,(TADDR)
  185.     LD    (TEMP2),HL
  186.     CALL    USL1
  187.     LD    HL,(TEMP2)
  188.     LD    (TADDR),HL
  189.     LD    A,(UNIT)
  190.     RET    
  191. ;
  192. USL1:    PUSH    BC
  193.     PUSH    HL
  194.     LD    (SPSV),SP
  195.     POP    HL
  196.     CALL    DRVSET        ;SELECT DRIVE IN HARDWARE
  197.     CALL    IDRD
  198.     POP    BC
  199.     LD    A,(IDSV+3)    ;THIS CHECKS FOR 256 BYTES/SECTOR NOT
  200.     RRCA            ;USED IN THIS BIOS. IF CORRECT DENSITY
  201.     RET    Z        ;IT WILL BE Z
  202.                 ;@ IDSV)
  203.     DEC    B        ;DECREASE 5.......0 IF Z THEN ERROR
  204.     JP    Z,SPECIAL
  205.     CALL    CHGTYP
  206.     JR    USL1
  207. ;
  208. SPECIAL:XOR    A        ;COULD BE LATER USED FOR SPECIAL SECTOR SIZE
  209.     DEC    A
  210.     RET            ;RET NZ SO SELDSK KNOWS THERE IS A PROBLEM
  211. ;
  212. CHGTYP:    LD    A,(UNIT)
  213.     ADD    01000000B    ;TOGGLE DENSITY BIT
  214.     AND    01111111B    ;CLEAR BIT 7
  215.     LD    (UNIT),A
  216.     RET
  217. ;
  218. ;    DISK CONTROLLER LINKAGES
  219. ;
  220. HOME:    XOR    A        ;THIS CUTS DOWN ON HEAD MOVEMENT SINCE MANY
  221.     LD    (TRK),A        ;TIMES RESTORE IS NOT REQ
  222.     RET
  223. ;
  224. ;    
  225. SELDSK:    LD    A,C
  226.     CP    2
  227.     JP    NC,HDBIO1    ;THIS WILL RETURN 0000 IN [HL] TO TELL CPM
  228.     OR    A        ;THERE IS A PROBLEM
  229.     JP    NZ,BBBB        ;IS B DRIVE
  230.     LD    A,(ADRIVE)    
  231.     OR    C
  232.     LD    (UNIT),A    ;SET A: TO CORRECT DENSITY
  233.     JP    ALLOK
  234. BBBB:    LD    A,(BDRIVE)
  235.     CP    0FFH        ;IS THIS FIRST TIME
  236.     JP    NZ,BBB1
  237.     LD    A,C        ;IF SO GET DISK TYPE (AND SIZE)
  238.     CALL    UNITSL
  239.     JP    NZ,HDBIO1    ;BACK TO CPM WITH [HL]=0 & ERROR
  240.     LD    A,(UNIT)
  241.     AND    01000000B
  242.     LD    (BDRIVE),A
  243. BBB1:    OR    C
  244.     LD    (UNIT),A
  245. ;
  246. ALLOK:     BIT    6,A
  247.     JP    Z,ALLOK1    ;IS IT DD OR SD
  248.     LD    A,00000010B    ;YES DD THEN CONVERT TO DD
  249.     ADD    C        ;IE MAKE A:=C: AND B:=D:
  250.     LD    C,A        ;NOTE THIS IS ONLY FOR CPM SOFTWARE
  251. ALLOK1:    LD    L,C
  252.     LD    H,0        ;ACTUAL DISK PARAMETER BLOCK IS GOT IN DDSKBIOS
  253.     RET
  254. ;
  255. ;
  256. SETTRK:    LD    A,C
  257.     LD    (TRK),A
  258.     RET
  259. ;
  260. SETSEC:    LD    A,C
  261.     LD    (SCTR),A
  262.     RET
  263. ;
  264. SETDMA:    LD    (TADDR),BC
  265.     RET
  266. ;
  267. SECTRAN:LD    B,0
  268.     EX    DE,HL
  269.     ADD    HL,BC
  270.     LD    L,(HL)
  271.     LD    H,0
  272.     RET
  273. ;
  274. ;    READ A SECTOR
  275. READ:    LD    BC,301H
  276. READBT:    LD    (RSEEK),BC
  277. READ1:    PUSH    BC
  278.     CALL    RDSC
  279.     POP    BC
  280.     RET    Z
  281.     CALL    RETRY
  282.     JR    READ1  
  283. ;
  284. ;    WRITE A SECTOR
  285. WRITE:    LD    BC,301H
  286. WRBT:    LD    (RSEEK),BC
  287. WRITE1:    PUSH    BC
  288.     CALL    WRSC    
  289.     POP    BC
  290.     RET    Z
  291.     CALL    RETRY
  292.     JR    WRITE1  
  293. ;
  294. RETRY:    DJNZ    RETRY2  
  295.     LD    A,(RTRY)
  296.     LD    B,A
  297.     DEC    C
  298.     JP    P,RETRY1
  299.     POP    AF
  300.     XOR    A
  301.     INC    A
  302.     RET
  303. RETRY1:    PUSH    BC
  304.     CALL    HOME1
  305.     POP    BC
  306. RETRY2:    RET
  307. HOME1:    LD    (SPSV),SP
  308.     LD    A,RSCMD
  309.     CALL    SEEK4
  310.     XOR    A
  311.     RET
  312. ;
  313. ;    SELECT DRIVE IN HARDWARE
  314. ;
  315. DRVSET:LD    DE,UNIT
  316.     LD    A,(DE)
  317.     AND    0E0H
  318.     LD    C,A        ;STORE DRIVE TYPE IN [C]
  319.     LD    A,(DE)
  320.     AND    03
  321.     LD    B,A        ;STORE DRIVE # IN [B]
  322.     LD    A,1
  323.     JR    Z,DRVSEL  
  324. CKDRV1:    RLCA
  325.     DJNZ    CKDRV1  
  326. DRVSEL:    OR    C        ;COMBINE TYPE & DRIVE#
  327.     AND    7FH
  328.     LD    B,A        ;[B] CONTAINS INFO FOR HARDWARE
  329.     LD    A,STDSDT    ;SETUP FOR SD
  330.     LD    (COUNT),A    ;STORE AS 26 SECTORS/TRACK
  331.     LD    A,40H        ;WAS IT DD
  332. DRV1:    CP    C
  333.     JR    NZ,CKDRV
  334.     LD    A,STDDDT    ;SETUP FOR DD 
  335.     LD    (COUNT),A    ;SET TO 50 SECTORS/TRACK
  336. CKDRV:    LD    A,B        ;GET HARDWARE SELECT DATA
  337.     CPL            ;HARDWARE IS INVERTED
  338.     OUT    (SELECT),A
  339.     LD    A,(DE)
  340.     LD    (UNITCK),A
  341.     CALL    DELAY
  342. RDYCK:    IN    A,(STATUS)
  343.     AND    80H
  344.     JP    NZ,END2
  345.     RET
  346. ;
  347. ;    READ PRESENT DISK ADDRESS
  348. IDRD:    CALL    WAIT
  349.     LD    HL,IDSV
  350.     LD    BC,600H+DATA    ;READ 6 BYTES
  351.     LD    A,0F8H
  352.     LD    (ERMASK),A
  353.     CALL    SWEB
  354.     LD    A,RDACMD    ;DO THE ID READ
  355.     CALL    RDSCO
  356.     LD    A,(IDSV)
  357.     CP    NTRKS        ;IS IT REASONABLE
  358.     JP    NC,SEEK0
  359.     OUT    (TRACK),A    
  360.     XOR    A
  361.     RET
  362. ;
  363. DELAY:    LD    A,40        ;DELAY ~32 MS (DOES NOT SEEM TO BE CRITICAL)
  364. DELAY1:    LD    B,0
  365. M0:    DJNZ    M0
  366.     DEC    A
  367.     JR    NZ,DELAY1  
  368.     RET
  369. ;
  370. ;    READ SECTOR COMMAND
  371. RDSC:    CALL    DRINIT
  372.     LD    A,RDCMD
  373. RDSCO:    LD    (CMDSV),A
  374.     DI
  375.     OUT    (CMD),A
  376.     JR    M2
  377. M2:    JR    MM2
  378. MM2:    INIR
  379.     EI
  380.     JR    END
  381. ;
  382. ;
  383. ;    WRITE SECTOR COMMAND
  384. WRSC:    CALL    DRINIT
  385.     LD    A,WRCMD
  386.     LD    (CMDSV),A
  387.     DI    
  388.     OUT    (CMD),A
  389.     JR    H2
  390. H2:    JR    HM2
  391. HM2:    OTIR
  392.     EI
  393. ;
  394. ;    END  OF COMMAND
  395. END:    CALL    WAIT
  396.     IN    A,(STATUS)
  397.     LD    D,A
  398.     LD    A,(ERMASK)
  399.     AND    D
  400.     RET    Z
  401. END1:    LD    A,D
  402. END2:    LD    (ERSTAT),A
  403.     CALL    DELAY
  404.     OR    1
  405.     LD    SP,(SPSV)
  406.     CALL    UNITFX
  407.     RET
  408. ;
  409. ;
  410. ;    DRIVE INITIALIZATION
  411. ;
  412. DRINIT:    CALL    VDMDUMP        ;WILL SEE IF DISK TRACK/SECTOR INFO IS REQ.
  413.     POP    HL
  414.     LD    (SPSV),SP
  415.     PUSH    HL
  416.     LD    A,(UNIT)
  417.     LD    D,A
  418.     LD    A,(UNITCK)
  419.     CP    D
  420.     JR    Z,DINIT1  
  421.     CALL    DRVSET
  422.     CALL    IDRD
  423. DINIT1:    CALL    SEEK
  424.     LD    A,0FEH
  425.     LD    (ERMASK),A
  426. ;
  427. TRINT:    LD    HL,(TADDR)    ;SETUP DMA ADDRESS AND BYTE COUNT
  428.     LD    A,(SCTR)
  429.     OUT    (SECTOR),A
  430.     LD    BC,NBYTES*100H+DATA
  431. ;
  432. SWEB:    IN    A,(SELECT)    ;ENABLE WAIT STATES
  433.     AND    7FH
  434.     OUT    (SELECT),A
  435.     RET
  436. ;
  437. ;
  438. ;
  439. ;    SEEK TRACK
  440. ;
  441. SEEK:    CALL    RDYCK
  442.     LD    C,NTRKS        ;MUST BE REASONABLE TRACK #
  443.     LD    A,(TRK)
  444.     CP    C
  445.     JR    C,SEEK1  
  446. SEEK0:    LD    A,0FH
  447.     JR    END2 
  448. SEEK1:    LD    C,A
  449.     IN    A,(TRACK)
  450.     CP    C
  451.     RET    Z        ;IF SAME TRACK NO NEED TO SEEK
  452.     LD    A,SKCMD
  453. SEEK4:    LD    (CMDSV),A
  454.     LD    B,210
  455. S0:    DJNZ    S0
  456.     CALL    WAIT
  457.     LD    A,(TRK)
  458.     OUT    (DATA),A
  459.     LD    A,80H
  460.     LD    (ERMASK),A
  461.     LD    A,(CMDSV)
  462.     OUT    (CMD),A
  463.     LD    B,10
  464. D0:    DJNZ    D0
  465.     CALL    END
  466.     CALL    DELAY
  467.     LD    A,(CMDSV)
  468.     CP    RSCMD        ;NO NEED TO CHECK RESTORE COMMAND
  469.     RET    Z
  470.     IN    A,(STATUS)
  471.     AND    10H
  472.     JR    NZ,SEEK2
  473.     IN    A,(TRACK)
  474.     CP    C
  475.     RET    Z
  476. SEEK2:    LD    A,20H
  477. END2JP:    JP    END2  
  478. ;
  479. WAIT:    LD    E,0
  480.     PUSH    BC
  481.     LD    C,2
  482. WAIT2:    IN    A,(STATUS)
  483.     AND    1
  484.     JR    Z,DWAIT
  485.     DJNZ    WAIT2  
  486.     DEC    E
  487.     JR    NZ,WAIT2
  488.     DEC    C
  489.     JR    NZ,WAIT2
  490.     POP    BC  
  491.     IN    A,(SELECT)        ;IF BY THIS TIME NOT READY FORCE
  492.     OR    80H            ;A HARDWARE RESET
  493.     OUT    (RSET),A
  494. F0:    DJNZ    F0
  495.     IN    A,(RSET)
  496.     CALL    FRCINT
  497.     LD    A,RSCMD
  498.     CALL    SEEK4
  499.     LD    A,0FEH
  500.     JP    END2JP    
  501. ;
  502. ;    DISABLE WAIT STATES
  503. DWAIT:    POP    BC            ;TO BALANCE THE ABOVE PUSH IN WAIT
  504.     IN    A,(SELECT)
  505.     OR    80H
  506.     OUT    (SELECT),A
  507.     RET
  508. ;
  509. ;
  510. ;
  511. ;    FORCE CHIP INTERUPT
  512. FRCINT:    LD    A,0D0H
  513.     OUT    (CMD),A
  514.     LD    A,10
  515. FRC1:    DEC    A
  516.     JR    NZ,FRC1
  517.     IN    A,(STATUS)
  518.     RET
  519. ;
  520. ;    LOAD A NUMBER OF SECTORS
  521. LOADER:    CALL    UNITFX
  522. LD1:    CALL    READ
  523.     RET    NZ
  524.     CALL    INCP    
  525.     JR    NZ,LD1  
  526.     RET
  527. ;
  528. ;    SAVE A NUMBER OF SECTORS
  529. SAVER:    CALL    UNITFX
  530. SV1:    CALL    WRITE
  531.     RET    NZ
  532.     CALL    INCP
  533.     JR    NZ,SV1  
  534.     RET
  535. ;
  536. ;    INC SECTOR AND TRACK
  537. INCP:    LD    HL,(TADDR)
  538.     LD    DE,NBYTES
  539. INCP2:    ADD    HL,DE
  540.     LD    (TADDR),HL
  541.     LD    HL,NREC
  542.     DEC    (HL)
  543.     RET    Z
  544.     LD    HL,SCTR
  545.     INC    (HL)
  546.     LD    A,(COUNT)    ;IS ONE TRACK DONE YET
  547.     INC    A
  548.     CP    (HL)
  549.     RET    NZ        ;IF FULL GO TO NEXT TRACK
  550.     LD    (HL),1        ;SET SECTOR COUNT BACK TO 1
  551.     INC    HL        ;ASSUMES TRK=SECTOR+1 IE 44H
  552.     INC    (HL)
  553.     OR    A        ;MAKE SURE TO RETURN NZ
  554.     RET
  555. ;
  556. ;
  557. UNITFX:    LD    A,0FFH
  558.     LD    (UNITCK),A
  559.     RET
  560. ;
  561. ;THE FOLLOWING ARE MONITOR LIKE COMMANDS I HAVE ADDED
  562. ;
  563. ZTOMM:    LD    A,(HL)
  564.     CP    '$'
  565.     RET    Z
  566.     LD    C,A
  567.     INC    HL
  568.     CALL    ZCO
  569.     JR    ZTOMM
  570. ;
  571. ZBITS:    PUSH    BC        ;DISPLAY BIT PATTERN IN [E]
  572.     LD    B,8
  573. BQ2:    SLA    E
  574.     LD    A,18H
  575.     ADC    A,A
  576.     LD    C,A
  577.     CALL    ZCO
  578.     DJNZ    BQ2
  579.     POP    BC
  580.     RET
  581. ;
  582. ; THIS IS A ROUTINE THAT WILL PLACE ON A VDM THE CURRENT SELECTED TRACK/SECTOR
  583. ; INFORMATION. IT IS CONTINOUSLY UPDATED FOR EACH SECTOR READ OR WRITE IF BIT 7
  584. ; OF PORT "PANEL" IS RESET. NOTE IT ADDS EXTRA TIME TO DISK ASCESS SO BIT 7
  585. ; SHOULD BE USED ONLY FOR DEBUGGING ETC.
  586. ;
  587. VDMDUMP:IN    A,(PANNEL)    ;FIND OUT IF DISPLAY IS REQ
  588.     BIT    7,A
  589.     RET    NZ        ;NZ IF NO DISPLAY WANTED
  590.     PUSH    HL        ;JUST IN CASE
  591.     PUSH    DE
  592.     PUSH    BC        ;[AF] DOES NOT MATTER
  593.     LD    A,(VDMFLG)    ;IS ASCII ALREADY THERE
  594.     OR    A
  595.     JR    NZ,VDM1
  596.     LD    HL,MSG3        ;DROP IN ASCII
  597.     LD    DE,SSMVID
  598.     LD    BC,MSGL-MSG3
  599.     LDIR
  600.     XOR    A
  601.     LD    (VDMFLG),A    ;SO NO UPDATE NEXT TIME
  602. VDM1:    LD    HL,SSMDSK
  603.     LD    A,(UNIT)
  604.     CALL    DUMP
  605.     LD    HL,SSMTRK
  606.     LD    A,(TRK)
  607.     CALL    DUMP
  608.     LD    HL,SSMSEC
  609.     LD    A,(SCTR)
  610.     CALL    DUMP
  611.     LD    HL,SSMDMA
  612.     LD    A,(TADDR+1)
  613.     CALL    DUMP
  614.     LD    HL,SSMDMA+2
  615.     LD    A,(TADDR)
  616.     CALL    DUMP
  617.     POP    BC
  618.     POP    DE
  619.     POP    HL
  620.     RET
  621. ;
  622. DUMP:    LD    B,A        ;STORE [A] FOR BELOW
  623.     CALL    CONVII
  624.     LD    A,B
  625.     DEC    HL        ;DEC BECAUSE PRINTS RIGHT TO LEFT
  626.     RRCA            ;GET UPPER NIBBLE
  627.     RRCA
  628.     RRCA
  629.     RRCA
  630. CONVII:    AND    0FH        ;CONVERT HEX TO ASCII
  631.     ADD    A,90H
  632.     DAA
  633.     ADC    A,40H
  634.     DAA
  635.     LD    (HL),A
  636.     RET
  637. ;
  638. ;
  639. ;
  640. HDBIO1:    LD    HL,0H
  641.     POP    AF        ;THIS POPS OFF THE RETURN THAT WOULD GO 
  642.                 ;TO DSKBIOS INSTEAD IT RETURNS TO CP/M WITH
  643.     XOR    A        ;0000 IN [HL]. THIS IS TAKEN AS AN ERROR BY CPM
  644.     LD    (CDISK),A    ;SO WARMSTART WILL COME UP ON A:
  645.     INC    A
  646.     RET
  647. ;
  648. MSG0:    DB    CLEAR,LF,01H,10H,11H,CR,TAB,TAB,'DISK LOADING'
  649.     DB    TAB,TAB,TAB,TAB,'STORE BYTE--',03H,5DH,' $'
  650. MSG1:    DB    CR,LF,BELL,'Cannot select disk',CR,LF,'$'
  651. MSG2:    DB    CR,LF,BELL,'Error reading CP/M loader',CR,LF,'$'
  652. MSG3:    DB    'Disk      Track       Sector '
  653.     DB    '      Taddress '
  654. MSGL    EQU    $
  655. ;
  656. ;
  657. ;END DDBIOS.Z80
  658.