chasm@killer.DALLAS.TX.US (Charles Marslett) (06/26/89)
# This is a shell archive (Part 1 of 2) # # It contains the source code for the 5 MYDOS RS-232 handlers # included in part 2. Full source files are included for # the Atari 850/P:R:Connection version, the ATR8000 version # for normal configurations, and the ATR8500 version. # # Two "diff" files are included showing the changes required # (to the best of my knowldege) to run the RS-232 port of the # ATR8000 when the SWP hard disk controller and software are # installed. # # I owe Richard Bennett (author of TOP-DOS) a debt of gratitude # for his sugguestion that the RS-232 handlers be made "reset-proof" # and unaffected by loading DUP.SYS. He wrote the original version # of the Atari 850/P:R:Connection handler. # # Richard Morris is also due gratitude for his efforts devoted to # permitting use of the RS-232 port on the ATR8500. Since his work # in 1986, I have added Richard Bennett's ideas to the ATR8000 and # ATR8500 handlers, so this handler may not remain functional -- I # would appreciate any feedback on problems with any of the handlers. # # Run this archive through the Bourne shell "sh" or an unshar # program, the desired driver can then be assembled using the # A65 assembler recently posted. If the output file is named # AUTORUN.SYS and written to a diskette with DOS.SYS and DUP.SYS # on it, nothing further is required to have a fully operation # RS-232 handler installed under MYDOS. # #----cut here-----cut here-----cut here-----cut here----# #!/bin/sh # shar: Shell Archiver # Run the following text with /bin/sh to create: # atari850.asm # rs232atr.doc # atr232.asm # hd_diff # hx_diff # atr8500.asm # This archive created: Sat Jun 24 10:02:47 1989 sed 's/^X//' << \SHAR_EOF > atari850.asm X TITLE 'ATARI 850 AND ICD P:R:CONNECTION HANDLER' X SUBTTL 'BY RICHARD K. BENNETT' X; X; This is a modification of the RS-232 loader code written by X; Richard Bennett for his Top-Dos operating system for the Atari X; 8-bit computers. This version has been included in MYDOS with X; his permission. X; XWARMST = $0008 XDOSINI = $000C X; XDDEVIC = $0300 XHATAB = $031A XICCOM = $0342 XICBAL = $0344 XICBAH = $0345 XICBLL = $0348 XICBLH = $0349 X; XOSBUF = $0500 X; XCIOV = $E456 XSIOV = $E459 X; X; LOAD RS232 HANDLER FROM ATARI 850 OR ICD PR:Connection X; X ORG $37F2 X; X; Clear the WARM-START flag X; XSTART LDA #$00 X STA WARMST X; X; Save the MYDOS INIT Vector X; X LDA DOSINI X STA FMSINIT+1 X LDA DOSINI+1 X STA FMSINIT+2 X; X; Issue SIO call to the printer to start RS232 driver X; load by reading 12 bytes into a buffer at $0500. X; X LDX #12-1 XCPYLP1 LDA QUERY,X X STA DDEVIC,X X DEX X BPL CPYLP1 X JSR SIOV X BMI ERREXIT X; X; If the printer has an RS232 driver, copy the command X; and issue it (loading the bootstrap loader into $0506) X; X LDX #12-1 XCPYLP2 LDA OSBUF,X X STA DDEVIC,X X DEX X BPL CPYLP2 X JSR SIOV X BPL SETUP X; X; If any errors occur, issue error message X; XERREXIT LDA #LOW[MSG1] X LDX #HIGH[MSG1] X LDY #MSG1LN X BNE PRINT ;JUMP ALWAYS! X; X; If the loader code was successfully loaded, relocate X; and initialize it. X; XSETUP JSR OSBUF+6 X; X; And save the RS232 driver INIT Vector X; X LDA DOSINI X STA RSINIT+1 X LDA DOSINI+1 X STA RSINIT+2 X; X; Is this an Atari 850? X; X LDY #$12 XTST850 LDA (DOSINI),Y X CMP ATARI850,Y X BNE NOT850 X DEY X BPL TST850 X; X; REPLACE THE RELOCATION CODE OF THE 850 HANDLER X; X LDY #$43 ;Offset to the bytes to be replaced XPAT850 LDA PATCH-$43,Y X STA (DOSINI),Y X INY X CPY #$43+8 ;Patch 8 bytes X BNE PAT850 X; X; POINT INIT VECTOR AT NEW CODE X; X LDA #$44 X CLC X LDA DOSINI ;SKIP OVER RELOCATION, ETC. X ADC #$44 X STA DOSINI X BCC DOINIT X INC DOSINI+1 XDOINIT JSR RSINIT X; X; Work all done, send message to screen and exit! X; X LDA #LOW[MSG2] X LDX #HIGH[MSG2] X LDY #MSG2LN ;TELL THE WORLD! X BNE PRINT ;JUMP ALWAYS! X; X; Not an 850, perhaps a P:R:Connection? X; If so, we INIT and report the fact... X; XNOT850 JSR RSINIT ;ALLCOATE RAM, AND INITIALIZE R: X; X; This one is easy, after standard INIT call, just print msg. X; X LDA #LOW[MSG3] X LDX #HIGH[MSG3] X LDY #MSG3LN ;TELL THE WORLD! X; X; Print termination message, then exit back to MYDOS X; XPRINT STA ICBAL X STX ICBAH X STY ICBLL X; X LDX #0 X LDA #9 X STA ICCOM,X X LDA #0 X STA ICBLH,X X JMP CIOV X; XMSG1 DB 'ERROR - CAN',$27,'T LOAD RS232 DRIVER',$9B XMSG1LN EQU *-MSG1 X; XMSG2 DB '850 RS232 HANDLER LOADED',$9B XMSG2LN EQU *-MSG2 X; XMSG3 DB 'P:R:Connection RS232 HANDLER LOADED',$9B XMSG3LN EQU *-MSG3 X; X; QUERY: HEY, PRINTER DEVICE, DO YOU HAVE AN RS232 HANDLER? X; (BUFFER AT $0500, LENGTH OF 12 BYTES, 8 TICK TIMOUT) X; XQUERY DB 'P',$01,'?',$40 ;device, unit, command, direction X DW $0500,8,12 ;buffer addr, timeout, length X db 0,0 ;aux bytes X; X; 18 BYTES OF ID INFORMATION FOR THE 850 DRIVER X; XATARI850 LDA #0 X LDX #0 XFNDELP CMP HATAB,X X BEQ ENDFND X INX X INX X INX X CPX #32 X BCC FNDELP X RTS XENDFND LDA #'R' X; X; EIGHT BYTE PATCH TO KEEP 850 ACTIVE THROUGH A RESET X; XPATCH DB $60 ;RTS XFMSINIT DB $20,$00,$00 ;JSR $0000 [ADDRESS FILLED IN LATER] XRSINIT DB $4C,$00,$00 ;JMP $0000 [ADDRESS FILLED IN LATER] X DB 0 ;BRK X; X; INIT ENTRY VECTOR X; X ORG $02E2 X DW START X; X END SHAR_EOF sed 's/^X//' << \SHAR_EOF > rs232atr.doc XThese RS232 drivers for the ATR8000 Xdiffer in where the Z80 code down- Xloaded into the ATR8000 goes. The Xoriginal driver (ATR232.ASM) used Xthe "User Page" of memory not used Xby the ATR8000 ROM code ($D000). X XUnfortunately, the ATR8000 hard disk Xinterface code is loaded here also, Xtwo other alternatives are provided: XATR232HD.ASM loads its code at $EC00 Xto $EFFF, and ATR232HX.ASM loads its Xcode at $E000 to $E2FF. X XGood luck if you need to use one or Xthe other of these! X XCharles Marslett XJune 19, 1989 SHAR_EOF sed 's/^X//' << \SHAR_EOF > atr232.asm X TITLE 'ATR8000 AUTORUN.SYS INITIALIZER FOR RS232 I/O' X SUBTTL 'BY CHARLES MARSLETT, COPYRIGHT 1985, 1986, 1989' X; WORK AREA FOR AUTORUN PROGRAM X; XORIGIN = $6000 XDIF = $D4 XSPTR = $D6 XDPTR = $D8 X; XMEMTOP = $02E7 X; X; CONFIGURATION DATA X; XSOBSIZ = 32 ;32 BYTE OUTPUT BUFFER X; X; DRIVER DATA AREAS X; XDOSINI = $000C XPOKMSK = $10 XBRKKEY = $11 XRTCLOK = $12 XDCMDZ = $22 XDAUX1Z = $2A XDAUX2Z = $2B XRSDATA = $43 ;DATA BYTE NOT BUFFERED YET X; XVSERIN = $020A XVIMIRQ = $0216 XCDTMV3 = $021C XCDTMF3 = $022A XSSKCTL = $0232 XDVSTAT = $02EA XDDEVIC = $0300 XDUNIT = $0301 XDCMD = $0302 XDSTAT = $0303 XDBUF = $0304 XDTIMEO = $0306 XDLEN = $0308 XDAUX = $030A XHATABS = $031A X; XAUDF1 = $D200 XAUDCTL = $D208 XSKRES = $D20A XSERIN = $D20D XSEROUT = $D20D XIRQEN = $D20E XSKCTL = $D20F XPBCTL = $D303 X; XSIOV = $E459 X; X; WRITE A BYTE TO THE RS232 PORT X; X ORG ORIGIN XRSWRIT STA RSDATA ;SAVE DATA BYTE X LDA #$88 XREL001 JSR OPNCHK ;CAN WE WRITE TO THIS CHANNEL? X; XREL002 LDA CTLBYTE X AND #$30 X TAY X CMP #$20 X BCS OUTASCI ;IF NO TRANSLATE X LDA RSDATA X CMP #$9B ;ATASCII CARRIAGE RETURN X BNE NOXLEL X LDA #$0D ;ASCII CARRIAGE RETURN XREL003 JSR OUTBYTE X BMI EREXIT ;IF ERROR, RETURN IT XREL004 LDA CTLBYTE X ASL A ;AUTO LF DESIRED? X BPL NOXMIT ;IF NO AUTO LF, DONE! X LDA #$0A X BNE OUTBYTE X; XNOXLEL AND #$7F ;GET RID OF REVERSE VIDEO BIT X DEY ;HEAVY XLATE? X BMI OUTBYTE ;IF LIGHT XLATE, NO MORE TESTING X; X CMP #$20 ;ELSE, CONTROL CODE? X BCC NOXMIT ;IF SO, DONE! X CMP #$7D ;RUBOUT, TILDE, OR ??? X BCC OUTBYTE ;IF NOT, SEND IT XNOXMIT LDY #1 ;ELSE, DONE XEREXIT RTS X; XOUTBYTE STA RSDATA ;SAVE DATA BYTE XOUTASCI LDA CTLBYTE X AND #$03 X BEQ OUTREAL ;LEAVE PARITY UNCHANGED X ASL RSDATA ;DISCARD PARITY BIT X CMP #3 X BEQ OUTMARK ;SET PARITY (CY=1 IF EQ) X LSR A X LDA RSDATA XPGENLP BCC NOFLIP X EOR #$80 XNOFLIP ASL A X BNE PGENLP XOUTMARK ROR RSDATA ;FORCE MARK PARITY IF CY=1 XOUTREAL LDY SOBPUT X INY X CPY #SOBSIZ X BCC BUFWAIT X LDY #0 XBUFWAIT JSR TSTBKY ;SEE IF BREAK PRESSED (ABORT) XREL05X CPY SOBGET ;ELSE, IS BUFFER FULL? X BEQ BUFWAIT ;IF SO, WAIT FOR ROOM X; X LDA RSDATA ;GET BYTE TO SEND XREL005 STA SOBUF,Y ;AND SAVE IN BUFFER XREL060 STY SOBPUT X; X SEI X LDA #$08 ;ENABLE ONLY END OF TRANSMIT INT. XREL006 BIT BDRATE X BMI ST2BIT ;IF 2 STOP BITS ARE TO BE SENT X LDA #$18 ;ENABLE BOTH TRANS. INTERRUPTS X; XST2BIT LDY #0 XREL007 JSR SETMSK X CLI ;REENABLE INTERRUPTS AGAIN X; X INY ;Y=1, RETURN GOOD STATUS X RTS X; XRSREAD LDA #$84 XREL008 JSR OPNCHK XREL080 LDY SIBGET XREL081 CPY SIBPUT ;BYTE IN BUFFER? X BEQ RSREAD ;IF NOT, WAIT FOR IT XREL009 LDA SIBUF,Y ;COPY BYTE FROM BUFFER X INY XREL090 STY SIBGET X STA RSDATA ;TO RETURN AREA X; X; VERIFY PARITY IF REQUIRED X; XREL010 LDA CTLBYTE X AND #$0C ;TEST INCOMING PARITY? X BEQ NOPTST ;NO PARITY TESTING X CMP #$0C X BEQ CLRPTY ;STRIP OFF PARITY (IGNORE) X AND #$04 ;TEST FOR EVEN/ODD PARITY X EOR RSDATA ;FLIP ONE BIT IF TESTING FOR EVEN PARITY XPTSTLP BCC PRTYOK ;FIRST PASS CY=0 X EOR #$80 ;THEREAFTER, EACH 1 BITS FLIPS THE NEXT XPRTYOK ASL A X BNE PTSTLP ;IF ALL 8 BITS=0, DONE! X BCC CLRPTY ;IF PARITY EVEN, CONTINUE X LDA #$20 ;ELSE, SET ERROR FLAG XREL100 ORA ERRFLGS XREL101 STA ERRFLGS XCLRPTY ASL RSDATA ;CLEAR PARITY BIT IN RSDATA X LSR RSDATA X; X; DO LIGHT OR HEAVY TRANSLATION IF REQUIRED X; XNOPTST LDA CTLBYTE X AND #$30 X TAY X LDA RSDATA ;LOAD DATA BYTE X CPY #$20 X BCS NOXIN X AND #$7F ;INSURE PARITY IS CLEARED X CMP #$0D ;IF CR, REPLACE WITH $9B X BNE NOTCRIN X LDA #$9B XNOTCRIN DEY ;ELSE, DONE IF LIGHT XLATE X BMI NOXIN X CMP #$20 ;OR TEST FOR PORTABILITY IF HEAVY X BCC NOTPOR X CMP #$7D ;20-7C ARE PORTABLE X BMI NOXIN ;THE REST ARE CONVERTED TO CANT XNOTPOR LDA CANT X; X; THEN RETURN DATA BYTE TO ROM OS X; XNOXIN LDY #1 ;ELSE, LEAVE IT AS IT IS X RTS X; X; READ STATUS BYTES FOR A CHANNEL X; XRSSTAT BIT CHSTAT X BMI SNOOP XREL011 BIT CCSTAT X BPL RETSTA XSNOOP JSR RDSTLN X BMI NO8000 X LDY #0 X LDX #0 X STX DVSTAT+3 X LDA DVSTAT+2 X PHA X LSR A X LSR A X BCS ZERDCD XSETDCD LDX #$CC XZERDCD LSR A X BCS ZERRNG XSETRI LDY #$30 XZERRNG STY DAUX2Z X TXA X ORA DAUX2Z X TAX X PLA X BMI ZERDAT X INX XZERDAT STX DVSTAT+1 X ASL A X AND #$04 XSTEXIT ORA ERRFLGS ;MERGE WITH ERROR FLAGS X STA DVSTAT X LDY #0 XREL111 STY ERRFLGS X STY DVSTAT+2 X INY X RTS X; XRETSTA SEC XREL112 LDA SIBPUT XREL113 SBC SIBGET X STA DVSTAT+1 X SEC XREL114 LDA SOBPUT XREL115 SBC SOBGET X AND #SOBSIZ-1 X STA DVSTAT+3 X LDA #0 X BEQ STEXIT X; XNO8000 LDA #$0F X BNE STEXIT X; XRDSTLN JSR ZSET X BMI NO8000 XHR001 LDY #HIGH[Z80STAT] XLR001 LDA #LOW[Z80STAT] XREL012 JSR XFER X LDY #$DE XREL013 JSR ZZSET ;DO LAST PART OF ZSET X LDA #'R' ;READ STATUS BACK TO ATARI X STA DCMD X LDA #$40 X STA DSTAT X LDY #HIGH[DVSTAT+1] X LDA #LOW[DVSTAT+1] X STA DBUF X LDA #2 ;READ 2 BYTES X; XSIORW STY DBUF+1 X STA DAUX X STA DLEN X LDA #0 X STA DLEN+1 X JMP SIOV ;WRITE CODE INTO Z80 X; X; OPEN THE RS232 PORT X; XRSOPEN LDA CHSTAT X BMI NOTOPN X LDY #150 ;PORT ALREADY OPEN X RTS X; XNOTOPN LDY #0 XREL130 STY ERRFLGS X LDA DAUX1Z ;SAVE AUX1 AS PORT STATE X ORA #$40 ;MARK PORT OPEN XREL014 STA CHSTAT ;AND NOT ACTIVE X INY X RTS X; X; CLOSE THE RS232 PORT X; XRSCLOS BIT CHSTAT X BVS SMPLCL ;IF NOT CCIO TO SHUT DOWN X LDA BRKKEY X BEQ SMPLCL XREL140 LDA RSDONE X BEQ RSCLOS ;IF NOT DONE YET, LOOP X CLC X LDA RTCLOK+2 X ADC #6 XRSCLWT CMP RTCLOK+2 X BNE RSCLWT X; X; RESTORE INTERRUPT HANDLING WITHOUT INTERRUPTS X; X SEI XREL015 JSR SHUTDN X CLI XSMPLCL LDY #$C0 XREL016 STY CCSTAT XREL017 STY CHSTAT X LDY #1 X RTS X; XSHUTDN LDA #$34 ;ASSERT COMMAND LINE X STA PBCTL X LDA #0 XREL180 STA SOBGET XREL181 STA SOBPUT XREL019 LDA SYSIRQ ;RESTORE SYSTEM IRQ VECTOR X STA VIMIRQ XREL020 LDA SYSIRQ+1 X STA VIMIRQ+1 X; X LDY #6 ;RESTORE 3 XRSTRVC LDA OLDISRS-1,Y ;SERIAL ISR VECTORS X STA VSERIN-1,Y X DEY X BNE RSTRVC X LDA #$3C ;CLEAR COMMAND LINE X LDY #128 X STY BRKKEY X STA PBCTL X RTS X; X; CONFIGURE AN RS232 CHANNEL X; XRSXIO LDA DCMDZ X AND #$0F X CMP #9 X BCS RCMDER X TAY X LSR A X BCS RCMDER XREL021 LDA XIOTAB+1,Y X PHA XREL022 LDA XIOTAB,Y X PHA X RTS ;VECTOR TO XIO ROUTINE X; XRCMDER LDY #132 ;INVALID COMMAND X RTS X; X; START CONCURRENT MODE I/O X; XRSCCIO BIT CHSTAT X BPL CCNOPN X LDY #133 ;IOCB NOT OPEN X RTS X; XCCNOPN BVS NCCMOD X LDY #153 ;CONCURRENT MODE I/O ACTIVE ERROR CODE XCCXIT1 RTS X; XNCCMOD JSR RDSTLN X BMI CCXIT1 XREL023 LDA MONITR X AND DVSTAT+2 X BEQ SETCC X LDY #139 ;FAILURE TO START CCIO X RTS X; X; BRING UP TRANSFER FUNCTION IN ATR8000 X; XSETCC JSR ZSET ;POINT TO Z80 LOCATION EC00 X BMI ISFAIL X LDA #$FF XREL024 STA LEVEL X LDA #$51 XREL025 STA PINSEL XHR004 LDY #HIGH[CCIO] XLR004 LDA #LOW[CCIO] XREL026 JSR XFER X BPL SETISR XISFAIL JMP XIOXIT X; X; SET UP SERIAL I/O IN ATARI X; XSETISR LDY #0 XREL027 STY CCSTAT X LDA #$73 ;SET 2-CLOCK ASYNC. XFER, X SEI XREL280 STY SOBGET XREL281 STY SOBPUT XREL282 STY SIBGET XREL283 STY SIBPUT X STA SKCTL ;KEYBOARD ACTIVE X; X LDA #$78 X STA AUDCTL X; XREL028 LDA BDRATE X AND #$0F ;EXTRACT BAUD RATE DATA X TAY XREL029 LDA BAUDH,Y ;SET UP 2 16-BIT CLOCKS X STA AUDF1+2 X STA AUDF1+6 XREL030 LDA BAUDL,Y X STA AUDF1 X STA AUDF1+4 X LDA #$A0 X STA AUDF1+1 X STA AUDF1+3 X STA AUDF1+5 X STA AUDF1+7 X LDY #6 XHISISR LDA VSERIN-1,Y ;SAVE SYSTEM ISRS XREL031 STA OLDISRS-1,Y XREL032 LDA ISRTBL-1,Y ;AND INSERT MINE X STA VSERIN-1,Y X DEY X BNE HISISR X LDA VIMIRQ ;TAKE OVER IRQ VECTOR XREL033 STA SYSIRQ XLR005 LDA #LOW[BRKIRQ] X STA VIMIRQ X LDA VIMIRQ+1 XREL034 STA SYSIRQ+1 XHR005 LDA #HIGH[BRKIRQ] X STA VIMIRQ+1 XREL035 LDA CHSTAT ;CCIO NOW ACTIVE! X AND #$BF ;TURN OFF BIT 6 XREL036 STA CHSTAT X AND #$04 X BEQ NOINPT ;IF NO INPUT ALLOWED,SKIP ENABLING X LDA #$20 ;ELSE, ENABLE SERIAL INTERRUPTS XNOINPT INY XREL037 JSR SETMSK X CLI ;REENABLE INTERRUPTS XREL038 JMP XIOXIT X; X; SET BAUD RATE AND NO. OF STOP BITS X; XRSBAUD LDA DAUX1Z ;THIS JUST SAVES BAUD XREL039 STA BDRATE ;RATE AND STOP BITS FLAG X LDA DAUX2Z X BEQ STMON X LDA #$02 ;LINE TO MONITOR IS ALWAYS SAME XSTMON STA MONITR XREL040 JMP RTNOK X; X; SET TRANSLATE MODE AND PARITY X; (XIO 38 IS ENTIRELY INTERNAL TO THE ATARI) X; XRSXLAT LDA DAUX1Z ;SAVE TRANSLATE PARAMETERS XREL041 STA CTLBYTE X LDA DAUX2Z ;AND UNTRANSLATABLE CODE XREL042 STA CANT XRTNOK LDY #1 X; X; COMMON XIO CALL EXIT X; XXIOXIT LDA CHSTAT ;RESTORE AUX1 FOR R/W ACTIVITY X STA DAUX1Z X TYA ;SET CONDITION CODE FOR CALLER XFAILED RTS X; X; CONTROL THE RS232 CONTROL LINES: X; DTR, RTS, AND TD (TRANSMIT DATA) X; XRSCTL BIT CHSTAT X BVS BLKCTL X LDA DAUX1Z X AND #3 X LSR A X BEQ RTNOK X LDA #$73 X BCS SETMRK X ORA #$80 XSETMRK STA SKCTL X BNE RTNOK X; XBLKCTL LDX #$51 ;DATA PIN IS PORT 51 X LDA DAUX1Z X LSR A X ROR A X BCC NOBITC XREL043 JSR SETBIT XNOBITC LDX #$55 ;CONTROL PIN IS 55 X LDA DAUX1Z X LSR A X AND #$50 X BEQ NOCTLC X AND DAUX1Z ;SEE IF SET OR CLEARED X BEQ TOBECLR X LDA #$80 XTOBECLR EOR #$80 XREL044 JSR SETBIT XNOCTLC JMP XIOXIT X; XSETBIT STX PINSEL X ASL A X LDA #0 X ROL A XREL045 STA LEVEL XREL046 JSR ZSET X BMI FAILED XHR006 LDY #HIGH[Z80CTL] XLR006 LDA #LOW[Z80CTL] X; X; ATR8000 SERIAL I/O ROUTINES X; XXFER STA DBUF X LDA #'W' X STA DCMD X LDA #$80 X STA DSTAT X LDA #CCIOL XREL047 JSR SIORW X BMI FAILED X LDY #'G' X BNE ZCMDO X; XZSET LDY #$DC ;POINT TO $DC00 XZZSET STY DAUX+1 ;POINT TO ANY PAGE X LDY #'S' XZCMDO STY DCMD X LDY #$00 X STY DSTAT X STY DAUX X INY X STY DUNIT X INY X STY DTIMEO X LDY #'Z' X STY DDEVIC X JMP SIOV X; XBRKIRQ BIT IRQEN ;BREAK KEY PRESSED X BPL HAVEBK ;IF SO, HANDLE IT XREL048 JMP (SYSIRQ) ;ELSE, LET ROM HANDLE IT X; XHAVEBK PHA X TYA X PHA XREL049 JSR SHUTDN X ASL BRKKEY X LDA #$40 XREL050 ORA CHSTAT ;SET CCIO-INACTIVE BIT XREL051 STA CHSTAT X BNE INTRET X; XRSSERO CLD X TYA X PHA XREL500 LDY SOBGET XREL501 CPY SOBPUT X BNE NALDON ;IF NOT DONE THEN SEND NEXT BYTE X LDA POKMSK X AND #$E7 ;TURN OFF OUTPUT INTERRUPTS X LDY #1 ;NEW VALUE OF RSDONE XREL052 JSR OUTMSK ;UPDATE POKMSK, IRQEN AND RSDONE X BNE INTRET X; XNALDON INY ;POINT TO NEXT BYTE X CPY #SOBSIZ X BCC REL053 X LDY #0 XREL053 LDA SOBUF,Y X STA SEROUT ;SEND BYTE TO RS232 PORT XREL530 STY SOBGET XOIDON LDA IRQEN X EOR #$FF X AND POKMSK X AND #$20 X BEQ NOINPI X LDA #$D4 X AND POKMSK X STA IRQEN X LDA POKMSK X STA IRQEN XREL054 JSR SERIH XNOINPI LDA #$08 X BIT IRQEN ;OUTINT DONE? X BEQ OIDON XINTRET PLA X TAY X PLA X RTI X; XRSSERI CLD X TYA X PHA XREL055 JSR SERIH X PLA X TAY X PLA X RTI X; XSERIH LDA SERIN ;READ BYTE FROM HARDWARE XREL550 LDY SIBPUT ;GET BUFFER POINTER XREL056 STA SIBUF,Y ;SAVE BYTE IN BUFFER X LDA SKCTL X STA SKRES X EOR #$FF ;REPORT FRAMING OR X AND #$C0 ;OTHER H/W ERRORS XREL560 ORA ERRFLGS X INY ;BUMP BUFFER POINTER XREL561 CPY SIBGET ;BUFFER OVERFLOW? XREL562 STY SIBPUT X BNE UPDERR ;IF NOT SAVE GET POINTER X INY X ORA #$10 ;SET OVERRUN FLAG XREL563 STY SIBGET ;ERASE OLDEST BYTE IN BUFFER XUPDERR STA ERRFLGS X RTS X; X; UPDATE POKMSK, IRQEN AND RSDONE X; XSETMSK ORA POKMSK ;MERGE IN OLD BITS XOUTMSK STA POKMSK X STA IRQEN ;UPDATE HARDWARE REGISTER XREL564 STY RSDONE ;UPDATE DONE FLAG X RTS X; X; TEST FOR RS232 PORT NOT OPEN OR BREAK PRESSED X; XOPNCHK BIT CHSTAT ;IS ACTION VALID? X BEQ ERRNWR ;IF OPERATION NOT ENABLED X BMI ERRNOP ;IF NOT OPEN X; X; FIELD A BREAK KEY PRESSED WHEN RS232 X; CHANNEL IS ACTIVE. X; XTSTBKY BIT CHSTAT ;IN CCIO? X BMI ERRNOP ;NOT EVEN OPEN X BVC INCCIO XREL057 LDA CCSTAT X BMI NOBREAK X LDY #$80 X STY BRKKEY XREL058 STY CCSTAT X; X DB $2C ;SKIP TO 'BKABRT' XERRNWR TAY ;WRITE NOT ENABLED X DEY ;I.E. $87 X DB $2C ;SKIP TO 'BKABRT' XERRNOP LDY #133 ;NOT OPEN ERROR XBKABRT PLA ;ELSE, FLUSH RETURN ADDRESS X PLA X TYA XINCCIO RTS X; XNOBREAK JSR RSCCIO ;START UP CCIO X BMI BKABRT X RTS X; X; ADJUST TOP OF OS POINTER X; XRSINIT JSR $07E0 ;INITIALIZE DOS FIRST XLR008 LDA #LOW[MEMEND] X STA MEMTOP XHR008 LDA #HIGH[MEMEND] X STA MEMTOP+1 X; X; INSTALL RS232 HANDLER IN HANDLER TABLE X; X LDY #0 XFNDSLT LDA HATABS,Y ;LOOK FOR EMPTY SLOT IN HANDLER TABLE X BEQ CLDSLT ;IF FOUND X CMP #'R' ;ALREADY PRESENT? X BEQ GOTSLT ;IF SO, REUSE IT X INY X INY X INY X CPY #30 ;END OF TABLE? X BCC FNDSLT X RTS ;YES, RETURN WITH CY=1 X; XCLDSLT XGOTSLT LDA #'R' ;DEVICE NAME IS 'R' X STA RSDONE X STA HATABS,Y X SEC XLR009 LDA #LOW[RSVECT] ;POINT TO RS232 HANDLER ENTRY TABLE X STA HATABS+1,Y XHR009 LDA #HIGH[RSVECT] X STA HATABS+2,Y X LDY #1 X RTS X; XRSVECT DW RSOPEN-1,RSCLOS-1 X DW RSREAD-1,RSWRIT-1 X DW RSSTAT-1,RSXIO-1 X; XXIOTAB DW RCMDER-1,RSCTL-1 X DW RSBAUD-1,RSXLAT-1 X DW RSCCIO-1 X; XISRTBL DW RSSERI ;VALUES FOR INTERRUPT VECTORS X DW RSSERO X DW RSSERO XVECEND = *-2 X; X; CONCURRENT I/O ROUTINE TO DOWNLOAD TO Z80 X; XCCIO DB $F3 ;DI X DB $CD,$68,$F0 ;CALL SHUTDOWN X DB $3E,$21 ;LD A,00100001B X DB $D3,$83 ;OUT (CTC3),A X DB $32,$2E,$FF ;LD (DRVOFF),A X DB $06,$04 ;LD B,04H X DB $DB,$50 ;CCIOLP ;IN A,(50H) X DB $07 ;RLCA X DB $D3,$50 ;OUT (50H),A X DB $DB,$70 ;IN A,(70H) X DB $07 ;RLCA X DB $D3,$51 ;OUT (51H),A X DB $A0 ;AND B X DB $C2,$0D,$DC ;JP NZ,CCIOLP X DB $3E,$FF ;LD A,0FFH X DB $D3,$51 ;OUT (51H),A X DB $C3,$C6,$F7 ;JMP PWRWAIT+8 XCCIOL = *-CCIO X; XZ80CTL DB $3E ;LD A,0FFH XLEVEL DB $FF X DB $D3 ;OUT (051H),A XPINSEL DB $51 X DB $C9 ;RET X; XZ80STAT DB $DB,$50 ;IN A,(050H) X DB $32,$01,$DE ;LD ($DE01),A X DB $C9 ;RET X; X; BAUD RATE TABLES X; XBAUDH DB HIGH[2976] ;0 300 BPS X DB HIGH[19661] ;1 45.5 X DB HIGH[17891] ;2 50 X DB HIGH[15727] ;3 56.875 X DB HIGH[11925] ;4 75 X DB HIGH[8128] ;5 110 X DB HIGH[6646] ;6 134.5 X DB HIGH[5959] ;7 150 X DB HIGH[2976] ;8 300 X DB HIGH[1484] ;9 600 X DB HIGH[739] ;10 1200 X DB HIGH[490] ;11 1800 X DB HIGH[366] ;12 2400 X DB HIGH[179] ;13 4800 X DB HIGH[86] ;14 9600 X DB HIGH[40] ;15 19,200 BPS X; XBAUDL DB LOW[2976] X DB LOW[19661] X DB LOW[17891] X DB LOW[15727] X DB LOW[11925] X DB LOW[8128] X DB LOW[6646] X DB LOW[5959] X DB LOW[2976] X DB LOW[1484] X DB LOW[739] X DB LOW[490] X DB LOW[366] X DB LOW[179] X DB LOW[86] X DB LOW[40] X; XCHSTAT DB $C0 ;BIT 7=CHANNEL CLOSED X ; 6=CONCURRENT I/O INACTIVE X ; 3=OUTPUT MODE X ; 2=INPUT MODE X; XCTLBYTE DB 0 ;BIT 6=ADD LF TO CR (OUTPUT) X ;BITS 5-4=XLATE MODE X ;BITS 3-2=INPUT PARITY CTL X ;BITS 1-0=OUTPUT PARITY CONTROL XBDRATE DB 0 ;BIT 7=1 IF 2 STOP BITS X ;BITS 3-0 = BAUDRATE XCANT DB 0 ;WONT TRANSLATE CHARACTER FOR HEAVY XLTER XMONITR DB 0 ;SIGNALS TO MONITOR XCCSTAT DB $80 ;IF -, STATUS IS NORMAL X ;IF -, BYTE COUNTS ARE IN STATUS XOLDISRS DS 6 ;VECTORS REPLACED IF CCIO ACTIVE XSYSIRQ DS 2 ;SIMULATED DOS ENTRY ADDRESS X; XERRFLGS DB 0 ;ERROR STATUS XRSDONE DB 0 ;IF = 0, RS232 PORT IS ACTIVE XSIBGET DB $0 XSIBPUT DB $0 XSOBGET DB $0 XSOBPUT DB $0 X; XSOBUF DS SOBSIZ XSIBUF DS 256 XMEMEND = * XLEN = *-RSWRIT;LENGTH OF DRIVER=$6E2 X; X; AUTORUN.SYS PROGRAM TO INSTALL THE RS232 HANDLER X; X; TURN OFF DTR FIRST X; XSTART LDA #$80 X LDX #$55 X JSR SETBIT X; X; RELOCATE ABSOLUTE INSTRUCTION ADDRESSES AND VECTORS X; X SEC X LDA #LOW[RSWRIT] X STA SPTR X SBC MEMTOP X STA DIF X LDA #HIGH[RSWRIT] X STA SPTR+1 X SBC MEMTOP+1 X STA DIF+1 X LDX #0 XRELOOP CLC X LDA RELTAB,X X BEQ M256 X ADC SPTR X STA SPTR X BCC NOCY1 XM256 INC SPTR+1 X BCC NOREL1 XNOCY1 LDY #0 X SEC X LDA (SPTR),Y X SBC DIF X STA (SPTR),Y X INY X LDA (SPTR),Y X SBC DIF+1 X STA (SPTR),Y XNOREL1 INX X CPX #RELTSZ X BCC RELOOP X; X; RELOCATE HIGH/LOW IMMEDIATE MEMORY REFERENCES X; X LDX #0 XSCRELP LDA HRELT,X X STA SPTR X LDA LRELT,X X STA DPTR X INX X LDA HRELT,X X STA SPTR+1 X LDA LRELT,X X STA DPTR+1 X INX X LDY #0 X SEC X LDA (DPTR),Y X SBC DIF X STA (DPTR),Y X LDA (SPTR),Y X SBC DIF+1 X STA (SPTR),Y X CPX #HLRTSZ X BCC SCRELP X; X; REDEFINE DOSINIT VECTOR IN ZERO PAGE X; X LDA DOSINI X STA RSINIT+1 X LDA DOSINI+1 X STA RSINIT+2 XLR007 LDA #LOW[RSINIT] X STA DOSINI XHR007 LDA #HIGH[RSINIT] X STA DOSINI+1 X; X; COPY HANDLER DOWN TO ITS RESIDENT MEMORY AREA X; X LDA MEMTOP X STA DPTR X LDA MEMTOP+1 X STA DPTR+1 X LDA #LOW[RSWRIT] X STA SPTR X LDA #HIGH[RSWRIT] X STA SPTR+1 X LDX #HIGH[LEN+255] X LDY #0 XMVLOOP LDA (SPTR),Y X STA (DPTR),Y X INY X BNE MVLOOP X INC SPTR+1 X INC DPTR+1 X DEX X BNE MVLOOP XREL059 JMP RSINIT+3 X; X; RELOCATION TABLE FOR ABSOLUTE INSTRUCTIONS X; XRELTAB DB REL001+1-RSWRIT X DB REL002-REL001 X DB REL003-REL002 X DB REL004-REL003 X DB OUTASCI-REL004 X DB OUTREAL-OUTASCI X DB BUFWAIT-OUTREAL X DB REL05X-BUFWAIT X DB REL005-REL05X X DB REL060-REL005 X DB REL006-REL060 X DB REL007-REL006 X DB REL008-REL007 X DB REL080-REL008 X DB REL081-REL080 X DB REL009-REL081 X DB REL090-REL009 X DB REL010-REL090 X DB REL100-REL010 X DB REL101-REL100 X DB NOPTST-REL101 X DB RSSTAT-NOPTST X DB REL011-RSSTAT X DB SNOOP-REL011 X DB STEXIT-SNOOP X DB REL111-STEXIT X DB REL112-REL111 X DB REL113-REL112 X DB REL114-REL113 X DB REL115-REL114 X DB RDSTLN-REL115 X DB REL012-RDSTLN X DB REL013-REL012 X DB RSOPEN-REL013 X DB REL130-RSOPEN X DB REL014-REL130 X DB RSCLOS-REL014 X DB REL140-RSCLOS X DB REL015-REL140 X DB REL016-REL015 X DB REL017-REL016 X DB REL180-REL017 X DB REL181-REL180 X DB REL019-REL181 X DB REL020-REL019 X DB RSTRVC-REL020 X DB REL021-RSTRVC X DB REL022-REL021 X DB RSCCIO-REL022 X DB NCCMOD-RSCCIO X DB REL023-NCCMOD X DB SETCC-REL023 X DB REL024-SETCC X DB REL025-REL024 X DB REL026-REL025 X DB ISFAIL-REL026 X DB REL027-ISFAIL X DB REL280-REL027 X DB REL281-REL280 X DB REL282-REL281 X DB REL283-REL282 X DB REL028-REL283 X DB REL029-REL028 X DB REL030-REL029 X DB REL031-REL030 X DB REL032-REL031 X DB REL033-REL032 X DB REL034-REL033 X DB REL035-REL034 X DB REL036-REL035 X DB REL037-REL036 X DB REL038-REL037 X DB REL039-REL038 X DB STMON-REL039 X DB REL040-STMON X DB REL041-REL040 X DB REL042-REL041 X DB XIOXIT-REL042 X DB RSCTL-XIOXIT X DB REL043-RSCTL X DB REL044-REL043 X DB NOCTLC-REL044 X DB SETBIT-NOCTLC X DB REL045-SETBIT X DB REL046-REL045 X DB REL047-REL046 X DB REL048-REL047 X DB REL049-REL048 X DB REL050-REL049 X DB REL051-REL050 X DB REL500-REL051 X DB REL501-REL500 X DB REL052-REL501 X DB REL053-REL052 X DB REL530-REL053 X DB REL054-REL530 X DB REL055-REL054 X DB REL550-REL055 X DB REL056-REL550 X DB REL560-REL056 X DB REL561-REL560 X DB REL562-REL561 X DB REL563-REL562 X DB UPDERR-REL563 X DB REL564-UPDERR X DB OPNCHK-REL564 X DB TSTBKY-OPNCHK X DB REL057-TSTBKY X DB REL058-REL057 X DB NOBREAK-REL058 X DB RSVECT-1-NOBREAK,2 X DB 2,2 X DB 2,2 X DB 2,2 X DB 2,2 X DB 2 X DB 2,2,2 X DB 0,0,REL059+1-VECEND-512 XRELTSZ = *-RELTAB X; X; HIGH/LOW IMMEDIATE MEMORY REFERENCE TABLE X; XHRELT DW HR001+1 X DW HR004+1 X DW HR005+1 X DW HR006+1 X DW HR008+1 X DW HR009+1 X DW HR007+1 XHLRTSZ = *-HRELT X; XLRELT DW LR001+1 X DW LR004+1 X DW LR005+1 X DW LR006+1 X DW LR008+1 X DW LR009+1 X DW LR007+1 X; X END START, SHAR_EOF sed 's/^X//' << \SHAR_EOF > hd_diff X*** atr232.asm X--- atr232hd.asm X*************** X*** 239,245 **** X HR001 LDY #HIGH[Z80STAT] X LR001 LDA #LOW[Z80STAT] X REL012 JSR XFER X! LDY #$DE X REL013 JSR ZZSET ;DO LAST PART OF ZSET X LDA #'R' ;READ STATUS BACK TO ATARI X STA DCMD X--- 239,245 ---- X HR001 LDY #HIGH[Z80STAT] X LR001 LDA #LOW[Z80STAT] X REL012 JSR XFER X! LDY #$EF X REL013 JSR ZZSET ;DO LAST PART OF ZSET X LDA #'R' ;READ STATUS BACK TO ATARI X STA DCMD X*************** X*** 506,512 **** X LDY #'G' X BNE ZCMDO X ; X! ZSET LDY #$DC ;POINT TO $DC00 X ZZSET STY DAUX+1 ;POINT TO ANY PAGE X LDY #'S' X ZCMDO STY DCMD X--- 506,512 ---- X LDY #'G' X BNE ZCMDO X ; X! ZSET LDY #$EC ;POINT TO $EC00 X ZZSET STY DAUX+1 ;POINT TO ANY PAGE X LDY #'S' X ZCMDO STY DCMD X*************** X*** 702,708 **** X DB $07 ;RLCA X DB $D3,$51 ;OUT (51H),A X DB $A0 ;AND B X! DB $C2,$0D,$DC ;JP NZ,CCIOLP X DB $3E,$FF ;LD A,0FFH X DB $D3,$51 ;OUT (51H),A X DB $C3,$C6,$F7 ;JMP PWRWAIT+8 X--- 702,708 ---- X DB $07 ;RLCA X DB $D3,$51 ;OUT (51H),A X DB $A0 ;AND B X! DB $C2,$0D,$EC ;JP NZ,CCIOLP X DB $3E,$FF ;LD A,0FFH X DB $D3,$51 ;OUT (51H),A X DB $C3,$C6,$F7 ;JMP PWRWAIT+8 X*************** X*** 715,721 **** X DB $C9 ;RET X ; X Z80STAT DB $DB,$50 ;IN A,(050H) X! DB $32,$01,$DE ;LD ($DE01),A X DB $C9 ;RET X ; X ; BAUD RATE TABLES X--- 715,721 ---- X DB $C9 ;RET X ; X Z80STAT DB $DB,$50 ;IN A,(050H) X! DB $32,$01,$EF ;LD ($EF01),A X DB $C9 ;RET X ; X ; BAUD RATE TABLES SHAR_EOF sed 's/^X//' << \SHAR_EOF > hx_diff X*** atr232.asm X--- atr232hx.asm X*************** X*** 239,245 **** X HR001 LDY #HIGH[Z80STAT] X LR001 LDA #LOW[Z80STAT] X REL012 JSR XFER X! LDY #$DE X REL013 JSR ZZSET ;DO LAST PART OF ZSET X LDA #'R' ;READ STATUS BACK TO ATARI X STA DCMD X--- 239,245 ---- X HR001 LDY #HIGH[Z80STAT] X LR001 LDA #LOW[Z80STAT] X REL012 JSR XFER X! LDY #$E2 X REL013 JSR ZZSET ;DO LAST PART OF ZSET X LDA #'R' ;READ STATUS BACK TO ATARI X STA DCMD X*************** X*** 506,512 **** X LDY #'G' X BNE ZCMDO X ; X! ZSET LDY #$DC ;POINT TO $DC00 X ZZSET STY DAUX+1 ;POINT TO ANY PAGE X LDY #'S' X ZCMDO STY DCMD X--- 506,512 ---- X LDY #'G' X BNE ZCMDO X ; X! ZSET LDY #$E0 ;POINT TO $E000 X ZZSET STY DAUX+1 ;POINT TO ANY PAGE X LDY #'S' X ZCMDO STY DCMD X*************** X*** 690,696 **** X ; CONCURRENT I/O ROUTINE TO DOWNLOAD TO Z80 X ; X CCIO DB $F3 ;DI X! DB $CD,$68,$F0 ;CALL SHUTDOWN X DB $3E,$21 ;LD A,00100001B X DB $D3,$83 ;OUT (CTC3),A X DB $32,$2E,$FF ;LD (DRVOFF),A X--- 690,696 ---- X ; CONCURRENT I/O ROUTINE TO DOWNLOAD TO Z80 X ; X CCIO DB $F3 ;DI X! DB $EA,$EA,$EA ;$CD,$68,$F0 ;(DID)CALL SHUTDOWN X DB $3E,$21 ;LD A,00100001B X DB $D3,$83 ;OUT (CTC3),A X DB $32,$2E,$FF ;LD (DRVOFF),A X*************** X*** 702,708 **** X DB $07 ;RLCA X DB $D3,$51 ;OUT (51H),A X DB $A0 ;AND B X! DB $C2,$0D,$DC ;JP NZ,CCIOLP X DB $3E,$FF ;LD A,0FFH X DB $D3,$51 ;OUT (51H),A X DB $C3,$C6,$F7 ;JMP PWRWAIT+8 X--- 702,708 ---- X DB $07 ;RLCA X DB $D3,$51 ;OUT (51H),A X DB $A0 ;AND B X! DB $C2,$0D,$E0 ;JP NZ,CCIOLP X DB $3E,$FF ;LD A,0FFH X DB $D3,$51 ;OUT (51H),A X DB $C9 ;$C3,$C6,$F7 ;(DID)JMP PWRWAIT+8 X*************** X*** 705,711 **** X DB $C2,$0D,$DC ;JP NZ,CCIOLP X DB $3E,$FF ;LD A,0FFH X DB $D3,$51 ;OUT (51H),A X! DB $C3,$C6,$F7 ;JMP PWRWAIT+8 X CCIOL = *-CCIO X ; X Z80CTL DB $3E ;LD A,0FFH X--- 705,711 ---- X DB $C2,$0D,$E0 ;JP NZ,CCIOLP X DB $3E,$FF ;LD A,0FFH X DB $D3,$51 ;OUT (51H),A X! DB $C9 ;$C3,$C6,$F7 ;(DID)JMP PWRWAIT+8 X CCIOL = *-CCIO X ; X Z80CTL DB $3E ;LD A,0FFH X*************** X*** 715,721 **** X DB $C9 ;RET X ; X Z80STAT DB $DB,$50 ;IN A,(050H) X! DB $32,$01,$DE ;LD ($DE01),A X DB $C9 ;RET X ; X ; BAUD RATE TABLES X--- 715,721 ---- X DB $C9 ;RET X ; X Z80STAT DB $DB,$50 ;IN A,(050H) X! DB $32,$01,$E2 ;LD ($E201),A X DB $C9 ;RET X ; X ; BAUD RATE TABLES SHAR_EOF sed 's/^X//' << \SHAR_EOF > atr8500.asm X TITLE 'ATR8500 AUTORUN.SYS INITIALIZER FOR RS232 I/O' X; X; X; ATR 8000 AUTORUN.SYS by C.Marslett X; modified by Richard Morris for the ATR 8500 X; 918-437-7479 (2/23/86) X; X; X; WORK AREA FOR AUTORUN PROGRAM X; XORIGIN = $3400 XDIF = $D4 XSPTR = $D6 XDPTR = $D8 X; XMEMTOP = $02E7 X; X; CONFIGURATION DATA X; XSOBSIZ = 32 ;32 BYTE OUTPUT BUFFER X; X; DRIVER DATA AREAS X; XPOKMSK = $10 XBRKKEY = $11 XRTCLOK = $12 XDCMDZ = $22 XDAUX1Z = $2A XDAUX2Z = $2B XRSDATA = $43 ;DATA BYTE NOT BUFFERED YET XERRFLGS = $44 ;ERROR STATUS XRSDONE = $45 ;IF = 0, RS232 PORT IS ACTIVE XSIBGET = $46 XSIBPUT = $47 XSOBGET = $48 XSOBPUT = $49 X; XVSERIN = $020A XVIMIRQ = $0216 XCDTMV3 = $021C XCDTMF3 = $022A XSSKCTL = $0232 XDVSTAT = $02EA XDDEVIC = $0300 XDUNIT = $0301 XDCMD = $0302 XDSTAT = $0303 XDBUF = $0304 XDTIMEO = $0306 XDLEN = $0308 XDAUX = $030A XHATABS = $031A XWBITMP = $1629 X; XAUDF1 = $D200 XAUDCTL = $D208 XSKRES = $D20A XSERIN = $D20D XSEROUT = $D20D XIRQEN = $D20E XSKCTL = $D20F XPBCTL = $D303 X; XSIOV = $E459 X; X; WRITE A BYTE TO THE RS232 PORT X; X ORG ORIGIN XRSWRIT STA RSDATA ;SAVE DATA BYTE X LDA #$88 XREL001 JSR OPNCHK ;CAN WE WRITE TO THIS CHANNEL? X; XREL002 LDA CTLBYTE X AND #$30 X TAY X CMP #$20 X BCS OUTASCI ;IF NO TRANSLATE X LDA RSDATA X CMP #$9B ;ATASCII CARRIAGE RETURN X BNE NOXLEL X LDA #$0D ;ASCII CARRIAGE RETURN XREL003 JSR OUTBYTE X BMI EREXIT ;IF ERROR, RETURN IT XREL004 LDA CTLBYTE X ASL A ;AUTO LF DESIRED? X BPL NOXMIT ;IF NO AUTO LF, DONE! X LDA #$0A X BNE OUTBYTE X; XNOXLEL AND #$7F ;GET RID OF REVERSE VIDEO BIT X DEY ;HEAVY XLATE? X BMI OUTBYTE ;IF LIGHT XLATE, NO MORE TESTING X; X CMP #$20 ;ELSE, CONTROL CODE? X BCC NOXMIT ;IF SO, DONE! X CMP #$7D ;RUBOUT, TILDE, OR ??? X BCC OUTBYTE ;IF NOT, SEND IT XNOXMIT LDY #1 ;ELSE, DONE XEREXIT RTS X; XOUTBYTE STA RSDATA ;SAVE DATA BYTE XOUTASCI LDA CTLBYTE X AND #$03 X CMP #3 X BNE OUTREAL ;LEAVE PARITY UNCHANGED X ASL RSDATA ;DISCARD PARITY BIT X SEC X ROR RSDATA ;FORCE MARK PARITY IF CY=1 XOUTREAL LDY SOBPUT X INY X CPY #SOBSIZ X BCC BUFWAIT X LDY #0 XBUFWAIT JSR TSTBKY ;SEE IF BREAK PRESSED (ABORT) X CPY SOBGET ;ELSE, IS BUFFER FULL? X BEQ BUFWAIT ;IF SO, WAIT FOR ROOM X; X LDA RSDATA ;GET BYTE TO SEND XREL005 STA SOBUF,Y ;AND SAVE IN BUFFER X STY SOBPUT X; X SEI X LDA #$08 ;ENABLE ONLY END OF TRANSMIT INT. X LDY #$00 XREL007 JSR SETMSK X CLI ;REENABLE INTERRUPTS AGAIN X; X INY ;Y=1, RETURN GOOD STATUS X RTS X; XRSREAD LDA #$84 XREL008 JSR OPNCHK X LDY SIBGET X CPY SIBPUT ;BYTE IN BUFFER? X BEQ RSREAD ;IF NOT, WAIT FOR IT XREL009 LDA SIBUF,Y ;COPY BYTE FROM BUFFER X INY X STY SIBGET X STA RSDATA ;TO RETURN AREA X; X; STRIP PARITY IF REQUIRED X; XREL010 LDA CTLBYTE X AND #$0C ;TEST INCOMING PARITY? X CMP #$0C X BNE NOPTST ;NO PARITY TESTING X ASL RSDATA ;CLEAR PARITY BIT IN RSDATA X LSR RSDATA X; X; DO LIGHT OR HEAVY TRANSLATION IF REQUIRED X; XNOPTST LDA CTLBYTE X AND #$30 X TAY X LDA RSDATA ;LOAD DATA BYTE X CPY #$20 X BCS NOXIN X AND #$7F ;INSURE PARITY IS CLEARED X CMP #$0D ;IF CR, REPLACE WITH $9B X BNE NOTCRIN X LDA #$9B XNOTCRIN DEY ;ELSE, DONE IF LIGHT XLATE X BMI NOXIN X CMP #$20 ;OR TEST FOR PORTABILITY IF HEAVY X BCC NOTPOR X CMP #$7D ;20-7C ARE PORTABLE X BMI NOXIN ;THE REST ARE CONVERTED TO CANT XNOTPOR LDA CANT X; X; THEN RETURN DATA BYTE TO ROM OS X; XNOXIN LDY #1 ;ELSE, LEAVE IT AS IT IS X RTS X; X; READ STATUS BYTES FOR A CHANNEL X; XRSSTAT BIT CHSTAT X BMI SNOOP XREL011 BIT CCSTAT X BPL RETSTA XSNOOP JSR RDSTLN X BMI NO8000 X LDA LOCST X LSR A X LSR A X LSR A X AND #$07 ;EXTRACT CONTROL LINES X TAY X LDA STRET,Y X STA DVSTAT+1 X LDX #0 X STX DVSTAT+3 X LDA DVSTAT+2 X LDA LOCST X BPL NOBRK X DEC DVSTAT+1 XNOBRK EOR #$FF X AND MON1 X BEQ STEXIT X AND #$04 XSTEXIT ORA ERRFLGS ;MERGE WITH ERROR FLAGS X STA DVSTAT X LDY #0 X STY ERRFLGS X STY DVSTAT+2 X INY XCANNOT RTS X; XRETSTA SEC X LDA SIBPUT X SBC SIBGET X STA DVSTAT+1 X SEC X LDA SOBPUT X SBC SOBGET X STA DVSTAT+3 X LDA #0 X BEQ STEXIT X; XNO8000 LDA #$0F X BNE STEXIT X; XRDSTLN LDY #HIGH[SIOSUP] X LDA #LOW[SIOSUP] X LDX #$E2 X JSR XFER X BMI CANNOT X LDX #$E2 X STX DAUX+1 X LDX #$FD X STX DAUX X LDY #0 X STY DLEN X LDA #'S' X JSR RDSET ;DO LAST PART OF XFER X LDA #HIGH[LOCST] X STA DBUF+1 X LDA #LOW[LOCST] X STA DBUF X LDA #'R' ;SET COMMAND X LDY #$40 ;DIRECTION AND X LDX #3 ;READ 3 BYTES X STA DLEN+1 X JMP SIORW X; X; OPEN THE RS232 PORT X; XRSOPEN LDA CHSTAT X BMI NOTOPN X LDY #150 ;PORT ALREADY OPEN X RTS X; XNOTOPN LDY #0 X STY ERRFLGS X LDA DAUX1Z ;SAVE AUX1 AS PORT STATE X ORA #$40 ;MARK PORT OPEN XREL014 STA CHSTAT ;AND NOT ACTIVE X INY X RTS X; X; CLOSE THE RS232 PORT X; XRSCLOS BIT CHSTAT X BVS SMPLCL ;IF NOT CCIO TO SHUT DOWN X LDA BRKKEY X BEQ SMPLCL X LDA RSDONE X BEQ RSCLOS ;IF NOT DONE YET, LOOP X CLC X LDA RTCLOK+2 X ADC #6 XRSCLWT CMP RTCLOK+2 X BNE RSCLWT X; X; RESTORE INTERRUPT HANDLING WITHOUT INTERRUPTS X; X SEI XREL015 JSR SHUTDN X CLI XSMPLCL LDY #$C0 XREL016 STY CCSTAT XREL017 STY CHSTAT X LDY #1 X RTS XSHUTDN LDA #$34 ;ASSERT COMMAND LINE X STA PBCTL X LDA #0 X STA SOBGET X STA SOBPUT XREL019 LDA SYSIRQ ;RESTORE SYSTEM IRQ VECTOR X STA VIMIRQ XREL020 LDA SYSIRQ+1 X STA VIMIRQ+1 X; X LDY #6 ;RESTORE 3 XRSTRVC LDA OLDISRS-1,Y ;SERIAL ISR VECTORS X STA VSERIN-1,Y X DEY X BNE RSTRVC X LDA #$3C ;CLEAR COMMAND LINE X LDY #128 X STY BRKKEY X STA PBCTL X RTS X X; CONFIGURE AN RS232 CHANNEL X; XRSXIO LDA DCMDZ X AND #$0F X CMP #9 X BCS RCMDER X TAY X LSR A X BCS RCMDER XREL021 LDA XIOTAB+1,Y X PHA XREL022 LDA XIOTAB,Y X PHA X RTS ;VECTOR TO XIO ROUTINE X; XSHTDWM LDA #$04 X ORA ERRFLGS X STA ERRFLGS X LDY #139 X BMI ISFAIL X; XRCMDER LDY #132 ;INVALID COMMAND X BMI ISFAIL X; X; START CONCURRENT MODE I/O X; XRSCCIO BIT CHSTAT X BPL CCNOPN X LDY #133 ;IOCB NOT OPEN X BMI ISFAIL X; XCCNOPN BVS SETCC X LDY #153 ;CONCURRENT MODE I/O ACTIVE ERROR CODE X BMI ISFAIL X; X; FREE UP BUFFERS FROM DISK I/O USAGE X; XSETCC JSR WBITMP X; X; BRING UP TRANSFER FUNCTION IN ATR8500 X; X LDA CR5 X AND #$EF ;STOP SENDING BREAK IF NEED BE X STA CR5 X JSR RDSTLN ;SETUP BAUD RATE, ETC. X LDA LOCST X AND #0 XMON1 = *-1 X BNE SHTDWM XHR004 LDY #HIGH[CCIO] XLR004 LDA #LOW[CCIO] X LDX #$E3 X JSR XFER ;START COMMUNICATING X BPL SETISR XISFAIL JMP XIOXIT X; X; SET UP SERIAL I/O IN ATARI X; XSETISR LDY #0 XREL027 STY CCSTAT X LDA #$73 ;SET 2-CLOCK ASYNC. XFER, X SEI X STY SOBGET X STY SOBPUT X STY SIBGET X STY SIBPUT X STA SKCTL ;KEYBOARD ACTIVE X; X LDA #$78 X STA AUDCTL X STA AUDF1+2 X STA AUDF1+6 X LDA #40 X STA AUDF1 X STA AUDF1+4 X LDA #$A0 X STA AUDF1+1 X STA AUDF1+3 X STA AUDF1+5 X STA AUDF1+7 X; X LDY #6 XHISISR LDA VSERIN-1,Y ;SAVE SYSTEM ISRS XREL031 STA OLDISRS-1,Y XREL032 LDA ISRTBL-1,Y ;AND INSERT MINE X STA VSERIN-1,Y X DEY X BNE HISISR X LDA VIMIRQ ;TAKE OVER IRQ VECTOR XREL033 STA SYSIRQ XLR005 LDA #LOW[BRKIRQ] X STA VIMIRQ X LDA VIMIRQ+1 XREL034 STA SYSIRQ+1 XHR005 LDA #HIGH[BRKIRQ] X STA VIMIRQ+1 XREL035 LDA CHSTAT ;CCIO NOW ACTIVE! X AND #$BF ;TURN OFF BIT 6 XREL036 STA CHSTAT X AND #$04 X BEQ NOINPT ;IF NO INPUT ALLOWED,SKIP ENABLING X LDA #$20 ;ELSE, ENABLE SERIAL INTERRUPTS XNOINPT INY XREL037 JSR SETMSK X CLI ;REENABLE INTERRUPTS X LDY #1 X BPL ISFAIL X; X; SET BAUD RATE AND NO. OF STOP BITS X; XRSBAUD LDA CR4 X AND #$F7 X STA CR4 X LDA DAUX1Z ;THIS JUST SAVES BAUD X BPL SGLSTOP X LDA CR4 X ORA #$08 X STA CR4 XSGLSTOP LDA DAUX1Z X AND #$30 X LSR A X LSR A X LSR A X LSR A X TAY X LDA CR5 X AND #$9F X ORA WSIZE,Y X STA CR5 X LDA CR3 X LDA DAUX1Z X AND #$0F X TAY X LDX BDIV,Y X STX TC2 X LSR A X LSR A X TAY X LDA CR4 X AND #$3F X ORA CR4TAB,Y X STA CR4 X LDA DAUX2Z X AND #$07 X TAY X LDA CTLINS,Y X STA MON1 X JMP RTNOK X; XWSIZE DB $60,$20,$40,$00 XCTLINS DB $00,$20,$00,$20 X DB $10,$30,$10,$30 XSTRET DB $01,$31,$01,$31 X DB $CD,$FD,$CD,$FD X; X; SET TRANSLATE MODE AND PARITY X; XRSXLAT LDA CR4 X AND #$FC X TAY X LDA DAUX1Z ;SAVE TRANSLATION PARAMETERS X STA CTLBYTE X AND #3 X CMP #1 X BEQ SPODD X CMP #2 X BNE SPOFF X INY X INY XSPODD INY XSPOFF STY CR4 ;SET PARITY CONTROL BITS X LDA DAUX2Z ;SAVE UNTRANSLATABLE CODE XREL042 STA CANT XRTNOK LDY #1 X; X; COMMON XIO CALL EXIT X; XXIOXIT LDA CHSTAT ;RESTORE AUX1 FOR R/W ACTIVITY X STA DAUX1Z X TYA ;SET CONDITION CODE FOR CALLER XFAILED RTS X; X; CONTROL THE RS232 CONTROL LINES: X; DTR, RTS, AND TD (TRANSMIT DATA) X; XRSCTL LDX CR5 X LDA DAUX1Z X AND #3 X LSR A X TXA X AND #$EF X BCS SETMRK X ORA #$10 XSETMRK TAX XNOCDAT LDA DAUX1Z X AND #$30 X BEQ NOCRTS X CMP #$30 X TXA X ORA #$80 X BCS SETRTS X AND #$7F XSETRTS TAX XNOCRTS BIT DAUX1Z X BPL NOCDTR X TXA X ORA #$02 X BVS SETDTR X AND #$FD XSETDTR TAX XNOCDTR STA CR5 X BIT CHSTAT X BVS BLKCTL ;IF CCIO NOY ACTIVE NOW X LDY #153 ;WE BE TEMPORARILY 850 COMPATIBLE X BMI XIOXIT X; X; XSETBIT STX PINSEL X ASL A X LDA #0 X ROL A XREL045 STA LEVEL XREL046 JSR ZSET X BMI FAILED XBLKCTL LDX #$E2 XHR006 LDY #HIGH[SIOSUP] XLR006 LDA #LOW[SIOSUP] X; X; X; ATR8500 SERIAL I/O ROUTINES X; XXFER STY DBUF+1 X STA DBUF X STX DAUX+1 ;POINT TO PAGE BEING LOADED X JSR ZZSET ;POINT TO Z80 BUFFER X BMI XIOXIT X LDA #'W' X LDY #$80 X LDX #CCIOL XREL047 JSR SIORW ;LOAD CODE INTO IT X BMI XIOXIT X JSR ZZSET X LDA #'G' X JSR ZCMD ;THEN RUN THE CODE X JMP XIOXIT X; XZSET LDA #$EC ;POINT TO $E000 X; XZZSET LDA #'S' ;SET Z80 MEMORY ADDRESS XZCMD LDY #$00 X LDX #$0 XSIORW STX DAUX X STX DLEN XRDSET STA DCMD X STY DSTAT X LDY #0 X STY DLEN+1 X INY X STY DUNIT X INY X STY DTIMEO X LDY #'Z' X STY DDEVIC X JMP SIOV X; XBRKIRQ BIT IRQEN ;BREAK KEY PRESSED X BPL HAVEBK ;IF SO, HANDLE IT XREL048 JMP (SYSIRQ) ;ELSE, LET ROM HANDLE IT X; XHAVEBK PHA X TYA X PHA XREL049 JSR SHUTDN X ASL BRKKEY X LDA #$40 XREL050 ORA CHSTAT ;SET CCIO-INACTIVE BIT XREL051 STA CHSTAT X BNE INTRET X; XISXOFF INC XONXOF X LDA POKMSK X STA IRQEN X BNE INTRET X; XRSSERO CLD X TYA X PHA X LDY SOBGET X CPY SOBPUT X BNE NALDON ;IF NOT DONE THEN SEND NEXT BYTE X LDA POKMSK X AND #$E7 ;TURN OFF OUTPUT INTERRUPTS X LDY #1 ;NEW VALUE OF RSDONE XREL052 JSR OUTMSK ;UPDATE POKMSK, IRQEN AND RSDONE X BNE INTRET X; XNALDON BIT XONXOF X BMI ISXOFF ;DON'T SEND THAT BYTE! X INY ;POINT TO NEXT BYTE XREL053 LDA SOBUF,Y X STY SOBGET XSNDOUT STA SEROUT ;SEND BYTE TO RS232 PORT XINTRET PLA X TAY X PLA X RTI X; XRSSERI CLD X TYA X PHA X LDA SERIN ;READ BYTE FROM HARDWARE X CMP #$1F X BEQ SETESC X CMP #$13 X BEQ SETXOF X CMP #$11 X BEQ CLRXOF X ASL ESCFLG X BCC SAVIB X AND #$1F XSAVIB LDY SIBPUT ;GET BUFFER POINTER X STA SIBUF,Y ;SAVE BYTE IN BUFFER X INY X STY SIBPUT X LDA SKCTL X STA SKRES X EOR #$FF ;REPORT FRAMING OR X AND #$C0 ;OTHER HARDWARE ERRORS X ORA ERRFLGS X CPY SIBGET ;BUFFER OVERFLOW? X BNE UPDERR ;IF NOT SAVE GET POINTER X INY X ORA #$10 ;SET OVERRUN FLAG X STY SIBGET ;ERASE OLDEST BYTE IN BUFFER XUPDERR STA ERRFLGS X; X PLA X TAY X PLA X RTI X; XSETESC ROR ESCFLG X BMI FLSHIN X; XSETXOF ROR XONXOF X BMI FLSHIN X; XCLRXOF AND XONXOF X BEQ NORST X LDA POKMSK X ORA #$10 X STA POKMSK X STA IRQEN X LDA #0 X STA XONXOF X JMP XIOXIT X; XNORST STA XONXOF XFLSHIN LDA SKCTL X STA SKRES X EOR #$FF X AND #$C0 X ORA ERRFLGS X JMP UPDERR X; X; UPDATE POKMSK, IRQEN AND RSDONE X; XSETMSK ORA POKMSK ;MERGE IN OLD BITS XOUTMSK STA POKMSK X STA IRQEN ;UPDATE HARDWARE REGISTER X STY RSDONE ;UPDATE DONE FLAG X RTS X; X; TEST FOR RS232 PORT NOT OPEN OR BREAK PRESSED X; XOPNCHK BIT CHSTAT ;IS ACTION VALID? X BEQ ERRNWR ;IF OPERATION NOT ENABLED X BMI ERRNOP ;IF NOT OPEN X; X; FIELD A BREAK KEY PRESSED WHEN RS232 X; CHANNEL IS ACTIVE. X; XTSTBKY BIT CHSTAT ;IN CCIO? X BMI ERRNOP ;NOT EVEN OPEN X BVC INCCIO XREL057 LDA CCSTAT X BMI NOBREAK X LDY #$80 X STY BRKKEY XREL058 STY CCSTAT X; X DB $2C ;SKIP TO 'BKABRT' XERRNWR TAY ;WRITE NOT ENABLED X DEY ;I.E. $87 X DB $2C ;SKIP TO 'BKABRT' XERRNOP LDY #133 ;NOT OPEN ERROR XBKABRT PLA ;ELSE, FLUSH RETURN ADDRESS X PLA X TYA XINCCIO RTS X; XNOBREAK JSR RSCCIO ;START UP CCIO X BMI BKABRT X RTS X; XRSVECT DW RSOPEN-1,RSCLOS-1 X DW RSREAD-1,RSWRIT-1 X DW RSSTAT-1,RSXIO-1 X; XXIOTAB DW RCMDER-1,RSCTL-1 X DW RSBAUD-1,RSXLAT-1 X DW RSCCIO-1 X; XISRTBL DW RSSERI ;VALUES FOR INTERRUPT VECTORS X DW RSSERO X DW RSSERO X; X; X; SETUP Z80 SIO CHIP AND BAUD RATE CLOCK X; XSIOSUP DB $DB,$43 ;IN A,(MODEM+2) X DB $32,$FE,$E2 ;LD (STAT+1),A X DB $3E,$01 ;LD A,1 X DB $D3,$43 ;OUT (MODEM+2),A X DB $DB,$43 ;IN A,(MODEM+2) X DB $32,$FF,$E2 ;LD (STAT+2),A X DB $21,TC1-SIOSUP,$E2 ;LD HL,SUPTBL X DB $01,$21,$02 ;LD BC,CTC1+2*256 X DB $ED,$B3 ;OTIR X DB $01,$43,$09 ;LD BC,SIOCTL+9*256 X DB $ED,$B3 ;OTIR X DB $DB,$43 ;IN A,(MODEM+2) X DB $32,$FD,$E2 ;LD (STAT),A X DB $C9 ;RET X; XTC1 DB $47 XTC2 DB $80 ;300 BPS X DB 0,4 XCR4 DB $44 ;NO PARITY, 1 STOP BIT X DB 3 XCR3 DB $C1 ;8 BIT RX CHAR X DB 5 XCR5 DB $EA ;8 BIT TX CHAR. RTS,DTR SET X DB $30 ;CLEAR ERRORS X DB $10 ;CHECK STATUS LINES XSIOSL = *-SIOSUP X; X; CONCURRENT I/O ROUTINE TO DOWNLOAD TO Z80 X; XCCIO DB $06 ;LD BO X DB $48 ;LD C,B X DB $58 ;LD E,B X DB $68 ;LD L,B X DB $C5 ;PUSH BC X DB $26,$E1 ;LOOP LD H,0E1H X DB $54 ;LD D,H X DB $3E,$10 ;LD A,010H X DB $D3,$42 ;OUT (ATARI+2),A X DB $DB,$42 ;IN A,(ATARI+2) X DB $CB,$57 ;BIT 2,A X DB $28,$14 ;JR Z,NOXMA X DB $05 ;DEC B X DB $04 ;INC B X DB $28,$10 ;JR Z.NOXMA X DB $7E ;LD A,ESC X DB $FE,$20 ;CP 020H X DB $30,$07 ;JR NC,OUTOK X DB $F6,$40 ;OR 040H X DB $77 ;LD (HL),A X DB $3E,$1F ;LD A,ESC X DB $18,$02 ;JR SAYIT X DB $2C ;OUTOK INC L X DB $05 ;DEC B X DB $D3,$40 ;SAYIT OUT (ATARI),A X DB $DB,$43 ;NOXMA IN A,(MODEM+2) X DB $CB,$47 ;BIT 0,A X DB $28,$05 ;JR Z,CNTRX X DB $DB,$41 ;IN A,(MODEM) X DB $12 ;LD (DE),A X DB $1C ;INC E X DB $04 ;INC B X DB $63 ;CNTRX LD H,E X DB $E3 ;EX (SP),HL X DB $5C ;LD E,H X; X DB $26,$E0 ;LD H,0E0H X DB $54 ;LD D,H X DB $DB,$43 ;IN A,(MODEM+2) X DB $CB,$57 ;BIT 2,A X DB $28,$10 ;JR Z,NOXMM X DB $0D ;DEC C X DB $0C ;INC C X DB $28,$0C ;JR Z,NOXMM X DB $7E ;LD A,(HL) X DB $D3,$41 ;OUT (MODEM),A X DB $2C ;INC L X DB $0D ;DEC C X DB $79 ;LD A,C X DB $E6,$FC ;AND OFCH X DB $FE,$7C ;CP 07CH X DB $28,$35 ;JR Z,RESUM X DB $DB,$42 ;NOXMM IN A,(ATARI+2) X DB $CB,$6F ;BIT 5,A X DB $28,$1F ;JR Z,EXIT X DB $CB,$47 ;BIT 0,A X DB $28,$0A ;JR Z,CANTTX X DB $79 ;LD A,C X DB $FE,$F0 ;CP 240 X DB $30,$0A ;JR NC,FULLBF X DB $DB,$40 ;FOK IN A,(ATARI) X DB $12 ;LD (DE),A X DB $1C ;INC E X DB $0C ;INC C X DB $63 ;CANTTX LD H,E X DB $E3 ;EX (SP),HL X DB $5C ;LD E,H X DB $18,$9F ;JR LOOP X; X DB $DB,$42 ;FULLBF IN A,(ATARI+2) X DB $CB,$57 ;BIT 2,A X DB $28,$FA ;JR Z,FULLBF X DB $3E,$13 ;LD A,XOFF X DB $D3,$40 ;OUT (ATARI),A X DB $18,$EA ;JR FOK X; X DB $D1 ;EXIT POP DE X DB $0C ;INC C X DB $0D ;EXLP DEC C X DB $C8 ;RET Z X DB $DB,$43 ;AWAIT IN A,(MODEM+2) X DB $CB,$57 ;BIT 2,A X DB $28,$FA ;JR Z,AWAIT X DB $7E ;LD A,(HL) X DB $D3,$41 ;OUT (MODEM),A X DB $2C ;INC L X DB $18,$F2 ;JR EXLP X; X DB $DB,$42 ;RESUM IN A,(ATARI+2) X DB $CB,$57 ;BIT 2,A X DB $28,$FA ;JR Z,RESUM X DB $3E,$11 ;LD A,XON X DB $D3,$40 ;OUT (ATARI),A X DB $18,$BF ;JR NOXMM XCCIOL = *-CCIO X; XZ80CTL DB $3E ;LD A,OFFH XLEVEL DB $FF X DB $D3 ;OUT (051),A XPINSEL DB $51 X DB $C9 ;RETURN X; XZ80STAT DB $DB ;IN A,(050H) X DB $32,$01,$EF ;LD ($EF01),A X DB $C9 ;RETURN X; X; BAUD RATE TABLES X; XBDIV DB 32 ;300 X DB 211 ;45.5 X DB 192 ;50 X DB 169 ;56.875 X DB 0 ;75 X DB 175 ;110 X DB 143 ;134.5 X DB 128 ;150 X DB 128 ;300 X DB 64 ;600 X DB 32 ;1200 X DB 21 ;1800 X DB 16 ;2400 X DB 8 ;4800 X DB 4 ;9600 X DB 4 ;19,200 BPS X; XCR4TAB DB $C4 ;300,45.5-56.875 X DB $84 ;75-150 X DB $44 ;300-1800 X DB $44 ;2400-19200 X; X XCHSTAT DB $C0 ;BIT 7=CHANNEL CLOSED X ; 6=CONCURRENT I/O INACTIVE X ; 3=OUTPUT MODE X ; 2=INPUT MODE X; XCTLBYTE DB 0 ;BIT 6=ADD LF TO CR (OUTPUT) X ;BITS 5-4=XLATE MODE X ;BITS 3-2=INPUT PARITY CTL X ;BITS 1-0=OUTPUT PARITY CONTROL XCANT DB 0 ;WONT TRANSLATE CHARACTER FOR HEAVY XLTER XLOCST DB 0,0,0 ;LOCAL COPY OF Z80 SIO STATUS BYTES XCCSTAT DB $80 ;IF -, STATUS IS NORMAL X ;IF -, BYTE COUNTS ARE IN STATUS XESCFLG DS 1 XXONXOF DS 1 XOLDISRS DS 6 ;VECTORS REPLACED IF CCIO ACTIVE XSYSIRQ DS 2 ;SIMULATED DOS ENTRY ADDRESS X; XSOBUF DS SOBSIZ XSIBUF DS 256 XLEN = *-RSWRIT;LENGTH OF DRIVER=$6E2 X; X; AUTORUN.SYS PROGRAM TO INSTALL THE RS232 HANDLER X; X; TURN OFF DTR FIRST X; XSTART LDA #$80 X LDX #$55 X JSR SETBIT X; X; RELOCATE ABSOLUTE INSTRUCTION ADDRESSES AND VECTORS X; X SEC X LDA #LOW[RSWRIT] X STA SPTR X SBC MEMTOP X STA DIF X LDA #HIGH[RSWRIT] X STA SPTR+1 X SBC MEMTOP+1 X STA DIF+1 X LDX #0 XRELOOP CLC X LDA RELTAB,X X BEQ M256 X ADC SPTR X STA SPTR X BCC NOCY1 XM256 INC SPTR+1 X BCC NOREL1 XNOCY1 LDY #0 X SEC X LDA (SPTR),Y X SBC DIF X STA (SPTR),Y X INY X LDA (SPTR),Y X SBC DIF+1 X STA (SPTR),Y XNOREL1 INX X CPX #RELTSZ X BNE RELOOP X; X; RELOCATE HIGH/LOW IMMEDIATE MEMORY REFERENCES X; X LDX #0 XSCRELP LDA HRELT,X X STA SPTR X LDA LRELT,X X STA DPTR X INX X LDA HRELT,X X STA SPTR+1 X LDA LRELT,X X STA DPTR+1 X INX X LDY #0 X SEC X LDA (DPTR),Y X SBC DIF X STA (DPTR),Y X LDA (SPTR),Y X SBC DIF+1 X STA (SPTR),Y X CPX #HLRTSZ X BNE SCRELP X; X; COPY HANDLER DOWN TO ITS RESIDENT MEMORY AREA X; X LDA MEMTOP X STA DPTR X LDA MEMTOP+1 X STA DPTR+1 X LDA #LOW[RSWRIT] X STA SPTR X LDA #HIGH[RSWRIT] X STA SPTR+1 X LDX #HIGH[LEN+255] X LDY #0 XMVLOOP LDA (SPTR),Y X STA (DPTR),Y X INY X BNE MVLOOP X INC SPTR+1 X INC DPTR+1 X DEX X BNE MVLOOP X; X; ADJUST TOP OF OS POINTER X; X CLC X LDA MEMTOP X ADC #LOW[LEN] X STA MEMTOP X LDA MEMTOP+1 X ADC #HIGH[LEN] X STA MEMTOP+1 X; X; INSTALL RS232 HANDLER IN HANDLER TABLE X; X LDY #0 XFNDSLT LDA HATABS,Y ;LOOK FOR EMPTY SLOT IN HANDLER TABLE X BEQ CLDSLT ;IF FOUND X CMP #'R' ;ALREADY PRESENT? X BEQ GOTSLT ;IF SO, REUSE IT X INY X INY X INY X CPY #30 ;END OF TABLE? X BCC FNDSLT X RTS ;YES, RETURN WITH CY=1 X; XCLDSLT XGOTSLT LDA #'R' ;DEVICE NAME IS 'R' X STA RSDONE X STA HATABS,Y X SEC X LDA #LOW[RSVECT] ;POINT TO RS232 HANDLER ENTRY TABLE X SBC DIF X STA HATABS+1,Y X LDA #HIGH[RSVECT] X SBC DIF+1 X STA HATABS+2,Y X LDY #1 X RTS X; X; RELOCATION TABLE FOR ABSOLUTE INSTRUCTIONS X; XRELTAB DB REL001+1-RSWRIT X DB REL002-REL001 X DB REL003-REL002 X DB REL004-REL003 X DB OUTASCI-REL004 X DB BUFWAIT-OUTASCI X DB REL005-BUFWAIT X DB REL007-REL005 X DB REL008-REL007 X DB REL009-REL008 X DB REL010-REL009 X DB NOPTST-REL010 X DB RSSTAT-NOPTST X DB REL011-RSSTAT X DB SNOOP-REL011 X DB RDSTLN-SNOOP X DB RSOPEN-RDSTLN X DB REL014-RSOPEN X DB RSCLOS-REL014 X DB REL015-RSCLOS X DB REL016-REL015 X DB REL017-REL016 X DB REL019-REL017 X DB REL020-REL019 X DB RSTRVC-REL020 X DB REL021-RSTRVC X DB REL022-REL021 X DB RSCCIO-REL022 X DB SETCC-RSCCIO X DB ISFAIL-SETCC X DB REL027-ISFAIL X DB REL031-REL027 X DB REL032-REL031 X DB REL033-REL032 X DB REL034-REL033 X DB REL035-REL034 X DB REL036-REL035 X DB REL037-REL036 X DB RSXLAT-REL037 X DB REL047-RSXLAT X DB REL048-REL047 X DB REL049-REL048 X DB REL050-REL049 X DB REL051-REL050 X DB REL052-REL051 X DB REL053-REL052 X DB OPNCHK-REL053 X DB TSTBKY-OPNCHK X DB REL057-TSTBKY X DB REL058-REL057 X DB NOBREAK-REL058 X DB RSVECT-1-NOBREAK,2 X DB 2,2 X DB 2,2 X DB 2,2 X DB 2,2 X DB 2 X DB 2,2,2 XRELTSZ = *-RELTAB X; X; HIGH/LOW IMMEDIATE MEMORY REFERENCE TABLE X; XHRELT DW HR004+1 X DW HR005+1 X DW HR006+1 XHLRTSZ = *-HRELT X; XLRELT DW LR004+1 X DW LR005+1 X DW LR006+1 X; X END START, SHAR_EOF # End of shell archive exit 0 =========================================================================== Charles Marslett STB Systems, Inc. <== Apply all standard disclaimers Wordmark Systems <== No disclaimers required -- that's just me chasm@killer.dallas.tx.us
chasm@killer.DALLAS.TX.US (Charles Marslett) (06/26/89)
# This is a shell archive (Part 2 of 2) # # It contains 5 RS-232 handlers or AUTORUN.SYS files. # # Run it through the Bourne shell "sh" or an unshar program # after reading the following paragraphs, the desired driver # can then be UUDECODEd to create an executable AUTORUN.SYS file. # #The five AUTORUN.SYS files in this SHAR archive are the RS-232 drivers for #three common RS-232 adapters used with Atari 8-bit computers. The #ATARI850 file will load the RS-232 driver from an Atari 850 interface or #from ICD's P:R:Connection. The ATR232 file is the standard RS-232 driver #for an ATR8000's serial port (the ATR232HD and ATR232HX are very similar #RS-232 drivers for an ATR8000 with the SWP hard disk interface installed), #and the ATR8500 file is an RS232 handler for the SWP ATR8500, second #generation interface. # #The RS232 drivers for the ATR8000 differ in where the Z80 code down- #loaded into the ATR8000 goes. The original driver (ATR232) used the "User #Page" of memory not used by the ATR8000 ROM code ($D000). # #Unfortunately, the ATR8000 hard disk interface code is loaded here also, #two other alternatives are provided: ATR232HD loads its code at $EC00 to $EFFF, #and ATR232HX loads its code at $E000 to $E2FF. # #Each file, when uudecoded, will have the same name (AUTORUN.SYS) even though #the uuencoded files have distinguishing names. So don't decode them all in #the same directory! # #These drivers can be combined with the RAMdisk initialization AUTORUN.SYS #files by formatting a disk (with the I command), copying MYDOS to it (with #the H command), copying the desired RS-232 driver to the disk naming it #AUTORUN.SYS, and then appending the normal RAMdisk AUTORUN.SYS file to it. #The two copy operations are specified with lines similar to these: # # D2:ATARI850.AUT,D1:AUTORUN.SYS # # D2:AUTORUN.SYS,D1:AUTORUN.SYS/A # #which would combine the 850 handler with the standard RAMdisk startup code. # #Charles Marslett chasm@killer.dallas.tx.us #Wordmark Systems #June 20, 1989 # # #----cut here-----cut here-----cut here-----cut here----# #!/bin/sh # shar: Shell Archiver # Run the following text with /bin/sh to create: # rs232.uue # atr232.uue # atr232hd.uue # atr232hx.uue # atr8500.uue # This archive created: Fri Jun 23 19:59:42 1989 sed 's/^X//' << \SHAR_EOF > rs232.uue Xbegin 666 autorun.sys XV___R-_$XJ0"%"*4,C00YI0V-!3FB"[WC.)T``\H0]R!9Y#`0H@N]``6=``/*$/<@6>00"*F&5 XVHCB@(-!&(`8%I0R-!SFE#8T(.:`2L0S9[SC0)X@0]J!#N;\XD0S(P$O0]JE$&*4,:42%#)`"< XVY@T@!CFIIJ(XH!G0"2`&.:F_HCB@)(U$`XY%`XQ(`Z(`J0F=0@.I`)U)`TQ6Y$524D]2("T@X XV0T%.)U0@3$]!1"!24S(S,B!$4DE615*;.#4P(%)3,C,R($A!3D1,15(@3$]!1$5$FU`Z4CI#$ XV;VYN96-T:6]N(%)3,C,R($A!3D1,15(@3$]!1$5$FU`!/T``!0@`#````*D`HO(X"3D`W1H#% X:\`CHZ.C@()#T8*E28"```$P```#B`N,"\C<`- X`` Xend Xsize 296 SHAR_EOF sed 's/^X//' << \SHAR_EOF > atr232.uue Xbegin 666 autorun.sys XV__\`8/]@A4.IB"#]8ZW'9"DPJ,D@L"FE0\F;T!&I#2`X8#`9K<=D"A`1J0K0$"E_B#`+R2"0O XV!,E]D`.@`6"%0ZW'9"D#\!(&0\D#\`I*I4.0`DF`"M#Y9D.LV63(P""0`J``(`1DS-AD\/BED XV0YG:9(S99'BI""S(9#`"J1B@`"#R8UC(8*F$(/UCK-9DS-=D\/.Y^F3(C-9DA4.MQV0I#/`=P XVR0SP%2D$14.0`DF`"M#YD`BI(`W49(W49`9#1D.MQV0I,*BE0\`@L!8I?\D-T`*IFX@P"\D@A XVD`3)?3`#K<EDH`%@+,9D,`4LRV00.R!!83!0H`"B`([M`JWL`DA*2K`"HLQ*L`!A_V$"H#"$" XV*XH%*ZIH,`'HCNL""BD$#=1DC>H"H`",U&2,[`+(8#BMUV3MUF2-ZP(XK=ED[=AD*1^-[0*I_ XV`/#6J0_0TB`X8S#WH&2IH"`@8Z#>(#ICJ5*-`@.I0(T#`Z`"J>N-!`.I`HP%`XT*`XT(`ZD`: XVC0D#3%GDK<9D,`.@EF"@`(S49*4J"4"-QF3(8"S&9'`7I1'P$ZW59/#R&*44:0;%%-#\>""SK XV85B@P(S+9(S&9*`!8*DTC0/3J0"-V&2-V62MTF2-%@*MTV2-%P*@!KG+9)D)`HC0]ZD\H("$C XV$8T#TV"E(BD/R0FP#:A*L`FY:F1(N6ED2&"@A&`LQF00`Z"%`&+_8F!P`Z"98"!!83#ZK<ID2 XV+>P"\`.@BV`@.&,P$ZG_C9QDJ5&-GF2@9*EY("!C$`-,S6*@`(S+9*ES>(S89(S99(S69(S75 XV9(T/TJEXC0C2K<AD*0^HN:9DC0+2C0;2N;9DC0#2C032J:"-`=*-`]*-!=*-!]*@!KD)`IG+4 XV9+ER9)D)`HC0\:T6`HW29*E:C18"K1<"C=-DJ6.-%P*MQF0IOXW&9"D$\`*I(,@@\F-83,UBZ XVI2J-R&2E*_`"J0*-RF1,RV*E*HW'9*4KC<EDH`&MQF2%*IA@+,9D<!*E*BD#2O#KJ7.P`@F`H XVC0_2T."B4:4J2FJ0`R`-8Z)5I2I**5#P"R4`8_]C*O`"J8!)@"`-8TS-8HZ>9`JI`"J-G&0@8 XV.&,PMZ!DJ9N-!`.I5XT"`ZF`C0,#J2(@96$PGZ!'T`>@W(P+`Z!3C`(#H`",`P.,"@/(C`$#G XVR(P&`Z!:C``#3%GD+`[2$`-LTF1(F$@@LV$&$:E`#<9DC<9DT$?8F$BLV&3,V630"Z40*>>@Z XV`2#T8]`QR,`@D`*@`+G:9(T-THS89*T.TDG_)1`I(/`/J=0E$(T.TJ40C0[2(,ECJ0@L#M+P* XVWVBH:$#8F$@@R6-HJ&A`K0W2K-=DF?IDK0_2C0K22?\IP`W49,C,UF2,UV30!L@)$(S69(W4= XV9&`%$(40C0[2C-5D8"S&9`!DRV3P%C`7+,9D,!)0%:W+9#`1H("$$8S+9"RHB"R@A6AHF&`@5 XV^6$P]V`@X`>I^HWG`JEEC>@"H`"Y&@/P#,E2\`C(R,C`'I#P8*E2C=5DF1H#.*E=F1L#J629S XV'`.@`6!U88MA?F#_7]U@X&'U8=-BKV+`8OAAOV-T8W1C\\UH\#XATX,R+O\&!-M0!]-0VW`'@ XVTU&@P@W</O_34</&]S[_TU')VU`R`=[)"TQ%/2X?&1<+!0(!`0```*#-XV^5P/9'H,SCZFZS4 XV5BC``````(#49-ED````````^F7Y9JF`HE4@#6,XJ0"%UNWG`H74J6"%U^WH`H75H@`8O9]F> XV\`9EUH76D`3FUY`0H``XL=;EU)'6R+'6Y=61UNC@?Y#;H@"]'F>%UKTL9X78Z+T>9X77O2QG@ XVA=GHH``XL=CEU)'8L=;EU9'6X`Z0UZ4,C2ADI0V-*62I)X4,J62%#:WG`H78K>@"A=FI`(76( XVJ6"%UZ(&H`"QUI'8R-#YYM?FV<K0\DPJ9`4#$@4<&0H#!P,&"0@#`P4$!1H#!R4%!2L("0,'_ XV`Q`)!2<*!P4)#P8##0,#!@@?!`@-!0L'!0<%!08#`P,+!@D<`PP+"`4*!`4)`P4%!0<?%`,#? XV!P,8,`8'`PCZ9CEG`PL,!AH1"@,-!`,(`PL$!P<)#3L"`@("`@("`@("`@("```F1V$F8I9BW X<'6,P9%9D=69)82ABBV(?8RMD461Q9N("XP+Z90``/ X`` Xend Xsize 1594 SHAR_EOF sed 's/^X//' << \SHAR_EOF > atr232hd.uue Xbegin 666 autorun.sys XV__\`8/]@A4.IB"#]8ZW'9"DPJ,D@L"FE0\F;T!&I#2`X8#`9K<=D"A`1J0K0$"E_B#`+R2"0O XV!,E]D`.@`6"%0ZW'9"D#\!(&0\D#\`I*I4.0`DF`"M#Y9D.LV63(P""0`J``(`1DS-AD\/BED XV0YG:9(S99'BI""S(9#`"J1B@`"#R8UC(8*F$(/UCK-9DS-=D\/.Y^F3(C-9DA4.MQV0I#/`=P XVR0SP%2D$14.0`DF`"M#YD`BI(`W49(W49`9#1D.MQV0I,*BE0\`@L!8I?\D-T`*IFX@P"\D@A XVD`3)?3`#K<EDH`%@+,9D,`4LRV00.R!!83!0H`"B`([M`JWL`DA*2K`"HLQ*L`!A_V$"H#"$" XV*XH%*ZIH,`'HCNL""BD$#=1DC>H"H`",U&2,[`+(8#BMUV3MUF2-ZP(XK=ED[=AD*1^-[0*I_ XV`/#6J0_0TB`X8S#WH&2IH"`@8Z#O(#ICJ5*-`@.I0(T#`Z`"J>N-!`.I`HP%`XT*`XT(`ZD`K XVC0D#3%GDK<9D,`.@EF"@`(S49*4J"4"-QF3(8"S&9'`7I1'P$ZW59/#R&*44:0;%%-#\>""SK XV85B@P(S+9(S&9*`!8*DTC0/3J0"-V&2-V62MTF2-%@*MTV2-%P*@!KG+9)D)`HC0]ZD\H("$C XV$8T#TV"E(BD/R0FP#:A*L`FY:F1(N6ED2&"@A&`LQF00`Z"%`&+_8F!P`Z"98"!!83#ZK<ID2 XV+>P"\`.@BV`@.&,P$ZG_C9QDJ5&-GF2@9*EY("!C$`-,S6*@`(S+9*ES>(S89(S99(S69(S75 XV9(T/TJEXC0C2K<AD*0^HN:9DC0+2C0;2N;9DC0#2C032J:"-`=*-`]*-!=*-!]*@!KD)`IG+4 XV9+ER9)D)`HC0\:T6`HW29*E:C18"K1<"C=-DJ6.-%P*MQF0IOXW&9"D$\`*I(,@@\F-83,UBZ XVI2J-R&2E*_`"J0*-RF1,RV*E*HW'9*4KC<EDH`&MQF2%*IA@+,9D<!*E*BD#2O#KJ7.P`@F`H XVC0_2T."B4:4J2FJ0`R`-8Z)5I2I**5#P"R4`8_]C*O`"J8!)@"`-8TS-8HZ>9`JI`"J-G&0@8 XV.&,PMZ!DJ9N-!`.I5XT"`ZF`C0,#J2(@96$PGZ!'T`>@[(P+`Z!3C`(#H`",`P.,"@/(C`$#W XVR(P&`Z!:C``#3%GD+`[2$`-LTF1(F$@@LV$&$:E`#<9DC<9DT$?8F$BLV&3,V630"Z40*>>@Z XV`2#T8]`QR,`@D`*@`+G:9(T-THS89*T.TDG_)1`I(/`/J=0E$(T.TJ40C0[2(,ECJ0@L#M+P* XVWVBH:$#8F$@@R6-HJ&A`K0W2K-=DF?IDK0_2C0K22?\IP`W49,C,UF2,UV30!L@)$(S69(W4= XV9&`%$(40C0[2C-5D8"S&9`!DRV3P%C`7+,9D,!)0%:W+9#`1H("$$8S+9"RHB"R@A6AHF&`@5 XV^6$P]V`@X`>I^HWG`JEEC>@"H`"Y&@/P#,E2\`C(R,C`'I#P8*E2C=5DF1H#.*E=F1L#J629S XV'`.@`6!U88MA?F#_7]U@X&'U8=-BKV+`8OAAOV-T8W1C\\UH\#XATX,R+O\&!-M0!]-0VW`'@ XVTU&@P@WL/O_34</&]S[_TU')VU`R`>_)"TQ%/2X?&1<+!0(!`0```*#-XV^5P/9'H,SCZFZSU XV5BC``````(#49-ED````````^F7Y9JF`HE4@#6,XJ0"%UNWG`H74J6"%U^WH`H75H@`8O9]F> XV\`9EUH76D`3FUY`0H``XL=;EU)'6R+'6Y=61UNC@?Y#;H@"]'F>%UKTL9X78Z+T>9X77O2QG@ XVA=GHH``XL=CEU)'8L=;EU9'6X`Z0UZ4,C2ADI0V-*62I)X4,J62%#:WG`H78K>@"A=FI`(76( XVJ6"%UZ(&H`"QUI'8R-#YYM?FV<K0\DPJ9`4#$@4<&0H#!P,&"0@#`P4$!1H#!R4%!2L("0,'_ XV`Q`)!2<*!P4)#P8##0,#!@@?!`@-!0L'!0<%!08#`P,+!@D<`PP+"`4*!`4)`P4%!0<?%`,#? XV!P,8,`8'`PCZ9CEG`PL,!AH1"@,-!`,(`PL$!P<)#3L"`@("`@("`@("`@("```F1V$F8I9BW X<'6,P9%9D=69)82ABBV(?8RMD461Q9N("XP+Z90``/ X`` Xend Xsize 1594 SHAR_EOF sed 's/^X//' << \SHAR_EOF > atr232hx.uue Xbegin 666 autorun.sys XV__\`8/]@A4.IB"#]8ZW%9"DPJ,D@L"FE0\F;T!&I#2`X8#`9K<5D"A`1J0K0$"E_B#`+R2"0K XV!,E]D`.@`6"%0ZW%9"D#\!(&0\D#\`I*I4.0`DF`"M#Y9D.LUV3(P""0`J``(`1DS-9D\/BE> XV0YG89(S79'BI""S&9#`"J1B@`"#R8UC(8*F$(/UCK-1DS-5D\/.Y^&3(C-1DA4.MQ60I#/`=@ XVR0SP%2D$14.0`DF`"M#YD`BI(`W29(W29`9#1D.MQ60I,*BE0\`@L!8I?\D-T`*IFX@P"\D@; XVD`3)?3`#K<=DH`%@+,1D,`4LR600.R!!83!0H`"B`([M`JWL`DA*2K`"HLQ*L`!A_V$"H#"$\ XV*XH%*ZIH,`'HCNL""BD$#=)DC>H"H`",TF2,[`+(8#BMU63MU&2-ZP(XK==D[=9D*1^-[0*IS XV`/#6J0_0TB`X8S#WH&2IGB`@8Z#B(#ICJ5*-`@.I0(T#`Z`"J>N-!`.I`HP%`XT*`XT(`ZD`< XVC0D#3%GDK<1D,`.@EF"@`(S29*4J"4"-Q&3(8"S$9'`7I1'P$ZW39/#R&*44:0;%%-#\>""SA XV85B@P(S)9(S$9*`!8*DTC0/3J0"-UF2-UV2MT&2-%@*MT62-%P*@!KG)9)D)`HC0]ZD\H("$5 XV$8T#TV"E(BD/R0FP#:A*L`FY:F1(N6ED2&"@A&`LQ&00`Z"%`&+_8F!P`Z"98"!!83#ZK<AD. XV+>P"\`.@BV`@.&,P$ZG_C9IDJ5&-G&2@9*EY("!C$`-,S6*@`(S)9*ES>(S69(S79(S49(S5' XV9(T/TJEXC0C2K<9D*0^HN:1DC0+2C0;2N;1DC0#2C032J:"-`=*-`]*-!=*-!]*@!KD)`IG), XV9+ER9)D)`HC0\:T6`HW09*E:C18"K1<"C=%DJ6.-%P*MQ&0IOXW$9"D$\`*I(,@@\F-83,UBR XVI2J-QF2E*_`"J0*-R&1,RV*E*HW%9*4KC<=DH`&MQ&2%*IA@+,1D<!*E*BD#2O#KJ7.P`@F`< XVC0_2T."B4:4J2FJ0`R`-8Z)5I2I**5#P"R4`8_]C*O`"J8!)@"`-8TS-8HZ<9`JI`"J-FF0@4 XV.&,PMZ!DJ9F-!`.I5XT"`ZF`C0,#J2`@96$PGZ!'T`>@X(P+`Z!3C`(#H`",`P.,"@/(C`$#G XVR(P&`Z!:C``#3%GD+`[2$`-LT&1(F$@@LV$&$:E`#<1DC<1DT$?8F$BLUF3,UV30"Z40*>>@P XV`2#T8]`QR,`@D`*@`+G89(T-THS69*T.TDG_)1`I(/`/J=0E$(T.TJ40C0[2(,ECJ0@L#M+P& XVWVBH:$#8F$@@R6-HJ&A`K0W2K-5DF?ADK0_2C0K22?\IP`W29,C,U&2,U630!L@)$(S49(W2/ XV9&`%$(40C0[2C--D8"S$9`!DR63P%C`7+,1D,!)0%:W)9#`1H("$$8S)9"RHB"R@A6AHF&`@) XV^6$P]V`@X`>I^(WG`JEEC>@"H`"Y&@/P#,E2\`C(R,C`'I#P8*E2C=-DF1H#.*E=F1L#J629O XV'`.@`6!U88MA?F#_7]U@X&'U8=-BKV+`8OAAOV-T8W1C\^KJZCXATX,R+O\&!-M0!]-0VW`'Y XVTU&@P@W@/O_34<D^_]-1R=M0,@'BR0M,13TN'QD7"P4"`0$```"@S>-OE<#V1Z#,X^INLU8HC XVP`````"`TF379````````/AE]V:I@*)5(`UC.*D`A=;MYP*%U*E@A=?MZ`*%U:(`&+V=9O`&, XV9=:%UI`$YM>0$*``.+'6Y=21ULBQUN75D=;HX'^0VZ(`O1QGA=:]*F>%V.B]'&>%U[TJ9X79` XVZ*``.+'8Y=21V+'6Y=61UN`.D->E#(TH9*4-C2EDJ2>%#*EDA0VMYP*%V*WH`H79J0"%UJE@S XVA=>B!J``L=:1V,C0^>;7YMG*T/),*F0%`Q(%'!D*`P<#!@D(`P,%!`4:`P<E!04K"`D#!P,0) XV"04G"@<%"0\&`PT#`P8('P0(#04+!P4'!04&`P,#"P8)'`,,"P@%"@0%"0,%!04''Q0#`P<#6 XV&#`&!P,(^&8W9P,+#`8:$0H##00#"`,+!`<'"0T[`@("`@("`@("`@("`@``)$=A)F*68AUCG X:,&169'-F26$H8HMB'V,K9%%D;V;B`N,"^&4`) X`` Xend Xsize 1592 SHAR_EOF sed 's/^X//' << \SHAR_EOF > atr8500.uue Xbegin 666 autorun.sys XV__\`-/\TA4.IB"!:.*UY.2DPJ,D@L"FE0\F;T!&I#2`X-#`9K7DY"A`1J0K0$"E_B#`+R2"0K XV!,E]D`.@`6"%0ZUY.2D#R0/0!09#.&9#I$G(P""0`J``(&$XQ$CP^:5#F8DYA$EXJ0B@`"!0Z XV.%C(8*F$(%HXI$;$1_#UN:DYR(1&A4.M>3DI#,D,T`0&0T9#K7DY*3"HI4/`(+`6*7_)#=`"S XVJ9N(,`O)()`$R7TP`ZUZ.:`!8"QX.3`%+'XY$#L@##4P2JU[.4I*2BD'J+G--HWK`J(`CNT"E XVK>P"K7LY$`/.ZP))_RWL-?`"*00%1(WJ`J``A$2,[`+(8#BE1^5&C>L".*5)Y0`U_S5(C>T", XVJ0#PWJD/T-J@.*F@HN(@2S<PW*+BC@L#HOV."@.@`(P(`ZE3('TWJ3F-!0.I>XT$`ZE2H$"BY XV`XT)`TQW-ZUX.3`#H)9@H`"$1*4J"4"->#G(8"QX.7`6I1'P$J5%\/,8I11I!L44T/QX('PUY XV6*#`C'XYC'@YH`%@J32-`].I`(5(A4FMASF-%@*MB#F-%P*@!KF`.9D)`HC0]ZD\H("$$8T#8 XVTV"E(BD/R0FP%ZA*L!.YD3A(N9`X2&"I!`5$A42@BS`SH(0P+RQX.1`$H(4P)G`$H)DP("`IU XV%JW)."GOC<DX(`PUK7LY*0#0SJ`XJ<RBXR!+-Q`#3/<VH`",`#;_-GXYJ7-XA$B$281&A$>-0 XV#]*I>(T(THT"THT&TJDHC0#2C032J:"-`=*-`]*-!=*-!]*@!KD)`IF`.;F9.)D)`HC0\:T6- XV`HV'.:F8C18"K1<"C8@YJ3>-%P*M>#DIOXUX.2D$\`*I(,@@4#A8H`$0BZW%."GWC<4XI2H0R XV"*W%.`D(C<4XI2HI,$I*2DJHK<DX*9\9P3:-R3BMQSBE*BD/J+YD.8[".$I*J*W%."D_&70YK XVC<4XI2LI!ZBYQ3:-[#5,]39@($```"``(!`P$#`!,0$QS?W-_:W%."G\J*4JC7DY*0/)`?`&T XVR0+0`\C(R(S%.*4KC7HYH`&M>#F%*IA@KLD`-_\W.*4J*0-*BBGOL`()$*JE*BDP\`K),(H); XV@+`"*7^J)"H0"(H)`G`"*?VJC<DX+'@Y<!.@F3#!CETY"JD`*HU;.2!O-S"XHN*@.*F@C`4#B XVC00#C@L#('$W,)ZI5Z"`HHX@=S<PDR!Q-ZE'(',W3/<VJ>RI4Z``H@"."@.."`.-`@.,`P.@M XV`(P)`\B,`0/(C`8#H%J,``-,6>0L#M(0`VR'.4B82"!\-081J4`->#F->#G0+.Z`.:40C0[2D XVT"+8F$BD2,1)T`NE$"GGH`$@4CC0#BR`.3#=R+F).81(C0W2:*AH0-B82*T-TLD?\#+)$_`S> XVR1'P-`Y_.9`"*1^D1YFI.0`X_SC(A$>M#]*-"M))_RG`!43$1M`%R`D0A$:%1&BH:$!N?SDP8 XV'FZ`.3`9+8`Y\!&E$`D0A1"-#M*I`(V`.4SW-HV`.:T/THT*TDG_*<`%1$P8.`40A1"-#M*$; XV16`L>#GP%C`7+'@Y,!)0%:U^.3`1H("$$8Q^.2RHB"R@A6AHF&`@RS4P]V!`-54U:33_,ZXT\ XVIS7&-?TV;C;4-LHUXC>\-[PWVT,R_N(^`=-#VT,R_^(A(>(!(0+MLP%#">VSVT,R_>+)1X``` XV!$0#P07J,!`&2%AHQ2;A5#X0TT+;0LM7*!0%!"@0?OX@,`?V0'<^'Q@"+`730-M#RT<H!=M!\ XV$AP$8^-<`#E^.2;@5-M#RU<H$`T,*`Q^TT$L#7GF_/Y\*#7;0LMO*!_+1R@*>?[P,`K;0!(<L XV#&/C7!B?VT++5RCZ/A/30!CJT0P-R-M#RU<H^G[302P8\MM"RU<H^CX1TT`8OS[_TU')VS(!: XV[\D@T\"I`*^/@(!`(!40"`0$Q(1$1,```````("I.J@[J8"B52`V-SBI`(76[><"A=2I-(77. XV[>@"A=6B`!B]=COP!F76A=:0!.;7D!"@`#BQUN74D=;(L=;EU9'6Z.!!T-NB`+VW.X76O;T[: XVA=CHO;<[A=>]O3N%V>B@`#BQV.74D=BQUN75D=;@!M#7K><"A=BMZ`*%V:D`A=:I-(77H@>@Q XV`+'6D=C(T/GFU^;9RM#R&*WG`FFIC><"K>@":0:-Z`*@`+D:`_`,R5+P",C(R,`>D/!@J5*%7 XV19D:`SBIA.74F1L#J3CEU9D<`Z`!8`4#$@4<%PD*"`D(#24%!5,U$`47!@,1!@@?!!,/(`4W; XV`PP+"`4*;HH^!@<#'@N$!P<)#:D[PCL%`@("`@("`@("`@("`O`U5#9(-_(U239*-^("XP*I/ X!.@``Z X`` Xend Xsize 1729 SHAR_EOF # End of shell archive exit 0 =========================================================================== Charles Marslett STB Systems, Inc. <== Apply all standard disclaimers Wordmark Systems <== No disclaimers required -- that's just me chasm@killer.dallas.tx.us