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-GB12.ASM
< prev
next >
Wrap
Assembly Source File
|
2000-06-30
|
19KB
|
711 lines
TITLE 'CompuPro overlay for Interfacer 3/4'
;
; MXO-GB10.ASM -- MEX overlay file for the CompuPro I3/I4 & SS1. 05/12/84
;
; This overlay adapts the mex modem program to the CompuPro Interfacer 3 or
; Interfacer 4 or System Support 1 serial cards using the 2651 usart chip.
;
;
; This overlay is capable of setting baud rate and setting port number
; (via the SET command), setting baud rate from the phone library, dis-
; connecting the modem, and sending a break.
;
REV EQU 12 ; version 1.2
;
; Note to Interfacer 4 users:
; The 'middle' serial port and the Centronics port can have their addresses
; changed using a hardware option. Godbout did this to maintain software
; compatibility with their BIOS. In order to prevent problems, use the
; 'right' serial port (relative user 5) instead of the center serial
; port (relative user 6). Also, read page 19 of the manual, the modem
; port will probably have to be set up in the 'master mode'. While
; you're reading the manual, read the section on 'wait state logic'.
; I'm using a CPU-Z running at 6mhz, with a 300 baud modem and two wait
; states (jumper at j7). Without them, I get 'o's for 'n's and 'g's
; for 'f's, and the checksums are never right. (aww 12/20/83)
;
; Calling conventions for the various overlay entry points are detailed more
; fully in the PMMI overlay (MXO-PMxx.ASM, where xx=revision number)
;
; History as a MEX overlay:
;
; 12/04/87 - Added routines to change number of
; stop bits, data bits, and partiy. - Dave Chapman
; 27/03/87 - Added GOODBY routine to drop DTR
; when exiting to CP/M. - Dave Chapman
; 27/12/86 - Changed a bit for SS1, added
; 110 and 2400 baud and instruction
; equates, changed set error. - Dave Chapman
; 05/12/84 - set port (0-7, S -- S=SS1) - Ron Fowler
; 05/11/84 - MEXified the overlay - Ron Fowler
;
; History as an MDM7 overlay:
;
; 11/20/83 - Interfacer 4 note added - A.W. Warren
; 11/11/83 - Renamed to M7IN-1.ASM, no changes - Irv Hoff
; 07/27/83 - Renamed to work with MDM712 - Irv Hoff
; 07/11/83 - Modifed somewhat for MDM711 - Irv Hoff
; 07/08/83 - Adapted from MDM711GP.ASM - Paul Traina
;
;
; 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
;
CONOUT EQU 2 ; Simulated BDOS function 2: console char out
PRINT EQU 9 ; Simulated BDOS function 9: print string
INBUF EQU 10 ; Input buffer, same structure as BDOS 10
;
BELL EQU 7 ; Bell
TAB EQU 9
CR EQU 13 ; Carriage return
LF EQU 10 ; Linefeed
ESC EQU 1BH ; Escape
YES EQU 0FFH
NO EQU 0
;
; Interfacer 3/4 and SS1 port equates:
;
INBASE EQU 010H ; Base port of CompuPro I3 or I4 card(s)
SSBASE EQU 05CH ; Base of serial section of CompuPro SS1
;
UPORT EQU INBASE+7 ; User (chip select) port
;
; Port offsets:
;
DPORT: EQU 0 ; Data port
SPORT: EQU 1 ; Status port
MPORT: EQU 2 ; Mode port
CPORT: EQU 3 ; Control port
;
TBMT: EQU 01H ; Transmit buffer empty
DAV: EQU 02H ; Data available
;
BIT5 EQU 02H ; 5 bits
BIT6 EQU 06H ; 6 bits
BIT7 EQU 0AH ; 7 bits
BIT8 EQU 0EH ; 8 bits
BITMSK EQU 0EH ; Mask to get character length
PARE EQU 30H ; Even parity
PARO EQU 10H ; Odd parity
PARN1 EQU 00H ; No parity
PARN2 EQU 20H ; Another code for no parity
PARMSK EQU 30H ; Mask to get parity bits
STP1 EQU 40H ; 1 stop bit
STP15 EQU 80H ; 1.5 stop bits
STP2 EQU 0C0H ; 2 stop bits
STPMSK EQU 0C0H ; Mask to get stop bits
;
;
; Command register instruction:
;
MCMD EQU 27H ; TxEn, DTR, RxEn, RTS
;
; Break command instruction:
;
BKCMD EQU 2FH ; Send break
;
; Baud rate parameters:
;
BD110: EQU 32H ; 110 baud
BD300: EQU 35H ; 300 baud
BD450: EQU 00H ; 450 baud (not supported here)
BD600: EQU 36H ; 600 baud
BD710: EQU 00H ; 710 baud (not supported here)
BD1200: EQU 37H ; 1200 baud
BD2400: EQU 3AH ; 2400 baud
BD4800: EQU 3CH ; 4800 baud
BD9600: EQU 3EH ; 9600 baud
BD19200 EQU 3FH ; 19200 baud
;
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 YES ; Yes=Hayes Smartmodem, no=non-PMMI 104h
DB 'P' ; T=touch, p=pulse (Smartmodem-only) 105h
CLOCK: DB 60 ; Clock speed in mhz x10, 25.5 mhz max. 106h
; 20=2 mhz, 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 YES ; 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 YES ; 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 YES ; Yes=checks 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
EXTRA1: DB 0 ; For future expansion 11eh
EXITCHR DB 'E'-40H ; ^E = exit to main menu 11fh
BRKCHR: DB '@'-40H ; ^@ = send 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 ; Unused by MEX 128h
;
INCTL1: JMP INSP ; Go input status port 12ah
DS 7
;
OTDATA: JMP OUTDP ; Go output data port 134h
DS 7
;
INPORT: JMP INDP ; Go input data port 13eh
DS 7
;
MASKR: ANI DAV ! RET ; Bit to test for receive ready 148h
TESTR: CPI DAV ! RET ; Value of rcv. bit when ready 14bh
MASKS: ANI TBMT ! RET ; Bit to test for send ready 14eh
TESTS: CPI TBMT ! RET ; Value of send bit when ready 151h
DS 14 ; 156h
;
;
DS 3 ; DIALV: not done here (maybe MXO-SM) 162h
DISCV: JMP DISCON ; Disconnect
GOODBV: JMP GOODBY ; 168h
INMODV: JMP NITMOD ; Go to user written routine 16bh
RET ! NOP ! NOP ; Newbdv 16eh
RET ! NOP ! NOP ; Noparv 171h
RET ! NOP ! NOP ; Paritv 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 (they provide access to routines
; in MEX that are present to support MDM7 overlays -- they will likely
; be gone by mex v2.0).
;
ILPRTV: DS 3 ; 183h
INBUFV DS 3 ; 186h
ILCMPV: DS 3 ; 189h
INMDMV: DS 3 ; 18ch
DS 3 ; 18fh
TIMERV DS 3 ; 192h
;
; Routine to clear to end of screen. If using CLREOS and CLRSCRN, set
; SCRTEST to YES at 010AH (above).
;
CLREOS: LXI D,EOSMSG ; 195h
MVI C,PRINT
CALL MEX
RET
;
CLS: LXI D,CLSMSG ; 19eh
MVI C,PRINT
CALL MEX
RET
; 1a7h
;
; End of fixed area.
;
;------------------------------------------------------------------------------
;
SYSVER: MVI C,ILP ; In-line print
CALL MEX
DB CR,LF
DB 'Version '
DB REV/10+'0'
DB '.'
DB REV MOD 10+'0'
DB ' for CompuPro'
DB CR,LF
DB 'Interfacer 3/4 and System Support 1.'
DB CR,LF
DB 0
CALL SHOALL ; Show initial values for everything
RET
;
; Routine to exit just prior to exit-to-CP/M:
;
GOODBY: XRA A ; Turn off DTR
PUSH PSW
CALL STPORT ; Select port
POP PSW
CALL OUTCP ; Send passed byte to cport
RET ; Exit to cp/m
;
; Send break to remote:
;
SBREAK: MVI A,BKCMD ; Send break for 300ms
JMP DISC1
;
; Disconnect the modem:
;
DISCON: XRA A ; Turn off DTR
DISC1: PUSH PSW
CALL STPORT ; Select port
POP PSW
CALL OUTCP ; Send passed byte to cport
MVI B,3 ; Turn off DTR for 300 ms.
MVI C,TIMER
CALL MEX
MVI A,MCMD ; Turn DTR back on
CALL OUTCP
RET
;
; Initialize the port; either set an initial baud rate, or (if
; your system is capable of it) query the current rate and set
; mspeed value. We can do neither here, so we assume a value
; for mspeed -- if it's not the current value, the user must
; execute a set command to bring mspeed into agreement with the
; current baud rate.
;
NITMOD: LDA MSPEED
JMP PBAUD ; Added here to init uart when mex
; initially loaded. - dlc
; Return from pbaud
;
; Set command: select baud rate, port number. port number may be any of
; 0,1,2,3,4,5,6,7,s (s=ss1), baud rate any of 300, 600, 1200, 4800
; 9600, 19200. Special set-port syntax allows baud rate after port
; number. Examples:
;
; set port 3 set par o - odd parity
; set port 5 1200 set stop 1.5 - 1.5 stop bits
; set port s 300 set data 7 - 7 data bits
; set baud 9600
;
SETCMD: MVI C,SBLANK ; Any arguments?
CALL MEX
JC SHOALL ; If not, go display port/baud etc.
LXI D,CMDTBL
MVI C,LOOKUP
CALL MEX ; Parse argument
PUSH H ; Save any parsed argument adrs on stack
RNC ; If we have one, return to it
POP H ; Oops, input not found in table
SETERR: CALL ILPRT
DB BELL
DB CR,LF,'SET command error!',CR,LF,0
CALL STHELP
RET
;
; Argument table:
;
CMDTBL: DB '?'+80H ; Help
DW STHELP
DB 'BAU','D'+80H ; "set baud"
DW STBAUD
DB 'POR','T'+80H ; "set port"
DW SETPOR
DB 'DAT','A'+80H ; "set bits"
DW STDATA
DB 'PA','R'+80H ; "set par"
DW STPAR
DB 'STO','P'+80H ; "set stop"
DW STSTOP
DB 0 ; <<=== table terminator
;.....
;
;
; Set ? processor:
;
STHELP: CALL CLS
CALL ILPRT
DB LF
DB 'The SET command is invoked as follows:'
DB LF
DB CR,LF,' SET BAUD <baud rate> SET PORT <port-number>'
DB CR,LF,' SET DATA <no. of data bits> SET PARity <parity>'
DB CR,LF,' SET STOP bits <no. of stop bits>'
DB CR,LF
DB CR,LF,' BAUD rate is one of:'
DB CR,LF,' 110 300 600 1200 2400 4800 9600 19200'
DB CR,LF
DB CR,LF,' PORT number is one of:'
DB CR,LF,' 0-7 : Interfacer 3 or 4 port number.'
DB CR,LF,' S : System Support 1 serial port.'
DB CR,LF
DB CR,LF,' DATA bits is one of: STOP bits is one of:'
DB CR,LF,' 5, 6, 7, or 8 1, 1.5, or 2.'
DB CR,LF
DB CR,LF,' PARity is one of:'
DB CR,LF,' E)ven, O)dd, or N)one.'
DB CR,LF,LF,LF,0
RET
;.....
;
;
; Set port processor:
;
SETPOR: MVI C,SBLANK ; Scan to argument
CALL MEX
JC SETERR ; If no arg, bomb out
MVI C,GNC ; Else consume it
CALL MEX
CPI 'S' ; SS1?
JZ SETSS1 ; Jump if so
CPI 's'
JZ SETSS1
SUI '0' ; Convert
JC SETERR
CPI 7+1
JNC SETERR
JMP SETX ; Go put away port #
SETSS1: MVI A,0FFH ; SS1 token
SETX: STA PORT
TELL: CALL ILPRT
DB 'Port is now: ',0
LDA PORT
CPI 0FFH ; SS1?
JNZ TELL1 ; Jump if not
MVI A,'S'-'0' ; Set SS1, and avoid a jmp
TELL1: ADI '0' ; Get port # in ascii
STA PORTAS
CALL ILPRT
PORTAS: DB ' ',CR,LF,0
RET
;.....
;
;
; Set baud processor:
;
STBAUD: MVI C,BDPARS ; Function code: parse a baudrate
CALL MEX ; Let MEX look up code
JC SETERR ; Jump if invalid code
CALL PBAUD ; No, try to set it
JC SETERR ; If not one of ours, bomb out
BDSHOW: CALL ILPRT ; Display baud
DB 'Baud rate now: ',0
LDA MSPEED ; Get current baud rate
MVI C,PRBAUD ; Let MEX print it
CALL MEX
CALL CRLF
RET
;
; This routine sets baud rate passed as MSPEED code in A.
; returns CY=1 if baud rate not supported (if supported,
; this routine must set the new MSPEED code).
;
PBAUD: PUSH H ; Don't alter anybody
PUSH D
PUSH B
MOV E,A ; MSPEED code to DE
MVI D,0
LXI H,BAUDTB ; Offset into table
DAD D
MOV A,M ; Fetch code
ORA A ; 0? (means unsupported code)
STC ; Prep carry in case unsupported
JZ PBEXIT ; Exit if bad
PUSH PSW ; No, set the rate
LDA MODCTB ; Mode register 1
CALL OUTMP
POP PSW ; Get baud code back
CALL OUTMP
MVI A,MCMD ; Command insruction
CALL OUTCP
MOV A,E ; Get mspeed code back
STA MSPEED ; Set it
ORA A ; Return no-errors
PBEXIT: POP B
POP D
POP H
RET
;
BAUDTB: DB BD110 ; 110
DB BD300 ; 300
DB 0 ; 450 (not supported)
DB BD600 ; 600
DB 0 ; 710 (not supported)
DB BD1200 ; 1200
DB BD2400 ; 2400
DB BD4800 ; 4800
DB BD9600 ; 9600
DB BD19200 ; 19200
;......
;
;
; Set data character length:
;
STDATA: LXI D,BITTBL ; Point to table
CALL TSRCH ; and search for command
JC SETERR
LDA MODCTB ; Get the last 2651 mode byte
ANI 0FFH AND NOT BITMSK ; Zero the character length
ORA L ; and put in the new value
CALL PMODE ; Re-init the 2651
BTSHOW: LDA MODCTB ; 2651 mode register image
ANI BITMSK ; Keep only the character length
RAR
RAR ; Shift bits down to bit 0
ADI '5' ; 0 is 5 bits, 1 is 6...
CALL TYPE
CALL ILPRT
DB ' Data bits. ',CR,LF,0
RET
;
; Data bits table:
;
BITTBL: DB '8'+80H
DW BIT8
DB '7'+80H
DW BIT7
DB '6'+80H
DW BIT6
DB '5'+80H
DW BIT5
DB 0 ; <== table terminator
;.....
;
;
; Set the parity:
;
STPAR: LXI D,PARTBL ; Point to the table of commands
CALL TSRCH ; and search it
JC SETERR
LDA MODCTB
ANI 0FFH AND NOT PARMSK ; Zero the parity bits
ORA L ; and put in the new parity
CALL PMODE ; Set everythng up again
BYSHOW: LDA MODCTB
ANI PARMSK ; Get the parity bits
LXI D,EVNMSG
MVI C,PRINT
CPI PARE
CZ MEX ; For even parity
LXI D,ODDMSG
CPI PARO
CZ MEX ; For odd parity
LXI D,NOMSG
CPI PARN1
CZ MEX ; For no parity-first code
CPI PARN2
CZ MEX ; For no parity-second code
CALL ILPRT
DB ' Parity. ',CR,LF,0
RET
;
; Table for parity:
;
PARTBL: DB 'E'+80H
DW PARE
DB 'O'+80H
DW PARO
DB 'N'+80H
DW PARN1
DB 0 ; <== table terminator
;
EVNMSG: DB 'EVEN$'
ODDMSG: DB 'ODD$'
NOMSG: DB 'NO$'
;.....
;
;
; Set the stop bits:
;
STSTOP: LXI D,STPTBL ; Point to the command table
CALL TSRCH ; and search it
JC SETERR
LDA MODCTB
ANI 0FFH AND NOT STPMSK ; Zero the stop bits
ORA L ; and put in the new ones
CALL PMODE ; And set it all up again
BSSHOW: LDA MODCTB
ANI STPMSK ; Get the stop bits
PUSH PSW
LXI D,S1MSG
MVI C,PRINT
CPI STP1
CZ MEX ; For 1 stop bit
LXI D,S15MSG
CPI STP15
CZ MEX ; For 1.5 stop bits
LXI D,S2MSG
CPI STP2
CZ MEX ; For 2 stop bits
CALL ILPRT
DB ' Stop bit',0
POP PSW
CPI STP1
MVI A,'s'
CNZ TYPE
MVI A,'.'
CALL TYPE ; If 1 don't put out 's'
CALL CRLF
RET
;
; Table for stop:
;
STPTBL: DB '1'+80H
DW STP1
DB '1.','5'+80H
DW STP15
DB '2'+80H
DW STP2
DB 0 ; <== table terminator
;
S1MSG: DB '1$'
S2MSG: DB '2$'
S15MSG: DB '1.5$'
;
;------------------------------------------------------------------------------
;
; Port access routines:
;
; Input:
;
INSP: MVI A,SPORT ; In status-port
JMP INP1
INDP: MVI A,DPORT ; In data-port
INP1: PUSH B ; Can't alter BC
MOV C,A ; 2661-relative port number in C
CALL STPORT ; Set port #
ADD C ; A=absolute port #
POP B ; Restore BC
STA INP2+1 ; Put port # in the code
INP2: IN 0 ; Do the input
RET
;.....
;
;
; Output:
;
OUTDP: PUSH B ; Out data-port
MVI C,DPORT
JMP OUT1
OUTMP: PUSH B ; Out mport
MVI C,MPORT
JMP OUT1
OUTCP: PUSH B ; Out control port
MVI C,CPORT
OUT1: MOV B,A ; B=char to send
CALL STPORT ; Set port #
ADD C ; A=absolute port #
STA OUT2+1 ; Put port # in the code
MOV A,B ; A=char to send
OUT2: OUT 0 ; Send it
POP B
RET
;.....
;
;
; Send mode byte:
;
PMODE: STA MODCTB ; Store it for later use
JMP NITMOD ; Returns from pbaud
;.....
;
;
; Set port #, return base adrs:
;
STPORT: LDA PORT ; Get current port #
CPI 0FFH ; 255 implies SS1
JNZ STIN ; Jump if not SS1
MVI A,SSBASE ; It's SS1, return base adrs
RET
STIN: OUT UPORT ; Set in 3/4 user #
MVI A,INBASE ; Return base port
RET
;
PORT: DB 255 ; Initial port #=SS1
;
MODCTB: DB BIT8 OR PARN1 OR STP1 ; Modem control byte
; default 8,N,1
;
;------------------------------------------------------------------------------
;
; Misc. subroutines:
;
; Show all values:
;
SHOALL: CALL CRLF
CALL BDSHOW ; Show baud
CALL TELL ; and port
CALL BTSHOW ; and no. of data bits
CALL BSSHOW ; and no. of stop bits
CALL BYSHOW ; and parity
CALL CRLF
;
TSRCH: MVI C,LOOKUP ; Lookup
JMP MEX ; Return from MEX lookup routine
;
ILPRT: MVI C,ILP ; Inline print
JMP MEX ; Return from MEX ilp routine
;
CRLF: CALL ILPRT
DB CR,LF,0
;
; Send a char in A to the console:
;
TYPE: PUSH H
PUSH D
PUSH B
MOV E,A
MVI C,CONOUT
CALL MEX
POP B
POP D
POP H
RET
;
; Clear-to-end-of-screen and clear-screen sequences:
;
EOSMSG: DB ESC,'Y','$'
CLSMSG: DB ESC,'*','$'
;
;
; The following two create assembly-time error messages if the overlay
; is too big:
;
IF ($ GE 0B00H)
WARNING!! OVERLAY EXTENDS BEYOND 0B00H!!
;
IF ($ GE 0D00H)
ERROR!! OVERLAY EXTENDS BEYOND 0D00H!!
;
END