VolksForth/sources/AtariST/FILEINT.fth

1259 lines
77 KiB
Forth
Raw Normal View History

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