@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} RAMDRIVE.CFG commands:PRINT - parameters: between 1 and 30parameter 1 to 30: number (0-255), string or constant (ESCAPE - T}27, UP - 28, DOWN - 29, LEFT - 30, RIGHT - 31, SPACE - 32, QUOTE - 34, CLEAR - 125, DELETE - 126, TAB - 127, RETURN - 155, DU}ELETE_LINE - 156, INSERT_LINE - 157, CLEAR_TAB - 158, SET_TAB - 159, BUZZER - 253, DELETE_CHAR - 254, INSERT_CHAR - 255)ThiV}s command works in a similar way to the BASIC PRINT command. It displays its parameters on the screen. It can take between W}1 and 30 parameters, which can be either strings, numbers or constants. If a parameter is a number then corresponding ATASCIX}I character will be displayed (65 = A, 97 = a, etc.). If the parameter is a constant then it will display the appropriate chY}aracter (i.e. UP moves the cursor up one line, CLEAR clears the screen, etc.) Example:PRINT CLEAR,"this is an example of tZ}he PRINT command",32,32," space = 32"PROMPT - parameters: between 0 and 30parameters 0 to 30: number (0-255), string or c[}onstant (same as PRINT)This command will display its parameters on the screen (like the PRINT command) and then wait for th\}e user to press a key before continuing. This is useful for allowing the user to swap disks before continuing with setting u]}p the ramdrives.Example:PROMPT "Insert disk 2 and press any key to continue"POKE - parameters:2parameter 1: number (0-^}65535) - addressparameter 2: number (0-255) - value (1 byte)This command stores its second parameter at the address repres_}ented by the first. This command works in the same way as the BASIC POKE command. Ex.:POKE 710,20DPOKE - parameters:2`}parameter 1: number (0-65535) - addressparameter 2: number (0-65535) - value (2 bytes)This command is similar to POKE but a}it stores 2 bytes worth of information represented by the second parameter at the address represented by the first. This is b}like Turbo Basic's DPOKE command. Ex.:DPOKE 30000,12345DRIVE - parameters: 3 or 18with 3 parameters:parameter 1: numbc}er (0-9) - drive numberparameter 2: number (0-255) or AUTO - bank numberparameter 3: constant (SSSD, SSED, SSDD, DSDD, SSSDd}_8K, SSSD_64K, SSSD_128K, SSSD_256K, SSSD_512K, SSSD_1024K) - ramdrive sizewith 18 parameters:parameter 1: number (0-9) - e}drive numberparameter 2: number (0-255) or AUTO - bank numberparameter 3: number (0-255) - compatibility byteparameter 4: f}number (0-65535) - sector subtractparameter 5: number (0-255) - status byte 1parameter 6: number (0-255) - status byte 2pag}rameter 7: number (0-255) - status byte 3parameter 8: number (0-255) - status byte 4parameter 9: number (0-255) - config. bh}yte 1, tracksparameter 10: number (0-255) - config. byte 2parameter 11: number (0-65535) - config. bytes 3 and 4, sectors pi}er trackparameter 12: number (0-255) - config. byte 5, disk sidesparameter 13: number (0-255) - config. byte 6, densityparj}ameter 14: constant (SD - 128, DD - 256, QD - 512, OD - 1024) - config. byte 7 and 8, sector sizeparameter 15: number (0-255k}) - config. byte 9parameter 16: number (0-255) - config. byte 10parameter 17: number (0-255) - config. byte 11parameter 18l}: number (0-255) - config. byte 12This command is used to set up a ramdrive. There are 2 forms of this command, the simplem}st of the 2 takes 3 parameters, with the more complex taking 18. The following drives have been predefined for you: single sn}ided single density (SSSD 90K), single sided enhanced density (SSED 130K), single sided double density (SSDD 180K), double sio}ded double density (DSDD 360K), 8K ramdrive (SSSD_8K), 16K ramdrive (SSSD_16K), 64K ramdrive (SSSD_64K), 128K ramdrive (SSSD_p}128K), 256K ramdrive (SSSD_256K), 512K ramdrive (SSSD_512K) and 1024K ramdrive (SSSD_1024K). See the Technical document for q}more information on how to set up your own ramdrives.DRIVE 3,AUTO,SSSD_8KBANKS - parameters: 1parameter 1: number (0-25r}5) - number of banks to useThis command defines the number of extended memory banks available for all ramdrives. This shous}ld be less than or equal to the number of extended RAM banks available. You cannot set up a ramdrive that will need more bankt}s than the value specified here.i.e. you cannot set up a 90K ramdrive if you only have 4 16K banks (64K of expanded RAM) avau}ilable. Ex.BANKS 12BANK_BITS - parameters 1 or 3with 1 parameter:parameter 1: constant (BASIC, XE_64K, XE_256K, XE_512v}K, XE_1024K) - extended memory configurationwith 3 parameters:parameter 1: number (0-255) or constant (BASIC - 0, XE_64K -w} %00001100, XE_256K - %01101100, XE_512K - %01101110, XE_1024K - %11101110) - bank select bitsparameter 2: number (0-255) orx} constant (BASIC - %00000010, XE_64K - 0, XE_256K - 0, XE_512K - 0, XE_1024K - 0) - set these bitsparameter 3: number (0-255y}) or constant (BASIC - 0, XE_64K - %00011100, XE_256K - %01111100, XE_512K - %01111110, XE_1024K - %11111110) - clear these z}bitsThis command identifies which bits are used for selecting the expanded RAM. The first form of this command takes 1 par{}ameter, the second takes 3. With 1 parameter it allows you to tell Ramdrive 1.0 the size of your extender RAM. The BASIC co|}nstant tells Ramdrive 1.0 to use the 8K of RAM under the BASIC ROM as a small(8K) ramdisk. With 3 parameters, the first defi}}nes which bits are used for selecting the extended bank number, a 1 means this bank is used for selecting extended banks, a 0~} means it isn't and should be left unchanged. The second parameter defines which bits must be set to enable extended RAM, a }1 will set this bit when extended RAM is to be accessed, a 0 will leave it unchanged. The third parameter defines which bits} must be cleared when extended RAM is to be enabled, a 1 indicates this bit should be cleared when extended RAM is enabled, a} 0 will leave it unchanged. All the bits used for bank selecting should be set in the third parameter to this command to ens}ure they have been cleared. See the technical document for more information. Ex.BANK_BITS XE_256KBANK_BITS %00001100,%0000}0000,%00011100BANK_SIZE - parameters 1parameter 1: constant (XE, BASIC, B_32K, B_16K, B_8K, B_4K, B_2K, B_1K) - size of e}xtended RAM banksDefines the size of the extended RAM banks. This command takes one parameter which will let you specify t}he size of your extended banks to be either 1K (B_1K), 2K (B_2K), 4K (B_4K), 8K (B_8K), 16K (B_16K, XE or BASIC), or 32K (B_3}2K). For more information see the technical manual. Ex.BANK_SIZE B_16KBANK_WINDOW - parameters 1parameter 1: number (}0-65535) or constant (XE - 16384, BASIC - 40960) - bank window addressIdentifies where the extended RAM banks will appear i}n the memory address space. The XE constant specifies that they will appear at 16384 ($4000) and the BASIC constant that the}y will appear at 40960 ($A000). See the technical manual for more information. Ex.BANK_WINDOW $4000BANK_BITS_ADDR - par}ameters: 1parameter 1: number (0-65535) or constant (XE - 54017, PORTB - 54017, BASIC - 54017) - address used for selecting }bankThis command identifies the address that controls when main RAM is enabled and when extended RAM is enabled, and which }extended RAM banks should appear at the bank window. The default is 54017 which is the address used in the standard XE schem}e. See the technical manual for more information. Ex.BANK_BITS_ADDR PORTBREAD_CMD - parameters 1parameter 1: number (}0-255) - SIO Read Ramdrive commandDefines the value for the Read Ramdrive SIO command. For more information on the Read Ra}mdrive command see the Technical manual, SIO commands. Ex.READ_CMD 44WRITE_CMD: parameters 1parameter 1: number (0-255)} - SIO Write Ramdrive commandDefines the value for the ramdrive Write Ramdrive SIO command. For more information on the Wr}ite Ramdrive command see the Technical manual, SIO commands.Ex:WRITE_CMD 45ADDRESS_CMD - parameters 1parameter 1: numb}er (0-255) - SIO Read Address commandDefines the Read Address SIO command. For more information on the Read Address comm}and see the Technical manual, SIO commands.Ex.ADDRESS_CMD 46LOAD_ADDR - parameters 1 or 2parameter 1: number (0-65535)} or constant (DEFAULT - 52069) - start of code areaparameter 2: (optional) number (0-65535) or constant (MAX - 65535, CHARSE}T2_END - 53247) - end of code areaDefines the address the Ramdrive code will be stored in. This defaults to 52069 but can} be changed to any free area of memory. This address shouldn't overlap the area the RAMDRIVE.OBJ file is loaded into (20224 }to 35365 inclusive). The first parameter defines the address the code and any ramdrive data will be stored at. The second p}arameter if present defines the top limit for the ramdrive code and data. The code and data will not be allowed to expand pa}st this address. Use this to make sure that the code doesn't accidentally overwrite other code elsewhere. If the second par}ameter is not present and the first parameter is lower than 20224 then the top limit will default to 20223. If the second pa}rameter is not present and the first parameter is higher than 35365 then the top limit will default to 65535. If the first p}arameter is lower than 20224 then the second parameter must be lower than 20224 as well. You should ensure that you have def}ined at least 1042 bytes for the Ramdrive code and 23 bytes for each ramdrive you are setting up. Ex:LOAD_ADDR $A000,$B000}RESET_KEY - parameters 1parameter 1: number (0-255) or constant (HELP - 17, ESC - 28, DELETE - 52, SHIFT_HELP - 81, SHIFT}_ESC - 92, SHIFT_DELETE - 116, CONTROL_HELP - 145, CONTROL_ESC - 156, CONTROL_DELETE - 180) - warm and cold start keyIdenti}fies the key to be used to create both cold and warm starts. This command takes one parameter, which is a number representin}g the keypress that will cause a warmstart when pressed along with the OPTION key and a cold start when pressed along with th}e SELECT key. The values used here are the raw internal keypress values, as stored in location 764. This defaults to 17 whi}ch is the HELP key. Ex.RESET_KEY 32TRAP_RESET - parameters 1, 2 or 3parameter 1: number (0-65526) or constant (PAGE6 -} 1783, SPARE_XE - 590) - reset trap code addressparameter 2:(optional) number (0-65534) or constant (DOSINI - 12, CASINI - 2}) - reset vectorparameter 3:(optional) number (0-3) or constant (DISK - 1, CASSETTE - 2, BOTH - 3) - BOOT(9) valuewhen thi}s command is used the reset key will be trapped so that if it is pressed the ramdrive will not be switched off. The first pa}rameter specifies where the reset code should be stored. The reset code itself takes up 9 bytes. The second parameter speci}fies where to store the reset code's address, and the third parameter specifies what value will be stored at location 9. See} the technical manual for more information Ex:TRAP_RESET $600,CASINI,BOTHALT_OS - parameters 0 or 5with 5 parameters:p}arameter 1: number (0-65533) or constant (OS_B - 59215, OS_C - 49293) - keyboard interrupt modification addressparameter 2: }number (0-65344) or constant (OS_B - 65278, OS_C - 64337) - internal keypress conversion tableparameter 3: number (0-65535) }or constant (OS_B - 64728, OS_C - 63875) - keyclick routine addressparameter 4: constant (NONE, OS_C) - OS C reset modificat}ionparameter 5: constant (COPY, NO_COPY) - copy ROM to RAMThis command allows the Ramdrive 1.0 to work under other operati}ng systems as well as the OS C found in XL/XE machines. With no parameters Ramdrive will be set up to run under OS B. This }assumes that the OS B has already been installed with a translator disk. With 5 parameters this command allows you to custom}ise the Ramdrive set up code so that it will work under different operating systems. Parameter 1 specifies where the keyboar}d interrupt code modification should be made in the OS, parameter 2 give the address of the keyboard translation table, param}eter 3 the address of the keyclick routine, parameter 4 specifies whether the OS C RESET key modifications should be make, an}d parameter 5 specifies whether the operating system should be copied from ROM or whether it is already set up in RAM. See t}he technical manual for more information. Ex.ALT_OSALT_OS OS_B, OS_B, OS_B, NONE, NO_COPY]RAMDRIVE.CPY commands:POKE, DPOKE, PRINT, and PROMPT -These commands work in exactly the same way as they do in the RAMDRI }VE.CFG file.XIO - parameters 5parameter 1: number (0-255) or constant (RENAME - 32, ERASE - 33, DELETE - 33, PROTECT - 35 }, UNPROTECT - 36, FORMAT - 254) - operation to performparameter 2: number (0-7) - IOCB numberparameter 3: number (0-255) - }aux byte 1parameter 4: number (0-255) - aux byte 2parameter 5: string - drive and/or file specifierIssues an XIO command }to the specified real or ramdrive. This is similar to BASIC's XIO command. It's most useful function is to format ramdrives }. Care should be taken not to accidentally format a physical drive with this command, and hence lose all the data stored on }your floppy. There is no check made to see if the destination is a ramdrive or not. The second parameter to this command sp }ecifies the IOCB to use. IOCB 0 is reserved for the screen and IOCB 4 is reserved by the ramdrive loader, but all other IOCB }'s are available for your use. If you do try to use IOCB 4 then you will receive an error. Ex.XIO FORMAT,2,0,0,"D3:"WR }ITE_PROTECT - parameters 2parameter 1: number (0-9) - drive numberparameter 2: constant (ON, OFF) - protect or unprotectU }sed to write protect and unprotect ramdrives, the first parameter specifies the ramdrive number to protect/unprotect, the sec }ond parameter specifies whether it should be protected or unprotected. All writes to a protected ramdrive will fail. After }the ramdrive has been set up it can be protected and unprotected by pressing the OPTION key along with the ramdrive number. }Ex.WRITE_PROTECT 3,ONCOPY_FILE - parameters 2 or 3parameter 1: string - source file nameparameter 2: string - destinat }ion file nameparameter 3: (optional) string - prompt textThis command copies the file named in the first parameter to the }file named in the second parameter. The drive where the source and destination files are found should be specified along wit }h the corresponding file name. Wild cards are not supported. Most ramdisks will automatically copy the DUP.SYS file onto yo }ur ramdisk when they are set up. Ramdrive 1.0 doesn't copy any files unless specifically told to do so with this command. I }f you wanted DUP.SYS to be copied onto your ramdrive automatically then you would add a line to RAMDRIVE.CPY as follows:COP }Y_FILE "D1:DUP.SYS","D8:DUP.SYS"where D8 is your ramdrive. The third optional parameter allows you to display a prompt and } wait for the user to press a key before continuing. Use this parameter if the file you want to copy is on a different disk }from the RAMDRIVE.CPY file and you only have one real drive. Ex.:COPY_FILE "D1:CPFILE1","D8:RAMDFILE","INSERT CPFILE1 DISK } AND PRESS ANY KEY"This would display the prompt and wait for the user to press a key before trying to copy the CPFILE1 fil }e to D8: as RAMDFILE. If you have removed the RAMDRIVE.CPY disk, you will be asked to reinsert it after the file has been co }pied.COPY_SECTOR - parameters 3,4,5,6 or 7parameter 1: number (0-9) - source drive numberparameter 2: number (0-9) - des }tination drive numberparameter 3: number (0-65535) - source sector numberparameter 4: (optional) number (0-65535) or string } (if last parameter) - number of sectors to copy or promptparameter 5: (optional) number (0-65535) or string (if last parame }ter) - destination sector number or promptparameter 6: (optional) constant (SD - single density, DD - double density, QD - q }uad density, OD - oct. density) or string (if last parameter) - sector size or promptparameter 7: (optional) string - prompt }Copies one or more sectors from the source drive to the destination drive. This is useful for copying a whole disk or spec }ific sectors onto your ramdrive. The size of the source and destination sectors must be the same, i.e. you cannot copy a sec }tor from a single density disk (128 bytes per sector) to a double density disk (256 bytes per sector). The number of sectors } to be copied can be specified in the fourth parameter, this will default to 1. Multiple sectors can be copied in this way w }ith one COPY_SECTOR command. The fifth parameter specifies where the sectors should be copied to, if not specified then the }destination sector number on the destination drive will be the same as the source sector number on the source drive. If more } than one sector is being copied then the destination sector numbers will increase as the source sector numbers increase. If } the last parameter to this command (either the 4th, 5th, 6th or 7th parameter) is a string then this string will be displaye }d as a prompt and Ramdrive 1.0 will wait for the user to press a key before continuing. Use this parameter if the sectors yo }u want to copy are on a different disk from the one that RAMDRIVE.CPY is on and you only have one real drive. If you have re }moved the RAMDRIVE.CPY disk, you will be asked to reinsert it after the sectors have been copied. Ex.- Copy sector 360 fro }m drive 1 to drive 8 -COPY_SECTOR 1,8,360 - Copy sectors 360 to 369 inclusive from drive 1 to sectors 400 to 409 inclusive } on drive 2 -COPY_SECTOR 1,2,360,10,400- Displays message and waits for keypress before copying sectors 30 to 129 from dri }ve 1 to drive 8 -COPY_SECTOR 1,8,30,100,"insert disk 2" MODIFY_SECTOR - parameters 4,5,6,7 or 8parameter 1: number (0-9 }) - drive numberparameter 2: number (0-65535) - sector numberparameter 3: number (0-1023) - byte numberparameter 4: number } (0-255) - value to storeparameter 5: (optional) number (0-1024) or string (if last parameter) - number of bytes to modify o }r promptparameter 6: (optional) constant (STA - store, EOR - bitwise exclusive or, ORA - bitwise or, AND - bitwise and) or s }tring (if last parameter) - operation to perform or promptparameter 7: (optional) constant (SD - single density, DD - double } density, QD - quad density, OD - oct. density) or string (if last parameter) - sector size or promptparameter 8: (optional) } string - promptThis command modifies the specified byte(s) in the given sector. The bytes are numbered from 0 to sector s }ize-1 (127 for single density, 255 for double density, etc.). This command provides simple sector editing capabilities. The } 6th parameter if present and not a string, specifies if the value given in the 4th parameter should replace (STA) the value }already there, or perform a bitwise operation on it and store the result (EOR, ORA, AND). If the last parameter to this comm }and (either the 5th, 6th, 7th or 8th parameter) is a string then this string will be displayed as a prompt and Ramdrive 1.0 w }ill wait for the user to press a key before continuing. Use this parameter if the sector you want to modify is on a differen }t disk from the one that RAMDRIVE.CPY is on and you only have one real drive. If you have removed the RAMDRIVE.CPY disk, you } will be asked to reinsert it after the sector has been modified. Ex.- Set bytes 20 to 24 inclusive, in sector 360 on driv }e 8 to 255 -MODIFY_SECTOR 8,360,20,255,5,STA,SD- Prompt the user, wait for and keypress and then set bit 7 in byte 80 in s }ector 10 on drive 3 -MODIFY_SECTOR 3,10,80,%10000000,1,ORA,"INSERT DISK TO MODIFY"DRIVE_TABLE - parameters 10parameters }1 to 10: number (0-9) - drive numberThis command sets up ramdrive 1.0's drive table. The drive table is a list of which dr }ive to map a drive number to. Each parameter represents a drive numbered 0 through 9, so the drive number appearing in the f }irst parameter will act as drive 0, the drive appearing in the second parameter will act as drive 1, and so on. This command } is probably best explained with an example or two. If you have a real drive numbered drive 1, and a ramdrive numbered drive } 8 set up, and you wanted all calls to drive 1 to be sent to drive 8, and all calls to drive 8 to be sent to drive 1 then you } would place the following command in RAMDRIVE.CPY:DRIVE_TABLE 0,8,2,3,4,5,6,7,1,9Now if you went into DOS and asked for }a directory listing of D1:, you would in fact get a listing of your ramdrive (D8:), and if you asked for a listing of D8: you } would get your real drive (D1:). Another example would be if you wanted all drives to refer to your real drive (D1:), you w }ould include the following line:DRIVE_TABLE 1,1,1,1,1,1,1,1,1,1Now an attempt to access any drive numbered 0 through 9 wo }uld automatically be directed to your real drive (D1:), and all this can be achieved without having to change the drive numbe }r switches on the back of your real drive. In order to avoid confusion, the drive table is only set up after both the RAMDRI }VE.CFG and RAMDRIVE.CPY files have been read and interpreted. Hence any DRIVE_TABLE command found will only take effect afte }r everything else has been set up. This avoids you accidentally formatting your real drive by issuing a command like:DRIVE_ }TABLE 0,8,2,3,4,5,6,7,1,9XIO FORMAT,2,0,0,"D8:"Changing the drive table after running the set up program can be achieved b }y pressing the SELECT key along with a number 0 - 9. See the technical manual for more information. dError messagesThe following error messages can be generated by Ramdrive 1.0 while setting up your ramdrives:BAD CHARACTER}:An invalid character was found on this line. Only numbers, uppercase letters, commas, spaces, underscores, semicolons, $, }" and % are valid characters, unless in a string.BAD COMMAND:The command is not recognised by Ramdrive 1.0. You have most} likely made a mistake entering the command name.UNEXPECTED CHARACTER:The command should be separated from its first param}eter by a space. Some other character was found between the command and the first parameter.UNEXPECTED END OF LINE:An end} of line character (155) was found when not expected. This is usually caused by a comma with no parameter after it.BAD PAR}AMETER:There is a mistake in this parameter. Either an invalid character was found, or if it is a string, the closing " is }missing.TOO FEW PARAMETERS:You have not given this command enough parameters. Check the manual for the correct number of }parameters.TOO MANY PARAMETERS:You have given this command too many parameters. Check the manual for the correct number o}f parameters.WRONG NUMBER OF PARAMETERS:You have given this command the wrong number of parameters. Check the manual for }the correct number.EXPECTING ,:Either there's a comma missing, or there's a stray space on this line. A command's paramet }ers should be separated by commas.NUMBER TOO BIG:The number is greater than 65535. Only numbers between 0 and 65535 inclu }sive are allowed.BAD BINARY NUMBER:The binary number you have entered is wrong. Binary numbers are made up of 0's and 1's } preceded by a % and can have a maximum of 16 digits.BAD DECIMAL NUMBER:The decimal number you entered is wrong. Decimal  }numbers are made up of digits between 0 and 9, have no prefix, and can have a maximum of 5 digits.BAD HEXADECIMAL NUMBER:T }he hexadecimal number you entered is wrong. Hexadecimal numbers are made up of digits between 0 and 9, and uppercase letters} between A and F inclusive, are prefixed with a $ and can have a maximum of 4 digits.BAD PARAMETER TYPE:Parameters can be }either strings, numbers or constants. Not all commands accept all types of parameters. You have given the command a paramet}er type it wasn't expecting (i.e. a number when it was expecting a string). Check the manual for the correct parameter type.}BAD CONSTANT:The command does not recognise this constant. Check the manual for the constants recognised by this command.}PROCESSING STRING:An error was found in this string. Strings should be surrounded with double quotes (").MISSING ":The} close quote for the string is missing. Strings must be surrounded by quotes.2ND ADDRESS MUST BE HIGHER THAN 1ST:The seco}nd parameter passed to the LOAD_ADDR must be higher than the first.NOT ENOUGH SPACE DEFINED:There is not enough space betw}een the first and second parameters to the LOAD_ADDR command for the Ramdrive 1.0 code and any ramdrive set up so far. Eithe}r reduce the number of ramdrives, decrease the first parameter to LOAD_ADDR or increase the second parameter to LOAD_ADDR. Y}ou need to allow 1042 bytes for the Ramdrive 1.0 code plus 23 bytes to store the configuration information for each ramdrive }you have set up. If only 1 parameter has been given to the LOAD_ADDRs command and it is less than 20224 then the top range w}ill default to 20223, otherwise it will default to 65535.OUT OF SPACE:There is not enough space as defined by the LOAD_ADD}R command to add another ramdrive. If you need to add another ramdrive then you must increase the space defined with LOAD_AD}DR. Each ramdrive needs an additional 23 bytes for its configuration information.BAD ADDRESS:The addresses specified in t}he LOAD_ADDR parameters are invalid. These addresses should not overlap the area RAMDRIVE.OBJ loads into (20224 to 35365 inc}lusive), change the values of the parameter so that they don't overlap the RAMDRIVE.OBJ area. This error will occur if eithe}r (or both) of the parameters to LOAD_ADDR are within this area or if the first parameter is less than 20224 and the second p}arameter is higher than 35365.NOT ENOUGH FREE BANKS:You do not have enough extended memory banks to create this ramdrive.  } If you have more extended banks available then increase the BANKS command parameter, otherwise use a smaller ramdrive.IOCB!} x NOT AVAILABLE:This error occurs if the second parameter passed to the XIO command is 4. IOCB 4 is reserved for use by th"}e Ramdrive 1.0 set-up code.NOT A RAMDISK:You have tried to either write protect or unprotect a drive that isn't a ramdrive#}. Only ramdrives can be protected or unprotected in this way.ERROR xxx READING SECTOR sss:Where xxx is the error number a$}nd sss the sector number. An error occurred while Ramdrive was trying to read this sector from this drive.ERROR xxx WRITIN%}G SECTOR sss:Where xxx is the error number and sss the sector number. An error occurred while Ramdrive was trying to write &}this sector on this drive.OFSET LARGER THAN OR EQUAL TO SECTOR SIZE:The 3rd parameter to the MODIFY_SECTOR command must be'} between 0 and the sector size-1 inclusive, (i.e. 0 and 127 for single density, 0 and 255 for double density, etc.). Reduce (}the value of this parameter.OFSET + NUMBER LARGER THAN SECTOR SIZE:The 3rd parameter plus the fifth parameter to the MODIF)}Y_SECTOR command must not be bigger than the size of the sector, i.e. for single density sectors these values must not add up*} to more than 128.BUG ALERT!:BUG ALERT! IN DECINT:BUG ALERT! IN CMDTBL:You should hopefully never see these error messag+}es, but if you do then you have found a bug in Ramdrive 1.0. If this happens then send me copies of your RAMDRIVE.CFG and RA,}MDRIVE.CPY files along with your system's details (computer type, extended RAM size, bank size, number or banks, DOS used, OS-} used, any modifications you have installed, etc.) and I'll fix the problem for the next release.ERROR xxx OPENING RAMDRIVE.}.CFG:ERROR xxx OPENING RAMDRIVE.CPY:Where xxx is an error number. Either the RAMDRIVE.CFG or the RAMDRIVE.CPY files are no/}t on the disk, or they couldn't be read. Check in your DOS's manual for the meaning of the error code, or insert the correct0} disk.ERROR xxx OPENING filename:Where xxx is an error number and filename the name of a file. An error occurred while th1}e COPY_FILE command was trying to open this file. Check your DOS manual for this error's meaning.ERROR xxx READING filenam2}e:Where xxx is an error number and filename the name of a file. An error occurred while the COPY_FILE command was trying to3} read this file. Check your DOS manual for this error's meaning.ERROR xxx WRITING filename:Where xxx is an error number a4}nd filename the name of a file. An error occurred while the COPY_FILE command was trying to write this file. Check your DOS5} manual for this error's meaning.ERROR xxx DURING XIO:Where xxx is an error number. An error occurred while this XIO comm6}and was being carried out. Check your DOS manual for this error's meaning.ERROR xxx DURING NOTE:Where xxx is an error num7}ber. An error occurred while Ramdrive 1.0 was attempting a note command. Ramdrive 1.0 will attempt a note when a PROMPT, CO8}PY_FILE with 3 parameters, or a COPY_SECTOR or MODIFY_SECTOR command whose last parameter is a string, is found. This is don9}e so that if the disk with the RAMDRIVE.CFG or RAMDRIVE.CPY file is removed from the drive, then Ramdrive 1.0 can detect this:} and ask you to replace it after the command has executed.:; 1MEG CFG FILE; BITS TO USE FOR BANK SWITCHINGBANK_BITS XE_1024K; 64 BANKS, 16K PER BANK=1024KBANKS 64; SET UP RAMDRIVE<}, 8192 SECTORSDRIVE 8,AUTO,SSSD_1024K&; 1MEG CPY FILE; FORMAT RAMDRIVEXIO FORMAT,2,255,31,"D8:"; COPY DUP.SYS TO RAMDRIVECOPY_FILE "D1:DUP.SYS","D8:DUP.SYS"{; 256K CFG FILE; SET BITS USED FOR BANK SWITCHINGBANK_BITS XE_256K; 16 BANKS OF 16K EACHBANKS 16; CREATE 2048 SECTOR RAM?}DRIVEDRIVE 8,AUTO,SSSD_256K; 256K CPY FILE; FORMAT THE RAMDRIVEXIO FORMAT,2,255,7,"D8:"; COPY DUP.SYS TO RAMDRIVECOPY_FILE "D1:DUP.SYS","D8:DUP.SYS"!A} ; 512K CFG FILE; BITS TO USE FOR BANK SWITCHINGBANK_BITS XE_512K; 32 BANKS, 16K PER BANK=512KBANKS 32; SET UP RAMDRIVE, %C}4096 SECTORSDRIVE 8,AUTO,SSSD_512K$#; 512K CPY FILE; FORMAT RAMDRIVEXIO FORMAT,2,255,15,"D8:"; COPY DUP.SYS TO RAMDRIVECOPY_FILE "D1:DUP.SYS","D8:DUP.SYS"({ ; STANDARD 64K CFG FILEDRIVE 8,AUTO,SSSD_64K,/; 64K RAMDISK CPY FILEXIO FORMAT,3,0,0,"D8:"; NOW SET UP VTOC DIRECTORYMODIFY_SECTOR 8,360,74,0,54MODIFY_SECTOR 8,360,1,1G}243MODIFY_SECTOR 8,360,2,1MODIFY_SECTOR 8,360,3,243MODIFY_SECTOR 8,360,4,1; NOW COPY DUP.SYS AND CREATE MEM.SAVCOPY_FIL1H}E "D1:DUP.SYS","D8:DUP.SYS"XIO 3,2,8,0,"D8:MEM.SAV"05 ; 8K CFG FILEBANKS 1 ; ONLY 1 BANKBANK_BITS BASIC ; USE RAM UNDER BASIC ; TELL RAMDRIVE WHERE RAM WILL APPEARBANK_WIND5J}OW BASIC ; 8K BANKSBANK_SIZE BASIC ; SET UP AS AN 8K DRIVE (64 SECTORS)DRIVE 8,AUTO,SSSD_8K 4a; 8K CPY FILE, 8K RAMDISK; FORMAT DISKXIO FORMAT,3,0,0,"D8:"; NOW SET UP VTOCMODIFY_SECTOR 8,360,1,0,10MODIFY_SECTOR 89L},360,11,%00001111,1,ANDMODIFY_SECTOR 8,360,18,0,110MODIFY_SECTOR 8,360,1,52MODIFY_SECTOR 8,360,3,52MODIFY_SECTOR 8,360,0,9M}28vv `v<vv)`v@O% }B JKDwE V TUV~S~~w Ze~ˍ~~ύ~~~~ ~~~~EQ}~Ӎ~@~~A~C~D~~~Q~~~~~~~~ {~~/I-~I퀭~~倍.3ER}KP[~怍/4LQ\~ ~J ~/~~C~~~~~ivςz+{~iwES}z,{i捜_i`i;̀i΀iXiYiii+iiiiET}ii4i5iꀍ i뀍!i+Hi,IiRqxSiWrySi׍ろEU}ʂi䂍ꂍ˂i悍삘i炍킊i\ia i Hmr遍؂݂zziEV} Insꁍقނzziii.xE{i/yF{i߁ii؁iفi!EW}ǀiȀiDiEiMiNiVi€Wi#aibi"ʀsiˀti EX}Ā_iŀ`i i!biˁ>JPdotí?KQepuiASYiw|iBTZjxEY}} c~ {S~ I~0u~!~ͭ~ΠLȩm~ͩm~ȑͭ~[w }`~~@ BZ`~i~Vm~~ VEZ}LSW׮WV X\LTVH4mVih X.V\Ϡs \XͭX j| \LSȠt VVV WLyV\ڠsE[} z\LSV Y \t VVVAZFVi4nViVȌVlY42V\#t \lY DX v Z \LE\}SAZr LU  bLSLOVnHh [05mVVmVV8VVVVVV \V愊LOVgV\rtVE]}nHh ;[05mVVmVV8VVVVVV \V愊LOVV\AtLZTV\Rt \Kv Z \LSnHE^}h [ͭV\`tQmVv\VmVw\V8VVVVx\wy\V A\0VVV \]V\tLZTV愊LE_}OVV, W0L`T)ʎ\sώ\6t ĭVkY2W\t \kY DX qv Z \LS g^0 ^W\u E`}z\LSWWW4ɛX;K "\$/%+,'_#0 ;A[\ s z\WWWЯWLVW4WEa}WW`WWW4ɛ W"LVW\u z\WлW4 W`4W W4 ɛEb}W`W `؎:X;X0;X@X%:XX 8>XLRXi00Hiih`4A$[ 4_0 :A[嘠`HEd}yͩdh X0.`͍kYȱ͍lYȱ͍mYȱ͍nYȱ͍oYȱ͍pY`CYDYaiYXiY+ͨeͩͅe΅Șeͩͅe΅LYiYLEe}Yʨȱ0uͪiYȘeͩͅe΅Π``YYY }0'YBYDYEJK V0HY }h0Ef}`AZ4$ LZ%LZ"#AZX4"M4"L9Z LZ0::A2[. AZ%4_ ɛ0:A [Eq}B%DOS SYSB*)DUP SYSBbSCFGCOMDSDOCBICPYCOMDSDOCB=ERRORS DOCB;RAMD1MEGCFGB=RAMD1MEGCPYB>RAMD256KCFGB@RAMD256KCPYBBRAMD512KCFGBDRAMD512KCPYBERAMD64K CFGBFRAMD64K CPYBIRAMD8K CFGBKRAMD8K CPYBNRAMDOFF OBJBORAMDON OBJBkPRAMDRIVEOBJBjTECH DOCBM0USER DOCB}ZORK CFGBZORK CPYۘ``B4DEyHI V#HI`4}HZ}IZ0u`؎7[9[8[:[6[4[5[6[p4[7[D8[EEr} -m9[7[:[i8[85[HI5[ B V0N4[DEHI6[4[ B V0 HI7[D8[E B Es}V`̈́΍[H[[Α[%32-0) [[[8[[`[``̈́΍[>[[[:Et}-0) [[[8[[`[``̈́΍@\P>\?\?\$;G5A :-0) >\?\>\8@\Eu}?\`?\``u\u\+(v\j\w\k\x\g\y\h\0u0uu\` \L\ ~~ W Ev}s Z`~\4I44 Z`\\\\0u08.\.\\\`]]Y]Z][]ED030uA878Ew}0X]Y]IY] X] Z]LC]X]Z]L]Z][]```|]}]]]]I]ο]]050u80]] ])]]]Ex}m]]m]]Ls]]]```^^ .^^.^^ .^.^ .^.^mm^m^`cclmY %c0+ DEEy}cHI B VL^HL&^HI B V` ^ }0 } }`VLV_oYͭpYΠLD_6LV_VMeͩͅEz}e΅Ί eͩͅe΅iͩe΅L{^=F> _05 o`0.VLV_=F _0 o`0 VLV_`Y_Z_n84\E{}t \Y_F [_Z_͠ [_v Z \L_V\t z\L_`__)"v_ _)4_9vE|}_ ȩ)v_ _) 1_9v_ ȩ0v _ `F)`n`ȱ ݾE}} ȩKGl`m`n84\Rt \n`ͪȱͨ W a %c0 0uBa0u` %c0$" zbbbcb %c0p zb̕by`bombbObObE}4I4L/bbm~bm~P͗bIb@b~b~b~b~`bONЙГW\t# z\`W\u \~E}i~i W v Z \`c\v \O W } % W kw Z \`OE} %`hhL/b$cVii愹>#c#cnbbbbV0u"0u"(#c8V$cmVVE}V`$cn84\t z\`cVn84cF) )) %`愨c`c愨c`cc愍cE}cc0ucȹ0ucȘcccc`~I23%45xHԭ ӱ24)ӱ423 3ة؅3E}ҭ~NĩčÍÍĩčĩĩӍčĩĩĩčĩĩɍĩĩĭZ[ mm~Zm~[~hE}(`POKEafDPOKEafPRINT^*fDRIVEhfBANKSz*gPROMPTV^*fALT_OS{hREAD_CMDa~Qf LOAD_ADDRCE}a?f WRITE_CMDn~Qf RESET_KEYT~8f BANK_SIZE~}f BANK_BITS~ff TRAP_RESETzf ADDRESS_CMD{~Qf BANK_WINDOW~E}XfBANK_BITS_ADDR~_fXIOlMgPOKEafDPOKEafPRINT^*fPROMPTV^*f COPY_FILEj1g DRIVE_TABLE ~1f E}WRITE_PROTECTzhg COPY_SECTORTmtg MODIFY_SECTORxg8q 7n(Or(8n(8n(Dn7n(ao(Ho E}\n(o(n(n Rq7n7n7n7n(qo(qo(o(qo(o(o 7n(r o 7n(r7n7n7E}n7n7n7n7n7n7n7n7n r7n7n7n7n7n7n7n7n7n7n(r7n7n7nE}7n 7n 's 7n 7n7n 7n 7n7n7n 7n 7n7n7n7n 7n 7n7n7n7n0r 7n 7n7E}n7n7n r7n 7n7n7n7n 7n7n7n7n7n 7n7n7n7n7n05s 7n7n7n7n7E}n 5s0r 7n7n7n7n7n 5s r7n(Rs(@ks(|s s s %c0USj%%LfiijjE}~m~~m~kii`~Yl~gPc` 2jjm(~~~Lij%j˩~i~~i~`WE}\4u z\`jj %c0Гj#%j j&%Lni٭~L}iW\@u \j DXii0 0ujLiE}ōj ( DXii0 0ujLiȍj ~ DX  v Z \`&'0=&m3&'m2'E}4"&j'j&mj&'mj'&j'j86Njnj8~ Njnjjj` %c0E}97NlOlcRl %c0&$PlQlcSl }` %c0 }L k }`Mlv  NlDOlERlBJE}K VL8l0PlDQlESlBJK VL8lv NlOlRl BHI%DE}E V0`Ml HIS0HIv PlQlSl B%DE V0MlLk Tl }0 E}} }`l DX ~~ WHlh 芢ޠv ZW\L\ %c0a_m %c0WU @MmmmB E}%c0: mJmLlmDE Vw  Tl`c\Uu z\`2~3~4~5~2435E}~ 24~24`ʎ 6n5n %c045nL`m6n }`6n5n }0?6n5n }VV !" ${#E}$ ` w0Y w0R8 iiV ${#$!i!"i"Lm6n }`E}DEFAULTeMAX CHARSET2_ENDBASICXE_64K XE_256Kl|XE_512Kn~XE_1024KBASICXE_64KE}XE_256KXE_512KXE_1024KBASICXE_64KXE_256K|XE_512K~XE_1024KBASICXE_64K XE_256KlXEE}_512KnXE_1024KXEPORTBBASICXE@BASICPAGE6SPARE_XENDOSINI CASINIDISKCASSETTEE}BOTH SSSD( SSED( SSDD ( DE}SDD ( SSSD_8Kd@ SSSD_64K SSSD_E}128K SSSD_256K SSSD_512K SE}SSD_1024K XEBASICB_32KB_16KB_8KB_4KB_2KB_1KESCUPDOE}WNLEFTRIGHTSPACE QUOTE"CLEAR}DELETE~TABRETURN DELETE_LINE INSERT_LINE CLEAR_TABSET_TE}ABBUZZER DELETE_CHAR INSERT_CHARHELPESCDELETE4 SHIFT_HELPQ SHIFT_ESC\ SHIFT_DELETEt CONTROL_HEE}LP CONTROL_ESCCONTROL_DELETESDDDQDODAUTORENAME ERASE!DELETE!PROTECT# UNPROTECT$E}FORMATONOFFSTAEORIORA AND)OS_BOOS_CNONEOS_BOS_CQOS_BOS_CCOPYNOE}_COPYNONEOS_CERROR AT LINE BAD CHARACTERBAD COMMANDUNEXPECTED CHARACTERUNEXPECTED END OF LINETOO FEW PARAMETERSE}BAD PARAMETERTOO MANY PARAMETERSEXPECTING ,BAD BINARY NUMBERNUMBER TOO BIGBAD DECIMAL NUMBERBAD HEXADECIMAL NUMBERBUG ALERT! E}IN DECINTWRONG NUMBER OF PARAMETERSBAD PARAMETER TYPEBUG ALERT! IN CMDTBLBAD CONSTANTPROCESSING STRING2ND ADDRESS MUST BE HIGE}HER THAN 1STNOT ENOUGH SPACE DEFINEDOUT OF SPACENOT ENOUGH FREE BANKSIOCB 4 NOT AVAILABLENOT A RAMDISKERROR READING SECTOR E}ERROR WRITING SECTOR OFSET LARGER THAN OR EQUAL TO SECTOR SIZEOFSET + NUMBER LARGER THAN SECTOR SIZEMISSING "BUG ALERT!BAD E}ADDRESSFOUND EXPECTING STRING NUMBER CONSTANT OR HIGHEST VALUE=NO NUMBERS GREATER THAN 65535 ALLOWEDMINIMUM NUMBER OF PARAE}METERS=MAXIMUM NUMBER OF PARAMETERS=NEED AT LEAST BYTESSIZE= START BANK= MAX BANK=ERROR AT LINE OPENING READING WRITIE}NG DURING XIOOFFSET= SECTOR SIZE=OFFSET+NUMBER= SECTOR SIZE=PRESS ANY KEY TO CONTINUEVALID OPTIONS: VALUES BETWEEN AND IE}NVALIDINSERT CORRECT DISKDURING NOTEERROR OPENING SETTING UP RAMDRIVE v1.0D:RAMDRIVE.CFGD:RAMDRIVE.CPY}65535E:xE}R@L&xW!"  %1#$  Y0`W\ DX   WE}xvuLxu  Z \`yxzʎyzz %c0 %c0qo!" %c0^\{z|zi%yyiyyc}E}z %c086y %c0R-xzyzc~z %c0?y %c05#$ %c01`zz }`zz }V Lz ${#$|z${z#E}{zmxz{z|zmyz|z$c {z#WyzxzB w0;%%yiyyyiyy8xzxzyzyz͊ʩ wz }E}`~z\͠u& \  &zwzL=z}z\u) \  zwz{z|z W }#$ Wzz ZE} \Ly %c0(&2 0 z %c0z )`c\iu z\` %c0~` %c0DBz{z { {0uE} %c0&${ {{{0u0u %c0 `)`H2 0)h`&N {0+, E}h`S {LK{%) LO{ 1@%LY }0 S@ }`V+Lh|i| %c0@i|E}*蘝*i| 0nO*+,-؍./020A2:~~*+ʎ~~~,~-~.~/E}~`\DwEHI} B V\}}HI B, V}HIiDiHEqͪhimH͘iΩ E}B V}L|HI B V`̈́Ψ͙%%` BLV~ߍ}w}eLG}Ѝ}w}ydXX}}}@ qYE}6 DX }}} w Z`` ZBw ZL}`&@B V0<~@ }`E} } w }L}~@%B V0`w  Tl` %c0 c H~L ~S~`S~` %cE}0~` %c0~` %c0~` %c0~` %c0'%~ %c0~ %c0~~~~~` %c0~` %c0~` %cE}0~`e @ACDQ12H2 0uh`غBA5 _X@Q45E}4ȩ4ȩ4ȩ482 2 06L)@ R L~ pSi2i3NX)ni2iE}3 пкI23246)  ))ߙ 9oC!i2i3ЩO)JЅ!">DӪ)E}0WP 0" "!)U)' 6)B X` )ߙ(!E} 9454ȑ4ОH) ~2~i@3I230x0 ӱ2ӑ4350E}ӱ2ӑ4Xh`6!1J 6 Jx` 2 3W) Gɀ>  6!. 96E}3228233٤6 `82~3 ~*&1)?~ &161y11*i)`6E}9yy01e0e1`2i``HhhlЮ DQ0:E} ܥ2HՂ2 h20I ՂՂ hhh@LwРLt (OSDvRamdrive 1.0 Technical ManualThis document explains the operation of Ramdrive 1.0 in more detail, and includes some of the I}more technical aspects behind its operation.Ramdrive works by copying the OS ROM to RAM, and then installing itself in the aI}rea from 52069 to 53247, this is the area occupied by the second character set in the XL/XE, and a few empty bytes that lie bI}efore it. This does mean that you lose the second charset, however this area is unused by the OS B and little used by the OSI} C, making it ideal for this purpose. Ramdrive 1.0 also uses this area to store the configuration information for each ramdrI}ive that you set up. The Ramdrive 1.0 code itself occupies 1042 bytes, and an extra 23 bytes are needed for each ramdrive yoI}u set up. If for whatever reason you want to use this area for another purpose, then you can easily move the Ramdrive 1.0 coI}de somewhere else (if you can find somewhere else to put it that is) with the LOAD_ADDR command in the RAMDRIVE.CFG file. SiI}nce Ramdrive 1.0 copies the OS ROMS to RAM, it also means that you can modify you OS by poking value directly into the OS areI}a, however you should be careful if doing this, since you can easily crash your system this way. Ramdrive 1.0 doesn't copy tI}he OS to RAM until after the RAMDRIVE.CFG file has been processed, so if you do want to modify your OS with POKE or DPOKE comI}mands in the Ramdrive configuration files, then you must do it in the RAMDRIVE.CPY file.Ramdrive 1.0 has been designed to bI}e flexible, and as such it has several configuration commands which can be used to set it up for your system. By default, RaI}mdrive comes set up to run on a 128K 130XE machine, however if this is not to your liking then you can tell Ramdrive 1.0 to sI}et itself up for your system. The next section of this manual deals with the ways in which Ramdrive can be configured to useI} different extended RAM sizes.Bank switchingThe standard XE memory expansion, as used in the 130XE, consists of an extra I}64K of RAM bringing the computer's total memory up to 128K. However the 6502 microprocessor at the centre of the Atari 8-bitI} can only access 64K of memory (RAM and ROM) at any one time. Hence the extra RAM in the 130XE is divided up into 4 16K blocI}ks (4*16=64K). Each of these blocks can then be switched into the 6502's address space one at a time by replacing a 16K blockI} of main RAM. These 16K blocks appear in the address space between 16384 ($4000 hex) and 32767 ($7FFF hex). By switching inI} different extended banks at the right time, the computer can access all 128K of RAM available to it. The extended RAM banksI} are switched in and out by modifying some of the bits in a special memory location known as PORTB at address 54017 ($D301). I} Of the 8 bits available in PORTB, 4 are used for managing the expanded RAM. Two of these are used for selecting which of thI}e 4 extended RAM banks should be switched in, one bit is used to determine whether the 6502 should access main or extended RAI}M and the remaining bit is used to determine whether ANTIC accesses main or extended RAM. The layout of these bits in PORTB I}is as follows:00ACBB00Where A indicates the bit used to select if ANTIC accesses main or extended RAM, C is the bit used I}to select if the 6502 accesses main or extended RAM and the 2 bits marked B are used to select which extended RAM bank is to I}be accessed.As far as using the extended RAM as a ramdrive is concerned we can ignore the ANTIC select bit and concentrate I}on the other 3. When the 6502 select bit is set to 1, the 6502 will access main RAM and when it is set to 0 it will access eI}xtended RAM when it reads from or writes to any address between 16384 and 32767. By modifying The bank select bits we can chI}oose which of the 4 extended RAM banks will appear in this address space. If both bits are set to 0 then the first extended I}RAM bank will appear, if the first is set to 0 and the second to 1 then the second RAM bank will appear, and so on. RamdriveI} 1.0 comes set up by default to use this method of accessing extended RAM, and hence no work is required on your part to set I}this up. However, in order to fully explain how the Ramdrive 1.0 commands work and how you can use them to set it up for anyI} other type of extended RAM scheme we shall show how to set Ramdrive up for a standard 130XE. The first command we will explI}ore is BANKS, this is used to tell Ramdrive how many extended RAM banks you have. So for the 130XE you would set BANKS to 4 I}as followsBANKS 4Another use for this command is if you want to divide your extended RAM between Ramdrive 1.0 and anotherI} program that uses expanded RAM. If for example you wanted Ramdrive to use 2 banks and your other program to use the remainiI}ng 2, then you would set BANKS to 2. In short, BANKS tells Ramdrive how many extended RAM banks it is allowed to use.The nI}ext command we will look at is BANK_SIZE. This command tells Ramdrive how big your extended RAM banks are. This can be set I}to either 1,2,4,8,16 or 32K banks. In the case of the 130XE, its banks are 16K, so we would issue the command:BANK_SIZE B_I}16KThis command also provides another way of sharing your extended RAM between Ramdrive and another program. If for examplI}e you wanted Ramdrive to access only the first 8K of your 16K banks and your other program to access the other 8K, you would I}set BANK_SIZE to 8K, hence leaving the rest of the bank free for your other program.The BANK_WINDOW command is used to tellI} Ramdrive where in the memory address space the extended RAM banks will appear. This is done by specifying the address the fI}irst byte of extended RAM will appear at. In the 130XE's case this would be 16384 (or $4000 in hex), so you would have:BANI}K_WINDOW 16384Following on from the example presented with the BANK_SIZE command, if you wanted to split your extended RAM I}between Ramdrive and another program, with Ramdrive accessing the last 8K of your 16K blanks, you would set BANK_SIZE to be 8I}K as above, and then set BANK_WINDOW to be 24576 ($6000 hex).In order to tell Ramdrive the address that is used for selectiI}ng the extended RAM banks, you would use the BANK_BITS_ADDR command. In the 130XE's case this would be 54017, so you would uI}seBANK_BITS_ADDR 54017Other RAM banking schemes may use other addresses for selecting the extended RAM banks, if so this I}command can be used to customise Ramdrive to those schemes. The only restrictions placed by Ramdrive are that it will only rI}ecognise one address to be used for bank switching, and that the address used for selecting which extended bank is to appear I}(the bits labelled BB in the above description of PORTB on the 130XE) must be the same address used for selecting when the 65I}02 accesses main RAM and when it accesses extended RAM (the bit labelled C in the PORTB description above). If your expandedI} RAM banking scheme does not work this way then Ramdrive will either not work with your expanded RAM or if it does, it will nI}ot be able to use all of your expanded RAM.The last command left to explain how Ramdrive accesses extended RAM is the BANK_I}BITS command. This is used to tell Ramdrive which bits at the bank switching address specified in BANK_BITS_ADDR are used foI}r doing the bank switching. This command has two forms. One that takes 1 parameter, and one that takes 3. The 1 parameter J}version of the command is used when your extended RAM scheme is one that Ramdrive already knows about. These include the staJ}ndard 130XE scheme, and those used by the most common 64K, 256K, 512K and 1024K XE expansions, as well as the 8K BASIC ramdriJ}ve mode, which uses the 8K of RAM under the BASIC ROM. For the 130XE you would useBANK_BITS XE_64KIf on the other hand yJ}our expansion is not covered by one of the above, the BANK_BITS command has another mode that takes 3 parameters which can beJ} used to specify which bits are actually used for bank switching. The first of these three parameters tells Ramdrive which bJ}its are used to select the extended RAM banks. The bits which are used should be set to 1 in this parameter. So for the 130J}XE, this would be (in binary) %00001100. One word of caution is that the number of bits used to select banks specified here J}should be able to cover the number of banks that you have told Ramdrive you have with the BANKS command. So if you have toldJ} Ramdrive to use 4 banks, then you need to tell Ramdrive to use 2 bits to select the correct bank. If you have told RamdriveJ } to use between 5 and 8 banks inclusive, you would need to specify 3 bits for bank selecting here, and so on. The second parJ }ameter tells Ramdrive which bits need to be set in order to allow the 6502 to access the extended RAM banks. For each bit seJ }t in this second parameter, the corresponding bit will be set at the bank switch address. In the 130XE, extended RAM is enabJ }led for the 6502 by clearing the 4th bit, hence no bits need to be set in this parameter, so for the 130XE this parameter wouJ }ld be %00000000. The third parameter specifies which bits need to be cleared in order for the 6502 to access extended RAM. J}A bit set to 1 in this parameter will clear the corresponding bit at the bank switch address. As noted above the 130XE uses J}the 4th bit to enable the 6502 to access extended RAM so you would set the 4th bit of this parameter to 1. Furthermore the bJ}its used for bank switching (as specified by the first parameter to this command) should also be cleared, hence for the 130XEJ} you would want to clear bits 2 and 3 as well. So the command for the 130XE would be as follows:BANK_BITS %00001100,0,%000J}11100There is no cross checking between the parameters to BANK_BITS, hence if you specify that a bit should both be clearedJ} and set (by specifying it in both the second and third parameters) then the results will be indeterminate. Another note to J}make is that this command can also be used for sharing extended RAM banks between Ramdrive and other programs, so if you wantJ}ed Ramdrive to only access the 4th bank of your 130XE's extended RAM, leaving the other 3 banks for use by your other programJ} then you would set both the bank selecting bits to 1 in parameter 2, leaving parameter 1 as 0 and parameter 3 with just bit J}4 set as follows: BANK_BITS 0,%00001100,%00010000 and not forgetting of course to set BANKS to 1. This would tell Ramdrive tJ}hat by setting bits 2 and 3 and by clearing bit 4, it can access the one bank of extended RAM it is allowed to use. Since inJ} this case you would always want bits 2 and 3 to be set to 1, then you would not specify any bits in parameter 1 to be used fJ}or bank switching, otherwise Ramdrive would be free to modify these bits in order to select the correct bank.The only otheJ}r command that needs to be looked at in relation with the amount of extended RAM you have available is the DRIVE command. ThJ}is is the command that actually sets up a Ramdrive. This command also has two modes, one that takes 3 parameters and one thaJ}t takes 18. In both cases the first parameter is the ramdrive number. Just like real drives have a number (usually 1 througJ}h 4), so do ramdrives. A ramdrive's number can be between 0 and 9 inclusive. You should however be careful not to give yourJ} ramdrive a number already used by one of your real drives. For example if you set up a ramdrive as drive number 1 then you J }will not be able to access your real drive if it is also set up as drive 1. The second parameter specifies the first extendeJ!}d RAM bank the ramdrive can use. If you set this parameter to AUTO, then Ramdrive 1.0 will automatically decide which banks J"}to use for your ramdrive.Ramdrive 1.0 does this by remembering the highest extended bank that has been used so far and thenJ#} adding one to this number, to get the first bank for your next ramdrive. As an example, if you set up 3 8K ramdrives numberJ$}ed 4, 5 and 6 as follows on a 130XE:DRIVE 4,AUTO,SSSD_8KDRIVE 5,AUTO,SSSD_8KDRIVE 6,AUTO,SSSD_8Kwhen Ramdrive 1.0 findsJ%} the first DRIVE command and sees the AUTO in the second parameter it will check for the highest extended bank used so far. J&}Since no extended banks have been used up until now, it will use bank 0. Ramdrive 1.0 will then set aside enough banks for tJ'}he size of the ramdrive you are setting up. In this case it is an 8K ramdrive, so only 1 bank is needed (with each bank beinJ(}g 16K). When Ramdrive 1.0 comes across the second DRIVE command and sees the AUTO in the second parameter it will again checJ)}k the highest extended bank used so far. Bank 0 was used for ramdrive 4, so ramdrive 5 will start at bank 1, and again sinceJ*} it is an 8K ramdrive it will only use one bank. When the third DRIVE command is found Ramdrive 1.0 will again check for theJ+} highest extended bank used so far. In this case it will be bank 1 used by drive 5, so ramdrive 6 will start at bank 2, and J,}as it is an 8K drive will only use one bank. One thing to note here is that only 8K of each bank is being used, leaving halfJ-} of the 3 extended RAM banks 0, 1 and 2 empty. This is because a ramdrive must start at the beginning of an extended bank, tJ.}here is no way of specifying that a ramdrive should start at, say, byte 8192 of extended RAM bank 2. The only way of doing tJ/}his would be to use the BANK_WINDOW command as described above, in which case ALL ramdrives you set up would not use any byteJ0} below 8192 on any extended RAM bank, in effect reducing the size of your extended RAM banks to 8K.This command gives you yJ1}et another way of sharing your extended RAM banks between Ramdrive 1.0 and other programs. If for example you wanted RamdrivJ2}e 1.0 not to use bank 0, leaving it free for other programs, you could modify the above commands as follows:DRIVE 4,1,SSSD_J3}8KDRIVE 5,AUTO,SSSD_8KDRIVE 6,AUTO,SSSD_8KThis would again set up 3 8K ramdrives numbered 4, 5 and 6. However the first J4}DRIVE command tells Ramdrive 1.0 to set up the ramdrive 4 on bank 1. With it being an 8K ramdrive it will only take up one bJ5}ank, so when Ramdrive 1.0 comes to the second DRIVE command, it will set up ramdrive 5 starting at bank 2 and then ramdrive 6J6} starting at bank 3, hence leaving bank 0 free. The exact same thing could have been done with the following commands:DRIVJ7}E 4,1,SSSD_8KDRIVE 5,2,SSSD_8KDRIVE 6,3,SSSD_8Khowever this would involve extra work for you since you would have to calcJ8}ulate how many banks each ramdrive would need, and then ensure that two ramdrives are not trying to use the same bank. In geJ9}neral it is easier to use the AUTO command in parameter 2 and let Ramdrive 1.0 worry about how many banks are needed for eachJ:} ramdrive and which banks to allocate to which ramdrive. However if for whatever reason you do need to do this manually thenJ;} this parameter will allow you to do so. For drives that need more than 1 bank, then the banks are allocated sequentially. J<}So if for example ramdrive 5 was a 32K drive, hence needing 2 banks, then banks 2 and 3 would be allocated to it in the firstJ=} 2 examples.Another thing to note is that Ramdrive 1.0 will not allow you to use more banks in your ramdrives than you haveJ>} told it to use with the BANKS command. So if you have told Ramdrive 1.0 that you have 4 16K banks for it to use, then you cJ?}an't set up a 90K single sided single density drive (which would need 6 16K banks or at least 96K extended RAM), neither coulJ@}d you set up more than 4 8K ramdrives (since each 8K ramdrive uses one 16K bank, and you only have 4 16K banks). If you do tJA}ry and exceed the number of banks available then you will get the following error message:ERROR NOT ENOUGH FREE BANKSIf yJB}ou see this message and know you have more extended RAM banks available, then increase the value of the parameter to the BANKJC}S command, otherwise you will have to use a smaller (or fewer) ramdrive(s).The last parameter for the 3 parameter version oJD}f the DRIVE command specifies the size and type of ramdrive to set up. Currently the following options are available:SSSD JE}- single sided, single density, 90K ramdrive (720 sectors of 128 bytes each)SSED - single sided, enhanced density 130K ramdJF}rive (1040 sectors of 128 bytes each)SSDD - single sided double density 180K ramdrive (720 sectors of 256 bytes each)DSDDJG} - double sided double density 360K ramdrive (1440 sectors of 256 bytes each)SSSD_8K - single sided, single density 8K ramdJH}rive (64 sectors or 128 bytes each), this is the only ramdrive you can use if you're using the 8K RAM under the BASIC ROM in JI}your XL/XESSSD_64K - single sided, single density 64K ramdrive (512 sectors of 128 bytes each), this is the same as DOS 2.5JJ}'s ramdisk.SSSD_128K - single sided, single density 128K ramdrive (1024 sectors of 128 bytes each) SSSD_256K - single sidJK}ed, single density 256K ramdrive (2048 sectors of 128 bytes each)SSSD_512K - single sided, single density 512K ramdrive (40JL}96 sectors of 128 bytes each)SSSD_1024K - single sided, single density 1024K ramdrive (8192 sectors of 128 bytes each)WhiJM}ch type of ramdrive you chose to use will depend on the amount of extended RAM you have, i.e. if you only have 64K extended RJN}AM, then you won't be able to use anything bigger than the SSSD_64K ramdrive. It will also depend on your DOS. Not all DOS'JO}s can use all of the above drives. For example with DOS 2.0s you can't use any drive bigger than the SSSD drive (90K), with JP}DOS 2.5 the biggest drive you can use is the SSED (130K) drive. However there is nothing to stop you having more than one raJQ}mdrive under these DOS's, (RAM allowing) so for example if you have 256K of extended RAM, you could have 2 90K ramdrives undeJR}r DOS 2.0s. MyDOS on the other hand can handle drives up to 16 Megabytes in size, so RAM allowing, you could use any of the JS}above ramdrives with it.If none of the above ramdrives suit your needs, then you can use the 18 parameter version of the DRJT}IVE command to set up your own custom ramdrives. The first 2 parameters are the same as for the 3 parameter version of this JU}command, and have already been described. The remaining 16 parameters and how to use them are now explained.The third paraJV}meter to this version of the command determines how the ramdrive will behave. Only the low 4 bits of this parameter are usedJW} at present. If bit 0 is set then the ramdrive will support enhanced density, if it is clear then an error will result if yoJX}u try to format this drive in enhanced density. If bit 1 is set then it will recognise the SIO read configuration block commJY}and, if it is clear then it will not. If bit 2 is set then the configuration block for this ramdrive will be read only, any JZ}attempt to write to the configuration block will fail, if it is 0 then the configuration block can be written to. This bit sJ[}hould be set in conjunction with bit 1, if bit 1 is not set then configuration block writes will always fail, regardless of tJ\}he value in bit 2. If bit 3 is set then sectors 1 to 3 inclusive will be 128 bytes long, even if the disk has been set up asJ]} a DD, QD or OD density disk. If this bit is clear then sectors 1 to 3 inclusive will be the same size as the rest of the seJ^}ctors on the disk. Setting this bit on DD, QD and OD ramdrives will waste space on your ramdrive. Taking the DD example, whJ_}ere sectors are 256 bytes in size, then 256 bytes will be allocated for all the sectors on the disk, including sectors 1-3, hJ`}owever any accesses to sectors 1-3 will only use 128 bytes, hence wasting 128 bytes per sector (384 bytes in total). HoweverJa} this allows for full compatibility with existing programs, since on most Atari drives sectors 1-3 will always be 128 bytes iJb}n size, even if the disk has been formatted in double density. By clearing this bit you will not waste any space on DD, QD aJc}nd OD ramdrives, but it may cause incompatibilities with most existing programs, which will expect these three sectors to be Jd}only 128 bytes long.The fourth parameter to this command was included to allow the 8K ramdrive to work under DOS 2.5 and otJe}her DOS's. An 8K ramdrive can have a maximum of 64 128 byte sectors. However DOS 2.0, 2.5 and several other DOS's use sectoJf}rs 360 to 367 inclusive to store the VTOC and directory information. These sectors are clearly out of the range available onJg} the 8K ramdrive (sectors 1 to 64 inclusive), so if DOS 2.5 tried to read or write its VTOC or any of its directory sectors oJh}n the 8K ramdrive it would return an error making the ramdrive unusable. However this parameter allows you to relocate the VJi}TOC and directory sectors to be anywhere on you ramdrive without DOS knowing about it. Hence you could have your VTOC and diJj}rectory in sectors 1 to 9 inclusive, while DOS would think they are still at sectors 360 to 367. The way this works is if yoJk}u try to access a sector outside the available sectors on your ramdrive (for example trying to read sector 360 on a 64 sectorJl} ramdrive), then the value specified in this parameter will be subtracted from the sector you asked for, and then that sectorJm} number (if valid) will be accessed. So if you set this value to 359 on a 64 sector ramdrive, and then tried to access sectoJn}r 360, Ramdrive 1.0 would detect that sector 360 is outside the range of valid sectors (1 to 64) and subtract 359 from the seJo}ctor you asked for. In this case this would give you sector 1 (360-359=1), which would then be returned to your program. AsJp} described, this feature allows you to use the 8K ramdrive with most DOS's, however it should be used with caution, as under Jq}this scheme you will have 2 sector numbers referring to one sector on your ramdrive, i.e. on an 8K ramdrive, with this parameJr}ter set to 359, sector 1 can be accessed by requesting either sector 1 or sector 360, which if not used with care could lead Js}to your ramdrive being corrupted. In the 8K ramdrive's case, the provided RAMDRIVE.CFG and RAMDRIVE.CPY files mark sectors 1Jt} to 9 inclusive in the VTOC as being used, hence DOS will not try to use them for any other purpose, furthermore it will alsoJu} mark all sectors above 64 as used so that these aren't accessed either. In general, if you don't need to use this feature, Jv}then leave this parameter as 0.Parameters 5 through 8 inclusive are the 4 bytes that will be returned when the ramdrive recJw}eives an SIO status command, by setting these parameters you can customise the status information of the drive to your own neJx}eds. Parameter 5 will be returned as status byte 1, parameter 6 as status byte 2 and so on. Bit 3 in status byte 1 is used Jy}as the write protect bit by both ramdrives and real drives. Hence if this bit is set then the drive will be write protected,Jz} and if it is clear then it will be unprotected. This bit will be set up automatically whenever the ramdrive is write protecJ{}ted/unprotected, and hence you do not have to worry about it. Also if bit 5 is set then it is a double density ramdrive, andJ|} if bit 7 is set it is an enhanced density ramdrive. Again these bits are used in this way by most Atari drives, and are hanJ}}dled automatically by Ramdrive 1.0, hence you do not need to worry about them.Parameters 9 through 18 make up the ramdrive'J~}s configuration block, and will be returned whenever the read configuration block SIO command is received (but see bit 2 in pJ}arameter 3 also). These parameters are used to calculate the size of the ramdrive and how much extended memory it needs.PaJ}rameter 9 specifies the number of tracks on the ramdrive. Unlike a real disk, ramdrives do not have tracks as such, however J}this parameter is used when calculating the size of the ramdrive.Parameter 10 is the second byte in the configuration blockJ}, and is ignored by Ramdrive 1.0. It has been included for compatibility reasons.Parameter 11 specifies the number of sectJ}ors per track for the ramdrive, this parameter is used to calculate the size of the ramdrive.Parameter 12 specifies the numJ}ber of sides the ramdrive has. Again ramdrives do not have sides as such, but this is used in calculating the ramdrive's sizJ}e. A value of 0 specifies a single sided ramdrive, 1 specifies a double sided ramdrive. In theory you could have up to a 25J}6 sided ramdrive, whether such a ramdrive has any practical uses however is another matter.Parameter 13 specifies the densiJ}ty of the disk. The value stored here is used to set up bit 5 in status byte 1, when the ramdrive is formatted. If this is J}0 then the ramdrive will be single density, if it is 4 it will be double density. Other values will produce indeterminate reJ}sults. This parameter is NOT used to calculate the size of the ramdrive sectors however (parameter 14, below, is used for thJ}at instead)parameter 14 specifies the size of the sectors on the ramdrive. This parameter can take one of 4 values: SD - J}single density, 128 byte sectorsDD - double density, 256 byte sectorsQD - quad. density, 512 byte sectorsOD - oct. densityJ}, 1024 byte sectors.This value is used to calculate the size of the ramdrive. Note, that even though Ramdrive 1.0 supports J}Quad. (512 bytes) and Oct. (1024 bytes) density sectors, I know of no DOS that supports sectors of this size, hence unless yoJ}u write your own programs to use sectors of this size, they will not be of much use to you.Parameters 15 through 18 make upJ} the last 4 bytes of the configuration block and are ignored by Ramdrive 1.0, they have been included for compatibility reasoJ}ns only.Ramdrive 1.0 uses the following formula in order to calculate the size of a ramdrive, and hence how much extended mJ}emory needs to be allocated to it. The number of sectors per track (parameter 11) is multiplied by the number or tracks on tJ}he disk (parameter 9) the result is then multiplied by the number of sides (parameter 12) this results in the number of sectoJ}rs on the disk. Then this is multiplied by the number of bytes in a sector (parameter 14) to give the size of the ramdrive iJ}n bytes. From here the number of banks needed is calculated from the bank size (specified with the BANK_SIZE command) and a J}check is made see if enough extended banks are available. If so then the drive is allocated.So for a standard single sidedJ}, single density disk, the number of tracks would be 40, the sectors per track would be 18, the number of sides would be 0 (iJ}.e. 1 side) and the number of bytes per sector would be set to SD (128 bytes), resulting int 40*18*1=720 sectors. 720*128=92J}160 bytes (or 90K). If the extended RAM banks are 16K in size, this would result in 6 banks being allocated to the ramdrive J}(96K worth), resulting in 6K of unused space on the last extended bank. Unfortunately there is no way of accessing this unusJ}ed 6K of RAM.The SIO CommandsRamdrive 1.0 works by replacing the SIO call at 58457 (SIOV) with a call to the Ramdrive codJ}e. In this way Ramdrive can trap all SIO calls before they get passed on to the operating system. This lets Ramdrive check J}if the SIO call refers to a ramdrive or not. If the call doesn't refer to a ramdrive then the call will be passed on to the J}OS by calling the address previously stored at SIOV. Since all DOS's and drives work in the same way through the SIO, by insJ}talling Ramdrive into the SIOV address we can make a ramdrive appear as a real drive to all programs. This means that most eJ}xisting programs should be able to work with Ramdrive 1.0, this includes sector editors as well as DOS's. However since RamdJ}rive 1.0 needs to modify the SIOV vector, which is located in the OS ROMS, it must first copy the ROM area into RAM and then J}modify the RAM. This is why Ramdrive 1.0 needs to use the 16K of RAM found under the OS ROMs. The drawback of this is that J}Ramdrive will not work with any other program that also uses this RAM for its own purposes. Amongst the programs that will nJ}ot work with Ramdrive 1.0 are most versions of SpartaDos, DOS XE and Turbo Basic.Ramdrive 1.0 works by checking all SIO calJ}ls, and if any of these refer to a ramdrive, then the appropriate response will be generated. Ramdrive 1.0 recognises the foJ}llowing SIO commands: Read (82), Write -verify- (87), Put -no verify- (80), Status (83) and Format (33). If bit 0 is set in J}parameter 3 of the DRIVE command, then the ramdrive will also recognise the Format Enhanced (34) command. If bit 1 is set inJ} parameter 3 of the DRIVE command, then the Read Configuration (78) command will be recognised by the ramdrive, and if bit 2 J}is clear and bit 1 is set in this parameter then the Write Configuration (79) command will be recognised by the ramdrive in J}question. These commands all work in the expected way, either returning the requested information from the ramdrive or by wrJ}iting the information to the ramdrive. The only exception is that there is no difference between the Write with verify and tJ}he Put without verify commands, as these are both interpreted as a Put without verify command. Given that the ramdrive is wrJ}iting to RAM instead of to floppy, the chances of an error are minimal, hence a Write with verify command would only serve toJ} slow the ramdrive down.In addition to the above commands, Ramdrive 1.0 also provides three new SIO commands which are onlyJ} recognised by ramdrives. Sending one of these commands to anything other than a ramdrive will result in an error. These neJ}w commands are Read Address (65), Read Ramdrive (67) and Write Ramdrive (68). The Read Address SIO command will return 4 bytJ}es, the first two of which will be the address of the drive table (as defined by the DRIVE_TABLE command), in low byte, high J}byte format, and the 3rd and 4th bytes will be the address of the first byte of the first ramdrive's set-up data. This commaJ}nd has been provided so that your programs can directly access the ramdrive set-up data, if needed. However due to the possiJ}bility that you may corrupt the ramdrive set-up data it is probably best to avoid this command and use the next two instead.J}The Read Ramdrive command returns 23 bytes of information which describe how the ramdrive has been set up. In fact this is J}the data that was used to set up the ramdrive with the 18 parameter version of the DRIVE command. The bytes returned are mapJ}ped as follows:byte 1 = ramdrive number. (1st parameter to DRIVE command)bytes 2 and 3 = total number of sectors on ramdrivJ}e, in low byte, high byte order. (used internally)byte 4 = first bank number used by ramdrive. (2nd parameter to DRIVE commaJ}nd)byte 5 = compatibility options. (3rd parameter to 18 parameter DRIVE command)bytes 6 and 7 = number to subtract if sectoJ}r is out of range, in high byte, low byte order. (4th parameter in 18 parameter DRIVE command)bytes 8 to 11 = drive status bJ}ytes in same order as returned by Status command. (parameters 5-8 to DRIVE command)bytes 12 to 23 = drive configuration blocJ}k in same order as returned by Read Configuration command. (parameters 9-18 to DRIVE command)This command will work even ifJ} the Read Configuration command is not recognised by the ramdrive, so always providing you with a way to read the data if neeJ}ded.The Write Ramdrive command performs the opposite to the Read ramdrive command, it will take 23 bytes of data and use thJ}em to configure a ramdrive. The ramdrive being referred to must already exist, and will be reconfigured with the new set-up.J} The order and meaning of the bytes is the same as of the Read Ramdrive command. This command will always work, even if theJ} Write Configuration command is not recognised by the ramdrive.The command values for the above 3 commands, have been selecJ}ted so as not to conflict with any other SIO commands. However, if for whatever reason these values don't suit your needs, tJ}hey can be changed with the READ_CMD, WRITE_CMD and ADDR_CMD commands in the RAMDRIVE.CFG file. These commands all take one J}parameter, and will tell Ramdrive 1.0 to use these values as either the Read Ramdrive, Write Ramdrive or Read Address commandJ}s respectively. If you do change these values, then you should be careful that the new values do not conflict with any otherJ} SIO commands. There is no checking carried out to ensure that the values specified are unique, and if they do conflict withJ} other SIO commands supported by Ramdrive 1.0 then results will be indeterminate.The procedure followed by Ramdrive 1.0 to J}determine whether a command is directed to a ramdrive or not is as follows. Upon receiving the SIO call, Ramdrive 1.0 will cJ}heck if the value at 768 (DDEVIC) is 49, if not, then the call will be passed on to the OS. If it is 49, then Ramdrive 1.0 wJ}ill check if this is a Read Address command (65), and if so, will return the appropriate information back to the caller. If J}not, then it will read in the value found at 769 (DUNIT). If this is not in the range 0 to 9 then the call will be passed onJ}to the OS. If it is between 0 and 9 inclusive, then it will read the value stored at that location in the drive table. HencJ}e, if the drive table is set up as follows:0,8,2,3,4,5,6,7,1,9and the value at 769 is 1, then Ramdrive will take the value J}stored at position 1 in the drive table, which in this case will be 8. Ramdrive will then check to see if this drive (drive J}8 in this example) is a ramdrive. If it isn't then the call will be passed onto the OS. If it is, then the command will be J}handled by Ramdrive 1.0 in the expected way. It is in this way that Ramdrive 1.0 handles the renumbering of both ramdrives aJ}nd real drives. To further illustrate this point, lets say that you had 2 real drives, numbered D1: and D2:, and that you waJ}nted D2: to answer to all SIO calls directed at D1:, and D1: to answer all SIO calls directed at D2:, leaving all other driveJ}s unchanged. To do this you would set up a drive table in Ramdrive 1.0 as follows:DRIVE_TABLE 0,2,1,3,4,5,6,7,8,9Then wheJ}n Ramdrive finds that an SIO call is directed at drive 1, it will look at position 1 in its drive table and find 2. It will J}then check to see if drive 2 is a ramdrive, and since it isn't, this call will be passed onto the OS as a call to D2:, which J}will then respond to the SIO call and return to Ramdrive 1.0 when finished. After this happens, Ramdrive 1.0 will restore thJ}e original value in 769 back to 1 and return to the calling program. So in effect drive 2 will act as if it were drive 1, anJ}d drive 1 as if it were drive 2. All this will happen without having to change the switches at the back of your drive. SincJ}e both ramdrives and real drives are handled in the same way, a ramdrive can respond to SIO calls made to D1: for example. TJ}his allows you to boot from a ramdrive if you desire. This is also the way the SELECT+number keypress combinations works. BJ}y switching the drive table around, when Ramdrive sees one of these keypresses, it allows you to renumber ramdrives and real J}drives on the fly. The only thing you must be careful about is that the drive number assigned to a ramdrive (as specified inJ} the first parameter to the DRIVE command) does not conflict with the number of one of your real drives. If it does then youJ} will not be able to access your real drive as long as Ramdrive 1.0 is active. If you do need a ramdrive to act as say driveJ} 1 and you real drive 1 to act as say drive 8, then you should give your ramdrive a unique number like 3 (assuming you don't J}already have a drive 3) and then set up the drive table as described above to make ramdrive 3 respond to SIO calls made to drJ}ive 1, and real drive 1 respond to calls to drive 8. The drive table can be set up by using the DRIVE_TABLE command in RAMDRJ}IVE.CFG, or by using SELECT+number keypresses after Ramdrive has been set-up. The OPTION+number keypress also works through J}the drive table, so pressing say OPTION 4 will write (un)protect the drive currently answering to D4:, which could in fact beJ} any drive on your system. Only ramdrives can be write (un)protected in this way of course.When using SIO calls to ramdrivJ}es, you must set up the values in DSTATS (771) and DBYTLO/HI (776/777) correctly. If the number of bytes specified in DBYTLOJ}/HI is not 4 for the Status or Read Address commands, 12 for the Read or Write Configuration commands, 23 for the Read or WriJ}te Ramdrive commands or the sector size for the Read, Write or Put sector commands then Ramdrive 1.0 will return an error 139J}. If the value in DSTATS is not set to 64 for commands that return data (Read Address, Read Configuration, Read Sector, StatJ}us and Format) and 128 for commands that send data (Write Configuration, Write Ramdrive and Write/Put Sector) then an error 1J}39 will occur. If DSTATS is set to any other value (including 0) then an error 139 will occur. This is a slight departure fJ}rom real drives which accept a value of 0 in DSTATS. The Format commands never return any bad sectors and hence will never rJ}eturn any data, and the values in DBYTLO/HI will be ignored. If a ramdrive receives a command it does not support then an erJ}ror 139 will occur.Running Ramdrive 1.0 under other operating systemsRamdrive 1.0 has been configured to run under the CJ} version of Atari's operating system. This is the OS found in all standard XL's and XE's. If however, you need Ramdrive 1.0J} to run under another version of the OS, such as revision B, which was found in most 400 and 800 computers, then you can do sJ}o by using the ALT_OS command. The way to do this would be to first install the B OS in you computer by running a translatorJ} disk. Then, include the ALT_OS command in your RAMDRIVE.CFG file and finally load Ramdrive 1.0. You should now be able to J}use Ramdrive 1.0 under the B OS. If you wanted to use Ramdrive 1.0 with another version of the OS, such as with the A versioJ}n, or with a custom version, then you need to use the second version of the ALT_OS command, which takes five parameters.TheJ} first parameter is the address where the operating system's keyboard interrupt handler code should be changed to call the RaJ}mdrive 1.0's keyboard handler. For the C OS this will be 49293 and for the B OS 59215, or use OS_C or OS_B respectively for J}this parameter. Users of other operating systems will have to either work out the appropriate address, or use NONE in this pJ}arameter. If the latter option is taken then you will not be able to use any of the SELECT+number, OPTION+number, warmstart J}or coldstart keypresses. The Ramdrive 1.0 key interrupt code assumes that the 6502's X register contains 8, and that the X rJ}egister's original contents will be on the stack. Here is part of Ramdrive 1.0's key interrupt handling code:KEYBCD: TYAJ} PHA CPX #8 BEQ TRAPKYEXITKY: PLA TAY PLA TAX JMP (652) ; GO TO KEYBOARD INTERRUPTTRAPKY: . ; CONTINUE PROCESSING J}.The C OS's interrupt handler has been changed from:49281 LDA 512,X49284 STA 65249287 LDA 513,X49290 STA 65349293 PLAJ}49294 TAX49295 JMP (652)to:49281 LDA 512,X49284 STA 65249287 LDA 513,X49290 STA 65349293 JMP KEYBCDWhere KEYBCD isJ} the address of Ramdrive 1.0's key interrupt handling code, as shown above.The second parameter is the address of the interJ}nal to ATASCII translation table. The C OS stores this address at KEYDEF, locations 121 and 122. However to avoid problems J}that could be caused by a user changing the default table, the table is referenced directly in ROM rather than going through K}KEYDEF. This means that even if you change the keyboard definition table on your XL/XE, the keypresses used by Ramdrive 1.0 K}will not change. For the C OS this will value will be 64337 and for the B OS 65278. If you don't fancy remembering these thK}en use OS_C or OS_B respectively for this parameter instead.The third parameter is the address of the OS's keyclick routineK}. For the C OS this is 63875 and for the B OS it is 64728. Ramdrive 1.0 will call this routine when any of the SELECT+numbeK}r or OPTION+number keypresses are used. You can disable the keyclick heard when these keypresses are used by pointing this tK}o an RTS command. You could also change the default keyclick to something else, such as flashing the screen to indicate thatK} the keypress has occurred by writing your own code and then passing its address into this parameter.The fourth parameter tK}ells Ramdrive 1.0 whether or not it should modify the OS's warmstart handling code, this should only be used with the C OS. K}When the C OS sees a warmstart, it will run a checksum on its ROM area, and if this doesn't match up with what it expects to K }see, then it will perform a coldstart. But because the OS has been changed to RAM this code will check the RAM instead, and K }since this has been modified by Ramdrive 1.0, the checksum will not match up, which will result in a coldstart. In order to K }avoid this you can set this parameter to OS_C to indicate that you are using the C version of the OS and that you want RamdriK }ve 1.0 to made the corresponding changes to the OS's warmstart code. The B OS doesn't have this checksum hence no changes neK }ed to be made, so set this parameter to NONE. You should only set this to OS_C if you are using the C OS or a slightly modifK}ied version of it. One other thing to note is that if you are using the B OS that has been installed with the translator disK}k in your XL/XE, then pressing the RESET key will always result in a coldstart. This is because as soon as you press RESET tK}he OS ROM is switched back in, and then the original warmstart code will check in RAM 829 - 831 (PUPBT1-3) for specific valueK}s. However since you are running the B OS the values in these locations will not be what the C OS expects and hence it will K}force a coldstart.The fifth and final parameter to this command can be either COPY or NO_COPY. If it is COPY then the OS wK}ill be copied from ROM to RAM by Ramdrive 1.0, if it is NO_COPY then Ramdrive 1.0 will assume you have already installed the K}appropriate operating system in RAM. If you use NO_COPY then you MUST have already set up an alternate operating system in RK}AM, otherwise your system will crash.Reset handlingBecause Ramdrive 1.0 uses the RAM under the OS ROM (see above) handlinK}g of the RESET key can cause problems. When the RESET key is pressed the OS ROM is automatically switched on, hence disablinK}g Ramdrive 1.0, what's more there is no way of avoiding this through software alone. Because of this 2 ways of handling the K}RESET key are provided. The first of these is to avoid using it at all. Two new keypresses have been provided to create a wK}armstart and a coldstart without losing your ramdrives. By pressing the OPTION and HELP keys together a warmstart will be geK}nerated, similar to that which occurs when the RESET key is pressed, except that your ramdrives will remain active. By pressK}ing the SELECT and HELP keys together a coldstart will be generated, which is similar to switching your computer off and on aK}gain, except that you will not lose your ramdrives. This allows for you to reboot and retain your ramdrives, or even to reboK}ot from your ramdrive (by setting it to D1: and coldstarting). The HELP key pressed along with SELECT or OPTION is the defauK}lt set-up for both the cold and warmstart keypresses, however this can be changed with the RESET_KEY command in the RAMDRIVE.K}CFG file.The second way to overcome this problem is to trap the RESET key. Ramdrive 1.0 allows you to do this with the TRAK }P_RESET command in the RAMDRIVE.CFG file. By using this command Ramdrive 1.0 will set up a routine that when RESET is presseK!}d will switch the OS ROM back to RAM, hence giving you back your ramdrives. This however will only work with the C OS, as thK"}e B OS will force your computer to coldstart (as describe in the previous section). There are a few problems with this approK#}ach however. First you must find 9 free bytes of RAM in order to store this routine and these should be below 49152 (C000 heK$}x) as this area will be switched back to ROM. One obvious place is page 6, however since many other programs also use page 6K%} for their own code this can cause conflicts. Another place is locations 590 to 618 which are unused in the C OS, but again K&}might cause conflicts if other programs use these bytes for their own purpose.Once you have found some free RAM to store thK'}e routine in, you must tell Ramdrive if you want to use the CASINI (locations 2 and 3) or DOSINI (locations 12 and 13) to stoK(}re the address of the reset handling routine to be called by the OS. DOSINI is used by DOS so it is best to avoid it, leavinK)}g you with CASINI. Then you need to tell the OS which vector to use (either CASINI, DOSINI or both). If you are using DOS aK*}nd your own reset routine then you will probably want to use the BOTH option.If at any time you do accidentally lose your rK+}amdrives through pressing the RESET key, they you can recover them by running the RAMDON.OBJ file included with Ramdrive 1.0.K,} If on the other hand you want to switch your ramdrives off for whatever reason, then run RAMDOFF.OBJ, switching them back oK-}n again is also achieved by running RAMDON.OBJ.Zero page usageRamdrive 1.0 uses locations 48, 49 and 54 in page zero. TK.}hese locations are defined for use by the SIO routines and hence should not cause problems with any other code. These locatiK/}ons are not saved when the Ramdrive 1.0 code is called, hence any values stored here will be lost.HcRamdrive v1.0, copyright 1997, Raphael EspinoRamdrive 1.0 is a new DOS independent ramdisk program for use on any Atari XL/O1}XE machine with 64K or more RAM. Why do you need a new ramdisk, you may ask. Well take a look at the following list of featO2}ures supported by ramdrive:Works with DOS 2.0,2.5,3.0, MYDOS 4.50,4.53/4 and others.Can be configured to use all your expO3}anded RAM up to 4 megabytes.Allows up to 10 ramdrives to be present at any time.Coldstart at a key press and retain your O4}ramdrive(s).Ramdrives can be write protected.For users with only 64K, Ramdrive can be configured to use the 8K of RAM undO5}er BASIC giving users a 64 sector ramdrive.Both physical drives and ramdrives can be renumbered at a keypress, without haviO6}ng to change your drive's settings.Unlike most other ramdisks, a sector on a Ramdrive can be modified with any sector editoO7}r.As you can see Ramdrive v1.0 offers a number of features that will help you get the most out of your Atari 8-bit. The oO8}nly limitations that ramdrive has is that it uses the RAM under the OS ROMS and hence will not work with any other program thO9}at does the same. This means that it will not work with Turbo Basic, DOS XE, most versions of SpartaDos (although it may worO:}k with SpartaDos X), and a few other programs.The other limitation is that it uses the second character set area for it's owO;}n purposes, so you will be stuck with only the standard character set unless you define your own. However Ramdrive 1.0 can bO<}e told to use another address if necessary.In order to set up and use Ramdrive 1.0, there are 3 files that you need to knowO=} about. The first of these is RAMDRIVE.OBJ, this is the actual ramdrive program, and can either be run from DOS (by choosingO>} the L option under Atari DOS/MYDOS for example) or can be run automatically at boot time by placing this file on your boot dO?}isk and renaming it to AUTORUN.SYS. If you already have an AUTORUN.SYS file on your disk, then append this onto the end of RO@}AMDRIVE.OBJ and then rename the combined file as AUTORUN.SYS, now both programs will auto-boot.The other 2 files which you OA}need to know about are RAMDRIVE.CFG and RAMDRIVE.CPY, these are the configuration files that ramdrive uses to know how much mOB}emory you want to use, how many ramdrives to set up, what files to copy onto your ramdrives and other such things. The RAMDROC}IVE.CFG file contains information about your computer and how many ramdrives to set up, while as RAMDRIVE.CPY is used to formOD}at the ramdrives and copy any files you may need onto them. Both files have the same format, they are standard text files whOE}ich can be created with your favourite text editor (such as Textpro for example). Sample files have been included with this OF}distribution, these are:RAMD8K.CFG and RAMD8K.CPY set up a 64 sector ramdrive using the RAM under the BASIC ROMRAMD64K.CFOG}G and RAMD64K.CPY set up a ramdrive for use on 128K machines (64K main memory and 64K expanded)RAMD256K.CFG and RAMD256K.CPOH}Y set up a ramdrive for use on 320K machines (64K main memory and 256K expanded)RAMD512K.CFG and RAMDK512.CPY set up a ramdOI}rive for use on 576K machines (64K main memory and 512K expanded)RAMD1MEG.CFG and RAMD1MEG.CPY set up a ramdrive for use onOJ} 1088K machines (64K main memory and 1024K expanded)ZORK.CFG and ZORK.CPY set up and copy ZORK I to 2 ramdrives allowing yoOK}u to play this game from a ramdrive (actually this is the reason I wrote Ramdrive 1.0 in the first place). You do need at leOL}ast 180K of expanded RAM in your system for this to work though.In order to use Ramdrive 1.0, copy the CFG and CPY files frOM}om the above list for your system onto a disk as RAMDRIVE.CFG and RAMDRIVE.CPY along with RAMDRIVE.OBJ saved as AUTORUN.SYS aON}nd re-boot. Ramdrive 1.0 should now load up and run.If your particular memory configuration is not one of the above, then OO}don't despair! How to create your own CFG and CPY files is explained in the technical documentation.The files found on thiOP}s distribution are:USER.DOC - this fileTECH.DOC - technical documentationCFGCOMDS.DOC - commands for use in RAMDRIVE.CFGOQ}CPYCOMDS.DOC - commands for use in RAMDRIVE.CPYERRORS.DOC - list of errors and their meaningsRAMDOFF.OBJ - this file can beOR} run to switch all ramdrives offRAMDON.OBJ - this file can be run to switch all ramdrives back on again.In order to use eiOS}ther RAMDOFF.OBJ or RAMDON.OBJ then use the binary load feature in your DOS (this is the L option in Atari DOS 2.0, 2.5 and MOT}YDOS)Once you have run Ramdrive 1.0, pressing the RESET key will switch Ramdrive off. If you accidentally do this then it OU}can be switched back on again by running RAMDON.OBJ. If you want to perform a warmstart (which is what happens when you presOV}s RESET) without losing your ramdrives then you should press OPTION and HELP together. If you want to perform a coldstart (wOW}hich will reboot your computer) then you should press SELECT and HELP together. In order to write protect a ramdrive you shoOX}uld press the drive number along with the OPTION key. So if you had a ramdrive set up as D4: and you wanted to write protectOY} it you would press OPTION and 4 together. Pressing OPTION and 4 together a second time will unprotect your ramdrive. PressOZ}ing SELECT and a number will cause that drive to become D1:. So if you had a ramdrive set up as D4: and a real drive as D1:,O[} then pressing SELECT and 4 would make your ramdrive become D1: and your real drive become D4:. Pressing SELECT and 4 a secoO\}nd time would change your real drive back to D1: and your ramdrive back to D4:. This is useful for running programs that takO]}e up more than one disk side from a ramdrive, such as running ZORK I from ramdrive with the ZORK.CFG and ZORK.CPY files. TheO^}se create 2 ramdrives, when they have finished being set up, press SELECT and HELP together to coldstart, not forgetting to dO_}isable BASIC by holding down OPTION, and ZORK will start to load. When it asks you to insert side B of the disk, press SELECO`}T and 3 and then press RETURN, and ZORK will be ready to play.The ramdrive configuration files (RAMDRIVE.CFG and RAMDRIVE.COa}PY) are made up of a set of commands understood by the ramdrive program. Both files use the same style, with each command onOb} its own line within the file. Commands should be typed all in uppercase. Commands can take 0 or more parameters, and theseOc} parameters can either be strings, numbers or constants. Strings are enclosed in double quotes ("), if you need to include a Od}double quote character within a string then placing two double quotes next to each other will result in one double quote beinOe}g produced. So for example the command:PRINT "this is a "" quote "will result in the message:this is a " quotebeing Of}displayed. A number can be in either decimal, binary or hexadecimal format. Binary numbers are prefixed with a % (i.e. %100Og}010), hexadecimal with a $ (i.e. $A72C) and decimal numbers have no prefix (i.e. 1266). Constants are values that have been Oh}set up before hand to make things easier for you, meaning you don't have to remember obscure numbers. The constants understoOi}od by each command are listed in the CFGCOMDS.DOC and CPYCOMDS.DOC. So for example you could have:PRINT CLEAR,"clear screeOj}n"which would clear the screen and display the message clear screen. Each line in the configuration files can be up to 120Ok} characters long, lines longer than this will be truncated to 120 characters. Anything after a semicolon (;) is considered tOl}o be a comment and is ignored.A final note is that DOS 2.0 and 2.5 usually come configured with only drives 1 and 2. If yoOm}u want to use any other drive number for your ramdrives (such as 3 for example), then you must POKE the appropriate value intOn}o 1802. Here 1 bit is used for each drive, so if you had 2 real drive numbered D1: and D2: and one ramdrive numbered D3: youOo} would POKE 1802,%00000111 (or POKE 1802,7 in decimal), and then write the DOS files back to disk with the H command. You shOp}ould be wary of using D8: as a ramdrive under DOS 2.5 as this DOS will think that D8: is its own 499 sector ramdisk, instead Oq}of the corresponding ramdrive, even if the RAMDISK.COM file isn't on your disk.Well those are the basics of the configuratiOr}on files, if you have made it this far then you'll be ready to use Ramdrive 1.0. If you want to learn more about how RamdrivOs}e 1.0 works then you can read the technical documentation. If you want to know what commands are available in the CFG and CPOt}Y files then you can read the CFGCOMDS.DOC and CPYCOMDS.DOC files. If you do have any problems with Ramdrive 1.0, or find anOu}y bugs then I'll be happy to help you. Any bugs should include the RAMDRIVE.CFG and RAMDRIVE.CPY files that caused the problOv}em along with a description of your system (DOS being used, memory size, any modifications you may have, etc.). I can be conOw}tacted by email at these addresses:rje@co.umist.ac.ukrje@tdc.dircon.co.ukor by mail at:Raphael Espino113 Paston RidingsOx}PastonPeterboroughCambsPE4 7UXEnglandComments, suggestions, will all be welcome, any bugs found will hopefully be fixeOy}d in the next release. This program is offered for use free of charge, with no guarantee whatsoever, the author does not accOz}ept responsibility for its use or misuse. However if you do find it useful and want to show your appreciation, then donationO{}s are welcome. Or if that is asking too much, then at least send me a postcard from your corner of the world. Long live AtaO|}ri!December 1997L ; ZORK CFG FILE ; 2 SS SD DRIVE = 12 BANKS, 16K EACHBANKS 12 ; SET UP FOR 256 XE ; NEED AT LEAST 180KBANK_BITS XE_256KS~} ; CREATE 2 RAM DRIVESDRIVE 2,AUTO,SSSDDRIVE 3,AUTO,SSSDP< ; ZORK CPY FILEPRINT CLEAR,RETURN ; ASK USER TO INSERT DISK ; COPY SIDE A TO RAMDRIVE 2COPY_SECTOR 1,2,1,360,"INSERT ZORW}K DISK SIDE A AND PRESS RETURN" ; ASK FOR SIDE BPRINT RETURN ; COPY SIDE B TO RAMDRIVE 3COPY_SECTOR 1,3,1,504,"INSERT ZORW}K DISK SIDE B AND PRESS RETURN" ; MAKE CHANGES TO ZORKMODIFY_SECTOR 2,1,15,$FEMODIFY_SECTOR 2,1,$56,$EA,3MODIFY_SECTOR 2,W}43,$12,3 ; SET RAMDRIVE 2 AS D1: ; SET RAMDRIVE 3 AS D2: ; SET DRIVE 1 AS D3:DRIVE_TABLE 0,2,1,3,4,5,6,7,8,9PRINT RETURW}N,"NOW PRESS RETURN AND THEN PRESS"PRINT "SELECT AND HELP TO REBOOT NOT"PRINT "FORGETTING TO HOLD DOWN OPTION TO",RETURN,"DW}ISABLE BASIC",RETURNPRINT "WHEN ZORK ASKS YOU TO INSERT SIDE B"PRINT "PRESS SELECT AND 3 FOLLOWED BY RETURN",RETURNPROMPT W}"SAVE AND RESTORE GAMES TO/FROM D2:"T%/