home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / cpm / mex / mxo-ns11.aqm / MXO-NS11.ASM
Assembly Source File  |  1985-08-05  |  21KB  |  713 lines

  1. ;
  2. ;    Title    'MEX overlay for the North Star Horizon version 1.1'
  3. ;
  4. ;
  5. REV    EQU    11        ;overlay revision level
  6. ;
  7. ; MEX NORTH STAR OVERLAY VERSION 1.1
  8. ; MEX HSIO-4 OVERLAY VERSION 1.1
  9. ; MEX SEATTLE COMPUTER PRODUCTS MULTI-PORT SERIAL CARD VERSION 1.1
  10. ; Modified from MXO-PM10.ASM and MDM712NS.ASM by Ted H. Emigh
  11. ;    24 May 1984  (emigh@ecsvax.uucp)
  12. ;
  13. ; Last Revision: 23 July 1984, THE
  14. ;
  15. ; Version 1.1:  Fixed bug in routine which changes parity.  23 July 1984,
  16. ;    Ted H. Emigh (emigh@ecsvax.uucp)
  17. ;
  18. ;
  19. ; This is a MEX overlay file for the North Star Horizon with the standard
  20. ; serial ports (modem on the second serial port) OR the North Star HSIO-4
  21. ; serial board OR the Seattle Computer Products Multi-port Serial Card.
  22. ; **NOTE**  If you are using the Horizon second serial port, you MUST set
  23. ; the speed on the second serial port for 1200 bps, even if your modem is
  24. ; only 300 bps.
  25. ;
  26. ; Note that all overlays may freely use memory up to 0CFFH.  If your
  27. ; overlay must work with the MEX Smartmodem overlay (MXO-SMxx.ASM) or
  28. ; the MEX DATEC 212 overlay (MXO-DT10.ASM), the physical modem overlay
  29. ; should terminate by 0AFFH.
  30. ;
  31. ; The SET command allows the user to change the baud rates, and the
  32. ; parity.  The parity options are: No parity (NONE); Even parity (EVEN);
  33. ; Even parity with 8 data bits (EVEN8); Odd parity (ODD); and Odd parity
  34. ; with 8 data bits (ODD8).  EVEN8 and ODD8 are for special purposes and
  35. ; will most likely never be used.
  36. ;------------------------------------------------------------
  37. ;
  38. ; Misc equates
  39. ;
  40. YES    EQU    0FFH
  41. NO    EQU    0
  42. NA    EQU    0FFH        ;Value for baud rate not available
  43. TPA    EQU    100H        ;Beginning of TPA
  44. CR    EQU    13        ;carriage return
  45. LF    EQU    10        ;line feed
  46. TAB    EQU    9        ;tab
  47. BELL    EQU    07H        ;bell
  48. ESC    EQU    1BH        ;escape
  49. ;
  50. ; Change the following information to match your equipment
  51. ; Only one of the next three equates should be YES
  52. ;
  53. SECSER:    EQU    NO        ;YES if N* Horizon's Second Serial Port
  54. HSIO4:    EQU    NO        ;YES if HSIO-4 Serial Card
  55. SCP4:    EQU    YES        ;YES if SCP Multi-port Serial Card
  56. ;
  57. IF SECSER
  58. PORT:    EQU    4H        ;modem data port
  59. CDPORT:    EQU    6        ;carrier detect port
  60. MODCDB:    EQU    10H        ;CARRIER DETECT BIT
  61. MODCDA:    EQU    0        ;VALUE WHEN ACTIVE
  62. ENDIF
  63. ;
  64. IF HSIO4
  65. BASE:    EQU    10H        ;Base address (0, 10H, 20H, ...)
  66. CHANEL:    EQU    1        ;Channel number (A=0, B=1, C=2, D=3)
  67. PORT:    EQU    BASE+4*CHANEL+2    ;Data port
  68. BAUDRP:    EQU    BASE+4*CHANEL    ;Baud rate port
  69. ENDIF
  70. ;
  71. IF SCP4
  72. BASE:    EQU    10H        ;Base address (0, 10H, 20H, ...)
  73. CHANEL:    EQU    1        ;Channel number (0, 1, 2, 3)
  74. PORT:    EQU    BASE+2*CHANEL    ;Data port
  75. BAUDRP:    EQU    BASE+CHANEL+8    ;Baud rate port
  76. ENDIF
  77. ;
  78. MODCTL:        EQU    PORT+1    ;MODEM CONTROL PORT
  79. MODDAT:        EQU    PORT    ;MODEM DATA PORT
  80. MDRCVB:        EQU    2    ;BIT TO TEST FOR RECEIVE
  81. MDRCVR:        EQU    2    ;VALUE WHEN READY
  82. MDSNDB:        EQU    1    ;BIT TO TEST FOR SEND
  83. MDSNDR:        EQU    1    ;VALUE WHEN READY
  84. EVEN        EQU    78H    ;even parity, 7 data bits
  85. EVEN8        EQU    7CH    ;even parity, 8 data bits
  86. ODD        EQU    58H    ;odd parity, 7 data bits
  87. ODD8        EQU    5CH    ;odd parity, 8 data bits
  88. NONE        EQU    4CH    ;no parity, 8 data bits
  89. ;
  90. ; Baud rate values
  91. ;
  92. IF SECSER
  93. BD110:        EQU    NA        ;NO 110
  94. BD300:        EQU    3        ;300
  95. BD450:        EQU    NA        ;NO 450
  96. BD600:        EQU    NA        ;NO 600
  97. BD710:        EQU    NA        ;NO 710
  98. BD1200:        EQU    2        ;1200
  99. BD2400:        EQU    NA        ;NO 2400
  100. BD4800:        EQU    NA        ;NO 4800
  101. BD9600:        EQU    NA        ;NO 9600
  102. BD19K:        EQU    NA        ;NO 19200
  103. ENDIF
  104. ;
  105. IF HSIO4
  106. BD110:        EQU    7        ;110
  107. BD300:        EQU    6        ;300
  108. BD450:        EQU    NA        ;NO 450
  109. BD600:        EQU    5        ;600
  110. BD710:        EQU    NA        ;NO 710
  111. BD1200:        EQU    4        ;1200
  112. BD2400:        EQU    3        ;2400
  113. BD4800:        EQU    2        ;4800
  114. BD9600:        EQU    1        ;9600
  115. BD19K:        EQU    0        ;19200
  116. CLCK:        EQU    2        ;16X clock
  117. ENDIF
  118. ;
  119. IF SCP4
  120. BD110:        EQU    2H        ;110
  121. BD300:        EQU    5H        ;300
  122. BD450:        EQU    NA        ;NO 450
  123. BD600:        EQU    6H        ;600
  124. BD710:        EQU    NA        ;NO 710
  125. BD1200:        EQU    7H        ;1200
  126. BD2400:        EQU    0AH        ;2400
  127. BD4800:        EQU    0CH        ;4800
  128. BD9600:        EQU    0EH        ;9600
  129. BD19K:        EQU    0FH        ;19200
  130. CLCK:        EQU    2        ;16X clock
  131. ENDIF
  132. ;
  133. ; Initial baud rate
  134. ;
  135. INITBD:        EQU    5        ;Initial baud rate (1200)
  136. ;
  137. ; Control bytes
  138. ;
  139. RESET1        EQU    0B7H        ;Initialize UART
  140. RESET2        EQU    77H        ;Internal reset
  141. CHIPSET        EQU    27H        ;DTR, RTS, RE, TE
  142. DISCNT        EQU    07H        ;no DTR, RTS, RE, TE
  143. ;
  144. BREAK        EQU    CHIPSET OR 8H    ;BREAK character
  145. ;
  146. ;
  147. ; MEX service processor stuff ... MEX supports an overlay service
  148. ; processor, located at 0D00H (and maintained at this address from
  149. ; version to version).  If your overlay needs to call BDOS for any
  150. ; reason, it should call MEX instead; function calls below about
  151. ; 240 are simply passed on to the BDOS (console and list I/O calls
  152. ; are specially handled to allow modem port queueing, which is why
  153. ; you should call MEX instead of BDOS).  MEX uses function calls
  154. ; above about 244 for special overlay services (described below).
  155. ;
  156. ; Some sophisticated overlays may need to do file I/O; if so, use
  157. ; the PARSFN MEX call with a pointer to the FCB in DE to parse out
  158. ; the name.  This FCB should support a spare byte immediately pre-
  159. ; ceeding the actual FCB (to contain user # information).  If you've
  160. ; used MEX-10 for input instead of BDOS-10 (or you're parsing part
  161. ; of a SET command line that's already been input), then MEX will
  162. ; take care of DU specs, and set up the FCB accordingly.  There-
  163. ; after all file I/O calls done through the MEX service processor
  164. ; will handle drive and user with no further effort necessary on
  165. ; the part of the programmer.
  166. ;
  167. MEX    EQU    0D00H        ;address of the service processor
  168. INMDM    EQU    255        ;get char from port to A, CY=no more in 100 ms
  169. TIMER    EQU    254        ;delay 100ms * reg B
  170. TMDINP    EQU    253        ;B=# secs to wait for char, cy=no char
  171. CHEKCC    EQU    252        ;check for ^C from KBD, Z=present
  172. SNDRDY    EQU    251        ;test for modem-send ready
  173. RCVRDY    EQU    250        ;test for modem-receive ready
  174. SNDCHR    EQU    249        ;send a character to the modem (after sndrdy)
  175. RCVCHR    EQU    248        ;recv a char from modem (after rcvrdy)
  176. LOOKUP    EQU    247        ;table search: see CMDTBL comments for info
  177. PARSFN    EQU    246        ;parse filename from input stream
  178. BDPARS    EQU    245        ;parse baud-rate from input stream
  179. SBLANK    EQU    244        ;scan input stream to next non-blank
  180. EVALA    EQU    243        ;evaluate numeric from input stream
  181. LKAHED    EQU    242        ;get nxt char w/o removing from input
  182. GNC    EQU    241        ;get char from input, cy=1 if none
  183. ILP    EQU    240        ;inline print
  184. DECOUT    EQU    239        ;decimal output
  185. PRBAUD    EQU    238        ;print baud rate
  186. ;
  187. ;
  188. CONOUT    EQU    2        ;simulated BDOS function 2: console char out
  189. PRINT    EQU    9        ;simulated BDOS function 9: print string
  190. INBUF    EQU    10        ;input buffer, same structure as BDOS 10
  191. ;
  192.     ORG    TPA        ;we begin
  193. ;
  194. ;
  195.     DS    3        ;MEX has a JMP START here
  196. ;
  197. ; The following variables are located at the beginning of the program
  198. ; to facilitate modification without the need of re-assembly. They will
  199. ; be moved in MEX 2.0.
  200. ;
  201. PMODEM:    DB    NO        ;yes=PMMI modem \ / These 2 locations are not
  202. SMODEM:    DB    NO        ;yes=Smartmodem / \ referenced by MEX
  203. TPULSE:    DB    'T'        ;T=touch, P=pulse (not referenced by MEX)
  204. CLOCK:    DB    40        ;clock speed x .1, up to 25.5 mhz.
  205. MSPEED:    DB    INITBD        ;sets initial baud rate
  206.                 ;0=110    1=300  2=450  3=600  4=710
  207.                 ;5=1200 6=2400 7=4800 8=9600 9=19200
  208. BYTDLY:    DB    5        ;default time to send character in
  209.                 ;terminal mode file transfer (0-9)
  210.                 ;0=0 delay, 1=10 ms, 5=50 ms, 9=90 ms
  211. CRDLY:    DB    5        ;end-of-line delay after CRLF in terminal
  212.                 ;mode file transfer for slow BBS systems
  213.                 ;0=0 delay, 1=100 ms, 5=500 ms, 9=900 ms
  214. COLUMS:    DB    5        ;number of directory columns
  215. SETFL:    DB    YES        ;yes=user-defined SET command
  216. SCRTST:    DB    YES        ;yes=if home cursor and clear screen
  217.                 ;routine at CLRSCRN
  218.     DB    0        ;was once ACKNAK, now spare
  219. BAKFLG:    DB    NO        ;yes=make .BAK file
  220. CRCDFL:    DB    NO        ;yes=default to CRC checking
  221.                 ;no=default to Checksum checking
  222. TOGCRC:    DB    YES        ;yes=allow toggling of Checksum to CRC
  223. CVTBS:    DB    NO        ;yes=convert backspace to rub
  224. TOGLBK:    DB    YES        ;yes=allow toggling of bksp to rub
  225. ADDLF:    DB    NO        ;no=no LF after CR to send file in
  226.                 ;terminal mode (added by remote echo)
  227. TOGLF:    DB    YES        ;yes=allow toggling of LF after CR
  228. TRNLOG:    DB    NO        ;yes=allow transmission of logon
  229.                 ;write logon sequence at location LOGON
  230. SAVCCP:    DB    YES        ;yes=do not overwrite CCP
  231. LOCNXT:    DB    NO        ;yes=local cmd if EXTCHR precedes
  232.                 ;no=not local cmd if EXTCHR precedes
  233. TOGLOC:    DB    YES        ;yes=allow toggling of LOCNXTCHR
  234. LSTTST:    DB    YES        ;yes=allow toggling of printer on/off
  235.                 ;in terminal mode. Set to no if using
  236.                 ;the printer port for the modem
  237. XOFTST:    DB    NO        ;yes=allow testing of XOFF from remote
  238.                 ;while sending a file in terminal mode
  239. XONWT:    DB    NO        ;yes=wait for XON after sending CR while
  240.                 ;transmitting a file in terminal mode    
  241. TOGXOF:    DB    YES        ;yes=allow toggling of XOFF testing
  242. IGNCTL:    DB    NO        ;yes=do not send control characters
  243.                 ;above CTL-M to CRT in terminal mode
  244.                 ;no=send any incoming CTL-char to CRT
  245. EXTRA1:    DB    0        ;for future expansion
  246. EXTRA2:    DB    0        ;for future expansion
  247. BRKCHR:    DB    '@'-40H        ;^@ = Send a 300 ms. break tone
  248. NOCONN:    DB    'N'-40H        ;^N = Disconnect from phone line
  249. LOGCHR:    DB    'L'-40H        ;^L = Send logon
  250. LSTCHR:    DB    'P'-40H        ;^P = Toggle printer
  251. UNSVCH:    DB    'R'-40H        ;^R = Close input text buffer
  252. TRNCHR:    DB    'T'-40H        ;^T = Transmit file to remote
  253. SAVCHR:    DB    'Y'-40H        ;^Y = Open input text buffer
  254. EXTCHR:    DB    '^'-40H        ;^^ = Send next character
  255. ;
  256. ; Equates used only by PMMI routines grouped together here.
  257. ;
  258.     DS    2        ;not used
  259. ;
  260. ; Low-level modem I/O routines: this will be replaced with
  261. ; a jump table in MEX 2.0 (you can insert jumps here to longer
  262. ; routines if you'd like ... I'd recommend NOT putting part of
  263. ; a routine in this area, then jumping to the rest of the routine
  264. ; in the non-fixed area; that will complicate the 2.0 conversion)
  265. ;
  266. INCTL:    IN    MODCTL        ;in modem control port
  267.     RET
  268.     DB    0,0,0,0,0,0,0    ;spares if needed
  269. ;
  270. OTDATA:    OUT    MODDAT        ;out modem data port
  271.     RET
  272.     DB    0,0,0,0,0,0,0    ;spares if needed
  273. ;
  274. INPORT:    IN    MODDAT        ;in modem data port
  275.     RET
  276.     DB    0,0,0,0,0,0,0    ;spares if needed
  277. ;
  278. ; Bit-test routines.  These will be merged with the above
  279. ; routines in MEX 2.0 to provide a more reasonable format
  280. ;
  281. MASKR:    ANI MDRCVB ! RET    ;bit to test for receive ready
  282. TESTR:    CPI MDRCVR ! RET    ;value of receive bit when ready
  283. MASKS:    ANI MDSNDB ! RET    ;bit to test for send ready
  284. TESTS:    CPI MDSNDR ! RET    ;value of send bit when ready
  285. ;
  286. ;
  287. ; Unused area: was once used for special PMMI functions,
  288. ; Now used only to retain compatibility with MDM overlays.
  289. ; You may use this area for any miscellaneous storage you'd
  290. ; like but the length of the area *must* be 12 bytes.
  291. ;
  292.     DS    12
  293. ;
  294. ; Special modem function jump table: if your overlay cannot handle
  295. ; some of these, change the jump to "DS 3", so the code present in
  296. ; MEX will be retained.
  297. ;
  298. LOGON:    DS    2        ;needed for MDM compat, not ref'd by MEX
  299. DIALV:    DS    3        ;dial digit in A (see info at PDIAL)
  300. DISCV:    JMP    MDISC        ;disconnect the modem
  301. GOODBV:    JMP    DUMMY        ;called before exit to CP/M
  302. INMODV:    JMP    NITMOD        ;initialization. Called at cold-start
  303. NEWBDV:    JMP    SBAUD        ;set baud rate
  304. NOPARV:    DS    3        ;set for no parity (called after transfer)
  305. PARITV:    DS    3        ;set modem parity (called before transfer)
  306. SETUPV:    JMP    SETCMD        ;SET command
  307. SPMENV:    DS    3        ;not used with MEX
  308. VERSNV:    JMP    SYSVER        ;Overlay's voice in the sign-on message
  309. BREAKV:    JMP    SBREAK        ;send a break
  310. ;
  311. ; The following jump vector provides the overlay with access to special
  312. ; routines in the main program (retained and supported in the main pro-
  313. ; gram for MDM overlay compatibility). These should not be modified by
  314. ; the overlay.
  315. ;
  316. ; Note that for MEX 2.0 compatibility, you should not try to use these
  317. ; routines, since this table will go away with MEX 2.0 (use the MEX
  318. ; service call processor instead).
  319. ;
  320. ILPRTV:    DS    3        ;replace with MEX function 9
  321. INBUFV:    DS    3        ;replace with MEX function 10
  322. ILCMPV:    DS    3        ;replace with table lookup funct. 247
  323. INMDMV:    DS    3        ;replace with MEX function 255
  324. NXSCRV:    DS    3        ;not supported by MEX (returns w/no action)
  325. TIMERV:    DS    3        ;replace with MEX function 254
  326. ;
  327. ;
  328. ; Clear/screen and clear/end-of-screen. Each routine must use the
  329. ; full 9 bytes alloted (may be padded with nulls).
  330. ;
  331. ; These routines (and other screen routines that MEX 2.0 will sup-
  332. ; port) will be accessed through a jump table in 2.0, and will be
  333. ; located in an area that won't tie the screen functions to the
  334. ; modem overlay (as the MDM format does).
  335. ;
  336. CLREOS:    LXI    D,EOSMSG
  337.     MVI    C,PRINT
  338.     CALL    MEX
  339.     RET
  340. ;
  341. ;
  342. CLS:    LXI    D,CLSMSG        ;null unless patched
  343.     MVI    C,PRINT
  344.     CALL    MEX
  345.     RET
  346. ;
  347. ;------------------------------------------------------------
  348. ;
  349. ;    *** END OF FIXED FORMAT AREA ***
  350. ;
  351. ;------------------------------------------------------------
  352. ;
  353. ; strings to clear-to-end-of-screen, and clear-screen
  354. ;
  355. EOSMSG:    DB    ESC,'Y',0,0,0,0,'$'    ;clear to end-of-screen (0 for pause)
  356. CLSMSG:    DB    ESC,'+',0,0,0,0,'$'    ;clear whole screen (0 for pause)
  357. ;
  358. ; Modem initialization.
  359. ;
  360. NITMOD:    MVI    A,RESET1    ;Initialize 8251 chip
  361.     OUT    MODCTL
  362.     MVI    A,RESET1    ;Initialize 8251 chip again
  363.     OUT    MODCTL
  364.     LDA    MSPEED
  365.     CALL    SBAUD        ;set the baudrate
  366.     RET
  367. ;
  368. ; Send-break routine
  369. ;
  370. SBREAK:    MVI    A,BREAK
  371.     OUT    MODCTL
  372.     MVI    B,2        ;wait 200 ms
  373.     MVI    C,TIMER
  374.     CALL    MEX
  375.     MVI    A,CHIPSET    ;reset break
  376.     OUT    MODCTL
  377.     RET
  378. ;
  379. ; disconnect the modem
  380. ;
  381. MDISC:    MVI    A,DISCNT    ;hang up
  382.     OUT    MODCTL
  383.     MVI    B,20        ;wait for modem to disconnect (2 sec)
  384.     MVI    C,TIMER
  385.     CALL    MEX
  386.     MVI    A,CHIPSET    ;reset modem
  387.     OUT    MODCTL
  388.     RET
  389. ;
  390. ; Exit routine --  called just before MEX exits to CP/M
  391. ;
  392. DUMMY:    RET            ;we don't need one
  393. ;
  394. ;
  395. ; Set Baud Rate
  396. ;
  397. ; New baud-rate code in A.
  398. ; NOTE: this routine (ie, the one vectored through NEWBDV) should
  399. ; update MSPEED with the passed code, but ONLY if that rate is
  400. ; supported by the hardware.
  401. ;
  402. ;     A=0:   110 baud       A=1:   300 baud      A=2:   450 baud
  403. ;     A=3:   600 baud       A=4:   710 baud      A=5:  1200 baud
  404. ;     A=6:  2400 baud       A=7:  4800 baud      A=8: 19200 baud
  405. ;
  406. SBAUD:    PUSH    H        ;don't alter anybody
  407.     PUSH    D
  408.     PUSH    B
  409.     MOV    C,A        ;save baud rate code
  410.     MVI    B,0
  411.     LXI    H,BTABL        ;Get baudrate value
  412.     DAD    B
  413.     MOV    A,M
  414.     CPI    NA        ;See if baud rate valid
  415.     STC            ;set for not valid
  416.     JZ    NOTVAL        ;not valid
  417. ;
  418. IF SCP4 OR HSIO4
  419.     OUT    BAUDRP
  420.     MVI    A,CLCK        ;set up clock multiplier
  421. ENDIF
  422. ;
  423.     LXI    H,PARITY
  424.     ORA    M        ;put in parity and data length
  425.     PUSH    PSW        ;first reset the UART
  426.     MVI    A,RESET2
  427.     OUT    MODCTL
  428.     XTHL            ;delay -- must be in pairs
  429.     XTHL
  430.     POP    PSW
  431.     OUT    MODCTL
  432.     MOV    A,C
  433.     STA    MSPEED        ;save new baud rate code
  434.     MVI    A,CHIPSET    ;set chip for I/O
  435.     OUT    MODCTL
  436.     XRA    A        ;clear carry flag
  437. NOTVAL:    POP    B
  438.     POP    D
  439.     POP    H
  440.     RET
  441. ;
  442. ; Parity control byte location
  443. ;
  444. PARITY:    DB    NONE
  445. ;
  446. ; Baud rate table
  447. ;
  448. BTABL:    DB    BD110
  449.     DB    BD300
  450.     DB    BD450
  451.     DB    BD600
  452.     DB    BD710
  453.     DB    BD1200
  454.     DB    BD2400
  455.     DB    BD4800
  456.     DB    BD9600
  457.     DB    BD19K
  458. ;
  459. ; Sign-on message
  460. ;
  461. SYSVER:    LXI    D,SOMESG
  462.     MVI    C,PRINT
  463.     CALL    MEX
  464. CARRSH:
  465. ;
  466. IF SCP4 OR HSIO4
  467.     RET
  468. ENDIF
  469. ;
  470. IF SECSER
  471.     LXI    D,NOMESG    ;tell about carrier
  472.     CALL    CARRCK        ;check for it
  473.     MVI    C,PRINT
  474.     CNZ    MEX        ;print the "no" if no carrier
  475.     LXI    D,CARMSG    ;print "carrier present"
  476.     MVI    C,PRINT
  477.     CALL    MEX
  478.     RET
  479. ;
  480. NOMESG:    DB    'no $'
  481. CARMSG:    DB    'carrier present',CR,LF,'$'
  482. ;
  483. ; Check for carrier present (NZ=no)
  484. ;
  485. CARRCK:    IN    CDPORT        ;get carrier status
  486.     ANI    MODCDB        ;get carrier detect bit
  487.     CPI    MODCDA        ;see if active
  488.     RET
  489. ENDIF    ;SECSER
  490. ;
  491. SOMESG:
  492. ;
  493. IF SECSER
  494.     DB    'North Star Horizon on Second Serial Port V.'
  495. ENDIF
  496. IF HSIO4
  497.     DB    'North Star HSIO-4 Serial Card V.'
  498. ENDIF
  499. IF SCP4
  500.     DB    'Seattle Computer Products Muli-port Serial Card  V.'
  501. ENDIF
  502. ;
  503.     DB    REV/10+'0'
  504.     DB    '.'
  505.     DB    REV MOD 10+'0',CR,LF,'$'
  506. ;
  507. ; Newline on console
  508. ;
  509. CRLF:    MVI    A,CR
  510.     CALL    TYPE
  511.     MVI    A,LF        ;fall into TYPE
  512. ;
  513. ; type char in A on console
  514. ;
  515. TYPE:    PUSH    H        ;save 'em
  516.     PUSH    D
  517.     PUSH    B
  518.     MOV    E,A        ;align output character
  519.     MVI    C,CONOUT    ;print via MEX
  520.     CALL    MEX
  521.     POP    B
  522.     POP    D
  523.     POP    H
  524.     RET
  525. ;
  526. ;------------------------------------------------------------
  527. ;
  528. ; The remainder of this overlay implements a very versatile
  529. ; SET command
  530. ;
  531. ; Control is passed here after MEX parses a SET command.
  532. ;
  533. SETCMD:    MVI    C,SBLANK    ;any arguments?
  534.     CALL    MEX
  535.     JC    SETSHO        ;if not, go print out values
  536.     LXI    D,CMDTBL    ;parse command
  537.     CALL    TSRCH        ;from table
  538.     PUSH    H        ;any address on stack
  539.     RNC            ;if we have one, execute it
  540.     POP    H        ;nope, fix stack
  541. SETERR:    LXI    D,SETEMS    ;print error
  542.     MVI    C,PRINT
  543.     CALL    MEX
  544.     RET
  545. ;
  546. SETEMS:    DB    CR,LF,'SET command error',CR,LF,'$'
  547. ;
  548. ; SET command table ... note that tables are constructed of command-
  549. ; name (terminated by high bit=1) followed by word-data-value returned
  550. ; in HL by MEX service processor LOOKUP.  Table must be terminated by
  551. ; a binary zero.
  552. ;
  553. ; Note that LOOKUP attempts to find the next item in the input stream
  554. ; in the table passed to it in HL ... if found, the table data item is
  555. ; returned in HL; if not found, LOOKUP returns carry set.
  556. ;
  557. CMDTBL:    DB    '?'+80H            ;"set ?"
  558.     DW    STHELP
  559.     DB    'BAU','D'+80H        ;"set baud"
  560.     DW    STBAUD
  561.     DB    'PARIT','Y'+80H        ;"set parity"
  562.     DW    STPAR
  563. ;
  564.     DB    0        ;<<=== table terminator
  565. ;
  566. ; SET <no-args>: print current statistics
  567. ;
  568. SETSHO:    CALL    CARRSH        ;show carrier present/not present
  569.     LXI    H,SHOTBL    ;get table of SHOW subroutines
  570. SETSLP:    MOV    E,M        ;get table address
  571.     INX    H
  572.     MOV    D,M
  573.     INX    H
  574.     MOV    A,D        ;end of table?
  575.     ORA    E
  576.     RZ            ;exit if so
  577.     PUSH    H        ;save table pointer
  578.     XCHG            ;adrs to HL
  579.     CALL    GOHL        ;do it
  580.     CALL    CRLF        ;print newline
  581.     MVI    C,CHEKCC    ;check for console abort
  582.     CALL    MEX
  583.     POP    H        ;it's done
  584.     JNZ    SETSLP        ;continue if no abort
  585.     RET
  586. ;
  587. GOHL:    PCHL
  588. ;
  589. ; table of SHOW subroutines
  590. ;
  591. SHOTBL:    DW    BDSHOW
  592.     DW    PSHOW
  593.     DW    0        ;<<== table terminator
  594. ;
  595. ; SET ?  processor
  596. ;
  597. STHELP:    LXI    D,HLPMSG
  598.     MVI    C,PRINT
  599.     CALL    MEX
  600.     RET
  601. ;
  602. ; The help message
  603. ;
  604. HLPMSG:    DB    CR,LF,'SET command:',CR,LF,LF
  605. ;
  606. IF SECSER
  607.     DB    CR,LF,'SET BAUD 300 <or> 1200'
  608. ENDIF
  609. IF HSIO4
  610.     DB    CR,LF,'SET BAUD 110, 300, 600, 1200,'
  611.     DB    ' 2400, 4800, 9600, <or> 19200'
  612. ENDIF
  613. IF SCP4
  614.     DB    CR,LF,'SET BAUD 110, 300, 600, 1200,'
  615.     DB    ' 2400, 4800, 9600, <or> 19200'
  616. ENDIF
  617. ;
  618.     DB    CR,LF,'SET PARITY EVEN[8] <or> ODD[8] <or> NONE'
  619.     DB    CR,LF,'$'
  620. ;
  621. ; SET BAUD processor
  622. ;
  623. STBAUD:    MVI    C,BDPARS    ;function code
  624.     CALL    MEX        ;let MEX look up code
  625.     JC    SETERR        ;invalid code
  626.     CALL    SBAUD        ;no, try to set it
  627.     JC    SETERR        ;not-supported code
  628. BDSHOW:    CALL    ILPRT        ;display baud
  629.     DB    'Baud rate:',TAB,' ',0
  630.     LDA    MSPEED
  631.     MVI    C,PRBAUD    ;use MEX routine
  632.     CALL    MEX
  633.     RET
  634. ;
  635. ; SET PARITY processor
  636. ;
  637. STPAR:    LXI    D,PARTBL    ;lookup next input item in table
  638.     CALL    TSRCH
  639.     JC    SETERR        ;if not found, error
  640.     MOV    A,L        ;get parity code
  641.     STA    PARITY        ;store it for NITMOD
  642.     LDA    MSPEED        ;don't change baud rate
  643.     CALL    SBAUD        ;set parity
  644. PSHOW:    CALL    ILPRT        ;show parity
  645.     DB    'Parity:',TAB,TAB,' ',0
  646.     LXI    H,PARFND    ;find proper message
  647.     LDA    PARITY        ;get parity value
  648.     MOV    B,A
  649. FNDP:    MOV    A,M        ;see if parity value matches
  650.     ORA    A        ;first see if zero
  651.     JZ    SETERR        ;should never get here
  652.     CMP    B        ;match?
  653.     INX    H        ;point to first letter of message
  654.     JZ    CDISP        ;matches, type message
  655. FNDNXT:    MOV    A,M
  656.     ORA    A        ;see if end of last message
  657.     INX    H
  658.     JP    FNDNXT        ;not finished
  659.     INX    H        ;increment past parity byte
  660.     JMP    FNDP
  661. ;
  662. ; PARITY argument table
  663. ; Format of the table is:  Starting at PARTBL, the name is
  664. ; given (ending with 80H bit set), then the one byte code
  665. ; for setting that parity.  The next byte duplicates the
  666. ; NEXT parity code (used in PSHOW).  The byte at PARFND
  667. ; duplicates the first parity code.
  668. ;
  669. PARFND:    DB    EVEN
  670. PARTBL:    DB    'EVE','N'+80H    ;even parity, 7 data bits
  671.     DB    EVEN,EVEN8
  672.     DB    'EVEN','8'+80H    ;even parity, 8 data bits
  673.     DB    EVEN8,ODD
  674.     DB    'OD','D'+80H    ;odd parity, 7 data bits
  675.     DB    ODD,ODD8
  676.     DB    'ODD','8'+80H    ;odd parity, 8 data bits
  677.     DB    ODD8,NONE
  678.     DB    'NON','E'+80H    ;no parity, 8 data bits
  679.     DB    NONE,0
  680. ;
  681.     DB    0        ;<<== table terminator
  682. ;
  683. ;  Print message ending with 80H bit set
  684. ;
  685. CDISP:    MOV    A,M        ;get character to print
  686.     INX    H        ;point to next character
  687.     PUSH    PSW        ;save 80H bit
  688.     ANI    7FH        ;strip 80H bit just in case
  689.     CALL    TYPE
  690.     POP    PSW
  691.     ORA    A
  692.     JM    CRLF        ;finished
  693.     JMP    CDISP
  694. ;
  695. ; Compare next input-stream item in table @DE; CY=1
  696. ; if not found, else HL=matched data item
  697. ;
  698. TSRCH:    MVI    C,LOOKUP    ;get function code
  699.     JMP    MEX        ;pass to MEX processor
  700. ;
  701. ; Print in-line message ... blows away C register
  702. ;
  703. ILPRT:    MVI    C,ILP        ;get function code
  704.     JMP    MEX        ;go do it
  705. ;
  706. ;------------------------------------------------------------
  707. ;
  708. ; End of North Star MEX modem overlay
  709. ;
  710. ;------------------------------------------------------------
  711. ;
  712.     END
  713.