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-VT11.ASM
< prev
next >
Wrap
Assembly Source File
|
2000-06-30
|
16KB
|
381 lines
;MXO-VT10.ASM - Overlay file for MEXxx
;
REV EQU 11 ;V 1.0
;
;This overlay file supports the DEC Micro VT180 running CP/M or
;Bernie Eiben's implementation of ZCPR2.
;
;We use the COMM Port of the VT180. Baud rates are set from the
;VT100 keyboard and stored in the VT100's nonvolatile RAM. There
;is no need for a "special" baud-rate routine. Since the
;COMM port is referred to RDR: and PUN:, we use MEX calls (which
;in turn calls the BDOS).
;
;To test for COMM status, we use IObyte redirection in conjunction
;with direct BIOS CONSTAT call.
;
;This technique, although slower than direct handling of the
;hardware, takes advantage of the BIOS routines already built in,
;thereby making our code smaller.
;
;***********************************************************************
;
; 6-JUN-1985 Fixed problem with INDP routine that prevented
; SENDOUT from working (Ron Fowler)
;
; 5-Jun-1984 Adapted from M7VT-2.ASM by Bernie Eiben. Removed
; Rev 1.0 the Rainbow conditionals. This overlay won't
; Stuart Fuller work on a Rainbow in file transfer mode without
; some bit twiddling on the 8088 side. Added tests
; for running under ZCPR2 and bit twiddle
; accordingly.
;
; = = = = = = = = = = = = = = = = =
;
BELL: EQU 07H ;bell
CR: EQU 0DH ;carriage return
ESC: EQU 1BH ;escape
LF: EQU 0AH ;linefeed
;
TRUE: EQU 0FFH
FALSE: EQU 0
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=none 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
;
PUNCH: EQU 4 ;BDOS/MEX punch function
READER: EQU 3 ;BDOS/MEX reader function
PRINT EQU 9 ;BDOS/MEX print-string function call
;
; Miscellanea for VT180
;
IOBYTE EQU 3 ; for I/O redirection
BATIO EQU 56H ;
AALOAD EQU 0EA39H ; ZCPR2 Bios sub-version
CALOAD EQU AALOAD + 1 ; Safety check location
LODNUM EQU 28 ; Current version - should be in AALOAD
CLDNUM EQU NOT LODNUM AND 0FFH ; This should be in CALOAD
CRTCB EQU 0EA3BH ; CRT control block addr - flags are at +1
PTRCB EQU 0EA59H ; Likewise for PTR
QMRCVFL EQU 01H ; Mask to allow me to send XON/XOFF
QMXOFFD EQU 02H ; Mask indicating I sent an XOFF
QMXMTFL EQU 04H ; Mask to allow other end to stop me
QMSUSP EQU 08H ; Mask indicating I got an XOFF
QMARROW EQU 10H ; Mask for arrow xlate bit
QMBIT7 EQU 20H ; Mask for "use only 7 bits"
QMCCFLS EQU 40H ; Mask for "flush buffer if 2 ^C's seen"
QM1STCC EQU 80H ; Mask for "first ^C seen"
;
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
;
DAV EQU 0FFH ;bit(s) to test for ready
TBMT EQU 0FFH ;
;
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 'T' ;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 NO ;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 YES ;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 NO ;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 NO ;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
; Note: most overlays will use ANI TBMT at MASKS.
; However, we don't bother with it here. TESTS: will always return ready
MASKS: MVI A,TBMT ! RET ;bit to test for send ready 14EH
TESTS: CPI TBMT ! RET ;value of send bit when ready 151H
DS 14 ; 156H
;
;
DIALV: DS 3 ;DIALV not done here (maybe MXO-SM) 162H
DISCV: DS 3 ;DISCV likewise
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
;
; End of fixed areas
;
;.....
;
;
; Modem I/O primitive
;
; Subroutine to output a character to the modem.
; This routine does it's own status checking.
;
OUTDP: PUSH B ;save...
PUSH D ;...the...
PUSH H ;...registers.
MOV E,A ;move output byte into E
MVI C,PUNCH ;use the BDOS function
CALL MEX ;go
POP H ;restore...
POP D ;...the...
POP B ;...registers.
RET
;.....
;
;
; Subroutine to input a character from the modem.
; This routine will wait until one becomes available.
;
INDP: CALL INSP
ORA A
JZ INDPNR ;if no char, go return last
PUSH B ;save...
PUSH D ;...the...
PUSH H ;...regesters.
MVI C,READER ;use the BDOS function
CALL MEX ;go
POP H ;restore...
POP D ;...the...
POP B ;...registers.
STA LASTCH ;always save most recent char
RET
INDPNR: LDA LASTCH ;return old char
RET
;
; The Check for characters at COMM Port using I/O redirection
;
INSP: PUSH B
PUSH D
PUSH H ; save the environment
LDA IOBYTE ; Including the IOByte
STA SAVEIO ;
MVI A,BATIO ; change I/O byte
STA IOBYTE
CALL BCONST ; call BIOS direct - see INITMOD
PUSH A
LDA SAVEIO ; change I/O byte back
STA IOBYTE
POP A
POP H ; restore environment
POP D
POP B
RET
;
NITMOD: LHLD 1 ; Get BIOS Jump-table adress
LXI D,3
DAD D ; CONSTAT routine in BIOS
SHLD BCONST+1 ; modify our "routine"
RET
;
BCONST: JMP $-$ ; address "filled in" by above code
;
SBREAK: RET
;
GOODBY: LDA ZCPR2
ORA A
RZ ; If running CP/M, then just return
LDA CRTSAV ; Else, we gotta put things back again.
STA CRTCB+1
LDA PTRSAV
STA PTRCB+1
RET
;
SETCMD: RET
;
SYSVER: PUSH B
PUSH D
PUSH H
LXI D,DECMSG
MVI C,PRINT
CALL MEX
; Gotta do the check for ZCPR2 here, SYSVER gets called before INMODV
MVI A,NO ; zero A
STA ZCPR2 ; assume CP/M
LDA AALOAD ; get "load number" from BIOS
CPI LODNUM ; and see if it's right
JNZ NOTZCP ; nope, go
LDA CALOAD ; next check its complement
CPI CLDNUM
JNZ NOTZCP
MVI A,YES ; must be ZCPR2
STA ZCPR2
LXI H,CRTCB+1 ; get CRT's flag byte
MOV A,M
STA CRTSAV ; save it
ANI 0FFH XOR QMARROW ; and zap the arrow xlate flag
MOV M,A
LXI H,PTRCB+1 ; do the same for the PTR
MOV A,M
STA PTRSAV
MVI M,QMRCVFL ; keep only RCVFLOW bit
; Finished with check for ZCPR2
NOTZCP: LDA ZCPR2
ORA A
JZ SYSVE1
LXI D,ZCPMSG
MVI C,PRINT
CALL MEX
SYSVE1: LXI D,CRLF
MVI C,PRINT
CALL MEX
POP H
POP D
POP B
RET
;
; Miscellaneous storage
;
SAVEIO: DB 0 ; Save the original IObyte here
CRTSAV: DB 0 ; Save the CRT flags from ZCPR2's Bios
PTRSAV: DB 0 ; Likewise for the PTR flags
ZCPR2: DB 0 ; Indicates running ZCPR2
;
; Various text messages
;
XSO EQU 14 ;"shift out" character
XSI EQU 15 ;"shift in" character
;
DECMSG: DB 'Version for: ',ESC,'[7m',ESC,')0'
DB 'd',XSO,'x',XSI
DB 'i',XSO,'x',XSI
DB 'g',XSO,'x',XSI
DB 'i',XSO,'x',XSI
DB 't',XSO,'x',XSI
DB 'a',XSO,'x',XSI
DB 'l',ESC,'[m '
DB 'DEC VT180'
DB ' Overlay V'
DB REV/10+'0'
DB '.'
DB REV MOD 10+'0'
DB '$'
;
ZCPMSG: DB ' running ZCPR2.','$'
CRLF: DB CR,LF,'$'
;
CLSMSG: DB ESC,'[2J',ESC,'[H','$'
EOSMSG: DB ESC,'[0J','$'
;
;
OVREND: EQU $ ; See if it'll fit
IF OVREND / 0B00H
+++ VT180 OVERLAY TOO LARGE - OVREND >= 0B00H +++
ENDIF
;
LASTCH: DB 0
;
END
;