@L}5 _$% l0$)$$Hȱ$ UhL" `e$$%`$%`  R@W!( L(1   Y I`  d  Ld M * @  $ % CC$$)%1 Udߥ$9%: !0 S$% DD˙`  }J)Lr d M * @  $ % CC$$)%1 Udߥ$9%: !0 S$%} DD˙`  }J)Lr J  ((  p L ()   J}L= ( L 0q A    IB JC;? D W } LL  ` W )LA!  ߰")-݆ p" } $G@LL 08`Q")<2Q0 -G$Ș݆ UL# ; p8(()(0ʥ)NQ` }$GȘ݆LU )L ݆ L GȘ ݆LL )W>Z   HH)H }p h  hyhy D L> L JJ    ! LA*` BF }7'8  M HN H` 8 Z  \LdJJ!"! GFE@F (!L }EE !E^ ^ E E7EȩEdE/EȩE  D } .L }  ;F d  ;?F7F? ( .   Z D LL d } . D  L    p  E` , d)  D L) 0BM݊L݉} ML  N݆ L NLML [ TEqEHȱEqEh 0Gȹ G} HLL GɛL  LFREE SECTORS G) *Gȩ GȽG GȌ*jj >G} C8jJ3j2CD( C202C ԠBX` N 1? l LlD:RAMDISK}.COMLu L1 L ;LHL  T`  `8  ɐ     `TU  } L ? .  t`GBJ ~DEHI B V0dV!}QDEHI VF9 ,0 ,0 s0hhL  L` H hDHEh"}DEL8HI4 0 HI,0 0  9 .G VLO#},0 L4*IJ`llD1:AUTORUN.SYSNEED MEM.SAV TO LOAD THIS FILE.D8:MEM.SAV J y08 B|DEHI$} V0 0`B;DEL`?<0LV`@ʆ v s? F0Ξ05: [ BDEHI%} VY8 B V  @  /DE `E:D8:DUP.SYSERROR-SAVING USER MEMORY ON DISKTYPE Y TO &}STILL RUN DOS B;DE J  (` 9 V⪍ ઍ  -'}LLu ÝDEHILV 9 .l 9 .l  `` s$B BH(}I|DE V BLV nB,DE JLV B V BLVDEIʩ BꭝLu } 3E:}DISK OPERATING SYSTEM II VERSION COPYRIGHT 1984 ATARI CORP.A. DISK DIRECTORY I. FORMAT DISKB. RUN CARTRIDG*}E J. DUPLICATE DISKC. COPY FILE K. BINARY SAVED. DELETE FILE(S) L. BINARY LOADE. RENAME FILE M. RUN AT ADDRES+}SF. LOCK FILE N. CREATE MEM.SAVG. UNLOCK FILE O. DUPLICATE FILEH. WRITE DOS FILES P. FORMAT SINGLEL !N',}#"&))9(&*)/h)''-&؆莟R'S  vL/ˢ L }Insert DOS 2.0s, type Y Λx -}DEfHI 1莏#q! @ y0ɛ8A0,' ȅ 1 1ild! 1L!NO SUCH ITEMSELECT.} ITEM OR FOR MENU! 0 .z:*{}.|{ 1 0 0JB 18L%|DL/}%DIRECTORY--SEARCH SPEC,LIST FILE?[# 0 0 &|D3" 1L!NOT A DISK FILEN !B 1L!E# 1 !BD0}ED:}:1BJ|DE 1DEBHI 1 h0ߢ 0.1}  0?詛 1 y0YЛ 1 ;#L" ;#L! BL1TYPE "Y" TO DELETE...DELETE FILE SPEC2}COPY--FROM, TO?OPTION NOT ALLOWED697 FREE SECTORS COPYING---D8:COPY32.COMl# 0|D .L/%#3}##JB|DE 1BHID#E 1#0: B 1L!#͑### B 1#c$0SY4}S1}:## # # .#Ƚ# # 𩛙## 1,#PD#ELJ- <.BJD#E 5}1 1HH 0hh|DL%1}:̳# L% #D#EL% 1 0 . .0O% 1L!WILD CARDS NOT A6}LLOWED IN DESTINATION 0 <.|K}N 2 FORMAT. t* 5) 1L!`) 0NΞ 0 L1) 1 L!BAD LOAD FILELOAD FROM WHAT FILE?) 0 ?}0#B 1L!WHAT FILE TO LOCK?) 0 0$B 1L!WHAT FILE TO UNLOCK?DUP DISK-SOURCE,DEST DRIVES?TYPE "Y" IF OK TO US@}E PROGRAM AREACAUTION: A "Y" INVALIDATES MEM.SAV.FE! +L1   `*  70 2 2A} 0.* 1 y0 0)INSERT BOTH DISKS, TYPE RETURN^, 1 y038逍 N, 1L! ,B}C, t*  Lx+, 0 ^, 1 y0 , ,0,0 ,L+ ,I0 ,Vǭ0C}Ξ, 0 }, 1 y0C,ШC, 0K'!" H H 'h h Lx+!EF 5L1L!D,I,HhD}` NOT ENOUGH ROOMINSERT SOURCE DISK,TYPE RETURNINSERT DESTINATION DISK,TYPE RETURNE}`  `8 rL1`-* 1P* 1 y0Y`hhL!NAME OF FILE TO MOVE?- 0 0|DL% <.F},^ 1 70 0 .@L# .BJ 1  DEHIB V L1 ,} 1 70,L.  G}JB|,#P#DE 1 HI BDEHHII 1 B 1 ,^ 1 70,0La- B V,#PH},^ 1 70 0L#L!-* 1P* 1 y0Yj383}mm ݭI}}`8}``|* ? ɛ,`|:-)| / 1L!`DESTINATION CANT BE DOJ}S.SYS0 0H{ 24Δ 28/L!/) 2 Π 2 0 ξK}hAΞB,0 J 1 BDEHI,HÝDE 1HIHIDELSAVE-GIVE L}FILE,START,END(,INIT,RUN)O S0 1`BDEPHI V` S0H 1 L!M}0 0 1L~0`PLEASE TYPE 1 LETTER,0`hhL! 70 1L0L<1 ,;ɛ7,"ɛ:ݦ1ݥN}A"D|ݤD|ȩ:|ȩ|ɛ,,(/+.ީ1 1,ɛ`轤{NAMEO} TOO LONG B VL!` L1I H1EΝDL1|mDiE` V0`8d/8 i:222 1 LP}!ERROR- 164ɛ+,' 20*.. өr2 1``2TOO MANY DIGITSINVALID HEXAQ}DECIMAL PARAMETER800 0 8 00`,0'D800 H,ɛh`2L1NEED D1 THRU D8uR} ECIMAL PARAMETER800 0 8 00`,0'D800 H,ɛh`2L1NEED D1 THRU D8u05  15 2 2151^116115ύ011$r2ԭ5 3)5)5ԭx GT}@@L00)+& 2 L0=ɛ -L!1LV1L1 /3 3ȹ441L-4 v3 25 2H 2h͔5U}L3L3 2 k3U hh`DOC`QL3P1Lk0S1H /3h0B k3@ VL0LU!#$53 1181118V}1111Ε5 1Lk0552 1Ȍ1i111i11115Lk0pppB4f5&&&&&&&&^6f^6&&&&&W}&&A1@BJ D2ELVK@BHILV^Щ6 2BD2EJ VBD5EHI0 V0%5X}5 2iХiL[2 25 25`D:*.*` i@`8 ``@i `8@`0 BLV525<4Y}5`HH i ԍΗ552 ԍhh@ Lح1Э1Ѣ 24.4 24Z}4`D4E` 2BJ k3LVRH` 2BD4EhK)I JLV333 BASIC language TUR > TURBO BASIC OBJ| f}COM > MACHINE language DOC > DOCumentation PIC|MIC|FNT|MVM > Graphics AMS|MUS|MBD > Music LST > BASIC g} LISTing -Some MACHINE language programs can only be run by loading the MENU without BASIC! ------- -For s h}ome programs, XL/XE models may require a "TRANSLATOR" program (available from BELLCOM) to be loaded first! -Most i}programs are relatively self-explanatory; however, some may have separate DOCumentation files. Some BASIC programs m j}ay contain instructions in their program listings. LIST to read. -To view DOCumentation files one page at a time, k} press [START], [Return], or the Joystick Trigger to display the highlighted DOC file. Pressing the [Esc] key cau l}ses a return to MENU. -To print out a hard-copy of any DOCumentation file, [Q]uit the MENU, boot DOS, and then from m} DOS, use the (C)Copy command: D:Filename.DOC,P: -To use this great MENU program on your own disks, simply n} copy the file "AUTORUN.SYS". D:Filename.DOC,P: -To use this great MENU program on your own disks, simply !@tH 0JJ0DJEBJK V0a0PDaEHIB V0A0ĝDEHIB V0!Jp}0J1J6`010 B VPBJDJE V 8DJ2Щ)ꭄJq}J01{J 0M 8D|JJ |J 0M 8D}J 8D~J$ 8DJ JJJJ 8DrJx 8D C1{J{Jr}{JL@2J|J|J|JL@3 }JI}JL@4 ~JI~JL@5J JJJL@6 JI JL@7LdA{Js} 0K~ 8DЭ)LUC C|J ~J }JJJJi H JJJJhJq t}J  JJJJ  ȌJJJJMEMEMEME{J 0@KDKEJB VJLC@ u}B DFErHI VJLC@ B V oDP B V䭀J J  vC ʅ(mJ{J 0JmJJlJP B V0 Bv} V@ B Vl NթԥR$ԅȱԅmJiԥiL~C3mJ{`Pw}BHI VLUC` 8DUKTKJ) 0:iNJJJJJ 0:iN 8D 8D CLUCHHHKHKIKDKE BKx}UKT Vhhh`ԩDՠJDE E8Fԅ Dԅ DԍJ DԍJ Dԑ̓J DLD͂JF` DLDy}``    L&PRL8|L@!   LYLS `?ױPבz}Ȣ`|`Y䍤L#L0LKEMDE(SD) XXK 800 PLUS V2.0 (c) 1983 by STACE && ('' {}(((ERR-Not V2 Disk 2`L 22334,, (a(j(@j" B V@jB(E_D VP@Pנ|}PP٢`E:(@@R PWL@   ngL@&LC@)J @j}}&0PLP٭)$h8hmiL1@Lb(+~}8)))ύ )) )))5 )H))(hN(j)=))8 ) )))L}()ש)  }h W @L!*}HRD1:DUP.SYSDN:DUP.SYS )L +0BJ D*E VL*@B}J 0*D*E VL*0@B BDD+EE0QHI V *@0HHIIH V0 *Ɉ *0 *L + }*0!BD*E VL +0 B V@ B V`DN:MEM.SAVE)w@B 0+D+EJ VLk+@ B|DEH}I V0@ B V+<L+@ B V@!BD+E V`b((*06}}:@jkqqqqqqqqqqjklmnqqqqqqq  @K:D1:VDOSFIL1DN:AUTORUN.SYS=L M M M M }M M M M M M M M M M M M M M M M]K L#LMN}}EMDE installation startedPut your system disk in drive 0.Press Ԡ to continue.Error extending DUP.SYS Error writi}ng AUTORUN.SYS } Install E M D E - Ver. 2 by stace For 800 PLUS MEMORY MOD (c) 1983, Stace } 1 - System Disk --------- 2 - Virtual Disk -------- 3 - Use Virtual DUP.SYS - 4 - Use Virtual MEM.SAV - } 5 - Memory size --------- 6 - Virtual Disk Density- 7 - Press the number key next to the}parameter to be changed.12No Yes 64K 80K 96K112K128K144K160K176K192K208K224K240KSNGLDBL $00Press RETURN for DOS^}gX Z \ ^ ` b d f h j l n p r t ! ! !:!=!@!C!H!K!T!W!\!a!g!j!o!r!u!!!!!!!!!!!!!!!!!}"" """""*"/"2";"N"T"["h"w"z"""""""""""""""""""""""""y#|####################$ $} $$$$+$2$;$D$H$O$Z$^$a$d$o$u$x$$$$$$$$$$$$$$$$$$$$$$$$$$$%)%,%/%@%C%V%]%`%c%p%s%w%z%%%%%%%}%%%%%%%&&&"&(&.&3&6&8&;&>&A&D&N&Q&r&|&&&&&&&&&&&&&&& '''M'P'S'V']''''''''''''''''''}((((1()(7(:(=(B(I(V([(](h(q(t(((()) ))))))0)?)C)F)L)q)t)w))))))))1*<*A*D*G*L*Y*^*a*d*g*j*m*p*u*z*}***}***************++ + +++++!+$+'+*+-+3+6+9+<+D+J+P+S+V+Y+\+_+b+e+m+s+v+y+|+++++++++++++++++}+++,,,[,^,c,f,i,l,q,t,,,,,,,,,,,,,,,,,-"-%-(-/-2-4-9-<-?-B-I-N-]-b-e-t-z---------------}. ......+./.4.7.:.=.@.H.K.O.R.U.f.q.v.y.~....................... / ////:/A/F/I/Q/Y/f/o/r/y////}/B0J0M0P0S0V0c0|00000000000000000000000001 1111#1)1,1/14191?1H1K1b1e1k1n1q1t1111111111}112 2 222(2-202326292D2L2O2U2X2[2a2d2g2l2o2t222222222((6``pppOPa}Op}A6`@OpyAVMREMIVMADS }@ S."D:EMDIAG.ADR J'(} Ġ٠*(G( Ҡ J( '$( }ǠҠ'( $!( by David G. Byrd$(G6-BP@6-'6-36-G+A},@d.*(!HOW MANY 16K BANKS TO TEST (0-15).e(INPUT STEP SIZE iP(<( I WILL TAKE A0$'} SECONDS FOR EACH PASS?(P( TEST RUNNINGn# )!@# AMEMORY WRITE ROUTINE - +,}" 6-,-Bc%B'g6 +,8)6-%@"AQ)6-@ J MMEMORY READ ROUTI}NEO -U +,Y 6-[''POKE (16347),0:REM * FORCED ERROR^-Bc%B'gh 6-F:,r  A}|)6-%@"AQ)6-  END OF PASS ROUTINE06-%@0( PASSES-} ERRORSXb "6-#6-%@O( COMPLETED  TESTS WITH  ERRORSb(STARTING AGAIN  A} MEMORY ERROR PRINT ROUTINE6-%@ 6-F:,88(BK -ADR -RD -WR -DIF O:&,$} D:EMDIAG.ADRPRINT ROUTINE6-%@ 6-F:,88(BK -ADR -RD -WR -DIF O:&,$mAVMREMIVM }S."D:EMDIAG.DAT J'(} Ġ٠*(G( Ҡ J( '"( Ԡ}Ҡ'( $!( by David G. Byrd$(G6-BP@6-'6-36-G+A,@}d.*(!HOW MANY 16K BANKS TO TEST (0-15).e(INPUT STEP SIZE i<(<( I WILL TAKE Ae$' SECONDS FOR} EACH PASSn# )!@# A9 A " B9(TEST RUNNING WITH DATA=MEMORY WRITE ROUT}INE - +,,-Bc%B'g6 +,@ J MMEMORY READ ROUTINEO -U +,}[))POKE (16384),128:REM * FORCED ERROR^-Bc%B'gh 6-F:,r  A  END OF }PASS ROUTINE06-%@0( PASSES- ERRORSX] "6-#6-%@P( COMPLETED  TESTS WI}TH  ERRORSS(] AP  A MEMORY ERROR PRINT ROUTINE6-%@ 6-F:,88(BK -}ADR -RD -WR -DIF O:&,$0,85,170,255 D:EMDIAG.DAT6-%@ 6-F:,88(BK -TX;SAVE#D:ATARIRAM.SCRX;ASM,,#D:XLRAMDSK.EXE ,X;RAMDISK CONTROLLER FOR 256K ATARI 800XL#X; by Claus Buchholz, Dec}., 1984X;("X; OPTIONS: Drive # and density2X;< DRIVEFDENSITYSINGLEPX;Z X; EquatesdX;nSINGLE;;Secto}r lengthsx DOUBLE(DDEVIC;;SIO Device Control Block DUNITDCOMNDDSTATSDBUFLODBYT}LO DAUX1 -DOSINI ;;Access to RESET initialization"CHKSUM1;; Temporary checksum2BUFRLO2;; Temporary p}ointer to user's buffer*ZTEMP4;; Temporary miscellaneous use"STACKP;;Stack pointer save4PORTB;; PIA port B} - memory control registerX;'X; Load-time code - Copy OS into RAMX;"0,GO6QPORTB;Enable OS ROM@L>J PP}ORTBTQ>;Zero page pointer^PhQ>rP|=;;Disable interruptsPԐ?LOOPQ@7;;Copy OS"PORTB;Enable} RAMP@7#PORTB;Enable ROM3 HLOOP$(>;Skip pages $CC to $D7 HNXPG$>NXPG2&& HLOOP0}"PORTB;Enable RAM:Q>@;Enable interruptsDPN.X:;Continue loadbl* GO;Execute preliminary load-time codev}X;X; Ramdisk controller codeX;3;Permanent code - in place of alt. char. setHOOK,;Hook into all SIO calls} QDDEVIC ODUNIT"R>1DRIVE;Right drive number? FHOOKEDOLDVEC ! ;If not, go to SIO HOOKED@;If so, }intercept&STACKP;Save stack pointer QDCOMND;Examine commandR> !;Format?  HNOFMT* !FORMAT4 NOFMT>R> P;Put se}ctor?H HNOPUTR !PUTSEC\ NOPUTfR> R;Read sector?p HNOGETz !GETSEC NOGETR> S;Read status? HNOSTT !STATU}S NOSTTR> W;Write sector? HNAKRET !PUTSECX;EX; Returns - Restore stack pointer, report error status and retu}rnX; NAKRET $STACKPB&%>;NAK error for improper command 'DSTATS$:. ERRRET8 $STACKPBBL%>;Bad sec}tor errorV 'DSTATS`:j SUCRETt $STACKP~B%>;No error 'DSTATS:X;-X; Subroutine - Set pointer to user b}ufferX; SETBUF&QDBUFLO;Move from DCB to zero page PBUFRLOQDBUFLOPBUFRLO:X; 6X; Subroutine - }Prepare to access sector of ramdiskX; SETSEC( Q>DENSITY2PSECLEN;Set sector length<QDAUX1;Check sector #F H}NOTZP QDAUX1ZFOUTRG;Sector 0 invaliddR>n EINRNGx)Q>;Sectors 1-3 always 128 bytes long PSECLEN HINRNG O}UTRG!!NAKRET;Sector # out of rangeNOTZ!R>;Check for sector # > $2D0 DINRNG HOUTRGQ> RDAUX1 DOUTRG} INRNGQDAUX1;Sector # valid %DAUX1$> DIV121"<2;Divide # by 121 - Result is bank #, remainder is page #,};6S>y@ ENOBORJ1T NOBOR^)>h HDIV121rM>;Remainder+7|X;+X; Subroutine - Prepare to switch banks:X; X} is bank #, A is page #X; SETBNKPZP;Save page # QPORTBPPBN;Normal bankM>PPB;Bank 0AT?T?}T?T?LPBPPB;Bank X&Q;NMI vector0 PZTEMP:QD PZTEMPN%>XQ>@;RTI opcodeb=;Disable IRQl4P@ZT}EMP7;Place RTI in NMI routine - disables NMIvQPBPPORTB;Switch bank inCP;Set up zero-page pointerQZPP}QPBN%PPORTB;Switch normal bank back in:;Leave 0 in Y, bank # in XX;X; Format routineX; FORMAT$>;Cle}ar banks 0 to 5 CLOOP1 Q>;Clear page 2 and up SETBNK;Prepare for switch QPB*PPORTB;Switch bank in4C> CLO}OP2HP@7;Zero entire pageR3\ HCLOOP2f#;Next pagep ICLOOP2zQPBNPPORTB;Switch bank outQNMIP@ZTEMP7;}Enable interrupts.0;Next bank ICLOOP1 SETBUF3Q>;Return a sector with 2 $FFs and the rest 0s%> FLOOP})> HNOTFFQ> NOTFF P@BUFRLO7 3$ )SECLEN. HFLOOP8 !SUCRET;DoneB X;L X; Write sector routineV X;` }PUTSECj SETBUFt Q>~ PCHKSUM;Zero checksum # SETSEC;Point to ramdisk sector PLOOP )Q@BUFRLO7;Get byte from u}ser's buffer $PB &PORTB;Switch bank P@7;Put byte into ramdisk $PBN &PORTB;Normal bank , OCHKSUM;Add byte} to checksum PCHKSUM 3;Next byte )SECLEN;Proper sector length HPLOOP #$>;Bank 0 holds checksum table QDAUX1}( ,2 'O>;Sector # indexes checksum table< SETBNKF %DAUX1P QCHKSUMZ $PBd &PORTB;Switch bankn P@7;Store chec}ksumx $PBN &PORTB;Normal bank %> QNMI P@ZTEMP7;Enable interrupts . !SUCRET;Done X; X; Read sector rou}tine X; GETSEC SETBUF Q> PCHKSUM;Zero checksum SETSEC GLOOP $PB" &PORTB;Switch bank, Q@7;Get b}yte from ramdisk6 $PBN@ &PORTB;Normal bankJ )P@BUFRLO7;Put byte into user's bufferT ,^ OCHKSUM;Add to checksumh PCH}KSUMr 3;Next byte| )SECLEN;Proper sector length HGLOOP !$>;Bank 0 for checksum table QDAUX1 , O> SET}BNK %DAUX1 $PB &PORTB;Switch bank Q@7;Get original checksum $PBN &PORTB;Normal bank > %> QNMI P}@ZTEMP7;Enable interrupts& .0 (CHKSUM;Compare checksums: FGCSOKD $!ERRRET;If different, bad sectorN GCSOKX !SUCRET};If same, doneb X;l X; Read status routinev X; STATUS SETBUF %>;Return 4 bytes Q>;All 0s SLOOP 1 FS}TEND P@BUFRLO7 !SLOOP STEND FLAGDENSITY Q> FLAG /P@BUFRLO7;First byte tells density of drive !SUCR}ET;Done X; X; Variable storage area X;* 2ZP ;Holds page # in ramdisk to be accessed4 >PB ;Value of memory con}trol register for selected bank> =PBN ;Value of memory control register for normal bankH >NMI ;First opcode in NMI }routine - Used to restore NMIR (SECLEN ;Length of current sector\ X;f "X; RESET initialization routinep X;z ;Hidd}en (hopefully) NEWINI "PORTB;Enable RAM OS OLDINI  " ;Call original DOSINI routine MODINI 'Q>NEWINI;Se}t hook for next RESET PDOSINI Q>NEWINI PDOSINI : X; &X; Load-time code - Install ramdisk X;0}DO QZ;Save original SIO vector$ POLDVEC.Q[8POLDVECB$Q>HOOK;Install new SIO vectorLPZVQ>HOOK`}P[j(Q;Save first opcode in NMI routinetP~QP̒%>Q@7PNMI'QDOSINI;Save original DOSINI vecto}r POLDINIQDOSINIPOLDINI MODINI;Install new one1 ;Re-initialize FMS to show ramdisk present :;Done}$ DO;Execute final load-time code MODINI;Install new one1 ;Re-initialize FMS to show ramdisk present :;Done+080 ө̩xԨӑө@X`0m5L ̺!LPLRLkSLW }Lͮ```23`ͭ   L8   8y)ͭӍ)͊ } ͍ͭ45@x4͍Ә͍ͅ` ̭͍Ә͍ͭ͑4X V̩2LL V̩1 a̱2 }͎ӑ͎e11 i ̬ 1͎ӑ͎Ӡ͑4XLL V̩1 a̮͎ӱ͎ӑ2e11 i ̬ ͎ӱ }͎Ӫ͑4X1LBLL V̠2Lͩ2LL   `070Z ̭[ ̩Z̍[˭̠ˍͥ    ` }0͑4X1LBLL V̠2Lͩ2LL   `070Z ̭[ ̩Z̍[˭̠ˍͥ    `  ******************************* * RAM-DISK CONTROLLER FOR THE * * QUARTER-MEG ATARI 800XL * ******************$}************* RD.SRC and RD2.SRC are identical copies of the source code for the RAM-disk controller. They include line$} numbers, unlike the BYTEnet listing ATARIRAM.ASM. RDS.OBJ is already assembled. It is a load-and-go file which can be r$}enamed AUTORUN.SYS for automatic booting. RDS.OBJ sets up a single-density RAM-disk as drive #2. RDD.OBJ is the same, exce$}pt it sets up a double-density RAM-disk as drive #2. To use other drive numbers, you must change one line in the source c$}ode and reassemble. Remember, you must format the RAM-disk after loading the controller and before using it. In BASIC, u$}se XIO 254,#1,0,0,"D2:". Otherwise, format it from DOS. Enjoy!loading the controller and before using it. In BASIC, u$D@8@ ө̩xԨӑө@X`@m3L ̺!LPLRLkSLW(}Lͮ```23`ͭ   L8   8y)ͭӍ)͊ (} ͍ͭ45@x4͍Ә͍ͅ` ̭͍Ә͍ͭ͑4X V̩2LL V̩1 a̱2(}͎ӑ͎e11 i ̬ 1͎ӑ͎Ӡ͑4XLL V̩1 a̮͎ӱ͎ӑ2e11 i ̬ ͎ӱ(}͎Ӫ͑4X1LBLL V̠2Lͩ2LL   `@7@Z ̭[ ̩Z̍[˭̠ˍͥ    `(}@͑4X1LBLL V̠2Lͩ2LL   `@7@Z ̭[ ̩Z̍[˭̠ˍͥ    `(0100 ; RAMDISK CONTROLLER FOR 256K ATARI 800XL0110 ; by Claus Buchholz, Dec., 19840120 ;0130 ; OPTIONS: Drive # and densit,}y0140 ;0150 DRIVE = 20160 DENSITY = SINGLE0170 ;0180 ; Equates0190 ;0200 SINGLE = $80 Sector lengths0210 DOUBLE = ,}$000220 DDEVIC = $0300 SIO Device Control Block0230 DUNIT = $03010240 DCOMND = $03020250 DSTATS = $03030260 DBUFLO = $0,}3040270 DBYTLO = $03080280 DAUX1 = $030A0290 DOSINI = $0C Access to RESET initialization0300 CHKSUM = $31 Temporary,} checksum0310 BUFRLO = $32 Temporary pointer to user's buffer0320 ZTEMP = $34 Temporary miscellaneous use0330 STACK,}P = $0318 Stack pointer save0340 PORTB = $D301 PIA port B - memory control register0350 ;0360 ; Load-time code - Copy O,}S into RAM0370 ;0380 *= $40000390 GO0400 LDA PORTB Enable OS ROM0410 ORA #10420 STA PORTB0430 L,}DA #$C0 Zero page pointer0440 STA $CC0450 LDA #00460 STA $CB0470 SEI Disable interrupts0480 ,} STA $D40E0490 TAY 0500 LOOP0510 LDA ($CB),Y Copy OS0520 DEC PORTB Enable RAM0530 STA ($CB),Y0540 ,} INC PORTB Enable ROM0550 INY 0560 BNE LOOP0570 LDX $CC0580 CPX #$CB Skip pages $CC to $D70590 ,} BNE NXPG0600 LDX #$D70610 NXPG0620 INX 0630 STX $CC0640 BNE LOOP0650 DEC PORTB Enable RAM0660 ,} LDA #$40 Enable interrupts0670 STA $D40E0680 CLI 0690 RTS Continue load0700 *= $02E20710,} .WORD GO Execute preliminary load-time code0720 ;0730 ; Ramdisk controller code0740 ;0750 *= $CC00 Permane,}nt code - in place of alt. char. set0760 HOOK0770 CLC Hook into all SIO calls0780 LDA DDEVIC0790 ADC -}DUNIT0800 CMP #$31+DRIVE Right drive number?0810 BEQ HOOKED0820 OLDVEC = *+10830 JMP * If not, go to SI-}O0840 HOOKED0850 TSX If so, intercept0860 STX STACKP Save stack pointer0870 LDA DCOMND Examine comm-}and0880 CMP #'! Format?0890 BNE NOFMT0900 JMP FORMAT0910 NOFMT0920 CMP #'P Put sector?0930 -}BNE NOPUT0940 JMP PUTSEC0950 NOPUT0960 CMP #'R Read sector?0970 BNE NOGET0980 JMP GETSEC0990 NOGET-}1000 CMP #'S Read status?1010 BNE NOSTT1020 JMP STATUS1030 NOSTT1040 CMP #'W Write sector?1050 -} BNE NAKRET1060 JMP PUTSEC1070 ;1080 ; Returns - Restore stack pointer, report error status and return1090 ;1100 N-}AKRET1110 LDX STACKP1120 TXS 1130 LDY #139 NAK error for improper command1140 STY DSTATS1150 RTS -}1160 ERRRET1170 LDX STACKP1180 TXS 1190 LDY #144 Bad sector error1200 STY DSTATS1210 RTS 1220 S-}UCRET1230 LDX STACKP1240 TXS 1250 LDY #1 No error1260 STY DSTATS1270 RTS 1280 ;1290 ; Subrout- }ine - Set pointer to user buffer1300 ;1310 SETBUF1320 LDA DBUFLO Move from DCB to zero page1330 STA BUFRLO1340 - } LDA DBUFLO+11350 STA BUFRLO+11360 RTS 1370 ;1380 ; Subroutine - Prepare to access sector of ramdisk1390 ;14- }00 SETSEC1410 LDA #DENSITY1420 STA SECLEN Set sector length1430 LDA DAUX1+1 Check sector #1440 BNE NOTZ- }1450 LDA DAUX11460 BEQ OUTRG Sector 0 invalid1470 CMP #41480 BCS INRNG1490 LDA #$80 Sectors 1-3 - }always 128 bytes long1500 STA SECLEN1510 BNE INRNG1520 OUTRG1530 JMP NAKRET Sector # out of range1540 NOTZ-}1550 CMP #2 Check for sector # > $2D01560 BCC INRNG1570 BNE OUTRG1580 LDA #$D01590 CMP DAUX1160-}0 BCC OUTRG1610 INRNG1620 LDA DAUX1 Sector # valid1630 LDY DAUX1+11640 LDX #$FF1650 DIV1211660 IN-}X Divide # by 121 - Result is bank #, remainder is page #1670 SEC 1680 SBC #1211690 BCS NOBOR1700 -} DEY 1710 NOBOR1720 CPY #$FF1730 BNE DIV1211740 AND #$7F Remainder+71750 ;1760 ; Subroutine - Prepare to-} switch banks:1770 ; X is bank #, A is page #1780 ;1790 SETBNK1800 STA ZP Save page #1810 LDA PORTB1820 -} STA PBN Normal bank1830 AND #$8F1840 STA PB Bank 01850 TXA 1860 ASL A1870 ASL A1880 -}ASL A1890 ASL A1900 ORA PB1910 STA PB Bank X1920 LDA $FFFA NMI vector1930 STA ZTEMP1940 -}LDA $FFFB1950 STA ZTEMP+11960 LDY #01970 LDA #$40 RTI opcode1980 SEI Disable IRQ1990 STA -}(ZTEMP),Y Place RTI in NMI routine - disables NMI2000 LDA PB2010 STA PORTB Switch bank in2020 TYA 2030 -}STA 0 Set up zero-page pointer2040 LDA ZP2050 STA 12060 LDA PBN2070 STA PORTB Switch normal bank -}back in2080 RTS Leave 0 in Y, bank # in X2090 ;2100 ; Format routine2110 ;2120 FORMAT2130 LDX #5 C-}lear banks 0 to 52140 CLOOP12150 LDA #2 Clear page 2 and up2160 JSR SETBNK Prepare for switch2170 LDA P-}B2180 STA PORTB Switch bank in2190 TYA 2200 CLOOP22210 STA (0),Y Zero entire page2220 INY 2230 -}BNE CLOOP22240 INC 1 Next page2250 BPL CLOOP22260 LDA PBN2270 STA PORTB Switch bank out2280 -}LDA NMI2290 STA (ZTEMP),Y Enable interrupts2300 CLI 2310 DEX Next bank2320 BPL CLOOP12330 JS-}R SETBUF2340 LDA #$FF Return a sector with 2 $FFs and the rest 0s2350 LDY #02360 FLOOP2370 CPY #22380 -} BNE NOTFF2390 LDA #02400 NOTFF2410 STA (BUFRLO),Y2420 INY 2430 CPY SECLEN2440 BNE FLOOP2450 J-}MP SUCRET Done2460 ;2470 ; Write sector routine2480 ;2490 PUTSEC2500 JSR SETBUF2510 LDA #02520 STA CHKSUM- } Zero checksum2530 JSR SETSEC Point to ramdisk sector2540 PLOOP2550 LDA (BUFRLO),Y Get byte from user's buffer2-!}560 LDX PB2570 STX PORTB Switch bank2580 STA (0),Y Put byte into ramdisk2590 LDX PBN2600 STX PORT-"}B Normal bank2610 CLC 2620 ADC CHKSUM Add byte to checksum2630 STA CHKSUM2640 INY Next byte26-#}50 CPY SECLEN Proper sector length2660 BNE PLOOP2670 LDX #0 Bank 0 holds checksum table2680 LDA DAUX-$}1+12690 CLC 2700 ADC #2 Sector # indexes checksum table2710 JSR SETBNK2720 LDY DAUX12730 LDA CH-%}KSUM2740 LDX PB2750 STX PORTB Switch bank2760 STA (0),Y Store checksum2770 LDX PBN2780 STX PORTB-&} Normal bank2790 LDY #02800 LDA NMI2810 STA (ZTEMP),Y Enable interrupts2820 CLI 2830 JMP SUCRET D-'}one2840 ;2850 ; Read sector routine2860 ;2870 GETSEC2880 JSR SETBUF2890 LDA #02900 STA CHKSUM Zero checks-(}um2910 JSR SETSEC2920 GLOOP2930 LDX PB2940 STX PORTB Switch bank2950 LDA (0),Y Get byte from ramdisk-)}2960 LDX PBN2970 STX PORTB Normal bank2980 STA (BUFRLO),Y Put byte into user's buffer2990 CLC 3000 -*} ADC CHKSUM Add to checksum3010 STA CHKSUM3020 INY Next byte3030 CPY SECLEN Proper sector length304-+}0 BNE GLOOP3050 LDX #0 Bank 0 for checksum table3060 LDA DAUX1+13070 CLC 3080 ADC #23090 JS-,}R SETBNK3100 LDY DAUX13110 LDX PB3120 STX PORTB Switch bank3130 LDA (0),Y Get original checksum3140 --} LDX PBN3150 STX PORTB Normal bank3160 TAX 3170 LDY #03180 LDA NMI3190 STA (ZTEMP),Y Enable int-.}errupts3200 CLI 3210 CPX CHKSUM Compare checksums3220 BEQ GCSOK3230 JMP ERRRET If different, bad sector-/}3240 GCSOK3250 JMP SUCRET If same, done3260 ;3270 ; Read status routine3280 ;3290 STATUS3300 JSR SETBUF3310 -0} LDY #4 Return 4 bytes3320 LDA #0 All 0s3330 SLOOP3340 DEY 3350 BEQ STEND3360 STA (BUFRLO),-1}Y3370 JMP SLOOP3380 STEND3390 FLAG = DENSITY/43400 LDA #$20-FLAG3410 STA (BUFRLO),Y First byte tells densit-2}y of drive3420 JMP SUCRET Done3430 ;3440 ; Variable storage area3450 ;3460 ZP *= *+1 Holds page # in ramdisk -3}to be accessed3470 PB *= *+1 Value of memory control register for selected bank3480 PBN *= *+1 Value of memory c-4}ontrol register for normal bank3490 NMI *= *+1 First opcode in NMI routine - Used to restore NMI3500 SECLEN *= *+1 L-5}ength of current sector3510 ;3520 ; RESET initialization routine3530 ;3540 *= $0100 Hidden (hopefully)3550 NEWINI-6}3560 DEC PORTB Enable RAM OS3570 OLDINI = *+13580 JSR * Call original DOSINI routine3590 MODINI3600 -7}LDA #NEWINI&$FF Set hook for next RESET3610 STA DOSINI3620 LDA #NEWINI/$01003630 STA DOSINI+13640 RTS 36-8}50 ;3660 ; Load-time code - Install ramdisk3670 ;3680 *= $40003690 DO3700 LDA $E45A Save original SIO vector-9}3710 STA OLDVEC3720 LDA $E45B3730 STA OLDVEC+13740 LDA #HOOK&$FF Install new SIO vector3750 STA $E45A-:}3760 LDA #HOOK/$01003770 STA $E45B3780 LDA $FFFA Save first opcode in NMI routine3790 STA $CB3800 -;}LDA $FFFB3810 STA $CC3820 LDY #03830 LDA ($CB),Y3840 STA NMI3850 LDA DOSINI Save original DOSINI ve-<}ctor3860 STA OLDINI3870 LDA DOSINI+13880 STA OLDINI+13890 JSR MODINI Install new one3900 JSR $07E0 -=} Re-initialize FMS to show ramdisk present3910 RTS Done3920 *= $02E23930 .WORD DO Execute final l->}oad-time codee FMS to show ramdisk present3910 RTS Done3920 *= $02E23930 .WORD DO Execute final l,@8@ ө̩xԨӑө@X`@m3L ̺!LPLRLkSLW1@}Lͮ```23`ͭ   L8   8y)ͭӍ)͊ 1A} ͍ͭ45@x4͍Ә͍ͅ` ̭͍Ә͍ͭ͑4X V̩2LL V̩1 a̱21B}͎ӑ͎e11 i ̬ 1͎ӑ͎Ӡ͑4XLL V̩1 a̮͎ӱ͎ӑ2e11 i ̬ ͎ӱ1C}͎Ӫ͑4X1LBLL V̠2Lͩ 2LL   `@7@Z ̭[ ̩Z̍[˭̠ˍͥ    `1D}@͑4X1LBLL V̠2Lͩ 2LL   `@7@Z ̭[ ̩Z̍[˭̠ˍͥ    `00100 ; RAMDISK CONTROLLER FOR 256K ATARI 800XL0110 ; by Claus Buchholz, Dec., 19840120 ;0130 ; OPTIONS: Drive # and densit5F}y0140 ;0150 DRIVE = 20160 DENSITY = SINGLE0170 ;0180 ; Equates0190 ;0200 SINGLE = $80 Sector lengths0210 DOUBLE = 5G}$000220 DDEVIC = $0300 SIO Device Control Block0230 DUNIT = $03010240 DCOMND = $03020250 DSTATS = $03030260 DBUFLO = $05H}3040270 DBYTLO = $03080280 DAUX1 = $030A0290 DOSINI = $0C Access to RESET initialization0300 CHKSUM = $31 Temporary5I} checksum0310 BUFRLO = $32 Temporary pointer to user's buffer0320 ZTEMP = $34 Temporary miscellaneous use0330 STACK5J}P = $0318 Stack pointer save0340 PORTB = $D301 PIA port B - memory control register0350 ;0360 ; Load-time code - Copy O5K}S into RAM0370 ;0380 *= $40000390 GO0400 LDA PORTB Enable OS ROM0410 ORA #10420 STA PORTB0430 L5L}DA #$C0 Zero page pointer0440 STA $CC0450 LDA #00460 STA $CB0470 SEI Disable interrupts0480 5M} STA $D40E0490 TAY 0500 LOOP0510 LDA ($CB),Y Copy OS0520 DEC PORTB Enable RAM0530 STA ($CB),Y0540 5N} INC PORTB Enable ROM0550 INY 0560 BNE LOOP0570 LDX $CC0580 CPX #$CB Skip pages $CC to $D70590 5O} BNE NXPG0600 LDX #$D70610 NXPG0620 INX 0630 STX $CC0640 BNE LOOP0650 DEC PORTB Enable RAM0660 5P} LDA #$40 Enable interrupts0670 STA $D40E0680 CLI 0690 RTS Continue load0700 *= $02E207105Q} .WORD GO Execute preliminary load-time code0720 ;0730 ; Ramdisk controller code0740 ;0750 *= $CC00 Permane5R}nt code - in place of alt. char. set0760 HOOK0770 CLC Hook into all SIO calls0780 LDA DDEVIC0790 ADC 5S}DUNIT0800 CMP #$31+DRIVE Right drive number?0810 BEQ HOOKED0820 OLDVEC = *+10830 JMP * If not, go to SI5T}O0840 HOOKED0850 TSX If so, intercept0860 STX STACKP Save stack pointer0870 LDA DCOMND Examine comm5U}and0880 CMP #'! Format?0890 BNE NOFMT0900 JMP FORMAT0910 NOFMT0920 CMP #'P Put sector?0930 5V}BNE NOPUT0940 JMP PUTSEC0950 NOPUT0960 CMP #'R Read sector?0970 BNE NOGET0980 JMP GETSEC0990 NOGET5W}1000 CMP #'S Read status?1010 BNE NOSTT1020 JMP STATUS1030 NOSTT1040 CMP #'W Write sector?1050 5X} BNE NAKRET1060 JMP PUTSEC1070 ;1080 ; Returns - Restore stack pointer, report error status and return1090 ;1100 N5Y}AKRET1110 LDX STACKP1120 TXS 1130 LDY #139 NAK error for improper command1140 STY DSTATS1150 RTS 5Z}1160 ERRRET1170 LDX STACKP1180 TXS 1190 LDY #144 Bad sector error1200 STY DSTATS1210 RTS 1220 S5[}UCRET1230 LDX STACKP1240 TXS 1250 LDY #1 No error1260 STY DSTATS1270 RTS 1280 ;1290 ; Subrout5\}ine - Set pointer to user buffer1300 ;1310 SETBUF1320 LDA DBUFLO Move from DCB to zero page1330 STA BUFRLO1340 5]} LDA DBUFLO+11350 STA BUFRLO+11360 RTS 1370 ;1380 ; Subroutine - Prepare to access sector of ramdisk1390 ;145^}00 SETSEC1410 LDA #DENSITY1420 STA SECLEN Set sector length1430 LDA DAUX1+1 Check sector #1440 BNE NOTZ5_}1450 LDA DAUX11460 BEQ OUTRG Sector 0 invalid1470 CMP #41480 BCS INRNG1490 LDA #$80 Sectors 1-3 5`}always 128 bytes long1500 STA SECLEN1510 BNE INRNG1520 OUTRG1530 JMP NAKRET Sector # out of range1540 NOTZ5a}1550 CMP #2 Check for sector # > $2D01560 BCC INRNG1570 BNE OUTRG1580 LDA #$D01590 CMP DAUX11605b}0 BCC OUTRG1610 INRNG1620 LDA DAUX1 Sector # valid1630 LDY DAUX1+11640 LDX #$FF1650 DIV1211660 IN5c}X Divide # by 121 - Result is bank #, remainder is page #1670 SEC 1680 SBC #1211690 BCS NOBOR1700 5d} DEY 1710 NOBOR1720 CPY #$FF1730 BNE DIV1211740 AND #$7F Remainder+71750 ;1760 ; Subroutine - Prepare to5e} switch banks:1770 ; X is bank #, A is page #1780 ;1790 SETBNK1800 STA ZP Save page #1810 LDA PORTB1820 5f} STA PBN Normal bank1830 AND #$8F1840 STA PB Bank 01850 TXA 1860 ASL A1870 ASL A1880 5g}ASL A1890 ASL A1900 ORA PB1910 STA PB Bank X1920 LDA $FFFA NMI vector1930 STA ZTEMP1940 5q}5B%DOS SYSB*)DUP SYSB SAUTORUN SYSB_HELP DOCB(oGENEMDE2 B ADRCHECK B ERRCHECK B3XLDSK SRCBXLDSK OBJBRD DOCBRDS OBJBMRD SRCB?RDD OBJBMERD2 SRCLDA $FFFB1950 STA ZTEMP+11960 LDY #01970 LDA #$40 RTI opcode1980 SEI Disable IRQ1990 STA 5r}(ZTEMP),Y Place RTI in NMI routine - disables NMI2000 LDA PB2010 STA PORTB Switch bank in2020 TYA 2030 5s}STA 0 Set up zero-page pointer2040 LDA ZP2050 STA 12060 LDA PBN2070 STA PORTB Switch normal bank 5t}back in2080 RTS Leave 0 in Y, bank # in X2090 ;2100 ; Format routine2110 ;2120 FORMAT2130 LDX #5 C5u}lear banks 0 to 52140 CLOOP12150 LDA #2 Clear page 2 and up2160 JSR SETBNK Prepare for switch2170 LDA P5v}B2180 STA PORTB Switch bank in2190 TYA 2200 CLOOP22210 STA (0),Y Zero entire page2220 INY 2230 5w}BNE CLOOP22240 INC 1 Next page2250 BPL CLOOP22260 LDA PBN2270 STA PORTB Switch bank out2280 5x}LDA NMI2290 STA (ZTEMP),Y Enable interrupts2300 CLI 2310 DEX Next bank2320 BPL CLOOP12330 JS5y}R SETBUF2340 LDA #$FF Return a sector with 2 $FFs and the rest 0s2350 LDY #02360 FLOOP2370 CPY #22380 5z} BNE NOTFF2390 LDA #02400 NOTFF2410 STA (BUFRLO),Y2420 INY 2430 CPY SECLEN2440 BNE FLOOP2450 J5{}MP SUCRET Done2460 ;2470 ; Write sector routine2480 ;2490 PUTSEC2500 JSR SETBUF2510 LDA #02520 STA CHKSUM5|} Zero checksum2530 JSR SETSEC Point to ramdisk sector2540 PLOOP2550 LDA (BUFRLO),Y Get byte from user's buffer25}}560 LDX PB2570 STX PORTB Switch bank2580 STA (0),Y Put byte into ramdisk2590 LDX PBN2600 STX PORT5~}B Normal bank2610 CLC 2620 ADC CHKSUM Add byte to checksum2630 STA CHKSUM2640 INY Next byte265}50 CPY SECLEN Proper sector length2660 BNE PLOOP2670 LDX #0 Bank 0 holds checksum table2680 LDA DAUX5}1+12690 CLC 2700 ADC #2 Sector # indexes checksum table2710 JSR SETBNK2720 LDY DAUX12730 LDA CH5}KSUM2740 LDX PB2750 STX PORTB Switch bank2760 STA (0),Y Store checksum2770 LDX PBN2780 STX PORTB5} Normal bank2790 LDY #02800 LDA NMI2810 STA (ZTEMP),Y Enable interrupts2820 CLI 2830 JMP SUCRET D5}one2840 ;2850 ; Read sector routine2860 ;2870 GETSEC2880 JSR SETBUF2890 LDA #02900 STA CHKSUM Zero checks5}um2910 JSR SETSEC2920 GLOOP2930 LDX PB2940 STX PORTB Switch bank2950 LDA (0),Y Get byte from ramdisk5}2960 LDX PBN2970 STX PORTB Normal bank2980 STA (BUFRLO),Y Put byte into user's buffer2990 CLC 3000 5} ADC CHKSUM Add to checksum3010 STA CHKSUM3020 INY Next byte3030 CPY SECLEN Proper sector length3045}0 BNE GLOOP3050 LDX #0 Bank 0 for checksum table3060 LDA DAUX1+13070 CLC 3080 ADC #23090 JS5}R SETBNK3100 LDY DAUX13110 LDX PB3120 STX PORTB Switch bank3130 LDA (0),Y Get original checksum3140 5} LDX PBN3150 STX PORTB Normal bank3160 TAX 3170 LDY #03180 LDA NMI3190 STA (ZTEMP),Y Enable int5}errupts3200 CLI 3210 CPX CHKSUM Compare checksums3220 BEQ GCSOK3230 JMP ERRRET If different, bad sector5}3240 GCSOK3250 JMP SUCRET If same, done3260 ;3270 ; Read status routine3280 ;3290 STATUS3300 JSR SETBUF3310 5} LDY #4 Return 4 bytes3320 LDA #0 All 0s3330 SLOOP3340 DEY 3350 BEQ STEND3360 STA (BUFRLO),5}Y3370 JMP SLOOP3380 STEND3390 FLAG = DENSITY/43400 LDA #$20-FLAG3410 STA (BUFRLO),Y First byte tells densit5}y of drive3420 JMP SUCRET Done3430 ;3440 ; Variable storage area3450 ;3460 ZP *= *+1 Holds page # in ramdisk 5}to be accessed3470 PB *= *+1 Value of memory control register for selected bank3480 PBN *= *+1 Value of memory c5}ontrol register for normal bank3490 NMI *= *+1 First opcode in NMI routine - Used to restore NMI3500 SECLEN *= *+1 L5}ength of current sector3510 ;3520 ; RESET initialization routine3530 ;3540 *= $0100 Hidden (hopefully)3550 NEWINI5}3560 DEC PORTB Enable RAM OS3570 OLDINI = *+13580 JSR * Call original DOSINI routine3590 MODINI3600 5}LDA #NEWINI&$FF Set hook for next RESET3610 STA DOSINI3620 LDA #NEWINI/$01003630 STA DOSINI+13640 RTS 365}50 ;3660 ; Load-time code - Install ramdisk3670 ;3680 *= $40003690 DO3700 LDA $E45A Save original SIO vector5}3710 STA OLDVEC3720 LDA $E45B3730 STA OLDVEC+13740 LDA #HOOK&$FF Install new SIO vector3750 STA $E45A5}3760 LDA #HOOK/$01003770 STA $E45B3780 LDA $FFFA Save first opcode in NMI routine3790 STA $CB3800 5}LDA $FFFB3810 STA $CC3820 LDY #03830 LDA ($CB),Y3840 STA NMI3850 LDA DOSINI Save original DOSINI ve5}ctor3860 STA OLDINI3870 LDA DOSINI+13880 STA OLDINI+13890 JSR MODINI Install new one3900 JSR $07E0 5} Re-initialize FMS to show ramdisk present3910 RTS Done3920 *= $02E23930 .WORD DO Execute final l5}oad-time codee FMS to show ramdisk present3910 RTS Done3920 *= $02E23930 .WORD DO Execute final l4