home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / cpm / mex / mexxapii.lbr / MXH-AP52.AQM / MXH-AP52.ASM
Assembly Source File  |  1986-12-08  |  22KB  |  769 lines

  1. ;    TITLE  'MEX Overlay for Apple ][ / SSC / Smartmodem'
  2. ;
  3. ;  MXH-AP52.ASM 
  4. ;
  5. REV    EQU    52           ; 01 Nov 1986
  6. ; This overlay is specific for the following hardware:
  7. ;
  8. ;    Apple ][ +/e  with PCPI Applicard
  9. ;    Apple Super Serial Card
  10. ;
  11. ;            - Jim Lill via "Sparrow" 716-377-1113
  12. ;------------------------------------------------------------------
  13. ; REVISION HISTORY:
  14. ;------+---------+----------------+--------------------------------
  15. ; Rev. |  Date   |     Author     |       Description
  16. ;------+---------+----------------+--------------------------------
  17. ; 5.2  |1 Nov 86 | Jim Lill       | -eliminated Modem specific section
  18. ;      |         |                |  requires use of Modem overlay
  19. ;      |         |                |  such as MXO-SM14 or MXM-2413
  20. ;      |         |                |  Seems to work better with MXM-2413
  21. ;------+---------+----------------+--------------------------------
  22. ; 5.1  |5 Apr 86 | Jim Lill       | -changed CLSMSG and EOSMSG
  23. ;      |         |                | -added INITBAUD equate for setting
  24. ;      |         |                |  MSPEED and baud in INITMOD
  25. ;------+---------+----------------+--------------------------------
  26. ; 5.0  |1 Apr 86 | Jim Lill       | created adaption, includes DCD
  27. ;      |         |                | and a spot for RND detect.
  28. ;------+---------+----------------+--------------------------------
  29. ; IMPORTANT NOTE:
  30. ;    This overlay is based on MXO-AP50.ASM by Henry Middlebrook
  31. ;    Refer to it for additional info. The changes in this overlay
  32. ;    could be easily adapted to other Middlebrook work like AP34
  33. ;    To find changes, search for "MEXplus"
  34. ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  35. ;            PORT OVERLAY SECTION
  36. ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  37. ;
  38. BELL        EQU    07H    ;bell
  39. CR        EQU    0DH    ;carriage return
  40. ESC        EQU    1BH    ;escape
  41. LF        EQU    0AH    ;linefeed
  42. TAB        EQU    09H    ;tab
  43. YES        EQU    0FFH
  44. NO        EQU    0
  45. ;
  46. ;----------------------------------------------------------------------
  47. ;    Apple Super Serial Card equates
  48. ;    -------------------------------
  49. ;
  50. SSCSLOT        EQU    2        ;Slot of Super Serial Card
  51. ;
  52. INITBAUD    EQU    5        ;Initial Baud Rate
  53.                     ; 0=110   5=1200
  54.                     ; 1=300   6=2400
  55.                     ; 2=450   7=4800
  56.                     ; 3=600   8=9600
  57.                     ; 4=710   9=19200
  58. ;
  59. MODDATP        EQU    0C088H + (SSCSLOT*10H)    ;data port of ACIA
  60. MODSTAP        EQU    0C089H + (SSCSLOT*10H)    ;status port of ACIA
  61. MODCTLP        EQU    0C08BH + (SSCSLOT*10H)    ;control port of ACIA
  62. MODCMDP        EQU    0C08AH + (SSCSLOT*10H)    ;command port of ACIA
  63. ;
  64. ;
  65. RDBYTE        EQU    0FFE0H    ;Read a Byte from Apple (A = BYTE)
  66. WRBYTE        EQU    0FFE3H    ;Write a Byte to Apple (C = BYTE)
  67. RDWORD        EQU    0FFE6H    ;Read 2 Bytes from Apple (DE = BYTES)
  68. WRWORD        EQU    0FFE9H    ;Write 2 Bytes to Apple (DE = BYTES)
  69. RDNBYTS        EQU    0FFECH    ;Read N Bytes (DE = COUNT, HL = BUFFER)
  70. WRNBYTS        EQU    0FFEFH    ;Write N Bytes (DE = COUNT, HL = BUFFER)
  71. ;
  72. PEEK1BYTE    EQU    6    ;Command to Peek 1 Byte in the Apple
  73. POKE1BYTE    EQU    7    ;Command to Poke 1 Byte to the Apple
  74. ;
  75. ; New DCD routine equate MEXplus
  76. ;
  77. CTSMSK        EQU    00100000B    ;mask to test for carrier
  78. ;
  79. ; Status bit equates for CCS serial port
  80. ;
  81. MDSNDB        EQU    10H
  82. MDSNDR        EQU    10H
  83. MDRCVB        EQU    08H
  84. MDRCVR        EQU    08H
  85. ;
  86. ; Equates for PSW (Parity, Stop Bit, Word Length) used by SSC ACIA
  87. ;  In these bytes the high nibble is the Word Length mask, the low
  88. ;  nibble is the Parity mask for the ACIA PSWFIX routine.
  89. ;
  90. P8N1        EQU    010H    ;8 NONE 1
  91. P7E1        EQU    036H    ;7 EVEN 1
  92. P7O1        EQU    032H    ;7 ODD 1
  93. P7N1        EQU    030H    ;7 NONE 1
  94. ;
  95. BRKMSK        EQU    0CH    ;mask byte for BREAK function
  96. DISCB        EQU    0AH    ;command byte for ACIA to drop DTR
  97. ;
  98. ;----------------------------------------------------------------------
  99. ;
  100. ;    MEX Service Processor Calls
  101. ;
  102. MEX    EQU    0D00H    ;address of the service processor
  103. INMDM    EQU    255    ;get char from port to A, CY=no more in 100 ms
  104. TIMER    EQU    254    ;delay 100ms * reg B
  105. TMDINP    EQU    253    ;B=# secs to wait for char, cy=no char
  106. CHEKCC    EQU    252    ;check for ^C from KBD, Z=present
  107. SNDRDY    EQU    251    ;test for modem-send ready
  108. RCVRDY    EQU    250    ;test for modem-receive ready
  109. SNDCHR    EQU    249    ;send a character to the modem (after sndrdy)
  110. RCVCHR    EQU    248    ;recv a char from modem (after rcvrdy)
  111. LOOKUP    EQU    247    ;table search: see CMDTBL comments for info
  112. PARSFN    EQU    246    ;parse filename from input stream
  113. BDPARS    EQU    245    ;parse baud-rate from input stream
  114. SBLANK    EQU    244    ;scan input stream to next non-blank
  115. EVALA    EQU    243    ;evaluate numeric from input stream
  116. LKAHED    EQU    242    ;get nxt char w/o removing from input
  117. GNC    EQU    241    ;get char from input, cy=1 if none
  118. ILP    EQU    240    ;inline print
  119. DECOUT    EQU    239    ;decimal output
  120. PRBAUD    EQU    238    ;print baud rate
  121. PRNTBL    EQU    237    ;print command table in columns (HL=addr)
  122. PRID    EQU    236    ;print MEX ID string on console
  123. ;
  124. CONOUT    EQU    2    ;simulated BDOS function 2: console char out
  125. PRINT    EQU    9    ;simulated BDOS function 9: print string
  126. INBUF    EQU    10    ;input buffer, same structure as BDOS 10
  127. ;
  128. ;
  129. ;======================================================================
  130. ;
  131.     ORG    100H    ;we begin
  132. ;
  133. ; changed jumps for MEXplus
  134. ;
  135.     DB    0C3H    ;flags a LOADable file (for 8080)
  136.     DS    2    ;MEX has a JMP START here    
  137. ;
  138. ; The following variables are located at the beginning of the program
  139. ; to facilitate modification without the need of re-assembly. They will
  140. ; be moved in MEX 2.0.
  141. ;
  142. PMODEM:    DB    YES    ;\ / These two locations are            103H
  143. SMODEM:    DB    NO    ;/ \ not referenced by MEX.            104H
  144. TPULSE:    DB    'T'    ;Tone/Pulse (used only in Smodem overlay)    105H
  145. CLOCK:    DB    70    ;70-72 valid range for PCPI               106H
  146. MSPEED:    DB    INITBAUD;sets display time for sending a file        107H
  147.             ;uses INITBAUD equate, changes during
  148.             ;use via PBAUD routine
  149. BYTDLY:    DB    1    ;default time to send character in        108H
  150.             ;terminal mode file transfer (0-9)
  151.             ;0=0 delay, 1=10 ms, 5=50 ms, 9=90 ms
  152. CRDLY:    DB    1    ;end-of-line delay in terminal            109H
  153.             ;mode file transfer for slow BBS systems
  154.             ;0=0 delay, 1=100 ms, 5=500 ms, 9=900 ms
  155. COLUMS:    DB    5    ;number of directory columns            10AH
  156. SETFL:    DB    YES    ;yes=user-defined SET command            10BH
  157. SCRTST:    DB    YES    ;yes=if home cursor and clear screen        10CH
  158.             ;routine at CLRSCRN
  159.     DB    0    ;was once ACKNAK, now spare            10DH
  160. BAKFLG:    DB    NO    ;yes=make .BAK file                10EH
  161. CRCDFL:    DB    YES    ;yes=default to CRC checking            10FH
  162.             ;no=default to Checksum checking
  163. TOGCRC:    DB    YES    ;yes=allow toggling of Checksum to CRC        110H
  164. CVTBS:    DB    NO    ;yes=convert backspace to rub            111H
  165. TOGLBK:    DB    YES    ;yes=allow toggling of bksp to rub        112H
  166. ADDLF:    DB    NO    ;no=no LF after CR to send file in        113H
  167.             ;terminal mode (added by remote echo)
  168. TOGLF:    DB    YES    ;yes=allow toggling of LF after CR        114H
  169. TRNLOG:    DB    NO    ;yes=allow transmission of logon        115H
  170.             ;write logon sequence at location LOGON
  171. SAVCCP:    DB    YES    ;yes=do not overwrite CCP            116H
  172. LOCNXT:    DB    NO    ;yes=local cmd if EXTCHR precedes        117H
  173.             ;no=not local cmd if EXTCHR precedes
  174. TOGLOC:    DB    YES    ;yes=allow toggling of LOCNXTCHR        118H
  175. LSTTST:    DB    YES    ;yes=allow toggling of printer on/off        119H
  176.             ;in terminal mode. Set to no if using
  177.             ;the printer port for the modem
  178. XOFTST:    DB    YES    ;yes=allow testing of XOFF from remote        11AH
  179.             ;while sending a file in terminal mode
  180. XONWT:    DB    NO    ;yes=wait for XON after sending CR while    11BH
  181.             ;transmitting a file in terminal mode    
  182. TOGXOF:    DB    YES    ;yes=allow toggling of XOFF testing        11CH
  183. IGNCTL:    DB    NO    ;yes=do not send control characters        11DH
  184.             ;above CTL-M to CRT in terminal mode
  185.             ;no=send any incoming CTL-char to CRT
  186. EXTRA1:    DB    0    ;for future expansion                11EH
  187. EXTRA2:    DB    0    ;for future expansion                11FH
  188. BRKCHR:    DB    '@'-40H    ;^@ = Send a 300 ms. break tone            120H
  189. NOCONN:    DB    'N'-40H    ;^N = Disconnect from phone line        121H
  190. LOGCHR:    DB    'L'-40H    ;^L = Send logon                122H
  191. LSTCHR:    DB    'P'-40H    ;^P = Toggle printer                123H
  192. UNSVCH:    DB    'R'-40H    ;^R = Close input text buffer            124H
  193. TRNCHR:    DB    'T'-40H    ;^T = Transmit file to remote            125H
  194. SAVCHR:    DB    'Y'-40H    ;^Y = Open input text buffer            126H
  195. EXTCHR:    DB    '^'-40H    ;^^ = Send next character            127H
  196. ;
  197. ; Equates used only by PMMI routines grouped together here.
  198. ;
  199. PRATE:    DB    125    ;125=20pps dialing, 250=10pps            128H
  200.     DB    0    ;not used                    129H
  201. ;
  202. ; Jump table accessed by MEX to write/read serial port
  203. ;
  204. IN$MODSTAP:    JMP    RD$MODSTAP     ;read ACIA status port        12AH
  205.         DS    7
  206. OUT$MODDATP:    JMP    WR$MODDATP    ;send character to ACIA        134H
  207.         DS    7
  208. IN$MODDATP:    JMP    RD$MODDATP    ;read character from ACIA    13EH
  209.         DS    7
  210. ;
  211. ; Bit-test routines.  These will be merged with the above
  212. ; routines in MEX 2.0 to provide a more reasonable format
  213. ;
  214. MASKR:        ANI    MDRCVB ! RET    ;bit to test for receive ready    148H
  215. TESTR:        CPI    MDRCVR ! RET    ;value of rcv. bit when ready    14BH
  216. MASKS:        ANI    MDSNDB ! RET    ;bit to test for send ready    14EH
  217. TESTS:        CPI    MDSNDR ! RET    ;value of send bit when ready    151H
  218. ;---------------------------------------------------------------------------
  219. ; MEXplus changes:
  220. ;  - was unused area. >>> MUST total 12bytes <<<
  221. ;  - now used for the Ringing and Carrier Detect jumps
  222. ;
  223. ; Note: There seems to be a conflict between other MXH overlays and
  224. ;       what is in the MexPlus Dist. Notes dated 2/20/86 regarding
  225. ;       the correct location of the two JMP. Other overlays inspected
  226. ;    have DCD at 154H and RNG at 157H. Notes say DCD at 157H and
  227. ;       RNG at 15AH. The following does work......
  228. ;
  229. DCDTEST:    JMP    DCDVEC        ;jump to carrier-detect routine 154H
  230. RNGTEST:    JMP    RNGVEC        ;jump to ring detect routine    157H
  231.                     ;
  232.                 DS    6        ;remainder of space           
  233. ;
  234. ;---------------------------------------------------------------------------
  235. ;
  236. LOGON:        DS    2        ;not used by MEX          160H
  237. DIALV:        DS     3        ;dial a digit in A (ref SMOVL)    162H
  238. DISCV:        JMP    DISCON        ;drops DTR to hang-up fast!    165H
  239. GOODBV:        JMP    GOODBYE        ;called before exit to CPM    168H
  240. INMODV:        JMP    INITMOD        ;go to user written routine    16BH
  241. NEWBDV:        JMP    PBAUD        ;changes baud with phone #    16EH
  242. NOPARV:        RET  !    NOP  !    NOP    ;set modem for no-parity     171H
  243. PARITV:        RET  !    NOP  !    NOP    ;set modem parity             174H
  244. SETUPV:        JMP    SETCMD        ;                177H
  245. SPMENV:        DS     3        ;not used by MEX        17AH
  246. VERSNV:        JMP    SYSVER        ;                17DH
  247. BREAKV:        JMP    SENDBRK        ;                180H
  248. ;
  249. ; The following jump vector provides the overlay with access to special
  250. ; routines in the main program (retained and supported in the main pro-
  251. ; gram for MDM overlay compatibility). These should not be modified by
  252. ; the overlay.
  253. ;
  254. ; Note that for MEX 2.0 compatibility, you should not try to use these
  255. ; routines, since this table will go away with MEX 2.0 (use the MEX
  256. ; service call processor instead).
  257. ;
  258. ILPRTV:        DS    3    ;replace with MEX function 9         183H
  259. INBUFV:        DS    3    ;replace with MEX functin 10        186H
  260. ILCMPV:        DS    3    ;replace with table lookup funct 247    189H
  261. INMDMV:        DS    3    ;replace with MEX function 255        18CH
  262. NXSCRV:        DS    3    ;not supported by MEX            18FH
  263. TIMERV:        DS    3    ;replace with MEX function 254        192H
  264. ;
  265. ; Clear/screen and clear/end-of-screen. Each routine must use the
  266. ; full 9 bytes alloted (may be padded with nulls).
  267. ;
  268. ;
  269. CLREOS:        LXI    D,EOSMSG    ;                195H
  270.         MVI    C,PRINT
  271.         CALL    MEX
  272.         RET            ;                19DH
  273. ;
  274. CLS:        LXI    D,CLSMSG    ;                19EH
  275.         MVI    C,PRINT
  276.         CALL    MEX
  277.         RET            ;                1A6H
  278. ;
  279. ;
  280. ;        *** END OF FIXED FORMAT AREA ***
  281. ;--------------------------------------------------------------------------
  282. ; Make sure MEXplus has all of its' reserved area..
  283. ;
  284.         ORG    0200H        
  285.  
  286. ;--------------------------------------------------------------------------
  287. ;        Overlay  Fixed  Messages  Area
  288. ;
  289. ; these codes changed to match PCPI CONFIGSV values for Televideo 950
  290. ;
  291. ;
  292. EOSMSG:    DB    ESC,89,0,0,'$'        ;clear to end of screen message
  293. ;
  294. CLSMSG:    DB    ESC,42,0,0,'$'        ;clear screen message
  295. ;
  296. VERMSG:    DB    CR,LF,'MEX for Apple ][ / PCPI / SSC, '
  297.     DB    'Overlay Version: ',REV/10+'0','.'
  298.     DB    REV MOD 10+'0'
  299.     DB    CR,LF,LF,'$'
  300.     DB    0,'Overlay by Middlebrook/Lill',0,'$'
  301. ;
  302. ;----------------------------------------------------------------------
  303. ; These routines are specific to the Apple ][+ with Applicard.  The
  304. ; routines read modem hardware (Apple Super Serial Card ACIA) directly
  305. ; from the Applicard.
  306. ;
  307. ; Read the Command Port of ACIA
  308. ;
  309. RD$MODCMDP:    PUSH    D
  310.         LXI    D,MODCMDP
  311.         CALL    PEEK
  312.         POP    D
  313.         RET
  314. ;
  315. ; Write to the Command Port of ACIA
  316. ;
  317. WR$MODCMDP:    PUSH    D
  318.         LXI    D,MODCMDP
  319.         CALL    POKE
  320.         POP    D
  321.         RET
  322. ;
  323. ; Read the Status Port of the ACIA
  324. ;
  325. RD$MODSTAP:    PUSH    D
  326.         LXI    D,MODSTAP
  327.         CALL    PEEK
  328.         POP    D
  329.         RET
  330. ;
  331. ; Write to the Control Port of the ACIA
  332. ;
  333. WR$MODCTLP:    PUSH    D
  334.         LXI    D,MODCTLP
  335.         CALL    POKE
  336.         POP    D
  337.         RET
  338. ;
  339. ; Read the Control Port of the ACIA
  340. ;
  341. RD$MODCTLP:    PUSH    D
  342.         LXI    D,MODCTLP
  343.         CALL    PEEK
  344.         POP    D
  345.         RET
  346. ;
  347. ; Read Data Port of ACIA
  348. ;
  349. RD$MODDATP:    PUSH    D
  350.         LXI    D,MODDATP
  351.         CALL    PEEK
  352.         POP    D
  353.         RET
  354. ;
  355. ; Write to the Serial Data Port of the ACIA
  356. ;
  357. WR$MODDATP:    PUSH    D
  358.         LXI    D,MODDATP
  359.         CALL    POKE
  360.         POP    D
  361.         RET
  362. ;
  363. ; Peek at 1 byte from Apple 6502 address space
  364. ; ENTRY: DE = Address in Apple
  365. ; EXIT:    A = Data
  366. ;
  367. PEEK:    PUSH    B
  368.     MVI    C,PEEK1BYTE
  369.     CALL    WRBYTE
  370.     CALL    WRWORD
  371.     CALL    RDBYTE
  372.     POP    B
  373.     RET
  374. ;
  375. ; Poke 1 byte to Apple 6502 address space
  376. ; ENTRY: DE = Address in Apple
  377. ; EXIT:    A = Data
  378. ;
  379. POKE:    PUSH    B
  380.     MOV    B,A
  381.     MVI    C,POKE1BYTE
  382.     CALL    WRBYTE
  383.     CALL    WRWORD
  384.     MOV    C,B
  385.     CALL    WRBYTE
  386.     POP    B
  387.     RET
  388. ;
  389. ;----------------------------------------------------------------------
  390. ; The new stuff for MEXplus
  391. ;
  392. ; Data Carrier Detect Routine
  393. ;
  394. DCDVEC:        CALL    RD$MODSTAP    ;read SSC status port
  395.         ANI    CTSMSK        ;isolate carrier bit
  396.         JNZ    NOCARR        ;0=carrier detected
  397.         CMA            ;make it 0ffh
  398.         RET            ;
  399. NOCARR:        XRA    A        ;make it 0
  400.         RET             ;
  401. ;
  402. ; Ring Detect Routine
  403. ;
  404. RNGVEC:        JMP    DCDVEC        ;overlay doesn't know
  405. ;
  406. ;----------------------------------------------------------------------
  407. ;
  408. ; This routine sends a timed Break to modem from SSC card.
  409. ;
  410. SENDBRK:CALL    RD$MODCMDP    ;get current command status
  411.     STA    CMDSV
  412.     ORI    BRKMSK        ;mask to make ACIA send BREAK
  413.     CALL    WR$MODCMDP    ;send command
  414.     MVI    B,5
  415.     MVI    C,TIMER        ;wait 500 msecs
  416.     CALL    MEX
  417.     LDA    CMDSV        ;get old command state
  418.     CALL    WR$MODCMDP    ;put it back
  419.     RET
  420. ;
  421. ;.....
  422. ;
  423. ; You can add your own routine here to set DTR low and/or send a break
  424. ; tone to disconnect when exiting to CPM.
  425. ;
  426. GOODBYE:    RET        ;just return so exit to system
  427.                 ;will not cause disconnect
  428. ;.....
  429. ;
  430. ; The following is used to initialize the SSC card for eight data bits,
  431. ; no parity, one stop bit, and baud=INITBAUD     
  432. ;
  433. INITMOD:MVI    A,0BH        ;default No Parity byte for ACIA
  434.     STA    PARSV        ;save it
  435.     MVI    A,10H        ;default 8 Data, 1 Stop Bits for ACIA
  436.     STA    WRDSV        ;save it
  437.     MVI    A,INITBAUD      ;set to initial baud equate
  438.     JMP    PBAUD        ;let PBAUD setup ACIA
  439. ;
  440. ; This is the secondary entry used by the overlay to set baud,
  441. ; parity, and stop bit parameters of ACIA.
  442. ;
  443. INITMOD1:
  444.     LDA    PARSV        ;get current parity byte
  445.     ORI    0BH        ;enable DTR, RECV IRQ, and RTS
  446.     STA    CMDSV        ;save byte for other uses
  447.     CALL    WR$MODCMDP    ;send to command port
  448.     PUSH    H
  449.     LXI    H,BAUDSV    ;get address of current baud byte
  450.     LDA    WRDSV        ;get current word length byte
  451.     ORA    M        ;put 'em together
  452.     STA    CTLSV        ;...and save for other uses
  453.     POP    H
  454.     CALL    WR$MODCTLP    ;now send to control port
  455.     RET
  456. ;
  457. CMDSV:    DB    0        ;temporary storage
  458. CTLSV:    DB    0        ;temporary storage
  459. ;
  460. ;.....
  461. ;
  462. ; This routine drops DTR to force modem to disconnect.  Does NOT do
  463. ; any initialization.
  464. ;
  465. DISCON:    CALL    RD$MODCMDP    ;get current command status
  466.     STA    CMDSV        ;save it
  467.     MVI    A,DISCB        ;get disconnect byte (drops DTR)
  468.     CALL    WR$MODCMDP    ;send to ACIA
  469.     MVI    B,10
  470.     MVI    C,TIMER        ;wait 1 second
  471.     CALL    MEX
  472.     LDA    CMDSV        ;get back command status
  473.     CALL    WR$MODCMDP    ;put it back in ACIA register
  474.     MVI    B,10
  475.     MVI    C,TIMER        ;wait another second
  476.     CALL    MEX
  477.     RET            ;back to program
  478. ;
  479. ;.....
  480. ;
  481. ; This routine changes the modem baud rate with phone list entry
  482. ;
  483. ; Set baud-rate code in A (if supported by your modem overlay).  PMMI
  484. ; supports only five rates, which are validated here. NOTE: this routine
  485. ; (ie, the one vectored through NEWBDV) should update MSPEED with the
  486. ; passed code, but ONLY if that rate is supported by the hardware.
  487. ;
  488. PBAUD:    PUSH    H        ;don't alter anybody
  489.     PUSH    D
  490.     PUSH    B
  491.     MOV    E,A        ;code to DE
  492.     MVI    D,0
  493.     LXI    H,BAUDTB    ;offset into table
  494.     DAD    D
  495.     MOV    A,M        ;fetch code
  496.     ORA    A        ;0 means unsupported code
  497.     JZ    PBEXIT        ;exit if so
  498.     STA    BAUDSV         ;good rate, save it for INITMOD1
  499.     CALL    INITMOD1    ;set baud (and PSW)
  500.     MOV    A,E        ;get speed code back
  501.     STA    MSPEED        ;make it current
  502.     JMP    PBEXIT + 1    ;jump error flag set
  503. PBEXIT:    STC            ;set return error for STBAUD caller
  504.     POP    B        ;all done
  505.     POP    D
  506.     POP    H
  507.     RET
  508. ;
  509. ; Table of baud rate parameters for supported rates
  510. ;
  511. BAUDTB:    DB    03H,06H,0,07H,0        ;110,300,450,610,710
  512.     DB    08H,0AH,0CH,0EH,0FH    ;1200,2400,4800,9600,19200
  513. BAUDSV: DB    06H            ;current baud byte
  514. ;
  515. ;.....
  516. ;
  517. ; Sign-on message
  518. ;
  519. SYSVER:    LXI    D,VERMSG
  520.     MVI    C,PRINT
  521.     CALL    MEX
  522.     RET
  523. ;
  524. ;.....
  525. ;
  526. ; Newline on console
  527. ;
  528. CRLF:    MVI    A,CR
  529.     CALL    TYPE
  530.     MVI    A,LF        ;fall into TYPE
  531. ;
  532. ; type char in A on console
  533. ;
  534. TYPE:    PUSH    H        ;save 'em
  535.     PUSH    D
  536.     PUSH    B
  537.     MOV    E,A        ;align output character
  538.     MVI    C,CONOUT    ;print via MEX
  539.     CALL    MEX
  540.     POP    B
  541.     POP    D
  542.     POP    H
  543.     RET
  544. ;
  545. ;----------------------------------------------------------------------
  546. ;
  547. ; The remainder of this overlay implements a very versatile SET command
  548. ; -- if you prefer not to write a SET for your modem, you may delete the
  549. ; code from here to the END statement. Control is passed here after
  550. ; MEX parses a SET command.
  551. ;
  552. ;
  553. SETCMD:    MVI    C,SBLANK    ;any arguments?
  554.     CALL    MEX
  555.     JC    SETSHO        ;if not, go print out values
  556.     LXI    D,CMDTBL    ;parse command
  557.     CALL    TSRCH        ;from table
  558.     PUSH    H        ;any address on stack
  559.     RNC            ;if we have one, execute it
  560.     POP    H        ;nope, fix stack
  561. SETERR:    LXI    D,SETEMS    ;print error
  562.     MVI    C,PRINT
  563.     CALL    MEX
  564.     RET
  565. ;
  566. SETEMS:    DB    CR,LF,'SET command error',CR,LF,'$'
  567. ;
  568. ; SET command table ... note that tables are constructed of command-
  569. ; name (terminated by high bit=1) followed by word-data-value returned
  570. ; in HL by MEX service processor LOOKUP.  Table must be terminated by
  571. ; a binary zero.
  572. ;
  573. ; Note that LOOKUP attempts to find the next item in the input stream
  574. ; in the table passed to it in HL ... if found, the table data item is
  575. ; returned in HL; if not found, LOOKUP returns carry set.
  576. ;
  577. CMDTBL:    DB    '?'+80H            ;"set ?"
  578.     DW    STHELP
  579.     DB    'BAU','D'+80H        ;"set baud"
  580.     DW    STBAUD
  581.     DB    'PS','W'+80H        ;"set PSW"
  582.     DW    STPSW
  583.     DB    'TON','E'+80H        ;'set TONE/PULSE byte to 'T'
  584.     DW    STTONE
  585.     DB    'PULS','E'+80H        ;'set TONE/PULSE byte to 'P'
  586.     DW    STPULSE
  587.     DB    0            ;<<=== table terminator
  588. ;
  589. ; SET <no-args>: print current statistics
  590. ;
  591. SETSHO:    LXI    H,SHOTBL    ;get table of SHOW subroutines
  592. SETSLP:    MOV    E,M        ;get table address
  593.     INX    H
  594.     MOV    D,M
  595.     INX    H
  596.     MOV    A,D        ;end of table?
  597.     ORA    E
  598.     RZ            ;exit if so
  599.     PUSH    H        ;save table pointer
  600.     XCHG            ;adrs to HL
  601.     CALL    GOHL        ;do it
  602.     CALL    CRLF        ;print newline
  603.     MVI    C,CHEKCC    ;check for console abort
  604.     CALL    MEX
  605.     POP    H        ;it's done
  606.     JNZ    SETSLP        ;continue if no abort
  607.     RET
  608. ;
  609. GOHL:    PCHL
  610. ;
  611. ; Table of SHOW subroutines
  612. ;
  613. SHOTBL:    
  614.     DW    BDSHOW        ;displays current baud
  615.     DW    PSWSHOW        ;displays current PSW
  616.     DW    TPSHOW        ;displays current TPULSE byte (0105H)
  617.     DW    CRLF
  618.     DW    0        ;<<== table terminator
  619. ;
  620. ; SET ?  processor
  621. ;
  622. STHELP:    CALL     CLS            ;clear screen
  623.     LXI    D,HLPMSG
  624.     MVI    C,PRINT
  625.     CALL    MEX
  626.     RET
  627. ;
  628. ; The help message
  629. ;
  630. HLPMSG:    DB    CR,LF,'SET Commands available are:',CR,LF,LF
  631.     DB    'SET BAUD  <110, 300, 600, 1200, 2400, 4800,'
  632.     DB    ' 9600, or 19200>',CR,LF
  633.     DB    'SET PSW   <8N1, 7E1, 7O1, or 7N1> -- Word Length,'
  634.     DB    ' Parity, Stop Bits',CR,LF
  635.     DB    'SET TONE  (Sets flag for TONE  dialing)',CR,LF
  636.     DB    'SET PULSE (Sets flag for PULSE dialing)'
  637.     DB    CR,LF,LF,'$'
  638. ;
  639. ; SET BAUD processor
  640. ;
  641. STBAUD:    MVI    C,BDPARS    ;function code
  642.     CALL    MEX    
  643.     JC    SETERR        ;invalid code
  644.     CALL    PBAUD        ;try to set it
  645.     JC    SETERR        ;unsupported code
  646. BDSHOW:    CALL    ILPRT        ;display baud
  647.     DB    'Baud rate:',TAB,' ',0
  648.     LDA    MSPEED
  649.     MVI    C,PRBAUD    ;use MEX routine
  650.     CALL    MEX
  651.     RET
  652. ;
  653. ; SET PSW processor
  654. ;
  655. STPSW:    MVI    C,SBLANK
  656.     CALL    MEX
  657.     JC    SETERR        ;SET PSW should have had argument
  658.     LXI    D,PSWTBL    ;look for PSW match in table
  659.     CALL    TSRCH
  660.     JC    SETERR        ;not there, so report error
  661.     CALL    FIXPSW        ;routine to set PARSV and WRDSV
  662.     CALL    INITMOD1    ;now fix ACIA registers
  663. ;
  664. PSWSHOW:
  665.     CALL    ILPRT
  666.     DB    'PSW setting:',TAB,' ',0
  667.     LDA    PSWSET
  668.     CPI    P8N1
  669.     JNZ    PSW1
  670.     CALL    ILPRT
  671.     DB    '8N1',0
  672.     RET
  673. PSW1:    CPI    P7E1
  674.     JNZ    PSW2
  675.     CALL    ILPRT
  676.     DB    '7E1',0
  677.     RET
  678. PSW2:    CPI    P7O1
  679.     JNZ    PSW3
  680.     CALL    ILPRT
  681.     DB    '7O1',0
  682.     RET
  683. PSW3:    CPI    P7N1
  684.     JNZ    PSW4
  685.     CALL    ILPRT
  686.     DB    '7N1',0
  687.     RET
  688. PSW4:    CALL    ILPRT
  689.     DB    '<< ERROR >>',0
  690.     RET
  691. ;
  692. ;
  693. PSWSET:    DB    010H        ;storage and default (8N1)
  694. PARSV:    DB    0BH        ;storage and default (no parity)
  695. WRDSV:    DB    010H        ;storage and default (8 data, 1 stop bits)
  696. ;
  697. FIXPSW:    MOV    A,L        ;PSW byte from table
  698.     STA    PSWSET        ;save it
  699.     ANI    0F0H        ;mask for word length bits
  700.     STA    WRDSV        ;put in storage
  701.     LDA    PSWSET        ;get back PSW byte
  702.     ANI    0FH        ;mask for parity bits
  703.     RLC            ;first shift into upper nibble..
  704.     RLC            ;...away we go...
  705.     RLC            ;.....and go...
  706.     RLC            ;......and done
  707.     ORI    0BH        ;mask needed for ACIA command register
  708.     STA    PARSV        ;put in storage
  709.     RET
  710. ;
  711. PSWTBL:    DB    '8N','1'+80H
  712.     DW    P8N1        ;filled in with equ's
  713.     DB    '7E','1'+80H
  714.     DW    P7E1        ; - ditto -
  715.     DB    '7O','1'+80H
  716.     DW    P7O1        ; - ditto -
  717.     DB    '7N','1'+80H
  718.     DW    P7N1        ; - ditto -
  719.     DB    0        ;<<==== table terminator
  720. ;
  721. ;.....
  722. ;
  723. ; These routines set TPULSE flag at 0105H to either 'T' or 'P' so that
  724. ; MODEM (specifically MXO-SM13.ASM) overlay will dial in TONE or PULSE
  725. ; mode.  The settings are mutually exclusive.
  726. ;
  727. STTONE:    MVI    A,'T'        ;get T flag
  728.     STA    TPULSE        ;put into proper place
  729.     JMP    TPSHOW        ;display dial mode
  730. ;
  731. STPULSE:
  732.     MVI    A,'P'        ;get P flag
  733.     STA    TPULSE
  734. ;
  735. TPSHOW:    CALL    ILPRT
  736.     DB    'Dial Mode:',TAB,' ',0
  737.     LDA    TPULSE
  738.     CPI    'T'
  739.     JNZ    TP1
  740.     CALL    ILPRT
  741.     DB    'TONE',0
  742.     RET
  743. TP1:    CPI    'P'
  744.     JNZ    TP2
  745.     CALL    ILPRT
  746.     DB    'PULSE',0
  747.     RET
  748. TP2:    CALL    ILPRT
  749.     DB    '<< ERROR >>',0
  750.     RET
  751. ;
  752. ;......
  753. ;
  754. ; Compare next input-stream item in table @DE; CY=1 if not found,
  755. ; else HL = matched data item
  756. ;
  757. TSRCH:    MVI    C,LOOKUP    ;get function code
  758.     JMP    MEX        ;pass to MEX processor
  759. ;
  760. ; Print in-line message ... blows away C register
  761. ;
  762. ILPRT:    MVI    C,ILP        ;get function code
  763.     JMP    MEX        ;go do it
  764. ;
  765. ;
  766. ;    >>>>   End of MXH-APnn   <<<<
  767.  
  768.