þþý1dEIn#X;££££££££££££££££££££££££££££££x#X;£                            £‚#X;£  ±¹²Ë ÒÁÍÄÉÓË ÃÏÎÔÒÏÌÌÅÒ   £Œ#X;£    ÆÏÒ ÁÔÁÒÉ ²µ¶Ë Ø̯ØÅ    £–#X;£                            £ #X;£ ÓÔÉÃÈÔÉÎÇ ÁÔÁÒÉ ÇÅÂÒÕÉËÅÒÓ £ª#X;£       ÈÁÒÄ×ÁÒÅ ÇÒÏÕР      £´#X;£        ÐÏÓÔÂÕÓ ²°¹µ        £¾#X;£  µ²°² Ã ó§ÈÅÒÔÏÇÅÎÂÏÓÃÈ   £È#X;£                            £Ò#X;£­­­­­­­­­­­­­­­­­­­­­­­­­­­­£Ü#X;£                            £æ#X;£ ÃÏÎÔÒÉÂÕÔÉÎÇ ÐÒÏÇÒÁÍÍÅÒÓº  £ð#X;£                            £ú#X;£       ÃÌÁÕÓ ÂÕÃÈÈÏÌÔÚ      £#X;£       ÐÅÔÅÒ ×ÁÌÇÒÅÅΠ      £#X;£        ÇÕÕÓ ÁÓÓÍÁÎΠ       £#X;£         ÔÏΠö®ÒÏÓÍÁÌÅΠ    £"#X;£        ËÁÒÌ ÌÕÂÁÒÓËÙ       £,#X;£                            £6#X;£­­­­­­­­­­­­­­­­­­­­­­­­­­­­£@#X;£                            £J#X;£ ²µ¶Ë Ø̯ØÅ ÍÅÍÏÒÙ ÕÐÇÒÁÄÅ  £T#X;£  ÄÅÓÉÇΠÂÙ ÇÕÕÓ ÁÓÓÍÁÎΠ   £^#X;£                            £h#X;£­­­­­­­­­­­­­­­­­­­­­­­­­­­­£r#X;£                            £|#X;£     ÐÒÏÇÒÁÍ ÅÄÉÔÅÄ ÁÎÄ     £†#X;£         ÃÏÍÐÉÌÅÄ ÂÙ        £#X;£        ËÁÒÌ ÌÕÂÁÒÓËÙ       £š#X;£                            £¤#X;£­­­­­­­­­­­­­­­­­­­­­­­­­­­­£®#X;£                            £¸#X;£ ÓÔÉÃÈÔÉÎÇ ÁÔÁÒÉ ÇÅÂÒÕÉËÅÒÓ £Â#X;£       ÐÏÓÔÂÕÓ ±¸°          £Ì#X;£     ´±³° ÅÄ  ÖÉÁÎÅΠ       £Ö#X;£                            £à#X;££££££££££££££££££££££££££££££êX;ôX;þX;(X; OPTIONS: Drive numbers and densityX; Îïôåº if DENSITY=DOUBLE!X; then DRIVEA=DRIVEB !!!&X;0X;:X;D †DRIVEAN †DRIVEBX‡DENSITY†SINGLEbX;lX;vX; ÓÙÓ®ÅÑÕÁÔÅÓº €X;ŠX;”†SINGLE€;;Sector lengthsž †DOUBLE¨(†DDEVIC;;SIO Device Control Block² …DUNIT¼†DCOMNDƆDSTATSІDBUFLOÚ†DBYTLOä …DAUX1 î …ICHID@ø …ICDNOA …ICCOMB  …ICSTAC …ICBALD  …ICBAHE* …ICPTLF4 …ICPTHG> …ICBLLHH …ICBLHIR …ICAX1J\ …ICAX2Kf „CIOVVäp †DOSINI z!†CHKSUM1;;Temporary checksum„1†BUFRLO2;;Temporary pointer to user's bufferŽ)…ZTEMP4;;Temporary miscellaneous use˜)…ZTEM28;;Temporary miscellaneous use¢"†STACKP;;Stack pointer save¬1…PORTBÓ;;PIA port B-memory control register¶"…PORTAÓ;;PIA port A registerÀ*…PACTLÓ;;PIA port A control registerÊ …NMIENÔÔX;ÞX;èX; Check for 64,128 or 256 KòX;ü'X; Load-time code - Copy OS into RAMX;0X;$X;.†TXT130 AŠ} A8) AŸSetting up ATARI 130XE Ram DiskA=›B A‘ AL AŒ ðìåáóå ÷áéôAV†TXT256 AŠ} A`) AŸSetting up ATARI 256Kb Ram DiskA=›j A‘ At AŒ ðìåáóå ÷áéôA~X;ˆX; IF $D0=1 THEN 130XE’X;œX; IF $D0=2 THEN 256Kb XL¦X;°‚GOº%>;;START TESTÄ'DDÎ Q…PORTBØPÌâM>¯ì P…PORTBö1'DD QÌ P…PORTB)DD( F„NOXE2QÌ<M>ïF P…PORTBP)DDZ H…XL256d …XE130Q>nPÐx H„NOXE‚ …XL256Q>ŒPЖ „NOXEQÌ  P…PORTBªQдR>¾F‚XEÈR>ÒF‚XLÜ:æ ‚XL …PTEXTð!ƒCOSú ‚XE$>Q>  P…ICCOM9Q>†TXT130ÿ" P…ICBAL9,Q>†TXT1306 P…ICBAH9@Q>GJ P…ICBLL9TQ>^ P…ICBLH9h „CIOVrQ>|P€†P‰ Q šL>€¤P ® à¸$> ÂQ>þÌ P…ICCOM9ÖQ>†DRVNUMÿà P…ICBAL9êQ>†DRVNUMô P…ICBAH9þQ> P…ICAX19 P…ICAX29 „CIOV&$> 0Q>: P…ICCOM9D Q>„DUP1ÿN P…ICBAL9XQ>„DUP1b P…ICBAH9lQ>v P…ICAX19€Q>Š P…ICAX29” „CIOVžQ>¨ P…ICCOM9²Q>¼ P…ICBAL9Æ P…ICBLL9ÐQ>PÚ P…ICBAH9ä P…ICBLH9î „CIOVøIƒNXT)>ˆ FƒNXT:  ƒNXTQ> * P…ICCOM94 „CIOV>Q>H$> R P…ICCOM9\ Q>„DUP8ÿf P…ICBAL9pQ>„DUP8z P…ICBAH9„Q>Ž P…ICAX19˜Q>¢ P…ICAX29¬ „CIOV¶Q> À P…ICCOM9ÊQ>Ô P…ICBAL9ÞQ>Pè P…ICBAH9òQ>ü P…ICBLL9 Q> P…ICBLH9 „CIOV$ Q> . P…ICCOM98 „CIOVB Q>L $> V P…ICCOM9` Q>„MEM8ÿj P…ICBAL9t Q>„MEM8~ P…ICBAH9ˆ Q>’ P…ICAX19œ Q>¦ P…ICAX29° „CIOVº Q> Ä P…ICCOM9Î „CIOVØ Q> 8â P?ì :ö †DRVNUM AƒD8:A=› „DUP1 AŠD1:DUP.SYSA=› „DUP8 AŠD8:DUP.SYSA=› „MEM8 AŠD8:MEM.SAVA=› ƒCOSQ>À;;Zero page pointer( PÌ2 X;< PÎF Q>P PËZ PÍd %>n „LOOPx "Q…NMIEN;;Disable NMI interrupts‚ 5;;Save NMIENŒ M>– P…NMIEN  =;;Disable IRQª Q@Ë7;;Copy OS´ 5;;save value¾ Q…PORTBÈ N>;;Disable OS RomÒ P…PORTBÜ 7æ P@Í7ð Q…PORTBú N>;;Enable OS Rom P…PORTB 7 P…NMIEN;;Restore NMIEN" .;;Enable IRQ, 36 H„LOOP@ $ÌJ (>Ë;;Skip pages $CC to D7T H„NXPG^ $>×h &Îr „NXPG| #Ά 2 &Ìš H„LOOP¤ Q…PORTB® N>;;Enable RAM OS¸ X; P…PORTBÌ &…PORTA;;PA7 = 0Ö :à X;ê …PTEXTô $>þ Q>  P…ICCOM9 Q>†TXT256ÿ P…ICBAL9& Q>†TXT2560 P…ICBAH9: Q>GD P…ICBLL9N Q>X P…ICBLH9b „CIOVl :v † ‚GOŠ X;” X;ž X; Ramdisk controller code¨ "X; ÒÁÍÄÉÓË ÃÏÄÅ ÒÅÐÌÁÃÅÓ Ø̯ØÅ ² "X;    ÉÎÔÅÒÎÁÔÉÏÎÁÌ ÃÈÁÒ®ÓÅÔ   ¼ ÌÆ X;Ð X;Ú „HOOKä ,;;Hook into all SIO callsî Q†DDEVICø O…DUNIT %>;;Drive A offset %R>1†DRIVEA;;Right drive number ? F†HOOKED %>€;;DRIVEB offset* R>1†DRIVEB4 F†HOOKED> †OLDVEC H ! ;;If not go to SIOR †HOOKED\ @;;If so interceptf &†STACKP;;Save stack pointerp '…ZTEM2;;Store offsetz Q†DCOMND;;Examine command„ R> !;;Format ?Ž H…NOFMT˜ !†FORMAT¢ …NOFMT¬ R> P;;Put sector ?¶ H…NOPUTÀ !†PUTSECÊ …NOPUTÔ R> R;;Read sector ?Þ H…NOSETè !†GETSECò …NOSETü R> S;;Read status ? H…NOSTT !†STATUS …NOSTT$R> W;;Write sector ?. H†NAKRET8 !†PUTSECBX;LBX; Returns-Restore stack pointer,report error status and returnVX;` †NAKRETj $†STACKPtB~$%>‹;;NAK error for improper cmndˆ '†DSTATS’Q>œ P…PAFLG¦ !…PAOUT° †ERRRETº $†STACKPÄBÎ%>;;Bad sector erroØ '†DSTATSâQ>ì P…PAFLGö !…PAOUT †SUCRET  $†STACKPB%>;;No error( '†DSTATS2Q>< P…PAFLGF !…PAOUTPX;Z-X; Subroutine - Set pointer to user bufferdX;n †SETBUFx'Q†DBUFLO;;Move from DCB to zero page‚ P†BUFRLOŒQ†DBUFLO–P†BUFRLO :ªX;´5X; Subroutine - Prepare to acces sector of ramdisk¾X;È †SETSECÒ Q>‡DENSITYÜP†SECLEN;;Set sector lengthæQ…DAUX1;;Check sector #ð H„NDTZú Q…DAUX1F…OUTRS;;Sector 0 invalidR> E…INRNS"*Q>€;;Sectors 1-3 always 128 bytes long, P†SECLEN6 H…INRNS@ …OUTRSJ"!†NAKRET;;Sector # out of rangeT„NDTZ^R>;;Check for sectorh D…INRNSr H…OUTRS|Q>І R…DAUX1 D…OUTRSš …INRNS¤Q…DAUX1;;Sector # valid® P…ZTEMP¸ Q…DAUX1 T…ZTEMPÌ;U?;;Divide # by 64-Result is bank #, remainder is page #Ö T…ZTEMPàU?êO>;;Bank #ô>þ Q…ZTEMPV?V?O>@;;Remainder+64&X;0+X; Subroutine- Prepaire to switch banks;:X; X is bank, A is page #DX;N †SETBNKXP…ZTEM2;;Save page #bQ>€;;PA7 outputl P…PAFLGv …PAOUT€ Q…PORTBŠPƒPBN;;Normal bank”M>£žP‚PB;;Bank 0¨Q>²P‚PA¼A;;Bank# in accuÆ,ÐR> ;;Bank# <12 ?ÚD…SBNKA;;Yes,jumpäQ>€;;Banks 12 to 15îP‚PA;;PA7 = 1ø …SBNKAA;;Bank# in accu ,R>;;Bank# <8 ? D…SBNKB;;Yes, jump*Q>@;;Banks 8 to 154L‚PB>P‚PB;;PB4 & PB6= 1H …SBNKBRA;;Bank# in accu\M>;;Only bits 0 and 1fT?pT?;;Shift 2 pos leftzL‚PB„P‚PB;;Bank X in PBŽQúÿ;;NMI vector˜ P…ZTEMP¢Qûÿ¬ P…ZTEMP¶%>ÀQ>@;;RTI opcodeÊ=;;Disable IRQÔ3P@…ZTEMP7;;Place RTI in NMI routine-disables NMIÞ:;;Leave 0 in Y, bank # in XèX;òX; Format routineüX; †FORMAT$>;;Clear banks 4 to F †CLOOP1$Q>@. †SETBNK;;Prepare for switch8Q‚PAB P…PORTALQ‚PBVP…PORTB;;Switch bank in`Cj †CLOOP2t P@…ZTEM27;;Zero entire sector~3ˆ )†SECLEN’ H†CLOOP2œ?¦#…ZTEM2;;Next page° I†CLOOP2ºQƒPBNÄP…PORTB;;Switch bank outÎQ>Ø P…PORTAâQƒNMIìP@…ZTEMP7;;Enable interruptsö.2;;Next bank (>;;Done ? D†CLOOP1 †SETBUF(5Q>ÿ;;Return a sector with 2 FF's and the rest 0's2%>< …FLOOPF)>P H…NOTFFZQ>d …NOTFFn P@†BUFRLO7x3‚ )†SECLENŒ H…FLOOP–!†SUCRET;;Done X;ªX; Write sector routine´X;¾ †PUTSECÈ †SETBUFÒQ>ÜP†CHKSUM;;Zero checksumæ$ †SETSEC;;Point to ramdisk sectorð …PLOOPú*Q@†BUFRLO7;;Get byte from user's buffer$‚PA &…PORTA$‚PB"&…PORTB;;Switch bank,#P@…ZTEM27;;Put byte into ramdisk6$ƒPBN@&…PORTB;;Normal bankJ$>T &…PORTA^,h!O†CHKSUM;;Add byte to checksumr P†CHKSUM|3†!)†SECLEN;;Proper sector lenhth H…PLOOPš$$>;;Bank F holds checksum table¤ Q…DAUX1®T?¸ Q…DAUX1ÂU?Ì(L>`;;Sector # indexes checksum tableÖ †SETBNKà Q…DAUX1êM>ô?þ Q†CHKSUM$‚PA &…PORTA$‚PB&&…PORTB;;Switch bank0P@…ZTEM27;;Store checksum:$ƒPBND&…PORTB;;Normal bankN$>X &…PORTAb%>lQƒNMIvP@…ZTEMP7;;Enable interrupts€.Š!†SUCRET;;Done”X;žX; Read sector routine¨X;² †GETSEC¼ †SETBUFÆQ>ÐP†CHKSUM;;Zero checksumÚ †SETSECä …GLOOPî$‚PAø &…PORTA$‚PB &…PORTB;;Switch bank#Q@…ZTEM27;;Get byte from ramdisk $ƒPBN*&…PORTB;;Normal bank4$>> &…PORTAH*P@†BUFRLO7;;Put byte into user's bufferR,\O†CHKSUM;;Add to checksumf P†CHKSUMp3z!)†SECLEN;;Proper sector length„ H…GLOOPŽ"$>;;Bank F for checksum table˜ Q…DAUX1¢T?¬ Q…DAUX1¶U?ÀL>`Ê †SETBNKÔ Q…DAUX1ÞM>è?ò$‚PAü &…PORTA$‚PB&…PORTB;;Switch bank#Q@…ZTEM27;;Set original checksum$$ƒPBN.&…PORTB;;Normal bank8$>B &…PORTAL>V%>`QƒNMIjP@…ZTEMP7;;Enable interruptst.~(†CHKSUM;;Compare checksumsˆ F…SCSOK’$!†ERRRET;;If different bad sectorœ …SCSOK¦!†SUCRET;;If same, done°X;ºX; Read status routineÄX;Î †STATUSØ †SETBUFâ%>;;Returns 4 bytesìQ>;;All 0'sö …SLOOP P@†BUFRLO7 1 I…SLOOP R>‡DENSITY( H…SDONE2Q> <3F0P@†BUFRLO7;;First byte tells density of driveP …SDONEZ!†SUCRET;;DonedX;nX;Subroutine for PA7 outputxX;‚ …PAOUTŒX;– Q…PACTL N>ª P…PACTL´ Q…PAFLG¾ P…PORTAÈ Q…PACTLÒN>Ü P…PACTLæQ>ð P…PORTAú:X;X; Variable storage areaX;"-…PAFLG ;;Flag PORTA,$80=output,0=input,6‚PA ;;value of mem.contr.reg. for selected bank66‚PB ;;Value of mem.contr.reg. for selected bank@5ƒPBN ;;Value of mem.contr.reg. for normal bankJ=ƒNMI ;;First opcode in NMI routine-Used to restore NMIT)†SECLEN ;;Length of current sector^X;h"X; RESET initialisation routinerX;|;;Hidden (hopefully !!!)†X; †NEWINIš"…PORTB;;Enable RAM OS¤Q>€® P…PAFLG¸ …PAOUT†OLDINI Ì# ;;Call original DOSINI routineÖ †MODINIà(Q>†NEWINIÿ;;Set hook for next RESETê P†DOSINIôQ>†NEWINIþP†DOSINI:X;$X; Load-time code-Install ramdisk&X;0B:‚DODQÐNR>X F„CONTb!ƒENDl„CONTv!QZä;;Save original SIO vector€ P†OLDVECŠQ[ä”P†OLDVECž%Q>„HOOKÿ;;Install new SIO vector¨PZä²Q>„HOOK¼P[äÆ)Qúÿ;;Save first opcode in NMI routineÐPËÚQûÿäPÌî%>øQ@Ë7PƒNMI (Q†DOSINI;;Save original dosini vector P†OLDINI Q†DOSINI*P†OLDINI4 †MODINI;;Install new one>Q HL> ;;DRIVE #3&4RP \1 à;;Reinitialize FMS to show ramdisk presentf!ƒBEG;;DonepX;zX;„!X;FORMAT CODE - Format RamdiskŽX;˜C¢ AƒD4:A= ;B¬ AƒD3:A= ;B¶X;ÀƒBEGÊ$> ;;IOCB # 2ÔQ>þ;;FORMAT D4:Þ P…ICCOM9èQ>ò P…ICBAL9üQ>C P…ICBAH9 „CIOV I…DRIV3$:.X;8 …DRIV3BQ>þL P…ICCOM9VQ>` P…ICBAL9jQ>Ct P…ICBAH9~ „CIOVˆ I†DUPOPN’:;;Error-returnœX;¦@C°X;ºX;DUPLICATE DUP TO RAMDISKÄX;Î AŠD1:DUP.SYSA= ;BØX;â †DUPOPNìX;ö$> ;;IOCB # 2Q>;;OPEN D1:DUP.SYS P…ICCOM9;;FOR READQ>@ P…ICBAL9(Q>C2 P…ICBAH9<Q>F P…ICAX19PQ>Z P…ICAX29d „CIOVn I…DUPRDx:;;Error-return‚X;ŒX;–X;READ D1:DUP.SYS X;ª …DUPRD´X;¾Q>;;GET BINARY RECORDÈ P…ICCOM9ÒQ>ÜP…ICBAL9;;BUFFER AT $5000æQ>Pð P…ICBAH9úQ>P…ICBLL9;;$220B BYTES (8715)Q># P…ICBLH9" „CIOV, I†DUPCL16)>ˆ;;END OF FILE ?@ F†DUPCL1J:;;Error-returnTX;^X;hX;CLOSE # 2rX;| †DUPCL1†X;Q> ;;CLOSE D1:DUP.SYSš P…ICCOM9¤ „CIOV® I‡DUPOPN1¸:;;Error-returnÂX;ÌX;WRITE D4:DUP.SYSÖX;àX;ê CôX;þ AŠD4:DUP.SYSA= ;B X; ‡DUPOPN1 X;& $> ;;IOCB # 20 Q>;;OPEN D4:DUP.: P…ICCOM9;;FOR WRITED Q> N P…ICBAL9X Q>Cb P…ICBAH9l Q>v P…ICAX19€ Q>Š P…ICAX29” „CIOVž I†DUPWRT¨ :;;Error-return² X;¼ X;Æ X;WRITE D4:DUP.SYSÐ X;Ú †DUPWRTä X;î Q> ;;PUT BINARY RECORDø P…ICCOM9!Q> !P…ICBAL9;;BUFFER AT $5000!Q>P ! P…ICBAH9*!Q>4!P…ICBLL9;;$1411 BYTES>!Q>H! P…ICBLH9R! „CIOV\! I†DUPCL2f!:;;Error-returnp!X;z!X;„!X;CLOSE # 2Ž!X;˜! †DUPCL2¢!X;¬!Q> ;;CLOSE D4:DUP.SYS¶! P…ICCOM9À! „CIOVÊ!IƒFINÔ!:;;Error-returnÞ!X;è!X;ò!X;WRITE MEM.SAV TO DRIVE #4ü!X;"ƒFIN"$> "Q>$" P…ICCOM9." Q>„MEM4ÿ8" P…ICBAL9B"Q>„MEM4L" P…ICBAH9V"Q>`" P…ICAX19j"Q>t" P…ICAX29~" „CIOVˆ"Q> ;;CLOSE MEM.SAV’"$> œ" P…ICCOM9¦" „CIOV°"X;º"X;Ä"X;Î"Q> 4Ø"P?â"ƒENDQ> ;;CLEAN UP THEì"$>;;SCREENö" P…ICCOM9# Q>ƒCLSÿ #P…ICBAL9;;THANK-YOU# Q>ƒCLS# P…ICBAH9(#Q>2# P…ICBLL9<#Q>F# P…ICBLH9P# !„CIOVZ# ƒCLS }d#„MEM4 AŠD4:MEM.SAVAn#âx# ‚DO;;AND GOODBYE!