home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / cpm / mex / mxo-gb12.asm < prev    next >
Assembly Source File  |  1994-07-13  |  19KB  |  711 lines

  1.  
  2.     TITLE    'CompuPro overlay for Interfacer 3/4'
  3. ;
  4. ;  MXO-GB10.ASM -- MEX overlay file for the CompuPro I3/I4 & SS1.  05/12/84
  5. ;
  6. ;  This overlay adapts the mex modem program to the CompuPro Interfacer 3 or
  7. ;  Interfacer 4 or System Support 1 serial cards using the 2651 usart chip.
  8. ;
  9. ;
  10. ;  This overlay is capable of setting baud rate and setting port number
  11. ;  (via the SET command), setting baud rate from the phone library, dis-
  12. ;  connecting the  modem, and sending a break.
  13. ;
  14. REV    EQU    12    ; version 1.2
  15. ;
  16. ;  Note to Interfacer 4 users:
  17. ;  The 'middle' serial port and the Centronics port can have their addresses
  18. ;  changed using a hardware option.  Godbout did this to maintain software
  19. ;  compatibility with their BIOS.  In order to prevent problems, use the
  20. ;  'right' serial port (relative user 5) instead of the center serial
  21. ;  port (relative user 6).  Also, read page 19 of the manual, the modem
  22. ;  port will probably have to be set up in the 'master mode'.  While
  23. ;  you're reading the manual, read the section on 'wait state logic'.
  24. ;  I'm using a CPU-Z running at 6mhz, with a 300 baud modem and two wait
  25. ;  states (jumper at j7).  Without them, I get 'o's for 'n's and 'g's
  26. ;  for 'f's, and the checksums are never right.  (aww 12/20/83)
  27. ;
  28. ;  Calling conventions for the various overlay entry points are detailed more
  29. ;  fully in the PMMI overlay (MXO-PMxx.ASM, where xx=revision number)
  30. ;
  31. ;  History as a MEX overlay:
  32. ;
  33. ;  12/04/87 - Added routines to change number of
  34. ;          stop bits, data bits, and partiy. - Dave Chapman
  35. ;  27/03/87 - Added GOODBY routine to drop DTR
  36. ;          when exiting to CP/M.        - Dave Chapman
  37. ;  27/12/86 - Changed a bit for SS1, added
  38. ;          110 and 2400 baud and instruction
  39. ;          equates, changed set error.    - Dave Chapman
  40. ;  05/12/84 - set port (0-7, S -- S=SS1)    - Ron Fowler
  41. ;  05/11/84 - MEXified the overlay        - Ron Fowler
  42. ;
  43. ;  History as an MDM7 overlay:
  44. ;
  45. ;  11/20/83 - Interfacer 4 note added        - A.W. Warren
  46. ;  11/11/83 - Renamed to M7IN-1.ASM, no changes - Irv Hoff
  47. ;  07/27/83 - Renamed to work with MDM712    - Irv Hoff
  48. ;  07/11/83 - Modifed somewhat for MDM711    - Irv Hoff
  49. ;  07/08/83 - Adapted from MDM711GP.ASM     - Paul Traina
  50. ;
  51. ;
  52. ;  MEX service processor stuff:
  53. ;
  54. MEX    EQU    0D00H        ; Address of the service processor
  55. INMDM    EQU    255        ; Get char from port to A, CY=no more in 100 MS
  56. TIMER    EQU    254        ; Delay 100MS * reg B
  57. TMDINP    EQU    253        ; B=# secs to wait for char, CY=no char
  58. CHEKCC    EQU    252        ; Check for ^C from kbd, Z=present
  59. SNDRDY    EQU    251        ; Test for modem-send ready
  60. RCVRDY    EQU    250        ; Test for modem-receive ready
  61. SNDCHR    EQU    249        ; Send a character to the modem (after SNDRDY)
  62. RCVCHR    EQU    248        ; Recv a char from modem (after RCVRDY)
  63. LOOKUP    EQU    247        ; Table search: see CMDTBL comments for info
  64. PARSFN    EQU    246        ; Parse filename from input stream
  65. BDPARS    EQU    245        ; Parse baud-rate from input stream
  66. SBLANK    EQU    244        ; Scan input stream to next non-blank
  67. EVALA    EQU    243        ; Evaluate numeric from input stream
  68. LKAHED    EQU    242        ; Get nxt char w/o removing from input
  69. GNC    EQU    241        ; Get char from input, CY=1 if none
  70. ILP    EQU    240        ; Inline print
  71. DECOUT    EQU    239        ; Decimal output
  72. PRBAUD    EQU    238        ; Print baud rate
  73. ;
  74. CONOUT    EQU    2        ; Simulated BDOS function 2: console char out
  75. PRINT    EQU    9        ; Simulated BDOS function 9: print string
  76. INBUF    EQU    10        ; Input buffer, same structure as BDOS 10
  77. ;
  78. BELL    EQU    7        ; Bell
  79. TAB    EQU    9
  80. CR    EQU    13        ; Carriage return
  81. LF    EQU    10        ; Linefeed
  82. ESC    EQU    1BH        ; Escape
  83. YES    EQU    0FFH
  84. NO    EQU    0
  85. ;
  86. ; Interfacer 3/4 and SS1 port equates:
  87. ;
  88. INBASE    EQU    010H        ; Base port of CompuPro I3 or I4 card(s)
  89. SSBASE    EQU    05CH        ; Base of serial section of CompuPro SS1
  90. ;
  91. UPORT    EQU    INBASE+7    ; User (chip select) port
  92. ;
  93. ; Port offsets:
  94. ;
  95. DPORT:    EQU    0        ; Data port
  96. SPORT:    EQU    1        ; Status port
  97. MPORT:    EQU    2        ; Mode port
  98. CPORT:    EQU    3        ; Control port
  99. ;
  100. TBMT:    EQU    01H        ; Transmit buffer empty
  101. DAV:    EQU    02H        ; Data available
  102. ;
  103. BIT5    EQU    02H        ; 5 bits
  104. BIT6    EQU    06H        ; 6 bits
  105. BIT7    EQU    0AH        ; 7 bits
  106. BIT8    EQU    0EH        ; 8 bits
  107. BITMSK    EQU    0EH        ; Mask to get character length
  108. PARE    EQU    30H        ; Even parity
  109. PARO    EQU    10H        ; Odd parity
  110. PARN1    EQU    00H        ; No parity
  111. PARN2    EQU    20H        ; Another code for no parity
  112. PARMSK    EQU    30H        ; Mask to get parity bits
  113. STP1    EQU    40H        ; 1 stop bit
  114. STP15    EQU    80H        ; 1.5 stop bits
  115. STP2    EQU    0C0H        ; 2 stop bits
  116. STPMSK    EQU    0C0H        ; Mask to get stop bits
  117. ;
  118. ;
  119. ; Command register instruction:
  120. ;
  121. MCMD    EQU    27H        ; TxEn, DTR, RxEn, RTS
  122. ;
  123. ; Break command instruction:
  124. ;
  125. BKCMD    EQU    2FH        ; Send break
  126. ;
  127. ;  Baud rate parameters:
  128. ;
  129. BD110:    EQU    32H        ; 110 baud
  130. BD300:    EQU    35H        ; 300 baud
  131. BD450:    EQU    00H        ; 450 baud (not supported here)
  132. BD600:    EQU    36H        ; 600 baud
  133. BD710:    EQU    00H        ; 710 baud (not supported here)
  134. BD1200:    EQU    37H        ; 1200 baud
  135. BD2400:    EQU    3AH        ; 2400 baud
  136. BD4800:    EQU    3CH        ; 4800 baud
  137. BD9600:    EQU    3EH        ; 9600 baud
  138. BD19200    EQU    3FH        ; 19200 baud
  139. ;
  140.     ORG    100H
  141. ;
  142. ; Change the clock speed to suit your system:
  143. ;
  144.     DS    3        ; (for    "JMP   START" instruction)
  145.  
  146.     DB    NO        ; Yes=PMMI S-100 modem            103h
  147.     DB    YES        ; Yes=Hayes Smartmodem, no=non-PMMI    104h
  148.     DB    'P'        ; T=touch, p=pulse (Smartmodem-only)    105h
  149. CLOCK:    DB    60        ; Clock speed in mhz x10, 25.5 mhz max. 106h
  150.                 ; 20=2 mhz, 37=3.68 mhz, 40=4 mhz, etc.
  151. MSPEED:    DB    5        ; 0=110 1=300 2=450 3=600 4=710 5=1200    107h
  152.                 ;   6=2400 7=4800 8=9600 9=19200 default
  153. BYTDLY:    DB    5        ; 0=0 delay  1=10ms  5=50 ms - 9=90 ms    108h
  154.                 ;   default time to send character in ter-
  155.                 ;   minal mode file transfer for slow bbs.
  156. CRDLY:    DB    5        ; 0=0 delay 1=100 ms 5=500 ms - 9=900 ms 109h
  157.                 ;   default time for extra wait after crlf
  158.                 ;   in terminal mode file transfer
  159. COLUMS:    DB    5        ; Number of dir columns shown        10ah
  160. SETFLG:    DB    YES        ; Yes=user-added setup routine        10bh
  161. SCRTST:    DB    YES        ; Cursor control routine        10ch
  162.     DB    YES        ; Yes=resend a record after any non-ack 10dh
  163.                 ;   no=resend a record after a valid-nak
  164. BAKFLG:    DB    NO        ; Yes=change any file same name to .bak 10eh
  165. CRCDFL:    DB    YES        ; Yes=default to crc checking        10fh
  166. TOGCRC:    DB    YES        ; Yes=allow toggling of crc to checksum 110h
  167. CVTBS:    DB    NO        ; Yes=convert backspace to rub        111h
  168. TOGLBK:    DB    YES        ; Yes=allow toggling of bksp to rub    112h
  169. ADDLF:    DB    NO        ; No=no lf after cr to send file in    113h
  170.                 ;   terminal mode (added by remote echo)
  171. TOGLF:    DB    YES        ; Yes=allow toggling of lf after cr    114h
  172.     DB    YES        ; Yes=allow transmission of logon    115h
  173.                 ;   write logon sequence at location logon
  174. SAVCCP:    DB    YES        ; Yes=do not overwrite ccp        116h
  175.     DB    NO        ; Yes=local command if extchr precedes    117h
  176.                 ;   no=external command if extchr precedes
  177.     DB    YES        ; Yes=allow toggling of loconextchr    118h
  178. LSTTST:    DB    YES        ; Yes=printer available on printer port 119h
  179. XOFTST:    DB    YES        ; Yes=checks for xoff from remote while 11ah
  180.                 ;   sending a file in terminal mode
  181. XONWT:    DB    NO        ; Yes=wait for xon after cr while    11bh
  182.                 ;   sending a file in terminal mode
  183. TOGXOF:    DB    YES        ; Yes=allow toggling of xoff checking    11ch
  184. IGNCTL:    DB    YES        ; Yes=ctl-chars above ^m not displayed    11dh
  185. EXTRA1:    DB    0        ; For future expansion            11eh
  186. EXITCHR    DB    'E'-40H        ; ^E = exit to main menu        11fh
  187. BRKCHR:    DB    '@'-40H        ; ^@ = send 300 ms. break tone        120h
  188. NOCONN:    DB    'N'-40H        ; ^N = disconnect from the phone line    121h
  189. LOGCHR:    DB    'L'-40H        ; ^L = send logon            122h
  190. LSTCHR:    DB    'P'-40H        ; ^P = toggle printer            123h
  191. UNSAVE:    DB    'R'-40H        ; ^R = close input text buffer        124h
  192. TRNCHR:    DB    'T'-40H        ; ^T = transmit file to remote        125h
  193. SAVCHR:    DB    'Y'-40H        ; ^Y = open input text buffer        126h
  194. EXTCHR:    DB    '^'-40H        ; ^^ = send next character        127h
  195.     DS    2        ; Unused by MEX             128h
  196. ;
  197. INCTL1:    JMP    INSP        ; Go input status port            12ah
  198.     DS    7
  199. ;
  200. OTDATA:    JMP    OUTDP        ; Go output data port            134h
  201.     DS    7
  202. ;
  203. INPORT:    JMP    INDP        ; Go input data port            13eh
  204.     DS    7
  205. ;
  206. MASKR:    ANI    DAV    ! RET    ; Bit to test for receive ready     148h
  207. TESTR:    CPI    DAV    ! RET    ; Value of rcv. bit when ready        14bh
  208. MASKS:    ANI    TBMT    ! RET    ; Bit to test for send ready        14eh
  209. TESTS:    CPI    TBMT    ! RET    ; Value of send bit when ready        151h
  210.     DS    14        ;                    156h
  211. ;
  212. ;
  213.     DS    3        ; DIALV: not done here (maybe MXO-SM)    162h
  214. DISCV:    JMP    DISCON        ; Disconnect
  215. GOODBV:    JMP    GOODBY        ;                    168h
  216. INMODV:    JMP    NITMOD        ; Go to user written routine        16bh
  217.     RET ! NOP ! NOP        ; Newbdv                    16eh
  218.     RET ! NOP ! NOP        ; Noparv                    171h
  219.     RET ! NOP ! NOP        ; Paritv                    174h
  220. SETUPV:    JMP    SETCMD        ;                    177h
  221.     DS    3        ; Not used by MEX            17ah
  222. VERSNV:    JMP    SYSVER        ;                    17dh
  223. BREAKV:    JMP    SBREAK        ;                    180h
  224. ;
  225. ;  Do not change the following six lines (they provide access to routines
  226. ;  in MEX that are present to support MDM7 overlays -- they will likely
  227. ;  be gone by mex v2.0).
  228. ;
  229. ILPRTV:    DS    3        ;                    183h
  230. INBUFV    DS    3        ;                    186h
  231. ILCMPV:    DS    3        ;                    189h
  232. INMDMV:    DS    3        ;                    18ch
  233.     DS    3        ;                    18fh
  234. TIMERV    DS    3        ;                    192h
  235. ;
  236. ;  Routine to clear to end of screen.  If using CLREOS and CLRSCRN, set
  237. ;  SCRTEST to YES at 010AH (above).
  238. ;
  239. CLREOS:    LXI    D,EOSMSG    ;                    195h
  240.     MVI    C,PRINT
  241.     CALL    MEX
  242.     RET
  243. ;
  244. CLS:    LXI    D,CLSMSG    ;                    19eh
  245.     MVI    C,PRINT
  246.     CALL    MEX
  247.     RET
  248. ;                                    1a7h
  249. ;
  250. ;            End of fixed area.
  251. ;
  252. ;------------------------------------------------------------------------------
  253. ;
  254. SYSVER:    MVI    C,ILP        ; In-line print
  255.     CALL    MEX
  256.     DB    CR,LF
  257.     DB    'Version '
  258.     DB    REV/10+'0'
  259.     DB    '.'
  260.     DB    REV MOD    10+'0'
  261.     DB    ' for CompuPro'
  262.     DB    CR,LF
  263.     DB    'Interfacer 3/4 and System Support 1.'
  264.     DB    CR,LF
  265.     DB    0
  266.     CALL    SHOALL        ; Show initial values for everything
  267.     RET
  268. ;
  269. ; Routine to exit just prior to exit-to-CP/M:
  270. ;
  271. GOODBY:    XRA    A        ; Turn off DTR
  272.     PUSH    PSW
  273.     CALL    STPORT        ; Select port
  274.     POP    PSW
  275.     CALL    OUTCP        ; Send passed byte to cport
  276.     RET            ; Exit to cp/m
  277. ;
  278. ;  Send break to remote:
  279. ;
  280. SBREAK:    MVI    A,BKCMD        ; Send break for 300ms
  281.     JMP    DISC1
  282. ;
  283. ;  Disconnect the modem:
  284. ;
  285. DISCON:    XRA    A        ; Turn off DTR
  286. DISC1:    PUSH    PSW
  287.     CALL    STPORT        ; Select port
  288.     POP    PSW
  289.     CALL    OUTCP        ; Send passed byte to cport
  290.     MVI    B,3        ; Turn off DTR for 300 ms.
  291.     MVI    C,TIMER
  292.     CALL    MEX
  293.     MVI    A,MCMD        ; Turn DTR back on
  294.     CALL    OUTCP
  295.     RET
  296. ;
  297. ;  Initialize the port;  either set an initial baud rate, or (if
  298. ;  your system is capable of it) query the current rate and set
  299. ;  mspeed value.  We can do neither here, so we assume a value
  300. ;  for mspeed -- if it's not the current value, the user must
  301. ;  execute a set command to bring mspeed into agreement with the
  302. ;  current baud rate.
  303. ;
  304. NITMOD:    LDA    MSPEED
  305.     JMP    PBAUD        ; Added here to init uart when mex
  306.                 ;   initially loaded. - dlc
  307.                 ; Return from pbaud
  308. ;
  309. ;  Set command: select baud rate, port number. port number may be any of
  310. ;  0,1,2,3,4,5,6,7,s  (s=ss1), baud rate any of 300, 600, 1200, 4800
  311. ;  9600, 19200.  Special set-port syntax allows baud rate after port
  312. ;  number.  Examples:
  313. ;
  314. ;    set port 3        set par o    - odd parity
  315. ;    set port 5 1200     set stop 1.5 - 1.5 stop bits
  316. ;    set port s 300        set data 7   - 7 data bits
  317. ;    set baud 9600
  318. ;
  319. SETCMD:    MVI    C,SBLANK    ; Any arguments?
  320.     CALL    MEX
  321.     JC    SHOALL        ; If not, go display port/baud etc.
  322.     LXI    D,CMDTBL
  323.     MVI    C,LOOKUP
  324.     CALL    MEX        ; Parse argument
  325.     PUSH    H        ; Save any parsed argument adrs on stack
  326.     RNC            ; If we have one, return to it
  327.     POP    H        ; Oops, input not found in table
  328. SETERR:    CALL    ILPRT
  329.     DB    BELL
  330.     DB    CR,LF,'SET command error!',CR,LF,0
  331.     CALL    STHELP
  332.     RET
  333. ;
  334. ;  Argument table:
  335. ;
  336. CMDTBL:    DB    '?'+80H        ; Help
  337.     DW    STHELP
  338.     DB    'BAU','D'+80H    ; "set baud"
  339.     DW    STBAUD
  340.     DB    'POR','T'+80H    ; "set port"
  341.     DW    SETPOR
  342.     DB    'DAT','A'+80H    ; "set bits"
  343.     DW    STDATA
  344.     DB    'PA','R'+80H    ; "set par"
  345.     DW    STPAR
  346.     DB    'STO','P'+80H    ; "set stop"
  347.     DW    STSTOP
  348.     DB    0        ; <<=== table terminator
  349. ;.....
  350. ;
  351. ;
  352. ; Set ? processor:
  353. ;
  354. STHELP:    CALL    CLS
  355.     CALL    ILPRT
  356.     DB    LF
  357.     DB    'The SET command is invoked as follows:'
  358.     DB    LF
  359.     DB    CR,LF,'     SET BAUD <baud rate>               SET PORT <port-number>'
  360.     DB    CR,LF,'     SET DATA <no. of data bits>        SET PARity <parity>'
  361.     DB    CR,LF,'     SET STOP bits <no. of stop bits>'
  362.     DB    CR,LF
  363.     DB    CR,LF,'     BAUD rate is one of:'
  364.     DB    CR,LF,'        110 300 600 1200 2400 4800 9600 19200'
  365.     DB    CR,LF
  366.     DB    CR,LF,'     PORT number is one of:'
  367.     DB    CR,LF,'        0-7 : Interfacer 3 or 4 port number.'
  368.     DB    CR,LF,'        S   : System Support 1 serial port.'
  369.     DB    CR,LF
  370.     DB    CR,LF,'     DATA bits is one of:   STOP bits is one of:'
  371.     DB    CR,LF,'        5, 6, 7, or 8          1, 1.5, or 2.'
  372.     DB    CR,LF
  373.     DB    CR,LF,'     PARity is one of:'
  374.     DB    CR,LF,'        E)ven, O)dd, or N)one.'
  375.     DB    CR,LF,LF,LF,0
  376.     RET
  377. ;.....
  378. ;
  379. ;
  380. ; Set port processor:
  381. ;
  382. SETPOR:    MVI    C,SBLANK    ; Scan to argument
  383.     CALL    MEX
  384.     JC    SETERR        ; If no arg, bomb out
  385.     MVI    C,GNC        ; Else consume it
  386.     CALL    MEX
  387.     CPI    'S'        ; SS1?
  388.     JZ    SETSS1        ; Jump if so
  389.     CPI    's'
  390.     JZ    SETSS1
  391.     SUI    '0'        ; Convert
  392.     JC    SETERR
  393.     CPI    7+1
  394.     JNC    SETERR
  395.     JMP    SETX        ; Go put away port #
  396. SETSS1:    MVI    A,0FFH        ; SS1 token
  397. SETX:    STA    PORT
  398. TELL:    CALL    ILPRT
  399.     DB    'Port is now: ',0
  400.     LDA    PORT
  401.     CPI    0FFH        ; SS1?
  402.     JNZ    TELL1        ; Jump if not
  403.     MVI    A,'S'-'0'    ; Set SS1, and avoid a jmp
  404. TELL1:    ADI    '0'        ; Get port # in ascii
  405.     STA    PORTAS
  406.     CALL    ILPRT
  407. PORTAS:    DB    '    ',CR,LF,0
  408.     RET
  409. ;.....
  410. ;
  411. ;
  412. ; Set baud processor:
  413. ;
  414. STBAUD:    MVI    C,BDPARS    ; Function code: parse a baudrate
  415.     CALL    MEX        ; Let MEX look up code
  416.     JC    SETERR        ; Jump if invalid code
  417.     CALL    PBAUD        ; No, try to set it
  418.     JC    SETERR        ; If not one of ours, bomb out
  419. BDSHOW:    CALL    ILPRT        ; Display baud
  420.     DB    'Baud rate now: ',0
  421.     LDA    MSPEED        ; Get current baud rate
  422.     MVI    C,PRBAUD    ; Let MEX print it
  423.     CALL    MEX
  424.     CALL    CRLF
  425.     RET
  426. ;
  427. ;  This routine sets baud rate passed as MSPEED code in A.
  428. ;  returns CY=1 if baud rate not supported (if supported,
  429. ;  this routine must set the new MSPEED code).
  430. ;
  431. PBAUD:    PUSH    H        ; Don't alter anybody
  432.     PUSH    D
  433.     PUSH    B
  434.     MOV    E,A        ; MSPEED code to DE
  435.     MVI    D,0
  436.     LXI    H,BAUDTB    ; Offset into table
  437.     DAD    D
  438.     MOV    A,M        ; Fetch code
  439.     ORA    A        ; 0? (means unsupported code)
  440.     STC            ; Prep carry in case unsupported
  441.     JZ    PBEXIT        ; Exit if bad
  442.     PUSH    PSW        ; No, set the rate
  443.     LDA    MODCTB        ; Mode register 1
  444.     CALL    OUTMP
  445.     POP    PSW        ; Get baud code back
  446.     CALL    OUTMP
  447.     MVI    A,MCMD        ; Command insruction
  448.     CALL    OUTCP
  449.     MOV    A,E        ; Get mspeed code back
  450.     STA    MSPEED        ; Set it
  451.     ORA    A        ; Return no-errors
  452. PBEXIT:    POP    B
  453.     POP    D
  454.     POP    H
  455.     RET
  456. ;
  457. BAUDTB:    DB    BD110        ; 110
  458.     DB    BD300        ; 300
  459.     DB    0        ; 450 (not supported)
  460.     DB    BD600        ; 600
  461.     DB    0        ; 710 (not supported)
  462.     DB    BD1200        ; 1200
  463.     DB    BD2400        ; 2400
  464.     DB    BD4800        ; 4800
  465.     DB    BD9600        ; 9600
  466.     DB    BD19200        ; 19200
  467. ;......
  468. ;
  469. ;
  470. ; Set data character length:
  471. ;
  472. STDATA:    LXI    D,BITTBL    ; Point to table
  473.     CALL    TSRCH        ;   and search for command
  474.     JC    SETERR
  475.     LDA    MODCTB        ; Get the last 2651 mode byte
  476.     ANI    0FFH AND NOT BITMSK    ; Zero the character length
  477.     ORA    L            ;   and put in the new value
  478.     CALL    PMODE        ; Re-init the 2651
  479. BTSHOW:    LDA    MODCTB        ; 2651 mode register image
  480.     ANI    BITMSK        ; Keep only the character length
  481.     RAR
  482.     RAR            ; Shift bits down to bit 0
  483.     ADI    '5'        ; 0 is 5 bits, 1 is 6...
  484.     CALL    TYPE
  485.     CALL    ILPRT
  486.     DB    ' Data bits. ',CR,LF,0
  487.     RET
  488. ;
  489. ; Data bits table:
  490. ;
  491. BITTBL:    DB    '8'+80H
  492.     DW    BIT8
  493.     DB    '7'+80H
  494.     DW    BIT7
  495.     DB    '6'+80H
  496.     DW    BIT6
  497.     DB    '5'+80H
  498.     DW    BIT5
  499.     DB    0        ; <== table terminator
  500. ;.....
  501. ;
  502. ;
  503. ; Set the parity:
  504. ;
  505. STPAR:    LXI    D,PARTBL    ; Point to the table of commands
  506.     CALL    TSRCH        ;   and search it
  507.     JC    SETERR
  508.     LDA    MODCTB
  509.     ANI    0FFH AND NOT PARMSK    ; Zero the parity bits
  510.     ORA    L            ;   and put in the new parity
  511.     CALL    PMODE        ; Set everythng up again
  512. BYSHOW:    LDA    MODCTB
  513.     ANI    PARMSK        ; Get the parity bits
  514.     LXI    D,EVNMSG
  515.     MVI    C,PRINT
  516.     CPI    PARE
  517.     CZ    MEX        ; For even parity
  518.     LXI    D,ODDMSG
  519.     CPI    PARO
  520.     CZ    MEX        ; For odd parity
  521.     LXI    D,NOMSG
  522.     CPI    PARN1
  523.     CZ    MEX        ; For no parity-first code
  524.     CPI    PARN2
  525.     CZ    MEX        ; For no parity-second code
  526.     CALL    ILPRT
  527.     DB    ' Parity. ',CR,LF,0
  528.     RET
  529. ;
  530. ; Table for parity:
  531. ;
  532. PARTBL:    DB    'E'+80H
  533.     DW    PARE
  534.     DB    'O'+80H
  535.     DW    PARO
  536.     DB    'N'+80H
  537.     DW    PARN1
  538.     DB    0        ; <== table terminator
  539. ;
  540. EVNMSG:    DB    'EVEN$'
  541. ODDMSG:    DB    'ODD$'
  542. NOMSG:    DB    'NO$'
  543. ;.....
  544. ;
  545. ;
  546. ; Set the stop bits:
  547. ;
  548. STSTOP:    LXI    D,STPTBL    ; Point to the command table
  549.     CALL    TSRCH        ;   and search it
  550.     JC    SETERR
  551.     LDA    MODCTB
  552.     ANI    0FFH AND NOT STPMSK    ; Zero the stop bits
  553.     ORA    L            ;   and put in the new ones
  554.     CALL    PMODE        ; And set it all up again
  555. BSSHOW:    LDA    MODCTB
  556.     ANI    STPMSK        ; Get the stop bits
  557.     PUSH    PSW
  558.     LXI    D,S1MSG
  559.     MVI    C,PRINT
  560.     CPI    STP1
  561.     CZ    MEX        ; For 1 stop bit
  562.     LXI    D,S15MSG
  563.     CPI    STP15
  564.     CZ    MEX        ; For 1.5 stop bits
  565.     LXI    D,S2MSG
  566.     CPI    STP2
  567.     CZ    MEX        ; For 2 stop bits
  568.     CALL    ILPRT
  569.     DB    ' Stop bit',0
  570.     POP    PSW
  571.     CPI    STP1
  572.     MVI    A,'s'
  573.     CNZ    TYPE
  574.     MVI    A,'.'
  575.     CALL    TYPE        ; If 1 don't put out 's'
  576.     CALL    CRLF
  577.     RET
  578. ;
  579. ; Table for stop:
  580. ;
  581. STPTBL:    DB    '1'+80H
  582.     DW    STP1
  583.     DB    '1.','5'+80H
  584.     DW    STP15
  585.     DB    '2'+80H
  586.     DW    STP2
  587.     DB    0        ; <== table terminator
  588. ;
  589. S1MSG:    DB    '1$'
  590. S2MSG:    DB    '2$'
  591. S15MSG:    DB    '1.5$'
  592. ;
  593. ;------------------------------------------------------------------------------
  594. ;
  595. ; Port access routines:
  596. ;
  597. ;  Input:
  598. ;
  599. INSP:    MVI    A,SPORT        ; In status-port
  600.     JMP    INP1
  601. INDP:    MVI    A,DPORT        ; In data-port
  602. INP1:    PUSH    B        ; Can't alter BC
  603.     MOV    C,A        ; 2661-relative port number in C
  604.     CALL    STPORT        ; Set port #
  605.     ADD    C        ; A=absolute port #
  606.     POP    B        ; Restore BC
  607.     STA    INP2+1        ; Put port # in the code
  608. INP2:    IN    0        ; Do the input
  609.     RET
  610. ;.....
  611. ;
  612. ;
  613. ;  Output:
  614. ;
  615. OUTDP:    PUSH    B        ; Out data-port
  616.     MVI    C,DPORT
  617.     JMP    OUT1
  618. OUTMP:    PUSH    B        ; Out mport
  619.     MVI    C,MPORT
  620.     JMP    OUT1
  621. OUTCP:    PUSH    B        ; Out control port
  622.     MVI    C,CPORT
  623. OUT1:    MOV    B,A        ; B=char to send
  624.     CALL    STPORT        ; Set port #
  625.     ADD    C        ; A=absolute port #
  626.     STA    OUT2+1        ; Put port # in the code
  627.     MOV    A,B        ; A=char to send
  628. OUT2:    OUT    0        ; Send it
  629.     POP    B
  630.     RET
  631. ;.....
  632. ;
  633. ;
  634. ; Send mode byte:
  635. ;
  636. PMODE:    STA    MODCTB        ; Store it for later use
  637.     JMP    NITMOD        ; Returns from pbaud
  638. ;.....
  639. ;
  640. ;
  641. ;  Set port #, return base adrs:
  642. ;
  643. STPORT:    LDA    PORT        ; Get current port #
  644.     CPI    0FFH        ; 255 implies SS1
  645.     JNZ    STIN        ; Jump if not SS1
  646.     MVI    A,SSBASE    ; It's SS1, return base adrs
  647.     RET
  648. STIN:    OUT    UPORT        ; Set in 3/4 user #
  649.     MVI    A,INBASE    ; Return base port
  650.     RET
  651. ;
  652. PORT:    DB    255        ; Initial port #=SS1
  653. ;
  654. MODCTB:    DB    BIT8 OR    PARN1 OR STP1    ; Modem control byte
  655. ;                       default  8,N,1
  656. ;
  657. ;------------------------------------------------------------------------------
  658. ;
  659. ; Misc. subroutines:
  660. ;
  661. ; Show all values:
  662. ;
  663. SHOALL:    CALL    CRLF
  664.     CALL    BDSHOW        ; Show baud
  665.     CALL    TELL        ;  and port
  666.     CALL    BTSHOW        ;  and no. of data bits
  667.     CALL    BSSHOW        ;  and no. of stop bits
  668.     CALL    BYSHOW        ;  and parity
  669.     CALL    CRLF
  670. ;
  671. TSRCH:    MVI    C,LOOKUP    ; Lookup
  672.     JMP    MEX        ; Return from MEX lookup routine
  673. ;
  674. ILPRT:    MVI    C,ILP        ; Inline print
  675.     JMP    MEX        ; Return from MEX ilp routine
  676. ;
  677. CRLF:    CALL    ILPRT
  678.     DB    CR,LF,0
  679. ;
  680. ; Send a char in A to the console:
  681. ;
  682. TYPE:    PUSH    H
  683.     PUSH    D
  684.     PUSH    B
  685.     MOV    E,A
  686.     MVI    C,CONOUT
  687.     CALL    MEX
  688.     POP    B
  689.     POP    D
  690.     POP    H
  691.     RET
  692. ;
  693. ; Clear-to-end-of-screen and clear-screen sequences:
  694. ;
  695. EOSMSG:    DB    ESC,'Y','$'
  696. CLSMSG:    DB    ESC,'*','$'
  697. ;
  698. ;
  699. ; The following two create assembly-time error messages if the overlay
  700. ; is too big:
  701. ;
  702. IF ($ GE 0B00H)
  703.     WARNING!! OVERLAY EXTENDS BEYOND 0B00H!!
  704. ;
  705. IF ($ GE 0D00H)
  706.     ERROR!!    OVERLAY    EXTENDS    BEYOND 0D00H!!
  707. ;
  708.     END
  709.  
  710.  
  711.