home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / CPM / MEX / MXO-PX8.ASM < prev    next >
Assembly Source File  |  2000-06-30  |  32KB  |  1,232 lines

  1.     Title    'MEX overlay for Epson PX-8 version 1.0'
  2. ;
  3. ;
  4. ; (delete above title line if not assembling with MAC)
  5. ;
  6. ;
  7. REV    EQU    10        ;overlay revision level
  8. ;
  9. ; MEX overlay for Epson PX-8 with MFU, Direct Connect modem, or
  10. ; external modem. Support is provided for an external dialing overlay
  11. ; such as MXO-SM. For details see MXO-PX8.DOC.
  12. ;
  13. ; Written 3/10/85 by David B. Kozinn
  14. ;
  15. ;    Copyright (C) 1985 by David B. Kozinn 
  16. ; This program (in source or object code form) may be copied and distributed
  17. ; for non-commercial purposes. Sale of this program is forbidden without
  18. ; written consent of the author.
  19. ;
  20. ; The author can be contacted on CompuServe [76703,565] via Easyplex, or
  21. ; (preferably) in CP-MIG (PCS-47) or EpsOnline (PCS-19). 
  22. ;
  23. ; PLEASE READ THE FOLLOWING IF YOU INTEND TO MODIFY THIS OVERLAY:
  24. ; ---------------------------------------------------------------
  25. ; Much of the commentary has been removed in order to save space. For
  26. ; complete documentation of how an overlay is structured, see the original
  27. ; overlay, MXO-PM.ASM, written by Ron Fowler. Please be sure to read the
  28. ; comments in that overlay if you intend to change this one.
  29. ;
  30. ;    Version    Date    Changes
  31. ;    ------- -------    ------- 
  32. ;      1.0    850310    First general release version    
  33. ;------------------------------------------------------------
  34. ;
  35. ; Misc equates
  36. ;
  37. NO    EQU    0
  38. YES    EQU    (NOT NO) AND 0FFH
  39. TPA    EQU    100H
  40. CR    EQU    13
  41. LF    EQU    10
  42. TAB    EQU    9
  43. BELL    EQU    7
  44. ESC    EQU    01BH
  45. CUROFF    EQU    032H
  46. CURON    EQU    033H
  47. XON    EQU    011H
  48. XOFF    EQU    013H
  49. ;
  50. ; PX-8 port definitions
  51. ;
  52. MCTLR2    EQU    002H        ;Misc control signals (output)
  53. CCR    EQU    00DH        ;8251 command port
  54. DCRREG    EQU    084H        ;Modem tone dialer control port (output)
  55. OCR    EQU    085H        ;Modem control register (output)
  56. STR    EQU    086H        ;Modem status register (input)
  57. OMR    EQU    087H        ;Modem port setup (output)
  58. ;
  59. ; PX-8 Special locations (see code for use)
  60. ;
  61. WBLOC    EQU    0EC03H        ;BIOS call Warm Boot location
  62. DRSDAT    EQU    0F00FH        ;Default RS-232 data
  63. CTLR1    EQU    0F0B0H        ;CTLR1 register value
  64. CTLR2    EQU    0F0B2H        ;CTLR2 register value
  65. RSMODE    EQU    0F6D0H        ;8251 Mode byte location
  66. RSCMD    EQU    0F6D1H        ;8251 Command byte location
  67. RSOPN    EQU    0F2C8H        ;RS-232 open flag (00=Open)
  68. SLVFLG    EQU    0F358H        ;Slave cpu (6301) flag
  69. INTBUF    EQU    0FB90H        ;Internal rs232 buffer
  70. INTBUFL    EQU    0160H        ;Internal buffer length
  71. ;
  72. ;  bit definitions
  73. ;
  74. MDMINIT    EQU    089H        ;8251 initialization string
  75. BRKBIT    EQU    008H        ;8251 bit to turn break on
  76. MDRCVB    EQU    001H        ;modem receive bits
  77. MDRCVR    EQU    001H        ;modem recieve ready
  78. MDSNDB    EQU    002H        ;modem send bits
  79. MDSNDR    EQU    002H        ;modem recieve ready
  80. USEINT    EQU    020H        ;set to 0, send this to CTLR2 to use int.
  81. DCD    EQU    008H        ;Use with RSIOX CTLIN
  82. ;
  83. ;  bit definitions for OCR
  84. ;
  85. OHC    EQU    001H        ;off hook
  86. HSC    EQU    002H        ;handset control
  87. MON    EQU    004H        ;enable speaker
  88. TXC    EQU    008H        ;transmit carrier
  89. ANS    EQU    010H        ;Answer mode 
  90. TEST    EQU    020H        ;Test function
  91. PWR    EQU    040H        ;Modem Power
  92. CCT    EQU    080H        ;connect to phone lne
  93. ;
  94. ;  bit definitions for STR
  95. ;
  96. BDS    EQU    001H        ;Bell Detect Signal. 0 if ringing
  97. CTSMSK    EQU    004H        ;Clear to send. (carrier det) =0 if clear
  98. MII    EQU    080H        ;Modem Installation Indicator 0=installed
  99. ;
  100. ;    
  101. ; Special BIOS call locations
  102. ;
  103. CONIN    EQU    WBLOC+006H    ;Direct console input
  104. CONOUT    EQU    WBLOC+009H    ;Direct console output
  105. RSOPEN    EQU    WBLOC+039H    ;Open RS-232 port
  106. RSCLOSE    EQU    WBLOC+03CH    ;Close RS-232  port
  107. RSINST    EQU    WBLOC+03FH    ;Check for input
  108. RSOUTST    EQU    WBLOC+042H    ;Check for output
  109. RSIN    EQU    WBLOC+045H    ;Get a character
  110. RSOUT    EQU    WBLOC+048H    ;Send a character
  111. RSIOX    EQU    WBLOC+051H    ;Special RS-232 calls
  112. SLAVE    EQU    WBLOC+072H    ;Use slave CPU
  113. ;
  114. ; Equates for use with RSIOX
  115. ;
  116. OPNIOX    EQU    010H        ;Open using RSIOX
  117. CLSIOX    EQU    020H        ;Close using RSIOX
  118. INSTS    EQU    030H        ;Check for data in recieve buffer
  119. CTLIN    EQU    070H        ;Check carrier & DSR
  120. ;
  121. ; Mex locations
  122. ;
  123. QUEUE    EQU    00D51H        ;Queued I/O variable
  124. MODE    EQU    00D54H        ;Terminal mode byte (01 = in terminal mode)
  125. SMART    EQU    00B00H        ;Entry point for smart modem overlay
  126. ;
  127. ; Other equates
  128. ;
  129. WTCTS    EQU    150        ;How long to wait for carrier. 150=30 seconds
  130. ;
  131. ; MEX service processor stuff 
  132. ;
  133. MEX    EQU    0D00H        ;address of the service processor
  134. INMDM    EQU    255        ;get char from port to A, CY=no more in 100 ms
  135. TIMER    EQU    254        ;delay 100ms * reg B
  136. TMDINP    EQU    253        ;B=# secs to wait for char, cy=no char
  137. CHEKCC    EQU    252        ;check for ^C from KBD, Z=present
  138. SNDRDY    EQU    251        ;test for modem-send ready
  139. RCVRDY    EQU    250        ;test for modem-receive ready
  140. SNDCHR    EQU    249        ;send a character to the modem (after sndrdy)
  141. RCVCHR    EQU    248        ;recv a char from modem (after rcvrdy)
  142. LOOKUP    EQU    247        ;table search: see CMDTBL comments for info
  143. PARSFN    EQU    246        ;parse filename from input stream
  144. BDPARS    EQU    245        ;parse baud-rate from input stream
  145. SBLANK    EQU    244        ;scan input stream to next non-blank
  146. EVALA    EQU    243        ;evaluate numeric from input stream
  147. LKAHED    EQU    242        ;get nxt char w/o removing from input
  148. GNC    EQU    241        ;get char from input, cy=1 if none
  149. ILP    EQU    240        ;inline print
  150. DECOUT    EQU    239        ;decimal output
  151. PRBAUD    EQU    238        ;print baud rate
  152. ;
  153. ;
  154. PRINT    EQU    9        ;simulated BDOS function 9: print string
  155. INBUF    EQU    10        ;input buffer, same structure as BDOS 10
  156. ;
  157.     ORG    SMART        ;Put code in in case he calls smartmodem
  158.     CPI    255        ;without installing the overlay first
  159.     RNZ            ;Only do it once, at the end
  160.     CALL    ILPRT
  161.     DB    '** You have not installed a dialing overlay **'
  162.     DB    BELL,CR,LF,0
  163.     XRA    A        ;Set zero flag
  164.     MVI    A,3        ;Tell him dialing has been aborted
  165.     RET
  166.  
  167.     ORG    QUEUE        ;Set to Queued I/O flag location
  168.     DB    0        ;Don't allow queued I/O (it interferes
  169.                 ;with the stuff we're doing)
  170.  
  171.     ORG    TPA        ;we begin
  172. ;
  173. ;
  174.     DS    3        ;MEX has a JMP START here
  175. ;
  176. ; The following variables are located at the beginning of the program
  177. ; to facilitate modification without the need of re-assembly. They will
  178. ; be moved in MEX 2.0.
  179. ;
  180. PMODEM:    DB    NO        ;yes=PMMI modem \ / These 2 locations are not
  181. SMODEM:    DB    NO        ;yes=Smartmodem / \ referenced by MEX
  182. TPULSE:    DB    'T'        ;T=touch, P=pulse (not referenced by MEX)
  183. CLOCK:    DB    20        ;clock speed x .1, up to 25.5 mhz.
  184. MSPEED:    DB    1        ;sets display time for sending a file
  185.                 ;0=110    1=300  2=450  3=600  4=710
  186.                 ;5=1200 6=2400 7=4800 8=9600 9=19200
  187. BYTDLY:    DB    0        ;default time to send character in
  188.                 ;terminal mode file transfer (0-9)
  189.                 ;0=0 delay, 1=10 ms, 5=50 ms, 9=90 ms
  190. CRDLY:    DB    0        ;end-of-line delay after CRLF in terminal
  191.                 ;mode file transfer for slow BBS systems
  192.                 ;0=0 delay, 1=100 ms, 5=500 ms, 9=900 ms
  193. COLUMS:    DB    5        ;number of directory columns
  194. SETFL:    DB    YES        ;yes=user-defined SET command
  195. SCRTST:    DB    YES        ;yes=if home cursor and clear screen
  196.                 ;routine at CLRSCRN
  197.     DB    0        ;was once ACKNAK, now spare
  198. BAKFLG:    DB    NO        ;yes=make .BAK file
  199. CRCDFL:    DB    YES        ;yes=default to CRC checking
  200.                 ;no=default to Checksum checking
  201. TOGCRC:    DB    YES        ;yes=allow toggling of Checksum to CRC
  202. CVTBS:    DB    NO        ;yes=convert backspace to rub
  203. TOGLBK:    DB    YES        ;yes=allow toggling of bksp to rub
  204. ADDLF:    DB    NO        ;no=no LF after CR to send file in
  205.                 ;terminal mode (added by remote echo)
  206. TOGLF:    DB    YES        ;yes=allow toggling of LF after CR
  207. TRNLOG:    DB    NO        ;yes=allow transmission of logon
  208.                 ;write logon sequence at location LOGON
  209. SAVCCP:    DB    YES        ;yes=do not overwrite CCP
  210. LOCNXT:    DB    NO        ;yes=local cmd if EXTCHR precedes
  211.                 ;no=not local cmd if EXTCHR precedes
  212. TOGLOC:    DB    YES        ;yes=allow toggling of LOCNXTCHR
  213. LSTTST:    DB    YES        ;yes=allow toggling of printer on/off
  214.                 ;in terminal mode. Set to no if using
  215.                 ;the printer port for the modem
  216. XOFTST:    DB    YES        ;yes=allow testing of XOFF from remote
  217.                 ;while sending a file in terminal mode
  218. XONWT:    DB    NO        ;yes=wait for XON after sending CR while
  219.                 ;transmitting a file in terminal mode    
  220. TOGXOF:    DB    YES        ;yes=allow toggling of XOFF testing
  221. IGNCTL:    DB    NO        ;yes=do not send control characters
  222.                 ;above CTL-M to CRT in terminal mode
  223.                 ;no=send any incoming CTL-char to CRT
  224. EXTRA1:    DB    0        ;for future expansion
  225. EXTRA2:    DB    0        ;for future expansion
  226. BRKCHR:    DB    '@'-40H        ;^@ = Send a 300 ms. break tone
  227. NOCONN:    DB    'N'-40H        ;^N = Disconnect from phone line
  228. LOGCHR:    DB    'L'-40H        ;^L = Send logon
  229. LSTCHR:    DB    'P'-40H        ;^P = Toggle printer
  230. UNSVCH:    DB    'R'-40H        ;^R = Close input text buffer
  231. TRNCHR:    DB    'T'-40H        ;^T = Transmit file to remote
  232. SAVCHR:    DB    'Y'-40H        ;^Y = Open input text buffer
  233. EXTCHR:    DB    '^'-40H        ;^^ = Send next character
  234. ;
  235. ; The next two are for PMMI, we don't use them, but they have to hang
  236. ; around anyway.
  237. ;
  238.     DB    250
  239.     DB    0
  240. ;
  241. ; Low-level modem I/O routines
  242. ;
  243. INCTL1:    JMP    MODSTAT        ;in modem control port
  244.     DB    0,0,0,0,0,0,0    ;spares
  245. ;
  246. OTDATA:    JMP    MODOUT        ;out modem data port
  247.     DB    0,0,0,0,0,0,0    ;spares
  248. ;
  249. INPORT:    JMP    MODIN        ;in modem data port
  250.     DB    0,0,0,0,0,0,0    ;spares
  251. ;
  252. ; Bit-test routines.  These will be merged with the above
  253. ; routines in MEX 2.0 to provide a more reasonable format
  254. ;
  255. MASKR:    ANI MDRCVB ! RET    ;bit to test for receive ready
  256. TESTR:    CPI MDRCVR ! RET    ;value of receive bit when ready
  257. MASKS:    ANI MDSNDB ! RET    ;bit to test for send ready
  258. TESTS:    CPI MDSNDR ! RET    ;value of send bit when ready
  259. ;
  260. ;
  261. ; Unused area: was once used for special PMMI functions,
  262. ; Now used only to retain compatibility with MDM overlays.
  263. ; You may use this area for any miscellaneous storage you'd
  264. ; like but the length of the area *must* be 12 bytes.
  265. ;
  266.     DS    12
  267. ;
  268. ; Special modem function table
  269. ;
  270. LOGON:    DS    2        ;needed for MDM compat, not ref'd by MEX
  271. DIALV:    JMP    PDIAL        ;dial digit in A (see info at PDIAL)
  272. DISCV:    JMP    PDISC        ;disconnect the modem
  273. GOODBV:    DS    3        ;called before exit to CP/M
  274. INMODV:    JMP    NITMOD        ;initialization. Called at cold-start
  275. NEWBDV:    JMP    PBAUD        ;set baud rate
  276. NOPARV:    DS    3        ;set modem for no-parity
  277. PARITV:    DS    3        ;set modem parity
  278. SETUPV:    JMP    SETCMD        ;SET cmd: jump to a RET if you don't write SET
  279. SPMENV:    DS    3        ;not used with MEX
  280. VERSNV:    JMP    SYSVER        ;Overlay's voice in the sign-on message
  281. BREAKV:    JMP    PBREAK        ;send a break
  282. ;
  283. ; Entry points here are for compatibility with MDM7. They will be gone
  284. ; in MEX 2.0, so avoid using them.
  285. ;
  286. ILPRTV:    DS    3        ;replace with MEX function 9
  287. INBUFV:    DS    3        ;replace with MEX function 10
  288. ILCMPV:    DS    3        ;replace with table lookup funct. 247
  289. INMDMV:    DS    3        ;replace with MEX function 255
  290. NXSCRV:    DS    3        ;not supported by MEX (returns w/no action)
  291. TIMERV:    DS    3        ;replace with MEX function 254
  292. ;
  293. ;
  294. ; Clear/screen and clear/end-of-screen. Each routine must use the
  295. ; full 9 bytes alloted (may be padded with nulls).
  296. ;
  297. CLREOS:    LXI    D,EOSMSG
  298.     MVI    C,PRINT
  299.     CALL    MEX
  300.     RET
  301. ;
  302. ;
  303. CLS:    LXI    D,CLSMSG        ;null unless patched
  304.     MVI    C,PRINT
  305.     CALL    MEX
  306.     RET
  307. ;
  308. ;------------------------------------------------------------
  309. ;
  310. ;    *** END OF FIXED FORMAT AREA ***
  311. ;
  312. ;------------------------------------------------------------
  313. ;
  314. ; Modem initialization. First make sure that the dialing overlay
  315. ; address is correct (some overlays ORG the dial vector and stick a
  316. ; JMP B00 there.) We have to make sure that we get control first.
  317. ; Also, store away the current value in the DISCV address, because it
  318. ; might be the address of the dialing overlay disconnect vector. We'll
  319. ; use this to disconnect along with the regular disconnect code if an
  320. ; external modem is being used. Then, set up the default communications
  321. ; parameters. Then, if the port is already open, just return, else set 
  322. ; up to use the built-in modem.
  323. ;
  324. NITMOD:    LXI    H,PDIAL        ;Get address of our dialing routine
  325.     SHLD    DIALV+1        ;Store it as the address to jump to
  326.     LHLD    DISCV+1        ;Get address of disconnect vector
  327.     SHLD    SMDISCV+1    ;Save it in case it's needed
  328.     LXI    B,PDISC        ;Get our disconnect routine address
  329.     XRA    A        ;Clear carry flag
  330.     DB    0EDH,042H    ;SBC HL,BC If zero, then the same
  331.     JZ    NIT0        ;Don't do anything special
  332.     DCR    A        ;Get 0FFH to store
  333.     STA    GOTDISC        ;Indicate that we've got external disc
  334.     LXI    H,PDISC        ;Get the address of our disconnect routine
  335.     SHLD    DISCV+1        ;Store it in the proper place
  336. NIT0:    LXI    H,DRSDAT    ;Get default rs232 data
  337.     LXI    D,BAUDRATE
  338.     LXI    B,4
  339.     DB    0EDH,0B0H    ;LDIR
  340.     LDA    BAUDRATE    ;Find out what baud we're set to
  341.     LXI    H,BAUDTBL
  342.     MVI    B,0
  343. NIT1:    CMP    M        ;Do we match this table entry?
  344.     JZ    NIT2        ;Yes
  345.     INX    H
  346.     INR    B
  347.     JMP    NIT1
  348. NIT2:    MOV    A,B        ;Store the table entry locally
  349.     STA    MDMSPD
  350.     CALL    SMSPEED        ;Set modem speed for time for xfer
  351.     LDA    RSOPN        ;See if the port is already open
  352.     ORA    A
  353.     RZ            ;Don't do anything if so
  354.     CALL    RSOPEN        ;Turn the port on
  355.     CALL    PWRON        ;Try to turn the modem on
  356.     IN    STR        ;Read status register
  357.     ANI    MII        ;Is modem installed?
  358.     JNZ    OPENIT        ;No, open the RS-232 port normally
  359.     CALL    STPORT        ;Set up to use the direct connect
  360.     LDA    OCRVAL        ;Turn off modem power to conserve
  361.     ANI    (NOT PWR) AND 0FFH
  362.     STA    OCRVAL
  363.     OUT    OCR
  364.     MVI    A,0FFH        ;Indicate we're using the internal modem
  365.     STA    MDMTYPE
  366.     RET
  367. OPENIT:    CALL    RSCLOSE        ;Close the port to clean things up
  368.     CALL    RSOPEN        ;Open it up for the regular port
  369.     RET
  370.  
  371. ;
  372. ;  send-break routine
  373. ;
  374. PBREAK:    LDA    RSCMD        ;Get the current command for the 8251
  375.     ORI    BRKBIT        ;turn break on
  376.     OUT    CCR        ;Send it to the 8251
  377.     MVI    B,3        ;Wait 300 ms.
  378.     MVI    C,TIMER
  379.     CALL    MEX
  380.     LDA    RSCMD        ;Restore the 8251 to normal
  381.     OUT    CCR
  382.     RET
  383. ;
  384. ; disconnect the modem
  385. ;
  386. PDISC:    LDA    MDMTYPE        ;See if we're using an external modem
  387.     ORA    A        ;This will be zero if so
  388.     JNZ    PDISC0        ;If not, don't worry about it
  389.     LDA    GOTDISC        ;See if we had an external routine
  390.     ORA    A        ;This will be non-zero if so
  391.     JNZ    SMDISCV        ;Call it if it's there
  392. PDISC0:    CALL    RSCLOSE
  393.     LDA    OCRVAL        ;get current modem control values
  394.     ANI    0FFH-(CCT+TXC+OHC)    ;On-hook, carrier off,disconnect
  395.     OUT    OCR        ;send it
  396.     ANI    (NOT PWR) AND 0FFH    ;now turn power off too
  397.     OUT    OCR
  398.     STA    OCRVAL        ;Save this as current mod. ctl. value
  399.     CALL    RESPORT        ;Reset to use internal
  400.     CALL    SPKROFF        ;Turn the speaker off
  401.     CALL    RSOPEN
  402.     RET
  403. ;
  404. ; External dialing routine disconnect code is called through here.
  405. ;
  406. SMDISCV:JMP    PDISC        ;<-----This may be modified
  407. ;
  408. ;
  409. ;------------------------------------------------------------
  410. ;
  411. ;        DIALING ROUTINES 
  412. ;    
  413. ;
  414. ; The DIGITS table is a translation for digit to register value for
  415. ; all of the possible legal digits. Not many people will likely have
  416. ; use for A-D, since they are kind of hard to dial on a normal phone,
  417. ; but since the modem supports them, I've included them here. If you do
  418. ; want to use A-D, be sure to specify them as UPPER CASE or they'll be
  419. ; treated as they were one of the non-special characters. The modem
  420. ; also understands that a comma (,) means to wait for n seconds before
  421. ; continuing (for compatability with various intelligent modems.) Any other
  422. ; values (such as -, (, or ) ) are ignored. (Values have been OR'd with
  423. ; the tone-on bit already.)
  424. ;
  425. DIGITS:    DB    1DH,10H,11H,12H    ; 0, 1, 2, 3
  426.     DB    14H,15H,16H,18H    ; 4, 5, 6, 7
  427.     DB    19H,1AH        ; 8, 9
  428. SPLAT:    DB    1CH        ; *
  429. CRUNCH:    DB    1EH        ; #
  430. CHARS:    DB    13H,17H,1BH,1FH    ;A, B, C, D
  431. ;
  432. PDIAL:    MOV    B,A        ;Save the digit
  433.     LDA    MDMTYPE        ;See if we're using an external modem
  434.     ORA    A
  435.     MOV    A,B        ;Restore the digit
  436.     JZ    SMART        ;If so, jump to the Hayes routines
  437.     CPI    254        ;start-dial?
  438.     JZ    STDIAL
  439.     CPI    255        ;end-dial
  440.     JZ    ENDIAL
  441.     CPI    ','        ;smartmodem pause command
  442.     JNZ    CKDIG        ;if not pause, continue
  443.     LDA    COMDLY        ;delay n seconds
  444.     MOV    B,A
  445.     ADD    A        ; x 2
  446.     ADD    A        ; x 4
  447.     ADD    A        ; x 8
  448.     ADD    B        ; x 9
  449.     ADD    B        ; x 10
  450.     MOV    B,A
  451.     MVI    C,TIMER
  452.     CALL    MEX
  453.     RET
  454. ;
  455. CKDIG:    CPI    '9'+1        ;digits are 0-9
  456.     JNC    CKALFA        ;too big...check if it's A-D
  457.     SUI    '0'
  458.     JC    CKSPEC        ;too small....check if it's * or #
  459.     LXI    H,DIGITS    ;get start of digits table
  460.     JMP    DIALIT
  461. ;
  462. CKALFA:    CPI    'D'+1        ;legal alpha are A-D
  463.     RNC            ;too big, ignore it
  464.     SUI    'A'
  465.     RC            ;too small
  466.     LXI    H,CHARS        ;get start of character table
  467.     JMP    DIALIT
  468. ;
  469. CKSPEC:    LXI    H,SPLAT        ;Check for specials
  470.     CPI    ('*'-'0') AND 0FFH    ;..is it *?
  471.     JZ    DIALIT1        ;Yup, go dial
  472.     INX    H        ;point to CRUNCH
  473.     CPI    ('#'-'0') AND 0FFH    ;..is it #?
  474.     RNZ            ;No, forget it
  475.     JMP    DIALIT1        ;Yup, go dial
  476.     
  477. ;
  478. ; First get the value to send to the tone control register. At DIALIT,
  479. ; HL contains the proper table, and A contains the offset into that table.
  480. ;
  481. DIALIT:    MVI    B,0
  482.     MOV    C,A        ;Get offset into BC
  483.     DAD    B        ;Get real byte location into HL
  484. ;
  485. DIALIT1:MOV    A,M        ;Get value to dial into A
  486.     OUT    DCRREG        ;Start sending the tone
  487.     MVI    B,1        ;Send it for 100ms (which is kinda long
  488.     MVI    C,TIMER        ;but it's easier than coding my own timing
  489.     CALL    MEX        ;routine.)
  490.     XRA    A
  491.     OUT    DCRREG        ;Turn tone off
  492.     MVI    B,1        ;Wait for 100ms for the inter-digit delay
  493.     MVI    C,TIMER
  494.     CALL    MEX
  495.     RET
  496. ;
  497. ; Start-dial sequence: Go thru normal init sequence, assuming that
  498. ; the guy is not trying to dial while connected. (This should 
  499. ; disconnect him anyway.
  500. ;
  501.  
  502. STDIAL:    CALL    PDISC        ;Disconnect
  503.     LDA    OCRVAL        ;Turn on monitor soon
  504.     ORI    MON
  505.     STA    OCRVAL
  506.     CALL    RESPORT        ;I don't know why, but I gotta do this
  507.     CALL    PWRON        ;Init modem and ports
  508.     CALL    SPKRON        ;turn power to speaker on
  509.     LDA    OCRVAL        ;Get current value for OCR
  510.     ANI    (NOT ANS) AND 0FFH    ;Set originate mode
  511.     STA    OCRVAL
  512.     OUT    OCR
  513. OFFHK:    LDA    OCRVAL        ;Have to reload 'cause we're called directly
  514.     ORI    CCT        ;Connect to phone
  515.     OUT    OCR
  516.     ORI    OHC        ;go off hook
  517.     OUT    OCR
  518.     STA    OCRVAL
  519.     MVI    B,20        ;Wait 2 seconds for dial tone
  520.     MVI    C,TIMER
  521.     CALL    MEX
  522.     RET            ;dialing init done
  523. ;
  524. ; End-dial sequence: Watch to see if CTS goes on within 30 seconds. If
  525. ; so, turn on carrier, turn speaker off, and connect to the line.
  526. ;
  527. ENDIAL:    LDA    OCRVAL        ;Turn on carrier
  528.     ORI    TXC
  529.     OUT    OCR
  530.     STA    OCRVAL
  531.     CALL    STPORT
  532.     MVI    E,WTCTS        ;# of ms * 5 to wait
  533. LP1:    MVI    B,2        ;200 ms.
  534.     MVI    C,TIMER
  535.     CALL    MEX
  536.     IN    STR        ;Check modem status register
  537.     ANI    CTSMSK        ;See if we've got carrier yet
  538.     JZ    GOTCAR        ;If it's zero, then we've got carrier
  539.     MVI    C,CHEKCC    ;Not yet, see if he hit ctl-c
  540.     CALL    MEX
  541.     MVI    A,3        ;Get ready to return code
  542.     JZ    NOCAR        ;Yup, return
  543.     DCR    E        ;Nope, count down
  544.     JNZ    LP1        ;Keep going if more time
  545.     MVI    A,2        ;Set code in A to 2 (no answer)
  546. NOCAR:    PUSH    PSW        ;Save the return code
  547.     CALL    PDISC        ;Hang up
  548.     POP    PSW        ;Get the return code back
  549.     RET
  550. ;
  551. ; GOTCAR - Come here to go on-line, we've got a carrier from remote
  552. ;
  553. GOTCAR:    CALL    SPKROFF        ;Turn the speaker off
  554.     XRA    A        ;Report that we got carrier
  555.     RET
  556. ;
  557. ;    <end of PX-8 dialing routines>
  558. ;------------------------------------------------------------
  559. ;
  560. PBAUD:    RET            ;use SET COMM for this
  561. ;
  562. ; Sign-on message
  563. ;
  564. SYSVER:    LXI    D,SOMESG
  565.     MVI    C,PRINT
  566.     CALL    MEX
  567.     RET
  568. ;
  569. SOMESG:    DB    'Epson PX-8 overlay V'
  570.     DB    REV/10+'0'
  571.     DB    '.'
  572.     DB    REV MOD 10+'0'
  573.     DB    '$'
  574. ;
  575. ; input from the status port. Since the PX-8 has 2 status ports, and
  576. ; we can't tell why we're being call (for input or output), we have to
  577. ; kludge here. We'll call both in & out status, and fake a 1 byte status
  578. ; word. See the MOD??? bytes for the values. Also, we check here to see
  579. ; if carrier has been lost (only if we were using the modem.) If so, then
  580. ; we'll disconnect from the phone line, reset the port, and tell the user.
  581. ;
  582. ; NOTE: It was observed that there was really no need for output status,
  583. ;    so these routines always return "ready to output". However, the
  584. ;    basic code structure to support both input and output status has
  585. ;    been left in should it ever be necessary.
  586. ;
  587. ; Automatic X-ON/X-OFF flow control is also done from this point.
  588. ;
  589. MODSTAT:
  590.     PUSH    B        ;push all registers (except A)
  591.     PUSH    D
  592.     PUSH    H
  593.     LDA    CTLR2        ;See if we're using an MFU
  594.     ANI    USEINT
  595.     JNZ    MDSTAT1        ;If not, forget about it
  596.     IN    STR        ;Else check modem status register
  597.     ANI    CTSMSK
  598.     JZ    MDSTAT1        ;Everything Ok if it's there
  599.     CALL    PDISC        ;Otherwise hang up
  600.     CALL    ILPRT        ;and say something about it
  601.     DB    CR,LF,'** Carrier Lost **',BELL,CR,LF,0
  602. MDSTAT1:LDA    MODE        ;Get terminal mode
  603.     CPI    1        ;01 means in terminal mode
  604.     JNZ    MDSTAT4        ;If not, then don't worry about it
  605. MDSTAT2:MVI    B,INSTS        ;Check for characters in input buffer
  606.     LXI    H,WIPEOUT    ;Here's where to put the returned info
  607.     CALL    RSIOX
  608.     JNZ    MDSTAT2        ;Wait until we get good status
  609.     XRA    A        ;Clear carry
  610.     LXI    H,264        ;3/4 full buffer
  611.     DB    0EDH,042H    ;SBC HL,BC
  612.     JNC    MDSTAT3        ;Continue if < 264 chars in buffer
  613.     LDA    PENDXOFF    ;is there an XOFF outstanding already?
  614.     ORA    A        ;It'll be 0 if not
  615.     JNZ    MDSTAT4        ;If so, then just go ahead
  616.     MVI    C,XOFF        ;Send out an XOFF
  617.     CALL    RSOUT
  618.     XRA    A
  619.     DCR    A
  620.     STA    PENDXOFF    ;Indicate a pending XOFF
  621.     JMP    MDSTAT4        ;Continue
  622. MDSTAT3:MVI    B,INSTS        ;Check input again, this time we're
  623.     LXI    H,WIPEOUT    ;seeing if it's time to send an XON
  624.     CALL    RSIOX
  625.     JNZ    MDSTAT3
  626.     XRA    A
  627.     LXI    H,50
  628.     DB    0EDH,042H    ;SBC HL,BC
  629.     JC    MDSTAT4        ;Don't send XON until < 50 chars in buffer
  630.     LDA    PENDXOFF    ;Ok, we've got < 50, did we send an XOFF?
  631.     ORA    A
  632.     JZ    MDSTAT4        ;No, so don't do anything
  633.     MVI    C,XON
  634.     CALL    RSOUT        ;Send the XON
  635.     XRA    A
  636.     STA    PENDXOFF
  637. MDSTAT4:CALL    RSINST        ;Now get status
  638.     ANI    MDRCVB        ;Mask off what we don't care about
  639.     ORI    MDSNDB        ;Always say that output is ready
  640. POPEM:    
  641.     POP    H
  642.     POP    D
  643.     POP    B
  644.     RET
  645. ;
  646. ; Get a character
  647. ;
  648. MODIN:    
  649.     PUSH    B
  650.     PUSH    D
  651.     PUSH    H
  652.     MVI    B,INSTS
  653.     LXI    H,STATBLK
  654.     CALL    RSIOX        ;Make sure there is really data so we
  655.     ORA    A        ;don't ever hang waiting
  656.     JZ    MODIN1
  657.     CALL    RSIN
  658. MODIN1:    POP    H
  659.     POP    D
  660.     POP    B
  661.     RET
  662. ;
  663. ; Send a character
  664. ;
  665. MODOUT:    
  666.     PUSH    B
  667.     PUSH    D
  668.     PUSH    H
  669.     MOV    C,A
  670.     CALL    RSOUT
  671.     POP    H
  672.     POP    D
  673.     POP    B
  674.     RET
  675. ;
  676. ; type char in A on console
  677. ;
  678. TYPE:    PUSH    H        ;save 'em
  679.     PUSH    D
  680.     PUSH    B
  681.     MOV    C,A        ;align output character
  682.     CALL    CONOUT
  683.     POP    B
  684.     POP    D
  685.     POP    H
  686.     RET
  687. ;
  688. ; SETPORT - set up to use internal modem
  689. ;
  690. STPORT:    LDA    CTLR2        ;Get current port info
  691.     ANI    (NOT USEINT) AND 0FFH    ;Use internal modem
  692. SPORT:    STA    CTLR2
  693.     OUT    MCTLR2
  694.     RET
  695. ;
  696. ; RESPORT - set up to use external modem
  697. ;
  698. RESPORT:LDA    CTLR2        ;Get current port info
  699.     ORI    USEINT        ;Use external modem
  700.     JMP    SPORT        ;Store & send to modem
  701. ;
  702. ; PWRON - Turn power on to the modem (& some other initialization stuff)
  703. ;
  704. PWRON:     MVI    A,MDMINIT    ;Initialize the 7508
  705.     OUT    OMR
  706.     LDA    OCRVAL        ;Get current parameters
  707.     ORI    PWR        ;Turn the power on
  708.     OUT    OCR
  709.     STA    OCRVAL        ;Save the parameters
  710.     MVI    B,1        ;Wait a while to let things settle
  711.     MVI    C,TIMER
  712.     CALL    MEX
  713.     RET
  714. ;
  715. ; SPKRON - Turn the speaker on
  716. ;
  717. SPKRON:    MVI    A,0FFH
  718.     STA    SLVFLG
  719.     LXI    D,SLVPRAM1
  720.     CALL    SLAVE
  721.     RET
  722. ;
  723. ; SPKROFF - Turn speaker off
  724. ;
  725. SPKROFF:LDA    OCRVAL        ;Get current params
  726.     ANI    (NOT MON) AND 0FFH    ;We're not monitoring anymore
  727.     OUT    OCR
  728.     STA    OCRVAL
  729.     MVI    A,0FFH
  730.     STA    SLVFLG
  731.     LXI    D,SLVPRAM2
  732.     CALL    SLAVE
  733.     RET
  734. ;
  735. ; Print in-line message ... blows away C register
  736. ;
  737. ILPRT:    MVI    C,ILP        ;get function code
  738.     JMP    MEX        ;go do it
  739. ;
  740. ; PLACECUR - Place cursor at row/col specified by BC. 
  741. ;
  742. PLACECUR:
  743.     PUSH    PSW
  744.     MOV    A,B
  745.     ADI    01FH        ;Add in offset
  746.     STA    ROW
  747.     MOV    A,C
  748.     ADI    01FH        ;Add in offset
  749.     STA    COL
  750.     CALL    ILPRT
  751.     DB    ESC,'='
  752. ROW:    DS    1
  753. COL    DS    1
  754.     DB    0
  755.     POP    PSW
  756.     RET
  757. ;
  758. ; Keyin - get a character into A
  759. ;
  760. KEYIN:    PUSH    B
  761.     PUSH    D
  762.     PUSH    H
  763.     CALL    CONIN            ;Direct console input
  764.     POP    H
  765.     POP    D
  766.     POP    B
  767.     RET
  768. ;
  769. ; UCASE - Convert character in A to uppercase
  770. ;
  771. UCASE:    CPI    'a'
  772.     RC            ;Return if not lower case
  773.     CPI    'z'+1
  774.     RNC            ;Return if > lower case z
  775.     ANI    05FH        ;Else change to upper case
  776.     RET
  777. ;
  778. ; SMSPEED - Set time to transfer speed
  779. ;
  780. SMSPEED:LDA    MDMSPD        ;Get locally stored speed value
  781.     MOV    C,A        ;Put in lower half of BC
  782.     MVI    B,0        ;Zap upper half of BC
  783.     LXI    H,XSPDTBL    ;Get address of xfer speed table
  784.     DAD    B        ;Get address of time for xfer byte
  785.     MOV    A,M        ;Get the value
  786.     STA    MSPEED        ;Store it
  787.     RET
  788. ;
  789. ; Data area
  790. ;
  791. ;
  792. ; XSPDTBL - transfer speed table. The number in parenthesis is the value
  793. ;        given to MEX. This differs from the actual baud rate in some
  794. ;        cases due to the baud rates available on the PX-8.
  795. ;
  796. XSPDTBL:DB    0        ;Unused
  797.     DB    0        ;110 Baud    (110)
  798.     DB    0        ;150 Baud    (110)
  799.     DB    1        ;300 Baud    (300)
  800.     DB    3        ;800 Baud    (600)
  801.     DB    5        ;1200 Baud    (1200)
  802.     DB    6        ;2400 Baud    (2400)
  803.     DB    7        ;4800 Baud    (4800)
  804.     DB    8        ;9600 Baud    (9600)
  805.     DB    9        ;19200 Baud    (19200)
  806. EOSMSG:    DB    ESC,'Y','$'    ;clear to end-of-screen
  807. CLSMSG:    DB    ESC,'*','$'    ;clear whole screen
  808. OCRVAL:    DB    0        ;OCR register value
  809. MDMTYPE:DB    0        ;modem type, 0FFH=external, 0=internal
  810. GOTDISC:DB    0        ;got external disconnect routine, FF=Yes
  811. MDMSPD:    DS    1        ;current port speed
  812. COMDLY:    DB    2        ;#secs to wait for , in dial string
  813. PENDXOFF:
  814.     DB    0        ;0FFH if XOFF pending, 0 otherwise
  815. STATBLK:DS    9        ;Returned info from RSIOX INSTS call
  816. ;
  817. ; The following group of data items are for using the slave CPU. 
  818. ; DO NOT ADD OR REMOVE ANYTHING IN THIS AREA!!!
  819. ;---------------Start of slave CPU data------------------
  820. SLVPRAM1:
  821.     DW    ONSNDCMD
  822.     DW    ONSNDLEN
  823.     DW    ONRETVAL
  824.     DW    ONRETLEN
  825. ONSNDCMD:
  826.     DB    072H,080H
  827. ONSNDLEN:
  828.     DB    2
  829. ONRETVAL:
  830.     DB    1
  831. ONRETLEN:
  832.     DB    1
  833. SLVPRAM2:
  834.     DW    OFFSDCMD
  835.     DW    OFFSDLEN
  836.     DW    OFFRTVAL
  837.     DW    OFFRTLEN
  838. OFFSDCMD:
  839.     DB    072H,0
  840. OFFSDLEN:
  841.     DB    2
  842. OFFRTVAL:
  843.     DB    1
  844. OFFRTLEN:
  845.     DB    1
  846. ;
  847. ;-----------------End of Slave CPU data----------------------
  848. ;
  849. ;
  850. ;------------------------------------------------------------
  851. ;
  852. ;
  853. ; Control is passed here after MEX parses a SET command.
  854. ;
  855. SETCMD:    MVI    C,SBLANK    ;any arguments?
  856.     CALL    MEX
  857.     JC    SETSHO        ;if not, go print out values
  858.     LXI    D,CMDTBL    ;parse command
  859.     CALL    TSRCH        ;from table
  860.     PUSH    H        ;any address on stack
  861.     RNC            ;if we have one, execute it
  862.     POP    H        ;nope, fix stack
  863. SETERR:    LXI    D,SETEMS    ;print error
  864.     MVI    C,PRINT
  865.     CALL    MEX
  866.     RET
  867. ;
  868. SETEMS:    DB    CR,LF,'SET command error',CR,LF,'$'
  869. ;
  870. ;
  871. CMDTBL:    DB    '?'+80H            ;"set ?"
  872.     DW    STHELP
  873.     DB    'OFFHOO','K'+80H    ;"set offhook"
  874.     DW    SETOFF
  875.     DB    'COM','M'+80H        ;"set comm"
  876.     DW    SETCOMM
  877.     DB    'DELA','Y'+80H        ;"set delay"
  878.     DW    SETDLY
  879. ;
  880.     DB    0        ;<<=== table terminator
  881. ;
  882. ; SET <no-args>: print current statistics
  883. ;
  884. SETSHO:    CALL    CARRSH        ;show carrier present/not present
  885.     LXI    H,SHOTBL    ;get table of SHOW subroutines
  886. SETSLP:    MOV    E,M        ;get table address
  887.     INX    H
  888.     MOV    D,M
  889.     INX    H
  890.     MOV    A,D        ;end of table?
  891.     ORA    E
  892.     RZ            ;exit if so
  893.     PUSH    H        ;save table pointer
  894.     XCHG            ;adrs to HL
  895.     CALL    GOHL        ;do it
  896.     MVI    C,CHEKCC    ;check for console abort
  897.     CALL    MEX
  898.     POP    H        ;it's done
  899.     JNZ    SETSLP        ;continue if no abort
  900.     RET
  901. ;
  902. GOHL:    PCHL
  903. ;
  904. ; table of SHOW subroutines
  905. ;
  906. SHOTBL:    DW    SHHOOK
  907. ;    DW    SHSTAT
  908.     DW    SHDLY
  909.     DW    0        ;<<== table terminator
  910. ;
  911. ; SET ?  processor
  912. ;
  913. STHELP:    LXI    D,HLPMSG
  914.     MVI    C,PRINT
  915.     CALL    MEX
  916.     RET
  917. ;
  918. ; The help message
  919. ;
  920. HLPMSG:    DB    CR,LF,'SET command, PX-8 version:',CR,LF,LF
  921.     DB    CR,LF,'SET COMM     set/display comm parameters'
  922.     DB    CR,LF,'SET DELAY n  set delay for comma in dial string'
  923.     DB    CR,LF,'             to n seconds'
  924.     DB    CR,LF,'SET OFFHOOK  go offhook'
  925.     DB    CR,LF,'$'
  926. ;
  927. ; Show carrier status
  928. ;
  929. CARRSH:    CALL    CARRCK            ;check for it
  930.     LXI    D,NOMESG        ;tell about carrier
  931.     MVI    C,PRINT
  932.     CZ    MEX            ;print the "NO" if no carrier
  933.     LXI    D,CARMSG        ;print "carrier present"
  934.     MVI    C,PRINT
  935.     CALL    MEX
  936.     RET
  937. ;
  938. NOMESG:    DB    'no $'
  939. CARMSG:    DB    'carrier present',CR,LF,'$'
  940. ;
  941. ; check the PX-8 for carrier-present (Z=no)
  942. ;
  943. CARRCK:    MVI    B,CTLIN        ;get status byte
  944.     CALL    RSIOX
  945.     ANI    DCD        ;Check for carrier detect
  946.     RET
  947.  
  948. ;
  949. ; Set OFFHOOK processor
  950. ;
  951. SETOFF:    CALL    PDISC        ;Disconnect if anything was there
  952.     CALL    PWRON        ;Fire up the modem
  953.     CALL    OFFHK
  954. SHHOOK:    CALL    ILPRT
  955.     DB    'Modem is ',0
  956.     LDA    OCRVAL
  957.     ANI    OHC
  958.     JZ    SHONHK
  959.     CALL    ILPRT
  960.     DB    'off-hook',CR,LF,0
  961.     RET
  962. SHONHK:    CALL    ILPRT
  963.     DB    'on-hook',CR,LF,0
  964.     RET
  965. ;
  966. ; Set delay for comma
  967. ;
  968. SETDLY:    MVI    C,EVALA        ;Get the number
  969.     CALL    MEX
  970.     MOV    A,H        ;Validate
  971.     ORA    A
  972.     JNZ    SETERR
  973.     MOV    A,L
  974.     STA    COMDLY        ;Store new rate
  975.  
  976. ;
  977. ; Show dialing delay
  978. ;
  979. SHDLY:    CALL    ILPRT
  980.     DB    'Delay time for dialing:',0
  981.     LDA    COMDLY
  982.     MOV    L,A
  983.     MVI    H,0
  984.     MVI    C,DECOUT
  985.     CALL    MEX
  986.     CALL    ILPRT
  987.     DB    ' seconds',CR,LF,0
  988.     RET
  989. ;
  990. ; Compare next input-stream item in table @DE; CY=1
  991. ; if not found, else HL=matched data item
  992. ;
  993. TSRCH:    MVI    C,LOOKUP    ;get function code
  994.     JMP    MEX        ;pass to MEX processor
  995. ;
  996. ; SET COMM routines - With thanks to Mike Hoffman and Christopher Rhodes
  997. ;               of Epson. These are from EPPXMDM3.MAC
  998. ;
  999. SETCOMM:CALL    CLS        ;Clear the screen
  1000.     LXI    D,MENU
  1001.     MVI    C,PRINT
  1002.     CALL    MEX        ;Display the setup menu
  1003.  
  1004. ; DISPLAY CURRENT VALUES ON SETUP SCREEN
  1005.     CALL    DBAUD
  1006.     CALL    DDBITS
  1007.     CALL    DPARITY
  1008.     CALL    DSTP
  1009.     CALL    DMODEM
  1010.  
  1011. ; GET USERS RESPONSE AND SET PARAMITERS
  1012. SETUP0:    CALL    KEYIN
  1013.     CALL    UCASE
  1014.     CPI    ESC
  1015.     JZ    SETUP
  1016.     CPI    '9'+1        ;GREATER THAN BAUD SELECTION
  1017.     JNC    SDBITS        ;CHECK FOR DATA BITS
  1018.     CPI    '1'        ;LESS THAN 1?
  1019.     JC    SETUP0        ;GET ANOTHER RESPONSE
  1020.     ANI    0FH
  1021.     MOV    E,A
  1022.     MVI    A,10
  1023.     SUB    E
  1024.     STA    MDMSPD
  1025.     MOV    C,A
  1026.     MVI    B,0
  1027.     LXI    H,BAUDTBL
  1028.     DAD    B
  1029.     MOV    A,M
  1030.     STA    BAUDRATE
  1031.     CALL    DBAUD
  1032.     JMP    SETUP0
  1033. SDBITS:    CPI    'B'+1        ;GREATER THAN DATA BITS
  1034.     JNC    SPARITY        ;CHECK FOR PARITY
  1035.     CPI    'A'        ;LESS THAN 'A'
  1036.     JC    SETUP0        ;GET ANOTHER RESPONSE
  1037.     SUI    3FH        ;MAKE 2 OR 3
  1038.     STA    DBITS
  1039.     CALL    DDBITS
  1040.     JMP    SETUP0
  1041. SPARITY:CPI    'E'+1        ;GREATER THAN PARITY
  1042.     JNC    SSTOP        ;CHECK FOR STOP BITS
  1043.     SUI    'C'
  1044. SPAR1:    STA    PARBITS
  1045.     CALL    DPARITY
  1046.     JMP    SETUP0
  1047. SSTOP:    CPI    'G'+1        ;GREATER THAN STOP BITS
  1048.     JNC    SMOD        ;CHECK FOR MODEM
  1049.     SUI    'F'-1
  1050.     CPI    1
  1051.     JZ    SSTOP1
  1052.     ADI    2
  1053. SSTOP1:    STA    STP
  1054.     CALL    DSTP
  1055.     JMP    SETUP0
  1056. SMOD:    CPI    'I'+1        ;GREATER THAN BAUD
  1057.     JNC    SETUP0        ;BAD SELECTION GET ANOTHER RESPONSE
  1058.     SUI    'H'
  1059.     JZ    SMOD1
  1060.     CALL    PWRON        ;Try to turn the modem on
  1061.     IN    STR        ;Read status register
  1062.     ANI    MII        ;Is modem installed?
  1063.     JNZ    SMOD2
  1064.     MVI    A,0FFH
  1065. SMOD1:    STA    MDMTYPE
  1066.     CALL    DMODEM
  1067.     JMP    SETUP0
  1068. SMOD2:    MVI    A,BELL
  1069.     CALL    TYPE
  1070. SMOD3:    LXI    B,0201H
  1071.     CALL    PLACECUR
  1072.     CALL    ILPRT
  1073.      DB    TAB,'*** NO MODEM ***',0
  1074.     XRA    A
  1075.     STA    MDMTYPE
  1076.     CALL    DMODEM
  1077.     JMP    SETUP0
  1078. ;
  1079. ; Display baud rate
  1080. ;
  1081. DBAUD:    LXI    B,30DH
  1082.     CALL    PLACECUR
  1083.     LXI    H,BAUDSPD
  1084.     MVI    D,0
  1085.     LDA    MDMSPD        ;get baud rate code
  1086.     CPI    0FFH
  1087.     RZ            ;unknown baud rate
  1088.     MOV    E,A        ;x1
  1089.     ADD    A        ;x2
  1090.     ADD    A        ;x4
  1091.     ADD    E        ;x5
  1092.     ADD    E
  1093.     MOV    E,A
  1094.     DAD    D        ;point to correct rate
  1095.     XCHG
  1096.     MVI    C,PRINT
  1097.     CALL    MEX
  1098.     CALL    ILPRT
  1099.     DB    ' bps ',CR,LF,0
  1100.     RET    
  1101.  
  1102. ;
  1103. ; Display data bits
  1104. ;
  1105. DDBITS:    LXI    B,50DH
  1106.     CALL    PLACECUR
  1107.     LDA    DBITS
  1108.     CPI    2
  1109.     MVI    A,'7'
  1110.     JZ    DDBITS1
  1111.     MVI    A,'8'
  1112. DDBITS1:CALL    TYPE
  1113.     RET
  1114. ;
  1115. ; Display parity
  1116. ;
  1117. DPARITY:LXI    B,60DH
  1118.     CALL    PLACECUR
  1119.     LDA    PARBITS
  1120.     ORA    A
  1121.     JNZ    DPAR1
  1122.     CALL    ILPRT
  1123.     DB    'none',0
  1124.     RET
  1125. DPAR1:    CPI    1
  1126.     JNZ    DPAR2
  1127.     CALL    ILPRT
  1128.     DB    'odd ',0
  1129.     RET
  1130. DPAR2:    CALL    ILPRT
  1131.     DB    'even',0
  1132.     RET
  1133. ;
  1134. ; Display stop bits
  1135. ;
  1136. DSTP:    LXI    B,70DH
  1137.     CALL    PLACECUR
  1138.     LDA    STP
  1139.     CPI    1
  1140.     MVI    A,'1'
  1141.     JZ    DSTP1
  1142.     MVI    A,'2'
  1143. DSTP1:    CALL    TYPE
  1144.     RET
  1145. ;
  1146. ; Display modem type
  1147. ;
  1148. DMODEM:    LXI    B,80DH
  1149.     CALL    PLACECUR
  1150.     LDA    MDMTYPE
  1151.     ORA    A
  1152.     JNZ    DMODEM1
  1153.     CALL    ILPRT
  1154.     DB    'external',0
  1155.     RET
  1156. DMODEM1:CALL    ILPRT
  1157.     DB    'internal',0
  1158.     RET
  1159.  
  1160. SETUP:    CALL    STPORT        ;Set up for internal mode just in case
  1161.     CALL    SMSPEED        ;Set time to xfer speed
  1162.     LDA    MDMTYPE        ;See what kind of modem we're using
  1163.     INR    A        ;If FF, then it's internal
  1164.     JZ    SETUP1        ;yep, it's internal
  1165.     CALL    RESPORT        ;Using external, do setup
  1166. SETUP1:    LXI    H,PARAMS
  1167.     LXI    D,WIPEOUT
  1168.     LXI    B,9
  1169.     DB    0EDH,0B0H    ;LDIR
  1170.     MVI    B,CLSIOX
  1171.     CALL    RSIOX        ; close port first
  1172.     MVI    B,OPNIOX
  1173.     LXI    H,WIPEOUT
  1174.     CALL    RSIOX        ; open with new parameters
  1175.     CALL    CLS
  1176.     CALL    ILPRT
  1177.     DB    ESC,CURON
  1178.      DB    CR,LF,LF,LF
  1179.      DB    TAB,'Communication initialization completed.',CR,LF,0
  1180.     RET
  1181.  
  1182. BAUDSPD: DB    '50   $110  $150  $300  $600  $'
  1183.      DB    '1200 $2400 $4800 $9600 $19200$'
  1184. BAUDTBL:    
  1185.     DB    0FFH    ; 50   baud not supported
  1186.     DB    2    ; 110  baud
  1187.     DB    4    ; 150  baud
  1188.     DB    6    ; 300  baud
  1189.     DB    8    ; 600  baud
  1190.     DB    0AH    ; 1200 baud
  1191.     DB    0CH    ; 2400 baud
  1192.     DB    0DH    ; 4800 baud
  1193.     DB    0EH    ; 9600 baud
  1194.     DB    0FH    ; 19.2 baud
  1195.  
  1196. MENU:    DB    ESC,CUROFF
  1197.  DB    '    Select alphanumeric or ESC to return.',CR,LF,LF
  1198.  DB    'bit rate  :           1=19200    2=9600     3=4800     4=2400'
  1199.  DB    '     5=1200',CR,LF
  1200.  DB    '                      6=600      7=300      8=150      9=110',CR,LF
  1201.  DB    'data bits :           A=7        B=8',CR,LF
  1202.  DB    'parity    :           C=none     D=odd      E=even',CR,LF
  1203.  DB    'stop bits :           F=1        G=2',CR,LF
  1204.  DB    'modem type:           H=external I=internal$'
  1205.  
  1206. PARAMS:    
  1207.     DW    INTBUF
  1208.     DW    INTBUFL
  1209. BAUDRATE:
  1210.     DS    1
  1211. DBITS:
  1212.     DS    1
  1213. PARBITS:
  1214.     DS    1
  1215. STP:
  1216.     DS    1
  1217. SPECIAL:
  1218.     DB    0FFH    ;Not XON/XOFF, not SI/SO, DTR on, RTS on
  1219.  
  1220. WIPEOUT:DS    9    ; this area gets overwritten by BIOS call
  1221. COPYRITE:
  1222.     DB    'Copyright (C) 1985 by David B. Kozinn'
  1223. ;
  1224. ;------------------------------------------------------------
  1225. ;
  1226. ; End of PX-8 MEX modem overlay
  1227. ;
  1228. ;------------------------------------------------------------
  1229. ;
  1230.     END
  1231.