VolksForth/sources/AtariST/FILEINT.FB.src

1259 lines
81 KiB
Plaintext
Raw Normal View History

2020-06-20 16:59:55 +00:00
Screen 0 not modified
0 \\ *** File-Interface *** 25may86we
1
2 Dieses File enth<74>lt das File-Interface.
3 Damit wird der Zugriff auf normale GEM-Dos Files m<>glich. Wenn
4 ein File mit USE benutzt wird, beziehen sich alle Worte, die
5 mit dem Massenspeicher arbeiten, auf dieses File. Ebenfalls un-
6 terst<73>tzt das File-Interface Subdirectories, sogar mit mehr
7 M<>glichkeiten als unter GEM-Dos.
8
9 Da es normalerweise im Direktzugriff geladen wird, m<>ssen die
10 View-Felder der Worte anschlie<69>end gepatched werden
11 (s. STARTUP.SCR)
12
13
14
15
Screen 1 not modified
0 \ File interface load and patch block 13oct86we
1
2 Onlyforth
3
4 1 3 +thru \ savesystem, always needed
5 4 $21 +thru \ Fileinterface
6
7 ' (makeview Is makeview
8 ' remove-files Is custom-remove
9 ' filer/w Is r/w
10
11
12
13
14
15
Screen 2 not modified
0 \ File functions for save-system cas20130105
1
2 : arguments ( n -- )
3 depth 1- > abort" not enough Parameters" ;
4
5 | Code (createfile ( C$ -- handle )
6 0 # A7 -) move \ normal file, no protection
7 SP )+ D6 move D6 reg) A0 lea .l A0 A7 -) move
8 .w $3C # A7 -) move 1 trap 8 A7 addq
9 D0 SP -) move Next end-code
10
11 | Code (closefile ( handle -- f )
12 SP )+ A7 -) move
13 $3E # A7 -) move 1 trap 4 A7 addq
14 D0 SP -) move Next end-code
15
Screen 3 not modified
0 \ write into file cas20130105
1
2 | Code (filewrite ( buff len handle -- n )
3 SP )+ D0 move .l D2 clr .w SP )+ D2 move
4 SP )+ D6 move D6 reg) A0 lea
5 .l A0 A7 -) move \ buffer adress
6 D2 A7 -) move \ buffer length
7 .w D0 A7 -) move \ handle
8 $40 # A7 -) move \ call WRITE
9 1 trap $0C # A7 adda
10 D0 SP -) move \ errorflag, num written Bytes
11 Next end-code
12
13
14
15
Screen 4 not modified
0 \ save-system cas20130105
1
2 : save-system save flush \ Filename follows
3 bl word count dup 0= abort" missing filename"
4 over + off (createfile dup >r 0< abort" no device "
5 $601A 0 ! align here $1C - $04 ! 0 , 0 ,
6 0 here r@ (filewrite here - abort" write error"
7 r> (closefile 0< abort" close error" ;
8
9
10
11
12
13
14
15
Screen 5 not modified
0 \ disk errors 13oct86we
1
2 Vocabulary Dos Dos also definitions
3
4 | ' 2- Alias body> \ just for style
5
6
7
8
9
10 | : 2digits ( n -- adr len )
11 base push decimal extend <# # # #> ;
12
13 | 0 Constant #adr
14 \ will hold the adr of "00" in following abort" ..."
15
Screen 6 not modified
0 \ disk errors cas20130105
1
2 : .diskerror ( -n -- ) negate
3 &13 case? abort" disk is proteced"
4 &33 case? abort" file not found"
5 &34 case? abort" path not found"
6 &36 case? abort" access denied"
7 &37 case? abort" illegal handle#"
8 &46 case? abort" illegal drive num"
9 2digits #adr swap cmove
10 true [ here 2+ ( adress of counted string ) ]
11 abort" Dos-Error #00"
12 [ count + 2- ' #adr >body ! ( adr of "00") ] ;
13
14 : ?diskabort ( -n -- ) dup 0< IF .diskerror THEN drop ;
15
Screen 7 not modified
0 \ File control block structure 09sep86we
1
2 | : Fcbyte ( n len -- n' ) \ defining word for fcb contents
3 Create over c, + does> c@ + ;
4
5 &25 Constant filenamelen \ only SHORT pathes will fit !
6 | 0 2 Fcbyte nextfile \ link to next file
7 filenamelen Fcbyte filename \ name of file
8 4 Fcbyte filesize \ size in Bytes , low..high
9 2 Fcbyte filehandle \ handle from GEMdos
10 2 Fcbyte fileno \ fileno. for VIEW
11 Constant b/fcb \ bytes per file
12
13 : handle ( -- n ) isfile@ filehandle @ ;
14
15 \ *** nextfile must be the first field !
Screen 8 not modified
0 \ position into block 13oct86we
1
2 Code lseek ( d handle n -- d' )
3 SP )+ A7 -) move SP )+ A7 -) move .l SP )+ A7 -) move
4 .w $42 # A7 -) move 1 trap $0A # A7 adda
5 .l D0 SP -) move Next end-code
6
7 : position ( d handle -- f )
8 0 lseek 0< ?exit drop false ;
9
10 : position? ( handle -- d )
11 0 0 rot 1 lseek dup 0< IF ?diskabort THEN ;
12
13
14
15
Screen 9 not modified
0 \ read and write a memory area cas20130105
1
2 Code (fileread ( buff len handle -- n )
3 SP )+ D0 move .l D2 clr .w SP )+ D2 move
4 SP )+ D6 move D6 reg) A0 lea
5 .l A0 A7 -) move \ buffer adress
6 D2 A7 -) move \ buffer length
7 .w D0 A7 -) move \ handle
8 $3F # A7 -) move \ call READ
9 1 trap $0C # A7 adda
10 D0 SP -) move \ errorflag or bytes read
11 Next end-code
12
13 ' (filewrite Alias (filewrite
14
15
Screen 10 not modified
0 \ (open-file setdta 26oct86we
1
2 Code (openfile ( C$ -- handle )
3 2 # A7 -) move
4 SP )+ D6 move D6 reg) A0 lea .l A0 A7 -) move
5 .w $3D # A7 -) move 1 trap 8 A7 addq
6 D0 SP -) move Next end-code
7
8 Create dta &44 allot
9
10 Code setdta ( addr -- )
11 SP )+ D6 move D6 reg) A0 lea .l A0 A7 -) move
12 .w $1A # A7 -) move 1 trap 6 A7 addq Next end-code
13
14 ' (closefile Alias (closefile
15 ' (createfile Alias (createfile
Screen 11 not modified
0 \ search for files 03oct86we
1
2 Code search0 ( C$ attr -- f ) \ search for first file
3 SP )+ A7 -) move SP )+ D6 move D6 reg) A0 lea
4 .l A0 A7 -) move .w $4E # A7 -) move 1 trap 8 A7 addq
5 D0 SP -) move Next end-code
6
7 Code searchnext ( -- f ) \ search for next file
8 $4F # A7 -) move 1 trap 2 A7 addq
9 D0 SP -) move Next end-code
10
11
12
13
14
15
Screen 12 not modified
0 \ Create a subdir bp 11 oct 86
1
2 Code (makedir ( C$ -- f ) \ Create a subdir
3 $39 # D1 move
4 Label long-adr
5 SP )+ D6 move D6 reg) A0 lea .l A0 A7 -) move
6 .w D1 A7 -) move 1 trap 6 A7 addq
7 D0 SP -) move Next end-code
8
9 Code (setdir ( C$ -- f )
10 $3B # D1 move long-adr bra end-code
11
12
13
14
15
Screen 13 not modified
0 \ select drive 09sep86we
1
2 Code setdrive ( n -- )
3 SP )+ A7 -) move
4 $0E # A7 -) move 1 trap 4 A7 addq Next end-code
5
6 Code getdrive ( -- n )
7 $19 # A7 -) move 1 trap 2 A7 addq
8 D0 SP -) move Next end-code
9
10 Code getdir ( addr n -- f ) \ n is drive, string in addr
11 SP )+ A7 -) move SP )+ D6 move D6 reg) A0 lea
12 .l A0 A7 -) move .w $47 # A7 -) move 1 trap 8 A7 addq
13 D0 SP -) move Next end-code
14
15
Screen 14 not modified
0 \ file sizes b30aug86we
1
2 : (capacity ( fcb -- n) \ calculates size in blocks
3 filesize 2@ 2dup or 0= IF drop exit THEN
4 b/blk um/mod swap IF 1+ THEN ; \ add 1 block for rest
5
6 | : in-range ( block fcb -- f) \ makes sure, block is in file
7 (capacity u< not &36 * ; \ Errorcode -&36
8
9
10
11
12
13
14
15
Screen 15 not modified
0 \ read and write into files bp 11 oct 86
1
2 | : set-pos ( block handle -- f)
3 >r b/blk um* r> position ;
4
5 | : fileaccess ( buff block fcb -- buff len handle/ errorcode)
6 2dup in-range ?dup IF >r 2drop drop r> rdrop exit THEN
7 filehandle @ under set-pos
8 ?dup IF >r 2drop r> rdrop exit THEN
9 b/blk swap ;
10
11 | : fileread ( buff block fcb -- ff / errorcode )
12 fileaccess (fileread dup 0> IF drop false THEN ;
13
14 | : filewrite ( buff block fcb -- ff / errorcode )
15 fileaccess (filewrite dup 0> IF drop false THEN ;
Screen 16 not modified
0 \ twiggling the file variables bp 11 oct 86
1
2 : scan-name ( C$ -- adr len') \ length of "C"-string
3 $1000 over swap 0 scan drop over - ;
4
5 : .file ( fcb --) \ print only filename
6 ?dup 0= IF ." DIRECT ! " exit THEN body> >name .name ;
7
8 : .fcb ( fcb -- ) \ print filename
9 dup filehandle @ 2 .r dup filesize 2@ 6 d.r 3 spaces
10 dup .file 2 spaces filename scan-name type ;
11
12 : !files ( fcb -- ) \ set file and isfile
13 dup isfile ! fromfile ! ;
14
15
Screen 17 not modified
0 \ PATHes bp 11 oct 86
1
2 | &30 Constant pathlen \ max. len of all pathes
3
4 Variable pathes pathlen allot \ counted string of pathes
5 pathes off
6
7 : pathes? ( -- ) \ print a list of the pathes
8 cr 3 spaces pathes count type ;
9
10 : setpath ( adr len --) \ set's the list of pathes
11 pathlen min pathes place
12 Ascii ; pathes count + c! pathes c@ 1+ pathes c! ;
13
14 \\ PATH : see elsewhere in this file
15
Screen 18 not modified
0 \ search for files bp 11 oct 86
1
2 Variable workspace &64 allot \ place for c$
3
4 | : try.path ( adr len fcb attr -- f )
5 2swap workspace swap 2dup + >r move
6 swap filename r> filenamelen cmove
7 workspace swap search0 0= ;
8
9 | : makec$ ( adr len -- c$ ) \ make adr len to a c$
10 workspace swap 2dup + >r move
11 r> off ( make a c$ ) workspace ;
12
13
14
15
Screen 19 not modified
0 \ " bp 11 oct 86
1
2 | Variable sfile \ "dirty" variable
3 | 7 Constant defaultattr \ find all filetypes
4
5 | : path@ ( adr len -- adr len1 adr len2) \ isolate a path
6 Ascii ; skip 2dup 2dup Ascii ; scan nip - ;
7
8 : (searchfile ( fcb -- ff/ C$ f) \ search for file in path
9 sfile ! pathes count \ and in act. directory
10 BEGIN path@ sfile @ defaultattr try.path
11 IF 2drop workspace true exit THEN
12 Ascii ; scan dup 0= UNTIL nip ;
13
14 : searchfile ( fcb -- C$ ) \ file was found in path
15 (searchfile ?exit -&33 ?diskabort ;
Screen 20 not modified
0 \ open a file, filer/w b26oct86we
1
2 | : @length ( -- d) dta &26 + 2@ ;
3 | : copylength ( fcb --) @length rot filesize 2! ;
4
5 : (open ( fcb --) \ open file
6 dup filehandle @ IF drop exit THEN
7 dta setdta dup searchfile over copylength (openfile
8 dup ?diskabort swap filehandle ! ;
9
10 Forth definitions
11
12 : capacity ( -- n)
13 isfile@ ?dup IF dup (open (capacity exit THEN blk/drv ;
14
15 Dos definitions
Screen 21 not modified
0 \ filer/w, Create a file bp 11 oct 86
1
2 : filer/w ( buff block fcb f -- f)
3 over 0= IF STr/w exit THEN
4 over (open
5 IF fileread ELSE filewrite THEN dup ?diskabort ;
6
7 : createfile ( fcb --) \ create a file in fcb
8 dup filename (createfile dup ?diskabort
9 over filehandle ! 0 0 rot filesize 2!
10 offset off ;
11
12
13
14
15
Screen 22 not modified
0 \ store names for files bp 11 oct 86
1
2 | : !name ( adr len --) \ store name in record
3 2dup erase >r name count
4 dup r> < not abort" string too long"
5 >r swap r> cmove ;
6
7 : !fcb ( fcb --) \ next word is filename
8 dup filehandle off filename filenamelen !name ;
9
10
11
12
13
14
15
Screen 23 not modified
0 \ print dta and directory 26oct86we
1
2 | : .dtaname ( addr --) \ addr is addr of name
3 dup BEGIN dup c@ ?dup WHILE emit 1+ REPEAT
4 - &15 + spaces ;
5
6 : .dta ( --) \ print contents of dta
7 cr dta &21 + c@ $10 and
8 IF Ascii D ELSE bl THEN emit space
9 dta &30 + .dtaname @length &10 d.r ;
10
11 : (dir ( attr adr len --) \ given a match string
12 makec$ swap dta setdta search0
13 BEGIN 0= WHILE stop? 0= WHILE .dta searchnext REPEAT ;
14
15
Screen 24 not modified
0 \ primitives for fcb's bp 18May86
1
2 User file-link file-link off \ list thru files
3
4 | : #file ( -- n) \ View number of next file
5 file-link @ dup IF fileno @ THEN 1+ ;
6
7
8 : forthfiles ( --) \ print a list of :
9 file-link @ \ forthword,filename,handle,len
10 BEGIN dup WHILE
11 cr dup .fcb @ stop? UNTIL drop ;
12
13
14
15
Screen 25 not modified
0 \ Close a file bp 18May86
1
2 | ' save-buffers >body $C + @ Alias backup
3
4 | : filebuffer? ( fcb -- fcb bufaddr/flag)
5 prev BEGIN @ dup WHILE 2dup 2+ @ = UNTIL ;
6
7 | : flushfile ( fcb -- ) \ flush file buffers
8 BEGIN filebuffer? ?dup WHILE
9 dup backup emptybuf REPEAT drop ;
10
11 : (close ( fcb --) \ close file in fcb
12 dup flushfile
13 filehandle dup @ ?dup 0= IF drop exit THEN swap off
14 (closefile -$41 case? ?exit ?diskabort ;
15
Screen 26 not modified
0 \ Create fcb's bp 11 oct 86
1
2 Forth definitions
3
4
5 : File ( -- ) \ Create a fcb
6 Create here b/fcb allot dup b/fcb erase
7 #file over fileno !
8 file-link @ over file-link ! swap !
9 does> !files ;
10
11 : direct 0 !files ; \ switch to direct access
12
13
14
15
Screen 27 not modified
0 \ flush buffers & misc. bp 8jun86
1
2 : flush ( --) flush file-link
3 BEGIN @ ?dup WHILE dup (close REPEAT ;
4
5 : file? isfile@ .file ; \ print current file
6
7 : list ( n --)
8 3 spaces file? list ;
9
10 : path ( -- ) \ this is a smart word !
11 name count
12 dup 0= IF 2drop pathes? exit THEN
13 dup 1 = IF over c@ Ascii ; =
14 IF 2drop pathes off exit THEN THEN
15 setpath ;
Screen 28 not modified
0 \ File Interface User words 26oct86we
1
2 | : isfile? ( adr -- adr f) \ is adr a fcb ?
3 file-link BEGIN @ dup 0= ?exit 2dup 2- = UNTIL drop true ;
4
5 | : ?isfile@ isfile@ body>
6 isfile? 0= abort" not in direct mode" >body ;
7
8 : open ?isfile@ (open offset off ;
9 : close ?isfile@ (close ;
10 : assign close isfile@ !fcb open ;
11 : make ?isfile@ dup !fcb createfile ;
12
13 : use >in @ name find \ create a fcb if not present !
14 IF isfile? IF execute drop exit THEN THEN drop
15 dup >in ! File dup >in ! ' execute >in ! assign ;
Screen 29 not modified
0 \ File Interface User words bp 11 oct 86
1
2 : makefile >in @ file dup >in ! ' execute >in ! make ;
3
4 : from isfile push use ; \ sets only fromfile
5 : loadfrom ( n --) \ load 1 scr from file
6 isfile push fromfile push use load close ;
7 : include 1 loadfrom ;
8
9 : eof ( -- f) \ end of file ?
10 isfile@ dup filehandle @ position?
11 rot filesize 2@ d= ;
12
13 : files $10 " *.*" count (dir ;
14 : files" $10 Ascii " word count (dir ;
15
Screen 30 not modified
0 \ extend files bp 11 oct 86
1
2 | : >fileend isfile@ filesize 2@ handle position
3 ?diskabort ;
4
5 | : addsize isfile@ filesize dup 2@ b/blk 0 d+ rot 2! ;
6
7 | : addblock ( n --) \ add block n to file
8 buffer b/blk 2dup bl fill >fileend handle (filewrite
9 dup ?diskabort b/blk -
10 IF close abort" Disk voll" THEN addsize ;
11
12 : (more ( n --)
13 capacity swap bounds ?DO I addblock LOOP ;
14
15 : more ( n --) ?isfile@ (open (more close ;
Screen 31 not modified
0 \ make,kill and set directories bp 11 oct 86
1
2 | : dir$ ( -- adr ) name count makec$ ;
3
4 : makedir dir$ (makedir ?diskabort ;
5
6 : dir name count
7 0 case? IF getdrive 2dup 1+ getdir ?diskabort
8 cr 3 spaces Ascii A + emit ." :"
9 scan-name type exit THEN
10 makec$ (setdir ?diskabort ;
11
12 | : driveset Create c, Does> c@ setdrive ;
13 0 driveset A: 1 driveset B: 2 driveset C: 3 driveset D:
14
15
Screen 32 not modified
0 \ words for VIEWing bcas20130105
1
2 | $200 Constant viewoffset \ max. &512 kbyte long files
3
4 | : (makeview ( -- n) \ calc. view field for a name
5 blk @ dup 0= ?exit
6 loadfile @ ?dup IF fileno @ viewoffset * + THEN ;
7
8 : (view ( blk -- blk') \ select file and leave block
9 dup 0= ?exit
10 viewoffset u/mod file-link
11 BEGIN @ dup WHILE 2dup fileno @ = UNTIL
12 dup searchfile drop \ file not found : abort
13 !files drop ;
14
15
Screen 33 not modified
0 \ ugly FORGETing of files bp 11 oct 86
1
2 : remove? ( dic symb addr -- dic symb addr f)
3 dup heap? IF 2dup u> exit THEN 2 pick over 1+ u< ;
4
5 | : remove-files ( dic symb -- dic symb) \ flush files !
6 isfile @ remove? nip IF 0 !files THEN
7 fromfile @ remove? nip IF fromfile off THEN
8 file-link
9 BEGIN @ ?dup WHILE remove? IF dup (close THEN REPEAT
10 file-link remove ;
11
12
13
14
15
Screen 34 not modified
0 \ convey for files bp 11 oct 86
1
2 | : togglefiles ( -- ) \ changes isfile and fromfile
3 isfile@ fromfile @ isfile ! fromfile ! ;
4
5 : convey ( [blk1 blk2] [to.blk --)
6 3 arguments >r 2dup swap - >r
7 togglefiles dup capacity 1- >
8 togglefiles r> r@ + capacity 1- >
9 or abort" wrong range!"
10 r> convey ;
11
12
13
14
15
Screen 35 not modified
0 \ print a list of all blocks bp 9Apr86
1
2 : .blocks
3 prev BEGIN @ ?dup WHILE stop? abort" stopped"
4 cr dup u. dup 2+ @ dup 1+
5 IF ." Block :" over 4+ @ 5 .r
6 ." File : " [ Dos ] .file
7 dup 6 + @ 0< IF ." updated" THEN
8 ELSE ." Block empty" drop THEN REPEAT ;
9
10
11
12
13
14
15
Screen 36 not modified
0 \ create a file of direct blocks bcas20130105
1
2 Dos also
3
4 | File outfile
5
6 : blocks>file ( from to -- ) \ name of file follows
7 ?isfile@ -rot outfile make
8 1+ swap ?DO I over (block b/blk handle (filewrite
9 b/blk - abort" write error"
10 LOOP close isfile ! ;
11
12
13
14
15
Screen 37 not modified
0 bp 4oct86
1
2
3
4
5
6 MAKEVIEW erzeugt aus ISFILE und BLK das Viewfeld
7 CUSTOM-REMOVE erlaubt das FORGETten von eig. Datenstrukturen
8 R/W setzt Forthbl<62>cke in Disksektoren um ....
9
10
11
12
13
14
15
Screen 38 not modified
0 13oct86we
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Screen 39 not modified
0 13oct86we
1
2 ARGUMENTS liefert etwas Sicherheit ...
3
4
5 (CREATEFILE erzeugt ein File, dessen Namen in C$ steht, im
6 aktuellen oder im durch den Pfadnamen angegebenen Directory.
7 HANDLE ist die Handle des Files oder ein Fehlerflag.
8 Es wird immer ein "ganz normales" File erzeugt.
9
10 (CLOSEFILE Schlie<69>t das File mit der Handle HANDLE. Dabei
11 sollten alle TOS-Buffer zur<75>ckgeschrieben und das Directory
12 gesichert werden. F ist ein Fehlerflag. Die Handle ist
13 anschlie<69>end ung<6E>ltig.
14
15
Screen 40 not modified
0 13oct86we
1
2 (FILEWRITE schreibtLEN Bytes in das File HANDLE. Die Bytes
3 werden ab Adresse BUFF im Speicher geholt.
4 N ist die Zahl der geschriebenen Bytes oder eine
5 Fehlernummer, wenn N zwischen -66 und -1 liegt.
6
7
8
9
10
11
12
13
14
15
Screen 41 not modified
0 cas20130105
1
2 SAVE-SYSTEM speichert ein FORTH-System im aktuellen Zustand auf
3 Diskette ab.
4
5 Voodoo-Code f<>r den GEMDOS-Fileheader; keine Relokatinsinfos
6
7 Mit SAVE-SYSTEM lassen sich eigene Arbeitssysteme oder auch
8 Applikationen erstellen, denen man ihre FORTH-Herkunft nicht
9 mehr ansieht.
10 Stellen Sie ein System nach Ihren W<>nschen zusammen, und spei-
11 chern Sie es dann mit SAVE-SYSTEM MYPROG.PRG ab.
12
13
14
15
Screen 42 not modified
0 13oct86we
1
2 DOS enth<74>lt die "unwichtigen" Worte des
3 Fileinterfaces
4
5 BODY> ( cfa -- pfa ) Kompilationsadresse in
6 Parameterfeldadresse umwandeln ...
7
8
9
10 Diese Worte werden f<>r die <20>ble Patcherei in .diskabort benutzt.
11 Nur so kann die Dos-Fehlernummer in der abort" -Meldung unter-
12 gebracht werden. Bei einer Ausgabe mit . w<>re keine Umleitung
13 <20>ber ERRORHANDLER m<>glich.
14
15
Screen 43 not modified
0 13oct86we
1
2 -n ist die Fehlernummer; es wird der zugeh<65>rige Text ausgedruckt
3
4
5
6
7
8
9 Ist die Fehlernummer nicht in den CASE-Anweisungen zu finden,
10 wird Dos-Error # ausgegeben. Die Fehlernummer wird dann in
11 den abort" String gepatched. Dieses Verfahren ist zwar <20>u<EFBFBD>erst
12 h<><68>lich, nichtsdestoweniger aber sehr effektiv.
13
14 Pr<50>ft, ob ein Fehler vorliegt und druckt ggf. den Text aus und
15 ABORTed anschlie<69>end.
Screen 44 not modified
0 bp 4oct86
1
2 Definierendes Wort f<>r die Benamsung der Felder eines
3 File control blocks ( FCB bzw. FILE in den Stackkommentaren)
4
5
6 Zeiger auf den n<>chsten FCB
7 Platz f<>r max. 24 Zeichen f<>r den TOS-Filenamen
8 L<>nge des Files in Bytes
9 Handlenummer, die das TOS beim <20>ffnen eines Files liefert.
10 Eine eigene Nummer, die in das VIEW-Feld eingetragen wird.
11 L<>nge eines FCB wird auch berechnet...
12
13 Liefert die Handle des aktuellen Files. Null, falls das
14 File nicht offen .
15
Screen 45 not modified
0 bp 4oct86
1
2 LSEEK N ist ein Flag, das angibt, ob relativ zum
3 Fileanfang, zum Fileende oder zur aktuellen Position im File
4 positioniert werden soll. HANDLE ist die Handle des Files, in
5 dem positioniert wird und D die neue Position im File.
6 D' ist die neue Position.
7 POSITION positioniert auf das Byte d, gez<65>hlt vom Anfang
8 des Files mit der Handle HANDLE .
9
10 POSITION? liefert die Position des zuletzt gelesenen,
11 geschriebenen oder mit POSITION bzw. LSEEK angew<65>hlten Bytes.
12
13
14
15
Screen 46 not modified
0 13oct86we
1
2 FILEREAD liest LEN Bytes aus dem File HANDLE. Die Bytes
3 werden ab Adresse BUFF im Speicher abgelegt.
4 N ist die Zahl der gelesenen Bytes oder eine Fehlernummer,
5 wenn N zwischen -66 und -1 liegt.
6
7
8
9
10
11
12
13 Das headerlose (FILEWRITE bekommt nun einen Header im Vocabulary
14 Dos.
15
Screen 47 not modified
0 26oct86we
1
2 OPENFILE <20>ffnet ein File. Der Name steht im String C$.
3 C$ ist durch ein $00-Byte begrenzt. HANDLE ist die diesem
4 File zugeordnete Handle oder eine Fehlernummer.
5
6
7
8 DTA ist ein 44 Byte gro<72>er Buffer, in dem einige
9 Fileinformationen vom GEMDOS gehalten werden.
10 SETDTA ADDR ist die Adresse der 'disk transfer area'.
11
12
13
14 (CLOSEFILE und (CREATEFILE erhalten Header im Vocabulary Dos.
15
Screen 48 not modified
0 13oct86we
1
2 SEARCH0 SEARCH0 sucht ein File. C$ ist der Name des File
3 mit Pfad usw. . C$ wird, wie immer, durch ein $00-Byte
4 begrenzt. ATTR ist ein Attributwort, das z.B. bestimmt, ob
5 auch Subdirectories gefunden werden. F ist ein Fehlerflag.
6 Die DTA enth<74>lt anschlie<69>end Filenamen, -l<>nge usw.
7 SEARCHNEXT sucht das n<>chste File mit dem bei SEARCH0
8 angegeben Namen...
9
10
11
12
13
14
15
Screen 49 not modified
0 13oct86we
1
2 (MAKEDIR erzeugt <20>hnlich (CREATEFILE ein Subdirectory.
3 C$ ist der Name des Directories, F ist ein Fehlerflag.
4
5
6
7
8
9 (SETDIR setzt das durch C$ angegeben Subdirectory als
10 das "Aktuelle", auf das sich alle Such- und "Erzeugungs-"
11 operationen ohne eigenen Pfadnamen beziehen.
12
13
14
15
Screen 50 not modified
0 bp 4oct86
1
2 SETDRIVE N ist die Nummer des aktuellen Laufwerkes, auf
3 das sich alle Operationen ohne eigenen Pfadnamen beziehen.
4 Vergleiche (SETDIR. Laufwerk A: hat die Nummer 0 !
5
6 GETDRIVE N ist die Nummer des bei SETDRIVE genannten
7 Laufwerks.
8
9
10 GETDIR Das durch (SETDIR gesetzte Subdirectory wird
11 ab Adresse ADDR als C$ im Speicher abgelegt. N ist die Nummer
12 des Laufwerkes ( Laufwerk A: hat die Nummer 1 !!!! ), denn
13 verschiedene Laufwerke k<>nnen verschiedene aktuelle Sub-
14 directories haben.
15
Screen 51 not modified
0 bp 4oct86
1
2 (CAPACITY FCB ist die Adresse des FCB des Files, von
3 dem die L<>nge in Blocks bestimmt werden soll. N ist dann
4 die Zahl der Bl<42>cke in diesem File.
5
6 IN-RANGE pr<70>ft, ob sich ein Block mit der Nummer BLOCK
7 im File FCB befindet. Ist das nicht der Fall, wird als
8 Fehlernummer -36 geliefert. Siehe auch ?DISKABORT
9
10
11
12
13
14
15
Screen 52 not modified
0 13oct86we
1
2 SET-POS positioniert im File mit der Handle HANDLE auf
3 den Anfangs des Blocks BLOCK. F ist ein Fehlerflag.
4
5 FILEACCESS wird in FILEREAD und FILEWRITE ben<65>tigt.
6
7
8
9
10
11 FILEREAD liest den Block BLOCK an die Adresse BUFF aus
12 dem File FCB. Hinterl<72><6C>t eine Fehlernummer.
13
14 FILEWRITE <20>berschreibt den Block BLOCK mit den Daten ab
15 Adresse BUFF im File FCB. Hinterl<72><6C>t eine Fehlernummer.
Screen 53 not modified
0 bp 4oct86
1
2 SCAN-NAME 'LEN ist die L<>nge eines durch ein $00-Byte
3 begrenzten C$.
4
5 .FILE druckt den Forthnamen des Files mit der Adresse
6 FCB.
7
8 .FCB druckt Forthnamen, TOS-Namen, Handle und L<>nge
9 des Files mit der Adresse FCB aus.
10
11 !FILES setzt die Variable ISFILE und FROMFILE (darin
12 steht das File, aus dem bei COPY und CONVEY gelesen wird)
13 auf das File mit der Adresse FCB.
14
15
Screen 54 not modified
0 bp 4oct86
1
2 PATHES Hier ist Platz f<>r den durch SETPATH angegeben
3 String, der die Namen der zu durchsuchenden Laufwerke und
4 Directories enth<74>lt.
5 PATHES? Druckt den Inhalt von PATHES aus.
6
7 SETPATH Setzt PATHES auf den String ab der Adresse ADR,
8 dessen L<>nge LEN ist. Anschlie<69>end wird noch ein ; angef<65>gt,
9 um auch den letzten Path korrekt zu beenden.
10
11
12
13
14
15
Screen 55 not modified
0 bp 4oct86
1
2 WORKSPACE Hier wird aus File- und Pathnamen ein C$
3 zusammengebastelt.
4
5 TRY.PATH ADR und LEN enthalten den Pfadnamen (aus
6 PATHES mit PATH@ extrahiert), FCB ist die Adresse des Files
7 und ATTR ein Attribut (siehe SEARCH0). Aus Pfadnamen und FCB
8 wird in WORKSPACE ein String zusammengebastelt, der dann mit
9 SEARCH0 gesucht wird. F gibt an, ob wir erfolgreich waren.
10
11 MAKEC$ konvertiert einen durch ADR und LEN definierten
12 String in einen C$ (durch ein $00-Byte begrenzt) und
13 hinterl<72><6C>t dessen Adresse.
14
15
Screen 56 not modified
0 bp 4oct86
1
2 SFILE enth<74>lt die Adresse des FCB des gesuchten Files.
3 DEFAULTATTR enstpricht "Suche alle Files, egal welches ATTR"
4
5 PATH@ extrahiere aus dem noch nicht zum Suchen verwen-
6 deten Teil von PATHES, der durch ADR und LEN angegeben wird,
7 den n<>chsten zu durchsuchenden Pfad ADR LEN1.
8 (SEARCHFILE durchsucht alle in PATHES stehenden Pfade nach
9 dem in FCB stehenden Filenamen. Aufgeh<65>rt wird, wenn das File
10 gefunden wurde oder alle Pfade durchsucht wurden.
11 Am Schlu<6C> wird auch der leere Pfad (L<>nge Null) durchsucht,
12 der dem aktuellen Directory (siehe SETDIR) entspricht.
13
14 SEARCHFILE Sucht das File FCB in allen Pfaden und im akt.
15 Directory. Hinterlassen wird der vollst<73>ndige Pfad des Files.
Screen 57 not modified
0 bp 4oct86
1
2 @LENGTH holt die L<>nge des zuletzt gefundenen Files
3 COPYLENGTH kopiert die L<>nge des zuletzt gefundenen Files
4 in den Fcb FCB.
5 (OPEN <20>ffnet das durch FCB angegebene File
6 und speichert LEN dort die Handle und L<>nge. Dazu mu<6D> es
7 nat<61>rlich erst gesucht werden, denn nur dann steht die L<>nge
8 in der DTA.
9
10
11
12 CAPACITY N ist die Zahl der Bl<42>cke im aktuellen (durch
13 ISFILE angegeben) File. Ist ISFILE Null, so wird die Kapazit<69>t
14 der Diskette im Direktzugriff angegeben.
15
Screen 58 not modified
0 bp 4oct86
1
2 FILER/W ist das zentrale Wort f<>r den Zugriff auf Files.
3 BUFF ist die Adresse des Blocks BLOCK im Speicher, FCB die
4 Nummer des Files (0 hei<65>t Direktzugriff) und R/W gibt an, in
5 welcher Richtung die Daten zu transportieren sind.
6 F ist true, falls ein Fehler auftrat.
7
8 CREATEFILE erzeugt ein File, dessen Name im Fcb FCB steht.
9 Handle und Filel<65>nge werden korrigiert.
10
11
12
13
14
15
Screen 59 not modified
0 bp 4oct86
1
2 !NAME speichert einen auf !NAME folgenden String
3 ab Adresse ADR mit maximaler L<>nge LEN im Speicher ab.
4 Der String wird durch $00-Bytes begrenzt.
5
6
7 !FCB speichert einen auf !FCB folgenden String im
8 Fcb FCB ab. Die Handle wird gel<65>scht, weil das
9 so zugewiesene File noch nicht ge<67>ffnet worden ist.
10
11
12
13
14
15
Screen 60 not modified
0 13oct86we
1
2 .DTANAME druckt den Filenamen, er ab Adresse d in der DTA
3 steht, linksb<73>ndig in einem Feld der Breite 15 aus.
4
5
6 .DTA druckt den Inhalt der DTA formattiert aus.
7 Zun<75>chst wird ein "D" ausgegeben, das anzeigt, ob es sich
8 um ein Subdirectory handelt, anschlie<69>end der Name gefolgt
9 von der L<>nge des Files.
10
11 (DIR druckt alle Files aus, auf die der String ADR
12 LEN und das Attribut ATTR "passt". Die Ausgabe kann wie
13 <20>blich angehalten und abgebrochen werden.
14
15
Screen 61 not modified
0 bp 4oct86
1
2 FILE-LINK enth<74>lt einen Zeiger auf den FCB des
3 zuletzt definierten Files.
4 #FILE N ist die Nummer, die in das Viewfeld des
5 n<>chsten zu definierenden Files eingetragen werden soll.
6
7
8 FORTHFILES druckt die Forth- und TOS-Namen mit Handle und
9 L<>nge aller definierten Files aus. Dazu wird FILE-LINK
10 benutzt. Die Ausgabe kann wie <20>blich angehalten oder beendet
11 werden.
12
13
14
15
Screen 62 not modified
0 bp 4oct86
1
2 FILEBUFFER? guckt nach, ob zu dem File FCB noch ein Block-
3 puffer exisitiert. Liefert false, falls keiner vorhanden ist.
4
5 FLUSHFILE sichert alle zum File FCB geh<65>renden Blockpuffer
6 auf dem Massenspeicher und l<>scht sie anschlie<69>end.
7
8
9 (CLOSE sichert alle Blockpuffer, schlie<69>t anschlie<69>end
10 das File, falls es nicht schon geschlossen war und ignoriert
11 den Fehler mit der Nummer -65, weil der so oft auftritt...
12
13
14
15
Screen 63 not modified
0 bp 4oct86
1
2 FILE ist ein definierendes Wort, da<64> einen FCB
3 erzeugt. Wird der FCB sp<73>ter ausgef<65>hrt, so tr<74>gt er sich
4 als aktuelles File und als FROMFILE ein.
5
6
7
8 DIRECT ein "spezieller FCB" f<>r den Direktzugriff.
9 Der Direktzugriff ist immer dann interessant, wenn man
10 einen Diskmonitor braucht, ihn aber gerade verliehen hat...
11
12
13
14
15
Screen 64 not modified
0 bp 4oct86
1
2 FLUSH schlie<69>t zus<75>tzlich alle Files..
3
4
5 FILE? druckt den Namen des aktuellen Files aus.
6
7 LIST druckt zus<75>tzlich den Filenamen aus...
8
9
10 PATH druckt PATHES aus oder
11 l<>scht PATHES oder
12 setzt PATHES auf einen anderen String.
13
14
15
Screen 65 not modified
0 13oct86we
1
2 ISFILE? F ist wahr, falls ADR die Kompilationsadresse
3 eines FCB ist (also durch FILE erzeugt wurde...).
4
5 ?ISFILE@ steht in ISFILE <20>berhaupt ein File ?
6
7 OPEN <20>ffnet das aktuelle File.
8 CLOSE schlie<69>t es.
9 ASSIGN Anderer Filename in aktuellen FCB eintragen.
10 MAKE Neu erzeugter Filename in aktuellen FCB..
11
12 USE Erzeuge FCB (mit Filenamen !), falls Name nicht
13 schon vorhanden. Wenn Name vorhanden, pr<70>fe ob es File ist.
14 Trage dann FCB in ISFILE ein.
15
Screen 66 not modified
0 13oct86we
1
2 MAKEFILE erzeugt FCB und File gleichen Namens.
3
4 FROM setzt FROMFILE f<>r COPY und CONVEY
5 LOADFROM l<>dt den Screen N vom File, dessen Name auf
6 LOADFROM folgt. z.B. 1 loadfrom forth_83.scr
7 INCLUDE l<>dt den Loadscreen des Files...
8
9 EOF F ist wahr, falls wir am Ende des Files
10 angekommen sind.
11
12
13 FILES liefert Inhaltsverzeichnis des akt. Directories.
14 FILES" erlaubt Pfad- und Filenamen
15
Screen 67 not modified
0 bp 4oct86
1
2 >FILEEND springe ans Ende des aktuellen Files
3
4
5 ADDSIZE erh<72>ht die L<>ngenangabe im aktuellen FCB um
6 1024 Bytes.
7 ADDBLOCK f<>gt den Block N am Fileende an.
8 Au<41>erdem wird ein leerer Buffer mit dieser Nummer angelegt.
9
10
11
12 (MORE f<>gt n Bl<42>cke am Fileende an.
13
14 MORE Wie (MORE, jedoch etwas Sicherheit..
15
Screen 68 not modified
0 13oct86we
1
2 DIR$ ADR ist die Adresse eines auf DIR$ folgenden C$.
3
4 MAKEDIR erzeugt ein Directory mit dem folgenden Namen..
5
6 DIR gibt, falls kein Name folgt, das aktuelle Lauf-
7 werk und Subdirectory aus. Folgt ein Name, so wird er als
8 das neue aktuelle Directory an das TOS <20>bergeben.
9
10
11
12 A: B: C: D: Kurzformen f<>r SETDRIVE.
13
14
15
Screen 69 not modified
0 13oct86we
1
2 VIEWOFFSET teilt das 16-Bit Viewfeld in ein Feld mit der
3 Filenummer und ein Feld mit der Blocknummer. Die unteren 9
4 Bits sind f<>r die Blocknummer reserviert.
5 (MAKEVIEW macht aus BLK und der Nummer des geladenen Files
6 LOADFILE eine 16-Bit Zahl, die von CREATE dann als Viewfeld
7 hinterlegt wird.
8 (VIEW zerlegt den Inhalt BLK eines Viewfeldes in
9 Filenummer und Blocknummer BLK' . Der zur Filenummer
10 geh<65>rende FCB wird gesucht, und falls gefunden, in ISFILE
11 und FROMFILE eingetragen. Kann kein FCB gefunden werden,
12 so wird eine Fehlermeldung ausgegeben.
13
14
15
Screen 70 not modified
0 bp 4oct86
1
2 REMOVE? DIC (SYMB) ist die Adresse im Dictionary (HEAP),
3 oberhalb (unterhalb, der Heap w<>chst von oben nach unten !)
4 derer alle Worte vergessen werden m<>ssen. F gibt an, ob
5 ADDR innerhalb des zu vergessenden Intervalls liegt.
6
7 REMOVE-FILES guckt nach, ob ISFILE oder FROMFILE vergessen
8 werden. Ist das der Fall, so werden sie auf den Direktzugriff
9 umgeschaltet.
10 Anschlie<69>end werden alle zu vergessenden Files geschlossen
11 und aus der Liste aller Files FILE-LINK entfernt.
12
13
14
15
Screen 71 not modified
0 bp 4oct86
1
2 TOGGLEFILES vertauscht ISFILE und FROMFILE.
3
4
5 CONVEY pr<70>ft, ob die zu bewegenden Bl<42>cke vorhanden
6 sind und bewegt sie ggf.
7
8
9
10
11
12
13
14
15
Screen 72 not modified
0 13oct86we
1
2 .BLOCKS listet den Inhalt der Blockpuffer auf.
3 Angegeben werden Adresse, Blocknummer und Filename sowie,
4 ob der Block geUPDATEd wurde.
5
6 Bei der Entwicklung des Fileinterfaces war das ein n<>tzliches
7 Hilfsmittel.
8
9
10 Dieser und der n<>chste Screen werden normalerweise vom Load-
11 screen nicht mitkompiliert.
12
13
14
15
Screen 73 not modified
0 13oct86we
1
2
3
4
5
6 Mit BLOCKS>FILE l<><6C>t sich eine Folge von Diskettenbl<62>cken in
7 einem File ablegen. Damit k<>nnen Disketten, die bisher im
8 Direktzugriff benutzt worden sind, auf das Fileinterface um-
9 gestellt werden.
10
11
12
13
14
15