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

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