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-MD30.ASM < prev    next >
Assembly Source File  |  2000-06-30  |  24KB  |  757 lines

  1. ; MXO-MD30.ASM - Morrow Designs Micro Decision 3 (MD3) Overlay File 
  2. ; version 3.0 for MEX 1.14
  3. ; 1/17/87 by Carson Wilson. This file is for MD3's with Rev. 2 boards only. 
  4. ;
  5. ; You may edit this file to change various initial variables. Assemble
  6. ; with ASM or MAC, then use MLOAD to patch the changes into MEX:
  7. ;
  8. ;    ASM mxo-md30.aaz            ;assemble the edited file
  9. ;    MLOAD newmex.com=mex114.obj,mxo-md30    ;patch mex
  10. ;
  11. ; You will want to look this file over carefully. There are a number of
  12. ; options that you can use to configure the program to suit your taste.
  13. ; This file adapts the Morrow Micro Decision computer to the MEX pro-
  14. ; gram. While this computer has two serial ports, one is used for the
  15. ; CRT/keyboard and the other for the printer. Connect the modem in place of 
  16. ; the printer.
  17. ;
  18. ; The "SET" command may now be used to change the baudrate, parity, data 
  19. ; bits, and stopbits. For help, type "SET ?" from the MEX prompt. For current
  20. ; settings, type "SET". 
  21. ; Defaults are 1200 baud, 8 data bits, no parity, 1 stopbit.
  22. ; =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =
  23. ; 01/17/87 - Completely revamped file, made it MD3 specific. Removed extra
  24. ;         code, added ability to set stop bits, parity, and data bits,
  25. ;            changed the default baud rate to 1200 bps, changed some options,
  26. ;         added latest options to end of file, altered the initializing
  27. ;         routine to run with the MD3, changed clear screen and clear to 
  28. ;         end of screen to work with MT-70 terminal. Renamed file to 
  29. ;         MXO-MD30.ASM for M(icro) D(ecision) version 3.0 - Carson Wilson
  30. ;
  31. ; 05/15/84 - converted from mdm7xx to mex10     - sandy berger
  32. ; 03/25/84 - revised for use with mdm730        - sandy berger
  33. ; 11/11/83 - renamed to m7md-1.asm, no changes    - irv hoff
  34. ; 07/21/83 - renamed for use with mdm712    - irv hoff
  35. ; 07/01/83 - revised for use with mdm711    - irv hoff
  36. ; 06/22/83 - revised for use with mdm710    - irv hoff
  37. ; 06/22/83 - altered mdm708dp for morrow
  38. ;         micro decision computers using
  39. ;         an external modem            - irv hoff
  40. ; 05/28/84 - altered for model md-3a            - alan bierbaum
  41. ;
  42. ; =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =
  43. ;
  44. ; Following line must be BIOS address of CONOUT.
  45. ;
  46. conout    equ    0e4cbh    ; This value now set for a 60k ZCPR3 installation 
  47.             ; for the MD3. If you use the standard Morrow 64k 
  48.             ; CP/M operating system with BIOS rev 3.1, you 
  49.             ; should change it to 0f4cbh.
  50. ;
  51. bell    equ    07h    ; bell
  52. cr    equ    0dh    ; carriage return
  53. esc    equ    1bh    ; escape
  54. lf    equ    0ah    ; linefeed
  55. tab    equ    9    ; tab
  56. ;
  57. yes    equ    0ffh
  58. no    equ    0
  59. ;
  60. ;------- MD3-Specific Port Addresses ------
  61. ;
  62. s2data    equ    0feh    ; Morrow MD3 serial printer/modem port
  63. s2stat    equ    0ffh    ; modem status port
  64. modrcvb    equ    02h    ; modem receive bit
  65. modsndb    equ    01h    ; modem send bit
  66. ctcsel    equ    0f3h    ; channel select port for CTC
  67. ch2div    equ    0f2h    ; port for setting baud rate of 2nd serial port
  68. ;
  69. ;------- MEX Built-in Routines --------
  70. ;
  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    ; set cmd table search: see cmdtbl comments
  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 table
  90. prid    equ    236    ; print [MEX] id
  91. onoff    equ    235    ; parse on/off fm input strm a=0 or 1 (c=err)
  92. print    equ    9    ; simulated bdos function 9: print string
  93. inbuf    equ    10    ; input buffer, same structure as bdos 10
  94. kstat    equ    11    ; get keyboard status
  95. kbdin    equ    01    ; keyboard input
  96. dconio    equ    6    ; bdos direct console i/o function #
  97. dconin    equ    0ffh    ; bdos dconio flag for input
  98. ;
  99. ;------------------------------------------------------------
  100. ;    Actual start of MEX
  101. ;
  102.         org    100h
  103. ;
  104.         ds    3    ;(for  "jmp   start" instruction)
  105. ;
  106. pmmimodem:    db    no    ;yes=pmmi s-100 modem            103h
  107. smartmodem:    db    no    ;yes=hayes smartmodem, no=non-pmmi    104h
  108. touchpulse:    db    'T'    ;T=touch, P=pulse (smartmodem-only)    105h
  109. clock:        db    40    ;clock speed in mhz x10, 25.5 mhz max.    106h
  110.                 ;20=2 mhh, 37=3.68 mhz, 40=4 mhz, etc.
  111. mspeed:        db    5    ;0=110 1=300 2=450 3=600 4=710 5=1200    107h
  112.                 ;6=2400 7=4800 8=9600 9=19200 default
  113. bytdly:        db    5    ;0=0 delay  1=10ms  5=50 ms - 9=90 ms    108h
  114.                 ;default time to send character in ter-
  115.                 ;minal mode file transfer for slow bbs.
  116. crdly:        db    5    ;0=0 delay 1=100 ms 5=500 ms - 9=900 ms 109h
  117.                 ;default time for extra wait after crlf
  118.                 ;in terminal mode file transfer
  119. noofcol:    db    5    ;number of dir columns shown        10ah
  120. setuptst:    db    yes    ;yes=user-added setup routine        10bh
  121. scrntest:    db    yes    ;cursor control routine         10ch
  122. retry:        db    yes    ;yes=ask user to reset error count    10dh
  123.                 ;after 10 consecutive errors
  124.                 ;no=abort after 10 consecutive errors
  125. bakupbyte:    db    no    ;yes=change any file same name to .bak    10eh
  126. crcdflt:    db    yes    ;yes=default to crc checking        10fh
  127. togglecrc:    db    yes    ;yes=allow toggling of crc to checksum    110h
  128. convrub:    db    no    ;yes=convert backspace to rub         111h
  129. togglerub:    db    yes    ;yes=allow toggling of bksp to rub    112h
  130. addlf:        db    no    ;no=no lf after cr to send file in    113h
  131.                 ;terminal mode (added by remote echo)
  132. togglelf:    db    yes    ;yes=allow toggling of lf after cr    114h
  133. tranlogon:    db    no    ;yes=allow transmission of logon    115h
  134.                 ;write logon sequence at location logon
  135. savccp:        db    yes    ;yes=do not overwrite ccp        116h
  136. loconextchr:    db    yes    ;yes=local command if extchr precedes    117h
  137.                 ;no=external command if extchr precedes
  138. toggleloc:    db    yes    ;yes=allow toggling of loconextchr    118h
  139. lsttst:        db    yes    ;no=using modem on printer port        119h
  140.  
  141. ; NOTE - if either of the next two are "yes", then MEX will NOT
  142. ; ask for delays when sending a file in terminal mode.
  143. xofftst:    db    no    ;yes=checks for xoff from remote while    11ah
  144.                 ;sending a file in terminal mode
  145. xonwait:    db    no    ;yes=wait for xon after cr while    11bh
  146.                 ;sending a file in terminal mode
  147. ;
  148. togxoff:    db    yes    ;yes=allow toggling of xoff checking    11ch
  149. ignorctl:    db    no    ;yes=ctl-chars above ^m not displayed    11dh
  150. extra1:        db    0    ;for future expansion            11eh
  151. extra2:        db    0    ;for future expansion            11fh
  152. brkchr:        db    '\'-40h    ;^\ = send 50 ms. break tone        120h
  153. noconnct:    db    'N'-40h    ;^N = disconnect from phone line    121h
  154. logchr:        db    'L'-40h    ;^L = send logon            122h
  155. lstchr:        db    'P'-40h    ;^P = toggle printer            123h
  156. unsave:        db    'R'-40h    ;^R = close input text buffer        124h
  157. tranchr:    db    'T'-40h ;^T = transmit file to remote        125h
  158. savechr:    db    'Y'-40h    ;^Y = open input text buffer        126h
  159. extchr:        db    ']'-40h    ;^] = send next character        127h
  160. ;
  161.         ds    2        ;                128h
  162. ;
  163. in$s2stat:    in    s2stat ! ret    ;in modem control port        12ah
  164.         ds    7
  165. out$s2data:    out    s2data ! ret    ;out modem data port        134h
  166.         ds    7
  167. in$s2data:    in    s2data ! ret    ;in modem data port        13eh
  168.         ds    7
  169. ani$modrcvb:    ani    modrcvb ! ret    ;bit to test for receive ready
  170. cpi$modrcvb:    cpi    modrcvb ! ret    ;value of receive bit when ready
  171. ani$modsndb:    ani    modsndb ! ret    ;bit to test for send ready
  172. cpi$modsndb:    cpi    modsndb ! ret    ;value of send bit when ready
  173.         ds    12
  174. ;
  175. logonptr:    dw    logon        ;for user message.        160h
  176.         ds    3        ;                162h
  177. jmp$disconnt:    jmp    goodbye        ;                165h
  178. jmp$goodbye:    ret ! nop ! nop        ;                168h
  179. jmp$initmod:    jmp    initmod        ;go to user written routine    16bh
  180. jmp$newbaud:    jmp    newbaud        ;sets baud rate associated with#16eh
  181.         ret  !    nop  !    nop    ;(by-passes pmmi routine)    171h
  182.         ret  !    nop  !    nop    ;(by-passes pmmi routine)    174h
  183. jmp$setpro:    jmp    setpro        ;process SET commands        177h
  184. jmp$spclmenu:    jmp    spclmenu    ;                17ah
  185. jmp$sysver:    jmp    sysver        ;                17dh
  186. jmp$break:    jmp    sendbrk        ;                180h
  187. ;
  188. ; do not change the following six lines.
  189. ;
  190. jmp$ilprt:    ds    3        ;                183h
  191. jmp$inbuf    ds    3        ;                186h
  192. jmp$inlncomp:    ds    3        ;                189h
  193. jmp$inmodem    ds    3        ;                18ch
  194. jmp$nxtscrn:    ds    3        ;                18fh
  195. jmp$timer:    ds    3        ;                192h
  196. ;
  197. ; Clear sequences -- clreos is clear to end of screen, clrscrn is clear
  198. ; entire screen. Last entry must be 0.  Any other 0's act as nop's.
  199. ; The scrntst option must be set "yes" for these to work.  These are now
  200. ; set for the Morrow MT-70 terminal.
  201. ;
  202. clreos:    mvi    c,ilp        ; clear to end of screen routine 
  203.     call    mex
  204.     db    esc,'Y',0    ; fill out to required 9 bytes
  205.     ret
  206. ;
  207. clrscrn:mvi    c,ilp        ; clear whole screen routine
  208.     call    mex
  209.     db    1ah,0,0        ; fill out to required 9 bytes    
  210.     ret
  211. ;
  212. ;------------------------------------------------------------
  213. ; End of fixed area.  Above here, be very careful of changing
  214. ; the length of things.  Below here, total length just needs
  215. ; to be under 0B00, to leave room for external modem overlay.
  216. ;------------------------------------------------------------
  217. logon:    db    'logon goes here',cr,0
  218. ;
  219. milp:    mvi    c,ilp        ; mex inline print string
  220.     jmp    mex
  221. ;
  222. crlf:    call    milp        ; print return and linefeed
  223.     db    cr,lf,0
  224.     ret
  225. ;
  226. sysver:    call    milp
  227.     db    '*** Morrow Designs MD3 Version 3.0 ***',cr,lf,0
  228.     ret
  229. ;
  230. ; This routine allows a 300 ms. break tone to be sent to reset some
  231. ; time-share computers.
  232. ;
  233. sendbrk:mvi    a,1fh        ;send break tone
  234.     jmp    goodbye1
  235. ;
  236. ; This routine sends a 300 ms. break tone and sets dtr low for the same
  237. ; length of time to disconnect some modems such as the Bell 212a, etc.
  238. ;
  239. goodbye:
  240.     mvi    a,15h        ;send break, turn off DTR
  241. ;
  242. goodbye1:
  243.     out    s2stat        ;send to status port
  244.     mvi    b,3        ;wait 300 ms.
  245.     mvi    c,timer
  246.     call    mex
  247.     mvi    a,27h        ;normal send/receive with dtr
  248.     out    s2stat        ;send to status port
  249.     ret
  250. ;
  251. initmod:mvi    a,087h        ;ensure out of mode
  252.     out    s2stat        ;modem status port
  253.     out    s2stat        ;slight extra delay
  254.     mvi    a,40h        ; initialize usart for mode word
  255.     out    s2stat        ; modem status port
  256.     lda    modereg        ; load current defaults
  257.     out    s2stat        ; allows cloning with different
  258.                 ; data bits, stop bits, & parity
  259.     lda    cmdreg        ; use command word to reset 
  260.                 ; xmt, dtr, rcv, and rts 
  261.     out    s2stat        ;modem status port
  262.     in    s2data        ;clear data port
  263.     call    loadbd        ; set baud rate - allows cloning
  264.     ret
  265. ;
  266. ;============== SETPRO - Process SET Commands ========================
  267. ;
  268. ;     Main SET Command Table
  269. ;
  270. cmdtbl:    db    'BAU','D'+80h
  271.     dw    setbaud
  272.     db    'PARIT','Y'+80h
  273.     dw    setpar
  274.     db    'LENGT','H'+80h
  275.     dw    setlen
  276.     db    'STOPBIT','S'+80h
  277.     dw    setstp
  278.     db    '?'+80h            ; SET help
  279.     dw    sethelp
  280.     db    0
  281. ;
  282. setpro:    mvi    c,sblank    ;any arguments?
  283.     call    mex
  284.     jc    tell        ;if not, go display current settings
  285.     lxi    d,cmdtbl
  286.     mvi    c,lookup
  287.     call    mex        ;parse argument
  288.     push    h        ;save any parsed argument adrs on stack
  289.     rnc            ;if we have one, return to it
  290.     pop    h        ; command not found in table
  291.                 ; so fall thru to print error msg.
  292. ;
  293. seterr:    lda    errid        ; print MEX id with error msgs?
  294.     ora    a
  295.     jz    noid        ; no
  296.     mvi    c,prid        ; print mex id
  297.     call    mex
  298. noid:    call    milp
  299.     db    bell,'++ SET error'    ; ring bell, if on
  300.     db    ' ++',cr,lf,0
  301.     ret
  302. ;
  303. tell:    call    shbaud        ; display current settings
  304.     call    shprty
  305.     call    shbits
  306.     call    shstop
  307.     ret 
  308. ;
  309. ; "SET ?" processor
  310. ;
  311. sethelp:
  312.     call    milp
  313.     db    'BAUD <n>',tab,'300 or 1200',cr,lf
  314.     db    'LENGTH <n>',tab,'7 or 8',cr,lf
  315.     db    'PARITY <mode>',tab,'NONE, EVEN or ODD',cr,lf
  316.     db    'STOPBITS <n>',tab,'1 or 2',cr,lf,0
  317.     ret
  318. ;
  319. ; ---------- modem registers -------------- 
  320. ; These registers are used to set the 8251 UART for the Morrow's 
  321. ; second serial port. For an excellent explanation of this process, 
  322. ; see Ed Berne's article "How to Modify Output Ports," in Morrow
  323. ; Owners' Review vol. 1, #4, October 1984, pp. 44-5.
  324. ;
  325. modereg:db    01101110b    ; Contains the default "mode word" for 
  326.                 ; output to the 8251 UART. 
  327.                 ; 01101110b = no parity, 8 databits,
  328.                 ; 1 stopbit. This register changes with 
  329.                 ; calls to SET routines.
  330.  
  331. cmdreg:    db    00100111b    ; Contains the "command word" for output
  332.                 ; to 8251 UART. 
  333. ;
  334. ; MODEOFF and MODEON are used to set parity, stopbits, and databits 
  335. ; by turning off or on the bits specified in register b. The most recent
  336. ; combination is temporarily stored in modereg.  
  337.  
  338. ; MODEON - turn on bit(s) on modem mode register.
  339. ; On entry, reg. b has ones in positions to turn on
  340.  
  341. modeon:    push    psw
  342.     mvi    a,40h    ; tell 8251 that the next byte will be a 
  343.     out    s2stat    ; "mode word"
  344.     lda    modereg    ; get the mode register
  345.     ora    b    ; add the bits which are on in b to a
  346.     sta    modereg    ; save the result back in modereg
  347.     out    s2stat    ; send modereg to UART
  348.     lda    cmdreg
  349.     out    s2stat    ; reset the UART
  350.     pop    psw
  351.     ret
  352. ; MODEOFF - turn off bit(s) on modem mode register.
  353. ; On entry, reg. b has ones in positions to turn off.
  354. ;
  355. modeoff:push    psw
  356.     mvi    a,40h    ; tell 8251 that the next byte will be a 
  357.     out    s2stat    ; "mode word"
  358.     mov    a,b    ; get bits to turn off in a
  359.     cma        ; reverse off to on, on to off
  360.     mov    b,a    ; and store the result back in b
  361.     lda    modereg    ; get the "mode register"
  362.     ana    b    ; turn off all bits in a which are off in b
  363.     sta    modereg    ; save the result back in modereg
  364.     out    s2stat    ; send modereg to UART
  365.     lda    cmdreg
  366.     out    s2stat    ; reset the UART
  367.     pop    psw
  368.     ret
  369. ;
  370. ;------------ Set Baud Rate -------------
  371. ;
  372. ;    Set Baud Command Table
  373. ;
  374. baudtbl:db    '30','0'+80h
  375.     dw    set300
  376.     db    '120','0'+80h
  377.     dw    set1200
  378.     db    0
  379. ;
  380. setbaud:mvi    c,sblank    ;any arguments?
  381.     call    mex    
  382.     jc    shbaud        ;if not, go display baud
  383.     lxi    d,baudtbl
  384.     mvi    c,lookup
  385.     call    mex        ;parse argument
  386.     push    h        ;save any parsed argument adrs on stack
  387.     rnc            ;if we have one, return to it
  388.     pop    h        ;input not found in table
  389.     jmp    seterr
  390. ;
  391. set300:    mvi    a,1        ;mspeed 300 baud value
  392.     jmp    savebd
  393. ;
  394. set1200:mvi    a,5        ; mspeed 1200 baud value
  395. ;    
  396. savebd:    sta    mspeed        ; change time-to-send to match baudrate
  397.     call    loadbd        ; and load and show baud separately so that
  398.     jmp    shbaud        ; baud rate won't show at startup
  399. ;
  400. loadbd:    mvi    a,0beh        ;select ctc channel 2
  401.     out    ctcsel
  402.     lxi    d,417        ;load divisor for 300 baud
  403.     lda    mspeed        ;flag: 1=300, 5=1200 baud
  404.     dcr    a        
  405.     jz    loadit        ;if it was 1, set 300
  406.     lxi    d,104        ;else load divisor for 1200 baud
  407. loadit:    mov    a,e
  408.     out    ch2div        ;set baud rate using rate port
  409.     mov    a,d
  410.     out    ch2div
  411.     ora    a
  412.     ret
  413. ;
  414. shbaud:    call    milp        ; display current baud rate
  415.     db    'BAUD RATE',tab,0
  416.     lda    mspeed
  417.     mvi    c,prbaud
  418.     call    mex
  419.     call    crlf
  420.     ret
  421. ;
  422. newbaud:cpi    1
  423.     jz    set300
  424.     cpi    5
  425.     jz    set1200
  426.     ret
  427. ;
  428. ;-------- Set Parity --------------
  429. ;
  430. ;    Set Parity Command Table
  431. ;
  432. partbl:    db    'NON','E'+80h
  433.     dw    soff
  434.     db    'EVE','N'+80h
  435.     dw    seven
  436.     db    'OD','D'+80h
  437.     dw    sodd
  438.     db    0        ; <<== end of parity table
  439. ;
  440. setpar:    mvi    c,sblank    ; set parity - any arguments?
  441.     call    mex
  442.     jc    shprty        ;if not, go display parity
  443.     lxi    d,partbl
  444.     mvi    c,lookup
  445.     call    mex        ; parse argument
  446.     push    h        ; save any parsed argument adrs on stack
  447.     rnc            ; if we have one, return to it
  448.     pop    h        ; input not found in table
  449.     jmp    seterr
  450. ;
  451. soff:    mvi    b,10h        ;set parity to off
  452.     call    modeoff
  453.     jmp    shprty
  454. sodd:    mvi    b,10h        ;set parity to odd 
  455.     call    modeon
  456.     mvi    b,20h
  457.     call    modeoff
  458.     jmp    shprty
  459. seven:    mvi    b,10h        ;set parity to even
  460.     call    modeon
  461.     mvi    b,20h
  462.     call    modeon    
  463.                 ; and fall thru to shprty
  464. ;
  465. ; Show Parity Selected.
  466. ;
  467. shprty:    call    milp        ; display parity
  468.     db    'PARITY',tab,tab,0
  469.     lda    modereg
  470.     ani    030h        ; extract bits 4,5
  471.     cpi    010h        ; if bits 4,5 = 1,0 then parity odd
  472.     jnz    shprt1
  473.     call    milp
  474.     db    'ODD',cr,lf,0
  475.     ret
  476. ;
  477. shprt1: cpi    30h        ; if bits 4,5 = 1,1 then parity even
  478.     jnz    shprt2        ; else parity off
  479.     call    milp
  480.     db    'EVEN',cr,lf,0
  481.     ret
  482. ;
  483. shprt2:    call    milp
  484.     db    'NONE',cr,lf,0
  485.     ret
  486. ;
  487. ;--------- Set Length ---------------
  488. ;
  489. ;    Set Length Command Table
  490. ;
  491. lentbl:    db    '7'+80h        ; "set length 7"
  492.     dw    set7
  493.     db    '8'+80h        ; "set length 8"
  494.     dw    set8
  495.     db    0        ; <<== end of data-bits table
  496. ;
  497. setlen:    mvi    c,sblank    ;any arguments?
  498.     call    mex
  499.     jc    shbits        ;if not, go display databits
  500.     lxi    d,lentbl
  501.     mvi    c,lookup
  502.     call    mex        ;parse argument
  503.     push    h        ;save any parsed argument adrs on stack
  504.     rnc            ;if we have one, return to it
  505.     pop    h        ;input not found in table
  506.     jmp    seterr
  507. ;
  508. set7:      mvi    b,04h        ;set to 7 
  509.     call    modeoff
  510.     jmp    shbits
  511. set8:    mvi    b,04h        ;set to 8
  512.     call    modeon
  513. ;                and fall through to shbits
  514. ;
  515. ; Show Current Bits per Character
  516. ;
  517. shbits:    call    milp
  518.     db    'LENGTH',tab,tab,0
  519.     lda    modereg
  520.     ani    0ch        ; extract bits 2, 3 for examination
  521.     ora    a        ; if bits 2,3 = 0,0 then 5 bpc
  522.     jnz    shbts1        ; nope, go try others.
  523.     call    milp
  524.     db    '5',0
  525.     jmp    shbtsx
  526. ;
  527. shbts1:    cpi    04h        ; test bits 2, 3 = 1, 0
  528.     jnz    shbts2        ; if not, go try others.
  529.     call    milp        ; if so, 6 bits.
  530.     db    '6',0
  531.     jmp    shbtsx
  532. ;
  533. shbts2:    cpi    08h        ; test bits 2, 3 = 0, 1
  534.     jnz    shbts3        ; if not, must be 8 bits
  535.     call    milp        ; yup, 7 bits
  536.     db    '7',0
  537.     jmp    shbtsx
  538. ;
  539. shbts3:    call    milp        ; 8 bits per char
  540.     db    '8',0
  541. ;
  542. shbtsx:    call    milp
  543.     db    ' bits',cr,lf,0
  544.     ret
  545. ;
  546. ;------- Set Stop Bits ----------------
  547. ;    
  548. ;    Set Stop Bits Command Table
  549. ;
  550. stptbl:    db    '1'+80h        ; "set stopbits 1"
  551.     dw    stop01
  552.     db    '2'+80h        ; "set stopbits 2"
  553.     dw    stop02
  554.     db    0        ; <<== end of stop-bits table
  555. ;
  556. setstp:    mvi    c,sblank    ; set stopbits - any arguments?
  557.     call    mex
  558.     jc    shstop        ; if not, go display stopbits
  559.     lxi    d,stptbl
  560.     mvi    c,lookup
  561.     call    mex        ; parse argument
  562.     push    h        ; save any parsed argument adrs on stack
  563.     rnc            ; if we have one, return to it
  564.     pop    h        ; input not found in table
  565.     jmp    seterr
  566. stop01:    mvi    b,80h        ; set to 1
  567.     call    modeoff
  568.     jmp    shstop
  569. ;
  570. stop02:    mvi    b,80h        ; set to 2
  571.     call    modeon
  572. ;
  573. ; Show Current Stop Bits
  574. ;
  575. shstop:    call    milp        ; display stop-bits
  576.     db    'STOPBITS',tab,0
  577.     lda    modereg
  578.     ani    0c0h        ; extract bits 6, 7 for examination
  579.     cpi    040h        ; if 6 on, 7 off, one stop
  580.     jnz    shst15        ; no, go check for 1.5 or 2
  581.     call    milp
  582.     db    '1',0
  583.     jmp    shstxt
  584. shst15:    cpi    080h        ; if 7 on, 6 off, 1.5 stops
  585.     jnz    shst20        ; nope, go do 2.
  586.     call    milp
  587.     db    '1.5',0
  588.     jmp    shstxt
  589. shst20:    call    milp        ; must be 2 stop bits
  590.     db    '2',0
  591. shstxt:    call    crlf
  592.     ret
  593. ;
  594. ;         (end of initmod and setup routines)
  595. ;=======================================================================
  596. ;
  597. ; These routines can be used for your equipment, be sure to end with ret
  598. ;
  599. spclmenu: ret
  600. ;
  601. ; Special mex code for Morrow BIOS to not trap certain escape sequences.
  602. ; The address of the following line must be substituted at location
  603. ; outvec for certain terminals to work properly with
  604. ; certain hosts. If you replace the address then all control
  605. ; codes sent to the terminal will have their high order bit set so that
  606. ; the Morrow will send them through properly and not trap them.
  607. ;
  608. slbtyp:    mov    a,c
  609.     cpi    20h
  610.     jp    slbt2        ; in Z80 opcode, that's
  611.                 ; "jp    p,stbt2" (jump if sign flag set) 
  612.     ori    80h
  613. slbt2:    mov    c,a
  614.     jmp    conout        ; value from top of this file
  615. ;
  616. ; Special initial prompt for the Morrow MT-70 terminal 
  617. ; (may be changed with the ID command)
  618. ;
  619. myprom:    db    28        ; Max. size of buffer
  620.     db     10        ; Length of actual prompt
  621.     db     1BH,'G4MEX:'    ; Prompt string displays
  622.     db    1BH,'G0'    ; in reverse video with Morrow MT-70
  623.                 ; terminal.
  624. ;
  625. ;=======================================================================
  626. ;
  627. ; NOTE:  Must terminate prior to 0b00h (with smartmodem)
  628. ;                 0d00h (without smartmodem).
  629. ;
  630. ; The order of the patch variables supported here will not change from
  631. ; version to version (i.e., new items will be added on to the end).
  632. ;
  633.     org    0d00h        ;location of patch variables
  634. ;
  635. lf    equ    10        ;define ASCII linefeed code
  636. ;
  637. ;
  638. ; The following line defines the mex service call entry point, and
  639. ; is not meant to be changed by the user
  640. ;
  641. mex:    ds    3        ;mex service call processor
  642.     ds    3        ;reserved
  643.     ds    1        ;reserved
  644. ;
  645. ; The following line contains the initial free-memory pointer for
  646. ; mex.  Sophisticated modem overlays requiring additional space may change
  647. ; this pointer (ie, move it higher), and thus "protect" an area of ram.
  648. ;
  649. memry:    ds    2        ;first free memory pointer
  650. ;
  651. ; Following are the lowest-level vectors for console and list i/o used
  652. ; by mex.  These normally point to routines that save the registers and
  653. ; vector to the appropriate bios routines.  Complex applications may
  654. ; need to intercept (or even replace) these routines.  If you do this,
  655. ; be sure to preserve de, hl and bc.
  656. ;
  657. stsvec:    ds    2        ;console status vector
  658. invec:    ds    2        ;console input vector
  659. outvec:    dw    slbtyp        ;console output vector
  660. lvec:    ds    2        ;list output vector
  661. lstvec:    ds    2        ;list status vector
  662. ;
  663. ; The following line defines the location of the default mex prompt.
  664. ; If you'd like to provide your own initial prompt, add a dw statement
  665. ; pointing to a prompt buffer structured as follows:
  666. ;
  667. ;        db <max size of buffer>
  668. ;        db <length of actual prompt>
  669. ;        db <prompt string>
  670. ;
  671. ; <maxsize> and <length> may be equal (especially if you disable the
  672. ; id command by setting chgpmt, below to 0); the id command will, if
  673. ; left enabled, be limited to the <max size> value.
  674. ;
  675. prompt:    dw    myprom        ;prompt location
  676.     ds    1        ;reserved
  677. typlin:    db    22        ;for type command: # lines/screen
  678. pausfl:    db    1        ;for type cmd: 1=pause 0=no pause
  679. sepchr:    db    ','        ;multiple command-line separator
  680.                 ;changed from ';', which conflicts with
  681.                 ;ZCPR's MCL separator 
  682. ;
  683. ; Following five for SENDOUT command
  684. ;
  685. sowait:    db    4        ;# seconds waiting for a sendout echo
  686. sorepl:    db    8        ;# seconds waiting for initial reply
  687. sotrig:    db    '@'-64        ;sendout trigger char from remote
  688. canchr:    db    'X'-64        ;sendout char to cancel line to remote
  689. sortry:    db    2        ;sendout # retries
  690. ;
  691. hexflg:    db    0        ;hex/decimal mode
  692. escchr:    db    'T'-64        ;terminal mode escape char         d1fh
  693. nobell:    db    0        ;set to 0ffh to disable bell, 0 = bell    d20h
  694. ;
  695. ; Buffer variables.  see buffers.doc for setup information
  696. ;
  697. psize:    db    2        ;default=2k                d21h
  698. asize:    db    255        ;"big" capture buffer            d22h
  699. xsize:    db    16        ;16k transfer buffer.             d23h
  700. nsize:    db    1        ;1k for 85 batch files            d24h
  701. prelen:    db    40        ;maximum length of prefix string    d25h
  702. suflen:    db    40        ;maximum length of suffix string
  703. ;
  704. ; Misc. stuff
  705. ;
  706. cdosfl:    db    0        ;non-zero for cdos
  707. wtecho:    db    1        ;non-zero sets "wait-for-echo"
  708. kysize:    dw    400        ;size of keystring area, in bytes
  709. cisflg:    db    1        ;non-zero allows cis file transfers
  710. cisok:    db    1        ;non zero allows stat cis on or off
  711. chgpmt:    db    1        ;non-zero allows id (prompt chg) command
  712. errid:    db    1        ;non-zero prints id msg in err msgs
  713. ;
  714. ; By setting the following db to 0, you can disable the help
  715. ; command, freeing up space used by the help file index.
  716. ;
  717. helpok:    db    1        ;non-zero allows help command
  718. mexdu:    db    0        ;user \/  alternate area for read,load,ini.mex
  719.     db    0        ;drive/\  & help.mex (if search <>0)
  720. debug:    db    0        ;debugging in term-mode if non-zero
  721. exclsy:    db    1        ;non-0 excludes $sys from batchsend, dir
  722. inimex:    db    0        ;non-zero runs ini.mex (if present) at startup
  723. rtimer:    db    1        ;receiver wait: # seconds [plouff patch]
  724. pqsize:    dw    150        ;size of the modem-port queue
  725. phsize:    db    30        ;phone library size (# entries)
  726. silent:    db    0        ;0=silence multi-line & read cmd echo
  727. alert:    db    255        ;alert-bell count on call complete
  728. extend:    db    1        ;non-zero: unknown commands goto read processor
  729. split:    db    1        ;non-zero: splits phonelib printout, shows baud
  730. search:    db    0        ;search mode 0,1,2,3
  731. ;
  732. ; Following is the global secondary options table.  To
  733. ; set an option to global, change its ascii character to a 0.
  734. ;
  735. restt:    db    'ABDELQRSTVX'
  736.     ds    8        ;room for option expansion
  737. ;
  738. ; added on release 1.10:
  739. ;
  740. queue:    db    1        ;1=allow queueing, 0=no
  741. timbas:    dw    208        ;timing constant 
  742. mode:    db    0        ;mode of modem i/o
  743. sminit:    ds    2        ;smartmodem init routine adrs
  744. ssetv:    ds    2        ;sset command: defaulted off
  745. smexit:    ds    2        ;smartmodem exit routine adrs
  746.     ds    4        ;internal to mex
  747. sodflg:    db    0        ;1=tie sendout to time delay if no wtecho
  748. autosv:    db    1        ;0=initial term mode, save off
  749. tabflg:    db    0ffh        ;non-zero=expand tabs within mex
  750. ;
  751. ;
  752.     end
  753. lay if no wtecho
  754. autosv:    db    1        ;0=initial term mode, save off
  755. tabflg:    db    0