home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / cpm / mex / mxo-gs10.azm / MXO-GS10.ASM
Assembly Source File  |  1988-11-18  |  27KB  |  1,017 lines

  1. ;    TITLE  'MEX Overlay for Apple ][ / IIgs port / Smartmodem'
  2. ;
  3. ;  MXO-GS10.ASM created 11/11/88   by   Nick Sayer
  4. ;
  5. REV    EQU    10        ; Nov 11, 1988
  6. ;
  7. ; This overlay is specific for the following hardware:
  8. ;
  9. ;    Apple ][ +/e  with PCPI Applicard
  10. ;    Apple IIgs Modem Port
  11. ;    Hayes compatible intelligent modem
  12. ;
  13. ;            - Nick Sayer (N6QQQ)
  14. ;                November 11, 1988
  15. ;
  16. ; Kudos to Henry Middlebrook for this overlay. I used his overlay outline,
  17. ; deleted his most of the hardware specific code and replaced it with a
  18. ; fleshed out version of a similar overlay I wrote for IMP245.COM.
  19. ;
  20. ; This overlay is written in three distinct parts as a "MIXED" type of
  21. ; overlay for MEX.  The parts follow the guidelines available in the
  22. ; MEX OVERLAY LIST #2 (01/06/85 -- Ron Fowler, NightOwl Software) with
  23. ; reference to the PORT, MODEM, and PATCH overlay types.  Thus, you
  24. ; should be able to remove or add any one of the three parts without
  25. ; severely affecting the overlay operation.  Naturally, removing the
  26. ; first section (PORT) will completely disable MEX; however, removing
  27. ; or changing the the MODEM (derived from MXO-SM13.ASM) section or
  28. ; the PATCH (MEXPAT11.ASM) will minimally affect operation (see LSTST
  29. ; and SSET).
  30. ;
  31. ; >>>>  NOTE:      Previous versions of MXO-APxx do NOT properly support
  32. ;        the PCPI Applicard.  You may not like this overlay;
  33. ;        however, you can use it as a reliable guide.
  34. ;
  35. ;                HM    02/04/85
  36. ;
  37. ; To use this overlay just set equates as you see fit, assemble with
  38. ; ASM.COM then using MLOAD21.COM and MEX112.COM create running MEX:
  39. ;
  40. ;    A>MLOAD21 MEX.COM=MEX112.COM,MXO-AP50
  41. ;
  42. ;----------------------------------------------------------------------
  43. ;
  44. ;            Overlay Update History
  45. ;
  46. ; 11/11/88 - Coded for Apple IIgs I/O     -GS10 - Nick Sayer
  47. ; 02/06/85 - Coded for Apple SSC I/O      -AP50 - Henry Middlebrook
  48. ; 01/28/85 - Created MXO original overlay -AP30    - Henry Middlebrook
  49. ;
  50. ;======================================================================
  51.  
  52. ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  53. ;
  54. ;            PORT OVERLAY SECTION
  55. ;
  56. ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  57. ;
  58. BELL        EQU    07H    ;bell
  59. CR        EQU    0DH    ;carriage return
  60. ESC        EQU    1BH    ;escape
  61. LF        EQU    0AH    ;linefeed
  62. TAB        EQU    09H    ;tab
  63. YES        EQU    0FFH
  64. NO        EQU    0
  65. ;
  66. ;----------------------------------------------------------------------
  67. ;
  68. ;    MEX Service Processor Calls
  69. ;
  70. MEX    EQU    0D00H    ;address of the service processor
  71. INMDM    EQU    255    ;get char from port to A, CY=no more in 100 ms
  72. TIMER    EQU    254    ;delay 100ms * reg B
  73. TMDINP    EQU    253    ;B=# secs to wait for char, cy=no char
  74. CHEKCC    EQU    252    ;check for ^C from KBD, Z=present
  75. SNDRDY    EQU    251    ;test for modem-send ready
  76. RCVRDY    EQU    250    ;test for modem-receive ready
  77. SNDCHR    EQU    249    ;send a character to the modem (after sndrdy)
  78. RCVCHR    EQU    248    ;recv a char from modem (after rcvrdy)
  79. LOOKUP    EQU    247    ;table search: see CMDTBL comments for info
  80. PARSFN    EQU    246    ;parse filename from input stream
  81. BDPARS    EQU    245    ;parse baud-rate from input stream
  82. SBLANK    EQU    244    ;scan input stream to next non-blank
  83. EVALA    EQU    243    ;evaluate numeric from input stream
  84. LKAHED    EQU    242    ;get nxt char w/o removing from input
  85. GNC    EQU    241    ;get char from input, cy=1 if none
  86. ILP    EQU    240    ;inline print
  87. DECOUT    EQU    239    ;decimal output
  88. PRBAUD    EQU    238    ;print baud rate
  89. PRNTBL    EQU    237    ;print command table in columns (HL=addr)
  90. PRID    EQU    236    ;print MEX ID string on console
  91. ;
  92. CONOUT    EQU    2    ;simulated BDOS function 2: console char out
  93. PRINT    EQU    9    ;simulated BDOS function 9: print string
  94. INBUF    EQU    10    ;input buffer, same structure as BDOS 10
  95. ;
  96. ;
  97. ;======================================================================
  98. ;
  99.     ORG    100H    ;we begin
  100. ;
  101.     DS    3    ;MEX has a JMP START here            100H
  102. ;
  103. ; The following variables are located at the beginning of the program
  104. ; to facilitate modification without the need of re-assembly. They will
  105. ; be moved in MEX 2.0.
  106. ;
  107. PMODEM:    DB    YES    ;\ / These two locations are            103H
  108. SMODEM:    DB    NO    ;/ \ not referenced by MEX.            104H
  109. TPULSE:    DB    'T'    ;Tone/Pulse (used only in Smodem overlay)    105H
  110. CLOCK:    DB    60    ;clock speed x .1, up to 25.5 mhz.        106H
  111. MSPEED:    DB    6    ;sets display time for sending a file        107H
  112.             ;0=110    1=300  2=450  3=600  4=710
  113.             ;5=1200 6=2400 7=4800 8=9600 9=19200
  114. BYTDLY:    DB    1    ;default time to send character in        108H
  115.             ;terminal mode file transfer (0-9)
  116.             ;0=0 delay, 1=10 ms, 5=50 ms, 9=90 ms
  117. CRDLY:    DB    1    ;end-of-line delay in terminal            109H
  118.             ;mode file transfer for slow BBS systems
  119.             ;0=0 delay, 1=100 ms, 5=500 ms, 9=900 ms
  120. COLUMS:    DB    5    ;number of directory columns            10AH
  121. SETFL:    DB    YES    ;yes=user-defined SET command            10BH
  122. SCRTST:    DB    YES    ;yes=if home cursor and clear screen        10CH
  123.             ;routine at CLRSCRN
  124.     DB    0    ;was once ACKNAK, now spare            10DH
  125. BAKFLG:    DB    NO    ;yes=make .BAK file                10EH
  126. CRCDFL:    DB    YES    ;yes=default to CRC checking            10FH
  127.             ;no=default to Checksum checking
  128. TOGCRC:    DB    YES    ;yes=allow toggling of Checksum to CRC        110H
  129. CVTBS:    DB    NO    ;yes=convert backspace to rub            111H
  130. TOGLBK:    DB    YES    ;yes=allow toggling of bksp to rub        112H
  131. ADDLF:    DB    NO    ;no=no LF after CR to send file in        113H
  132.             ;terminal mode (added by remote echo)
  133. TOGLF:    DB    YES    ;yes=allow toggling of LF after CR        114H
  134. TRNLOG:    DB    NO    ;yes=allow transmission of logon        115H
  135.             ;write logon sequence at location LOGON
  136. SAVCCP:    DB    YES    ;yes=do not overwrite CCP            116H
  137. LOCNXT:    DB    NO    ;yes=local cmd if EXTCHR precedes        117H
  138.             ;no=not local cmd if EXTCHR precedes
  139. TOGLOC:    DB    YES    ;yes=allow toggling of LOCNXTCHR        118H
  140. LSTTST:    DB    YES    ;yes=allow toggling of printer on/off        119H
  141.             ;in terminal mode. Set to no if using
  142.             ;the printer port for the modem
  143. XOFTST:    DB    YES    ;yes=allow testing of XOFF from remote        11AH
  144.             ;while sending a file in terminal mode
  145. XONWT:    DB    NO    ;yes=wait for XON after sending CR while    11BH
  146.             ;transmitting a file in terminal mode    
  147. TOGXOF:    DB    YES    ;yes=allow toggling of XOFF testing        11CH
  148. IGNCTL:    DB    NO    ;yes=do not send control characters        11DH
  149.             ;above CTL-M to CRT in terminal mode
  150.             ;no=send any incoming CTL-char to CRT
  151. EXTRA1:    DB    0    ;for future expansion                11EH
  152. EXTRA2:    DB    0    ;for future expansion                11FH
  153. BRKCHR:    DB    'B'-40H    ;^@ = Send a 300 ms. break tone            120H
  154. NOCONN:    DB    'N'-40H    ;^N = Disconnect from phone line        121H
  155. LOGCHR:    DB    'L'-40H    ;^L = Send logon                122H
  156. LSTCHR:    DB    'P'-40H    ;^P = Toggle printer                123H
  157. UNSVCH:    DB    'R'-40H    ;^R = Close input text buffer            124H
  158. TRNCHR:    DB    'T'-40H    ;^T = Transmit file to remote            125H
  159. SAVCHR:    DB    'Y'-40H    ;^Y = Open input text buffer            126H
  160. EXTCHR:    DB    '^'-40H    ;^^ = Send next character            127H
  161. ;
  162. ; Equates used only by PMMI routines grouped together here.
  163. ;
  164. PRATE:    DB    125    ;125=20pps dialing, 250=10pps            128H
  165.     DB    0    ;not used                    129H
  166. ;
  167. ; Jump table accessed by MEX to write/read serial port
  168. ;
  169. IN$MODSTAP:    JMP    RD$MODSTAP     ;read ACIA status port        12AH
  170.         DS    7
  171. OUT$MODDATP:    JMP    WR$MODDATP    ;send character to ACIA        134H
  172.         DS    7
  173. IN$MODDATP:    JMP    RD$MODDATP    ;read character from ACIA    13EH
  174.         DS    7
  175. ;
  176. ; Bit-test routines.  These will be merged with the above
  177. ; routines in MEX 2.0 to provide a more reasonable format
  178. ;
  179. MASKR:        ANI    MDRCVB ! RET    ;bit to test for receive ready    148H
  180. TESTR:        CPI    MDRCVR ! RET    ;value of rcv. bit when ready    14BH
  181. MASKS:        ANI    MDSNDB ! RET    ;bit to test for send ready    14EH
  182. TESTS:        CPI    MDSNDR ! RET    ;value of send bit when ready    151H
  183. ;
  184. ; Unused area: was once used for special PMMI functions, now used only
  185. ; to retain compatibility with MDM overlays. You may use this area for
  186. ; any miscellaneous storage you'd like but the length of the area
  187. ; >> MUST << be 12 bytes.
  188. ;
  189.         DS    12        ;PMMI only calls        154H
  190. ;
  191. ; Special modem function jump table: if your overlay cannot handle
  192. ; some of these, change the jump to "DS 3", so the code present in
  193. ; MEX will be retained.  Thus, if your modem can't dial, change the
  194. ; JMP PDIAL at DIALV to DS 3, and MEX will print a "not-implemented"
  195. ; diagnostic for any commands that require dialing.
  196. ;
  197. ;
  198. LOGON:        DS    2        ;not used by MEX          160H
  199. DIALV:        JMP    DIAL        ;dial a digit in A (ref SMOVL)    162H
  200. DISCV:        JMP    DISCON        ;drops DTR to hang-up fast!    165H
  201. GOODBV:        JMP    GOODBYE        ;called before exit to CPM    168H
  202. INMODV:        JMP    INITMOD        ;go to user written routine    16BH
  203. NEWBDV:        JMP    PBAUD        ;changes baud with phone #    16EH
  204. NOPARV:        RET  !    NOP  !    NOP    ;set modem for no-parity     171H
  205. PARITV:        RET  !    NOP  !    NOP    ;set modem parity             174H
  206. SETUPV:        JMP    SETCMD        ;                177H
  207. SPMENV:        DS     3        ;not used by MEX        17AH
  208. VERSNV:        JMP    SYSVER        ;                17DH
  209. BREAKV:        JMP    SENDBRK        ;                180H
  210. ;
  211. ; The following jump vector provides the overlay with access to special
  212. ; routines in the main program (retained and supported in the main pro-
  213. ; gram for MDM overlay compatibility). These should not be modified by
  214. ; the overlay.
  215. ;
  216. ; Note that for MEX 2.0 compatibility, you should not try to use these
  217. ; routines, since this table will go away with MEX 2.0 (use the MEX
  218. ; service call processor instead).
  219. ;
  220. ILPRTV:        DS    3    ;replace with MEX function 9         183H
  221. INBUFV:        DS    3    ;replace with MEX functin 10        186H
  222. ILCMPV:        DS    3    ;replace with table lookup funct 247    189H
  223. INMDMV:        DS    3    ;replace with MEX function 255        18CH
  224. NXSCRV:        DS    3    ;not supported by MEX            18FH
  225. TIMERV:        DS    3    ;replace with MEX function 254        192H
  226. ;
  227. ; Clear/screen and clear/end-of-screen. Each routine must use the
  228. ; full 9 bytes alloted (may be padded with nulls).
  229. ;
  230. ;
  231. CLREOS:        LXI    D,EOSMSG    ;                195H
  232.         MVI    C,PRINT
  233.         CALL    MEX
  234.         RET            ;                19DH
  235. ;
  236. CLS:        LXI    D,CLSMSG    ;                19EH
  237.         MVI    C,PRINT
  238.         CALL    MEX
  239.         RET            ;                1A6H
  240. ;
  241. ;
  242. ;        *** END OF FIXED FORMAT AREA ***
  243. ;
  244. ;**********************************************************************
  245. ;
  246. ;        Overlay  Fixed  Messages  Area
  247. ;
  248. EOSMSG:    DB    ESC,0D9H,0,0,'$'    ;clear to end of screen message
  249.                     ;for Videx Videoterm / SOROC
  250. ;
  251. CLSMSG:    DB    ESC,0AAH,0,0,'$'    ;clear screen message
  252.                     ;for Videx Videoterm / SOROC
  253. ;
  254. VERMSG:    DB    CR,LF,TAB,TAB,'  Version for Apple ][ / Applicard'
  255.     DB    CR,LF
  256.     DB    TAB,TAB,'IIgs modem port  '
  257.     DB    'Overlay Version ',REV/10+'0','.'
  258.     DB    REV MOD 10+'0'
  259.     DB    CR,LF,LF,'$'
  260.     DB    0,'Overlay by Nick Sayer (N6QQQ)',0,'$'
  261. ;
  262. ;----------------------------------------------------------------------
  263. ;
  264. ; These routines are specific to the Apple ][+ with Applicard.  The
  265. ; routines read modem hardware (Apple Super Serial Card ACIA) directly
  266. ; from the Applicard.
  267. ;
  268.  
  269. ;====================== CUSTOMIZATION EQUATES ==========================
  270. ;
  271. SLOT    EQU    2        ; Slot of serial interface
  272. SLOTOFF    EQU    16*SLOT        ; Hardware offset for $C0(8+n)0
  273. SLOTOF2    EQU    256*SLOT    ; Firmware offset for $Cn00
  274. ;
  275. MDRCVR    EQU    1        ; Bit to test for char present
  276. MDRCVB    EQU    1        ; Compare mask to test for char present
  277. MDSNDR    EQU    4        ; Bit to test for send ready
  278. MDSNDB    EQU    4        ; Compare mask to test for send ready
  279. ;-----------------------------------------------------------------------
  280. ;
  281. ; This routine sends a break tone for 300 ms
  282. ;
  283. SENDBRK:
  284.     MVI    B,0        ; Param doesn't matter
  285.     MVI    C,'S'        ; Ctrl-A + S is send break
  286.     JMP    GSCMD        ; Send it out
  287. ;
  288. ;    CALL    CMDENA        ; Enable Ctrl-A commands
  289. ;    MVI    A,01H        ; Ctrl-A
  290. ;    CALL    GSSEND        ; Send it out
  291. ;    MVI    A,'S'        ; Ctrl-A + S is send-break command
  292. ;    CALL    GSSEND        ; Send it out
  293. ;    JMP    CMDDIS        ; Disable Ctrl-A commands and return
  294. ;
  295. ;
  296. ; This routine sets DTR low for 300 ms to disconnect the phone
  297. ;
  298. DISCON:
  299.     MVI    A,0FFH        ; Lower DTR
  300.     CALL    CMDDTR        ; Set DTR status
  301.     MVI    B,3
  302.     MVI    C,TIMER        ; Delay 300 ms
  303.     CALL    MEX
  304.     MVI    A,00H        ; Bring DTR back
  305.     CALL    CMDDTR        ; Set DTR status
  306.     RET
  307. ;
  308. ;.....
  309. ;
  310. GOODBYE:
  311.     RET            ; Nothing to do when exiting
  312. ;
  313. ;.....
  314. ;
  315. ;
  316. ;=========================== INITMOD ===================================
  317. ;
  318. ;
  319. INITMOD:
  320.     CALL    GSINIT        ; Init via 6502 routines
  321. ;
  322.     MVI    A,0
  323.     STA    PARSV
  324.     STA    WRDSV        ; 8N1
  325.     LDA    MSPEED        ; Get default speed
  326.     JMP    PBAUD        ; Let PBAUD do the work
  327. ;
  328. INITMOD1:
  329.     LDA    BAUDSV        ; Get baud chars
  330.     MOV    B,A
  331.     MVI    C,'B'        ; Baud setting char
  332.     CALL    GSCMD        ; Do it
  333.     LDA    PARSV        ; Get parity value
  334.     MOV    B,A
  335.     MVI    C,'P'        ; Parity command
  336.     CALL    GSCMD        ; Do it
  337.     LDA    WRDSV        ; Get word format char
  338.     MOV    B,A
  339.     MVI    C,'D'        ; Fall into GSCMD
  340. ;
  341. ; GSCMD takes a BCD number in B and an ascii character in C and sends
  342. ; them out with a ctrl-A and enabled commands.
  343. ;
  344. GSCMD:    PUSH    H
  345.     PUSH    D
  346.     PUSH    B
  347.     CALL    CMDENA        ; Enable Ctrl-A commands
  348.     MVI    A,81H        ; Send a Ctrl-A
  349.     CALL    GSSEND        ; Send it
  350.     POP    B        ; Get Char back
  351.     PUSH    B        ; And save it again
  352.     MOV    A,B
  353.     RAR
  354.     RAR
  355.     RAR
  356.     RAR
  357.     CALL    SENDHX
  358.     POP    B
  359.     PUSH    B
  360.     MOV    A,B
  361.     CALL    SENDHX
  362.     POP    B
  363.     PUSH    B
  364.     MOV    A,C
  365.     CALL    GSSEND
  366.     CALL    CMDDIS        ; Disable Ctrl-A cmds and return
  367.     POP    B
  368.     POP    D
  369.     POP    H
  370.     RET
  371. SENDHX:    ANI    0FH
  372.     ORI    0B0H        ; Make it a number
  373.     JMP    GSSEND        ; Send it and ret
  374. ;
  375. ;.....
  376. ;
  377. ;
  378. ;========================== APPLE I/O ==================================
  379. ;
  380. RDBYTE:    EQU    0FFE0H        ; Read 1 byte from Apple (A = byte)
  381. WRBYTE:    EQU    0FFE3H        ; Write 1 byte to Apple (C = byte)
  382. RDWORD:    EQU    0FFE6H        ; Read 2 bytes from Apple (DE = word)
  383. WRWORD:    EQU    0FFE9H        ; Write 2 bytes to Apple (DE = word)
  384. WRLOTS:    EQU    0FFEFH        ; FROM (HL), SEND NUM BYTES IN DE TO HOST
  385. POKLOT:    EQU    2
  386. CALL1:    EQU    3
  387. PEEK1:    EQU    6        ; Command
  388. POKE1:    EQU    7        ; Command
  389. ;
  390. POKE:    MOV    B,A
  391.     MVI    C,POKE1
  392.     CALL    WRBYTE
  393.     CALL    WRWORD
  394.     MOV    C,B
  395.     CALL    WRBYTE
  396.     RET
  397. ;
  398. PEEK:    MVI    C,PEEK1
  399.     CALL    WRBYTE
  400.     CALL    WRWORD
  401.     CALL    RDBYTE
  402.     RET
  403. ;
  404. CALL65:    MVI    C,CALL1
  405.     CALL    WRBYTE
  406.     CALL    WRWORD
  407.     RET
  408. ;
  409. GSINIT:                ; Initialize and move 6502 code in
  410. ;
  411.     LXI    D,0C00DH+SLOTOF2
  412.     CALL    PEEK
  413.     STA    INITPT
  414. ;
  415.     LXI    D,0C00FH+SLOTOF2
  416.     CALL    PEEK
  417.     STA    WRITPT
  418. ;
  419.     LXI    D,0C00EH+SLOTOF2
  420.     CALL    PEEK
  421.     STA    READPT
  422. ;
  423.     LXI    D,0C012H+SLOTOF2
  424.     CALL    PEEK
  425.     STA    EXTPT
  426. ;
  427.     MVI    C,POKLOT    ; Going to put the 6502 code in place
  428.     CALL    WRBYTE
  429.     LXI    D,0300H        ; Put it at 300H
  430.     CALL    WRWORD
  431.     LXI    D,END65-ST65+1    ; Length
  432.     CALL    WRWORD
  433.     LXI    H,ST65
  434.     LXI    D,END65-ST65+1
  435.     CALL    WRLOTS        ; Put it in place
  436. ;
  437.     LXI    D,INIT65
  438.     CALL    CALL65
  439.     RET
  440. ;
  441. ST65:
  442.     DB    04CH,013H,003H    ;     JMP    INIT
  443.     DB    04CH,01AH,003H    ;     JMP    READ
  444.     DB    04CH,024H,003H    ;     JMP    WRITE
  445.     DB    04CH,02FH,003H    ;     JMP    SETDTR
  446.     DB    04CH,03EH,003H    ;     JMP    SETCMD
  447.     DB    04CH,06AH,003H    ;     JMP    STATUS
  448.     DS    1        ; DATA    DFS    1
  449.     DB    0A2H,0C0H+SLOT    ; INIT    LDX    #Cn
  450.     DB    0A0H,SLOTOFF    ;    LDY    #n0
  451.     DB    04CH
  452. INITPT    DS    1        ;
  453.     DB    0C0H+SLOT    ;    JMP    CARD_INIT
  454.     DB    0ADH,012H,003H    ; WRITE    LDA    DATA
  455.     DB    0A2H,0C0H+SLOT    ;    LDX    #Cn
  456.     DB    0A0H,SLOTOFF    ;    LDY    #n0
  457.     DB    04CH
  458. WRITPT    DS    1
  459.     DB    0C0H+SLOT    ;    JMP    CARD_WRIT
  460.     DB    0A2H,0C0H+SLOT    ; READ    LDX    #Cn
  461.     DB    0A0H,SLOTOFF    ;    LDY    #n0
  462.     DB    020H
  463. READPT    DS    1
  464.     DB    0C0H+SLOT    ;    JSR    CARD_READ
  465.     DB    08DH,012H,003H    ;    STA    DATA
  466.     DB    060H        ;    RTS
  467.     DB    0ADH,012H,003H    ;SETDTR    LDA    DATA
  468.     DB    08DH,07EH,003H    ;    STA    DTRBYT
  469.     DB    0A9H,07AH    ;    LDA    #>DTRBUF
  470.     DB    0A2H,003H    ;    LDX    #<DTRBUF
  471.     DB    0A0H,000H    ;    LDY    #00
  472.     DB    04CH
  473. EXTPT    DS    1
  474.     DB    0C0H+SLOT    ;EXTJMP    JMP    CARD_EXT
  475.     DB    0A9H,000H    ;SETCMD    LDA    #00
  476.     DB    08DH,081H,003H    ;    STA    CMDSPOT
  477.     DB    0A9H,080H    ;    LDA    #>CMDBUF
  478.     DB    0A2H,003H    ;    LDX    #<CMDBUF
  479.     DB    0A0H,000H    ;    LDY    #00
  480.     DB    020H,03BH,003H    ;    JSR    EXTJMP
  481.     DB    0ADH,086H,003H    ;    LDA    CMDBYT
  482.     DB    02CH,012H,003H    ;    BIT    DATA
  483.     DB    010H,003H    ;    BPL    SKIP
  484.     DB    029H,07FH    ;    AND    #7F
  485.     DB    02CH        ;    DFB    $2CH    ;SKIP 2 BYTES
  486.     DB    009H,080H    ; SKIP    ORA    #80
  487.     DB    08DH,086H,003H    ;    STA    CMDBYT
  488.     DB    0A9H,001H    ;    LDA    #01
  489.     DB    08DH,081H,003H    ;    STA    CMDSPOT
  490.     DB    0A9H,080H    ;    LDA    #>CMDBUF
  491.     DB    0A2H,003H    ;    LDX    #<CMDBUF
  492.     DB    0A0H,000H    ;    LDY    #00
  493.     DB    04CH,03BH,003H    ;    JMP    EXTJMP
  494.     DB    0A9H,088H    ;STATUS    LDA    #>STATBUF
  495.     DB    0A2H,003H    ;    LDX    #<STATBUF
  496.     DB    0A0H,000H    ;    LDY    #0
  497.     DB    020H,03BH,003H    ;    JSR    EXTJMP
  498.     DB    0ADH,08CH,003H    ;    LDA    STATBYT
  499.     DB    08DH,012H,003H    ;    STA    DATA
  500.     DB    060H        ;    RTS
  501.     DB    003H,00BH    ;    DFB    03,0B
  502.     DS    4        ;    DFS    4
  503.     DB    003H,001H    ;    DFB    03,01
  504.     DS    6        ;    DFS    6
  505.     DB    003H,006H    ;    DFB    03,06
  506.     DS    4        ;    DFS    4
  507. END65:    DS    1
  508. ;
  509. INIT65:    EQU    0300H
  510. WRIT65:    EQU    0303H
  511. READ65:    EQU    0306H
  512. SDTR65:    EQU    0309H
  513. SCMD65:    EQU    030CH
  514. STAT65:    EQU    030FH
  515. DATA65:    EQU    0312H
  516. ;
  517. RD$MODDATP:            ; Read a character
  518.     PUSH    B
  519.     PUSH    D
  520.     PUSH    H
  521.     LXI    D,READ65
  522.     CALL    CALL65
  523.     LXI    D,DATA65
  524.     CALL    PEEK
  525.     POP    H
  526.     POP    D
  527.     POP    B
  528.     RET
  529. WR$MODDATP:            ; Write a character, or a command byte
  530. GSSEND: PUSH    B
  531.     PUSH    D
  532.     PUSH    H
  533.     LXI    D,DATA65
  534.     CALL    POKE
  535.     CALL    CALL65
  536.     POP    H
  537.     POP    D    
  538.     POP    B
  539.     RET
  540. RD$MODSTAP:            ; Get status byte
  541.     PUSH    B
  542.     PUSH    D
  543.     PUSH    H
  544.     LXI    D,STAT65
  545.     CALL    CALL65
  546.     LXI    D,DATA65
  547.     CALL    PEEK
  548.     POP    H
  549.     POP    D
  550.     POP    B
  551.     RET
  552. CMDENA:                ; Enable Ctrl-A cmds in out stream
  553.     MVI    A,0FFH
  554.     LXI    D,DATA65
  555.     CALL    POKE
  556.     LXI    D,SCMD65
  557.     JMP    CALL65
  558. CMDDIS:                ; Disable Ctrl-A cmds in out stream
  559.     MVI    A,000H
  560.     LXI    D,DATA65
  561.     CALL    POKE
  562.     LXI    D,SCMD65
  563.     JMP    CALL65
  564. CMDDTR:                ; Bit 7 of A is new DTR state
  565.     LXI    D,DATA65
  566.     CALL    POKE
  567.     LXI    D,SDTR65
  568.     JMP    CALL65
  569. ;
  570. ;-----------------------------------------------------------------------
  571. ;
  572. ;.....
  573. ;
  574. ;
  575. ; This routine changes the modem baud rate with phone list entry
  576. ;
  577. ; Set baud-rate code in A (if supported by your modem overlay).  PMMI
  578. ; supports only five rates, which are validated here. NOTE: this routine
  579. ; (ie, the one vectored through NEWBDV) should update MSPEED with the
  580. ; passed code, but ONLY if that rate is supported by the hardware.
  581. ;
  582. PBAUD:    PUSH    H        ;don't alter anybody
  583.     PUSH    D
  584.     PUSH    B
  585.     MOV    E,A        ;code to DE
  586.     MVI    D,0
  587.     LXI    H,BAUDTB    ;offset into table
  588.     DAD    D
  589.     MOV    A,M        ;fetch code
  590.     ORA    A        ;0 means unsupported code
  591.     JZ    PBEXIT        ;exit if so
  592.     STA    BAUDSV         ;good rate, save it for INITMOD1
  593.     CALL    INITMOD1    ;set baud (and PSW)
  594.     MOV    A,E        ;get speed code back
  595.     STA    MSPEED        ;make it current
  596.     JMP    PBEXIT + 1    ;jump error flag set
  597. PBEXIT:    STC            ;set return error for STBAUD caller
  598.     POP    B        ;all done
  599.     POP    D
  600.     POP    H
  601.     RET
  602. ;
  603. ; Table of baud rate parameters for supported rates
  604. ;
  605. BAUDTB:    DB    03H,06H,0,07H,0        ;110,300,450,610,710
  606.     DB    08H,10H,12H,14H,15H    ;1200,2400,4800,9600,19200
  607. BAUDSV: DB    10H            ;current baud byte
  608. ;
  609. ; Parity/wordlen table equates
  610. ;
  611. P8N1        EQU    000H    ;8 NONE 1
  612. P7E1        EQU    013H    ;7 EVEN 1
  613. P7O1        EQU    011H    ;7 ODD 1
  614. P7N1        EQU    010H    ;7 NONE 1
  615. ;
  616. ;----------------------------------------------------------------------
  617. ;
  618. ; Sign-on message
  619. ;
  620. SYSVER:    LXI    D,VERMSG
  621.     MVI    C,PRINT
  622.     CALL    MEX
  623.     RET
  624. ;
  625. ;.....
  626. ;
  627. ; Newline on console
  628. ;
  629. CRLF:    MVI    A,CR
  630.     CALL    TYPE
  631.     MVI    A,LF        ;fall into TYPE
  632. ;
  633. ; type char in A on console
  634. ;
  635. TYPE:    PUSH    H        ;save 'em
  636.     PUSH    D
  637.     PUSH    B
  638.     MOV    E,A        ;align output character
  639.     MVI    C,CONOUT    ;print via MEX
  640.     CALL    MEX
  641.     POP    B
  642.     POP    D
  643.     POP    H
  644.     RET
  645. ;
  646. ;----------------------------------------------------------------------
  647. ;
  648. ; The remainder of this overlay implements a very versatile SET command
  649. ; -- if you prefer not to write a SET for your modem, you may delete the
  650. ; code from here to the END statement. Control is passed here after
  651. ; MEX parses a SET command.
  652. ;
  653. ;
  654. SETCMD:    MVI    C,SBLANK    ;any arguments?
  655.     CALL    MEX
  656.     JC    SETSHO        ;if not, go print out values
  657.     LXI    D,CMDTBL    ;parse command
  658.     CALL    TSRCH        ;from table
  659.     PUSH    H        ;any address on stack
  660.     RNC            ;if we have one, execute it
  661.     POP    H        ;nope, fix stack
  662. SETERR:    LXI    D,SETEMS    ;print error
  663.     MVI    C,PRINT
  664.     CALL    MEX
  665.     RET
  666. ;
  667. SETEMS:    DB    CR,LF,'SET command error',CR,LF,'$'
  668. ;
  669. ; SET command table ... note that tables are constructed of command-
  670. ; name (terminated by high bit=1) followed by word-data-value returned
  671. ; in HL by MEX service processor LOOKUP.  Table must be terminated by
  672. ; a binary zero.
  673. ;
  674. ; Note that LOOKUP attempts to find the next item in the input stream
  675. ; in the table passed to it in HL ... if found, the table data item is
  676. ; returned in HL; if not found, LOOKUP returns carry set.
  677. ;
  678. CMDTBL:    DB    '?'+80H            ;"set ?"
  679.     DW    STHELP
  680.     DB    'BAU','D'+80H        ;"set baud"
  681.     DW    STBAUD
  682.     DB    'PS','W'+80H        ;"set PSW"
  683.     DW    STPSW
  684.     DB    'TON','E'+80H        ;'set TONE/PULSE byte to 'T'
  685.     DW    STTONE
  686.     DB    'PULS','E'+80H        ;'set TONE/PULSE byte to 'P'
  687.     DW    STPULSE
  688.     DB    0            ;<<=== table terminator
  689. ;
  690. ; SET <no-args>: print current statistics
  691. ;
  692. SETSHO:    LXI    H,SHOTBL    ;get table of SHOW subroutines
  693. SETSLP:    MOV    E,M        ;get table address
  694.     INX    H
  695.     MOV    D,M
  696.     INX    H
  697.     MOV    A,D        ;end of table?
  698.     ORA    E
  699.     RZ            ;exit if so
  700.     PUSH    H        ;save table pointer
  701.     XCHG            ;adrs to HL
  702.     CALL    GOHL        ;do it
  703.     CALL    CRLF        ;print newline
  704.     MVI    C,CHEKCC    ;check for console abort
  705.     CALL    MEX
  706.     POP    H        ;it's done
  707.     JNZ    SETSLP        ;continue if no abort
  708.     RET
  709. ;
  710. GOHL:    PCHL
  711. ;
  712. ; Table of SHOW subroutines
  713. ;
  714. SHOTBL:    
  715.     DW    BDSHOW        ;displays current baud
  716.     DW    PSWSHOW        ;displays current PSW
  717.     DW    TPSHOW        ;displays current TPULSE byte (0105H)
  718.     DW    CRLF
  719.     DW    0        ;<<== table terminator
  720. ;
  721. ; SET ?  processor
  722. ;
  723. STHELP:    CALL     CLS            ;clear screen
  724.     LXI    D,HLPMSG
  725.     MVI    C,PRINT
  726.     CALL    MEX
  727.     RET
  728. ;
  729. ; The help message
  730. ;
  731. HLPMSG:    DB    CR,LF,'SET Commands available are:',CR,LF,LF
  732.     DB    'SET BAUD  <110, 300, 600, 1200, 2400, 4800,'
  733.     DB    ' 9600, or 19200>',CR,LF
  734.     DB    'SET PSW   <8N1, 7E1, 7O1, or 7N1> -- Word Length,'
  735.     DB    ' Parity, Stop Bits',CR,LF
  736.     DB    'SET TONE  (Sets flag for TONE  dialing)',CR,LF
  737.     DB    'SET PULSE (Sets flag for PULSE dialing)'
  738.     DB    CR,LF,LF,'$'
  739. ;
  740. ; SET BAUD processor
  741. ;
  742. STBAUD:    MVI    C,BDPARS    ;function code
  743.     CALL    MEX    
  744.     JC    SETERR        ;invalid code
  745.     CALL    PBAUD        ;try to set it
  746.     JC    SETERR        ;unsupported code
  747. BDSHOW:    CALL    ILPRT        ;display baud
  748.     DB    'Baud rate:',TAB,' ',0
  749.     LDA    MSPEED
  750.     MVI    C,PRBAUD    ;use MEX routine
  751.     CALL    MEX
  752.     RET
  753. ;
  754. ; SET PSW processor
  755. ;
  756. STPSW:    MVI    C,SBLANK
  757.     CALL    MEX
  758.     JC    SETERR        ;SET PSW should have had argument
  759.     LXI    D,PSWTBL    ;look for PSW match in table
  760.     CALL    TSRCH
  761.     JC    SETERR        ;not there, so report error
  762.     CALL    FIXPSW        ;routine to set PARSV and WRDSV
  763.     CALL    INITMOD1    ;now fix ACIA registers
  764. ;
  765. PSWSHOW:
  766.     CALL    ILPRT
  767.     DB    'PSW setting:',TAB,' ',0
  768.     LDA    PSWSET
  769.     CPI    P8N1
  770.     JNZ    PSW1
  771.     CALL    ILPRT
  772.     DB    '8N1',0
  773.     RET
  774. PSW1:    CPI    P7E1
  775.     JNZ    PSW2
  776.     CALL    ILPRT
  777.     DB    '7E1',0
  778.     RET
  779. PSW2:    CPI    P7O1
  780.     JNZ    PSW3
  781.     CALL    ILPRT
  782.     DB    '7O1',0
  783.     RET
  784. PSW3:    CPI    P7N1
  785.     JNZ    PSW4
  786.     CALL    ILPRT
  787.     DB    '7N1',0
  788.     RET
  789. PSW4:    CALL    ILPRT
  790.     DB    '<< ERROR >>',0
  791.     RET
  792. ;
  793. ;
  794. PSWSET:    DB    00H        ;storage and default (8N1)
  795. PARSV:    DB    00H        ;storage and default (no parity)
  796. WRDSV:    DB    00H        ;storage and default (8 data, 1 stop bits)
  797. ;
  798. FIXPSW:    MOV    A,L        ;PSW byte from table
  799.     STA    PSWSET        ;save it
  800.     ANI    0FH        ;mask low for parity bits
  801.     STA    PARSV        ;put in storage
  802.     LDA    PSWSET        ;get back PSW byte
  803.     RAR            ;first shift into lower nibble..
  804.     RAR            ;...away we go...
  805.     RAR            ;.....and go...
  806.     RAR            ;......and done
  807.     ANI    0FH        ;mask for word bits
  808.     STA    WRDSV        ;put in storage
  809.     RET
  810. ;
  811. PSWTBL:    DB    '8N','1'+80H
  812.     DW    P8N1        ;filled in with equ's
  813.     DB    '7E','1'+80H
  814.     DW    P7E1        ; - ditto -
  815.     DB    '7O','1'+80H
  816.     DW    P7O1        ; - ditto -
  817.     DB    '7N','1'+80H
  818.     DW    P7N1        ; - ditto -
  819.     DB    0        ;<<==== table terminator
  820. ;
  821. ;.....
  822. ;
  823. ; These routines set TPULSE flag at 0105H to either 'T' or 'P' so that
  824. ; MODEM (specifically MXO-SM13.ASM) overlay will dial in TONE or PULSE
  825. ; mode.  The settings are mutually exclusive.
  826. ;
  827. STTONE:    MVI    A,'T'        ;get T flag
  828.     STA    TPULSE        ;put into proper place
  829.     JMP    TPSHOW        ;display dial mode
  830. ;
  831. STPULSE:
  832.     MVI    A,'P'        ;get P flag
  833.     STA    TPULSE
  834. ;
  835. TPSHOW:    CALL    ILPRT
  836.     DB    'Dial Mode:',TAB,' ',0
  837.     LDA    TPULSE
  838.     CPI    'T'
  839.     JNZ    TP1
  840.     CALL    ILPRT
  841.     DB    'TONE',0
  842.     RET
  843. TP1:    CPI    'P'
  844.     JNZ    TP2
  845.     CALL    ILPRT
  846.     DB    'PULSE',0
  847.     RET
  848. TP2:    CALL    ILPRT
  849.     DB    '<< ERROR >>',0
  850.     RET
  851. ;
  852. ;......
  853. ;
  854. ; Compare next input-stream item in table @DE; CY=1 if not found,
  855. ; else HL = matched data item
  856. ;
  857. TSRCH:    MVI    C,LOOKUP    ;get function code
  858.     JMP    MEX        ;pass to MEX processor
  859. ;
  860. ; Print in-line message ... blows away C register
  861. ;
  862. ILPRT:    MVI    C,ILP        ;get function code
  863.     JMP    MEX        ;go do it
  864. ;
  865. ;
  866. ;    >>>>   End of PORT specific overlay section   <<<<
  867.  
  868. ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  869. ;
  870. ;        MODEM SPECIFIC OVERLAY SECTION
  871. ;
  872. ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  873. ;
  874. ;        MEX SMARTMODEM OVERLAY V1.3
  875. ;
  876. ; Smartmodem overlay for MEX: revision 1.3
  877. ;
  878. ; Adapted by Henry Middlebrook (1/85)
  879. ;
  880. ; NOTE: Some redundant parts of the V1.3 overlay were removed when this
  881. ;    section was pulled into MXO-SS30.  See the original overlay for
  882. ;    additional information on the history and use of this MODEM
  883. ;    specific overlay.        -HM-    2/4/85
  884. ;
  885. ; Written 04/16/84 by Ronald G. Fowler (V1.0)
  886. ;
  887. ;
  888.     ORG    0B00H        ;maintain official MEX origin
  889. ;
  890. DIAL:    LHLD    DIALPT        ;FETCH POINTER
  891.     CPI    254        ;START DIAL?
  892.     JZ    STDIAL        ;JUMP IF SO
  893.     CPI    255        ;END DIAL?
  894.     JZ    ENDIAL        ;JUMP IF SO
  895. ;
  896. ; Not start or end sequence, must be a digit to be sent to the modem
  897. ;
  898.     MOV    M,A        ;PUT CHAR IN BUFFER
  899.     INX    H        ;ADVANCE POINTER
  900.     SHLD    DIALPT        ;STUFF PNTR
  901.     RET            ;ALL DONE
  902. ;
  903. ; Here on a start-dial sequence
  904. ;
  905. STDIAL:    LXI    H,DIALBF    ;SET UP BUFFER POINTER
  906.     SHLD    DIALPT
  907.     RET
  908. ;
  909. ; Here on an end-dial sequence
  910. ;
  911. ENDIAL:    MVI    M,CR        ;STUFF END-OF-LINE INTO BUFFER
  912.     INX    H        ;FOLLOWED BY TERMINATOR
  913.     MVI    M,0
  914.     LDA    TPULSE        ;GET OVERLAY'S TOUCH-TONE FLAG
  915.     STA    SMDIAL+3    ;PUT INTO STRING
  916.     LXI    H,SMDIAL    ;POINT TO DIALING STRING
  917.     CALL    SMSEND        ;SEND IT
  918. WAITSM:    MVI    C,INMDM
  919.     CALL    MEX        ;CATCH ANY OUTPUT FROM THE MODEM
  920.     JNC    WAITSM        ;LOOP UNTIL NO MORE CHARACTERS
  921. ;
  922. ; THE FOLLOWING LOOP WAITS FOR A RESULT FROM THE MODEM (UP TO
  923. ; 60 SECONDS: YOU MAY CHANGE THIS VALUE IN THE FOLLOWING LINE).
  924. ; NOTE THAT THE SMARTMODEM HAS AN INTERNAL 30 SECOND TIMEOUT WHILE
  925. ; FOR A CARRIER ON THE OTHER END.  YOU CAN CHANGE BY PLAYING WITH THE
  926. ; S7 VARIABLE (I.E. SEND THE SMARTMODEM "AT S7=20" TO LOWER THE 30 SECOND
  927. ; WAIT TO 20 SECONDS).
  928. ;
  929. RESULT:    MVI    C,60        ;<<== MAXIMUM TIME TO WAIT FOR RESULT
  930. SMWLP:    PUSH    B
  931.     MVI    B,1        ;CHECK FOR A CHAR, UP TO 1 SEC WAIT
  932.     MVI    C,TMDINP    ;DO TIMED INPUT
  933.     CALL    MEX
  934.     POP    B
  935.     JNC    SMTEST        ;JUMP IF MODEM HAD A CHAR
  936.     PUSH    B        ;NO, TEST FOR CONTROL-C FROM CONSOLE
  937.     MVI    C,CHEKCC
  938.     CALL    MEX
  939.     POP    B
  940.     JNZ    SMNEXT        ;IF NOT, JUMP
  941.     MVI    B,CR        ;YES, SHUT DOWN THE MODEM
  942.     MVI    C,SNDCHR
  943.     CALL    MEX
  944.     MVI    A,3        ;RETURN ABORT CODE
  945.     RET
  946. SMNEXT:    DCR    C        ;NO
  947.     JNZ    SMWLP        ;CONTINUE
  948. ;
  949. ; ONE MINUTE WITH NO MODEM RESPONSE (OR NO CONNECTION)
  950. ;
  951. SMTIMO:    MVI    A,2        ;RETURN TIMEOUT CODE
  952.     RET
  953. ;
  954. ; MODEM GAVE US A RESULT, CHECK IT
  955. ;
  956. SMTEST:    ANI    7FH        ;IGNORE ANY PARITY
  957.     CALL    SMANAL        ;TEST THE RESULT
  958.     MOV    A,B        ;A=RESULT (CY SIGNIFICANT HERE TOO)
  959.     PUSH    PSW        ;SAVE IT
  960. SMTLP:    MVI    C,INMDM        ;FLUSH ANY REMAINING COMMAND LINE
  961.     CALL    MEX
  962.     JC    SMCHEK        ;JUMP IF NO INPUT
  963.     CPI    LF        ;GOT SOME ... WAITING FOR EOL
  964.     JNZ    SMTLP        ;EAT ANY IN-BETWEEN
  965. SMCHEK:    POP    PSW        ;A HAS MEX RETURN-CODE, CY=1 IF UNKNOWN
  966.     JC    RESULT        ;IF RESULT UNKNOWN, IGNORE IT
  967.     RET
  968. ;
  969. SMANAL:    MVI    B,0        ;PREP CONNECT CODE
  970.     CPI    'C'        ;"CONNECT"?
  971.     RZ
  972.     CPI    '1'        ;NUMERIC VERSION OF "CONNECT"
  973.     RZ
  974.     CPI    '5'        ;NUMERIC VERSION OF "CONNECT 1200"
  975.     RZ
  976.     INR    B        ;PREP BUSY CODE B=1
  977.     CPI    'B'
  978.     RZ
  979.     INR    B        ;PREP NO CONNECT MSG B=2
  980.     CPI    'N'        ;N=NO CONNECT
  981.     RZ
  982.     CPI    '3'        ;NUMERIC VERSION OF "NO CONNECT"
  983.     RZ
  984.     MVI    B,4        ;PREP MODEM ERROR
  985.     CPI    'E'        ;E=ERROR
  986.     RZ
  987.     CPI    '4'        ;NUMERIC VERSION OF "ERROR"
  988.     RZ
  989.     STC            ;UNKNOWN...
  990.     RET
  991. ;
  992. ;.....
  993. ;
  994. ; SMARTMODEM UTILITY ROUTINE: SEND STRING TO MODEM
  995. ;
  996. SMSEND:    MVI    C,SNDRDY    ;WAIT FOR MODEM READY
  997.     CALL    MEX
  998.     JNZ    SMSEND
  999.     MOV    A,M        ;FETCH NEXT CHARACTER
  1000.     INX    H
  1001.     ORA    A        ;END?
  1002.     RZ            ;DONE IF SO
  1003.     MOV    B,A        ;NO, POSITION FOR SENDING
  1004.     MVI    C,SNDCHR    ;NOPE, SEND THE CHARACTER
  1005.     CALL    MEX
  1006.     JMP    SMSEND
  1007. ;
  1008. ; DATA AREA
  1009. ;
  1010. SMDIAL:    DB    'ATDT '
  1011. DIALBF:    DS    52        ;2* 24 CHAR MAX, + CR + NULL + SLOP
  1012. DIALPT:    DS    2        ;DIAL POSITION POINTER
  1013. ;
  1014. ;
  1015. ;    >>>>    End of MODEM Specific Overlay
  1016.