mirror of
https://github.com/forth-ev/VolksForth.git
synced 2024-12-01 19:49:57 +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<61>erhalb des Forth-Systems verwaltet. Die Organi-
|
|||
|
4 sation ist analog, mit der Ausnahme, da<64> es kein Updateflag
|
|||
|
5 gibt, ge<67>nderte Bl<42>cke also sofort auf die Diskette zur<75>ckge-
|
|||
|
6 schrieben werden. Die Benutzung ist v<>llig transparent, am
|
|||
|
7 Anfang mu<6D> 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<65>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<69>enden Files. Alle Blockpuffer dieses Files werden
|
|||
|
4 gel<65>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<47><72>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<75>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<65>ngt, so da<64> die Buffer immer in
|
|||
|
11 der Reihenfolge des Zugriffs geordnet sind. Dadurch wird die
|
|||
|
12 Zugriffsgeschwindigkeit erh<72>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<74>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<65>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<75>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<65>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<6D>, 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
|