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
/
BEEHIVE
/
COMMS
/
IMP-OV5B.LBR
/
I2EX-2.AZM
/
I2EX-2.ASM
Wrap
Assembly Source File
|
2000-06-30
|
12KB
|
451 lines
; I2EX-2.ASM - Excalibur 64 overlay for IMP - 03/01/88
;
; USES 8251 I/O and 8253 baudrate generator
;
; 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 Excalibur to the IMP modem program.
;
; Edit this file for your preferences then follow the "TO USE:" example
; shown below.
;
; Many terminals will clear the screen with a CTL-Z. If yours does, put
; a 1AH at CLEAR: (010AH). Many terminals use two characters, the first
; normally an ESC. For example, ESC Z. In this case put 'Z' at CLEAR:
; (The ESC will automatically be typed with no CTL-character present.)
; If you don't know what your terminal uses, put a 0 at CLEAR: and IMP
; will scroll up 24 blank lines to clear the CRT for things like MENU,
; looking at the function key table, typing CTL-Z in command mode, etc.
;
; Use the "SET" command to change the baudrate when desired. The value
; at MSPEED controls the baudrate when the program is first called up.
;
; TO USE: First edit this file filling in answers for your own
; equipment. Then assemble with ASM.COM or equivalent
; assembler. Then use MLOAD to merge into the main file:
;
; MLOAD IMP.COM=IMP.COM,I2MD-x.HEX
;
; = = = = = = = = = = = = = = = = = =
;
; 19/01/87 - Written to work with Excalibur 64 by Maurice Copeland
;
; = = = = = = = = = = = = = = = = =
;
;
YES EQU 0FFH
NO EQU 0
;
;
; Values shown are for a 8251
;
PORT EQU 10H ; Your base port (data or status)
MDCTL1 EQU 11H ; Modem control port
MDDATP EQU 10H ; Modem data port
MDRCV EQU 02H ; Modem receive ready
MDSND EQU 01H ; Modem send ready bit
MDTXE EQU 05H ; Modem send buffer empty, holding buffer empty
;
C8253: EQU 23H ; Baudrate command port for control/status
BAUD1: EQU 21H ; Baudrate select port no.1
BAUD2: EQU 22H ; Baudrate select port no.2
;
MDMODE EQU 37H ; Insures 8251 is out of mode with DTR high
MDRSET EQU 42H ; Resets USART for additional commands
MDSET1 EQU 4EH ; 1 stop bit, no parity, 8 bits, x16
MDSET2 EQU 4DH ; 1 stop bit, no parity, 8 bits, x1
MDCOM EQU 15H ; Reset RTS, error flags, RCV, DTR, TX ready
RTSOFF EQU 0 ; Compare for 75/1200 baud
;
;
;-----------------------------------------------------------------------
;
ESC EQU '['-40H ; ^[ = Escape
BELL EQU 'G'-40H ; ^G = Bell character
LF EQU 'J'-40H ; ^J = Linefeed
NEXTRY EQU 'K'-40H ; ^K = Try next phone number, abort this try
CR EQU 'M'-40H ; ^M = Carriage return
CLEARSC EQU 'Z'-40H ; ^Z = Clears screen, command mode only
EOFCHAR EQU 'Z'-40H ; ^Z = End of file
;
;
;-----------------------------------------------------------------------
;
;
ORG 0100H
;
;
DS 3 ; Skip the data area below
;
;
; These routines and equates are at the beginning of the program so
; they can be patched by a monitor or overlay file without re-assembling
; the program.
;
MSPEED: DB 5 ; 0=75 1=300 2=450 3=600 4=710 5=1200 103H
; 6=2400 7=4800 8=9600
HS2400: DB NO ; Yes=2400 bps highest speed 104H
HS1200: DB YES ; Yes=1200 bps highest speed 105H
RACAL: DB NO ; Yes=Racal-Vadic 1200V or 2400V or 2400PA 106H
PROMODM: DB NO ; Yes=Prometheus ProModem 1200 bps 107H
RESVD1: DB NO ; Reserved for special modems 108H
RESVD2: DB NO ; Reserved for special modems 109H
;
;
CLEAR: DB 'Z' ; Clear screen character (ESC not needed) 10AH
CLOCK: DB 40 ; Clock speed in MHz x10, 25.5 MHz max. 10BH
; 20=2 MHh, 37=3.68 MHz, 40=4 MHz, etc.
BYTDLY: DB 2 ; 0=0 delay 1=10ms 5=50 ms - 9=90 ms 10CH
; default time to send character in ter-
; minal mode file transfer for slow BBS
CRDLY: DB 2 ; 0=0 delay 1=100 ms 5=500 ms - 9=900 ms 10DH
; default time for extra wait after CRLF
; in terminal mode file transfer
NOFCOL: DB 5 ; Number of directory columns shown 10EH
TCHPUL: DB 'T' ; T=tone, P=Pulse (Hayes 2400 modems) 10FH
;.....
;
;
ADDLFD: DB NO ; Yes=add LF after CR to send file in terminal 110H
; mode (normally added by remote echo)
CONVRUB: DB YES ; Yes=convert rub to backspace 111H
CRCDFLT: DB YES ; Yes=default to CRC checking 112H
IGNRCTL: DB YES ; Yes=CTL-chars above ^M not displayed 113H
;.....
;
;
EXTCHR: DB '['-40H ; ESC = preceeds local control character 114H
EXITCHR: DB 'E' ; Exit character 115H
FILESND: DB 'F' ; Send file when in terminal mode 116H
NOCONCT: DB 'N' ; Disconnect from phone line 117H
LOGCHR: DB 'L' ; Send logon 118H
LSTCHR: DB 'P' ; Toggle printer 119H
UNSAVCH: DB 'R' ; Close input text buffer 11AH
SAVECHR: DB 'Y' ; Open input text buffer 11BH
CLEARS: DB 'Z' ; Clears screen, terminal mode 11CH
SPARE1: DB 0 ; For future development 11DH
NODTR: DB NO ; Yes if no DTR and need +++ to disconnect 11EH
;.....
;
;
; Handles in/out ports for data and status
;
I$MDCTL1: IN MDCTL1 ; 11FH
RET ; IN modem control port 121H
DB 0,0,0,0,0,0,0 ; Spares if needed 122H
;
I$MDTXE: IN MDCTL1 ; (Needed for SIO or DART register 1 129H
RET ; 12BH
DB 0,0,0,0,0,0,0 ; 12CH
;
I$MDDATP: IN MDDATP ; 133H
RET ; 135H
DB 0,0,0,0,0,0,0 ; Spares if needed 13AH
;
O$MDDATP: OUT MDDATP ; 13DH
RET ; OUT modem data port 13FH
DB 0,0,0,0,0,0,0 ; Spares if needed 140H
;.....
;
;
A$MDRCV: ANI MDRCV ; 147H
RET ; 149H
;
C$MDRCV: CPI MDRCV ; 14AH
RET ; 14CH
;
A$MDSND: ANI MDSND ; 14DH
RET ; 14FH
;
C$MDSND: CPI MDSND ; 150H
RET ; 152H
;
A$MDTXE: ANI MDTXE ; 153H
RET ; 155H
;
C$MDTXE: CPI MDTXE ; 156H
RET ; 158H
;.....
;
;
; Special exit vector, used by some computers to reset interrupt vectors
;
J$EXITVEC:RET ; 159H
DB 0,0 ; 15AH
;.....
;
;
; Jump vectors needed by each overlay
;
J$GOODBYE:JMP GOODBYE ; Disconnects modem by dropping DTR 15CH
J$INITMOD:JMP INITMOD ; Initializes modem, autosets baudrate 15FH
J$STUPR: JMP STUPR ; SET routine to change baudrate 162H
J$SYSVR: JMP SYSVR ; Signon message 165H
;.....
;
;
; "AT" command strings, can be replaced in individual overlay if needed
;
J$STRNGA: DS 3 ; 1200 bps "AT" string 168H
J$STRNG1: DS 3 ; 2400 bps "AT" string 16BH
;
;
; Next fourteen lines should not be changed by user overlay as these go
; to specific locations in the main program, not in the overlay.
;
;
J$CMDSPL: DS 3 ; Allows entry of baudrate on CMD line 16EH
J$CRLF: DS 3 ; Turns up one new line on display 171H
J$DIAL: DS 3 ; Start of dialing routine 174H
J$DSCONT: DS 3 ; Terminates modem use 177H
J$GOLST: DS 3 ; Printer routine, needed by Apple //e 17AH
J$ILPRT: DS 3 ; Prints an inline string, 0 to end 17DH
J$INBUF: DS 3 ; Stores a keybd string for comparison 180H
J$INLNCP: DS 3 ; Inline "compare strings" routine 183H
J$INMDM: DS 3 ; Max .1 sec wait for modem character 186H
J$RCVRSP: DS 3 ; For 3801 I/O use (TV-803) 189H
J$SNDCHR: DS 3 ; Sends a character to the modem 18CH
J$SNDSTR: DS 3 ; Sends a string to the modem, $ to end 18FH
J$TIMER: DS 3 ; .1 second timer (amount in 'B' reg.) 192H
J$NEW1: DB 0,0,0 ; For future needs 195H
J$NEW2: DB 0,0,0 ; For future needs 198H
;.....
;
;
; For 2400 bps auto-stepdown units
;
MANUAL: DB 0 ; For manual selection flag 19BH
J$300: JMP OK300 ; Sets baudrate to 300 baud 19CH
J$1200: JMP OK1200 ; Sets baudrate to 1200 bps 19FH
J$2400: JMP OK2400 ; Sets baudrate to 2400 bps 1A2H
;.....
;
;
LOGPTR: DW LOGON ; Pointer to display LOGON message 1A5H
;
SYSVR: CALL J$ILPRT ; Display the following line 1A7H
DB 'EXCALIBUR-64 version v2.0 by Maurice Copeland' ; 1AAH
DB CR,LF,0
RET
;.....
;
;
;-----------------------------------------------------------------------
;
; NOTE: You can change the SYSVER message to be longer or shorter. The
; end of your last routine should terminate by 0400H (601 bytes
; available after start of SYSVER).
;
;-----------------------------------------------------------------------
;
; You can put in a message at this location which can be called up with
; (special character-L). You can put in several lines. End with a 0.
;
LOGON: DB 'Hello from a happy Excalibur owner...',CR,LF,0
;
;-----------------------------------------------------------------------
;
BD1: DB 52
BD1A: DB 0
BD2: DB 52
BD2A: DB 0
;
; This routine sets DTR low for 300 ms to disonnect the phone
;
GOODBYE:
MVI B,'S'-40H ; X-off to stop host if needed
CALL J$SNDCHR
MVI B,1 ; Wait a moment to let it react
CALL J$TIMER
MVI A,0AH ; Send break, turn off DTR
OUT MDCTL1 ; Send to status port
MVI B,3 ; Delay 300 ms to hang up phone
CALL J$TIMER
MVI A,15H ; Normal send/receive with DTR
OUT MDCTL1 ; Send to status port
RET
;
DLY300: MVI B,3
CALL J$TIMER
RET
;
; Sets 8253/8251 to default value of 1200 baud
;
INITMOD:MVI A,5
CPI RTSOFF ;IS IT 0 FOR 75/1200
JNZ INSPD1 ;NO. BYPASS ALL THIS
MVI A,35H ;YES. MAKE RTS LOW
STA INITMOD1+1 ;AND STORE IT
MVI A,5
STA MSPEED
XRA A
JP INSPD2
;
INSPD1: STA MSPEED
MVI A,15H
STA INITMOD1+1
XRA A
;
INSPD2: OUT MDCTL1
IN MDCTL1
IN MDCTL1
MVI A,76H
OUT C8253
LDA BD1
OUT BAUD1
LDA BD1A
OUT BAUD1
MVI A,0B6H
OUT C8253
LDA BD2
OUT BAUD2
LDA BD2A
OUT BAUD2
MVI A,40H
OUT MDCTL1
CALL DLY300
PARAM: MVI A,78
OUT MDCTL1
;
INITMOD1:
MVI A,15H
OUT MDCTL1
IN MDCTL1
IN MDCTL1
XRA A
RET
;
LDA MSPEED ; Get the selected value
CPI 0 ; 75/1200
JZ OK7512
CPI 1 ; 300 bps
JZ OK300
CPI 5 ; 1200 bps
JZ OK1200
CPI 6 ; 2400 bps
JZ OK2400
CPI 7 ; 4800 bps
JZ OK4800
CPI 8 ; 9600 bps
JZ OK9600
JMP STUPR1 ; Else ask what is wanted
;.....
;
;
;
STUPR: CALL J$CMDSPL ; Gives us CMDBUF+6
JNC STUPR2
;
STUPR1: CALL J$ILPRT
DB 'Input Baud Rate'
DB ' (300, [7512, 1275], 1200, 2400, 4800, 9600): ',0
LXI D,BAUDBUF ; Point to new input buffer
CALL J$INBUF
CALL J$CRLF
LXI D,BAUDBUF+2
;
STUPR2: CALL J$INLNCP ; Compare BAUDBUF+2 with chars. below
DB '300',0
JNC OK300 ; Go if got match
CALL J$INLNCP
DB '7512',0
JNC OK7512
CALL J$INLNCP
DB '1275',0
JNC OK1275
CALL J$INLNCP
DB '1200',0
JNC OK1200
CALL J$INLNCP
DB '2400',0
JNC OK2400
CALL J$INLNCP
DB '4800',0
JNC OK4800
CALL j$INLNCP
DB '9600',0
JNC OK9600
CALL J$ILPRT ; All matches failed, tell operator
DB '++ Incorrect entry ++',CR,LF,BELL,CR,LF,0
JMP STUPR1 ; Try again
;
OK300: MVI A,1 ; MSPEED 300 baud value
STA INITMOD+1
CALL PARAM1
MVI A,208
JMP PARAM2
;
OK7512: MVI A,0
STA INITMOD+1
STA BD2A
MVI A,65
STA BD1
MVI A,52
STA BD2
MVI A,3
STA BD1A
CALL PARAM1
JMP INITMOD
;
OK1275: MVI A,5
STA INITMOD+1
MVI A,52
STA BD1
MVI A,0
STA BD1A
MVI A,65
STA BD2
MVI A,3
STA BD2A
CALL PARAM1
JMP INITMOD
;
OK1200: MVI A,5
STA INITMOD+1
CALL PARAM1
MVI A,52
JMP PARAM2
;
OK2400: MVI A,6
STA INITMOD+1
CALL PARAM1
MVI A,26
JMP PARAM2
;
OK4800: MVI A,7
STA INITMOD+1
CALL PARAM1
MVI A,13
JMP PARAM2
;
OK9600: MVI A,8
STA INITMOD+1
MVI A,77
STA PARAM+1
MVI A,107
STA BD1
MVI A,104
STA BD2
JMP PARAM3
;
PARAM1: MVI A,78
STA PARAM+1
RET
;
PARAM2: STA BD1
STA BD2
PARAM3: MVI A,0
STA BD1A
STA BD2A
JMP INITMOD
;
BAUDBUF:DB 10,0,0,0,0,0
DB 0,0,0,0,0,0
;
; end
;-----------------------------------------------------------------------
;
; NOTE: Must terminate by 0400H
;
END