\ *** Block No. 0 Hexblock 0 \\ *** File-Interface *** 25may86we Dieses File enth„lt das File-Interface. Damit wird der Zugriff auf normale GEM-Dos Files m”glich. Wenn ein File mit USE benutzt wird, beziehen sich alle Worte, die mit dem Massenspeicher arbeiten, auf dieses File. Ebenfalls un- tersttzt das File-Interface Subdirectories, sogar mit mehr M”glichkeiten als unter GEM-Dos. Da es normalerweise im Direktzugriff geladen wird, mssen die View-Felder der Worte anschliež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”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žt das File mit der Handle HANDLE. Dabei sollten alle TOS-Buffer zurckgeschrieben und das Directory gesichert werden. F ist ein Fehlerflag. Die Handle ist anschliežend ungltig. \ *** 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 fr 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 Wnschen zusammen, und spei- chern Sie es dann mit SAVE-SYSTEM MYPROG.PRG ab. \ *** Block No. 42 Hexblock 2A 13oct86we DOS enth„lt die "unwichtigen" Worte des Fileinterfaces BODY> ( cfa -- pfa ) Kompilationsadresse in Parameterfeldadresse umwandeln ... Diese Worte werden fr die ble Patcherei in .diskabort benutzt. Nur so kann die Dos-Fehlernummer in der abort" -Meldung unter- gebracht werden. Bei einer Ausgabe mit . w„re keine Umleitung ber ERRORHANDLER m”glich. \ *** Block No. 43 Hexblock 2B 13oct86we -n ist die Fehlernummer; es wird der zugeh”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 „užerst h„žlich, nichtsdestoweniger aber sehr effektiv. Prft, ob ein Fehler vorliegt und druckt ggf. den Text aus und ABORTed anschliežend. \ *** Block No. 44 Hexblock 2C bp 4oct86 Definierendes Wort fr die Benamsung der Felder eines File control blocks ( FCB bzw. FILE in den Stackkommentaren) Zeiger auf den n„chsten FCB Platz fr max. 24 Zeichen fr den TOS-Filenamen L„nge des Files in Bytes Handlenummer, die das TOS beim ™ffnen eines Files liefert. Eine eigene Nummer, die in das VIEW-Feld eingetragen wird. L„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„hlt vom Anfang des Files mit der Handle HANDLE . POSITION? liefert die Position des zuletzt gelesenen, geschriebenen oder mit POSITION bzw. LSEEK angew„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 ™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ž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„lt anschliežend Filenamen, -l„nge usw. SEARCHNEXT sucht das n„chste File mit dem bei SEARCH0 angegeben Namen... \ *** Block No. 49 Hexblock 31 13oct86we (MAKEDIR erzeugt „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”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„nge in Blocks bestimmt werden soll. N ist dann die Zahl der Bl”cke in diesem File. IN-RANGE prft, 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”tigt. FILEREAD liest den Block BLOCK an die Adresse BUFF aus dem File FCB. Hinterl„žt eine Fehlernummer. FILEWRITE berschreibt den Block BLOCK mit den Daten ab Adresse BUFF im File FCB. Hinterl„žt eine Fehlernummer. \ *** Block No. 53 Hexblock 35 bp 4oct86 SCAN-NAME 'LEN ist die L„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„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 fr den durch SETPATH angegeben String, der die Namen der zu durchsuchenden Laufwerke und Directories enth„lt. PATHES? Druckt den Inhalt von PATHES aus. SETPATH Setzt PATHES auf den String ab der Adresse ADR, dessen L„nge LEN ist. Anschliežend wird noch ein ; angefgt, 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„žt dessen Adresse. \ *** Block No. 56 Hexblock 38 bp 4oct86 SFILE enth„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„chsten zu durchsuchenden Pfad ADR LEN1. (SEARCHFILE durchsucht alle in PATHES stehenden Pfade nach dem in FCB stehenden Filenamen. Aufgeh”rt wird, wenn das File gefunden wurde oder alle Pfade durchsucht wurden. Am Schluž 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„ndige Pfad des Files. \ *** Block No. 57 Hexblock 39 bp 4oct86 @LENGTH holt die L„nge des zuletzt gefundenen Files COPYLENGTH kopiert die L„nge des zuletzt gefundenen Files in den Fcb FCB. (OPEN ”ffnet das durch FCB angegebene File und speichert LEN dort die Handle und L„nge. Dazu muž es natrlich erst gesucht werden, denn nur dann steht die L„nge in der DTA. CAPACITY N ist die Zahl der Bl”cke im aktuellen (durch ISFILE angegeben) File. Ist ISFILE Null, so wird die Kapazit„t der Diskette im Direktzugriff angegeben. \ *** Block No. 58 Hexblock 3A bp 4oct86 FILER/W ist das zentrale Wort fr den Zugriff auf Files. BUFF ist die Adresse des Blocks BLOCK im Speicher, FCB die Nummer des Files (0 heiž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„nge werden korrigiert. \ *** Block No. 59 Hexblock 3B bp 4oct86 !NAME speichert einen auf !NAME folgenden String ab Adresse ADR mit maximaler L„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”scht, weil das so zugewiesene File noch nicht ge”ffnet worden ist. \ *** Block No. 60 Hexblock 3C 13oct86we .DTANAME druckt den Filenamen, er ab Adresse d in der DTA steht, linksbndig in einem Feld der Breite 15 aus. .DTA druckt den Inhalt der DTA formattiert aus. Zun„chst wird ein "D" ausgegeben, das anzeigt, ob es sich um ein Subdirectory handelt, anschliežend der Name gefolgt von der L„nge des Files. (DIR druckt alle Files aus, auf die der String ADR LEN und das Attribut ATTR "passt". Die Ausgabe kann wie blich angehalten und abgebrochen werden. \ *** Block No. 61 Hexblock 3D bp 4oct86 FILE-LINK enth„lt einen Zeiger auf den FCB des zuletzt definierten Files. #FILE N ist die Nummer, die in das Viewfeld des n„chsten zu definierenden Files eingetragen werden soll. FORTHFILES druckt die Forth- und TOS-Namen mit Handle und L„nge aller definierten Files aus. Dazu wird FILE-LINK benutzt. Die Ausgabe kann wie 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”renden Blockpuffer auf dem Massenspeicher und l”scht sie anschliežend. (CLOSE sichert alle Blockpuffer, schliežt anschliež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ž einen FCB erzeugt. Wird der FCB sp„ter ausgefhrt, so tr„gt er sich als aktuelles File und als FROMFILE ein. DIRECT ein "spezieller FCB" fr 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žt zus„tzlich alle Files.. FILE? druckt den Namen des aktuellen Files aus. LIST druckt zus„tzlich den Filenamen aus... PATH druckt PATHES aus oder l”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 berhaupt ein File ? OPEN ”ffnet das aktuelle File. CLOSE schliež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, prfe 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 fr COPY und CONVEY LOADFROM l„dt den Screen N vom File, dessen Name auf LOADFROM folgt. z.B. 1 loadfrom forth_83.scr INCLUDE l„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”ht die L„ngenangabe im aktuellen FCB um 1024 Bytes. ADDBLOCK fgt den Block N am Fileende an. Aužerdem wird ein leerer Buffer mit dieser Nummer angelegt. (MORE fgt n Bl”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 bergeben. A: B: C: D: Kurzformen fr 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 fr 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”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„chst von oben nach unten !) derer alle Worte vergessen werden mssen. 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ž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 prft, ob die zu bewegenden Bl”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 ntzliches Hilfsmittel. Dieser und der n„chste Screen werden normalerweise vom Load- screen nicht mitkompiliert. \ *** Block No. 73 Hexblock 49 13oct86we Mit BLOCKS>FILE l„žt sich eine Folge von Diskettenbl”cken in einem File ablegen. Damit k”nnen Disketten, die bisher im Direktzugriff benutzt worden sind, auf das Fileinterface um- gestellt werden.