home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CP/M
/
CPM_CDROM.iso
/
cpm
/
mex
/
mxh-mi11.asm
< prev
next >
Wrap
Assembly Source File
|
1994-07-13
|
13KB
|
499 lines
TITLE 'MEXPLUS overlay for PMC Micromate 101, Version 1.1'
; MXH-MI10.ASM - MEXPLUS OVERLAY FOR PMC MICROMATE 101
; Version 1.1 January 04/87
; (Delete above TITLE if not assembling with MAC)
VER: EQU 11 ; Version number
; History:
; 87/01/04 Fixed bug in NEWBD routine. This routine destroyed HL, which
; some modem overlays (like MXM-2416.ASM) required be preserved.
; Also deleted some superfluous code.
; Ian Cottrell
; 85/12/28 Created from MXO-MI13.ASM
; Ian Cottrell,
; Dept Energy, Mines and Resources,
; Ottawa, Canada
; = = = = = = = = = = = = = = = = = =
; /////////////////////////////////////////
; / /
; / - - W A R N I N G - - /
; / /
; / This code uses CP/M 3 dependent /
; / stuff. /
; / /
; /////////////////////////////////////////
; = = = = = = = = = = = = = = = = = =
;
; Use the MEX "SET" command to change the baud rate when desired. Use
; "SET" to see the current baud rate and "SET xxxx" to set to xxxx. It
; starts out at the value specified for the MSPEED equate. To change
; the default baud rate, use "SET" to set the desired rate, then "CLONE"
; MEX.
;
; = = = = = = = = = = = = = = = = = =
BELL: EQU 07H ; Bell
CR: EQU 0DH ; Carriage return
ESC: EQU 1BH ; Escape
LF: EQU 0AH ; Linefeed
BDOS: EQU 05H ; BDOS entry point
YES: EQU 0FFH
NO: EQU 0
RVIDEO: EQU YES ; Yes if terminal supports reverse video
; Be sure to set RON and ROFF to correct
; values
; PMC Micromate Model 101 dependant stuff
PORT: EQU 89H ; PMC serial modem port
DPORT: EQU PORT ; Modem data port
CPORT: EQU PORT+2 ; Modem control port
SPORT: EQU PORT+2 ; Modem status port
DAV: EQU 01H ; Data available
TBMT: EQU 04H ; Tranmit buffer empty
DCD: EQU 08H ; check for data carrier detect
RI: EQU 10H ; check for ring indicator
; Terminal definitions (currently set for Qume QVT-103)
; If your terminal uses less characters for these functions, set the
; extra ones to space (20H), starting from the 1st character.
ATT1: EQU 20H ; 1st character of reverse video sequence
ATT2: EQU 0EH ; 2nd character of reverse video sequence
RON: EQU 'D' ; 3rd character (rev vid on)
ROFF: EQU 'E' ; 3rd character (rev vid off)
CLR1: EQU 20H ; 1st character of clear screen functions
CLR: EQU 18H ; 2nd character (clear screen)
CLEOS: EQU 17H ; 2nd character (clear end of screen)
; = = = = = = = = = = = = = = = = = =
; MEX Service Processor
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
ORG 100H
DB 0C3H ; Show that we're an 8080/Z-80 overlay
DS 2 ; rest of the jump instruction
DS 2 ; unused by MEX
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 2 ; 0=0 delay 1=10ms 5=50 ms - 9=90 ms 108H
; Default time to send char in terminal
; mode file transfer for slow BBS.
CRDLY: DB 4 ; 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
DS 1 ; unused by MEX
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
LSTST: DB NO ; 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
TOGF 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' ; E = Exit to main menu 11FH
BRKCHR: DB '@' ; @ = Send 300 ms. break tone 120H
NOCONN: DB 'D' ; D = Disconnect from the phone line 121H
LOGCHR: DB 'L' ; L = Send logon 122H
LSTCHR: DB 'P' ; P = Toggle printer 123H
UNSAVE: DB 'U' ; U = Close input text buffer 124H
TRANCHR:DB 'T' ; T = Transmit file to remote 125H
SAVECHR:DB 'S' ; S = Open input text buffer 126H
EXTCHR: DB '^' ; ^ = Send next character 127H
DS 2 ; 128H
INCTL1: XRA A ; Output 00H to command port 12AH
OUT CPORT ; 12BH
MVI A,10H ; Output 10H to command port 12DH
OUT CPORT ; 12FH
IN SPORT ; Get status bits. 131H
RET ; 133H
;
OTDATA: OUT DPORT ; Out modem data port 134H
RET
DS 7 ; 137H
INPORT: IN DPORT ; In modem data port 13EH
RET
DS 7 ; 141H
MASKR: ANI DAV ; Bit to test for receive ready 148H
RET
TESTR: CPI DAV ; Value of rcv. bit when ready 14BH
RET
MASKS: ANI TBMT ; Bit to test for send ready 14EH
RET
TESTS: CPI TBMT ; Value of send bit when ready 151H
RET
DCDTST: JMP DCDVEC ; Data carrier detect 154H
RNGDET: JMP RNGVEC ; ring detect 157H
DB 0,0,0,0,0 ; reserved space, assumed 0
SMDISC: DS 3 ; smartmodem disconnect (not here)
DIALV: DS 3 ; DIALV: not done here (maybe MXO-SM)
DISCV: JMP DISCON ; Disconnect modem 165H
GOODBV: JMP GOODBY ; Reset port 168H
INMODV: JMP NITMOD ; Initialize port 16BH
NEWBDV: JMP NEWBD ; Set new baud rate 16EH
RET ; NOPARV 171H
NOP
NOP
RET ; PARITV 174H
NOP
NOP
SETUPV: JMP SETCMD ; 177H
DS 3 ; Not used by MEX 17AH
VERSNV: JMP SYSVER ; 17DH
BREAKV: JMP SBREAK ; 180H
; Do not change the following line
DS 18
; Routine to clear to end of screen. If using CLREOS and CLRSCRN, set
; SCRNTEST 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
; End of fixed area ... from here to 1FFH is reserved
ORG 200H ; new boundary for MEXPLUS
SYSVER: MVI C,ILP
CALL MEX
DB 'MEXPLUS version '
DB VER/10+'0'
DB '.'
DB VER MOD 10+'0'
DB ' for PMC Micromate Model 101 - '
DB CR,LF
DB 'Default Baud Rate: '
IF RVIDEO
DB ATT1,ATT2,RON
ENDIF
DB 0
LDA MSPEED
MVI C,PRBAUD
CALL MEX
IF RVIDEO
MVI C,ILP
CALL MEX
DB ATT1,ATT2,ROFF,0
ENDIF
RET
; Routine called just prior to exit to CP/M
GOODBY: RET
; Return data carrier detect (DCD) status
; 0 = no carrier
; 255 = carrier present
; 254 = we don't know (DCD not supported)
DCDVEC: MVI A,254 ; Return 'we don't know'
; CALL INCTL1 ; Get status
; ANI DCD ; Test for DCD
; MVI A,255 ; Assume it's there
; RNZ ; It was!
; XRA A ; No it wasn't
RET
; Return ring indicator status
; 0 = not ringing
; 255 = ring detected
; 254 = we don't know (RI not supported)
RNGVEC: MVI A,254 ; Return 'we don't know'
RET
; Routine to send a 300 ms break tone to reset some time-sharing
; computers.
SBREAK: MVI A,5 ; Select register 5
OUT CPORT
MVI A,0F8H ; Send break
SBRK1: OUT CPORT
MVI B,3 ; Delay 300 ms
MVI C,TIMER
CALL MEX
MVI A,5 ; Register 5 again
OUT CPORT
MVI A,0E8H ; Reset to normal (8 bits, DTR on, etc.)
OUT CPORT
RET
; Routine to set DTR low for 300 ms to hang-up modem
DISCON: MVI A,5 ; Select register 5
OUT CPORT
MVI A,068H ; Drop DTR (and send break)
JMP SBRK1 ; Save a litte code here
; You can use this area for any special initialization or setup you may
; wish to include. Each must end with a RET. You can check the other
; available overlays for ideas how to write your own routines if that
; may be of some help.
NITMOD: LDA MSPEED ; Get MSPEED value
PUSH H ; Save HL (needed by some modem overlays)
LXI H,BRTBL ; Calculate required value
MVI D,0 ; to send to baud
MOV E,A ; rate register
DAD D
MOV A,M ; Reg A now contains correct value
ORA A ; Was value zero?
JNZ NITMOD1 ; If not zero, continue
LDA BD1200 ; Else, default to 1200 baud
NITMOD1:PUSH PSW ; Save baud rate value
MVI C,32H ; Function: direct bios call.
LXI D,BIOSPB ; BIOS parameter block
CALL BDOS
LXI D,8+7 ; Index to BAUD rate in 2nd
DAD D ; Entry. (i.e. MODEM)
POP D ; Get new code back (in D)
MOV A,M ; Best not to change high
ANI 0F0H ; nibble, whatever it is.
ORA D ; Put new code in table.
MOV M,A
MVI C,32H ; Function: direct bios call.
LXI D,BIOSPB1 ; Initialize device means to
CALL BDOS ; Set BAUD rate to PMC.
IN DPORT ; Clear any incoming chars
IN DPORT ; Try once more
XRA A ; Clear the 'A' reg
POP H ; Now restore HL
RET
;Allow baud rate change w SET cmd
SETCMD: MVI C,SBLANK ; Any arguments
CALL MEX
JC TELL ; If not, go display baud
LXI D,CMDTBL
MVI C,LOOKUP
CALL MEX ; Parse argument
PUSH H ; Save any arg addrs on stack
RNC ; If we have one, return to it
POP H ; Oops, input not found in table
MVI C,ILP
CALL MEX ; Tell user input not valid
DB '++ Incorrect Entry ++',CR,LF,BELL,0
RET
CMDTBL: 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 '1920','0'+80H
DW OK1920
DB 0 ; End of table
TELL: MVI C,ILP
CALL MEX ; Print current baud rate
DB CR,LF,'Baud rate is now: '
IF RVIDEO
DB ATT1,ATT2,RON
ENDIF
DB 0
LDA MSPEED
MVI C,PRBAUD
CALL MEX
IF RVIDEO
MVI C,ILP
CALL MEX
DB ATT1,ATT2,ROFF,0
ENDIF
RET
OK300: MVI A,1 ; MSPEED 300 baud value
JMP BDSET ; Go do it
OK600: MVI A,3
JMP BDSET
OK1200: MVI A,5
JMP BDSET
OK2400: MVI A,6
JMP BDSET
OK4800: MVI A,7
JMP BDSET
OK9600: MVI A,8
JMP BDSET
OK1920: MVI A,9
BDSET: STA MSPEED ; Update MSPEED
JMP NITMOD
BAUDMCH:PUSH PSW ; Save MSPEED value
PUSH H ; Save baud code
MVI C,32H ; Function: direct bios call.
LXI D,BIOSPB ; BIOS parameter block
CALL 5
LXI D,8+7 ; Index to BAUD rate in 2nd
DAD D ; Entry. (i.e. MODEM)
POP D ; Get new code back.
MOV A,M ; Best not to change high
ANI 0F0H ; Nibble, whatever it is.
ORA E ; Put new code in table.
MOV M,A
MVI C,32H ; Function: direct bios call.
LXI D,BIOSPB1 ; Initialize device means to
CALL 5 ; Set BAUD rate to PMC.
POP PSW ; Restore MSPEED value
STA MSPEED ; Set it
RET
NEWBD: CPI 1
JZ BDSET
CPI 3
JZ BDSET
CPI 5
JZ BDSET
CPI 6
JZ BDSET
CPI 7
JZ BDSET
CPI 8
JZ BDSET
CPI 9
JZ BDSET
RET
; Table of Baud Rate Parameters
BRTBL: EQU $
BD110: DB 00H ; 110 baud not supported
BD300: DB 06H
BD450: DB 00H ; 450 baud not supported
BD600: DB 07H
BD710: DB 00H ; 710 baud not supported
BD1200: DB 08H
BD2400: DB 0AH
BD4800: DB 0CH
BD9600: DB 0EH
BD1920: DB 0FH
BIOSPB DB 20 ; BIOS fcn: return devtbl address
DB 0 ; A-reg contents
DW 0 ; BC-reg contents
DW 0 ; DE-reg contents
DW 0 ; HL-reg contents
BIOSPB1 DB 21 ; BIOS fcn: initialize device in C-reg
DB 0 ; A-reg contents
DB 1 ; C-reg (= 1 for MODEM)
DB 0 ; B-reg
DW 0 ; DE-reg
DW 0 ; HL-reg
BAUDBUF:DB 10,0
DS 10
EOSMSG: DB CLR1,CLEOS,0,0,0,'$' ; Clear to end of screen
CLSMSG: DB CLR1,CLR,0,0,0,'$' ; Clear screen
END