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 / ENTERPRS / CPM / UTILS / S / ZEN2.LBR / BIOS88.A86 < prev    next >
Text File  |  2000-06-30  |  67KB  |  3,558 lines

  1.     TITLE    'CP/M-85 BIOS (8088 CODE PORTION)     10 MAR 83'
  2. ;***
  3. ;
  4. ;    THIS IS THE 8088 CODED PORTION OF THE BIOS FOR CP/M-85.
  5. ;    IT RESIDES IN THE FILE 'BIOS88.SYS'.
  6. ;
  7.  
  8. FALSE    EQU    0
  9. TRUE    EQU    NOT FALSE
  10.  
  11. ASM86    EQU    TRUE
  12. EXPER    EQU    FALSE
  13. REL0    EQU    0
  14. WAIT    EQU    TRUE
  15.  
  16.  
  17.  
  18.  
  19.  
  20. ;***    EQUATES
  21. ;
  22.  
  23.     INCLUDE    ZMEMMAP.LIB
  24.  
  25.     INCLUDE ASCII.LIB
  26.  
  27.     INCLUDE    DEF6821.LIB
  28.  
  29.     INCLUDE    DEF8253.LIB
  30.  
  31.     INCLUDE DEF8259A.LIB
  32.  
  33.     INCLUDE EP2DEF.LIB
  34.  
  35.     INCLUDE    SBCDEF.LIB
  36.  
  37.     INCLUDE TIMERDEF.LIB
  38.  
  39.     INCLUDE    Z207DEF.LIB
  40.  
  41.     INCLUDE    Z217DEF.LIB
  42.  
  43.     INCLUDE ZINT.LIB
  44.  
  45.     INCLUDE    ZMTR100.LIB
  46.  
  47.     INCLUDE    ZPORTS.LIB
  48.  
  49.     INCLUDE    ZGDPDEF.LIB
  50.  
  51.     INCLUDE    ZKEYBD.LIB
  52.  
  53. ;**    MISCELLANEOUS EQUATES
  54. ;
  55.  
  56.     INCLUDE EXTRAOPS.LIB
  57.  
  58. ;*    DEVICE DRIVER ENTRY JUMP VECTOR OFFSETS
  59. ;
  60.  
  61. DDSEL    EQU    0            ;SELECT
  62. DDRDT    EQU    3            ;READ TRACK
  63. DDWRT    EQU    6            ;WRITE TRACK
  64. DDMNT    EQU    9            ;MOUNT
  65. DDFMT    EQU    12            ;FORMAT
  66. DDWPC    EQU    15            ;WRITE PROTECT CHECK
  67.  
  68. ;*    DISK OPERATIONS IN PROGRESS FLAGS
  69. ;
  70.  
  71. DSKOPS    EQU    00000001B        ;1ST TIME AFTER WARM BOOT SELECTION
  72. DSKOPR    EQU    00000010B        ;READ
  73. DSKOPW    EQU    00000100B        ;WRITE
  74. DSKOPRA    EQU    00001000B        ;READ ADDRESS HEADER
  75. DSKOPF    EQU    00010000B        ;FORMAT
  76. DSKOPWP    EQU    00100000B        ;WRITE PROTECT CHECK
  77. DSKOPI    EQU    01000000B        ;INIT
  78. DSKOPRD    EQU    10000000B        ;READY
  79.  
  80. ;*    DISK BUFFER HANDLING DEFINITIONS
  81. ;
  82.  
  83.     DSEG
  84.  
  85. BUFCNT    EQU    4            ;NUMBER OF BUFFERS
  86.  
  87. ;    BUFFER HEADER INFO
  88.  
  89.     ORG    0
  90. BUFHDR    RB    0
  91. BUFFWD    RW    1            ;FORWARD CHAIN POINTER
  92. BUFBAK    RW    1            ;BACKWARD CHAIN POINTER
  93. BUFDRV    RB    1            ;DRIVE #
  94. BUFPDRV    RB    1            ;MAPPED DRIVE # (PHYSICAL TABLE #)
  95. BUFDPE    RW    1            ;ADDRESS OF DPE
  96. BUFTRK    RW    1            ;TRACK #
  97. BUFWRF    RB    1            ;BUFFER DIRTY FLAG
  98. BUFSECF    RW    1            ;ADDRESS OF DIRTY SECTOR FLAGS
  99. BUFERR    RB    1            ;TRACK ERROR FLAG
  100. BUFERRF    RW    1            ;ADDRESS OF SECTOR ERROR FLAGS
  101. BUFBUF    RW    1            ;ADDRESS OF BUFFER AREA
  102.  
  103. BUFHDRL    EQU    OFFSET $ - OFFSET BUFHDR ;LENGTH OF BUFFER HEADER INFO
  104.  
  105.     EJECT
  106. ;***    EQUATES FOR INFO IN EXTRA SEGMENT
  107. ;
  108.  
  109.     ESEG
  110.  
  111. BIAS    EQU    0
  112.     INCLUDE    CPM85SYS.LIB
  113.  
  114.     INCLUDE CIOTABLE.LIB
  115.  
  116.     INCLUDE BIOSDEF.LIB
  117.  
  118.     INCLUDE    ZDPEDEF.LIB
  119.  
  120.     INCLUDE    LABDEF.LIB
  121.  
  122.     EJECT
  123. ;***    COLD BOOT ENTRY
  124. ;
  125.  
  126.     CSEG
  127.     ORG    BIOS88
  128.  
  129. CBOOTE:
  130.     CLI                ;INSURE I'M NOT DISTURBED
  131.  
  132. ;    INITIALIZE PARITY GENERATION
  133.  
  134.     PUSH    DS
  135.     PUSH    ES
  136.  
  137.     MOV    AL,ZMCLPZ+ZRM2        ;TURN OFF PARITY CHECKING
  138.     OUT    ZMCL,AL
  139.     OUT    098H,AL
  140.     OUT    099H,AL
  141.     OUT    09AH,AL
  142.     OUT    09BH,AL
  143.     OUT    09CH,AL
  144.     OUT    09DH,AL
  145.     OUT    09EH,AL
  146.     OUT    09FH,AL
  147.  
  148.     XOR    AX,AX            ;START AT SEGMENT 0
  149. MEMIL:
  150.     MOV    DS,AX            ;SET UP SEGMENT REGISTERS
  151.     MOV    ES,AX
  152.     MOV    AX,.0            ;GET FIRST WORD
  153.     MOV    BX,AX            ;SAVE A COPY
  154.     INC    AX            ;BUMP VALUE
  155.     INC    WORD PTR .0        ;BUMP MEMORY
  156.     CMP    AX,.0            ;Q. ARE THEY THE SAME
  157.     JNE    MEMIC            ; BR IF NOT
  158.     MOV    .0,BX            ;RESTORE VALUE
  159.     XOR    SI,SI            ;SET UP REGS FOR MOVE
  160.     XOR    DI,DI
  161.     MOV    CX,08000H        ;GET NUMBER OF WORDS TO MOVE
  162.     REP    MOVSW            ;MOVE WORDS ONTO THEMSELVES
  163. MEMIC:
  164.     MOV    AX,DS            ;POINT TO NEXT SEGMENT
  165.     ADD    AX,01000H
  166.     JNZ    MEMIL            ; LOOP IF NO WRAP AROUND
  167.  
  168.     POP    ES
  169.     POP    DS
  170.  
  171.     MOV    AL,ZMCLPK+ZMCLPZ+ZRM2    ;TURN ON PARITY CHECKING
  172.     OUT    ZMCL,AL
  173.     OUT    098H,AL
  174.     OUT    099H,AL
  175.     OUT    09AH,AL
  176.     OUT    09BH,AL
  177.     OUT    09CH,AL
  178.     OUT    09DH,AL
  179.     OUT    09EH,AL
  180.     OUT    09FH,AL
  181.  
  182. ;    INITIALIZE ALL VECTORS (EXCEPT WHERE MONITOR DATA SEGMENT INFO
  183. ;    IS) TO POINT TO WILD INTERRUPT HANDLER
  184.  
  185.     MOV    BX,OFFSET INTWILD    ;INITIALIZE VECTORS FOR WILD INTERRUPT
  186.     MOV    .0,BX
  187.     MOV    .2,CS
  188.     MOV    SI,0
  189.     MOV    DI,4
  190.     MOV    CX,(256-2)*4/2
  191.     CLD
  192.     REP    MOVSW
  193.  
  194. ;    INITIALIZE SOFTWARE INTERRUPT VECTORS
  195.  
  196.     MOV    BX,OFFSET INTDIV0    ;DIVIDE BY ZERO
  197.     MOV    .0,BX
  198.     MOV    .2,CS
  199.  
  200.     MOV    BX,OFFSET INTSWAP    ;SWAP PROCESSORS
  201.     MOV    .SWAPVEC,BX
  202.     MOV    .SWAPVEC+2,CS
  203.  
  204. ;    INITIALIZE HARDWARE INTERRUPT VECTORS
  205.  
  206.     LEA    SI,HINTVO
  207.     MOV    DI,ZINTMT*4
  208.     MOV    CX,18
  209.     CLD
  210. INHV:
  211.     MOVSW
  212.     ADD    DI,2
  213.     LOOP    INHV
  214.  
  215. ;    INITIALIZE MASTER 8259A
  216.  
  217.     MOV    AL,ICW1OP+ICW1LT+ICW1ADI+ICW1I4
  218.     OUT    Z8259AM+ICW1,AL        ;LEVEL TRIGGERED, ADI OF 4
  219.     MOV    AL,ZINTMT
  220.     OUT    Z8259AM+ICW2,AL        ;BASE TRAP VECTOR
  221.     MOV    AL,1 SHL ZINTSLV
  222.     OUT    Z8259AM+ICW3,AL        ;INDICATE SLAVE IR LINE
  223.     MOV    AL,ICW4SFN+ICW4UPM
  224.     OUT    Z8259AM+ICW4,AL        ;SPECIAL FULLY NESTED, 8086 PROCESSOR
  225.     MOV    AL,0FFH-(1 SHL ZINTKD)-(1 SHL ZINTTIM)-(1 SHL ZINTEI)
  226.     OUT    Z8259AM+OCW1,AL        ;ENABLE ONLY DESIRED IR LINES
  227.  
  228. ;    INITIALIZE SLAVE 8259A
  229.  
  230.     MOV    AL,ICW1OP+ICW1LT+ICW1ADI+ICW1I4
  231.     OUT    Z8259AS+ICW1,AL        ;LEVEL TRIGGERED, ADI OF 4
  232.     MOV    AL,ZINTST
  233.     OUT    Z8259AS+ICW2,AL        ;BASE TRAP VECTOR
  234.     MOV    AL,ZINTSLV
  235.     OUT    Z8259AS+ICW3,AL        ;SLAVE ID
  236.     MOV    AL,ICW4UPM
  237.     OUT    Z8259AS+ICW4,AL        ;8086 PROCESSOR
  238.     MOV    AL,0FFH
  239.     OUT    Z8259AS+OCW1,AL        ;DISABLE ALL IR LINES
  240.  
  241. ;    MOVE ROM MONITOR DATA AREA TO BANK 0
  242.  
  243.     PUSH    DS
  244.     MOV    SI,0            ;GET SOURCE ADDRESS FOR MOVE
  245.     MOV    AX,.MTRDSEG
  246.     MOV    OMDSEG,AX
  247.     MOV    DS,AX
  248.     MOV    DI,B88DAT        ;GET DESTINATION ADDRESS FOR MOVE
  249.     MOV    CX,MTRDSZ        ;GET BYTE COUNT
  250.     CMP    CX,BIOS88-B88DAT    ;Q. LARGER THAN ALLOCATED SPACE
  251.     JBE    MVMTRDA            ; BR IF NOT
  252.  
  253.     POP    DS            ;MEMORY MAP LAYOUT ONLY ALLOWS
  254.     LEA    SI,MTRMSG        ; A MAXIMUM MONITOR DATA AREA
  255.     CALL    PMSG            ;  SIZE
  256.     JMP    SYSHLT
  257.  
  258. MVMTRDA:
  259.     CLD                ;SET FORWARD DIRECTION
  260.     REP    MOVSB            ;DO MOVE
  261.  
  262.     MOV    AX,B88DAT/16        ;POINT TO NEW LOCATION OF DATA AREA
  263.     MOV    DS,AX
  264.     MOV    MTRDXMTC,MTRSKBD    ;INITIALIZE KEYBOARD HANDLER
  265.     MOV    MTRDXMTC+2,MTRSEG    ; TO USE MY QUEUE
  266.     MOV    MTRSXMTC,OFFSET PUTKEY
  267.     MOV    MTRSXMTC+2,CS
  268.  
  269.     POP    DS
  270.  
  271.     MOV    WORD PTR .MTRDSEG,B88DAT/16    ;UPDATE MONITOR DSEG SLOT
  272.  
  273. ;    NOW SETUP CP/M-85 SYSTEM IN BANK 1
  274.  
  275.     MOV    AX,64/16*1024        ;FROM NOW ON EXTRA SEGMENT
  276.     MOV    ES,AX            ; WILL POINT TO BANK 1
  277.     MOV    BANK1,AX        ;SAVE VALUE
  278.  
  279.     MOV    AL,1            ;SET HIGH ADDR LATCH TO BANK 1 FOR 8085
  280.     OUT    ZHAL,AL
  281.  
  282.     MOV    SI,BLDRP0        ;MOVE PAGE ZERO
  283.     MOV    DI,0
  284.     MOV    CX,256/2
  285.     CLD
  286.     REP    MOVSW
  287.  
  288.     MOV    SI,BBIOS        ;MOVE CCP, BDOS, & BIOS
  289.     SUB    SI,CCPL+BDOSL
  290.     MOV    CCPORG1,SI
  291.     MOV    DI,SI
  292.     MOV    CX,SI
  293.     NEG    CX
  294.     INC    CX
  295.     SHR    CX,1
  296.     CLD
  297.     REP    MOVSW
  298.  
  299.     MOV    BX,BBIOS        ;SET DEFAULT I/O BYTE
  300.     MOV    AL,DEFIOB[BX]
  301.     MOV    IOBYTE,AL
  302.  
  303. ;    MOVE CP/M CCP & BDOS AGAINST TOP OF BANK 0
  304. ;    TO PROVIDE MORE ROOM FOR DISK BUFFERS
  305.  
  306.     MOV    SI,CCPORG1
  307.     ADD    SI,CCPL+BDOSL-1
  308.     MOV    DI,0FFFFH
  309.     MOV    CX,CCPL+BDOSL
  310.     PUSH    ES
  311.     MOV    AX,DS
  312.     MOV    ES,AX
  313.     STD
  314.     REP    MOVSB
  315.     POP    ES
  316.     INC    DI
  317.     MOV    CCPORG0,DI
  318.  
  319. ;
  320.  
  321.     CALL    ALTCHR            ;HANDLE ALTERNATE CHARACTER FONTS
  322.  
  323. ;    INITIALIZE CHARACTER I/O PORTS
  324.  
  325.     CALL    INCRT            ;CRT:
  326.     CALL    INSERA            ;SERIAL PORT A
  327.     CALL    INSERB            ;SERIAL PORT B
  328.     CALL    INPPRT            ;LIGHTPEN, VSYNC , & PARALLEL PRINTER
  329.     CALL    INDUMMY            ;DUMMY I/O
  330.  
  331. ;    
  332.  
  333.     CALL    INTIM            ;INITIALIZE TIMER
  334.  
  335.     MOV    COMWHO,ZPSPPS8        ;INDICATE WHICH PROCESSOR HAS CONTROL
  336.     STI                ;ALLOW INTERRUPTS NOW
  337.  
  338. ;    INITIALIZE HOST BUFFERING SCHEME
  339.  
  340.     CMP    CCPORG0,B88END        ;Q. ENOUGH MEMORY
  341.     JNB    CBINBUF            ; BR IF YES
  342.  
  343.     LEA    SI,BUFMSG        ;  OTHERWISE PRINT ERROR MESSAGE
  344.     CALL    PMSG
  345.     JMP    SYSHLT
  346.  
  347. CBINBUF:
  348.     CALL    INBUF            ;INIT BUFFERING
  349.  
  350. ;    INITIALIZE LOGICAL DRIVE TO PHYSICAL DRIVE MAP
  351.  
  352.     PUSH    ES
  353.     MOV    ES,.MTRDSEG        ;GET ADDRESS OF MONITOR DATA AREA
  354.     MOV    AL,ES: MTRBI        ;GET BOOT DEVICE INDEX #
  355.     CMP    ES: MTRBI,2        ;Q. Z217 BOOTED
  356.     POP    ES
  357.     JNE    CBINDRV1        ; BR IF NOT
  358.  
  359.     CALL    IN217
  360.     CALL    IN207
  361.     JMPS    PSIGNON
  362.  
  363. CBINDRV1:
  364.     CALL    IN207
  365.     CALL    IN217
  366.  
  367. ;    PRINT SIGNON MESSAGE
  368.  
  369. PSIGNON:
  370.     LEA    SI,SIGNON
  371.     CALL    PMSG
  372.  
  373. ;
  374.  
  375.     INT    SWISWAP            ;SWAP TO 8085 PROCESSOR
  376.  
  377.     EJECT
  378. ;**    WARM BOOT ENTRY
  379. ;
  380. ;    MOVE 'CCP' AND 'BDOS' FROM BANK 0 TO BANK 1.
  381. ;    THIS REPLACES THE NEED TO READ THE DISK ON WARM BOOT.
  382. ;
  383.  
  384. WBOOTE:
  385.     CALL    CLRBUFA            ;CLEAR ALL HOST BUFFERS
  386.  
  387.     MOV    SI,CCPORG0        ;SOURCE ADDR OF CCP & BDOS IN BANK 0
  388.     MOV    DI,CCPORG1        ;DESTINATION ADDR IN BANK 1
  389.     MOV    CX,(CCPL+BDOSL)/2    ;WORD COUNT
  390.     CLD                ;SET DIRECTION FORWARD
  391.     REP    MOVSW
  392.     RET
  393.  
  394.  
  395.  
  396.  
  397. ;**    CONSOLE STATUS ENTRY
  398. ;
  399. ;    ENTRY:    NONE
  400. ;    EXIT:    (AL),'COMRA'=STATUS
  401. ;             0=NO CHARACTER AVAILABLE , 0FFH=CHARACTER AVAILABLE
  402. ;    USES:    ALL
  403. ;
  404.  
  405. CONSTE:
  406.     MOV    AL,IOBYTE        ;GET IOBYTE VALUE
  407.     SHL    AL,1            ;ADJUST VALUE
  408.  
  409.     CALL    GETCIO            ;GET APPROPRIATE CIO TABLE ENTRY
  410.     DW    SERATBL
  411.     DW    CRTTBL
  412.     DW    0
  413.     DW    SERBTBL
  414.  
  415.     TEST    BX,BX            ;Q. SPECIAL CASE BAT:
  416.     JNZ    CONSTE1            ; BR IF NOT
  417.  
  418.     MOV    AL,IOBYTE        ;GET IOBYTE VALUE
  419.     SHR    AL,1            ;ADJUST VALUE
  420.     CALL    GETCIO            ;GET APPROPRIATE CIO TABLE ENTRY
  421.     DW    SERATBL
  422.     DW    DUMMYTBL
  423.     DW    SERBTBL
  424.     DW    CRTTBL
  425.  
  426. CONSTE1:
  427.     CALL    ISCIO            ;CALL CIO HANDLER
  428.  
  429.     MOV    COMRA,AL        ;PUT STATUS IN COM REGION
  430.     RET
  431.  
  432.  
  433.  
  434.  
  435. ;**    CONSOLE INPUT ENTRY
  436. ;
  437. ;    ENTRY:    NONE
  438. ;    EXIT:    (AL),'COMRA'=CHARACTER READ FROM CONSOLE
  439. ;    USES:    ALL
  440. ;
  441.  
  442. CONINE:
  443.     MOV    AL,IOBYTE        ;GET IOBYTE VALUE
  444.     SHL    AL,1            ;ADJUST VALUE
  445.  
  446.     CALL    GETCIO            ;GET APPROPRIATE CIO TABLE ENTRY
  447.     DW    SERATBL
  448.     DW    CRTTBL
  449.     DW    0
  450.     DW    SERBTBL
  451.  
  452.     TEST    BX,BX            ;Q. SPECIAL CASE BAT:
  453.     JZ    RDRINE            ; BR IF YES
  454.  
  455.     CALL    IDCIO            ;CALL CIO HANDLER
  456.  
  457.     MOV    COMRA,AL        ;PUT CHARACTER IN COM REGION
  458.     RET
  459.  
  460.  
  461.  
  462.  
  463. ;**    CONSOLE OUTPUT ENTRY
  464. ;
  465. ;    ENTRY:    'COMRC'=CHARACTER TO BE OUTPUT
  466. ;    EXIT:    NONE
  467. ;    USES:    ALL
  468. ;
  469.  
  470. CONOUTE:
  471.     MOV    AL,IOBYTE        ;GET IOBYTE VALUE
  472.     SHL    AL,1            ;ADJUST VALUE
  473.     MOV    CL,COMRC        ;GET CHARACTER
  474.  
  475.     CALL    GETCIO            ;GET APPROPRIATE CIO TABLE ENTRY
  476.     DW    SERATBL
  477.     DW    CRTTBL
  478.     DW    0
  479.     DW    SERBTBL
  480.  
  481.     TEST    BX,BX            ;Q. SPECIAL CASE BAT:
  482.     JZ    LSTOUTE            ; BR IF YES
  483.  
  484.     JMP    ODCIO            ;RETURN VIA CIO HANDLER
  485.  
  486.  
  487.  
  488.  
  489. ;**    LIST OUTPUT ENTRY
  490. ;
  491. ;    ENTRY:    'COMRC'=CHARACTER TO BE OUTPUT
  492. ;    EXIT:    NONE
  493. ;    USES:    ALL
  494. ;
  495.  
  496. LSTOUTE:
  497.     MOV    AL,IOBYTE        ;GET IOBYTE VALUE
  498.     MOV    CL,5            ;ADJUST VALUE
  499.     SHR    AL,CL
  500.     MOV    CL,COMRC        ;GET CHARACTER
  501.  
  502.     CALL    GETCIO            ;GET APPROPRIATE CIO TABLE ENTRY
  503.     DW    SERATBL
  504.     DW    CRTTBL
  505.     DW    PPRTTBL
  506.     DW    SERBTBL
  507.  
  508.     JMP    ODCIO            ;RETURN VIA CIO HANDLER
  509.  
  510.  
  511.  
  512. ;**    PUNCH OUTPUT ENTRY
  513. ;
  514. ;    ENTRY:    'COMRC'=CHARACTER TO BE OUTPUT
  515. ;    EXIT:    NONE
  516. ;    USES:    ALL
  517. ;
  518.  
  519. PUNOUTE:
  520.     MOV    AL,IOBYTE        ;GET IOBYTE VALUE
  521.     MOV    CL,3            ;ADJUST VALUE
  522.     SHR    AL,CL
  523.     MOV    CL,COMRC        ;GET CHARACTER
  524.  
  525.     CALL    GETCIO            ;GET APPROPRIATE CIO TABLE ENTRY
  526.     DW    SERATBL
  527.     DW    DUMMYTBL
  528.     DW    SERBTBL
  529.     DW    CRTTBL
  530.  
  531.     JMP    ODCIO            ;RETURN VIA CIO HANDLER
  532.  
  533.  
  534.  
  535.  
  536. ;**    READER INPUT ENTRY
  537. ;
  538. ;    ENTRY:    NONE
  539. ;    EXIT:    (AL),'COMRA'=CHARACTER READ
  540. ;    USES:    ALL
  541. ;
  542.  
  543. RDRINE:
  544.     MOV    AL,IOBYTE        ;GET IOBYTE VALUE
  545.     SHR    AL,1            ;ADJUST VALUE
  546.  
  547.     CALL    GETCIO            ;GET APPROPRIATE CIO TABLE ENTRY
  548.     DW    SERATBL
  549.     DW    DUMMYTBL
  550.     DW    SERBTBL
  551.     DW    CRTTBL
  552.  
  553.     CALL    IDCIO            ;CALL CIO HANDLER
  554.  
  555.     MOV    COMRA,AL        ;PUT CHARACTER IN COM REGION
  556.     RET
  557.  
  558.  
  559.  
  560.  
  561. ;**    HOME HEAD ENTRY
  562. ;
  563. ;    ENTRY:    NONE
  564. ;    EXIT:    NONE
  565. ;    USES:    ALL
  566. ;
  567.  
  568. HOMEE:
  569.     CALL    CHKDBD            ;Q. ANY DIRTY BUFFERS FOR REQ DRIVE
  570.     TEST    AL,AL
  571.     JNZ    HOMEE1            ; BR IF YES
  572.  
  573.     CALL    CLRBUFD            ;FORCE PHYSICAL I/O
  574.  
  575. HOMEE1:
  576.     MOV    AX,0            ;SET REQUESTED TRACK # = 0
  577.     JMP    SETTRKE1        ;JOIN SET TRACK CODE
  578.  
  579.  
  580.  
  581.  
  582. ;**    SET DISK DRIVE ENTRY
  583. ;
  584. ;    ENTRY:    'COMRC'=REQUESTED DRIVE
  585. ;        'COMRE'=LSB INDICATES 1ST TIME SINCE WARM BOOT SELECT
  586. ;            0=1ST TIME , 1=SUBSEQUENT TIMES
  587. ;        'COMRHL'=ADDRESS OF XLATE TABLE ADDRESSES
  588. ;    EXIT:    'COMRHL'=RESULTS
  589. ;                 0=ERROR , NOT 0=NO ERROR
  590. ;    USES:    ALL
  591. ;
  592.  
  593. SETDSKE:
  594.     MOV    AL,COMRC        ;GET REQUESTED DRIVE #
  595.     MOV    REQDRV,AL        ;SAVE IT
  596.     MOV    BX,BBIOS        ;CHECK IF IN RANGE
  597.     CMP    AL,NDISKS[BX]
  598.     JAE    SETDSKE5        ; BR IF NOT
  599.  
  600.     CBW                ;CONVERT LOGICAL DRIVE # TO
  601.     MOV    BX,AX            ; PHYSICAL DRIVE #
  602.     MOV    AL,BDMAP[BX]
  603.     MOV    PHYDRV,AL
  604.  
  605.     MOV    BL,DPEL            ;COMPUTE ADDRESS OF DPE
  606.     MUL    BL
  607.     ADD    AX,OFFSET DPEBASE
  608.     ADD    AX,BBIOS
  609.     MOV    PHYDPE,AX        ;SAVE IT
  610.  
  611.     TEST    COMRE,1            ;CHECK IF 1ST LOGIN
  612.     JNZ    SETDSKE9        ; BR IF NOT
  613.  
  614.     CALL    CLRBUFD            ;CLEAR HOST BUFFERS FOR THIS DRIVE
  615.  
  616.     MOV    PREREAD,0        ;INDICATE DON'T DO PREREAD
  617.     CALL    SETUP            ;GET A BUFFER TO USE
  618.     CMP    BUFERR[BX],0        ;Q. ABORT
  619.     JNE    SETDSKEA        ; BR IF YES
  620.     MOV    AX,COMRHL        ;GET ADDRESS OF XLATE TABLE ADDRESSES
  621.     MOV    XLATES,AX
  622.     MOV    AL,DDSEL        ;CALL DEVICE DRIVER TO DO SELECT
  623.     CALL    DRVR
  624.     CALL    CLRBUFD            ;GIVE BACK BUFFER
  625.     CMP    PHYDPE,0        ;Q. ERROR
  626.     JNE    SETDSKE9        ; BR IF NO ERROR RETURN BY DRIVER
  627.  
  628. ;    ERROR DURING SETDSK
  629.  
  630. SETDSKE5:
  631.     MOV    AL,REQDRV        ;CHECK IF REQUESTED DRIVE
  632.     CMP    AL,DFTDRV        ; WAS TO BE DEFAULT DRIVE
  633.     JNE    SETDSKE6        ;  BR IF NOT
  634.  
  635.     MOV    DFTDRV,0        ;FORCE DEFAULT DRIVE TO 'A:'
  636.  
  637. SETDSKE6:
  638.     MOV    PHYDPE,0        ;INDICATE ERROR (ADDR OF DPE = 0)
  639.  
  640. ;    RETURN ADDRESS OF DPE TO CALLER
  641.  
  642. SETDSKE9:
  643.     MOV    AX,PHYDPE
  644.     MOV    COMRHL,AX
  645.  
  646.     RET
  647.  
  648. ;    ERROR DURING SETUP
  649.  
  650. SETDSKEA:
  651.     CALL    CLRBUFD            ;GIVE BACK BUFFER
  652.     JMPS    SETDSKE5
  653.  
  654.  
  655.  
  656.  
  657. ;**    SET TRACK ENTRY
  658. ;
  659. ;    ENTRY:    'COMRBC'=TRACK #
  660. ;    EXIT:    NONE
  661. ;    USES:    ALL
  662. ;
  663.  
  664. SETTRKE:
  665.     MOV    AX,COMRBC        ;GET TRACK #
  666.  
  667. SETTRKE1:
  668.     MOV    REQTRK,AX        ;SAVE AS REQUESTED CP/M TRACK #
  669.     RET
  670.  
  671.  
  672.  
  673.  
  674.  
  675. ;**    SET SECTOR ENTRY
  676. ;
  677. ;    ENTRY:    'COMRBC'=SECTOR # (IN RANGE 1 TO SPT)
  678. ;    EXIT:    NONE
  679. ;    USES:    ALL
  680. ;
  681. ;    *** NOTE ***
  682. ;    IT IS ASSUMED ON ENTRY THAT THE SECTOR NUMBER IS IN THE RANGE 1 TO
  683. ;    'CP/M SECTORS PER TRACK'.  THEREFORE, ONLY THE VALUE PASSED
  684. ;    IN REGISTER C IS USED.
  685. ;    INTERNALLY THE BIOS WANTS SECTOR NUMBERS IN THE RANGE
  686. ;    0 TO SPT-1.  THEREFORE, BEFORE SAVING THE SECTOR NUMBER,
  687. ;    IT IS DECREMENTED.
  688. ;
  689.  
  690. SETSECE:
  691.     MOV    AL,COMRC        ;GET SECTOR #
  692.     DEC    AL            ;PUT INTO RANGE 0 TO SPT-1
  693.     XOR    AH,AH            ;ZERO HIGH ORDER BYTE
  694.     MOV    REQSEC,AX        ;SAVE AS REQUESTED CP/M SECTOR #
  695.     RET
  696.  
  697.  
  698.  
  699.  
  700. ;**    SET DMA ENTRY
  701. ;
  702. ;    ENTRY:    'COMRBC'=DMA POINTER
  703. ;    EXIT:    NONE
  704. ;    USES:    ALL
  705. ;
  706.  
  707. SETDMAE:
  708.     MOV    AX,COMRBC        ;GET DMA POINTER
  709.     MOV    DMAPTR,AX        ;SAVE AS DMA POINTER
  710.     RET
  711.  
  712.  
  713.  
  714. ;**    READ CP/M SECTOR ENTRY
  715. ;
  716. ;    ENTRY:    NONE
  717. ;    EXIT:    'COMRA'=ERROR STATUS
  718. ;            0=NO ERROR , 1=ERROR
  719. ;    USES:    ALL
  720. ;
  721.  
  722. READE:
  723.     MOV    PREREAD,1        ;DO PREREAD
  724.     CALL    SETUP            ;CALL R/W COMMON SETUP ROUTINE
  725.     CMP    BUFERR[BX],0        ;Q. ERROR DURING SETUP
  726.     JNE    READE1            ; BR IF YES
  727.  
  728. ;    HOST BUFFER CONTAINS REQUESTED CP/M SECTOR.
  729. ;    COPY IT TO USER BUFFER.
  730.  
  731.     MOV    SI,BUFBUF[BX]        ;COMPUTE START OF REQ CP/M SECTOR
  732.     ADD    SI,AX            ; IN HOST BUFFER
  733.     MOV    DI,DMAPTR        ;GET DMA POINTER
  734.     REP    MOVSW            ;MOVE DATA FROM HOST TO USER BUFFER
  735.  
  736. ;
  737.  
  738.     CALL    CPSEC            ;INDICATE ERROR STATUS
  739.     OR    DSKOP,DSKOPR
  740.     CALL    ABTIGN
  741.     AND    DSKOP,NOT DSKOPR
  742.  
  743. READE1:
  744.     MOV    AL,BUFERR[BX]
  745.     MOV    COMRA,AL
  746.     RET
  747.  
  748.  
  749.  
  750.  
  751. ;**    WRITE CP/M SECTOR ENTRY
  752. ;
  753. ;    ENTRY:    'COMRC'=TYPE OF WRITE
  754. ;            0=NORMAL WRITE
  755. ;            1=WRITE TO A DIRECTORY SECTOR
  756. ;            2=1ST WRITE TO A SECTOR IN AN UNALLOCATED BLOCK
  757. ;    EXIT:    'COMRA'=ERROR STATUS
  758. ;            0=NO ERROR , 1=ERROR
  759. ;    USES:    ALL
  760. ;
  761.  
  762. WRITEE:
  763.     MOV    PREREAD,1        ;DO PREREAD
  764.     CALL    SETUP            ;CALL R/W COMMON SETUP ROUTINE
  765.     CMP    BUFERR[BX],0        ;Q. ERROR DURING SETUP
  766.     JNE    WRITEE5            ; BR IF YES
  767.  
  768. ;    HOST BUFFER CONTAINS TRACK FOR REQUESTED CP/M SECTOR.
  769. ;    COPY THE SECTOR FROM USER BUFFER TO HOST BUFFER.
  770.  
  771.     MOV    SI,DMAPTR        ;GET DMA POINTER
  772.     MOV    DI,BUFBUF[BX]        ;COMPUTE START OF REQ CP/M SECTOR
  773.     ADD    DI,AX            ; IN HOST BUFFER
  774.     CALL    EXDSES            ;EXCHANGE DS AND ES
  775.     REP    MOVSW            ;MOVE DATA FROM USER TO HOST BUFFER
  776.     CALL    EXDSES            ;RESTORE DS AND ES
  777.  
  778. ;    MARK PHYSICAL SECTOR AND HOST WRITE BUFFER AS DIRTY
  779.  
  780.     CALL    CPSEC            ;MARK WHICH HOST WRITE BUFFER
  781.     MOV    DI,BUFSECF[BX]
  782.     ADD    DI,PHYSEC
  783.     MOV    BYTE PTR [DI],1        ; PHYSICAL SECTOR IS DIRTY
  784.  
  785.     MOV    BUFWRF[BX],1        ;INDICATE HOST BUFFER IS DIRTY
  786.  
  787. ;    CHECK FOR ABORT IF ERROR ON PREREAD
  788.  
  789.     CALL    CPSEC
  790.     OR    DSKOP,DSKOPR
  791.     CALL    ABTIGN
  792.     AND    DSKOP,NOT DSKOPR
  793.     CMP    BUFERR[BX],0
  794.     JNE    WRITEE5
  795.  
  796. ;    IF TYPE OF WRITE IS A DIRECTORY WRITE,
  797. ;    THEN FLUSH ALL HOST BUFFERS FOR REQUESTED DRIVE.
  798.  
  799.     MOV    AL,COMRC        ;CHECK TYPE OF WRITE
  800.     CMP    AL,BWRDIR
  801.     JNE    WRITEE5            ; BR IF NOT DIRECTORY WRITE
  802.     CALL    FLUSHD            ;FLUSH BUFFERS
  803.     JMPS    WRITEE6
  804. ;
  805.  
  806. WRITEE5:
  807.     MOV    AL,BUFERR[BX]        ;INDICATE ERROR STATUS
  808. WRITEE6:
  809.     MOV    COMRA,AL
  810.     RET
  811.  
  812.  
  813.  
  814.  
  815. ;**    CHECK LIST DEVICE STATUS ENTRY
  816. ;
  817. ;    ENTRY:    NONE
  818. ;    EXIT:    (AL),'COMRA'=STATUS
  819. ;                0=NOT READY , 0FFH=READY
  820. ;    USES:    ALL
  821. ;
  822.  
  823. LSTSTE:
  824.     MOV    AL,IOBYTE        ;GET IOBYTE VALUE
  825.     MOV    CL,5            ;ADJUST VALUE
  826.     SHR    AL,CL
  827.  
  828.     CALL    GETCIO            ;GET APPROPRIATE CIO TABLE ENTRY
  829.     DW    SERATBL
  830.     DW    CRTTBL
  831.     DW    PPRTTBL
  832.     DW    SERBTBL
  833.  
  834.     CALL    OSCIO            ;CALL CIO HANDLER
  835.  
  836.     MOV    COMRA,AL        ;PUT STATUS IN COM REGION
  837.     RET
  838.  
  839.  
  840.  
  841.  
  842. ;**    SECTOR TRANSLATE ENTRY
  843. ;
  844. ;    ENTRY:    'COMRBC'=LOGICAL SECTOR NUMBER (IN RANGE 0 TO SPT-1)
  845. ;        'COMRDE'=ADDRESS OF SECTOR TABLE
  846. ;    EXIT:    'COMRHL'=TRANSLATED CP/M SECTOR NUMBER (IN RANGE 1 TO SPT)
  847. ;    USES:    ALL
  848. ;
  849.  
  850. SECTRNE:
  851.     MOV    BX,COMRBC
  852.     MOV    SI,COMRDE
  853.     TEST    SI,SI
  854.     JZ    SECTRNE1
  855.     MOV    BL,ES:[BX+SI]
  856.     XOR    BH,BH
  857.     JMPS    SECTRNE2
  858. SECTRNE1:
  859.     INC    BX
  860. SECTRNE2:
  861.     MOV    COMRHL,BX
  862.     RET
  863.  
  864.  
  865.  
  866.  
  867. ;**    FORMAT - FORMAT ENTRY
  868. ;
  869. ;    ENTRY:    'COMRC'=VERIFY FLAG (0=NO , 1=YES)
  870. ;    EXIT:    'COMRA'=STATUS BYTE
  871. ;    USES:    ALL
  872. ;
  873.  
  874. FORMATE:
  875.     CALL    CLRBUFD            ;CLEAR HOST BUFFERS FOR THIS DRIVE
  876.  
  877.     MOV    PREREAD,0        ;DON'T PREREAD
  878.     CALL    SETUP            ;GET A BUFFER TO USE
  879.  
  880.     MOV    AL,0FFH
  881.     CMP    BUFERR[BX],0        ;Q. ERROR DURING SETUP
  882.     JNE    FORMATE1        ; BR IF YES
  883.  
  884.     MOV    AL,COMRC        ;GET VERIFY FLAG
  885.     MOV    FVFLG,AL
  886.     MOV    AL,DDFMT        ;CALL DEVICE DRIVER TO DO FORMAT
  887.     CALL    DRVR
  888.  
  889.     XOR    AL,AL            ;ASSUME NO ERROR STATUS
  890.     CMP    BUFERR[BX],0        ;Q. ERROR
  891.     JE    FORMATE1        ; BR IF NOT
  892.     MOV    AL,ERRTYP        ;GET ERROR STATUS BYTE
  893.  
  894. FORMATE1:
  895.     MOV    COMRA,AL        ;PLACE STATUS BYTE INTO COM REGION
  896.     CALL    CLRBUFD            ;GIVE BACK BUFFER
  897.     RET
  898.  
  899.  
  900.  
  901.  
  902. ;**    READ TRACK ENTRY
  903. ;
  904. ;    ENTRY:    NONE
  905. ;    EXIT:    'COMRA'=ERROR STATUS
  906. ;            0=NO ERROR , 1=ERROR
  907. ;    USES:    ALL
  908. ;
  909.  
  910. RDTRKE:
  911.     MOV    PREREAD,0        ;INDICATE NO PREREAD
  912.     CALL    SETUP            ;CALL R/W COMMON SETUP ROUTINE
  913.     CMP    BUFERR[BX],0        ;Q. ERROR DURING SETUP
  914.     JNE    RDTRKE1            ; BR IF YES
  915.  
  916.     MOV    AL,DDRDT        ;FORCE PHYSICAL READ OF TRACK
  917.     CALL    DRVR
  918.  
  919. ;    HOST BUFFER CONTAINS REQUESTED CP/M TRACK.
  920. ;    COPY IT TO USER BUFFER.
  921.  
  922.     MOV    SI,BUFDPE[BX]        ;COMPUTE # BYTES TO COPY
  923.     MOV    SI,DPEDPB[SI]
  924.     MOV    AX,DPBSPT[SI]
  925.     MOV    CL,7
  926.     SHL    AX,CL
  927.     MOV    CX,AX
  928.     MOV    SI,BUFBUF[BX]        ;GET START OF HOST BUFFER
  929.     MOV    DI,DMAPTR        ;GET DMA POINTER
  930.     REP    MOVSB            ;MOVE DATA FROM HOST TO USER BUFFER
  931.  
  932. ;
  933.  
  934. RDTRKE1:
  935.     MOV    AL,BUFERR[BX]        ;INDICATE ERROR STATUS
  936.     MOV    COMRA,AL
  937.     RET
  938.  
  939.  
  940.  
  941.  
  942. ;**    WRITE TRACK ENTRY
  943. ;
  944. ;    ENTRY:    NONE
  945. ;    EXIT:    'COMRA'=ERROR STATUS
  946. ;            0=NO ERROR , 1=ERROR
  947. ;    USES:    ALL
  948. ;
  949.  
  950. WRTRKE:
  951.     MOV    PREREAD,0        ;INDICATE NO PREREAD
  952.     CALL    SETUP            ;CALL R/W COMMON SETUP ROUTINE
  953.     CMP    BUFERR[BX],0        ;Q. ERROR DURING SETUP
  954.     JNE    WRTRKE3            ; BR IF YES
  955.  
  956. ;    COPY THE TRACK FROM USER BUFFER TO HOST BUFFER
  957.  
  958.     MOV    SI,BUFDPE[BX]        ;COMPUTE # BYTES
  959.     MOV    SI,DPEDPB[SI]
  960.     MOV    AX,DPBSPT[SI]
  961.     PUSH    AX
  962.     MOV    CL,7
  963.     SHL    AX,CL
  964.     MOV    CX,AX
  965.     MOV    SI,DMAPTR        ;GET DMA POINTER
  966.     MOV    DI,BUFBUF[BX]        ;GET START OF HOST BUFFER
  967.     CALL    EXDSES            ;EXCHANGE DS AND ES
  968.     REP    MOVSB            ;MOVE DATA FROM USER TO HOST BUFFER
  969.     CALL    EXDSES            ;RESTORE DS AND ES
  970.  
  971. ;    MARK PHYSICAL SECTORS AND HOST BUFFER AS DIRTY
  972.  
  973.     POP    AX            ;COMPUTE # PHYSICAL SECTORS PER TRACK
  974.     MOV    DI,BUFDPE[BX]
  975.     CMP    REQTRK,0
  976.     JNE    WRTRKE1
  977.     TEST    DPEFLAG[DI],DPET0SD
  978.     JZ    WRTRKE1
  979.     MOV    AL,26
  980.     JMPS    WRTRKE2
  981. WRTRKE1:
  982.     DIV    DPERPS[DI]
  983. WRTRKE2:
  984.     CBW
  985.     MOV    CX,AX
  986.  
  987.     MOV    AL,1            ;SET DIRTY SECTOR FLAGS
  988.     MOV    DI,BUFSECF[BX]
  989.     CLD
  990.     CALL    EXDSES
  991.     REP    STOSB
  992.     CALL    EXDSES
  993.  
  994.     MOV    BUFWRF[BX],1        ;INDICATE HOST BUFFER IS DIRTY
  995.  
  996. ;
  997.  
  998.     CALL    FLUSH            ;FLUSH BUFFER
  999.  
  1000. WRTRKE3:
  1001.     MOV    AL,BUFERR[BX]        ;INDICATE ERROR STATUS
  1002.     MOV    COMRA,AL
  1003.     RET
  1004.  
  1005.  
  1006.  
  1007.  
  1008. ;**    WRITE PROTECT CHECK
  1009. ;
  1010. ;    ENTRY:    NONE
  1011. ;    EXIT:    'COMRA'=STATUS     (0=R/W , 1=R/O)
  1012. ;    USES:    ALL
  1013. ;
  1014.  
  1015. WPCE:
  1016.     LEA    BX,DMYHDR        ;USE DUMMY BUFFER HEADER
  1017.     MOV    AL,REQDRV
  1018.     MOV    BUFDRV[BX],AL
  1019.     MOV    AL,PHYDRV
  1020.     MOV    BUFPDRV[BX],AL
  1021.     MOV    AX,PHYDPE
  1022.     MOV    BUFDPE[BX],AX
  1023.  
  1024.     MOV    AL,DDWPC        ;CALL DEVICE DRIVER TO DO CHECK
  1025.     CALL    DRVR
  1026.  
  1027.     MOV    AL,BUFERR[BX]        ;GET RETURN VALUE
  1028.     MOV    COMRA,AL
  1029.  
  1030.     RET
  1031.  
  1032.     EJECT
  1033. ;***    DISK BUFFER HANDLING ROUTINES
  1034. ;
  1035.  
  1036. ;**    SETUP -- COMMON R/W ROUTINE SETUP CODE
  1037. ;
  1038. ;    ENTRY:    'REQDRV'=REQUESTED DRIVE #
  1039. ;        'PHYDPE'=ADDRESS OF DPE FOR REQUESTED DRIVE
  1040. ;        'REQTRK'=REQUESTED TRACK #
  1041. ;    EXIT:    HOST BUFFER CONTAINS REQUESTED TRACK
  1042. ;        (BX)=ADDRESS OF BUFFER HEADER INFO
  1043. ;        (AX)=DISPLACEMENT OF REQUESTED CP/M SECTOR INTO HOST BUFFER
  1044. ;        (CX)=128/2=64
  1045. ;        DIRECTION FLAG CLEARED TO FORWARD DIRECTION
  1046. ;    USES:    AX,CX,DI
  1047. ;
  1048. ;    *** NOTE ***
  1049. ;
  1050. ;    IF A 1ST TIME SELECT OPERATION IS IN PROGRESS, THEN NO PHYSICAL
  1051. ;    READ IS DONE.  IN THIS CASE, THIS ROUTINE ONLY SERVES TO
  1052. ;    AQUIRE A FREE BUFFER TO BE USED BY THE DEVICE SELECTION
  1053. ;    ROUTINES FOR THEIR OWN PURPOSES.
  1054. ;
  1055.  
  1056.  
  1057. SETUP:
  1058.     CALL    FNDBUF            ;Q. REQUESTED TRACK IN ANY HOST BUFFERS
  1059.     MOV    BUFERR[BX],0        ;CLEAR ERROR FLAG
  1060.     JNC    SETUP1            ; BR IF YES
  1061.  
  1062.     CALL    FLUSH            ;FLUSH LEAST RECENTLY USED HOST BUFFER
  1063.     CMP    BUFERR[BX],0        ;Q. ERROR DURING FLUSH
  1064.     JNE    SETUP2            ; BR IF YES
  1065.  
  1066. ;    SET BUFFER HEADER INFO FOR REQUESTED TRACK
  1067.  
  1068.     MOV    AL,REQDRV        ;DRIVE #
  1069.     MOV    BUFDRV[BX],AL
  1070.     MOV    AL,PHYDRV        ;MAPPED DRIVE # (PHYSICAL TABLE #)
  1071.     MOV    BUFPDRV[BX],AL
  1072.     MOV    AX,PHYDPE        ;ADDRESS OF DPE
  1073.     MOV    BUFDPE[BX],AX
  1074.     MOV    AX,REQTRK        ;TRACK #
  1075.     MOV    BUFTRK[BX],AX
  1076.  
  1077. ;    CLEAR ERROR SECTOR FLAGS
  1078.  
  1079.     XOR    AL,AL
  1080.     MOV    DI,BUFERRF[BX]
  1081.     MOV    CX,ERRFLGL
  1082.     CALL    EXDSES
  1083.     REP    STOSB
  1084.     CALL    EXDSES
  1085.  
  1086. ;
  1087.  
  1088.     CMP    PREREAD,0        ;Q. SHOULD I DO PREREAD
  1089.     JE    SETUP2            ; BR IF NO
  1090.  
  1091.     MOV    AL,DDRDT        ;DO PHYSICAL READ AND FILL HOST BUFFER
  1092.     CALL    DRVR
  1093.  
  1094. ;    REQUESTED TRACK IS IN A HOST BUFFER.
  1095. ;    SET MOVE VALUES.
  1096.  
  1097. SETUP1:
  1098.     MOV    AX,REQSEC        ;CALCULATE DISPLACEMENT
  1099.     MOV    CL,7
  1100.     SHL    AX,CL
  1101.     MOV    CX,64            ;WORD COUNT
  1102.     CLD                ;CLEAR FOR FORWARD DIRECTION
  1103.     MOV    BUFERR[BX],0        ;INSURE ERROR FLAG IS CLEARED
  1104.  
  1105. SETUP2:
  1106.     RET
  1107.  
  1108.  
  1109.  
  1110.  
  1111. ;**    FNDBUF -- FIND HOST BUFFER TO USE
  1112. ;
  1113. ;    ENTRY:    'REQDRV'=DRIVE #
  1114. ;        'REQTRK'=TRACK #
  1115. ;    EXIT:    PSW/C=STATUS
  1116. ;            0=REQUESTED TRACK IS IN HOST BUFFER TO BE USED.
  1117. ;              HEADER INFO FOR BUFFER IS ON TOP OF BUFFER STACK
  1118. ;            1=NOT FOUND.
  1119. ;              HEADER INFO FOR THE LEAST RECENTLY USED BUFFER
  1120. ;              IS PLACED ON TOP OF BUFFER STACK SO IT CAN BE
  1121. ;              FLUSHED AND THEN USED
  1122. ;    USES:    AL,BX,DX
  1123. ;
  1124.  
  1125. FNDBUF:
  1126.     MOV    AL,REQDRV        ;REQUESTED DRIVE #
  1127.     MOV    DX,REQTRK        ;REQUESTED TRACK #
  1128.     MOV    BX,FSTBUF        ;INIT POINTER
  1129.  
  1130. FNDBUF1:
  1131.     TEST    BX,BX            ;Q. NO MORE BUFFER HEADERS
  1132.     JZ    FNDBUF3            ; BR IF NOT
  1133.     CMP    AL,BUFDRV[BX]        ;Q. MATCH ON REQUESTED DRIVE
  1134.     JNE    FNDBUF2            ; BR IF NOT
  1135.     CMP    DX,BUFTRK[BX]        ;Q. MATCH ON REQUESTED TRACK
  1136.     JE    FNDBUF4            ; BR IF YES
  1137.  
  1138. FNDBUF2:
  1139.     MOV    BX,BUFFWD[BX]        ;FOLLOW CHAIN TO NEXT INFO ELEMENT
  1140.     JMPS    FNDBUF1
  1141.  
  1142. FNDBUF3:
  1143.     MOV    BX,LSTBUF        ;POINT TO LAST ELEMENT
  1144.     STC                ;INDICATE NOT FOUND
  1145.  
  1146. FNDBUF4:
  1147.     PUSHF                ;SAVE FOUND STATUS
  1148.  
  1149.     CALL    PSHBUF        ;PLACE BUFFER TO BE USED ON TOP OF STACK
  1150.  
  1151.     POPF                ;RESTORE FOUND STATUS
  1152.  
  1153.     RET
  1154.  
  1155.  
  1156.  
  1157.  
  1158.  
  1159. ;**    INBUF -- INITIALIZE BUFFER HEADERS
  1160. ;
  1161. ;    ENTRY:    NONE
  1162. ;    EXIT:    NONE
  1163. ;    USES:    BX,CX,SI,DI
  1164. ;
  1165.  
  1166. INBUF:
  1167.     MOV    FSTBUF,0        ;INIT 1ST ELEMENT POINTER
  1168.     MOV    LSTBUF,0        ;INIT LAST ELEMENT POINTER
  1169.  
  1170.     MOV    CX,BUFCNT        ;# OF BUFFERS
  1171.     LEA    BX,HEADER        ;START OF HEADER AREA
  1172.     LEA    SI,SECFLG        ;START OF DIRTY SECTOR FLAG AREA
  1173.     LEA    DX,ERRFLG        ;START OF SECTOR ERROR FLAG AREA
  1174.     LEA    DI,BUFFER        ;START OF BUFFER AREA
  1175.  
  1176. INBUF1:
  1177.     MOV    BUFSECF[BX],SI        ;INIT ADDRESS OF DIRTY SECTOR FLAG AREA
  1178.     MOV    BUFERRF[BX],DX        ;INIT ADDRESS OF SECTOR ERROR FLAG AREA
  1179.     MOV    BUFBUF[BX],DI        ;INIT ADDRESS OF BUFFER AREA
  1180.  
  1181.     PUSH    BX
  1182.     PUSH    CX
  1183.     PUSH    DX
  1184.     PUSH    SI
  1185.     PUSH    DI
  1186.     PUSH    BX
  1187.  
  1188.     MOV    DI,0            ;INSERT HEADER AT END
  1189.     CALL    INSBUF
  1190.     POP    BX
  1191.     CALL    CLRBUF            ;CLEAR BUFFER HEADER
  1192.  
  1193.     POP    DI
  1194.     POP    SI
  1195.     POP    DX
  1196.     POP    CX
  1197.     POP    BX
  1198.  
  1199.     ADD    BX,BUFHDRL        ;BUMP POINTERS
  1200.     ADD    SI,SECFLGL
  1201.     ADD    DX,ERRFLGL
  1202.     ADD    DI,BUFFERL
  1203.  
  1204.     LOOP    INBUF1            ;LOOP FOR # OF BUFFERS
  1205.  
  1206.     RET
  1207.  
  1208.  
  1209.  
  1210.  
  1211.  
  1212. ;**    CLRBUFA - CLEAR ALL HOST BUFFER HEADERS
  1213. ;
  1214. ;    ENTRY:    NONE
  1215. ;    EXIT:    NONE
  1216. ;    USES:    BX
  1217. ;
  1218.  
  1219. CLRBUFA:
  1220.     MOV    BX,FSTBUF        ;GET POINTER TO FIRST HEADER IN CHAIN
  1221.  
  1222. CLRBUFA1:
  1223.     TEST    BX,BX            ;Q. AT END OF CHAIN
  1224.     JZ    CLRBUFA2        ; BR IF YES
  1225.  
  1226.     CALL    CLRBUF            ;CLEAR THIS BUFFER HEADER
  1227.  
  1228.     MOV    BX,BUFFWD[BX]        ;CHAIN TO NEXT HEADER
  1229.  
  1230.     JMPS    CLRBUFA1
  1231.  
  1232. CLRBUFA2:
  1233.     RET
  1234.  
  1235.  
  1236.  
  1237.  
  1238.  
  1239. ;**    CLRBUFD - CLEAR ALL HOST BUFFER HEADERS FOR REQUESTED DRIVE
  1240. ;
  1241. ;    ENTRY:    'REQDRV'=REQUESTED DRIVE #
  1242. ;    EXIT:    NONE
  1243. ;    USES:    AX,BX
  1244. ;
  1245.  
  1246. CLRBUFD:
  1247.     MOV    BX,FSTBUF        ;POINT TO 1ST HEADER ELEMENT
  1248.  
  1249. CLRBUFD1:
  1250.     TEST    BX,BX            ;Q. ANY MORE BUFFERS
  1251.     JZ    CLRBUFD3        ; BR IF NOT
  1252.  
  1253.     MOV    AL,REQDRV        ;Q. BUFFER FOR REQUESTED DRIVE
  1254.     CMP    AL,BUFDRV[BX]
  1255.     JE    CLRBUFD2        ; BR IF YES
  1256.  
  1257.     MOV    BX,BUFFWD[BX]        ;SKIP TO NEXT ENTRY
  1258.     JMPS    CLRBUFD1
  1259.  
  1260. CLRBUFD2:
  1261.     CALL    CLRBUF            ;CLEAR BUFFER
  1262.  
  1263.     MOV    AX,BUFFWD[BX]        ;REMEMBER WHO SHOULD BE NEXT
  1264.     PUSH    AX
  1265.  
  1266.     CALL    POPBUF            ;POP BUFFER STACK
  1267.     
  1268.     POP    BX            ;GET NEXT ENTRY
  1269.  
  1270.     JMPS    CLRBUFD1
  1271.  
  1272. CLRBUFD3:
  1273.     RET
  1274.  
  1275.  
  1276.  
  1277.  
  1278. ;**    CHKDBD -- CHECK FOR ANY DIRTY BUFFERS FOR REQUESTED DRIVE
  1279. ;
  1280. ;    ENTRY:    'REQDRV'=REQUESTED DRIVE #
  1281. ;    EXIT:    (AL)=STATUS    0=NO DIRTY BUFFERS , 1=DIRTY BUFFER(S)
  1282. ;    USES:    AX,BX
  1283. ;
  1284.  
  1285. CHKDBD:
  1286.     XOR    AH,AH            ;ZERO WORK REG
  1287.     MOV    AL,REQDRV        ;GET REQUESTED DRIVE #
  1288.     MOV    BX,FSTBUF        ;START OF BUFFER HEADERS
  1289.  
  1290. CHKDBD1:
  1291.     TEST    BX,BX            ;Q. ANY MORE BUFFERS
  1292.     JZ    CHKDBD3            ; BR IF NOT
  1293.  
  1294.     CMP    AL,BUFDRV[BX]        ;Q. BUFFER FOR REQUESTED DRIVE
  1295.     JNE    CHKDBD2            ; BR IF NOT
  1296.  
  1297.     OR    AH,BUFWRF[BX]        ;ACCUMULATE DIRTY FLAGS
  1298.  
  1299. CHKDBD2:
  1300.     MOV    BX,BUFFWD[BX]        ;SKIP TO NEXT ENTRY
  1301.     JMPS    CHKDBD1
  1302.  
  1303. CHKDBD3:
  1304.     MOV    AL,AH            ;MOVE RESULT TO (AL)
  1305.     RET
  1306.  
  1307.  
  1308.  
  1309.  
  1310. ;**    FLUSHD -- FLUSH ALL BUFFERS FOR REQUESTED DRIVE
  1311. ;
  1312. ;    ENTRY:    'REQDRV'=REQUESTED DRIVE #
  1313. ;    EXIT:    (AL)=ERROR STATUS (0=OK , 1=ABORT)
  1314. ;    USES:    AL,BX
  1315. ;
  1316.  
  1317. FLUSHD:
  1318.     MOV    FLDERR,0        ;CLEAR ERROR FLAG
  1319.     MOV    BX,FSTBUF        ;START OF BUFFER HEADERS
  1320.  
  1321. FLUSHD1:
  1322.     TEST    BX,BX            ;Q. ANY MORE BUFFERS
  1323.     JZ    FLUSHD3            ; BR IF NOT
  1324.  
  1325.     MOV    AL,REQDRV        ;Q. BUFFER FOR REQUESTED DRIVE
  1326.     CMP    AL,BUFDRV[BX]
  1327.     JNE    FLUSHD2            ; BR IF NOT
  1328.  
  1329.     MOV    AL,FLDERR        ;PROPAGATE ABORT STATUS
  1330.     OR    BUFERR[BX],AL
  1331.     CALL    FLUSH            ;FLUSH BUFFER
  1332.     MOV    AL,BUFERR[BX]        ;ACCUMULATE ERROR STATUS
  1333.     OR    FLDERR,AL
  1334.  
  1335. FLUSHD2:
  1336.     MOV    BX,BUFFWD[BX]        ;FOLLOW CHAIN TO NEXT ELEMENT
  1337.     JMPS    FLUSHD1
  1338.  
  1339. FLUSHD3:
  1340.     MOV    AL,FLDERR        ;GET ERROR STATUS
  1341.     RET
  1342.  
  1343.  
  1344.  
  1345.  
  1346.  
  1347. ;*    CLRBUF -- CLEAR BUFFER HEADER
  1348. ;
  1349. ;    ENTRY:    (BX)=POINTER TO BUFFER HEADER INFO
  1350. ;    EXIT:    NONE
  1351. ;    USES:    AL,CX,SI,DI
  1352. ;
  1353. ;    *** NOTE ***
  1354. ;
  1355. ;    IF A BUFFER WAS NOT FLUSHED BEFORE BEING CLEARED AND
  1356. ;    IF IT WAS DIRTY, THEN THE DATA IS LOST.
  1357. ;
  1358.  
  1359. CLRBUF:
  1360.     MOV    BUFDRV[BX],-1        ;CLEAR DRIVE #
  1361.     MOV    BUFWRF[BX],0        ;CLEAR DIRTY BUFFER FLAG
  1362.  
  1363.     XOR    AL,AL            ;CLEAR DIRTY SECTOR FLAGS
  1364.     MOV    DI,BUFSECF[BX]
  1365.     MOV    CX,SECFLGL
  1366.     CLD
  1367.     CALL    EXDSES
  1368.     REP    STOSB
  1369.     CALL    EXDSES
  1370.  
  1371.     RET
  1372.  
  1373.  
  1374.  
  1375.  
  1376. ;*    FLUSH -- FLUSH BUFFER WHOSE HEADER INFO IS ON TOP OF THE STACK
  1377. ;
  1378. ;    ENTRY:    (BX)=POINTER TO BUFFER HEADER INFO
  1379. ;    EXIT:    NONE
  1380. ;    USES:    NONE
  1381. ;
  1382.  
  1383. FLUSH:
  1384.     TEST    BUFWRF[BX],1        ;CHECK IF HOST BUFFER IS DIRTY
  1385.     JZ    FLUSH1            ; BR IF NOT
  1386.  
  1387.     MOV    AL,DDWRT        ;GO WRITE TRACK
  1388.     CALL    DRVR
  1389.  
  1390.     MOV    BUFWRF[BX],0        ;INDICATE HOST WRITE BUFFER IS CLEAN
  1391.  
  1392. FLUSH1:
  1393.     RET
  1394.  
  1395.  
  1396.  
  1397.  
  1398. ;*    PSHBUF -- PUSH DOWN BUFFER HEADER INFO STACK AND PLACE COPY
  1399. ;          OF HEADER INFO OF BUFFER TO BE USED ON TOP OF STACK.
  1400. ;
  1401. ;    ENTRY:    (BX)=ADDRESS OF HEADER INFO FOR HOST BUFFER TO BE USED
  1402. ;    EXIT:    NONE
  1403. ;    USES:    DI
  1404. ;
  1405.  
  1406. PSHBUF:
  1407.     CMP    BX,FSTBUF        ;Q. ALREADY ON TOP OF STACK
  1408.     JE    PSHBUF1            ; BR IF YES
  1409.  
  1410.     CALL    DELBUF            ;REMOVE FROM STACK
  1411.  
  1412.     MOV    DI,FSTBUF        ;REINSERT ON TOP OF STACK
  1413.     CALL    INSBUF
  1414.  
  1415. PSHBUF1:
  1416.     RET
  1417.  
  1418.  
  1419.  
  1420.  
  1421.  
  1422. ;*    POPBUF -- POP UP BUFFER HEADER INFO STACK AND COPY
  1423. ;          HEADER INFO FOR BUFFER USED TO BOTTOM OF STACK.
  1424. ;
  1425. ;    ENTRY:    (BX)=ADDRESS OF HEADER INFO FOR HOST BUFFER TO BE USED
  1426. ;    EXIT:    NONE
  1427. ;    USES:    DI
  1428. ;
  1429.  
  1430. POPBUF:
  1431.     CMP    BX,LSTBUF        ;Q. ALREADY BOTTOM OF STACK
  1432.     JE    POPBUF1            ; BR IF YES
  1433.  
  1434.     CALL    DELBUF            ;REMOVE FROM CURRENT POSITION
  1435.  
  1436.     MOV    DI,0            ;REINSERT AT BOTTOM OF STACK
  1437.     CALL    INSBUF
  1438.  
  1439. POPBUF1:
  1440.     RET
  1441.  
  1442.  
  1443.  
  1444.  
  1445. ;*    DELBUF -- DELETE ELEMENT FROM BUFFER STACK
  1446. ;
  1447. ;    ENTRY:    (BX)=POINTER TO ELEMENT TO BE DELETED
  1448. ;    EXIT:    NONE
  1449. ;    USES:    SI,DI
  1450. ;
  1451.  
  1452. DELBUF:
  1453.     MOV    DI,BUFFWD[BX]        ;GET POINTER TO NEXT ELEMENT
  1454.     MOV    SI,BUFBAK[BX]        ;GET POINTER TO PREVIOUS ELEMENT
  1455.  
  1456.     TEST    SI,SI            ;Q. FIRST ELEMENT
  1457.     JNZ    DELBUF1            ; BR IF NOT
  1458.  
  1459.     MOV    FSTBUF,DI        ;SET NEXT ELEMENT AS FIRST ELEMENT
  1460.     JMPS    DELBUF2
  1461.  
  1462. DELBUF1:
  1463.     MOV    BUFFWD[SI],DI        ;CHAIN PREVIOUS ELEMENT TO NEXT ELEMENT
  1464.  
  1465. DELBUF2:
  1466.     TEST    DI,DI            ;Q. LAST ELEMENT
  1467.     JNZ    DELBUF3            ; BR IF NOT
  1468.  
  1469.     MOV    LSTBUF,SI        ;SET PREVIOUS ELEMENT AS LAST ELEMENT
  1470.     JMPS    DELBUF4
  1471.  
  1472. DELBUF3:
  1473.     MOV    BUFBAK[DI],SI        ;CHAIN NEXT ELEMENT TO PREVIOUS ELEMENT
  1474.  
  1475. DELBUF4:
  1476.     RET
  1477.  
  1478.  
  1479.  
  1480.  
  1481. ;*    INSBUF -- INSERT BUFFER HEADER INFO INTO STACK
  1482. ;
  1483. ;    ENTRY:    (BX)=ADDRESS OF ELEMENT TO BE INSERTED
  1484. ;        (DI)=ADDRESS OF ELEMENT TO BE INSERTED IN FRONT OF
  1485. ;    EXIT:    NONE
  1486. ;    USES:    SI
  1487. ;
  1488. ;    *** NOTE ***
  1489. ;
  1490. ;    IF (DI)=0 THEN INSERTION IS DONE AFTER LAST ELEMENT
  1491. ;
  1492.  
  1493. INSBUF:
  1494.     TEST    DI,DI            ;Q. INSERT AT END
  1495.     JNZ    INSBUF3            ; BR IF NO
  1496.  
  1497. ;    INSERT AFTER LAST ELEMENT
  1498.  
  1499.     MOV    SI,LSTBUF        ;GET POINTER TO LAST ELEMENT
  1500.  
  1501.     TEST    SI,SI            ;Q. ANY ELEMENTS
  1502.     JNZ    INSBUF1            ; BR IF YES
  1503.     MOV    FSTBUF,BX        ;SET ELEMENT AS FIRST ELEMENT
  1504.     JMPS    INSBUF2
  1505.  
  1506. INSBUF1:
  1507.     MOV    BUFFWD[SI],BX        ;CHAIN LAST ELEMENT TO ELEMENT
  1508.  
  1509. INSBUF2:
  1510.     MOV    BUFFWD[BX],0        ;SET ELEMENT'S FORWARD POINTER
  1511.     MOV    BUFBAK[BX],SI        ;CHAIN ELEMENT TO LAST ELEMENT
  1512.     MOV    LSTBUF,BX        ;SET ELEMENT AS LAST ELEMENT
  1513.     RET
  1514.  
  1515. ;    INSERT IN FRONT OF ELEMENT POINTED TO BY (DI)
  1516.  
  1517. INSBUF3:
  1518.     MOV    SI,BUFBAK[DI]        ;GET POINTER TO PREVIOUS ELEMENT
  1519.  
  1520.     TEST    SI,SI            ;Q. ANY PREVIOUS ELEMENT
  1521.     JNZ    INSBUF4            ; BR IF YES
  1522.     MOV    FSTBUF,BX        ;SET ELEMENT AS FIRST ELEMENT
  1523.     JMPS    INSBUF5
  1524.  
  1525. INSBUF4:
  1526.     MOV    BUFFWD[SI],BX        ;CHAIN PREVIOUS ELEMENT TO ELEMENT
  1527.  
  1528. INSBUF5:
  1529.     MOV    BUFBAK[BX],SI        ;CHAIN ELEMENT TO PREVIOUS ELEMENT
  1530.     MOV    BUFBAK[DI],BX        ;CHAIN NEXT ELEMENT TO ELEMENT
  1531.     MOV    BUFFWD[BX],DI        ;CHAIN ELEMENT TO NEXT ELEMENT
  1532.     RET
  1533.  
  1534.     EJECT
  1535. ;**    DRVR - DISK DRIVER DISPATCHER
  1536. ;
  1537. ;    ENTRY:    (AL)=ENTRY JUMP VECTOR OFFSET
  1538. ;        (BX)=ADDRESS OF BUFFER HEADER INFO
  1539. ;    EXIT:    NONE
  1540. ;    USES:    AX,CL,SI,DI
  1541. ;
  1542.  
  1543. DRVR:
  1544.     PUSH    AX
  1545.     MOV    LSIO,0            ;CLEAR LOGICAL SECTOR I/O FLAG
  1546.  
  1547. ;*    INSURE CORRECT DISK IS INSERTED IN REQUESTED DRIVE
  1548.  
  1549.     MOV    SI,BUFDPE[BX]        ;GET ADDRESS OF REQUESTED DRIVE'S DPE
  1550.  
  1551.     MOV    AL,DPEFLAG[SI]        ;NOT ALL DEVICES ARE PERMITTED
  1552.     AND    AL,DPETYPE        ; IMAGINARY DRIVES
  1553.     CMP    AL,DPEZ217
  1554.     JNE    DRVR0            ;  BR IF NOT Z217
  1555.  
  1556.     MOV    LSIO,1            ;INDICATE LOGICAL I/O DEVICE
  1557.     JMPS    DRVR5
  1558.  
  1559. DRVR0:
  1560.     TEST    DPEFLG2[SI],DPEIMG    ;Q. IMAGINARY DRIVE
  1561.     JZ    DRVR1            ; BR IF NOT
  1562.  
  1563.     MOV    AL,DPELUN[SI]        ;POINT TO CORRESPONDING REAL DRIVE
  1564.     AND    AL,DPEREAL
  1565.     MOV    AH,DPEL
  1566.     MUL    AH
  1567.     ADD    AX,OFFSET DPEBASE
  1568.     ADD    AX,BBIOS
  1569.     MOV    SI,AX
  1570.  
  1571. DRVR1:
  1572.     MOV    AL,DPELUN[SI]        ;GET LOGICAL/MOUNTED VALUE
  1573.     MOV    AH,AL            ;SAVE IT
  1574.     AND    AL,DPEMNT        ;MASK FOR MOUNTED VALUE
  1575.     CMP    AL,BUFPDRV[BX]        ;Q. MOUNTED EQUAL REQUESTED
  1576.     JE    DRVR5            ; BR IF YES
  1577.  
  1578.     AND    AH,DPELOG        ;UPDATE MOUNTED VALUE
  1579.     OR    AH,BUFPDRV[BX]        ; TO REFLECT WHICH DISK IS MOUNTED
  1580.     MOV    DPELUN[SI],AH        ;  IN REAL UNIT
  1581.  
  1582. ;    PRINT MESSAGE AND REQUEST THAT DISK BE INSERTED INTO DRIVE
  1583.  
  1584.     MOV    AL,BUFDRV[BX]        ;PLACE REQUESTED DRIVE NAME INTO MSG
  1585.     ADD    AL,'A'
  1586.     MOV    MNMSGA,AL
  1587.  
  1588.     MOV    CL,4            ;PLACE REAL DRIVE NAME INTO MESSAGE
  1589.     SHR    AH,CL
  1590.     ADD    AH,'A'
  1591.     MOV    MNMSGB,AH
  1592.  
  1593.     PUSH    BX
  1594.  
  1595.     LEA    SI,MNMSG        ;PRINT MESSAGE
  1596.     CALL    PMSG
  1597.  
  1598. DRVR3:
  1599.     CALL    GETCHR            ;WAIT FOR <CR>
  1600.     CMP    AL,CR
  1601.     JE    DRVR4
  1602.     MOV    COMRC,BELL
  1603.     CALL    CONOUTE
  1604.     JMPS    DRVR3
  1605.  
  1606. DRVR4:
  1607.     LEA    SI,CRLF
  1608.     CALL    PMSG
  1609.  
  1610.     POP    BX
  1611.  
  1612.     MOV    AL,DDMNT        ;CALL DEVICE DRIVER TO MOUNT DISK
  1613.     CALL    DRVR6
  1614.  
  1615. ;*    DISPATCH TO DEVICE DRIVER
  1616.  
  1617. DRVR5:
  1618.     POP    AX            ;RESTORE ENTRY JUMP VECTOR OFFSET
  1619.  
  1620. DRVR6:
  1621.     MOV    AH,0
  1622.     MOV    DI,AX
  1623.  
  1624.     MOV    SI,BUFDPE[BX]        ;FETCH DEVICE TYPE
  1625.     MOV    AL,DPEFLAG[SI]
  1626.     MOV    CL,5
  1627.     SHR    AL,CL
  1628.     CBW                ;ADJUST FOR DISPATCH TABLE ENTRY LENGTH
  1629.     SHL    AX,1
  1630.     MOV    SI,AX
  1631.     MOV    SI,DRVRTBL[SI]        ;GET OFFSET OF START OF DEVICE DRIVER
  1632.     CMP    SI,0            ;Q. DUMMY DRIVER
  1633.     JE    DRVR7            ; BR IF YES
  1634.     ADD    SI,DI            ;ADD ENTRY JUMP VECTOR OFFSET
  1635.     JMP    SI            ;GOTO DEVICE DRIVER
  1636.  
  1637. DRVR7:
  1638.     RET
  1639.  
  1640.     EJECT
  1641.     INCLUDE    Z207DRVR.LIB
  1642.     EJECT
  1643.     INCLUDE    Z217DRVR.LIB
  1644.     EJECT
  1645.     INCLUDE    TIMEDRVR.LIB
  1646.     EJECT
  1647. ;***    GENERAL PURPOSE CHARACTER I/O HANDLER
  1648. ;
  1649.  
  1650. ;*    GETCIO - GET APPROPRIATE CIO TABLE ENTRY
  1651. ;
  1652. ;    ENTRY:    (AL)='IOBYTE' SHIFTED SO BITS 1-2 CONTAIN THE PERTINENT VALUE
  1653. ;        ((SP))=START OF ADDRESS OFFSET TABLE
  1654. ;    EXIT:    (BX)=ADDRESS OF CIO TABLE ENTRY
  1655. ;    USES:    AX,BX
  1656. ;
  1657. ;    *** NOTE ***
  1658. ;    THE TABLE CONSISTS OF 4 DW STATEMENTS, WHICH EQUALS 8 BYTES
  1659. ;
  1660.  
  1661. GETCIO:
  1662.     AND    AX,06H            ;MASK FOR ONLY BITS 1-2
  1663.     POP    BX            ;GET START OF TABLE
  1664.     ADD    AX,BX            ;MOVE POINTER TO APPROPRIATE ENTRY
  1665.  
  1666.     ADD    BX,8            ;MODIFY RETURN ADDRESS TO SKIP
  1667.     PUSH    BX            ; AROUND TABLE
  1668.  
  1669.     MOV    BX,AX
  1670.     MOV    BX,CS: WORD PTR [BX]    ;GET VALUE IN TABLE
  1671.  
  1672.     TEST    BX,BX            ;Q. SPECIAL CASE
  1673.     JZ    GETCIO1            ; BR IF YES
  1674.  
  1675.     ADD    BX,BBIOS        ;ADJUST FOR WHERE BIOS IS IN MEMORY
  1676.  
  1677. GETCIO1:
  1678.     RET
  1679.  
  1680.  
  1681.  
  1682.  
  1683.  
  1684. ;*    CLRCIO - CLEAR CIO TABLE FLAGS/VALUES
  1685. ;
  1686. ;    ENTRY:    (BX)=ADDRESS OF CIO TABLE ENTRY
  1687. ;    EXIT:    NONE
  1688. ;    USES:    NONE
  1689. ;
  1690.  
  1691. CLRCIO:
  1692.     AND    CIOF2[BX],NOT (CIOW4A+CIOW4D)
  1693.     MOV    CIOECTR[BX],0
  1694.     MOV    CIONCTR[BX],0
  1695.     RET
  1696.  
  1697.  
  1698.  
  1699.  
  1700.  
  1701. ;*    ISCIO - INPUT STATUS
  1702. ;
  1703. ;    ENTRY:    (BX)=ADDRESS OF CIO TABLE ENTRY
  1704. ;    EXIT:    (AL)=STATUS
  1705. ;            0=NO CHARACTER AVAILBLE , 0FFH=CHARACTER AVAILBLE
  1706. ;    USES:    AL
  1707. ;
  1708.  
  1709. ISCIO:
  1710.     CALL    CIOIS[BX]        ;INPUT STATUS BYTE FROM DEVICE
  1711.     AND    AL,CIOIM[BX]        ;USE INPUT READY MASK
  1712.     XOR    AL,CIOIPM[BX]        ;ADJUST FOR POLARITY
  1713.     CMP    AL,CIOIM[BX]        ;CHECK IF READY
  1714.     MOV    AL,0FFH            ; ASSUME READY
  1715.     JE    ISCIO1            ; BR IF READY
  1716.     XOR    AL,AL            ;  OTHERWISE SHOW NOT READY
  1717. ISCIO1:
  1718.     RET
  1719.  
  1720.  
  1721.  
  1722.  
  1723. ;*    IDCIO - INPUT DATA
  1724. ;
  1725. ;    ENTRY:    (BX)=ADDRESS OF CIO TABLE ENTRY
  1726. ;    EXIT:    (AL)=CHARACTER READ
  1727. ;    USES:    AL
  1728. ;
  1729.  
  1730. IDCIO:
  1731.     CALL    ISCIO            ;WAIT FOR CHARACTER AVAILABLE
  1732.     TEST    AL,AL
  1733.     JZ    IDCIO
  1734.  
  1735.     CALL    CIOID[BX]        ;INPUT DATA
  1736.  
  1737.     TEST    CIOF1[BX],CIOSPI    ;Q. STRIP PARITY
  1738.     JZ    IDCIO1            ; BR IF NOT
  1739.     AND    AL,07FH            ;  OTHERWISE STRIP PARITY
  1740.  
  1741. IDCIO1:
  1742.     TEST    CIOF1[BX],CIOMLI    ;CHECK IF I SHOULD MAP LOWER CASE
  1743.     JZ    IDCIO2            ; BR IF NOT
  1744.     CALL    UPC            ;  OTHERWISE DO MAPPING
  1745.  
  1746. IDCIO2:
  1747.     RET
  1748.  
  1749.  
  1750.  
  1751.  
  1752. ;*    OSCIO - OUTPUT STATUS
  1753. ;
  1754. ;    ENTRY:    (BX)=ADDRESS OF CIO TABLE ENTRY
  1755. ;    EXIT:    (AL)=STATUS
  1756. ;            0=NOT READY , 0FFH=READY
  1757. ;    USES:    AL
  1758. ;
  1759.  
  1760. OSCIO:
  1761.     CALL    CIOOS[BX]        ;INPUT STATUS BYTE FROM DEVICE
  1762.     AND    AL,CIOOM[BX]        ;USE OUTPUT READY MASK
  1763.     XOR    AL,CIOOPM[BX]        ;ADJUST FOR POLARITY
  1764.     CMP    AL,CIOOM[BX]        ;CHECK IF READY
  1765. ;    JNE    OSCIO8            ; BR IF BUSY
  1766.     JE    $+5
  1767.     JMP    OSCIO8
  1768.  
  1769. ;    HANDLE <ETX>/<ACK> PROTOCOL
  1770.  
  1771. OSCIO2:
  1772.     TEST    CIOF1[BX],CIOEAH    ;Q. USING <ETX>/<ACK> HANDSHAHKING
  1773.     JZ    OSCIO3            ; BR IF NOT
  1774.     TEST    CIOF2[BX],CIOW4A    ;Q. WAITING FOR <ACK>
  1775.     JNZ    OSCIO2A            ; BR IF YES
  1776.  
  1777.     MOV    AL,CIOECTR[BX]        ;Q. TIME TO SEND <ETX>
  1778.     CMP    AL,CIOECNT[BX]
  1779.     JB    OSCIO4            ; BR IF NOT
  1780.     MOV    CIOECTR[BX],0        ;REINITIALIZE COUNTER
  1781.     MOV    AL,ETX            ;SEND <ETX>
  1782.     CALL    CIOOD[BX]
  1783.     OR    CIOF2[BX],CIOW4A    ;SHOW WAITING FOR <ACK>
  1784.     JMP    OSCIO8            ;JUMP TO BUSY EXIT
  1785.  
  1786. OSCIO2A:
  1787.     CALL    ISCIO            ;CHECK INPUT STATUS
  1788.     TEST    AL,AL            ;Q. CHARACTER AVAILABLE
  1789.     JZ    OSCIO8            ; BR IF NOT
  1790.     CALL    CIOID[BX]        ;INPUT CHARACTER
  1791.     AND    AL,07FH            ;STRIP PARITY BIT
  1792.     CMP    AL,ACK            ;Q. <ACK>
  1793.     JNE    OSCIO8            ; BR IF NOT
  1794.     AND    CIOF2[BX],0FFH-CIOW4A    ;SHOW NOT WAITING FOR <ACK>
  1795.     JMPS    OSCIO4
  1796.  
  1797. ;    HANDLE <DC1>/<DC3> PROTOCOL
  1798.  
  1799. OSCIO3:
  1800.     TEST    CIOF1[BX],CIODCH    ;Q. USING <DC1>/<DC3> HANDSHAKING
  1801.     JZ    OSCIO4            ; BR IF NOT
  1802.  
  1803.     CALL    ISCIO            ;INPUT STATUS
  1804.     TEST    AL,AL            ;Q. CHARACTER AVAILABLE
  1805.     JZ    OSCIO3C            ; BR IF NOT
  1806.  
  1807.     CALL    CIOID[BX]        ;INPUT CHARACTER
  1808.     AND    AL,07FH            ;STRIP PARITY BIT
  1809. OSCIO3A:
  1810.     CMP    AL,DC1            ;Q. <DC1>
  1811.     JNE    OSCIO3B            ; BR IF NOT
  1812.     AND    CIOF2[BX],0FFH-CIOW4D    ;SHOW NOT WAITING FOR <DC1>
  1813.     JMPS    OSCIO4
  1814. OSCIO3B:
  1815.     CMP    AL,DC3            ;Q. <DC3>
  1816.     JNE    OSCIO3C            ; BR IF NOT
  1817.     OR    CIOF2[BX],CIOW4D    ;SHOW WAITING FOR <DC1>
  1818.     JMPS    OSCIO8
  1819. OSCIO3C:
  1820.     TEST    CIOF2[BX],CIOW4D    ;Q. WAITING FOR <DC1>
  1821.     JNZ    OSCIO8            ; BR IF YES
  1822.  
  1823. ;    HANDLE SENDING NULLS
  1824.  
  1825. OSCIO4:
  1826.     CMP    CIONCTR[BX],0        ;Q. ANY NULLS LEFT TO SEND
  1827.     JE    OSCIO9            ; BR IF NOT
  1828.     DEC    CIONCTR[BX]        ;DECREMENT NULL COUNTER
  1829.     MOV    AL,NULL            ;SEND ANOTHER NULL
  1830.     CALL    CIOOD[BX]
  1831.  
  1832. ;    SHOW AS BUSY
  1833.  
  1834. OSCIO8:
  1835.     XOR    AL,AL
  1836.     RET
  1837.  
  1838. ;    SHOW AS READY
  1839.  
  1840. OSCIO9:
  1841.     MOV    AL,0FFH
  1842.     RET
  1843.  
  1844.  
  1845.  
  1846.  
  1847. ;*    ODCIO - OUTPUT DATA
  1848. ;
  1849. ;    ENTRY:    (CL)=CHARACTER
  1850. ;        (BX)=ADDRESS OF CIO TABLE ENTRY
  1851. ;    EXIT:    NONE
  1852. ;    USES:    AL
  1853. ;
  1854. ;    *** NOTE ***
  1855. ;
  1856. ;    THE DEVICE OUTPUT ROUTINE MUST NOT DESTROY REGISTER (CL) OR (BX).
  1857. ;
  1858.  
  1859.  
  1860. ODCIO:
  1861.     CALL    OSCIO            ;WAIT UNTIL READY
  1862.     TEST    AL,AL
  1863.     JZ    ODCIO
  1864.  
  1865.     MOV    AL,CL
  1866.  
  1867.     TEST    CIOF1[BX],CIOSPO    ;Q. STRIP PARITY
  1868.     JZ    ODCIO1            ; BR IF NOT
  1869.     AND    AL,07FH
  1870.  
  1871. ODCIO1:
  1872.     TEST    CIOF1[BX],CIOMLO    ;Q. MAP LOWER CASE ON OUTPUT
  1873.     JZ    ODCIO2            ; BR IF NOT
  1874.     CALL    UPC            ;  OTHERWISE DO MAPPING
  1875.  
  1876. ODCIO2:
  1877.     CALL    CIOOD[BX]        ;OUTPUT CHARACTER
  1878.  
  1879.     CMP    CL,CIONCHR[BX]        ;Q. SHOULD I SEND NULLS
  1880.     JNE    ODCIO3            ; BR IF NOT
  1881.     MOV    AL,CIONCNT[BX]        ;GET NUMBER OF NULLS TO BE SENT
  1882.     MOV    CIONCTR[BX],AL        ;PLACE IN NULL COUNTER
  1883.  
  1884. ODCIO3:
  1885.     INC    CIOECTR[BX]        ;COUNT CHARACTER
  1886.  
  1887.     CMP    CL,ESC            ;Q. <ESC>
  1888.     JNE    ODCIO4            ; BR IF NOT
  1889.     MOV    AL,CIOECNT[BX]        ;  IF YES - THEN INSURE
  1890.     SUB    AL,3            ;   ETX/ACK HANDSHAKING IS DELAYED
  1891.     CMP    CIOECTR[BX],AL
  1892.     JB    ODCIO4
  1893.     MOV    CIOECTR[BX],AL
  1894.  
  1895. ODCIO4:
  1896.     RET
  1897.  
  1898.     EJECT
  1899. ;***    DEVICE DRIVERS
  1900. ;
  1901.  
  1902. ;**    CRT:    (KEYBOARD/DISPLAY)
  1903. ;
  1904.  
  1905. ;*    INCRT - INITIALIZATION
  1906. ;
  1907. ;    ENTRY:    NONE
  1908. ;    EXIT:    NONE
  1909. ;    USES:    BX
  1910. ;
  1911.  
  1912. INCRT:
  1913.     PUSHF                ;INSURE INTERRUPTS ARE DISABLED
  1914.     CLI                ; DURING INIT
  1915.  
  1916.     LEA    BX,CRTTBL        ;GET ADDRSS OF CIO TABLE ENTRY
  1917.     ADD    BX,BBIOS
  1918.     CALL    CLRCIO            ;CLEAR CIO TABLE FLAGS
  1919.     MOV    CIOIN[BX],OFFSET INCRT    ;ADDRESS OF INIT ROUTINE
  1920.     MOV    CIOIS[BX],OFFSET ISCRT    ;ADDRESS OF INPUT INPUT STATUS BYTE
  1921.     MOV    CIOID[BX],OFFSET IDCRT    ;ADDRESS OF INPUT DATA BYTE
  1922.     MOV    CIOOS[BX],OFFSET DUMMY    ;ADDRESS OF INPUT OUTPUT STATUS BYTE
  1923.     MOV    CIOOD[BX],OFFSET ODCRT    ;ADDRESS OF OUTPUT DATA BYTE
  1924.  
  1925.     CALL    FLCRT            ;FLUSH TYPEAHEAD BUFFER
  1926.  
  1927.     POPF                ;RESTORE INTERRUPT STATUS
  1928.     RET
  1929.  
  1930.  
  1931.  
  1932.  
  1933. ;*    FLCRT - FLUSH CRT: TYPE AHEAD BUFFER
  1934. ;
  1935. ;    ENTRY:    NONE
  1936. ;    EXIT:    NONE
  1937. ;    USES:    NONE
  1938. ;
  1939.  
  1940. FLCRT:
  1941.     PUSH    AX
  1942.     PUSH    BX
  1943.  
  1944.     PUSHF                ;DISABLE INTERRUPTS
  1945.     CLI
  1946.  
  1947. FLCRT1:
  1948.     IN    AL,ZKEYBDS        ;DISABLE KEYBOARD
  1949.     TEST    AL,ZKEYIBF
  1950.     JNZ    FLCRT1
  1951.     MOV    AL,ZKEYDK
  1952.     OUT    ZKEYBDC,AL
  1953. FLCRT2:
  1954.     IN    AL,ZKEYBDS        ;CLEAR FIFO
  1955.     TEST    AL,ZKEYIBF
  1956.     JNZ    FLCRT2
  1957.     MOV    AL,ZKEYCF
  1958.     OUT    ZKEYBDC,AL
  1959. FLCRT3:
  1960.     IN    AL,ZKEYBDS        ;CLEAR OUTPUT BUFFER
  1961.     TEST    AL,ZKEYIBF
  1962.     JNZ    FLCRT3
  1963.     IN    AL,ZKEYBDD
  1964.  
  1965.     MOV    KEYCNT,0        ;INIT BUFFER HANDLING VALUES
  1966.     LEA    BX,KEYBUF
  1967.     MOV    KEYPUT,BX
  1968.     MOV    KEYGET,BX
  1969.  
  1970.     POPF                ;RESTORE INTERRUPT STATUS
  1971.  
  1972.     PUSHF                ;Q. INTERRUPTS ENABLED
  1973.     POP    AX
  1974.     TEST    AH,002H
  1975.     JZ    FLCRT4            ; BR IF NOT
  1976.     MOV    AX,250*250        ;WAIT IN CASE KEY WAS DEPRESSED
  1977.     CALL    WDLY            ; DURING FLUSH
  1978.     CALL    WDLY
  1979. FLCRT4:
  1980.     MOV    AL,ZKEYEK        ;RE-ENABLE KEYBOARD
  1981.     OUT    ZKEYBDC,AL
  1982.  
  1983.     POP    BX
  1984.     POP    AX
  1985.  
  1986.     RET
  1987.  
  1988.  
  1989.  
  1990.  
  1991. ;*    ISCRT - INPUT INPUT STATUS BYTE
  1992. ;
  1993. ;    ENTRY:    (BX)=ADDRESS OF CIO TABLE ENTRY
  1994. ;    EXIT:    (AL)=STATUS
  1995. ;            0=NO DATA AVAILABLE , 0FFH=DATA IN TYPE-AHEAD BUFFER
  1996. ;    USES:    AL
  1997. ;
  1998.  
  1999. ISCRT:
  2000.     MOV    AL,KEYCNT        ;GET TYPE-AHEAD CHARACTER COUNT
  2001.     TEST    AL,AL            ;Q. ANY CHARACTERS AVAILABLE
  2002.     JZ    ISCRT1            ; BR IF NOT
  2003.     MOV    AL,0FFH            ;  INDICATE AVAILABLE
  2004. ISCRT1:
  2005.     RET
  2006.  
  2007.  
  2008.  
  2009.  
  2010. ;*    IDCRT - GET DATA BYTE FROM TYPE-AHEAD BUFFER
  2011. ;
  2012. ;    ENTRY:    (BX)=ADDRESS OF CIO TABLE ENTRY
  2013. ;    EXIT:    (AL)=DATA BYTE
  2014. ;    USES:    AL
  2015. ;
  2016.  
  2017. IDCRT:
  2018.     CALL    ISCRT            ;Q. ANY AVAILABLE
  2019.     TEST    AL,AL
  2020.     JZ    IDCRT2            ; BR IF NOT
  2021.  
  2022.     PUSHF                ;DISABLE INTERRUPTS WHILE FETCHING
  2023.     CLI                ; CHARACTER
  2024.  
  2025.     PUSH    BX
  2026.     MOV    BX,KEYGET        ;FETCH GET POINTER
  2027.     MOV    AL,[BX]            ;FETCH CHARACTER
  2028.     DEC    KEYCNT            ;DECREMENT CHARACTER COUNTER
  2029.     INC    BX            ;BUMP GET POINTER
  2030.     CMP    BX,OFFSET KEYBUF + KEYBUFL    ;Q. TIME TO WRAP POINTER
  2031.     JB    IDCRT1                ; BR IF NOT
  2032.     LEA    BX,KEYBUF            ;  WRAP POINTER TO BEGINNING
  2033. IDCRT1:
  2034.     MOV    KEYGET,BX        ;SAVE UPDATED GET POINTER
  2035.     POP    BX
  2036.     POPF
  2037.  
  2038. IDCRT2:
  2039.     RET
  2040.  
  2041.  
  2042.  
  2043.  
  2044. ;*    ODCRT - OUTPUT DATA
  2045. ;
  2046. ;    ENTRY:    (AL)=CHARACTER
  2047. ;        (BX)=ADDRESS OF CIO TABLE ENTRY
  2048. ;    EXIT:    NONE
  2049. ;    USES:    NONE
  2050. ;
  2051.  
  2052. ODCRT:
  2053.     PUSHA
  2054.     CALLFI    MTRSCRT,MTRSEG        ;CALL ROM MONITOR ROUTINE
  2055.     POPA
  2056.     RET
  2057.  
  2058.  
  2059.  
  2060.  
  2061. ;*    PUTKEY - PUT DATA BYTE INTO TYPE-AHEAD BUFFER
  2062. ;
  2063. ;    ENTRY:    (AL)=CHARACTER
  2064. ;        (CS)=CODE SEGMENT VALUE
  2065. ;    EXIT:    NONE
  2066. ;    USES:    (AL)
  2067. ;
  2068. ;    THIS ROUTINE IS CALLED BY THE ROM MONITOR AT INTERRUPT TIME
  2069.  
  2070. PUTKEY:
  2071.     PUSH    BX
  2072.  
  2073.     CMP    CS:KEYCNT,KEYBUFL    ;Q. BUFFER FULL
  2074.     JB    PUTKEY2            ; BR IF NOT
  2075.  
  2076. PUTKEY1:
  2077.     IN    AL,ZKEYBDS        ;SEND BEEP TO INDICATE BUFFER FULL
  2078.     TEST    AL,ZKEYIBF
  2079.     JNZ    PUTKEY1
  2080.     MOV    AL,ZKEYBEP
  2081.     OUT    ZKEYBDC,AL
  2082.     JMPS    PUTKEY4
  2083.  
  2084. PUTKEY2:
  2085.     MOV    BX,CS:KEYPUT        ;GET PUT POINTER
  2086.     MOV    CS:[BX],AL        ;PUT CHARACTER INTO BUFFER
  2087.     INC    CS:KEYCNT        ;BUMP CHARACTER COUNTER
  2088.     INC    BX            ;BUMP PUT POINTER
  2089.     CMP    BX,OFFSET KEYBUF + KEYBUFL    ;Q. TIME TO WRAP POINTER
  2090.     JB    PUTKEY3                ; BR IF NOT
  2091.     LEA    BX,CS:KEYBUF            ;  WRAP POINTER TO BEGINNING
  2092. PUTKEY3:
  2093.     MOV    CS:KEYPUT,BX        ;SAVE UPDATED PUT POINTER
  2094.  
  2095. PUTKEY4:
  2096.     POP    BX
  2097.     RETF
  2098.  
  2099.  
  2100.  
  2101.  
  2102.  
  2103. ;**    SERIAL PORT A DEVICE DRIVER
  2104. ;
  2105.  
  2106. ;*    INSERA - INITIALIZATION
  2107. ;
  2108. ;    ENTRY:    NONE
  2109. ;    EXIT:    NONE
  2110. ;    USES:    BX
  2111. ;
  2112.  
  2113. INSERA:
  2114.     PUSHF                ;INSURE INTERRUPTS ARE DISABLED
  2115.     CLI                ; DURING INIT
  2116.  
  2117.     LEA    BX,SERATBL        ;GET ADDRESS OF CIO ENTRY
  2118.     ADD    BX,BBIOS
  2119.     CALL    CLRCIO            ;CLEAR CIO TABLE FLAGS
  2120.     MOV    CIOIN[BX],OFFSET INSERA    ;ADDRESS OF INIT ROUTINE
  2121.     MOV    CIOIS[BX],OFFSET IS2661    ;ADDRESS OF INPUT INPUT STATUS ROUTINE
  2122.     MOV    CIOID[BX],OFFSET ID2661    ;ADDRESS OF INPUT DATA ROUTINE
  2123.     MOV    CIOOS[BX],OFFSET IS2661    ;ADDRESS OF INPUT OUTPUT STATUS ROUTINE
  2124.     MOV    CIOOD[BX],OFFSET OD2661    ;ADDRESS OF OUTPUT DATA ROUTINE
  2125.     CALL    IN2661            ;CALL DEVICE INIT ROUTINE
  2126.  
  2127.     POPF                ;RESTORE INTERRUPT STATUS
  2128.     RET
  2129.  
  2130.  
  2131.  
  2132.  
  2133.  
  2134. ;**    SERIAL PORT B DEVICE DRIVER
  2135. ;
  2136.  
  2137. ;*    INSERB - INITIALIZATION
  2138. ;
  2139. ;    ENTRY:    NONE
  2140. ;    EXIT:    NONE
  2141. ;    USES:    BX
  2142. ;
  2143.  
  2144. INSERB:
  2145.     PUSHF                ;INSURE INTERRUPTS ARE DISABLED
  2146.     CLI                ; DURING INIT
  2147.  
  2148.     LEA    BX,SERBTBL        ;GET ADDRESS OF CIO ENTRY
  2149.     ADD    BX,BBIOS
  2150.     CALL    CLRCIO            ;CLEAR CIO TABLE FLAGS
  2151.     MOV    CIOIN[BX],OFFSET INSERB    ;ADDRESS OF INIT ROUTINE
  2152.     MOV    CIOIS[BX],OFFSET IS2661    ;ADDRESS OF INPUT INPUT STATUS ROUTINE
  2153.     MOV    CIOID[BX],OFFSET ID2661    ;ADDRESS OF INPUT DATA ROUTINE
  2154.     MOV    CIOOS[BX],OFFSET IS2661    ;ADDRESS OF INPUT OUTPUT STATUS ROUTINE
  2155.     MOV    CIOOD[BX],OFFSET OD2661    ;ADDRESS OF OUTPUT DATA ROUTINE
  2156.     CALL    IN2661            ;CALL DEVICE INIT ROUTINE
  2157.  
  2158.     POPF                ;RESTORE INTERRUPT STATUS
  2159.     RET
  2160.  
  2161.  
  2162.  
  2163.  
  2164.  
  2165. ;**    2661 COMMON DEVICE DRIVER ROUTINES
  2166. ;
  2167.  
  2168. ;*    IS2661 - INPUT INPUT/OUTPUT STATUS BYTE
  2169. ;
  2170. ;    ENTRY:    (BX)=ADDRESS OF CIO ENTRY
  2171. ;    EXIT:    (AL)=STATUS BYTE
  2172. ;    USES:    AL,DX
  2173. ;
  2174.  
  2175. IS2661:
  2176.     XOR    DH,DH            ;GET STATUS PORT #
  2177.     MOV    DL,CIOBP[BX]
  2178.     ADD    DX,EPSTAT
  2179.     IN    AL,DX            ;GET STATUS
  2180.     RET
  2181.  
  2182.  
  2183.  
  2184.  
  2185. ;*    ID2661 - INPUT DATA BYTE
  2186. ;
  2187. ;    ENTRY:    (BX)=ADDRESS OF CIO ENTRY
  2188. ;    EXIT:    (AL)=DATA BYTE
  2189. ;    USES:    AL,DX
  2190. ;
  2191.  
  2192. ID2661:
  2193.     XOR    DH,DH            ;GET DATA PORT #
  2194.     MOV    DL,CIOBP[BX]
  2195.     ADD    DX,EPDATA
  2196.     IN    AL,DX            ;INPUT DATA
  2197.     RET
  2198.  
  2199.  
  2200.  
  2201.  
  2202. ;*    OD2661 - OUTPUT DATA BYTE
  2203. ;
  2204. ;    ENTRY:    (AL)=DATA BYTE
  2205. ;        (BX)=ADDRESS OF CIO ENTRY
  2206. ;    EXIT:    NONE
  2207. ;    USES:    DX
  2208. ;
  2209.  
  2210. OD2661:
  2211.     XOR    DH,DH            ;GET DATA PORT #
  2212.     MOV    DL,CIOBP[BX]
  2213.     ADD    DX,EPDATA
  2214.     OUT    DX,AL            ;OUTPUT DATA
  2215.     RET
  2216.  
  2217.  
  2218.  
  2219.  
  2220. ;*    IN2661 - INITIALIZE
  2221. ;
  2222. ;    ENTRY:    (BX)=ADDRESS OF CIO ENTRY
  2223. ;    EXIT:    NONE
  2224. ;    USES:    AL,DX
  2225. ;
  2226.  
  2227. IN2661:
  2228.     PUSH    CX
  2229.     XOR    CH,CH            ;GET BASE PORT #
  2230.     MOV    CL,CIOBP[BX]
  2231.     XOR    AL,AL            ;SHUT DOWN 2661
  2232.     MOV    DX,EPCMD
  2233.     ADD    DX,CX
  2234.     OUT    DX,AL
  2235.     IN    AL,DX            ;RESET MODE REGISTER POINTER
  2236.     MOV    AL,CIOVAL1[BX]        ;SET MODE REGISTER 1
  2237.     MOV    DX,EPMODE
  2238.     ADD    DX,CX
  2239.     OUT    DX,AL
  2240.     MOV    AL,CIOVAL2[BX]        ;SET MODE REGISTER 2
  2241.     OR    AL,BYTE PTR CIOBR[BX]
  2242.     OUT    DX,AL
  2243.     MOV    AL,CIOVAL3[BX]        ;SET COMMAND REGISTER
  2244.     MOV    DX,EPCMD
  2245.     ADD    DX,CX
  2246.     OUT    DX,AL
  2247.     MOV    DX,EPDATA        ;FLUSH INPUT BUFFER
  2248.     ADD    DX,CX
  2249.     IN    AL,DX
  2250.     IN    AL,DX
  2251.     POP    CX
  2252.     RET
  2253.  
  2254.  
  2255.  
  2256.  
  2257. ;**    PARALLEL PRINTER DRIVER
  2258. ;
  2259.  
  2260. ;*    INPPRT - INITIALIZE PARALLEL PRINTER PORT
  2261. ;
  2262. ;    ENTRY:    NONE
  2263. ;    EXIT:    NONE
  2264. ;    USES:    AL,BX
  2265. ;
  2266.  
  2267. INPPRT:
  2268.     PUSHF                ;INSURE INTERRUPTS ARE DISABLED
  2269.     CLI                ; DURING INIT
  2270.  
  2271.     LEA    BX,PPRTTBL        ;GET ADDRESS OF CIO ENTRY
  2272.     ADD    BX,BBIOS
  2273.     CALL    CLRCIO            ;CLEAR CIO TABLE FLAGS
  2274.     MOV    CIOIN[BX],OFFSET INPPRT ;ADDR OF INIT ROUTINE
  2275.     MOV    CIOIS[BX],OFFSET DUMMY    ;ADDR OF INPUT INPUT STATUS ROUTINE
  2276.     MOV    CIOID[BX],OFFSET IDDUMMY ;ADDR OF INPUT DATA ROUTINE
  2277.     MOV    CIOOS[BX],OFFSET OSPPRT    ;ADDR OF INPUT OUTPUT STATUS ROUTINE
  2278.     MOV    CIOOD[BX],OFFSET ODPPRT    ;ADDR OF OUTPUT DATA ROUTINE
  2279.  
  2280. ;    DO PORT A FIRST
  2281.  
  2282.     XOR    AL,AL            ;ACCESS DATA DIRECTION REG
  2283.     OUT    GDPCTLA,AL
  2284.     OUT    GDPDDRA,AL        ;SET ALL BITS AS INPUTS
  2285.     MOV    AL,PIADDAC        ;ACCESS PERIPHERAL DATA REG
  2286.     OUT    GDPCTLA,AL
  2287.     MOV    AL,CIOVAL1[BX]        ;SET OUTPUT LATCHES
  2288.     OUT    GDPDATA,AL
  2289.     XOR    AL,AL            ;ACCESS DATA DIRECTION REG
  2290.     OUT    GDPCTLA,AL
  2291.     MOV    AL,CIOVAL2[BX]        ;SET DATA DIRECTION REG
  2292.     OUT    GDPDDRA,AL
  2293.     MOV    AL,CIOVAL3[BX]        ;SET CONTROL PORT VALUE
  2294.     OUT    GDPCTLA,AL
  2295.  
  2296.     IN    AL,GDPDATA        ;CLEAR ANY PENDING INTERRUPTS
  2297.     IN    AL,ZDIPSW        ;FIRE E-CLOCK
  2298.  
  2299.     MOV    AL,CIOVAL1[BX]        ;CLEAR LPEN & VSYNC STROBE FLIP-FLOPS
  2300.     AND    AL,NOT (LPENSE+VSYNCE)
  2301.     OUT    GDPDATA,AL
  2302.     OR    AL,LPENSE+VSYNCE
  2303.     OUT    GDPDATA,AL
  2304.  
  2305. ;    DO PORT B NEXT
  2306.  
  2307.     XOR    AL,AL            ;ACCESS DATA DIRECTION REG
  2308.     OUT    GDPCTLB,AL
  2309.     OUT    GDPDDRB,AL        ;SET ALL BITS AS INPUTS
  2310.     MOV    AL,PIADDAC        ;ACCESS PERIPHERAL DATA REG
  2311.     OUT    GDPCTLB,AL
  2312.     MOV    AL,CIOVAL4[BX]        ;SET OUTPUT LATCHES
  2313.     OUT    GDPDATB,AL
  2314.     XOR    AL,AL            ;ACCESS DATA DIRECTION REG
  2315.     OUT    GDPCTLB,AL
  2316.     MOV    AL,CIOVAL5[BX]        ;SET DATA DIRECTION REG
  2317.     OUT    GDPDDRB,AL
  2318.     MOV    AL,CIOVAL6[BX]        ;SET CONTROL PORT VALUE
  2319.     OUT    GDPCTLB,AL
  2320.  
  2321.     IN    AL,GDPDATB        ;CLEAR ANY PENDING INTERRUPTS
  2322.     IN    AL,ZDIPSW        ;FIRE E-CLOCK
  2323.  
  2324.     POPF                ;RESTORE INTERRUPT STATUS
  2325.     RET
  2326.  
  2327.  
  2328.  
  2329.  
  2330. ;*    OSPPRT - INPUT OUTPUT STATUS BYTE
  2331. ;
  2332. ;    ENTRY:    (BX)=ADDRESS OF CIO TABLE ENTRY
  2333. ;    EXIT:    (AL)=STATUS BYTE
  2334. ;    USES:    AL
  2335. ;
  2336.  
  2337. OSPPRT:
  2338.     IN    AL,GDPDATB        ;INPUT STATUS
  2339.     RET
  2340.  
  2341.  
  2342.  
  2343. ;*    ODPPRT - OUTPUT DATA BYTE
  2344. ;
  2345. ;    ENTRY:    (AL)=DATA
  2346. ;        (BX)=ADDRESS OF CIO TABLE ENTRY
  2347. ;    EXIT:    NONE
  2348. ;    USES:    AH
  2349. ;
  2350.  
  2351. ODPPRT:
  2352.     PUSHF                ;DISABLE INTERRUPTS WHILE PLAYING
  2353.     CLI                ; WITH PORTS
  2354.  
  2355.     MOV    AH,AL            ;SAVE (AL)
  2356.  
  2357.     OUT    GDPDATB,AL        ;PLACE PORT B DATA IN OUTPUT LATCH
  2358.  
  2359.     AND    AL,PPRTM10        ;MASK FOR PORT A DATA
  2360.     OR    AL,CIOVAL1[BX]        ;OR IN NON-ASSERTED VALUES FOR OTHER
  2361.                     ; PORT A OUTPUT BITS
  2362.     OUT    GDPDATA,AL        ;PLACE PORT A DATA IN OUTPUT LATCH
  2363.  
  2364.     AND    AL,0FFH-PPRTSTB        ;GENERATE STROBE
  2365.     OUT    GDPDATA,AL
  2366.     OR    AL,PPRTSTB
  2367.     OUT    GDPDATA,AL
  2368.  
  2369.     MOV    AL,AH            ;RESTORE (AL)
  2370.  
  2371.     POPF                ;RESTORE INTERRUPT STATUS
  2372.  
  2373.     RET
  2374.  
  2375.  
  2376.  
  2377.  
  2378.  
  2379. ;**    DUMMY DEVICE DRIVER
  2380. ;
  2381.  
  2382.  
  2383. ;*    INDUMMY - INITIALIZATION
  2384. ;
  2385. ;    ENTRY:    NONE
  2386. ;    EXIT:    NONE
  2387. ;    USES:    BX
  2388. ;
  2389.  
  2390. INDUMMY:
  2391.     LEA    BX,DUMMYTBL        ;GET ADDRESS OF CIO TABLE ENTRY
  2392.     ADD    BX,BBIOS
  2393.     CALL    CLRCIO            ;CLEAR CIO TABLE FLAGS
  2394.     MOV    CIOIN[BX],OFFSET INDUMMY ;ADDRESS OF INIT ROUTINE
  2395.     MOV    CIOIS[BX],OFFSET DUMMY    ;ADDRESS OF INPUT INPUT STATUS BYTE
  2396.     MOV    CIOID[BX],OFFSET IDDUMMY ;ADDRESS OF INPUT DATA ROUTINE
  2397.     MOV    CIOOS[BX],OFFSET DUMMY    ;ADDRESS OF INPUT OUTPUT STATUS BYTE
  2398.     MOV    CIOOD[BX],OFFSET DUMMY    ;ADDRESS OF OUTPUT DATA ROUTINE
  2399.     RET
  2400.  
  2401.  
  2402.  
  2403.  
  2404.  
  2405. ;*    DUMMY - DUMMY I/O (NOP)
  2406. ;
  2407. ;    ENTRY:    NONE
  2408. ;    EXIT:    (AL)=STATUS BYTE
  2409. ;    USES:    AL
  2410. ;
  2411.  
  2412. DUMMY:
  2413.     RET                ;NOP
  2414.  
  2415.  
  2416.  
  2417.  
  2418. ;*    IDDUMMY - INPUT DATA BYTE
  2419. ;
  2420. ;    ENTRY:    NONE
  2421. ;    EXIT:    (AL)=DATA BYTE
  2422. ;    USES:    AL
  2423. ;
  2424.  
  2425. IDDUMMY:
  2426.     MOV    AL,CPMEOF        ;ALWAYS CP/M ASCII END-OF-FILE
  2427.     RET
  2428.  
  2429.     EJECT
  2430. ;***    INTERRUPT HANDLERS
  2431. ;
  2432.  
  2433. ;**    INTDIV0 - DIVIDE BY 0
  2434. ;
  2435.  
  2436. INTDIV0:
  2437.     PUSHA
  2438.     LEA    SI,DIV0MSG        ;PRINT MESSAGE AND DUMP
  2439.     CALL    PMSG
  2440.     POPA
  2441.     JMP    SYSDMP
  2442.  
  2443.  
  2444.  
  2445.  
  2446. ;**    INTPBE - PARITY OR BUSS ERROR HANDLER
  2447. ;
  2448.  
  2449. INTPBE:
  2450.     PUSHA
  2451.     LEA    SI,PBEMSG        ;PRINT MESSAGE AND DUMP
  2452.     CALL    PMSG
  2453.     POPA
  2454.     JMP    SYSDMP
  2455.  
  2456.  
  2457.  
  2458. ;**    INTLVK - LIGHTPEN, VSYNC, & KEYBOARD HANDLER
  2459. ;
  2460.  
  2461. INTLVK:
  2462.     PUSHA
  2463.  
  2464.     IN    AL,GDPCTLA        ;Q. INTERRUPT FROM PIA
  2465.     TEST    AL,LPENSI+VSYNCI
  2466.     JZ    INTKEY            ; BR IF NOT
  2467.     MOV    AH,AL            ;SAVE STATUS
  2468.  
  2469. ;*    LIGHTPEN HANDLER
  2470.  
  2471.     TEST    AH,LPENSI        ;Q. LIGHTPEN STROBE INTERRUPT
  2472.     JZ    INTV            ; BR IF NOT
  2473.  
  2474.     ;NO LIGHT PEN HANDLER AT THIS TIME
  2475.  
  2476. ;*    VSYNC HANDLER
  2477.  
  2478. INTV:
  2479.     TEST    AH,VSYNCI        ;Q. VSYNC INTERRUPT
  2480.     JZ    INTV1            ; BR IF NOT
  2481.  
  2482.     IN    AL,GDPDATA        ;CLEAR INTERRUPT AND GET DATA
  2483.     TEST    AL,VSYNC        ;Q. VSYNC STILL PRESENT
  2484.     JZ    INTV1            ; BR IF NOT
  2485.  
  2486.     CALLFI    MTRTINT,MTRSEG        ;CALLF ROM MONITOR ROUTINE
  2487.  
  2488. ;    CLEAR LIGHTPEN STROBE / VERTICAL SYNC INTERRUPTS AND RE-ARM FLIP-FLOPS
  2489.  
  2490. INTV1:
  2491.     IN    AL,GDPDATA        ;READ PIA DATA
  2492.     AND    AL,NOT (LPENSE+VSYNCE)    ;CLEAR LIGHTPEN / VSYNC FLIP-FLOPS
  2493.     OUT    GDPDATA,AL
  2494.     IN    AL,ZDIPSW        ;DUMMY I/O TO FIRE E-CLOCK
  2495.     IN    AL,GDPDATA        ;ENABLE LIGHTPEN / VSYNC FLIP-FLOPS
  2496.     OR    AL,LPENSE+VSYNCE
  2497.     OUT    GDPDATA,AL
  2498.  
  2499. ;*    INTKEY - KEYBOARD HANDLER
  2500.  
  2501. INTKEY:
  2502.     MOV    AX,CS            ;GET DS
  2503.     MOV    DS,AX
  2504.  
  2505.     IN    AL,ZKEYBDS        ;GET STATUS BYTE
  2506.     TEST    AL,ZKEYOBF        ;Q. CHARACTER AVAILABLE
  2507.     JZ    INTKEY3            ; BR IF NOT
  2508.  
  2509.     IN    AL,ZKEYBDD        ;INPUT CHARACTER
  2510.  
  2511.     CMP    KEYCNT,KEYBUFF        ;Q. KEY BUFFER ALREADY FULL
  2512.     JB    INTKEY2            ; BR IF NOT FULL
  2513.  
  2514. INTKEY1:
  2515.     IN    AL,ZKEYBDS        ;BUFFER FULL, SEND BEEP
  2516.     TEST    AL,ZKEYIBF
  2517.     JNZ    INTKEY1
  2518.     MOV    AL,ZKEYBEP
  2519.     OUT    ZKEYBDC,AL
  2520.     JMPS    INTKEY3
  2521.  
  2522. INTKEY2:
  2523.     CALLFI    MTRDKBD,MTRSEG        ;PASS CHARACTER TO ROM MONITOR HANDLER
  2524.  
  2525. INTKEY3:
  2526.     POPA
  2527.     JMP    INTX2            ;EXIT VIA COMMON IRET EXIT
  2528.  
  2529.  
  2530.  
  2531.  
  2532. ;**    INTSWAP - SWAP TO 8085 PROCESSOR
  2533. ;
  2534.  
  2535. INTSWAP:
  2536.     MOV    COMWHO,ZPSPPS5+ZPSPI88    ;INDICATE 8085 WILL GET CONTROL
  2537.     JMP    INTX3            ;GOTO TO INTERRUPT EXIT ROUTINE
  2538.  
  2539.  
  2540.  
  2541.  
  2542. ;**    INTWILD - WILD INTERRUPT
  2543. ;
  2544.  
  2545. INTWILD:
  2546.     PUSHA
  2547.     LEA    SI,WILDMSG        ;PRINT MESSAGE AND DUMP
  2548.     CALL    PMSG
  2549.     POPA
  2550.     JMP    SYSDMP
  2551.  
  2552.  
  2553.  
  2554.  
  2555. ;**    SYSDMP - DUMP REGISTERS AT INTERRUPT
  2556. ;
  2557.  
  2558. SYSDMP:
  2559.     PUSH    DI
  2560.  
  2561.     LEA    DI,DMPAX        ;AX
  2562.     CALL    HEXW
  2563.  
  2564.     POP    AX            ;DI
  2565.     LEA    DI,DMPDI
  2566.     CALL    HEXW
  2567.  
  2568.     POP    AX            ;PC
  2569.     LEA    DI,DMPIP
  2570.     CALL    HEXW
  2571.  
  2572.     POP    AX            ;CS
  2573.     LEA    DI,DMPCS
  2574.     CALL    HEXW
  2575.  
  2576.     POP    AX            ;FLAGS
  2577.     LEA    DI,DMPFLG
  2578.     CALL    HEXW
  2579.  
  2580.     MOV    AX,DS            ;DS
  2581.     LEA    DI,DMPDS
  2582.     CALL    HEXW
  2583.  
  2584.     MOV    AX,ES            ;ES
  2585.     LEA    DI,DMPES
  2586.     CALL    HEXW
  2587.  
  2588.     MOV    AX,SS            ;SS
  2589.     LEA    DI,DMPSS
  2590.     CALL    HEXW
  2591.  
  2592.     MOV    AX,SP            ;SP
  2593.     LEA    DI,DMPSP
  2594.     CALL    HEXW
  2595.  
  2596.     MOV    AX,BX            ;BX
  2597.     LEA    DI,DMPBX
  2598.     CALL    HEXW
  2599.  
  2600.     MOV    AX,CX            ;CX
  2601.     LEA    DI,DMPCX
  2602.     CALL    HEXW
  2603.  
  2604.     MOV    AX,DX            ;DX
  2605.     LEA    DI,DMPDX
  2606.     CALL    HEXW
  2607.  
  2608.     MOV    AX,SI            ;SI
  2609.     LEA    DI,DMPSI
  2610.     CALL    HEXW
  2611.  
  2612.     MOV    AX,BP            ;BP
  2613.     LEA    DI,DMPBP
  2614.     CALL    HEXW
  2615.  
  2616.     LEA    SI,DMPMSG        ;PRINT DUMP
  2617.     CALL    PMSG
  2618.  
  2619.  
  2620.  
  2621.  
  2622. ;**    HALT SYSTEM
  2623. ;
  2624.  
  2625. SYSHLT:
  2626.     LEA    SI,HLTMSG        ;PRINT MESSAGE
  2627.     CALL    PMSG
  2628.  
  2629.     CALLFI    MTRTINT,MTRSEG        ;CALLF ROM MONITOR TO INSURE SCROLLING
  2630.  
  2631.     CLI                ;INSURE MACHINE HALTS
  2632.     HLT
  2633.  
  2634.  
  2635.  
  2636.  
  2637. ;**    INTX - INTERRUPT EXIT ROUTINES
  2638. ;
  2639. ;    INTX1 - ENTERED WHEN HARDWARE SLAVE INTERRUPT
  2640. ;    INTX2 - ENTERED WHEN HARDWARE MASTER INTERRUPT
  2641. ;    INTX3 - ENTERED WHEN SOFTWARE INTERRUPT
  2642. ;
  2643.  
  2644. ;    EXIT FOR HARDWARE SLAVE INTERRUPT
  2645.  
  2646. INTX1:
  2647.     PUSH    AX
  2648.     MOV    AL,OCW2OP+OCW2EOI    ;ISSUE NON-SPECIFIC EOI
  2649.     OUT    Z8259AS+OCW2,AL
  2650.     MOV    AL,OCW3OP+OCW3RIS    ;READ ISR
  2651.     OUT    Z8259AS+OCW3,AL
  2652.     IN    AL,Z8259AS+OCW3
  2653.     TEST    AL,AL            ;Q. ANY OTHER SLAVE INT'S IN SERVICE
  2654.     POP    AX
  2655.     JNZ    INTX3            ; BR IF YES - SKIP EOI TO MASTER
  2656.  
  2657. ;    EXIT FOR HARDWARE MASTER INTERRUPT
  2658.  
  2659. INTX2:
  2660.     PUSH    AX
  2661.     MOV    AL,OCW2OP+OCW2EOI    ;ISSUE NON-SPECIFIC EOI
  2662.     OUT    Z8259AM+OCW2,AL
  2663.     POP    AX
  2664.  
  2665. ;    EXIT FOR SOFTWARE INTERRUPTS
  2666.  
  2667. INTX3:
  2668.     PUSH    BP
  2669.     PUSH    ES
  2670.     MOV    ES,CS:BANK1
  2671.     CMP    COMWHO,ZPSPPS8        ;8088 PROCESSOR SHOULD GET CONTROL
  2672.     JE    INTIRET            ; BR IF YES
  2673.  
  2674.     MOV    BP,SP            ;MODIFY RETURN ADDRESS
  2675.     MOV    4[BP],OFFSET SWAP85    ; TO GOTO SWAP OUTPUT
  2676.     MOV    6[BP],CS        ;  INSTRUCTION
  2677.     MOV    AL,COMWHO        ;FETCH SWAP OUTPUT DATA VALUE
  2678.  
  2679. ;
  2680.  
  2681. INTIRET:
  2682.     POP    ES
  2683.     POP    BP
  2684.     IRET                ;DO RETURN FROM INTERRUPT
  2685.  
  2686.     EJECT
  2687. ;***    SUBROUTINES
  2688. ;
  2689.  
  2690. ;**    ABTIGN - HANDLE ABORT/IGNORE ALTERNATIVE FOR HARD DISK ERRORS
  2691. ;
  2692. ;    ENTRY:    (BX)=ADDRESS OF BUFFER HEADER
  2693. ;        'PHYSEC'=PHYSICAL SECTOR #
  2694. ;    EXIT:    'BUFERR[BX]'=ABORT STATUS   (0=NO , 1=YES)
  2695. ;    USES:    AX,SI,DI
  2696. ;
  2697.  
  2698. ABTIGN:
  2699.     TEST    DSKOP,DSKOPS        ;Q. ERROR DURING 1ST TIME SELECT
  2700.     JNZ    ABTIGN2            ; BR IF YES
  2701.  
  2702.     MOV    BUFERR[BX],0        ;ASSUME NO ERROR
  2703.  
  2704.     MOV    DI,BUFERRF[BX]        ;GET ERROR STATUS BYTE
  2705.     ADD    DI,PHYSEC
  2706.     MOV    AL,[DI]
  2707.     CMP    AL,0            ;Q. ERROR
  2708.     JE    ABTIGN2            ; BR IF NO ERROR
  2709.  
  2710.     PUSH    BX
  2711.     PUSH    DI
  2712.  
  2713.     CALL    ERRRPT            ;REPORT ERROR
  2714.     LEA    SI,AIMSG
  2715.     CALL    PMSG
  2716.     CALL    GETCHR            ;GET RESPONSE
  2717.  
  2718.     PUSH    AX
  2719.     LEA    SI,CRLF
  2720.     CALL    PMSG
  2721.     POP    AX
  2722.  
  2723.     POP    DI
  2724.     POP    BX
  2725.  
  2726.     CMP    AL,CTLC            ;Q. ABORT RESPONSE
  2727.     JNE    ABTIGN1            ; BR IF NO
  2728.  
  2729.     MOV    BUFERR[BX],1            ;INDICATE ABORT
  2730.     JMPS    ABTIGN2
  2731.  
  2732. ABTIGN1:
  2733.     MOV    BYTE PTR [DI],0        ;INDICATE IGNORE ERROR
  2734.  
  2735. ABTIGN2:
  2736.     RET
  2737.  
  2738.  
  2739.  
  2740.  
  2741. ;**    ALTCHR -- HANDLE ALTERNATE CHARACTER FONTS
  2742. ;
  2743. ;    ENTRY:
  2744. ;    EXIT:    NONE
  2745. ;    USES:    ALL
  2746. ;
  2747.  
  2748. ALTCHR:
  2749.     CMP    BBIOS-2,0        ;Q. ALTERNATE CHARACTER SET REQUESTED
  2750. ;    JE    ALTCHR9            ; BR IF NOT
  2751.     JNE    $+5
  2752.     JMP    ALTCHR9
  2753.  
  2754.     PUSH    DS
  2755.     MOV    DS,.MTRDSEG        ;DS=>MONITOR DATA AREA
  2756.  
  2757.     CMP    MTRFNTL,ALTFNTL        ;Q. WILL ROM FONT TABLE FIT IN MY AREA
  2758.     JBE    ALTCHR1            ; BR IF YES
  2759.  
  2760.     POP    DS
  2761.     LEA    SI,FNTMSG        ;PRINT ERROR MESSAGE
  2762.     CALL    PMSG
  2763.     JMP    SYSHLT
  2764.  
  2765. ;    MOVE ROM FONT TABLE TO MY AREA
  2766.  
  2767. ALTCHR1:
  2768.     CLD
  2769.     LEA    DI,ALTFNT
  2770.     MOV    CX,MTRFNTL
  2771.     MOV    SI,MTRFONT
  2772.     MOV    AX,MTRFONT+2
  2773.     POP    DS            ;DS=>BIOS
  2774.     PUSH    ES
  2775.     MOV    ES,AX            ;ES=>ROM FONT TABLE
  2776.     CALL    EXDSES            ;DS=>ROM FONT TABLE , ES=>BIOS
  2777.     REP    MOVSB
  2778.     CALL    EXDSES            ;DS=>BIOS , ES=>ROM FONT TABLE
  2779.  
  2780. ;    MAKE CHANGES TO KEYBOARD MAP
  2781.  
  2782.     POP    ES            ;ES=>8085 BANK
  2783.     MOV    SI,BBIOS-2
  2784.     PUSH    ES
  2785.     MOV    ES,.MTRDSEG        ;ES=>MONITOR DATA AREA
  2786.  
  2787. ALTCHR2:
  2788.     LODSW
  2789.     CMP    AX,0FFFFH
  2790.     JE    ALTCHR3
  2791.     MOV    DI,AX
  2792.     AND    DI,0FFH
  2793.     MOV    ES: MTRKMAP[DI],AH
  2794.     JMPS    ALTCHR2
  2795.  
  2796. ;    MAKE CHANGES TO FONT TABLE
  2797.  
  2798. ALTCHR3:
  2799.     MOV    AX,DS
  2800.     MOV    ES,AX            ;ES=>BIOS
  2801.  
  2802. ALTCHR4:
  2803.     LODSB
  2804.     CMP    AL,0FFH
  2805.     JE    ALTCHR5
  2806.     MOV    AH,9
  2807.     MUL    AH
  2808.     LEA    DI,ALTFNT
  2809.     ADD    DI,AX
  2810.     MOV    CX,9
  2811.     REP    MOVSB
  2812.     JMPS    ALTCHR4
  2813.  
  2814. ;    MAKE CHANGES TO DISPLAY MAP
  2815.  
  2816. ALTCHR5:
  2817.     MOV    ES,.MTRDSEG        ;ES=>MONITOR DATA AREA
  2818.  
  2819. ALTCHR6:
  2820.     LODSW
  2821.     CMP    AX,0FFFFH
  2822.     JE    ALTCHR7
  2823.     MOV    DI,AX
  2824.     AND    DI,0FFH
  2825.     MOV    ES: MTRDMAP[DI],AH
  2826.     JMPS    ALTCHR6
  2827.  
  2828. ;
  2829.  
  2830. ALTCHR7:
  2831.     MOV    ES: MTRFONT,OFFSET ALTFNT
  2832.     MOV    ES: MTRFONT+2,DS    ;UPDATE FONT TABLE VECTOR
  2833.  
  2834.     POP    ES            ;ES=>8085 BANK
  2835.  
  2836. ALTCHR9:
  2837.     RET
  2838.  
  2839.  
  2840.  
  2841.  
  2842. ;**    CBTFIL - FILL THE LOGICAL TO PHYSICAL MAPPING TABLE FOR REAL DRIVES.
  2843. ;             THEN DO THE SAME FOR THE IMAGINARY DRIVES PLUS SET UP THE
  2844. ;             IMAGINARY'S LINK TO HIS CORRESPONDING REAL DRIVE.
  2845. ;
  2846. ;    ENTRY:    (CH)=# DRIVES
  2847. ;        (CL)=STARTING UNIT #
  2848. ;        (DH)=STARTING DRIVE MAP #
  2849. ;        'CBIC'=NEXT LOGICAL DRIVE # TO BE ASSIGNED
  2850. ;    EXIT:    'CBIC' UPDATED
  2851. ;    USES:    ALL
  2852. ;
  2853.  
  2854. CBTFIL:
  2855.     MOV    CBTIA,0            ;INIT CBTIA
  2856.  
  2857. CBTFIL1:
  2858.     PUSH    CX
  2859.     PUSH    DX
  2860.  
  2861.     MOV    CBTFA,0            ;INDICATE REAL DRIVE CYCLE
  2862.     CALL    CBTF            ;HANDLE REAL DRIVES
  2863.  
  2864.     POP    DX
  2865.     POP    CX
  2866.  
  2867.     MOV    CBTFA,1            ;INDICATE IMAGINARY CYCLE
  2868.  
  2869. ;*    THIS SECTION OF CODE IS RAN THROUGH TWICE.
  2870. ;    FIRST TIME IS FOR HANDLING THE REAL DRIVES.
  2871. ;    SECOND TIME IS FOR HANDLING THE IMAGINARY DRIVES.
  2872.  
  2873. CBTF:
  2874.     MOV    DL,CH            ;COPY # OF DRIVES
  2875.  
  2876. CBTF1:
  2877.     MOV    AL,CL            ;GET THIS DRIVES NUMBER MOD (# DRIVES)
  2878.     CBW
  2879.     DIV    CH
  2880.     ADD    AH,DH            ;COMPUTE DISK ENTRY TABLE TO USE
  2881.     MOV    CBIB,AH
  2882.  
  2883.     PUSH    CX
  2884.  
  2885.     MOV    AL,DPEL            ;GET ADDRESS OF TABLE ENTRY
  2886.     MUL    AH
  2887.     ADD    AX,OFFSET DPEBASE
  2888.     ADD    AX,BBIOS
  2889.     MOV    BP,AX
  2890.  
  2891.     TEST    DPEFLG2[BP],DPEIMG    ;Q. IMAGINARY DRIVE
  2892.     JNZ    CBTF3            ; BR IF YES
  2893.  
  2894. ;    HANDLE REAL DRIVE IS THIS IS REAL DRIVE CYCLE
  2895.  
  2896.     CMP    CBTFA,0            ;Q. REAL DRIVE CYCLE
  2897.     JNE    CBTF4            ; BR IF NOT
  2898.  
  2899.     CMP    CBTIA,0            ;IF THIS IS 1ST REAL DRIVE ENCOUNTERED
  2900.     JNE    CBTF25            ; THEN REMEMBER ITS TABLE ADDRESS
  2901.     MOV    CBTIA,BP
  2902.  
  2903. CBTF25:
  2904.     MOV    CH,CBIC
  2905.     MOV    CL,4
  2906.     SHL    CH,CL
  2907.     OR    CH,CBIB
  2908.     MOV    DPELUN[BP],CH        ;PLACE LOGICAL/REAL IN DPELUN SLOT
  2909.  
  2910.     CALL    CBTF6            ;MAP DRIVE
  2911.  
  2912.     JMPS    CBTF4
  2913.  
  2914. ;    HANDLE IMAGINARY DRIVE IF THIS IS THE IMAGINARY DRIVE CYCLE
  2915.  
  2916. CBTF3:
  2917.     CMP    CBTFA,0            ;Q. IMAGINARY DRIVE CYCLE
  2918.     JE    CBTF4            ; BR IF NOT
  2919.  
  2920.     CMP    CBTIA,0            ;Q. ANY REAL DRIVES FOR THIS DRIVE TYPE
  2921.     JNE    CBTF31            ; BR IF YES
  2922.     MOV    DPEFLAG[BP],DPENE    ;  OTHERWISE CHANGE DRIVE TYPE TO
  2923.     MOV    BX,BBIOS        ;   NONEXISTANT DRIVE AND DECREMENT
  2924.     DEC    NDISKS[BX]        ;    # CP/M DRIVES
  2925.     JMPS    CBTF4
  2926.  
  2927. CBTF31:
  2928.     CALL    CBTF6            ;MAP DRIVE
  2929.  
  2930.     MOV    SI,CBTIA        ;MOVE THE REAL DRIVE'S HEATH EXTENSIONS
  2931.     ADD    SI,OFFSET DPEHTH    ; INTO THIS IMAGINARY DRIVE'S TABLES
  2932.     MOV    DI,BP
  2933.     ADD    DI,OFFSET DPEHTH
  2934.     PUSH    CX
  2935.     MOV    CX,DPEHL
  2936.     PUSH    DS
  2937.     MOV    AX,ES
  2938.     MOV    DS,AX
  2939.     REP    MOVSB
  2940.     POP    DS
  2941.     POP    CX
  2942.  
  2943.     OR    DPEFLG2[BP],DPEIMG    ;REMARK AS IMAGINARY DRIVE
  2944.  
  2945.     MOV    CH,CBIC            ;REENTER LOGICAL DRIVE #
  2946.     MOV    CL,4
  2947.     SHL    CH,CL
  2948.     AND    DPELUN[BP],DPEREAL
  2949.     OR    DPELUN[BP],CH
  2950.  
  2951. ;
  2952.  
  2953. CBTF4:
  2954.     POP    CX
  2955.     INC    CL            ;ROUND ROBIN TO NEXT DRIVE
  2956.     DEC    DL            ;COUNT THIS ONE AS DONE
  2957.     JZ    $+5
  2958.     JMP    CBTF1
  2959.  
  2960.     RET
  2961.  
  2962. ;*    PLACE MAPPED DRIVE # INTO MAP DRIVE TABLE
  2963. ;    'CBIB'=MAPPED DRIVE #
  2964.  
  2965. CBTF6:
  2966.     LEA    BX,BDMAP        ;CALCULATE MAP TABLE ENTRY ADDRESS
  2967.     MOV    AL,CBIC
  2968.     CBW
  2969.     ADD    BX,AX
  2970.     MOV    AL,CBIB
  2971.     MOV    ES: [BX],AL        ;PLACE MAPPED DRIVE # THERE
  2972.     INC    CBIC            ;BUMP VALUE NEXT LOGICAL DRIVE #
  2973.     RET
  2974.  
  2975.  
  2976.  
  2977.  
  2978. ;**    CHKLAB - CHECK CHECKSUM OF LABEL
  2979. ;
  2980. ;    ENTRY:    (SI)=ADDRESS OF LABEL
  2981. ;    EXIT:    PSW/Z=STATUS
  2982. ;            0=BAD CHECKSUM , 1=GOOD CHECKSUM
  2983. ;    USES:    AL,CX,SI
  2984. ;
  2985.  
  2986. CHKLAB:
  2987.     XOR    AL,AL            ;ZERO ACCUMULATOR
  2988.     MOV    CX,LABLEN        ;COUNT
  2989.  
  2990. CHKLAB1:
  2991.     ADD    AL,[SI]            ;ADD VALUES
  2992.     INC    SI
  2993.     LOOP    CHKLAB1
  2994.  
  2995.     INC    AL            ;INC CHECKSUM VALUE AND SET/RESET PSW/Z
  2996.  
  2997.     RET
  2998.  
  2999.  
  3000.  
  3001.  
  3002. ;**    CPSEC - CALCULATE PHYSICAL SECTOR
  3003. ;
  3004. ;    ENTRY:    'REQSEC'=REQUESTED CP/M SECTOR #
  3005. ;        (BX)=ADDRESS OF BUFFER HEADER
  3006. ;    EXIT:    (AX),'PHYSEC'=PHYSICAL SECTOR #
  3007. ;    USES:    AX,DI
  3008. ;
  3009.  
  3010. CPSEC:
  3011.     MOV    AX,REQSEC
  3012.     MOV    DI,BUFDPE[BX]
  3013.     CMP    REQTRK,0
  3014.     JNE    CPSEC1
  3015.     TEST    DPEFLAG[DI],DPET0SD
  3016.     JNZ    CPSEC2
  3017. CPSEC1:
  3018.     DIV    DPERPS[DI]
  3019.     CBW
  3020. CPSEC2:
  3021.     MOV    PHYSEC,AX
  3022.     RET
  3023.  
  3024.  
  3025.  
  3026.  
  3027.  
  3028. ;**    DISPATCHER
  3029. ;
  3030.  
  3031. SWAP85:
  3032.     OUT    ZPSP,AL            ;OUTPUT SWAP VALUE TO SWAP PORT
  3033.     JMPS    DISPATCH        ;FLUSH PIPELINE
  3034.  
  3035. DISPATCH:
  3036.     XOR    BH,BH
  3037.     MOV    BL,COMFUNC        ;GET BIOS FUNCTION #
  3038.     CMP    BX,TABLEL        ;CHECK RANGE
  3039.     JA    SWAP851            ; BR IF OUT OF RANGE
  3040.     SHL    BX,1
  3041.     CALL    TABLE[BX]        ;CALL APPROPRIATE HANDLER
  3042.  
  3043. SWAP851:
  3044.     INT    SWISWAP            ;SWAP TO 8085 PROCESSOR
  3045.  
  3046. ;    UNUSED DISPATCH ENTRY
  3047.  
  3048. UNUSED:
  3049.     RET
  3050.  
  3051.  
  3052.  
  3053.  
  3054. ;**    ERRRPT - REPORT DISK ERRORS
  3055. ;
  3056. ;    ENTRY:    (AL)=ERROR STATUS BYTE
  3057. ;        (BX)=ADDRESS OF BUFFER HEADER INFO
  3058. ;        'PHYTRK'=TRACK #
  3059. ;        'PHYSEC'=SECTOR #
  3060. ;        'PHYSID','PHYSIDN'=SIDE INFO
  3061. ;        'LSIO'=FLAG INDICATING LOGICAL SECTOR I/O RATHER THAN
  3062. ;               TRACK/SIDE/SECTOR
  3063. ;    EXIT:    NONE
  3064. ;    USES:    CX,SI,DI
  3065. ;
  3066.  
  3067. ERRRPT:
  3068.     TEST    DSKOP,DSKOPS        ;Q. ERROR DURING 1ST TIME SELECT
  3069. ;    JNZ    ERRRPT4            ; BR IF YES
  3070.     JZ    $+5
  3071.     JMP    ERRRPT4
  3072.  
  3073.     PUSH    AX
  3074.  
  3075.     LEA    DI,ERRMSG6        ;STATUS BYTE
  3076.     CALL    HEXB
  3077.  
  3078.     PUSH    ES            ;'READ' OR 'WRITE' ERROR
  3079.     MOV    AX,DS
  3080.     MOV    ES,AX
  3081.     LEA    SI,RDEMSG
  3082.     TEST    DSKOP,NOT (DSKOPR+DSKOPRA)
  3083.     JZ    ERRRPT1
  3084.     LEA    SI,WREMSG
  3085. ERRRPT1:
  3086.     LEA    DI,ERRMSG1
  3087.     MOV    CX,5
  3088.     CLD
  3089.     REP    MOVSB
  3090.     POP    ES
  3091.  
  3092.     MOV    AL,BUFDRV[BX]        ;DRIVE NAME
  3093.     ADD    AL,'A'
  3094.     MOV    ERRMSG2,AL
  3095.  
  3096.     PUSH    BX            ;PRINT ERROR MSG SO FAR
  3097.     LEA    SI,ERRMSG
  3098.     CALL    PMSG
  3099.     POP    BX
  3100.  
  3101.     CMP    LSIO,1            ;Q. LOGICAL SECTOR I/O DEVICE
  3102.     JE    ERRRPT2A        ; BR IF YES
  3103.  
  3104.     MOV    AX,PHYTRK        ;TRACK #
  3105.     LEA    DI,ERRMSG3
  3106.     CALL    HEXW
  3107.  
  3108.     XOR    AL,AL            ;SIDE #
  3109.     MOV    DI,BUFDPE[BX]
  3110.     TEST    DPEFLAG[DI],DPE2S
  3111.     JZ    ERRRPT2
  3112.     MOV    AL,PHYSIDN
  3113. ERRRPT2:
  3114.     LEA    DI,ERRMSG4
  3115.     CALL    HEXN
  3116.  
  3117.     PUSH    BX            ;AGAIN PRINT ERROR MSG SO FAR
  3118.     LEA    SI,ERRMSG7
  3119.     CALL    PMSG
  3120.     POP    BX
  3121.  
  3122. ERRRPT2A:
  3123.     TEST    DSKOP,DSKOPR+DSKOPW    ;SECTOR #
  3124.     JZ    ERRRPT3
  3125.     MOV    AX,PHYSEC
  3126.     INC    AX
  3127.     CMP    LSIO,1
  3128.     JNE    ERRRPT2B
  3129.     ADD    AX,PHYTRK
  3130.     DEC    AX
  3131. ERRRPT2B:
  3132.     LEA    DI,ERRMSG5
  3133.     CALL    HEXW
  3134.  
  3135.     PUSH    BX            ;AGAIN PRINT ERROR MSG SO FAR
  3136.     LEA    SI,ERRMSG8
  3137.     CALL    PMSG
  3138.     POP    BX
  3139.  
  3140. ERRRPT3:
  3141.     PUSH    BX
  3142.     LEA    SI,CRLF
  3143.     CALL    PMSG
  3144.     POP    BX
  3145.  
  3146.     POP    AX
  3147.  
  3148. ERRRPT4:
  3149.     RET
  3150.  
  3151.  
  3152.  
  3153.  
  3154.  
  3155. ;**    EXDSES -- EXCHANGE DS AND ES
  3156. ;
  3157.  
  3158. EXDSES:
  3159.     PUSH    DS
  3160.     PUSH    ES
  3161.     POP    DS
  3162.     POP    ES
  3163.     RET
  3164.  
  3165.  
  3166.  
  3167.  
  3168. ;**    GETCHR - GET CHARACTER FROM CON: (FLUSHING TYPEAHEAD BUFFER
  3169. ;             BEFORE HAND IF NECESSARY
  3170. ;
  3171. ;    ENTRY:    NONE
  3172. ;    EXIT:    (AL)=CHARACTER
  3173. ;    USES:    AL
  3174. ;
  3175.  
  3176. GETCHR:
  3177.     MOV    AL,IOBYTE        ;GET IOBYTE
  3178.     AND    AL,003H            ;Q. CON:=CRT:
  3179.     CMP    AL,1
  3180.     JNE    GETCHR1            ; BR IF NOT
  3181.     CALL    FLCRT            ;FLUSH CRT: TYPE AHEAD BUFFER
  3182. GETCHR1:
  3183.     JMP    CONINE            ;RETURN VIA 'CONINE'
  3184.  
  3185.  
  3186.  
  3187.  
  3188. ;**    HEXW, HEXB, HEXN - CONVERT HEX VALUES TO ASCII
  3189. ;
  3190. ;    HEXW - WORD
  3191. ;    ENTRY:    (AX)=HEX VALUE
  3192. ;
  3193. ;    HEXB - BYTE
  3194. ;    ENTRY:    (AL)=HEX VALUE
  3195. ;
  3196. ;    HEXN - LOW ORDER NIBBLE
  3197. ;    ENTRY:    (AL)=HEX VALUE
  3198. ;
  3199. ;    ENTRY:    (DI)=ADDRESS OF START OF OUTPUT AREA TO RECEIVE ASCII
  3200. ;    EXIT:    NONE
  3201. ;    USES:    AX,DI
  3202. ;
  3203.  
  3204. HEXW:
  3205.     XCHG    AL,AH
  3206.     CALL    HEXB
  3207.     MOV    AL,AH
  3208.  
  3209. HEXB:
  3210.     PUSH    AX
  3211.     SHR    AL,1
  3212.     SHR    AL,1
  3213.     SHR    AL,1
  3214.     SHR    AL,1
  3215.     CALL    HEXN
  3216.     POP    AX
  3217.  
  3218. HEXN:
  3219.     AND    AL,00FH
  3220.     ADD    AL,090H
  3221.     DAA
  3222.     ADC    AL,040H
  3223.     DAA
  3224.     MOV    [DI],AL
  3225.     INC    DI
  3226.     RET
  3227.  
  3228.  
  3229.  
  3230.  
  3231. ;**    PMSG -- PRINT MESSAGE ON CONSOLE
  3232. ;
  3233. ;    ENTRY:    (SI)=ADDRESS OF MESSAGE ENDING WITH 'CPMEOM' CHARACTER
  3234. ;             THE 'CPMEOM' CHARACTER IS NOT PRINTED
  3235. ;    EXIT:    NONE
  3236. ;    USES:    ALL
  3237. ;
  3238.  
  3239. PMSG:
  3240.     LODSB
  3241.     CMP    AL,CPMEOM
  3242.     JZ    PMSG1
  3243.     MOV    COMRC,AL
  3244.     CALL    CONOUTE
  3245.     JMPS    PMSG
  3246. PMSG1:
  3247.     RET
  3248.  
  3249.  
  3250.  
  3251.  
  3252. ;**    UPC - TRANSLATE (AL) TO UPPERCASE
  3253. ;
  3254. ;    ENTRY:    (AL)=CHARACTER
  3255. ;    EXIT:    (AL)=TRANSLATED CHARACTER
  3256. ;    USES:    AL
  3257. ;
  3258.  
  3259. UPC:
  3260.     CMP    AL,'a'            ;CHECK IF LOWER CASE
  3261.     JB    UPC1
  3262.     CMP    AL,'z'
  3263.     JA    UPC1            ; BR IF NOT
  3264.     AND    AL,05FH            ;TRANSLATE TO UPPERCASE
  3265. UPC1:
  3266.     RET
  3267.  
  3268.     EJECT
  3269. ;***    DATA STORAGE
  3270. ;
  3271.  
  3272. X    EQU    OFFSET $
  3273.     DSEG
  3274.     ORG    X
  3275.  
  3276. MTRMSG    RB    0            ;ROM MONITOR DATA AREA TOO LARGE
  3277.     DB    CR,LF,'MONITOR ROM DATA AREA IS TOO LARGE',CPMEOM
  3278.  
  3279. FNTMSG    RB    0            ;ROM FONT TABLE TOO LARGE
  3280.     DB    CR,LF,'MONITOR ROM FONT TABLE IS LARGER THAN BIOS '
  3281.     DB    'FONT TABLE AREA',CPMEOM
  3282.  
  3283. BUFMSG    RB    0            ;NOT ENOUGH MEMORY FOR DISK BUFFERS
  3284.     DB    CR,LF,'NOT ENOUGH MEMORY FOR DISK BUFFERS',CPMEOM
  3285.  
  3286. SIGNON    RB    0            ;SIGNON MESSAGE
  3287.     DB    CR,LF,LF
  3288.     DB    'CP/M-85  VERSION 2.2'
  3289.     IF    EXPER
  3290.     DB    'x'
  3291.     ENDIF
  3292.     IF    NOT EXPER
  3293.     DB    '.'
  3294.     ENDIF
  3295.     DB    BVERSN/100+'0',(BVERSN MOD 100)/10+'0',(BVERSN MOD 10)+'0'
  3296.     IF    BREVSN NE ' '
  3297.     DB    BREVSN
  3298.     ENDIF
  3299.     DB    '  '
  3300.     DB    BMO/10+'0',(BMO MOD 10)+'0','/'
  3301.     DB    BDY/10+'0',(BDY MOD 10)+'0','/'
  3302.     DB    BYR/10+'0',(BYR MOD 10)+'0'
  3303.     DB    CR,LF,LF,CPMEOM
  3304.  
  3305. MNMSG    RB    0            ;MOUNT MESSAGE
  3306.     DB    CR,LF,'PUT DISK '
  3307. MNMSGA    DB    '? IN DRIVE '
  3308. MNMSGB    DB    '?: AND PRESS RETURN',CPMEOM
  3309.  
  3310. ERRMSG    RB    0            ;HARD DISK ERROR MESSAGE
  3311.     DB    CR,LF,LF,'HARD '
  3312. ERRMSG1    DB    '????? ERROR ON DRIVE '
  3313. ERRMSG2    DB    '?: STATUS '
  3314. ERRMSG6    DB    '??',CPMEOM
  3315. ERRMSG7    DB    ' TRACK '
  3316. ERRMSG3    DB    '???? SIDE '
  3317. ERRMSG4    DB    '?',CPMEOM
  3318. ERRMSG8    DB    ' SECTOR '
  3319. ERRMSG5 DB    '????',CPMEOM
  3320.  
  3321. RDEMSG    DB    'READ '
  3322. WREMSG    DB    'WRITE'
  3323.  
  3324. AIMSG    DB    'PRESS <CTL-C> TO ABORT, <RETURN> TO IGNORE: ',CPMEOM
  3325.  
  3326. CRLF    RB    0
  3327.     DB    CR,LF,CPMEOM
  3328.  
  3329. TIMERRM    RB    0            ;TIMER BROKE MSG
  3330.     DB    BELL,CR,LF,'THE TIMER IS BROKE',CR,LF,CPMEOM
  3331.  
  3332. DIV0MSG    RB    0            ;DIVIDE BY 0 ERROR MESSAGE
  3333.     DB    CR,LF,LF,'DIVIDE BY ZERO INTERRUPT',CR,LF,LF,CPMEOM
  3334.  
  3335. PBEMSG    RB    0            ;PARITY OR BUSS ERROR MESSAGE
  3336.     DB    CR,LF,LF,'ERROR - MEMORY PARITY OR BUSS',CR,LF,LF,CPMEOM
  3337.  
  3338. WILDMSG    RB    0            ;WILD INTERRUPT MESSAGE
  3339.     DB    CR,LF,LF,'WILD INTERRUPT',CR,LF,LF,CPMEOM
  3340.  
  3341. DMPMSG    RB    0            ;REGISTER DUMP
  3342.     DB    'F ='
  3343. DMPFLG    DB    '????   IP='
  3344. DMPIP    DB    '????   CS='
  3345. DMPCS    DB    '????   DS='
  3346. DMPDS    DB    '????   ES='
  3347. DMPES    DB    '????   SS='
  3348. DMPSS    DB    '????   SP='
  3349. DMPSP    DB    '????',CR,LF,'AX='
  3350. DMPAX    DB    '????   BX='
  3351. DMPBX    DB    '????   CX='
  3352. DMPCX    DB    '????   DX='
  3353. DMPDX    DB    '????   DI='
  3354. DMPDI    DB    '????   SI='
  3355. DMPSI    DB    '????   BP='
  3356. DMPBP    DB    '????',CPMEOM
  3357.  
  3358. HLTMSG    RB    0            ;SYSTEM HALT MESSAGE
  3359.     DB    CR,LF,LF,'SYSTEM HALT',CR,LF,LF,CPMEOM
  3360.  
  3361. HINTVO    RW    0            ;HARDWARE INTERRUPT VECTOR OFFSET TABLE
  3362.     DW    OFFSET INTPBE        ; MASTER 0
  3363.     DW    OFFSET INTWILD        ; MASTER 1
  3364.     DW    OFFSET INTTIM        ; MASTER 2
  3365.     DW    OFFSET INTWILD        ; MASTER 3
  3366.     DW    OFFSET INTWILD        ; MASTER 4
  3367.     DW    OFFSET INTWILD        ; MASTER 5
  3368.     DW    OFFSET INTLVK        ; MASTER 6
  3369.     DW    OFFSET INTWILD        ; MASTER 7
  3370.     DW    OFFSET INTWILD        ; SLAVE 0
  3371.     DW    OFFSET INTWILD        ; SLAVE 1
  3372.     DW    OFFSET INTWILD        ; SLAVE 2
  3373.     DW    OFFSET INTWILD        ; SLAVE 3
  3374.     DW    OFFSET INTWILD        ; SLAVE 4
  3375.     DW    OFFSET INTWILD        ; SLAVE 5
  3376.     DW    OFFSET INTWILD        ; SLAVE 6
  3377.     DW    OFFSET INTWILD        ; SLAVE 7
  3378.     DW    OFFSET INTX2        ; MASTER EXIT ROUTINE
  3379.     DW    OFFSET INTX1        ; SLAVE EXIT ROUTINE
  3380.  
  3381. DRVRTBL    RW    0            ;DEVICE DRIVER DISPATCH TABLE
  3382.     DW    0            ; NON-EXISTANT
  3383.     DW    OFFSET DRVR207        ; Z207
  3384.     DW    OFFSET DRVR217        ; Z217
  3385.     DW    0
  3386.     DW    0
  3387.     DW    0
  3388.     DW    0
  3389.     DW    0
  3390.  
  3391. TABLE    RW    0            ;DISPATCH TABLE
  3392.     DW    OFFSET UNUSED        ; COLD BOOT
  3393.     DW    OFFSET WBOOTE        ; WARM BOOT
  3394.     DW    OFFSET CONSTE        ; CONSOLE STATUS
  3395.     DW    OFFSET CONINE        ; CONSOLE INPUT
  3396.     DW    OFFSET CONOUTE        ; CONSOLE OUTPUT
  3397.     DW    OFFSET LSTOUTE        ; LIST OUTPUT
  3398.     DW    OFFSET PUNOUTE        ; PUNCH OUTPUT
  3399.     DW    OFFSET RDRINE        ; READER INPUT
  3400.     DW    OFFSET HOMEE        ; HOME HEAD
  3401.     DW    OFFSET SETDSKE        ; SET DISK DRIVE
  3402.     DW    OFFSET SETTRKE        ; SET TRACK
  3403.     DW    OFFSET SETSECE        ; SET SECTOR
  3404.     DW    OFFSET SETDMAE        ; SET DMA
  3405.     DW    OFFSET READE        ; READ CP/M SECTOR
  3406.     DW    OFFSET WRITEE        ; WRITE CP/M SECTOR
  3407.     DW    OFFSET LSTSTE        ; LIST STATUS
  3408.     DW    OFFSET SECTRNE        ; SECTOR TRANSLATE
  3409.     DW    OFFSET FORMATE        ; FORMAT
  3410.     DW    OFFSET RDTRKE        ; READ TRACK
  3411.     DW    OFFSET WRTRKE        ; WRITE TRACK
  3412.     DW    OFFSET WPCE        ; WRITE PROTECT CHECK
  3413.     DW    OFFSET CLRBUFD        ; CLEAR BUFFERS FOR DRIVE
  3414. TABLEL    EQU    (OFFSET $ - OFFSET TABLE)/2
  3415.  
  3416. CBIC    DB    0            ;LOGICAL DRIVE # (DRIVE TABLE FILL)
  3417. DSKOP    DB    0            ;DISK OPERATIONS IN PROGRESS
  3418. DEVCTL    DB    0            ;1797 DEVICE CONTROL REGISTER
  3419. SIDE207    DB    FDFSS1            ;1797 SIDE SELECT VALUE LAST USED
  3420.  
  3421. ;    Z207 8" DRIVE TABLES
  3422.  
  3423. TBL207    RW    0
  3424.     DW    Z2071S            ;SINGLE DENSITY / SINGLE SIDED / 128
  3425.     DW    0            ;SINGLE DENSITY / SINGLE SIDED / 256
  3426.     DW    0            ;SINGLE DENSITY / SINGLE SIDED / 512
  3427.     DW    0            ;SINGLE DENSITY / SINGLE SIDED /1024
  3428.     DW    Z2072S            ;SINGLE DENSITY / DOUBLE SIDED / 128
  3429.     DW    0            ;SINGLE DENSITY / DOUBLE SIDED / 256
  3430.     DW    0            ;SINGLE DENSITY / DOUBLE SIDED / 512
  3431.     DW    0            ;SINGLE DENSITY / DOUBLE SIDED /1024
  3432.     DW    0            ;DOUBLE DENSITY / SINGLE SIDED / 128
  3433.     DW    Z2071D1            ;DOUBLE DENSITY / SINGLE SIDED / 256
  3434.     DW    0            ;DOUBLE DENSITY / SINGLE SIDED / 512
  3435.     DW    Z2071D2            ;DOUBLE DENSITY / SINGLE SIDED /1024
  3436.     DW    0            ;DOUBLE DENSITY / DOUBLE SIDED / 128
  3437.     DW    Z2072D1            ;DOUBLE DENSITY / DOUBLE SIDED / 256
  3438.     DW    0            ;DOUBLE DENSITY / DOUBLE SIDED / 512
  3439.     DW    Z2072D2            ;DOUBLE DENSITY / DOUBLE SIDED /1024
  3440.  
  3441. Z2071S    DB    1,1,8            ;SINGLE DENSITY / SINGLE SIDED / 128
  3442.     DW    26
  3443.     DB    3,7,0
  3444.     DW    242,63
  3445.     DB    0C0H,0
  3446.     DW    16,2
  3447.  
  3448. Z2072S    DB    1,1,16            ;SINGLE DENSITY / DOUBLE SIDED / 128
  3449.     DW    26
  3450.     DB    4,15,1
  3451.     DW    246,127
  3452.     DB    0C0H,0
  3453.     DW    32,2
  3454.  
  3455. Z2071D1    DB    2,2,16            ;DOUBLE DENSITY / SINGLE SIDED / 256
  3456.     DW    52
  3457.     DB    4,15,0
  3458.     DW    242,127
  3459.     DB    0C0H,0
  3460.     DW    32,2
  3461.  
  3462. Z2071D2    DB    0,8,16            ;DOUBLE DENSITY / SINGLE SIDED /1024
  3463.     DW    64
  3464.     DB    4,15,0
  3465.     DW    299,127
  3466.     DB    0C0H,0
  3467.     DW    32,2
  3468.  
  3469. Z2072D1    DB    2,2,16            ;DOUBLE DENSITY / DOUBLE SIDED / 256
  3470.     DW    52
  3471.     DB    4,15,0
  3472.     DW    493,255
  3473.     DB    0F0H,0
  3474.     DW    64,2
  3475.  
  3476. Z2072D2    DB    0,8,16            ;DOUBLE DENSITY / DOUBLE SIDED /1024
  3477.     DW    64
  3478.     DB    4,15,0
  3479.     DW    607,255
  3480.     DB    0F0H,0
  3481.     DW    64,2
  3482.  
  3483. ;
  3484.  
  3485. PATCH    RB    128            ;PATCH AREA
  3486.  
  3487. ;
  3488.  
  3489. BANK1    RW    1            ;SEGMENT ADDRESS FOR BANK 1
  3490. CCPORG0    RW    1            ;CP/M-85 CCP ORIGIN IN BANK 0 COPY
  3491. CCPORG1    RW    1            ;CP/M-85 CCP ORIGIN IN BANK 1
  3492. CBTFA    RB    1            ;DRIVE TABLE FILL CYCLE INDICATOR
  3493. CBTIA    RW    1            ;ADDRESS OF REAL DRIVE DPE
  3494. CBIB    RB    1            ;MAPPED DRIVE #
  3495. DMAPTR    RW    1            ;DMA ADDRESS
  3496. FVFLG    RB    1            ;FORMAT VERIFY FLAG
  3497. HSTPTR    RW    1            ;HOST BUFFER POINTER
  3498. LSIO    RB    1            ;LOGICAL SECTOR I/O FLAG
  3499. PHYDRV    RB    1            ;PHYSICAL DRIVE #
  3500. PHYDPE    RW    1            ;PHYSICAL DPE
  3501. PHYSID    RB    1            ;PHYSICAL SIDE
  3502. PHYSIDN    RB    1            ;PHYSICAL SIDE NUMBER
  3503. PHYTRK    RW    1            ;PHYSICAL TRACK
  3504. PHYSEC    RW    1            ;PHYSICAL SECTOR
  3505. REQDRV    RB    1            ;REQUESTED DRIVE
  3506. REQTRK    RW    1            ;REQUESTED TRACK
  3507. REQSEC    RW    1            ;REQUESTED SECTOR
  3508. SECCNT    RB    1            ;PHYSICAL SECTORS PER TRACK
  3509. SEC1ST    RB    1            ;1ST SECTOR # FOR OPERATION
  3510. COUNT    RW    1            ;BYTES PER PHYSICAL SECTOR
  3511. RETRIES    RB    1            ;I/O RETRY COUNTER
  3512. HLDDLYF    RB    1            ;1797 DELAY FLAG
  3513. ERRTYP    RB    1            ;ERROR TYPE (STATUS BYTE)
  3514. XLATES    RW    1            ;ADDRESS OF XLATE TABLE ADDRESSES
  3515. RDABUF    RB    FDRAL            ;READ ADDRESS BUFFER
  3516. OMDSEG    RW    1            ;ORIGINAL MONITOR DATA SEGMENT VALUE
  3517. PREREAD    RB    1            ;DO PREREAD FLAG
  3518. FLDERR    RB    1            ;FLUSH DRIVE ERROR ACCUMULATOR
  3519. PTICCNT    RW    1            ;PREVIOUS TIMER 1 COUNT
  3520.  
  3521. ;    KEYBOARD TYPE-AHEAD BUFFER
  3522.  
  3523. KEYCNT    RB    1            ;CHARACTER COUNT
  3524. KEYPUT    RW    1            ;PUT POINTER
  3525. KEYGET    RW    1            ;GET POINTER
  3526. KEYBUF    RB    80            ;BUFFER
  3527. KEYBUFL    EQU    OFFSET $ - OFFSET KEYBUF    ;BUFFER SIZE
  3528. KEYBUFF    EQU    KEYBUFL-10        ;KEYBOARD BUFFER FULL VALUE
  3529.  
  3530. ;    ALTERNATE CHARACTER FONT TABLE
  3531.  
  3532. ALTFNTL    EQU    (256-32)*9        ;LENGTH
  3533. ALTFNT    RB    ALTFNTL            ;AREA
  3534.     IF    OFFSET $ GE BLDRP0
  3535. %:    BIOS88 TOO LARGE
  3536.     ENDIF
  3537.  
  3538. ;    DISK BUFFER AND BUFFER HANDLING STORAGE
  3539.  
  3540. FSTBUF    RW    1            ;POINTER TO FIRST ELEMENT
  3541. LSTBUF    RW    1            ;POINTER TO LAST ELEMENT
  3542.  
  3543. DMYHDR    RB    BUFHDRL            ;DUMMY BUFFER HEADER
  3544. HEADER    RB    BUFCNT*BUFHDRL        ;DISK BUFFER HEADER INFO STACK
  3545.  
  3546. SECFLGL    EQU    26
  3547. SECFLG    RB    BUFCNT*SECFLGL        ;DIRTY SECTOR FLAGS (1=DIRTY)
  3548.  
  3549. ERRFLGL    EQU    26
  3550. ERRFLG    RB    BUFCNT*ERRFLGL        ;SECTOR ERROR FLAGS
  3551.  
  3552. BUFFERL    EQU    9*1024
  3553. BUFFER    RB    BUFCNT*BUFFERL        ;BUFFER AREAS
  3554.  
  3555. B88END    EQU    OFFSET $
  3556.  
  3557.     END
  3558.