home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols200 / vol218 / mxo-ad11.aqm / MXO-AD11.ASM
Assembly Source File  |  1986-02-09  |  26KB  |  1,012 lines

  1. ;//////////////////////////////////////////////////////////////////////////////
  2. ;
  3.      Title  'MEX Overlay for Advanced Digital Super Six / Super Quad SBC'
  4. ;
  5. ;//////////////////////////////////////////////////////////////////////////////
  6. ;
  7. REV    EQU    10        ; revision number * 10
  8. ;
  9. ;-----------------
  10. ;  
  11. ;  MEX Overlay for Advanced Digital Computers using the on board RS232 EIA
  12. ;  port.  The SBC utilizes a Z80 DART and a dual baud rate generator with
  13. ;  one oddball... the initial baudrate for the console and the serial port
  14. ;  is set with 7 Berg jumpers upon reset through a read only IO port. The 8th
  15. ;  bit is the side select bit for the floppy controller. The dual baud rate 
  16. ;  generator needs 8 bits to be set, 4 bits for each channel. This overlay
  17. ;  therefore brings in the jumpers, masks the side bit, extracts the default
  18. ;  console baud rate, or's in the modem baud rate and writes it out to the 
  19. ;  generator. Type ahaed buffer may be installed with this overlay ... the 
  20. ;  interrupt vector is not modified. In addition, A full-featured SET command 
  21. ;  processor is implemented to select the serial communications character-
  22. ;  istics of serial port 02, the modem port. A SET <cr> shows the current 
  23. ;  default settings, a SET ? brings up help and a SET XXXXXXX where XXXXXXX 
  24. ;  is defined in the following table will SET a new parameter.
  25. ;
  26. ;    Available SET Commands:
  27. ;
  28. ;    DELAY <n> (seconds)            BAUD <rate> 110-19.2K
  29. ;    ORIG (originate mode)            ANSWER    (mode)
  30. ;    TONE (dialing)                PULSE (dialing)
  31. ;    MONITOR (speaker on)            QUIET (speaker off)
  32. ;    PARITY (Odd, Even, None)        STOPBITS (1, 1.5, 2)
  33. ;    LENGTH (5, 6, 7, or 8)         
  34. ;
  35. ;----------------
  36. ;
  37. ;  History:    
  38. ;
  39. ;  10/01/84 ...    MXO-AD10.ASM
  40. ;
  41. ;        Original version ... Tested with MEX112 ... Extractions 
  42. ;        from MXO-KP40.ASM ... Would appreciate a note of any 
  43. ;        problems be left on my RCPM MINIRBBS. 
  44. ;
  45. ;                                            John Sojak - SYSOP
  46. ;                            Smokin Silicon RCPM
  47. ;                            312 / 941-0049
  48. ;
  49. ;//////////////////////////////////////////////////////////////////////////////
  50.  
  51. ;
  52. ;    conditionals
  53. ;
  54. NO    EQU    0000
  55. YES    EQU    NOT NO
  56.  
  57. ;
  58. ;    msc constants
  59. ;
  60. TPA    EQU    100H
  61. CR    EQU    13
  62. LF    EQU    10
  63. TAB    EQU    9
  64.  
  65. ;
  66. ;------------------------------------------------------------
  67. ;
  68. ; Advanced Digital port definitions
  69. ;
  70. CTRLPT    EQU    03H        ;serial status port
  71. DATAPT    EQU    02H        ;serial data port
  72. BAUDRP    EQU    18H        ;baud rate write port
  73. BDJMPS    EQU    15H        ;default jumper read port
  74. ;
  75. ; Advanced Digital bit definitions
  76. ;
  77. MDRCVB    EQU    01H        ;modem receive bit (DAV)
  78. MDRCVR    EQU    01H        ;modem receive ready
  79. MDSNDB    EQU    04H        ;modem send bit
  80. MDSNDR    EQU    04H        ;modem send ready bit
  81. MDMDCD    EQU    08H        ;modem data carrier detect 
  82. ;
  83. ; MEX Service Processor
  84. ;
  85. MEX    EQU    0D00H        ;address of the service processor
  86. INMDM    EQU    255        ;get char from port to A, CY=no more in 100 ms
  87. TIMER    EQU    254        ;delay 100ms * reg B
  88. TMDINP    EQU    253        ;B=# secs to wait for char, cy=no char
  89. CHEKCC    EQU    252        ;check for ^C from KBD, Z=present
  90. SNDRDY    EQU    251        ;test for modem-send ready
  91. RCVRDY    EQU    250        ;test for modem-receive ready
  92. SNDCHR    EQU    249        ;send a character to the modem (after sndrdy)
  93. RCVCHR    EQU    248        ;recv a char from modem (after rcvrdy)
  94. LOOKUP    EQU    247        ;table search: see CMDTBL comments for info
  95. PARSFN    EQU    246        ;parse filename from input stream
  96. BDPARS    EQU    245        ;parse baud-rate from input stream
  97. SBLANK    EQU    244        ;scan input stream to next non-blank
  98. EVALA    EQU    243        ;evaluate numeric from input stream
  99. LKAHED    EQU    242        ;get nxt char w/o removing from input
  100. GNC    EQU    241        ;get char from input, cy=1 if none
  101. ILP    EQU    240        ;inline print
  102. DECOUT    EQU    239        ;decimal output
  103. PRBAUD    EQU    238        ;print baud rate
  104. ;
  105. CONOUT    EQU    2        ;simulated BDOS function 2: console char out
  106. PRINT    EQU    9        ;simulated BDOS function 9: print string
  107. INBUF    EQU    10        ;input buffer, same structure as BDOS 10
  108. ;
  109. ;
  110. ;
  111.     ORG    TPA        ;we begin
  112. ;
  113.     DS    3        ;MEX has a JMP START here
  114. ;
  115.     DS    2        ;not used by MEX
  116. TPULSE:    DB    'T'        ;T=touch, P=pulse (Used by this overlay)
  117. CLOCK:    DB    46        ;clock speed x .1, up to 25.5 mhz.
  118. MSPEED:    DB    5        ;sets display time for sending a file
  119.                 ;0=110    1=300  2=450  3=600  4=710
  120.                 ;5=1200 6=2400 7=4800 8=9600 9=19200
  121. BYTDLY:    DB    5        ;default time to send character in
  122.                 ;terminal mode file transfer (0-9)
  123.                 ;0=0 delay, 1=10 ms, 5=50 ms, 9=90 ms
  124. CRDLY:    DB    5        ;end-of-line delay after CRLF in terminal
  125.                 ;mode file transfer for slow BBS systems
  126.                 ;0=0 delay, 1=100 ms, 5=500 ms, 9=900 ms
  127. COLUMS:    DB    5        ;number of directory columns
  128. SETFL:    DB    YES        ;yes=user-defined SET command
  129. SCRTST:    DB    YES        ;yes=if home cursor and clear screen
  130.                 ;routine at CLRSCRN
  131.     DB    0        ;was once ACKNAK, now spare
  132. BAKFLG:    DB    YES        ;yes=make .BAK file
  133. CRCDFL:    DB    YES        ;yes=default to CRC checking
  134.                 ;no=default to Checksum checking
  135. TOGCRC:    DB    YES        ;yes=allow toggling of Checksum to CRC
  136. CVTBS:    DB    NO        ;yes=convert backspace to rub
  137. TOGLBK:    DB    YES        ;yes=allow toggling of bksp to rub
  138. ADDLF:    DB    NO        ;no=no LF after CR to send file in
  139.                 ;terminal mode (added by remote echo)
  140. TOGLF:    DB    YES        ;yes=allow toggling of LF after CR
  141. TRNLOG:    DB    NO        ;yes=allow transmission of logon
  142.                 ;write logon sequence at location LOGON
  143. SAVCCP:    DB    YES        ;yes=do not overwrite CCP
  144. LOCNXT:    DB    NO        ;yes=local cmd if EXTCHR precedes
  145.                 ;no=not local cmd if EXTCHR precedes
  146. TOGLOC:    DB    YES        ;yes=allow toggling of LOCNXTCHR
  147. LSTTST:    DB    YES        ;yes=allow toggling of printer on/off
  148.                 ;in terminal mode. Set to no if using
  149.                 ;the printer port for the modem
  150. XOFTST:    DB    NO        ;yes=allow testing of XOFF from remote
  151.                 ;while sending a file in terminal mode
  152. XONWT:    DB    NO        ;yes=wait for XON after sending CR while
  153.                 ;transmitting a file in terminal mode    
  154. TOGXOF:    DB    YES        ;yes=allow toggling of XOFF testing
  155. IGNCTL:    DB    NO         ;yes=do not send control characters
  156.                 ;above CTL-M to CRT in terminal mode
  157.                 ;no=send any incoming CTL-char to CRT
  158. EXTRA1:    DB    0        ;for future expansion
  159. EXTRA2:    DB    0        ;for future expansion
  160. BRKCHR:    DB    '@'-40H        ;^@ = Send a 300 ms. break tone
  161. NOCONN:    DB    'N'-40H        ;^N = Disconnect from phone line
  162. LOGCHR:    DB    'L'-40H        ;^L = Send logon
  163. LSTCHR:    DB    'P'-40H        ;^P = Toggle printer
  164. UNSVCH:    DB    'R'-40H        ;^R = Close input text buffer
  165. TRNCHR:    DB    'T'-40H        ;^T = Transmit file to remote
  166. SAVCHR:    DB    'Y'-40H        ;^Y = Open input text buffer
  167. EXTCHR:    DB    '^'-40H        ;^^ = Send next character
  168. ;
  169.     DS    2        ;not used
  170. ;
  171. ; Low-level modem I/O routines.
  172. ;
  173. INCTL1:    JMP    INC        ;in modem control port
  174.     DB    0,0,0,0,0,0,0    ;spares if needed for non-PMMI
  175. ;
  176. OTDATA:    JMP    OUTD        ;out modem data port
  177.     DB    0,0,0,0,0,0,0    ;spares if needed for non=PMMI
  178. ;
  179. INPORT: JMP    IND        ;in modem data port
  180.     DB    0,0,0,0,0,0,0    ;spares if needed for non-PMMI
  181. ;
  182. ; Bit-test routines. 
  183. ;
  184. MASKR:    ANI MDRCVB ! RET    ;bit to test for receive ready
  185. TESTR:    CPI MDRCVR ! RET    ;value of receive bit when ready
  186. MASKS:    ANI MDSNDB ! RET    ;bit to test for send ready
  187. TESTS:    CPI MDSNDR ! RET    ;value of send bit when ready
  188. ;
  189.     DS    12
  190. ;
  191. LOGON:    DS    2        ;needed for MDM compat, not ref'd by MEX
  192. DIALV:    JMP    DIAL
  193. DISCV:    JMP    DISCON
  194. GOODBV:    JMP    GOODBYE        ;called before exit to CP/M
  195. INMODV:    JMP    NITMOD        ;initialization. Called at cold-start
  196. NEWBDV:    JMP    PBAUD        ;set baud rate
  197. NOPARV:    RET!NOP!NOP        ;set modem for no-parity
  198. PARITV:    RET!NOP!NOP        ;set modem parity
  199. SETUPV:    JMP    SETCMD        ;SET cmd: jump to a RET if you don't write SET
  200. SPMENV:    RET!NOP!NOP        ;not used with MEX
  201. VERSNV:    JMP    SYSVER        ;Overlay's voice in the sign-on message
  202. BREAKV:    JMP    SBREAK        ;send a break
  203. ;
  204. ; MDM calls supported in MEX 1.0 but not recommended for use.
  205. ;
  206. ILPRTV:    DS    3        ;replace with MEX function 9
  207. INBUFV:    DS    3        ;replace with MEX function 10
  208. ILCMPV:    DS    3        ;replace with table lookup funct. 247
  209. INMDMV:    DS    3        ;replace with MEX function 255
  210. NXSCRV:    DS    3        ;not supported by MEX (returns w/no action)
  211. TIMERV:    DS    3        ;replace with MEX function 254
  212. ;
  213. CLREOS:    
  214. ;    LXI    D,EOSMSG
  215. ;    MVI    C,PRINT
  216. ;    CALL    MEX
  217.     RET
  218. ;
  219. CLS:    
  220. ;    LXI    D,CLSMSG
  221. ;    MVI    C,PRINT
  222. ;    CALL    MEX
  223.     RET
  224. ;------------------------------------------------------------
  225. ;
  226. ; end of fixed area
  227. ;
  228. ;------------------------------------------------------------
  229. ;
  230. ; input control/status port
  231. ;
  232. INC:    MVI    A,10H
  233.     OUT    CTRLPT
  234.     IN    CTRLPT
  235.     RET
  236. ;
  237. ; input data port
  238. ;
  239. IND    IN    DATAPT
  240.     RET
  241. ;
  242. ; output data port
  243. ;
  244. OUTD:    OUT    DATAPT
  245.     RET
  246. ;
  247. ; Print out the overlay version
  248. ;
  249. SYSVER:      CALL    MILP
  250.       DB    'Advanced Digital Overlay - Version '
  251.       DB    REV/10+'0'
  252.       DB    '.'
  253.       DB    REV MOD 10+'0'
  254.       DB    CR,LF
  255.       DB    0
  256.       RET
  257. ;
  258. ; Break, disconnect and goodbye routines
  259. ;
  260. SBREAK:   MVI    A,5
  261.       OUT    CTRLPT
  262.       LDA    WR5
  263.       ORI    00010000B    ;ENABLE BREAK
  264.       OUT    CTRLPT
  265.       MVI    B,3        ;DELAY 300 MS.
  266.       CALL    MTIME
  267.       MVI    A,5
  268.       OUT    CTRLPT
  269.       LDA    WR5
  270.       ANI    11101111B    ;TURN OFF BREAK
  271.       OUT    CTRLPT
  272.       RET
  273. ;
  274. ; Disconnect Routine
  275. ;
  276. DISCON:   MVI    A,5
  277.       OUT    CTRLPT        ;SEND TO THE STATUS PORT
  278.       MVI    A,68H        ;TURN OFF DTR
  279.       OUT   CTRLPT
  280. ;
  281. ; GOODBYE routines are called by MEX prior to exit to CP/M
  282. ;
  283. GOODBYE:  MVI    B,3        ;DELAY 300 MS.
  284.       CALL  MTIME
  285.       MVI    A,5
  286.       OUT    CTRLPT        ;SEND TO THE STATUS PORT
  287.       LDA    WR5
  288.       ORI    10000000B    ;RAISE DTR
  289.       OUT    CTRLPT
  290.       RET
  291. ;
  292. ; Initialize RS-232 port, PIO port and default modes.
  293. ;
  294. NITMOD: CALL    INC        ;SEE IF CARRIER ie RETURNING TO MEX WITH
  295.     ANI    MDMDCD        ;   A CALL ACTIVE 
  296.     RNZ            ;SKIP IF CONNECTED
  297.  
  298.     LDA    DFBAUD        ;GET THE DEFAULT BAUD RATE
  299.     STA       MSPDSV        ;SEED THE MSPEED VALUE
  300.     STA    MSPEED        ;AND KEEP IT CURRENT
  301.     CALL    PBAUD        ;SET THE BAUD RATE
  302.  
  303.     LDA    WR5        ;DEFAULT DTR AND CTS
  304.     STA    REG5
  305.      CALL      NITSIO        ;INITIALIZE THE DART
  306.     LDA    MONFLG        ;GET MONITOR DEFAULT
  307.     ORA    A
  308.     MVI    A,'0'        ;SPEAKER OFF
  309.     JZ    NITMOD4
  310.     MVI    A,'1'        ;SPEAKER ON
  311.  
  312. NITMOD4:  STA    SMINIT+3    ;PUT IT IN SMINIT STRING
  313.       LDA    ANSFLG        ;GET MODE DEFAULT
  314.       ORA    A
  315.       MVI    A,'0'        ;ORIGINATE
  316.       JZ    NITMOD5
  317.       MVI    A,'1'        ;ANSWER
  318.  
  319. NITMOD5:  STA    SMINIT+8    ;PUT IT IN SMINIT STRING
  320.       LXI    H,SMINIT
  321.  
  322. SINIT:      CALL    SMSEND        ;SEND THE INIT STRING
  323.  
  324. SMTLP1:      MVI    C,INMDM        ;WAIT FOR MODEM RESPONSE
  325.       CALL    MEX
  326.       JNC    SMTLP1        ;EAT EVERYTHING UNTIL SILENCE FOR
  327.       RET            ; 100 MSEC
  328. ;
  329. ;    Initialize the Zilog DART chip 
  330. ;
  331. NITSIO:      
  332. NITSIO2:  MVI    A,00H        ;Select reg. 0
  333.       CALL  OUTCTL1
  334.       LDA    REG0        ;Command byte
  335.       CALL  OUTCTL1
  336.       MVI    A,04H        ;Select reg. 4
  337.       CALL  OUTCTL1
  338.       LDA    REG4        ;Receive/transmit control byte
  339.       CALL  OUTCTL1
  340.       MVI    A,03H        ;Select reg. 3
  341.       CALL  OUTCTL1
  342.       LDA    REG3        ;Receiver logic byte
  343.       CALL  OUTCTL1
  344.       MVI    A,05H        ;Select reg. 5
  345.       CALL  OUTCTL1
  346.       LDA    REG5        ;Transmitter logic byte
  347.       CALL  OUTCTL1
  348. ;
  349. ;                       ;Save REG5 values for modem selected
  350. NITEND:      LDA  REG5
  351.              STA  WR5        ;Save external modem REG5
  352.       RET
  353. ;
  354. OUTCTL1:  OUT   CTRLPT
  355.       RET
  356. ;
  357. ;
  358. ; Set command processor
  359. ;
  360. SETCMD:      MVI    C,SBLANK    ;ANY ARGUMENTS?
  361.       CALL  MEX
  362.       JC    SETSHO        ;IF NOT, DISPLAY DEFAULT(S)
  363.       LXI    D,CMDTBL
  364.           MVI    C,LOOKUP
  365.       CALL  MEX        ;PARSE THE ARGUMENT
  366.       PUSH    H        ;SAVE ANY PARSED ARGUMENTS ON STACK
  367.       RNC            ;IF WE HAVE ONE, RETURN TO IT
  368.       POP    H        ;OOPS, INPUT NOT FOUND IN TABLE
  369. SETERR:      LXI    D,SETEMS
  370.       MVI    C,PRINT
  371.       CALL    MEX
  372.       CALL  CRLF
  373.       RET
  374. SETEMS:      DB    CR,LF,'SET command error',CR,LF,'$'
  375. ;
  376. SETBAD:      LXI    D,SETBMS
  377.       MVI    C,PRINT
  378.       CALL    MEX
  379.       RET
  380. SETBMS:      DB    CR,LF,'SET command not valid for modem',CR,LF,'$'
  381. ;
  382. ; Argument table
  383. ;
  384. CMDTBL:   DB    '?'+80H            ; HELP
  385.       DW    SETHELP
  386.       DB    'ORI','G'+80H        ; ORIGINATE MODE
  387.       DW    ORIG
  388.       DB    'ANSWE','R'+80H        ; ANSWER MODE
  389.       DW    ANS
  390.       DB    'TON','E'+80H        ; TONE DIALING
  391.       DW    STTONE
  392.       DB    'PULS','E'+80H        ; PULSE DIALING
  393.       DW    STPULSE
  394.       DB    'MONITO','R'+80H    ; MONITOR ON
  395.       DW    MONIT
  396.       DB    'QUIE','T'+80H        ; MONITOR OFF
  397.       DW    QUIET
  398.       DB    'BAU','D'+80H        ; SET BAUD
  399.       DW    STBAUD
  400.       DB    'DELA','Y'+80H        ; SET DELAY
  401.       DW    DELAY
  402.       DB    'PARIT','Y'+80H        ; SET PARITY
  403.       DW    STPRTY
  404.       DB    'STOPBIT','S'+80H    ; SET STOPBITS
  405.       DW    STSTOP
  406.       DB    'LENGT','H'+80H        ; SET LENGTH
  407.       DW    STBITS
  408.       DB    0            ;TABLE TERMINATOR
  409. ;
  410. ;
  411. ;  "SET (no args): PRINT CURRENT STATISTICS
  412. ;
  413. SETSHO:      CALL  MILP
  414.       DB    CR,LF
  415.       DB    'Current settings:',CR,LF,0
  416.       CALL    CRLF
  417.       CALL    TPSHOW
  418.       CALL    CRLF
  419.       CALL    BDSHOW
  420.       CALL  CRLF
  421.       CALL    DLSHOW
  422.       CALL    CRLF
  423.       CALL    MONSHO
  424.       CALL    CRLF
  425.       CALL  SHPRTY
  426.       CALL    CRLF
  427.       CALL    SHSTOP
  428.       CALL    CRLF
  429.       CALL  SHBITS
  430.       CALL  CRLF
  431.       CALL  CRLF
  432.       RET
  433. ;
  434. ; "SET ?" processor
  435. ;
  436. SETHELP:  CALL    MILP
  437.       DB    CR,LF,'SET ORIG'
  438.       DB    CR,LF,'SET ANSWER'
  439.       DB    CR,LF,'SET TONE'
  440.       DB    CR,LF,'SET PULSE'
  441.       DB    CR,LF,'SET DELAY     - <N> seconds'
  442.       DB    CR,LF,'SET PARITY    - OFF, EVEN or ODD'
  443.       DB    CR,LF,'SET STOPBITS  - 1, 1.5 or 2'
  444.       DB    CR,LF,'SET LENGTH    - 5, 6, 7 or 8'
  445.       DB    CR,LF,'SET QUIET     - Speaker OFF'
  446.       DB    CR,LF,'SET MONITOR   - Speaker ON'
  447.       DB    CR,LF,'SET BAUD      - 110, 300, 600, 1200, 2400, '
  448.       DB    '4800, 9600, 19200'
  449.       DB    CR,LF,CR,LF,0
  450.       RET
  451. ;
  452. ; "SET BAUD" processor
  453. ;
  454. STBAUD:          MVI    C,BDPARS    ;FUNCTION CODE: PARSE A BAUDRATE
  455.           CALL    MEX        ;LET MEX LOOK UP CODE
  456.           JC    SETERR        ;JUMP IF INVALID CODE
  457.           CALL    PBAUD        ;NO, TRY TO SET IT
  458.           JC    SETERR        ;IF NOT ONE OF OURS, BOMB OUT
  459.  
  460. BDSHOW:          LDA    MSPEED        ;GET CURRENT BAUD RATE
  461.           MVI    C,PRBAUD    ;LET MEX PRINT IT
  462.           CALL    MEX
  463.           RET 
  464. ;
  465. ; This routine sets baud rate passed as MSPEED code in A.
  466. ; Returns CY=1 if baud rate not supported.
  467. ;
  468. PBAUD:          PUSH    H        ;DON'T ALTER ANYBODY
  469.           PUSH    D
  470.           PUSH     B
  471.  
  472.         MOV    E,A        ;MSPEED CODE TO DE
  473.         MVI    D,0
  474.           LXI    H,BAUDTB    ;OFFSET INTO TABLE
  475.           DAD    D
  476.           MOV    A,M        ;FETCH CODE
  477.           ORA    A        ;0 MEANS UNSUPPORTED CODE
  478.           STC            ;PREP CARRY IN CASE UNSUPPORTED
  479.           JZ    PBEXIT        ;EXIT IF BAD
  480.           STA    DFBAUD        ;SAVE CURRENT RATE
  481.           MOV    B,A        ;SAVE THE NEW BAUD FOR A SEC
  482.           IN    BDJMPS        ;GET THE CURRENT CONSOLE BAUD 
  483.           ANI    00001111b    ;ISOLATE IT
  484.           ORA    B        ;AND MAKE A COMPOSITE WITH MODEM BAUD
  485.           OUT    BAUDRP        ;SET IT
  486.           MOV    A,E        ;GET MSPEED CODE BACK
  487.           STA    MSPEED        ;SET IT
  488.  
  489. PBEXIT:          POP    B
  490.           POP    D
  491.           POP    H
  492.           RET
  493. ;
  494. BAUDTB:          DB    020H        ;110
  495.           DB    050H        ;300
  496.           DB    00h        ;450 (not supported)
  497.           DB    060H        ;600
  498.           DB    00h        ;710 (not supported)
  499.           DB    070H        ;1200
  500.           DB    0A0H        ;2400
  501.           DB    0C0H        ;4800
  502.           DB    0E0H        ;9600
  503.           DB    0F0H        ;19200 
  504. ;
  505. ; SET MODE PROCESSOR ---- SET MODEM PARAMETERS
  506. ;
  507. ORIG:          XRA    A
  508.           STA    ANSFLG        ;SET ORIG FLAG
  509.           LXI    H,SMO        ;SEND OUT ATS0=0
  510.           CALL    SINIT
  511.         CALL    MILP
  512.         DB    'Originate mode',0
  513.         RET
  514.  
  515. ;
  516. SMO:    DB    'ATS0=0',CR,0
  517. SMA:    DB    'ATS0=1',CR,0
  518. ;
  519. ANS:    MVI    A,0FFH
  520.     STA    ANSFLG        ;SET ANS FLAG
  521.     LXI    H,SMA        ;SEND OUT ATS0=1
  522.     CALL    SINIT
  523.     CALL    MILP
  524.     DB    'Answer mode',0
  525.     RET
  526. ;
  527. ;
  528. ; Monitor control processor
  529. ;
  530. QUIET:      XRA    A
  531.       STA    MONFLG
  532.       LXI    H,SMQT
  533.       CALL    SINIT
  534.       JMP    MONSHO
  535.  
  536. MONIT:      MVI    A,0FFH
  537.       STA    MONFLG
  538.       LXI    H,SMMON
  539.       CALL    SINIT
  540.  
  541. MONSHO:      LDA    MONFLG
  542.       ORA    A
  543.       JZ    MONOFF
  544.       CALL    MILP
  545.       DB    'Speaker On',0
  546.       RET
  547. MONOFF:      CALL    MILP
  548.       DB    'Speaker Off',0
  549.       RET
  550. SMQT:      DB    'ATM0',CR,0
  551. SMMON:      DB    'ATM1',CR,0
  552. ;
  553. ; Set dial processor
  554. ;
  555. STTONE:      MVI    B,'T'
  556.       JMP    SDIAL1
  557. STPULSE:  MVI    B,'P'
  558. SDIAL1:   LDA    TPULSE
  559.       CPI    B
  560.       JZ    TPSHOW
  561.       MOV    A,B
  562.       STA    TPULSE
  563.       CPI    'P'
  564.       MVI    A,01010000B    ;PULSE DIAL
  565.       JZ    SDIAL2
  566.       MVI    A,01000000B    ;TONE DIAL
  567. SDIAL2:   STA    DIALWD
  568. TPSHOW:      LDA    DIALWD
  569.       ANI    00010000B
  570.       JZ    TPTONE
  571.       CALL    MILP
  572.       DB    'Pulse Dial',0
  573.       RET
  574. TPTONE:      CALL    MILP
  575.       DB    'Tone Dial',0      
  576.       RET
  577. ;
  578. ; Set delay processor
  579. ;
  580. DELAY:      MVI    C,EVALA
  581.       CALL    MEX
  582.       MOV    A,H
  583.       ORA    A
  584.       JNZ    SETERR
  585.       MOV    A,L
  586.       STA    NDELAY
  587. DLSHOW:      CALL    MILP
  588.       DB    'Answer Delay is ',0
  589.       LDA    NDELAY
  590.       MOV    L,A
  591.       MVI    H,0
  592.       MVI    C,DECOUT
  593.       CALL    MEX
  594.       CALL    MILP
  595.       DB    ' seconds',0
  596.       RET
  597. ;
  598. ;    SET PARITY command: reset transmit/receive parity
  599. ;
  600. ;        Parity is controlled by bits 0 and 1 of
  601. ;        the byte sent to the DART write-register
  602. ;        4 as follows:
  603. ;
  604. ;           Parity    Bit 1       Bit 0
  605. ;                 Off          -          0
  606. ;              Odd      0         1
  607. ;             Even      1         1
  608. ;
  609. STPRTY:      MVI    C,SBLANK    ;check for parity code
  610.       CALL    MEX        ;
  611.       JC    SETERR        ;if none, print error
  612.       LXI    D,PARTBL    ;check for proper syntax
  613.       MVI    C,LOOKUP
  614.       CALL    MEX
  615.       PUSH    H        ;match found, go do it!
  616.       RNC            ;
  617.       POP    H        ;no match: fix stack and
  618.       JMP    SETERR        ;  print error
  619. ;
  620. PROFF:      LDA    REG4        ;get register 4 byte
  621.       ANI    0FEH        ;reset bit 0
  622.       JMP    PARTB1        ;
  623. PREVEN:      LDA    REG4        ;
  624.       ORI    003H        ;set bits 0 & 1
  625.       JMP    PARTB1        ;
  626. PRODD:      LDA    REG4        ;
  627.       ORI    001H        ;set bit 0
  628.       ANI    0FDH        ;reset bit 1
  629. PARTB1:      STA    REG4        ;
  630.       CALL    NITSIO        ;re-initialize the USART
  631.       CALL    SHPRTY        ;print the result
  632.       RET             ;
  633. SHPRTY:      CALL    MILP        ;display parity
  634.       DB    'Parity:  ',TAB,' ',0
  635.       LDA    REG4        ;
  636.       ANI    001H        ;test bit 0
  637.       CPI    0        ;if bit0=0 then parity off
  638.       JNZ    SHPRT1        ;
  639.       CALL    MILP        ;
  640.       DB    'Off',0        ;
  641.       RET
  642. SHPRT1:      LDA    REG4        ;
  643.       ANI    002H        ;test bit 1
  644.       CPI    0        ;if bit1=0 then parity odd
  645.       JNZ    SHPRT2        ;
  646.       CALL    MILP        ;
  647.       DB    'Odd',0        ;
  648.       RET            ;
  649. SHPRT2:      CALL    MILP        ;
  650.       DB    'Even',0    ;
  651.       RET
  652. ;
  653. ;    SET PARITY command table
  654. ;
  655. PARTBL:      DB    'OF','F'+80H    ;"set parity off"
  656.       DW    PROFF
  657.       DB    'EVE','N'+80H    ;"set parity even"
  658.       DW    PREVEN
  659.       DB    'OD','D'+80H    ;"set parity odd"
  660.       DW    PRODD
  661.       DB    0        ;<<== end of parity table
  662. ;
  663. ;    SET STOPBITS command: reset number of stop bits
  664. ;
  665. ;        The number of stop bits is controlled by bits
  666. ;        2 and 3 of the byte sent to the DART write-
  667. ;        register 4, as follows:
  668. ;
  669. ;            Stop bits       Bit 3    Bit 2
  670. ;            1         0            1
  671. ;               1.5         1          0
  672. ;            2         1          1
  673. ;
  674. ;
  675. STSTOP:      MVI    C,SBLANK    ;check for stop bits
  676.       CALL    MEX        ;
  677.       JC    SETERR        ;if none, print error
  678.       LXI    D,STPTBL    ;check for proper syntax
  679.       MVI   C,LOOKUP
  680.       CALL    MEX        ;
  681.       PUSH    H        ;match found, go do it!
  682.       RNC            ;
  683.       POP    H        ;no match: fix stack and
  684.       JMP    SETERR        ;  print error
  685. ;
  686. STOP01:      LDA    REG4        ;get register 4 byte
  687.       ANI    0F7H        ;reset bit 3
  688.       ORI    004H        ;set bit 2
  689.       JMP    STSTP1        ;
  690. STOP02:      LDA    REG4        ;
  691.       ORI    00CH        ;set bits 2 and 3
  692.       JMP    STSTP1        ;
  693. STOP15:      LDA    REG4        ;
  694.       ORI    008H        ;set bit 3
  695.       ANI    0FBH        ;reset bit 2
  696. STSTP1:      STA    REG4        ;
  697.       CALL    NITSIO        ;
  698.       CALL    SHSTOP        ;print the result
  699.       RET
  700. SHSTOP:      CALL    MILP        ;display stop-bits
  701.       DB    'Stop bits:',TAB,' ',0
  702.       LDA    REG4        ;
  703.       ANI    004H        ;test bit 2
  704.       CPI    0        ;if bit2=0 then 1.5
  705.       JNZ    SHSTP1        ;
  706.       CALL    MILP        ;
  707.       DB    '1.5',0        ;
  708.       RET
  709. SHSTP1:      LDA    REG4        ;
  710.       ANI    008H        ;test bit 3
  711.       CPI    0        ;if bit3=0 then 1
  712.       JNZ    SHSTP2        ;
  713.       CALL    MILP        ;
  714.       DB    '1',0        ;
  715.       RET
  716. SHSTP2:      CALL    MILP        ;
  717.       DB    '2',0        ;
  718.       RET
  719. ;
  720. ;    SET STOPBITS command table
  721. ;
  722. STPTBL:      DB    '1'+80H        ;"set stop 1"
  723.       DW    STOP01
  724.       DB    '2'+80H        ;"set stop 2"
  725.       DW    STOP02
  726.       DB    '1.','5'+80H    ;"set stop 1.5"
  727.       DW    STOP15
  728.       DB    0        ;<<== End of stop-bits table
  729. ;
  730. ;    SET LENGTH command: set bits per character
  731. ;
  732. ;        The number of bits per character is controlled for
  733. ;        the receiver circuit by bits 6 and 7 of the byte
  734. ;        sent to the DART write-register 3 and for the trans-
  735. ;        mitter circuit by bits 5 and 6 of the byte sent to
  736. ;        the DART write-register 5.  The assumption has been
  737. ;        made here that both transmission and reception will
  738. ;        be carried on at the same number of bits per charac-
  739. ;        ter.  The bit configurations are shown for register
  740. ;        3 only, but are the same for register 5:
  741. ;
  742. ;            BPC        Bit 7        Bit 6
  743. ;             5          0          0
  744. ;             6          1             0
  745. ;             7          0          1
  746. ;             8          1          1
  747. ;
  748. STBITS:      MVI    C,SBLANK    ;check for bits/char
  749.       CALL    MEX        ;
  750.       JC    SETERR        ;if none, print error
  751.       LXI    D,BITTBL    ;check for proper syntax
  752.       MVI    C,LOOKUP
  753.       CALL    MEX
  754.       PUSH    H        ;match found, go do it!
  755.       RNC            ;
  756.       POP    H        ;no match: fix stack and
  757.       JMP    SETERR        ;  print error
  758. ;
  759. BIT5:      LDA    REG3        ;
  760.       ANI    0BFH        ;reset bit 6
  761.       ANI    07FH        ;reset bit 7
  762.       STA    REG3        ;
  763.       LDA    REG5        ;
  764.       ANI    0DFH        ;reset bit 5
  765.       ANI    0BFH        ;reset bit 6
  766.       JMP    STBTS1        ;
  767. BIT6:      LDA    REG3        ;
  768.       ANI    0BFH        ;reset bit 6
  769.       ORI    080H        ;set bit 7
  770.       STA    REG3        ;
  771.       LDA    REG5        ;
  772.       ANI    0DFH        ;reset bit 5
  773.       ORI    040H        ;set bit 6
  774.       JMP    STBTS1        ;
  775. BIT7:      LDA    REG3        ;
  776.       ORI    040H        ;set bit 6
  777.       ANI    07FH        ;reset bit 7
  778.       STA    REG3        ;
  779.       LDA    REG5        ;
  780.       ORI    020H        ;set bit 5
  781.       ANI    0BFH        ;reset bit 6
  782.       JMP    STBTS1        ;
  783. BIT8:      LDA    REG3        ;
  784.       ORI    040H        ;set bit 6
  785.       ORI    080H        ;set bit 7
  786.       STA    REG3        ;
  787.       LDA    REG5        ;
  788.       ORI    020H        ;set bit 5
  789.       ORI    040H        ;set bit 6
  790. STBTS1:      STA    REG5        ;
  791.       CALL    NITSIO        ;
  792.       CALL    SHBITS        ;print the result
  793.       RET
  794. SHBITS:      CALL    MILP        ;display bits/char
  795.       DB    'Bits/char:',TAB,' ',0
  796.       LDA    REG5        ;
  797.       ANI    040H        ;test bit 6
  798.       CPI    0        ;if bit6=0 then 6 bpc
  799.       JNZ    SHBTS2        ;
  800.       LDA    REG5        ;
  801.       ANI    020H        ;test bit 5
  802.       CPI    0        ;if bit5=0 then 5 bpc
  803.       JNZ    SHBTS1        ;
  804.       CALL    MILP        ;
  805.       DB    '5',0        ;
  806.       RET            ;
  807. SHBTS1:      CALL    MILP        ;
  808.       DB    '7',0        ;
  809.       RET            ;
  810. SHBTS2:      LDA    REG5        ;
  811.       ANI    020H        ;test bit 5
  812.       CPI    0        ;if bit5=0 then 6 bpc
  813.       JNZ    SHBTS3        ;
  814.       CALL    MILP        ;
  815.       DB    '6',0        ;
  816.       RET            ;
  817. SHBTS3:      CALL    MILP        ;
  818.       DB    '8',0        ;
  819.       RET
  820. ;
  821. ;    SET LENGTH command table
  822. ;
  823. BITTBL:      DB    '5'+80H        ;"set bits 5"
  824.       DW    BIT5
  825.       DB    '6'+80H        ;"set bits 6"
  826.       DW    BIT6
  827.       DB    '7'+80H        ;"set bits 7"
  828.       DW    BIT7
  829.       DB    '8'+80H        ;"set bits 8"
  830.       DW    BIT8
  831.       DB    0        ;<<== end of bpc table
  832. ;
  833. ;
  834. ; Dialing routine
  835. ;
  836. DIAL:      LHLD    DIALPT        ;FETCH POINTER
  837.       CPI    254        ;START DIAL?
  838.       JZ    STDIAL1        ;JUMP IF SO
  839.       CPI    255        ;END DIAL?
  840.       JZ    ENDIAL1        ;JUMP IF SO
  841. ;
  842. ; Not start or end sequence, must be a digit to be sent to the modem
  843. ;
  844.       MOV    M,A        ;PUT CHAR IN BUFFER
  845.       INX    H        ;ADVANCE POINTER
  846.       SHLD    DIALPT        ;STUFF PNTR
  847.       RET            ;ALL DONE
  848. ;
  849. ; Here on a start-dial sequence
  850. ;
  851. STDIAL1:  LXI    H,DIALBF    ;SET UP BUFFER POINTER
  852.       SHLD    DIALPT
  853.       RET
  854. ;
  855. ; Here on an end-dial sequence
  856. ;
  857. ENDIAL1:  MVI    M,CR        ;STUFF END-OF-LINE INTO BUFFER
  858.       INX    H        ;FOLLOWED BY TERMINATOR
  859.       MVI    M,0
  860.       LDA    TPULSE        ;GET OVERLAY'S TOUCH-TONE FLAG
  861.       STA    SMDIAL+3    ;PUT INTO STRING
  862.       LXI    H,SMDIAL    ;POINT TO DIALING STRING
  863.       CALL    SMSEND        ;SEND IT
  864. WAITSM:      MVI    C,INMDM
  865.       CALL    MEX        ;CATCH ANY OUTPUT FROM THE MODEM
  866.       JNC    WAITSM        ;LOOP UNTIL NO MORE CHARACTERS
  867. ;
  868. ; THE FOLLOWING LOOP WAITS FOR A RESULT FROM THE MODEM.
  869. ;
  870. RESULT:      LDA    NDELAY        ;GET DELAY COUNT
  871.       MOV    C,A
  872. SMWLP:      PUSH    B
  873.       MVI    B,1        ;CHECK FOR A CHAR, UP TO 1 SEC WAIT
  874.       MVI    C,TMDINP    ;DO TIMED INPUT
  875.       CALL    MEX
  876.       POP    B
  877.       JNC    SMTEST        ;JUMP IF MODEM HAD A CHAR
  878.       PUSH    B        ;NO, TEST FOR CONTROL-C FROM CONSOLE
  879.       MVI    C,CHEKCC
  880.       CALL    MEX
  881.       POP    B
  882.       JNZ    SMNEXT        ;IF NOT, JUMP
  883.       CALL    SMDMOFF        ;YES, SHUT DOWN THE MODEM
  884.       MVI    A,3        ;RETURN ABORT CODE
  885.       RET
  886. SMNEXT:      DCR    C        ;NO
  887.       JNZ    SMWLP        ;CONTINUE
  888. ;
  889. ; NO MODEM RESPONSE WITHIN THE TIME SPECIFIED IN SET DELAY COMMAND
  890. ;
  891. SMTIMO:      CALL    SMDMOFF
  892.       MVI    A,2        ;RETURN TIMEOUT CODE
  893.       RET
  894. ;
  895. ; MODEM GAVE US A RESULT, CHECK IT
  896. ;
  897. SMTEST:      ANI    7FH        ;IGNORE ANY PARITY
  898.       CALL    SMANAL        ;TEST THE RESULT
  899.       JC    RESULT        ;GO TRY AGAIN IF UNKNOWN RESPONSE
  900.       MOV    A,B        ;A=RESULT 
  901.       PUSH    PSW        ;SAVE IT
  902. SMTLP:      MVI    C,INMDM        ;EAT ANY ADDITIONAL CHARS FROM SMARTMODEM
  903.       CALL    MEX
  904.       JNC    SMTLP        ;UNTIL 100MS OF QUIET TIME
  905.       POP    PSW        ;RETURN THE CODE
  906.       RET
  907. ;
  908. ; Analyze character returned from External Modem
  909. ;
  910. SMANAL:      MVI    B,0        ;PREP CONNECT CODE
  911.       CPI    'C'        ;"CONNECT"?
  912.       RZ
  913.       CPI    '1'        ;NUMERIC VERSION OF "CONNECT"
  914.       RZ
  915.       CPI    '5'        ;NUMERIC VERSION OF "CONNECT 1200"
  916.       RZ
  917.       INR    B        ;PREP BUSY CODE B=1
  918.       CPI    'B'
  919.       RZ
  920.       INR    B        ;PREP NO CONNECT MSG B=2
  921.       CPI    'N'        ;N=NO CONNECT
  922.       RZ
  923.       CPI    '3'        ;NUMERIC VERSION OF "NO CONNECT"
  924.       RZ
  925.       MVI    B,4        ;PREP MODEM ERROR
  926.       CPI    'E'        ;E=ERROR
  927.       RZ
  928.       CPI    '4'        ;NUMERIC VERSION OF "ERROR"
  929.       RZ
  930. ;
  931. ; UNKNOWN RESPONSE, RETURN CARRY TO CALLER. BUT FIRST,
  932. ; FLUSH THE UNKNOWN RESPONSE LINE FROM THE MODEM.
  933. ;
  934. WTLF:      CPI    LF        ;LINEFEED?
  935.       STC
  936.       RZ            ;END IF SO
  937.       MVI    C,INMDM        ;NO. GET NEXT CHAR
  938.       CALL    MEX
  939.       JNC    WTLF        ;UNLESS BUSY, LOOP
  940.       RET
  941. ;
  942. ; Send string to the External Modem
  943. ;
  944. SMSEND:      MVI    C,SNDRDY    ;WAIT FOR MODEM READY
  945.       CALL    MEX
  946.       JNZ    SMSEND
  947.       MOV    A,M        ;FETCH NEXT CHARACTER
  948.       INX    H
  949.       ORA    A        ;END?
  950.       RZ            ;DONE IF SO
  951.       MOV    B,A        ;NO, POSITION FOR SENDING
  952.       MVI    C,SNDCHR    ;NOPE, SEND THE CHARACTER
  953.       CALL    MEX
  954.       JMP    SMSEND
  955. ;
  956. ; Shut down (disconnect) External Modem
  957. ;
  958. SMDMOFF:  MVI    B,CR
  959.       MVI    C,SNDCHR
  960.       CALL    MEX
  961.       MVI    B,10        ;ONE SECOND WAIT FOR HAYES, ETC
  962.       CALL    MTIME
  963.       JMP    DISCON        ;MAKE SURE IT IS OFF
  964. ;
  965. ; General utility routines
  966. ;
  967. MILP:      MVI    C,ILP        ;IN-LINE PRINT
  968.       JMP    MEX
  969.       RET
  970. ;
  971. MTIME:      MVI    C,TIMER        ;MEX TIMER
  972.       JMP    MEX
  973.       RET
  974. ;
  975. CRLF:      CALL    MILP        ;PRINT CARRIAGE RETURN, LINE FEED
  976.       DB    CR,LF,0
  977.       RET
  978.  
  979. ;==========================================================================
  980. ;                            Data Area
  981. ;==========================================================================
  982. ;
  983. ; Default UART parameters (Initalized for External RS-232)
  984. ;
  985. REG0:      DB    00011000B    ;RESET CHANNEL A
  986. REG3:      DB    11000001B    ;ENABLE RECEIVE AT 8 BITS/CHAR
  987. REG4:      DB    01000100B    ;NO PARITY, 1 STOP BIT, CLOCK X16
  988. REG5:      DB    11101010B    ;ENABLE TRANSMIT AT 8 BITS/CHAR
  989. WR5:       DB    11101010B    ;MDM CTRL REGISTER 5 (Initial value)
  990. ;
  991. ; Miscellaneous Default Data
  992. ;
  993. SMDIAL:      DB    'ATDT '        ;Smartmodem dial prefix
  994. DIALBF:      DS    52        ;2* 24 CHAR MAX, + CR + NULL + SLOP
  995. DIALPT:      DS    2        ;DIAL POSITION POINTER
  996. DIALWD:      DB    01000000B    ;PULSE/TONE DIAL WORD
  997. DIGIT      DB    0        ;SAVE DIALED DIGIT
  998. MSPDSV:      DB    0        ;SAVE EXTERNAL MODEM MSPEED
  999. DFBAUD:      DB    05        ;0=110,1=300,3=600,5=1200,6=2400
  1000.                 ;7=4800,8=9600,9=19200 
  1001. MONFLG:      DB    0FFH        ;0: MONITOR OFF - 0FFH: MONITOR ON
  1002. ANSFLG:      DB    0        ;0: ORIGINATE   - 0FFH: ANS
  1003. NDELAY:      DB    30        ;NO. SECONDS FOR ANSWER
  1004. ;
  1005. SMATN:    DB    '+++',0        ;Smartmodem online 'attention'
  1006. SMDISC:      DB    'ATH',CR,0    ;Smartmodem disconnect 
  1007. SMINIT:   DB    'ATM1 S0=0 S7=60 X1',CR,0    ;MODEM INIT STRING
  1008. ;
  1009. EOSMSG:      DB    17H,'$'        ;CLEAR TO END-OF-SCREEN
  1010. CLSMSG:      DB    1AH,'$'        ;CLEAR WHOLE SCREEN
  1011.       END
  1012.