;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