; I2RY-1.ASM - Royal Alphatronic PC IMP overlay (low speed) - 07/10/87 ; ; USES 8251A I/O and no 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 Royal computer to the IMP modem program. This ; model has no baudrate generator and changes the 8251 from "x16" for ; 1200 bps to "x64" for 300 bps. The Royal must be jumpered for 1200 ; bps for this method to work. (J101 4th from left) ; ; 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 *. In this case put '*' 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,I2RY-x.HEX ; ; = = = = = = = = = = = = = = = = = = ; ; 07/11/87 Adapted from I2SY-2.ASM for Royal Alphatronic PC ; - Paul Carmichael ; ; 06/01/87 Improved the GOODBYE routine, added BREAK routine, needs ; IMP245 to use it. - Irv Hoff ; ; 10/27/85 Initial IMP version - Irv Hoff ; ; = = = = = = = = = = = = = = = = = ; ; ; ROYAL EQUATES ; EOICMD EQU 20H ; Non-spec EIO for PIC RXINTV EQU 0EF04H ; Receive ready interruptvector LSTSTV EQU 0D92DH ; Lstst vector (bug in monitor) PICPRT0 EQU 70H ; PIC base port PICPRT1 EQU 71H PICMSK0 EQU 0FDH ; Enable receive ready interrupt PICMSK1 EQU 0FFH ; Mask all interrupts RXBFSIZ EQU 32 ; Receive buffer size XOFF EQU 'S'-40H XON EQU 'Q'-40H ; ; NO EQU 0 YES EQU NOT NO ; (Some assemblers cannot use 0FFh) ; ; ; Valeus shown are for an 8251A ; PORT EQU 40H ; Your base port (data or status) MDCTL1 EQU PORT+1 ; Modem control port MDDATP EQU PORT ; 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 ; MDMODE EQU 82H ; Insures 8251 is out of mode with DTR high MDRSET EQU 42H ; Resets USERT for additional commands MDSET0 EQU 4FH ; 1 stop bit, no parity, 8 bits, x64 MDSET1 EQU 4EH ; 1 stop bit, no parity, 8 bits, x16 MDSET2 EQU 4CH ; 2 stop bits, no parity, 8 bits, x16 RDCOM EQU 37H ; Reset RTS, error flags, RCV, DRT, TX ready ; ; ;----------------------------------------------------------------------- ; 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 103H ; MSPEED: DB 5 ; 0=110 1=300 2=450 3=600 4=710 5=1200 103h ; 6=2400 7=4800 8=9600 9=19200 default 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 'E' ; Clear screen character (ESC not needed) 10Ah CLOCK: DB 40 ; Clock speed in mhz x10, 25.5 MHz max. 10Bh ; 20=2 MHz, 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 10Fh 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-characters 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 BRKCHR: DB 'Q' ; Send a break tone 11Dh NODTR: DB NO ; Yes if no DTR and need ATH0 to disconnect 11Eh ;..... ; ; Handles in/out ports for data and status ; ORG 11FH I$MDCTL1: IN MDCTL1 RET ; ORG 129H I$MDTXE: IN MDCTL1 RET ; ORG 133H I$MDDATP: JMP GETRX ; ORG 13DH O$MDDATP: OUT MDDATP RET ; ORG 147H A$MDRCV: RET ; ORG 14AH C$MDRCV: JMP RXRDY ; ORG 14DH A$MDSND: ANI MDSND RET ; C$MDSND: CPI MDSND RET ; A$MDTXE: ANI MDTXE RET ; C$MDTXE: CPI MDTXE RET ;..... ; ORG 159H ; ; Special exit vector, used by some computers to reset interrupt vectors ; J$EXITVEC:JMP REXIT ; 159h ;..... ; ; 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 JR$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$BREAK: JMP SENDBRK ; Break routine 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 ; 19Ch J$1200: JMP OK1200 ; 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 'Version for Royal Alphatronic PC' 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!',CR,LF,0 ; ;----------------------------------------------------------------------- ; ; This routine sets a 300 ms break tone ; SENDBRK: MVI A,3FH ; DTR normal, send break tone JMP GOODBYE+2 ;..... ; ; ; This routine sets DTR low for 300 ms to disonnect the phone ; GOODBYE: MVI A,3DH ; Send break, turn off DTR DI OUT MDCTL1 ; Send to status port MVI B,3 ; Delay 300 ms to hang up phone CALL J$TIMER MVI A,37H ; Normal send/receive with DTR OUT MDCTL1 ; Send to status port LXI H,RXBUF ; R: SHLD RXPTR ; Reset pointer XRA A STA RXCNT ; Clear count EI RET ;..... ; ; ; Sets 8251 to 8 bits, DTR, RCV and TX ready ; INITMOD: DI CALL INIT0 ; Go initialize the modem LHLD LSTSTV+1 SHLD OLDVEC ; Save old LsTst vector LXI H,LSTST SHLD LSTSTV+1 ; Insert new XRA A STA RXCNT ; Clear buffer counter LXI H,RXBUF SHLD RXPTR ; Preset pointer LXI H,RXISR SHLD RXINTV+1 ; Rxrdy service vector into table MVI B,8 MVI A,EOICMD ; INITL1: OUT PICPRT0 ; EOI to PIC DCR B JNZ INITL1 ; 8 times MVI A,0C3H STA RXINTV MVI A,PICMSK0 OUT PICPRT1 ; Enable rxrdy interrupt EI RET ;..... ; ; INIT0: LDA MSPEED ; Get the selected value CPI 1 ; 300 baud JZ OK300 CPI 5 ; 1200 bps JZ OK1200 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 (300, 1200): ',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 '1200',0 JNC OK1200 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 MVI B,MDSET0 ; Divide by 64 for 300 baud JMP LOADBD ; Go set the baudrate ; OK1200: MVI A,5 MVI B,MDSET1 ; Divide by 16 for 1200 bps JMP LOADBD ; Go set the baudrate ; OK2400: JMP OK1200 ; LOADBD: STA MSPEED ; Change time-to-send to match baudrate MVI A,MDMODE ; Insure 8251 is out of mode OUT MDCTL1 XTHL ; Small delay to complete command XTHL MVI A,MDRSET ; Reset the 8251a for new command OUT MDCTL1 XTHL ; Small delay to complete command XTHL MOV A,B ; Set speed OUT MDCTL1 XTHL ; Small delay to complete command XTHL MVI A,MDCOM ; Error reset, RCV, DTR, TX ready OUT MDCTL1 XTHL ; Small delay to complete command XTHL RET ;..... ; ; REXIT: DI MVI A,0C9H ; Put return code into vector STA RXINTV MVI A,PICMSK1 OUT PICPRT1 ; Mask all interrupts LHLD OLDVEC SHLD LSTSTV+1 XRA A STA RXCNT LXI H,RXBUF SHLD RXPTR EI RET ;..... ; ; ; Receive ready service routine ; RXISR: PUSH PSW PUSH B PUSH D PUSH H ; Save registers IN MDDATP LHLD RXPTR ; Get buffer pointer MOV M,A ; Put RX data to buffer INX H SHLD RXPTR LDA RXCNT INR A CPI RXBFSIZ ; ? buffer full STA RXCNT JC RXISX ; Skip next if not MVI A,0FFH STA XOFFL MVI A,XOFF CALL J$SNDCHR ; RXISX: MVI A,EOICMD OUT PICPRT0 ; EOI to PIC POP H POP D POP B POP PSW ; Restore registers EI RET ;..... ; ; ; Get a character from RX buffer ; GETRX: PUSH B PUSH D PUSH H ; GETRX0: DI LDA RXCNT DCR A ; Decrement counter STA RXCNT ; Store new value LXI H,RXBUF MOV C,A MOV A,M STA CHAR ; Save character JZ GETRX1 ; Skip next if last character MVI B,0 XCHG LXI H,RXBUF+1 DB 0EDH DB 0B0H ; Move buffer down a byte ; GETRX1: LDA XOFFL ORA A JZ GETRXX ; If XOFF flag not set leave MVI A,XON CALL J$SNDCHR XRA A STA XOFFL ; Turn XON and clear flag ; GETRXX: LHLD RXPTR DCX H SHLD RXPTR ; Adjust buffer pointer LDA CHAR ; Recover character POP H POP D POP B EI RET ;..... ; ; RXRDY: LDA RXCNT ; Get RX buffer counter ORA A ; Anything there? JZ RXNRDY ; Go not ready if not XRA A ; Indicate ready RET ; RXNRDY: MVI A,0FFH ORA A ; Indicate not ready RET ;..... ; ; LSTST: IN 30H IN 30H ; For hardware ANI 40H ; ? busy JZ LSTRDY ; XRA A RET ; Lister busy ; LSTRDY: DCR A ORA A RET ; Lister not busy ;..... ; ; XOFFL: DB 0 ; Xoff flag CHAR: DB 0 ; Temp character register RXPTR: DW 0 ; Buffer pointer OLDVEC: DW 0 ; Old LsTst vector BAUDBUF:DB 10,0,0,0,0,0 ; CONINP buffer DB 0,0,0,0,0,0 RXCNT: DB 0 ; RX buffer counter RXBUF: DS RXBFSIZ ; RX input buffer ; ; end ;----------------------------------------------------------------------- END