,?h?@L06CD l0C)HCC WhL/h `CmCDiD`  R@P1  Y0@R !L` D  C D     )16CS S)  C)D1 p p 0 C9DI pCDL~CiCDiD` LIST D TITLE 'N: CIO HANDLER' SUBTTL 'EQUATES'; N: HANDLER FOR FUJINET; AUTHOR: THOM CHERRYHOMES; ; CURRENT IOCB IN ZERO PAGEZIOCB EQU $20 ; ZP IOCBZICHID EQU ZIOCB  ; IDZICDNO EQU ZIOCB+1 ; UNIT #ZICCOM EQU ZIOCB+2 ; COMMANDZICSTA EQU ZIOCB+3 ; STATUSZICBAL EQU ZIOCB+4 ; BUF ADR LOWZICBAH EQU ZIOCB+5 ; BUF ADR HIGHZICPTL EQU ZIOCB+6 ; PUT ADDR LZICPTH EQU ZIOCB+7 ; PUT A DDR HZICBLL EQU ZIOCB+8 ; BUF LEN LOWZICBLH EQU ZIOCB+9 ; BUF LEN HIGHZICAX1 EQU ZIOCB+10 ; AUX 1ZICAX2 EQU ZIOCB+11 ; AUX 2ZICAX3 EQU ZIOCB+12 ; AUX 3ZICAX4 EQU ZIOCB+13 ; AUX 4ZICAX5 EQU ZIOCB+14 ; AUX 5ZICAX6 EQU  ZIOCB+15 ; AUX 6 ; INTERRUPT VECTORS ; AND OTHER PAGE 2 VARSVPRCED EQU $0202 ; PROCEED VCTRCOLOR2 EQU $02C6 ; MODEF BKG CMEMLO EQU $02E7 ; MEM LODVSTAT EQU $02EA ; 4 BYTE STATS ; PAGE 3 ; DEVICE CONTROL BLOCK (DCB)DCB EQU $0300 ; BASEDDEVIC EQU DCB ; DEVICE #DUNIT EQU DCB+1 ; UNIT #DCOMND EQU DCB+2 ; COMMANDDSTATS EQU DCB+3 ; STATUS/DIRDBUFL EQU DCB+4 ; BUF ADR LDBUFH EQU DCB+5 ; BUF ADR HDTIMLO EQU DCB+6 ; TIMEOUT (S)DRSVD EQU DCB+7 ; NOT USEDDBYTL EQU DCB+8 ; BUF LEN LDBYTH EQU DCB+9 ; BUF LEN HDAUXL EQU DCB+10 ; AUX BYTE LDAUXH EQU DCB+11 ; AUX BYTE HHATABS EQU $031A ; HAND LER TBL ; IOCB'S * 8IOCB EQU $0340 ; IOCB BASEICHID EQU IOCB ; IDICDNO EQU IOCB+1 ; UNIT #ICCOM EQU IOCB+2 ; COMMANDICSTA EQU IOCB+3 ; STATUSICBAL EQU IOCB+4 ; BUF ADR LOWICBAH EQU IOCB+5 ; B UF ADR HIGHICPTL EQU IOCB+6 ; PUT ADDR LICPTH EQU IOCB+7 ; PUT ADDR HICBLL EQU IOCB+8 ; BUF LEN LOWICBLH EQU IOCB+9 ; BUF LEN HIGHICAX1 EQU IOCB+10 ; AUX 1ICAX2 EQU IOCB+11 ; AUX 2ICAX3 EQU IOCB+12 ; AUX 3I CAX4 EQU IOCB+13 ; AUX 4ICAX5 EQU IOCB+14 ; AUX 5ICAX6 EQU IOCB+15 ; AUX 6 ; HARDWARE REGISTERSPACTL EQU $D302 ; PIA CTRL A ; OS ROM VECTORSCIOV EQU $E456 ; CIO ENTRYSIOV EQU $E459 ; SIO ENTRY ; CONSTANTSPUTREC EQU $09 ; CIO PUTRECDEVIDN EQU $71 ; SIO DEVIDDSREAD EQU $40 ; FUJI->ATARIDSWRIT EQU $80 ; ATARI->FUJIMAXDEV EQU 4 ; # OF N: DEVSEOF EQU $88 ; ERROR 136 SUBTT L 'HANDLER START' ORG $2300START JSR INIT ; DO INIT ; INSERT INTO HATABSIHTBS PROC ; FIND FIRST EMPTY ENTRY, OR ; ALREADY EXTANT N: ENTRY. LDY #$00:1 LDA HATABS,Y BEQ  HFND CMP #'N' BEQ HFND INY INY INY CPY #11*3 BCC :1 ; EITHER FOUND EMPTY SPOT, ; OR FOUND EXTANT N: ENTRY.HFND LDA #'N' STA HATABS,Y LDA #LO W CIOHND STA HATABS+1,Y LDA #HIGH CIOHND STA HATABS+2,Y EPROC ; MOVE MEMLO PROC LDA #LOW END STA MEMLO LDA #HIGH END STA MEMLO+1 EPROC SUB TTL 'SHOW FUJINET BANNER' ; QUERY FUJINET; JSR STPOLL ; OUTPUT READY OR ERROROBANR PROC LDX #$00 ; IOCB #0 E: LDA #PUTREC STA ICCOM,X LDA #$28 ; 40 CHRS MAX STA  ICBLL,X LDA #$00 STA ICBLH,X LDA DSTATS ; DSTATS < 128? BPL OBRDYOBERR LDA #LOW BERROR STA ICBAL,X LDA #HIGH BERROR STA ICBAH,X JMP OBCIOOBRDY LDA #L OW BREADY STA ICBAL,X LDA #HIGH BREADY STA ICBAH,XOBCIO JSR CIOV EPROC ; VECTOR IN PROCEED INTERRUPTSPRCED PROC LDA #LOW PRCVEC STA VPRCED LDA #HIGH PRCVEC S TA VPRCED+1 EPROC ; RTS BACK TO DOSVEC, DONE. RTS SUBTTL 'CIO OPEN' OPEN PROC ; PERFORM THE OPEN JSR ENPRCD ; ENABLE PRCED JSR GDIDX ; X=ZICDNO-1 LDA #DEVIDN ; $ 70 STA DDEVIC LDA ZICDNO STA DUNIT LDA #'O' ; 'O'PEN STA DCOMND LDA #DSWRIT ; -> PERIP STA DSTATS LDA ZICBAL ; POINT DBUF STA DBUFL ; TO FILENAME  LDA ZICBAH ; ... STA DBUFH ; ... LDA #$0F STA DTIMLO LDA #$00 ; OPEN WANTS STA DBYTL ; 256 BYTE LDA #$01 ; PAYLOAD STA DBYTH ; ... LDA ZICAX1 ; IOCB AUX1... STA AX1SV,X ; ...SAVE IT STA DAUXL ; ...USE IT LDA ZICAX2 ; IOCB AUX2... STA AX2SV,X ; ...SAVE IT STA DAUXH ; ...USE IT JSR SIOV ; SEND TO #FN  ; RETURN DSTATS UNLESS = 144 ; IN WHICH CASE, DO A STATUS ; AND RETURN THE EXTENDED ERR ; FROM IT...OPCERR LDY DSTATS ; GET SIO STATUS CPY #$90 ; ERR 144? BNE OPDONE ; NOPE. RE TURN DSTATS ; 144, GET EXTENDED ERROR JSR STPOLL ; POLL FOR STATUS LDY DVSTAT+3 ; RESET BUFFER LENGTH + OFFSET OPDONE LDA #$01 STA TRIP JSR GDIDX LDA #$00  STA RLEN,X STA ROFF,X TYA RTS ; AY = ERROR EPROC SUBTTL 'CIO CLOSE'CLOSE PROC JSR DIPRCD ; DIS INTRPS LDA #DEVIDN ; $70 STA DDEVIC LDA ZICDNO ; UN IT # STA DUNIT LDA #'C' ; C = CLOSE STA DCOMND LDA #$00 ; NO PAYLOAD STA DSTATS STA DBUFL STA DBUFH STA DBYTL STA DBYTH STA DAUXL STA DAUXH LDA #$0F STA DTIMLO JSR SIOV ; TODO: CLEAR BUFFERS LDY DSTATS TYA RTS EPROC SUBTTL 'CIO GET'GET PROC ; GET RLEN JSR GDIDX LDA  RLEN,X CMP #$00 BEQ :RL0 BCS :RLG:RL0 JSR GFETC:RLG JSR GDRAI RTS ; DONE... EPROC ; FETCH DATAGFETC LDA TRIP ; CHECK TRIP BEQ GFDONE ; DONE IF  JSR GDIDX ; GET DEV X LDA DVSTAT ; GET # BYTES STA RLEN,X ; STORE RLEN CMP #$00 ; 0 BYTES? BEQ GFDONE ; BAIL... ; OTHERWISE... ; GET WAITING BYTES FROM SIOGFSIO LDA  #DEVIDN ; $71 STA DDEVIC LDA ZICDNO ; Nx: STA DUNIT ; LDA #'R' ; R = READ STA DCOMND LDA #DSREAD ; PERIP->ATARI STA DSTATS JSR ICD2B ; GET BUF PAGE " LIST D,G,I TITLE 'N: CIO HANDLER' SUBTTL 'EQUATES'; N: HANDLER FOR FUJINET; AUTHOR: THOM CHERRYHOMES; INCLUDE D2:EQUATES.ASM INCLUDE D2:INIT.ASM INCLUDE D2:OPEN.ASM ! INCLUDE D2:CLOSE.ASM INCLUDE D2:GET.ASM INCLUDE D2:PUT.ASM INCLUDE D2:STATUS.ASM INCLUDE D2:SPECIAL.ASM INCLUDE D2:UTIL.ASM SUBTTL 'INITIALIZATION' ; PROCEED VECTORPRCVEC PROC LDA #$0"1 STA TRIP PLA RTI EPROC ; --------- END OF CODE ----- ; DEVHDL TABLE FOR N:CIOHND DW OPEN-1 DW CLOSE-1 DW GET-1 DW PUT-1 DW STATUS-1# DW SPEC-1 ; BANNERS BREADY DB '#FUJINET READY',$9BBERROR DB '#FUJINET ERROR',$9B ; VARIABLESTRIP DS 1 ; INTR FLAGAX1SV DS MAXDEV ; AUX1 SAVEAX2SV DS MAXDEV ; AUX2 SAVESTSV $DS 4*MAXDEV ; STATUS SAVERLEN DS MAXDEV ; RCV LENROFF DS MAXDEV ; RCV OFFSETTOFF DS MAXDEV ; TRX OFFSETINQDS DS 1 ; DSTATS INQ ; BUFFERS (PAGE ALIGNED) ORG * + $FF & $FF00RBUF DS %256*MAXDEV ; RXTBUF DS 256*MAXDEV ; TXEND = * ORG $02E0 DW STARTM CHERRYHOMES; INCLUDE D2:EQUATES.ASM INCLUDE D2:INIT.ASM INCLUDE D2:OPEN.ASM v## N!N&/ B(HI D&ELX#D&E V䩃&` M& _&q!O$% *& +&  Y x%& _&&&&` V&q!C   '#$ Y $` _&&Q x% _&&`q!R@ c&    Y _&&`&&&'L$(L$)L$*L$&&&` _&&+&ɛ _&&` $` x%` _&&L;%q!W($% +P ,P-P.P  &  Y _&&` M& _&&&&Lt% x%&Lo%&&`q!S@    Y `" $`q!@ٍ)&%&  "  Y`&`q"&+ * +  Y` `)`!`! 'P (P)P*P`&h@e##$$=%%#FUJINET READY#FUJINET ERROR# $`q!@ٍ SUBTTL 'CIO SPECIAL'SPEC PROC ; HANDLE LOCAL COMMANDS. LDA ZICCOM CMP #$0F ; 15 = FLUSH BNE :1 ; NO. JSR PFLUSH ; DO FLUSH LDY #$01 ; SUCCESS RTS ; HA0+NDLE SIO COMMANDS. ; GET DSTATS FOR COMMAND:1 LDA #DEVIDN ; $71 STA DDEVIC LDA ZICDNO ; UNIT # STA DUNIT LDA #$FF ; DS INQ STA DCOMND LDA #DSREAD STA DSTAT0,S LDA #LOW INQDS STA DBUFL LDA #HIGH INQDS STA DBUFH LDA #$01 STA DBYTL LDA #$00 STA DBYTH STA DAUXH LDA #$0F STA DTIMLO LDA 0- ZICCOM STA DAUXL JSR SIOV ; DO IT... LDA DSTATS BPL :DSOK:DSERR TAY ; RET THE ERR RTS ; WE GOT A DSTATS INQUIRY ; IF $FF, THE COMMAND IS ; INVALID:DSOK LDA 0. INQDS CMP #$FF ; INVALID? BNE :DSGO ; DO THE CMD LDY #$92 ; UNIMP CMD TYA RTS:DSGO LDA #DEVIDN ; $71 STA DDEVIC LDA ZICCOM STA DCOMND LDA INQDS0/ STA DSTATS LDA #HIGH TBUF STA DBUFH LDA #$00 STA DBUFL STA DBYTH LDA #$0F STA DTIMLO LDA ZICAX1 STA DAUXL LDA ZICAX2 STA 0V D  C D     )16CS S)  C)D1 p p 0 C9DI pCDL~CiCDiD` DD˙` d J)L !1D L(( LL()  L| L( S LH 0p n   CY?  q  L L  ` )2 `A! d߰")-݆ "  $G@LLLI $j") $G%H 3S8`G ȱG ȱG   Gȭ Gȭ GG}GHiH8(()) G$H% `(0)8` d3)L ݆  LGȘ ݆LL d  ! LL d)N>Q  HH)  hyhyB q L> Lm JJ  Ln*` dB%'8  4H H` 1 { LL   !L     Hh SY?  q  1L  !? S   q 1 L   Ll  Lg E`L   !L)  q 1L) `L50AM݊L݉ ML  N݆LLLNLMLHG!@1F GȱGLLEEȩÑEȑEEȑE Ed E7EȩE  q L !,06,0SGɛ L 1 !L EHEh W G gLLSROTCES EERF G) *Gȩ GȽG GȌd q q G`  8   0G  `DCEDC0X:Ȣ 7 Y ȱC* ? 0.. , 0%n ?A[ 0 : L`L  `, 0`Y`piH n0)բY? 08`0   0$L G8GȽG L `8L`L8`  05G)݁,G)ȱGȱGHh0})Hh` B! 8`8iiiLE`E8FEh( 9l0`ɃLL L8^~jj8jHi hEEEiEȱEiE` dTE H8EEȱEEȩEh J E8   . m  i`LI!)E1FR1L:J舩9GIH`LJJ`HGHh l` S gL   8 rii `дCDCG W  C  Lq` X٨`D;OS SYS IIIIIIIIIIIIIIIC`0 ߩ0},16  OS !!""##"#DOSDOS SYS }; <B&NDEV COMC0DOS SYS8SNDEV BAKCNDEV ASMB NDEV ASMB EQUATES ASMBINIT ASMBOPEN ASM=1@  `  TL ]L!T  ɐ    D!` TS 0 c 0 c ( 0 c>`! LD:STARTUP.EXCD:DOSXL.SYSD:AUTORUN.SYSD:MENU.COM7"ɛ  (`;LHLLLZLLD1:D:MENU.COMXC@BNIT.COM@INITREE SECTORSosXL230.atr㮠 @E: K ? u  lllll,hhr'Il \LAlllShhLZ $ \LA E7:8 K ` HH` U0: @L* LA  Z[: ]0@8ʈ08a{)(` ]H\H`!L`7 Q:6,7 c  LAD7 18:LAMOC.REMCARENDSCRNOSRENPROUNPSAVLOARUNERADIRTYP) @15=w{ Y #$!  \LA   AL 6: *79.8 L BUɛ   L LA  "0   "` L Bɛ ST LA  0' 78 9: l " 7 "0LA \LA  cLA 06 l 7S8T ɅB Ɉ L \LA`  "08 797:8 9 L 7 "H h``LȌ  H7"h"!)@ !LA!)L,! @" J "0a!) !)ύ! 2L % " H & " CL2 h0,!p  "`!L!)  \!!)@LLCXE.JH hL"H hL! 0   "!LE L" B VCɀ` \LA5'6!78 897:8iL \LA56 5L 7EDD`IH`U L `7 BUɛ :VW 7U7 Q ` B8U0$  . Ԍ ` U U`ɛ, `ɦ!ɐɠi,ɰ)   E L"DRIVE NUMBER ERRORNO BUFFERSDISK FULLI/O ERRORSYSTEM ERRORINVALID FILE NAMEOSS DOS XL - ATARI version 2.30p Copyright (C) 1983 OSS,Inc.FILE PROTECTEDWRITE PROTECTEDDIRECTORY FULLFILE NOT FOUNDADR RANGE ERRORBREAK KEY ABORTINVALFID DEVICENO CARTRIDGE'6FUdt}?}8Bd~:@@@N:TCP://BBS.FOZZTEXX.NET/Z@@K:lB@@a~AdAUnZF:Ad,AU%)@2*@Z@H@N:xF@26-F:AG,$AV%F:AF,F"AK-@)@+*@/ AB@@aK AD:DUMBTERM.BASF:Ad,AU%)@2*@Z@67 BYNONHDWINNEBBBBBBBBBBBWWW@ 8J ííŠ FOR #FUJINET$$AN EXAMPLE OF HOW TO IMPLEMENT##A GAME USING THE UDP PROTOCOL(AND THE N: DEVICE.2< AUTHOR: THOMAS CHERRYHOMESF""PZ<<98K@ ,;@,;@,;@d,;@d,dMAIN PROGRAM e-6-@6-@-B@@anSTART SCREENx6 (}-@ @6(ԠííŠ*((ENTER YOUR NAME >*@0(0(%ENTER HOSTNAM8LE, OR Π TO LISTEN (> @" 46-@"6-@A6.N:UDP://&67B:,%@,.A67B:,%@,.:6502/ @@&(&(WAITING FOR OTHER PLAYER... @_B@@a8M"@16-F:AF,="Q-@@PU _ A@66-#-@268,-6 6 (}-@ @6(ԠííŠ(( | | ( | | 8N ( 1 | 2 | 3 ( | | ( | | (( | | "( | | ,( 4 | 5 | 6 6( | | @( | | J(8OT( | | ^( | | h( 7 | 8 | 9 r( | | |( | | (I"@!-@ @,(ؠ >-@ @ I(Ϡ I"@!-@ @,(ؠ >-@ 8P@ I(Ϡ H #Ap!-@'">8,A@APH A` -( -%@( -%@( -%@( -%@(  A` -( 8Q -%@( -%@( -%@( -%@(  A` //2,3,8,3,14,3,2,9,8,9,14,9,2,15,8,15,14,15-@@!! A!A"@A 8R#( YOUR MOVE >> #@[8&@,!2(ALREADY OCCUPIED.F-@AJ Q([ A68&@,-(@8,,8@,,8@,,8@,,8@,,8@,,88S@,,8@,,8@,6-@ A!!( WAITING FOR 'S MOVE.EB@@a"@16-F:AF,E"A0 @&68,-!68@,-068@,-?68@8T,-N68@,-]68@,-l68@,-{68@,-68@,-N6-@ A #APT-@@"66-8,%8%,%8%%,T6-$N:8,*8%,*8%%,,*"@)"@'6-'@*$ 8U$%%0,1,3,1,6,1,0,3,1,3,2,3,0,4,2,2  (*"@*"@(4"@*"@(>"@*"@(H"@*"@(R( WINS!\#@ B@@`#D:TICTACTO.BAS8 DAUXH JSR SIOV LDY DSTATS TYA RTS EPROCA ZICCOM CMP #$0F ; 15 = FLUSH BNE :1 ; NO. JSR PFLUSH ; DO FLUSH LDY #$01 ; SUCCESS RTS ; HA0UDEVICE CONTROL BLOCK (DCB)DCB EQU $0300 ; BASEDDEVIC EQU DCB ; DEVICE #DUNIT EQU DCB+1 ; UNIT #DCOMND EQU DCB+2 ; COMMANDDSTATS EQU DCB+3 ; STATUS/DIRDBUFL EQU DCB+4 ; BUF ADR LDBUFH EQU DCB+5 ; XBUF ADR HDTIMLO EQU DCB+6 ; TIMEOUT (S)DRSVD EQU DCB+7 ; NOT USEDDBYTL EQU DCB+8 ; BUF LEN LDBYTH EQU DCB+9 ; BUF LEN HDAUXL EQU DCB+10 ; AUX BYTE LDAUXH EQU DCB+11 ; AUX BYTE HHATABS EQU $031A ; HANDYLER TBL ; IOCB'S * 8IOCB EQU $0340 ; IOCB BASEICHID EQU IOCB ; IDICDNO EQU IOCB+1 ; UNIT #ICCOM EQU IOCB+2 ; COMMANDICSTA EQU IOCB+3 ; STATUSICBAL EQU IOCB+4 ; BUF ADR LOWICBAH EQU IOCB+5 ; BZUF ADR HIGHICPTL EQU IOCB+6 ; PUT ADDR LICPTH EQU IOCB+7 ; PUT ADDR HICBLL EQU IOCB+8 ; BUF LEN LOWICBLH EQU IOCB+9 ; BUF LEN HIGHICAX1 EQU IOCB+10 ; AUX 1ICAX2 EQU IOCB+11 ; AUX 2ICAX3 EQU IOCB+12 ; AUX 3I[CAX4 EQU IOCB+13 ; AUX 4ICAX5 EQU IOCB+14 ; AUX 5ICAX6 EQU IOCB+15 ; AUX 6 ; HARDWARE REGISTERSPACTL EQU $D302 ; PIA CTRL A ; OS ROM VECTORSCIOV EQU $E456 ; CIO ENTRYSIOV EQU $E459 ; SIO ENTRY\ ; CONSTANTSPUTREC EQU $09 ; CIO PUTRECDEVIDN EQU $71 ; SIO DEVIDDSREAD EQU $40 ; FUJI->ATARIDSWRIT EQU $80 ; ATARI->FUJIMAXDEV EQU 4 ; # OF N: DEVSEOF EQU $88 ; ERROR 136EOL EQU ] $9B ; EOL CHAR SUBTTL 'HANDLER START' ORG $2300START JSR INIT ; DO INIT ; INSERT INTO HATABSIHTBS PROC ; FIND FIRST EMPTY ENTRY, OR ; ALREADY EXTANT N: ENTRY. LDY #$00:1 ^ LDA HATABS,Y BEQ HFND CMP #'N' BEQ HFND INY INY INY CPY #11*3 BCC :1 ; EITHER FOUND EMPTY SPOT, ; OR FOUND EXTANT N: ENTRY.HFND LDA #'N' S_TA HATABS,Y LDA #LOW CIOHND STA HATABS+1,Y LDA #HIGH CIOHND STA HATABS+2,Y EPROC ; MOVE MEMLO PROC LDA #LOW END STA MEMLO LDA #HIGH END STA ` MEMLO+1 EPROC SUBTTL 'SHOW FUJINET BANNER' ; QUERY FUJINET; JSR STPOLL ; OUTPUT READY OR ERROROBANR PROC LDX #$00 ; IOCB #0 E: LDA #PUTREC STA ICCOM,X LDA #$a28 ; 40 CHRS MAX STA ICBLL,X LDA #$00 STA ICBLH,X LDA DSTATS ; DSTATS < 128? BPL OBRDYOBERR LDA #LOW BERROR STA ICBAL,X LDA #HIGH BERROR STA ICBAH,X b JMP OBCIOOBRDY LDA #LOW BREADY STA ICBAL,X LDA #HIGH BREADY STA ICBAH,XOBCIO JSR CIOV EPROC ; VECTOR IN PROCEED INTERRUPTSPRCED PROC LDA #LOW PRCVEC STA VPRCED c LDA #HIGH PRCVEC STA VPRCED+1 EPROC ; RTS BACK TO DOSVEC, DONE. RTS SUBTTL 'CIO OPEN' OPEN PROC ; PERFORM THE OPEN JSR ENPRCD ; ENABLE PRCED JSR GDIDX ; X=ZdICDNO-1 LDA #DEVIDN ; $70 STA DDEVIC LDA ZICDNO STA DUNIT LDA #'O' ; 'O'PEN STA DCOMND LDA #DSWRIT ; -> PERIP STA DSTATS LDA ZICBAL ; POINT DBUF e STA DBUFL ; TO FILENAME LDA ZICBAH ; ... STA DBUFH ; ... LDA #$0F STA DTIMLO LDA #$00 ; OPEN WANTS STA DBYTL ; 256 BYTE LDA #$01 ; PAYLOAD STA DBYfTH ; ... LDA ZICAX1 ; IOCB AUX1... STA AX1SV,X ; ...SAVE IT STA DAUXL ; ...USE IT LDA ZICAX2 ; IOCB AUX2... STA AX2SV,X ; ...SAVE IT STA DAUXH ; ...USE IT JSR SIOV ;g SEND TO #FN ; RETURN DSTATS UNLESS = 144 ; IN WHICH CASE, DO A STATUS ; AND RETURN THE EXTENDED ERR ; FROM IT...OPCERR LDY DSTATS ; GET SIO STATUS CPY #$90 ; ERR 144?h BNE OPDONE ; NOPE. RETURN DSTATS ; 144, GET EXTENDED ERROR JSR STPOLL ; POLL FOR STATUS LDY DVSTAT+3 ; RESET BUFFER LENGTH + OFFSET OPDONE LDA #$01 STA TRIP JSR i GDIDX LDA #$00 STA RLEN,X STA TOFF,X STA ROFF,X TYA RTS ; AY = ERROR EPROC SUBTTL 'CIO CLOSE'CLOSE PROC JSR DIPRCD ; DIS INTRPS LDA #DEVIDNj ; $70 STA DDEVIC LDA ZICDNO ; UNIT # STA DUNIT LDA #'C' ; C = CLOSE STA DCOMND LDA #$00 ; NO PAYLOAD STA DSTATS STA DBUFL STA DBUFH STA k DBYTL STA DBYTH STA DAUXL STA DAUXH LDA #$0F STA DTIMLO JSR SIOV ; FLUSH BUFFERS IF NEEDED JSR PFLUSH LDY DSTATS TYA RTS EPROC l SUBTTL 'CIO GET'GET PROC JSR GDIDX LDA RLEN,X BNE :CDISC ; LEN > 0? ; LEN=0, DO A STATUS POLL ; AND UPDATE LEN JSR STPOLL JSR GDIDX LDA DVSTAT STA RLENm,X ; IF LEN=0, THEN RET EOF ; OTHERWISE, GET DATA FROM ; SIO. BNE :SIGET LDY #EOF LDA #EOF RTS:SIGET LDA #DEVIDN ; $71 STA DDEVIC LDA ZICDNO STA DUNInT LDA #'R' STA DCOMND LDA #DSREAD STA DSTATS JSR ICD2B STA DBUFH LDA #$00 STA DBUFL STA DBYTH STA DAUXH LDA #$0F STA DTIMoLO LDA DVSTAT STA DBYTL STA DAUXL JSR SIOV JSR GDIDX LDA #$00 STA ROFF,X:CDISC LDA DVSTAT+2 ; CHECK DISC BNE :EOF2 ; NOPE. LDA #EOF LDY p #EOF RTS:EOF2 LDA RLEN,X BNE :UPDP:UPDP DEC RLEN,X LDY ROFF,X CPX #$03 BEQ :G3 CPX #$02 BEQ :G2 CPX #$01 BEQ :G1 ; RETURN NEXT CHAR IN qAPROPOS ; BUFFER INTO A:G0 LDA RBUF,Y JMP :GX:G1 LDA RBUF+$100,Y JMP :GX:G2 LDA RBUF+$200,Y JMP :GX:G3 LDA RBUF+$300,Y JMP :GX:GX INC ROFF,X TAY ;r RESET TRIP IF LEN=0 LDA RLEN,X BNE :DONE LDA #$00 STA TRIP :DONE TYA LDY #$01 ; SUCCESS RTS ; DONE... EPROC SUBTTL 'CIO PUT'PUT PROC s ; ADD TO TX BUFFER JSR GDIDX LDY TOFF,X ; GET OFFSET STA TBUF,Y ; STORE CHAR INC TOFF,X ; INC OFFSET LDY #$01 ; SUCCESSFUL ; FLUSH IF EOL OR FULL CMP #EOL ; EtOL? BEQ :FLUSH ; FLUSH BUFFER JSR GDIDX ; GET OFFSET LDY TOFF,X CPX #$FF ; LEN = $FF? BEQ :FLUSH ; FLUSH BUFFER RTS ; FLUSH BUFFER, IF ASKED.:FLUSH JSR PFLUSH ; FLUSH BUuFFER RTS EPROCPFLUSH PROC ; CHECK CONNECTION, AND EOF ; IF DISCONNECTED. JSR STPOLL ; GET STATUS LDA DVSTAT+2 BNE :1 LDY #EOF LDA #EOF RTS:1 JSR vGDIDX ; GET DEV X LDA TOFF,X BNE :2 JMP :DONE ; FILL OUT DCB FOR PUT FLUSH:2 LDA #DEVIDN STA DDEVIC LDA ZICDNO STA DUNIT LDA #'W' ; WRITE STA wDCOMND LDA #DSWRIT STA DSTATS ; PICK APROPOS BUFFER PAGE CPX #$03 BEQ :TB3 CPX #$02 BEQ :TB2 CPX #$01 BEQ :TB1:TB0 LDA #HIGH TBUF BVC x :TBX:TB1 LDA #HIGH TBUF+1 BVC :TBX:TB2 LDA #HIGH TBUF+2 BVC :TBX:TB3 LDA #HIGH TBUF+3 BVC :TBX ; FINISH DCB AND DO SIOV:TBX STA DBUFH LDA #$00 STA DBUFL y STA DBYTH STA DAUXH LDA #$0F STA DTIMLO LDA TOFF,X STA DBYTL STA DAUXL JSR SIOV ; CLEAR THE OFFSET CURSOR ; AND LENGTH JSR GDIDX z LDA #$00 STA TOFF,X:DONE LDY #$01 RTS EPROC SUBTTL 'CIO STATUS' ; IF TRIP, DO STATUS POLL ; OTHERWISE, RETURN SAVED ; STATUS...STATUS PROC JSR ENPRCD ; ENABLE PRCD {JSR GDIDX ; GET DEVICE# LDA RLEN,X ; GET RLEN BNE STSLEN ; RLEN > 0? LDA TRIP BNE STTRI1 ; TRIP = 1? ; NO TRIP, RETURN SAVED LENSTSLEN LDA RLEN,X ; GET RLEN STA DVSTAT ; RET| IN DVSTAT LDA #$00 STA DVSTAT+1 JMP STDONE ; DONE. ; DO POLL AND UPDATE RCV LENSTTRI1 JSR STPOLL ; POLL FOR ST ; IS <= 256? LDA DVSTAT+1 BNE STTRI2 ; > 256 S}TA RLEN,X JMP STTRIU ; UPDATE TRIP ; > 256, SET TO 256STTRI2 LDA #$FF STA RLEN,X ; UPDATE TRIP FLAGSTTRIU BNE STDONE STA TRIP ; RLEN = 0 ; RETURN CONNECTED? FLAG.STDONE LDA ~ DVSTAT+2 RTS EPROC ; ASK FUJINET FOR STATUSSTPOLL PROC LDA #DEVIDN ; #FN DEVID STA DDEVIC LDA ZICDNO ; IOCB # STA DUNIT LDA #'S' ; S = STATUS STA DCOMND  LDA #DSREAD ; #FN->ATARI STA DSTATS LDA #LOW DVSTAT STA DBUFL ; PUT IN DVSTAT LDA #HIGH DVSTAT STA DBUFH ; ... LDA #$04 ; 4 BYTES STA DBYTL LDA #$00 STA DBYTH LDA #$0F STA DTIMLO LDA #$00 STA DAUXL STA DAUXH JSR SIOV ; DO IT... ; MAX 256 BYTES WAITING. LDA DVSTAT+1 BEQ STP2 LDA #$FF STA DVSTAT LDA #$00 STA DVSTAT+1 ; A = CONNECTION STATUSSTP2 LDA DVSTAT+2 RTS EPROC SUBTTL 'CIO SPECIAL'SPEC PROC LDY #$01 LDA #$00 RTS  EPROC SUBTTL 'UTILITY FUNCTIONS' ; ENABLE PROCEED INTERRUPTENPRCD LDA PACTL ORA #$01 ; ENABLE BIT 0 STA PACTL RTS ; DISABLE PROCEED INTERRUPTDIPRCD LDA PACTL AND #$FE  ; DISABLE BIT0 STA PACTL RTS ; GET ZIOCB DEVNO - 1 INTO X GDIDX PROC LDX ZICDNO ; IOCB UNIT # DEX ; - 1 RTS EPROC ; CONVERT ZICDNO TO BUFFER ; PAGE, RETURN IN AICD2B PROC LDX ZICDNO DEX CPX #$03 BEQ :3 CPX #$02 BEQ :2 CPX #$01 BEQ :1:0 LDA #HIGH RBUF BVC :DONE:1 LDA #HIGH RBUF + 1 BVC :DONE:2 LDA #HIGH RBUF + 2 BVC :DONE:3 LDA #HIGH RBUF + 3 BVC :DONE:DONE RTS EPROC ; DEBUGGING AID, BKG RED RED LDA #$34 STA COLOR2 RTS ; DEBUGGING AID, BKG GREENGREEN LDA #$B4 STA COLOR2 RTS SUBTTL 'INITIALIZATION'INIT PROC LDX #$FF LDA #$00 RTS EPROC ; PROCEED VECTORPRCVEC PROC LDA #$01 STA TRIP PLA RTI EPROC ; --------- END OF CODE ----- ; DEVHDL TABLE FOR N:CIOHND DW OPEN-1 DW CLOSE-1 DW GET-1 DW PUT-1 DW STATUS-1 DW SPEC-1 ; BANNERS BREADY DB '#FUJINET READY',$9BBERROR DB '#FUJINET ERROR',$9B ; VARIABLESTRIP DS 1 ; INTR FLAGAX1SV DS MAXDEV ; AUX1 SAVEAX2SV DS MAXDEV ; AUX2 SAVESTSV DS 4*MAXDEV ; STATUS SAVERLEN DS MAXDEV ; RCV LENROFF DS MAXDEV ; RCV OFFSETTOFF DS MAXDEV ; TRX OFFSET ; BUFFERS (PAGE ALIGNED) ORG * + $FF & $FF00RBUF DS 256*MAXDEV ; RXTBUF DS 256*MAXDEV ; TX 'P %B&(P)P*P`4```C&h@h## $$@%%#FUJINET READY#FUJINET ERROR#Lw% {%\&Lr%\&C&`q!S@    Y `` `)`!`!jEND = * ORG $02E0 DW STARTEN BNE STSLEN ; RLEN > 0? LDA TRIP BNE STTRI1 ; TRIP = 1? ; NO TRIP, RETURN SAVED LENSTSLEN LDA RLEN,X ; GET RLEN STA DVSTAT ; RET= ; DISABLE BIT0 STA PACTL RTS ; GET ZIOCB DEVNO - 1 INTO X GDIDX PROC LDX ZICDNO ; IOCB UNIT # DEX ; - 1 RTS EPROC ; CONVERT ZICDNO TO BUFFER ; PAGE, RETURN IN AICD2B PROC LDX ZICDNO DEX CPX #$03 BEQ :3 CPX #$02 BEQ :2 CPX #$01 BEQ :1:0 LDA #HIGH RBUF BVC :DONE:1 LDA #HIGH RBUF + 1 BVC :DONE:2 LDA #HIGH RBUF + 2 BVC :DONE:3 LDA #HIGH RBUF + 3 BVC :DONE:DONE RTS EPROC ; DEBUGGING AID, BKG RED RED LDA #$34 STA COLOR2 RTS ; DEBUGGING AID, BKG GREENGREEN LDA #$B4 STA COLOR2 RTS SUBTTL 'INITIALIZATION'INIT PROC LDX #$FF LDA #$00 RTS EPROC ; PROCEED VECTORPRCVEC PROC LDA #$01 STA TRIP PLA RTI EPROC ; --------- END OF CODE ----- ; DEVHDL TABLE FOR N:CIOHND DW OPEN-1 DW CLOSE-1 DW GET-1 DW PUT-1 DW STATUS-1 DW SPEC-1 ; BANNERS BREADY DB '#FUJINET READY',$9BBERROR DB '#FUJINET ERROR',$9B ; VARIABLESTRIP DS 1 ; INTR FLAGAX1SV DS MAXDEV ; AUX1 SAVEAX2SV DS MAXDEV ; AUX2 SAVESTSV DS 4*MAXDEV ; STATUS SAVERLEN DS MAXDEV ; RCV LENROFF DS MAXDEV ; RCV OFFSETTOFF DS MAXDEV ; TRX OFFSET ; BUFFERS (PAGE ALIGNED) ORG * + $FF & $FF00RBUF DS 256*MAXDEV ; RXTBUF DS 256*MAXDEV ; TXEND = * ORG $02E0 DW STARTDEV ; RCV OFFSETTOFF DS MAXDEV ; TRX OFFSET ; BUFFERS (PAGE ALIGNED) ORG * + $FF & $FF00RBUF DS 256*MAXDEV ; RXTBUF DS 256*MAXDEV ; TX= LIST D,G,I TITLE 'N: CIO HANDLER' SUBTTL 'EQUATES'; N: HANDLER FOR FUJINET; AUTHOR: THOM CHERRYHOMES; INCLUDE D2:EQUATES.ASM INCLUDE D2:INIT.ASM INCLUDE D2:OPEN.ASM  INCLUDE D2:CLOSE.ASM INCLUDE D2:GET.ASM INCLUDE D2:PUT.ASM INCLUDE D2:STATUS.ASM INCLUDE D2:SPECIAL.ASM INCLUDE D2:UTIL.ASM SUBTTL 'INITIALIZATION' ; PROCEED VECTORPRCVEC PROC LDA #$01 STA TRIP PLA RTI EPROC ; --------- END OF CODE ----- ; DEVHDL TABLE FOR N:CIOHND DW OPEN-1 DW CLOSE-1 DW GET-1 DW PUT-1 DW STATUS-1 DW SPEC-1 ; BANNERS BREADY DB '#FUJINET READY',$9BBERROR DB '#FUJINET ERROR',$9B ; VARIABLESTRIP DS 1 ; INTR FLAGAX1SV DS MAXDEV ; AUX1 SAVEAX2SV DS MAXDEV ; AUX2 SAVESTSV DS 4*MAXDEV ; STATUS SAVERLEN DS MAXDEV ; RCV LENROFF DS MAXDEV ; RCV OFFSETTOFF DS MAXDEV ; TRX OFFSET ; BUFFERS (PAGE ALIGNED) ORG * + $FF & $FF00RBUF DS 256*MAXDEV ; RXTBUF DS 256*MAXDEV ; TXEND = * ORG $02E0 DW STARTN: HANDLER FOR FUJINET; AUTHOR: THOM CHERRYHOMES; INCLUDE D2:EQUATES.ASM INCLUDE D2:INIT.ASM INCLUDE D2:OPEN.ASM R SUBTTL 'HANDLER START' ORG $2300START ; INSERT INTO HATABSIHTBS PROC ; FIND FIRST EMPTY ENTRY, OR ; ALREADY EXTANT N: ENTRY. LDY #$00:1 LDA HATABS,Y BEQ HFND  CMP #'N' BEQ HFND INY INY INY CPY #11*3 BCC :1 ; EITHER FOUND EMPTY SPOT, ; OR FOUND EXTANT N: ENTRY.HFND LDA #'N' STA HATABS,Y LDA #LOW CIOHND  STA HATABS+1,Y LDA #HIGH CIOHND STA HATABS+2,Y EPROC ; MOVE MEMLO PROC LDA #LOW END STA MEMLO LDA #HIGH END STA MEMLO+1 EPROC SUBTTL 'SHOW FUJINET BANNER' ; QUERY FUJINET; JSR STPOLL ; OUTPUT READY OR ERROROBANR PROC LDX #$00 ; IOCB #0 E: LDA #PUTREC STA ICCOM,X LDA #$28 ; 40 CHRS MAX STA ICBLL,X  SUBTTL 'UTILITY FUNCTIONS' ; ENABLE PROCEED INTERRUPTENPRCD LDA PACTL ORA #$01 ; ENABLE BIT 0 STA PACTL RTS ; DISABLE PROCEED INTERRUPTDIPRCD LDA PACTL AND #$FE ; DISABLE 4BIT0 STA PACTL RTS ; GET ZIOCB DEVNO - 1 INTO X GDIDX PROC LDX ZICDNO ; IOCB UNIT # DEX ; - 1 RTS EPROC ; CONVERT ZICDNO TO BUFFER ; PAGE, RETURN IN AICD2B 4 PROC LDX ZICDNO DEX CPX #$03 BEQ :3 CPX #$02 BEQ :2 CPX #$01 BEQ :1:0 LDA #HIGH RBUF BVC :DONE:1 LDA #HIGH RBUF + 1 BVC :DONE4 SUBTTL 'CIO SPECIAL'SPEC PROC ; HANDLE LOCAL COMMANDS. LDA ZICCOM CMP #$0F BNE :1 JSR PFLUSH ; HANDLE SIO COMMANDS. ; GET DSTATS FOR COMMAND:1 LDA #DEVIDN ; $71 0 STA DDEVIC LDA ZICDNO ; UNIT # STA DUNIT LDA #$FF ; DS INQ STA DCOMND LDA #DSREAD STA DSTATS LDA #LOW INQDS STA DBUFL LDA #HIGH INQDS 0STA DBUFH LDA #$01 STA DBYTL LDA #$00 STA DBYTH STA DAUXH LDA #$0F STA DTIMLO LDA ZICCOM STA DAUXL JSR SIOV ; DO IT... LDA D0STATS BPL :DSOK:DSERR TAY RTS:DSOK RTS EPROC LDA ZICCOM CMP #$0F BNE :1 JSR PFLUSH ; HANDLE SIO COMMANDS. ; GET DSTATS FOR COMMAND:1 LDA #DEVIDN ; $71 0O:2 LDA #HIGH RBUF + 2 BVC :DONE:3 LDA #HIGH RBUF + 3 BVC :DONE:DONE RTS EPROC STA PACTL RTS ; DISABLE PROCEED INTERRUPTDIPRCD LDA PACTL AND #$FE ; DISABLE 4 LDA #$00 STA ICBLH,X LDA DSTATS ; DSTATS < 128? BPL OBRDYOBERR LDA #LOW BERROR STA ICBAL,X LDA #HIGH BERROR STA ICBAH,X JMP OBCIOOBRDY LDA #LOW BREADY  STA ICBAL,X LDA #HIGH BREADY STA ICBAH,XOBCIO JSR CIOV EPROC ; VECTOR IN PROCEED INTERRUPTSPRCED PROC LDA #LOW PRCVEC STA VPRCED LDA #HIGH PRCVEC STA VPRCED+1 EPROC ; RTS BACK TO DOSVEC, DONE. RTS SUBTTL 'CIO OPEN' PROC ; FIND FIRST EMPTY ENTRY, OR ; ALREADY EXTANT N: ENTRY. LDY #$00:1 LDA HATABS,Y BEQ HFND c## N!NF&/ B(HI aD&ELX#RD&E V?&` & &q!O$% *q& +u&  Y x%p& &&&&` &q!C   8#$ Y $` &&Q x% &&`q!R@ &    Y &&`&މ&&'L$(L$)L$*L$&&p&` &&+&ɛ &&` $` x%` &&L;%q!W8$% +P ,P-P.P  &  Y &&` & &&p&&Lt% x%&Lo%&p&`q!S@    Y `"7q!@8  %o&"  Y`` `)`!`! 'P (P)P*P`p&h@e##$$=%%#FUJINET READY#FUJINET ERROR#S@    Y `"7q!@8 SUBTTL 'CIO PUT'PUT PROC ; ADD TO TX BUFFER JSR GDIDX LDY TOFF,X ; GET OFFSET STA TBUF,Y ; STORE CHAR INC TOFF,X ; INC OFFSET LDY #$01 ; SUCCESSFUL ; (FLUSH IF EOL OR FULL CMP #EOL ; EOL? BEQ :FLUSH ; FLUSH BUFFER JSR GDIDX ; GET OFFSET LDY TOFF,X CPX #$FF ; LEN = $FF? BEQ :FLUSH ; FLUSH BUFFER RTS ; FLUSH BUFF(ER, IF ASKED.:FLUSH JSR PFLUSH ; FLUSH BUFFER RTS EPROCPFLUSH PROC ; CHECK CONNECTION, AND EOF ; IF DISCONNECTED. JSR STPOLL ; GET STATUS LDA DVSTAT+2 BNE :1 LDY #EOF( LDA #EOF RTS:1 JSR GDIDX ; GET DEV X LDA TOFF,X BNE :2 JMP :DONE ; FILL OUT DCB FOR PUT FLUSH:2 LDA #DEVIDN STA DDEVIC LDA ZICDNO STA DUNI(T LDA #'W' ; WRITE STA DCOMND LDA #DSWRIT STA DSTATS ; PICK APROPOS BUFFER PAGE CPX #$03 BEQ :TB3 CPX #$02 BEQ :TB2 CPX #$01 BEQ( :TB1:TB0 LDA #HIGH TBUF BVC :TBX:TB1 LDA #HIGH TBUF+1 BVC :TBX:TB2 LDA #HIGH TBUF+2 BVC :TBX:TB3 LDA #HIGH TBUF+3 BVC :TBX ; FINISH DCB AND DO SIOV:TBX STA DBU(FH LDA #$00 STA DBUFL STA DBYTH STA DAUXH LDA #$0F STA DTIMLO LDA TOFF,X STA DBYTL STA DAUXL JSR SIOV ; CLEAR THE OFFSET CURSOR( ; AND LENGTH JSR GDIDX LDA #$00 STA TOFF,X:DONE LDY #$01 RTS EPROCFSET STA TBUF,Y ; STORE CHAR INC TOFF,X ; INC OFFSET LDY #$01 ; SUCCESSFUL ; (DE ----- ; DEVHDL TABLE FOR N:CIOHND DW OPEN-1 DW CLOSE-1 DW GET-1 DW PUT-1 DW STATUS-1 DW SPEC-1 ; BANNERS BREADY DB '#FUJINET READY',$9BBERROR DB '#FUJINET ERROR',$9B ; VARIABLESTRIP DS 1 ; INTR FLAGAX1SV DS MAXDEV ; AUX1 SAVEAX2SV DS MAXDEV ; AUX2 SAVESTSV DS 4*MAXDEV ; STATUS SAVERLEN DS MAXDEV ; RCV LENROFF DS MAXDEV ; RCV OFFSETTOFF DS MAXDEV ; TRX OFFSET ; BUFFERS (PAGE ALIGNED) ORG * + $FF & $FF00RBUF DS 256*MAXDEV ; RXTBUF DS 256*MAXDEV ; TXEND = * ORG $02E0 DW START D2:OPEN.ASM  SUBTTL 'CIO CLOSE'CLOSE PROC JSR DIPRCD ; DIS INTRPS LDA #DEVIDN ; $70 STA DDEVIC LDA ZICDNO ; UNIT # STA DUNIT LDA #'C' ; C = CLOSE STA DCOMND LDA # $00 ; NO PAYLOAD STA DSTATS STA DBUFL STA DBUFH STA DBYTL STA DBYTH STA DAUXL STA DAUXH LDA #$0F STA DTIMLO JSR SIOV ; FLUSH BUFFERS IF NEEDED JSR PFLUSH LDY DSTATS TYA RTS EPROCDEVIDN ; $70 STA DDEVIC LDA ZICDNO ; UNIT # STA DUNIT LDA #'C' ; C = CLOSE STA DCOMND LDA # \ SUBTTL 'CIO GET'GET PROC JSR GDIDX LDA RLEN,X BNE :CDISC ; LEN > 0? ; LEN=0, DO A STATUS POLL ; AND UPDATE LEN JSR STPOLL JSR GDIDX LDA DVSTAT STA $ RLEN,X ; IF LEN=0, THEN RET EOF ; OTHERWISE, GET DATA FROM ; SIO. BNE :SIGET LDY #EOF LDA #EOF RTS:SIGET LDA #DEVIDN ; $71 STA DDEVIC LDA ZICDNO STA $ DUNIT LDA #'R' STA DCOMND LDA #DSREAD STA DSTATS JSR ICD2B STA DBUFH LDA #$00 STA DBUFL STA DBYTH STA DAUXH LDA #$0F STA $ SUBTTL 'CIO OPEN' OPEN PROC ; PERFORM THE OPEN JSR ENPRCD ; ENABLE PRCED JSR GDIDX ; X=ZICDNO-1 LDA #DEVIDN ; $70 STA DDEVIC LDA ZICDNO STA DUNIT LDA #'O' ; 'O'PEN STA DCOMND LDA #DSWRIT ; -> PERIP STA DSTATS LDA ZICBAL ; POINT DBUF STA DBUFL ; TO FILENAME LDA ZICBAH ; ... STA DBUFH ; ... LDA #$0F  STA DTIMLO LDA #$00 ; OPEN WANTS STA DBYTL ; 256 BYTE LDA #$01 ; PAYLOAD STA DBYTH ; ... LDA ZICAX1 ; IOCB AUX1... STA AX1SV,X ; ...SAVE IT STA DAUXL ; ...USE IT LDA ZICAX2 ; IOCB AUX2... STA AX2SV,X ; ...SAVE IT STA DAUXH ; ...USE IT JSR SIOV ; SEND TO #FN ; RETURN DSTATS UNLESS = 144 ; IN WHICH CASE, DO A STATUS ; AND RETURN THE EXTENDED ERR ; FROM IT...OPCERR LDY DSTATS ; GET SIO STATUS CPY #$90 ; ERR 144? BNE OPDONE ; NOPE. RETURN DSTATS ; 144, GET EXTENDED ERROR JSR STPOLL ; POLL FOR STATUS LDY DVSTAT+3 ; RESET BUFFER LENGTH + OFFSET OPDONE LDA #$01 STA TRIP JSR GDIDX LDA #$00 STA RLEN,X STA TOFF,X STA ROFF,X TYA RTS ; AY = ERROR EPROCOC ; PERFORM THE OPEN JSR ENPRCD ; ENABLE PRCED JSR GDIDX ; X=ZICDNO-1 LDA #DEVIDN ; $70 STA DDEVIC LDA ZICDNO STA DUNIT LDA+ SUBTTL 'HANDLER START' ORG $2300START JSR INIT ; DO INIT ; INSERT INTO HATABSIHTBS PROC ; FIND FIRST EMPTY ENTRY, OR ; ALREADY EXTANT N: ENTRY. LDY #$00:1 LDA HATABS,Y  BEQ HFND CMP #'N' BEQ HFND INY INY INY CPY #11*3 BCC :1 ; EITHER FOUND EMPTY SPOT, ; OR FOUND EXTANT N: ENTRY.HFND LDA #'N' STA HATABS,Y  LDA #LOW CIOHND STA HATABS+1,Y LDA #HIGH CIOHND STA HATABS+2,Y EPROC ; MOVE MEMLO PROC LDA #LOW END STA MEMLO LDA #HIGH END STA MEMLO+1 EPROC SUBTTL 'SHOW FUJINET BANNER' ; QUERY FUJINET; JSR STPOLL ; OUTPUT READY OR ERROROBANR PROC LDX #$00 ; IOCB #0 E: LDA #PUTREC STA ICCOM,X LDA #$28 ; 40 CHRS MAX  STA ICBLL,X LDA #$00 STA ICBLH,X LDA DSTATS ; DSTATS < 128? BPL OBRDYOBERR LDA #LOW BERROR STA ICBAL,X LDA #HIGH BERROR STA ICBAH,X JMP OBCIOOBRDY LDA #LOW BREADY STA ICBAL,X LDA #HIGH BREADY STA ICBAH,XOBCIO JSR CIOV EPROC ; VECTOR IN PROCEED INTERRUPTSPRCED PROC LDA #LOW PRCVEC STA VPRCED LDA #HIGH PRCVEC STA VPRCED+1 EPROC ; RTS BACK TO DOSVEC, DONE. RTS SUBTTL 'CIO OPEN' PROC ; FIND FIRST EMPTY ENTRY, OR ; ALREADY EXTANT N: ENTRY. LDY #$00:1 LDA HATABS,Y | DTIMLO LDA DVSTAT STA DBYTL STA DAUXL JSR SIOV JSR GDIDX LDA #$00 STA ROFF,X:CDISC LDA DVSTAT+2 ; CHECK DISC BNE :EOF2 ; NOPE. LDA #EOF L$DY #EOF RTS:EOF2 LDA RLEN,X BNE :UPDP:UPDP DEC RLEN,X LDY ROFF,X CPX #$03 BEQ :G3 CPX #$02 BEQ :G2 CPX #$01 BEQ :G1 ; RETURN NEXT CH$ ; CURRENT IOCB IN ZERO PAGEZIOCB EQU $20 ; ZP IOCBZICHID EQU ZIOCB ; IDZICDNO EQU ZIOCB+1 ; UNIT #ZICCOM EQU ZIOCB+2 ; COMMANDZICSTA EQU ZIOCB+3 ; STATUSZICBAL EQU ZIOCB+4 ; BUF ADR LOWZICBAH EQU ZIOCB+5 ; BUF ADR HIGHZICPTL EQU ZIOCB+6 ; PUT ADDR LZICPTH EQU ZIOCB+7 ; PUT ADDR HZICBLL EQU ZIOCB+8 ; BUF LEN LOWZICBLH EQU ZIOCB+9 ; BUF LEN HIGHZICAX1 EQU ZIOCB+10 ; AUX 1ZICAX2 EQU ZIOCB+11 ; AUX 2ZICAX3 EQU ZIOCB+12 ; AUX 3ZICAX4 EQU ZIOCB+13 ; AUX 4ZICAX5 EQU ZIOCB+14 ; AUX 5ZICAX6 EQU ZIOCB+15 ; AUX 6 ; INTERRUPT VECTORS ; AND OTHER PAGE 2 VARSVPRCED EQU $0202 ; PROCEED VCTRCOLOR2 EQU $02C6 ; MODEF BKG CMEMLO EQU $02E7 ; MEM LODVSTAT EQU $02EA ; 4 BYTE STATS ; PAGE 3 ; DEVICE CONTROL BLOCK (DCB)DCB EQU $0300 ; BASEDDEVIC EQU DCB ; DEVICE #DUNIT EQU DCB+1 ; UNIT #DCOMND EQU DCB+2 ; COMMANDDSTATS EQU DCB+3 ; STATUS/DIRDBUFL EQU DCB+4 ; BUF ADR LDBUFH EQU DCB+5 ; BUF ADR HDTIMLO EQU DCB+6 ; TIMEOUT (S)DRSVD EQU DCB+7 ; NOT USEDDBYTL EQU DCB+8 ; BUF LEN LDBYTH EQU DCB+9 ; BUF LEN HDAUXL EQU  DCB+10 ; AUX BYTE LDAUXH EQU DCB+11 ; AUX BYTE HHATABS EQU $031A ; HANDLER TBL ; IOCB'S * 8IOCB EQU $0340 ; IOCB BASEICHID EQU IOCB ; IDICDNO EQU IOCB+1 ; UNIT #ICCOM EQU IOCB+2 ; COMMANDICSTA EQU IOCB+3 ; STATUSICBAL EQU IOCB+4 ; BUF ADR LOWICBAH EQU IOCB+5 ; BUF ADR HIGHICPTL EQU IOCB+6 ; PUT ADDR LICPTH EQU IOCB+7 ; PUT ADDR HICBLL EQU IOCB+8 ; BUF LEN LOWICBLH EQU IOCB+9 ; BUF LEN HIGHICAX1 EQU IOCB+10 ; AUX 1ICAX2 EQU IOCB+11 ; AUX 2ICAX3 EQU IOCB+12 ; AUX 3ICAX4 EQU IOCB+13 ; AUX 4ICAX5 EQU IOCB+14 ; AUX 5ICAX6 EQU IOCB+15 ; AUX 6 ; HARDWARE REGISTERSPACTL EQU $D302 ; PIA CTRL A  ; OS ROM VECTORSCIOV EQU $E456 ; CIO ENTRYSIOV EQU $E459 ; SIO ENTRY ; CONSTANTSPUTREC EQU $09 ; CIO PUTRECDEVIDN EQU $71 ; SIO DEVIDDSREAD EQU $40 ; FUJI->ATARIDSWRIT EQU $80 ; ATARI->FUJIMAXDEV EQU 4 ; # OF N: DEVSEOF EQU $88 ; ERROR 136EOL EQU $9B ; EOL CHAR ZIOCB+1 ; UNIT #ZICCOM EQU ZIOCB+2 ; COMMANDZICSTA EQU ZIOCB+3 ; STATUSZICBAL EQU ZIOCB+4 ; BUF ADR LOWZICBAH EQU ZqAR IN APROPOS ; BUFFER INTO A:G0 LDA RBUF,Y JMP :GX:G1 LDA RBUF+$100,Y JMP :GX:G2 LDA RBUF+$200,Y JMP :GX:G3 LDA RBUF+$300,Y JMP :GX:GX INC ROFF,X TAY $ ; RESET TRIP IF LEN=0 LDA RLEN,X BNE :DONE LDA #$00 STA TRIP :DONE TYA LDY #$01 ; SUCCESS RTS ; DONE... EPROC GDIDX LDA DVSTAT STA $ SUBTTL 'CIO PUT'PUT PROC ; ADD TO TX BUFFER JSR GDIDX LDY TOFF,X ; GET OFFSET STA TBUF,Y ; STORE CHAR INC TOFF,X ; INC OFFSET LDY #$01 ; SUCCESSFUL ; (FLUSH IF EOL OR FULL CMP #EOL ; EOL? BEQ :FLUSH ; FLUSH BUFFER JSR GDIDX ; GET OFFSET LDY TOFF,X CPX #$FF ; LEN = $FF? BEQ :FLUSH ; FLUSH BUFFER RTS ; FLUSH BUFF(ER, IF ASKED.:FLUSH JSR PFLUSH ; FLUSH BUFFER RTS EPROCPFLUSH PROC ; CHECK CONNECTION, AND EOF ; IF DISCONNECTED. JSR STPOLL ; GET STATUS LDA DVSTAT+2 BNE :1 LDY #EOF( LDA #EOF RTS:1 JSR GDIDX ; GET DEV X LDA TOFF,X BNE :2 JMP :DONE ; FILL OUT DCB FOR PUT FLUSH:2 LDA #DEVIDN STA DDEVIC LDA ZICDNO STA DUNI(T LDA #'W' ; WRITE STA DCOMND LDA #DSWRIT STA DSTATS ; PICK APROPOS BUFFER PAGE CPX #$03 BEQ :TB3 CPX #$02 BEQ :TB2 CPX #$01 BEQ( :TB1:TB0 LDA #HIGH TBUF BVC :TBX:TB1 LDA #HIGH TBUF+1 BVC :TBX:TB2 LDA #HIGH TBUF+2 BVC :TBX:TB3 LDA #HIGH TBUF+3 BVC :TBX ; FINISH DCB AND DO SIOV:TBX STA DBU(FH LDA #$00 STA DBUFL STA DBYTH STA DAUXH LDA #$0F STA DTIMLO LDA TOFF,X STA DBYTL STA DAUXL JSR SIOV ; CLEAR THE OFFSET CURSOR( ; AND LENGTH JSR GDIDX LDA #$00 STA TOFF,X:DONE LDY #$01 RTS EPROCFSET STA TBUF,Y ; STORE CHAR INC TOFF,X ; INC OFFSET LDY #$01 ; SUCCESSFUL ; ( SUBTTL 'CIO STATUS' ; IF TRIP, DO STATUS POLL ; OTHERWISE, RETURN SAVED ; STATUS...STATUS PROC JSR ENPRCD ; ENABLE PRCD JSR GDIDX ; GET DEVICE# LDA RLEN,X ; GET RLEN BNE STS,LEN ; RLEN > 0? LDA TRIP BNE STTRI1 ; TRIP = 1? ; NO TRIP, RETURN SAVED LENSTSLEN LDA RLEN,X ; GET RLEN STA DVSTAT ; RET IN DVSTAT LDA #$00 STA DVSTAT+1 JMP STDONE ; DO,NE. ; DO POLL AND UPDATE RCV LENSTTRI1 JSR STPOLL ; POLL FOR ST ; IS <= 256? LDA DVSTAT+1 BNE STTRI2 ; > 256 STA RLEN,X JMP STTRIU ; UPDATE TRIP ; > 256, SET TO 256ST,TRI2 LDA #$FF STA RLEN,X ; UPDATE TRIP FLAGSTTRIU BNE STDONE STA TRIP ; RLEN = 0 ; RETURN CONNECTED? FLAG.STDONE LDA DVSTAT+2 RTS EPROC ; ASK FUJINET FOR STATUSSTPOLL PROC, LDA #DEVIDN ; #FN DEVID STA DDEVIC LDA ZICDNO ; IOCB # STA DUNIT LDA #'S' ; S = STATUS STA DCOMND LDA #DSREAD ; #FN->ATARI STA DSTATS LDA #LOW DVSTAT, STA DBUFL ; PUT IN DVSTAT LDA #HIGH DVSTAT STA DBUFH ; ... LDA #$04 ; 4 BYTES STA DBYTL LDA #$00 STA DBYTH LDA #$0F STA DTIMLO LDA , #$00 STA DAUXL STA DAUXH JSR SIOV ; DO IT... ; MAX 256 BYTES WAITING. LDA DVSTAT+1 BEQ STP2 LDA #$FF STA DVSTAT LDA #$00 STA DVSTAT+1 , ; A = CONNECTION STATUSSTP2 LDA DVSTAT+2 RTS EPROCWISE, RETURN SAVED ; STATUS...STATUS PROC JSR ENPRCD ; ENABLE PRCD JSR GDIDX ; GET DEVICE# LDA RLEN,X ; GET RLEN BNE STS,L:xx??B&NDEV COMB0DOS SYSBGDUMBTERMBASCNDEV ASMB NDEV ASMB EQUATES ASMBINIT ASMBOPEN ASMBCLOSE ASMBGET ASMBPUT ASMBSTATUS ASMB*SPECIAL ASMBUTIL ASMB ITICTACTOBAS