;AMSTRAD OVERLAY FOR IMP.COM - TRiPsoft - 14/02/89
;
;This overlay for amstard 6128 running CPM+ (will work under CPM 2.2 but
; I Dont recommend it as line noise etc can cause AWFULL screen corruption 
;mode chganges etc. This is a problem with many comms programmes under CPM
;2.2 on the Amstrads.
;
; IMP seems to be a nice well behaved comms programme which - as it says
;in the documentation handles hayes modems very well.
;
; The patche table Marked below should allow use on the PCW but is untested
;as I don't have access to one.
;
;Assemble this code with ZASM or similar to produce a .HEX file and overlay
;onto IMP.COM using MLOAD thus-
;
;MLOAD MYIMP.COM=IMP.COM,IMP-AMS.HEX
;
;See the I2xxxx support files for details of programmimg Phone numbers and
;function keys.
;
;	Tom Price (TRiPsoft) Feb 1989
;
YES:	EQU	0FFH
NO:	EQU	0
;
;
;	AMSTRAD CPC 6128 PORT PATCH ADDRESSES
;
;	Comment out these and de-comment the PCW ones for that
;	Machine....
;
;.......................................
;
PORT		EQU	0FADCH		;amstrads serial output port
MDCTL1		EQU	PORT+1		;modem control port
MDDATP		EQU	PORT		;modem data port
MDRCV		EQU	01H		;your bit to test for receive
MDSND		EQU	04H		;your bit to test for send
MDTXE		EQU	04H		;your value when send ready
CTCTX		EQU	0FBDCH		;8253 counter 0 (ch a tx.)
CTCRX		EQU	CTCTX+1		;8253 counter 1 (ch a rx.)
CTCMODE		EQU	CTCTX+3		;8253 write mode word
;
;	PCW PORT PATCH ADDRESSES
;
;	De-comment these lines and comment out above for PCW
;
;
;PORT		EQU	0E0H		;amstrads serial output port
;MDCTL1		EQU	PORT+1		;modem control port
;MDDATP		EQU	PORT		;modem data port
;MDRCV		EQU	01H		;your bit to test for receive
;MDSND		EQU	04H		;your bit to test for send
;MDTXE		EQU	04H		;your value when send ready
;CTCTX		EQU	0E4H		;8253 counter 0 (ch a tx.)
;CTCRX		EQU	CTCTX+1		;8253 counter 1 (ch a rx.)
;CTCMODE	EQU	CTCTX+3		;8253 write mode word
;


;-----------------------------------------------------------------------
;
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
			     ; NB does NOT work fully owing to 4 char
			     ; escape sequence used on amstrads 	
EOFCHAR:EQU	'Z'-40H	     ; ^Z = END OF FILE
;
;-----------------------------------------------------------------------
;
	ORG	0100H
;
	DEFS	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:	DEFB	6	     ; 0=110 1=300 2=450 3=600 4=710 5=1200		103H
			     ; 6=2400 7=4800 8=9600 9=19200 DEFAULT
			;This overlay only uses 300 1200 & 2400

HS2400:	DEFB	YES	     ; YES=2400 BPS HIGHEST SPEED			104H
HS1200:	DEFB	NO	     ; YES=1200 BPS HIGHEST SPEED			105H
RACAL:	DEFB	NO	     ; YES=RACAL-VADIC 1200V OR 2400V OR 2400PA	106H
PROMODM:DEFB	NO	     ; YES=PROMETHEUS PROMODEM 1200 BPS		107H
RESVD1:	DEFB	NO	     ; RESERVED FOR SPECIAL MODEMS			108H
RESVD2:	DEFB	NO	     ; RESERVED FOR SPECIAL MODEMS			109H
;
;
CLEAR:	DEFB	0	     ; CLEAR SCREEN CHARACTER (ESC NOT NEEDED)	10AH
;******			;DON'T implement this owing to weird 4 char sequence
			;used on Amstrads

CLOCK:	DEFB	40	     ; CLOCK SPEED IN MHz X10, 25.5 MHz MAX. 	10BH
			; 20=2 MHH, 37=3.68 MHz, 40=4 MHz, ETC.
;***** 		USE 33 on 6128 owing to interrupts - experiment on PCW

BYTDLY:	DEFB	4	     ; 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:	DEFB	4	     ; 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:	DEFB	4	     ; NUMBER OF DIRECTORY COLUMNS SHOWN		10EH
TCHPUL:	DEFB	'P'	     ; T=TONE, P=PULSE (HAYES 2400 MODEMS)		10FH
;.....
;
;
ADDLFD:	DEFB	NO	     ; YES=ADD LF AFTER CR TO SEND FILE IN TERMINAL	110H
				;   MODE (NORMALLY ADDED BY REMOTE ECHO)
CONVRUB:DEFB	YES	     ; YES=CONVERT RUB TO BACKSPACE			111H
CRCDFLT:DEFB	YES	     ; YES=DEFAULT TO CRC CHECKING			112H
IGNRCTL:DEFB	NO	     ; YES=CTL-CHARS ABOVE ^M NOT DISPLAYED		113H
;.....
;
;
EXTCHR:	DEFB	'['-40H	     ; ESC = PRECEEDS LOCAL CONTROL CHARACTER	114H
EXITCHR:DEFB	'E'	     ; EXIT CHARACTER				115H
FILESND:DEFB	'F'	     ; SEND FILE WHEN IN TERMINAL MODE		116H
NOCONCT:DEFB	'N'	     ; DISCONNECT FROM PHONE LINE			117H
LOGCHR:	DEFB	'L'	     ; SEND LOGON					118H
LSTCHR:	DEFB	'P'	     ; TOGGLE PRINTER				119H
UNSAVCH:DEFB	'R'	     ; CLOSE INPUT TEXT BUFFER			11AH
SAVECHR:DEFB	'Y'	     ; OPEN INPUT TEXT BUFFER			11BH
CLEARS:	DEFB	'Z'	     ; CLEARS SCREEN, TERMINAL MODE			11CH
SPARE1:	DEFB	0	     ; FOR FUTURE DEVELOPMENT			11DH
SPARE2:	DEFB	0	     ; FOR FUTURE DEVELOPMENT			11EH
;.....
;
;
; HANDLES IN/OUT PORTS FOR DATA AND STATUS
;
I$MDCTL1:JP	OSTAT	     ;					11FH
	DEFB	0,0,0,0,0,0,0; SPARES IF NEEDED			122H
;
I$MDTXE:JP	OSTAT	     ;					129H
	DEFB	0,0,0,0,0,0,0; SPARES IF NEEDED			12CH
;
I$MDDATP:JP	OSIN	     ;					133H
	DEFB	0,0,0,0,0,0,0; SPARES IF NEEDED			136H
;
O$MDDATP:JP	OSOUT	     ;					13DH
	DEFB	0,0,0,0,0,0,0; SPARES IF NEEDED			140H
;.....
;
;
A$MDRCV:AND	MDRCV	     ;					147H
	RET		     ;					149H
;
C$MDRCV:CP	MDRCV	     ;					14AH
	RET		     ;					14CH
;
A$MDSND:AND	MDSND	     ;					14DH
	RET		     ;					14FH
;
C$MDSND:CP	MDSND	     ;					150H
	RET		     ;					152H
;
A$MDTXE:AND	MDTXE	     ;					153H
	RET		     ;					155H
;
C$MDTXE:CP	MDTXE	     ;					156H
	RET		     ;					158H
;.....
;
;
; SPECIAL EXIT VECTOR, USED BY SOME COMPUTERS TO RESET INTERRUPT VECTORS
;
J$EXITVEC:
	JP	RSTINT	     ;					159H
;.....
;
;
; JUMP VECTORS NEEDED BY EACH OVERLAY
;
J$GOODBYE:	JP	GOODBYE	     ; DISCONNECTS MODEM BY DROPPING DTR	15CH
J$INITMOD:	JP	INITMOD	     ; INITIALIzES MODEM, AUTOSETS BAUDRATE	15FH
J$STUPR:	JP	STUPR	     ; SET ROUTINE TO CHANGE BAUDRATE	162H
J$SYSVR:	JP	SYSVR	     ; SIGNON MESSAGE			165H
;.....
;
;
; "AT" COMMAND STRINGS, CAN BE REPLACED IN INDIVIDUAL OVERLAY IF NEEDED
;
J$STRNGA:	DEFS	3	     ; 1200 BPS "AT" STRING			168H
J$STRNG1:	DEFS	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:DEFS	3	     ; ALLOWS ENTRY OF BAUDRATE ON CMD LINE	16EH
J$CRLF:	DEFS	3	     ; TURNS UP ONE NEW LINE ON DISPLAY	171H
J$DIAL:	DEFS	3	     ; START OF DIALING ROUTINE		174H
J$DSCONT:DEFS	3	     ; TERMINATES MODEM USE			177H
J$GOLST:DEFS	3	     ; PRINTER ROUTINE, NEEDED BY APPLE //E	17AH
J$ILPRT:DEFS	3	     ; PRINTS AN INLINE STRING, 0 TO END	17DH
J$INBUF:DEFS	3	     ; STORES A KEYBD STRING FOR COMPARISON	180H
J$INLNCP:DEFS	3	     ; INLINE "COMPARE STRINGS" ROUTINE	183H
J$INMDM:DEFS	3	     ; MAX .1 SEC WAIT FOR MODEM CHARACTER	186H
J$RCVRSP:DEFS	3	     ; FOR 3801 I/O USE (TV-803)		189H
J$SNDCHR:DEFS	3	     ; SENDS A CHARACTER TO THE MODEM	18CH
J$SNDSTR:DEFS	3	     ; SENDS A STRING TO THE MODEM, $ TO END 18FH
J$TIMER:DEFS	3	     ; .1 SECOND TIMER (AMOUNT IN 'B' REG.)	192H
J$NEW1:	DEFB	0,0,0	     ; FOR FUTURE NEEDS			195H
J$NEW2:	DEFB	0,0,0	     ; FOR FUTURE NEEDS			198H
;.....
;
;
; FOR 2400 BPS AUTO-STEPDOWN UNITS
;
MANUAL:	DEFB	0	     ; FOR MANUAL SELECTION FLAG		19BH
J$300:	JP	OK300	     ; SETS BAUDRATE TO 300 BAUD		19CH
J$1200:	JP	OK1200	     ; SETS BAUDRATE TO 1200 BPS		19FH
J$2400:	JP	OK2400	     ; SETS BAUDRATE TO 2400 BPS		1A2H
;.....
;
;
LOGPTR:	DEFW	LOGON	     ; POINTER TO DISPLAY LOGON MESSAGE	1A5H
;
SYSVR:	CALL	J$ILPRT	     ; DISPLAY THE FOLLOWING LINE		1A7H
	DEFB	'VERSION FOR AMSTRAD 6128';			1AAH
;
	DEFB	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:	DEFB	'FIRSTNAME;LASTNAME;PASSWORD  ',CR,LF,0
;
;-----------------------------------------------------------------------
;
GOODBYE:
	LD	B,'S'-40H    ; X-OFF TO STOP HOST IF NEEDED
	CALL	J$SNDCHR
	LD	B,1	     ; WAIT A MOMENT TO LET IT REACT
	CALL	J$TIMER

; This routine allows a 300 ms. break tone to be sent to reset some
; time-share computers.
;
SENDBRK:LD	A,5
	LD	BC,MDCTL1
	OUT	(C),A
	LD	A,0F8H		;send a break tone
	JP	GBYE1
;.....
; 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.
;
GBYE:	CALL	DTROFF
        JR	GBYE2
;
GBYE1:	LD	BC,MDCTL1
	OUT	(C),A
GBYE2:	LD	B,3		;delay 300 ms.
	CALL	J$TIMER
	CALL	DTRON
	RET

; YOU CAN USE THIS AREA FOR ANY SPECIAL INITIALIzATION OR SETUP YOU MAY
; WISH TO INCLUDE.  EACH MUST STOP 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.
;
;
;Amstrad initialization -- sets sio for 8 bits, 1 stop, no parity etc.
;
INITMOD:
	LD	BC,MDCTL1
	LD	A,00H		;select reg.
	OUT	(C),A
	LD	A,18H		;throw out of mode
	OUT	(C),A
	LD	A,04H		;select reg.
	OUT	(C),A
	LD	A,44H		;set ascii parameters
	OUT	(C),A
	LD	A,03H		;select reg.
	OUT	(C),A
	LD	A,0C1H		;enable receive
	OUT	(C),A
	LD	A,05H		;select reg.
	OUT	(C),A
	LD	A,0EAH		;enable send, dtr, rts
	OUT	(C),A

;Initialise 8253 for reqd baud rate

	LD	A,(MSPEED)	;get the selected value
	CP	1		;300 bps? NEWBD arrives here
	JP	Z,OK300
	CP	5		;1200 bps? NOW 75/1200 bps
	JP	Z,OK1200
	CP	6		;2400 bps?
	JP	Z,OK2400
	CP	8		;9600 bps?
	JP	Z,OK9600
	JP	STUPR1	     ; ELSE ASK WHAT IS WANTED
;
RSTINT:	
	JP	0000H	     ; OSBORNE 1 LIKES THIS JUMP UPON EXIT

;-----------------------------------------------------------------------
;
STUPR:	CALL	J$CMDSPL     ; GIVES US CMDBUF+6
	JP	NC,STUPR2
;
STUPR1:	CALL	J$ILPRT
;
	DEFB	'INPUT BAUD RATE (300, 1200, 2400, 9600 ): ',0
;
	LD	DE,BAUDBUF   ; POINT TO NEW INPUT BUFFER
	CALL	J$INBUF
	CALL	J$CRLF
	LD	DE,BAUDBUF+2
;
STUPR2:	CALL	J$INLNCP     ; COMPARE BAUDBUF+2 WITH CHARS. BELOW
	DEFB	'300',0
	JP	NC,OK300     ; GO IF GOT MATCH
	CALL	J$INLNCP
	DEFB	'1200',0
	JP	NC,OK1200
;
	CALL	J$INLNCP
	DEFB	'2400',0
	JP	NC,OK2400
;
	CALL	J$INLNCP
	DEFB	'9600',0
	JP	NC,OK9600

	CALL	J$ILPRT	     ; ALL MATCHES FAILED, TELL OPERATOR
	DEFB	'++ INCORRECT ENTRY ++',CR,LF,BELL,CR,LF,0
	JP	STUPR1	     ; TRY AGAIN
;
;.....
;
;
ITMOD1: LD	A,036H		;select counter 0 (a tx)
	LD	BC,CTCMODE
	OUT	(C),A		;send to 8253 timer
;first do tx chan.
;
ITMOD2: LD	A,068H		;default to 1200
	LD	BC,CTCTX
	OUT	(C),A		;send to 8253 timer
;
ITMOD3: LD	A,00H		;1200 baud, msb portion
	OUT	(C),A		;to timer
;now do rx chan.
;
ITMOD4: LD	A,076H		;select counter 1 (a rx)
	LD	BC,CTCMODE
	OUT	(C),A
;
ITMOD5: LD	A,068H		;load 1200, msb
	LD	BC,CTCRX
	OUT	(C),A
;
ITMOD6: LD	A,00H
	OUT	(C),A
	RET
;.....
; Sets the modem speed via the set command.
;
OK300:	LD	A,1
	LD	HL,(BD300)
	LD	DE,(BD300)
	JP	LOADBD
;
OK1200:	LD	A,5
	LD	HL,(BD1200)
	LD	DE,(BD1200)
	JP	LOADBD
;
OK2400:	LD	A,6
	LD	HL,(BD2400)
	LD	DE,(BD2400)
	JP	LOADBD
;
OK9600:	LD	A,8
	LD	DE,(BD9600)
	LD	HL,(BD9600)
;
LOADBD:	LD	(MSPEED),A	;change time-to-send to match baudrate
	LD	A,L		;get baudrate byte
	LD	(ITMOD2+1),A	;send to 8253 ch a tx for new baudrate
	LD	A,E
	LD	(ITMOD5+1),A	;now rx
	LD	A,H		;2nd 1/2 of baudrate
	LD	(ITMOD3+1),A	;do tx first
	LD	A,D
	LD	(ITMOD6+1),A	;then rx
	JP	ITMOD1	;reinitialize to new baudrate, then done
;
; Table of baudrate parameters
;
BD300:	DEFW	01A0H
BD1200:	DEFW	0068H
BD2400:	DEFW	0034H
BD9600:	DEFW	000DH
;
BAUDBUF:DEFB	10,0
	DEFS	10

;get status of uart

OSTAT:	PUSH	BC
	LD	A,10H		;reset interupts
	LD	BC,MDCTL1
	OUT	(C),A
	IN	A,(C)
	POP	BC
	RET
;
;send char to uart

OSOUT:	PUSH	BC
	LD	BC,MDDATP
	OUT	(C),A
	POP	BC
	RET
;
;get char from uart
;
OSIN:	PUSH	BC
	LD	BC,MDDATP
	IN	A,(C)
	POP	BC
	RET
	RET

;================++++++++++++ MACHINE DEPENDENT +++++++++++++++++++++
;THIS ROUTINE SHOULD SET THE DTR LINE ON
dtron:	push	bc
	ld	bc,MDCTL1
	push	af		;save all registers used
	ld	a,5		;say register 5
	out	(c),a	;select write register 5
	ld	a,(wrreg5)	;a copy of write reg 5
	set	7,a		;set DTR bit
	ld	(wrreg5),a	;update copy
	out	(C),a	;to modem control port
	pop	af		;restore registers
	pop	bc
	ret
;THIS ROUTINE SHOULD SET THE DTR LINE OFF
dtroff:	push	bc
	ld	bc,MDCTL1
	push	af		;save all registers used
	ld	a,5
	out	(c),a	;select write register 5
	ld	a,(wrreg5)	;old contents of wr reg5
	res	7,a		;reset DTR bit
	ld	(wrreg5),a	;update copy
	out	(c),a
	pop	af		;restore registers
	pop	bc
	ret
;
wrreg5:	db	0EAH		;saved copy of write only reg (set at initmod)
;
;
;		THAT'S IT FOLKS..
;		Feel free to modify there's a few bytes left yet
;
;		Keep me posted if you come up with any usefull improvements
;
;		Contact via BOOG BBS 0252 626233 or
;		 Winchester Remote 0962 69233
;

	END
come up with any usefull improvements
;
;		Contact via BOOG BBS 0252 626233 or
;		 Winchester 