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

  1. ;    Title    'MEX overlay for the Sanyo MBC-1000 Computer'
  2. ;
  3. ;
  4. ; This file adapts the Sanyo MBC-1000 computer to the MEX modem program.
  5. ;
  6. REV    EQU    21        ;overlay revision level
  7. ;
  8. ; 09/15/84: Revision 2.1  A major revision.  Added features of SET SPKR,
  9. ;    SET WAIT, and SET DIAL, and disable auto-answer.  All the routines 
  10. ;    were borrowed from MXM-US13.ASM but with great difficulty and much
  11. ;    alteration.  Added conditional assembly for smartmodem (SMMODEM) &
  12. ;    ANCHOR, added DELAY to slow modem commands where the Anchor can 
  13. ;    catch them, and fixed a revision 2.0 bug where the SET status would
  14. ;    lose the current baudrate info.  This revision tested with an Anchor
  15. ;    Mark XII Smartmodem until all works.  Other smartmodems may require
  16. ;    revision of delays and timing constants.  Sanyo does not make pin 8
  17. ;    of the RS-232C connector available so the DCD (Data Carrier Detect)
  18. ;    cannot be sensed and the Carrier Check and Carrier Show (CARRCK and
  19. ;    CARRSH) portions were eliminated. Altered the SET status display to
  20. ;    suit my taste and always provide status with help commands. Other
  21. ;    modems are cautioned that their unique portions are essentially
  22. ;    untested.  Tested with MX-SM13A & MEX111.       ((Bob Sandel))     
  23. ;
  24. ; 08/09/84: Revision 2.0  Combined MXO-SY11 and M7SY-3.ASM
  25. ;    Added variables PTIMER, PBAUD, SQWV2 & N8251. Cleaned up some minor bugs
  26. ;    in the OR routine for the 8251 output & insured out of mode state always
  27. ;    occurs in SBAUD.  Added comments where changes were made.   (Bob Sandel)
  28. ;
  29. ;--------------------------------------------------------------------
  30. ;
  31. ;  THIS MODIFICATION MAKES USE OF TIMER 2 OF THE 8253 PROGRAMMABLE
  32. ;  INTERVAL TIMER (IC4) ON THE SERIAL I/O BOARD OF THE SANYO MBC-1000.
  33. ;
  34. ;  To use this program, the serial I/O board must be modified as follows:
  35. ;
  36. ;  1. Cut etch from IC18 Pin 1 to JP2 Pin 8.
  37. ;  2. Install jumper from IC18 Pin 1 to IC4 Pin 18.
  38. ;  3. Install jumper from IC4 Pin 17 to JP2 Pin 8.
  39. ;  4. Install jumper from IC4 Pin 16 to IC4 Pin 14.
  40. ;  5. Move jumper strap to JP2 Pin 8 for programmable baud rate, other
  41. ;     pins (1-7) can still be used for standard baud rate selections.
  42. ;  6. Hardware modification is now complete.
  43. ;
  44. ; You will want to look this file over carefully. There are a number of
  45. ; options that you can use to configure the program to suit your taste.;
  46. ; Edit for your preferences then follow the "TO USE:" example shown below.
  47. ;
  48. ; Use the "SET" command to change the baudrate when desired.  It starts
  49. ; out at 1200 baud when the program is first called up.  Because of tem- 
  50. ; perature and component variations, you mave have to alter the timing
  51. ; parameters BD110-BD19K, plus or minus 1 or 2 numbers, if CRC errors 
  52. ; occur frequently during transmission and reception.
  53. ;
  54. ; Only 300 & 1200 Baud are enabled; info for other baudrates is located
  55. ; in table form above INITBD. For full capability, N8251 would have to
  56. ; be implemented via a second lookup table.
  57. ;
  58. ;
  59. ; _______________________________________________________________________
  60. ;
  61. ; Note that all overlays may freely use memory up to 0CFFH.  If your
  62. ; overlay must work with the MEX Smartmodem overlay (MXO-SMxx.ASM) or
  63. ; the MEX DATEC 212 overlay (MXO-DT10.ASM), the physical modem overlay
  64. ; should terminate by 0AFFH.
  65. ;
  66. ; The SET command allows the user to change the baud rates, and the
  67. ; parity.  The parity options are: No parity (NONE); Even parity (EVEN);
  68. ; Even parity with 8 data bits (EVEN8); Odd parity (ODD); and Odd parity
  69. ; with 8 data bits (ODD8).  EVEN8 and ODD8 are for special purposes and
  70. ; will most likely never be used.
  71. ;_______________________________________________________________________
  72. ;
  73. ; Misc equates
  74. ;
  75. YES     EQU    0FFH
  76. NO      EQU    0
  77. NA      EQU    0FFH        ;Value for baud rate not available
  78. ;
  79. SMMODEM EQU     YES             ;Yes=Smartmodem
  80. ANCHOR  EQU     YES             ;Anchor has no speaker or programmable wait
  81.                                 ;No=Hayes, U.S. Robotics  
  82. BELL    EQU    07H        ;bell
  83. TAB     EQU    09H             ;tab
  84. LF      EQU    0AH        ;line feed
  85. CR      EQU    0DH        ;carriage return
  86. ESC     EQU    1BH        ;escape
  87. TPA     EQU     0100H           ;Transient Program Area
  88. MEX     EQU     0D00H           ;Address of the service processor 
  89. ;
  90. ;
  91. ; The following information was altered for the Sanyo MBC-1000
  92. ;
  93. PORT:   EQU     0A5H    ;Sanyo 8251 modem USART control port
  94. PTIMER  EQU     0A3H    ;8253 programmable interval timer control
  95. PBAUD   EQU     0A2H    ;8253 data port (square wave, n/2+n/2)
  96. ;
  97. MODCTL:    EQU    PORT    ;MODEM CONTROL PORT
  98. MODDAT:    EQU    PORT-1    ;MODEM DATA PORT
  99. ;
  100. MDRCVB: EQU     00000010B       ;bit to test for RECEIVE
  101. MDRCVR: EQU     00000010B       ;value when READY
  102. MDSNDB: EQU     00000001B       ;bit to test for SEND
  103. MDSNDR: EQU     00000001B       ;value when READY
  104. EVEN    EQU     01111000B       ;EVEN parity, 7 data bits
  105. EVEN8   EQU     01111100B       ;EVEN parity, 8 data bits
  106. ODD     EQU     01011000B       ; ODD parity, 7 data bits
  107. ODD8    EQU     01011100B       ; ODD parity, 8 data bits
  108. NONE    EQU     01001100B       ;  no parity, 8 data bits = NONE
  109. ;
  110. ;
  111. SQWV2   EQU     10010110B      ;Configures 8253 Timer-2 for square waves
  112. N8251   EQU     00000010B      ;See 8251 lookup table below (150-1200 baud)
  113. ;
  114. ;  Progammable Baud Rate factors (theoretical)        
  115. ;
  116. ;  Minor adjustment of 8253 n +1,-1 may be required    8253      8251 
  117. ;                                                      ----      ----
  118. BD110:          EQU     NA              ;NO 110    |    2C        03
  119. BD300:          EQU     041H            ; <300>    |    40        02
  120. BD450:          EQU     NA              ;NO 450    |    2B        02    
  121. BD600:          EQU     NA              ;NO 600    |    20        02
  122. BD710:          EQU     NA              ;NO 710    |    1B        02
  123. BD1200:         EQU     010H            ;<1200>    |    10        02
  124. BD2400:         EQU     NA              ;NO 2400   |    80        01
  125. BD4800:         EQU     NA              ;NO 4800   |    40        01
  126. BD9600:         EQU     NA              ;NO 9600   |    20        01 
  127. BD19K:          EQU     NA              ;NO 19200  |    10        01
  128. ;
  129. ;
  130. INITBD:        EQU    5        ;Initial baud rate (1200)
  131. ;
  132. ; Control bytes
  133. ;
  134. RESET1  EQU     10000111B               ;Initialize UART
  135. RESET2  EQU     01000000B               ;Internal reset
  136. CHIPSET EQU     00100111B               ;DTR, RTS, RE, TE
  137. DISCNT  EQU     00010111B               ;no DTR, RTS, RE, TE
  138. ;
  139. BREAK   EQU     CHIPSET OR 8H   ;BREAK character
  140. ;
  141. ;
  142. ; MEX service processor stuff ... MEX supports an overlay service
  143. ; processor, located at 0D00H (and maintained at this address from
  144. ; version to version).  If your overlay needs to call BDOS for any
  145. ; reason, it should call MEX instead; function calls below about
  146. ; 240 are simply passed on to the BDOS (console and list I/O calls
  147. ; are specially handled to allow modem port queueing, which is why
  148. ; you should call MEX instead of BDOS).  MEX uses function calls
  149. ; above about 244 for special overlay services (described below).
  150. ;
  151. ; Some sophisticated overlays may need to do file I/O; if so, use
  152. ; the PARSFN MEX call with a pointer to the FCB in DE to parse out
  153. ; the name.  This FCB should support a spare byte immediately pre-
  154. ; ceeding the actual FCB (to contain user # information).  If you've
  155. ; used MEX-10 for input instead of BDOS-10 (or you're parsing part
  156. ; of a SET command line that's already been input), then MEX will
  157. ; take care of DU specs, and set up the FCB accordingly.  There-
  158. ; after all file I/O calls done through the MEX service processor
  159. ; will handle drive and user with no further effort necessary on
  160. ; the part of the programmer.
  161. ;
  162. INMDM    EQU    255        ;get char from port to A, CY=no more in 100 ms
  163. TIMER    EQU    254        ;delay 100ms * reg B
  164. TMDINP    EQU    253        ;B=# secs to wait for char, cy=no char
  165. CHEKCC    EQU    252        ;check for ^C from KBD, Z=present
  166. SNDRDY    EQU    251        ;test for modem-send ready
  167. RCVRDY    EQU    250        ;test for modem-receive ready
  168. SNDCHR    EQU    249        ;send a character to the modem (after sndrdy)
  169. RCVCHR    EQU    248        ;recv a char from modem (after rcvrdy)
  170. LOOKUP    EQU    247        ;table search: see CMDTBL comments for info
  171. PARSFN    EQU    246        ;parse filename from input stream
  172. BDPARS    EQU    245        ;parse baud-rate from input stream
  173. SBLANK    EQU    244        ;scan input stream to next non-blank
  174. EVALA    EQU    243        ;evaluate numeric from input stream
  175. LKAHED    EQU    242        ;get nxt char w/o removing from input
  176. GNC    EQU    241        ;get char from input, cy=1 if none
  177. ILP    EQU    240        ;inline print
  178. DECOUT    EQU    239        ;decimal output
  179. PRBAUD    EQU    238        ;print baud rate
  180. ;
  181. ;
  182. CONOUT    EQU    2        ;simulated BDOS function 2: console char out
  183. PRINT    EQU    9        ;simulated BDOS function 9: print string
  184. INBUF    EQU    10        ;input buffer, same structure as BDOS 10
  185. ;
  186.     ORG    TPA        ;we begin
  187. ;
  188. ;
  189.     DS    3        ;MEX has a JMP START here
  190. ;
  191. ; The following variables are located at the beginning of the program
  192. ; to facilitate modification without the need of re-assembly. They will
  193. ; be moved in MEX 2.0.
  194. ;
  195. PMODEM: DB    NO              ;yes=PMMI modem \ / These 2 locations are not
  196. SMODEM: DB    SMMODEM         ;yes=Smartmodem / \ referenced by MEX
  197. TPULSE: DB      'P'             ;T=touch, P=pulse (not referenced by MEX)
  198. CLOCK:  DB      40              ;clock speed x .1, up to 25.5 mhz.
  199. MSPEED: DB      INITBD          ;sets initial baud rate
  200.                                 ;0=110    1=300  2=450  3=600  4=710
  201.                                 ;5=1200 6=2400 7=4800 8=9600 9=19200
  202. BYTDLY: DB    5        ;default time to send character in
  203.                                 ;terminal mode file transfer (0-9)
  204.                                 ;0=0 delay, 1=10 ms, 5=50 ms, 9=90 ms
  205. CRDLY:  DB    5        ;end-of-line delay after CRLF in terminal
  206.                                 ;mode file transfer for slow BBS systems
  207.                                 ;0=0 delay, 1=100 ms, 5=500 ms, 9=900 ms
  208. COLUMS: DB    5        ;number of directory columns
  209. SETFL:  DB    YES        ;yes=user-defined SET command
  210. SCRTST: DB    YES        ;yes=if home cursor and clear screen
  211.                                 ;routine at CLRSCRN
  212.         DB    0        ;was once ACKNAK, now spare
  213. BAKFLG: DB    NO        ;yes=make .BAK file
  214. CRCDFL:    DB    YES        ;yes=default to CRC checking
  215.                                 ;no=default to Checksum checking
  216. TOGCRC: DB    YES        ;yes=allow toggling of Checksum to CRC
  217. CVTBS:  DB    NO        ;yes=convert backspace to rub
  218. TOGLBK: DB    YES        ;yes=allow toggling of bksp to rub
  219. ADDLF:  DB    NO        ;no=no LF after CR to send file in
  220.                                 ;terminal mode (added by remote echo)
  221. TOGLF:  DB    YES        ;yes=allow toggling of LF after CR
  222. TRNLOG: DB    NO        ;yes=allow transmission of logon
  223.                                 ;write logon sequence at location LOGON
  224. SAVCCP: DB    YES        ;yes=do not overwrite CCP
  225. LOCNXT: DB    NO        ;yes=local cmd if EXTCHR precedes
  226.                                 ;no=not local cmd if EXTCHR precedes
  227. TOGLOC: DB    YES        ;yes=allow toggling of LOCNXTCHR
  228. LSTTST: DB    YES        ;yes=allow toggling of printer on/off
  229.                                 ;in terminal mode. Set to no if using
  230.                                 ;the printer port for the modem
  231. XOFTST: DB    NO        ;yes=allow testing of XOFF from remote
  232.                                 ;while sending a file in terminal mode
  233. XONWT:  DB    NO        ;yes=wait for XON after sending CR while
  234.                                 ;transmitting a file in terminal mode    
  235. TOGXOF: DB    YES        ;yes=allow toggling of XOFF testing
  236. IGNCTL: DB    YES        ;yes=do not send control characters
  237.                                 ;above CTL-M to CRT in terminal mode
  238.                                 ;no=send any incoming CTL-char to CRT
  239. EXTRA1: DB    0        ;for future expansion
  240. EXTRA2: DB    0        ;for future expansion
  241. BRKCHR: DB    '@'-40H        ;^@ = Send a 300 ms. break tone
  242. NOCONN: DB    'N'-40H        ;^N = Disconnect from phone line
  243. LOGCHR: DB    'L'-40H        ;^L = Send logon
  244. LSTCHR: DB    'P'-40H        ;^P = Toggle printer
  245. UNSVCH: DB    'R'-40H        ;^R = Close input text buffer
  246. TRNCHR: DB    'T'-40H        ;^T = Transmit file to remote
  247. SAVCHR: DB    'Y'-40H        ;^Y = Open input text buffer
  248. EXTCHR: DB    '^'-40H        ;^^ = Send next character
  249. ;
  250. ; Equates used only by PMMI routines grouped together here.
  251. ;
  252.     DS    2        ;not used
  253. ;
  254. ; Low-level modem I/O routines: this will be replaced with
  255. ; a jump table in MEX 2.0 (you can insert jumps here to longer
  256. ; routines if you'd like ... I'd recommend NOT putting part of
  257. ; a routine in this area, then jumping to the rest of the routine
  258. ; in the non-fixed area; that will complicate the 2.0 conversion)
  259. ;
  260. INCTL:    IN    MODCTL        ;in modem control port
  261.     RET
  262.     DB    0,0,0,0,0,0,0    ;spares if needed
  263. ;
  264. OTDATA:    OUT    MODDAT        ;out modem data port
  265.     RET
  266.     DB    0,0,0,0,0,0,0    ;spares if needed
  267. ;
  268. INPORT:    IN    MODDAT        ;in modem data port
  269.     RET
  270.     DB    0,0,0,0,0,0,0    ;spares if needed
  271. ;
  272. ; Bit-test routines.  These will be merged with the above
  273. ; routines in MEX 2.0 to provide a more reasonable format
  274. ;
  275. MASKR:    ANI MDRCVB ! RET    ;bit to test for receive ready
  276. TESTR:    CPI MDRCVR ! RET    ;value of receive bit when ready
  277. MASKS:    ANI MDSNDB ! RET    ;bit to test for send ready
  278. TESTS:    CPI MDSNDR ! RET    ;value of send bit when ready
  279. ;
  280. ;
  281. ; Unused area: was once used for special PMMI functions,
  282. ; Now used only to retain compatibility with MDM overlays.
  283. ; You may use this area for any miscellaneous storage you'd
  284. ; like but the length of the area *must* be 12 bytes.
  285. ;
  286.     DS    12
  287. ;
  288. ; Special modem function jump table: if your overlay cannot handle
  289. ; some of these, change the jump to "DS 3", so the code present in
  290. ; MEX will be retained.
  291. ;
  292. LOGON:    DS    2        ;needed for MDM compat, not ref'd by MEX
  293. DIALV:    DS    3        ;dial digit in A (see info at PDIAL)
  294. DISCV:    DS    3        ;disconnect the modem
  295. GOODBV: JMP    DUMMY        ;called before exit to CP/M
  296. INMODV: JMP    NITMOD        ;initialization. Called at cold-start
  297. NEWBDV: JMP    SBAUD        ;set baud rate
  298. NOPARV: DS    3        ;set for no parity (called after transfer)
  299. PARITV: DS    3        ;set modem parity (called before transfer)
  300. SETUPV: JMP    SETCMD        ;SET command
  301. SPMENV: DS    3        ;not used with MEX
  302. VERSNV: JMP    SYSVER        ;Overlay's voice in the sign-on message
  303. BREAKV: JMP    SBREAK        ;send a break
  304. ;
  305. ; The following jump vector provides the overlay with access to special
  306. ; routines in the main program (retained and supported in the main pro-
  307. ; gram for MDM overlay compatibility). These should not be modified by
  308. ; the overlay.
  309. ;
  310. ; Note that for MEX 2.0 compatibility, you should not try to use these
  311. ; routines, since this table will go away with MEX 2.0 (use the MEX
  312. ; service call processor instead).
  313. ;
  314. ILPRTV:    DS    3        ;replace with MEX function 9
  315. INBUFV:    DS    3        ;replace with MEX function 10
  316. ILCMPV:    DS    3        ;replace with table lookup funct. 247
  317. INMDMV:    DS    3        ;replace with MEX function 255
  318. NXSCRV:    DS    3        ;not supported by MEX (returns w/no action)
  319. TIMERV:    DS    3        ;replace with MEX function 254
  320. ;
  321. ;
  322. ; Clear/screen and clear/end-of-screen. Each routine must use the
  323. ; full 9 bytes alloted (may be padded with nulls).
  324. ;
  325. ; These routines (and other screen routines that MEX 2.0 will sup-
  326. ; port) will be accessed through a jump table in 2.0, and will be
  327. ; located in an area that won't tie the screen functions to the
  328. ; modem overlay (as the MDM format does).
  329. ;
  330. CLREOS:    LXI    D,EOSMSG
  331.         MVI    C,PRINT
  332.         CALL    MEX
  333.         RET
  334. ;
  335. ;
  336. CLS:    LXI    D,CLSMSG        ;null unless patched
  337.         MVI    C,PRINT
  338.         CALL    MEX
  339.         RET
  340. ;
  341. ;------------------------------------------------------------
  342. ;
  343. ;    *** END OF FIXED FORMAT AREA ***
  344. ;
  345. ;------------------------------------------------------------
  346. ;
  347. ; strings to clear-to-end-of-screen, and clear-screen
  348. ;
  349. EOSMSG:    DB    0,0,0,0,0,0,'$'        ;clear to end-of-screen (0 for pause)
  350. CLSMSG:    DB    1AH,0,0,0,0,0,'$'    ;clear whole screen (0 for pause)
  351. ;
  352. ; Modem initialization.
  353. ;
  354. NITMOD: MVI     A,SQWV2         ;Initialize 8253 chip so counter 2 becomes
  355.         OUT     PTIMER          ;baud rate programmable clock (square wave)
  356.         LDA    MSPEED
  357.         CALL    SBAUD        ;set the baudrate
  358.  ;
  359.    IF SMMODEM                   ;if smartmodem, send start-up cmd(s)
  360. INITSM:
  361.         LXI     H,INISTR        ;point to initialization string
  362. SENDLP: MVI     C,SNDRDY        ;MEX service function # 251                         
  363.         CALL    MEX             ;test for modem-send-ready
  364.         JNZ     SENDLP          ;loop if not ready
  365.         MOV     A,M             ;get character
  366.         INX     H               ;increment to next character address
  367.         CPI     '$'             ;end-of-string ?
  368.         JZ      INITEX          ;Yes, exit
  369.         MOV     B,A             ;No, put character in B
  370.         MVI     C,SNDCHR        ;MEX service function # 249
  371.         CALL    MEX             ;let MEX output character to modem
  372.         CALL    DELAY           ;needed for Anchor: others ???
  373.         JMP     SENDLP          ;loop 'til end-of message
  374. ;
  375. INITEX: MVI     B,5             ;wait 0.5 sec for modem to say "OK"
  376.         MVI     C,TIMER         ;MEX service function # 254
  377.         CALL    MEX             ;kill time
  378. ;
  379.    ENDIF                        ;Smartmodem
  380.        RET
  381. ;
  382. DELAY:  MVI    B,1             ;now set for 100 milliseconds
  383.         MVI     C,TIMER         ;play with values until modem works
  384.         CALL    MEX
  385.         RET          
  386. ;
  387. ; You may define an intialization string in INISTR to set up smartmodem
  388. ; in any configuration desired. String must end with a '$'
  389. ;
  390. ;
  391. ; Command string sent to modem after I/O initialization
  392. ;
  393.   IF SMMODEM
  394. ;
  395. INISTR:
  396.         DB      'ATV0',CR       ; Disable verbose mode
  397.         DB    'ATS0=0',CR    ; Disable auto-answer
  398.    ENDIF                        ; Smartmodem 
  399. ;
  400.    IF SMMODEM AND NOT ANCHOR    ; Pls check that your modem supports 
  401.     DB    'ATX1',CR    ; Send extended result codes
  402. SPBYTE:    DB    'ATM1',CR    ; Speaker on 'til connect
  403. WABYTE:    DB    'ATS7=30',CR    ; Wait 30 seconds for carrier
  404.    ENDIF                        ; END of smartmodem AND not Anchor
  405. ;
  406.    IF SMMODEM                   ; continuation after Anchor part    
  407.         DB    'ATV1',CR    ; Set verbose result codes
  408.         DB      '$'             ; end-of-string :Must be here 
  409. ;
  410.    ENDIF                        ;Smartmodem 
  411. ;
  412.         RET
  413. ;
  414. ; Send-break routine
  415. ;
  416. SBREAK: MVI     A,BREAK
  417.         OUT     MODCTL
  418.         MVI     B,2             ;wait 200 ms
  419.         MVI     C,TIMER
  420.         CALL    MEX
  421.         MVI     A,CHIPSET       ;reset break
  422.         OUT     MODCTL
  423.         RET
  424. ;
  425. ; Exit routine --  called just before MEX exits to CP/M
  426. ;
  427. DUMMY:    RET            ;we don't need one
  428. ;
  429. ;
  430. ; Set Baud Rate
  431. ;
  432. ; New baud-rate code in A.
  433. ; NOTE: this routine (ie, the one vectored through NEWBDV) should
  434. ; update MSPEED with the passed code, but ONLY if that rate is
  435. ; supported by the hardware.
  436. ;
  437. ;     A=0:   110 baud       A=1:   300 baud      A=2:   450 baud
  438. ;     A=3:   600 baud       A=4:   710 baud      A=5:  1200 baud
  439. ;     A=6:  2400 baud       A=7:  4800 baud      A=8: 19200 baud
  440. ;
  441. SBAUD:    PUSH    H        ;don't alter anybody
  442.     PUSH    D
  443.     PUSH    B
  444.     MOV    C,A        ;save baud rate code  
  445.     MVI    B,0
  446.     LXI    H,BTABL        ;Get baudrate value
  447.     DAD    B               ;HL now contains address of baudrate number
  448.     MOV    A,M             ;A  now contains baudrate n
  449.     CPI    NA        ;See if baud rate valid
  450.     STC            ;set for not valid
  451.     JZ    NOTVAL        ;not valid
  452. ;
  453.                                 ;Set hardware/software implemented baudrate
  454.     OUT     PBAUD           ;8253 now set
  455. ;
  456.     MVI     A,RESET1        ;Insure out-of-mode state
  457.     OUT     MODCTL          ;Modem status port
  458.     MVI     A,RESET1        ;Do it again
  459.         OUT     MODCTL          ;For slight extra delay
  460.     MVI    A,RESET2        ;Then reset the USART 
  461.     OUT    MODCTL          ;Modem status port
  462.     XTHL            ;delay -- must be in pairs
  463.     XTHL
  464.         MVI     A,N8251         ;This factor works for the range 150-1200 baud
  465.     LXI    H,PARITY        ;A contains baudrate factor
  466.         ORA     M               ;OR parity and data length w baudrate factor    
  467.     OUT    MODCTL          ;8251 Mode now set
  468.     MOV     A,C        ; get baud rate code
  469.     STA    MSPEED        ;save baud rate code
  470.     MVI    A,CHIPSET    ;set chip for I/O
  471.     OUT    MODCTL          ;8251 Command now set
  472.     IN      MODDAT          ;Clear data port
  473.     XRA    A        ;clear carry flag
  474. NOTVAL:    POP    B
  475.     POP    D
  476.     POP    H
  477.     RET
  478. ;
  479. ; Parity control byte location
  480. ;
  481. PARITY:    DB    NONE
  482. ;
  483. ; Baud rate table
  484. ;
  485. BTABL:    DB    BD110
  486.     DB    BD300
  487.     DB    BD450
  488.     DB    BD600
  489.     DB    BD710
  490.     DB    BD1200
  491.     DB    BD2400
  492.     DB    BD4800
  493.     DB    BD9600
  494.     DB    BD19K
  495. ; Sign-on message
  496. SYSVER:    
  497.         LXI     D,SOMESG    ; Point to signon message
  498.         MVI     C,PRINT         ; MEX print string
  499.         CALL    MEX        ; Print message on term
  500. ;
  501. CARRSH:                ; Carrier Show & Carrier Detect deleted
  502. CARRCK: RET                     ; No carrier detect capability
  503. ;
  504. ;
  505. SOMESG:
  506.     DB    'Sanyo MBC-1000 programmable baudrate version '
  507.         DB    REV/10+'0','.'
  508.     DB    REV MOD 10+'0',CR,LF,'$'
  509. ;
  510. ;
  511. ; Newline on console
  512. ;
  513. CRLF:    MVI    A,CR
  514.     CALL    TYPE
  515.     MVI    A,LF        ;fall into TYPE
  516. ;
  517. ; type char in A on console
  518. ;
  519. TYPE:    PUSH    H        ;save 'em
  520.     PUSH    D
  521.     PUSH    B
  522.     MOV    E,A        ;align output character
  523.     MVI    C,CONOUT    ;print via MEX
  524.     CALL    MEX
  525.     POP    B
  526.     POP    D
  527.     POP    H
  528.     RET
  529. ;
  530. ;------------------------------------------------------------
  531. ;
  532. ; The remainder of this overlay implements a very versatile
  533. ; SET command
  534. ;
  535. ; Control is passed here after MEX parses a SET command.
  536. ;
  537. SETCMD:    CALL    CRLF            ;for better readability
  538.         MVI    C,SBLANK    ;any arguments?
  539.     CALL    MEX
  540.     JC    SETSHO        ;if not, go print out values
  541.     LXI    D,CMDTBL    ;parse command
  542.     CALL    TSRCH        ;from table
  543.     PUSH    H        ;any address on stack
  544.     RNC            ;if we have one, execute it
  545.     POP    H        ;nope, fix stack
  546. SETERR:    LXI    D,SETEMS    ;print error
  547.     MVI    C,PRINT
  548.     CALL    MEX
  549.     RET
  550. ;
  551. SETEMS:    DB    CR,LF,'SET command error',CR,LF,'$'
  552. ;
  553. ; SET command table ... note that tables are constructed of command-
  554. ; name (terminated by high bit=1) followed by word-data-value returned
  555. ; in HL by MEX service processor LOOKUP.  Table must be terminated by
  556. ; a binary zero.
  557. ;
  558. ; Note that LOOKUP attempts to find the next item in the input stream
  559. ; in the table passed to it in HL ... if found, the table data item is
  560. ; returned in HL; if not found, LOOKUP returns carry set.
  561. ;
  562. CMDTBL:    DB    '?'+80H            ;"set ?"
  563.     DW    STHELP
  564.     DB    'BAU','D'+80H        ;"set baud"
  565.     DW    STBAUD
  566.     DB    'PARIT','Y'+80H        ;"set parity"
  567.     DW    STPAR
  568. ;
  569.    IF NOT ANCHOR                ; Anchor has no speaker or prog. wait
  570.     DB    'SPK','R'+80H    ; "set spkr"
  571.     DW    STSPKR
  572.     DB    'WAI','T'+80H    ; "set wait"
  573.         DW    STWAIT
  574.    ENDIF                        ;not Anchor modem
  575. ;
  576.     DB    'DIA','L'+80H    ; "set dial"
  577.     DW    STDIAL
  578. ;
  579.  
  580.     DB    0        ;<<=== table terminator
  581. ;
  582. ; SET <no-args>: print current statistics
  583. ;
  584. SETSHO:    
  585.     LXI    H,SHOTBL    ;get table of SHOW subroutines
  586. SETSLP:    MOV    E,M        ;get table address
  587.     INX    H
  588.     MOV    D,M
  589.     INX    H
  590.     MOV    A,D        ;end of table?
  591.     ORA    E
  592.     JZ      sthelp          ;exit with help menu if so
  593.     PUSH    H        ;save table pointer
  594.     XCHG            ;adrs to HL
  595.     CALL    GOHL        ;do it
  596.     CALL    CRLF        ;print newline
  597.     MVI    C,CHEKCC    ;check for console abort
  598.     CALL    MEX
  599.     POP    H        ;it's done
  600.     JNZ    SETSLP        ;continue if no abort
  601.     RET
  602. ;
  603. GOHL:    PCHL
  604. ;
  605. ;
  606. ; table of SHOW subroutines
  607. SHOTBL:    DW    BDSHOW
  608.     DW    PSHOW
  609.   IF NOT ANCHOR                 ;Anchor has no speaker or prog. wait
  610.     DW    SPSHOW
  611.       DW    WASHOW
  612.   ENDIF                         ;not Anchor
  613.     DW    DISHOW
  614.     DW    0        ; <<== table terminator
  615. ;
  616. ;
  617. ; SET ?  processor
  618. ;
  619. STHELP:    LXI    D,HLPMSG
  620.     MVI    C,PRINT
  621.     CALL    MEX
  622.     RET
  623. ;
  624. ; The help message
  625. ;
  626. HLPMSG:    DB    CR,LF,'SET commands:',CR,LF
  627. ;
  628.     DB    CR,LF,'SET BAUD 300 <or> 1200'
  629. ;
  630.     DB    CR,LF,'SET PARITY EVEN[8] <or> ODD[8] <or> NONE'
  631.    IF NOT ANCHOR                 ; Anchor has no speaker or prog.wait
  632. ;
  633.         DB    CR,LF,'SET SPKR <OFF> or <ON> or <DEBUG>'
  634.         DB    CR,LF,'SET WAIT <30> or <60> or <90>'
  635.    ENDIF                         ; not Anchor    
  636. ;
  637.     DB    CR,LF,'SET DIAL <TOUCH> or <PULSE>'
  638. ;
  639.     DB    CR,LF,LF,'$'
  640. ;
  641. ; SET BAUD processor
  642. ;
  643. STBAUD:    MVI    C,BDPARS    ;function code
  644.     CALL    MEX        ;let MEX look up code
  645.     JC    SETERR        ;invalid code
  646.     CALL    SBAUD        ;no, try to set it
  647.     JC    SETERR        ;not-supported code
  648.         JMP     SETSHO          ;review parameters
  649. ;
  650. BDSHOW:    CALL    ILPRT        ;display baud
  651.     DB    'Baud rate: ',0
  652.     LDA    MSPEED
  653.     MVI    C,PRBAUD    ;use MEX routine
  654.     CALL    MEX
  655.         CALL    CRLF
  656.     RET
  657. ;
  658. ; SET PARITY processor
  659. ;
  660. STPAR:    LXI    D,PARTBL    ;lookup next input item in table
  661.     CALL    TSRCH
  662.     JC    SETERR          ;if not found, error
  663.     MOV    A,L             ;get parity code
  664.     STA    PARITY        ;store it 
  665.     LDA    MSPEED        ;get baud rate code 
  666.     CALL    SBAUD           ;set parity
  667.         JMP     SETSHO          ;review parameters
  668. ;
  669. PSHOW:    CALL    ILPRT           ;show parity
  670.     DB    'Parity:    ',0
  671.     LXI    H,PARFND        ;find proper message
  672.     LDA    PARITY          ;get parity value
  673.     MOV    B,A
  674. FNDP:    MOV    A,M             ;see if parity value matches
  675.     ORA    A               ;first see if zero
  676.     JZ    SETERR          ;should never get here
  677.     CMP    B               ;match?
  678.     INX    H               ;point to first letter of message
  679.     JZ    CDISP           ;matches, type message
  680. FNDNXT:    MOV    A,M
  681.     ORA    A        ;see if end of last message
  682.     INX    H
  683.     JP    FNDNXT        ;not finished
  684.     INX    H        ;increment past parity byte
  685.     JMP    FNDP
  686. ;
  687. ; PARITY argument table
  688. ; Format of the table is:  Starting at PARTBL, the name is
  689. ; given (ending with 80H bit set), then the one byte code
  690. ; for setting that parity.  The next byte duplicates the
  691. ; NEXT parity code (used in PSHOW).  The byte at PARFND
  692. ; duplicates the first parity code.
  693. ;
  694. PARFND:    DB    EVEN
  695. PARTBL:    DB    'EVE','N'+80H    ;even parity, 7 data bits
  696.     DB    EVEN,EVEN8
  697.     DB    'EVEN','8'+80H    ;even parity, 8 data bits
  698.     DB    EVEN8,ODD
  699.     DB    'OD','D'+80H    ; odd parity, 7 data bits
  700.     DB    ODD,ODD8
  701.     DB    'ODD','8'+80H    ; odd parity, 8 data bits
  702.     DB    ODD8,NONE
  703.     DB    'NON','E'+80H    ;  no parity, 8 data bits
  704.     DB    NONE,0
  705. ;
  706.     DB    0        ;<<== table terminator
  707. ;
  708. ;
  709. ;
  710.    IF NOT ANCHOR                ; Anchor does not have speaker
  711. ;
  712. ; SET SPKR processor
  713. ;
  714. STSPKR:    LXI    D,SPKTBL    ; lookup next input item in table
  715.     CALL    TSRCH
  716.     JC    SETERR        ; if not found, error
  717.     STA    SPBYTE+1    ; store the spkr command
  718.     CALL    NITMOD        ; (re)initialize modem
  719.     JMP    SETSHO        ; review parameters
  720. ;
  721. SPSHOW:    CALL    ILPRT        ; show spkr mode
  722.     DB    'Speaker:   ' ,0
  723.     LDA    SPBYTE+1    ; get spkr byte
  724.     CPI    '1'
  725.     JZ    SPONPT        ; spkr on part-time
  726.     CPI    '2'
  727.     JZ    SPON        ; spkr on continuously
  728. ;
  729. SPOFF:    CALL    ILPRT
  730.     DB    'OFF',0
  731.     RET
  732. ;
  733. SPONPT:    CALL    ILPRT
  734.     DB    'ON until connect',0
  735.     RET
  736. ;
  737. SPON:    CALL    ILPRT
  738.     DB    'ON always',0
  739.     RET
  740. ;
  741. SPKTBL:    DB    'OF','F'+80H    ; set spkr off
  742.     DB    '0',0
  743.     DB    'O','N'+80H    ; set spkr on 'til connect    
  744.     DB    '1',0
  745.     DB    'DEBU','G'+80H    ; set spkr on continuously
  746.     DB    '2',0
  747.      DB    0        ; <<=== table terminator
  748. ;
  749. ;
  750. ;
  751. ; SET WAIT processor
  752. ;
  753. STWAIT:    LXI    D,WAITBL    ; lookup next input item in table
  754.     CALL    TSRCH           ; search for parameter value
  755.     JC    SETERR        ; if not found, error
  756.     STA    WABYTE+5    ; store the wait msb value
  757.     MVI    A,'0'        ; fake lsbyte
  758.     STA    WABYTE+6    ; store the wait lsb value
  759.     CALL    NITMOD        ; (re)initialize modem
  760.     JMP    SETSHO        ; review parameters
  761. ;
  762. WASHOW:    CALL    ILPRT
  763.     DB    'Wait:      ',0
  764.     LDA    WABYTE+5
  765.     CALL    TYPE        ; show msb
  766.     LDA    WABYTE+6
  767.     CALL    TYPE        ; show lsb
  768.     CALL    ILPRT
  769.     DB    ' seconds for carrier',0
  770.     RET
  771. ;
  772. WAITBL:    DB    '3','0'+80H    ; "set wait 30"
  773.     DB    '3',0
  774.     DB    '6','0'+80H    ; "set wait 60"
  775.     DB    '6',0
  776.     DB    '9','0'+80H    ; "set wait 90"
  777.     DB    '9',0
  778.     DB    0        ; <<=== table terminator
  779. ;
  780.    ENDIF                        ;not Anchor
  781. ;
  782. ;
  783. ;
  784. ; SET DIAL processor
  785. ;
  786. STDIAL:    LXI    D,DIATBL    ; lookup next input item in table
  787.     CALL    TSRCH           ; search for parameter value
  788.     JC    SETERR        ; if not found, error
  789.     STA    TPULSE        ; store the dial command
  790.     JMP    SETSHO        ; review parameters
  791. ;
  792. DISHOW:    CALL    ILPRT        ; show dial mode
  793.     DB    'Dial:      ',0
  794.     LDA    TPULSE        ; get dial byte
  795.     CPI    'T'
  796.     JZ    TTONE        ; touch tone 
  797. ;
  798. PDIAL:    CALL    ILPRT
  799.     DB    'Pulse',0
  800.     RET
  801. ;
  802. TTONE:    CALL    ILPRT
  803.     DB    'Touch Tone',0
  804.     RET
  805. ;
  806. ; DIAL argument table
  807. ;
  808. DIATBL:    DB    'TOUC','H'+80H    ; touch tone
  809.     DB    'T',0
  810.     DB    'PULS','E'+80H    ; pulse dial
  811.     DB    'P',0
  812.     DB    0        ; <<=== table terminator
  813. ;
  814. ;
  815. ;  Print message ending with 80H bit set
  816. ;
  817. CDISP:    MOV    A,M        ;get character to print
  818.     INX    H        ;point to next character
  819.     PUSH    PSW        ;save 80H bit
  820.     ANI    7FH        ;strip 80H bit just in case
  821.     CALL    TYPE
  822.     POP    PSW
  823.     ORA    A
  824.     JM    CRLF        ;finished
  825.     JMP    CDISP
  826. ;
  827. ; Compare next input-stream item in table @DE; CY=1
  828. ; if not found, else HL=matched data item
  829. ;
  830. TSRCH:    MVI    C,LOOKUP    ;get function code
  831.     JMP    MEX        ;pass to MEX processor
  832. ;
  833. ; Print in-line message ... blows away C register
  834. ;
  835. ILPRT:    MVI    C,ILP        ;get function code
  836.     JMP    MEX        ;go do it
  837. ;
  838. ;
  839. ;------------------------------------------------------------
  840. ;
  841. ; End of Sanyo MBC-1000 MEX modem overlay
  842. ;
  843. ;------------------------------------------------------------
  844. ;
  845.     END