VolksForth/AtariST/RAMDISK.FB

1 line
26 KiB
Plaintext
Raw Permalink Blame History

HOW TO USE THE RAMDISK bp 17Aug86 Die Ramdisk ist im Prinzip ein erweiterter Buffermechanismus, der Buffer aužerhalb des Forth-Systems verwaltet. Die Organi- sation ist analog, mit der Ausnahme, daž es kein Updateflag gibt, ge„nderte Bl”cke also sofort auf die Diskette zur<75>ckge- schrieben werden. Die Benutzung ist v”llig transparent, am Anfang muž nur einmal INITRAMDISK aufgerufen werden. Die Struktur der Buffer wird auf Screen 3 dargestellt. Die Ramdisk allokiert ihren Speicher mit MALLOC. \ loadscreen for more buffers bp 17Aug86 \needs 2over include double.scr Onlyforth \needs 4dup : 4dup 2over 2over ; \needs 4drop : 4drop 2drop 2drop ; \needs user' : user' ' >body c@ ; \needs d> : d> 2swap d< ; 2 $B +thru 1 +load \ patch ramdisk into system \ patch ramdisk into System bp 17Aug86 | : ((close ( fcb -- fcb ...) \ word for patch (CLOSE !! dup flushramfile [ Dos ' (close >body @ , ] ; | : (empty-buffers ( -- ...) \ word for patching EMPTY-BUFFE emptyramdisk [ ' empty-buffers >body @ , ] ; ' ramdiskr/w is r/w ' ((close Dos ' (close >body ! ' (empty-buffers ' empty-buffers >body ! save initramdisk \ Variables and Constants bp 10Aug86 2Variable ramprev 0. ramprev 2! \ points to first buffer 2Variable ramfirst 0. ramfirst 2! \ start of buffer area 2Variable ramsize 0. ramsize 2! \ length of buffer area $408 Constant b/rambuf | Code link>file ( d1 -- d2 ) .l 4 SP ) addq Label >next Next end-code | Code link>block .l 6 SP ) addq >next bra end-code | Code link>data .l 8 SP ) addq >next bra end-code \\ structure of a buffer: | link to next buffer | file | block | data .... | +0 +4 +6 +8 +1032 \ search for a buffer bp 24Aug86\ D0:blk D1:file A0:bufadr A1:Vorgaenger Label thisbuffer? 4 A0 D) D1 cmp 0= IF 6 A0 D) D0 cmp THEN rts Code rambuf? ( blk file -- dadr tf \ blk file ) 2 SP D) D0 move SP ) D1 move .l ramprev r#) A0 move .w thisbuffer? bsr 0= IF Label blockfound .l 8. # A0 adda A0 SP ) move .w true # SP -) move Next THEN BEGIN .l A0 A1 move A1 ) A0 move 0. # A0 cmpa .w 0= IF false # SP -) move Next THEN thisbuffer? bsr 0= UNTIL .l A0 ) A1 ) move ramprev r#) A0 ) move A0 ramprev r#) move .w blockfound bra end-code \ read and write buffers b28sep86we | : readrambuf ( adr daddr -- ) \ copy from daddr to adr rot >absaddr b/blk lcmove ; | : writerambuf ( adr daddr --) \ copy from adr to daddr rot >absaddr 2swap b/blk lcmove ; \ search for empty buffer bp 10Aug86 \ : takerambuf ( -- daddr ) \ get last buffer \ ramprev 2@ \ BEGIN 2dup link>file l@ 1+ ( empty buffer ? ) \ WHILE 2dup l2@ or ( last buffer ? ) \ WHILE l2@ REPEAT ; | Code takerambuf ( -- daddr ) .l ramprev r#) A0 move Label takeloop .w -1 4 A0 D) cmpi 0<> IF .l A0 ) tst 0<> IF A0 ) A0 move takeloop bra THEN THEN A0 SP -) move Next end-code \ allocate a buffer bp 24Aug86 | 2Variable (daddr \ | : markrambuf ( blk file daddr -- daddr ) \ 2dup (daddr 2! link>file l! (daddr 2@ link>block l! \ (daddr 2@ ; | Code markrambuf ( blk file daddr -- daddr ) .l SP )+ A0 move .w SP )+ 4 A0 D) move SP )+ 6 A0 D) move .l A0 SP -) move Next end-code | : makerambuf ( adr blk file -- ) \ create a buffer BEGIN rambuf? 0= WHILE 2dup takerambuf markrambuf 2drop REPEAT writerambuf ; \ clear buffers bp 10Aug86 : clearrambuf ( laddr -- ) \ clear a buffer link>file -1 -rot l! ; : flushramfile ( fcb -- ) \ clear all buffers of a file >r ramprev 2@ BEGIN 2dup or WHILE 2dup link>file l@ r@ = IF 2dup clearrambuf THEN l2@ REPEAT 2drop rdrop ; \ allocate all buffers bp 10Aug86 | : nextbuf ( d1 -- d2) \ adr of next buffer b/rambuf extend d+ ; | : ramfull? ( daddr -- f) \ true if more buffers nextbuf ramsize 2@ ramfirst 2@ d+ d> 0= ; : emptyramdisk ( -- ) \ initialize ramdisk 0. ramprev 2! ramfirst 2@ BEGIN 2dup ramfull? WHILE 2dup clearrambuf ( clear buffer ) ramprev 2@ 2over l2! ( chain to list ) 2dup ramprev 2! ( store last buffer ) nextbuf REPEAT 2drop ; \ Interactive memory allocation bp 17Aug86 : #in ( -- n) query name number drop ; : initramdisk ( -- ) [ Dos ] 0. ramprev 2! ramfirst 2@ or IF ramfirst 2@ mfree drop ?diskabort 0. ramfirst 2! THEN cr ." Wie viele Kilos sollen es sein ? " #in b/rambuf um* 2. d+ 2dup malloc ( 2 Angstbytes zus.) dup 0< IF drop ?diskabort THEN ( Fehler !) dup 0= abort" Speicher voll !!" ( DR sei Dank gesagt !) ramfirst 2! ramsize 2! emptyramdisk ; \ new r/w bp 10Aug86 ' r/w >body @ Alias oldr/w : ramdiskr/w ( adr blk file rw/f -- f ) ramprev 2@ or 0= IF oldr/w exit THEN dup >r IF rambuf? IF readrambuf rdrop false exit THEN THEN r> 4dup oldr/w IF 4drop true exit THEN \ disk error ! drop makerambuf false ; \ create or overwrite buffer \ print a list of ram buffers bp 10Aug86 : .rambufs ( -- ) ramprev 2@ BEGIN 2dup or WHILE cr 2dup 8 d.r 5 spaces \ adress 2dup link>file l@ dup 1+ IF [ Dos ] .file 4 spaces 2dup link>block l@ 5 .r ELSE drop ." empty" THEN l2@ stop? UNTIL 2drop ; \ Wichtige Worte sind bp 17Aug86 INITRAMDISK ( -- ) fragt nach der Zahl der Anzahl der anzulegenden Buffer und erzeugt sie. EMPTYRAMDISK ( -- ) l”scht den Inhalt aller Buffer. RAMBUF? ( blk file -- dadr tf \ blk file ff ) sucht den Buffer blk im File file in der Ramdisk. CLEARRAMBUF? ( laddr -- ) markiert den Ramdiskbuffer bei Adr. laddr als leer. .. bp 17Aug86 Wird in RAMDISKR\W benutzt Gibt Offset einer Uservariablen in der Userarea. Dieses Wort geh”rt eigentlich in den Assembler ! bp 17Aug86 Dieses Wort wird in (CLOSE gepatched. FCB ist die Adresse des zu schlieženden Files. Alle Blockpuffer dieses Files werden gel”scht. Dieses Wort wird in EMPTY-BUFFERS gepatched. Es l”scht alle Ramdiskpuffer Neues R/W Patche (CLOSE Patche EMPTY-BUFFERS Frage nach der Gr”že der Ramdisk bp 17Aug86 Zeiger auf den ersten Buffer in der Ramdisk. Beginn des f<>r die Ramdisk allokierten Speicherbereichs L„nge " " " " " " L„nge eines Buffers der Ramdisk Diese Worte erlauben den Zugriff auf die Felder eines Ramdiskbuffers. Dies ist die Struktur eines Ramdiskbuffers. Alle Buffer befinden sich in einer gelinkten Liste, analog zum volksFORTH83-Block= =buffermechanismus. bp 17Aug86 Sucht einen Buffer in der Ramdisk. Gesucht wird der Buffer mit der Nummer BLK aus dem File mit der Nummer FCB. Zun„chst wird der erste Eintrag untersucht (weniger Rechenzeit). Ist es nicht der oberste, so werden die restlichen Buffer verglichen. Wurde er gefunden, so wird der betreffende Buffer an den Anfang der Liste geh„ngt, so daž die Buffer immer in der Reihenfolge des Zugriffs geordnet sind. Dadurch wird die Zugriffsgeschwindigkeit erh”ht. bp 17Aug86 Kopiert den Inhalt des Ramdiskbuffers in den Blockbuffer des volksFORTH-Systems Kopiert den Inhalt des Blockbuffers im System in den Ramdisk= =buffer. Diese beiden Worte k”nnen noch optimiert werden, da LCMOVE byteweise <20>bertr„gt, aber auch langwortweise <20>bertragen werden kann. bp 17Aug86 Dieses Wort sucht einen leeren Ramdiskbuffer. Ist keiner leer, so wird der letzte Buffer in der Liste genommen. bp 24Aug86 Hilfsvariable Markiert den Ramdiskbuffer DADDR als Buffer f<>r den Block BLK im File FILE. Erzeugt einen Buffer f<>r den Blockl BLK des Files FILE in der Ramdisk. Der Inhalt des Buffers steht ab Adresse ADR im System. RAMBUF? wird benutzt, um den allokierten Buffer an die erste Stelle zu h„ngen. Der WHILE-Teil wird max. einmal durchlaufen ! bp 17Aug86 L”scht den Buffer LADDR. L”scht alle Ramdiskbuffer, die zum File FCB geh”ren. bp 17Aug86 Berechnet die Adresse D2 des Ramdiskbuffers, der auf den Buffer mit der Adresse D1 folgt. F ist wahr, falls noch weitere Buffer in der Ramdisk allokiert werden k”nnen. Initialisiert die Ramdisk. Es werden soviele Buffer angelegt, wie in den durch RAMFIRST und RAMSIZE angegebenen Speicher= =bereich passen. Alle allokierten Buffer werden als leer markiert. bp 17Aug86 Liest eine Zahl von der Tastatur ein Erzeugt die Ramdisk. Zun„chst wird der alte Speicherbereich freigegeben, falls einer allokiert war. Dann wird nach der gew<65>nschten Zahl von Buffern gefragt. Es wird ein Speicher= =bereich vom GEM-Dos angeordert und mit leeren Buffern gef<65>llt. bp 17Aug86 Die alte R/W-Routine wird nat<61>rlich auch ben”tigt. Kommuniziert mit den Massenspeichern. RW/F ist wahr, falls ein Lesezugriff erfolgen soll. Ist die Ramdisk leer, so darf sie nicht angesprochen werden ! Sonst wird gepr<70>ft, ob es sich um einen Lesezugriff handelt und ob der Buffer in der Ramdisk vorliegt. Ist das der Fall, so wird einfach dessen Inhalt kopiert. Andernfalls muž, falls noch nicht vorhanden, ein Buffer allokiert werden. Der Inhalt des Systembuffers wird dann in die Ramdisk kopiert und steht beim n„chsten Lesezugriff zur Verf<72>gung. bp 17Aug86 Es wird eine Liste mit dem Inhalt aller Ramdiskbuffer ausgegeben