home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / cpm / mex / mxo-mr11.aqm / MXO-MR11.ASM
Assembly Source File  |  1985-12-08  |  44KB  |  1,106 lines

  1. ; MXO-MR11.ASM -- MEX Port Overlay file for the Morrow Descision 11  03-OCT-85
  2. ;-----------------------------------------------------------------------------;
  3. ; This overlay adapts the MEX modem program for the Morrow Micro  Decision 11.
  4. ; This MEX Port overlay digresses from pure by encompassing a Hayes Smartmodem
  5. ; feature in  the SET command.  If this offends you in anyway,  set the SMODEM
  6. ; flag to "NO" to eliminate.
  7. ;
  8. ; The SET command used in this overlay will allow the setting of the baud rate
  9. ; (speed) of the modem hardware port. As mentioned, the Smartmodem speaker is
  10. ; setable by the user  to one of three setting: OFF: such that  the speaker is
  11. ; always off, HALF: such that the  speaker is on during the  dialing sequence,
  12. ; but turns off when the carrier is detected,  and FULL: the speaker stays  on
  13. ; when carrier detected. This is useful when one doesn't wish the stereo to be
  14. ; drowned out by the Smartmodem dialing.
  15. ;
  16. ; A more  detailed description of the calling conventions used by this overlay
  17. ; overlay can be found in the PMMI modem overlay (MXO-PMxx.ASM where the  "xx"
  18. ; is the current version number).
  19. ;-----------------------------------------------------------------------------;
  20. ; History as a MEX overlay
  21. ;
  22. ; 10/02/85 - Stolen from MXO-SZ20.ASM                 (V1.1)    - Stuart Rose
  23. ;
  24. ;-----------------------------------------------------------------------------;
  25. ;
  26. OVERSION    equ    1    ; overlay version number
  27. OREVISION    equ    1    ; overlay revision level
  28. ;
  29. ;=============================================================================;
  30. ; CP/M system addresses                                  ;
  31. ;=============================================================================;
  32. ;
  33. WBOOT        equ    0000H    ; address of warm boot jump vector
  34. TPA        equ    0100H    ; address of transient program area
  35. ;
  36. ;=============================================================================;
  37. ; MEX system bytes. This overlay helps MEX remember the baud rate of the      ;
  38. ; modem port and speaker volume of the Smartmodem when hopping in and out of  ;
  39. ; MEX **DURING THE SAME CALL**. These values are used instead of the overlay  ;
  40. ; defaults (MSPEED and VOLUME respectively) when a call-in-progress is de-    ;
  41. ; tected on MEX startup. Then these values are used. To protect them, they    ;
  42. ; live in the system page (0000H-00FFH), in a location not used by the OS     ;
  43. ; (operating system). Generally 0040H-004FH is reserved for CBIOSes and is    ;
  44. ; fine for uses, as long as your CBIOS doesn't use it. If you are really un-  ;
  45. ; sure, set both values to 0000H, and this feature will be eliminated.          ;
  46. ;=============================================================================;
  47. ;
  48. MEXBAUD        equ    004FH    ; address of system byte for MEX baud rate
  49. MEXSPKR        equ    004EH    ; address of system byte for MEX speaker volume
  50. ;
  51. ;=============================================================================;
  52. ; MEX service processor address and functions                      ;
  53. ;=============================================================================;
  54. ;
  55. MEX        equ    0D00H    ; address of the MEX service processor
  56. INMDM        equ    255    ; A = char from modem,CARRY = no char in 100 ms
  57. TIMER        equ    254    ; delay B, in 100 ms units
  58. TMDINP        equ    253    ; wait B seconds for char, CARRY = no char
  59. CHEKCC        equ    252    ; check for ^C from keyboard, ZERO = present
  60. SNDRDY        equ    251    ; test for modem-send ready
  61. RCVRDY        equ    250    ; test for modem-receive ready
  62. SNDCHR        equ    249    ; send a character to the modem (after sndrdy)
  63. RCVCHR        equ    248    ; receive a character from modem (after rcvrdy)
  64. LOOKUP        equ    247    ; table search: see CMDTBL comments for info
  65. PARSFN        equ    246    ; parse filename from input stream
  66. PARSBD        equ    245    ; parse baud-rate from input stream
  67. SBLANK        equ    244    ; scan input stream to next non-blank
  68. EVALA        equ    243    ; evaluate numeric from input stream
  69. LKAHED        equ    242    ; get next char w/o removing from input stream
  70. GNC        equ    241    ; get next char from input stream, CARRY = none
  71. ILP        equ    240    ; inline print
  72. DECOUT        equ    239    ; decimal output
  73. PRBAUD        equ    238    ; print baud rate
  74. PRNTBL        equ    237    ; print command table CARRY SET for ^C abort
  75. PRID        equ    236    ; print current MEX ID string on console
  76. PRINT        equ    9    ; BDOS/MEX print-string function call
  77. CONOUT        equ    2    ; BDOS/MEX output a character to console call
  78. ;
  79. ;=============================================================================;
  80. ; Define new MEX modes (granted in MEX V1.10 and up)                  ;
  81. ;=============================================================================;
  82. ;
  83. CMDMOD    equ    0        ; 00 - MEX is in command mode
  84. TRMMOD    equ    1        ; 01 - MEX is in terminal mode
  85. SNDMOD    equ    2        ; 02 - SENDOUT active
  86. KEYMOD    equ    3        ; 03 - Keystring being transmitted
  87. XMDMSND    equ    4        ; 04 - File transfer: Christensen-protocol send
  88. XMDMRCV    equ    5        ; 05 - File transfer: Christensen-protocol rcv
  89. CISSND    equ    6        ; 06 - File transfer: CIS-protocol send
  90. CISRCV    equ    7        ; 07 - File transfer: CIS-protocol receive
  91. ;
  92. ;=============================================================================;
  93. ; define some ASCII control characters                          ;
  94. ;=============================================================================;
  95. ;
  96. NULL        equ    '@'-'@'    ; (^@) null
  97. BELL        equ    'G'-'@'    ; (^G) bell
  98. TAB        equ    'I'-'@'    ; (^I) tab
  99. CR        equ    'M'-'@'    ; (^M) carriage return
  100. LF        equ    'J'-'@'    ; (^J) line feed
  101. ESC        equ    '['-'@'    ; (^[) escape
  102. CTRL$Z        equ    'Z'-'@'    ; (^Z) control Z
  103. DEL        equ    7FH    ; delete
  104. EOS        equ    DEL    ; SNDLIN end-of-string character
  105. ;
  106. ;=============================================================================;
  107. ; define some boolean variables                              ;
  108. ;=============================================================================;
  109. ;
  110. YES        equ    0ffH    ; affirmative response
  111. NO        equ    000H    ; negative response
  112. TRUE        equ    YES    ; true (affirmative) response
  113. FALSE        equ    NO    ; false (negative) response
  114. ;
  115. ;=============================================================================;
  116. ; MEX dial subroutine return error codes                      ;
  117. ;=============================================================================;
  118. ;
  119. CARRIER        equ    0    ; CARRIER DETECTED return code
  120. BUSY        equ    1    ; FAR END BUSY return code
  121. NOANSWER    equ    2    ; NO ANSWER return code
  122. ABORT        equ    3    ; KEYBOARD ABORT return code
  123. ERROR        equ    4    ; MODEM ERROR return code
  124. NORING        equ    5    ; NO RING return code
  125. NODIALTONE    equ    6    ; NO DIAL TONE return code
  126.  
  127. ;=============================================================================;
  128. ; MEX system page parameters (are correct for MEX V1.1x)              ;
  129. ; see MEXPATxx for current values.                          ;
  130. ;=============================================================================;
  131. ;
  132. PROMPT        equ    MEX+13H    ; addr of address of id prompt
  133. CANCHR        equ    MEX+1CH    ; addr of cancel character
  134. ERRID        equ    MEX+2EH    ; addr of error id flag (0 = no id in err msg)
  135. ;
  136. ;=============================================================================;
  137. ; miscellaneous equates                                  ;
  138. ;=============================================================================;
  139. ;
  140. OFF        equ    '0'    ; Smartmodem code for speaker always off
  141. HALF        equ    '1'    ; Smartmodem code for speaker on until CD
  142. FULL        equ    '2'    ; Smartmodem code for speaker always on
  143. ;
  144. ;=============================================================================;
  145. ; MEX format baud rates                                  ;
  146. ;=============================================================================;
  147. ;
  148. MEX110        equ    0    ; MEX baud rate of 110
  149. MEX300        equ    1    ; MEX baud rate of 300
  150. MEX450        equ    2    ; MEX baud rate of 450
  151. MEX600        equ    3    ; MEX baud rate of 600
  152. MEX710        equ    4    ; MEX baud rate of 710
  153. MEX1200        equ    5    ; MEX baud rate of 1200
  154. MEX2400        equ    6    ; MEX baud rate of 2400
  155. MEX4800        equ    7    ; MEX baud rate of 4800
  156. MEX9600        equ    8    ; MEX baud rate of 9600
  157. MEX19200    equ    9    ; MEX baud rate of 19200
  158. ;
  159. ;=============================================================================;
  160. ; Baud rate parameters for Morrow Descision 11 Zilog DART              ;
  161. ;=============================================================================;
  162. ;
  163. BD300        equ    0C4H    ; 300 baud
  164. BD600        equ    084H    ; 600 baud
  165. BD1200        equ    044H    ; 1200 baud
  166. BD19200        equ    004H    ; 19200 baud
  167. ;
  168. ;=============================================================================;
  169. ; Morrow Descision 11 base port for modem serial port                  ;
  170. ;=============================================================================;
  171. BASE        equ    062H    ; base port of modem port for MD-11
  172. ;
  173. ;=============================================================================;
  174. ; Morrow initialization values for modem port baud rate, and the Hayes        ;
  175. ; Smartmodem speaker volume (the last two values take on values stored in     ;
  176. ; the MEX scratch area of the system parameter page when re-entering MEX      ;
  177. ; with a call-in-progress).                              ;
  178. ;=============================================================================;
  179. ;
  180. MD$BAUD        equ    MEX1200    ; initial baud rate (speed) for Morrow modem
  181. MD$SPKR        equ    OFF    ; initial speaker volume, speaker always off
  182. ;
  183. ;=============================================================================;
  184. ; Port offsets (from BASE)                              ;
  185. ;=============================================================================;
  186. ;
  187. DPORT        equ    0    ; data port
  188. SPORT        equ    1    ; status port
  189. CPORT        equ    1    ; control port
  190. ;
  191. ;=============================================================================;
  192. ; UAR/T status bits (for Zilog and Plymouth DART)                  ;
  193. ;=============================================================================;
  194. ;
  195. TBMT        equ    04H    ; transmit buffer empty
  196. DAV        equ    01H    ; data available
  197. DCDLIN        equ    08H    ; carrier detect (use DCD line itself)
  198. ;DCDLIN        equ    20H    ; carrier detect (use CTS line)
  199. ;
  200. ;=============================================================================;
  201. ;  Overlay starts here                                  ;
  202. ;=============================================================================;
  203. ;
  204.     org    TPA
  205. ;
  206. ;=============================================================================;
  207. ; MDM7xx/MEX parameter page                              ;
  208. ;=============================================================================;
  209. ;
  210. JMPMEX:    DS    3        ;(for "jmp START" instruction)        100H
  211. PMODEM:    DB    NO        ;yes=PMMI S-100 Modem            103H
  212. SMODEM:    DB    YES        ;yes=HAYES Smartmodem, no=non-PMMI    104H
  213. TPULSE:    DB    'T'        ;T=touch, P=pulse (Smartmodem-only)    105H
  214. CLOCK:    DB    40        ;clock speed in MHz x10, 25.5 MHz max.    106H
  215.                 ;20=2 MHh, 37=3.68 MHz, 40=4 MHz, etc.
  216. MSPEED:    DB    MD$BAUD        ;0=110 1=300 2=450 3=600 4=710 5=1200    107H
  217.                 ;6=2400 7=4800 8=9600 9=19200 default
  218. BYTDLY:    DB    0        ;0=0 delay  1=10ms  5=50 ms - 9=90 ms    108H
  219.                 ;default time to send character in ter-
  220.                 ;minal mode file transfer for slow BBS.
  221. CRDLY:    DB    0        ;0=0 delay 1=100 ms 5=500 ms - 9=900 ms 109H
  222.                 ;default time for extra wait after CRLF
  223.                 ;in terminal mode file transfer
  224. COLUMS:    DB    5        ;number of DIR columns shown        10AH
  225. SETFLG:    DB    YES        ;yes=user-added Setup routine        10BH
  226. SCRTST:    DB    YES        ;Cursor control routine         10CH
  227. ACKNAK: DB    YES        ;yes=resend a record after any non-ACK    10DH
  228.                 ;no=resend a record after a valid-NAK
  229. BAKFLG:    DB    NO        ;yes=change any file same name to .BAK    10EH
  230. CRCDFL:    DB    YES        ;yes=default to CRC checking        10FH
  231. TOGCRC:    DB    YES        ;yes=allow toggling of CRC to Checksum    110H
  232. CVTBS:    DB    NO        ;yes=convert backspace to rub        111H
  233. TOGLBK:    DB    YES        ;yes=allow toggling of bksp to rub    112H
  234. ADDLF:    DB    NO        ;no=no LF after CR to send file in    113H
  235.                 ;terminal mode (added by remote echo)
  236. TOGLF:    DB    YES        ;yes=allow toggling of LF after CR    114H
  237. LOGOK:    DB    NO        ;yes=allow transmission of logon    115H
  238.                 ;write logon sequence at location LOGON
  239. SAVCCP:    DB    YES        ;yes=do not overwrite CCP        116H
  240. LOCXCHR:DB    NO        ;yes=local command if EXTCHR precedes    117H
  241.                 ;no=external command if EXTCHR precedes
  242. TOGEXC:    DB    YES        ;yes=allow toggling of EXTCHR        118H
  243. LSTTST:    DB    YES        ;yes=printer available on printer port    119H
  244. XOFTST:    DB    YES        ;yes=checks for XOFF from remote while    11AH
  245.                 ;sending a file in terminal mode
  246. XONWT:    DB    NO        ;yes=wait for XON after CR while    11BH
  247.                 ;sending a file in terminal mode
  248. TOGXOF:    DB    YES        ;yes=allow toggling of XOFF checking    11CH
  249. IGNCTL:    DB    NO        ;yes=CTL-chars above ^M not displayed    11DH
  250. EXTRA1:    DB    0        ;for future expansion            11EH
  251. ;
  252. ;=============================================================================;
  253. ; Terminal mode escape character (for MDM7xx only)                  ;
  254. ;=============================================================================;
  255. ;
  256. EXITCHR DB    'E'-'@'        ; ^E = Exit to main menu        11FH
  257. BRKCHR    DB    '@'-'@'        ; ^@ = Send 300 ms. break tone        120H
  258. NOCONN    DB    'N'-'@'        ; ^N = Disconnect from the phone line    121H
  259. LOGCHR    DB    'L'-'@'        ; ^L = Send logon            122H
  260. LSTCHR    DB    'P'-'@'        ; ^P = Toggle printer            123H
  261. UNSAVE    DB    'Z'-'@'        ; ^Z = Close input text buffer        124H
  262. TRNCHR    DB    'T'-'@'        ; ^T = Transmit file to remote        125H
  263. SAVCHR    DB    'A'-'@'        ; ^A = Open input text buffer        126H
  264. EXTCHR    DB    '\'-'@'        ; ^\ = Send next character        127H
  265. ;
  266. ;=============================================================================;
  267. ; Overlay parameter page (unused by MEX)                      ;
  268. ;=============================================================================;
  269. ;
  270.     ds    2        ;
  271. ;
  272. ;=============================================================================;
  273. ; Modem I/O routines                                  ;
  274. ;=============================================================================;
  275. ;
  276. MDMSTAT:JMP    INPSP        ; get modem status            12AH
  277.     DS    7
  278. ;
  279. MDMOUT:    JMP    OUTDP        ; output a character to the modem    134H
  280.     DS    7
  281. ;
  282. MDMIN:    JMP    INPDP        ; input a character from the modem    13EH
  283.     DS    7
  284. ;
  285. ;=============================================================================;
  286. ; Modem status register send/receive bit test routines                  ;
  287. ;=============================================================================;
  288. ;
  289. MASKR:    ANI    DAV    ! RET    ; bit to test for receive ready        148H
  290. TESTR:    CPI    DAV    ! RET    ; value of receive bit when ready    14BH
  291. MASKS:    ANI    TBMT    ! RET    ; bit to test for send ready        14EH
  292. TESTS:    CPI    TBMT    ! RET    ; value of send bit when ready        151H
  293.     DS    14        ;                    154H
  294. ;
  295. ;=============================================================================;
  296. ; MEX subroutine jump table                              ;
  297. ;=============================================================================;
  298. ;
  299. DIALV:    ds    3        ; Smartmodem dial a number        162H
  300. DISCV:    jmp    DISCON        ; disconnect from target system        165H
  301. GOODBV:    jmp    GOODBYE        ; MEX un-initialization subroutine    168H
  302. INMODV:    jmp    HELLO        ; MEX initialization subroutine        16BH
  303. NEWBDV:    jmp    BAUD        ; new baud rate subroutine        16EH
  304. NOPARV:    RET ! NOP ! NOP        ; no parity subroutine            171H
  305. PARITV:    RET ! NOP ! NOP        ; new parity subroutine            174H
  306. SETUPV:    jmp    SETCMD        ; Spider/Z SET command subroutine    177H
  307. SMENUV:    DS    3        ; not used by MEX            17AH
  308. VERSNV:    jmp    OVRVER        ; display overlay version subroutine    17DH
  309. BREAKV:    jmp    SBREAK        ; send a break tone subroutine        180H
  310. ILPRTV:    DS    3        ; inline print        (gone by MEX V2.0)    183H
  311. INBUFV:    DS    3        ; input buffer        (gone by MEX V2.0)    186H
  312. ILCMPV:    DS    3        ; line compare        (gone by MEX V2.0)    189H
  313. INMDMV:    DS    3        ; timed modem input (gone by MEX V2.0)    18CH
  314. NXTSNV:    DS    3        ; next screen        (gone by MEX V2.0)    18FH
  315. TIMERV:    DS    3        ; timer routine        (gone by MEX V2.0)    192H
  316. ;
  317. ;=============================================================================;
  318. ; CLREOS subroutine                                  ;
  319. ; This subroutine will clear the console screen from the current cursor          ;
  320. ; position, to the end of the console screen (insure that SCRTST (010AH)      ;
  321. ; is set to YES if you wish to use this subroutine).                  ;
  322. ;=============================================================================;
  323. ;
  324. CLREOS:    lxi    D,CLRE        ; clear to end-of-screen        195H
  325.     mvi    C,PRINT        ;
  326.     call    MEX        ;
  327.     ret            ;
  328. ;
  329. ;=============================================================================;
  330. ; CLRSCN subroutine                                  ;
  331. ; This subroutine will clear the console screen (insure that SCRTST (010AH)   ;
  332. ; is set to YES if you wish to use this subroutine).                  ;
  333. ;=============================================================================;
  334. ;
  335. CLRSCN:    lxi    D,CLRS        ; clear screen                19EH
  336.     mvi    C,PRINT        ;
  337.     call    MEX        ;
  338.     ret            ;
  339. ;
  340. ;=============================================================================;
  341. ; BOLD subroutine                                  ;
  342. ; This subroutine will turn on the bold attribute (insure that SCRTST (010AH) ;
  343. ; is set to YES if you wish to use this subroutine).                  ;
  344. ;=============================================================================;
  345. ;
  346. BOLD:    lda    SCRTST        ; termcap?
  347.     cpi    YES        ;
  348.     rnz            ; nope
  349.     lxi    D,BLD        ; yep, turn bold on
  350.     mvi    C,PRINT        ;
  351.     call    MEX        ;
  352.     ret            ;
  353. ;
  354. ;=============================================================================;
  355. ; UNBOLD subroutine                                  ;
  356. ; This subroutine will turn off the bold attribute (insure that SCRTST (010AH);
  357. ; is set to YES if you wish to use this subroutine).                  ;
  358. ;=============================================================================;
  359. ;
  360. UNBOLD:    lda    SCRTST        ; termcap?
  361.     cpi    YES        ;
  362.     rnz            ; nope
  363.     lxi    D,UNBLD        ; yep, turn bold off
  364.     mvi    C,PRINT        ;
  365.     call    MEX        ;
  366.     ret            ;
  367. ;
  368. ;=============================================================================;
  369. ; Escape sequences for MD-11s                              ;
  370. ;=============================================================================;
  371. ;
  372. CLRE:    db    ESC,'Y','$'    ; clear to end-of-screen
  373. CLRS:    db    ESC,'*','$'    ; clear screen 
  374. BLD:    db    '$'        ; turn on character bold attribute
  375. UNBLD:    db    '$'        ; turn off character bold attribute
  376. ;
  377. ;=============================================================================;
  378. ; OVRVER subroutine                                  ;
  379. ; This subroutine will print the overlay id and version on the console.          ;
  380. ;=============================================================================;
  381. ;
  382. OVRVER:    mvi    C,ILP        ; print overlay id and version number
  383.     call    MEX
  384.     db    'Morrow Micro Decision 11 Computer Port Overlay V'
  385.     db    OVERSION + '0','.',OREVISION + '0',CR,LF,0
  386.     call    CIPMSG        ; display "call in progress" if need be
  387.     rc            ;
  388.     mvi    C,ILP        ; aestetic newline
  389.     call    MEX        ;
  390.     db    CR,LF,0        ;
  391.     ret
  392. ;
  393. ;=============================================================================;
  394. ; GOODBYE subroutine                                  ;
  395. ; This subroutine is executed just prior to exiting from MEX to CP/M. All un- ;
  396. ; initialization procedures are done here.                      ;
  397. ;============================================================================;
  398. ;
  399. GOODBYE:call    CIPMSG        ; echo "call in progess" if need be
  400.     ret            ;
  401. ;
  402. ;=============================================================================;
  403. ; CIPMSG subroutine                                  ;
  404. ; This subroutine will display the "call in progress" message (Spider/Z users ;
  405. ; are forgetful) if BOTH a carriet is detected AND the current MEX modem port ;
  406. ; is not the current CP/M console.                          ;
  407. ;=============================================================================;
  408. ;
  409. CIPMSG:    call    CDTEST        ; gotta carrier?
  410.     rnc            ; nope, then don't display "call in progress"
  411.     call    BOLD        ; use bolding if possible
  412.     mvi    C,ILP        ; print a newline
  413.     call    MEX        ;
  414.     db    CR,LF,0        ;
  415.     call    IDMSG        ; blapp out ID prompt if need be
  416.     mvi    C,ILP        ; print "call in progess" message
  417.     call    MEX        ;
  418.     db    '[call in progress]',BELL,CR,LF,0
  419.     call    UNBOLD        ; undo bolding damage if need be
  420.     stc            ; show "call in progess" message printed
  421.     ret
  422. ;
  423. ;=============================================================================;
  424. ; SBREAK subroutine                                  ;
  425. ; This routine will mimic the function of the BREAK key by sending an          ;
  426. ; interrupt to the modem (transmit line held high) for a period of 300 ms.    ;
  427. ;=============================================================================;
  428. ;
  429. SBREAK: push    H        ; save registers
  430.     push    D        ;
  431.     push    B        ;
  432.     push    PSW        ;
  433.     mvi    A,0FAH        ; force break for 300 ms
  434.     mvi    B,3        ; set duration for 300 ms
  435.     call    TOUTCP        ; do it!
  436.     pop    PSW        ; restore registers
  437.     pop    B        ;
  438.     pop    D        ;
  439.     pop    H        ;
  440.     ret            ;
  441. ;
  442. ;=============================================================================;
  443. ; DISCON subroutine                                  ;
  444. ; This subroutine will disconnect the modem from the target computer. This    ;
  445. ; is done by dropping the DTR line to the modem for a period of 1.5 seconds   ;
  446. ; in theory, 300 ms is more than sufficient (this is what a BREAK key does),  ;
  447. ; but when the Smartmodem is dialing, a 300 ms pulse is not long enough to be ;
  448. ; recognized.                                      ;
  449. ;=============================================================================;
  450. ;
  451. DISCON:    push    H        ; save registers
  452.     push    D        ;
  453.     push    B        ;
  454.     push    PSW        ;
  455.     mvi    A,06AH        ; turn off DTR, no break sent
  456.     mvi    B,15        ; set duration for 1.5 seconds
  457.     call    TOUTCP        ; do it!
  458.     pop    PSW        ; restore registers
  459.     pop    B        ;
  460.     pop    D        ;
  461.     pop    H        ;
  462.     ret            ;
  463. ;
  464. ;=============================================================================;
  465. ; TOUTCP subroutine                                  ;
  466. ; This is a timed output to command port (OUTCP) subroutine. The value in the ;
  467. ; A register is output to the command port, then a time delay equal to the    ;
  468. ; value of the B register (in 100 ms units) is done.                  ;
  469. ;=============================================================================;
  470. ;
  471. TOUTCP:    push    PSW        ; save UAR/T command
  472.     mvi    A,5        ; write to control register 5
  473.     call    OUTCP        ;
  474.     pop    PSW        ; restore UAR/T command
  475.     call    OUTCP        ; send passed byte to CPORT
  476.     mvi    C,TIMER        ; wait alotted time
  477.     call    MEX        ;
  478.     mvi    A,5        ; write to control register 5
  479.     call    OUTCP        ;
  480.     mvi    A,0EAH        ; turn DTR back on, no break
  481.     call    OUTCP        ;
  482.     ret            ;
  483. ;
  484. ;=============================================================================;
  485. ; HELLO subroutine                                  ;
  486. ; This subroutine is used to initialize the modem and the modem port. This    ;
  487. ; is done via using some of the system reserved bytes in the CP/M system      ;
  488. ; parameter page (0000H - 00FFH). There is a 16 byte system scratch area      ;
  489. ; (0040H - 004FH) that is never referenced by CP/M. For the Spizer/Z, the     ;
  490. ; addresses 0040H - 0042H are reserved for the Jade Double-D Floppy Disk      ;
  491. ; Controller. All others are scratch. MEX uses 004FH as the byte reserved     ;
  492. ; for stating the current baud rate for the modem port, while 004EH is           ;
  493. ; reserved for the current Smartmodem speaker volume. These locations can     ;
  494. ; can be checked whenever re-entering MEX. Protocol used:              ;
  495. ;                                          ;
  496. ;    if a call is in progress (determined by the testing for a          ;
  497. ;    carrier detect (CDTEST)), MEX then uses the values stored in          ;
  498. ;    then MEX system reserved bytes for modem baud rate (the value          ;
  499. ;    is stored in MEX compatible format), and the Smartmodem speaker          ;
  500. ;    volume.                                      ;
  501. ;                                          ;
  502. ;    otherwise set the modem baud rate and Smartmodem speaker volume          ;
  503. ;    to the preset values (values set in this overlay or current values    ;
  504. ;       when CLONEing MEX).                              ;
  505. ;                                          ;
  506. ;=============================================================================;
  507. ;
  508. HELLO:    call    CDTEST        ; check for call in progress
  509.     jnc    COLDMEX        ; nope, initialize the modem and port
  510.  
  511. GETBAUD:lxi    H,MEXBAUD    ; valid MEX baud byte?
  512.     mov    A,H        ;
  513.     ora    L        ;
  514.     jz    GETSPKR        ; nope
  515.     lda    MEXBAUD        ; yep, get the system byte for MEX baud rate
  516.     sta    MSPEED        ; save it
  517.  
  518. GETSPKR:lxi    H,MEXSPKR    ; valid MEX speaker byte?
  519.     mov    A,H        ;
  520.     ora    L        ;
  521.     rz            ; nope
  522.     lda    MEXSPKR        ; yep, get the system byte for MEX speaker volume
  523.     sta    VOLUME        ; save it
  524.  
  525.     ret            ;
  526. ;
  527. ; cold starting MEX. load the baud rate and speaker volume with those values
  528. ; specified by this overlay.
  529. ;
  530. COLDMEX:lda    MSPEED        ; get the initial baud rate
  531.     call    BAUD        ; set it up
  532.     lda    VOLUME        ; get the initial speaker volume
  533.     call    SPEAKER        ; set it up
  534.     ret
  535. ;
  536. ;=============================================================================;
  537. ; IDMSG subroutine                                  ;
  538. ; this subroutine will check whether or not the ID prompt should be displayed ;
  539. ; prior to an error message. If so, the prompt will be displayed.          ;
  540. ;=============================================================================;
  541. ;
  542. IDMSG:    push    H        ; save registers
  543.     push    D        ;
  544.     push    B        ;
  545.     push    PSW        ;
  546.     lda    ERRID        ; ID printed in "call in progress" message?
  547.     cpi    NO        ;
  548.     jz    IDRET        ; nope, then don't!
  549.     mvi    C,PRID        ; yep, then print it!
  550.     call    MEX        ;
  551. IDRET:    pop    PSW        ; restore registers
  552.     pop    B        ;
  553.     pop    D        ;
  554.     pop    H        ;
  555.     ret            ;
  556. ;
  557. ;=============================================================================;
  558. ; CDTEST subroutine                                  ;
  559. ; This routine will test for a carrier detected on the designated modem          ;
  560. ; status line (eithe DCD or DSR, depending on the overlay equates). If a      ;
  561. ; carrier is detect then thus subroutine returns with the CARRY set.          ;
  562. ;=============================================================================;
  563. ;
  564. CDTEST:    mvi    A,0        ; read status register 0
  565.     call    OUTCP        ;
  566.     call    INPSP        ; look at the modem port status register
  567.     ani    DCDLIN        ; is there a carrier?
  568.     rz            ; nope, then return
  569.     stc            ; yep, set the CARRY and return
  570.     ret            ;
  571. ;
  572. ;=============================================================================;
  573. ; SET COMMAND:                                      ;
  574. ;                                          ;
  575. ; This command will allow the user to set a number of hardware dependent      ;
  576. ; functions. At the moment the allowable parameters are:              ;
  577. ;                                          ;
  578. ;    BAUD RATE:    This will allow the baud rate of the current user     ;
  579. ;            port to be changed on the fly. Valid baud rates       ;
  580. ;            are 300, 600, 1200, 19200.                       ;
  581. ;                                          ;
  582. ;    SPEAKER VOLUME:    This will allow the user to change the volume of      ;
  583. ;            the speaker of the Hayes Smartmodem. Valid volumes    ;
  584. ;            are OFF = speaker is always off, HALF = speaker          ;
  585. ;            is on until carrier is detected, FULL = speaker          ;
  586. ;            is always on.                          ;
  587. ;                                          ;
  588. ;    usage:                                      ;
  589. ;                                          ;
  590. ;            SET BAUD 9600                          ;
  591. ;            SET SPEAKER OFF                          ;
  592. ;                                          ;
  593. ;=============================================================================;
  594. ;
  595. SETCMD:    call    GETARG        ; any arguments?
  596.     jc    SHWALL        ; if not, go display set parmeters
  597.     LXI    D,CMDTBL
  598.     MVI    C,LOOKUP
  599.     CALL    MEX        ;parse argument
  600.     PUSH    H        ;save any parsed argument adrs on stack
  601.     RNC            ;if we have one, return to it
  602.     POP    H        ;oops, input not found in table
  603.     jmp    SETERR        ;
  604. ;
  605. ; Argument table (note last character of set parameter MUST have the MSB
  606. ; turned on. MEX uses this as a flag for the end-of-parameter).
  607. ;
  608. CMDTBL:    DB    '?'+80H            ; help
  609.     DW    SETHELP
  610.     DB    'BAU','D'+80H        ; "set baud"
  611.     DW    SETBAUD
  612.     DB    'SPEAKE','R'+80H    ; "set speaker"
  613.     DW    SETSPKR
  614.     DB    0            ;<<=== table terminator
  615. ;
  616. ;=============================================================================;
  617. ; "SET" command (equates to a "SHOW ALL" command)                  ;
  618. ;=============================================================================;
  619. ;
  620. SHWALL:    call    NEWLINE        ; start off with a newline character
  621.     call    BOLD        ; bold the console output
  622.     call    SHWBAUD        ; show the current baud rate
  623.     call    SHWSPKR        ; show the current speaker volume
  624.     call    UNBOLD        ; unbold the console output
  625.     call    NEWLINE        ; terminate with a newline character
  626.     ret            ;
  627. ;
  628. ;=============================================================================;
  629. ; "SET ?" command (output HELP message to console)                  ;
  630. ;=============================================================================;
  631. ;
  632. SETHELP:lda    SCRTST        ; cursor control ability?
  633.     cpi    NO        ;
  634.     cnz    CLRSCN        ; yep, then clear the screen
  635.     mvi    C,ILP        ; print out help message to console
  636.     call    MEX        ;
  637.     db    CR,LF
  638.     db    'SET BAUD ',0
  639.     call    BOLD
  640.     mvi    C,ILP
  641.     call    MEX
  642.     db    '<baud-rate>',CR,LF,0
  643.     call    UNBOLD
  644.     lda    SMODEM        ; got a Smartmodem?
  645.     cpi    NO        ;
  646.     jz    NOSM01        ; nope, then don't show "SET SPEAKER"
  647.     call    UNBOLD
  648.     mvi    C,ILP
  649.     call    MEX
  650.     db    'SET SPEAKER ',0
  651.     call    BOLD
  652.     mvi    C,ILP
  653.     call    MEX
  654.     db    '<volume>',CR,LF,0
  655. NOSM01:    mvi    C,ILP
  656.     call    MEX
  657.     db    CR,LF
  658.     db    'Baud rate is one of:',CR,LF,0
  659.     call    UNBOLD
  660.     mvi    C,ILP
  661.     call    MEX
  662.     db    '300 600 1200 19200',CR,LF
  663.     db    CR,LF,0
  664.     lda    SMODEM        ; got a Smartmodem?
  665.     cpi    NO        ;
  666.     jz    NOSM02        ; nope, then don't show volume value
  667.     call    BOLD
  668.     mvi    C,ILP
  669.     call    MEX
  670.     db    'Volume is one of:',CR,LF,0
  671.     call    UNBOLD
  672.     mvi    C,ILP
  673.     call    MEX
  674.     db    'OFF     : Smartmodem speaker is always off',CR,LF
  675.     db    'HALF    : Smartmodem speaker is on until carrier detect',CR,LF
  676.     db    'FULL    : Smartmodem speaker is always on',CR,LF
  677.     db    CR,LF,0
  678. NOSM02:    ret            ;
  679. ;
  680. ;=============================================================================;
  681. ; "SET BAUD" command                                  ;
  682. ;=============================================================================;
  683. ;
  684. SETBAUD:MVI    C,PARSBD    ;nope, function code: parse a baudrate
  685.     CALL    MEX        ;let MEX look up code
  686.     JC    BAUDERR        ;jump if invalid code
  687.     CALL    BAUD        ;no, try to set it
  688.     JC    BAUDERR        ;if not one of ours, bomb out
  689.     call    NEWLINE        ;show the current baud rate
  690.     call    SHWBAUD        ;
  691.     ret            ;
  692. ;
  693. ;=============================================================================;
  694. ; "SHOW BAUD" command                                  ;
  695. ;=============================================================================;
  696. ;
  697. SHWBAUD:mvi    C,ILP        ; nope, then display current baud rate
  698.     call    MEX        ;
  699.     db    'Modem baud rate is set to ',0
  700.     lda    MSPEED        ; get current baud rate
  701.     mvi    C,PRBAUD    ; let MEX print it
  702.     call    MEX
  703.     call    NEWLINE        ; terminate with newline character
  704.     ret
  705. ;
  706. ;=============================================================================;
  707. ; BAUD subroutine                                  ;
  708. ; This subroutine will set the baud of the current modem port. The new baud   ;
  709. ; rate is passed in the A register, and is also stored in the MEX parameter   ;
  710. ; page (MSPEED), and the MEX system reserved byte (MEXBAUD). If the new baud  ;
  711. ; rate specified is either illegal or not supported, this subroutine returns  ;
  712. ; with the CARRY set.                                  ;
  713. ;=============================================================================;
  714. ;
  715. BAUD:    PUSH    H        ;don't alter anybody
  716.     PUSH    D
  717.     PUSH    B
  718.  
  719.     MOV    E,A        ;MSPEED code to DE
  720.     MVI    D,0
  721.  
  722.     LXI    H,BAUDTBL    ; nope, then fine offset into table
  723.     DAD    D
  724.     MOV    A,M        ;fetch code
  725.     ORA    A        ;0? (means unsupported code)
  726.     jz    BADBAUD        ;yep, show it!
  727.     PUSH    PSW        ;no, set the rate
  728.     mvi    A,0        ; setup control register 0
  729.     call    OUTCP        ;
  730.     mvi    A,0        ;
  731.     call    OUTCP        ;
  732.     mvi    A,1        ; setup control register 1
  733.     call    OUTCP        ;
  734.     mvi    A,0        ;
  735.     call    OUTCP        ;
  736.     mvi    A,2        ; setup control register 2
  737.     call    OUTCP        ;
  738.     mvi    A,0        ;
  739.     call    OUTCP        ;
  740.     mvi    A,3        ; setup control register 3
  741.     call    OUTCP        ;
  742.     mvi    A,0C1H        ; Rx 8 bits, Rx enable
  743.     call    OUTCP        ;
  744.     mvi    A,4        ; setup control register 4
  745.     call    OUTCP        ;
  746.     pop    PSW        ; clock for baud rate, 1 stop bit, no parity
  747.     call    OUTCP        ;
  748.     mvi    A,5        ; setup control register 5
  749.     call    OUTCP        ;
  750.     mvi    A,0EAH        ; DTR on, Tx 8 bits, no break, Tx enable, RTS on
  751.     call    OUTCP        ;
  752.     mvi    A,6        ; setup control register 6
  753.     call    OUTCP        ;
  754.     mvi    A,0        ;
  755.     call    OUTCP        ;
  756.     mvi    A,7        ; setup control register 7
  757.     call    OUTCP        ;
  758.     mvi    A,0        ;
  759.     call    OUTCP        ;
  760.     MOV    A,E        ; get MEX format baud rate
  761.     STA    MSPEED        ; store in MEX
  762.     lxi    H,MEXBAUD    ; valid MEX baud byte in system page?
  763.     mov    A,H        ;
  764.     ora    L        ;
  765.     mov    A,E        ;
  766.     jz    NOMEXB        ; nope
  767.     STA    MEXBAUD        ; store it in the system byte for MEX baud rate
  768. NOMEXB:    ORA    A        ; return no-errors
  769.     jmp    BDEXIT        ;
  770.  
  771. BADBAUD:stc            ; set CARRY to show bad baud rate specified
  772.  
  773. BDEXIT:    POP    B
  774.     POP    D
  775.     POP    H
  776.     RET
  777. ;
  778. ; this is the baud rate converstion table. The MEX format baud rate value is
  779. ; used as an offset into this table. The grabbed value is the Interfacer 4
  780. ; mode register format containing the new baud rate.
  781. ;
  782. BAUDTBL:DB    0        ;110 (not supported)
  783.     DB    BD300        ;300
  784.     DB    0        ;450 (not supported)
  785.     DB    BD600        ;600
  786.     DB    0        ;710 (not supported)
  787.     DB    BD1200        ;1200
  788.     DB    0        ;2400 (not supported)
  789.     DB    0        ;4800 (not supported)
  790.     DB    0        ;9600 (not supported)
  791.     DB    BD19200        ;19200
  792. ;
  793. ;=============================================================================;
  794. ; "SET SPEAKER" command                                  ;
  795. ;=============================================================================;
  796. ;
  797. SETSPKR:lda    SMODEM        ; got a Smartmodem?
  798.     cpi    NO        ;
  799.     jz    SETERR        ; nope, then show a SET error
  800.  
  801.     mvi    C,SBLANK    ; yep, then scan for volume argument
  802.     call    MEX
  803.     jc    SPKRERR        ; if no argument, let user know
  804.     lxi    D,SPKTBL    ; parse the argument
  805.     mvi    C,LOOKUP
  806.     call    MEX        ; parse argument
  807.     jc    SPKRERR        ; bad volume argument
  808.  
  809.     mov    A,L        ; store the new speaker volume
  810.     call    SPEAKER        ; set the Smartmodem speaker volume
  811.     call    NEWLINE        ; show the new speaker volume
  812.     call    SHWSPKR        ;
  813.     ret            ;
  814. ;
  815. ; speaker table for MEX table search
  816. ;
  817. SPKTBL:    db    'OF','F'+80H    ; turn speaker off keyword
  818.     db    OFF,OFF        ; Smartmodem ATM code for it
  819.     db    'HAL','F'+80H    ; turn speaker off after carrier detect keyword
  820.     db    HALF,HALF    ; Smartmodem ATM code for it
  821.     db    'FUL','L'+80H    ; turn speaker on keyword
  822.     db    FULL,FULL    ; Smartmodem ATM code for it
  823.     db    0        ; argument table terminator
  824. ;
  825. ;=============================================================================;
  826. ; "SHOW SPEAKER" command                              ;
  827. ;=============================================================================;
  828. ;
  829. SHWSPKR:lda    SMODEM        ; got a Smartmodem?
  830.     cpi    NO        ;
  831.     rz            ; nope, then don't show speaker volume
  832.  
  833.     mvi    C,ILP        ; yep, then show the speaker volume
  834.     call    MEX        ;
  835.     db    'Smartmodem speaker ',0
  836.     mvi    C,ILP        ;
  837.     lda    VOLUME        ;
  838.     cpi    OFF        ; speaker always off
  839.     jz    SPKOFF        ;
  840.     cpi    HALF        ; speaker on until carrier detect
  841.     jz    SPKHALF        ;
  842.     cpi    FULL        ; speaker always on
  843.     jz    SPKFULL        ;
  844. SPKUNKN:call    MEX        ; speaker volume status unknown
  845.     db    'volume status not known',CR,LF,0
  846.     ret            ;
  847. SPKOFF:    call    MEX        ; speaker is turned off
  848.     db    'is always turned off',CR,LF,0
  849.     ret            ;
  850. SPKHALF:call    MEX        ; speaker is set to half
  851.     db    'is turned on until carrier detected',CR,LF,0
  852.     ret            ;
  853. SPKFULL:call    MEX        ; speaker is set to full
  854.     db    'is always turned on',CR,LF,0
  855.     ret            ;
  856. ;
  857. ;=============================================================================;
  858. ; SPEAKER subroutine                                  ;
  859. ; This subroutine will set the Smartmodem speaker to the requested volume.    ;
  860. ; The new volume value is passed in the A register, and is also stored in the ;
  861. ; MEX parameter page (VOLUME), and the MEX system reserved byte (MEXSPKR).    ;
  862. ;=============================================================================;
  863. ;
  864. SPEAKER:push    H        ; save registers
  865.     push    D        ;
  866.     push    B        ;
  867.     mov    E,A        ; save the new speaker volume
  868.     
  869.     lda    SMODEM        ; got a Smartmodem?
  870.     cpi    NO        ;
  871.     jz    SPKRET        ; nope, then don't change the speaker volume
  872.  
  873.     mov    A,E        ; restore the new speaker volume
  874.     sta    VOLUME        ; store the current volume for MEX
  875.     lxi    H,MEXSPKR    ; valid MEX speaker byte in system page?
  876.     mov    A,H        ;
  877.     ora    L        ;
  878.     mov    A,E        ;
  879.     jz    NOMEXS        ; nope
  880.     sta    MEXSPKR        ; store the current volume in reserved byte
  881.  
  882. NOMEXS:    call    SNDESC        ; send the Smartmodem escape seq. if need be
  883.     call    SNDATM        ; send the Smartmodem speaker volume code
  884.     call    SNDATO        ; send the Smartmodem on-line code if need be
  885.  
  886. SPKRET:    pop    B        ; restore registers
  887.     pop    D        ;
  888.     pop    H        ;
  889.     ret
  890. ;
  891. ;=============================================================================;
  892. ; xxxERR subroutines                                  ;
  893. ; These routines blapp out error messages on the console if the user somehow  ;
  894. ; screwed up the SET command line (bad syntax, or bad keyword values).        ;
  895. ;=============================================================================;
  896. ;
  897. SETERR:    call    IDMSG        ;print ID prompt if need be
  898.     MVI    C,ILP        ;inline print
  899.     CALL    MEX        ;
  900.     DB    '++ bad SET parameter specified ++',BELL,CR,LF,0
  901.     RET
  902. ;
  903. BAUDERR:call    IDMSG        ;print ID prompt if need be
  904.     MVI    C,ILP        ;inline print
  905.     CALL    MEX        ;
  906.     DB    '++ bad baud rate specifed ++',BELL,CR,LF,0
  907.     RET
  908. ;
  909. SPKRERR:call    IDMSG        ;print ID prompt if need be
  910.     MVI    C,ILP        ;inline print
  911.     CALL    MEX        ;
  912.     DB    '++ bad speaker volume specifed ++',BELL,CR,LF,0
  913.     RET
  914. ;
  915. ;=============================================================================;
  916. ; SNDSEC subroutine                                  ;
  917. ; This subroutine will place the Smartmodem in command state. If a carrier    ;
  918. ; is detected, the Smartmodem escape sequence is sent, sandwiched between     ;
  919. ; two guard time delays. An initial null is sent just incase we are in the    ;
  920. ; "just CONNECTed" case (IE: Smartmodem has connected to target computer,     ;
  921. ; but Morrow hasn't sent anything yet). If there is no carrier, then this   ;
  922. ; routine merely returns.                              ;
  923. ;=============================================================================;
  924. ;
  925. SNDESC:    call    CDTEST        ; check for call in progress
  926.     rnc            ; nope, then return
  927.     lxi    H,SMNULL    ; yep, send a null (just CONNECTed case)
  928.     call    SNDLIN        ;
  929.     mvi    B,12        ; yep, goto command mode
  930.     mvi    C,TIMER        ; wait 1.2 seconds
  931.     call    MEX        ;
  932.     lxi    H,SMESCAP    ; send '+++'
  933.     call    SNDLIN        ;
  934.     mvi    B,12        ; wait 1.2 seconds
  935.     mvi    C,TIMER        ;
  936.     call    MEX        ;
  937.     call    EATCODE        ; eat result code
  938.     ret            ;
  939. ;
  940. ;=============================================================================;
  941. ; SNDCAN subroutine                                  ;
  942. ; This subroutine will send the CANCEL character to the target computer          ;
  943. ; system. The primary use of this subroutine is to cancel the Smartmodem      ;
  944. ; escape sequence sent to the target system to place the Smartmodem in          ;
  945. ; command state. At the target computer end, there is an un-terminated          ;
  946. ; command ("+++") that should not be executed.                      ;
  947. ;=============================================================================;
  948. ;
  949. SNDCAN:    lda    CANCHR        ; get the CANCEL character
  950.     sta    CANMSG        ; store in the CANCEL character message
  951.     lxi    H,CANMSG    ; get the CANCEL character message address
  952.     call    SNDLIN        ; send it
  953.     ret            ;
  954. ;
  955. ;=============================================================================;
  956. ; SNDATM subroutine                                  ;
  957. ; This routine will send the Smartmodem code to set the speaker volume          ;
  958. ;=============================================================================;
  959. ;
  960. SNDATM:    lxi    H,ATMCODE    ; send 'ATM'
  961.     call    SNDLIN        ;
  962.     lxi    H,VOLUME    ; send the volume code
  963.     call    SNDLIN        ;
  964.     call    EATCODE        ; eat result code
  965.     ret            ;
  966. ;
  967. ;=============================================================================;
  968. ; SNDATO subroutine                                  ;
  969. ; This subroutine will send the code to place the Smartmodem back to on-line  ;
  970. ; state ONLY if a carrier is detected. If no carrier is detected, then this   ;
  971. ; subroutine merely returns.                              ;
  972. ;=============================================================================;
  973. ;
  974. SNDATO:    call    CDTEST        ; check for call in progess
  975.     rnc            ; nope, then return
  976.     lxi    H,ATOCODE    ; yep, then send 'ATO' (goto on-line mode)
  977.     call    SNDLIN        ;
  978.     call    EATCODE        ; eat result code
  979.     call    SNDCAN        ; send the cancel character (cancel SNDESC)
  980.     ret            ;
  981. ;
  982. ;=============================================================================;
  983. ; EATCODE subroutine                                  ;
  984. ; This subroutine will eat all the characters recieved from the modem until   ;
  985. ; a 100 ms "quiet" period is detected (used to eat Smartmodem result codes).  ;
  986. ; The initial delay is for the Smartmodem result code turn-around time).      ;
  987. ;=============================================================================;
  988. ;
  989. EATCODE:mvi    B,2        ; wait 200 ms for Smartmodem turn-around
  990.     mvi    C,TIMER        ;
  991.     call    MEX        ;
  992. EATCHAR:mvi    C,INMDM        ; eat a character
  993.     call    MEX        ;
  994.     jnc    EATCHAR        ; if more, then eat another character
  995.     ret            ; otherwise return
  996. ;
  997. ;=============================================================================;
  998. ; GETARG subroutine                                  ;
  999. ; This subroutine will scan the input stream for an argument. If no argument  ;
  1000. ; present, then this subroutine returns with the CARRY set              ;
  1001. ;=============================================================================;
  1002. ;
  1003. GETARG:    mvi    C,SBLANK    ; scan input stream for <key-word>
  1004.     call    MEX        ;
  1005.     ret            ; and simply return
  1006. ;
  1007. ;=============================================================================;
  1008. ; EATARG subroutine                                  ;
  1009. ; This subroutine will eat (throw away) the remaining characters in the          ;
  1010. ; current argument. This is an aid for other routines which do not need to    ;
  1011. ; (and thus do not) check the entire argument for a unique match to be made   ;
  1012. ; (EG: "SET PORT C" and "SET PORT CONSOLE" will do the same thing, execept    ;
  1013. ; the SBLANK MEX function will see the next "argument" as being "ONSOLE"      ;
  1014. ; opposed to the line terminator).                          ;
  1015. ;=============================================================================;
  1016. ;
  1017. EATARG:    mvi    C,LKAHED    ; look ahead to next character in command line
  1018.     call    MEX        ;
  1019.     rc            ; return if done (burp)
  1020.     cpi    ' '        ; is it a blank?
  1021.     rz            ; yep, then we've finished eating the argument
  1022.     mvi    C,GNC        ; nope, eat the next character in command line
  1023.     call    MEX        ;
  1024.     jmp    EATARG        ; check the next character in command line
  1025. ;
  1026. ;=============================================================================;
  1027. ; NEWLINE subroutine                                  ;
  1028. ; This subroutine will send a newline character (CR-LF pair) to the console   ;
  1029. ;=============================================================================;
  1030. ;
  1031. NEWLINE:mvi    C,ILP        ; output a newline character to console
  1032.     call    MEX        ;
  1033.     db    CR,LF,0        ;
  1034.     ret            ;
  1035. ;
  1036. ;=============================================================================;
  1037. ; SNDLIN subroutine                                  ;
  1038. ; This routine will send a string to the modem port. Works similar to the     ;
  1039. ; BDOS 9 function. The string start address is in the HL register pair, and   ;
  1040. ; the end-of-string character is set to EOS.                      ;
  1041. ;=============================================================================;
  1042. ;
  1043. SNDLIN:    mvi    C,SNDRDY    ; is modem ready to read another character?
  1044.     call    MEX        ;
  1045.     jnz    SNDLIN        ; nope, wait for it
  1046.     mov    A,M        ; yep, get next character to send to modem
  1047.     cpi    EOS        ; end-of-string character?
  1048.     rz            ; yep, then return
  1049.     mov    B,A        ; nope, get the next character to send
  1050.     mvi    C,SNDCHR    ;
  1051.     call    MEX        ; send it!
  1052.     inx    H        ; bump up the string point
  1053.     jmp    SNDLIN        ; send the next character
  1054. ;
  1055. ;=============================================================================;
  1056. ; Smartmodem codes to do what we want it do (for "SNDATx" routines)          ;
  1057. ;=============================================================================;
  1058. ;
  1059. SMNULL:    db    NULL,EOS    ; null for justed CONNNECTed case
  1060. SMESCAP:db    '+++',EOS    ; Smartmodem code for goto command state
  1061. CANMSG:    db    '?',EOS        ; cancel character message string
  1062. ATMCODE:db    'ATM',EOS    ; Smartmodem code for speaker volume
  1063. VOLUME:    db    MD$SPKR,CR,EOS    ; initial speaker volume
  1064. ATOCODE:db    'ATO',CR,EOS    ; Smartmodem code for goto on-line state
  1065. ;
  1066. ;=============================================================================;
  1067. ; Modem input (get a character or status) driver                  ;
  1068. ;=============================================================================;
  1069. ;
  1070. INPSP:    MVI    A,SPORT        ; get modem status
  1071.     JMP    INP1
  1072. INPDP:    MVI    A,DPORT        ; get a character from the modem
  1073.     JMP    INP1        ;
  1074.  
  1075. INP1:    PUSH    B        ; save BC register pair
  1076.     MOV    C,A        ; save port offset
  1077.     mvi    A,BASE        ; get the base port
  1078.     ADD    C        ; add offset for desired port (data/status)
  1079.     STA    INP2+1        ; store for IN command
  1080. INP2:    IN    0        ; input data/status
  1081.     POP    B        ; restore BC register pair
  1082.     RET            ; and return
  1083. ;
  1084. ;=============================================================================;
  1085. ; Modem output (put a character or command) driver                  ;
  1086. ;=============================================================================;
  1087. ;
  1088. OUTDP:    push    B        ; save the BC register pair
  1089.     mvi    C,DPORT        ; put a character to the modem
  1090.     jmp    OUT1        ;
  1091. OUTCP:    push    B        ; save the BC register pair
  1092.     mvi    C,CPORT        ; change modem control register
  1093.     jmp    OUT1        ;
  1094.  
  1095. OUT1:    mov    B,A        ; save the output character
  1096.     mvi    A,BASE        ; get the base port address
  1097.     ADD    C        ; add offset for desired port (data/ctrl)
  1098.     sta    OUT2+1        ; store for OUT command
  1099.     mov    A,B        ; restore the output character
  1100. OUT2:    out    0        ; send it (or change mode/control port)
  1101.     pop    B        ; restore the BC register pair
  1102.     ret            ; return
  1103.  
  1104.     end
  1105.