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 / MEX / MXO-TV13.ASM < prev    next >
Assembly Source File  |  2000-06-30  |  19KB  |  699 lines

  1. ;     Title  'MEX Overlay for the TeleVideo Computer Version 1.3'
  2. ;
  3. REV    EQU    13        ;OVERLAY REVISION LEVEL
  4. ;
  5. ;
  6. ;  MEX Overlay for TeleVideo TS-802H Computers, use MXM-2400
  7. ;  external overlay with this one to support SSET commands.
  8. ;
  9. ;  A full-featured SET command processor is implemented.
  10. ;  The following table outlines the SET command options:
  11. ;
  12. ;    SET Command
  13. ;
  14. ;    BAUD <RATE>            Set modem to Baud rate specified.
  15. ;                    Baud rates supported are 110, 300,
  16. ;                    600, 1200, 2400, 4800, 9600, 19200
  17. ;
  18. ;    PARITY                          Set Parity to Odd, Even, or Off
  19. ;    STOPBITS                        Set number of Stop Bits to 1, 1.5, 2
  20. ;    LENGTH                 Set word length to 5, 6, 7, 8
  21. ;
  22. ;  This overlay includes the smartmodem dialing routine from
  23. ;  MXO-SM13.ASM by Ron Fowler which has been slightly modified
  24. ;  to allow programmable delay for answer.  (Note that this is
  25. ;  different from the "ATS7=nn".).
  26. ;
  27. ;  This overlay is intended to be fully compatible with the
  28. ;  MEX structure and should be readily upward compatible with
  29. ;  the predicted MEX 2.0.
  30. ;
  31. ;  Calling conventions for the various overlay entry points
  32. ;  are detailed more fully in the PMMI overlay (MXO-PMxx.ASM,
  33. ;  where xx=revision number).
  34. ;
  35. ;  History:
  36. ;
  37. ;  08/16/85 1.3  Stripped out Smartmodem stuff so overlay can be
  38. ;         used with MXM-2400 overlay for USR/Hayes 2400s.
  39. ;                    -- Kim Levitt
  40. ;
  41. ;  12/19/84 1.0  Created new Televideo overlay from MXO-KPS3 overlay
  42. ;         Fixed break bug while I was at it..
  43. ;                    -- Kim Levitt
  44. ;
  45. ;  Credits:
  46. ;
  47. ;  M7KP-1 overlay structure by Irv Hoff
  48. ;  Parity, Length and Stopbits routines by Norm Saunders
  49. ;  MXO-KP overlay structure by John Smith
  50. ;  Art work by Terry Carroll
  51. ;  Bug fix/feature added by Kim Levitt
  52. ;  Based on an idea by an inspired hacker
  53. ;  Music by John Williams
  54. ;  Directed by Stanley Kubrick
  55. ;
  56. ;------------------------------------------------------------
  57. ;
  58. ; Miscellaneous equates
  59. ;
  60. NO    EQU    0
  61. YES    EQU    0FFH
  62. ;
  63. TPA    EQU    100H
  64. ;
  65. CR    EQU    13
  66. LF    EQU    10
  67. TAB    EQU    9
  68. ;
  69. ; Televideo port definitions
  70. ;
  71. EXPORT    EQU    20H        ;base external port
  72. EXTCT1    EQU    EXPORT+2    ;external modem status port
  73. EXTDAT    EQU    EXPORT        ;external modem data port
  74. BAUDRP    EQU    08H        ;external modem baud rate port
  75. ;
  76. ; Z80 SIO bit definitions
  77. ;
  78. MDRCVB    EQU    01H        ;modem receive bit (DAV)
  79. MDRCVR    EQU    01H        ;modem receive ready
  80. MDSNDB    EQU    04H        ;modem send bit
  81. MDSNDR    EQU    04H        ;modem send ready bit
  82. ;
  83. ; MEX Service Processor
  84. ;
  85. MEX    EQU    0D00H        ;address of the service processor
  86. INMDM    EQU    255        ;get char from port to A, CY=no more in 100 ms
  87. TIMER    EQU    254        ;delay 100ms * reg B
  88. TMDINP    EQU    253        ;B=# secs to wait for char, cy=no char
  89. CHEKCC    EQU    252        ;check for ^C from KBD, Z=present
  90. SNDRDY    EQU    251        ;test for modem-send ready
  91. RCVRDY    EQU    250        ;test for modem-receive ready
  92. SNDCHR    EQU    249        ;send a character to the modem (after sndrdy)
  93. RCVCHR    EQU    248        ;recv a char from modem (after rcvrdy)
  94. LOOKUP    EQU    247        ;table search: see CMDTBL comments for info
  95. PARSFN    EQU    246        ;parse filename from input stream
  96. BDPARS    EQU    245        ;parse baud-rate from input stream
  97. SBLANK    EQU    244        ;scan input stream to next non-blank
  98. EVALA    EQU    243        ;evaluate numeric from input stream
  99. LKAHED    EQU    242        ;get nxt char w/o removing from input
  100. GNC    EQU    241        ;get char from input, cy=1 if none
  101. ILP    EQU    240        ;inline print
  102. DECOUT    EQU    239        ;decimal output
  103. PRBAUD    EQU    238        ;print baud rate
  104. ;
  105. CONOUT    EQU    2        ;simulated BDOS function 2: console char out
  106. PRINT    EQU    9        ;simulated BDOS function 9: print string
  107. INBUF    EQU    10        ;input buffer, same structure as BDOS 10
  108. ;
  109. DCONIO    EQU    6        ;BDOS Direct Console IO function #
  110. DCONIN    EQU    0FFH        ;BDOS DCONIO Flag for input
  111. BDOS    EQU    5        ;BDOS Function caller
  112. ;
  113. ;
  114.     ORG    TPA        ;we begin
  115. ;
  116.     DS    3        ;MEX has a JMP START here
  117. ;
  118.     DS    2        ;not used by MEX
  119. TPULSE:    DB    'T'        ;T=touch, P=pulse (Used by this overlay)
  120. CLOCK:    DB    46        ;clock speed x .1, up to 25.5 mhz.
  121. MSPEED:    DB    6        ;sets display time for sending a file
  122.                 ;0=110    1=300  2=450  3=600  4=710
  123.                 ;5=1200 6=2400 7=4800 8=9600 9=19200
  124. BYTDLY:    DB    5        ;default time to send character in
  125.                 ;terminal mode file transfer (0-9)
  126.                 ;0=0 delay, 1=10 ms, 5=50 ms, 9=90 ms
  127. CRDLY:    DB    5        ;end-of-line delay after CRLF in terminal
  128.                 ;mode file transfer for slow BBS systems
  129.                 ;0=0 delay, 1=100 ms, 5=500 ms, 9=900 ms
  130. COLUMS:    DB    5        ;number of directory columns
  131. SETFL:    DB    YES        ;yes=user-defined SET command
  132. SCRTST:    DB    YES        ;yes=if home cursor and clear screen
  133.                 ;routine at CLRSCRN
  134.     DB    0        ;was once ACKNAK, now spare
  135. BAKFLG:    DB    YES        ;yes=make .BAK file
  136. CRCDFL:    DB    YES        ;yes=default to CRC checking
  137.                 ;no=default to Checksum checking
  138. TOGCRC:    DB    YES        ;yes=allow toggling of Checksum to CRC
  139. CVTBS:    DB    NO        ;yes=convert backspace to rub
  140. TOGLBK:    DB    YES        ;yes=allow toggling of bksp to rub
  141. ADDLF:    DB    NO        ;no=no LF after CR to send file in
  142.                 ;terminal mode (added by remote echo)
  143. TOGLF:    DB    YES        ;yes=allow toggling of LF after CR
  144. TRNLOG:    DB    NO        ;yes=allow transmission of logon
  145.                 ;write logon sequence at location LOGON
  146. SAVCCP:    DB    YES        ;yes=do not overwrite CCP
  147. LOCNXT:    DB    NO        ;yes=local cmd if EXTCHR precedes
  148.                 ;no=not local cmd if EXTCHR precedes
  149. TOGLOC:    DB    YES        ;yes=allow toggling of LOCNXTCHR
  150. LSTTST:    DB    YES        ;yes=allow toggling of printer on/off
  151.                 ;in terminal mode. Set to no if using
  152.                 ;the printer port for the modem
  153. XOFTST:    DB    NO        ;yes=allow testing of XOFF from remote
  154.                 ;while sending a file in terminal mode
  155. XONWT:    DB    NO        ;yes=wait for XON after sending CR while
  156.                 ;transmitting a file in terminal mode    
  157. TOGXOF:    DB    YES        ;yes=allow toggling of XOFF testing
  158. IGNCTL:    DB    NO         ;yes=do not send control characters
  159.                 ;above CTL-M to CRT in terminal mode
  160.                 ;no=send any incoming CTL-char to CRT
  161. EXTRA1:    DB    0        ;for future expansion
  162. EXTRA2:    DB    0        ;for future expansion
  163. BRKCHR:    DB    '@'-40H        ;^@ = Send a 300 ms. break tone
  164. NOCONN:    DB    'N'-40H        ;^N = Disconnect from phone line
  165. LOGCHR:    DB    'L'-40H        ;^L = Send logon
  166. LSTCHR:    DB    'P'-40H        ;^P = Toggle printer
  167. UNSVCH:    DB    'R'-40H        ;^R = Close input text buffer
  168. TRNCHR:    DB    'T'-40H        ;^T = Transmit file to remote
  169. SAVCHR:    DB    'Y'-40H        ;^Y = Open input text buffer
  170. EXTCHR:    DB    '^'-40H        ;^^ = Send next character
  171. ;
  172.     DS    2        ;not used
  173. ;
  174. ; Low-level modem I/O routines.
  175. ;
  176. INCTL1:    JMP    INC        ;in modem control port
  177.     DB    0,0,0,0,0,0,0    ;spares if needed for non-PMMI
  178. ;
  179. OTDATA:    JMP    OUTD        ;out modem data port
  180.     DB    0,0,0,0,0,0,0    ;spares if needed for non=PMMI
  181. ;
  182. INPORT: JMP    IND        ;in modem data port
  183.     DB    0,0,0,0,0,0,0    ;spares if needed for non-PMMI
  184. ;
  185. ; Bit-test routines. 
  186. ;
  187. MASKR:    ANI MDRCVB ! RET    ;bit to test for receive ready
  188. TESTR:    CPI MDRCVR ! RET    ;value of receive bit when ready
  189. MASKS:    ANI MDSNDB ! RET    ;bit to test for send ready
  190. TESTS:    CPI MDSNDR ! RET    ;value of send bit when ready
  191. ;
  192.     DS    12
  193. ;
  194. LOGON:    DS    2        ;needed for MDM compat, not ref'd by MEX
  195. DIALV:    RET!NOP!NOP        ;need MXM overlay for modem for this
  196. DISCV:    JMP    DISCON
  197. GOODBV:    JMP    GOODBYE        ;called before exit to CP/M
  198. INMODV:    JMP    NITMOD        ;initialization. Called at cold-start
  199. NEWBDV:    JMP    PBAUD        ;set baud rate
  200. NOPARV:    RET!NOP!NOP        ;set modem for no-parity
  201. PARITV:    RET!NOP!NOP        ;set modem parity
  202. SETUPV:    JMP    SETCMD        ;SET cmd: jump to a RET if you don't write SET
  203. SPMENV:    RET!NOP!NOP        ;not used with MEX 
  204. VERSNV:    JMP    SYSVER        ;Overlay's voice in the sign-on message
  205. BREAKV:    JMP    SBREAK        ;send a break
  206. ;
  207. ; MDM calls supported in MEX 1.0 but not recommended for use.
  208. ;
  209. ILPRTV:    DS    3        ;replace with MEX function 9
  210. INBUFV:    DS    3        ;replace with MEX function 10
  211. ILCMPV:    DS    3        ;replace with table lookup funct. 247
  212. INMDMV:    DS    3        ;replace with MEX function 255
  213. NXSCRV:    DS    3        ;not supported by MEX (returns w/no action)
  214. TIMERV:    DS    3        ;replace with MEX function 254
  215. ;
  216. CLREOS:    LXI    D,EOSMSG
  217.     MVI    C,PRINT
  218.     CALL    MEX
  219.     RET
  220. ;
  221. CLS:    LXI    D,CLSMSG
  222.     MVI    C,PRINT
  223.     CALL    MEX
  224.     RET
  225. ;
  226. ;------------------------------------------------------------
  227. ;
  228. ; end of fixed area
  229. ;
  230. ;------------------------------------------------------------
  231. ;
  232. ; Low level modem routine area
  233. ;
  234. INC:    MVI    A,10H
  235.     OUT    EXTCT1
  236.     IN    EXTCT1
  237.     RET
  238. ;
  239. IND:    IN    EXTDAT
  240.     RET
  241. ;
  242. OUTD:    OUT    EXTDAT
  243.     RET
  244. ;
  245. ; Print out the overlay version
  246. ;
  247. SYSVER:      CALL    MILP
  248.       DB    'TeleVideo TS-802H Overlay -- Version '
  249.       DB    REV/10+'0'
  250.       DB    '.'
  251.       DB    REV MOD 10+'0'
  252.       DB    CR,LF,CR,LF
  253.       DB    0
  254.       RET
  255. ;
  256. ; Break, disconnect and goodbye routines
  257. ;
  258. SBREAK:   MVI    A,5
  259.       OUT    EXTCT1
  260.       LDA    REG5
  261.       ORI    9AH        ;set break + RTS/DTR/TXEN
  262.        OUT    EXTCT1
  263.       MVI    B,3        ;DELAY 300 MS.
  264.       CALL  MTIME
  265.       MVI    A,5        ;then re-address WR5
  266.       OUT    EXTCT1
  267.       LDA    REG5        ;get current REG5 values
  268.       OUT    EXTCT1        ;and restore/stop break
  269.       RET
  270. ;
  271. ; Disconnect Routine
  272. ;
  273. DISCON:
  274.       MVI    A,5
  275.       OUT    EXTCT1        ;SEND TO THE STATUS PORT
  276.       MVI    A,68H        ;TURN OFF DTR/RTS
  277.       OUT    EXTCT1
  278.       MVI    B,10        ;DELAY 1 SEC.
  279.       CALL  MTIME
  280.       MVI    A,5
  281.       OUT    EXTCT1
  282.       MVI    A,0EAH        ;TURN 'EM BACK ON AGAIN
  283.       OUT    EXTCT1
  284.       RET
  285. ;
  286. ; GOODBYE routines are called by MEX prior to exit to CP/M
  287. ;
  288. GOODBYE:  RET            ;NOTE: EXIT TO CP/M WITH NO CHANGE TO
  289.                 ;CONNECT STATUS OR SETTINGS (PARITY, ETC)
  290. ;
  291. ; Initialize RS-232 port, Smartmodem, and default modes.
  292. ;
  293. NITMOD:   CALL    INC        ;SEE IF MODEM IS CONNECTED, I.E., RETURNING
  294.       ANI    08H        ;   TO ACTIVE MODEM FROM CPM
  295.       RNZ            ;SKIP IF CONNECTED
  296.           CALL  NITSIO
  297.       LDA    MSPEED        ;Get default baud rate
  298.       CALL    PBAUD        ;Set default baud rate
  299.       RET            ;Return
  300. ;
  301. ;    Initialize the Zilog SIO chip
  302. ;
  303. NITSIO:      MVI   A,00H        ;Select reg. 0
  304.       OUT   EXTCT1
  305.       LDA    REG0        ;Command byte
  306.       OUT   EXTCT1
  307.       MVI    A,04H        ;Select reg. 4
  308.       OUT   EXTCT1
  309.       LDA    REG4        ;Receive/transmit control byte
  310.       OUT   EXTCT1
  311.       MVI    A,03H        ;Select reg. 3
  312.       OUT   EXTCT1
  313.       LDA    REG3        ;Receiver logic byte
  314.       OUT   EXTCT1
  315.       MVI    A,05H        ;Select reg. 5
  316.       OUT   EXTCT1
  317.       LDA    REG5        ;Transmitter logic byte
  318.       OUT   EXTCT1
  319.       RET
  320. ;
  321. ; Set command processor
  322. ;
  323. SETCMD:      MVI    C,SBLANK    ;ANY ARGUMENTS?
  324.       CALL  MEX
  325.       JC    SETSHO        ;IF NOT, DISPLAY DEFAULT(S)
  326.       LXI    D,CMDTBL
  327.           MVI    C,LOOKUP
  328.       CALL  MEX        ;PARSE THE ARGUMENT
  329.       PUSH    H        ;SAVE ANY PARSED ARGUMENTS ON STACK
  330.       RNC            ;IF WE HAVE ONE, RETURN TO IT
  331.       POP    H        ;OOPS, INPUT NOT FOUND IN TABLE
  332. SETERR:      LXI    D,SETEMS
  333.       MVI    C,PRINT
  334.       CALL    MEX
  335.       CALL  CRLF
  336.       RET
  337. SETEMS:      DB    CR,LF,'SET command error',CR,LF,'$'
  338. ;
  339. ; Argument table
  340. ;
  341. CMDTBL:   DB    '?'+80H            ; HELP
  342.       DW    SETHELP
  343.       DB    'BAU','D'+80H        ; SET BAUD
  344.       DW    STBAUD
  345.       DB    'PARIT','Y'+80H        ; SET PARITY
  346.       DW    STPRTY
  347.       DB    'STOPBIT','S'+80H    ; SET STOPBITS
  348.       DW    STSTOP
  349.       DB    'LENGT','H'+80H        ; SET LENGTH
  350.       DW    STBITS
  351.       DB    0            ;TABLE TERMINATOR
  352. ;
  353. ;
  354. ;  "SET (no args): PRINT CURRENT STATISTICS
  355. ;
  356. SETSHO:      CALL  MILP
  357.       DB    CR,LF
  358.       DB    'SET values:',CR,LF,0
  359.       CALL    CRLF
  360.       CALL    BDSHOW
  361.       CALL  CRLF
  362.       CALL  SHPRTY
  363.       CALL    CRLF
  364.       CALL    SHSTOP
  365.       CALL    CRLF
  366.       CALL  SHBITS
  367.       CALL    CRLF
  368.       CALL  CRLF
  369.       RET
  370. ;
  371. ; "SET ?" processor
  372. ;
  373. SETHELP:  CALL    MILP
  374.       DB    CR,LF,'SET PARITY    - OFF, EVEN or ODD'
  375.       DB    CR,LF,'SET STOPBITS  - 1, 1.5 or 2'
  376.       DB    CR,LF,'SET LENGTH    - 5, 6, 7 or 8'
  377.       DB    CR,LF,'SET BAUD      - 300, 450, 600, 1200, 2400, '
  378.       DB    '4800, 9600, 19200'
  379.       DB    CR,LF,CR,LF,0
  380.       RET
  381. ;
  382. ; "SET BAUD" processor
  383. ;
  384. STBAUD:      MVI    C,BDPARS    ;FUNCTION CODE: PARSE A BAUDRATE
  385.       CALL    MEX        ;LET MEX LOOK UP CODE
  386.       JC    SETERR        ;JUMP IF INVALID CODE
  387.       CALL    PBAUD        ;NO, TRY TO SET IT
  388.       JC    SETERR        ;IF NOT ONE OF OURS, BOMB OUT
  389. BDSHOW:      LDA    MSPEED        ;GET CURRENT BAUD RATE
  390.       MVI    C,PRBAUD    ;LET MEX PRINT IT
  391.       CALL    MEX
  392.       RET 
  393. ;
  394. ; This routine sets baud rate passed as MSPEED code in A.
  395. ; Returns CY=1 if baud rate not supported.
  396. ;
  397. PBAUD:      PUSH    H        ;DON'T ALTER ANYBODY
  398.       PUSH    D
  399.       PUSH     B
  400.       MOV    E,A        ;MSPEED CODE TO DE
  401.       MVI    D,0
  402.       LXI    H,BAUDTB    ;OFFSET INTO TABLE
  403.       DAD    D
  404.       MOV    A,M        ;FETCH CODE
  405.       ORA    A        ;0 MEANS UNSUPPORTED CODE
  406.       STC            ;PREP CARRY IN CASE UNSUPPORTED
  407.       JZ    PBEXIT        ;EXIT IF BAD
  408.       PUSH    PSW        ;NO, SET THE RATE
  409.       MVI    A,47H
  410.       OUT    BAUDRP
  411.       POP    PSW
  412.       OUT    BAUDRP
  413.       MOV    A,E        ;GET MSPEED CODE BACK
  414.       STA    MSPEED        ;SET IT
  415.       ORA    A        ;RETURN NO ERRORS
  416. PBEXIT:      POP    B
  417.       POP    D
  418.       POP    H
  419.       RET
  420. ;
  421. BAUDTB:      DB    0H        ;110 (not supported)
  422.       DB    80H        ;300
  423.       DB    55H        ;450
  424.       DB    40H        ;600
  425.       DB    0        ;710 (not supported)
  426.       DB    20H        ;1200
  427.       DB    10H        ;2400
  428.       DB    08H        ;4800
  429.       DB    04H        ;9600
  430.       DB    02H        ;19200 
  431. ;
  432. ;    SET PARITY command: reset transmit/receive parity
  433. ;
  434. ;        Parity is controlled by bits 0 and 1 of
  435. ;        the byte sent to the SIO write-register
  436. ;        4 as follows:
  437. ;
  438. ;           Parity    Bit 1       Bit 0
  439. ;                 Off          -          0
  440. ;              Odd      0         1
  441. ;             Even      1         1
  442. ;
  443. STPRTY:      MVI    C,SBLANK    ;check for parity code
  444.       CALL    MEX        ;
  445.       JC    SETERR        ;if none, print error
  446.       LXI    D,PARTBL    ;check for proper syntax
  447.       MVI    C,LOOKUP
  448.       CALL    MEX
  449.       PUSH    H        ;match found, go do it!
  450.       RNC            ;
  451.       POP    H        ;no match: fix stack and
  452.       JMP    SETERR        ;  print error
  453. ;
  454. PROFF:      LDA    REG4        ;get register 4 byte
  455.       ANI    0FEH        ;reset bit 0
  456.       JMP    PARTB1        ;
  457. PREVEN:      LDA    REG4        ;
  458.       ORI    003H        ;set bits 0 & 1
  459.       JMP    PARTB1        ;
  460. PRODD:      LDA    REG4        ;
  461.       ORI    001H        ;set bit 0
  462.       ANI    0FDH        ;reset bit 1
  463. PARTB1:      STA    REG4        ;
  464.       CALL    NITSIO        ;re-initialize the USART
  465.       CALL    SHPRTY        ;print the result
  466.       RET
  467. ;
  468. SHPRTY:      CALL    MILP        ;display parity
  469.       DB    'Parity:  ',TAB,' ',0
  470.       LDA    REG4        ;
  471.       ANI    001H        ;test bit 0
  472.       CPI    0        ;if bit0=0 then parity off
  473.       JNZ    SHPRT1        ;
  474.       CALL    MILP        ;
  475.       DB    'Off',0        ;
  476.       RET
  477. SHPRT1:      LDA    REG4        ;
  478.       ANI    002H        ;test bit 1
  479.       CPI    0        ;if bit1=0 then parity odd
  480.       JNZ    SHPRT2        ;
  481.       CALL    MILP        ;
  482.       DB    'Odd',0        ;
  483.       RET            ;
  484. SHPRT2:      CALL    MILP        ;
  485.       DB    'Even',0    ;
  486.       RET
  487. ;
  488. ;    SET PARITY command table
  489. ;
  490. PARTBL:      DB    'OF','F'+80H    ;"set parity off"
  491.       DW    PROFF
  492.       DB    'EVE','N'+80H    ;"set parity even"
  493.       DW    PREVEN
  494.       DB    'OD','D'+80H    ;"set parity odd"
  495.       DW    PRODD
  496.       DB    0        ;<<== end of parity table
  497. ;
  498. ;    SET STOPBITS command: reset number of stop bits
  499. ;
  500. ;        The number of stop bits is controlled by bits
  501. ;        2 and 3 of the byte sent to the SIO write-
  502. ;        register 4, as follows:
  503. ;
  504. ;            Stop bits       Bit 3    Bit 2
  505. ;            1         0            1
  506. ;               1.5         1          0
  507. ;            2         1          1
  508. ;
  509. ;
  510. STSTOP:      MVI    C,SBLANK    ;check for stop bits
  511.       CALL    MEX        ;
  512.       JC    SETERR        ;if none, print error
  513.       LXI    D,STPTBL    ;check for proper syntax
  514.       MVI   C,LOOKUP
  515.       CALL    MEX        ;
  516.       PUSH    H        ;match found, go do it!
  517.       RNC            ;
  518.       POP    H        ;no match: fix stack and
  519.       JMP    SETERR        ;  print error
  520. ;
  521. STOP01:      LDA    REG4        ;get register 4 byte
  522.       ANI    0F7H        ;reset bit 3
  523.       ORI    004H        ;set bit 2
  524.       JMP    STSTP1        ;
  525. STOP02:      LDA    REG4        ;
  526.       ORI    00CH        ;set bits 2 and 3
  527.       JMP    STSTP1        ;
  528. STOP15:      LDA    REG4        ;
  529.       ORI    008H        ;set bit 3
  530.       ANI    0FBH        ;reset bit 2
  531. STSTP1:      STA    REG4        ;
  532.       CALL    NITSIO        ;
  533.       CALL    SHSTOP        ;print the result
  534.       RET
  535. SHSTOP:      CALL    MILP        ;display stop-bits
  536.       DB    'Stop bits:',TAB,' ',0
  537.       LDA    REG4        ;
  538.       ANI    004H        ;test bit 2
  539.       CPI    0        ;if bit2=0 then 1.5
  540.       JNZ    SHSTP1        ;
  541.       CALL    MILP        ;
  542.       DB    '1.5',0        ;
  543.       RET
  544. SHSTP1:      LDA    REG4        ;
  545.       ANI    008H        ;test bit 3
  546.       CPI    0        ;if bit3=0 then 1
  547.       JNZ    SHSTP2        ;
  548.       CALL    MILP        ;
  549.       DB    '1',0        ;
  550.       RET
  551. SHSTP2:      CALL    MILP        ;
  552.       DB    '2',0        ;
  553.       RET
  554. ;
  555. ;    SET STOPBITS command table
  556. ;
  557. STPTBL:      DB    '1'+80H        ;"set stop 1"
  558.       DW    STOP01
  559.       DB    '2'+80H        ;"set stop 2"
  560.       DW    STOP02
  561.       DB    '1.','5'+80H    ;"set stop 1.5"
  562.       DW    STOP15
  563.       DB    0        ;<<== End of stop-bits table
  564. ;
  565. ;    SET LENGTH command: set bits per character
  566. ;
  567. ;        The number of bits per character is controlled for
  568. ;        the receiver circuit by bits 6 and 7 of the byte
  569. ;        sent to the SIO write-register 3 and for the trans-
  570. ;        mitter circuit by bits 5 and 6 of the byte sent to
  571. ;        the SIO write-register 5.  The assumption has been
  572. ;        made here that both transmission and reception will
  573. ;        be carried on at the same number of bits per charac-
  574. ;        ter.  The bit configurations are shown for register
  575. ;        3 only, but are the same for register 5:
  576. ;
  577. ;            BPC        Bit 7        Bit 6
  578. ;             5          0          0
  579. ;             6          1             0
  580. ;             7          0          1
  581. ;             8          1          1
  582. ;
  583. STBITS:      MVI    C,SBLANK    ;check for bits/char
  584.       CALL    MEX        ;
  585.       JC    SETERR        ;if none, print error
  586.       LXI    D,BITTBL    ;check for proper syntax
  587.       MVI    C,LOOKUP
  588.       CALL    MEX
  589.       PUSH    H        ;match found, go do it!
  590.       RNC            ;
  591.       POP    H        ;no match: fix stack and
  592.       JMP    SETERR        ;  print error
  593. ;
  594. BIT5:      LDA    REG3        ;
  595.       ANI    0BFH        ;reset bit 6
  596.       ANI    07FH        ;reset bit 7
  597.       STA    REG3        ;
  598.       LDA    REG5        ;
  599.       ANI    0DFH        ;reset bit 5
  600.       ANI    0BFH        ;reset bit 6
  601.       JMP    STBTS1        ;
  602. BIT6:      LDA    REG3        ;
  603.       ANI    0BFH        ;reset bit 6
  604.       ORI    080H        ;set bit 7
  605.       STA    REG3        ;
  606.       LDA    REG5        ;
  607.       ANI    0DFH        ;reset bit 5
  608.       ORI    040H        ;set bit 6
  609.       JMP    STBTS1        ;
  610. BIT7:      LDA    REG3        ;
  611.       ORI    040H        ;set bit 6
  612.       ANI    07FH        ;reset bit 7
  613.       STA    REG3        ;
  614.       LDA    REG5        ;
  615.       ORI    020H        ;set bit 5
  616.       ANI    0BFH        ;reset bit 6
  617.       JMP    STBTS1        ;
  618. BIT8:      LDA    REG3        ;
  619.       ORI    040H        ;set bit 6
  620.       ORI    080H        ;set bit 7
  621.       STA    REG3        ;
  622.       LDA    REG5        ;
  623.       ORI    020H        ;set bit 5
  624.       ORI    040H        ;set bit 6
  625. STBTS1:      STA    REG5        ;
  626.       CALL    NITSIO        ;
  627.       CALL    SHBITS        ;print the result
  628.       RET
  629. SHBITS:      CALL    MILP        ;display bits/char
  630.       DB    'Bits/char:',TAB,' ',0
  631.       LDA    REG5        ;
  632.       ANI    040H        ;test bit 6
  633.       CPI    0        ;if bit6=0 then 6 bpc
  634.       JNZ    SHBTS2        ;
  635.       LDA    REG5        ;
  636.       ANI    020H        ;test bit 5
  637.       CPI    0        ;if bit5=0 then 5 bpc
  638.       JNZ    SHBTS1        ;
  639.       CALL    MILP        ;
  640.       DB    '5',0        ;
  641.       RET            ;
  642. SHBTS1:      CALL    MILP        ;
  643.       DB    '7',0        ;
  644.       RET            ;
  645. SHBTS2:      LDA    REG5        ;
  646.       ANI    020H        ;test bit 5
  647.       CPI    0        ;if bit5=0 then 6 bpc
  648.       JNZ    SHBTS3        ;
  649.       CALL    MILP        ;
  650.       DB    '6',0        ;
  651.       RET            ;
  652. SHBTS3:      CALL    MILP        ;
  653.       DB    '8',0        ;
  654.       RET
  655. ;
  656. ;    SET LENGTH command table
  657. ;
  658. BITTBL:      DB    '5'+80H        ;"set bits 5"
  659.       DW    BIT5
  660.       DB    '6'+80H        ;"set bits 6"
  661.       DW    BIT6
  662.       DB    '7'+80H        ;"set bits 7"
  663.       DW    BIT7
  664.       DB    '8'+80H        ;"set bits 8"
  665.       DW    BIT8
  666.       DB    0        ;<<== end of bpc table
  667. ;
  668. ; General utility routines
  669. ;
  670. MILP:      MVI    C,ILP        ;IN-LINE PRINT
  671.       JMP    MEX
  672.       RET
  673. ;
  674. MTIME:      MVI    C,TIMER        ;MEX TIMER
  675.       JMP    MEX
  676.       RET
  677. ;
  678. CRLF:      CALL    MILP        ;PRINT CARRIAGE RETURN, LINE FEED
  679.       DB    CR,LF,0
  680.       RET
  681. ;
  682. ;==========================================================================
  683. ;                            Data Area
  684. ;==========================================================================
  685. ;
  686. ; Default UART parameters (Initalized for External RS-232)
  687. ;
  688. REG0:      DB    00011000B    ;RESET CHANNEL A
  689. REG3:      DB    11000001B    ;ENABLE RECEIVE AT 8 BITS/CHAR
  690. REG4:      DB    01000100B    ;NO PARITY, 1 STOP BIT, CLOCK X16
  691. REG5:      DB    11101010B    ;ENABLE TRANSMIT AT 8 BITS/CHAR
  692. ;
  693. ; Miscellaneous Default Data
  694. ;
  695. EOSMSG:      DB    17H,'$'        ;CLEAR TO END-OF-SCREEN
  696. CLSMSG:      DB    1AH,'$'        ;CLEAR WHOLE SCREEN
  697. ;
  698.       END
  699.