mirror of
https://github.com/forth-ev/VolksForth.git
synced 2024-11-29 05:49:26 +00:00
1259 lines
81 KiB
Plaintext
1259 lines
81 KiB
Plaintext
|
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
|