Path: utzoo!attcan!utgpu!jarvis.csri.toronto.edu!rutgers!apple!sun-barr!texsun!pollux!killer!chasm From: chasm@killer.DALLAS.TX.US (Charles Marslett) Newsgroups: comp.sys.atari.8bit Subject: MYDOS RS-232 handlers (source) Keywords: RS232 ATR8000 ATR8500 P:R:Connection 850 HANDLER SOURCE AUTORUN Message-ID: <8463@killer.DALLAS.TX.US> Date: 25 Jun 89 17:50:35 GMT Organization: The Unix(R) Connection, Dallas, Texas Lines: 2568 # 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