@L}5 _$% l0$)$$Hȱ$ UhL" `e$$%`$%`  R@P!( 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`  `1  ɐ     `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.D1:MEM.SAV J y08 B|DEHI$} V0 0`B;DEL`?<0LV`@ʆ v s? F0Ξ05: [ BDEHI%} VY8 B V  @  /DE `E:D1: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 ALLOWED736 FREE SECTORS COPYING---D1:DIRECK.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- 138ɛ+,' 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 D8u .OPT NO LIST,NO MLIST .OPT NO CLIST,NO EJECT; SAVE #D1:RDMEGA.M65;;; SAVE #D2:RDMEGA.M65;;; ASM ,,#D1:RD.COM; T} .TITLE "MegaByte RD Handler";; by John Picken, 19 Nov 93;VERSION = $45 bcd version*10;; 19 Nov major debug of ram U}test;; 18 Nov fixed bug in comline; handler introduced by ramtest; (leaves cy clear instead of set);; Ver 4.5 new, shorV}ter ram test;; Ver 4.4 improved portb fix.; Rewrote ram test to fix major; problem with 256xl and bug; in format code inW}troduced in; 4.3 which wiped out main ram.;; Ver 4.3 adds option to install; without reset handler.;; Ver 4.2 rewrote SX}tatus handler; to eliminate wasted bytes and; sped up installation. Other; change was to cause re-boot on; Reset until inY}stallation done.;; Ver 4.1 fixed minor bugs and; added a "smarter" relocator; which moves code either up or; down to allZ}ow source overwrite; (not required, I just wanted; to write it).;; Ver 4.0 added new relocator to; avoid using ICD's and[} changed; install format code for speed.;; Ver 3.2 added Portb stack fix;; Ver 3.1 minor bug fixes;; Ver 3.0 dispensed\} with buffer; Self-modified to save ram and; time. Self-mod saves 500/1010; (sd/dd) cycles on sector i/o; loops. Unbuffer]}ed i/o saves; 385/770 more + 1 page low ram.;; Ver 2.0 added new ram test to; work (hopefully) with all mods; and revise^}d rd to single rd; with aux (MYDOS accessible).;; Ver 1.0 allowed simulation of; two single density drives or; one dd dr_}ive with patches for; MYDOS access.; ------------------------------;; Under SpartaDOS 3.2d:; Memlo ICD ver 2.3 = $1A95`}; (576kxe, rd installed first); equivalent for 1meg would; be $1AB5;; With this version;; Memlo 1088xe = $19CD; Ma}emlo 576xe = $19AD; Memlo 320xe = $199D; Memlo 256xl = $1999; Memlo 130xe = $1991;; Min. saving 200 bytes (1088xeb}); Max. saving 260 bytes ( 130xe); .IF .NOT .DEF PORTB .INCLUDE #D1:RDEQUATE.M65 .ENDIF .INCLUDE #D1:INSTALL.M65c} .INCLUDE #D1:RELOC.M65 .INCLUDE #D1:RDDATA.M65 .INCLUDE #D1:HANDLER.M65SAVE50 *= *+$40 .OPT NO LIST .ENDLL.M65v; SAVE #D1:RDEQUATE.M65; last rev. 14 Aug 93;; SAVE #D2:RDEQUATE.M65; .MACRO SKIPB .BYTE $24 .ENDM; .MACRO SKI e}PW .BYTE $2C .ENDM; .MACRO PRINT LDY #%1 JSR PRINT .ENDM;; 6502 Opcodes for self; modifying code and stack fi f}x;CLC = $18SEC = $38BPL = $10BNE = $D0LDAY = $B9 Lda $aaaa,ySTAY = $99 Sta $aaaa,yLDAX = $BD Lda $aaaa,xSTA g} = $8D Sta $aaaa;; Sparta offsets from Comtab;LSIO = -10ZCRNAME = 3BUFOFF = 10COMFNAM = 33LBUF = 63;; OS Equate h}s;DOSVEC = $0ADOSINI = $0CPOKMSK = $10LMARGN = $52MEMLO = $02E7BASICF = $03F8TRIG3 = $D013IRQEN = $D20EPORTB = $D30 i}1DMACTL = $D400NMIEN = $D40ECIOV = $E456COLDSV = $E477;DDEVIC = $0300DUNIT = $0301DCOMND = $0302DSTATS = $0303DBUFL j}O = $0304DBUFHI = $0305DBYTLO = $0308DBYTHI = $0309DAUX1 = $030ADAUX2 = $030B;ICCOM = $0342ICBAL = $0344ICBAH = $034 k}5ICBLL = $0348ICBLH = $0349O = $0308DBYTHI = $0309DAUX1 = $030ADAUX2 = $030B;ICCOM = $0342ICBAL = $0344ICBAH = $034 ; SAVE #D1:INSTALL.M65; last rev. 19 Nov 93;; SAVE #D2:INSTALL.M65;;; LOAD #D1:RDMEGA.M65; .PAGE "Zero Page Usagem}"; *= $30;; Used by handler;ZPBSAV *= *+1 Portb entryZAUXRD *= *+1 Flag aux ramdiskZBUFLO *= *+2 Un}ser bufr addrZRVLO *= *+1 Ramdisk addressZRVHI *= *+1;ZPMSAV *= *+1 Pokmsk *= *+10 last Sio zpg=$40o};; Installation use only. All; cleared on program entry; *= $F0;; Used for format;ZFMTFG *= *+1 Format if +vep}ZUSED *= *+1 Sectors in use;; Used for Portb stack fix;ZPAGES *= *+1 Count. -ve=failZBYTE *= *+2 Seaq}rch addressZSTACK *= *+2 Stack address;; Count 64k blocks of ram;Z64K *= *+1 Total extra ramZRESERV *= *r}+1 Reserved ramZAUXMAX *= *+1 Aux rd limitZSIZE *= *+1 Main rd size;ZSETK *= *+2 For msg fixZRESEs}T *= *+1 No reset if -ve *= *+2 unused; .PAGE "Init"; *= $3100;; Prevent re-runs and kill; Break key untt}il exit;START LDA #$60 STA START LDA POKMSK STA ZPMSAV AND #$7F STA POKMSK STA IRQEN LDA #8 STA LMARGN u}PRINT M.HELLO return x=0;; Kill ints, clear page 0; from $F0 to end; SEI STX NMIEN LDY #ZFMTFGZLOOP STX 0,Y Iv}NY BNE ZLOOP x=y=0;; Save Dosini in handler and; make Reset cold start while; messing around in Dos.; LDA DOSINI w} STA OLDINI+1 LDA DOSINI+1 STA OLDINI+2 LDA # COLDSV STA DOSINI+1; .PAGE "Stack Fix"x}; LDA PORTB STA ZPBSAV;; Ensure Portb and Sparta stack; correct for 512k+ or cartridge; LDA #$FDPBREST STA PORTy}B LDY #8 Assume no cart LDA GINTLK Check assumption BEQ GOTBNK Go if true; LDY $AFFF Save bank STA $D508 z} Kill cart;GOTBNK LDX $A000 See if any Basic INC $A000 CPX $A000 BEQ GOTBAS; STX $A000 CLC;GOTBAS STA ${}D500,Y Restore cart ROL A a=gintlk*2+cy TAX;; cart+bas: x=3 cart only: x=2; bas only: x=1 no roms: x=0; onl|}y 1 is valid for basic on; LDA #$02 For basic flag STA ZPAGES DEX BNE FLAGIT was not 1; AND ZPBSAV If basic }}on a=0;FLAGIT STA BASICF on=0 off=2 ORA ZPBSAV If off set b1=1 STA ZPBSAV Fix Portb later; LDA # >$0700 STA Z~}BYTE+1;; Find Lda Address,X; LDX #0 x=0 thruoutGETLDA LDA (ZBYTE,X) CMP #$BD BEQ GOTLDA;NXTBYT INC ZBYTE} BNE GETLDA INC ZBYTE+1 DEC ZPAGES BPL GETLDA BMI OVRSTK Abort, not found;; Check next op is Sta Portb;GOTLDA} LDY #5STAPB? LDA (ZBYTE),Y CMP PBREST-3,Y Go back if BNE NXTBYT any fail test DEY else check CPY #2 } all 3 bytes BNE STAPB?;; Get stack address; LDA (ZBYTE),Y msb STA ZSTACK+1 DEY LDA (ZBYTE),Y lsb STA ZSTACK};; Correct all eight values; LDY #7FIXSTK LDA (ZSTACK),Y ORA BASICF STA (ZSTACK),Y DEY BPL FIXSTK; .PAGE "R}AM Test";OVRSTK LDA $1000 for 256xl PHA;; Save existing values; LDX #63SAVE5 LDY BTABLE,X STY PORTB LDA $}5000 STA SAVE50,X DEX BPL SAVE5;; Set test values; LDX #63FILL5 LDY BTABLE,X STY PORTB STY $5000 DEX BP}L FILL5; STX PORTB Main ram INX x=0 STX $1000 Ensure no STX $5000 false match STX $9000 with 256xl};; Test stored values against; what they should be; LDY #0 Dest. indexTEST5 LDA BTABLE,X STA PORTB STA ATAB}LE,Y To handler INY CMP $5000 BEQ PASS;; If any 16k bank fails,; skip complete 64k block; TYA Drop y back} AND #$FC to start of TAY 64k block;; Restore saved values;PASS LDA SAVE50,X STA $5000 INX CPX #64} BCC TEST5 y=banks found; JSR INTSON All normal PLA STA $1000; TYA Banks found STA BANKS are alway}s a LSR A multiple of LSR A four so STA Z64K carry=0; .PAGE "Command Line";; Get and evaluate comma}nd; line parameters; LDY #BUFOFF See if any LDA (DOSVEC),Y drive number; ADC #LBUF leaves c=0 TAY LDA (DOSVEC)},Y BMI ERROR No, error out;COMLINE LDY #ZCRNAME+1 Set up read LDA (DOSVEC),Y of user entry STA GOZCR+1 Get target} of INY jmp crname LDA (DOSVEC),Y in dos for STA GOZCR+2 my jmp $ffff; JSR GOZCR Get 1st. Error BNE ERRO}R if any file name; LDY #COMFNAM+1 Get rd number LDA (DOSVEC),Y and insert STA DN into message AND #$0F St}rip ascii CMP #8+1 Check max BCS ERROR value; CMP #1 Check low end BCC ERROR Error if less; BEQ SETDR}V Redir on if d1:; JSR XREDIR Kill redirection;SETDRV STA SDRIVE To handler code; JSR GOZCR Get switches BEQ} ENDPAR Go if none; LDY #COMFNAM+3 Skip Dn: LDA (DOSVEC),Y CMP #'/ BEQ EVAL;ERROR LDY #M.SYNERR Syntax error;}ABORT JMP RESINI;EVAL INY Evaluate switches LDA (DOSVEC),Y BMI ENDPAR go if eol; CMP #'E Reserve ra}m? BNE A? INC ZRESERV Yes INC ZAUXMAX BCS EVAL Go always;A? CMP #'A Aux rd reserve? BNE L? INC ZAUXMAX} Yes BCS EVAL Go always;L? CMP #'L No reset handler? BNE N? DEC ZRESET Yes BCS EVAL Go always;N? C}MP #'N No format? BNE ERROR Oops DEC ZFMTFG BCS EVAL Go always; .PAGE "Setup";ENDPAR LDA Z64K Any ex}tra ram BNE GOTRAM in computer?;NORAM LDY #M.NAVAIL Turkey! BPL ABORT Go always;; Report total ram found;GOTRA}M LDX # KF to "xxxxkb" JSR INSK in message PRINT M.EXRAM; LDA ZRESERV Any "E" ra}m? BEQ MD? No; CMP Z64K Check if all PHP ram reserved; LDX # KR res}erved ram JSR INSK message STA RSRVD 16k banks rsrvd STA AUXMAX Default PRINT M.RESRAM; PLP Quit if} all ram BCS NORAM reserved;MD? SEC Check if aux rd LDA ZAUXMAX specified above SBC ZRESERV reserved ram} BEQ AVAIL Not if 0 or -ve BCC AVAIL or borrow on Sbc; LDX # KM JSR INSK LDA ZAU}XMAX JSR INSK Return 16k banks STA AUXMAX Replace default PRINT M.AUXRD Report size;AVAIL SEC Calculat}e avail LDA Z64K 64k blocks and SBC ZAUXMAX Abort if more BCC NORAM assigned BNE MAINRD Go if not all D8:;; A}ll remaining ram assigned to aux; rd. Disable main rd by making it D0:; Ensure no format or redirection.; STA SDRIVE a=}0 on arrival DEC ZFMTFG JSR XREDIR Kill redirection BPL INSTALL Go always;; Set up main rd. Arrive:; a=[total ram }- total rsrvd];MAINRD STA ZSIZE Size in 64k blks LDX # KS size in k JSR INSK PRIN}T M.RAMSIZ; BIT ZFMTFG Format? BMI INSTALL No; JSR INIT Make it so;INSTALL PRINT M.REDIR;; Adjust handler} and relocator; for length of access table; x=0 from print call; CLC LDA BANKS; ADC # CLENTH STA LENGTH+1 TAX; TYA Add code length ADC # <}OLDINI to handler org STA SETMEM+1 to get Memlo STA R.01 adjustment for TXA reset handler ADC # >OLDINI an}d set one lsb STA SETMEM+6 in reloc data; BIT ZRESET Install reset BPL MOVEIT handler? Yes; LDA # RDSIO STA SOURCE+1; SEC LDA LENGTH SBC # RDSIO-OLDI}NI STA LENGTH+1;MOVEIT JSR TOMLOW Relocate to Memlo;SOURCE .WORD OLDINILENGTH .WORD $FFFF total code length .}WORD TABLE1 table address;; Handler ref's from here on; must be adjusted. A.xx, L.xx; and H.xx labels for relocator;; T}ake disk vector and point to; rd. Lsio is below Comtab so; load y with -ve value and work; from page lower; LDY #LSIO } DEC DOSVEC+1 Page down LDA (DOSVEC),Y Save lsbA.00 STA JSRSIO+1A.01 STA JMPSIO+1L.01 LDA # RDSIO STA (DOSV}EC),Y; INC DOSVEC+1 Restore Dosvec;; use jsr to original location; to allow for no reset handler; JSR SETMEM Set ne}w Memlo; BIT ZRESET BMI NORSET;L.00 LDA # OLDINI BNE EXIT;; If reset handler n}ot installed; remind user.;NORSET LDY #M.RESET;; Restore original Dosini;RESINI JSR PRINT LDA OLDINI+1 LDX OLD}INI+2;EXIT STA DOSINI STX DOSINI+1 LDA #2 Restore margin STA LMARGN and LDA ZPMSAV Break key, Irqen STA }POKMSK fixed by vblank;INTSON LDA ZPBSAV Restore portb STA PORTB LDA #$E0 Restore all STA NMIEN interrupts } CLI RTS Program exit; ------------------------------; Subroutines; ------------------------------;; Jump} to filename crunch routine;GOZCR JMP $FFFF;; Fix redirection message to; say "off". Set Clc opcode; into handler.;}XREDIR LDX #CLC STX REDIR LDY #'o STY RONOFF LDY #'f STY RONOFF+1 STY RONOFF+2 Return +ve RTS and non}-0;; Insert kb text into message; entry: x= addr; a= 64k blocks;; exit: a=16k banks;INSK STX ZSE}TK STY ZSETK+1 LDY #3 ASL A ASL A PHA TAXGETK LDA KTAB-1,X STA (ZSETK),Y DEX DEY BPL GETK PLA RTS};; Print message number y; max len 255 bytes;PRINT LDX #0 LDA MSGAL,Y STA ICBAL LDA MSGAH,Y STA ICBAH LDA MSG}LL,Y STA ICBLL STX ICBLH LDA #11 STA ICCOM JMP CIOV; .PAGE "Format";; Format main rd;INIT LDA ZSIZE Put }size in LDX # VOL JSR INSK; PRINT M.FMTMSG return x=0;; Clear all main rd banks; SEI} STX NMIEN LDY AUXMAX Lowest bank;BKLOOP LDA ATABLE,Y STA PORTB TXAPGLOOP STA $4000,X Nonresident STA $4100,}X code so go STA $4200,X for speed STA $4300,X STA $4400,X STA $4500,X STA $4600,X STA $4700,X STA $4800,X ST}A $4900,X STA $4A00,X STA $4B00,X STA $4C00,X STA $4D00,X STA $4E00,X STA $4F00,X STA $5000,X STA $5100,X S}TA $5200,X STA $5300,X STA $5400,X STA $5500,X STA $5600,X STA $5700,X STA $5800,X STA $5900,X STA $5A00,X }STA $5B00,X STA $5C00,X STA $5D00,X STA $5E00,X STA $5F00,X STA $6000,X STA $6100,X STA $6200,X STA $6300,X } STA $6400,X STA $6500,X STA $6600,X STA $6700,X STA $6800,X STA $6900,X STA $6A00,X STA $6B00,X STA $6C00,X} STA $6D00,X STA $6E00,X STA $6F00,X STA $7000,X STA $7100,X STA $7200,X STA $7300,X STA $7400,X STA $7500,X} STA $7600,X STA $7700,X STA $7800,X STA $7900,X STA $7A00,X STA $7B00,X STA $7C00,X STA $7D00,X STA $7E00,}X STA $7F00,X INX BEQ NXTBNK;GOPAGE JMP PGLOOP;NXTBNK INY CPY BANKS BEQ ZEROED JMP BKLOOP;ZEROED LDX }AUXMAX Select first LDA ATABLE,X main rd bank STA PORTB; LDX #42 Write sec #1SEC1LOOP LDA BOOTDAT,X with defau}lt STA $4000,X data DEX BPL SEC1LOOP; ---------------------; Require one half bitmap for; every 64k of ram assigned }to; rd so Zsize is bitmapsecs*2;; Start off with zsize in x; for code to follow; LDX ZSIZE req'd half bmaps TXA } Calculate bitmap LSR A sectors used; PHP cy flags half sec; ADC #0 Allow for half sec STA }$400F in total; TAY y= secs used INY sec 1 also in use;; sector address of map of main; dir is sect}or after bit maps; INY count it used, put STY $4009 address in boot sec;; 1st directory data sector; follow}s 1st dir sector map; INY count it used, put STY $4014 address in boot sec INY count sec0 STY ZUSE}D as in use; ---------------------; Create x half bitmaps; use half sector per map;; on arrival x=Zsize; LDA # <$40}80 Start with STA ZBUFLO sector 2 LSR A STA ZBUFLO+1MAPLP0 LDY #0 LDA #$FFMAPLP1 STA (ZBUFLO),Y Fill map INY} with $ff CPY #$40 BNE MAPLP1 CLC Add $40 to TYA buffer ADC ZBUFLO address STA ZBUFLO }BCC NEXTHALF INC ZBUFLO+1NEXTHALF DEX BNE MAPLP0; ---------------------; Calculate msb of total; sectors at $200/64}k; (lsb already set to 0);; x=0 from above; LDY ZSIZETSECLP INX INX DEY BNE TSECLP exit y=0 STX $400B+1 msb} tsecs to sec1; ---------------------; Free secs = Total-Used; x=msb tsecs; y=0=lsb tsecs; SEC TYA lsb tsecs} SBC ZUSED less used STA $400D lsb fsecs to sec1 TXA msb tsecs SBC #0 STA $400D+1 msb fsecs to sec1; -}--------------------; Clear bits in first two bytes of; bitmap to account for sectors used; LDX ZUSEDINUSE LSR $4080} ROR $4080+1 DEX BNE INUSE; ---------------------; On completion of writing bitmaps,; Zbuflo points to 1st dir map se}c; or to first dir map sec-$40. So if; part sector, add $40. Result is ram; address of 1st directory map sector.; PLP } Recover 1/2 sector BCC OVRADD flag LDA ZBUFLO ADC #$40-1 cuz c=1 BCC OVRINC INC ZBUFLO+1OVRINC STA ZBUF}LO;; Set directory data sec#; into directory sector map;OVRADD LDA $4014 LDY #4 STA (ZBUFLO),Y; -----------------}----; Copy dir entry into following; directory data sector. Entry is; 17 bytes (no td info); LDY #$80+16 next sec+len-1}DIRLOOP LDA DIRDAT-$80,Y STA (ZBUFLO),Y DEY BMI DIRLOOP JMP INTSON All done info); LDY #$80+16 next sec+len-1X; SAVE #D1:RELOC.M65; last rev. 13 Sep 93; .TITLE "Relocator";; General relocator. The copy; routine adjusts to permi}t; overwrite of source during copy; and uses internal ram only.;; Returns x=0, a=? y=?;; Calling syntax;; LDA # NEWORG Msb destination; JSR RELOC; .WORD SOURCE Code org; .WORD LENGTH; .WORD TABLE Addres}s;; If to Memlo, omit the Lda/Ldy;; JSR TOMLOW; .WORD SOURCE; .WORD LENGTH; .WORD TABLE;; Table format;;TABLE; .}WORD ADDR1 Addr of .Word; .WORD ADDR2 reference etc.; .WORD 0 End flag;; .WORD LSB4 Addr of Lsb; .WORD }LSB5 etc.; .WORD 0 End flag;; .WORD MSB4 Addr of Msb; .BYTE $4000 .BYTE 3 read 3 sec $4001 .WORD} $0700 load adr $4002 .WORD $07E0 init adr $4004 JMP $3080 Jmp Xbcont $4006 .WORD 0 1st dirmap $4009 .WORD  }0 tot secs $400B .WORD 0 free secs $400D .BYTE 0 bmaps used $400F .WORD 2 1st bmap $4010 .WORD 3 }2 1st free fds# $4012 .WORD 0 1st free dds# $4014VOL .BYTE "1024k RD" ; $4016 .BYTE 0 number tracks . }BYTE 128 sector size .BYTE 32 fms revision# .BYTE 0 unused ver. 2+ .BYTE 1 default boot D: .BYTE 0,0 r }eserved .BYTE 0 unused ver. 2+ .BYTE 0 vol sequence # .BYTE VERSION vol rnd# .WORD 0 bootpgm secmap1 .B }YTE 0 write lock flag;; First directory entry;DIRDAT .BYTE 8 In use .WORD 0 first map (0=main) .BYTE 17},0,0 directory length .BYTE "MAIN "; .PAGE "Print Data";; kilobyte values for messages;KTAB .BYTE " 64 128 }192 256" .BYTE " 320 384 448 512" .BYTE " 576 640 704 768" .BYTE " 832 896 9601024";; Print control tables; Must be }in same order; as numbered messages;MSGAL .BYTE HELLO addr msb }.BYTE >SYNERR .BYTE >EXRAM .BYTE >RESRAM .BYTE >NAVAIL .BYTE >RAMSIZ .BYTE >FMTMSG .BYTE >MDSIZ .BYTE >RDR .B}YTE >RESETW;MSGLL .BYTE L.HELLO message .BYTE L.SYNERR lengths .BYTE L.EXRAM .BYTE L.RESRAM .BYTE L.NAVAIL .BYT}E L.RAMSIZ .BYTE L.FMTMSG .BYTE L.AUXRD .BYTE L.REDIR .BYTE L.RESETW; .PAGE "Messages";MSGNUM .= -1;MSGNUM .= }MSGNUM+1M.HELLO = MSGNUMHELLO .BYTE 155 .BYTE "Mega XE RAMdisk ver " .BYTE '0+[VERSION/$10],"." .BYTE '0+[VERSION&$}0F] .BYTE 155 .BYTE "(c) 1993 by John Picken" .BYTE 155,155L.HELLO = *-HELLO;MSGNUM .= MSGNUM+1M.SYNERR = MSGNUMSY}NERR .BYTE "Syntax",155 .BYTE " RD Dx: [/[N][E][A]]" .BYTE 155,155 .BYTE "Where x = drive (1-8)" .BYTE 155 .BYTE }" N = do not format" .BYTE 155 .BYTE " E = reserve 64k" .BYTE 155 .BYTE " A = aux RAMdisk" .BYTE 155},155 .BYTE "E and A may be repeated" .BYTE 155 .BYTE "as required, to reserve" .BYTE 155 .BYTE "additional 64k bloc}ks." .BYTE 155,155L.SYNERR = *-SYNERR;MSGNUM .= MSGNUM+1M.EXRAM = MSGNUMEXRAM .BYTE "Extended RAM "KF .BYTE }" k",155,155L.EXRAM = *-EXRAM;MSGNUM .= MSGNUM+1M.RESRAM = MSGNUMRESRAM .BYTE "Reserved RAM "KR .BYTE " }k",155,155L.RESRAM = *-RESRAM;MSGNUM .= MSGNUM+1M.NAVAIL = MSGNUMNAVAIL .BYTE "No RAM Available for RD" .BYTE 155,15}5L.NAVAIL = *-NAVAIL;MSGNUM .= MSGNUM+1M.RAMSIZ = MSGNUMRAMSIZDN = *+1 .BYTE "D1: RAMdisk Size "KS .BYTE " k",}155,155L.RAMSIZ = *-RAMSIZ;MSGNUM .= MSGNUM+1M.FMTMSG = MSGNUMFMTMSG .BYTE " Formatting RAMdisk" .BYTE 155,155L.FM}TMSG = *-FMTMSG;MSGNUM .= MSGNUM+1M.AUXRD = MSGNUMMDSIZ .BYTE "D8: RAMdisk Size "KM .BYTE " k",155,155L.AUXRD = } *-MDSIZ;MSGNUM .= MSGNUM+1M.REDIR = MSGNUMRDR .BYTE " Drive redirection "RONOFF .BYTE "ON " .BYTE 155,155L.REDIR!} = *-RDR;MSGNUM .= MSGNUM+1M.RESET = MSGNUMRESETW .BYTE "Handler not Reset-proof" .BYTE 155,155L.RESETW = *-RESETW;"} .PAGE "Relocation Data";; Word references eg. Lda Label;TABLE1 .WORD A.00+1 .WORD A.01+1 .WORD A.02+1 .WORD A.#}03+1; .WORD A.04+1 Removed .WORD A.05+1 .WORD A.06+1 .WORD A.07+1 .WORD A.08+1 .WORD A.09+1 .WORD A.10+1 .WOR$}D A.11+1 .WORD A.12+1 .WORD A.13+1 .WORD A.14+1 .WORD A.15+1 .WORD A.16+1 .WORD A.17+1; .WORD A.18+1 Removed %}.WORD A.19+1 .WORD A.20+1 .WORD A.21+1 .WORD A.22+1 .WORD A.23+1 .WORD A.24+1 .WORD 0 End flag;; #