home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / SIMTEL / CPMUG / CPMUG049.ARK / 4FDCBIOS.Z80 < prev    next >
Text File  |  1984-04-29  |  13KB  |  665 lines

  1.     LIST    NOCOND,NOGEN
  2. ;
  3. ;
  4. PERSCISW:    EQU    0        ;ONE IF PERSCI DRIVE
  5. LARGESW:    EQU    0 OR PERSCISW    ;ONE IF MAXI DRIVE
  6. NUMDRIVES:    EQU    2        ;ONE TO FOUR (MUST BE SAME TYPE)
  7. BIGIOSW:    EQU    1        ;ZERO IF NO LIST, NO PUNCH
  8. ;
  9. BEGINADR:    EQU    0E400H        ;THIS IS THE START OF 64K CPM
  10. ;
  11.     ORG    1600H+BEGINADR 
  12. ;
  13. ;    CROMEMCO 4FDC I/O ASSIGNMENTS
  14. ;
  15. CSTATPORT:    EQU    00H        ;3P + S, 4FDC, TU-UART, OR SCC
  16. CDATAPORT:    EQU    01H
  17. IMODEPORT:    EQU    02H        ;(3P + S DOESNT HAVE THESE)
  18. IMASKPORT:    EQU    03H
  19. PARLPORT:    EQU    04H        ;NOT USED
  20. ;
  21. STATPORT:    EQU    30H        ;4FDC OR CCS 2422 BOARD
  22. TRAKPORT:    EQU    31H
  23. SECTPORT:    EQU    32H
  24. DATAPORT:    EQU    33H
  25. FLAGPORT:    EQU    34H
  26. ;
  27. BANKPORT:    EQU    40H        ;MEMORY BANKING PORT
  28. ;
  29. ;    1771/179X EQUATES
  30. ;
  31. HEADLOAD:    EQU    08H
  32. VERIFY:        EQU    04H
  33. ;
  34.         IF    BIGIOSW = 1
  35. ;
  36. ;    OTHER DEFINITIONS (OPTIONAL)
  37. ;
  38. BAUDRATE:    EQU    01H        ;110 BAUD FOR READER ?
  39. RSTATPORT:    EQU    20H
  40. RBAUDPORT:    EQU    RSTATPORT    ;TU-UART BOARD FOR PAPER TAPE
  41. RDATAPORT:    EQU    RSTATPORT+1
  42. PSTATPORT:    EQU    20H
  43. PBAUDPORT:    EQU    PSTATPORT    ;PAPER TAPE PUNCH ALSO
  44. PDATAPORT:    EQU    PSTATPORT+1
  45. LSTATPORT:    EQU    54H        ;PARALLEL PRINTER POARD
  46. LDATAPORT:    EQU    LSTATPORT
  47.         ENDIF
  48. ;
  49. ;    CPM ENTRY POINTS
  50. CPMB:        EQU    00H+BEGINADR
  51. BDOS:        EQU    806H+BEGINADR
  52. ;
  53. ;    JUMP VECTOR
  54.     JP    CBOOT
  55. EBOOT:
  56.     JP    WBOOT
  57.     JP    CONSTAT
  58.     JP    CONIN
  59.     JP    CONOUT
  60.     JP    LIST
  61.     JP    PUNCH
  62.     JP    READER
  63.     JP    HOME    
  64.     JP    SELDSK        
  65.     JP    SETTRK
  66.     JP    SETSEC
  67.     JP    SETDMA
  68.     JP    READ
  69.     JP    WRITE
  70.     JP    LISTAT
  71.     JP    SECTRAN
  72. ;
  73. ;    CP/M 2.2 DISK CONTROL BLOCKS
  74. ;
  75. DPBASE:
  76.     DW    XLT0,0000
  77.     DW    0000,0000
  78.     DW    DIRBUF,DPB0
  79.     DW    CSV0,ALV0
  80. ;
  81.     IF    NUMDRIVES > 1
  82.     DW    XLT0,0000
  83.     DW    0000,0000
  84.     DW    DIRBUF,DPB0
  85.     DW    CSV1,ALV1
  86.     ENDIF
  87. ;
  88.     IF    NUMDRIVES > 2
  89.     DW    XLT0,0000
  90.     DW    0000,0000
  91.     DW    DIRBUF,DPB0
  92.     DW    CSV2,ALV2
  93.     ENDIF
  94. ;
  95.     IF    NUMDRIVES > 3
  96.     DW    XLT0,0000
  97.     DW    0000,0000
  98.     DW    DIRBUF,DPB0
  99.     DW    CSV3,ALV3
  100.     ENDIF
  101. ;
  102. DPB0:
  103. ;
  104. ;    disk parameter block, common to all disks
  105. ;    this implements a "standard" CP/M directory
  106. ;    with 64 entries, and 1K blocks.
  107. ;
  108.     DW    18+LARGESW*8    ;sectors per track
  109.     DB    3        ;block shift factor
  110.     DB    7        ;block mask
  111.     DB    0        ;null mask
  112.     DW    81+LARGESW*161    ;disk size-1
  113.     DW    63        ;directory max
  114.     DB    192        ;alloc 0
  115.     DB    0        ;alloc 1
  116.     DW    16        ;check size
  117.     DW    3-LARGESW    ;track offset
  118. ;
  119. XLT0:
  120. ;
  121. ;    sector translate vector
  122. ;
  123.     IF    LARGESW EQ 0
  124.     DB    1,6,11,16    ;sectors 1,2,3,4
  125.     DB    3,8,13,18    ;sectors 5,6,7,8
  126.     DB    5,10,15,2    ;sectors 9,10,11,12
  127.     DB    7,12,17,4    ;sectors 13,14,15,16
  128.     DB    9,14        ;sectors 17,18
  129.     ENDIF
  130. ;
  131. ;
  132.     IF    LARGESW    EQ 1
  133.     DB    1,7,13,19    ;sectors 1,2,3,4
  134.     DB    25,5,11,17    ;sectors 5,6,7,8
  135.     DB    23,3,9,15    ;sectors 9,10,11,12
  136.     DB    21,2,8,14    ;sectors 13,14,15,16
  137.     DB    20,26,6,12    ;sectors 17,18,19,20
  138.     DB    18,24,4,10    ;sectors 21,22,23,24
  139.     DB    16,22        ;sectors 25,26
  140.     ENDIF
  141. ;
  142. ;
  143. SIGNON:
  144.     DEFB    13,10,10
  145.     DEFB    '64'
  146.     DEFB    'k CP/M vers 2.2'
  147.     DEFB    13,10,0
  148. ;
  149. SELDSK:    ;
  150.     LD    HL,0
  151.     LD    A,C        ;C CONTAINS REQUESTED DRIVE NO.
  152.     CP    NUMDRIVES
  153.     RET    NC        ;IGNORE IF TOO HIGH
  154.     LD    (CURRDRIVE),A
  155.     LD    (DKNUMB),A
  156.     LD    L,C    ;L=disk number 0,1,2,3
  157.     ADD    HL,HL    ;*2
  158.     ADD    HL,HL    ;*4
  159.     ADD    HL,HL    ;*8
  160.     ADD    HL,HL    ;*16 (size of each header)
  161.     LD    DE,DPBASE
  162.     ADD    HL,DE    ;HL=.dpbase(diskno*16)
  163.     RET    
  164. ;
  165. SECTRAN:    ;TRANSLATE SECTOR IN C USING TABLE AT DE
  166.     LD    B,0
  167.     EX    DE,HL        ;TABLE ADDR TO HL
  168.     ADD    HL,BC        ;GET ADDRESS
  169.     LD    L,(HL)        ;GET BYTE
  170.     LD    H,0        ;ANSWER IN HL
  171.     RET
  172. ;
  173. SETSEC:
  174.     LD    A,C        ;JUST SAVE SECTOR NUMBER
  175.     LD    (DKSECT),A
  176.     RET
  177. ;
  178. SETDMA:
  179.     LD    (DKDMA),BC    ;JUST SAVE I/O ADDRESS
  180.     RET
  181. ;
  182. ;
  183. ;    ERROR CHECKING READ AND WRITE RTNS FOR
  184. ;    CROMEMCO CBIOS
  185. ;
  186. READ:
  187.     CALL    CLEAR
  188. RETRYREAD:
  189.     CALL    READ4FDC    ;READ SECTOR
  190.     RET    Z        ;SUCCESSFUL READ. RETURN
  191.     CALL    ERROR        ;INCREMENT RETRYCOUNT
  192.     JR    NZ,RETRYREAD    ;RETRY 20 TIMES
  193.     OR    01H        ;CP/M CONVENTION FOR PERMANENT ERROR
  194.     RET    
  195. ;
  196. CLEAR:
  197.     XOR    A
  198.     LD    (TRKERCNT),A    ;ZERO OUT TRACK ERROR COUNTER
  199.     LD    (RETRYCOUNT),A    ;ZERO OUT CRC ERROR COUNTER
  200.     RET    
  201. ;
  202. WRITE:
  203.     CALL    CLEAR
  204. RETRYWRITE:
  205.     CALL    WRIT4FDC    ;WRITE SECTOR
  206.     RET    Z        ;SUCCESSFUL WRITE. RETURN
  207.     CALL    ERROR        ;INCREMENT RETRYCOUNT
  208.     JR    NZ,RETRYWRITE    ;RETRY 20 TIMES
  209.     OR    01H        ;CP/M CONVENTION FOR PERMANENT ERROR
  210.     RET    
  211. ;
  212. ERROR:
  213.     PUSH    HL
  214.     AND    10H        ;CHECK FOR NRF
  215.     JR    NZ,TRACKERROR    
  216.     LD    HL,RETRYCOUNT
  217.     INC    (HL)        ;INCREMENT RETRYCOUNT
  218.     LD    A,(HL)
  219.     POP    HL
  220.     SUB    20        ;20 TRIES?
  221.     RET    
  222. ;
  223. TRACKERROR:
  224.     LD    HL,TRKERCNT
  225.     INC    (HL)        ;INCREMENT NO OF TRACK ERRORS
  226.     LD    A,(HL)
  227.     SUB    10D        ;ALLOW ONLY 10 TRACK ERRORS
  228.     POP    HL
  229.     RET    Z        ;IF >10, RETURN A FAILURE
  230.     PUSH    BC
  231.     CALL    HOME        ;HOME THE HEAD
  232.     LD    A,(DKTRACK)
  233.     LD    C,A        ;GET TRACK IN C
  234.     CALL    SETTRK        ;RESEEK TO CORRECT TRACK
  235.     POP    BC
  236.     OR    0FFH        ;RETRY
  237.     RET    
  238. ;
  239. ;    RESTORE THE DISK TO TRACK ZERO
  240. ;
  241. HOME:
  242.     SUB    A,A        ;ZERO OUT TRACK COUNTER
  243.     LD    (DKTRACK),A
  244.     CALL    DISKSELECT    ;NOW SELECT THE DISK
  245.     OUT    FLAGPORT,A
  246.     LD    A,02H+HEADLOAD+VERIFY    ;USE SLOW STEPPING SPEED FOR ALL DISKS
  247.     OUT    STATPORT,A
  248. RSTI:
  249.     IN    A,FLAGPORT    ;NOW CHECK STATUS
  250.     RRA
  251.     JR    NC,RSTI        ;LOOP BACK UNTIL DONE
  252.     JP    SEEKTEST
  253. ;
  254. ;    HERE, ACTUALLY DO THE READ OPERATION
  255. ;
  256. READ4FDC:
  257.     PUSH    BC
  258.     PUSH    HL        ;FIRST, SAVE REGS
  259.     PUSH    DE
  260.     LD    E,88H        ;READ COMMAND (VALID FOR 1771, 179X)
  261.     CALL    INIT4FDC
  262. RDI1:
  263.     IN    A,FLAGPORT    ;NOW CHECK FLAGS
  264.     RRA
  265.     JR    C,RDI3        ;IF PREMATURELY DONE, STOP
  266.     INI
  267.     JR    NZ,RDI1        ;READ ANOTHER BYTE INTO CORE UNTIL DONE
  268. RDI2:
  269.     IN    A,FLAGPORT    ;CHECK FLAGS
  270.     RRA
  271.     JR    NC,RDI2        ;LOOP UNTIL READY
  272. RDI3:
  273.     IN    A,STATPORT    ;NOW CHECK STATUS
  274.     AND    A,9CH
  275. RDWREND:
  276.     EI
  277.     POP    DE        ;RESTORE REGS
  278.     POP    HL
  279.     POP    BC
  280.     RET
  281. ;
  282. ;    ACTUALLY DO WRITE OPERATION
  283. ;
  284. WRIT4FDC:
  285.     PUSH    BC
  286.     PUSH    HL        ;SAVE REGS
  287.     PUSH    DE
  288.     LD    E,0A8H        ;WRITE COMMAND (VALID FOR 1771, 179X)
  289.     CALL    INIT4FDC
  290. WRI1:
  291.     IN    A,FLAGPORT    ;CHECK FLAGS
  292.     RRA
  293.     JR    C,WRI3        ;IF PREMATURELY DONE, STOP
  294.     OUTI
  295.     JR    NZ,WRI1        ;WRITE DATA FROM MEMORY TIL DONE
  296. WRI2:
  297.     IN    A,FLAGPORT    ;CHECK FLAGS
  298.     RRA
  299.     JR    NC,WRI2        ;LOOP TIL DONE WITH WHOLE OPERATION
  300. WRI3:
  301.     IN    A,STATPORT    ;NOW CHECK ERROR STATUS
  302.     AND    A,0FCH
  303.     JR    RDWREND
  304. ;
  305. ;    SET THE TRACK, AND MOVE DISK ARM THERE
  306. ;
  307. SETTRK:
  308.     LD    A,C
  309.     LD    (DKTRACK),A    ;STORE THE TRACK NUMBER
  310.     SUB    A,A
  311.     CALL    DISKSELECT    ;NOW SELECT THE DISK
  312.     OUT    FLAGPORT,A
  313.     LD    A,C
  314.     OUT    DATAPORT,A    ;TELL 1771 ABOUT TRACK WANTED
  315.     LD    A,(DKSECT)
  316.     OUT    SECTPORT,A    ;TELL IT ABOUT SECTOR WANTED
  317.     PUSH    HL
  318.     PUSH    DE
  319.     LD    HL,LOGINTAB    ;NOW, SEE WHERE DISK ARM IS NOW
  320.     LD    A,(DKNUMB)
  321.     LD    E,A        ;LOOK UP IN TABLE
  322.     LD    D,0
  323.     ADD    HL,DE        ;GET BYTE
  324.     LD    A,(HL)
  325.     OUT    TRAKPORT,A    ;TELL 1771 WHERE ARM IS NOW
  326.     LD    A,(HL)
  327.     SUB    A,C
  328.     POP    DE        ;NOW CAN RESTORE THE REGS
  329.     POP    HL
  330.     RET    Z        ;IF ALREADY AT THAT TRACK, QUIT
  331.     LD    A,12H-LARGESW*2+HEADLOAD+VERIFY
  332.     OUT    STATPORT,A    ;PERFORM THE SEEK THAT IS NEEDED
  333. SKI:
  334.     IN    A,FLAGPORT    ;CHECK FLAGS
  335.     RRA
  336.     JR    NC,SKI        ;LOOP UNITL OPERATION DONE
  337. SEEKTEST:
  338.     IN    A,STATPORT    ;NOW CHECK ERROR STATUS
  339.     AND    A,98H
  340.     RET    NZ        ;ZERO IS ALL OK
  341.     PUSH    DE
  342.     LD    D,0        ;UPDATE TRACK TABLE
  343.     LD    A,(DKNUMB)
  344.     LD    E,A        ;WITH NEW POSITION
  345.     IF    PERSCISW = 1
  346.     CALL    ADDSHIFT    ;PERSCI DRIVES HAVE ONE ARM FOR
  347.     BIT    7,E        ;TWO DISKS, SO MUST POST BOTH
  348.     LD    E,1        ;ENTRIES IN TABLE
  349.     JR    Z,ADD2SHFT
  350.     LD    DE,-1        ;THIS WAS THE OTHER ONE
  351. ADD2SHFT:
  352.     CALL    ADDSHIFT    ;DO THE CORRECTION AND GO
  353.     POP    DE
  354.     RET
  355.     ENDIF
  356. ADDSHIFT:            ;IF NOT PERSCI, FALL THRU HERE
  357.     PUSH    HL
  358.     LD    HL,LOGINTAB    ;GET CORRECT ADDRESS OF DISK
  359.     ADD    HL,DE
  360.     LD    A,(DKTRACK)    ;AND GET CURRENT TRACK NUMBER
  361.     LD    (HL),A
  362.     SUB    A,A        ;PUT IT IN
  363.     POP    HL
  364.     IF    PERSCISW = 0
  365.     POP    DE        ;AND MISC CLEANUP
  366.     ENDIF
  367.     RET
  368. ;
  369. ;    INITIALIZE THE 4FDC, BY SELECTING THE DISK AND
  370. ;    TURNING ON THE DISK MOTORS, AND INITIALIZE THE
  371. ;    REGISTERS FOR THE I/O OPERATION
  372. ;
  373. INIT4FDC:
  374.     LD    A,80H        ;FIRST, SELECT THE DISK
  375.     CALL    DISKSELECT
  376.     LD    HL,(DKDMA)    ;INITIALIZE HL AND BC REGS FOR I/O
  377.     LD    BC,8000H+DATAPORT    ;80H IS 128 BYTE SECTORS
  378.     LD    D,A        ;SAVE THE A REG
  379.     DI            ;DISABLE INTERRUPTS
  380.     LD    A,(DKSECT)
  381.     OUT    SECTPORT,A    ;SET THE SECTOR WANTED
  382.     IN    A,FLAGPORT
  383.     CPL            ;SEE IF HEAD IS LOADED
  384.     AND    A,20H
  385.     JR    Z,IN0
  386.     LD    A,04        ;THIS IS THE HEAD LOAD BIT
  387. IN0:
  388.     ADD    A,E        ;ADD HEAD LOAD BIT TO COMMAND
  389.     LD    E,A
  390.     LD    A,D        ;RESTORE THE A REG
  391.     OUT    FLAGPORT,A
  392.     LD    A,E
  393.     OUT    STATPORT,A    ;OUTPUT THE COMMAND
  394.     RET
  395. ;
  396. ;    FIGURE OUT WHICH DISK TO SELECT AND PUT BIT THERE
  397. ;
  398. DISKSELECT:
  399.     PUSH    BC        ;FIRST, SAVE THIS, ITS NEEDED
  400.     LD    C,A
  401.     LD    A,(DKNUMB)    ;GET DISK NUMBER 0-3
  402.     LD    B,A
  403.     INC    B        ;ADD ONE
  404.     SUB    A,A
  405.     SCF            ;SET A BIT IN TO BE SHIFTED
  406. SHIFTBIT:
  407.     RLA            ;NOW, ROTATE BITS OVER
  408.     DJNZ    SHIFTBIT
  409.     LD    B,A        ;SAVE THE NEW VALUE
  410.     XOR    A
  411.     OR    A,20H+LARGESW*10H ;CONDITION 4FDC FOR MOTOR ON AND MAXI
  412.     OR    A,B
  413.     OR    A,C        ;OR IN DRIVE SELECT AND COMMAND WANTED
  414.     POP    BC
  415.     RET
  416. ;
  417. ;    THIS TRAPS THE MISSING MEMORY ERROR, BECAUSE IF A
  418. ;    MEMORY BOARD IS MISSING, THAT WILL GIVE FF'S, AND
  419. ;    THE FF OP-CODE IS THE RST 38H, SO THAT TRAPS HERE
  420. ;
  421. MERROR:
  422.     LD    SP,80H
  423.     LD    HL,ERRMSG    ;PRINT OUT THE ERROR AND WARMSTART
  424.     CALL    PRMSG
  425. ;
  426. ;    GETS CONTROL ON A WARM START
  427. ;
  428. WBOOT:
  429.     LD    A,01H        ;FIRST, RESTORE DEFAULT BANKING
  430.     OUT    BANKPORT,A
  431. ;
  432.     LD    SP,80H
  433.     LD    A,(DKNUMB)
  434.     LD    (CURRDRIVE),A    ;STORE SELECTED DRIVE
  435. ;
  436. STARTBOOT:
  437.     LD    C,0
  438.     CALL    SELDSK        ;SELECT DRIVE A TO REBOOT
  439.     CALL    HOME
  440.     LD    HL,CPMB-128    ;WILL INCREMENT BY 128 LATER
  441.     LD    (DKDMA),HL
  442.     LD    BC,44*256+1    ;SECTOR COUNT, FIRST SECTOR-1
  443. RDSEC:
  444.     LD    A,C        ;C IS SECTOR NUMBER
  445.     CP    18+LARGESW*8
  446.     JR    Z,NXTTRK
  447.     LD    DE,128        ;INCREMENT DMA ADDRESS
  448.     LD    HL,(DKDMA)
  449.     ADD    HL,DE
  450.     LD    (DKDMA),HL    ;STORE DMA ADDRESS
  451.     INC    C        ;INCREMENT SECTOR NUMBER
  452.     CALL    SETSEC
  453.     CALL    READ        ;READ THE DATA
  454.     JR    NZ,WBOOT    ;ON READ FAILURE TRY AGAIN
  455.     DJNZ    RDSEC
  456.     JR    BOOT        ;READ CCP AND BDOS;
  457. NXTTRK:
  458.     LD    A,(DKTRACK)
  459.     CP    2-LARGESW
  460.     JR    Z,BOOT        ;STOP AT TRACK 2
  461.     LD    C,A
  462.     INC    C        ;SEEK NEXT TRACK IF NOT
  463.     CALL    SETTRK
  464.     LD    C,0
  465.     JR    RDSEC
  466. ;
  467. ;
  468. CBOOT:    ;AFTER COLD BOOT
  469.     LD    SP,80H        ;INITIALIZE STACK FOR ROUTINE
  470.     LD    HL,SIGNON
  471.     CALL    PRMSG        ;PRINT MESSAGE
  472. BOOT:    ;GETS CONTROL AFTER COLD OR WARM BOOT
  473.     DI    
  474.     LD    A,0C3H        ;SET UP PARAMETERS ON PAGE 0
  475.     LD    (0),A
  476.     LD    HL,EBOOT
  477.     LD    (1),HL
  478.     LD    (7*8),A        ;PRINT ERROR AND BACK TO BOOT
  479.     LD    HL,MERROR      ; (MAY BE DESTROYED BY DDT
  480.     LD    (7*8+1),HL
  481.     LD    (5),A
  482.     LD    HL,BDOS
  483.     LD    (6),HL
  484. ;
  485. ;        CROMEMCO INITIALIZATION HERE (READER, LIST NOT NEEDED)
  486. ;        NOTE .. THE CONSOLE TUART IS INITIALIZED BY RDOS
  487. ;
  488.     IF    BIGIOSW = 1
  489.     LD    A,BAUDRATE
  490.     OUT    PBAUDPORT,A
  491.     ENDIF
  492.     LD    A,80H        ;RST 7
  493.     OUT    IMASKPORT,A
  494.     LD    A,0CH        ;RST7 AND INTA
  495.     OUT    IMODEPORT,A
  496. ;
  497.     LD    BC,80H        ;SET DEFAULT DMA ADDR
  498.     CALL    SETDMA
  499. ;
  500.     LD    A,(CURRDRIVE)    ;RESELECT THE DRIVE THAT WAS ACTIVE
  501.     LD    C,A        ;  BEFORE THE WARM START
  502.     EI    
  503.     JP    CPMB
  504. ;
  505. ;
  506. ERRMSG:
  507.     DEFB    13,10,'?? ERROR ??',13,10,0
  508. ;
  509. PRMSG:    ;PRINT MESSAGE AT H,L UNTIL 0
  510.     LD    A,(HL)
  511.     OR    A        ;ZERO?
  512.     RET    Z
  513.     LD    C,A        ;GO PRINT CHAR
  514.     CALL    CONOUT
  515.     INC    HL        ;GET NEXT CHAR
  516.     JR    PRMSG
  517. ;
  518. ;
  519. ;HARDWARE UART CONSOLE ROUTINES
  520. ;
  521. CONSTAT:
  522.     IN    A,CSTATPORT    ;CHECK CONSOLE STATUS
  523.     AND    40H
  524.     RET    Z        ;ZERO MEANS NO INPUT BYTE READY
  525.     LD    A,0FFH
  526.     RET            ;FF MEANS INPUT
  527. ;
  528. CONIN:
  529.     CALL    CONSTAT        ;CHECK STATUS TIL GOT A BYTE
  530.     JR    Z,CONIN
  531.     IN    A,CDATAPORT    ;READ THE BYTE AND KILL OFF 80H
  532.     AND    7FH
  533. ;
  534. ;    THE FOLLOWING CODE REPLACES THE DEL KEY WITH A CTRL-U,
  535. ;    SO THAT DEL MEANS LINE DELETE. USE BACKSPACE TO DELETE
  536. ;    A SINGLE CHARACTER.
  537. ;
  538. ;    CP    127    ; DEL
  539. ;    RET    NZ
  540. ;    SUB    127-21    ; CTRL-U
  541.     RET    
  542. ;
  543. ;    CONSOLE OUTPUT ROUTINE
  544. ;
  545. CONOUT:
  546.     IN    A,CSTATPORT    ;FIRST, LOOP UNITL TRANSMITTER BUFFER
  547.     AND    80H        ;IS EMPTY
  548.     JR    Z,CONOUT
  549.     LD    A,C        ;NOW, OUTPUT CHARACTER TO CONSOLE
  550.     OUT    CDATAPORT,A
  551.     RET    
  552. ;
  553. ;    LIST STATUS CHECK FOR CP/M 2.2
  554. ;
  555. LISTAT:
  556.     IF    BIGIOSW = 1
  557.     IN    A,LSTATPORT    ;IF LIST TRANSMITTER IS BUSY,
  558.     CPL            ;THEN RETURN WITH ZERO
  559.     AND    20H
  560.     RET    Z
  561.     OR    A,0FFH        ;LIST TRANSMITTER BUFFER IS EMPTY
  562.     RET
  563.     ENDIF
  564. ;
  565. LIST:
  566.     IF BIGIOSW = 1
  567.     CALL    LISTAT        ;CHECK IF PRINTER BUSY
  568.     JR    Z,LIST
  569.     LD    A,C        ;NOW OUTPUT CHARACTER
  570.     SET    7,A
  571.     OUT    LDATAPORT,A    ;WITH HIGH STROBE
  572.     RES    7,A
  573.     OUT    LDATAPORT,A    ;NOW LOW STROBE
  574.     SET    7,A
  575.     OUT    LDATAPORT,A    ;NOW HIGH STROBE AGAIN
  576.     RET
  577.     ENDIF
  578. ;
  579. PUNCH:
  580.     IF    BIGIOSW = 1
  581.     IN    A,PSTATPORT    ;CHECK IF PUNCH BUFFER EMPTY
  582.     AND    80H
  583.     JR    Z,PUNCH        ;LOOP UNTIL READY
  584.     LD    A,C
  585.     OUT    PDATAPORT,A    ;OUTPUT CHARACTER
  586.     RET
  587.     ENDIF
  588. ;
  589. READER:
  590.     IF    BIGIOSW = 1
  591.     IN    A,RSTATPORT    ;SEE IF READER BUFFER FULL
  592.     AND    40H
  593.     JR    Z,READER    ;LOOP UNTIL FULL
  594.     IN    A,RDATAPORT    ;AND READ IT
  595.     RET    
  596.     ENDIF
  597. ;
  598.     IF    BIGIOSW NE 1
  599.     XOR    A,A        ;DUMMY ROUTINE FOR LIST,PUNCH,READER
  600.     RET
  601.     ENDIF
  602. ;
  603. DKNUMB:    EQU    4        ;THIS IS WHERE THE DISK NUMBER IS
  604. ;                ;KEPT IN NORMAL CP/M
  605. CURRDRIVE:
  606.     DB    0        ;THE SAVE AREA FOR THE DEFAULT DRIVE
  607. LOGINTAB:
  608.     DB    2-LARGESW,0,0,0        ;FOUR DRIVES MAX
  609. DKSECT:
  610.     DB    0        ;SECTOR NUMBER
  611. DKTRACK:
  612.     DB    0        ;TRACK NUMBER
  613. DKDMA:
  614.     DW    0        ;DMA ADDRESS
  615. TRKERCNT:
  616.     DB    0        ;NUMBER OF TRACK ERRORS
  617. RETRYCOUNT:
  618.     DB    0        ;NUMBER OF READ ERRORS
  619. ;
  620. ;    FROM HERE ON, THE AREAS ARE INITIALIZED BY CP/M AS NEEDED
  621. ;
  622. DIRBUF:
  623.     DS    128        ;SAVE AREA FOR DISK DIRECTORY OPERATIONS
  624. ;
  625. ;
  626. ALV0:
  627.     DS    32
  628. ;
  629.     IF    NUMDRIVES > 1
  630. ALV1:
  631.     DS    32
  632.     ENDIF
  633. ;
  634.     IF    NUMDRIVES > 2
  635. ALV2:
  636.     DS    32
  637.     ENDIF
  638. ;
  639.     IF    NUMDRIVES > 3
  640. ALV3:
  641.     DS    32
  642.     ENDIF
  643. ;
  644. CSV0:
  645.     DS    16
  646. ;
  647.     IF    NUMDRIVES > 1
  648. CSV1:
  649.     DS    16
  650.     ENDIF
  651. ;
  652.     IF    NUMDRIVES > 2
  653. CSV2:
  654.     DS    16
  655.     ENDIF
  656. ;
  657.     IF    NUMDRIVES > 3
  658. CSV3:
  659.     DS    16
  660.     ENDIF
  661. ;
  662. ;    THIS HAD BETTER BE WITHIN YOUR CORE SIZE
  663. ;
  664.     END
  665.