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-SX10.ASM < prev    next >
Assembly Source File  |  2000-06-30  |  29KB  |  823 lines

  1. ;
  2. ;
  3. ;
  4. ;
  5. REV     EQU     10              ;overlay revision level
  6. ;
  7. ; MEX STARPLEX OVERLAY VERSION 1.0: written 07/16/84 by Bill Meahan
  8. ;                                                       1951 S. Globe
  9. ;                                                       Westland, MI 48185
  10. ; I can also be contacted through MICROLINK-820 at:
  11. ;                 (313)487-0070 (24 hrs 300/1200 baud)
  12. ;
  13. ;
  14. ; This is a MEX overlay file for the National Semiconductor STARPLEX.
  15. ; Derived from the PMMI overlay by Ronald G. Fowler.
  16. ;
  17. ; This overlay should also work (except for the serial printer support) with
  18. ; systems based on the following single-board computers:
  19. ;                Intel          National
  20. ;                SBC80/20       BLC80/204
  21. ;                SBC80/20-4     BLC80/24
  22. ;                SBC80/24       BLC80/316
  23. ;                SBC80/30
  24. ;
  25. ; Intel development systems may have different addresses for the ports, but
  26. ; use the same arrangement of 8253 baud rate generators and 8251 USART's so
  27. ; this overlay should be EASILY adaptible to those systems as well.
  28. ;
  29. ;------------------------------------------------------------
  30. ;
  31. ; Misc equates
  32. ;
  33. NO    EQU    0
  34. YES     EQU     0FFH  
  35. TPA    EQU    100H
  36. CR    EQU    13
  37. LF    EQU    10
  38. TAB    EQU    9
  39. XON     EQU     011H
  40. XOFF    EQU     013H
  41. ;
  42. ; STARPLEX port definitions  (serial port 1)
  43. ;
  44. PORT    EQU     0ECH            ;STARPLEX base port (data or status)
  45. MODCT1  EQU     PORT+1          ;modem control port
  46. MODDAT  EQU     PORT            ;modem data port
  47. MODCT2  EQU     PORT+1          ;modem status port
  48. BAUDRP  EQU     0DDH            ;modem baud rate port
  49. BAUDMD  EQU     0DFH            ;modem baud rate mode control port
  50. ;
  51. ; STARPLEX bit definitions
  52. ;
  53. MDRCVB    EQU    02H        ;modem receive bit (DAV)
  54. MDRCVR    EQU    02H        ;modem receive ready
  55. MDSNDB    EQU    01H        ;modem send bit
  56. MDSNDR    EQU    01H        ;modem send ready bit
  57. ;
  58. CTSMSK    EQU    4        ;mask for CTS bit
  59. BRKMSK  EQU     8               ;mask to set break
  60. PARMSK    EQU    0CFH        ;mask to remove parity bits
  61. OPARIT  EQU     10H             ;odd-parity bits
  62. EPARIT  EQU     30H             ;even-parity bits
  63. NPARIT  EQU     00H             ;no-parity bits
  64. PARTST  EQU     10H             ;mask to test parity enabled bit
  65. EVNTST  EQU     20H             ;mask to test even parity bit
  66. MODEMK  EQU     06EH            ;mode mask
  67. MODEGO  EQU     027H            ;default control command
  68. RSTCTL  EQU     040H            ;reset USART command
  69. BITS7   EQU     08H             ;mask for 7 bit characters
  70. BITS8   EQU     0CH             ;mask for 8 bit characters
  71. BITS8T  EQU     04H             ;mask to test for 8 bit characters
  72. STBIT1  EQU     040H            ;mask to set 1 stop bit
  73. STBI15  EQU     080H            ;mask to set 1.5 stop bits   
  74. STBIT2  EQU     0C0H            ;mask to set 2 stop bits
  75. ;
  76. ;
  77. ; MEX service processor stuff ... MEX supports an overlay service
  78. ; processor, located at 0D00H (and maintained at this address from
  79. ; version to version).  If your overlay needs to call BDOS for any
  80. ; reason, it should call MEX instead; function calls below about
  81. ; 240 are simply passed on to the BDOS (console and list I/O calls
  82. ; are specially handled to allow modem port queueing, which is why
  83. ; you should call MEX instead of BDOS).  MEX uses function calls
  84. ; above about 244 for special overlay services (described below).
  85. ;
  86. ; Some sophisticated overlays may need to do file I/O; if so, use
  87. ; the PARSFN MEX call with a pointer to the FCB in DE to parse out
  88. ; the name.  This FCB should support a spare byte immediately pre-
  89. ; ceeding the actual FCB (to contain user # information).  If you've
  90. ; used MEX-10 for input instead of BDOS-10 (or you're parsing part
  91. ; of a SET command line that's already been input), then MEX will
  92. ; take care of DU specs, and set up the FCB accordingly.  There-
  93. ; after all file I/O calls done through the MEX service processor
  94. ; will handle drive and user with no further effort necessary on
  95. ; the part of the programmer.
  96. ;
  97. MEX    EQU    0D00H        ;address of the service processor
  98. INMDM    EQU    255        ;get char from port to A, CY=no more in 100 ms
  99. TIMER    EQU    254        ;delay 100ms * reg B
  100. TMDINP    EQU    253        ;B=# secs to wait for char, cy=no char
  101. CHEKCC    EQU    252        ;check for ^C from KBD, Z=present
  102. SNDRDY    EQU    251        ;test for modem-send ready
  103. RCVRDY    EQU    250        ;test for modem-receive ready
  104. SNDCHR    EQU    249        ;send a character to the modem (after sndrdy)
  105. RCVCHR    EQU    248        ;recv a char from modem (after rcvrdy)
  106. LOOKUP    EQU    247        ;table search: see CMDTBL comments for info
  107. PARSFN    EQU    246        ;parse filename from input stream
  108. BDPARS    EQU    245        ;parse baud-rate from input stream
  109. SBLANK    EQU    244        ;scan input stream to next non-blank
  110. EVALA    EQU    243        ;evaluate numeric from input stream
  111. LKAHED    EQU    242        ;get nxt char w/o removing from input
  112. GNC    EQU    241        ;get char from input, cy=1 if none
  113. ILP    EQU    240        ;inline print
  114. DECOUT    EQU    239        ;decimal output
  115. PRBAUD    EQU    238        ;print baud rate
  116. ;
  117. ;
  118. CONOUT    EQU    2        ;simulated BDOS function 2: console char out
  119. PRINT    EQU    9        ;simulated BDOS function 9: print string
  120. INBUF    EQU    10        ;input buffer, same structure as BDOS 10
  121. ;
  122.     ORG    TPA        ;we begin
  123. ;
  124. ;
  125.     DS    3        ;MEX has a JMP START here
  126. ;
  127. ; The following variables are located at the beginning of the program
  128. ; to facilitate modification without the need of re-assembly. They will
  129. ; be moved in MEX 2.0.
  130. ;
  131. STRPLX: DB      YES             ;yes=STARPLEX modem \ / These 2 locations are not
  132. SMODEM: DB      NO              ;yes=Smartmodem     / \ referenced by MEX
  133.         DB      0               ;spare
  134. CLOCK:  DB      38              ;clock speed x .1, up to 25.5 mhz.
  135. MSPEED:    DB    1        ;sets display time for sending a file
  136.                 ;0=110    1=300  2=450  3=600  4=710
  137.                 ;5=1200 6=2400 7=4800 8=9600 9=19200
  138. BYTDLY:    DB    5        ;default time to send character in
  139.                 ;terminal mode file transfer (0-9)
  140.                 ;0=0 delay, 1=10 ms, 5=50 ms, 9=90 ms
  141. CRDLY:    DB    5        ;end-of-line delay after CRLF in terminal
  142.                 ;mode file transfer for slow BBS systems
  143.                 ;0=0 delay, 1=100 ms, 5=500 ms, 9=900 ms
  144. COLUMS:    DB    5        ;number of directory columns
  145. SETFL:    DB    YES        ;yes=user-defined SET command
  146. SCRTST: DB      YES             ;yes=if home cursor and clear screen
  147.                 ;routine at CLRSCRN
  148.     DB    0        ;was once ACKNAK, now spare
  149. BAKFLG:    DB    NO        ;yes=make .BAK file
  150. CRCDFL:    DB    YES        ;yes=default to CRC checking
  151.                 ;no=default to Checksum checking
  152. TOGCRC:    DB    YES        ;yes=allow toggling of Checksum to CRC
  153. CVTBS:    DB    NO        ;yes=convert backspace to rub
  154. TOGLBK:    DB    YES        ;yes=allow toggling of bksp to rub
  155. ADDLF:    DB    NO        ;no=no LF after CR to send file in
  156.                 ;terminal mode (added by remote echo)
  157. TOGLF:    DB    YES        ;yes=allow toggling of LF after CR
  158. TRNLOG:    DB    NO        ;yes=allow transmission of logon
  159.                 ;write logon sequence at location LOGON
  160. SAVCCP:    DB    YES        ;yes=do not overwrite CCP
  161. LOCNXT:    DB    NO        ;yes=local cmd if EXTCHR precedes
  162.                 ;no=not local cmd if EXTCHR precedes
  163. TOGLOC:    DB    YES        ;yes=allow toggling of LOCNXTCHR
  164. LSTTST:    DB    YES        ;yes=allow toggling of printer on/off
  165.                 ;in terminal mode. Set to no if using
  166.                 ;the printer port for the modem
  167. XOFTST:    DB    NO        ;yes=allow testing of XOFF from remote
  168.                 ;while sending a file in terminal mode
  169. XONWT:    DB    NO        ;yes=wait for XON after sending CR while
  170.                 ;transmitting a file in terminal mode    
  171. TOGXOF:    DB    YES        ;yes=allow toggling of XOFF testing
  172. IGNCTL:    DB    NO        ;yes=do not send control characters
  173.                 ;above CTL-M to CRT in terminal mode
  174.                 ;no=send any incoming CTL-char to CRT
  175. EXTRA1:    DB    0        ;for future expansion
  176. EXTRA2:    DB    0        ;for future expansion
  177. BRKCHR:    DB    '@'-40H        ;^@ = Send a 300 ms. break tone
  178. NOCONN:    DB    'N'-40H        ;^N = Disconnect from phone line
  179. LOGCHR:    DB    'L'-40H        ;^L = Send logon
  180. LSTCHR:    DB    'P'-40H        ;^P = Toggle printer
  181. UNSVCH:    DB    'R'-40H        ;^R = Close input text buffer
  182. TRNCHR:    DB    'T'-40H        ;^T = Transmit file to remote
  183. SAVCHR:    DB    'Y'-40H        ;^Y = Open input text buffer
  184. EXTCHR:    DB    '^'-40H        ;^^ = Send next character
  185. ;
  186. ; Equates used only by STARPLEX routines grouped together here.
  187. ;
  188.         DB      0               ;not used
  189.     DB    0        ;not used
  190. ;
  191. ; Low-level modem I/O routines: this will be replaced with
  192. ; a jump table in MEX 2.0 (you can insert jumps here to longer
  193. ; routines if you'd like ... I'd recommend NOT putting part of
  194. ; a routine in this area, then jumping to the rest of the routine
  195. ; in the non-fixed area; that will complicate the 2.0 conversion)
  196. ;
  197. INCTL1:    IN    MODCT1        ;in modem control port
  198.     RET
  199.         DB      0,0,0,0,0,0,0   ;spares if needed for non-STARPLEX
  200. ;
  201. OTDATA:    OUT    MODDAT        ;out modem data port
  202.     RET
  203.         DB      0,0,0,0,0,0,0   ;spares if needed for non=STARPLEX
  204. ;
  205. INPORT:    IN    MODDAT        ;in modem data port
  206.     RET
  207.         DB      0,0,0,0,0,0,0   ;spares if needed for non-STARPLEX
  208. ;
  209. ; Bit-test routines.  These will be merged with the above
  210. ; routines in MEX 2.0 to provide a more reasonable format
  211. ;
  212. MASKR:    ANI MDRCVB ! RET    ;bit to test for receive ready
  213. TESTR:    CPI MDRCVR ! RET    ;value of receive bit when ready
  214. MASKS:    ANI MDSNDB ! RET    ;bit to test for send ready
  215. TESTS:    CPI MDSNDR ! RET    ;value of send bit when ready
  216. ;
  217. ;
  218. ; Unused area: was once used for special STARPLEX functions,
  219. ; Now used only to retain compatibility with MDM overlays.
  220. ; You may use this area for any miscellaneous storage you'd
  221. ; like but the length of the area *must* be 12 bytes.
  222. ;
  223.     DS    12
  224. ;
  225. ; Special modem function jump table: 
  226. ;
  227. LOGON:    DS    2        ;needed for MDM compat, not ref'd by MEX
  228. DIALV:  DS      3               ;dial digit in A (see info at PDIAL)
  229. DISCV:  DS      3               ;disconnect the modem
  230. GOODBV:    JMP    DUMMY        ;called before exit to CP/M
  231. INMODV:    JMP    NITMOD        ;initialization. Called at cold-start
  232. NEWBDV:    JMP    PBAUD        ;set baud rate
  233. NOPARV: JMP     DUMMY           ;set modem for no-parity
  234. PARITV: JMP     DUMMY           ;set modem parity
  235. SETUPV:    JMP    SETCMD        ;SET cmd: jump to a RET if you don't write SET
  236. SPMENV:    DS    3        ;not used with MEX
  237. VERSNV:    JMP    SYSVER        ;Overlay's voice in the sign-on message
  238. BREAKV:    JMP    PBREAK        ;send a break
  239. ;
  240. ; The following jump vector provides the overlay with access to special
  241. ; routines in the main program (retained and supported in the main pro-
  242. ; gram for MDM overlay compatibility). These should not be modified by
  243. ; the overlay.
  244. ;
  245. ; Note that for MEX 2.0 compatibility, you should not try to use these
  246. ; routines, since this table will go away with MEX 2.0 (use the MEX
  247. ; service call processor instead).
  248. ;
  249. ILPRTV:    DS    3        ;replace with MEX function 9
  250. INBUFV:    DS    3        ;replace with MEX function 10
  251. ILCMPV:    DS    3        ;replace with table lookup funct. 247
  252. INMDMV:    DS    3        ;replace with MEX function 255
  253. NXSCRV:    DS    3        ;not supported by MEX (returns w/no action)
  254. TIMERV:    DS    3        ;replace with MEX function 254
  255. ;
  256. ;
  257. ; Clear/screen and clear/end-of-screen. Each routine must use the
  258. ; full 9 bytes alloted (may be padded with nulls).
  259. ;
  260. ; These routines (and other screen routines that MEX 2.0 will sup-
  261. ; port) will be accessed through a jump table in 2.0, and will be
  262. ; located in an area that won't tie the screen functions to the
  263. ; modem overlay (as the MDM format does).
  264. ;
  265. CLREOS:    LXI    D,EOSMSG
  266.     MVI    C,PRINT
  267.     CALL    MEX
  268.     RET
  269. ;
  270. ;
  271. CLS:    LXI    D,CLSMSG        ;null unless patched
  272.     MVI    C,PRINT
  273.     CALL    MEX
  274.     RET
  275. ;
  276. ;------------------------------------------------------------
  277. ;
  278. ;       *** END OF FIXED FORMAT AREA ***
  279. ;
  280. ;------------------------------------------------------------
  281. ;
  282. ; Modem initialization.
  283. ;
  284. NITMOD:    
  285.         MVI     A,1             ;default to 300 baud on start-up
  286.         CALL    PBAUD
  287.         LDA     MODMOD          ;default mode command in A
  288. ALTINI:                         ;alternate entry point for mode change routines
  289.         PUSH    PSW             ;save mode command on stack
  290.         XRA     A               ;force 8251 USART to look for reset command
  291.         OUT     MODCT2
  292.         OUT     MODCT2
  293.         OUT     MODCT2
  294.         MVI     A,RSTCTL        ;reset USART
  295.         OUT     MODCT2
  296.         POP     PSW             ;retreive mode command
  297.         STA     MODMOD          ;save copy for future use
  298.         OUT     MODCT2          ;set USART mode
  299.         MVI     A,MODEGO        ;enable transmitter and receiver
  300.         OUT     MODCT2
  301.         RET
  302. ;
  303. ; STARPLEX send-break routine
  304. ;
  305. PBREAK: LDA     MODCTB          ;get the last modem control byte
  306.         ORI     BRKMSK          ;set the transmit break bit low
  307.     OUT    MODCT2        ;send it to the modem
  308.         LXI     B,02FEH         ;B=2, C=254 
  309.         CALL    MEX             ;send a space tone for 200 ms.
  310.     LDA    MODCTB        ;get the last modem control byte
  311.     OUT    MODCT2        ;restore to normal
  312. ;
  313. ; exit routine
  314. ;
  315. DUMMY:    RET            ;we don't need one
  316. ;
  317. ;
  318. ;
  319. ; Set baud-rate code in A 
  320. ;
  321. PBAUD:    PUSH    H        ;don't alter anybody
  322.     PUSH    D
  323.     PUSH    B
  324.         STA     MSPEED
  325.         ADD     A               ;double value to get word address
  326.     MOV    E,A        ;code to DE
  327.     MVI    D,0
  328.     LXI    H,BAUDTB    ;offset into table
  329.     DAD    D
  330.         MOV     C,M             ;fetch code
  331.         INX     H
  332.         MOV     B,M
  333.         MVI     A,076H
  334.         OUT     BAUDMD          ;control counter
  335.         MOV     A,C
  336.         OUT     BAUDRP
  337.         MOV     A,B
  338.         OUT     BAUDRP          ;good rate, set it
  339. PBEXIT: POP     B               ;all done
  340.     POP    D
  341.     POP    H
  342.     RET
  343. ;
  344. ; table of baud rate divisors for supported rates
  345. ;
  346. BAUDTB: DW      1048,384,256,192,162    ;110,300,450,610,710
  347.         DW      96,48,24,12,6           ;1200,2400,4800,9600,19200
  348. ;
  349. ; Sign-on message
  350. ;
  351. SYSVER:    LXI    D,SOMESG
  352.     MVI    C,PRINT
  353.     CALL    MEX
  354.         RET
  355. ;
  356. SOMESG: DB      'STARPLEX overlay By Bill Meahan V. '
  357.         DB      REV/10+'0'
  358.     DB    '.'
  359.     DB    REV MOD 10+'0'
  360.     DB    ': $'
  361. ;
  362. ;
  363. ;
  364. ;
  365. ; Newline on console
  366. ;
  367. CRLF:    MVI    A,CR
  368.     CALL    TYPE
  369.     MVI    A,LF        ;fall into TYPE
  370. ;
  371. ; type char in A on console
  372. ;
  373. TYPE:    PUSH    H        ;save 'em
  374.     PUSH    D
  375.     PUSH    B
  376.     MOV    E,A        ;align output character
  377.     MVI    C,CONOUT    ;print via MEX
  378.     CALL    MEX
  379.     POP    B
  380.     POP    D
  381.     POP    H
  382.     RET
  383. ;
  384. ; strings to clear-to-end-of-screen, and clear-screen
  385. ;
  386. EOSMSG: DB      09BH,'$'        ;clear to end-of-screen
  387. CLSMSG: DB      09AH,'$'        ;clear whole screen
  388. ;
  389. ; Data area
  390. ;
  391. ERRFLG:    DB    0        ;connection error code
  392. MODMOD  DB      MODEMK          ;uart-control byte image
  393. BAUDSV: DB      01              ;current baud rate (dflt 300)
  394. MODCTB: DB      MODEGO          ;modem control byte
  395. ;
  396. ;------------------------------------------------------------
  397. ;
  398. ; The remainder of this overlay implements a very versatile
  399. ; SET command -- 
  400. ;
  401. ;
  402. ; Control is passed here after MEX parses a SET command.
  403. ;
  404. SETCMD:    MVI    C,SBLANK    ;any arguments?
  405.     CALL    MEX
  406.     JC    SETSHO        ;if not, go print out values
  407.     LXI    D,CMDTBL    ;parse command
  408.     CALL    TSRCH        ;from table
  409.     PUSH    H        ;any address on stack
  410.     RNC            ;if we have one, execute it
  411.     POP    H        ;nope, fix stack
  412. SETERR:    LXI    D,SETEMS    ;print error
  413.     MVI    C,PRINT
  414.     CALL    MEX
  415.     RET
  416. ;
  417. SETEMS:    DB    CR,LF,'SET command error',CR,LF,'$'
  418. ;
  419. ; SET command table ... note that tables are constructed of command-
  420. ; name (terminated by high bit=1) followed by word-data-value returned
  421. ; in HL by MEX service processor LOOKUP.  Table must be terminated by
  422. ; a binary zero.
  423. ;
  424. ; Note that LOOKUP attempts to find the next item in the input stream
  425. ; in the table passed to it in HL ... if found, the table data item is
  426. ; returned in HL; if not found, LOOKUP returns carry set.
  427. ;
  428. CMDTBL:    DB    '?'+80H            ;"set ?"
  429.     DW    STHELP
  430.     DB    'BAU','D'+80H        ;"set baud"
  431.     DW    STBAUD
  432.         DB      'PARIT','Y'+80H         ;"set parity"
  433.         DW      SETPAR
  434.         DB      'BIT','S'+80H           ;"set bits"
  435.         DW      SETBIT
  436.         DB      'STO','P'+80H           ;"set stop"
  437.         DW      SETSTO
  438. ;
  439.     DB    0        ;<<=== table terminator
  440. ;
  441. ; SET <no-args>: print current statistics
  442. ;
  443. SETSHO: 
  444.     LXI    H,SHOTBL    ;get table of SHOW subroutines
  445. SETSLP:    MOV    E,M        ;get table address
  446.     INX    H
  447.     MOV    D,M
  448.     INX    H
  449.     MOV    A,D        ;end of table?
  450.     ORA    E
  451.     RZ            ;exit if so
  452.     PUSH    H        ;save table pointer
  453.     XCHG            ;adrs to HL
  454.     CALL    GOHL        ;do it
  455.     CALL    CRLF        ;print newline
  456.     MVI    C,CHEKCC    ;check for console abort
  457.     CALL    MEX
  458.     POP    H        ;it's done
  459.     JNZ    SETSLP        ;continue if no abort
  460.     RET
  461. ;
  462. GOHL:    PCHL
  463. ;
  464. ; table of SHOW subroutines
  465. ;
  466. SHOTBL:    DW    BDSHOW
  467.         DW      PARSHO
  468.         DW      BITSHO
  469.         DW      STOSHO
  470.         DW      0               ;<<== table terminator
  471. ;
  472. ; SET ?  processor
  473. ;
  474. STHELP:    LXI    D,HLPMSG
  475.     MVI    C,PRINT
  476.     CALL    MEX
  477.     RET
  478. ;
  479. ; The help message
  480. ;
  481. HLPMSG: DB      CR,LF,'SET command, STARPLEX version:',CR,LF,LF
  482.         DB      CR,LF,'SET BAUD 150 <or> 300 <or> 600 <or> 1200 <or> 2400'
  483.         DB      CR,LF,'    <or> 4800 <or> 9600'
  484.         DB      CR,LF,'SET PARITY ODD <or> EVEN <or> OFF'
  485.         DB      CR,LF,'SET BITS 7 <or> 8'
  486.         DB      CR,LF,'SET STOP 1 <or> 1.5 <or> 2'
  487.         DB      CR,LF,'$'
  488. ;
  489. ; SET BAUD processor
  490. ;
  491. STBAUD:    MVI    C,BDPARS    ;function code
  492.     CALL    MEX        ;let MEX look up code
  493.     JC    SETERR        ;invalid code
  494.     CALL    PBAUD        ;no, try to set it
  495.     JC    SETERR        ;not-supported code
  496. BDSHOW:    CALL    ILPRT        ;display baud
  497.     DB    'Baud rate:',TAB,' ',0
  498.     LDA    MSPEED
  499.     MVI    C,PRBAUD    ;use MEX routine
  500.     CALL    MEX
  501.     RET
  502. ;
  503. ; SET PARITY processor
  504. ;
  505. SETPAR:
  506.         LXI     D,PARTBL        ;point to argument table
  507.         CALL    TSRCH           ;look for match with allowed arguments
  508.         JC      SETERR          ;process error if found
  509.         LDA     MODMOD          ;get current mode byte
  510.         ANI     PARMSK          ;mask away current parity bits
  511.         ORA     L               ;add new parity bits
  512.         CALL    ALTINI
  513. PARSHO:
  514.         CALL    ILPRT           ;show current status
  515.         DB      'Parity:',TAB,' ',0
  516.         LDA     MODMOD          ;get current mode word
  517.         ANI     PARTST          ;test for parity enabled
  518.         JNZ     PAR             ;skip if it is
  519.         CALL    ILPRT
  520.         DB      'Off',0
  521.         RET
  522. PAR:
  523.         LDA     MODMOD
  524.         ANI     EVNTST          ;test mode byte for even parity
  525.         JNZ     PAREVN          ;skip if it is
  526.         CALL    ILPRT
  527.         DB      'Odd',0
  528.         RET
  529. PAREVN:
  530.         CALL    ILPRT
  531.         DB      'Even',0
  532.         RET
  533. ;
  534. ;PARITY argument table
  535. ;
  536. PARTBL: DB      'OD','D'+80H
  537.         DB      OPARIT,0
  538.         DB      'EVE','N'+80H
  539.         DB      EPARIT,0
  540.         DB      'OF','F'+80H
  541.         DB      NPARIT,0
  542.         DB      0
  543. ;
  544. ;SET BITS processor
  545. ;
  546. SETBIT:
  547.         LXI     D,BITTBL        ;point to argument table
  548.         CALL    TSRCH           ;look for match with allowed arguments
  549.         JC      SETERR          ;process error if found
  550.         LDA     MODMOD          ;get current mode command
  551.         ANI     (NOT BITS8) AND 255     ;mask away current bits
  552.         ORA     L               ;set new bits
  553.         CALL    ALTINI          ;change mode
  554. BITSHO:
  555.         CALL    ILPRT           ;show current status
  556.         DB      'Bits:',TAB,' ',0
  557.         LDA     MODMOD          ;get current mode word
  558.         ANI     BITS8           ;test for number of bits
  559.         JZ      SETERR
  560.         ANI     BITS8T           
  561.         JNZ     B8              ;skip if it is
  562.         CALL    ILPRT
  563.         DB      '7',0
  564.         RET
  565. B8:
  566.         CALL    ILPRT
  567.         DB      '8',0
  568.         RET
  569. ;
  570. ;BITS argument table
  571. ;
  572. BITTBL: DB      '8'+80H
  573.         DB      BITS8,0
  574.         DB      '7'+80H
  575.         DB      BITS7,0
  576.         DB      0
  577. ;
  578. ;SET STOP processor
  579. ;
  580. SETSTO:
  581.         LXI     D,STPTBL        ;point to argument table
  582.         CALL    TSRCH           ;look for match with allowed arguments
  583.         JC      SETERR          ;process error if found
  584.         LDA     MODMOD          ;get current mode command
  585.         ANI     (NOT STBIT2) AND 255     ;mask away current bits
  586.         ORA     L               ;set new bits
  587.         CALL    ALTINI          ;change mode
  588. STOSHO:
  589.         CALL    ILPRT           ;show current status
  590.         DB      'Stop Bits:',TAB,' ',0
  591.         LDA     MODMOD          ;get current mode word
  592.         ANI     STBIT2          ;test for number of bits
  593.         JZ      SETERR
  594.         RLC
  595.         RLC
  596.         ADD     A               ;form word table index
  597.         LXI     H,STJTBL        ;get address of jump table
  598.         ADD     L               ;point to address of proper routine
  599.         MOV     L,A
  600.         MVI     A,0
  601.         ADC     H
  602.         MOV     H,A
  603.         MOV     A,M             ;get address of proper routine
  604.         INX     H
  605.         MOV     H,M
  606.         MOV     L,A
  607.         PCHL                    ;branch to proper routine
  608. PRT1:
  609.         CALL    ILPRT
  610.         DB      '1',0
  611.         RET
  612. PRT2:
  613.         CALL    ILPRT
  614.         DB      '2',0
  615.         RET
  616. PRT15:
  617.         CALL    ILPRT
  618.         DB      '1.5',0
  619.         RET
  620. ;
  621. STJTBL:                         ;jump table for stop bit show routines
  622.         DW      SETERR
  623.         DW      PRT1
  624.         DW      PRT15
  625.         DW      PRT2
  626. ;
  627. ;STOP argument table
  628. ;
  629. STPTBL: DB      '1'+80H
  630.         DB      STBIT1,0
  631.         DB      '1.','5'+80H
  632.         DB      STBI15,0
  633.         DB      '2'+80H
  634.         DB      STBIT2,0
  635.         DB      0
  636. ;
  637. ; Compare next input-stream item in table @DE; CY=1
  638. ; if not found, else HL=matched data item
  639. ;
  640. TSRCH:    MVI    C,LOOKUP    ;get function code
  641.     JMP    MEX        ;pass to MEX processor
  642. ;
  643. ; Print in-line message ... blows away C register
  644. ;
  645. ILPRT:    MVI    C,ILP        ;get function code
  646.     JMP    MEX        ;go do it
  647. ;------------------------------------------------------------------------------
  648. ;
  649. ;The following routines are provided to support a printer
  650. ;on the second serial port of the STARPLEX II which is not
  651. ;supported (except for USART initialization at 1200 baud)
  652. ;by the STARPLEX CP/M BIOS. The routine here also implements
  653. ;XON-XOFF support which is provided by many printers.
  654. ;(e.g. LA100, TI820, etc.)
  655. ;
  656. ;At my installation, there is no need to change baud rates, parity, etc
  657. ;but if you need to do so, just duplicate the appropriate routines
  658. ;from the SET command. I'd suggest then using SET PRINTER BAUD or equal
  659. ;to go to the proper routines. The baud rate counter for port 2 is 
  660. ;counter 2 of the 8253 rather than counter 1. (Code 0B6H instead of 076H
  661. ;in PBAUD). Port addresses shown below.
  662. ;
  663. ;You do not need anything from here to the END statement UNLESS you DO want
  664. ;to support a serial printer on port 2 of a STARPLEX II. For systems other
  665. ;than STARPLEX II, (i.e. one built upon one of the SBC or BLC series boards)
  666. ;delete this stuff!
  667. ;
  668. PTRSTP  EQU     0EFH            ;USART status port address
  669. PTRDTP  EQU     0EEH            ;  "    data   "    "
  670. PTROKP  EQU     001H            ;mask for transmit busy status bit
  671. PTRINC  EQU     002H            ;mask for receiver ready status bit
  672. ;
  673. OKPRNT: DB      0FFH            ;OK to PRiNT flag. OK=0FFH Hold=0
  674. ;
  675. PTRTST:                         ;printer  status routine
  676.         PUSH    B               ;save b-c registers for MEX
  677.         IN      PTRSTP          ;get USART status
  678.         MOV     B,A             ;save a copy in b register
  679.         ANI     PTRINC          ;character in?
  680.         JZ      TSTPST          ;just skip and test status if not
  681.         IN      PTRDTP          ;get character
  682.         CPI     XON             ;XON character
  683.         JNZ     ISXOFF          ;skip if not
  684.         MVI     A,0FFH          ;set OK flag
  685.         STA     OKPRNT
  686.         JMP     PSTTST          ;skip to status test
  687. ISXOFF: CPI     XOFF            ;XOFF character?
  688.         JNZ     TSTPST          ;skip to status test if not (ignore)
  689.         XRA     A               ;reset flag
  690.         STA     OKPRNT
  691.         JMP     PSEXIT          ;then exit- a is already zero indicating hold
  692. TSTPST:  
  693.         LDA     OKPRNT          ;get hold flag
  694. PSTTST:  
  695.         ORA     A               ;test for hold
  696.         JZ      PSEXIT          ;exit if OK flag false (0)
  697.         MOV     A,B             ;test actual USART transmitter status
  698.         ANI     PTROKP
  699.         JZ      PSEXIT          ;exit if not ready
  700.         MVI     A,0FFH          ;MEX wants to see an FF if ok to print
  701. PSEXIT: POP     B               ;restore saved registers
  702.         RET                     ;return to MEX
  703. ;
  704. PTROUT: OUT     PTRDTP          ;shove character out to printer
  705.         RET
  706. ;
  707. ;
  708. ; Patches to MEX for STARPLEX system. (primarily adds vectors for serial
  709. ;                                      printer support)
  710. ;
  711.     ORG    0D00H        ;location of patch variables
  712. ;
  713. ;
  714. ;
  715. ; The following line defines the MEX service call entry point, and
  716. ; is not meant to be changed by the user
  717. ;
  718.         DS      3               ;MEX service call processor
  719.         DS      3               ;reserved
  720.         DS      1               ;reserved
  721. ;
  722. ; The following line contains the initial free-memory pointer for
  723. ; MEX.  Sophisticated modem overlays requiring additional space may change
  724. ; this pointer (ie, move it higher), and thus "protect" an area of RAM.
  725. ;
  726.         DS      2               ;first free memory pointer
  727. ;
  728. ; Following are the lowest-level vectors for console and list I/O used
  729. ; by MEX.  These normally point to routines that save the registers and
  730. ; vector to the appropriate BIOS routines.  Complex applications may
  731. ; need to intercept (or even replace) these routines.  If you do this,
  732. ; be sure to preserve DE, HL and BC.
  733. ;
  734.         DS      2               ;console status vector
  735.         DS      2               ;console input vector
  736.         DS      2               ;console output vector
  737.         DW      PTROUT          ;list output vector  (points to local routine)
  738.         DW      PTRTST          ;list status vector  (points to local routine)
  739. ;
  740. ; The following line defines the location of the default MEX prompt.
  741. ; If you'd like to provide your own initial prompt, add a DW statement
  742. ; pointing to a prompt buffer structured as follows:
  743. ;
  744. ;        DB <max size of buffer>
  745. ;        DB <length of actual prompt>
  746. ;        DB <prompt string>
  747. ;
  748. ; <maxsize> and <length> may be equal (especially if you disable the
  749. ; ID command by setting CHGPMT, below to 0); the ID command will, if
  750. ; left enabled, be limited to the <max size> value.
  751. ;
  752.         DS      2               ;prompt location
  753.         DS      1               ;reserved
  754.         DB      24              ;for TYPE command: # lines/screen
  755.         DB      1               ;for TYPE cmd: 1=pause 0=no pause
  756.         DB      ';'             ;multiple command-line separator
  757. ;
  758. ; following five for SENDOUT command
  759. ;
  760.         DB      4               ;# seconds waiting for a sendout echo
  761.         DB      8               ;# seconds waiting for initial reply
  762.         DB      '>'             ;sendout trigger char from remote
  763.         DB      'U'-64          ;sendout char to cancel line to remote
  764.         DB      6               ;sendout # retries
  765. ;
  766. ;
  767.         DB      0               ;hex/decimal mode
  768.         DB      01BH            ;terminal mode escape char (01BH = ESC)
  769.         DB      0               ;set to 1 to disable bell
  770. ;
  771. ; Buffer variables.  See BUFFERS.DOC for setup information
  772. ;
  773.         DB      2               ;default=2k
  774.         DB      255             ;"big" capture buffer
  775.         DB      16              ;16K transfer buffer
  776.         DB      1               ;1k for 85 batch files
  777.         DB      40              ;maximum length of PREFIX string
  778.         DB      40              ;maximum length of SUFFIX string
  779. ;
  780. ; Misc. stuff
  781. ;
  782.         DB      0               ;non-zero for CDOS
  783.         DB      0               ;non-zero sets "wait-for-echo"
  784.         DW      400             ;size of keystring area, in bytes
  785.         DB      1               ;non-zero allows CIS file transfers
  786.         DB      1               ;non zero allows STAT CIS ON or OFF
  787.         DB      1               ;non-zero allows ID (prompt chg) command
  788.         DB      1               ;non-zero prints ID msg in err msgs
  789. ;
  790. ; by setting the following DB to 0, you can disable the HELP
  791. ; command, freeing up space used by the help file index.
  792. ;
  793.         DB      1               ;non-zero allows HELP command
  794.         DB      0               ;user \/  alternate area for READ,LOAD,INI.MEX
  795.     DB    0        ;drive/\  & HELP.MEX (if SEARCH <>0)
  796.         DB      0               ;debugging in term-mode if non-zero
  797.         DB      1               ;non-0 excludes $SYS from batchsend, dir
  798.         DB      0               ;non-zero runs INI.MEX (if present) at startup
  799.         DB      1               ;receiver wait: # seconds [Plouff patch]
  800.         DW      150             ;size of the modem-port queue
  801.         DB      30              ;phone library size (# entries)
  802.         DB      0FFH            ;0=silence multi-line & READ cmd echo
  803.         DB      255             ;alert-bell count on CALL complete
  804.         DB      0               ;non-zero: unknown commands goto READ processor
  805.         DB      0               ;non-zero: splits phonelib printout, shows baud
  806.         DB      0               ;search mode 0,1,2,3
  807. ;
  808. ; Following is the GLOBAL secondary options table.  To
  809. ; set an option to global, change its ASCII character to a 0.
  810. ;
  811.         DB      'BDLQRSTVX'
  812. ;
  813. ;
  814. ;
  815. ;------------------------------------------------------------
  816. ;
  817. ; End of STARPLEX MEX modem overlay and patches
  818. ;
  819. ;------------------------------------------------------------
  820. ;
  821.         END
  822.