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