–è,€Àû?hü?@L0ýˬð6­…C�­…D�­¬® l0¬±C)HÈCð±C¨ WhL/©ÀÐh ¨`¥Cm�…C¥Di�…D`� Œ ©R @�©P €�Œ©1 �Œ©�ÿ© €Êð© � Œ YäÎÿ0¢@©RÍð ©!Í𢀎L¢®­`ª ¾ Ë ¦ …D­ �Ö­ …C­ …D­ � ¢Ž  ° ©��)�1ð6 ©‘C莩S� Sä ­ê) Ј˜® �¥C�)¥D�1 pˆð pʲ¬ ¢©ˆ˜�˜0 ¥C�9¥D�I pèàÐâ¥C�ç¥D�èL~¥Ci€…C¥Di…D`  › LIST D›› TITLE 'N: CIO HANDLER'› SUBTTL 'EQUATES'››; N: HANDLER FOR FUJINET›; AUTHOR: THOM CHERRYHOMES›; ›› ; CURRENT IOCB IN ZERO PAGE››ZIOCB EQU $20 ; ZP IOCB›ZICHID EQU ZIOCB ý ; ID›ZICDNO EQU ZIOCB+1 ; UNIT #›ZICCOM EQU ZIOCB+2 ; COMMAND›ZICSTA EQU ZIOCB+3 ; STATUS›ZICBAL EQU ZIOCB+4 ; BUF ADR LOW›ZICBAH EQU ZIOCB+5 ; BUF ADR HIGH›ZICPTL EQU ZIOCB+6 ; PUT ADDR L›ZICPTH EQU ZIOCB+7 ; PUT A ýDDR H›ZICBLL EQU ZIOCB+8 ; BUF LEN LOW›ZICBLH EQU ZIOCB+9 ; BUF LEN HIGH›ZICAX1 EQU ZIOCB+10 ; AUX 1›ZICAX2 EQU ZIOCB+11 ; AUX 2›ZICAX3 EQU ZIOCB+12 ; AUX 3›ZICAX4 EQU ZIOCB+13 ; AUX 4›ZICAX5 EQU ZIOCB+14 ; AUX 5›ZICAX6 EQU ý ZIOCB+15 ; AUX 6›› ; INTERRUPT VECTORS› ; AND OTHER PAGE 2 VARS››VPRCED EQU $0202 ; PROCEED VCTR›COLOR2 EQU $02C6 ; MODEF BKG C›MEMLO EQU $02E7 ; MEM LO›DVSTAT EQU $02EA ; 4 BYTE STATS›› ; PAGE 3› ; ýDEVICE CONTROL BLOCK (DCB)››DCB EQU $0300 ; BASE›DDEVIC EQU DCB ; DEVICE #›DUNIT EQU DCB+1 ; UNIT #›DCOMND EQU DCB+2 ; COMMAND›DSTATS EQU DCB+3 ; STATUS/DIR›DBUFL EQU DCB+4 ; BUF ADR L›DBUFH EQU DCB+5 ; ýBUF ADR H›DTIMLO EQU DCB+6 ; TIMEOUT (S)›DRSVD EQU DCB+7 ; NOT USED›DBYTL EQU DCB+8 ; BUF LEN L›DBYTH EQU DCB+9 ; BUF LEN H›DAUXL EQU DCB+10 ; AUX BYTE L›DAUXH EQU DCB+11 ; AUX BYTE H››HATABS EQU $031A ; HAND ýLER TBL›› ; IOCB'S * 8››IOCB EQU $0340 ; IOCB BASE›ICHID EQU IOCB ; ID›ICDNO EQU IOCB+1 ; UNIT #›ICCOM EQU IOCB+2 ; COMMAND›ICSTA EQU IOCB+3 ; STATUS›ICBAL EQU IOCB+4 ; BUF ADR LOW›ICBAH EQU IOCB+5 ; B ýUF ADR HIGH›ICPTL EQU IOCB+6 ; PUT ADDR L›ICPTH EQU IOCB+7 ; PUT ADDR H›ICBLL EQU IOCB+8 ; BUF LEN LOW›ICBLH EQU IOCB+9 ; BUF LEN HIGH›ICAX1 EQU IOCB+10 ; AUX 1›ICAX2 EQU IOCB+11 ; AUX 2›ICAX3 EQU IOCB+12 ; AUX 3›I ýCAX4 EQU IOCB+13 ; AUX 4›ICAX5 EQU IOCB+14 ; AUX 5›ICAX6 EQU IOCB+15 ; AUX 6›› ; HARDWARE REGISTERS››PACTL EQU $D302 ; PIA CTRL A›› ; OS ROM VECTORS››CIOV EQU $E456 ; CIO ENTRY›SIOV EQU $E459 ; SIO ENTRY ý›› ; CONSTANTS››PUTREC EQU $09 ; CIO PUTREC›DEVIDN EQU $71 ; SIO DEVID›DSREAD EQU $40 ; FUJI->ATARI›DSWRIT EQU $80 ; ATARI->FUJI›MAXDEV EQU 4 ; # OF N: DEVS›EOF EQU $88 ; ERROR 136›› SUBTT ýL 'HANDLER START'›› ORG $2300››START JSR INIT ; DO INIT›› ; INSERT INTO HATABS››IHTBS 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 ERROR››OBANR 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 OBRDY››OBERR LDA #LOW BERROR› STA ICBAL,X› LDA #HIGH BERROR› STA ICBAH,X› JMP OBCIO››OBRDY LDA #L ýOW BREADY› STA ICBAL,X› LDA #HIGH BREADY› STA ICBAH,X›OBCIO JSR CIOV› EPROC›› ; VECTOR IN PROCEED INTERRUPT››SPRCED 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 DATA››GFETC 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 SIO››GFSIO 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 VECTOR››PRCVEC 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',$9B›BERROR DB '#FUJINET ERROR',$9B›› ; VARIABLES››TRIP DS 1 ; INTR FLAG›AX1SV DS MAXDEV ; AUX1 SAVE›AX2SV DS MAXDEV ; AUX2 SAVE›STSV $ýDS 4*MAXDEV ; STATUS SAVE›RLEN DS MAXDEV ; RCV LEN›ROFF DS MAXDEV ; RCV OFFSET›TOFF DS MAXDEV ; TRX OFFSET›INQDS DS 1 ; DSTATS INQ›› ; BUFFERS (PAGE ALIGNED)›› ORG * + $FF & $FF00››RBUF DS %ý256*MAXDEV ; RX›TBUF DS 256*MAXDEV ; TX››END = *›› ORG $02E0› DW START›M CHERRYHOMES›; ›› INCLUDE D2:EQUATES.ASM› INCLUDE D2:INIT.ASM› INCLUDE D2:OPEN.ASM› vÿÿ#û# ¹ð ÉNðÈÈÈÀ!�ð©N™©Š™©&™©�ç©/�袩 �B©(�H©�I­ ©¥�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­ � ¢Ž  ° ©��)�1ð6 ©‘C莩S� Sä ­ê) Ј˜® �¥C�)¥D�1 pˆð pʲ¬ ¢©ˆ˜�˜0 ¥C�9¥D�I pèàÐâ¥C�ç¥D�èL~¥Ci€…C¥Di…D` ©™�ˆÐú ¹ð ÉDðÈÈÈÀÐð©D™©Ë™©™` d ž½J�‚)ðL­ !½‚Éð1ýÉðDÉ ð É ðL¿(°�(° ¬ ® LðL»(°ú¬¹)ð ¬ ¿ �޽‹��L| L·(° S ¬LH ­0p� n­�­� ¿¬¢ © ™ÈÊù® ¬™½‹™©C™©™™¢½YÉ?ð™Èèà �ð® q • â©€�… ›ÐL L𠽩�…­ ��©�‡����` • ¬¹)�„¹�‹¹2ý�Œ `�½A…! d¬¹Éß°©…"½‚)ð-¼‡˜Ý†� ”°"   °±$�þ‡­‘G©@…�…LðL¿Lô½‚I ð$jê�¥")ð ® °¥$…G¥%…H­ �3°S8`­ø�‡¨±G� ȱG� ȱG�  ”¬ø­ ‘GÈ­ ‘GÈ­ ‘G¥G}†…G¥Hi…H8¥(ý†…(¥)éê…) ® �¡¥G…$¥H…%¼ˆˆ Ð`­þÉÐ¥(0ó¥)Ðï8` d3ý½‚)ðL¹ ½‡݆�  �ðLô¨±G�Ș�‡¼‹Ð¼ŒР݆�©LÓLð d ž !° ¬ LðL» d½‚)ðN>…�Q « € ½�H½�H½‚)ð ® �û½��‹½Ž�Œ ³¬hy™hy™©B™ q •©�‚Lê>…�ó øLm ½�JJ� › � › � �Ln© �*ˆÐù` d½BÉþð%É'°8é � ¨¹Å 4ýH¹Æ H` Ø 1 Ò { ‚ ¹ L¿L žŒ  !�L» ¬ ›Ð ¬  ´ ›Ð¬¹H¹¨h S¢¬½YÉ?ð™Èèà �ð® q ž 1�¸Lê ž !°? S ›Ð  q 1�í •Lê ¿¬ ¬ ©€™ ® Ll ° ÅLg  ©ÿ‘E`L»© �Щ� ž !�L»¬¹)ß ™ q 1�êLꬹ) Ð`LÁ½…5ý0A½M݊нL݉ð½…ð ø©�…½M�Œ½L�‹ ° ½N݆�ðLÃ�‡LðL¹½‡�N½‰�L½Š�MLð¥H�¥G�©!�©@�®þ©1¬F †À�Р±GÉÿÐȱGÉÿðLµLÓ©¨‘EÈû ©‘EȩÑEÈÈ‘E©ˆ‘EÈÈ‘E  ©ÿ‘EÈÀdÐù©  ‘E 7©‘EÈ©‘E •©¨™Èú©� qÎø Lê©� !�,°06ý,0S¬±G�îɛРÀ°©€�Lð©� 1° !Lð ‹ ±EHˆ±E¨h W ¢ ½‘GÈÊ÷ g©�LêLôSROTCES EERF  © ‘G®½) ð©*‘GÈ© ‘GȽ‘GèÈÀ �õ© ‘GÈŒ®¼½¢d q¢ q˜ � ©›‘G Œ`Ž¢ÿ� Œ è8­ í¨­ é°êŠ 0¬‘Gî­ ¬ `½D…C½E…D ±Cˆ0XÉ:Ð÷È¢ 7ý© �YÊú¢Ž ȱCÉ*Ð ©? �ùð0.É.Ð , 0%¢n �ÞÉ?ðÉA�É[� àðÉ0� É:° Lî`LÅà� ðà �`, 0`�Yè`©ÿ���©p�î­iî©Í�ðH n©�¨¹ð0)ÐÕ¢½YÉ?ðÙÐÇèÈà Ðî�­­�­�­�¹0¢8®`½…0  �… ø0$L ½‡¬û‘G8ý½Œ�¬ø‘GȽ‹‘G ø­�©�‚­LÓþ�Ðþ� ©�‹�Œ�‡­ø�†`8½Š¼‰L÷½‹�‰½Œ�Š`½…ðL”½‹ŒÐ8`  ù05¬ø±G)üÝ�Ð,±G)�ŒȱG�‹ȱGH½„Ðh0©})Hh�†©�‡` å½BÉ!ð Ç8`�8©�©�­ii¨©iL« ±Eð`� ©‘E8¥F�¥E� h©(®þ 9ýl0`ɃðLåLÉ ‹L•½‰Šð8© ^Š~‰jˆÐö jˆÐü¨©8jˆüH½‰i ¨hE‘E ±Ei‘EȱEi‘E`  ÈÀd°T±Eð÷Œ H8 ±Eé‘EȱEé‘EÈ©ÿ‘Eh ÿÈ �üŒ Jˆü¬ ‘E8­ é  Œ  . ÈÀ�÷m �‹­ i�Œ`LË©Ÿ…IŽºè莮¤!Œˆ¹)…E¹1…F¹ðR�þ¨¹ø�ø¹û�û¼ˆˆ1 ¹ðÈÀ�öLÍ:ý­þJ°ÈÀ°ò¹Ð舩€™©€™˜�ˆþˆ¹9…G¹I…H`Lϼˆðˆ©�ˆ™­þJ°J™`H¥G�¥H�h®þ l`¼‰½Š S gLð©�©�©�©� � î ¢8 r­i€�­i�­ ÍÐÞ`Œ�­þ�¬øŒд­…C­…D ±C‘GÈÌø�ö˜�‡ WÍ � Ð¥CÍ �Ð ”Lq`  ¹X٨ЈÐõ`D;ýOS SYS æIæIæIæIæIæIæIæIæIæIæIæIæIæI¥I®�C®š®¨­`­0é® Þ©Ðß©ˆ0Ûý}ýÿÿó,16 €„€€ÿþýüûúùø÷ö€ €€€€OS !!""##"#DOSDOS SYS €}€ý; <ýB&NDEV COMC0DOS SYS€8SNDEV BAKCNDEV ASMB NDEV ASMB ÎEQUATES ASMBšINIT ASMB¾OPEN ASM=ý�Ù©�©�©1�©@� ©� `�  à¥Ð©À�T©�ÆL¾©À ]L!­T©… ©… ­œêÉ�Ð ©� ©�  à©�D�!¥ð` �Ø©�T©²�S  æ0 c  æ0 c  æ ( æ0 cÎÙ>ý©�Ø`©°�!©… LD:STARTUP.EXC›D:DOSXL.SYS›D:AUTORUN.SYS›D:MENU.COM›¢¹³�7�"ÈèÉ›Ðñ¢© Ü (`¥;ÐL�ê˜HL³êLLZLLÁ›D1:D:MENU.COM›XC›ÿÿ¢ÿÿ@âBNIT.COM›››››››››››››››››@INIT›REE SECTORS››osXL230.atr›îã® ›ÿ©… ©ÿ¢ @©E�ß©:�à ©¢ŽK© ü?ý©¦ u Ë ÿýl‰ÿlú¿làlâl,©�µh�¶h�·rÿÿÿÿ'­¼Iÿ�¼Í¼ðlú¿©¯ \LAlàlâlS©�Üh�Ýh�ÞLZ©ÿ…©�Ü $©¦ \LA¢ ©E�7©:�8 ‰¢ŽK© Ü` «­Üð©�Ü­ÞH­ÝH` ó ¹UÉ0�É:�É ÐÈÐîÉ@ÐLÉ*Ð ýLAŒ  Á®Z­[�Ö ¹: ª]0ð@ý8ʈð�ÎÖæ08Éa�É{°)ß(`­Ö ª½]H½\H`­Ù…­Øð©�Ø…�!©ÿ�ÙLß` ¹7 QðÈÐõ©:Ù6ð¢½,™7ÈÊö c¢ ­ÛÐ ýLA©DÍ7Ð ©1¬8À:ð˜�LAMOC.REMCARENDSCRNOSRENPROUNPSAVLOARUNERADIRTYP) @Ä15=Œw{ Y œ©#Щ$Щ! é \LA Á ù¢© AýáL… Á½6É:Ð ©*�7�9©.�8©¢ ÜL…©�Ú B¹UÉ›ð© �Ú Á©¢ ÜL… ëûLA¢ Ÿ© "0 ®Ú Ÿ© "` Á©L¶ BÉ›ð �SŒT ýLA Á¢© Ü0' �7Œ8 �9Œ: l© " 7© "0LA \LA Á cLA©�Û©�ᢩ Ü06©ÿ�Ø l ¶­7�S­8�T ³ûÉ…ðBý ɈТ ­áð©�ÛL÷ \LA` ‚©�ã© "0ð­8ÉÿÐ Í7Э9�7­:�8  •© 9 �L¶ 7© "H ÷h`­ãÐ`©�ÛLúÈŒ  ÁŠH½7�"Ê÷hª ¹×�"èˆö­!)@ ��!LA©ðö­!)¿L,­! @Ðç© "¢ �©�J© "0a­!)ð ­!)Ï�!Т  ¹2�Lèˆö¢ ©% "¢ H¢ ©& "¢  ½CýL™2èˆö¢ h0,!p ¢ Ÿ© "`©�!Ló­!) Ð \ ­!Œ!)@ðLûL›CXE.�J©H ‰hL"H Áh¢Lá­! 0¢  •©  �© "­!LE¢ Ÿ©L"© �B Vä½CÉ€ð¨` \LA¬5ÈÐ'¬6ÈÐ!¬7­8 �8­9í7¨­:í8�ÈÐiL—©« \LA©ÿ�5�6¢  • 5©L�¢  • 7©�EDý˜�D`©�I˜�H` U© � €L•©�Ö­Ö ª ÎÖÐð`¢©›�7Êú B¢¹UÉ›ð ©:ÙVðÙWð ½�7èàÐõ¹U�7 QðèÈÐñŒ `©�Ö�× B8¹Ué0�$É � é�É �ɰ¢Ö.×ÊÐ÷ Ö�ÖÈÐÔŒ ­Ö¬×`¬ ¹U UÐÈÐõ`É›ðûÉ,ð÷É `ɦð¢Ž!É�Щ¨É °i,ɰ�©¤) ª½ ¼¡¢ � ÿ •©Eý L"DRIVE NUMBER ERROR›NO BUFFERS›DISK FULL›I/O ERROR›SYSTEM ERROR›INVALID FILE NAME›OSS DOS XL - ATARI version 2.30p Copyright (C) 1983 OSS,Inc.›FILE PROTECTED›WRITE PROTECTED›DIRECTORY FULL›FILE NOT FOUND›ADR RANGE ERROR›BREAK KEY ABORT›INVALFýID DEVICE›NO CARTRIDGE›�£®¸ÂÏá'6FUdt„“}Õ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ}ìý8¡·ËÃÁÌÍB×d~:@@@N:TCP://BBS.FOZZTEXX.NET/Z@@K:lB@@a~AdAUnZF:Ad,AU%)@€2*@€Z@Hý@N:xF@‚26…-F:AG,$AV%F:AF,F…"A‚K„-@…)@�+*@�/ „AB@@aK A€D:DUMBTERM.BASF:Ad,AU%)@€2*@€Z@È67¬  B¨YN¤ON¤H¤D¤ÃÓÁÌØWINNEÒÎBØBÙÍB°B±B²B³B´BµB¶B·B¸×W±W²W³@€€€€ 8Jý  ÔÉíÔÁíÔÏÅ  FOR #FUJINET›$$AN EXAMPLE OF HOW TO IMPLEMENT›##A GAME USING THE UDP PROTOCOL›(AND THE N: DEVICE.›2›< AUTHOR: THOMAS CHERRYHOMES›F""›P›Z<<€98Ký@ ,�;@,‚;@,ƒ;@d,„;@d,dMAIN PROGRAM ›e-6…-@6†-@-B@@anSTART SCREEN›x6 (}-@ @6( £ÆÕÊÉÎÅÔ ÔÉíÔÁíÔÏÅ ‚*((ENTER YOUR NAME >*@�Œ0(0(%ENTER HOSTNAM8LýE, OR  ÒÅÔÕÒΠ TO LISTEN– (> @ƒ " ƒ46…-@"6†-@ªA6„.N:UDP://&6„7B:„,%@,.ƒA6„7B:„,%@,.:6502/´ @@„µ&(&(WAITING FOR OTHER PLAYER...¶ @�·_B@@a8Mý"@‡16ˆ-F:AF,=ˆ"Q‰-@@PU ‰_ A‚¸@‚¹66Š-#‰-@26€8‰,-6 ‰È6 (}-@ @6( £ÆÕÊÉÎÅÔ ÔÉíÔÁíÔÏÅ Ò(Ü( | | æ( | | 8Ný ð( 1 | 2 | 3 ú( | | ( | | (( | | "( | | ,( 4 | 5 | 6 6( | | @( | | J(8OýT( | | ^( | | 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(œ[ A€ô6€8Ž&@,-…þ‘‘(@€8,,€8@,,€8@,,€8@,,€8@,,€8@,,€88Sý@,,€8@,,€8@,6†-@ A!!( WAITING FOR ‚'S MOVE.EB@@a"@‡16ˆ-F:AF,Eˆ"A0 @��‘’“”•–—&Š6€8,-�!6€8@,-�06€8@,-‘?6€8@8Tý,-’N6€8@,-“]6€8@,-”l6€8@,-•{6€8@,-–Š6€8@,-—N6†-@ A¼ #APÆT˜-@@"™š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› EPROC››A ZICCOM› CMP #$0F ; 15 = FLUSH› BNE :1 ; NO.› JSR PFLUSH ; DO FLUSH› LDY #$01 ; SUCCESS› RTS›› ; HA0UDEVICE CONTROL BLOCK (DCB)››DCB EQU $0300 ; BASE›DDEVIC EQU DCB ; DEVICE #›DUNIT EQU DCB+1 ; UNIT #›DCOMND EQU DCB+2 ; COMMAND›DSTATS EQU DCB+3 ; STATUS/DIR›DBUFL EQU DCB+4 ; BUF ADR L›DBUFH EQU DCB+5 ; XýBUF ADR H›DTIMLO EQU DCB+6 ; TIMEOUT (S)›DRSVD EQU DCB+7 ; NOT USED›DBYTL EQU DCB+8 ; BUF LEN L›DBYTH EQU DCB+9 ; BUF LEN H›DAUXL EQU DCB+10 ; AUX BYTE L›DAUXH EQU DCB+11 ; AUX BYTE H››HATABS EQU $031A ; HANDYýLER TBL›› ; IOCB'S * 8››IOCB EQU $0340 ; IOCB BASE›ICHID EQU IOCB ; ID›ICDNO EQU IOCB+1 ; UNIT #›ICCOM EQU IOCB+2 ; COMMAND›ICSTA EQU IOCB+3 ; STATUS›ICBAL EQU IOCB+4 ; BUF ADR LOW›ICBAH EQU IOCB+5 ; BZýUF ADR HIGH›ICPTL EQU IOCB+6 ; PUT ADDR L›ICPTH EQU IOCB+7 ; PUT ADDR H›ICBLL EQU IOCB+8 ; BUF LEN LOW›ICBLH EQU IOCB+9 ; BUF LEN HIGH›ICAX1 EQU IOCB+10 ; AUX 1›ICAX2 EQU IOCB+11 ; AUX 2›ICAX3 EQU IOCB+12 ; AUX 3›I[ýCAX4 EQU IOCB+13 ; AUX 4›ICAX5 EQU IOCB+14 ; AUX 5›ICAX6 EQU IOCB+15 ; AUX 6›› ; HARDWARE REGISTERS››PACTL EQU $D302 ; PIA CTRL A›› ; OS ROM VECTORS››CIOV EQU $E456 ; CIO ENTRY›SIOV EQU $E459 ; SIO ENTRY\ý›› ; CONSTANTS››PUTREC EQU $09 ; CIO PUTREC›DEVIDN EQU $71 ; SIO DEVID›DSREAD EQU $40 ; FUJI->ATARI›DSWRIT EQU $80 ; ATARI->FUJI›MAXDEV EQU 4 ; # OF N: DEVS›EOF EQU $88 ; ERROR 136›EOL EQU ]ý $9B ; EOL CHAR›› SUBTTL 'HANDLER START'›› ORG $2300››START JSR INIT ; DO INIT›› ; INSERT INTO HATABS››IHTBS 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 ERROR››OBANR PROC› LDX #$00 ; IOCB #0 E:› LDA #PUTREC› STA ICCOM,X› LDA #$aý28 ; 40 CHRS MAX› STA ICBLL,X› LDA #$00› STA ICBLH,X› LDA DSTATS ; DSTATS < 128?› BPL OBRDY››OBERR LDA #LOW BERROR› STA ICBAL,X› LDA #HIGH BERROR› STA ICBAH,X› bý JMP OBCIO››OBRDY LDA #LOW BREADY› STA ICBAL,X› LDA #HIGH BREADY› STA ICBAH,X›OBCIO JSR CIOV› EPROC›› ; VECTOR IN PROCEED INTERRUPT››SPRCED 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=ZdýICDNO-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 DBYfýTH ; ...› 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 DUNInýT› LDA #'R'› STA DCOMND› LDA #DSREAD› STA DSTATS› JSR ICD2B› STA DBUFH› LDA #$00› STA DBUFL› STA DBYTH› STA DAUXH› LDA #$0F› STA DTIMoýLO› 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 qý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›› ;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 ; EtýOL?› 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 BUuýFFER› RTS› EPROC››PFLUSH PROC›› ; CHECK CONNECTION, AND EOF› ; IF DISCONNECTED.›› JSR STPOLL ; GET STATUS› LDA DVSTAT+2› BNE :1 › LDY #EOF› LDA #EOF› RTS››:1 JSR vý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 DUNIT› LDA #'W' ; WRITE› STA wý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 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 LEN››STSLEN LDA RLEN,X ; GET RLEN› STA DVSTAT ; RET|ý IN DVSTAT› LDA #$00› STA DVSTAT+1› JMP STDONE ; DONE.›› ; DO POLL AND UPDATE RCV LEN››STTRI1 JSR STPOLL ; POLL FOR ST› › ; IS <= 256?›› LDA DVSTAT+1› BNE STTRI2 ; > 256› S}ýTA RLEN,X› JMP STTRIU ; UPDATE TRIP›› ; > 256, SET TO 256››STTRI2 LDA #$FF› STA RLEN,X›› ; UPDATE TRIP FLAG››STTRIU BNE STDONE› STA TRIP ; RLEN = 0›› ; RETURN CONNECTED? FLAG.››STDONE LDA ~ý DVSTAT+2› RTS› EPROC›› ; ASK FUJINET FOR STATUS››STPOLL 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 #$0€ý0 › 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 STATUS››STP2 LDA DVSTAT+2› RTS› EPROC›› SUBTTL 'CIO SPECIAL'››SPEC PROC› LDY #$01› LDA #$00› RTS› ‚ý EPROC›› SUBTTL 'UTILITY FUNCTIONS'›› ; ENABLE PROCEED INTERRUPT››ENPRCD LDA PACTL› ORA #$01 ; ENABLE BIT 0› STA PACTL› RTS›› ; DISABLE PROCEED INTERRUPT››DIPRCD 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 A››ICD2B 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› BV…ýC :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 GREEN››GREEN LDA #$B4› STA COLOR2› RTS›› SUBTTL 'INITIALIZATION'››INIT PROC› LDX #$FF› LDA #$00› RTS› EPROC›› ; PROCEED VECTOR››PRCVEC 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',$9B›BERROR DB '#FUJINET ERROR',$9B›› ; VARIABLES››TRIP DS 1 ; INTR FLAG›AX1SV DS MAXDEV ; AUX1 SAVE›AX2SV DS MAXDEV ; AUX2 SAVE›STSV DS 4*MAXDEV ; ST‰ýATUS SAVE›RLEN DS MAXDEV ; RCV LEN›ROFF DS MAXDEV ; RCV OFFSET›TOFF DS MAXDEV ; TRX OFFSET›› ; BUFFERS (PAGE ALIGNED)›› ORG * + $FF & $FF00››RBUF DS 256*MAXDEV ; RX›TBUF DS 256*MAXDEV ; TX›‹ýð àð©'P ô%B&©(P©)P©*P`©4�Æ`©´�Æ`¢ÿ©`©�C&h@h#Ð# $­$@%Å%#FUJINET READY›#FUJINET ERROR›àá#àá©�ëLw% {%­ëÐ�\&Lr%©ÿ�\&Ð�C&­ì`©q�¥!�©S�©@�©ê�©�©�©� ©�©� �  Yä­ëð ©ÿ�ê©�ë­ì` ©`­Ó �Ó`­Ó)þ�Ó`¦!Ê`¦!Êàðàj›END = *›› ORG $02E0› DW START›EN› BNE STSLEN ; RLEN > 0?› LDA TRIP› BNE STTRI1 ; TRIP = 1?›› ; NO TRIP, RETURN SAVED LEN››STSLEN 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 A››ICD2B 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› BVŽýC :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 GREEN››GREEN LDA #$B4› STA COLOR2› RTS›› SUBTTL 'INITIALIZATION'››INIT PROC› LDX #$FF› LDA #$00› RTS› EPROC›› ; PROCEED VECTOR››PRCVEC 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',$9B›BERROR DB '#FUJINET ERROR',$9B›› ; VARIABLES››TRIP DS 1 ; INTR FLAG›AX1SV DS MAXDEV ; AUX1 SAVE›AX2SV DS MAXDEV ; AUX2 SAVE›STSV DS 4*MAXDEV ; ST’ýATUS SAVE›RLEN DS MAXDEV ; RCV LEN›ROFF DS MAXDEV ; RCV OFFSET›TOFF DS MAXDEV ; TRX OFFSET›› ; BUFFERS (PAGE ALIGNED)›› ORG * + $FF & $FF00››RBUF DS 256*MAXDEV ; RX›TBUF DS 256*MAXDEV ; TX›“ý›END = *›› ORG $02E0› DW START›DEV ; RCV OFFSET›TOFF DS MAXDEV ; TRX OFFSET›› ; BUFFERS (PAGE ALIGNED)›› ORG * + $FF & $FF00››RBUF DS 256*MAXDEV ; RX›TBUF 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 VECTOR››PRCVEC 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',$9B›BERROR DB '#FUJINET ERROR',$9B›› ; VARIABLES››TRIP DS 1 ; INTR FLAG›AX1SV DS MAXDEV ; AUX1 SAVE›AX2SV DS MAXDEV ; AUX2 SAVE›STSV ˜ýDS 4*MAXDEV ; STATUS SAVE›RLEN DS MAXDEV ; RCV LEN›ROFF DS MAXDEV ; RCV OFFSET›TOFF DS MAXDEV ; TRX OFFSET›› ; BUFFERS (PAGE ALIGNED)›› ORG * + $FF & $FF00››RBUF DS 256*MAXDEV ; RX›TBUF DS ™ý256*MAXDEV ; TX››END = *›› ORG $02E0› DW START›N: HANDLER FOR FUJINET›; AUTHOR: THOM CHERRYHOMES›; ›› INCLUDE D2:EQUATES.ASM› INCLUDE D2:INIT.ASM› INCLUDE D2:OPEN.ASM› R SUBTTL 'HANDLER START'›› ORG $2300››START ›› ; INSERT INTO HATABS››IHTBS 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 FU�ýJINET BANNER'›› ; QUERY FUJINET››; JSR STPOLL›› ; OUTPUT READY OR ERROR››OBANR PROC› LDX #$00 ; IOCB #0 E:› LDA #PUTREC› STA ICCOM,X› LDA #$28 ; 40 CHRS MAX› STA ICBLL,X› ¦ý SUBTTL 'UTILITY FUNCTIONS'›› ; ENABLE PROCEED INTERRUPT››ENPRCD LDA PACTL› ORA #$01 ; ENABLE BIT 0› STA PACTL› RTS›› ; DISABLE PROCEED INTERRUPT››DIPRCD LDA PACTL› AND #$FE ; DISABLE 4Ÿý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 A››ICD2B 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 :DONE›4¥ý 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› 0£ýSTA DBUFH› LDA #$01› STA DBYTL› LDA #$00› STA DBYTH› STA DAUXH› LDA #$0F› STA DTIMLO› LDA ZICCOM› STA DAUXL› JSR SIOV ; DO IT...›› LDA D0¤ýSTATS› 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 INTERRUPT››DIPRCD LDA PACTL› AND #$FE ; DISABLE 4‚ LDA #$00› STA ICBLH,X› LDA DSTATS ; DSTATS < 128?› BPL OBRDY››OBERR LDA #LOW BERROR› STA ICBAL,X› LDA #HIGH BERROR› STA ICBAH,X› JMP OBCIO››OBRDY LDA #LOW BREADY› §ý STA ICBAL,X› LDA #HIGH BREADY› STA ICBAH,X›OBCIO JSR CIOV› EPROC›› ; VECTOR IN PROCEED INTERRUPT››SPRCED 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ðÈÈÈÀ!�ð©N™©F™©&™©�ç©/�袩 �B©(�H©�I­ ©a�D©&�ELX#©R�D©&�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ä­ëð ©ÿ�ê©�ë­ì`¥"Éð7©q�¥!�©ÿ�©@�©�©�©8¬ý�©� � ô%o&©�¥"�  Yä­ú¨``­Ó �Ó`­Ó)þ�Ó`¦!Ê`¦!Êàðàð àð©'P ©(P©)P©*P`©�p&h@e#Í#$ª$=%Â%#FUJINET READY›#FUJINET ERROR›àá#àáS�©@�©ê�©�©�©� ©�©� �  Yä­ëð ©ÿ�ê©�ë­ì`¥"Éð7©q�¥!�©ÿ�©@�©�©�©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› EPROC››PFLUSH 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› EPROC››FSET› 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',$9B›BERROR DB '#F¶ýUJINET ERROR',$9B›› ; VARIABLES››TRIP DS 1 ; INTR FLAG›AX1SV DS MAXDEV ; AUX1 SAVE›AX2SV DS MAXDEV ; AUX2 SAVE›STSV DS 4*MAXDEV ; STATUS SAVE›RLEN DS MAXDEV ; RCV LEN›ROFF DS MAXDEV ; RCV OFFSET›TO·ýFF DS MAXDEV ; TRX OFFSET›› ; BUFFERS (PAGE ALIGNED)›› ORG * + $FF & $FF00››RBUF DS 256*MAXDEV ; RX›TBUF DS 256*MAXDEV ; TX››END = *›› 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› EPROC››DEVIDN ; $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› EPROC››OC ›› ; 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 $2300››START JSR INIT ; DO INIT›› ; INSERT INTO HATABS››IHTBS 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 ERROR››OBANR 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 OBRDY››OBERR LDA #LOW BERROR› STA ICBAL,X› LDA #HIGH BERROR› STA ICBAH,X› JMP OBCIO››OBRDYÊý LDA #LOW BREADY› STA ICBAL,X› LDA #HIGH BREADY› STA ICBAH,X›OBCIO JSR CIOV› EPROC›› ; VECTOR IN PROCEED INTERRUPT››SPRCED PROC› LDA #LOW PRCVEC› STA VPRCED› LDA #HIGH PRCËýVEC› 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 PAGE››ZIOCB EQU $20 ; ZP IOCB›ZICHID EQU ZIOCB ; ID›ZICDNO EQU ZIOCB+1 ; UNIT #›ZICCOM EQU ZIOCB+2 ; COMMAND›ZICSTA EQU ZIOCB+3 ; STATUS›ZICBAL EQU ZIOCB+4 ; BUF ADR LOW›ZICBAH EQU ZÏýIOCB+5 ; BUF ADR HIGH›ZICPTL EQU ZIOCB+6 ; PUT ADDR L›ZICPTH EQU ZIOCB+7 ; PUT ADDR H›ZICBLL EQU ZIOCB+8 ; BUF LEN LOW›ZICBLH EQU ZIOCB+9 ; BUF LEN HIGH›ZICAX1 EQU ZIOCB+10 ; AUX 1›ZICAX2 EQU ZIOCB+11 ; AUX 2›ZICAX3 EQU ÐýZIOCB+12 ; AUX 3›ZICAX4 EQU ZIOCB+13 ; AUX 4›ZICAX5 EQU ZIOCB+14 ; AUX 5›ZICAX6 EQU ZIOCB+15 ; AUX 6›› ; INTERRUPT VECTORS› ; AND OTHER PAGE 2 VARS››VPRCED EQU $0202 ; PROCEED VCTR›COLOR2 EQU $02C6 ; MODEF BKG C›MEMLOÑý EQU $02E7 ; MEM LO›DVSTAT EQU $02EA ; 4 BYTE STATS›› ; PAGE 3› ; DEVICE CONTROL BLOCK (DCB)››DCB EQU $0300 ; BASE›DDEVIC EQU DCB ; DEVICE #›DUNIT EQU DCB+1 ; UNIT #›DCOMND EQU DCB+2 ; COMMAND›DSTATÒýS EQU DCB+3 ; STATUS/DIR›DBUFL EQU DCB+4 ; BUF ADR L›DBUFH EQU DCB+5 ; BUF ADR H›DTIMLO EQU DCB+6 ; TIMEOUT (S)›DRSVD EQU DCB+7 ; NOT USED›DBYTL EQU DCB+8 ; BUF LEN L›DBYTH EQU DCB+9 ; BUF LEN H›DAUXL EQU Óý DCB+10 ; AUX BYTE L›DAUXH EQU DCB+11 ; AUX BYTE H››HATABS EQU $031A ; HANDLER TBL›› ; IOCB'S * 8››IOCB EQU $0340 ; IOCB BASE›ICHID EQU IOCB ; ID›ICDNO EQU IOCB+1 ; UNIT #›ICCOM EQU IOCB+2 ; COMMAND›ICSTÔýA EQU IOCB+3 ; STATUS›ICBAL EQU IOCB+4 ; BUF ADR LOW›ICBAH EQU IOCB+5 ; BUF ADR HIGH›ICPTL EQU IOCB+6 ; PUT ADDR L›ICPTH EQU IOCB+7 ; PUT ADDR H›ICBLL EQU IOCB+8 ; BUF LEN LOW›ICBLH EQU IOCB+9 ; BUF LEN HIGH›ICAÕýX1 EQU IOCB+10 ; AUX 1›ICAX2 EQU IOCB+11 ; AUX 2›ICAX3 EQU IOCB+12 ; AUX 3›ICAX4 EQU IOCB+13 ; AUX 4›ICAX5 EQU IOCB+14 ; AUX 5›ICAX6 EQU IOCB+15 ; AUX 6›› ; HARDWARE REGISTERS››PACTL EQU $D302 ; PIA CTRL A›› Öý ; OS ROM VECTORS››CIOV EQU $E456 ; CIO ENTRY›SIOV EQU $E459 ; SIO ENTRY›› ; CONSTANTS››PUTREC EQU $09 ; CIO PUTREC›DEVIDN EQU $71 ; SIO DEVID›DSREAD EQU $40 ; FUJI->ATARI›DSWRIT EQU $80 ; ATARI->×ýFUJI›MAXDEV EQU 4 ; # OF N: DEVS›EOF EQU $88 ; ERROR 136›EOL EQU $9B ; EOL CHAR›› ZIOCB+1 ; UNIT #›ZICCOM EQU ZIOCB+2 ; COMMAND›ZICSTA EQU ZIOCB+3 ; STATUS›ZICBAL EQU ZIOCB+4 ; BUF ADR LOW›ZICBAH 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› EPROC››PFLUSH 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› EPROC››FSET› 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 LEN››STSLEN LDA RLEN,X ; GET RLEN› STA DVSTAT ; RET IN DVSTAT› LDA #$00› STA DVSTAT+1› JMP STDONE ; DO,äýNE.›› ; DO POLL AND UPDATE RCV LEN››STTRI1 JSR STPOLL ; POLL FOR ST› › ; IS <= 256?›› LDA DVSTAT+1› BNE STTRI2 ; > 256› STA RLEN,X› JMP STTRIU ; UPDATE TRIP›› ; > 256, SET TO 256››ST,åýTRI2 LDA #$FF› STA RLEN,X›› ; UPDATE TRIP FLAG››STTRIU BNE STDONE› STA TRIP ; RLEN = 0›› ; RETURN CONNECTED? FLAG.››STDONE LDA DVSTAT+2› RTS› EPROC›› ; ASK FUJINET FOR STATUS››STPOLL 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 STATUS››STP2 LDA DVSTAT+2› RTS› EPROC››WISE, 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 ASMBšINIT ASMB¾OPEN ASMB¸CLOSE ASMB»GET ASMB­PUT ASMBâSTATUS ASMB*SPECIAL ASMBžUTIL ASMB ITICTACTOBAS