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 / CPM / ZCPR2 / SYSIO.ASM < prev    next >
Assembly Source File  |  2000-06-30  |  31KB  |  1,141 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. *  12 June 1983                            *
  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    100$1$1$000B    ;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    20h    ; 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    bm09600    ;   9600 Baud for TTY
  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    b01200    ;  1200 Baud for Transmodem
  141. q3brate    equ    b09600    ;  9600 Baud for NEC 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    6,(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    namcrt    ;CRT
  580.     dw    namusr    ;CRT and Modem in Parallel
  581.     dw    namusr1    ;CRT Input and CRT/Remote Computer Output
  582.     dw    namusr2    ;CRT Input and CRT/Modem Output
  583.     dw    namcrtt    ;CRT Input and CRT/TTY Printer Output
  584.     dw    namcrtn    ;CRT Input and CRT/NEC Printer Output
  585.  
  586. lstname:
  587.     dw    namtty    ;TTY
  588.     dw    namcrt    ;CRT
  589.     dw    namrem    ;Remote Computer
  590.     dw    nammod    ;Modem
  591.     dw    nammpu    ;MPU
  592.     dw    nammpu8    ;MPU with 8 Bits
  593.  
  594. rdrname:
  595.     dw    nammod    ;Modem
  596.     dw    namclk    ;Clock
  597.  
  598. punname:
  599.     dw    nammod    ;Modem
  600.     dw    namclk    ;Clock
  601.  
  602. nammpu:
  603.     db    'TTY Toshiba P1350 Dot Matrix Printer',0
  604. nammpu8:
  605.     db    'TTY8 TTY with 8th Significant Bit',0
  606. namtty:
  607.     db    'NEC NEC 3510 Letter-Quality Printer',0
  608. namcrt:
  609.     db    'CRT Televideo 950 CRT',0
  610. namcrtn:
  611.     db    'CRTNEC CRT Input and CRT/NEC Printer Output',0
  612. namcrtt:
  613.     db    'CRTTY CRT Input and CRT/TTY Printer Output',0
  614. namusr:
  615.     db    'CRTMOD CRT and Modem in Parallel',0
  616. namusr1:
  617.     db    'CRTREM CRT Input and CRT/Remote Output',0
  618. namusr2:
  619.     db    'CRTMOD2 CRT Input and CRT/Modem Output',0
  620. namrem:
  621.     db    'REMOTE Remote Computer',0
  622. nammod:
  623.     db    'MODEM DC Hayes Smartmodem',0
  624. namclk:
  625.     db    'CLOCK DC Hayes Chronograph',0
  626.  
  627. *
  628. * console input table
  629. *
  630. citble:
  631.     dw    cicrt        ;Input from crt (000)
  632.     dw    ciusr        ;Input from crt and modem (001) 
  633.     dw    cicrt        ;Input from crt (010)
  634.     dw    cicrt        ;Input from crt (011)
  635.     dw    cicrt        ;Input from crt (100)
  636.     dw    cicrt        ;Input from crt (101)
  637.  
  638. *
  639. * console output table
  640. *
  641. cotble:
  642.     dw    cocrt        ;Output to crt (000)
  643.     dw    cousr        ;Output to crt and modem (001)
  644.     dw    cousr1        ;Output to crt and remote system (010) 
  645.     dw    cousr        ;Output to crt and modem (011)
  646.     dw    cocrtt        ;Output to crt and TTY printer (100)
  647.     dw    cocrtn        ;Output to crt and NEC printer (101)
  648.  
  649. *
  650. * list device table
  651. *
  652. ltble:
  653.     dw    cotty        ;Output to tty (000) 
  654.     dw    cocrt        ;Output to crt (001)
  655.     dw    corem        ;Output to remote system (010)
  656.     dw    comod        ;Output to modem (011)
  657.     dw    compu        ;Output to mpu (100)
  658.     dw    compu8        ;Output to mpu (101)
  659.  
  660. *
  661. * punch device table
  662. *
  663.  
  664. ptble:
  665.     dw    comod        ;Output to modem (0)
  666.     dw    coclk        ;Output to clock (1) 
  667.  
  668. *
  669. * reader device table
  670. *
  671. rtble:
  672.     dw    cimod        ;Input from modem (0)
  673.     dw    ciclk        ;Input from clock (1)
  674.  
  675. *
  676. * console status table
  677. *
  678. cstble:
  679.     dw    cscrt        ;Status from crt (000)
  680.     dw    csusr        ;Status from crt and modem (001)
  681.     dw    cscrt        ;Status from crt (010)
  682.     dw    cscrt        ;Status from crt (011)
  683.     dw    cscrt        ;Status from crt (100)
  684.     dw    cscrt        ;Status from crt (101)
  685.  
  686. *
  687. * status from reader device
  688. *
  689. csrtble:
  690.     dw    csmod        ;Status from modem (0)
  691.     dw    csclk        ;Status from clock (1)
  692.  
  693. *
  694. * Status from list device
  695. *
  696. lstble:
  697.     dw    costty        ;Status from tty (000)
  698.     dw    coscrt        ;Status from crt (001)
  699.     dw    cosrem        ;Status from remote system (010)
  700.     dw    cosmod        ;Status from modem (011)
  701.     dw    cosmpu        ;Status from mpu (100)
  702.     dw    cosmpu        ;Status from mpu (101)
  703.  
  704.  
  705. *****************************************************************
  706. *                                *
  707. * Tinit can be modified for different I/O setups.        *
  708. *                                *
  709. *****************************************************************
  710. tinit:                ;Initialize the terminal routine
  711.  
  712. ;  Initialize I/O Byte
  713.     mvi    a,intioby    ;Initialize IOBYTE
  714.     sta    iobyte
  715.  
  716. ;  Initialize MPU Serial I/O Channel Characteristics and Baud Rate
  717.     mvi    a,10$00$00$11b    ;Access Divisor:
  718.                 ;  10 -- Set divisor latch, clear break
  719.                 ;  00 -- 0 parity bit, odd parity (N/A)
  720.                 ;  00 -- disable parity, 1 stop bit
  721.                 ;  11 -- 8 Data Bits
  722.     out    mpulcr        ;To Line Control Register
  723.     lxi    h,mpbrate    ;HL = MPU Channel Baud Rate
  724.     mov    a,l        ;Set Low-Byte of Baud Rate
  725.     out    mpudll        ;To Divisor Latch Low
  726.     mov    a,h        ;Set High-Byte of Baud Rate
  727.     out    mpudlh        ;To Divisor Latch High
  728.     mvi    a,00$00$00$11b    ;Reset Divisor Access and Set Characteristics:
  729.                 ;  00 -- Clear divisor latch, clear break
  730.                 ;  00 -- 0 parity bit, odd parity (N/A)
  731.                 ;  00 -- disable parity, 1 stop bit
  732.                 ;  11 -- 8 Data Bits
  733.     out    mpulcr        ;To Line Control Register
  734.     xra    a        ;A=0
  735.     out    mpuier        ;Disable All Interrupts in Interrupt Register
  736.     out    mpustat        ;Clear All Error Flags in Line Status Register
  737.     mvi    a,0000$1111b    ;3 Zeroes, No Loop, 1, Set RLSD, CTS, DSR
  738.     out    mpupcr        ;To Peripheral Control Register
  739.  
  740. ;  Initialize Quad I/O Channel Characteristics
  741.     mvi    a,10$11$01$11b    ;General-Purpose Reset:
  742.                 ;  10 -- 1 1/2 Stop Bits
  743.                 ;  11 -- Even Parity, Enable Parity
  744.                 ;  01 -- 6 Bits/Char
  745.                 ;  11 -- 64x Baud Rate
  746.     call    setquad        ;Set All 4 Quad I/O Ports
  747.     mvi    a,01$11$01$11b    ;General-Purpose Reset:
  748.                 ;  01 -- Disable Hunt, 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.     mvi    a,11$00$11$10b    ;Characteristics Set for All:
  754.                 ;  11 -- 2 Stop Bits
  755.                 ;  00 -- No Parity
  756.                 ;  11 -- 8 Bits/Char
  757.                 ;  10 -- 16x Baud Rate
  758.     call    setquad        ;Set All 4 Quad I/O Ports
  759.     mvi    a,00$11$01$11b    ;Characteristics Set for All:
  760.                 ;  00 -- Disable Hunt, No Internal Reset
  761.                 ;  11 -- RTS High, Error Reset
  762.                 ;  01 -- No Break, Enable RxRDY
  763.                 ;  11 -- NOT DTR High, Enable TxEN
  764.     call    setquad        ;Set All 4 Quad I/O Ports
  765.  
  766. ;  Initialize Quad I/O Baud Rates
  767.     mvi    a,q0brate    ;Set USART 0 Baud Rate
  768.     out    q0baud
  769.     mvi    a,q1brate    ;Set USART 1 Baud Rate
  770.     out    q1baud
  771.     mvi    a,q2brate    ;Set USART 2 Baud Rate
  772.     out    q2baud
  773.     mvi    a,q3brate    ;Set USART 3 Baud Rate
  774.     out    q3baud
  775.  
  776. ;  Clear Garbage Char from CRT
  777.     call    cscrt        ;Gobble up unwanted char
  778.     ora    a        ;A=0 if none
  779.     cnz    cicrt        ;Grab character
  780.     ret
  781.  
  782. ;  Set All Quad I/O Control Ports
  783. setquad:
  784.     out    q0stat        ;USART 0
  785.     out    q1stat        ;USART 1
  786.     out    q2stat        ;USART 2
  787.     out    q3stat        ;USART 3
  788.     xthl            ;Long Delay
  789.     xthl
  790.     ret
  791.  
  792.  
  793. *****************************************************************
  794. *                                *
  795. *  NEWIO -- Set UC1: Device to the Device Drivers whose Jump    *
  796. *    Table is Pointed to by HL                *
  797. *                                *
  798. *  This Jump Table is structured as follows:            *
  799. *    JMP ISTAT    <-- Input Status (0=No Char, 0FFH=Char)    *
  800. *    JMP INPUT    <-- Input Character            *
  801. *    JMP OUTPUT    <-- Output Character in C        *
  802. *                                *
  803. *  The Base Address of this Jump Table (JBASE) is passed to    *
  804. *    NEWIO in the HL Register Pair.                *
  805. *                                *
  806. *****************************************************************
  807. newio:
  808.     shld    cstble+6    ;Set UC1: Input Status
  809.     lxi    d,3        ;Prepare for offset to next jump
  810.     dad    d        ;HL points to next jump
  811.     shld    citble+6    ;Set UC1: Input Character
  812.     dad    d        ;HL points to next jump
  813.     shld    cotble+6    ;Set UC1: Output Character
  814.     ret
  815.  
  816.  
  817. *****************************************************************
  818. *                                *
  819. *  Input Status, Input Character, and Output Character        *
  820. *    Subroutines for CP/M                    *
  821. *                                *
  822. *****************************************************************
  823. *                                *
  824. *  Input Status --                        *
  825. *    These routines return 0 in the A Register if no input    *
  826. * data is available, 0FFH if input data is available.        *
  827. *                                *
  828. *  Input Character --                        *
  829. *    These routines return the character (byte) in the A    *
  830. * Register.  MSB is masked off.                    *
  831. *                                *
  832. *  Output Character --                        *
  833. *    These routines output the character (byte) in the C    *
  834. * Register.                            *
  835. *                                *
  836. *****************************************************************
  837.  
  838. *****************************************************************
  839. *                                *
  840. *  CRT Input Status, Input Character, and Output Character    *
  841. *                                *
  842. *****************************************************************
  843.  
  844. cscrt    equ    $    ;CRT Input Status
  845.     lda    ustat    ;Get Status
  846.     cma        ;Inverted Logic
  847.     ani    istat    ;Mask for input status and fall thru to 'STAT'
  848.     jr    stat    ;Set Flags
  849.  
  850. coscrt    equ    $    ;CRT Output Status
  851.     lda    ustat    ;Get USART status
  852.     cma        ;Inverted Logic
  853.     ani    ostat    ;Mask for output status
  854.     jr    stat    ;Return
  855.  
  856. cicrt    equ    $    ;CRT Input
  857.     jmp    djcin    ;Get char
  858.  
  859. cocrt    equ    $    ;CRT Output
  860.     jmp    djcout    ;Put char
  861.  
  862. cocrtt    equ    $    ;CRT and TTY Printer Output
  863.     push    b    ;Save char
  864.     call    djcout    ;CRT Output
  865.     pop    b    ;Get char
  866.     jmp    compu    ;Printer Output
  867.  
  868. cocrtn    equ    $    ;CRT and NEC Printer Output
  869.     push    b    ;Save char
  870.     call    djcout    ;CRT Output
  871.     pop    b    ;Get char
  872.     jmp    cotty    ;Printer Output
  873.  
  874. *****************************************************************
  875. *                                *
  876. *  Modem Input Status, Input Character, and Output Character    *
  877. *                                *
  878. *****************************************************************
  879.  
  880. csmod    equ    $    ;Modem Input Status
  881.     in    mods
  882.     ani    mrda    ;Data available?
  883.     jr    stat
  884.  
  885. cosmod    equ    $    ;Modem Output Status
  886.     in    mods    ;Get status
  887.     ani    mtbe    ;TBE?
  888.     jr    stat
  889.  
  890. cimod    equ    $    ;Modem Input Character
  891.     call    csmod    ;RDA? 
  892.     jrz    cimod
  893.     in    modd    ;Get data
  894.     ani    7fh    ;Mask
  895.     ret
  896.  
  897. comod    equ    $    ;Modem Output
  898.     call    cosmod    ;TBE?
  899.     jrz    comod
  900.     mov    a,c    ;Get char
  901.     out    modd    ;Put data
  902.     ret
  903.  
  904. *****************************************************************
  905. *                                *
  906. *  Clock Input Status, Input Character, and Output Character    *
  907. *                                *
  908. *****************************************************************
  909.  
  910. csclk    equ    $    ;TTY Input Status
  911.     in    q1stat    ;Get Status
  912.     ani    qrda    ;Data available?
  913.     jr    stat
  914.  
  915. cosclk    equ    $    ;TTY Output Status
  916.     in    q1stat    ;Get Status
  917.     ani    qtbe    ;TBE?
  918.     jr    stat
  919.  
  920. ciclk    equ    $    ;TTY Input Character
  921.     call    csclk    ;RDA?
  922.     jrz    ciclk
  923.     in    q1data    ;Get data
  924.     ani    7fh    ;Mask
  925.     ret
  926.  
  927. coclk    equ    $    ;TTY Output Character
  928.     call    cosclk    ;TBE?
  929.     jrz    coclk
  930.     mov    a,c    ;Get data
  931.     out    q1data    ;Put data
  932.     ret
  933.  
  934. *****************************************************************
  935. *                                *
  936. * This is a common return point to correctly set the return     *
  937. *    status flags; it is centrally located for the jump        *
  938. *    relative instructions                    *
  939. *                                *
  940. *****************************************************************
  941. stat:
  942.     rz        ;Nothing found
  943. ready:
  944.     mvi    a,0ffh    ;Set A for negative status
  945.     ret
  946.  
  947. *****************************************************************
  948. *                                *
  949. *  NEC Input Status, Input Character, and Output Character    *
  950. *    X-OFF Processing Added                    *
  951. *                                *
  952. *****************************************************************
  953.  
  954. cstty    equ    $    ;TTY Input Status
  955.     in    q3stat    ;Get Status
  956.     ani    qrda    ;Data available?
  957.     jr    stat
  958.  
  959. costty    equ    $    ;TTY Output Status
  960.     in    q3stat    ;Get Status
  961.     ani    qtbe    ;TBE?
  962.     jr    stat
  963.  
  964. citty    equ    $    ;TTY Input Character
  965.     call    cstty    ;RDA?
  966.     jrz    citty
  967.     in    q3data    ;Get data
  968.     ani    7fh    ;Mask
  969.     ret
  970.  
  971. cotty    equ    $    ;TTY Output Character
  972.     call    cstty    ;Any character?
  973.     jrnz    cotty2    ;Process if so
  974. cotty1:
  975.     call    costty    ;TBE?
  976.     jrz    cotty1
  977.     mov    a,c    ;Get data
  978.     out    q3data    ;Put data
  979.     ret
  980. cotty2:
  981.     call    citty    ;X-OFF?
  982.     cpi    XOFF    ;Do nothing if not X-OFF
  983.     jrnz    cotty1
  984.     call    citty    ;Wait for next char
  985.     jr    cotty1
  986.  
  987. *****************************************************************
  988. *                                *
  989. *  Remote System Input Status, Input Character, and Output    *
  990. *    Character                        *
  991. *                                *
  992. *****************************************************************
  993.  
  994. csrem    equ    $    ;TTY Input Status
  995.     in    q0stat    ;Get Status
  996.     ani    qrda    ;Data available?
  997.     jr    stat
  998.  
  999. cosrem    equ    $    ;TTY Output Status
  1000.     in    q0stat    ;Get Status
  1001.     ani    qtbe    ;TBE?
  1002.     jr    stat
  1003.  
  1004. cirem    equ    $    ;TTY Input Character
  1005.     call    csrem    ;RDA?
  1006.     jrz    cirem
  1007.     in    q0data    ;Get data
  1008.     ani    7fh    ;Mask
  1009.     ret
  1010.  
  1011. corem    equ    $    ;TTY Output Character
  1012.     call    coxoff    ;Check for XOFF and process
  1013.     call    cosrem    ;TBE?
  1014.     jrz    corem
  1015.     mov    a,c    ;Get data
  1016.     out    q0data    ;Put data
  1017.     ret
  1018.  
  1019. coxoff    equ    $    ;Remote XOFF Check and Processing
  1020.     call    csrem    ;Input Char from LST: Device?
  1021.     rz        ;Zero if none
  1022.     call    cirem    ;Get Char
  1023.     cpi    XOFF    ;XOFF?
  1024.     rnz        ;Return if not
  1025.     call    cirem    ;Wait for Any Other Char
  1026.     ret
  1027.  
  1028. *****************************************************************
  1029. *                                *
  1030. *  TTY Input Status, Input Character, and Output Character    *
  1031. *    X-OFF Processing Added                    *
  1032. *                                *
  1033. *****************************************************************
  1034.  
  1035. csmpu    equ    $    ;TTY Input Status
  1036.     in    mpustat    ;Get Status
  1037.     ani    mpurda    ;Data available?
  1038.     jr    stat
  1039.  
  1040. cosmpu    equ    $    ;TTY Output Status
  1041.     in    mpustat    ;Get Status
  1042.     ani    mputbe    ;TBE?
  1043.     jr    stat
  1044.  
  1045. cimpu    equ    $    ;TTY Input Character
  1046.     call    csmpu    ;RDA?
  1047.     jrz    cimpu
  1048.     in    mpudata    ;Get data
  1049.     ani    7fh    ;Mask
  1050.     ret
  1051.  
  1052. compu8    equ    $    ;TTY Output Character (8 Sig Bits)
  1053.     mvi    a,0ffh    ;8th Bit Allowed
  1054.     jr    compu0
  1055. compu    equ    $    ;TTY Output Character
  1056.     mvi    a,07fh    ;No 8th Bit
  1057. compu0:
  1058.     sta    mpumask
  1059.     call    csmpu    ;Any character?
  1060.     jrnz    compu2    ;Process if so
  1061. compu1:
  1062.     call    cosmpu    ;TBE?
  1063.     jrz    compu1
  1064.     mov    a,c    ;Get data
  1065.     ani    0ffh    ;Mask
  1066. mpumask    equ    $-1    ;Address of Mask
  1067.     out    mpudata    ;Put data
  1068.     ret
  1069. compu2:
  1070.     call    cimpu    ;X-OFF?
  1071.     cpi    XOFF    ;Do nothing if not X-OFF
  1072.     jrnz    compu1
  1073.     call    cimpu    ;Wait for next char
  1074.     jr    compu1
  1075.  
  1076. *****************************************************************
  1077. *                                *
  1078. *  User-Defined (CRT and Modem) Input Status, Input Character,    *
  1079. *    and Output Character                    *
  1080. *                                *
  1081. *****************************************************************
  1082.  
  1083. csusr    equ    $    ;User (CRT and Modem) Input Status
  1084.     call    cscrt    ;Input from CRT?
  1085.     rnz        ;Char found
  1086.     call    csmod    ;Input from Modem?
  1087.     ret
  1088.  
  1089. cosusr    equ    cosmod    ;Output status same as modem since modem is slower
  1090.  
  1091. ciusr    equ    $    ;Modem/CRT Input Combination
  1092.     call    cscrt    ;Input from CRT?
  1093.     jnz    cicrt    ;Get char from CRT
  1094.     call    csmod    ;Input from Modem?
  1095.     jnz    cimod    ;Get char from Modem
  1096.     jr    ciusr    ;Continue
  1097.  
  1098. cousr    equ    $    ;Modem/CRT Output Combination
  1099.     call    comod    ;Output to Modem
  1100.     jmp    cocrt    ;Output to CRT
  1101.  
  1102. ciusr1    equ    $    ;Modem/CRT Input w/CRT Output Combination
  1103.     call    ciusr    ;Get char
  1104.     push    psw    ;Save char in A
  1105.     mov    c,a    ;Char in C
  1106.     call    cocrt    ;Output to CRT
  1107.     pop    psw    ;Restore char in A
  1108.     ret
  1109.  
  1110. cousr1    equ    $    ;Remote System/CRT Output Combination
  1111.     call    corem    ;Output to Remote System
  1112.     jmp    cocrt    ;Output to CRT
  1113.  
  1114. ;
  1115. ;  COPEN -- Open Console File for Output
  1116. ;  LOPEN -- Open Printer File for Output
  1117. ;
  1118. ;    Do Nothing Since Not Supported
  1119. ;
  1120. copen:
  1121. lopen:
  1122.     ret
  1123.  
  1124. ;
  1125. ;  Close Disk Files
  1126. ;    CCLOSE -- CON file (DSK1)
  1127. ;    LCLOSE -- LST file (DSK2)
  1128. ;
  1129. ;    Do Nothing Since Not Supported
  1130. ;
  1131. cclose:
  1132. lclose:
  1133.     ret
  1134.  
  1135. ;
  1136. ;  End Message
  1137. ;
  1138.     db    'End of SYSIO',0
  1139.  
  1140.     end
  1141.