home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / cpm / mex / mxh-kp53.asm < prev    next >
Assembly Source File  |  1994-07-13  |  26KB  |  948 lines

  1.     Title  'MexPlus Overlay for Kaypros Version 5.3'
  2. ;
  3. REV    EQU    53        ;OVERLAY REVISION LEVEL
  4. ;
  5. ;
  6. ;  MexPlus Hardware (MXH) Overlay for Kaypro Computers
  7. ;  using an external smartmodem.
  8. ;
  9. ;  NOTE: To fully implement MEXPLUS you need also get:
  10. ;
  11. ;    MXT-KP*.OVR     Kaypro termcap (video) overlay
  12. ;    MXM-SM*.OVR     Smartmodem dialing overlay
  13. ;    MXC-K484.OVR    For Kaypro Internal factory clock, or
  14. ;    MXC-LG10.OVR    Legacy KP10 clock overlay
  15. ;
  16. ;  MEXPLUS uses the following conventions:
  17. ;
  18. ;  MXH-*.OVR    Hardware overlay for computer
  19. ;  MXT-*.OVR    Terminal capability overlay
  20. ;  MXC-*.OVR    Real-time clock overlay for 8080/Z80 vers
  21. ;  MXM-*.OVR    Modem overlay
  22. ;
  23. ;  These overlays are available from The NightOwl Connection
  24. ;  if you are subscriber or thru The DatCOM Super System
  25. ;  (813) 937-3608  300/1200 bps (annual fee also req'd).
  26. ;
  27. ;  //////////////////////////////////////////////////////////
  28. ;
  29. ;  A full-featured SET command processor is implemented.
  30. ;  The following table outlines the SET command options:
  31. ;
  32. ;        
  33. ;    SET Command
  34. ;
  35. ;    BAUD <RATE>            Set modem to Baud rate specified.
  36. ;                    Baud rates supported are 110, 300,
  37. ;                    600, 1200, 2400, 4800, 9600, 19200
  38. ;
  39. ;    ORIG                            Set modem to Originate mode
  40. ;    ANSWER                          Set modem to Auto-answer mode
  41. ;    TONE                            Set modem to Tone dialing
  42. ;    PULSE                           Set modem to Pulse dialing
  43. ;    MONITOR                Turn Hayes monitor ON
  44. ;    QUIET                Turn Hayes monitor OFF
  45. ;    PARITY                          Set Parity to Odd, Even, or Off
  46. ;    STOPBITS                        Set number of Stop Bits to 1, 1.5, 2
  47. ;    LENGTH                 Set word length to 5, 6, 7, 8
  48. ;
  49. ;    MANUAL ORIG <or> ANSWER        Place modem in active state and
  50. ;                    generate Answer or Originate
  51. ;                    carrier tone
  52. ;
  53. ;
  54. ;  History:
  55. ;  08/12/85   v5.3  Trimmed down the code, it was 7 bytes too long.
  56. ;            Remember, this thing HAS to end by 0AFF!;  Also,
  57. ;            all the Smartmodem code that's still here (I
  58. ;            thought somebody removed all that???) induced me
  59. ;            to do a new Kaypro overlay, MXH-KG10 (Kaypro Gen-
  60. ;            eric), with no Smartmodem code.  I've been able
  61. ;            to test it only on a couple of Kaypro models -- I
  62. ;            think it should work for all -- I'd appreciate any
  63. ;            feedback from people using the KG10 overlay.
  64. ;                        --Ron Fowler
  65. ;
  66. ;  07/12/85   v5.2  Removed and rewote code for 'eye wash' as it made a
  67. ;            nice generic kp overlay kp-video dependent. Changed
  68. ;            code to enter mex's video attribute routines the way
  69. ;            its supposed to be done. Also changed modem init to
  70. ;            wait 30 sec before timout. Was hanging up prematurely
  71. ;            on many long distance calls. 
  72. ;                            -- Mike Woodward
  73. ;
  74. ;  05/28/85   v5.1   Added some video 'eye-wash' to the console
  75. ;                    displays to make em look nicer.
  76. ;                                                    -- Steve Sanders
  77. ;  05/26/84   v5.0   Modified MXO-KPS4 for MexPlus compatibility.
  78. ;                                 -- Terry Carroll
  79. ;
  80. ;------------------------------------------------------------
  81. ;
  82. ; Kaypro port definitions
  83. ;
  84. EXPORT    EQU    04H        ;base external port
  85. EXTCT1    EQU    EXPORT+2    ;external modem status port
  86. EXTDAT    EQU    EXPORT        ;external modem data port
  87. BAUDRP    EQU    00H        ;external modem baud rate port
  88. ;
  89. ; Kaypro bit definitions
  90. ;
  91. MDRCVB    EQU    01H        ;modem receive bit (DAV)
  92. MDRCVR    EQU    01H        ;modem receive ready
  93. MDSNDB    EQU    04H        ;modem send bit
  94. MDSNDR    EQU    04H        ;modem send ready bit
  95. ;
  96. ;
  97. ; MEX service processor equates
  98. ;
  99. MEX    EQU    0D00H        ;address of the service processor
  100. INMDM    EQU    255        ;get char from port to A, CY=no more in 100 ms
  101. TIMER    EQU    254        ;delay 100ms * reg B
  102. TMDINP    EQU    253        ;B=# secs to wait for char, cy=no char
  103. CHEKCC    EQU    252        ;check for ^C from KBD, Z=present
  104. SNDRDY    EQU    251        ;test for modem-send ready
  105. RCVRDY    EQU    250        ;test for modem-receive ready
  106. SNDCHR    EQU    249        ;send a character to the modem (after sndrdy)
  107. RCVCHR    EQU    248        ;recv a char from modem (after rcvrdy)
  108. LOOKUP    EQU    247        ;table search: see CMDTBL comments for info
  109. PARSFN    EQU    246        ;parse filename from input stream
  110. BDPARS    EQU    245        ;parse baud-rate from input stream
  111. SBLANK    EQU    244        ;scan input stream to next non-blank
  112. EVALA    EQU    243        ;evaluate numeric from input stream
  113. LKAHED    EQU    242        ;get nxt char w/o removing from input
  114. GNC    EQU    241        ;get char from input, cy=1 if none
  115. ILP    EQU    240        ;inline print
  116. DECOUT    EQU    239        ;decimal output
  117. PRBAUD    EQU    238        ;print baud rate
  118. ;
  119. ; MEX TERMINAL OVERLAY VECTORS
  120. CLS    EQU    140FH        ;clear screen
  121. ENTREV    EQU    1415H        ;enter rev video
  122. EXREV    EQU    1418H        ;exit rev video
  123. ENTBRT    EQU    141BH        ;enter bright (exit dim?)
  124. EXBRT    EQU    141EH        ;exit bright (enter dim?)
  125. ;
  126. PRINT    EQU    9        ;BDOS/MEX print-string function call
  127. ;
  128. BELL    EQU    7        ;bell
  129. TAB    EQU    9
  130. CR    EQU    13        ;carriage return
  131. LF    EQU    10        ;linefeed
  132. ESC    EQU    1BH        ;escape
  133. YES    EQU    0FFH
  134. NO    EQU    0
  135. ;
  136. I8080    EQU    YES        ;FOR TRANSLATOR - DO NOT CHANGE
  137. I8086    EQU    NO
  138. CPM    EQU    YES
  139. PCDOS    EQU    NO
  140. ;
  141. ;
  142. ; ## The following JUMP instruction is necessary for MEXPLUS loadable overlays
  143. ;
  144.     ORG    100H
  145.     DB    0C3H        ;##JMP INSTRUCTION (MEX 1.2)
  146. ;
  147. ; Change the clock speed to suit your system
  148. ;
  149.     DS    2        ;(for  "JMP   START" instruction)
  150.  
  151.     DB    NO        ;yes=PMMI S-100 Modem            103H
  152.     DB    YES        ;yes=HAYES Smartmodem, no=non-PMMI    104H
  153. TPULSE:    DB    'T'        ;T=touch, P=pulse (Smartmodem-only)    105H
  154. CLOCK:    DB    50        ;clock speed in MHz x10, 25.5 MHz max.    106H
  155.                 ;20=2 MHh, 37=3.68 MHz, 40=4 MHz, etc.
  156. MSPEED:    DB    5        ;0=110 1=300 2=450 3=600 4=710 5=1200    107H
  157.                 ;6=2400 7=4800 8=9600 9=19200 default
  158. BYTDLY:    DB    5        ;0=0 delay  1=10ms  5=50 ms - 9=90 ms    108H
  159.                 ;default time to send character in ter-
  160.                 ;minal mode file transfer for slow BBS.
  161. CRDLY:    DB    5        ;0=0 delay 1=100 ms 5=500 ms - 9=900 ms 109H
  162.                 ;default time for extra wait after CRLF
  163.                 ;in terminal mode file transfer
  164. COLUMS:    DB    5        ;number of DIR columns shown        10AH
  165. SETFLG:    DB    YES        ;yes=user-added Setup routine        10BH
  166. SCRTST:    DB    YES        ;Cursor control routine         10CH
  167.     DB    YES        ;yes=resend a record after any non-ACK    10DH
  168.                 ;no=resend a record after a valid-NAK
  169. BAKFLG:    DB    YES        ;yes=change any file same name to .BAK    10EH
  170. CRCDFL:    DB    YES        ;yes=default to CRC checking        10FH
  171. TOGCRC:    DB    YES        ;yes=allow toggling of CRC to Checksum    110H
  172. CVTBS:    DB    NO        ;yes=convert backspace to rub        111H
  173. TOGLBK:    DB    YES        ;yes=allow toggling of bksp to rub    112H
  174. ADDLF:    DB    NO        ;no=no LF after CR to send file in    113H
  175.                 ;terminal mode (added by remote echo)
  176. TOGLF:    DB    YES        ;yes=allow toggling of LF after CR    114H
  177.     DB    YES        ;yes=allow transmission of logon    115H
  178.                 ;write logon sequence at location LOGON
  179. SAVCCP:    DB    YES        ;yes=do not overwrite CCP        116H
  180.     DB    NO        ;yes=local command if EXTCHR precedes    117H
  181.                 ;no=external command if EXTCHR precedes
  182.     DB    YES        ;yes=allow toggling of LOCONEXTCHR    118H
  183. LSTTST:    DB    YES        ;yes=printer available on printer port    119H
  184. XOFTST:    DB    NO        ;yes=checks for XOFF from remote while    11AH
  185.                 ;sending a file in terminal mode
  186. XONWT:    DB    NO        ;yes=wait for XON after CR while    11BH
  187.                 ;sending a file in terminal mode
  188. TOGXOF:    DB    YES        ;yes=allow toggling of XOFF checking    11CH
  189. IGNCTL:    DB    NO        ;yes=CTL-chars above ^M not displayed    11DH
  190. EXTRA1:    DB    0        ;for future expansion            11EH
  191. EXITCHR    DB    'E'-40H        ;^E = Exit to main menu            11FH
  192. BRKCHR:    DB    '@'-40H        ;^@ = Send 300 ms. break tone        120H
  193. NOCONN:    DB    'N'-40H        ;^N = Disconnect from the phone line    121H
  194. LOGCHR:    DB    'L'-40H        ;^L = Send logon            122H
  195. LSTCHR:    DB    'P'-40H        ;^P = Toggle printer            123H
  196. UNSAVE:    DB    'R'-40H        ;^R = Close input text buffer        124H
  197. TRNCHR:    DB    'T'-40H        ;^T = Transmit file to remote        125H
  198. SAVCHR:    DB    'Y'-40H        ;^Y = Open input text buffer        126H
  199. EXTCHR:    DB    '^'-40H        ;^^ = Send next character        127H
  200.     DS    2        ;unused by MEX                128H
  201. ;
  202. ;
  203. ; Low-level modem I/O routines.
  204. ;
  205. INCTL1:    JMP    INCTRL        ;in modem control port
  206.     DB    0,0,0,0,0,0,0    ;spares if needed for non-PMMI
  207. ;
  208. OTDATA:    JMP    OUTDTA        ;out modem data port
  209.     DB    0,0,0,0,0,0,0    ;spares if needed for non=PMMI
  210. ;
  211. INPORT: JMP    INDATA        ;in modem data port
  212.     DB    0,0,0,0,0,0,0    ;spares if needed for non-PMMI
  213. ;
  214. ; Bit-test routines. 
  215. ;
  216. MASKR:    ANI MDRCVB          ;bit to test for receive ready
  217.     RET
  218. TESTR:    CPI MDRCVR          ;value of receive bit when ready
  219.     RET
  220. MASKS:    ANI MDSNDB          ;bit to test for send ready
  221.     RET
  222. TESTS:    CPI MDSNDR          ;value of send bit when ready
  223.     RET
  224. ;
  225. ;
  226. ; ## Following are two new entrie points for MEXPLUS
  227. ; DCDTST returns data-carrier detect in A: 0 if no carrier
  228. ;  present, 0FFH if carrier is present, and 0FEH if overlay
  229. ;  doesn't know (i.e., doesn't support carrier detect)
  230. ; RNGDET works similarly for ring-detect.
  231. ;
  232. DCDTST:    JMP    DCDVEC        ;data carrier detect            154H
  233. RNGDET:    JMP    RNGVEC        ;ring-detect                157H
  234. ;
  235. ; End of MEXPLUS added vectors
  236. ;
  237.     DB    0,0,0,0,0    ;reserved space, assumed 0
  238. ;                                    15FH
  239. SMDISC:    DS    3        ;software disconnect (in smartmodem overlay)
  240. ;
  241.     DS    3        ;DIALV: not done here (maybe MXO-SM)    162H
  242. DISCV:    JMP    DISCON        ;disconnect (if not used, should be JMP SMDISC)
  243. GOODBV:    JMP    GOODBYE        ;                    168H
  244. INMODV:    JMP    NITMOD        ;go to user written routine        16BH
  245.     JMP    PBAUD        ;NEWBDV                    16EH
  246.     RET             ;NOPARV                    171H
  247.     NOP
  248.     NOP
  249.     RET             ;PARITV                    174H
  250.     NOP
  251.     NOP
  252. SETUPV:    JMP    SETCMD        ;                    177H
  253.     DS    3        ;not used by MEX            17AH
  254. VERSNV:    JMP    SYSVER        ;                    17DH
  255. BREAKV:    JMP    SBREAK        ;                    180H
  256. ;
  257. ; Do not change the following six lines (they provide access to routines
  258. ; in MEX that are present to support MDM7 overlays -- they will likely
  259. ; be gone by MEX v2.0).
  260. ;
  261. ILPRTV:    DS    3        ;                    183H
  262. INBUFV    DS    3        ;                    186H
  263. ILCMPV:    DS    3        ;                    189H
  264. INMDMV:    DS    3        ;                    18CH
  265.     DS    3        ;                    18FH
  266. TIMERV    DS    3        ;                    192H
  267. ;
  268. ;
  269.     ORG    200H        ;## NEW BOUNDARY FOR MEX1.2
  270. ;------------------------------------------------------------
  271. ;
  272. ; end of fixed area
  273. ;
  274. ;------------------------------------------------------------
  275. ;
  276. ; Low level modem routine area
  277. ;
  278. INCTRL:    MVI    A,10H
  279.     OUT    EXTCT1
  280.     IN    EXTCT1
  281.     RET
  282. ;
  283. INDATA:    IN    EXTDAT
  284.     RET
  285. ;
  286. OUTDTA:    OUT    EXTDAT
  287.     RET
  288. ;
  289. ; Print out the overlay version
  290. ;
  291. SYSVER:      CALL  MILP
  292.       DB    CR,LF
  293.       DB    'KAYPRO MexPlus Overlay --- Version '
  294.       DB    REV/10+'0'
  295.       DB    '.'
  296.       DB    REV MOD 10+'0'
  297.       DB    CR,LF,CR,LF
  298.       DB    0
  299.       RET
  300. ;
  301. ; Break, disconnect and goodbye routines
  302. ;
  303. SBREAK:   MVI    A,5
  304.       OUT    EXTCT1
  305.       LDA    REG5
  306.       ORI    9AH        ;Send a break
  307.        OUT    EXTCT1
  308.       MVI    B,3        ;DELAY 300 MS.
  309.       CALL  MTIME
  310.       MVI    A,5
  311.       OUT    EXTCT1
  312.       LDA    REG5
  313.       OUT    EXTCT1        ;stop break
  314.       RET
  315. ;
  316. ; ## return data carrier detect status
  317. ;      0    = no carrier
  318. ;      255  = carrier present
  319. ;      254  = we don't know (DCD not supported)
  320. ;
  321. DCDVEC:    MVI    A,0FEH        ;get status port
  322.     RET            ;return "we don't know" detect
  323. ;
  324. ; ## return ring-detect status:
  325. ;
  326. ;     0   =  not ringing
  327. ;     255 =  ring detected
  328. ;     254 =  we don't kno
  329. ;
  330. RNGVEC:    MVI    A,0FEH        ;return "we don't know"
  331.     RET
  332. ;
  333. ; Disconnect Hayes, etc.
  334. ;
  335. DISCON:   MVI    A,5
  336.       OUT    EXTCT1        ;SEND TO THE STATUS PORT
  337.       MVI    A,68H        ;TURN OFF DTR/RTS
  338.       OUT    EXTCT1
  339.       MVI    B,10        ;DELAY 1 SEC.
  340.       CALL  MTIME
  341.       MVI    A,5
  342.       OUT    EXTCT1
  343.       MVI    A,0EAH        ;TURN 'EM BACK ON AGAIN
  344.       OUT    EXTCT1
  345.       RET
  346. ;
  347. ; GOODBYE routines are called by MEX prior to exit to CP/M
  348. ;
  349. GOODBYE:  RET            ;NOTE: EXIT TO CP/M WITH NO CHANGE TO
  350.                 ;CONNECT STATUS OR SETTINGS (PARITY, ETC)
  351. ;
  352. ; Initialize RS-232 port, Smartmodem, and default modes.
  353. ;
  354. NITMOD:   CALL    INCTRL        ;SEE IF MODEM IS CONNECTED, I.E., RETURNING
  355.       ANI    08H        ;   TO ACTIVE MODEM FROM CPM
  356.       RNZ            ;SKIP IF CONNECTED
  357.           CALL  NITSIO
  358.       LDA    MSPEED        ;GET DEFAULT BAUD RATE
  359.       CALL    PBAUD        ;SET IT
  360.       LDA    MONFLG        ;GET MONITOR DEFAULT
  361.       ORA    A
  362.       MVI    A,'0'        ;SPEAKER OFF
  363.       JZ    NITMOD4
  364.       MVI    A,'1'        ;SPEAKER ON
  365. NITMOD4:  STA    SMINIT+3    ;PUT IT IN SMINIT STRING
  366.       LDA    ANSFLG        ;GET MODE DEFAULT
  367.       ORA    A
  368.       MVI    A,'0'        ;ORIGINATE
  369.       JZ    NITMOD5
  370.       MVI    A,'1'        ;ANSWER
  371. NITMOD5:  STA    SMINIT+8    ;PUT IT IN SMINIT STRING
  372.       LXI    H,SMINIT
  373. SINIT:      CALL    SMSEND        ;SEND THE INIT STRING
  374. SMTLP1:      MVI    C,INMDM        ;WAIT FOR MODEM RESPONSE
  375.       CALL    MEX
  376.       JNC    SMTLP1        ;EAT EVERYTHING UNTIL SILENCE FOR
  377.       RET            ; 100 MSEC
  378. ;
  379. ;    Initialize the Zilog SIO chip
  380. ;
  381. NITSIO:      MVI   A,00H        ;Select reg. 0
  382.       OUT   EXTCT1
  383.       LDA    REG0        ;Command byte
  384.       OUT   EXTCT1
  385.       MVI    A,04H        ;Select reg. 4
  386.       OUT   EXTCT1
  387.       LDA    REG4        ;Receive/transmit control byte
  388.       OUT   EXTCT1
  389.       MVI    A,03H        ;Select reg. 3
  390.       OUT   EXTCT1
  391.       LDA    REG3        ;Receiver logic byte
  392.       OUT   EXTCT1
  393.       MVI    A,05H        ;Select reg. 5
  394.       OUT   EXTCT1
  395.       LDA    REG5        ;Transmitter logic byte
  396.       OUT   EXTCT1
  397.       RET
  398. ;
  399. ; Set command processor
  400. ;
  401. SETCMD:      MVI    C,SBLANK    ;ANY ARGUMENTS?
  402.       CALL  MEX
  403.       JC    SETSHO        ;IF NOT, DISPLAY DEFAULT(S)
  404.       LXI    D,CMDTBL
  405.           MVI    C,LOOKUP
  406.       CALL  MEX        ;PARSE THE ARGUMENT
  407.       PUSH    H        ;SAVE ANY PARSED ARGUMENTS ON STACK
  408.       RNC            ;IF WE HAVE ONE, RETURN TO IT
  409.       POP    H        ;OOPS, INPUT NOT FOUND IN TABLE
  410. SETERR:      CALL    ENTREV        ;TERMINAL OVERLAY ENTER REV VIDEO
  411.       LXI    D,SETEMS
  412.       MVI    C,PRINT
  413.       CALL    MEX
  414.       CALL  EXREV        ;TERMINAL OVERLAY EXIT REV VIDEO
  415.       CALL  CRLF
  416.       RET
  417. SETEMS:      DB    CR,LF,'=> SET command error <='
  418.       db    CR,LF,'$'
  419. ;
  420. ; Argument table
  421. ;
  422. CMDTBL:   DB    '?'+80H            ; HELP
  423.       DW    SETHELP
  424.       DB    'ORI','G'+80H        ; ORIGINATE MODE
  425.       DW    ORIG
  426.       DB    'ANSWE','R'+80H        ; ANSWER MODE
  427.       DW    ANS
  428.       DB    'TON','E'+80H        ; TONE DIALING
  429.       DW    STTONE
  430.       DB    'PULS','E'+80H        ; PULSE DIALING
  431.       DW    STPULSE
  432.       DB    'MONITO','R'+80H    ; MONITOR ON
  433.       DW    MONIT
  434.       DB    'QUIE','T'+80H        ; MONITOR OFF
  435.       DW    QUIET
  436.       DB    'BAU','D'+80H        ; SET BAUD
  437.       DW    STBAUD
  438.       DB    'PARIT','Y'+80H        ; SET PARITY
  439.       DW    STPRTY
  440.       DB    'STOPBIT','S'+80H    ; SET STOPBITS
  441.       DW    STSTOP
  442.       DB    'LENGT','H'+80H        ; SET LENGTH
  443.       DW    STBITS
  444.       DB    'MANUA','L'+80H        ; SET TO MANUAL MODE
  445.       DW    MANUAL
  446.       DB    0            ;TABLE TERMINATOR
  447. ;
  448. ;
  449. ;  "SET (no args): PRINT CURRENT STATISTICS
  450. ;
  451. SETSHO:      CALL  ENTREV            ;TERMINAL OVERLAY ENTER REV VIDEO
  452.       CALL  MILP
  453.       DB    ' Current SET values: '
  454.       db    CR,LF,0
  455.       CALL    EXREV            ;TERMINAL OVERLAY EXIT REV VIDEO
  456.       CALL    CRLF
  457.       CALL    MDSHOW
  458.       CALL    TPSHOW
  459.       CALL    BDSHOW
  460.       CALL    MONSHO
  461.       CALL    CRLF
  462.       CALL  SHPRTY
  463.       CALL    SHSTOP
  464.       CALL  SHBITS
  465.       CALL  CRLF
  466.       CALL  CRLF
  467.       RET
  468. ;
  469. ; "SET ?" processor
  470. ;
  471. SETHELP:  CALL  CLS
  472.       CALL    ENTREV
  473.       CALL    MILP
  474.       db    ' Available SET Commands: '
  475.       db    CR,LF,0
  476.       CALL  EXREV
  477.       CALL  MILP
  478.       DB    CR,LF,'SET ORIG      - Set modem to Originate mode'
  479.       DB    CR,LF,'                (Disable auto-answer mode)'
  480.       DB    CR,LF,'SET ANSWER    - Set modem to auto-answer mode'
  481.       DB    CR,LF,'SET TONE      - Set modem for Touchtone dialing'
  482.       DB    CR,LF,'SET PULSE     - Set modem for Pulse dialing'
  483.       DB    CR,LF,'SET PARITY    - OFF, EVEN or ODD'
  484.       DB    CR,LF,'SET STOPBITS  - 1, 1.5 or 2'
  485.       DB    CR,LF,'SET LENGTH    - 5, 6, 7 or 8'
  486.       DB    CR,LF,'SET QUIET     - Turn Modem monitor OFF'
  487.       DB    CR,LF,'SET MONITOR   - Turn Modem monitor ON'
  488.       DB    CR,LF,'SET BAUD      - 300, 1200, 2400, 4800, 9600, 19200'
  489.       DB    CR,LF,'SET MANUAL    - ORIG or ANSWER'
  490.       DB    CR,LF,'                Manually generate Answer or Originate '
  491.       DB    'carrier tone'
  492.       DB    CR,LF,CR,LF,0
  493.       RET
  494. ;
  495. ; Set manual processor
  496. ; Note: manual mode does not change the auto-answer status of the modem
  497. ;
  498. MANUAL:      MVI    C,SBLANK    ;check for ORIG <or> ANSWER
  499.       CALL    MEX        ;
  500.       JC    SETERR        ;if none, print error
  501.       LXI    D,MANTBL    ;check for proper syntax
  502.       MVI    C,LOOKUP
  503.       CALL    MEX
  504.       PUSH    H        ;match found, go do it!
  505.       RNC            ;
  506.       POP    H        ;no match: fix stack and
  507.       JMP    SETERR        ;  print error
  508. ;
  509. MANORIG:  MVI   B,30        ;FORCE 3 SECOND DELAY ON ORIGINATE END
  510.       CALL  MTIME
  511.       LXI    H,SMATD        ;SEND OUT 'ATD'
  512.       CALL    SINIT
  513.       CALL  MILP
  514.       DB    CR,LF,'Manual originate mode......',CR,LF
  515.       DB    'Modem now awaiting detection of an answer tone......'
  516.       DB    CR,LF,CR,LF,CR,LF,0
  517.       JMP    GOMAN
  518. MANANS:      LXI    H,SMATA        ;SEND OUT 'ATA'
  519.       CALL    SINIT
  520.       CALL  MILP
  521.       DB    CR,LF,CR,LF,'Manual answer mode -- carrier tone sent',CR,LF
  522.       DB    CR,LF,0
  523.       JMP   GOMAN
  524. ;
  525. SMATD:      DB    'ATD',CR,0
  526. SMATA:      DB    'ATA',CR,0
  527. ;
  528. GOMAN:      MVI   B,20
  529.       CALL  MTIME
  530.       CALL  MILP
  531.       DB    'Enter Terminal Mode at next command prompt',CR,LF
  532.       DB    'to check status of connection',CR,LF,CR,LF
  533.       DB    'To return to voice mode,',CR,LF
  534.       DB    'disconnect from within terminal mode <ESC N>,',CR,LF
  535.       DB    'or from command line <DSC>',CR,LF,CR,LF,CR,LF,0
  536.       RET
  537. ;
  538. ; Manual originate / answer command table
  539. ;
  540. MANTBL:   DB    'ORI','G'+80H        ;MANUAL ORIGINATE MODE
  541.       DW    MANORIG
  542.       DB    'ANSWE','R'+80H        ;MANUAL ANSWER MODE
  543.       DW    MANANS
  544.       DB    0
  545. ;
  546. ; "SET BAUD" processor
  547. ;
  548. STBAUD:      MVI    C,BDPARS    ;FUNCTION CODE: PARSE A BAUDRATE
  549.       CALL    MEX        ;LET MEX LOOK UP CODE
  550.       JC    SETERR        ;JUMP IF INVALID CODE
  551.       CALL    PBAUD        ;NO, TRY TO SET IT
  552.       JC    SETERR        ;IF NOT ONE OF OURS, BOMB OUT
  553. BDSHOW:      LDA    MSPEED        ;GET CURRENT BAUD RATE
  554.       MVI    C,PRBAUD    ;LET MEX PRINT IT
  555.       CALL    MEX
  556.       CALL  CRLF
  557.       RET 
  558. ;
  559. ; This routine sets baud rate passed as MSPEED code in A.
  560. ; Returns CY=1 if baud rate not supported.
  561. ;
  562. PBAUD:      PUSH    H        ;DON'T ALTER ANYBODY
  563.       PUSH    D
  564.       PUSH     B
  565.       MOV    E,A        ;MSPEED CODE TO DE
  566.       MVI    D,0
  567.       LXI    H,BAUDTB    ;OFFSET INTO TABLE
  568.       DAD    D
  569.       MOV    A,M        ;FETCH CODE
  570.       ORA    A        ;0 MEANS UNSUPPORTED CODE
  571.       STC            ;PREP CARRY IN CASE UNSUPPORTED
  572.       JZ    PBEXIT        ;EXIT IF BAD
  573.       OUT    BAUDRP        ;IF OK, SET IT
  574.       MOV    A,E        ;GET MSPEED CODE BACK
  575.       STA    MSPEED        ;SET IT
  576.       ORA    A        ;RETURN NO ERRORS
  577. PBEXIT:      POP    B
  578.       POP    D
  579.       POP    H
  580.       RET
  581. ;
  582. BAUDTB:      DB    02H        ;110
  583.       DB    05H        ;300
  584.       DB    0        ;450 (not supported)
  585.       DB    06H        ;600
  586.       DB    0        ;710 (not supported)
  587.       DB    07H        ;1200
  588.       DB    0AH        ;2400
  589.       DB    0CH        ;4800
  590.       DB    0EH        ;9600
  591.       DB    0FH        ;19200 
  592. ;
  593. ; SET MODEM STATUS TO ENABLE OR DISABLE AUTO-ANSWER
  594. ;
  595. ORIG:      XRA    A
  596.       STA    ANSFLG        ;SET ORIG FLAG
  597.       LXI    H,SMO        ;SEND OUT ATS0=0
  598.       CALL    SINIT
  599.       JMP    MDSHOW
  600. ;
  601. SMO:      DB    'ATS0=0',CR,0
  602. SMA:      DB    'ATS0=1',CR,0
  603. ;
  604. ANS:      MVI    A,0FFH
  605.       STA    ANSFLG        ;SET ANS FLAG
  606.       LXI    H,SMA        ;SEND OUT ATS0=1
  607.       CALL    SINIT
  608. ;
  609. MDSHOW:      LDA    ANSFLG
  610.       ORA    A
  611.       JZ    MDORIG        
  612.       CALL    MILP
  613.       DB    'Auto-answer mode',CR,LF,0
  614.       RET
  615. MDORIG:      CALL    MILP
  616.       DB    'Originate mode',CR,LF,0
  617.       RET
  618. ;
  619. ;
  620. ; Monitor control processor
  621. ;
  622. QUIET:       XRA    A
  623.       STA    MONFLG
  624.       LXI    H,SMQT
  625.       CALL    SINIT
  626.       JMP    MONSHO
  627. ;
  628. MONIT:       MVI    A,0FFH
  629.       STA    MONFLG
  630.       LXI    H,SMMON
  631.       CALL    SINIT
  632. ;
  633. MONSHO:      LDA    MONFLG
  634.       ORA    A
  635.       JZ    MONOFF
  636.       CALL    MILP
  637.       DB    'Monitor Speaker ON',CR,LF,0
  638.       RET
  639. ;
  640. MONOFF:      CALL    MILP
  641.       DB    'Monitor Speaker OFF',CR,LF,0
  642.       RET
  643. ;
  644. SMQT:      DB    'ATM0',CR,0
  645. SMMON:      DB    'ATM1',CR,0
  646. ;
  647. ; Set dial processor
  648. ;
  649. STTONE:      MVI    A,'T'
  650.       STA   TPULSE
  651.       JMP    TPSHOW
  652. ;
  653. STPULSE:  MVI    A,'P'
  654.           STA    TPULSE
  655. ;
  656. TPSHOW:      LDA    TPULSE
  657.       CPI    54H
  658.       JZ    TPTONE
  659.       CALL    MILP
  660.           DB    'Pulse Dialing',CR,LF,0
  661.       RET
  662. TPTONE:      CALL    MILP
  663.       DB    'Touchtone Dialing',CR,LF,0      
  664.       RET
  665. ;
  666. ;    SET PARITY command: reset transmit/receive parity
  667. ;
  668. ;        Parity is controlled by bits 0 and 1 of
  669. ;        the byte sent to the SIO write-register
  670. ;        4 as follows:
  671. ;
  672. ;           Parity    Bit 1       Bit 0
  673. ;                 Off          -          0
  674. ;              Odd      0         1
  675. ;             Even      1         1
  676. ;
  677. STPRTY:      MVI    C,SBLANK    ;check for parity code
  678.       CALL    MEX        ;
  679.       JC    SETERR        ;if none, print error
  680.       LXI    D,PARTBL    ;check for proper syntax
  681.       MVI    C,LOOKUP
  682.       CALL    MEX
  683.       PUSH    H        ;match found, go do it!
  684.       RNC            ;
  685.       POP    H        ;no match: fix stack and
  686.       JMP    SETERR        ;  print error
  687. ;
  688. PROFF:      LDA    REG4        ;get register 4 byte
  689.       ANI    0FEH        ;reset bit 0
  690.       JMP    PARTB1        ;
  691. PREVEN:      LDA    REG4        ;
  692.       ORI    003H        ;set bits 0 & 1
  693.       JMP    PARTB1        ;
  694. PRODD:      LDA    REG4        ;
  695.       ORI    001H        ;set bit 0
  696.       ANI    0FDH        ;reset bit 1
  697. PARTB1:      STA    REG4        ;
  698.       CALL    NITSIO        ;re-initialize the USART
  699.       CALL    SHPRTY        ;print the result
  700.       RET             ;
  701. SHPRTY:      CALL    MILP        ;display parity
  702.       DB    'Parity:  ',TAB,' ',0
  703.       LDA    REG4        ;
  704.       ANI    001H        ;test bit 0
  705.       CPI    0        ;if bit0=0 then parity off
  706.       JNZ    SHPRT1        ;
  707.       CALL    MILP        ;
  708.       DB    'Off',CR,LF,0    ;
  709.       RET
  710. SHPRT1:      LDA    REG4        ;
  711.       ANI    002H        ;test bit 1
  712.       CPI    0        ;if bit1=0 then parity odd
  713.       JNZ    SHPRT2        ;
  714.       CALL    MILP        ;
  715.       DB    'Odd',CR,LF,0    ;
  716.       RET            ;
  717. SHPRT2:      CALL    MILP        ;
  718.       DB    'Even',CR,LF,0    ;
  719.       RET
  720. ;
  721. ;    SET PARITY command table
  722. ;
  723. PARTBL:      DB    'OF','F'+80H    ;"set parity off"
  724.       DW    PROFF
  725.       DB    'EVE','N'+80H    ;"set parity even"
  726.       DW    PREVEN
  727.       DB    'OD','D'+80H    ;"set parity odd"
  728.       DW    PRODD
  729.       DB    0        ;<<== end of parity table
  730. ;
  731. ;    SET STOPBITS command: reset number of stop bits
  732. ;
  733. ;        The number of stop bits is controlled by bits
  734. ;        2 and 3 of the byte sent to the SIO write-
  735. ;        register 4, as follows:
  736. ;
  737. ;            Stop bits       Bit 3    Bit 2
  738. ;            1         0            1
  739. ;               1.5         1          0
  740. ;            2         1          1
  741. ;
  742. ;
  743. STSTOP:      MVI    C,SBLANK    ;check for stop bits
  744.       CALL    MEX        ;
  745.       JC    SETERR        ;if none, print error
  746.       LXI    D,STPTBL    ;check for proper syntax
  747.       MVI   C,LOOKUP
  748.       CALL    MEX        ;
  749.       PUSH    H        ;match found, go do it!
  750.       RNC            ;
  751.       POP    H        ;no match: fix stack and
  752.       JMP    SETERR        ;  print error
  753. ;
  754. STOP01:      LDA    REG4        ;get register 4 byte
  755.       ANI    0F7H        ;reset bit 3
  756.       ORI    004H        ;set bit 2
  757.       JMP    STSTP1        ;
  758. STOP02:      LDA    REG4        ;
  759.       ORI    00CH        ;set bits 2 and 3
  760.       JMP    STSTP1        ;
  761. STOP15:      LDA    REG4        ;
  762.       ORI    008H        ;set bit 3
  763.       ANI    0FBH        ;reset bit 2
  764. STSTP1:      STA    REG4        ;
  765.       CALL    NITSIO        ;
  766.       CALL    SHSTOP        ;print the result
  767.       RET
  768. SHSTOP:      CALL    MILP        ;display stop-bits
  769.       DB    'Stop bits:',TAB,' ',0
  770.       LDA    REG4        ;
  771.       ANI    004H        ;test bit 2
  772.       CPI    0        ;if bit2=0 then 1.5
  773.       JNZ    SHSTP1        ;
  774.       CALL    MILP        ;
  775.       DB    '1.5',CR,LF,0    ;
  776.       RET
  777. SHSTP1:      LDA    REG4        ;
  778.       ANI    008H        ;test bit 3
  779.       CPI    0        ;if bit3=0 then 1
  780.       JNZ    SHSTP2        ;
  781.       CALL    MILP        ;
  782.       DB    '1',CR,LF,0    ;
  783.       RET
  784. SHSTP2:      CALL    MILP        ;
  785.       DB    '2',CR,LF,0    ;
  786.       RET
  787. ;
  788. ;    SET STOPBITS command table
  789. ;
  790. STPTBL:      DB    '1'+80H        ;"set stop 1"
  791.       DW    STOP01
  792.       DB    '2'+80H        ;"set stop 2"
  793.       DW    STOP02
  794.       DB    '1.','5'+80H    ;"set stop 1.5"
  795.       DW    STOP15
  796.       DB    0        ;<<== End of stop-bits table
  797. ;
  798. ;    SET LENGTH command: set bits per character
  799. ;
  800. ;        The number of bits per character is controlled for
  801. ;        the receiver circuit by bits 6 and 7 of the byte
  802. ;        sent to the SIO write-register 3 and for the trans-
  803. ;        mitter circuit by bits 5 and 6 of the byte sent to
  804. ;        the SIO write-register 5.  The assumption has been
  805. ;        made here that both transmission and reception will
  806. ;        be carried on at the same number of bits per charac-
  807. ;        ter.  The bit configurations are shown for register
  808. ;        3 only, but are the same for register 5:
  809. ;
  810. ;            BPC        Bit 7        Bit 6
  811. ;             5          0          0
  812. ;             6          1             0
  813. ;             7          0          1
  814. ;             8          1          1
  815. ;
  816. STBITS:      MVI    C,SBLANK    ;check for bits/char
  817.       CALL    MEX        ;
  818.       JC    SETERR        ;if none, print error
  819.       LXI    D,BITTBL    ;check for proper syntax
  820.       MVI    C,LOOKUP
  821.       CALL    MEX
  822.       PUSH    H        ;match found, go do it!
  823.       RNC            ;
  824.       POP    H        ;no match: fix stack and
  825.       JMP    SETERR        ;  print error
  826. ;
  827. BIT5:      LDA    REG3        ;
  828.       ANI    0BFH        ;reset bit 6
  829.       ANI    07FH        ;reset bit 7
  830.       STA    REG3        ;
  831.       LDA    REG5        ;
  832.       ANI    0DFH        ;reset bit 5
  833.       ANI    0BFH        ;reset bit 6
  834.       JMP    STBTS1        ;
  835. BIT6:      LDA    REG3        ;
  836.       ANI    0BFH        ;reset bit 6
  837.       ORI    080H        ;set bit 7
  838.       STA    REG3        ;
  839.       LDA    REG5        ;
  840.       ANI    0DFH        ;reset bit 5
  841.       ORI    040H        ;set bit 6
  842.       JMP    STBTS1        ;
  843. BIT7:      LDA    REG3        ;
  844.       ORI    040H        ;set bit 6
  845.       ANI    07FH        ;reset bit 7
  846.       STA    REG3        ;
  847.       LDA    REG5        ;
  848.       ORI    020H        ;set bit 5
  849.       ANI    0BFH        ;reset bit 6
  850.       JMP    STBTS1        ;
  851. BIT8:      LDA    REG3        ;
  852.       ORI    040H        ;set bit 6
  853.       ORI    080H        ;set bit 7
  854.       STA    REG3        ;
  855.       LDA    REG5        ;
  856.       ORI    020H        ;set bit 5
  857.       ORI    040H        ;set bit 6
  858. STBTS1:      STA    REG5        ;
  859.       CALL    NITSIO        ;
  860.       CALL    SHBITS        ;print the result
  861.       RET
  862. SHBITS:      CALL    MILP        ;display bits/char
  863.       DB    'Bits/char:',TAB,' ',0
  864.       LDA    REG5        ;
  865.       ANI    040H        ;test bit 6
  866.       CPI    0        ;if bit6=0 then 6 bpc
  867.       JNZ    SHBTS2        ;
  868.       LDA    REG5        ;
  869.       ANI    020H        ;test bit 5
  870.       CPI    0        ;if bit5=0 then 5 bpc
  871.       JNZ    SHBTS1        ;
  872.       CALL    MILP        ;
  873.       DB    '5',CR,LF,0    ;
  874.       RET            ;
  875. SHBTS1:      CALL    MILP        ;
  876.       DB    '7',CR,LF,0    ;
  877.       RET            ;
  878. SHBTS2:      LDA    REG5        ;
  879.       ANI    020H        ;test bit 5
  880.       CPI    0        ;if bit5=0 then 6 bpc
  881.       JNZ    SHBTS3        ;
  882.       CALL    MILP        ;
  883.       DB    '6',CR,LF,0    ;
  884.       RET            ;
  885. SHBTS3:      CALL    MILP        ;
  886.       DB    '8',CR,LF,0    ;
  887.       RET
  888. ;
  889. ;    SET LENGTH command table
  890. ;
  891. BITTBL:      DB    '5'+80H        ;"set bits 5"
  892.       DW    BIT5
  893.       DB    '6'+80H        ;"set bits 6"
  894.       DW    BIT6
  895.       DB    '7'+80H        ;"set bits 7"
  896.       DW    BIT7
  897.       DB    '8'+80H        ;"set bits 8"
  898.       DW    BIT8
  899.       DB    0        ;<<== end of bpc table
  900. ;
  901. ; General utility routines
  902. ;
  903. MILP:      MVI    C,ILP        ;IN-LINE PRINT
  904.       JMP    MEX
  905.       RET
  906. ;
  907. MTIME:      MVI    C,TIMER        ;MEX TIMER
  908.       JMP    MEX
  909.       RET
  910. ;
  911. CRLF:      CALL    MILP        ;PRINT CARRIAGE RETURN, LINE FEED
  912.       DB    CR,LF,0
  913.       RET
  914. ;
  915. ; Send string to the External Modem
  916. ;
  917. SMSEND:      MVI    C,SNDRDY    ;WAIT FOR MODEM READY
  918.       CALL    MEX
  919.       JNZ    SMSEND
  920.       MOV    A,M        ;FETCH NEXT CHARACTER
  921.       INX    H
  922.       ORA    A        ;END?
  923.       RZ            ;DONE IF SO
  924.       MOV    B,A        ;NO, POSITION FOR SENDING
  925.       MVI    C,SNDCHR    ;NOPE, SEND THE CHARACTER
  926.       CALL    MEX
  927.       JMP    SMSEND
  928. ;
  929. ;==========================================================================
  930. ;                            Data Area
  931. ;==========================================================================
  932. ;
  933. ; Default UART parameters (Initalized for External RS-232)
  934. ;
  935. REG0:      DB    00011000B    ;RESET CHANNEL A
  936. REG3:      DB    11000001B    ;ENABLE RECEIVE AT 8 BITS/CHAR
  937. REG4:      DB    01000100B    ;NO PARITY, 1 STOP BIT, CLOCK X16
  938. REG5:      DB    11101010B    ;ENABLE TRANSMIT AT 8 BITS/CHAR
  939. ;
  940. ; Miscellaneous Default Data
  941. ;
  942. MSPDSV:      DB    0        ;SAVE EXTERNAL MODEM MSPEED
  943. MONFLG:      DB    0FFH        ;0: MONITOR OFF - 0FFH: MONITOR ON
  944. ANSFLG:      DB    0        ;0: ORIGINATE   - 0FFH: ANSWER
  945. SMINIT:   DB    'ATM1 S0=0 S7=30 Q0 X1',CR,0    ;MODEM INIT STRING
  946.       END
  947.