home *** CD-ROM | disk | FTP | other *** search
- ; MXO-R213.ASM -- TRS-80 Model II overlay file for Mex. 1/11/87
- ;
- ; You will want to look this file over carefully. There are a number of
- ; options that you can use to configure the program to suit your taste.
- ; This file adapts the TRS-80 Model II (and probably Models 12 and 16)
- ; computers to MEX. Requires Pickles & Trout CP/M.
- ;
- ;
- ; Use the "SET" command to change the baudrate when desired. It starts
- ; out at 1200 baud when the program is first called up.
- ;
- ;
- ; = = = = = = = = = = = = = = = = = =
- ; 01/11/87 - Added Parity,Stopbit,Length SET - Biff Bueffel
- ; 01/26/86 - Added Mex Set command - Biff Bueffel
- ; 06/07/85 - Corrected 9600 baud error {p&t pg. 16.8} - Bob Perigo
- ; 04/20/85 - Baud change with P&T 2.2m system functions - Bob Perigo
- ; 11/11/83 - Renamed to M7R2-1.ASM, no changes - Irv Hoff
- ; 09/18/83 - Modified M712XE.ASM for
- ; TRS-80 Model II and Pickles
- ; & Trout CP/M (should also
- ; work on Mods 12 and 16) - Joseph Katz
- ;
- ; = = = = = = = = = = = = = = = = = =
- ;
- BELL: EQU 07H ;bell
- CR: EQU 0DH ;carriage return
- ESC: EQU 1BH ;escape
- LF: EQU 0AH ;linefeed
- TAB: EQU 09H ;HORIZONTAL TAB
- ;
- YES: EQU 0FFH
- NO: EQU 0
- ;
- ; MEX service processor stuff
- ;
- MEX EQU 0D00H ;address of the service processor
- INMDM EQU 255 ;get char from port to A, CY=no more in 100 ms
- TIMER EQU 254 ;delay 100ms * reg B
- TMDINP EQU 253 ;B=# secs to wait for char, cy=no char
- CHEKCC EQU 252 ;check for ^C from KBD, Z=present
- SNDRDY EQU 251 ;test for modem-send ready
- RCVRDY EQU 250 ;test for modem-receive ready
- SNDCHR EQU 249 ;send a character to the modem (after sndrdy)
- RCVCHR EQU 248 ;recv a char from modem (after rcvrdy)
- LOOKUP EQU 247 ;table search: see CMDTBL comments for info
- PARSFN EQU 246 ;parse filename from input stream
- BDPARS EQU 245 ;parse baud-rate from input stream
- SBLANK EQU 244 ;scan input stream to next non-blank
- EVALA EQU 243 ;evaluate numeric from input stream
- LKAHED EQU 242 ;get nxt char w/o removing from input
- GNC EQU 241 ;get char from input, cy=1 if none
- ILP EQU 240 ;inline print
- DECOUT EQU 239 ;decimal output
- PRBAUD EQU 238 ;print baud rate
- ;
- PRINT EQU 9 ;MEX/BDOS print-string function call
- ;
- ;
- PORT: EQU 0F4H ;TRS-80 II serial output port A
- MODCTL1: EQU PORT+2 ;Modem control port
- MODDATP: EQU PORT ;Modem data port
- MODCTL2: EQU PORT+2 ;Modem status port
- MODRCVB: EQU 01H ;Bit to test for receive
- MODRCVR: EQU 01H ;Value when receive ready
- MODSNDB: EQU 04H ;Bit to test for send
- MODSNDR: EQU 04H ;Value when send ready
- ;
- SDB8 EQU 01100000B ;set data bits to 8
- SDB7 EQU 01000000B ;... and 7
- SDB6 EQU 00100000B ;... and 6
- SDB5 EQU 0 ;... and 5
- RDB EQU 10011111B ;reset data bits
- DATBITM EQU 01100000B ;data bit mask
- ;
- SPOFF EQU 0 ;set parity to off
- SPODD EQU 00000001B ;set parity to odd
- SPEVEN EQU 00000011B ;set parity to even
- RPOFF EQU 11111100B ;reset parity bits (to off)
- PARITYM EQU 00000011B ;parity mask
- ;
- SSB1 EQU 00000100B ;set stop bits to 1
- SSB15 EQU 00001000B ;... and 1.5
- SSB2 EQU 00001100B ;... and 2
- RSB EQU 11110011B ;reset stop bits
- STPBITM EQU 00001100B ;stop bit mask
- ;
- ORG 100H
- ;
- ;
- ; Change the clock speed to suit your system
- ;
- DS 3 ;(for "JMP START" instruction)
- ;
- DB NO ;yes=PMMI S-100 Modem 103H
- DB NO ;yes=HAYES Smartmodem, no=non-PMMI 104H
- TPULSE: DB 'P' ;T=touch, P=pulse (Smartmodem-only) 105H
- CLOCK: DB 40 ;clock speed in MHz x10, 25.5 MHz max. 106H
- ;20=2 MHh, 37=3.68 MHz, 40=4 MHz, etc.
- MSPEED: DB 5 ;0=110 1=300 2=450 3=600 4=710 5=1200 107H
- ;6=2400 7=4800 8=9600 9=19200 default
- BYTDLY: DB 5 ;0=0 delay 1=10ms 5=50 ms - 9=90 ms 108H
- ;default time to send character in ter-
- ;minal mode file transfer for slow BBS.
- CRDLY: DB 5 ;0=0 delay 1=100 ms 5=500 ms - 9=900 ms 109H
- ;default time for extra wait after CRLF
- ;in terminal mode file transfer
- COLUMS: DB 5 ;number of DIR columns shown 10AH
- SETFLG: DB YES ;yes=user-added Setup routine 10BH
- SCRTST: DB NO ;cursor control routine 10CH
- DB YES ;yes=resend a record after any non-ACK 10DH
- ;no=resend a record after a valid NAK
- BAKFLG: DB NO ;yes=change any file same name to .BAK 10EH
- CRCDFL: DB YES ;yes=default to CRC checking 10FH
- TOGCRC: DB YES ;yes=allow toggling of CRC to Checksum 110H
- CVTBS: DB NO ;yes=convert backspace to rub 111H
- TOGLBK: DB YES ;yes=allow toggling of bksp to rub 112H
- ADDLF: DB NO ;no=no LF after CR to send file in 113H
- ;terminal mode (added by remote echo)
- TOGLF: DB YES ;yes=allow toggling of LF after CR 114H
- DB NO ;yes=allow transmission of logon 115H
- ;write logon sequence at location LOGON
- SAVCCP: DB YES ;yes=do not overwrite CCP 116H
- DB NO ;yes=local command if EXTCHR precedes 117H
- ;no=external command if EXTCHR precedes
- DB YES ;yes=allow toggling of LOCONEXTCHR 118H
- LSTTST: DB YES ;yes=printer available on printer port 119H
- XOFTST: DB NO ;yes=check for XOFF from remote while 11AH
- ;sending a file in terminal mode
- XONWT: DB NO ;yes=wait for XON after CR while 11BH
- ;sending a file in terminal mode
- TOGXOF: DB YES ;yes=allow toggling of XOFF checking 11CH
- IGNCTL: DB YES ;yes=CTL-chars above ^M not displayed 11DH
- NDELAY: DB 30 ;for future expansion 11EH
- EXITCHR: DB 'E'-40H ;^E=Exit to Main menu 11FH
- BRKCHR: DB '@'-40H ;^@ = Send a 300 ms. break tone 120H
- NOCONN: DB 'N'-40H ;^N = Disconnect from the phone line 121H
- LOGCHR: DB 'L'-40H ;^L = Send logon 122H
- LSTCHR: DB 'P'-40H ;^P = Toggle printer 123H
- UNSAVE: DB 'R'-40H ;^R = Close input text buffer 124H
- TRNCHR: DB 'T'-40H ;^T = Transmit file to remote 125H
- SAVCHR: DB 'Y'-40H ;^Y = Open input text buffer 126H
- EXTCHR: DB '^'-40H ;^^ = Send next character 127H
- ;
- ;
- DS 2 ;
- IN$MODCTL1: MVI A,10H ;channel 0, reset interrupts
- OUT MODCTL1
- IN MODCTL1 ;get the status bits
- RET
- DS 3
- ;
- OUT$MODDATP: OUT MODDATP ! RET ;out modem data port
- DS 7
- IN$MODDATP: IN MODDATP ! RET ;in modem data port
- DS 7
- ANI$MODRCVB: ANI MODRCVB ! RET ;bit to test for receive ready
- CPI$MODRCVR: CPI MODRCVR ! RET ;value of receive bit when rdy
- ANI$MODSNDB: ANI MODSNDB ! RET ;bit to test for send ready
- CPI$MODSNDR: CPI MODSNDR ! RET ;value of send bit when ready
- DS 6 ;
- OUT$MODCTL1: OUT MODCTL1 ! RET ;out modem control port
- OUT$MODCTL2: OUT MODCTL2 ! RET ;out modem status port
- ;
- ;
- DS 2 ;Not used by MEX. 160H
- DS 6 ; 162H
- GOODBV: JMP GOODBY ; 168H
- INMODV: JMP NITMOD ;go to user written routine 16BH
- NEWBDV: JMP NEWBAUD ;Change baudrate 16EH
- RET ! NOP ! NOP ;(by-passes PMMI routine) 171H
- RET ! NOP ! NOP ;(by-passes PMMI routine) 174H
- SETUPV: JMP SETCMD ; 177H
- DS 3 ;Not used by MEX 17AH
- VERSNV: JMP SYSVER ; 17DH
- BREAKV: JMP SBREAK ; 180H
- ;
- ;
- ; Do not change the following six lines.
- ;
- ILPRTV: DS 3 ; 183H
- INBUFV: DS 3 ; 186H
- ILCMPV: DS 3 ; 189H
- INMDMV DS 3 ; 18CH
- DS 3 ; 18FH
- TIMERV: DS 3 ; 192H
- ;
- ;
- ; Clear sequences -- CLREOS is clear to end of screen, CLRSCRN is clear
- ; entire screen.
- ;
- CLREOS: LXI D,EOSMSG
- MVI C,PRINT
- CALL MEX
- RET
- ;
- CLS: LXI D,CLSMSG
- MVI C,PRINT
- CALL MEX
- RET
- ;
- SYSVER: MVI C,ILP ; 1A7H
- CALL MEX
- DB 'TRS-2 VERSION (FOR P&T & SERIAL PORT A)'
- DB CR,LF,0
- RET
- ;
- ;
- SBREAK: MVI A,5
- OUT MODCTL1
- MVI A,0F8H ;SEND A BREAK TONE
- JMP GOODBY1
- ;
- ;
- ; This routine sends a 300 ms. break tone and sets DTR low for the same
- ; length of time to disconnect some modems such as the Bell 212A, etc.
- ;
- GOODBY: MVI A,5
- OUT MODCTL1 ;SEND TO THE STATUS PORT
- MVI A,78H ;TURN OFF DTR
- ;
- GOODBY1: OUT MODCTL1
- MVI B,3 ;WAIT FOR 300 MS.
- MVI C,TIMER
- CALL MEX
- MVI A,5
- OUT MODCTL1
- MVI A,0E8H ;RESTORE TO NORMAL, 8 BITS, DTR ON, ETC.
- OUT MODCTL1
- RET
- ;
- ;
- ; TRS-80 II initialization -- Uses P&T service calls for baud change
- ;
- NITMOD: MVI B,0 ;PORT CALL
- MVI C,0 ;SETUP A NO PARITY
- MVI D,0E6H ;RTS HI, 1 STOP, 8 BITS, DTR HI
- PTCODE: MVI E,5H ;P&T'S SPEED CODE DEFAULT {1200}
- LXI H,0 ;NO PROTOCOL
- CALL 40H ;DO IT
- RET
- ;
- ;
- ;
- ; Setup routine to allow changing modem speed with the SET command.
- ;
- ;
- ;Set command processor
- ;
- SETCMD: MVI C,SBLANK ;ANY ARGUMENTS?
- CALL MEX
- JC SETSHO ;IF NOT, DISPLAY DEFAULT(S)
- LXI D,CMDTBL
- MVI C,LOOKUP
- CALL MEX ;PARSE THE ARGUMENT
- PUSH H ;SAVE ANY PARSED ARGUMENTS ON STACK
- RNC ;IF WE HAVE ONE, RETURN TO IT
- POP H ;OOPS, INPUT NOT FOUND IN TABLE
- SETERR: CALL MILP
- DB CR,LF,'SET command error',CR,LF,0
- RET
- ;
- ;Argument table
- ;
- CMDTBL: DB '?'+80H ;HELP
- DW SETHELP
- DB 'ORI','G'+80H ;ORIGINATE MODE
- DW ORIG
- DB 'ANSWE','R'+80H ;ANSWER MODE
- DW ANS
- DB 'TON','E'+80H ;TONE DIALING
- DW STTONE
- DB 'PULS','E'+80H ;PULSE DIALING
- DW STPULSE
- DB 'DELA','Y'+80H ;SET DELAY
- DW DELAY
- DB 'BAU','D'+80H ;SET BAUD
- DW STBAUD
- DB 'PARIT','Y'+80H ;SET PARITY
- DW STPRTY
- DB 'STOPBIT','S'+80H ;SET STOPBITS
- DW STSTOP
- DB 'LENGT','H'+80H ;SET LENGTH
- DW STBITS
- DB 0 ;TABLE TERMINATOR
- ; "SET (no args): PRINT CURRENT STATISTICS
- ;
- SETSHO: CALL MILP
- DB CR,LF
- DB 'SET values:',CR,LF,CR,LF,0
- CALL MDSHOW
- CALL CRLF
- CALL TPSHOW
- CALL CRLF
- CALL DLSHOW
- CALL CRLF
- CALL BDSHOW
- CALL CRLF
- CALL SHPRTY
- CALL CRLF
- CALL SHSTOP
- CALL CRLF
- CALL SHBITS
- CALL CRLF
- RET
- ;"SET ?" processor
- ;
- SETHELP: CALL MILP
-
- DB CR,LF,'SET ORIG'
- DB CR,LF,'SET ANSWER'
- DB CR,LF,'SET TONE'
- DB CR,LF,'SET PULSE'
- DB CR,LF,'SET DELAY - <N> seconds'
- DB CR,LF,'SET BAUD - 300, 600, 1200, 2400, '
- DB '4800, 9600'
- DB CR,LF,'SET PARITY - OFF, EVEN or ODD'
- DB CR,LF,'SET STOPBITS - 1, 1.5 or 2'
- DB CR,LF,'SET LENGTH - 5, 6, 7 or 8'
- DB CR,LF,CR,LF,0
- RET
- ;"SET BAUD" processor
- ;
- STBAUD: MVI C,SBLANK ;
- CALL MEX
- JC SETERR ;
- LXI D,BDTBL
- MVI C,LOOKUP
- CALL MEX ;Parse argument
- PUSH H ;Save any parsed argument addrs on stack
- RNC ;If we have one, return to it
- POP H ;Oops, input not found in table
- CALL MILP ;Tell user input not valid
- DB CR,LF,'That baudrate not supported by SET command',CR,LF,0
- RET
- ;
- BDTBL: DB '30','0'+80H
- DW OK300
- DB '60','0'+80H
- DW OK600
- DB '120','0'+80H
- DW OK1200
- DB '240','0'+80H
- DW OK2400
- DB '480','0'+80H
- DW OK4800
- DB '960','0'+80H
- DW OK9600
- DB 0
- ;
- ;
- OK300: MVI A,1
- MVI H,BD300
- JMP LOADBD
- ;
- OK600: MVI A,3
- MVI H,BD600
- JMP LOADBD
- ;
- OK1200: MVI A,5
- MVI H,BD1200
- JMP LOADBD
- ;
- OK2400: MVI A,6
- MVI H,BD2400
- JMP LOADBD
- ;
- OK4800: MVI A,7
- MVI H,BD4800
- JMP LOADBD
- ;
- OK9600: MVI A,8
- MVI H,BD9600
- ;
- LOADBD: STA MSPEED ;CHANGE TIME-TO-SEND TO MATCH BAUDRATE
- MOV A,H ;GET P&T PARAMETER
- STA PTCODE+1 ;PUT IT TO USE
- JMP NITMOD ;REINITIALIZE TO NEW BAUDRATE, THEN DONE
- ;
- NEWBAUD: CPI 1
- JZ OK300
- CPI 3
- JZ OK600
- CPI 5
- JZ OK1200
- CPI 6
- JZ OK2400
- CPI 7
- JZ OK4800
- CPI 8
- JZ OK9600
- RET
- ;
- ; TABLE OF P&T BAUDRATE PARAMETERS
- ;
- BD300: EQU 3H
- BD600: EQU 4H
- BD1200: EQU 5H
- BD2400: EQU 6H
- BD4800: EQU 7H
- BD9600: EQU 8H ;the 9 on pg 16.8 of p&t 2.2m manual is typo.
- ;
- BDSHOW: LDA MSPEED ;GET CURRENT BAUD RATE
- MVI C,PRBAUD ;LET MEX PRINT IT
- CALL MEX
- RET
- ;
- ;
- ;SET MODE PROCESSOR
- ;
- ORIG: XRA A
- STA ANSFLG ;SET ORIG FLAG
- LXI H,SMO ;SEND OUT ATS0=0
- CALL SMSEND
- RET
- ;
- ANS: MVI A,0FFH
- STA ANSFLG ;SET ANS FLAG
- LXI H,SMA ;SEND OUT ATS0=1
- CALL SMSEND
- RET ;EXIT
- ;
- ;Send string to the SmartModem
- ;
- SMSEND: MVI C,SNDRDY ;WAIT FOR MODEM READY
- CALL MEX
- JNZ SMSEND
- MOV A,M ;FETCH NEXT CHARACTER
- INX H
- ORA A ;END?
- RZ ;DONE IF SO
- MOV B,A ;NO, POSITION FOR SENDING
- MVI C,SNDCHR ;NOPE, SEND THE CHARACTER
- CALL MEX
- JMP SMSEND
- ;
- MDSHOW: LDA ANSFLG
- ORA A
- JZ MDORIG
- CALL MILP
- DB 'Auto-answer mode',0
- RET
- MDORIG: CALL MILP
- DB 'Originate mode',0
- RET
- ;
- SMO: DB 'ATS0=0',CR,0
- SMA: DB 'ATS0=1',CR,0
- SMD: DB 'ATS7=60',CR,0
- ;
- ;Set dial processor
- ;
- STTONE: MVI A,'T'
- JMP SDIAL1
- STPULSE: MVI A,'P'
- SDIAL1: STA TPULSE
- RET
- TPSHOW: LDA TPULSE
- CPI 'T'
- JZ TPTONE
- CALL MILP
- DB 'Pulse Dial',0
- RET
- TPTONE: CALL MILP
- DB 'Tone Dial',0
- RET
- ;
- ;Set delay processor
- ;
- DELAY: MVI C,EVALA
- CALL MEX
- MOV A,H
- ORA A
- JNZ SETERR
- MOV A,L
- STA NDELAY
- LXI H,SMD
- CALL SMSEND
- RET
- DLSHOW: CALL MILP
- DB 'Answer Delay is ',0
- LHLD NDELAY
- MVI H,0
- MVI C,DECOUT
- CALL MEX
- CALL MILP
- DB ' seconds',0
- RET
- ;
- ; SET PARITY command: reset transmit/receive parity
- ;
- STPRTY: MVI C,SBLANK ;check for parity code
- CALL MEX ;
- JC SETERR ;if none, print error
- LXI D,PARTBL ;check for proper syntax
- MVI C,LOOKUP
- CALL MEX
- JC SETERR
- LDA NITMOD+3
- ANI RPOFF ;Reset parity bits (also sets parity off)
- PCHL ;go to the proper section
- ;
- PREVEN: ORI SPEVEN
- JMP PARTB1
- PRODD: ORI SPODD
- PARTB1: STA NITMOD+3 ;Also comes to this point if set parity to off
- JMP NITMOD
- ;
- SHPRTY: CALL MILP
- DB 'Parity: ',TAB,' ',0
- LDA NITMOD+3
- ANI PARITYM
- CPI SPOFF ;parity off?
- JNZ SHPRT1
- CALL MILP
- DB 'Off',0
- RET
- SHPRT1: CPI SPODD ;parity odd?
- JNZ SHPRT2
- CALL MILP
- DB 'Odd',0
- RET
- SHPRT2: CALL MILP ;
- DB 'Even',0 ;
- RET
- ;
- ; SET PARITY command table
- ;
- PARTBL: DB 'OF','F'+80H ;"set parity off"
- DW PARTB1
- DB 'EVE','N'+80H ;"set parity even"
- DW PREVEN
- DB 'OD','D'+80H ;"set parity odd"
- DW PRODD
- DB 0 ;<<== end of parity table
- ;
- ;-------
- ; SET STOPBITS command: reset number of stop bits
- ;
-
- STSTOP: MVI C,SBLANK ;check for stop bits
- CALL MEX ;
- JC SETERR ;if none, print error
- LXI D,STPTBL ;check for proper syntax
- MVI C,LOOKUP
- CALL MEX ;
- JC SETERR ;print error
- LDA NITMOD+5
- ANI RSB ;reset stop bits
- PCHL ;go do it
-
- STOP01: ORI SSB1
- JMP STSTP1
- STOP15: ORI SSB15
- JMP STSTP1
- STOP02: ORI SSB2
- STSTP1: STA NITMOD+5
- JMP NITMOD
- ;
- ;
- SHSTOP: CALL MILP ;display stop-bits
- DB 'Stop bits:',TAB,' ',0
- LDA NITMOD+5 ;
- ANI STPBITM
- CPI SSB1
- JNZ SHSTP2
- CALL MILP
- DB '1',0
- RET
- SHSTP2: CPI SSB2
- JNZ SHSTP15
- CALL MILP
- DB '2',0
- RET
- SHSTP15:
- CALL MILP
- DB '1.5',0
- RET
-
- ;
- ; SET STOPBITS command table
- ;
- STPTBL: DB '1'+80H ;"set stop 1"
- DW STOP01
- DB '2'+80H ;"set stop 2"
- DW STOP02
- DB '1.','5'+80H ;1.5 stop bits
- DW STOP15
- DB 0 ;<<== End of stop-bits table
- ;
- ;-------
- ; SET LENGTH command: set bits per character
-
-
- STBITS: MVI C,SBLANK ;check for bits/char
- CALL MEX ;
- JC SETERR ;if none, print error
- LXI D,BITTBL ;check for proper syntax
- MVI C,LOOKUP
- CALL MEX
- JC SETERR
- LDA NITMOD+5
- ANI RDB ;reset data bits (also = 5 bit)
- PCHL ;go do function
-
- BIT6: ORI SDB6 ;6 bits
- JMP STBTS1
- BIT7: ORI SDB7 ;7 bits
- JMP STBTS1
- BIT8: ORI SDB8 ;8 bits
- STBTS1: STA NITMOD+5 ;also comes here if set bits to 5
- JMP NITMOD
-
- SHBITS: CALL MILP ;display bits/char
- DB 'Bits/char:',TAB,' ',0
- LDA NITMOD+5 ;
- ANI DATBITM
- JZ SHDB5
- CPI SDB6
- JZ SHDB6
- CPI SDB7
- JZ SHDB7
- CALL MILP
- DB '8',0
- RET
- SHDB7: CALL MILP
- DB '7',0
- RET
- SHDB6: CALL MILP
- DB '6',0
- RET
- SHDB5: CALL MILP
- DB '5',0
- RET
-
- ;
- ; SET LENGTH command table
-
- BITTBL: DB '5'+80H ;"set bits 5"
- DW STBTS1
- DB '6'+80H ;"set bits 6"
- DW BIT6
- DB '7'+80H ;7 BITS
- DW BIT7
- DB '8'+80h ;8 bits
- DW BIT8
- DB 0 ;<<== end of bpc table
- ;
- ;General utility routines
- ;
- MILP: MVI C,ILP ;IN-LINE PRINT
- JMP MEX
- RET
- ;
- CRLF: CALL MILP ;PRINT CARRIAGE RETURN, LINE FEED
- DB CR,LF,0
- RET
- ;
- ;------
- ;
- ANSFLG: DB 0
- EOSMSG: DB 0FH,14H,16H,1AH,02H,'$'
- CLSMSG: DB 0FH,14H,16H,1AH,0CH,'$'
- BAUDBUF: DB 10,0
- DS 10
- ;
- ;-----------------------------------------------------------------------
- ;
- ;
- ; NOTE: MUST TERMINATE PRIOR TO 0B00H (with Smartmodem)
- ;
- END