home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol098 / sysio.asm < prev    next >
Assembly Source File  |  1984-04-29  |  28KB  |  1,065 lines

  1. *****************************************************************
  2. *                                *
  3. *  SYSIO -- Standard Set of Redirectable I/O Drivers        *
  4. *    for ZCPR2 configured for Richard Conn's ARIES-1 System    *
  5. *                                *
  6. *  4 February 1982                        *
  7. *                                *
  8. *  Note on Assembly:                        *
  9. *    This device driver package is to be assembled by MAC    *
  10. * (because of the macros) and configured into a file of type    *
  11. * IO by loading it at 100H via DDT or SID/ZSID and saving the    *
  12. * result as a COM file.  Care should be taken to ensure that    *
  13. * the package is not larger than the device driver area which    *
  14. * is reserved for it in memory.                    *
  15. *                                *
  16. *****************************************************************
  17. IOBASE    equ    0E800H    ;Base Address of I/O Drivers
  18. IOBYTE    equ    3    ;I/O BYTE
  19. INTIOBY    equ    000$1$1$001B    ;Initial I/O Byte Value
  20.                 ;  LST:=TTY
  21.                 ;  RDR:, PUN:=Clock
  22.                 ;  CON:=CRT
  23.  
  24. *****************************************************************
  25. *                                *
  26. *  Disk Serial, MPU Serial, Quad I/O, and Modem Equates        *
  27. *                                *
  28. *****************************************************************
  29.  
  30. ;  Disk Serial -- Serial Channel on Disk Controller Board (DCE)
  31. ;    Baud Rate is set at 19,200 Baud in Hardware (DIP Switches)
  32. ustat    equ    0E3F9H    ;USART Status Address
  33. ostat    equ    8    ;Output Status Bit (TBE)
  34. istat    equ    4    ;Input Status Bit (RDA)
  35.  
  36. ;  MPU Serial -- Serial Channel on CCS Z80 MPU Board (DCE)
  37. mpubase    equ    20H    ;Base address of 8250 on CCS Z80 MPU Board
  38. mpudata    equ    mpubase        ;Data I/O Registers
  39. mpudll    equ    mpubase        ;Divisor Latch Low
  40. mpudlh    equ    mpubase+1    ;Divisor Latch High
  41. mpuier    equ    mpubase+1    ;Interrupt Enable Register
  42. mpulcr    equ    mpubase+3    ;Line Control Register
  43. mpupcr    equ    mpubase+4    ;Peripheral Control Register
  44. mpustat    equ    mpubase+5    ;Line Status Register
  45. mpupsr    equ    mpubase+6    ;Peripheral Status Register
  46.  
  47. ;  MPU Serial RDA and TBE
  48. mpurda    equ    1    ; Data Available Bit (RDA)
  49. mputbe    equ    40h    ; Transmit Buffer Empty Bit (TBE)
  50.  
  51. ;  MPU Serial Baud Rate Values
  52. bm00050    equ    2304    ;    50   Baud
  53. bm00075    equ    1536    ;    75   Baud
  54. bm00110    equ    1047    ;   110   Baud
  55. bm00134    equ    857    ;   134.5 Baud
  56. bm00150    equ    768    ;   150   Baud
  57. bm00300    equ    384    ;   300   Baud
  58. bm00600    equ    192    ;   600   Baud
  59. bm01200    equ    96    ;  1200   Baud
  60. bm01800    equ    64    ;  1800   Baud
  61. bm02000    equ    58    ;  2000   Baud
  62. bm02400    equ    48    ;  2400   Baud
  63. bm03600    equ    32    ;  3600   Baud
  64. bm04800    equ    24    ;  4800   Baud
  65. bm07200    equ    16    ;  7200   Baud
  66. bm09600    equ    12    ;  9600   Baud
  67. bm19200    equ    6    ; 19200   Baud
  68. bm38400    equ    3    ; 38400   Baud
  69. bm56000    equ    2    ; 56000   Baud
  70.  
  71. ;  MPU Serial Channel Baud Rate
  72. mpbrate    equ    bm19200    ; 19,200 Baud
  73.  
  74. ;  Quad I/O Ports
  75. qbase    equ    80h    ; Base address of Quad RS-232 I/O Board
  76. q0data    equ    qbase        ; USART 0 Data Port (DTE)
  77. q0stat    equ    qbase+1        ; USART 0 Status Port
  78. q1data    equ    qbase+2        ; USART 1 Data Port (DTE)
  79. q1stat    equ    qbase+3        ; USART 1 Status Port
  80. q2data    equ    qbase+4        ; USART 2 Data Port (DTE)
  81. q2stat    equ    qbase+5        ; USART 2 Status Port
  82. q3data    equ    qbase+6        ; USART 3 Data Port (DCE)
  83. q3stat    equ    qbase+7        ; USART 3 Status Port
  84. q0baud    equ    qbase+8        ; USART 0 Baud Rate Port
  85. q1baud    equ    qbase+9        ; USART 1 Baud Rate Port
  86. q2baud    equ    qbase+10    ; USART 2 Baud Rate Port
  87. q3baud    equ    qbase+11    ; USART 3 Baud Rate Port
  88.  
  89. ;  Quad I/O RDA and TBE
  90. qrda    equ    2    ; Read Data Available Bit (RDA)
  91. qtbe    equ    1    ; Transmit Buffer Empty Bit (TBE)
  92.  
  93. *************************************
  94. *  Equate Values for PMMI as Modem  *
  95. *************************************
  96. *  Modem Ports (Special -- 300 or 600 Baud for PMMI)
  97. *mods    equ    0E0H    ; Modem Status Byte
  98. *modd    equ    0E1H    ; Modem Data Byte
  99. *
  100. *  Modem RDA and TBE
  101. *mrda    equ    2    ; Read Data Available Bit (RDA)
  102. *mtbe    equ    1    ; Transmit Buffer Empty Bit (TBE)
  103. *************************************
  104.  
  105. ;  Modem Ports set to QUAD I/O Port 2
  106. mods    equ    q2stat    ; Modem Status Port
  107. modd    equ    q2data    ; Modem Data Port
  108.  
  109. ;  Modem RDA and TBE
  110. mrda    equ    qrda
  111. mtbe    equ    qtbe
  112.  
  113. ;  Baud Rate Values
  114. b00050    equ    0    ;    50   Baud
  115. b00075    equ    1    ;    75   Baud
  116. b00110    equ    2    ;   110   Baud
  117. b00134    equ    3    ;   134.5 Baud
  118. b00150    equ    4    ;   150   Baud
  119. b00300    equ    5    ;   300   Baud
  120. b00600    equ    6    ;   600   Baud
  121. b01200    equ    7    ;  1200   Baud
  122. b01800    equ    8    ;  1800   Baud
  123. b02000    equ    9    ;  2000   Baud
  124. b02400    equ    10    ;  2400   Baud
  125. b03600    equ    11    ;  3600   Baud
  126. b04800    equ    12    ;  4800   Baud
  127. b07200    equ    13    ;  7200   Baud
  128. b09600    equ    14    ;  9600   Baud
  129. b19200    equ    15    ; 19200   Baud
  130.  
  131.  
  132. *****************************************************************
  133. *                                *
  134. *  Baud Rates for Quad I/O Devices                *
  135. *                                *
  136. *****************************************************************
  137.  
  138. q0brate    equ    b09600    ;  9600 Baud for Intersystem
  139. q1brate    equ    b01200    ;  1200 Baud for Clock
  140. q2brate    equ    b00300    ;   300 Baud for Smartmodem
  141. q3brate    equ    b00300    ;   300 Baud for Printer
  142.  
  143.  
  144. *****************************************************************
  145. *                                *
  146. *  Miscellaneous Constants                    *
  147. *                                *
  148. *****************************************************************
  149. XON    equ    11h    ;X-ON
  150. XOFF    equ    13h    ;X-OFF
  151. djram    equ    0e400h    ;Base of DJ RAM
  152. djcin    equ    djram+3    ;DJ Console Input
  153. djcout    equ    djram+6    ;DJ Console Output
  154.  
  155. *****************************************************************
  156. *                                *
  157. * The following are the Z80 Macro Definitions which are used to    *
  158. * define the Z80 Mnemonics used to implement the Z80 instruction*
  159. * set extensions employed in CBIOSZ.                *
  160. *                                *
  161. *****************************************************************
  162. ;
  163. ; MACROS TO PROVIDE Z80 EXTENSIONS
  164. ;   MACROS INCLUDE:
  165. ;
  166. $-MACRO         ;FIRST TURN OFF THE EXPANSIONS
  167. ;
  168. ;    JR    - JUMP RELATIVE
  169. ;    JRC    - JUMP RELATIVE IF CARRY
  170. ;    JRNC    - JUMP RELATIVE IF NO CARRY
  171. ;    JRZ    - JUMP RELATIVE IF ZERO
  172. ;    JRNZ    - JUMP RELATIVE IF NO ZERO
  173. ;    DJNZ    - DECREMENT B AND JUMP RELATIVE IF NO ZERO
  174. ;    LDIR    - MOV @HL TO @DE FOR COUNT IN BC
  175. ;    LXXD    - LOAD DOUBLE REG DIRECT
  176. ;    SXXD    - STORE DOUBLE REG DIRECT
  177. ;
  178. ;
  179. ;
  180. ;    @GENDD MACRO USED FOR CHECKING AND GENERATING
  181. ;    8-BIT JUMP RELATIVE DISPLACEMENTS
  182. ;
  183. @GENDD    MACRO    ?DD    ;;USED FOR CHECKING RANGE OF 8-BIT DISPLACEMENTS
  184.     IF (?DD GT 7FH) AND (?DD LT 0FF80H)
  185.     DB    100H    ;Displacement Range Error on Jump Relative
  186.     ELSE
  187.     DB    ?DD
  188.     ENDIF
  189.     ENDM
  190. ;
  191. ; Z80 MACRO EXTENSIONS
  192. ;
  193. JR    MACRO    ?N
  194.     DB    18H
  195.     @GENDD    ?N-$-1
  196.     ENDM
  197. ;
  198. JRC    MACRO    ?N
  199.     DB    38H
  200.     @GENDD    ?N-$-1
  201.     ENDM
  202. ;
  203. JRNC    MACRO    ?N
  204.     DB    30H
  205.     @GENDD    ?N-$-1
  206.     ENDM
  207. ;
  208. JRZ    MACRO    ?N
  209.     DB    28H
  210.     @GENDD    ?N-$-1
  211.     ENDM
  212. ;
  213. JRNZ    MACRO    ?N
  214.     DB    20H
  215.     @GENDD    ?N-$-1
  216.     ENDM
  217. ;
  218. DJNZ    MACRO    ?N
  219.     DB    10H
  220.     @GENDD    ?N-$-1
  221.     ENDM
  222. ;
  223. LDIR    MACRO
  224.     DB    0EDH,0B0H
  225.     ENDM
  226. ;
  227. LDED    MACRO    ?N
  228.     DB    0EDH,05BH
  229.     DW    ?N
  230.     ENDM
  231. ;
  232. LBCD    MACRO    ?N
  233.     DB    0EDH,4BH
  234.     DW    ?N
  235.     ENDM
  236. ;
  237. SDED    MACRO    ?N
  238.     DB    0EDH,53H
  239.     DW    ?N
  240.     ENDM
  241. ;
  242. SBCD    MACRO    ?N
  243.     DB    0EDH,43H
  244.     DW    ?N
  245.     ENDM
  246. ;
  247. ; END OF Z80 MACRO EXTENSIONS
  248. ;
  249.  
  250.  
  251. *****************************************************************
  252. *                                *
  253. * Terminal driver routines. Iobyte is initialized by the cold    *
  254. * boot routine, to modify, change the "intioby" equate.    The    *
  255. * I/O routines that follow all work exactly the same way. Using    *
  256. * iobyte, they obtain the address to jump to in order to execute*
  257. * the desired function. There is a table with four entries for    *
  258. * each of the possible assignments for each device. To modify    *
  259. * the I/O routines for a different I/O configuration, just    *
  260. * change the entries in the tables.                *
  261. *                                *
  262. *****************************************************************
  263.  
  264.     org    iobase        ;Base Address of I/O Drivers
  265. offset    equ    100h-iobase    ;Offset for load via DDT or ZSID
  266.  
  267.     jmp    status        ;Internal Status Routine
  268.     jmp    select        ;Device Select Routine
  269.     jmp    namer        ;Device Name Routine
  270.  
  271.     jmp    tinit        ;Initialize Terminal
  272.  
  273.     jmp    const        ;Console Input Status
  274.     jmp    conin        ;Console Input Char
  275.     jmp    conout        ;Console Output Char
  276.  
  277.     jmp    list        ;List Output Char
  278.  
  279.     jmp    punch        ;Punch Output Char
  280.  
  281.     jmp    reader        ;Reader Input Char
  282.  
  283.     jmp    listst        ;List Output Status
  284.  
  285.     jmp    newio        ;New I/O Driver Installation Routine
  286.  
  287.     jmp    copen        ;Open CON: Disk File
  288.     jmp    cclose        ;Close CON: Disk File
  289.  
  290.     jmp    lopen        ;Open LST: Disk File
  291.     jmp    lclose        ;Close LST: Disk File
  292.  
  293.  
  294. *****************************************************************
  295. *                                *
  296. * status: return information on devices supported by this    *
  297. *    I/O Package.  On exit, HL points to a logical device    *
  298. *    table which is structured as follows:            *
  299. *        Device    Count Byte  Current Assignment Byte    *
  300. *        ------    ----------  -----------------------    *
  301. *         CON:         0            1        *
  302. *         RDR:         2            3        *
  303. *         PUN:         4            5        *
  304. *         LST:         6            7        *
  305. *                                *
  306. *    If error or no I/O support, return with Zero Flag Set.    *
  307. *    Also, if no error, A=Driver Module Number        *
  308. *                                *
  309. *****************************************************************
  310. status:
  311.     lxi    h,cnttbl    ;point to table
  312.     mvi    a,01H        ;Module 1 (SYSIO) with no Disk Output
  313.     ora    a        ;Set Flags
  314.     ret
  315.  
  316.  
  317. *****************************************************************
  318. *                                *
  319. * select: select devices indicated by B and C.  B is the number    *
  320. *    of the logical device, where CON:=0, RDR:=1, PUN:=2,    *
  321. *    LST:=3, and C is the desired device (range 0 to dev-1).    *
  322. *    Return with Zero Flag Set if Error.            *
  323. *                                *
  324. *****************************************************************
  325. ranger:
  326.     lxi    h,cnttbl-2    ;check for error
  327.     inr    b    ;range of 1 to 4
  328.     mov    a,b    ;Value in A
  329.     cpi    5    ;B out of range?
  330.     jnc    rangerr
  331.     push    b    ;save params
  332. rang:
  333.     inx    h    ;pt to next
  334.     inx    h
  335.     djnz    rang
  336.     mov    b,m    ;get count in b
  337.     mov    a,c    ;get selected device number
  338.     cmp    b    ;compare (C must be less than B)
  339.     pop    b    ;get params
  340.     jrnc    rangerr    ;range error if C >= B
  341. rangok:
  342.     mvi    a,0ffh    ;OK
  343.     ora    a    ;set flags
  344.     ret
  345. rangerr:
  346.     xra    a    ;not OK
  347.     ret
  348. select:
  349.     call    ranger    ;check for range error
  350.     rz        ;abort if error
  351.     inx    h    ;pt to current entry number
  352.     mov    m,c    ;save selected number there
  353.     lxi    h,cfgtbl-2    ;pt to configuration table
  354. sel2:
  355.     inx    h    ;Pt to Entry in Configuration Table
  356.     inx    h
  357.     djnz    sel2
  358.     mov    b,m    ;Get Rotate Count
  359.     inx    h    ;Pt to Select Mask
  360.     mov    d,m    ;Get Select Mask
  361.     mov    a,b    ;Any Rotation to do?
  362.     ora    a
  363.     jz    sel4
  364.     mov    a,c    ;Get Selected Number
  365. sel3:
  366.     rlc        ;Rotate Left 1 Bit
  367.     djnz    sel3
  368.     mov    c,a    ;Place Bit Pattern Back in C
  369. sel4:
  370.     lda    iobyte    ;get I/O byte
  371.     ana    d    ;mask out old selection
  372.     ora    c    ;mask in new selection
  373.     sta    iobyte    ;put I/O byte
  374.     jr    rangok    ;range OK
  375.  
  376. *****************************************************************
  377. *                                *
  378. * namer: return text string of physical device.  Logical device    *
  379. *    number is in B and physical selection is in C.        *
  380. *    HL is returned pointing to the first character of the    *
  381. *    string.  The strings are structured to begin with a    *
  382. *    device name followed by a space and then a description    *
  383. *    string which is terminated by a binary 0.        *
  384. *                                *
  385. *    Return with Zero Flag Set if error.            *
  386. *                                *
  387. *****************************************************************
  388. namer:
  389.     call    ranger    ;check for range error
  390.     rz        ;return if so
  391.     lxi    h,namptbl-2    ;pt to name ptr table
  392.     call    namsel    ;select ptr table entry
  393.     mov    b,c    ;physical selection number in B now
  394.     inr    b    ;Add 1 for Initial Increment
  395.     call    namsel    ;point to string
  396.     jr    rangok    ;return with HL pointing and range OK
  397. ;
  398. ;  Select entry B in table pted to by HL; this entry is itself a pointer,
  399. ;  and return with it in HL
  400. ;
  401. namsel:
  402.     inx    h    ;pt to next entry
  403.     inx    h
  404.     djnz    namsel
  405.     mov    a,m    ;get low
  406.     inx    h
  407.     mov    h,m    ;get high
  408.     mov    l,a    ;HL now points to entry
  409.     ret
  410.  
  411. *****************************************************************
  412. *                                *
  413. * const: get the status for the currently assigned console.    *
  414. *     The I/O Byte is used to select the device.        *
  415. *                                *
  416. *****************************************************************
  417. const:
  418.     lxi    h,cstble    ;Beginning of jump table
  419. conmask:
  420.     lxi    d,cfgtbl    ;Pt to First Entry in Config Table
  421.     jr    seldev        ;Select correct jump
  422.  
  423. *****************************************************************
  424. *                                *
  425. * conin: input a character from the currently assigned console.    *
  426. *     The I/O Byte is used to select the device.        *
  427. *                                *
  428. *****************************************************************
  429. conin:
  430.     lxi    h,citble    ;Beginning of character input table
  431.     jr    conmask        ;Get Console Mask
  432.  
  433. *****************************************************************
  434. *                                *
  435. * conout: output the character in C to the currently assigned    *
  436. *      console.  The I/O Byte is used to select the device.    *
  437. *                                *
  438. *****************************************************************
  439. conout:
  440.     lxi    h,cotble    ;Beginning of the character out table
  441.     jr    conmask        ;Get Console Mask
  442.  
  443. *****************************************************************
  444. *                                *
  445. * csreader: get the status of the currently assigned reader.    *
  446. *        The I/O Byte is used to select the device.        *
  447. *                                *
  448. *****************************************************************
  449. csreadr:
  450.     lxi    h,csrtble    ;Beginning of reader status table
  451. rdrmask:
  452.     lxi    d,cfgtbl+2    ;Pt to 2nd Entry in Config Table
  453.     jr    seldev
  454.  
  455. *****************************************************************
  456. *                                *
  457. * reader: input a character from the currently assigned reader.    *
  458. *      The I/O Byte is used to select the device.        *
  459. *                                *
  460. *****************************************************************
  461. reader:
  462.     lxi    h,rtble        ;Beginning of reader input table
  463.     jr    rdrmask        ;Get the Mask and Go
  464.  
  465. *****************************************************************
  466. *                                *
  467. * Entry at seldev will form an offset into the table pointed    *
  468. * to by H&L and then pick up the address and jump there.    *
  469. * The configuration of the physical device assignments is    *
  470. * pointed to by D&E (cfgtbl entry).                *
  471. *                                *
  472. *****************************************************************
  473. seldev:
  474.     push    b        ;Save Possible Char in C
  475.     ldax    d        ;Get Rotate Count
  476.     mov    b,a        ;... in B
  477.     inx    d        ;Pt to Mask
  478.     ldax    d        ;Get Mask
  479.     cma            ;Flip Bits
  480.     mov    c,a        ;... in C
  481.     lda    iobyte        ;Get I/O Byte
  482.     ana    c        ;Mask Out Selection
  483.     inr    b        ;Increment Rotate Count
  484. seld1:
  485.     dcr    b        ;Count down
  486.     jrz    seld2
  487.     rrc            ;Rotate Right one Bit
  488.     jr    seld1
  489. seld2:
  490.     rlc            ;Double Number for Table Offset
  491.     mvi    d,0        ;Form offset
  492.     mov    e,a
  493.     dad    d        ;Add offset
  494.     mov    a,m        ;Pick up low byte
  495.     inx    h
  496.     mov    h,m        ;Pick up high byte
  497.     mov    l,a        ;Form address
  498.     pop    b        ;Get Possible Char in C
  499.     pchl            ;Go there !
  500.  
  501. *****************************************************************
  502. *                                *
  503. * punch: output char in C to the currently assigned punch    *
  504. *     device.  The I/O Byte is used to select the device.    *
  505. *                                *
  506. *****************************************************************
  507. punch:
  508.     lxi    h,ptble        ;Beginning of punch table
  509.     lxi    d,cfgtbl+4    ;Get Mask
  510.     jr    seldev        ;Select Device and Go
  511.  
  512. *****************************************************************
  513. *                                *
  514. * list: output char in C to the currently assigned list device.    *
  515. *    The I/O Byte is used to select the device.        *
  516. *                                *
  517. *****************************************************************
  518. list:
  519.     lxi    h,ltble        ;Beginning of the list device routines
  520. lstmask:
  521.     lxi    d,cfgtbl+6    ;Get Mask
  522.     jr    seldev        ;Select Device and Go
  523.  
  524. *****************************************************************
  525. *                                *
  526. * Listst: get the output status of the currently assigned list    *
  527. *      device.  The I/O Byte is used to select the device.    *
  528. *                                *
  529. *****************************************************************
  530. listst:
  531.     lxi    h,lstble    ;Beginning of the list device status
  532.     jr    lstmask        ;Mask and Go
  533.  
  534. *****************************************************************
  535. *                                *
  536. * If customizing I/O routines is being performed, the tables    *
  537. * below should be modified to reflect the changes. All I/O    *
  538. * devices are decoded out of iobyte and the jump is taken from    *
  539. * the following tables.                        *
  540. *                                *
  541. *****************************************************************
  542.  
  543. *****************************************************************
  544. *                                *
  545. *  I/O Driver Support Specification Tables            *
  546. *                                *
  547. *****************************************************************
  548.  
  549. *
  550. * Device Counts
  551. *    First Byte is Number of Devices, 2nd Byte is Selected Device
  552. *
  553. cnttbl:
  554.     db    6,(intioby AND 7)        ;CON:
  555.     db    2,(intioby AND 08h) SHR 3    ;RDR:
  556.     db    2,(intioby AND 10h) SHR 4    ;PUN:
  557.     db    4,(intioby AND 0E0h) SHR 5    ;LST:
  558.  
  559. *
  560. * Configuration Table
  561. *    First Byte is Rotate Count, 2nd Byte is Mask
  562. *
  563. cfgtbl:
  564.     db    0,111$1$1$000b    ;No Rotate, Mask Out 3 LSB
  565.     db    3,111$1$0$111b    ;3 Rotates, Mask Out Bit 3
  566.     db    4,111$0$1$111b    ;4 Rotates, Mask Out Bit 4
  567.     db    5,000$1$1$111b    ;5 Rotates, Mask Out 3 MSB
  568.  
  569. *
  570. * name text tables
  571. *
  572. namptbl:
  573.     dw    conname-2    ;CON:
  574.     dw    rdrname-2    ;RDR:
  575.     dw    punname-2    ;PUN:
  576.     dw    lstname-2    ;LST:
  577.  
  578. conname:
  579.     dw    namtty    ;TTY
  580.     dw    namcrt    ;CRT
  581.     dw    namusr    ;CRT and Modem in Parallel
  582.     dw    namusr1    ;CRT Input and CRT/Remote Computer Output
  583.     dw    namusr2    ;CRT Input and CRT/Modem Output
  584.     dw    namcrtp    ;CRT Input and CRT/Printer Output
  585.  
  586. lstname:
  587.     dw    namtty    ;TTY
  588.     dw    namcrt    ;CRT
  589.     dw    namrem    ;Remote Computer
  590.     dw    nammod    ;Modem
  591.  
  592. rdrname:
  593.     dw    nammod    ;Modem
  594.     dw    namclk    ;Clock
  595.  
  596. punname:
  597.     dw    nammod    ;Modem
  598.     dw    namclk    ;Clock
  599.  
  600. namtty:
  601.     db    'TTY Model 43 Printing Terminal',0
  602. namcrt:
  603.     db    'CRT Televideo 950 CRT',0
  604. namcrtp:
  605.     db    'CRTPRT CRT Input and CRT/Printer Output',0
  606. namusr:
  607.     db    'CRTMOD Televideo 950 CRT and Modem in Parallel',0
  608. namusr1:
  609.     db    'CRTREM Televideo 950 CRT Input and CRT/Remote Output',0
  610. namusr2:
  611.     db    'CRTMOD2 Televideo 950 CRT Input and CRT/Modem Output',0
  612. namrem:
  613.     db    'REMOTE Remote Computer',0
  614. nammod:
  615.     db    'MODEM DC Hayes Smartmodem',0
  616. namclk:
  617.     db    'CLOCK DC Hayes Chronograph',0
  618.  
  619. *
  620. * console input table
  621. *
  622. citble:
  623.     dw    citty        ;Input from tty (000) 
  624.     dw    cicrt        ;Input from crt (001) 
  625.     dw    ciusr        ;Input from crt and modem (010) 
  626.     dw    cicrt        ;Input from crt (011)
  627.     dw    cicrt        ;Input from crt (100)
  628.     dw    cicrt        ;Input from crt (101)
  629.  
  630. *
  631. * console output table
  632. *
  633. cotble:
  634.     dw    cotty        ;Output to tty (000) 
  635.     dw    cocrt        ;Output to crt (001)
  636.     dw    cousr        ;Output to crt and modem (010)
  637.     dw    cousr1        ;Output to crt and remote system (011) 
  638.     dw    cousr        ;Output to crt and modem (100)
  639.     dw    cocrtp        ;Output to crt and printer (101)
  640.  
  641. *
  642. * list device table
  643. *
  644. ltble:
  645.     dw    cotty        ;Output to tty (000) 
  646.     dw    cocrt        ;Output to crt (001)
  647.     dw    corem        ;Output to remote system (010)
  648.     dw    comod        ;Output to modem (011)
  649.  
  650. *
  651. * punch device table
  652. *
  653.  
  654. ptble:
  655.     dw    comod        ;Output to modem (0)
  656.     dw    coclk        ;Output to clock (1) 
  657.  
  658. *
  659. * reader device table
  660. *
  661. rtble:
  662.     dw    cimod        ;Input from modem (0)
  663.     dw    ciclk        ;Input from clock (1)
  664.  
  665. *
  666. * console status table
  667. *
  668. cstble:
  669.     dw    cstty        ;Status of tty (000)
  670.     dw    cscrt        ;Status from crt (001)
  671.     dw    csusr        ;Status from crt and modem (010)
  672.     dw    cscrt        ;Status from crt (011)
  673.     dw    cscrt        ;Status from crt (100)
  674.     dw    cscrt        ;Status from crt (101)
  675.  
  676. *
  677. * status from reader device
  678. *
  679. csrtble:
  680.     dw    csmod        ;Status from modem (0)
  681.     dw    csclk        ;Status from clock (1)
  682.  
  683. *
  684. * Status from list device
  685. *
  686. lstble:
  687.     dw    costty        ;Status from tty (000)
  688.     dw    coscrt        ;Status from crt (001)
  689.     dw    cosrem        ;Status from remote system (010)
  690.     dw    cosmod        ;Status from modem (011)
  691.  
  692.  
  693. *****************************************************************
  694. *                                *
  695. * Tinit can be modified for different I/O setups.        *
  696. *                                *
  697. *****************************************************************
  698. tinit:                ;Initialize the terminal routine
  699.  
  700. ;  Initialize I/O Byte
  701.     mvi    a,intioby    ;Initialize IOBYTE
  702.     sta    iobyte
  703.  
  704. ;  Initialize MPU Serial I/O Channel Characteristics and Baud Rate
  705.     mvi    a,10$00$00$11b    ;Access Divisor:
  706.                 ;  10 -- Set divisor latch, clear break
  707.                 ;  00 -- 0 parity bit, even parity (N/A)
  708.                 ;  00 -- disable parity, 1 stop bit
  709.                 ;  11 -- 8 Data Bits
  710.     out    mpulcr        ;To Line Control Register
  711.     lxi    h,mpbrate    ;HL = MPU Channel Baud Rate
  712.     mov    a,l        ;Set Low-Byte of Baud Rate
  713.     out    mpudll        ;To Divisor Latch Low
  714.     mov    a,h        ;Set High-Byte of Baud Rate
  715.     out    mpudlh        ;To Divisor Latch High
  716.     mvi    a,00$00$01$11b    ;Reset Divisor Access and Set Characteristics:
  717.                 ;  00 -- Clear divisor latch, clear break
  718.                 ;  00 -- 0 parity bit, even parity (N/A)
  719.                 ;  01 -- disable parity, 2 stop bits
  720.                 ;  11 -- 8 Data Bits
  721.     out    mpulcr        ;To Line Control Register
  722.     xra    a        ;A=0
  723.     out    mpuier        ;Disable All Interrupts in Interrupt Register
  724.     out    mpustat        ;Clear All Error Flags in Line Status Register
  725.     mvi    a,0000$1111b    ;3 Zeroes, No Loop, 1, Set RLSD, CTS, DSR
  726.     out    mpupcr        ;To Peripheral Control Register
  727.  
  728. ;  Initialize Quad I/O Channel Characteristics
  729.     mvi    a,10$11$01$11b    ;General-Purpose Reset:
  730.                 ;  10 -- 1 1/2 Stop Bits
  731.                 ;  11 -- Even Parity, Enable Parity
  732.                 ;  01 -- 6 Bits/Char
  733.                 ;  11 -- 64x Baud Rate
  734.     call    setquad        ;Set All 4 Quad I/O Ports
  735.     mvi    a,01$11$01$11b    ;General-Purpose Reset:
  736.                 ;  01 -- Disable Hunt, Internal Reset
  737.                 ;  11 -- RTS High, Error Reset
  738.                 ;  01 -- No Break, Enable RxRDY
  739.                 ;  11 -- NOT DTR High, Enable TxEN
  740.     call    setquad        ;Set All 4 Quad I/O Ports
  741.     mvi    a,11$00$11$10b    ;Characteristics Set for All:
  742.                 ;  11 -- 2 Stop Bits
  743.                 ;  00 -- No Parity
  744.                 ;  11 -- 8 Bits/Char
  745.                 ;  10 -- 16x Baud Rate
  746.     call    setquad        ;Set All 4 Quad I/O Ports
  747.     mvi    a,00$11$01$11b    ;Characteristics Set for All:
  748.                 ;  00 -- Disable Hunt, No Internal Reset
  749.                 ;  11 -- RTS High, Error Reset
  750.                 ;  01 -- No Break, Enable RxRDY
  751.                 ;  11 -- NOT DTR High, Enable TxEN
  752.     call    setquad        ;Set All 4 Quad I/O Ports
  753.  
  754. ;  Initialize Quad I/O Baud Rates
  755.     mvi    a,q0brate    ;Set USART 0 Baud Rate
  756.     out    q0baud
  757.     mvi    a,q1brate    ;Set USART 1 Baud Rate
  758.     out    q1baud
  759.     mvi    a,q2brate    ;Set USART 2 Baud Rate
  760.     out    q2baud
  761.     mvi    a,q3brate    ;Set USART 3 Baud Rate
  762.     out    q3baud
  763.  
  764. ;  Clear Garbage Char from CRT
  765.     call    cscrt        ;Gobble up unwanted char
  766.     ora    a        ;A=0 if none
  767.     cnz    cicrt        ;Grab character
  768.     ret
  769.  
  770. ;  Set All Quad I/O Control Ports
  771. setquad:
  772.     out    q0stat        ;USART 0
  773.     out    q1stat        ;USART 1
  774.     out    q2stat        ;USART 2
  775.     out    q3stat        ;USART 3
  776.     xthl            ;Long Delay
  777.     xthl
  778.     ret
  779.  
  780.  
  781. *****************************************************************
  782. *                                *
  783. *  NEWIO -- Set UC1: Device to the Device Drivers whose Jump    *
  784. *    Table is Pointed to by HL                *
  785. *                                *
  786. *  This Jump Table is structured as follows:            *
  787. *    JMP ISTAT    <-- Input Status (0=No Char, 0FFH=Char)    *
  788. *    JMP INPUT    <-- Input Character            *
  789. *    JMP OUTPUT    <-- Output Character in C        *
  790. *                                *
  791. *  The Base Address of this Jump Table (JBASE) is passed to    *
  792. *    NEWIO in the HL Register Pair.                *
  793. *                                *
  794. *****************************************************************
  795. newio:
  796.     shld    cstble+6    ;Set UC1: Input Status
  797.     lxi    d,3        ;Prepare for offset to next jump
  798.     dad    d        ;HL points to next jump
  799.     shld    citble+6    ;Set UC1: Input Character
  800.     dad    d        ;HL points to next jump
  801.     shld    cotble+6    ;Set UC1: Output Character
  802.     ret
  803.  
  804.  
  805. *****************************************************************
  806. *                                *
  807. *  Input Status, Input Character, and Output Character        *
  808. *    Subroutines for CP/M                    *
  809. *                                *
  810. *****************************************************************
  811. *                                *
  812. *  Input Status --                        *
  813. *    These routines return 0 in the A Register if no input    *
  814. * data is available, 0FFH if input data is available.        *
  815. *                                *
  816. *  Input Character --                        *
  817. *    These routines return the character (byte) in the A    *
  818. * Register.  MSB is masked off.                    *
  819. *                                *
  820. *  Output Character --                        *
  821. *    These routines output the character (byte) in the C    *
  822. * Register.                            *
  823. *                                *
  824. *****************************************************************
  825.  
  826. *****************************************************************
  827. *                                *
  828. *  CRT Input Status, Input Character, and Output Character    *
  829. *                                *
  830. *****************************************************************
  831.  
  832. cscrt    equ    $    ;CRT Input Status
  833.     lda    ustat    ;Get Status
  834.     cma        ;Inverted Logic
  835.     ani    istat    ;Mask for input status and fall thru to 'STAT'
  836.     jr    stat    ;Set Flags
  837.  
  838. coscrt    equ    $    ;CRT Output Status
  839.     lda    ustat    ;Get USART status
  840.     cma        ;Inverted Logic
  841.     ani    ostat    ;Mask for output status
  842.     jr    stat    ;Return
  843.  
  844. cicrt    equ    $    ;CRT Input
  845.     jmp    djcin    ;Get char
  846.  
  847. cocrt    equ    $    ;CRT Output
  848.     jmp    djcout    ;Put char
  849.  
  850. cocrtp    equ    $    ;CRT and Printer Output
  851.     push    b    ;Save char
  852.     call    djcout    ;CRT Output
  853.     pop    b    ;Get char
  854.     jmp    cotty    ;Printer Output
  855.  
  856. *****************************************************************
  857. *                                *
  858. *  Modem Input Status, Input Character, and Output Character    *
  859. *                                *
  860. *****************************************************************
  861.  
  862. csmod    equ    $    ;Modem Input Status
  863.     in    mods
  864.     ani    mrda    ;Data available?
  865.     jr    stat
  866.  
  867. cosmod    equ    $    ;Modem Output Status
  868.     in    mods    ;Get status
  869.     ani    mtbe    ;TBE?
  870.     jr    stat
  871.  
  872. cimod    equ    $    ;Modem Input Character
  873.     call    csmod    ;RDA? 
  874.     jrz    cimod
  875.     in    modd    ;Get data
  876.     ani    7fh    ;Mask
  877.     ret
  878.  
  879. comod    equ    $    ;Modem Output
  880.     call    cosmod    ;TBE?
  881.     jrz    comod
  882.     mov    a,c    ;Get char
  883.     out    modd    ;Put data
  884.     ret
  885.  
  886. *****************************************************************
  887. *                                *
  888. *  Clock Input Status, Input Character, and Output Character    *
  889. *                                *
  890. *****************************************************************
  891.  
  892. csclk    equ    $    ;TTY Input Status
  893.     in    q1stat    ;Get Status
  894.     ani    qrda    ;Data available?
  895.     jr    stat
  896.  
  897. cosclk    equ    $    ;TTY Output Status
  898.     in    q1stat    ;Get Status
  899.     ani    qtbe    ;TBE?
  900.     jr    stat
  901.  
  902. ciclk    equ    $    ;TTY Input Character
  903.     call    csclk    ;RDA?
  904.     jrz    ciclk
  905.     in    q1data    ;Get data
  906.     ani    7fh    ;Mask
  907.     ret
  908.  
  909. coclk    equ    $    ;TTY Output Character
  910.     call    cosclk    ;TBE?
  911.     jrz    coclk
  912.     mov    a,c    ;Get data
  913.     out    q1data    ;Put data
  914.     ret
  915.  
  916. *****************************************************************
  917. *                                *
  918. * This is a common return point to correctly set the return     *
  919. *    status flags; it is centrally located for the jump        *
  920. *    relative instructions                    *
  921. *                                *
  922. *****************************************************************
  923. stat:
  924.     rz        ;Nothing found
  925. ready:
  926.     mvi    a,0ffh    ;Set A for negative status
  927.     ret
  928.  
  929. *****************************************************************
  930. *                                *
  931. *  TTY Input Status, Input Character, and Output Character    *
  932. *                                *
  933. *****************************************************************
  934.  
  935. cstty    equ    $    ;TTY Input Status
  936.     in    q3stat    ;Get Status
  937.     ani    qrda    ;Data available?
  938.     jr    stat
  939.  
  940. costty    equ    $    ;TTY Output Status
  941.     in    q3stat    ;Get Status
  942.     ani    qtbe    ;TBE?
  943.     jr    stat
  944.  
  945. citty    equ    $    ;TTY Input Character
  946.     call    cstty    ;RDA?
  947.     jrz    citty
  948.     in    q3data    ;Get data
  949.     ani    7fh    ;Mask
  950.     ret
  951.  
  952. cotty    equ    $    ;TTY Output Character
  953.     call    costty    ;TBE?
  954.     jrz    cotty
  955.     mov    a,c    ;Get data
  956.     out    q3data    ;Put data
  957.     ret
  958.  
  959. *****************************************************************
  960. *                                *
  961. *  Remote System Input Status, Input Character, and Output    *
  962. *    Character                        *
  963. *                                *
  964. *****************************************************************
  965.  
  966. csrem    equ    $    ;TTY Input Status
  967.     in    q0stat    ;Get Status
  968.     ani    qrda    ;Data available?
  969.     jr    stat
  970.  
  971. cosrem    equ    $    ;TTY Output Status
  972.     in    q0stat    ;Get Status
  973.     ani    qtbe    ;TBE?
  974.     jr    stat
  975.  
  976. cirem    equ    $    ;TTY Input Character
  977.     call    csrem    ;RDA?
  978.     jrz    cirem
  979.     in    q0data    ;Get data
  980.     ani    7fh    ;Mask
  981.     ret
  982.  
  983. corem    equ    $    ;TTY Output Character
  984.     call    coxoff    ;Check for XOFF and process
  985.     call    cosrem    ;TBE?
  986.     jrz    corem
  987.     mov    a,c    ;Get data
  988.     out    q0data    ;Put data
  989.     ret
  990.  
  991. coxoff    equ    $    ;Remote XOFF Check and Processing
  992.     call    csrem    ;Input Char from LST: Device?
  993.     rz        ;Zero if none
  994.     call    cirem    ;Get Char
  995.     cpi    XOFF    ;XOFF?
  996.     rnz        ;Return if not
  997.     call    cirem    ;Wait for Any Other Char
  998.     ret
  999.  
  1000. *****************************************************************
  1001. *                                *
  1002. *  User-Defined (CRT and Modem) Input Status, Input Character,    *
  1003. *    and Output Character                    *
  1004. *                                *
  1005. *****************************************************************
  1006.  
  1007. csusr    equ    $    ;User (CRT and Modem) Input Status
  1008.     call    cscrt    ;Input from CRT?
  1009.     rnz        ;Char found
  1010.     call    csmod    ;Input from Modem?
  1011.     ret
  1012.  
  1013. cosusr    equ    cosmod    ;Output status same as modem since modem is slower
  1014.  
  1015. ciusr    equ    $    ;Modem/CRT Input Combination
  1016.     call    cscrt    ;Input from CRT?
  1017.     jnz    cicrt    ;Get char from CRT
  1018.     call    csmod    ;Input from Modem?
  1019.     jnz    cimod    ;Get char from Modem
  1020.     jr    ciusr    ;Continue
  1021.  
  1022. cousr    equ    $    ;Modem/CRT Output Combination
  1023.     call    comod    ;Output to Modem
  1024.     jmp    cocrt    ;Output to CRT
  1025.  
  1026. ciusr1    equ    $    ;Modem/CRT Input w/CRT Output Combination
  1027.     call    ciusr    ;Get char
  1028.     push    psw    ;Save char in A
  1029.     mov    c,a    ;Char in C
  1030.     call    cocrt    ;Output to CRT
  1031.     pop    psw    ;Restore char in A
  1032.     ret
  1033.  
  1034. cousr1    equ    $    ;Remote System/CRT Output Combination
  1035.     call    corem    ;Output to Remote System
  1036.     jmp    cocrt    ;Output to CRT
  1037.  
  1038. ;
  1039. ;  COPEN -- Open Console File for Output
  1040. ;  LOPEN -- Open Printer File for Output
  1041. ;
  1042. ;    Do Nothing Since Not Supported
  1043. ;
  1044. copen:
  1045. lopen:
  1046.     ret
  1047.  
  1048. ;
  1049. ;  Close Disk Files
  1050. ;    CCLOSE -- CON file (DSK1)
  1051. ;    LCLOSE -- LST file (DSK2)
  1052. ;
  1053. ;    Do Nothing Since Not Supported
  1054. ;
  1055. cclose:
  1056. lclose:
  1057.     ret
  1058.  
  1059. ;
  1060. ;  End Message
  1061. ;
  1062.     db    'End of SYSIO',0
  1063.  
  1064.     end
  1065.