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-MM2.ASM < prev    next >
Assembly Source File  |  2000-06-30  |  19KB  |  766 lines

  1. ; MXMM-2.ASM
  2. ;
  3. REV     EQU     20        ;OVERLAY REVISION LEVEL
  4. ;
  5. ; MEX Micromodem II/IIe overlay for the APPLE II/II+/IIe;
  6. ;    written 09/04/84 by Joe Patterson (70235,460)
  7. ;        adapted from
  8. ;
  9. ; MEX Apple Super Serial Card / Novation J-Cat overlay
  10. ;    written 05/18/84 by D. W. Walker
  11. ;    ALS bank-switching adapted from
  12. ;    an overlay by James M. Scardelis
  13. ;
  14. ; Revn: 1.0  04 Sept 84 -- Modified MXO-AP.21 to produce this
  15. ;                overlay.
  16. ;    2.0  09 SEPT 84 -- ADDED TOUCH-TONE DIALING FOR THE
  17. ;               MICROMODEM IIE (ONLY)
  18. ;            -- RENAMED TO MXMM-2.ASM FROM MXO-MM10.ASM
  19. ;            -- ADDED CONTROL PORT 3 JUMP FOR THE
  20. ;               SOFTCARD (COULD NOT USE MMIIE ON 
  21. ;               SOFTCARD OTHERWISE)
  22. ;
  23. ;
  24. ; This overlay is for the MEX--- series of modem programs. It is
  25. ;   adapted from MXO-AP.21 to work with the APPLE II and the
  26. ;   Hayes Micromodem II and IIe with either the ALS CP/M CARD
  27. ;   or the Microsoft Softcard. Data format is 8 bits, no parity,
  28. ;   1 stop bit. If you have the Micromodem IIe then answer YES
  29. ;   to --BOTH-- equates MM and MM2e to turn the speaker on when
  30. ;   dialing and off when connected. If you have the Micromodem II
  31. ;   then you must --NOT-- answer yes to the MM2e equate as the
  32. ;   program will probably bomb out if you do.
  33. ;
  34. ; Revision 2.0 now supports touch-tone dialing on the Micromodem
  35. ;   IIe (ONLY) if you answer YES to the MM2E equate. When using
  36. ;   touch-tone, the comma (,) feature is supported. Inserting a
  37. ;   comma in the number being dialed, causes a 2 second delay for
  38. ;   each one used. For example, 555-12,34 causes dialing to pause
  39. ;   for 2 seconds between digits 2 and 3. This is especially useful
  40. ;   when waiting for an outside line or a second dial tone. Multiple
  41. ;   commas can be used.
  42. ;
  43. ; I have tested this overlay and it seems to work ok, but, if
  44. ;   anyone finds any let me know and I will try to correct them
  45. ;   as soon as possible.
  46. ;
  47. ;
  48. ; The SET WAIT command adjusts the time that the dialing
  49. ;   routines will wait for a connection (carrier), from
  50. ;   0 to 25 seconds.
  51. ; NOTE: Most of the comments from Ron Fowler's MXO-PM10.ASM
  52. ;   have been omitted here to save space.  A copy of that file
  53. ;   will be very helpful in understanding what's going on here. 
  54. ;
  55. ;------------------------------------------------------------
  56. ;
  57. ; Misc equates
  58. ;
  59. NO    EQU    0
  60. YES    EQU    0FFH
  61. TPA    EQU    100H
  62. CR    EQU    13
  63. LF    EQU    10
  64. BELL    EQU    7
  65. TAB    EQU    9
  66. ESC    EQU    27
  67. ;      
  68. MM    EQU    YES    ;YES FOR HAYES MICROMODEM II
  69. MM2E    EQU    YES    ;YES FOR MM2E ONLY (FOR TOUCH-TONE & SPEAKER)
  70.             ;MUST BE NO IF YOU HAVE THE MICROMODEM II
  71. SFTCRD    EQU    NO    ;YES for Microsoft Softcard } choose
  72. ALSCRD    EQU    YES    ;YES for ALS CP/M+ card     } one only
  73.     IF SFTCRD
  74. POFF    EQU    2000H    ;Softcard address offset
  75. RATE    EQU    20
  76.     ENDIF
  77. ;
  78.     IF ALSCRD
  79. POFF    EQU    0
  80. RATE    EQU    60
  81.     ENDIF
  82. ;
  83.     IF    MM
  84. SLOT    EQU    20H        ;SLOT FOR MICROMODEM X 10
  85. PORT    EQU    0C086H+POFF+SLOT  ;BASE CTL/STAT PORT FOR MM
  86. MODDAT    EQU    PORT+1        ;MM DATA PORT
  87. MODSTT    EQU    PORT        ;MM STATUS PORT
  88. MODCTL    EQU    PORT        ;MM CTL PORT 1
  89. BAUDRP    EQU    PORT-1        ;MM CTL PORT 2
  90. MODCTL3:EQU    PORT-3        ;MM2e CONTROL PORT 3
  91. ;
  92. ;
  93. MDRCVB    EQU    01H    ;MM RECIEVE BIT
  94. MDRCVR    EQU    01H    ;MM RECIEVE READY BIT
  95. MDSNDB    EQU    02H    ;MM SEND BIT
  96. MDSNDR    EQU    02H    ;MM SEND READY BIT
  97. ;
  98. DTR     EQU    8FH        ;TRANS ENABLE, ORIG., 300 BAUD
  99. OFFHK    EQU    80H        ;OFF-HOOK
  100. ONHK    EQU    0        ;ON-HOOK
  101. SPKRON    EQU    00100000B    ;MMIIe SPEAKER ON
  102. SPKROFF EQU     00000000B    ;MMIIe SPEAKER OFF
  103. ;
  104. CTSMSK    EQU    00000000B      ;MASK TO TEST FOR CARRIER
  105. BRKMSK    EQU    60H          ;MASK TO SET BREAK
  106. ONHOOK    EQU    0C085H+POFF+SLOT  ;ADDRESS FOR ONHOOK SET
  107. OFFHOOK EQU    ONHOOK            ;OFFHOOK ADDRESS
  108.     ENDIF    ;MM
  109. ;
  110. ;
  111. ;
  112. ; MEX service processor stuff ... See MXO-PM10.ASM
  113. ;
  114. MEX    EQU    0D00H        ;address of the service processor
  115. INMDM    EQU    255        ;get char from port to A, CY=no more in 100 ms
  116. TIMER    EQU    254        ;delay 100ms * reg B
  117. TMDINP    EQU    253        ;B=# secs to wait for char, cy=no char
  118. CHEKCC    EQU    252        ;check for ^C from KBD, Z=present
  119. SNDRDY    EQU    251        ;test for modem-send ready
  120. RCVRDY    EQU    250        ;test for modem-receive ready
  121. SNDCHR    EQU    249        ;send a character to the modem (after sndrdy)
  122. RCVCHR    EQU    248        ;recv a char from modem (after rcvrdy)
  123. LOOKUP    EQU    247        ;table search: see CMDTBL comments for info
  124. PARSFN    EQU    246        ;parse filename from input stream
  125. BDPARS    EQU    245        ;parse baud-rate from input stream
  126. SBLANK    EQU    244        ;scan input stream to next non-blank
  127. EVALA    EQU    243        ;evaluate numeric from input stream
  128. LKAHED    EQU    242        ;get nxt char w/o removing from input
  129. GNC    EQU    241        ;get char from input, cy=1 if none
  130. ILP    EQU    240        ;inline print
  131. DECOUT    EQU    239        ;decimal output
  132. PRBAUD    EQU    238        ;print baud rate
  133. ;
  134. ;
  135. CONOUT    EQU    2        ;simulated BDOS function 2: console char out
  136. PRINT    EQU    9        ;simulated BDOS function 9: print string
  137. INBUF    EQU    10        ;input buffer, same structure as BDOS 10
  138. ;
  139.     ORG    TPA        ;we begin
  140. ;
  141. ;
  142.     DS    3        ;MEX has a JMP START here
  143. ;
  144. ; The following variables are located at the beginning of the program
  145. ; to facilitate modification without the need of re-assembly. They will
  146. ; be moved in MEX 2.0.
  147. ;
  148. PMODEM:    DB    YES        ;yes=PMMI modem \ / These 2 locations are not
  149. SMODEM:    DB    NO        ;yes=Smartmodem / \ referenced by MEX
  150. TPULSE:    DB    'P'        ;T=touch, P=pulse (not referenced by MEX)
  151. CLOCK:    DB    RATE        ;clock speed x .1, up to 25.5 mhz.
  152. MSPEED:    DB    1        ;sets display time for sending a file
  153.                 ;0=110    1=300  2=450  3=600  4=710
  154.                 ;5=1200 6=2400 7=4800 8=9600 9=19200
  155. BYTDLY:    DB    5        ;default time to send character in
  156.                 ;terminal mode file transfer (0-9)
  157.                 ;0=0 delay, 1=10 ms, 5=50 ms, 9=90 ms
  158. CRDLY:    DB    3        ;end-of-line delay after CRLF in terminal
  159.                 ;mode file transfer for slow BBS systems
  160.                 ;0=0 delay, 1=100 ms, 5=500 ms, 9=900 ms
  161. COLUMS:    DB    5        ;number of directory columns
  162. SETFL:    DB    YES        ;yes=user-defined SET command
  163. SCRTST:    DB    YES        ;yes=if home cursor and clear screen
  164.                 ;routine at CLRSCRN
  165.     DB    0        ;was once ACKNAK, now spare
  166. BAKFLG:    DB    NO        ;yes=make .BAK file
  167. CRCDFL:    DB    YES        ;yes=default to CRC checking
  168.                 ;no=default to Checksum checking
  169. TOGCRC:    DB    YES        ;yes=allow toggling of Checksum to CRC
  170. CVTBS:    DB    NO        ;yes=convert backspace to rub
  171. TOGLBK:    DB    YES        ;yes=allow toggling of bksp to rub
  172. ADDLF:    DB    NO        ;no=no LF after CR to send file in
  173.                 ;terminal mode (added by remote echo)
  174. TOGLF:    DB    YES        ;yes=allow toggling of LF after CR
  175. TRNLOG:    DB    NO        ;yes=allow transmission of logon
  176.                 ;write logon sequence at location LOGON
  177. SAVCCP:    DB    YES        ;yes=do not overwrite CCP
  178. LOCNXT:    DB    NO        ;yes=local cmd if EXTCHR precedes
  179.                 ;no=not local cmd if EXTCHR precedes
  180. TOGLOC:    DB    YES        ;yes=allow toggling of LOCNXTCHR
  181. LSTTST:    DB    YES        ;yes=allow toggling of printer on/off
  182.                 ;in terminal mode. Set to no if using
  183.                 ;the printer port for the modem
  184. XOFTST:    DB    NO        ;yes=allow testing of XOFF from remote
  185.                 ;while sending a file in terminal mode
  186. XONWT:    DB    NO        ;yes=wait for XON after sending CR while
  187.                 ;transmitting a file in terminal mode    
  188. TOGXOF:    DB    YES        ;yes=allow toggling of XOFF testing
  189. IGNCTL:    DB    YES        ;yes=do not send control characters
  190.                 ;above CTL-M to CRT in terminal mode
  191.                 ;no=send any incoming CTL-char to CRT
  192. EXTRA1:    DB    0        ;for future expansion
  193. EXTRA2:    DB    0        ;for future expansion
  194. BRKCHR:    DB    '@'-40H        ;^@ = Send a 300 ms. break tone
  195. NOCONN:    DB    'N'-40H        ;^N = Disconnect from phone line
  196. LOGCHR:    DB    'L'-40H        ;^L = Send logon
  197. LSTCHR:    DB    'P'-40H        ;^P = Toggle printer
  198. UNSVCH:    DB    'R'-40H        ;^R = Close input text buffer
  199. TRNCHR:    DB    'T'-40H        ;^T = Transmit file to remote
  200. SAVCHR:    DB    'Y'-40H        ;^Y = Open input text buffer
  201. EXTCHR:    DB    '^'-40H        ;^^ = Send next character
  202. ;
  203.     DS    2
  204. ;
  205. INCTL1:    CALL    XSTTIN        ;in modem status port
  206.     RET
  207.     DB    0,0,0,0,0,0    ;spares if needed
  208. ;            
  209. OTDATA:    CALL    XDATOUT        ;out modem data port
  210.     RET
  211.     DB    0,0,0,0,0,0    ;spares if needed
  212. ;
  213. INPORT:    CALL    XDATIN        ;in modem data port
  214.     RET
  215.     DB    0,0,0,0,0,0    ;spares if needed
  216. ;
  217. MASKR:    ANI MDRCVB ! RET    ;bit to test for receive ready
  218. TESTR:    CPI MDRCVR ! RET    ;value of receive bit when ready
  219. MASKS:    ANI MDSNDB ! RET    ;bit to test for send ready
  220. TESTS:    CPI MDSNDR ! RET    ;value of send bit when ready
  221. ;
  222. ;
  223.     DS    12
  224. ;
  225. ;
  226. LOGON:    DS    2        ;needed for MDM compat, not ref'd by MEX
  227. DIALV:    JMP    PDIAL        ;dial digit in A (see info at PDIAL)
  228. DISCV:    JMP    PDISC        ;disconnect the modem
  229. GOODBV:    JMP    DUMMY        ;called before exit to CP/M
  230. INMODV:    JMP    NITMOD        ;initialization. Called at cold-start
  231. NEWBDV:    JMP    PBAUD        ;set baud rate
  232. NOPARV:    DS    3        ;set modem for no-parity
  233. PARITV:    DS    3        ;set modem parity
  234. SETUPV:    JMP    SETCMD        ;SET cmd: jump to a RET if you don't write SET
  235. SPMENV:    DS    3        ;not used with MEX
  236. VERSNV:    JMP    SYSVER        ;Overlay's voice in the sign-on message
  237. BREAKV:    JMP    PBREAK        ;send a break
  238. ;
  239. ;
  240. ILPRTV:    DS    3        ;replace with MEX function 9
  241. INBUFV:    DS    3        ;replace with MEX function 10
  242. ILCMPV:    DS    3        ;replace with table lookup funct. 247
  243. INMDMV:    DS    3        ;replace with MEX function 255
  244. NXSCRV:    DS    3        ;not supported by MEX (returns w/no action)
  245. TIMERV:    DS    3        ;replace with MEX function 254
  246. ;
  247. CLREOS:    LXI    D,EOSMSG
  248.     MVI    C,PRINT
  249.     CALL    MEX
  250.     RET
  251. ;
  252. CLS:    LXI    D,CLSMSG
  253.     MVI    C,PRINT
  254.     CALL    MEX
  255.     RET
  256. ;
  257. ;------------------------------------------------------------
  258. ;
  259. ;    *** END OF FIXED FORMAT AREA ***
  260. ;
  261. ;------------------------------------------------------------
  262. ;
  263. ; MICROMODEM AND ALS CARD INITIALIZATION
  264. ;
  265. NITMOD:    
  266.     IF ALSCRD
  267.     LHLD    1        ;get WBOOT vector
  268.     LXI    D,60H        ;offset for 32 entries
  269.     DAD    D        ;BIOS "read Apple address"
  270.     SHLD    AR0+1        ;patch read vector
  271.     INX    H
  272.     INX    H
  273.     INX    H        ;BIOS "write Apple address"
  274.     SHLD    AW0+1        ;patch write vector
  275.      ENDIF
  276.  
  277. ;
  278.     IF    MM
  279.     MVI    A,03H
  280.     CALL    XCTLOUT        ;RESET MICROMODEM
  281.     MVI    A,15H        ;8 DATA BITS 1 STOP NO PARITY
  282.     CALL    XCTLOUT
  283.     RET
  284.     ENDIF    ;MM
  285. ;
  286. ; Micromodem send-break routine
  287. ;
  288. PBREAK:    CALL    XCTLIN        ;get control register
  289.     PUSH    PSW        ;save it
  290.     ORI    BRKMSK        ;set break bits
  291.     CALL    XCTLOUT        ;break line
  292.     PUSH    B
  293.     LXI    B,233        ;wait 233 msec
  294.     CALL    DELAY
  295.     POP    B
  296.     POP    PSW
  297.     CALL    XCTLOUT        ;restore control register 
  298.     RET
  299. ;
  300. ; disconnect the Micromodem (and turn off MMIIe speaker)
  301. ;
  302. PDISC:    PUSH    B
  303. ;
  304.     IF    MM2E
  305.     MVI    A,SPKROFF
  306.     CALL    XCTL3        ;SPEAKER OFF
  307.     ENDIF            ;MM2E
  308. ;
  309.     MVI    A,ONHK
  310.     CALL    XONHOOK        ;hang up
  311.     LXI    B,25        ;for 25 msec
  312.     CALL    DELAY
  313.     MVI    A,OFFHK
  314.     CALL    XOFFHK        ;pick up again
  315.     LXI    B,20        ;for 20 msec
  316.     CALL    DELAY
  317.     MVI    A,ONHK
  318.     CALL    XONHOOK        ;hang up for good
  319.     POP    B
  320.     RET
  321. ;
  322. ; wait for BC milliseconds
  323. ;
  324. DELAY:    PUSH    D
  325.     INR    B
  326. DELAY1:    LXI    D,3*RATE    ;count for 1 msec
  327. DELAY2:    DCX    D        ;..may need some tweaking
  328.     MOV    A,E
  329.     ORA    D
  330.     JNZ    DELAY2        ;delay 1 msec
  331.     DCR    C
  332.     JNZ    DELAY1        ;delay another
  333.     DCR    B
  334.     JNZ    DELAY1
  335.     POP    D        ;done, restore DE
  336.     RET
  337. ;
  338. ; exit routine
  339. ;
  340. DUMMY:    RET            ;we don't need one
  341. ;
  342. ;
  343. ;------------------------------------------------------------
  344. ;
  345. ;   MICROMODEM DIALING ROUTINES (PULSE AND TOUCH-TONE)
  346. ;
  347. ;------------------------------------------------------------
  348. ;
  349. PDIAL:    CPI    254        ;start-dial?
  350.     JZ    STDIAL
  351.     CPI    255        ;end-dial
  352.     JZ    ENDIAL
  353. ;
  354.     CPI    ','        ;SEE IF DIGIT IS ','
  355.     JZ    DIALCM        ;YES
  356.     CPI    '9'+1        ;digits are 0-9
  357.     RNC            ;too big...
  358.     SUI    '0'
  359.     RC            ;too small....
  360.     JNZ    DIALIT        ;just right...
  361.     MVI    A,10        ;convert zero to 10 pulses
  362. ;
  363. ; Pulse phone "digit" times
  364. ;
  365.     IF    NOT MM2E
  366. DIALIT:    MOV    E,A        ;save the digit
  367.     PUSH    B
  368. DIGLP:    MVI    A,ONHK
  369.     CALL    XONHOOK
  370.     LXI    B,65        ;for 65 msec
  371.     CALL    DELAY
  372.     MVI    A,OFFHK
  373.     CALL    XOFFHK        ;connect line
  374.     LXI    B,42        ;for 42 msec
  375.     CALL    DELAY
  376.     DCR    E        ;pulse again?
  377.     JNZ    DIGLP        ;yes, do it
  378.     MVI    B,3        ;300 MSEC BETWEEN DIGITS
  379.     MVI    C,TIMER
  380.     CALL    MEX
  381.     POP    B        ;no, exit
  382.     RET
  383.     ENDIF            ;MM
  384. ;
  385. ;
  386.     IF    MM2E
  387. DIALIT: ADI     30H        ;ADD 30H TO DIGIT TO KEEP SPEAKER -
  388.     PUSH    B        ;ON AND SEND TONE
  389. DIGLP:  CALL    XCTL3        ;SEND DIGIT
  390.     LXI    B,120        ;NUMBER OF MSEC FOR EACH TONE
  391.     CALL    DELAY
  392.     MVI    A,20H        ;TURN OFF TONE
  393.     CALL    XCTL3
  394.     MVI    B,1        ;100 MSEC BTWEEN DIGITS
  395.     MVI    C,TIMER
  396.     CALL    MEX
  397.     POP    B
  398.     RET
  399.     ENDIF            ;ENDIF MM2E
  400. ;
  401. ;
  402. ; THIS ROUTINE CONVERTS THE COMMA (,) TO IT'S MICROMODEM DECIMAL
  403. ;   EQUIVALENT. THE COMMA CAUSES A TWO (2) SECOND DELAY IN
  404. ;   DIALING BETWEEN ANY 2 DIGITS.
  405. ;
  406. ;
  407. DIALCM: MVI    B,20        ;DIGIT IS COMMA - SO WAIT 2 SEC.
  408.     MVI    C,TIMER
  409.     CALL    MEX
  410.     RET
  411. ;
  412. ;
  413. ; END OF SPECIAL DIALING CONVERSION ROUTINE
  414. ;
  415. ;
  416. ; Start-dial sequence: connect, wait for dial-tone
  417. ;
  418. STDIAL:    CALL    ILPRT
  419.     DB    'Wait...',0
  420.     MVI    B,25        ;wait 2.5 sec
  421.     MVI    C,TIMER
  422.     CALL    MEX
  423.     MVI    A,DTR        ;enable modem
  424.     CALL    XBDOUT
  425.     ;
  426.     IF    MM2E
  427.     MVI    A,SPKRON
  428.     CALL    XCTL3        ;TURN ON MMIIE SPEAKER
  429.     ENDIF            ;MM2E
  430.     ;
  431.     MVI    A,OFFHK
  432.     CALL    XOFFHK        ;connect phone
  433.     MVI    B,20        ;wait 2 sec
  434.     MVI    C,TIMER
  435.     CALL    MEX        ;for dial tone
  436.     ORA    A
  437.     RET
  438. ;
  439. ; End-dial sequence
  440. ;
  441. ENDIAL: MVI    E,150        ;SET WAIT TIME TO 15 SEC.
  442.     MVI    A,8DH        ;ENABLE MODEM (OFF-HOOK,ORIG.,300 BD)
  443.     CALL    XBDOUT
  444. WAITTM    EQU    $-1        ;patch with SET WAIT command
  445.     CALL    WAIT
  446.     ORA    A        ;successfully connected?
  447.     PUSH    PSW        ;save the error code
  448.     JNZ    NOTCNK        ;no, disconnect
  449.     MVI    A,DTR
  450.     CALL    XBDOUT        ;RE-ENABLE MODEM
  451.     ;
  452.     IF    MM2E
  453.     MVI    A,SPKROFF    ;MMIIE SPEAKER OFF
  454.     CALL    XCTL3
  455.     ENDIF            ;MM2E
  456.     ;
  457.     JMP    DIALXIT    
  458. NOTCNK:    CALL    PDISC        ;shut down the modem
  459. DIALXIT:POP    PSW
  460.     RET
  461. ;
  462. ; Time-out routine.  Must be called with mask in D reg.
  463. ; and number of seconds (times 10) in E reg.
  464. ;
  465. WAIT:    MVI    B,1        ;100 ms
  466.     MVI    C,TIMER    
  467.     CALL    MEX
  468.     CALL    XDATIN        ;READ DATA PORT (SET-UP CARR. DET.)
  469.     CALL    XSTTIN        ;IS CARRIER LOST SINCE LAST DATA READ?
  470.     ANI    4        ;4=NO CARRIER, 0=CARRIER
  471.     RZ            ;active low, so return on 0
  472.     MVI    C,CHEKCC    ;not yet, check for console-abort
  473.     CALL    MEX        ;abort?
  474.     MVI    A,3        ;set error code 3 if abort active
  475.     STC
  476.     RZ            ;return if aborted
  477.     DCR    E        ;nope, downcount
  478.     JNZ    WAIT
  479.     DCR    A        ;set error=2 (timed out); cy already set
  480.     RET
  481.  
  482. ;------------------------------------------------------------
  483. ;    END OF MICROMODEM DIALING ROUTINES
  484. ;------------------------------------------------------------
  485. ;
  486. ; Only 300 baud is supported for the Micromodem
  487. ;
  488. ;
  489.     IF     MM
  490. PBAUD:    RET
  491.     ENDIF    ;MM
  492. ;
  493. ;
  494. ; Control is passed here after MEX parses a SET command.
  495. ;
  496. SETCMD:    MVI    C,SBLANK    ;any arguments?
  497.     CALL    MEX
  498.     JC    SETSHO        ;if not, go print out values
  499.     LXI    D,CMDTBL    ;parse command
  500.     CALL    TSRCH        ;from table
  501.     PUSH    H        ;any address on stack
  502.     RNC            ;if we have one, execute it
  503.     POP    H        ;nope, fix stack
  504. SETERR:    LXI    D,SETEMS    ;print error
  505.     MVI    C,PRINT
  506.     CALL    MEX
  507.     RET
  508. ;
  509. SETEMS:    DB    CR,LF,BELL,'SET command error',CR,LF,'$'
  510. ;
  511. ; SET command table ... note that tables are constructed of command-
  512. ; name (terminated by high bit=1) followed by word-data-value returned
  513. ; in HL by MEX service processor LOOKUP.  Table must be terminated by
  514. ; a binary zero.
  515. ;
  516. ; Note that LOOKUP attempts to find the next item in the input stream
  517. ; in the table passed to it in HL ... if found, the table data item is
  518. ; returned in HL; if not found, LOOKUP returns carry set.
  519. ;
  520. CMDTBL:    DB    '?'+80H            ;"set ?"
  521.     DW    STHELP
  522.     DB    'BAU','D'+80H        ;"set baud"
  523.     DW    STBAUD
  524.     DB    'WAI','T'+80H        ;"set wait time"
  525.     DW    STWAIT
  526.     DB    0        ;<<=== table terminator
  527. ;
  528. ; SET <no-args>: print current statistics
  529. ;
  530. SETSHO:    CALL    CARRSH        ;show carrier present/not present
  531.     LXI    H,SHOTBL    ;get table of SHOW subroutines
  532. SETSLP:    MOV    E,M        ;get table address
  533.     INX    H
  534.     MOV    D,M
  535.     INX    H
  536.     MOV    A,D        ;end of table?
  537.     ORA    E
  538.     RZ            ;exit if so
  539.     PUSH    H        ;save table pointer
  540.     XCHG            ;adrs to HL
  541.     CALL    GOHL        ;do it
  542.     CALL    CRLF        ;print newline
  543.     MVI    C,CHEKCC    ;check for console abort
  544.     CALL    MEX
  545.     POP    H        ;it's done
  546.     JNZ    SETSLP        ;continue if no abort
  547.     RET
  548. ;
  549. GOHL:    PCHL
  550. ;
  551. ; table of SHOW subroutines
  552. ;
  553. SHOTBL:    DW    BDSHOW
  554.     DW    WTSHOW
  555.     DW    0        ;<<== table terminator
  556. ;
  557. ; SET ?  processor
  558. ;
  559. STHELP:    LXI    D,HLPMSG
  560.     MVI    C,PRINT
  561.     CALL    MEX
  562.     RET
  563. ;
  564. ; The help message
  565. ;
  566. HLPMSG:    DB    CR,LF,'SET command, MICROMODEM II/IIE version:',CR,LF
  567.     DB    CR,LF,TAB,'ONLY 300 BAUD SUPPORTED'
  568.     DB    CR,LF,TAB,'SET WAIT 0..25'
  569.     DB    CR,LF,'$'
  570. ;
  571. ; SET BAUD processor
  572. ;
  573. STBAUD:    MVI    C,BDPARS    ;function code
  574.     CALL    MEX        ;let MEX look up code
  575.     JC    SETERR        ;invalid code
  576.     CALL    PBAUD        ;no, try to set it
  577.     JC    SETERR        ;not-supported code
  578. BDSHOW:    CALL    ILPRT        ;display baud
  579.     DB    'Baud rate: ',TAB,0
  580.     LDA    MSPEED
  581.     MVI    C,PRBAUD    ;use MEX routine
  582.     CALL    MEX
  583.     RET          
  584. ;
  585. ; SET WAIT processor
  586. ;
  587. STWAIT:    MVI    C,EVALA        ;get new time from input
  588.     CALL    MEX
  589.     MOV    A,H        ;check for valid input
  590.     ORA    A
  591.     JNZ    SETERR
  592.     MOV    A,L
  593.     CPI    26
  594.     JNC    SETERR        ;25 is maximum wait
  595.     RLC            ;x 2
  596.     MOV    C,A
  597.     RLC            ;x 4
  598.     RLC            ;x 8
  599.     ADD    C        ;x 10
  600.     STA    WAITTM
  601. WTSHOW:    CALL    ILPRT
  602.     DB    'Wait time: ',TAB,0
  603.     MVI    A,0        ;clear HL
  604.     MOV    L,A
  605.     MOV    H,A
  606.     LDA    WAITTM
  607. SBLOOP: SUI    10        ;div. by 10
  608.     JC    WTDSP
  609.     INR    L
  610.     JMP    SBLOOP
  611. WTDSP:    MVI    C,DECOUT
  612.     CALL    MEX
  613.     CALL    ILPRT
  614.     DB    ' seconds',CR,LF,0
  615. ;
  616. ; Compare next input-stream item in table @DE; CY=1
  617. ; if not found, else HL=matched data item
  618. ;
  619. TSRCH:    MVI    C,LOOKUP    ;get function code
  620.     JMP    MEX        ;pass to MEX processor
  621. ;
  622. ; Print in-line message ... blows away C register
  623. ;
  624. ILPRT:    MVI    C,ILP        ;get function code
  625.     JMP    MEX        ;go do it
  626.  
  627. ;
  628. ; Sign-on message
  629. ;
  630. SYSVER:    CALL    NITMOD
  631.     LXI    D,SOMESG
  632.     MVI    C,PRINT
  633.     CALL    MEX
  634. CARRSH:    LXI    D,NOMESG        ;tell about carrier
  635.     CALL    CARRCK            ;check for it
  636.     MVI    C,PRINT
  637.     CNZ    MEX            ;print the "NO" if no carrier
  638.     LXI    D,CARMSG        ;print "carrier present"
  639.     MVI    C,PRINT
  640.     CALL    MEX
  641.     RET
  642. ;
  643. ;
  644.     IF    SFTCRD
  645. SOMESG: DB    'Apple II w/Microsoft Softcard',CR,LF
  646.     ENDIF    ;SFTCRD
  647. ;
  648. ;
  649.     IF    ALSCRD
  650. SOMESG: DB    'Apple II w/ALS CP/M 3.0 Card',CR,LF
  651.     ENDIF    ;ALSCRD
  652. ;
  653.     IF    MM2E
  654.     DB      'and Hayes Micromodem IIe',CR,LF,'$'
  655.     ENDIF   ;MM2E
  656. ;
  657.     IF NOT    MM2E
  658.     DB    'and Hayes Micromodem II',CR,LF,'$'
  659.     ENDIF    ;NOT MM2E
  660. NOMESG:    DB    'no $'
  661. CARMSG:    DB    'carrier present',CR,LF,'$'
  662. ;
  663. ; CHECK THE MICROMODEM FOR CARRIER PRESENT (NZ=NO)
  664. ;
  665. CARRCK:    CALL    XDATIN
  666.     CALL    XSTTIN
  667.     ANI    4
  668.     RET
  669. ;
  670. ; Newline on console
  671. ;
  672. CRLF:    MVI    A,CR
  673.     CALL    TYPE
  674.     MVI    A,LF        ;fall into TYPE
  675. ;
  676. ; type char in A on console
  677. ;
  678. TYPE:    PUSH    H        ;save 'em
  679.     PUSH    D
  680.     PUSH    B
  681.     MOV    E,A        ;align output character
  682.     MVI    C,CONOUT    ;print via MEX
  683.     CALL    MEX
  684.     POP    B
  685.     POP    D
  686.     POP    H
  687.     RET               
  688. ;
  689. ; strings to clear-to-end-of-screen, and clear-screen
  690. ;
  691. EOSMSG:    DB    ESC,'Y$'    ;clear to end-of-screen
  692. CLSMSG:    DB    ESC,'*$'    ;clear whole screen
  693.  
  694. ;-------------------------------------------------------
  695. ; Apple I/O 
  696. ;-------------------------------------------------------
  697.  
  698.     IF    SFTCRD
  699.  
  700. XDATOUT    STA    MODDAT ! RET
  701. XCTLOUT    STA    MODCTL ! RET
  702. XBDOUT    STA    BAUDRP ! RET
  703. XONHOOK    STA    ONHOOK ! RET
  704. XOFFHK    STA    OFFHOOK ! RET
  705.  
  706. XSTTIN    LDA    MODSTT ! RET
  707. XDATIN    LDA    MODDAT ! RET
  708. XCTLIN    LDA    MODCTL ! RET
  709. XBDIN    LDA    BAUDRP ! RET
  710. XCTL3    LDA    MODCTL3 ! RET
  711.  
  712.     ENDIF    
  713.  
  714.     IF ALSCRD
  715. ;
  716. ; ALS card routines require assembly with MAC
  717. ; (supplied with the ALS CP/M card)
  718. PUT    MACRO    ADDR
  719.     PUSH    H
  720.     LXI    H,ADDR
  721.     JMP    APWRT
  722.     ENDM
  723.        
  724. XDATOUT    PUT    MODDAT
  725. XCTLOUT    PUT    MODCTL
  726. XBDOUT    PUT    BAUDRP
  727. XONHOOK    PUT    ONHOOK
  728. XOFFHK    PUT    OFFHOOK
  729. XCTL3    PUT    MODCTL3
  730.  
  731. APWRT:    PUSH    D
  732.     PUSH    B
  733. AW0:    CALL    $-$    ; patch vector here
  734.     POP    B
  735.     POP    D
  736.     POP    H
  737.     RET
  738.  
  739. GET    MACRO    ADDR
  740.     PUSH    H
  741.     LXI    H,ADDR
  742.     JMP    APRD
  743.     ENDM
  744.  
  745. XSTTIN    GET    MODSTT
  746. XDATIN    GET    MODDAT
  747. XCTLIN    GET    MODCTL
  748. XBDIN    GET    BAUDRP
  749.  
  750. APRD:    PUSH    D
  751.     PUSH    B
  752. AR0:    CALL    $-$    ; patch vector here
  753.     POP    B
  754.     POP    D
  755.     POP    H
  756.     RET
  757.  
  758.     ENDIF
  759. ;
  760. ;------------------------------------------------------------
  761. ;
  762.     END
  763.