home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / cpm / mex / mxo-rs32.asm < prev    next >
Assembly Source File  |  1994-07-13  |  28KB  |  924 lines

  1. ;    Title    'MEX overlay - TRS-80 MOD IV vers 3.2'    
  2. ;                      Montezuma Micro CP/M 2.2
  3. ;
  4. ;******************************************************************************
  5. ;    R E V I S I O N       H I S T O R Y
  6. ;******************************************************************************
  7. ;
  8. ; VERSION 3.2 09/15/86 - Bug Fixed.  When exiting MEX to CP/M, interrupts
  9. ;             were not shut off properly and would cause the machine to go
  10. ;             into never-never land. 
  11. ;                Fred LaForest
  12. ;
  13. ; VERSION 3.1 08/21/86 - Bug fixed.  If the input buffer was filled before it 
  14. ;             could be emptied, the count of characters went past
  15. ;             the configured maximum number of spaces in the buffer.
  16. ;                Fred LaForest
  17. ;
  18. ; VERSION 3.0 08/18/86 - Major revision level change.  I removed the auto
  19. ;             answer code, it is modem dependent and belongs in a 
  20. ;             modem overlay.  All smart modem code is gone.  The SET
  21. ;             command code has been tightened up.  
  22. ;             At higher speeds, the Mod 4 loses characters during
  23. ;             screen scrolling.  Configurable code has been added to
  24. ;             use interrupts to process UART input.  This eliminates
  25. ;             almost all character dropouts during screen processing.
  26. ;                Fred LaForest
  27. ;                3235 Edgeworth
  28. ;                Ferndale, MI 48220
  29. ;                GENIE: FALAFOREST
  30. ;
  31. ;******************************************************************************
  32. ;
  33. ; VERSION 2.1 08/06/86 - Correct modem control to properly handle changes
  34. ;             in word length, parity, and stop bits.  Changes
  35. ;             to these parameters by the SET command were never
  36. ;             communicated to the UART.
  37. ;                Fred LaForest
  38. ;
  39. ; VERSION 2.0 10/06/85 - Change to the printer status routine.  Now
  40. ;             checks all four possible printer states.
  41. ;             Ver.114 changed ^C address from AUTO ANSWER.
  42. ;             Added code at STANS to find the correct 
  43. ;             address.
  44. ;                            Ed Richter 
  45. ;                        71455,1133
  46. ; VERSION 1.9 09/12/85 - Minor change to eliminate some un-necessay
  47. ;             code when using the AUTO ANSWER mode. See
  48. ;             NOMXOSM.
  49. ;                        Ed Richter
  50. ; VERSION 1.8 05/05/85 - Included the changes from the file 
  51. ;             MXO-RS17.FIX. The baud rate detect now works.
  52. ;                        Ed Richter
  53. ; VERSION 1.7 01/25/85 - ^C in "auto-answer now aborts to CPM, not
  54. ;             MEX.(sorry bout that one) Added code to
  55. ;             determine baud rate in "auto-answer".
  56. ;             Changed "NITMOD" to default  to the baud 
  57. ;             rate selected by "MSPEED"     
  58. ;                        Ed Richter
  59. ; VERSION 1.6 01/21/85 - A system reset seems a little drastic
  60. ;                        so added code for a ^C abort to auto
  61. ;              answer. Also added "number of rings" 
  62. ;             equate.
  63. ;                         Ed Richter
  64. ; VERSION 1.5 11/17/84 - Added SET ANSWER ON command
  65. ;             (For Hayes-compatible modems
  66. ;              only...see NOTE below.)
  67. ;                        Thom Foulks
  68. ; VERSION 1.3 10/10/84 - Fixed bug in the Printer ready test
  69. ;                                                 Ed Richter
  70. ; VERSION 1.2 09/18/84 - Added the comments to 1.1 and changed the
  71. ;             configuration of the SET message that is
  72. ;             output to the console
  73. ;                           Ed Richter 
  74. ; VERSION 1.1 09/16/84 - Added code to fully control the SIO USART
  75. ;                 via the SET command. This overlay now 
  76. ;             supports-- SET BAUD -- SET PARITY --
  77. ;             SET STOP BITS -- SET WORD LENGTH --
  78. ;                                                   Ed Richter
  79. ;
  80. ; MEX TRS-80 MOD IV OVERLAY VERSION 1.0: Written 09/10/84 by Ed Richter 
  81. ; This file was derived from the MDM7xx overlay M7R4-5.ASM, and the 
  82. ; file MXOPM10.ASM. It is a MEX overlay for use with the TRS-80 MOD
  83. ; IV, and an external modem. It has a SET command that supports 300
  84. ; though 9600 baud.
  85. ;
  86. ;******************************************************************************
  87.  
  88. REV:    EQU    32        ;MEX Overlay revision number
  89. ;
  90. CR:    EQU    0DH        ;carriage return
  91. LF:    EQU    0AH        ;linefeed
  92. ONV:    EQU    0FH        ;reverse video on
  93. INV:    EQU    0EH        ;reverse video off
  94. TPA:    EQU    0100H        ;start of program
  95. TAB:    EQU    09H    
  96. YES:    EQU    0FFH        ;true
  97. NO:    EQU    0        ;not true
  98.  
  99. ;******************************************************************************
  100. ;
  101. ;    UART equates and port equates
  102. ;
  103. ;******************************************************************************
  104. ;
  105. ;    ***********  Important NOTICE  ***********
  106. ;
  107. ;    The following equate, MMINTR, is set to YES if you want input
  108. ;    characters from the UART to be captured by the TRS-80 Mod 4 interrupt
  109. ;    circuitry.  This virtually eliminates all lost characters during 
  110. ;    screen scrolling.  This means you can tell any RCPM or BBS that you 
  111. ;    don't need ANY nulls (0).  
  112. ;
  113. ;    A BIG assumption is that you are a MOD 4 using Montezuma Micro CP/M
  114. ;    implementation.  The initialization code searchs through the BIOS for
  115. ;    the TWO places which disable interrupts and really don't need this type
  116. ;    of protection.  They are th keyboard handler and the video screen memory
  117. ;    handler.  They only switch out RAM between F800h and FFFFh.  This does
  118. ;    NOT overlap any user program in TPA.  
  119. ;
  120. ;    The technique used to find the two BIOS locations can be modified for
  121. ;    other machines or CP/M implementations.
  122. ;
  123. ;    NOTE!!!;  If you DO NOT want to use interrupt processing, set MMINTR to
  124. ;    NO.  This will revert this overlay to the older port polling method
  125. ;    which is used in older overlays for the Mod 4.
  126. ;
  127. ;
  128. MMINTR        EQU    YES    ;Set YES if you are using Montezuma Micro CP/M
  129. ;                ;AND you wish to use interrupt input processing
  130. ;                ;Set NO if you DO NOT want interrupt processing
  131. ;                ;and want the older port polling method
  132. ;
  133. ;    TRS 80 Communications port information
  134. ;
  135. PORT:        EQU    0E8H    ;master reset port   
  136. MODCT1:        EQU    PORT+2    ;modem control port
  137. MODDAT:        EQU    PORT+3    ;modem data in port
  138. MODCT2:        EQU    PORT+2    ;not used mod iv
  139. BAUDRP:        EQU    PORT+1    ;baud rate port
  140. MDRCVB:        EQU    080H    ;bit to test for receive
  141. MDRCVR:        EQU    080H    ;value when ready
  142. MDSNDB:        EQU    040H    ;bit to test for send
  143. MDSNDR:        EQU    040H    ;value when ready
  144.  
  145. ;
  146. ;    UART Control Bit Configuration
  147. ;
  148. U$WORD:        EQU    060h    ;Word length mask 
  149. U$WRD5:        EQU    000H    ;Word length of 5 bits
  150. U$WRD6:        EQU    040H    ;Word length of 6 bits
  151. U$WRD7:        EQU    020H    ;Word length of 7 bits
  152. U$WRD8:        EQU    060H    ;Word length of 8 bits
  153. U$PART:        EQU    088H    ;Parity control mask
  154. U$PREV:        EQU    080H    ;Parity EVEN
  155. U$PROD:        EQU    000H    ;Parity ODD
  156. U$PROF:        EQU    008H    ;Parity OFF
  157. U$PRON:        EQU    000h    ;Parity ON
  158. U$STOP:        EQU    010H    ;Stop bits mask
  159. U$STP1:        EQU    000H    ;Stop bits 1
  160. U$STP2:        EQU    010H    ;Stop bits 2
  161. U$XMIT:        EQU    004H    ;Set to enable transmit
  162. U$RTS:        EQU    002H    ;Set for RTS
  163. U$RTSO:        EQU    000H    ;Clear to turn on RTS
  164. U$DTR:        EQU    001H    ;Set for DTR off
  165. U$DTRO:        EQU    000H    ;Clear to turn on DTR
  166. ;
  167. ;    Default UART configurations and bit masks
  168. ;
  169. DEFCTB:        EQU    U$PROF+U$WRD8+U$STP1+U$DTRO+U$XMIT+U$RTSO
  170. DFBAUD:        EQU    6    ;0=110 1=300 2=450 3=600 4=710 5=1200    
  171.                 ;6=2400 7=4800 8=9600 9=19200 default
  172. CTSMSK:        EQU    020H        ;carrier detect mask
  173. ISOCD:        EQU    0DFH        ;port ready mask
  174. PRPORT:        EQU    0F8H        ;printer port
  175. PRSTAT:        EQU    0F0H        ;printer ready mask
  176. BRKMSK:        EQU    0FFH-U$XMIT    ;send break
  177. DTRMSK:        EQU    0FFH-U$DTR-U$RTS ;drop dtr
  178.  
  179. ;******************************************************************************
  180. ;
  181. ;    MEX SERVICE PROCESSOR STUFF
  182. ;
  183. ;******************************************************************************
  184. MEX:        EQU    0D00H    ;address of the service processor
  185. INMDM:        EQU    255    ;get char from port,CY=no more in 100ms
  186. TIMER:        EQU    254    ;delay 100 ms * reg b
  187. TMDINP:        EQU    253    ;b=# secs to wait for char,CY=no char
  188. CHEKCC:        EQU    252    ;check for ^C from kbd, Z=present
  189. SNDRDY:        EQU    251    ;test for modem-send ready
  190. RCVRDY:        EQU    250    ;test for modem-receive ready
  191. SNDCHR:        EQU    249    ;send to modem (after SNDRDY)
  192. RCVCHR:        EQU    248    ;recv a char from modem after (RCVRDY)
  193. LOOKUP:        EQU    247    ;table search: see CMDTBL for info 
  194. PARSFN:        EQU    246    ;parse filename from input stream 
  195. BDPARS:        EQU    245    ;parse baud-rate from input stream
  196. SBLANK:        EQU    244    ;scan input stream to next non-blank
  197. EVALA:        EQU    243    ;evaluate numeric from input stream
  198. LKAHED:        EQU    242    ;get nxt char w/o removing from input
  199. GNC:        EQU    241    ;get char from input, CY=1 if none
  200. ILP:        EQU    240    ;inline print
  201. DECOUT:        EQU    239    ;decimal output
  202. PRBAUD:        EQU    238    ;print baud rate
  203. CONOUT:        EQU    2    ;simulated BDOS funct 2:CONSOLE OUT
  204. PRINT:        EQU    9    ;simulated BDOS funct 9: PRINT STRING
  205. INBUF:        EQU    10    ;input buffer, same as BDOS FUNCT 10
  206.  
  207. ;******************************************************************************
  208. ;
  209. ;    Place the printer test routine address here
  210. ;
  211. ;******************************************************************************
  212.  
  213.         ORG    0D11H    ;install printer ready test
  214.         DW    PRTSTS
  215.  
  216. ;******************************************************************************
  217. ;    Low address MEX flags and configuration constants go here
  218. ;
  219. ;******************************************************************************
  220.  
  221.         ORG    TPA
  222. ;
  223.         DS    3    ;(for  "JMP   START" instruction)
  224. PMODEM:        DS    1    ;Not used by MEX            103H
  225. SMODEM:        DS    1    ;Not used by MEX
  226. TPULSE:        DS    1    ;Not used by MEX             105H
  227. CLOCK:        DB    40    ;clock speed in MHz x10, 25.5 MHz max.    106H
  228.                 ;20=2 MHh, 37=3.68 MHz, 40=4 MHz, etc.
  229. MSPEED:        DB    DFBAUD    ;0=110 1=300 2=450 3=600 4=710 5=1200    107H
  230.                 ;6=2400 7=4800 8=9600 9=19200 default
  231. BYTDLY:        DB    0    ;0=0 delay  1=10ms  5=50 ms - 9=90 ms    108H
  232.                 ;default time to send character in ter-
  233.                 ;minal mode file transfer for slow BBS.
  234. CRDLY:        DB    0    ;0=0 delay 1=100 ms 5=500 ms - 9=900 ms 109H
  235.                 ;default time for extra wait after CRLF
  236.                 ;in terminal mode file transfer
  237. COLUMS:        DB    4    ;number of DIR columns shown        10AH
  238. SETFL:        DB    YES    ;yes=user-added Setup routine        10BH
  239. SCRTST:        DB    YES    ;Cursor control routine         10CH
  240.         DS    1    ;reserved (old ACKNAK flag)        10DH
  241. BAKFLG:        DB    YES     ;yes=change any file same name to .BAK    10EH
  242. CRCDFL:        DB    YES    ;yes=default to CRC checking        10FH
  243. TOGCRC:        DB    YES    ;yes=allow toggling of CRC to Checksum    110H
  244. CVTBS:        DB    NO    ;yes=convert backspace to rub        111H
  245. TOGLBK:        DB    YES    ;yes=allow toggling of bksp to rub    112H
  246. ADDLF:        DB    NO    ;no=no LF after CR to send file in    113H
  247.                 ;terminal mode (added by remote echo)
  248. TOGLF:        DB    YES    ;yes=allow toggling of LF after CR    114H
  249. TRNLOG:        DB    NO    ;yes=allow transmission of logon    115H
  250.                 ;write logon sequence at location LOGON
  251. SAVCCP:        DB    YES    ;yes=do not overwrite CCP        116H
  252. LOCNXT:        DB    NO    ;yes=local command if EXTCHR precedes    117H
  253.                 ;no=external command if EXTCHR precedes
  254. TOGLOC:        DB    YES    ;yes=allow toggling of LOCONEXTCHR    118H
  255. LSTTST:        DB    YES    ;yes=allow toggling of printer on/off    119H
  256. XOFTST:        DB    YES    ;yes=checks for XOFF from remote while    11AH
  257.                 ;sending a file in terminal mode
  258. XONWT:        DB    YES    ;yes=wait for XON after CR while    11BH
  259.                 ;sending a file in terminal mode
  260. TOGXOF:        DB    YES    ;yes=allow toggling of XOFF checking    11CH
  261. IGNCTL:        DB    YES    ;yes=CTL-chars above ^M not displayed    11DH
  262. EXTRA1:        DB    0    ;for future expansion            11EH
  263. EXTRA2:        DB    0    ;for future expansion            11FH
  264. BRKCHR:        DB    'K'-40H    ;^K = Send 300 ms. break tone        120H
  265. NOCONN:        DB    'N'-40H    ;^N = Disconnect from the phone line    121H
  266. LOGCHR:        DB    'L'-40H    ;^L = Send logon            122H
  267. LSTCHR:        DB    'P'-40H    ;^P = Toggle printer            123H
  268. UNSVCH:        DB    'R'-40H    ;^R = Close input text buffer        124H
  269. TRANCHR:    DB    'T'-40H ;^T = Transmit file to remote        125H
  270. SAVECHR:    DB    'Y'-40H    ;^Y = Open input text buffer        126H
  271. EXTCHR:        DB    '^'-40h    ;^^ = Send next character        127H
  272.         DS    2
  273. INCTL1:        JMP     STATSND    ;go to "get status"             12AH
  274.         DS    7
  275. OTDATA:        OUT    MODDAT  ! RET    ;out modem data port        134H
  276.         DS    7
  277.         IF    NOT MMINTR    ;If not interupt driven
  278. INPORT:        IN    MODDAT  ! RET    ;in modem data port
  279.         ENDIF
  280.         IF    MMINTR        ;If interrupts are used
  281. INPORT:        JMP    INT$GET        ;Get a char from buffer
  282.         ENDIF        
  283.         DS    7
  284. MASKR:        ANI    MDRCVB    ! RET    ;bit to test for receive ready    148H
  285. TESTR:        CPI    MDRCVR    ! RET    ;value of rcv. bit when ready    14BH
  286. MASKS:        ANI    MDSNDB    ! RET    ;bit to test for send ready    14EH
  287. TESTS:        CPI    MDSNDR    ! RET    ;value of send bit when ready    151H
  288.         DS    12        ;unused by MEX
  289. LOGON:        DS    2        ;for user message        160H
  290. DIALV:        DS    3        ;autodial rtn jump        162H
  291. DISCV:        JMP    DISCON        ;disconnect rtn            165H
  292.  
  293.         IF    NOT MMINTR
  294. GOODBV:        DS    3        ;not needed            168H
  295.         ENDIF
  296.         IF    MMINTR        ;Interrupt processing
  297. GOODBV:        JMP    INT$BYE        ;Restore system vectors        168H
  298.         ENDIF
  299.  
  300. INMODV:        JMP    NITMOD        ;go to user written routine    16BH
  301. NEWBDV:        JMP    PBAUD        ;set new baud-rate           16EH
  302. NOPARV:        DS    3        ;(by-pass PMMI routine)        171H
  303. PARITV:        DS    3        ;(by-pass PMMI routine)        174H
  304. SETUPV:        JMP    SETCMD        ;initialize USART and modem    177H
  305. SPMENV:        DS    3        ;not used with MEX        17AH
  306. VERSNV:        JMP    SYSVER        ;print header msg        17DH
  307. BREAKV:        JMP    PBREAK        ;send header            180H
  308. ; Do not change the following six lines.
  309. ILPRTV:        DS    3        ;                183H
  310. INBUFV:        DS    3        ;                186H
  311. ILCMPV:        DS    3        ;                189H
  312. INMDMV:        DS    3        ;                18CH
  313. NXSCRV:        DS    3        ;                18FH
  314. TIMERV:        DS    3        ;                192H
  315.  
  316. ;******************************************************************************
  317. ;
  318. ; Routine to clear to end of screen.  If using CLREOS and CLRSCRN, set
  319. ; SCRNTEST to YES at 010AH (above).
  320. ;
  321. ;******************************************************************************
  322.  
  323. CLREOS:        LXI    D,EOSMSG    ;clear to end of screen         195H
  324.         CALL    MPRINT        ;                198H
  325.         RET            ;                19DH
  326. ;
  327. CLS:        LXI    D,CLSMSG    ;clear sreen            19EH
  328.         CALL    MPRINT        ;                1A1H
  329.         RET            ;                1A6H
  330.     
  331. ;
  332. SYSVER:        LXI    D,SOMESG    ;print the sys version msg    1A7H
  333.         CALL    MPRINT        
  334. ;
  335. ;    Print out a message telling of carrier status
  336. ;
  337. CARRSH        LXI    D,NOMESG    ;no carrier present msg
  338.         CALL    CARRCK
  339.         CNZ    MPRINT        ;print if no carrier
  340.         LXI    D,CARMSG    ;carrier present
  341.         CALL    MPRINT        ;say so and continue
  342.         RET
  343.  
  344. ;******************************************************************************
  345. ;
  346. ;    UART controling and accessing routines
  347. ;
  348. ;******************************************************************************
  349. ;
  350. ;    This area resets the SIO-UART DTR reinitializes all control parameters
  351. ;
  352. NITMOD:          MVI    A,1
  353.           OUT    PORT        ;reset the USART to
  354.           LDA    CURURT        ;Get the current UART parameters
  355.           OUT    MODCT1
  356.         LDA    MSPEED        ;Get startup baud rate
  357.         CALL    PBAUD        ;Set up baud rate generator
  358.         IF    MMINTR        ;Are we interrupt processing?
  359.         CALL    INT$SET        ;Yes, Set up needed vectors
  360.         ENDIF
  361.         RET
  362.  
  363. ;
  364. ;    Send a break tone to reset some time-share computers.
  365. ;
  366. PBREAK:        LDA    CURURT        ;Get modem control bits
  367.         ANI    BRKMSK        ;send break
  368.         OUT    MODCT1
  369.           MVI    B,3        
  370.           MVI    C,TIMER
  371.           CALL    MEX        ;delay 300 msec
  372.         LDA    CURURT        ;Get current bits
  373.           OUT    MODCT1
  374.          RET
  375.  
  376. ;
  377. ;    Routine to return status of the modem port
  378. ;
  379. STATSND:    IN    MODCT1        ;in modem contol port
  380.         PUSH     B        ;just in case
  381.         ANI    ISOCD        ;isolate status and clear CD bit
  382.         IF    MMINTR
  383.         ANI    0FFH-MDRCVB    ;Clear any receive status
  384.         ENDIF
  385.         MOV    B,A        ;save status
  386.         IF    MMINTR
  387.         CALL    INT$TST        ;Test for input
  388.         ORA    B        ;Include other bits
  389.         MOV    B,A        ;Save in B
  390.         ENDIF
  391.         IN     PORT        ;get CD bit
  392.         ANI    CTSMSK        ;isolate CD bit
  393.         ORA    B        ;merge CD with status
  394.         POP    B        ;restore B
  395.         RET
  396.  
  397. ;
  398. ;    Determine the carrier detect status  0=CARRIER
  399. ;
  400. CARRCK:        IN    PORT        ;get carrier bit
  401.         ANI    CTSMSK
  402.         RET
  403.  
  404. ;
  405. ;    This routine will hang up the phone by dropping DTR.
  406. ;
  407. DISCON:          LDA    CURURT        ;Get current modem bits
  408.         ANI    BRKMSK
  409.         ORI    U$DTR+U$RTS    ;Shut off DTR
  410.               OUT    MODCT1        ;send cmd
  411.           MVI    B,5        
  412.           MVI    C,TIMER
  413.           CALL    MEX        ;delay 500 msec
  414.         LDA    CURURT        ;Get current bits
  415.           OUT    MODCT1
  416.           RET
  417.  
  418. ;******************************************************************************
  419. ;    
  420. ;    Baud rate set routine 
  421. ;
  422. ;    A = MEX baud rate code
  423. ;
  424. ;******************************************************************************
  425. PBAUD:          PUSH    H        ;save everybody
  426.           PUSH    B
  427.           PUSH    D
  428.         MOV    E,A        ;get speed
  429.         MVI    D,0        ;zero the other half of reg pair
  430.         LXI    H,BAUDTB    ;get baud rate table address
  431.         DAD    D        ;add speed offset
  432.         MOV    A,M        ;get baud rate  
  433.         ORA    A        ;0=not valid baud rate
  434.         JZ    PBEXIT        ;not valid baud rate then exit
  435.         OUT    BAUDRP        ;good baud rate then set it
  436.         MOV    A,E        ;get speed 
  437.         STA    MSPEED        ;set speed
  438.         JMP    PBEXIT1        ;return 
  439. PBEXIT:        STC
  440. PBEXIT1:    POP    B        ;no carrier or incorrect baud rate
  441.           POP    D
  442.           POP       H
  443.           RET
  444. ;
  445. BAUDTB:        DB    0,055H,0,0,0         ;110,300,450,610,710
  446.         DB    077H,0AAH,0CCH,0EEH,0FFH ;1200,2400,4800,9600,19200
  447.  
  448. ;******************************************************************************
  449. ;
  450. ;    Test for printer ready
  451. ;
  452. ;******************************************************************************
  453. PRTSTS:          IN    PRPORT        ;get printer status
  454.           ANI    PRSTAT        ;isolate it
  455.           XRI    030H        ;invert it
  456.         JZ    PRTSTS1        ;return if not ready A=00
  457.           MVI    A,01H        ;get "A" ready to zero  
  458. PRTSTS1:    DCR    A        ;A = 0 not ready
  459.         RET            ;A = FF ready
  460.  
  461. ;******************************************************************************
  462. ;
  463. ;    Sets the communications parameters via the SET command
  464. ;
  465. ;******************************************************************************
  466. SETCMD:        MVI    C,SBLANK    ;any arguments
  467.         CALL    MEX
  468.         JC    SETSHO        ;if not print out values
  469. ;
  470. ;    First determine the parameter they wish to change
  471. ;
  472.         LXI    D,CMDTBL    ;parse commands
  473.         CALL    TSRCH        ;from table
  474.         JC    SETERR        ;Word was not found
  475.         MOV    A,H        ;Get MS table address byte
  476.         ORA    A        ;Test for zero
  477.         JZ    SETTBL        ;Go Get next parameter
  478.         PCHL            ;Jump to special routine
  479. ;
  480. ;    All table look up errors come here
  481. ;
  482. SETERR:          LXI    D,SETEMS    ;no then print error
  483.           CALL    MPRINT
  484.           RET
  485.  
  486. SETEMS:          DB    CR,LF,'SET command error',CR,LF,LF,'$'
  487.  
  488. ;
  489. ;    This routine will field parameter changes for WORD, PARITY and STOP BITS
  490. ;
  491. SETTBL:        LXI    D,STTABL    ;Get address of table
  492.         DAD    D        ;HL -> next parameter input table
  493.         XCHG            ;DE -> the table now
  494.         CALL    TSRCH        ;from table
  495.         JC    SETERR        ;Word was not found
  496.         LDA    CURURT        ;Get current UART parameters
  497.         ANA    L        ;Mask out bit under review
  498.         ORA    H        ;Set new bits
  499.         STA    CURURT        ;Store new parameters
  500.         OUT    MODCT1        ;Tell UART of the changes
  501.         RET            ;Return to MEX
  502.  
  503. ;
  504. ;    Set the baud rate from the set command
  505. ;
  506. STBAUD:        LXI    D,STBDTB    ;Get the legal choices table
  507.         CALL    TSRCH        ;Search the table
  508.         JC    SETERR        ;When in doubt, do without
  509.         MOV    A,L        ;Get the MEX speed code
  510.         STA    MSPEED        ;Inform MEX of speed change
  511.         MOV    A,H        ;Get UART code
  512.         OUT    BAUDRP        ;Tell the UART baud rate generator
  513.         RET            ;Return to MEX
  514.  
  515. ;
  516. ;    Print out a helpful description of the SET command
  517. ;
  518. STHELP:        LXI    D,SOMESG    ;Get Overlay version message
  519.         CALL    MPRINT        ;Print the version
  520.         LXI    D,HLPMSG    ;Get address of SET command
  521.         CALL    MPRINT
  522.         RET            ;Return to MEX
  523.  
  524. ;
  525. ;    Show the settings of the current parameters
  526. ;
  527. SETSHO:        CALL    CLS        ;clear screen
  528.         CALL    SYSVER        ;Print version and carrier status
  529.  
  530.         LXI    D,BAUDMSG    ;Print baud rate message
  531.         CALL    MPRINT        ;Print it
  532.         LDA    MSPEED        ;get MSPEED to determine present
  533.         MVI    C,PRBAUD    ;baud rate
  534.         CALL    MEX
  535.  
  536.         LXI    D,STOPMSG    ;Insert Stop bits message
  537.         CALL    MPRINT
  538.         LDA    CURURT        ;Get UART settings
  539.         ANI    U$STP2        ;How many bits
  540.         MVI    A,'1'        ;Assume 1 bit
  541.         JZ    STSHS1        ;Jump if so
  542.         MVI    A,'2'        ;Must be 2
  543. STSHS1:        CALL    TYPE        ;Tell operator
  544.  
  545.         LXI    D,WLMSG        ;Start word length message
  546.         CALL    MPRINT
  547.         LDA    CURURT        ;Get UART settings
  548.         ANI    U$WORD        ;Isolate byte length
  549.         MVI    C,'5'        ;5 bits?
  550.         JZ    STSHLG        ;Yes
  551.         MVI    C,'6'
  552.         CPI    U$WRD6        ;6 bits?
  553.         JZ    STSHLG
  554.         MVI    C,'7'        ;7 bits?
  555.         CPI    U$WRD7
  556.         JZ    STSHLG
  557.         MVI    C,'8'        ;Must be 8 bits then
  558. STSHLG:        MOV    A,C        ;Put char into A
  559.         CALL    TYPE        ;Output to the screen
  560.  
  561.         LXI    D,PARMSG    ;Start parity message
  562.         CALL    MPRINT
  563.         LDA    CURURT        ;Get UART settings
  564.         ANI    U$PART        ;Isolate parity info
  565.         LXI    D,POFMSG    ;Assume off
  566.         CPI    U$PROF        ;Off?
  567.         JZ    STSHPT        ;Yes
  568.         LXI    D,EVEMSG    ;Even parity?
  569.         CPI    U$PREV
  570.         JZ    STSHPT        ;Yes
  571.         LXI    D,ODDMSG    ;Must be ODD
  572. STSHPT:        CALL    MPRINT
  573.  
  574.         RET    
  575.  
  576. ;******************************************************************************
  577. ;
  578. ;    MEX service routine front ends
  579. ;
  580. ;******************************************************************************
  581.  
  582. TSRCH:        MVI    C,LOOKUP    ;Table lookup routine
  583.           JMP    MEX
  584. ;
  585. MPRINT:        MVI    C,PRINT        ;MEX print function
  586.         JMP    MEX
  587. ;
  588. CRLF:        MVI    A,CR        ;newline on console
  589.         CALL    TYPE
  590.         MVI    A,LF
  591. TYPE:        PUSH    H        ;save em
  592.         PUSH    D
  593.         PUSH    B
  594.         MOV    E,A
  595.         MVI    C,CONOUT    ;align output char
  596.         CALL    MEX        ;print via mex
  597.         POP    B        ;restore em
  598.         POP    D
  599.         POP    H
  600.         RET        
  601.  
  602.  
  603.         IF    MMINTR        ;Gen if interrupts wanted
  604.  
  605. ;******************************************************************************
  606. ;
  607. ;    I N T E R R U P T    P R O C E S S I N G
  608. ;
  609. ;******************************************************************************
  610. ;
  611. ;    Search the BIOS for the interrupt disable in the video handler
  612. ;    and the keyboard handler.  Replace the DI with NOP and note their
  613. ;    addresses.  Replace the 38H vector with a jump to our interrupt
  614. ;    handling routine.
  615. ;
  616. INT$SET:    LHLD    0001H        ;Get start address of BIOS
  617.         LXI    B,0B00H        ;Max search size of BIOS
  618.         LXI    D,INT$NOP    ;Table to save BIOS addresses
  619.  
  620. IS$LP1:        MVI    A,0F3H        ;Code for 'DI'
  621.         DB    0EDH,0B1H    ;CPIR, look for DI
  622.         JNZ    IS$SDN        ;Search is done
  623.  
  624. IS$TST:        PUSH    H        ;Save regs
  625.         PUSH    D
  626.         PUSH    B
  627.         LXI    D,I$STR        ;Get remainder of code string
  628.         MVI    B,4        ;Compare next four bytes
  629. IS$LP2:        LDAX    D        ;Get byte from string
  630.         INX    D        ;Bump ptr
  631.         CMP    M        ;Compare to BIOS bytes
  632.         INX    H
  633.         JNZ    IS$LE2        ;Not the same
  634.         DB    10H,(IS$LP2-$-1) AND 0FFH ;DJNZ IS$LP2
  635. IS$LE2:        POP    B        ;Restore regs
  636.         POP    D
  637.         POP    H
  638.         JNZ    IS$LP1        ;Jump if not found
  639.  
  640.         DCX    H        ;We found a DI!
  641.         XRA    A
  642.         MOV    M,A        ;Put NOP where DI was
  643.         XCHG
  644.         MOV    M,E        ;Put DI address into table
  645.         INX    H
  646.         MOV    M,D
  647.         INX    H
  648.         XCHG
  649.         INX    H        ;Restore HL
  650.         JMP    IS$LP1        ;Look for more 'DI's
  651.          
  652. IS$SDN:        XRA    A        ;Clear A
  653.         STAX    D        ;Clear the last entr
  654.         INX    D
  655.         STAX    D
  656.         LHLD    INT$NOP        ;Test for any 'DI's found
  657.         MOV    A,H
  658.         ORA    L
  659.         JZ    IS$NONE        ;No DI strings found, error!
  660. ;
  661. ;    Set up all vectors
  662. ;
  663.         LDA    0038H        ;Get old vector contents
  664.         LHLD    0039H
  665.         STA    INT$VCT        ;Save it for later
  666.         SHLD    INT$VCT+1
  667.         MVI    A,0C3H        ;Form a JMP instruction
  668.         LXI    H,INT$RTN    ; to the interrupt service routine
  669.         STA    0038H        ;Store new vector
  670.         SHLD    0039H
  671.  
  672.         LXI    H,INT$BUF    ;HL -> start of buffer
  673.         SHLD    INT$INP        ;Set up pointers
  674.         SHLD    INT$OUTP    ;into the buffer
  675.         XRA    A        ;Clear A regs
  676.         STA    INT$CNT        ;Count of chars in buffer
  677. ;
  678. ;    Set up interrupt hardware and GO
  679. ;
  680.         MVI    A,020H        ;Interrupt on UART data input ready
  681.         OUT    0E0H        ;Set up interrupt mask
  682.         RET            ;Return to the caller
  683.  
  684. IS$NONE:    LXI    D,I$NODI    ;Print error message
  685.         CALL    MPRINT
  686.         JMP    0000H        ;Return to CP/M
  687.  
  688. ;
  689. ;    I N T $ B Y E    ---   Restore all vectors and return
  690. ;
  691. INT$BYE:    DI            ;Disable interrupts
  692.         LXI    H,INT$NOP    ;Point to DI address table
  693. IB$LP1:        MOV    E,M        ;Load an address
  694.         INX    H
  695.         MOV    D,M
  696.         INX    H
  697.         MOV    A,D        ;Test for end of table
  698.         ORA    E
  699.         JZ    IB$VCT        ;Exit when DI's replaced
  700.         LDA    INT$BYE        ;Get a DI
  701.         STAX    D        ;Store it
  702.         JMP    IB$LP1        ;Loop for the next one
  703.     
  704. IB$VCT:        LDA    INT$VCT        ;Get old 38H vector data
  705.         LHLD    INT$VCT+1
  706.         STA    0038H        ;Restore data
  707.         SHLD    0039H
  708.  
  709.         XRA    A        ;Clear A reg
  710.         OUT    0E0H        ;Disallow all interrupts
  711.         RET            ;Return to caller
  712.  
  713. ;
  714. ;    I N T $ R T N    ----  Interrupt service routine
  715. ;
  716. INT$RTN:    PUSH    PSW        ;Save flags
  717.         IN    MODCT1        ;Get UART flags
  718.         ANI    MDRCVR        ;Isolate data ready bit
  719.         CPI    MDRCVB        ;Anythin' ther?
  720.         JNZ    IR$RET        ;No, return
  721.  
  722.         IN    MODDAT        ;Get the data byte
  723.         PUSH    H        ;Save another reg
  724.         LHLD    INT$INP        ;Get our ptr
  725.         MOV    M,A        ;Save the data byte
  726.         CALL    INT$BMP        ;Bump the ptr    
  727.         SHLD    INT$INP        ;Save ptr
  728.  
  729.         LDA    INT$CNT        ;Increment count
  730.         INR    A        ;Add one to the count
  731.         CPI    INTSIZ+1    ;Max saved chars?
  732.         JC    IR$SVCT        ;No, Save new count
  733.         LHLD    INT$OUTP    ;Get the output pointer
  734.         CALL    INT$BMP        ;Bump it ahead of the input ptr
  735.         SHLD    INT$OUTP
  736.         MVI    A,INTSIZ    ;Reload max size 
  737. IR$SVCT:    STA    INT$CNT        ;Save updated count
  738.         POP    H        ;Restore H
  739.  
  740. IR$RET:        IN    0E0H        ;Read int status reg
  741.         POP    PSW
  742.         EI            ;Reenable interrupts
  743.         DB    0EDH,04DH    ;RETI
  744.  
  745. ;
  746. ;    I N T $ T S T    ---    Test buffer for pending data
  747. ;
  748. INT$TST:    DI            ;Disable interrupts
  749.         LDA    INT$CNT        ;Get the count
  750.         ORA    A        ;Test for zero
  751.         EI            ;Enable interrupts
  752.         RZ            ;Return if no data
  753.         MVI    A,MDRCVR    ;Get data ready bit
  754.         RET            ;Return
  755.  
  756. ;
  757. ;    I N T $ G E T     ---    Get a data byte from the buffer
  758. ;
  759. INT$GET:    DI            ;Disable interrupts
  760.         LDA    INT$CNT        ;Get byte count
  761.         ORA    A        ;Test for anything
  762.         JZ    IG$RET        ;Nothing, return
  763.         DCR    A        ;Subtract one
  764.         STA    INT$CNT        ;Update count
  765.         PUSH    H        ;Save HL reg
  766.         PUSH    B        ;And BC
  767.         LHLD    INT$OUTP    ;Get buffer ptr
  768.         MOV    B,M        ;Load a byte from the buffer
  769.         CALL    INT$BMP        ;Bump the pointer
  770.         SHLD    INT$OUTP    ;Save updated ptr
  771.         MOV    A,B        ;Get data byte again
  772.         POP    B        ;Restore regs
  773.         POP    H
  774.  
  775. IG$RET:        EI            ;Enable interupts
  776.         RET            ;Return to caller             
  777.  
  778. ;
  779. ;    Routine to bump the buffer pointer and reset it to the buffer 
  780. ;    start if we overrun the end
  781. ;
  782. INT$BMP:    INX    H        ;Bump ptr
  783.         MOV    A,L        ;Get LS byte
  784.         CPI    (INT$BUF+INTSIZ) AND 0FFH ;Buffer end?
  785.         RNZ            ;No, return with the ptr as is
  786.         LXI    H,INT$BUF    ;Get buffer stat addr
  787.         RET            ;Return the reset ptr
  788.  
  789. ;
  790. ;    Interrupt Routine Data, Pointer, and Buffer area
  791. ;
  792. I$NODI:        DB    'Non standard BIOS -- Cannot continue',CR,LF,'$'  
  793.  
  794. I$STR:        DB    03EH,08EH,0D3H,084H ;MVI A,8EH   OUT 84H
  795.  
  796. INT$VCT:    DS    3        ;Old 38H vector data
  797. INT$NOP:    DS    2*5        ;Up to 5 DI's
  798.  
  799. INTSIZ:        EQU    200        ;Buffer up to 200 characters
  800. INT$CNT:    DB    0        ;Count of bytes in buffer
  801. INT$INP:    DW    INT$BUF        ;Interrput service rtn ptr
  802. INT$OUTP:    DW    INT$BUF        ;MEX buffer ptr
  803. INT$BUF:    DS    INTSIZ        ;Pending data buffer
  804.  
  805.         ENDIF
  806.  
  807.  
  808.  
  809. ;******************************************************************************
  810. ;
  811. ;    Message and data area
  812. ;
  813. ;******************************************************************************
  814.  
  815. CURURT:    DB    DEFCTB        ;Current UART configuration bits
  816.  
  817. BAUDMSG:DB    CR,LF,'Baud Rate:    $'
  818. STOPMSG:DB    CR,LF,'Stop bits:    $'
  819. WLMSG:    DB    CR,LF,'Word length:    $'
  820. PARMSG:    DB    CR,LF,'Parity:        $'
  821.  
  822. POFMSG:    DB    'off$',CR,LF
  823. ODDMSG:    DB    'on and odd$',CR,LF
  824. EVEMSG:    DB    'on and even$',CR,LF
  825.  
  826. CLSMSG:    DB    CR,LF,1AH,'$'
  827. EOSMSG:    DB    CR,LF,19H,'$'
  828.  
  829. SOMESG:    DB    'TRS Mod 4 CP/M 2.2 overlay V'
  830.     DB    REV/10+'0'
  831.     DB    '.'
  832.     DB    REV MOD 10+'0'
  833.     IF    MMINTR
  834.     DB    ' (Interrupt Driven)'
  835.     ENDIF
  836.     DB    CR,LF,'$'
  837.  
  838. NOMESG:    DB    ONV,'no $'
  839. CARMSG:    DB    ONV,'carrier present',INV,CR,LF,'$'
  840.  
  841. ;***************************************************************************
  842. ;
  843. ;    MEX legal command tables
  844. ;
  845. ;***************************************************************************
  846.  
  847. CMDTBL:    DB    '?'+80H        ;"set ?"
  848.     DW    STHELP
  849.     DB    'BAU','D'+80H    ;"set baud ?'
  850.     DW    STBAUD
  851.     DB    'WOR','D'+80H    ;set word length
  852.     DW    STWORD-STTABL
  853.     DB    'PARIT','Y'+80H ;set parity
  854.     DW    STPAR-STTABL
  855.     DB    'STO','P'+80H    ;set stop bits
  856.     DW    STSTOP-STTABL
  857.     DB    0    
  858.  
  859. ;
  860. ;    UART data format parameters
  861. ;
  862. STTABL:                ;Start of UART control parameters
  863.  
  864. STSTOP:    DB    '1'+80h        ;Legal stop bits settings
  865.     DB    0FFH-U$STOP,U$STP1
  866.     DB    '2'+80h        ;2 bits
  867.     DB    0FFH-U$STOP,U$STP2
  868.     DB    0
  869.  
  870. STPAR:    DB    'OD','D'+80h    ;Odd parity and ON
  871.     DB    0FFH-U$PART,U$PROD+U$PRON
  872.     DB    'EVE','N'+80h    ;Even parity and ON
  873.     DB    0FFH-U$PART,U$PREV+U$PRON
  874.     DB    'OF','F'+80h    ;Parity OFF
  875.     DB    0FFH-U$PART,U$PROF
  876.     DB    0
  877.  
  878. STWORD:    DB    '5'+80h        ;5 Bits per byte
  879.     DB    0FFH-U$WORD,U$WRD5
  880.     DB    '6'+80h        ;6 Bits per byte
  881.     DB    0FFH-U$WORD,U$WRD6
  882.     DB    '7'+80h        ;7 Bits per byte
  883.     DB    0FFH-U$WORD,U$WRD7
  884.     DB    '8'+80h        ;8 Bits per byte
  885.     DB    0FFH-U$WORD,U$WRD8
  886.     DB    0
  887.  
  888. ;
  889. ;    Legal baud settings table
  890. ;
  891. STBDTB:    DB    '30','0'+80H    ;300 Baud
  892.     DB    1,055H        ;MEX speed,UART baud speed
  893.     DB    '120','0'+80H    ;1200 Baud
  894.     DB    5,077H
  895.     DB    '240','0'+80H    ;2400 Baud
  896.     DB    6,0AAH
  897.     DB    '480','0'+80H    ;4800 Baud
  898.     DB    7,0CCH
  899.     DB    '960','0'+80H    ;9600 Baud
  900.     DB    8,0EEH
  901.     DB    '1920','0'+80H    ;19200 Baud
  902.     DB    9,0FFH
  903.     DB    0
  904.  
  905. ;
  906. ;    Help menu for SET command
  907. ;
  908. HLPMSG:    DB    CR,LF,'SET BAUD 300 <or> 1200 <or> 2400 <or> 4800 <or> 9600'
  909.     DB    CR,LF,'SET PARITY OFF <or> ODD <or> EVEN'
  910.     DB    CR,LF,'SET WORD 5 <or> 6 <or> 7 <or> 8'
  911.     DB    CR,LF,'SET STOP 1 <or> 2'
  912.     DB    CR,LF,'$'        
  913. ;
  914. ;-----------------------------------------------------------------------------
  915. ; NOTE:  MUST TERMINATE PRIOR TO 0B00H (with Smartmodem or Anchor)
  916. ;-----------------------------------------------------------------------------
  917. ; End of TRS-80 MOD IV  MEX modem overlay
  918. ;
  919. ;******************************************************************************
  920.  
  921.      END    ;
  922. S-80 MOD IV  MEX modem overlay