@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`  `4  ɐ     `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.D4:MEM.SAV J y08 B|DEHI$} V0 0`B;DEL`?<0LV`ʆ v s? F0Ξ05: [ BDEHI%} VY8 B V  @  /DE `E:D4: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 l} 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 ALLOWED RAMDISK SRC 170 COPYING---D1:RAMDISK.SRCl# 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- 128ɛ+,' 20*.. өr2 1``2TOO MANY DIGITSINVALID HEXAQ}DECIMAL PARAMETER800 0 8 00`,0'D800 H,ɛh`2L1NEED D1 THRU D80uR} ECIMAL PARAMETER800 0 8 00`,0'D800 H,ɛh`2L1NEED D1 THRU D80u00} Setting up ATARI 130XE Ram Disk } Setting up ATARI 256Kb Ram Disk T} DDӅ)ӈDD̍DD)DDХ̍ӥ ` O2L1 BD0EGHI VU}01    BםD1EJK V B۝D1EJK VBDHPEI V` B V V}BD1EJK V BDPEHI V B V BD1EJK V B V8?`D8:D1:DUP.SYSD8:DW}UP.SYSD8:MEM.1m2SAV̅Ω˅͠H)xHIhͭIhXئ׆ǭIӎ` BGD0EGX}HI V`0m4 5L̺8!LPL`RLSL ICBLLHH ICBLHIR ICAX1J\ ICAX2K p}f CIOVVp DOSINI z!CHKSUM1;;Temporary checksum1BUFRLO2;;Temporary pointer to user's buffer)ZTEMP4;;Tem q}porary miscellaneous use)ZTEM28;;Temporary miscellaneous use"STACKP;;Stack pointer save1PORTB;;PIA port B- r}memory control register"PORTA;;PIA port A register*PACTL;;PIA port A control register NMIENX;X; s}X; Check for 64,128 or 256 KX;'X; Load-time code - Copy OS into RAMX;0X;$X;.TXT130 A} A8) AS t}etting up ATARI 130XE Ram DiskA=B A AL AAVTXT256 A} A`) ASetting up ATARI 2 u}56Kb Ram DiskA=j A At AA~X;X; IF $D0=1 THEN 130XEX;X; IF $D0=2 THEN 256Kb XL v}X;GO%>;;START TEST'DD QPORTBPM> PPORTB1'DD Q PPORTB)DD( FNOXE2Q<M>F w} PPORTBP)DDZ HXL256d XE130Q>nPx HNOXE XL256Q>PЖ NOXEQ̠ PPORTBQдR>FXER>F x}XL: XL PTEXT!COS XE$>Q>  PICCOM9Q>TXT130" PICBAL9,Q>TXT1306 PICBAH9@Q>GJ PICBL y}L9TQ>^ PICBLH9h CIOVrQ>|PP Q L>P  $> Q> PICCOM9Q>DRVNUM PIC z}BAL9Q>DRVNUM PICBAH9Q> PICAX19 PICAX29 CIOV&$> 0Q>: PICCOM9D Q>DUP1N PICBAL9XQ>D {}UP1b PICBAH9lQ>v PICAX19Q> PICAX29 CIOVQ> PICCOM9Q> PICBAL9 PICBLL9Q>P PICB |}AH9 PICBLH9 CIOVINXT)> FNXT:  NXTQ> * PICCOM94 CIOV>Q>H$> R PICCOM9\ Q>DUP8f PI }}CBAL9pQ>DUP8z PICBAH9Q> PICAX19Q> PICAX29 CIOVQ>  PICCOM9Q> PICBAL9Q>P PIC ~}BAH9Q> PICBLL9 Q> PICBLH9 CIOV$ Q> . PICCOM98 CIOVB Q>L $> V PICCOM9` Q>MEM8j PICBAL9 }t Q>MEM8~ PICBAH9 Q> PICAX19 Q> PICAX29 CIOV Q> PICCOM9 CIOV Q> 8 P? : DRVNUM } AD8:A= DUP1 AD1:DUP.SYSA= DUP8 AD8:DUP.SYSA= MEM8 AD8:MEM.SAVA= COSQ>;;Zero page pointer( P2 X };< PF Q>P PZ Pd %>n LOOPx "QNMIEN;;Disable NMI interrupts 5;;Save NMIEN M> PNMIEN =;;Disable IRQ } Q@7;;Copy OS 5;;save value QPORTB N>;;Disable OS Rom PPORTB 7 P@7 QPORTB N>;;Enable OS Rom P }PORTB 7 PNMIEN;;Restore NMIEN" .;;Enable IRQ, 36 HLOOP@ $J (>;;Skip pages $CC to D7T HNXPG^ $>h &r N }XPG| #Ά 2 &̚ HLOOP QPORTB N>;;Enable RAM OS X; PPORTB &PORTA;;PA7 = 0 : X; PTEXT $> Q> }  PICCOM9 Q>TXT256 PICBAL9& Q>TXT2560 PICBAH9: Q>GD PICBLL9N Q>X PICBLH9b CIOVl :v   }GO X; X; X; Ramdisk controller code "X;ˠŠӠ̯Š "X;̠ҮԠ  X;  }X; HOOK ,;;Hook into all SIO calls QDDEVIC ODUNIT %>;;Drive A offset %R>1DRIVEA;;Right drive number ? F }HOOKED %>;;DRIVEB offset* R>1DRIVEB4 FHOOKED> OLDVEC H ! ;;If not go to SIOR HOOKED\ @;;If so interceptf }&STACKP;;Save stack pointerp 'ZTEM2;;Store offsetz QDCOMND;;Examine command R> !;;Format ? HNOFMT !FORMAT NO }FMT R> P;;Put sector ? HNOPUT !PUTSEC NOPUT R> R;;Read sector ? HNOSET !GETSEC NOSET R> S;;Read statu }s ? HNOSTT !STATUS NOSTT$R> W;;Write sector ?. HNAKRET8 !PUTSECBX;LBX; Returns-Restore stack pointer,report } error status and returnVX;` NAKRETj $STACKPtB~$%>;;NAK error for improper cmnd 'DSTATSQ> PPAFLG !PA }OUT ERRRET $STACKPB%>;;Bad sector erro 'DSTATSQ> PPAFLG !PAOUT SUCRET  $STACKPB%>;;N }o error( 'DSTATS2Q>< PPAFLGF !PAOUTPX;Z-X; Subroutine - Set pointer to user bufferdX;n SETBUFx'QDBUFLO;;Mo }ve from DCB to zero page PBUFRLOQDBUFLOPBUFRLO:X;5X; Subroutine - Prepare to acces sector of ramdisk }X; SETSEC Q>DENSITYPSECLEN;;Set sector lengthQDAUX1;;Check sector # HNDTZ QDAUX1FOUTRS;;Sector }0 invalidR> EINRNS"*Q>;;Sectors 1-3 always 128 bytes long, PSECLEN6 HINRNS@ OUTRSJ"!NAKRET;;Sector # out o }f rangeTNDTZ^R>;;Check for sectorh DINRNSr HOUTRS|Q>І RDAUX1 DOUTRS INRNSQDAUX1;;Sector # valid }PZTEMP QDAUX1 TZTEMP;U?;;Divide # by 64-Result is bank #, remainder is page # TZTEMPU?O>;;Bank #> } QZTEMPV?V?O>@;;Remainder+64&X;0+X; Subroutine- Prepaire to switch banks;:X; X is bank, A is page #DX;N S }ETBNKXPZTEM2;;Save page #bQ>;;PA7 outputl PPAFLGv PAOUT QPORTBPPBN;;Normal bankM>PPB;;Bank 0 }Q>PPAA;;Bank# in accu,R> ;;Bank# <12 ?DSBNKA;;Yes,jumpQ>;;Banks 12 to 15PPA;;PA7 = 1 SBNKA }A;;Bank# in accu ,R>;;Bank# <8 ? DSBNKB;;Yes, jump*Q>@;;Banks 8 to 154LPB>PPB;;PB4 & PB6= 1H SBNKBRA; };Bank# in accu\M>;;Only bits 0 and 1fT?pT?;;Shift 2 pos leftzLPBPPB;;Bank X in PBQ;;NMI vector PZTEMP }Q PZTEMP%>Q>@;;RTI opcode=;;Disable IRQ3P@ZTEMP7;;Place RTI in NMI routine-disables NMI:;;Leave } 0 in Y, bank # in XX;X; Format routineX; FORMAT$>;;Clear banks 4 to F CLOOP1$Q>@. SETBNK;;Prepare }for switch8QPAB PPORTALQPBVPPORTB;;Switch bank in`Cj CLOOP2t P@ZTEM27;;Zero entire sector~3 )SECLEN H }CLOOP2?#ZTEM2;;Next page ICLOOP2QPBNPPORTB;;Switch bank outQ> PPORTAQNMIP@ZTEMP7;;Enabl }e interrupts.2;;Next bank (>;;Done ? DCLOOP1 SETBUF(5Q>;;Return a sector with 2 FF's and the rest 0's2% }>< FLOOPF)>P HNOTFFZQ>d NOTFFn P@BUFRLO7x3 )SECLEN HFLOOP!SUCRET;;DoneX;X; Write sector r }outineX; PUTSEC SETBUFQ>PCHKSUM;;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@&POR }TB;;Normal bankJ$>T &PORTA^,h!OCHKSUM;;Add byte to checksumr PCHKSUM|3!)SECLEN;;Proper sector lenhth HPLO }OP$$>;;Bank F holds checksum table QDAUX1T? QDAUX1U?(L>`;;Sector # indexes checksum table SETBNK }QDAUX1M>? QCHKSUM$PA &PORTA$PB&&PORTB;;Switch bank0P@ZTEM27;;Store checksum:$PBND&PORTB;;N }ormal bankN$>X &PORTAb%>lQNMIvP@ZTEMP7;;Enable interrupts.!SUCRET;;DoneX;X; Read sector routine }X; GETSEC SETBUFQ>PCHKSUM;;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 buffer }R,\OCHKSUM;;Add to checksumf PCHKSUMp3z!)SECLEN;;Proper sector length HGLOOP"$>;;Bank F for checksum table } QDAUX1T? QDAUX1U?L>` SETBNK QDAUX1M>?$PA &PORTA$PB&PORTB;;Switch bank#Q@Z }TEM27;;Set original checksum$$PBN.&PORTB;;Normal bank8$>B &PORTAL>V%>`QNMIjP@ZTEMP7;;Enable interrupt }st.~(CHKSUM;;Compare checksums FSCSOK$!ERRRET;;If different bad sector SCSOK!SUCRET;;If same, doneX;X }; Read status routineX; STATUS SETBUF%>;;Returns 4 bytesQ>;;All 0's SLOOP P@BUFRLO7 1 ISLOOP } R>DENSITY( HSDONE2Q> <3F0P@BUFRLO7;;First byte tells density of driveP SDONEZ!SUCRET;;DonedX;nX;Subroutin }e for PA7 outputxX; PAOUTX; QPACTLN> PPACTL QPAFLG PPORTA QPACTLN> PPACTLQ> PPORT }A:X;X; Variable storage areaX;"-PAFLG ;;Flag PORTA,$80=output,0=input,6PA ;;value of mem.contr.reg. f }or selected bank66PB ;;Value of mem.contr.reg. for selected bank@5PBN ;;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 initiali }sation routinerX;|;;Hidden (hopefully !!!)X; NEWINI"PORTB;;Enable RAM OSQ> PPAFLG PAOUTOLDI }NI # ;;Call original DOSINI routine MODINI(Q>NEWINI;;Set hook for next RESET PDOSINIQ>NEWINIPD }OSINI:X;$X; Load-time code-Install ramdisk&X;0B:DODQNR>X FCONTb!ENDlCONTv!QZ;;Save or }iginal SIO vector POLDVECQ[POLDVEC%Q>HOOK;;Install new SIO vectorPZQ>HOOKP[)Q;;Sa }ve first opcode in NMI routinePQP%>Q@7PNMI (QDOSINI;;Save original dosini vector POLDINI  }QDOSINI*POLDINI4 MODINI;;Install new one>Q HL> ;;DRIVE #3&4RP \1 ;;Reinitialize FMS to show ramd }isk presentf!BEG;;DonepX;zX;!X;FORMAT CODE - Format RamdiskX;C AD4:A= ;B AD3:A= ;BX;BEG }$> ;;IOCB # 2Q>;;FORMAT D4: PICCOM9Q> PICBAL9Q>C PICBAH9 CIOV IDRIV3$:.X;8 DRIV3BQ>L } PICCOM9VQ>` PICBAL9jQ>Ct PICBAH9~ CIOV IDUPOPN:;;Error-returnX;@CX;X;DUPLICATE DUP TO RA }MDISKX; AD1:DUP.SYSA= ;BX; DUPOPNX;$> ;;IOCB # 2Q>;;OPEN D1:DUP.SYS PICCOM9;;FOR READQ>@ P }ICBAL9(Q>C2 PICBAH9<Q>F PICAX19PQ>Z PICAX29d CIOVn IDUPRDx:;;Error-returnX;X;X;READ D1:DUP. }SYSX; DUPRDX;Q>;;GET BINARY RECORD PICCOM9Q>PICBAL9;;BUFFER AT $5000Q>P PICBAH9Q>PI }CBLL9;;$220B BYTES (8715)Q># PICBLH9" CIOV, IDUPCL16)>;;END OF FILE ?@ FDUPCL1J:;;Error-returnTX;^X;h }X;CLOSE # 2rX;| DUPCL1X;Q> ;;CLOSE D1:DUP.SYS PICCOM9 CIOV IDUPOPN1:;;Error-returnX;X;WRITE D }4:DUP.SYSX;X;CX; AD4:DUP.SYSA= ;B X; DUPOPN1 X;& $> ;;IOCB # 20 Q>;;OPEN D4:DUP.: PICCOM9;; }FOR WRITED Q>N PICBAL9X Q>Cb PICBAH9l Q>v PICAX19 Q> PICAX29 CIOV IDUPWRT :;;Error-return X; } X; X;WRITE D4:DUP.SYS X; DUPWRT X; Q> ;;PUT BINARY RECORD PICCOM9!Q> !PICBAL9;;BUFFER AT $5000!Q>P }! PICBAH9*!Q>4!PICBLL9;;$1411 BYTES>!Q>H! PICBLH9R! CIOV\! IDUPCL2f!:;;Error-returnp!X;z!X;!X;CLOSE # 2!X };! DUPCL2!X;!Q> ;;CLOSE D4:DUP.SYS! PICCOM9! CIOV!IFIN!:;;Error-return!X;!X;!X;WRITE MEM.SAV TO DRIVE } #4!X;"FIN"$> "Q>$" PICCOM9." Q>MEM48" PICBAL9B"Q>MEM4L" PICBAH9V"Q>`" PICAX19j"Q>t" PICAX29 }~" CIOV"Q> ;;CLOSE MEM.SAV"$> " PICCOM9" CIOV"X;"X;"X;"Q> 4"P?"ENDQ> ;;CLEAN UP THE"$>;;SCRE }EN" PICCOM9# Q>CLS #PICBAL9;;THANK-YOU# Q>CLS# PICBAH9(#Q>2# PICBLL9<#Q>F# PICBLH9P# !CIOVZ# CLS  }}d#MEM4 AD4:MEM.SAVAn#x# DO;;AND GOODBYE!>CLS# PICBAH9(#Q>2# PICBLL9<#Q>F# PICBLH9P# !CIOVZ# CLS  30100 .OPT NO LIST0110 ;##############################0120 ;# #0130 ;# 192K RAMDISK CONTROL}LER #0140 ;# FOR ATARI 256K XL/XE #0150 ;# #0160 ;# STICHTING ATARI GEBRUIKERS #0170 ;}# HARDWARE GROUP #0180 ;# POSTBUS 2095 #0190 ;# 5202 CB s'HERTOGENBOSCH #0200 ;# } #0210 ;#----------------------------#0220 ;# #0230 ;# CONTRIBUTING PROGRAMMERS: } #0240 ;# #0250 ;# CLAUS BUCHHOLTZ #0260 ;# PETER WALGREEN #0270 ;# } GUUS ASSMANN #0280 ;# TON v.ROSMALEN #0290 ;# KARL LUBARSKY #0300 ;# } #0310 ;#----------------------------#0320 ;# #0330 ;# 256K XL/XE MEMORY UPGRADE #03}40 ;# DESIGN BY GUUS ASSMANN #0350 ;# #0360 ;#----------------------------#0370 ;# } #0380 ;# PROGRAM EDITED AND #0390 ;# COMPILED BY #0400 ;# KARL LUBARSKY } #0410 ;# #0420 ;#----------------------------#0430 ;# #0440 ;#} STICHTING ATARI GEBRUIKERS #0450 ;# POSTBUS 180 #0460 ;# 4130 ED VIANEN #0470 ;# } #0480 ;##############################0490 ;0500 ;0510 ;0520 ; OPTIONS: Drive numbers and density0530 ; No}te: if DENSITY=DOUBLE0540 ; then DRIVEA=DRIVEB !!!0550 ;0560 ;0570 ;0580 DRIVEA = 30590 DRIVEB = 40600 DENSITY = }SINGLE0610 ;0620 ;0630 ; SYS.EQUATES: 0640 ;0650 ;0660 SINGLE = $80 ;Sector lengths0670 DOUBLE = $000680 DDEVIC = }$0300 ;SIO Device Control Block0690 DUNIT = $03010700 DCOMND = $03020710 DSTATS = $03030720 DBUFLO = $03040730 DBYTLO =} $03080740 DAUX1 = $030A0750 ICHID = $03400760 ICDNO = $03410770 ICCOM = $03420780 ICSTA = $03430790 ICBAL = $03440800} ICBAH = $03450810 ICPTL = $03460820 ICPTH = $03470830 ICBLL = $03480840 ICBLH = $03490850 ICAX1 = $034A0860 ICAX2 = $0}34B0870 CIOV = $E4560880 DOSINI = $0C0890 CHKSUM = $31 ;Temporary checksum0900 BUFRLO = $32 ;Temporary pointer to }user's buffer0910 ZTEMP = $34 ;Temporary miscellaneous use0920 ZTEM2 = $38 ;Temporary miscellaneous use0930 STACKP} = $0318 ;Stack pointer save0940 PORTB = $D301 ;PIA port B-memory control register0950 PORTA = $D300 ;PIA port A regis}ter0960 PACTL = $D302 ;PIA port A control register0970 NMIEN = $D40E0980 ;0990 ;1000 ; Check for 64,128 or 256 K1010 };1020 ; Load-time code - Copy OS into RAM1030 ;1040 *= $30001050 ;1060 ;1070 TXT130 .BYTE "$)...... "1080 .}BYTE "Setting up ATARI 130XE Ram Disk",$9B1090 .BYTE "..... "1100 .BYTE " please wait"1110 TXT256 .BYTE} "$)...... "1120 .BYTE "Setting up ATARI 256Kb Ram Disk",$9B1130 .BYTE "..... "1140 .BYTE " pleas}e wait"1150 ;1160 ; IF $D0=1 THEN 130XE1170 ;1180 ; IF $D0=2 THEN 256Kb XL1190 ;1200 GO1210 LDY #2 ;START TES}T1220 STY $44441230 LDA PORTB1240 STA $CC1250 AND #$AF1260 STA PORTB1270 DEY 1280 STY $444}41290 LDA $CC1300 STA PORTB1310 CPY $44441320 BEQ NOXE1330 LDA $CC1340 AND #$EF1350 STA PO}RTB1360 CPY $44441370 BNE XL2561380 XE130 LDA #11390 STA $D01400 BNE NOXE1410 XL256 LDA #21420 STA} $D01430 NOXE LDA $CC1440 STA PORTB1450 LDA $D01460 CMP #11470 BEQ XE1480 CMP #21490 BEQ XL15}00 RTS 1510 XL JSR PTEXT1520 JMP COS1530 XE LDX #01540 LDA #111550 STA ICCOM,X1560 LDA #TXT130&25}51570 STA ICBAL,X1580 LDA #TXT130/2561590 STA ICBAH,X1600 LDA #711610 STA ICBLL,X1620 LDA #016}30 STA ICBLH,X1640 JSR CIOV1650 LDA #81660 STA 19201670 STA 29531680 LDA $070A1690 ORA #$80}1700 STA $070A1710 JSR $07E01720 LDX #$201730 LDA #2541740 STA ICCOM,X1750 LDA #DRVNUM&2551760} STA ICBAL,X1770 LDA #DRVNUM/2561780 STA ICBAH,X1790 LDA #01800 STA ICAX1,X1810 STA ICAX2,X1820} JSR CIOV1830 LDX #$201840 LDA #31850 STA ICCOM,X1860 LDA #DUP1&2551870 STA ICBAL,X1880 LDA} #DUP1/2561890 STA ICBAH,X1900 LDA #41910 STA ICAX1,X1920 LDA #01930 STA ICAX2,X1940 JSR CIOV1}950 LDA #71960 STA ICCOM,X1970 LDA #01980 STA ICBAL,X1990 STA ICBLL,X2000 LDA #$502010 STA }ICBAH,X2020 STA ICBLH,X2030 JSR CIOV2040 BPL NXT2050 CPY #$882060 BEQ NXT2070 RTS 2080 NXT LDA} #122090 STA ICCOM,X2100 JSR CIOV2110 LDA #32120 LDX #$202130 STA ICCOM,X2140 LDA #DUP8&255215}0 STA ICBAL,X2160 LDA #DUP8/2562170 STA ICBAH,X2180 LDA #82190 STA ICAX1,X2200 LDA #02210 S}TA ICAX2,X2220 JSR CIOV2230 LDA #112240 STA ICCOM,X2250 LDA #$002260 STA ICBAL,X2270 LDA #$502}280 STA ICBAH,X2290 LDA #$112300 STA ICBLL,X2310 LDA #$142320 STA ICBLH,X2330 JSR CIOV2340 }LDA #122350 STA ICCOM,X2360 JSR CIOV2370 LDA #32380 LDX #$202390 STA ICCOM,X2400 LDA #MEM8&255}2410 STA ICBAL,X2420 LDA #MEM8/2562430 STA ICBAH,X2440 LDA #82450 STA ICAX1,X2460 LDA #02470 } STA ICAX2,X2480 JSR CIOV2490 LDA #122500 STA ICCOM,X2510 JSR CIOV2520 LDA #'82530 STA $153F2}540 RTS 2550 DRVNUM .BYTE "D8:",$9B2560 DUP1 .BYTE "D1:DUP.SYS",$9B2570 DUP8 .BYTE "D8:DUP.SYS",$9B2580 MEM8 .BYTE "D}8:MEM.SAV",$9B2590 COS LDA #$C0 ;Zero page pointer2600 STA $CC2610 ;2620 STA $CE2630 LDA #02640 STA }$CB2650 STA $CD2660 LDY #$002670 LOOP2680 LDA NMIEN ;Disable NMI interrupts2690 PHA ;Save NMIE}N2700 AND #$002710 STA NMIEN2720 SEI ;Disable IRQ2730 LDA ($CB),Y ;Copy OS2740 PHA ;}save value2750 LDA PORTB2760 EOR #1 ;Disable OS Rom2770 STA PORTB2780 PLA 2790 STA ($CD),Y2800} LDA PORTB2810 EOR #1 ;Enable OS Rom2820 STA PORTB2830 PLA 2840 STA NMIEN ;Restore NMIEN2850 } CLI ;Enable IRQ2860 INY 2870 BNE LOOP2880 LDX $CC2890 CPX #$CB ;Skip pages $CC to D72900 } BNE NXPG2910 LDX #$D72920 STX $CE2930 NXPG2940 INC $CE2950 INX 2960 STX $CC2970 BNE LOOP2}980 LDA PORTB2990 EOR #$01 ;Enable RAM OS3000 ;3010 STA PORTB3020 STX PORTA ;PA7 = 03030 RTS 3}040 ;3050 PTEXT3060 LDX #03070 LDA #113080 STA ICCOM,X3090 LDA #TXT256&2553100 STA ICBAL,X3110 } LDA #TXT256/2563120 STA ICBAH,X3130 LDA #713140 STA ICBLL,X3150 LDA #03160 STA ICBLH,X3170 JSR} CIOV3180 RTS 3190 *= $02E23200 .WORD GO3210 ;3220 ;3230 ; Ramdisk controller code3240 ; RAMDISK CODE REP}LACES XL/XE 3250 ; INTERNATIONAL CHAR.SET 3260 *= $CC003270 ;3280 ;3290 HOOK3300 CLC ;Hook into a}ll SIO calls3310 LDA DDEVIC3320 ADC DUNIT3330 LDY #$00 ;Drive A offset3340 CMP #$31+DRIVEA ;Right driv}e number ?3350 BEQ HOOKED3360 LDY #$80 ;DRIVEB offset3370 CMP #$31+DRIVEB3380 BEQ HOOKED3390 OLDVEC =} *+13400 JMP * ;If not go to SIO3410 HOOKED3420 TSX ;If so intercept3430 STX STACKP ;Save stac}k pointer3440 STY ZTEM2 ;Store offset3450 LDA DCOMND ;Examine command3460 CMP #'! ;Format ?3470 BN}E NOFMT3480 JMP FORMAT3490 NOFMT3500 CMP #'P ;Put sector ?3510 BNE NOPUT3520 JMP PUTSEC3530 NOPUT3}540 CMP #'R ;Read sector ?3550 BNE NOSET3560 JMP GETSEC3570 NOSET3580 CMP #'S ;Read status ?3590} BNE NOSTT3600 JMP STATUS3610 NOSTT3620 CMP #'W ;Write sector ?3630 BNE NAKRET3640 JMP PUTSEC36 }50 ;3660 ; Returns-Restore stack pointer,report error status and return3670 ;3680 NAKRET3690 LDX STACKP3700 TXS  }3710 LDY #139 ;NAK error for improper cmnd3720 STY DSTATS3730 LDA #03740 STA PAFLG3750 JMP PAOUT }3760 ERRRET3770 LDX STACKP3780 TXS 3790 LDY #144 ;Bad sector erro3800 STY DSTATS3810 LDA #03820  } STA PAFLG3830 JMP PAOUT3840 SUCRET3850 LDX STACKP3860 TXS 3870 LDY #1 ;No error3880 STY DS }TATS3890 LDA #03900 STA PAFLG3910 JMP PAOUT3920 ;3930 ; Subroutine - Set pointer to user buffer3940 ;3950 }SETBUF3960 LDA DBUFLO ;Move from DCB to zero page3970 STA BUFRLO3980 LDA DBUFLO+13990 STA BUFRLO+14000 } RTS 4010 ;4020 ; Subroutine - Prepare to acces sector of ramdisk4030 ;4040 SETSEC4050 LDA #DENSITY4060 STA }SECLEN ;Set sector length4070 LDA DAUX1+1 ;Check sector #4080 BNE NDTZ4090 LDA DAUX14100 BEQ OUTRS ;Se}ctor 0 invalid4110 CMP #44120 BCS INRNS4130 LDA #$80 ;Sectors 1-3 always 128 bytes long4140 STA SECLEN}4150 BNE INRNS4160 OUTRS4170 JMP NAKRET ;Sector # out of range4180 NDTZ4190 CMP #2 ;Check for sector4}200 BCC INRNS4210 BNE OUTRS4220 LDA #$D04230 CMP DAUX14240 BCC OUTRS4250 INRNS4260 LDA DAUX1 };Sector # valid4270 STA ZTEMP4280 LDA DAUX1+14290 ASL ZTEMP4300 ROL A ;Divide # by 64-Result is ban}k #, remainder is page #4310 ASL ZTEMP4320 ROL A4330 ADC #4 ;Bank #4340 TAX 4350 LDA ZTEMP4360} LSR A4370 LSR A4380 ADC #$40 ;Remainder+644390 ;4400 ; Subroutine- Prepaire to switch banks;4410 ; X is }bank, A is page #4420 ;4430 SETBNK4440 STA ZTEM2+1 ;Save page #4450 LDA #$80 ;PA7 output4460 STA PAFLG44}70 JSR PAOUT4480 LDA PORTB4490 STA PBN ;Normal bank4500 AND #$A34510 STA PB ;Bank 04520 } LDA #04530 STA PA4540 TXA ;Bank# in accu4550 CLC 4560 CMP #$0C ;Bank# <12 ?4570 BCC SBNK}A ;Yes,jump4580 LDA #$80 ;Banks 12 to 154590 STA PA ;PA7 = 14600 SBNKA4610 TXA ;Bank# in ac}cu4620 CLC 4630 CMP #8 ;Bank# <8 ?4640 BCC SBNKB ;Yes, jump4650 LDA #$40 ;Banks 8 to 154660 } ORA PB4670 STA PB ;PB4 & PB6= 14680 SBNKB4690 TXA ;Bank# in accu4700 AND #3 ;Only bits 0 }and 14710 ASL A4720 ASL A ;Shift 2 pos left4730 ORA PB4740 STA PB ;Bank X in PB4750 LDA $}FFFA ;NMI vector4760 STA ZTEMP4770 LDA $FFFB4780 STA ZTEMP+14790 LDY #04800 LDA #$40 ;RTI opcod}e4810 SEI ;Disable IRQ4820 STA (ZTEMP),Y ;Place RTI in NMI routine-disables NMI4830 RTS ;Leave } 0 in Y, bank # in X4840 ;4850 ; Format routine4860 ;4870 FORMAT4880 LDX #4 ;Clear banks 4 to F4890 CLOOP1490!}0 LDA #$404910 JSR SETBNK ;Prepare for switch4920 LDA PA4930 STA PORTA4940 LDA PB4950 STA PORTB"} ;Switch bank in4960 TYA 4970 CLOOP24980 STA (ZTEM2),Y ;Zero entire sector4990 INY 5000 CPY SECLEN501#}0 BNE CLOOP25020 TAY 5030 INC ZTEM2+1 ;Next page5040 BPL CLOOP25050 LDA PBN5060 STA PORTB ;Swi$}tch bank out5070 LDA #05080 STA PORTA5090 LDA NMI5100 STA (ZTEMP),Y ;Enable interrupts5110 CLI 5120%} INX ;Next bank5130 CPX #$10 ;Done ?5140 BCC CLOOP15150 JSR SETBUF5160 LDA #$FF ;Return&} a sector with 2 FF's and the rest 0's5170 LDY #05180 FLOOP5190 CPY #25200 BNE NOTFF5210 LDA #05220 NOT'}FF5230 STA (BUFRLO),Y5240 INY 5250 CPY SECLEN5260 BNE FLOOP5270 JMP SUCRET ;Done5280 ;5290 ; Writ(}e sector routine5300 ;5310 PUTSEC5320 JSR SETBUF5330 LDA #05340 STA CHKSUM ;Zero checksum5350 JSR SETS)}EC ;Point to ramdisk sector5360 PLOOP5370 LDA (BUFRLO),Y ;Get byte from user's buffer5380 LDX PA5390 STX POR*}TA5400 LDX PB5410 STX PORTB ;Switch bank5420 STA (ZTEM2),Y ;Put byte into ramdisk5430 LDX PBN5440 +}STX PORTB ;Normal bank5450 LDX #05460 STX PORTA5470 CLC 5480 ADC CHKSUM ;Add byte to checksum5490 ,} STA CHKSUM5500 INY 5510 CPY SECLEN ;Proper sector lenhth5520 BNE PLOOP5530 LDX #$0F ;Bank F holds ch-}ecksum table5540 LDA DAUX15550 ASL A5560 LDA DAUX1+15570 ROL A5580 ORA #$60 ;Sector # indexes che.}cksum table5590 JSR SETBNK5600 LDA DAUX15610 AND #$7F5620 TAY 5630 LDA CHKSUM5640 LDX PA5650 /} STX PORTA5660 LDX PB5670 STX PORTB ;Switch bank5680 STA (ZTEM2),Y ;Store checksum5690 LDX PBN5700 0} STX PORTB ;Normal bank5710 LDX #05720 STX PORTA5730 LDY #05740 LDA NMI5750 STA (ZTEMP),Y ;Enabl1}e interrupts5760 CLI 5770 JMP SUCRET ;Done5780 ;5790 ; Read sector routine5800 ;5810 GETSEC5820 JSR SETBU2}F5830 LDA #05840 STA CHKSUM ;Zero checksum5850 JSR SETSEC5860 GLOOP5870 LDX PA5880 STX PORTA5890 3} LDX PB5900 STX PORTB ;Switch bank5910 LDA (ZTEM2),Y ;Get byte from ramdisk5920 LDX PBN5930 STX PORT4}B ;Normal bank5940 LDX #05950 STX PORTA5960 STA (BUFRLO),Y ;Put byte into user's buffer5970 CLC 5980 5} ADC CHKSUM ;Add to checksum5990 STA CHKSUM6000 INY 6010 CPY SECLEN ;Proper sector length6020 BNE GLO6}OP6030 LDX #$0F ;Bank F for checksum table6040 LDA DAUX16050 ASL A6060 LDA DAUX1+16070 ROL A60807} ORA #$606090 JSR SETBNK6100 LDA DAUX16110 AND #$7F6120 TAY 6130 LDX PA6140 STX PORTA6150 8} LDX PB6160 STX PORTB ;Switch bank6170 LDA (ZTEM2),Y ;Set original checksum6180 LDX PBN6190 STX PORT9}B ;Normal bank6200 LDX #06210 STX PORTA6220 TAX 6230 LDY #06240 LDA NMI6250 STA (ZTEMP),Y ;En:}able interrupts6260 CLI 6270 CPX CHKSUM ;Compare checksums6280 BEQ SCSOK6290 JMP ERRRET ;If different b;}ad sector6300 SCSOK6310 JMP SUCRET ;If same, done6320 ;6330 ; Read status routine6340 ;6350 STATUS6360 JSR SE<}TBUF6370 LDY #3 ;Returns 4 bytes6380 LDA #0 ;All 0's6390 SLOOP6400 STA (BUFRLO),Y6410 DEY 642=}0 BPL SLOOP6430 CMP #DENSITY6440 BNE SDONE6450 LDA #$206460 INY 6470 STA (BUFRLO),Y ;First byte >}tells density of drive6480 SDONE6490 JMP SUCRET ;Done6500 ;6510 ;Subroutine for PA7 output6520 ;6530 PAOUT6540 ;?}6550 LDA PACTL6560 EOR #46570 STA PACTL6580 LDA PAFLG6590 STA PORTA6600 LDA PACTL6610 EOR #@}46620 STA PACTL6630 LDA #06640 STA PORTA6650 RTS 6660 ;6670 ; Variable storage area6680 ;6690 PAFLG *A}= *+1 ;Flag PORTA,$80=output,0=input6700 PA *= *+1 ;value of mem.contr.reg. for selected bank6710 PB *= *+1 B};Value of mem.contr.reg. for selected bank6720 PBN *= *+1 ;Value of mem.contr.reg. for normal bank6730 NMI *= *+1 C} ;First opcode in NMI routine-Used to restore NMI6740 SECLEN *= *+1 ;Length of current sector6750 ;6760 ; RESET initialiD}sation routine6770 ;6780 *= $0100 ;Hidden (hopefully !!!)6790 ;6800 NEWINI6810 DEC PORTB ;Enable RAM OS682E}0 LDA #$806830 STA PAFLG6840 JSR PAOUT6850 OLDINI = *+16860 JSR * ;Call original DOSINI routine687F}0 MODINI6880 LDA #NEWINI&$FF ;Set hook for next RESET6890 STA DOSINI6900 LDA #NEWINI/$01006910 STA DOSINIG}+16920 RTS 6930 ;6940 ; Load-time code-Install ramdisk6950 ;6960 *= $42006970 DO6980 LDA $D06990 CMPH} #27000 BEQ CONT7010 JMP END7020 CONT7030 LDA $E45A ;Save original SIO vector7040 STA OLDVEC7050 I}LDA $E45B7060 STA OLDVEC+17070 LDA #HOOK&$FF ;Install new SIO vector7080 STA $E45A7090 LDA #HOOK/$010071J}00 STA $E45B7110 LDA $FFFA ;Save first opcode in NMI routine7120 STA $CB7130 LDA $FFFB7140 STA $CCK}7150 LDY #07160 LDA ($CB),Y7170 STA NMI7180 LDA DOSINI ;Save original dosini vector7190 STA OLDINI7L}200 LDA DOSINI+17210 STA OLDINI+17220 JSR MODINI ;Install new one7230 LDA $070A7240 ORA #12 ;DRIM}VE #3&47250 STA $070A7260 JSR $07E0 ;Reinitialize FMS to show ramdisk present7270 JMP BEG ;Done7280 ;7N}290 ;7300 ;FORMAT CODE - Format Ramdisk7310 ;7320 *= $43007330 .BYTE "D4:",9 B7340 .BYTE "D3:",9 B7350 ;7O}360 BEG7370 LDX #$20 ;IOCB # 27380 LDA #$FE ;FORMAT D4:7390 STA ICCOM,X7400 LDA #07410 STA ICBP}AL,X7420 LDA #$437430 STA ICBAH,X7440 JSR CIOV7450 BPL DRIV37460 RTS 7470 ;7480 DRIV37490 LDAQ} #$FE7500 STA ICCOM,X7510 LDA #47520 STA ICBAL,X7530 LDA #$437540 STA ICBAH,X7550 JSR CIOV7560R} BPL DUPOPN7570 RTS ;Error-return7580 ;7590 *= $43407600 ;7610 ;DUPLICATE DUP TO RAMDISK7620 ;763S}0 .BYTE "D1:DUP.SYS",9 B7640 ;7650 DUPOPN7660 ;7670 LDX #$20 ;IOCB # 27680 LDA #$03 ;OPEN D1:DUP.SYS7T}690 STA ICCOM,X ;FOR READ7700 LDA #$407710 STA ICBAL,X7720 LDA #$437730 STA ICBAH,X7740 LDA #$04U}7750 STA ICAX1,X7760 LDA #07770 STA ICAX2,X7780 JSR CIOV7790 BPL DUPRD7800 RTS ;Error-rV}eturn7810 ;7820 ;7830 ;READ D1:DUP.SYS7840 ;7850 DUPRD7860 ;7870 LDA #7 ;GET BINARY RECORD7880 STA ICCOMW},X7890 LDA #07900 STA ICBAL,X ;BUFFER AT $50007910 LDA #$507920 STA ICBAH,X7930 LDA #$007940 STX}A ICBLL,X ;$220B BYTES (8715)7950 LDA #$237960 STA ICBLH,X7970 JSR CIOV7980 BPL DUPCL17990 CPY #$88 Y} ;END OF FILE ?8000 BEQ DUPCL18010 RTS ;Error-return8020 ;8030 ;8040 ;CLOSE # 28050 ;8060 DUPCL1807Z}0 ;8080 LDA #$0C ;CLOSE D1:DUP.SYS8090 STA ICCOM,X8100 JSR CIOV8110 BPL DUPOPN18120 RTS ;[}Error-return8130 ;8140 ;WRITE D4:DUP.SYS8150 ;8160 ;8170 *= $43A08180 ;8190 .BYTE "D4:DUP.SYS",9 B8200 ;821\}0 DUPOPN18220 ;8230 LDX #$20 ;IOCB # 28240 LDA #$03 ;OPEN D4:DUP.8250 STA ICCOM,X ;FOR WRITE8260 L]}DA #$A08270 STA ICBAL,X8280 LDA #$438290 STA ICBAH,X8300 LDA #$088310 STA ICAX1,X8320 LDA #083^}30 STA ICAX2,X8340 JSR CIOV8350 BPL DUPWRT8360 RTS ;Error-return8370 ;8380 ;8390 ;WRITE D4:DUP._}SYS8400 ;8410 DUPWRT8420 ;8430 LDA #$0B ;PUT BINARY RECORD8440 STA ICCOM,X8450 LDA #08460 STA ICBAL`},X ;BUFFER AT $50008470 LDA #$508480 STA ICBAH,X8490 LDA #$118500 STA ICBLL,X ;$1411 BYTES8510 LDA #a}$148520 STA ICBLH,X8530 JSR CIOV8540 BPL DUPCL28550 RTS ;Error-return8560 ;8570 ;8580 ;CLOSE #b} 28590 ;8600 DUPCL28610 ;8620 LDA #$0C ;CLOSE D4:DUP.SYS8630 STA ICCOM,X8640 JSR CIOV8650 BPL FIN8c}660 RTS ;Error-return8670 ;8680 ;8690 ;WRITE MEM.SAV TO DRIVE #48700 ;8710 FIN8720 LDX #$208730 Ld}DA #38740 STA ICCOM,X8750 LDA #MEM4&2558760 STA ICBAL,X8770 LDA #MEM4/2568780 STA ICBAH,X8790 Le}DA #88800 STA ICAX1,X8810 LDA #08820 STA ICAX2,X8830 JSR CIOV8840 LDA #12 ;CLOSE MEM.SAV8850 f} LDX #$208860 STA ICCOM,X8870 JSR CIOV8880 ;8890 ;8900 ;8910 LDA #'48920 STA $153F8930 END LDA #11 g} ;CLEAN UP THE8940 LDX #$00 ;SCREEN8950 STA ICCOM,X8960 LDA #CLS&2558970 STA ICBAL,X ;THANK-YOU8980q}b%DOS SYSb*)DUP SYSbSRAMDISK COMbgaRAMDISK M65bRAMDISK SRCbsRAMDISK ASC LDA #CLS/2568990 STA ICBAH,X9000 LDA #19010 STA ICBLL,X9020 LDA #09030 STA ICBLH,X9040 JMPr} CIOV9050 CLS .BYTE $7D9060 MEM4 .BYTE "D4:MEM.SAV"9070 *= $02E29080 .WORD DO ;AND GOODBYE!LH,X9040 JMPl0100 .OPT NO LIST 0110 ;############################## 0120 ;# # 0130 ;# 192K RAMDISK CONTt}ROLLER # 0140 ;# FOR ATARI 256K XL/XE # 0150 ;# # 0160 ;# STICHTING ATARI GEBRUIKERS # u} 0170 ;# HARDWARE GROUP # 0180 ;# POSTBUS 2095 # 0190 ;# 5202 CB s'HERTOGENBOSCH # 0200 ;# v} # 0210 ;#----------------------------# 0220 ;# # 0230 ;# CONTRIBUTING w}PROGRAMMERS: # 0240 ;# # 0250 ;# CLAUS BUCHHOLTZ # 0260 ;# PETER WALGREEN x} # 0270 ;# GUUS ASSMANN # 0280 ;# TON v.ROSMALEN # 0290 ;# KARL LUBARSKY # 0300 y};# # 0310 ;#----------------------------# 0320 ;# # 0330 ;# 256K XL/z}XE MEMORY UPGRADE # 0340 ;# DESIGN BY GUUS ASSMANN # 0350 ;# # 0360 ;#--------------------{}--------# 0370 ;# # 0380 ;# PROGRAM EDITED AND # 0390 ;# COMPILED BY # |}0400 ;# KARL LUBARSKY # 0410 ;# # 0420 ;#----------------------------# 0430 ;# }} # 0440 ;# STICHTING ATARI GEBRUIKERS # 0450 ;# POSTBUS 180 # 0460 ;# 4130 ED V~}IANEN # 0470 ;# # 0480 ;############################## 0490 ; 0500 ; 0510 ; 0520 ; OP}TIONS: Drive numbers and density 0530 ; Note: if DENSITY=DOUBLE 0540 ; then DRIVEA=DRIVEB !!! 0550 ; 0560 ; 0570 ; } 0580 DRIVEA = 3 0590 DRIVEB = 4 0600 DENSITY = SINGLE 0610 ; 0620 ; 0630 ; SYS.EQUATES: 0640 ; 0650 ; 0660 SINGLE =} $80 ;Sector lengths 0670 DOUBLE = $00 0680 DDEVIC = $0300 ;SIO Device Control Block 0690 DUNIT = $0301 0700 DCOMND =} $0302 0710 DSTATS = $0303 0720 DBUFLO = $0304 0730 DBYTLO = $0308 0740 DAUX1 = $030A 0750 ICHID = $0340 0760 ICDNO = $}0341 0770 ICCOM = $0342 0780 ICSTA = $0343 0790 ICBAL = $0344 0800 ICBAH = $0345 0810 ICPTL = $0346 0820 ICPTH = $0347 } 0830 ICBLL = $0348 0840 ICBLH = $0349 0850 ICAX1 = $034A 0860 ICAX2 = $034B 0870 CIOV = $E456 0880 DOSINI = $0C 0890 }CHKSUM = $31 ;Temporary checksum 0900 BUFRLO = $32 ;Temporary pointer to user's buffer 0910 ZTEMP = $34 ;Temporar}y miscellaneous use 0920 ZTEM2 = $38 ;Temporary miscellaneous use 0930 STACKP = $0318 ;Stack pointer save 0940 PORTB }= $D301 ;PIA port B-memory control register 0950 PORTA = $D300 ;PIA port A register 0960 PACTL = $D302 ;PIA port A co}ntrol register 0970 NMIEN = $D40E 0980 ; 0990 ; 1000 ; Check for 64,128 or 256 K 1010 ; 1020 ; Load-time code - Copy OS} into RAM 1030 ; 1040 *= $3000 1050 ; 1060 ; 1070 TXT130 .BYTE "$)...... " 1080 .BYTE "Setting up ATARI 130X}E Ram Disk",$9B 1090 .BYTE "..... " 1100 .BYTE " please wait" 1110 TXT256 .BYTE "$)...... " 1120 } .BYTE "Setting up ATARI 256Kb Ram Disk",$9B 1130 .BYTE "..... " 1140 .BYTE " please wait" 1150 ; 1160} ; IF $D0=1 THEN 130XE 1170 ; 1180 ; IF $D0=2 THEN 256Kb XL 1190 ; 1200 GO 1210 LDY #2 ;START TEST 1220 ST}Y $4444 1230 LDA PORTB 1240 STA $CC 1250 AND #$AF 1260 STA PORTB 1270 DEY 1280 STY $4444 1290} LDA $CC 1300 STA PORTB 1310 CPY $4444 1320 BEQ NOXE 1330 LDA $CC 1340 AND #$EF 1350 STA PO}RTB 1360 CPY $4444 1370 BNE XL256 1380 XE130 LDA #1 1390 STA $D0 1400 BNE NOXE 1410 XL256 LDA #2 1420 } STA $D0 1430 NOXE LDA $CC 1440 STA PORTB 1450 LDA $D0 1460 CMP #1 1470 BEQ XE 1480 CMP #2 1490} BEQ XL 1500 RTS 1510 XL JSR PTEXT 1520 JMP COS 1530 XE LDX #0 1540 LDA #11 1550 STA ICCOM,X 15}60 LDA #TXT130&255 1570 STA ICBAL,X 1580 LDA #TXT130/256 1590 STA ICBAH,X 1600 LDA #71 1610 STA }ICBLL,X 1620 LDA #0 1630 STA ICBLH,X 1640 JSR CIOV 1650 LDA #8 1660 STA 1920 1670 STA 2953 168}0 LDA $070A 1690 ORA #$80 1700 STA $070A 1710 JSR $07E0 1720 LDX #$20 1730 LDA #254 1740 ST}A ICCOM,X 1750 LDA #DRVNUM&255 1760 STA ICBAL,X 1770 LDA #DRVNUM/256 1780 STA ICBAH,X 1790 LDA #0 1}800 STA ICAX1,X 1810 STA ICAX2,X 1820 JSR CIOV 1830 LDX #$20 1840 LDA #3 1850 STA ICCOM,X 1860 } LDA #DUP1&255 1870 STA ICBAL,X 1880 LDA #DUP1/256 1890 STA ICBAH,X 1900 LDA #4 1910 STA ICAX1,X } 1920 LDA #0 1930 STA ICAX2,X 1940 JSR CIOV 1950 LDA #7 1960 STA ICCOM,X 1970 LDA #0 1980 S}TA ICBAL,X 1990 STA ICBLL,X 2000 LDA #$50 2010 STA ICBAH,X 2020 STA ICBLH,X 2030 JSR CIOV 2040 }BPL NXT 2050 CPY #$88 2060 BEQ NXT 2070 RTS 2080 NXT LDA #12 2090 STA ICCOM,X 2100 JSR CIOV 2110 } LDA #3 2120 LDX #$20 2130 STA ICCOM,X 2140 LDA #DUP8&255 2150 STA ICBAL,X 2160 LDA #DUP8/256 21}70 STA ICBAH,X 2180 LDA #8 2190 STA ICAX1,X 2200 LDA #0 2210 STA ICAX2,X 2220 JSR CIOV 2230 } LDA #11 2240 STA ICCOM,X 2250 LDA #$00 2260 STA ICBAL,X 2270 LDA #$50 2280 STA ICBAH,X 2290 LD}A #$11 2300 STA ICBLL,X 2310 LDA #$14 2320 STA ICBLH,X 2330 JSR CIOV 2340 LDA #12 2350 STA ICCO}M,X 2360 JSR CIOV 2370 LDA #3 2380 LDX #$20 2390 STA ICCOM,X 2400 LDA #MEM8&255 2410 STA ICBAL,}X 2420 LDA #MEM8/256 2430 STA ICBAH,X 2440 LDA #8 2450 STA ICAX1,X 2460 LDA #0 2470 STA ICAX2,X} 2480 JSR CIOV 2490 LDA #12 2500 STA ICCOM,X 2510 JSR CIOV 2520 LDA #'8 2530 STA $153F 2540 } RTS 2550 DRVNUM .BYTE "D8:",$9B 2560 DUP1 .BYTE "D1:DUP.SYS",$9B 2570 DUP8 .BYTE "D8:DUP.SYS",$9B 2580 MEM8 .BYTE "D8:}MEM.SAV",$9B 2590 COS LDA #$C0 ;Zero page pointer 2600 STA $CC 2610 ; 2620 STA $CE 2630 LDA #0 2640 }STA $CB 2650 STA $CD 2660 LDY #$00 2670 LOOP 2680 LDA NMIEN ;Disable NMI interrupts 2690 PHA ;}Save NMIEN 2700 AND #$00 2710 STA NMIEN 2720 SEI ;Disable IRQ 2730 LDA ($CB),Y ;Copy OS 2740 } PHA ;save value 2750 LDA PORTB 2760 EOR #1 ;Disable OS Rom 2770 STA PORTB 2780 PLA 2790 } STA ($CD),Y 2800 LDA PORTB 2810 EOR #1 ;Enable OS Rom 2820 STA PORTB 2830 PLA 2840 STA NMIE}N ;Restore NMIEN 2850 CLI ;Enable IRQ 2860 INY 2870 BNE LOOP 2880 LDX $CC 2890 CPX #$CB } ;Skip pages $CC to D7 2900 BNE NXPG 2910 LDX #$D7 2920 STX $CE 2930 NXPG 2940 INC $CE 2950 INX }2960 STX $CC 2970 BNE LOOP 2980 LDA PORTB 2990 EOR #$01 ;Enable RAM OS 3000 ; 3010 STA PORTB 302}0 STX PORTA ;PA7 = 0 3030 RTS 3040 ; 3050 PTEXT 3060 LDX #0 3070 LDA #11 3080 STA ICCOM,X 3090 } LDA #TXT256&255 3100 STA ICBAL,X 3110 LDA #TXT256/256 3120 STA ICBAH,X 3130 LDA #71 3140 STA ICB}LL,X 3150 LDA #0 3160 STA ICBLH,X 3170 JSR CIOV 3180 RTS 3190 *= $02E2 3200 .WORD GO 3210 ; } 3220 ; 3230 ; Ramdisk controller code 3240 ; RAMDISK CODE REPLACES XL/XE 3250 ; INTERNATIONAL CHAR.SET 3260 *}= $CC00 3270 ; 3280 ; 3290 HOOK 3300 CLC ;Hook into all SIO calls 3310 LDA DDEVIC 3320 ADC DUNIT }3330 LDY #$00 ;Drive A offset 3340 CMP #$31+DRIVEA ;Right drive number ? 3350 BEQ HOOKED 3360 LDY #$80 } ;DRIVEB offset 3370 CMP #$31+DRIVEB 3380 BEQ HOOKED 3390 OLDVEC = *+1 3400 JMP * ;If not go to SIO }3410 HOOKED 3420 TSX ;If so intercept 3430 STX STACKP ;Save stack pointer 3440 STY ZTEM2 ;Store off}set 3450 LDA DCOMND ;Examine command 3460 CMP #'! ;Format ? 3470 BNE NOFMT 3480 JMP FORMAT 3490 NOF}MT 3500 CMP #'P ;Put sector ? 3510 BNE NOPUT 3520 JMP PUTSEC 3530 NOPUT 3540 CMP #'R ;Read secto}r ? 3550 BNE NOSET 3560 JMP GETSEC 3570 NOSET 3580 CMP #'S ;Read status ? 3590 BNE NOSTT 3600 J}MP STATUS 3610 NOSTT 3620 CMP #'W ;Write sector ? 3630 BNE NAKRET 3640 JMP PUTSEC 3650 ; 3660 ; Returns}-Restore stack pointer,report error status and return 3670 ; 3680 NAKRET 3690 LDX STACKP 3700 TXS 3710 LDY }#139 ;NAK error for improper cmnd 3720 STY DSTATS 3730 LDA #0 3740 STA PAFLG 3750 JMP PAOUT 3760 ERRR}ET 3770 LDX STACKP 3780 TXS 3790 LDY #144 ;Bad sector erro 3800 STY DSTATS 3810 LDA #0 3820 } STA PAFLG 3830 JMP PAOUT 3840 SUCRET 3850 LDX STACKP 3860 TXS 3870 LDY #1 ;No error 3880 STY} DSTATS 3890 LDA #0 3900 STA PAFLG 3910 JMP PAOUT 3920 ; 3930 ; Subroutine - Set pointer to user buffer 394}0 ; 3950 SETBUF 3960 LDA DBUFLO ;Move from DCB to zero page 3970 STA BUFRLO 3980 LDA DBUFLO+1 3990 STA }BUFRLO+1 4000 RTS 4010 ; 4020 ; Subroutine - Prepare to acces sector of ramdisk 4030 ; 4040 SETSEC 4050 LDA #D}ENSITY 4060 STA SECLEN ;Set sector length 4070 LDA DAUX1+1 ;Check sector # 4080 BNE NDTZ 4090 LDA DAUX1 } 4100 BEQ OUTRS ;Sector 0 invalid 4110 CMP #4 4120 BCS INRNS 4130 LDA #$80 ;Sectors 1-3 always 128 by}tes long 4140 STA SECLEN 4150 BNE INRNS 4160 OUTRS 4170 JMP NAKRET ;Sector # out of range 4180 NDTZ 4190 } CMP #2 ;Check for sector 4200 BCC INRNS 4210 BNE OUTRS 4220 LDA #$D0 4230 CMP DAUX1 4240 BCC} OUTRS 4250 INRNS 4260 LDA DAUX1 ;Sector # valid 4270 STA ZTEMP 4280 LDA DAUX1+1 4290 ASL ZTEMP 4300 } ROL A ;Divide # by 64-Result is bank #, remainder is page # 4310 ASL ZTEMP 4320 ROL A 4330 ADC #4 } ;Bank # 4340 TAX 4350 LDA ZTEMP 4360 LSR A 4370 LSR A 4380 ADC #$40 ;Remainder+64 4390 ; 44}00 ; Subroutine- Prepaire to switch banks; 4410 ; X is bank, A is page # 4420 ; 4430 SETBNK 4440 STA ZTEM2+1 ;Save pa}ge # 4450 LDA #$80 ;PA7 output 4460 STA PAFLG 4470 JSR PAOUT 4480 LDA PORTB 4490 STA PBN ;Nor}mal bank 4500 AND #$A3 4510 STA PB ;Bank 0 4520 LDA #0 4530 STA PA 4540 TXA ;Bank# in a}ccu 4550 CLC 4560 CMP #$0C ;Bank# <12 ? 4570 BCC SBNKA ;Yes,jump 4580 LDA #$80 ;Banks 12 to 15 }4590 STA PA ;PA7 = 1 4600 SBNKA 4610 TXA ;Bank# in accu 4620 CLC 4630 CMP #8 ;Bank# <8} ? 4640 BCC SBNKB ;Yes, jump 4650 LDA #$40 ;Banks 8 to 15 4660 ORA PB 4670 STA PB ;PB4 & PB6= 1} 4680 SBNKB 4690 TXA ;Bank# in accu 4700 AND #3 ;Only bits 0 and 1 4710 ASL A 4720 ASL A } ;Shift 2 pos left 4730 ORA PB 4740 STA PB ;Bank X in PB 4750 LDA $FFFA ;NMI vector 4760 STA ZT}EMP 4770 LDA $FFFB 4780 STA ZTEMP+1 4790 LDY #0 4800 LDA #$40 ;RTI opcode 4810 SEI ;Disab}le IRQ 4820 STA (ZTEMP),Y ;Place RTI in NMI routine-disables NMI 4830 RTS ;Leave 0 in Y, bank # in X 4840 }; 4850 ; Format routine 4860 ; 4870 FORMAT 4880 LDX #4 ;Clear banks 4 to F 4890 CLOOP1 4900 LDA #$40 4910} JSR SETBNK ;Prepare for switch 4920 LDA PA 4930 STA PORTA 4940 LDA PB 4950 STA PORTB ;Switch bank} in 4960 TYA 4970 CLOOP2 4980 STA (ZTEM2),Y ;Zero entire sector 4990 INY 5000 CPY SECLEN 5010 BNE} CLOOP2 5020 TAY 5030 INC ZTEM2+1 ;Next page 5040 BPL CLOOP2 5050 LDA PBN 5060 STA PORTB ;Switch }bank out 5070 LDA #0 5080 STA PORTA 5090 LDA NMI 5100 STA (ZTEMP),Y ;Enable interrupts 5110 CLI 51}20 INX ;Next bank 5130 CPX #$10 ;Done ? 5140 BCC CLOOP1 5150 JSR SETBUF 5160 LDA #$FF ;}Return a sector with 2 FF's and the rest 0's 5170 LDY #0 5180 FLOOP 5190 CPY #2 5200 BNE NOTFF 5210 LDA }#0 5220 NOTFF 5230 STA (BUFRLO),Y 5240 INY 5250 CPY SECLEN 5260 BNE FLOOP 5270 JMP SUCRET ;Done }5280 ; 5290 ; Write sector routine 5300 ; 5310 PUTSEC 5320 JSR SETBUF 5330 LDA #0 5340 STA CHKSUM ;Zero ch}ecksum 5350 JSR SETSEC ;Point to ramdisk sector 5360 PLOOP 5370 LDA (BUFRLO),Y ;Get byte from user's buffer 5380} LDX PA 5390 STX PORTA 5400 LDX PB 5410 STX PORTB ;Switch bank 5420 STA (ZTEM2),Y ;Put byte into ra}mdisk 5430 LDX PBN 5440 STX PORTB ;Normal bank 5450 LDX #0 5460 STX PORTA 5470 CLC 5480 ADC }CHKSUM ;Add byte to checksum 5490 STA CHKSUM 5500 INY 5510 CPY SECLEN ;Proper sector lenhth 5520 BNE P}LOOP 5530 LDX #$0F ;Bank F holds checksum table 5540 LDA DAUX1 5550 ASL A 5560 LDA DAUX1+1 5570 R}OL A 5580 ORA #$60 ;Sector # indexes checksum table 5590 JSR SETBNK 5600 LDA DAUX1 5610 AND #$7F 5620} TAY 5630 LDA CHKSUM 5640 LDX PA 5650 STX PORTA 5660 LDX PB 5670 STX PORTB ;Switch bank 5680} STA (ZTEM2),Y ;Store checksum 5690 LDX PBN 5700 STX PORTB ;Normal bank 5710 LDX #0 5720 STX PORTA } 5730 LDY #0 5740 LDA NMI 5750 STA (ZTEMP),Y ;Enable interrupts 5760 CLI 5770 JMP SUCRET ;Done 578}0 ; 5790 ; Read sector routine 5800 ; 5810 GETSEC 5820 JSR SETBUF 5830 LDA #0 5840 STA CHKSUM ;Zero checks}um 5850 JSR SETSEC 5860 GLOOP 5870 LDX PA 5880 STX PORTA 5890 LDX PB 5900 STX PORTB ;Switch bank } 5910 LDA (ZTEM2),Y ;Get byte from ramdisk 5920 LDX PBN 5930 STX PORTB ;Normal bank 5940 LDX #0 5950 } STX PORTA 5960 STA (BUFRLO),Y ;Put byte into user's buffer 5970 CLC 5980 ADC CHKSUM ;Add to checksum 5990} STA CHKSUM 6000 INY 6010 CPY SECLEN ;Proper sector length 6020 BNE GLOOP 6030 LDX #$0F ;Bank F }for checksum table 6040 LDA DAUX1 6050 ASL A 6060 LDA DAUX1+1 6070 ROL A 6080 ORA #$60 6090 JSR} SETBNK 6100 LDA DAUX1 6110 AND #$7F 6120 TAY 6130 LDX PA 6140 STX PORTA 6150 LDX PB 6160 } STX PORTB ;Switch bank 6170 LDA (ZTEM2),Y ;Set original checksum 6180 LDX PBN 6190 STX PORTB ;Normal bank} 6200 LDX #0 6210 STX PORTA 6220 TAX 6230 LDY #0 6240 LDA NMI 6250 STA (ZTEMP),Y ;Enable inter}rupts 6260 CLI 6270 CPX CHKSUM ;Compare checksums 6280 BEQ SCSOK 6290 JMP ERRRET ;If different bad sec}tor 6300 SCSOK 6310 JMP SUCRET ;If same, done 6320 ; 6330 ; Read status routine 6340 ; 6350 STATUS 6360 JSR S}ETBUF 6370 LDY #3 ;Returns 4 bytes 6380 LDA #0 ;All 0's 6390 SLOOP 6400 STA (BUFRLO),Y 6410 DE}Y 6420 BPL SLOOP 6430 CMP #DENSITY 6440 BNE SDONE 6450 LDA #$20 6460 INY 6470 STA (BUFRLO),Y };First byte tells density of drive 6480 SDONE 6490 JMP SUCRET ;Done 6500 ; 6510 ;Subroutine for PA7 output 6520 ; }6530 PAOUT 6540 ; 6550 LDA PACTL 6560 EOR #4 6570 STA PACTL 6580 LDA PAFLG 6590 STA PORTA 6600 } LDA PACTL 6610 EOR #4 6620 STA PACTL 6630 LDA #0 6640 STA PORTA 6650 RTS 6660 ; 6670 ; Variable }storage area 6680 ; 6690 PAFLG *= *+1 ;Flag PORTA,$80=output,0=input 6700 PA *= *+1 ;value of mem.contr.reg. for }selected bank 6710 PB *= *+1 ;Value of mem.contr.reg. for selected bank 6720 PBN *= *+1 ;Value of mem.contr.reg.} for normal bank 6730 NMI *= *+1 ;First opcode in NMI routine-Used to restore NMI 6740 SECLEN *= *+1 ;Length of curr}ent sector 6750 ; 6760 ; RESET initialisation routine 6770 ; 6780 *= $0100 ;Hidden (hopefully !!!) 6790 ; 6800 N}EWINI 6810 DEC PORTB ;Enable RAM OS 6820 LDA #$80 6830 STA PAFLG 6840 JSR PAOUT 6850 OLDINI = *+1 686}0 JSR * ;Call original DOSINI routine 6870 MODINI 6880 LDA #NEWINI&$FF ;Set hook for next RESET 6890 STA} DOSINI 6900 LDA #NEWINI/$0100 6910 STA DOSINI+1 6920 RTS 6930 ; 6940 ; Load-time code-Install ramdisk 695}0 ; 6960 *= $4200 6970 DO 6980 LDA $D0 6990 CMP #2 7000 BEQ CONT 7010 JMP END 7020 CONT 7030 } LDA $E45A ;Save original SIO vector 7040 STA OLDVEC 7050 LDA $E45B 7060 STA OLDVEC+1 7070 LDA #HOOK&$F}F ;Install new SIO vector 7080 STA $E45A 7090 LDA #HOOK/$0100 7100 STA $E45B 7110 LDA $FFFA ;Save first} opcode in NMI routine 7120 STA $CB 7130 LDA $FFFB 7140 STA $CC 7150 LDY #0 7160 LDA ($CB),Y 7170 } STA NMI 7180 LDA DOSINI ;Save original dosini vector 7190 STA OLDINI 7200 LDA DOSINI+1 7210 STA OLDIN}I+1 7220 JSR MODINI ;Install new one 7230 LDA $070A 7240 ORA #12 ;DRIVE #3&4 7250 STA $070A 7260 } JSR $07E0 ;Reinitialize FMS to show ramdisk present 7270 JMP BEG ;Done 7280 ; 7290 ; 7300 ;FORMAT CODE - Form}at Ramdisk 7310 ; 7320 *= $4300 7330 .BYTE "D4:",9 B 7340 .BYTE "D3:",9 B 7350 ; 7360 BEG 7370 LDX #$}20 ;IOCB # 2 7380 LDA #$FE ;FORMAT D4: 7390 STA ICCOM,X 7400 LDA #0 7410 STA ICBAL,X 7420 LDA }#$43 7430 STA ICBAH,X 7440 JSR CIOV 7450 BPL DRIV3 7460 RTS 7470 ; 7480 DRIV3 7490 LDA #$FE 7500} STA ICCOM,X 7510 LDA #4 7520 STA ICBAL,X 7530 LDA #$43 7540 STA ICBAH,X 7550 JSR CIOV 7560 } BPL DUPOPN 7570 RTS ;Error-return 7580 ; 7590 *= $4340 7600 ; 7610 ;DUPLICATE DUP TO RAMDISK 7620 ; }7630 .BYTE "D1:DUP.SYS",9 B 7640 ; 7650 DUPOPN 7660 ; 7670 LDX #$20 ;IOCB # 2 7680 LDA #$03 ;OPEN D1:D}UP.SYS 7690 STA ICCOM,X ;FOR READ 7700 LDA #$40 7710 STA ICBAL,X 7720 LDA #$43 7730 STA ICBAH,X 774}0 LDA #$04 7750 STA ICAX1,X 7760 LDA #0 7770 STA ICAX2,X 7780 JSR CIOV 7790 BPL DUPRD 7800 }RTS ;Error-return 7810 ; 7820 ; 7830 ;READ D1:DUP.SYS 7840 ; 7850 DUPRD 7860 ; 7870 LDA #7 ;GET BINAR}Y RECORD 7880 STA ICCOM,X 7890 LDA #0 7900 STA ICBAL,X ;BUFFER AT $5000 7910 LDA #$50 7920 STA ICBAH },X 7930 LDA #$00 7940 STA ICBLL,X ;$220B BYTES (8715) 7950 LDA #$23 7960 STA ICBLH,X 7970 JSR CIOV  }7980 BPL DUPCL1 7990 CPY #$88 ;END OF FILE ? 8000 BEQ DUPCL1 8010 RTS ;Error-return 8020 ; 80 }30 ; 8040 ;CLOSE # 2 8050 ; 8060 DUPCL1 8070 ; 8080 LDA #$0C ;CLOSE D1:DUP.SYS 8090 STA ICCOM,X 8100 JS }R CIOV 8110 BPL DUPOPN1 8120 RTS ;Error-return 8130 ; 8140 ;WRITE D4:DUP.SYS 8150 ; 8160 ; 8170 *= } $43A0 8180 ; 8190 .BYTE "D4:DUP.SYS",9 B 8200 ; 8210 DUPOPN1 8220 ; 8230 LDX #$20 ;IOCB # 2 8240 LDA }#$03 ;OPEN D4:DUP. 8250 STA ICCOM,X ;FOR WRITE 8260 LDA #$A0 8270 STA ICBAL,X 8280 LDA #$43 8290 }STA ICBAH,X 8300 LDA #$08 8310 STA ICAX1,X 8320 LDA #0 8330 STA ICAX2,X 8340 JSR CIOV 8350 BPL }DUPWRT 8360 RTS ;Error-return 8370 ; 8380 ; 8390 ;WRITE D4:DUP.SYS 8400 ; 8410 DUPWRT 8420 ; 8430 LDA} #$0B ;PUT BINARY RECORD 8440 STA ICCOM,X 8450 LDA #0 8460 STA ICBAL,X ;BUFFER AT $5000 8470 LDA #$50 } 8480 STA ICBAH,X 8490 LDA #$11 8500 STA ICBLL,X ;$1411 BYTES 8510 LDA #$14 8520 STA ICBLH,X 8530 } JSR CIOV 8540 BPL DUPCL2 8550 RTS ;Error-return 8560 ; 8570 ; 8580 ;CLOSE # 2 8590 ; 8600 DUPCL2 86}10 ; 8620 LDA #$0C ;CLOSE D4:DUP.SYS 8630 STA ICCOM,X 8640 JSR CIOV 8650 BPL FIN 8660 RTS } ;Error-return 8670 ; 8680 ; 8690 ;WRITE MEM.SAV TO DRIVE #4 8700 ; 8710 FIN 8720 LDX #$20 8730 LDA #3 8740 } STA ICCOM,X 8750 LDA #MEM4&255 8760 STA ICBAL,X 8770 LDA #MEM4/256 8780 STA ICBAH,X 8790 LDA #8 } 8800 STA ICAX1,X 8810 LDA #0 8820 STA ICAX2,X 8830 JSR CIOV 8840 LDA #12 ;CLOSE MEM.SAV 8850 } LDX #$20 8860 STA ICCOM,X 8870 JSR CIOV 8880 ; 8890 ; 8900 ; 8910 LDA #'4 8920 STA $153F 8930 END L}DA #11 ;CLEAN UP THE 8940 LDX #$00 ;SCREEN 8950 STA ICCOM,X 8960 LDA #CLS&255 8970 STA ICBAL,X ;TH}ANK-YOU 8980 LDA #CLS/256 8990 STA ICBAH,X 9000 LDA #1 9010 STA ICBLL,X 9020 LDA #0 9030 STA IC}BLH,X 9040 JMP CIOV 9050 CLS .BYTE $7D 9060 MEM4 .BYTE "D4:MEM.SAV" 9070 *= $02E2 9080 .WORD DO ;AND GOO}DBYE! 9040 JMP CIOV 9050 CLS .BYTE $7D 9060 MEM4 .BYTE "D4:MEM.SAV" 9070 *= $02E2 9080 .WORD DO ;AND GOO/