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-NE88.ASM < prev    next >
Assembly Source File  |  2000-06-30  |  20KB  |  740 lines

  1. ;    Title    'MEX overlay for the NEC PC-8801 version 1.0'
  2. ;
  3. ;
  4. ; (delete above title line if not assembling with MAC)
  5. ;
  6. ;
  7. REV    EQU    10        ;overlay revision level
  8. ;
  9. ; MEX NEC PC-8801 OVERLAY VERSION 1.0: written 06/24/84 by Bob Schultz
  10. ;
  11. ;   based on MXO-PM10.ASM  by Ron Fowler
  12. ;
  13. ;------------------------------------------------------------
  14. ;
  15. ; Misc equates
  16. ;
  17. NO    EQU    0
  18. YES    EQU    0FFH
  19. TPA    EQU    100H
  20. CR    EQU    13
  21. LF    EQU    10
  22. TAB    EQU    9
  23. BS    EQU    8
  24. ESC    EQU    1BH
  25. CLRSCR    EQU    1AH
  26. ;
  27. ; Equates for the 8251 mode register
  28. ;
  29. BAUDMSK    EQU    3        ;mask to get baud rate bits
  30. BIT5    EQU    00H        ;5 bits
  31. BIT6    EQU    04H        ;6 bits
  32. BIT7    EQU    08H        ;7 bits
  33. BIT8    EQU    0CH        ;8 bits
  34. BITMSK    EQU    0CH        ;mask to get character length
  35. PARE    EQU    30H        ;even parity
  36. PARO    EQU    10H        ;odd parity
  37. PARN1    EQU    00H        ;no parity
  38. PARN2    EQU    20H        ;another code for no parity
  39. PARMSK    EQU    30H        ;mask to get parity bits
  40. STP1    EQU    40H        ;1 stop bit
  41. STP15    EQU    80H        ;1.5 stop bits
  42. STP2    EQU    0C0H        ;2 stop bits
  43. STPMSK    EQU    0C0H        ;mask to get stop bits
  44. ;
  45. ; Equates for the 8251 command register
  46. ;
  47. RTSBIT    EQU    20H        ;bit to turn RTS ON
  48. BRKBIT    EQU    08H        ;bit to send break
  49. DTRBIT    EQU    02H        ;bit to turn on DTR
  50. CMND    EQU    37H        ;RTS, error reset, Rx enable, DTR, Tx enable
  51. MODRST    EQU    40H        ;reset the 8251
  52. ;
  53. ; 8251 port and bit definitions
  54. ;
  55. PORT    EQU    20HèMODCTL    EQU    PORT+1        ;status register for RS232
  56. MODDAT    EQU    PORT        ;data resister for RS232
  57. MDSNDB    EQU    01H        ;bit to test for ready to send
  58. MDSNDR    EQU    01H        ;modem send ready when high
  59. MDRCVB    EQU    02H        ;bit to test for received data
  60. MDRCVR    EQU    02H        ;modem receive ready when high
  61. ;
  62. ; MEX service processor
  63. ;
  64. MEX    EQU    0D00H        ;address of the service processor
  65. INMDM    EQU    255        ;get char from port to A, CY=no more in 100 ms
  66. TIMER    EQU    254        ;delay 100ms * reg B
  67. TMDINP    EQU    253        ;B=# secs to wait for char, cy=no char
  68. CHEKCC    EQU    252        ;check for ^C from KBD, Z=present
  69. SNDRDY    EQU    251        ;test for modem-send ready
  70. RCVRDY    EQU    250        ;test for modem-receive ready
  71. SNDCHR    EQU    249        ;send a character to the modem (after sndrdy)
  72. RCVCHR    EQU    248        ;recv a char from modem (after rcvrdy)
  73. LOOKUP    EQU    247        ;table search: see CMDTBL comments for info
  74. PARSFN    EQU    246        ;parse filename from input stream
  75. BDPARS    EQU    245        ;parse baud-rate from input stream
  76. SBLANK    EQU    244        ;scan input stream to next non-blank
  77. EVALA    EQU    243        ;evaluate numeric from input stream
  78. LKAHED    EQU    242        ;get nxt char w/o removing from input
  79. GNC    EQU    241        ;get char from input, cy=1 if none
  80. ILP    EQU    240        ;inline print
  81. DECOUT    EQU    239        ;decimal output
  82. PRBAUD    EQU    238        ;print baud rate
  83. ;
  84. ;
  85. CONOUT    EQU    2        ;simulated BDOS function 2: console char out
  86. PRINT    EQU    9        ;simulated BDOS function 9: print string
  87. INBUF    EQU    10        ;input buffer, same structure as BDOS 10
  88. ;
  89.     ORG    TPA        ;we begin
  90. ;
  91. ;
  92.     DS    3        ;MEX has a JMP START here
  93. ;
  94. ; The following variables are located at the beginning of the program
  95. ; to facilitate modification without the need of re-assembly. They will
  96. ; be moved in MEX 2.0.
  97. ;
  98. PMODEM:    DB    NO        ;yes=PMMI modem \ / These 2 locations are not
  99. SMODEM:    DB    YES        ;yes=Smartmodem / \ referenced by MEX
  100. TPULSE:    DB    'T'        ;T=touch, P=pulse (not referenced by MEX)
  101. CLOCK:    DB    40        ;clock speed x .1, up to 25.5 mhz.
  102. MSPEED:    DB    1        ;sets display time for sending a file
  103.                 ;0=110    1=300  2=450  3=600  4=710
  104.                 ;5=1200 6=2400 7=4800 8=9600 9=19200
  105. BYTDLY:    DB    5        ;default time to send character in
  106.                 ;terminal mode file transfer (0-9)
  107.                 ;0=0 delay, 1=10 ms, 5=50 ms, 9=90 ms
  108. CRDLY:    DB    5        ;end-of-line delay after CRLF in terminal
  109.                 ;mode file transfer for slow BBS systemsè                ;0=0 delay, 1=100 ms, 5=500 ms, 9=900 ms
  110. COLUMS:    DB    3        ;number of directory columns
  111. SETFL:    DB    YES        ;yes=user-defined SET command
  112. SCRTST:    DB    YES        ;yes=if home cursor and clear screen
  113.                 ;routine at CLRSCRN
  114.     DB    0        ;was once ACKNAK, now spare
  115. BAKFLG:    DB    NO        ;yes=make .BAK file
  116. CRCDFL:    DB    YES        ;yes=default to CRC checking
  117.                 ;no=default to Checksum checking
  118. TOGCRC:    DB    YES        ;yes=allow toggling of Checksum to CRC
  119. CVTBS:    DB    NO        ;yes=convert backspace to rub
  120. TOGLBK:    DB    YES        ;yes=allow toggling of bksp to rub
  121. ADDLF:    DB    NO        ;no=no LF after CR to send file in
  122.                 ;terminal mode (added by remote echo)
  123. TOGLF:    DB    YES        ;yes=allow toggling of LF after CR
  124. TRNLOG:    DB    NO        ;yes=allow transmission of logon
  125.                 ;write logon sequence at location LOGON
  126. SAVCCP:    DB    YES        ;yes=do not overwrite CCP
  127. LOCNXT:    DB    NO        ;yes=local cmd if EXTCHR precedes
  128.                 ;no=not local cmd if EXTCHR precedes
  129. TOGLOC:    DB    YES        ;yes=allow toggling of LOCNXTCHR
  130. LSTTST:    DB    YES        ;yes=allow toggling of printer on/off
  131.                 ;in terminal mode. Set to no if using
  132.                 ;the printer port for the modem
  133. XOFTST:    DB    NO        ;yes=allow testing of XOFF from remote
  134.                 ;while sending a file in terminal mode
  135. XONWT:    DB    NO        ;yes=wait for XON after sending CR while
  136.                 ;transmitting a file in terminal mode    
  137. TOGXOF:    DB    YES        ;yes=allow toggling of XOFF testing
  138. IGNCTL:    DB    YES        ;yes=do not send control characters
  139.                 ;above CTL-M to CRT in terminal mode
  140.                 ;no=send any incoming CTL-char to CRT
  141. EXTRA1:    DB    0        ;for future expansion
  142. EXTRA2:    DB    0        ;for future expansion
  143. BRKCHR:    DB    '@'-40H        ;^@ = Send a 300 ms. break tone
  144. NOCONN:    DB    'N'-40H        ;^N = Disconnect from phone line
  145. LOGCHR:    DB    'L'-40H        ;^L = Send logon
  146. LSTCHR:    DB    'P'-40H        ;^P = Toggle printer
  147. UNSVCH:    DB    'R'-40H        ;^R = Close input text buffer
  148. TRNCHR:    DB    'T'-40H        ;^T = Transmit file to remote
  149. SAVCHR:    DB    'Y'-40H        ;^Y = Open input text buffer
  150. EXTCHR:    DB    '^'-40H        ;^^ = Send next character
  151. ;
  152. ; Equates used only by PMMI routines grouped together here.
  153. ;
  154. PRATE:    DB    250        ;125=20pps dialing, 250=10pps
  155.     DB    0        ;not used
  156. ;
  157. ; Low-level modem I/O routines: this will be replaced with
  158. ; a jump table in MEX 2.0 (you can insert jumps here to longer
  159. ; routines if you'd like ... I'd recommend NOT putting part of
  160. ; a routine in this area, then jumping to the rest of the routine
  161. ; in the non-fixed area; that will complicate the 2.0 conversion)
  162. ;
  163. INCTL1:    JMP    INSTAT        ;in modem control portè    DB    0,0,0,0,0,0,0    ;spares if needed for non-PMMI
  164. ;
  165. OTDATA:    JMP    OUTDAT        ;out modem data port
  166.     DB    0,0,0,0,0,0,0    ;spares if needed for non=PMMI
  167. ;
  168. INPORT:    JMP    INDAT        ;in modem data port
  169.     DB    0,0,0,0,0,0,0    ;spares if needed for non-PMMI
  170. ;
  171. ; Bit-test routines.  These will be merged with the above
  172. ; routines in MEX 2.0 to provide a more reasonable format
  173. ;
  174. MASKR:    ANI MDRCVB ! RET    ;bit to test for receive ready
  175. TESTR:    CPI MDRCVR ! RET    ;value of receive bit when ready
  176. MASKS:    ANI MDSNDB ! RET    ;bit to test for send ready
  177. TESTS:    CPI MDSNDR ! RET    ;value of send bit when ready
  178. ;
  179. ;
  180. ; Unused area: was once used for special PMMI functions,
  181. ; Now used only to retain compatibility with MDM overlays.
  182. ; You may use this area for any miscellaneous storage you'd
  183. ; like but the length of the area *must* be 12 bytes.
  184. ;
  185.     DS    12
  186. ;
  187. ; Special modem function jump table: if your overlay cannot handle
  188. ; some of these, change the jump to "DS 3", so the code present in
  189. ; MEX will be retained.  Thus, if your modem can't dial, change the
  190. ; JMP PDIAL at DIALV to DS 3, and MEX will print a "not-implemented"
  191. ; diagnostic for any commands that require dialing.
  192. ;
  193. ;
  194. LOGON:    DS    2        ;needed for MDM compat, not ref'd by MEX
  195. DIALV:    DS    3        ;dial digit in A (see info at PDIAL)
  196. DISCV:    JMP    PDISC        ;disconnect the modem
  197. GOODBV:    JMP    DUMMY        ;called before exit to CP/M
  198. INMODV:    JMP    NITMOD        ;initialization. Called at cold-start
  199. NEWBDV:    JMP    PBAUD        ;set baud rate
  200. NOPARV:    DS    3        ;set modem for no-parity
  201. PARITV:    DS    3        ;set modem parity
  202. SETUPV:    JMP    SETCMD        ;SET cmd: jump to a RET if you don't write SET
  203. SPMENV:    DS    3        ;not used with MEX
  204. VERSNV:    JMP    SYSVER        ;Overlay's voice in the sign-on message
  205. BREAKV:    JMP    PBREAK        ;send a break
  206. ;
  207. ; The following jump vector provides the overlay with access to special
  208. ; routines in the main program (retained and supported in the main pro-
  209. ; gram for MDM overlay compatibility). These should not be modified by
  210. ; the overlay.
  211. ;
  212. ; Note that for MEX 2.0 compatibility, you should not try to use these
  213. ; routines, since this table will go away with MEX 2.0 (use the MEX
  214. ; service call processor instead).
  215. ;
  216. ILPRTV:    DS    3        ;replace with MEX function 9
  217. INBUFV:    DS    3        ;replace with MEX function 10èILCMPV:    DS    3        ;replace with table lookup funct. 247
  218. INMDMV:    DS    3        ;replace with MEX function 255
  219. NXSCRV:    DS    3        ;not supported by MEX (returns w/no action)
  220. TIMERV:    DS    3        ;replace with MEX function 254
  221. ;
  222. ;
  223. ; Clear/screen and clear/end-of-screen. Each routine must use the
  224. ; full 9 bytes alloted (may be padded with nulls).
  225. ;
  226. ; These routines (and other screen routines that MEX 2.0 will sup-
  227. ; port) will be accessed through a jump table in 2.0, and will be
  228. ; located in an area that won't tie the screen functions to the
  229. ; modem overlay (as the MDM format does).
  230. ;
  231. CLREOS:    LXI    D,EOSMSG
  232.     MVI    C,PRINT
  233.     CALL    MEX
  234.     RET
  235. ;
  236. ;
  237. CLS:    LXI    D,CLSMSG        ;null unless patched
  238.     MVI    C,PRINT
  239.     JMP    MEX
  240. ;
  241. ;------------------------------------------------------------
  242. ;
  243. ;    *** END OF FIXED FORMAT AREA ***
  244. ;
  245. ;------------------------------------------------------------
  246. ;
  247. ; If the dip switches are set externally to NNNN baud then you get
  248. ; NNNN or NNNN/4 baud with the SET command.  The switches should
  249. ; normally be set to 1200 baud.
  250. ;
  251. NITMOD:    XRA    A        ;insure that the 8251 is in the command mode
  252.     OUT    MODCTL
  253.     OUT    MODCTL
  254.     OUT    MODCTL
  255.     LDA    MSPEED        ;get the baud rate code
  256.     JMP    PBAUD        ;  and go set it
  257. ;
  258. ; Sends a 300 msec break tone.
  259. ;
  260. PBREAK:    MVI    A,CMND        ;default command byte
  261.     ORI    BRKBIT        ;turn on the break bit
  262.     OUT    MODCTL
  263.     PUSH    B
  264.     MVI    B,3        ;wait for 300 ms
  265.     MVI    C,TIMER
  266.     CALL    MEX
  267.     POP    B
  268.     MVI    A,CMND        ;restore the command byte
  269.     OUT    MODCTL
  270.     RET
  271. ;è; Drops DTR for 300 msec to disconnect the modem.
  272. ;
  273. PDISC:    MVI    A,CMND
  274.     ANI    0FFH AND NOT DTRBIT    ;mask out the DTR bit
  275.     OUT    MODCTL
  276.     PUSH    B
  277.     MVI    B,3        ;wait for 300 ms
  278.     MVI    C,TIMER
  279.     CALL    MEX
  280.     POP    B
  281.     MVI    A,CMND        ;restore command byte
  282.     OUT    MODCTL
  283.     RET
  284. ;
  285. ; exit routine
  286. ;
  287. DUMMY:    RET
  288. ;
  289. ;
  290. ;------------------------------------------------------------
  291. ;
  292. ; Set baud-rate code in A (if supported by your modem overlay).  PMMI
  293. ; supports only five rates, which are validated here. NOTE: this routine
  294. ; (ie, the one vectored through NEWBDV) should update MSPEED with the
  295. ; passed code, but ONLY if that rate is supported by the hardware.
  296. ;
  297. PBAUD:    PUSH    H        ;don't alter anybody
  298.     PUSH    D
  299.     PUSH    B
  300.     MOV    E,A        ;code to DE
  301.     MVI    D,0
  302.     LXI    H,BAUDTB    ;offset into table
  303.     DAD    D
  304.     MOV    A,M        ;fetch code
  305.     ORA    A        ;0? (means unsupported code)
  306.     STC            ;return error for STBAUD caller
  307.     JZ    PBEXIT        ;exit if so
  308.     LDA    MODCTB        ;last 8251 mode byte
  309.     ANI    0FFH AND NOT BAUDMSK    ;clear out baud bits
  310.     ORA    M        ;put new baud bits in
  311.     CALL    STMODE        ;send it to the mode register
  312.     MOV    A,E        ;get speed code back
  313.     STA    MSPEED        ;make it current
  314. PBEXIT:    POP    B        ;all done
  315.     POP    D
  316.     POP    H
  317.     RET
  318. ;
  319. ; table of baud rate bits for supported rates
  320. ;
  321. BAUDTB:    DB    0,3,0,0,0    ;110,300,450,600,710
  322.     DB    2,0,0,0,0    ;1200,2400,4800,9600,19200
  323. ;
  324. ; send the byte in reg A to the 8251 mode register
  325. ;èSTMODE:    STA    MODCTB        ;save it so we know what it was
  326.     MVI    A,MODRST    ;reset the 8251
  327.     OUT    MODCTL
  328.     LDA    MODCTB        ;send the baud rate, etc
  329.     OUT    MODCTL        ;  as the mode byte
  330.     MVI    A,CMND        ;rx enable, tx enable, etc
  331.     OUT    MODCTL        ;  as a command byte
  332.     RET
  333. ;
  334. ; Sign-on message
  335. ;
  336. SYSVER:    LXI    D,SOMESG
  337.     MVI    C,PRINT
  338.     JMP    MEX
  339. ;
  340. SOMESG:    DB    CR,LF,ESC,')'        ;into half intensity
  341.     DB    '    Overlay Version  '
  342.     DB    REV/10+'0'
  343.     DB    '.'
  344.     DB    REV MOD 10+'0'
  345.     DB    '      ',CR,LF
  346.     DB    '     Configured for the       ',CR,LF
  347.     DB    '        NEC  PC-8801          ',CR,LF
  348.     DB    '       by Bob Schultz         ',CR,LF
  349.     DB    '                              ',CR,LF
  350.     DB    '                              '
  351.     DB    ESC,'(',CR,LF        ;out of half intensity
  352.     DB    LF,'$'
  353.     RET
  354. ;
  355. ; Newline on console
  356. ;
  357. CRLF:    MVI    A,CR
  358.     CALL    TYPE
  359.     MVI    A,LF        ;fall into TYPE
  360. ;
  361. ; type char in A on console
  362. ;
  363. TYPE:    PUSH    H        ;save 'em
  364.     PUSH    D
  365.     PUSH    B
  366.     MOV    E,A        ;align output character
  367.     MVI    C,CONOUT    ;print via MEX
  368.     CALL    MEX
  369.     POP    B
  370.     POP    D
  371.     POP    H
  372.     RET
  373. ;
  374. ; strings to clear-to-end-of-screen, and clear-screen
  375. ;
  376. EOSMSG:    DB    CR,LF,'$'        ;clear to end of screen
  377. CLSMSG:    DB    CLRSCR,'$'        ;clear whole screen
  378. ;
  379. ; Data areaè;
  380. MODCTB:    DB    BIT8 OR PARN1 OR STP1    ;modem control byte
  381. ;                       default  8N1
  382. ;
  383. ;------------------------------------------------------------
  384. ;
  385. ;
  386. ;
  387. ; Control is passed here after MEX parses a SET command.
  388. ;
  389. SETCMD:    MVI    C,SBLANK    ;any arguments?
  390.     CALL    MEX
  391.     JC    SETSHO        ;if not, go print out values
  392.     LXI    D,CMDTBL    ;parse command
  393.     CALL    TSRCH        ;from table
  394.     PUSH    H        ;any address on stack
  395.     RNC            ;if we have one, execute it
  396.     POP    H        ;nope, fix stack
  397. SETERR:    LXI    D,SETEMS    ;print error
  398.     MVI    C,PRINT
  399.     JMP    MEX
  400. ;
  401. SETEMS:    DB    CR,LF,'SET command error',CR,LF
  402.     DB    'Type ',ESC,')SET ?',ESC,'( for help',CR,LF,LF,'$'
  403. ;
  404. ; SET command table ... note that tables are constructed of command-
  405. ; name (terminated by high bit=1) followed by word-data-value returned
  406. ; in HL by MEX service processor LOOKUP.  Table must be terminated by
  407. ; a binary zero.
  408. ;
  409. ; Note that LOOKUP attempts to find the next item in the input stream
  410. ; in the table passed to it in HL ... if found, the table data item is
  411. ; returned in HL; if not found, LOOKUP returns carry set.
  412. ;
  413. CMDTBL:    DB    '?'+80H            ;"set ?"
  414.     DW    STHELP
  415.     DB    'BAU','D'+80H        ;"set baud"
  416.     DW    STBAUD
  417.     DB    'BIT','S'+80H        ;"set bits"
  418.     DW    STBITS
  419.     DB    'PA','R'+80H        ;"set par"
  420.     DW    STPAR
  421.     DB    'STO','P'+80H        ;"set stop"
  422.     DW    STSTOP
  423.     DB    'H'+80H            ;"set h"
  424.     DW    STH
  425.     DB    'L'+80H            ;"set l"
  426.     DW    STL
  427.     DB    'PEE','K'+80H
  428.     DW    STPEEK
  429.     DB    'BEL','L'+80H
  430.     DW    STBELL
  431. ;
  432.     DB    0        ;<<=== table terminator
  433. ;è; SET <no-args>: print current statistics
  434. ;
  435. SETSHO:    LXI    H,SHOTBL    ;get table of SHOW subroutines
  436. SETSLP:    MOV    E,M        ;get table address
  437.     INX    H
  438.     MOV    D,M
  439.     INX    H
  440.     MOV    A,D        ;end of table?
  441.     ORA    E
  442.     RZ            ;exit if so
  443.     PUSH    H        ;save table pointer
  444.     XCHG            ;adrs to HL
  445.     CALL    GOHL        ;do it
  446.     CALL    CRLF        ;print newline
  447.     MVI    C,CHEKCC    ;check for console abort
  448.     CALL    MEX
  449.     POP    H        ;it's done
  450.     JNZ    SETSLP        ;continue if no abort
  451.     RET
  452. ;
  453. GOHL:    PCHL
  454. ;
  455. ; table of SHOW subroutines
  456. ;
  457. SHOTBL:    DW    CLS
  458.     DW    CRLF
  459.     DW    BDSHOW
  460.     DW    BTSHOW
  461.     DW    0        ;<<== table terminator
  462. ;
  463. ; SET ?  processor
  464. ;
  465. STHELP:    LXI    D,HLPMSG
  466.     MVI    C,PRINT
  467.     JMP    MEX
  468. ;
  469. ; The help message
  470. ;
  471. HLPMSG:    DB    CLRSCR,'SET command, NEC PC-8801 version',CR,LF,LF
  472.     DB    ESC,')SET BAUD',ESC,'(  <',ESC,')300',ESC,'(>  <'
  473.     DB    ESC,')1200',ESC,'(>',CR,LF,LF
  474.  
  475.     DB    ESC,')SET BITS',ESC,'(  <',ESC,')5',ESC,'(> <',ESC,')6'
  476.     DB    ESC,'(> <',ESC,')7',ESC,'(> <',ESC,')8',ESC,'(>',CR,LF,LF
  477.  
  478.     DB    ESC,')SET PAR',ESC,'(   <',ESC,')E',ESC,'(>  <',ESC,')O'
  479.     DB    ESC,'(>  <',ESC,')N',ESC,'(>',CR,LF,LF
  480.  
  481.     DB    ESC,')SET STOP',ESC,'(  <',ESC,')1',ESC,'(>  <',ESC,')1.5'
  482.     DB    ESC,'(>  <',ESC,')2',ESC,'(>',CR,LF,LF
  483.  
  484.     DB    '$'
  485. ;
  486. ; SET BAUD processor
  487. ;èSTBAUD:    MVI    C,BDPARS    ;function code
  488.     CALL    MEX        ;let MEX look up code
  489.     JC    SETERR        ;invalid code
  490. STBD:    CALL    PBAUD        ;no, try to set it
  491.     JC    SETERR        ;not-supported code
  492.     CALL    CRLF
  493.     CALL    BDSHOW
  494.     JMP    CRLF
  495. ;
  496. BDSHOW:    CALL ILPRT
  497.     DB    ESC,')',0
  498.     LDA    MSPEED
  499.     MVI    C,PRBAUD    ;use MEX routine
  500.     CALL    MEX
  501.     CALL    ILPRT
  502.     DB    BS,BS,BS,BS,ESC,'( Baud',CR,LF,0
  503.     RET
  504. ;
  505. ; SET H        1200 baud for lazy typists
  506. ;
  507. STH:    MVI    A,5
  508.     JMP    STBD
  509. ;
  510. ; SET L        300 baud for lazy typists
  511. ;
  512. STL:    MVI    A,1
  513.     JMP    STBD
  514. ;
  515. ; SET BITS    character length
  516. ;
  517. STBITS:    LXI    D,BITTBL    ;point to table
  518.     CALL    TSRCH        ;  and search for command
  519.     JC    SETERR
  520.     LDA    MODCTB        ;get the last 8251 mode byte
  521.     ANI    0FFH AND NOT BITMSK    ;zero the character length
  522.     ORA    L            ;  and put in the new value
  523.     CALL    STMODE        ;send to the 8251 mode register
  524.     CALL    CRLF
  525.     CALL    BTSHOW
  526.     JMP    CRLF
  527. ;
  528. ; BITS table
  529. ;
  530. BITTBL:    DB    '8'+80H
  531.     DW    BIT8
  532.     DB    '7'+80H
  533.     DW    BIT7
  534.     DB    '6'+80H
  535.     DW    BIT6
  536.     DB    '5'+80H
  537.     DW    BIT5
  538. ;
  539.     DB    0        ;<== table terminator
  540. ;
  541. ; display the character length, parity and number of stop bitsè;
  542. BTSHOW:    CALL    ILPRT        ;into inverse video
  543.     DB    ESC,')',0
  544.     LDA    MODCTB        ;8251 mode register image
  545.     ANI    BITMSK        ;keep only the character length
  546.     RAR
  547.     RAR            ;shift bits down to bit 0
  548.     ADI    '5'        ;0 is 5 bits, 1 is 6...
  549.     CALL    TYPE
  550.     CALL    ILPRT
  551.     DB    ESC,'( Bits  ',ESC,')',0
  552.     LDA    MODCTB
  553.     ANI    PARMSK        ;get the parity bits
  554.     LXI    D,EVNMSG
  555.     MVI    C,PRINT
  556.     CPI    PARE
  557.     CZ    MEX        ;for EVEN parity
  558.     LXI    D,ODDMSG
  559.     CPI    PARO
  560.     CZ    MEX        ;for ODD parity
  561.     LXI    D,NOMSG
  562.     CPI    PARN1
  563.     CZ    MEX        ;for NO parity-first code
  564.     CPI    PARN2
  565.     CZ    MEX        ;for NO parity-second code
  566.     CALL    ILPRT
  567.     DB    ESC,'( Parity  ',ESC,')',0
  568.     LDA    MODCTB
  569.     ANI    STPMSK        ;get the stop bits
  570.     PUSH    PSW
  571.     LXI    D,S1MSG
  572.     MVI    C,PRINT
  573.     CPI    STP1
  574.     CZ    MEX        ;for 1 stop bit
  575.     LXI    D,S15MSG
  576.     CPI    STP15
  577.     CZ    MEX        ;for 1.5 stop bits
  578.     LXI    D,S2MSG
  579.     CPI    STP2
  580.     CZ    MEX        ;for 2 stop bits
  581.     CALL    ILPRT
  582.     DB    ESC,'( Stop bit',0
  583.     POP    PSW
  584.     CPI    STP1
  585.     MVI    A,'s'
  586.     CNZ    TYPE        ;if 1 don't put out 's'
  587.     JMP    CRLF
  588. ;
  589. EVNMSG:    DB    'EVEN$'
  590. ODDMSG:    DB    'ODD$'
  591. NOMSG:    DB    'NO$'
  592. ;
  593. S1MSG:    DB    '1$'
  594. S2MSG:    DB    '2$'
  595. S15MSG:    DB    '1.5$'è;
  596. ; SET PAR    set the parity
  597. ;
  598. STPAR:    LXI    D,PARTBL    ;point to the table of commands
  599.     CALL    TSRCH        ;  and search it
  600.     JC    SETERR
  601.     LDA    MODCTB
  602.     ANI    0FFH AND NOT PARMSK    ;zero the parity bits
  603.     ORA    L            ;  and put in the new parity
  604.     CALL    STMODE        ;send it to the 8251 mode register
  605.     CALL    CRLF
  606.     CALL    BTSHOW
  607.     JMP    CRLF
  608. ;
  609. ; table for PAR
  610. ;
  611. PARTBL:    DB    'E'+80H
  612.     DW    PARE
  613.     DB    'O'+80H
  614.     DW    PARO
  615.     DB    'N'+80H
  616.     DW    PARN1
  617. ;
  618.     DB    0        ;<== table terminator
  619. ;
  620. ; SET STOP    set the stop bits
  621. ;
  622. STSTOP:    LXI    D,STPTBL    ;point to the command table
  623.     CALL    TSRCH        ;  and search it
  624.     JC    SETERR
  625.     LDA    MODCTB
  626.     ANI    0FFH AND NOT STPMSK    ;zero the stop bits
  627.     ORA    L            ;  and put in the new ones
  628.     CALL    STMODE        ;send to the 8251 mode register
  629.     CALL    CRLF
  630.     CALL    BTSHOW
  631.     JMP    CRLF
  632. ;
  633. ; table for STOP
  634. ;
  635. STPTBL:    DB    '1'+80H
  636.     DW    STP1
  637.     DB    '1.','5'+80H
  638.     DW    STP15
  639.     DB    '2'+80H
  640.     DW    STP2
  641. ;
  642.     DB    0        ;<== table terminator
  643. ;
  644. ; SET PEEK    display memory location in hex and ascii
  645. ;
  646. STPEEK:    CALL    CRLF
  647.     MVI    C,EVALA
  648.     CALL    MEX        ;get numeric
  649.     PUSH    Hè    MVI    B,16        ;will do 16 bytes
  650. PKLP1:    MOV    A,M        ;get byte
  651.     MOV    C,A
  652.     RAR            ;swap nibbles
  653.     RAR
  654.     RAR
  655.     RAR
  656.     CALL    HEX1        ;put out first nibble
  657.     MOV    A,C
  658.     CALL    HEX1        ;put out second nibble
  659.     MVI    A,' '
  660.     CALL    TYPE
  661.     INX    H
  662.     DCR    B
  663.     JNZ    PKLP1        ;keep doing it
  664.     CALL    CRLF
  665.     POP    H        ;point to starting byte again
  666.     MVI    B,16
  667. PKLP2:    MVI    A,' '
  668.     CALL    TYPE
  669.     MOV    A,M
  670.     CPI    20H
  671.     JC    NOTASC        ;must be control
  672.     CPI    7FH
  673.     JNC    NOTASC        ;del and above
  674.     CALL    TYPE        ;put out printable
  675.     JMP    ASC
  676. NOTASC:    MVI    A,'.'        ;put out a '.' for non-printable
  677.     CALL    TYPE
  678. ASC:    MVI    A,' '
  679.     CALL    TYPE
  680.     INX    H
  681.     DCR    B
  682.     JNZ    PKLP2        ;keep doing it
  683.     CALL    CRLF
  684.     JMP    CRLF
  685. ;
  686. HEX1:    ANI    0FH        ;zero top nibble
  687.     ADI    90H        ;thanks to
  688.     DAA            ;  Kelly Smith
  689.     ACI    40H        ;    for this strange
  690.     DAA            ;      looking code
  691.     CALL    TYPE
  692.     RET
  693. ;
  694. ; It's easy to get carried away adding new commands for SET
  695. ;
  696. STBELL:    CALL    ILPRT
  697.     DB    7,CR,LF,ESC,')Ding!!  Dong!!',ESC,'(',CR,LF,LF,7,0
  698. ;
  699. ; Compare next input-stream item in table @DE; CY=1
  700. ; if not found, else HL=matched data item
  701. ;
  702. TSRCH:    MVI    C,LOOKUP    ;get function code
  703.     JMP    MEX        ;pass to MEX processorè;
  704. ; Print in-line message ... blows away C register
  705. ;
  706. ILPRT:    MVI    C,ILP        ;get function code
  707.     JMP    MEX        ;go do it
  708. ;
  709. ; end of SET command
  710. ;
  711. ;---------------------------------------------------------------
  712. ;
  713. ; These routines are down here to make it easy to hang things
  714. ; on them.  For example you might add code to check for framing
  715. ; errors and then throw the charater away or zero it or...
  716. ;
  717. ; Modem status in
  718. ;
  719. INSTAT:    IN    MODCTL
  720.     RET
  721. ;
  722. ; Modem data in
  723. ;
  724. INDAT:    IN    MODDAT
  725.     RET
  726. ;
  727. ; Modem data out
  728. ;
  729. OUTDAT:    OUT    MODDAT
  730.     RET
  731. ;
  732. ;---------------------------------------------------------------
  733. ;
  734. ; End of NEC PC8801 MEX modem overlay
  735. ;
  736. ;------------------------------------------------------------
  737. ;
  738.     END
  739.  
  740.