From 24b745e6a4bd2241096bd13446a1cc779155790a Mon Sep 17 00:00:00 2001 From: Philip Zembrod Date: Sun, 10 Nov 2024 13:15:24 +0100 Subject: [PATCH] Update cpmfiles --- 8080/CPM/cpmfiles/coreacpt.fth | 35 ---- 8080/CPM/cpmfiles/incltest.fth | 10 - 8080/CPM/cpmfiles/logapp.fth | 78 -------- 8080/CPM/cpmfiles/logfile.fth | 50 +++++ 8080/CPM/cpmfiles/logprep.fth | 14 -- 8080/CPM/cpmfiles/logtest.fth | 38 ---- 8080/CPM/cpmfiles/sblkint.fth | 86 +++++++++ 8080/CPM/cpmfiles/sfileint.fth | 334 +++++++++++++++++++++++++++++++++ 8080/CPM/cpmfiles/tc-base.com | Bin 21248 -> 20224 bytes 8080/CPM/cpmfiles/test-blk.fth | 2 +- 8080/CPM/cpmfiles/test-krn.fth | 22 +++ 8080/CPM/cpmfiles/test-min.fth | 2 +- 8080/CPM/cpmfiles/test-std.fth | 2 +- 8080/CPM/cpmfiles/testprep.fth | 38 ---- 8080/CPM/cpmfiles/v4th.com | Bin 13440 -> 13184 bytes 8080/CPM/cpmfiles/v4th.fth | 4 +- 8080/CPM/cpmfiles/v4thblk.com | Bin 0 -> 14464 bytes 8080/CPM/cpmfiles/v4thblk.fth | 16 ++ 8080/CPM/cpmfiles/vf-bdos.fth | 31 +-- 8080/CPM/cpmfiles/vf-bufs.fth | 48 +++-- 8080/CPM/cpmfiles/vf-core.fth | 11 +- 8080/CPM/cpmfiles/vf-file.fth | 149 +++------------ 8080/CPM/cpmfiles/vf-io.fth | 23 ++- 8080/CPM/cpmfiles/vf-sys.fth | 5 +- 24 files changed, 610 insertions(+), 388 deletions(-) delete mode 100644 8080/CPM/cpmfiles/coreacpt.fth delete mode 100644 8080/CPM/cpmfiles/incltest.fth delete mode 100644 8080/CPM/cpmfiles/logapp.fth create mode 100644 8080/CPM/cpmfiles/logfile.fth delete mode 100644 8080/CPM/cpmfiles/logprep.fth delete mode 100644 8080/CPM/cpmfiles/logtest.fth create mode 100644 8080/CPM/cpmfiles/sblkint.fth create mode 100644 8080/CPM/cpmfiles/sfileint.fth create mode 100644 8080/CPM/cpmfiles/test-krn.fth delete mode 100644 8080/CPM/cpmfiles/testprep.fth create mode 100644 8080/CPM/cpmfiles/v4thblk.com create mode 100644 8080/CPM/cpmfiles/v4thblk.fth diff --git a/8080/CPM/cpmfiles/coreacpt.fth b/8080/CPM/cpmfiles/coreacpt.fth deleted file mode 100644 index d629533..0000000 --- a/8080/CPM/cpmfiles/coreacpt.fth +++ /dev/null @@ -1,35 +0,0 @@ -\ From: John Hayes S1I -\ Subject: core.fr -\ Date: Mon, 27 Nov 95 13:10 - -\ (C) 1995 JOHNS HOPKINS UNIVERSITY / APPLIED PHYSICS LABORATORY -\ MAY BE DISTRIBUTED FREELY AS LONG AS THIS COPYRIGHT NOTICE REMAINS. -\ VERSION 1.2 -\ THIS PROGRAM TESTS THE CORE WORDS OF AN ANS FORTH SYSTEM. -\ THE PROGRAM ASSUMES A TWO'S COMPLEMENT IMPLEMENTATION WHERE -\ THE RANGE OF SIGNED NUMBERS IS -2^(N-1) ... 2^(N-1)-1 AND -\ THE RANGE OF UNSIGNED NUMBERS IS 0 ... 2^(N)-1. -\ I HAVEN'T FIGURED OUT HOW TO TEST KEY, QUIT, ABORT, OR ABORT"... -\ I ALSO HAVEN'T THOUGHT OF A WAY TO TEST ENVIRONMENT?... - -CR -TESTING CORE WORDS -HEX - -\ ------------------------------------------------------------------------ -TESTING INPUT: ACCEPT - -CREATE ABUF 50 CHARS ALLOT - -: ACCEPT-TEST - CR ." PLEASE TYPE UP TO 80 CHARACTERS:" CR - ABUF 50 ACCEPT - CR ." RECEIVED: " [CHAR] " EMIT - ABUF SWAP TYPE [CHAR] " EMIT CR -; - -T{ ACCEPT-TEST -> }T - -CR .( End of Core input word set tests) CR - - diff --git a/8080/CPM/cpmfiles/incltest.fth b/8080/CPM/cpmfiles/incltest.fth deleted file mode 100644 index 02da693..0000000 --- a/8080/CPM/cpmfiles/incltest.fth +++ /dev/null @@ -1,10 +0,0 @@ - -\needs (type include extend.fb include multi.vid include dos.fb -include log2file.fb -logopen output.log - -.( hello, world) cr -: test-hello ." hello, world, from test-hello" cr ; -test-hello - -logclose diff --git a/8080/CPM/cpmfiles/logapp.fth b/8080/CPM/cpmfiles/logapp.fth deleted file mode 100644 index 39cdc5b..0000000 --- a/8080/CPM/cpmfiles/logapp.fth +++ /dev/null @@ -1,78 +0,0 @@ - - -\ Experimental code and test for text logs that can be closed -\ and reopened for appending. -\ Already integrated into log2file.fb/.fth -\ Yet to be done: A more permanent test for m+! -\ and an extension of logtest.fb/.fth to also cover the reopen feature. - - -\ Code +! ( 16b addr -- ) -\ D W mov A pop A W ) add D pop Next end-code - - Code m+! ( 16b addr -- ) - D W mov W inc W inc A pop A W ) add - CS ?[ W dec W dec W ) inc ]? - D pop Next end-code - - - - - -\ *** Block No. 2, Hexblock 2 - -\ log-type log-emit log-cr alsologtofile phz 04jan22 - context @ dos also context ! -\ vocabulary log dos also log definitions - file logfile - variable logfcb - variable logpos 0 , - - : log-type - dup logpos m+! - 2dup (type ds@ -rot logfcb @ lfputs ; - - : log-emit - 1 logpos m+! - dup (emit logfcb @ fputc ; - - : log-cr - 2 logpos m+! - (cr #cr logfcb @ fputc #lf logfcb @ fputc ; - -Output: alsologtofile - log-emit log-cr log-type (del (page (at (at? ; - - - -\ *** Block No. 3, Hexblock 3 - -\ logopen logclose phz 11jan22 - - : logopen ( -- ) - isfile push logpos dup 2+ off off - logfile make isfile@ dup freset logfcb ! - alsologtofile ; - - : logclose ( -- ) display logfcb @ fclose ; - - : logreopen ( -- ) - logfcb @ freset logpos 2@ logfcb @ fseek - alsologtofile ; - - logopen output.log - .( logtest started) cr - logpos @ cr u. cr - .( logtest interrupted) cr - logclose - logreopen - create 2v 4 allot - hex - 12345. 2v 2! - 1 2v m+! - 2v 2@ d. cr - 1ffff. 2v 2! - 1 2v m+! - 2v 2@ d. cr - .( logtest done) cr - logclose diff --git a/8080/CPM/cpmfiles/logfile.fth b/8080/CPM/cpmfiles/logfile.fth new file mode 100644 index 0000000..c0262bc --- /dev/null +++ b/8080/CPM/cpmfiles/logfile.fth @@ -0,0 +1,50 @@ + +\ *** Block No. 2, Hexblock 2 + +\ logfile phz 20aug23 + + Dos also Forth definitions + + $18 constant fcb\nam + create logfile ," LOGFILE TXT" fcb\nam allot 1 logfile c! + create logdma b/rec allot + variable logoffset 0 logoffset ! + + : logflush logdma dma! logfile $15 bdos $80 dma! ; + + : logc! ( c -- ) + logoffset @ dup >r logdma + c! r> 1+ + dup logoffset ! b/rec = + IF logflush 0 logoffset ! THEN ; + + +\ *** Block No. 3, Hexblock 3 + +\ log-emit log-type log-cr alsologtofile pphz 03sep23 + + : log-emit ( char -- ) + dup (emit logc! ; + + : log-type ( addr count -- ) + 0 ?DO count log-emit LOOP drop ; + + : log-cr ( -- ) + (cr #cr logc! #lf logc! ; + +Output: alsologtofile + log-emit log-cr log-type (del noop 2drop (at? ; + + +\ *** Block No. 4, Hexblock 4 + +\ logopen phz 20aug23 + + : logopen ( -- ) + logfile filenamelen + 1+ fcb\nam erase + 0 logoffset ! + logfile killfile + logfile createfile + alsologtofile ; + + : logclose ( -- ) + cr display &26 logc! logflush logfile closefile ; diff --git a/8080/CPM/cpmfiles/logprep.fth b/8080/CPM/cpmfiles/logprep.fth deleted file mode 100644 index 4e4e3d6..0000000 --- a/8080/CPM/cpmfiles/logprep.fth +++ /dev/null @@ -1,14 +0,0 @@ - - include extend2.fth -\needs drv : drv 2 ; \ showing C: if drv isn't defined - include multivid.fth - -\ : .blk|tib -\ blk @ ?dup IF ." Blk " u. ?cr exit THEN -\ incfile @ IF tib #tib @ cr type THEN ; - -\ ' .blk|tib Is .status - -\ include dos2.fth - include dos3.fth - include log2file.fth diff --git a/8080/CPM/cpmfiles/logtest.fth b/8080/CPM/cpmfiles/logtest.fth deleted file mode 100644 index 57a43d0..0000000 --- a/8080/CPM/cpmfiles/logtest.fth +++ /dev/null @@ -1,38 +0,0 @@ - -\ *** Block No. 0, Hexblock 0 - -\ logtest.fb phz 04jan22 - - basic tests for log2file.fb - - - - - - - - - - - - - - -\ *** Block No. 1, Hexblock 1 - -\ loadscreen phz 22jan22 - - include log2file.fb - - logopen output.log - .( logtest done) cr - logclose - - - - - - - - - diff --git a/8080/CPM/cpmfiles/sblkint.fth b/8080/CPM/cpmfiles/sblkint.fth new file mode 100644 index 0000000..986e7fc --- /dev/null +++ b/8080/CPM/cpmfiles/sblkint.fth @@ -0,0 +1,86 @@ + +Dos definitions + +: file-r/w ( buffer block fcb f -- f ) + over 0= Abort" no Direct Disk IO supported! " + >r dup (open 2dup in-range r> (r/w ; + +\ backup was made visible in vf-blk.fth so no need to peek its address +\ ' (save-buffers >body $0C + @ | 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 ; + +' (flushfile is flushfile + +Forth definitions + +: list ( n -- ) 3 spaces file? list ; + +\ *** Block No. 15, Hexblock f + +\ words for viewing UH 10Oct87 + +Forth definitions + +| $200 Constant viewoffset \ max. %512 kB files + +: (makeview ( -- n ) \ calc. view filed 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 + !files drop ; \ not found: direct access + + +\ *** Block No. 17, Hexblock 11 + +\ print a list of all buffers UH 20Oct86 + +: .buffers + 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 ." Buffer empty" drop THEN REPEAT ; + + + + + + + + +: loadfrom ( n -- ) + isfile push fromfile push use load close ; + +| : addblock ( n -- ) \ add block n to file + dup buffer under b/blk bl fill + isfile@ rec/blk over filesize +! false file-r/w + IF close Abort" disk full!" THEN ; + +: more ( n -- ) open >fileend + capacity swap bounds ?DO I addblock LOOP close + open close ; + +\ *** Block No. 22, Hexblock 16 + +\ Status UH 10OCt87 + + +: .blk ( -- ) blk @ ?dup 0=exit + dup 1 = IF cr file? THEN base push hex ." Blk " . ?cr ; + +' .blk Is .status + +' (makeview Is makeview +' file-r/w Is r/w + diff --git a/8080/CPM/cpmfiles/sfileint.fth b/8080/CPM/cpmfiles/sfileint.fth new file mode 100644 index 0000000..ef60c0e --- /dev/null +++ b/8080/CPM/cpmfiles/sfileint.fth @@ -0,0 +1,334 @@ + +\ *** Block No. 0, Hexblock 0 + +\ CP/M 2.2 File-Interface (3.80a) UH 05Oct87 + +\ Dieses File enthaelt das File-Interface von volksFORTH zu CP/M. +\ Damit ist Zugriff auf normale CP/M-Files moeglich. +\ Wenn ein File mit USE benutzt wird, beziehen sich alle Worte, +\ die mit dem Massenspeicher arbeiten, auf dieses File. + +\ Benutzung: +\ USE \ benutze ein schon existierendes File +\ FILE \ erzeuge ein Forthfile mit dem Namen . +\ MAKE \ Erzeuge ein File mit und ordne +\ \ es dem aktuellen Forthfile zu. +\ MAKEFILE \ Erzeuge ein File mit CP/M und FORTH-Namen +\ . +\ INCLUDE \ Lade File mit Forthnamen ab Screen 1 +\ DOS RESET \ zum Wechsel von Disketten. (Oh! CP/M) + +\ *** Block No. 1, Hexblock 1 + +\ CP/M 2.2 File-Interface load-Screen UH 18Feb88 +OnlyForth + +\ 2 load \ view numbers for this file +\ 3 4 thru \ DOS File Functions +\ 5 $11 thru \ Forth File Functions +\ $12 $16 thru \ User Interface + +\ File source.fb \ Define already existing Files +\ File fileint.fb File startup.fbr + +\ ' (makeview Is makeview +\ ' remove-files Is custom-remove +\ ' file-r/w Is r/w +\ ' noop Is drvinit + \ include startup.fb \ load Standard System + +\ *** Block No. 3, Hexblock 3 + +\ File Control Blocks UH 18Feb88 +Dos definitions also +| : Fcbyte ( n len -- len' ) Create over c, + does> c@ + ; +&11 Constant filenamelen +0 2 | Fcbyte nextfile immediate + 1 Fcbyte drive ' drive | Alias >dosfcb + filenamelen 3 - Fcbyte filename + 3 Fcbyte extension + &21 + \ ex, s1, s2, rc, d0, ... dn, cr + 2 Fcbyte record \ r0, r1 + 1+ \ r2 + 2 Fcbyte opened + 2 Fcbyte fileno + 2 Fcbyte filesize \ in 128-Byte-Records + 4 Fcbyte position +Constant b/fcb + +\ *** Block No. 4, Hexblock 4 + +\ dos primitives UH 10Oct87 + +' 2- | Alias body> ' 2- | Alias dosfcb> + +: drive! ( drv -- ) $0E bdos ; +: search0 ( dosfcb -- dir ) $11 bdosa ; +: searchnext ( dosfcb -- dir ) $12 bdosa ; +: createfile ( dosfcb -- f ) $16 bdosa dos-error? ; +: size ( dos -- size ) dup $23 bdos dosfcb> record @ ; +: drive@ ( -- drv ) 0 $19 bdosa ; +: killfile ( dosfcb -- ) $13 bdos ; + + + +\ *** Block No. 5, Hexblock 5 + +\ File sizes UH 05Oct87 + +: (capacity ( fcb -- n ) \ filecapacity in blocks + filesize @ rec/blk u/mod swap 0= ?exit 1+ ; + +: in-range ( block fcb -- ) + (capacity u< not Abort" beyond capacity!" ; + +Forth definitions + +: capacity ( -- n ) isfile@ (capacity ; + +Dos definitions + +\ *** Block No. 6, Hexblock 6 + +\ (open UH 18Feb88 + +: (open ( fcb -- ) + dup opened @ IF drop exit THEN dup position 0. rot 2! + dup >dosfcb openfile Abort" not found!" dup opened on + dup >dosfcb size swap filesize ! ; + +: (make ( fcb -- ) + dup >dosfcb killfile + dup >dosfcb createfile Abort" directory full!" + dup position 0. rot 2! + dup filesize off opened on offset off ; + +\ *** Block No. 7, Hexblock 7 + +\ Print Filenames UH 10Oct87 + +: .file ( fcb -- ) 0 case? IF ." DIRECT" exit THEN + fcb dosfcb> case? IF ." DEFAULT" exit THEN + body> >name .name ; + +: .drive ( fcb -- ) drive c@ ?dup 0=exit + [ Ascii A 1- ] Literal + emit Ascii : emit ; + +: .dosfile ( fcb -- ) dup filename 8 -trailing type + Ascii . emit extension 3 type ; + + + + + + +\ *** Block No. 8, Hexblock 8 + +\ Print Filenames UH 10Oct87 + +: tab ( -- ) col &59 > IF cr exit THEN + &20 col &20 mod - 0 max spaces ; + +: .fcb ( fcb -- ) dup fileno @ 3 u.r tab + dup .file tab dup .drive dup .dosfile + tab dup opened @ IF ." opened" ELSE ." closed" THEN + 3 spaces base push decimal (capacity 3 u.r ." kB" ; + + + + + + + + +\ *** Block No. 9, Hexblock 9 + +\ Filenames UH 05Oct87 + +: !name ( addr len fcb -- ) + dup >r filename filenamelen bl fill + over 1+ c@ Ascii : = + IF over c@ [ Ascii A 1- ] Literal - >r 2 /string r> + ELSE 0 THEN r@ drive c! r> dup filename 2swap + filenamelen 1+ min bounds + ?DO I c@ Ascii . = + IF drop dup extension ELSE I c@ over c! 1+ THEN + LOOP 2drop ; + +: !fcb ( fcb -- ) dup opened off name count rot !name ; + + + + +\ *** Block No. 10, Hexblock a + +\ Print Directory UH 18Nov87 + +| Create dirbuf b/rec allot dirbuf b/rec erase +| Create fcb0 b/fcb allot fcb0 b/fcb erase + +| : wildchard? ( f c -- f' ) Ascii * = IF drop Ascii ? THEN ; +| : (expand ( addr len -- ) false -rot bounds + ?DO I c@ wildchard? dup ?dup IF I c! THEN LOOP drop ; +| : expand ( fcb -- ) \ expand * to ??? + dup filename 8 (expand extension 3 (expand ; + +: (dir ( addr len -- ) + fcb0 !name fcb0 expand dirbuf dma! fcb0 >dosfcb search0 + BEGIN dup dos-error? not + WHILE $20 * dirbuf + dosfcb> tab .dosfile + fcb0 >dosfcb searchnext stop? UNTIL drop ; + +\ *** Block No. 11, Hexblock b + +\ File List UH 10Oct87 + +User file-link file-link off + +| : #file ( -- n ) file-link @ dup IF fileno c@ THEN 1+ ; + + +Forth definitions + +: forthfiles ( -- ) + file-link @ + BEGIN dup WHILE cr dup .fcb @ stop? UNTIL drop ; + +Dos definitions + + + +\ *** Block No. 12, Hexblock c + +\ Close a file UH 10Oct87 + +Defer flushfile ' noop is flushfile + +: (close ( fcb -- ) \ close file in fcb + dup flushfile + dup opened dup @ 0= IF 2drop exit THEN off + >dosfcb closefile Abort" not found!" ; + + +\ *** Block No. 13, Hexblock d + +\ Create fcbs UH 10Oct87 + +: !files ( fcb -- ) dup isfile ! fromfile ! ; + +' r@ | Alias newfcb + +Forth definitions + +: File ( -- ) + Create here >r b/fcb allot newfcb b/fcb erase + last @ count $1F and newfcb !name + #file newfcb fileno ! + file-link @ newfcb nextfile ! r> file-link ! + Does> !files ; + +: direct 0 !files ; + +\ *** Block No. 14, Hexblock e + +\ flush buffers & misc. UH 10Oct87 UH 28Nov87 +Dos definitions + +: save-files ( -- ) file-link BEGIN @ ?dup WHILE + dup opened @ IF dup >dosfcb closefile drop THEN REPEAT ; + +' save-files Is save-dos-buffers + +\ : close-files ( -- ) file-link +\ BEGIN @ ?dup WHILE dup (close REPEAT ; + +Forth definitions + +: file? isfile@ .file ; \ print current file + +\ *** Block No. 16, Hexblock 10 + +\ FORGETing files UH 10Oct87 + +| : 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 direct THEN + fromfile @ remove? nip IF fromfile off THEN + file-link + BEGIN @ ?dup WHILE remove? IF dup (close THEN REPEAT + file-link remove ; + + + + + +\ *** Block No. 18, Hexblock 12 + +\ File Interface User words UH 11Oct87 + +| : same ( addr -- ) >in ! ; +: open isfile@ (open offset off ; +: close isfile@ (close ; +: assign close isfile@ !fcb open ; +: make isfile@ dup !fcb (make ; + +| : isfile? ( addr -- addr f ) \ is adr a fcb? + file-link BEGIN @ dup 0=exit 2dup body> = UNTIL drop true ; + +: use >in @ name find \ create a fcb if not present + IF isfile? IF execute drop exit THEN THEN drop + dup same File same ' execute open ; + + + +\ *** Block No. 19, Hexblock 13 + +\ File Interface User words UH 25May88 + +: makefile >in @ File dup same ' execute same make ; +: emptyfile isfile@ >dosfcb createfile ; + +: from isfile push use ; + +: include ( -- ) + increc-offset push isfile push fromfile push + use cr file? + include-isfile + incfile @ + IF increc @ incfile @ cr+ex! + incfile @ increadrec Abort" error re-reading after include" + THEN ; + +: eof ( -- f ) isfile@ dup filesize @ swap record @ = ; + +: files " *.*" count (dir ; +: files" Ascii " word count 2dup upper (dir ; + +' files Alias dir ' files" Alias dir" + +\ *** Block No. 20, Hexblock 14 + +\ extend Files UH 20Nov87 + +| : >fileend isfile@ >dosfcb size drop ; + +: Drive: ( n -- n' ) dup Constant 1+ Does> @ drive! ; +0 Drive: a: Drive: b: Drive: c: Drive: d: +5 + Drive: j: drop + +\ *** Block No. 21, Hexblock 15 + +\ save memory-image as disk-file UH 29Nov86 + +Forth definitions + +: savefile ( from count -- ) \ filename + isfile push makefile bounds + ?DO I dma! isfile@ >dosfcb write-seq Abort" disk full!" + b/rec +LOOP close ; + +' remove-files Is custom-remove +' noop Is drvinit diff --git a/8080/CPM/cpmfiles/tc-base.com b/8080/CPM/cpmfiles/tc-base.com index 74d00ac49cae2e3b2a05d568d53fc162ee4835be..d3af40c4bbea66d314eca4ef94d5ec65f7d79b5d 100644 GIT binary patch delta 1212 zcmZ8gT}&KR6uvwEJHW7OQOdN1SpqB}8DL>0Rk5-xGcepcGcY?KR%)_^rNyk&EEwt& z_+lT#q-8Yz1g(MCW=%|ljccrlPbQ_N8pDhB!6=5T4?e)6M)U>mU3k$+Zf3r7zH`pK z-~DFsmT&QW-}RGKMH>JSG{%!1+4|q23OElQfj1&Q-RNO+0pAx@)Sq_ln}>g9ncwZZ zc5eMtr=OySyh1}8b#RcYZtNAP&+Xi^>I5yp$c4yCBonz#g}K)v-u?DBg@(vMdm+-% zk(-X3rl?P&xoe%R74& zlEib+>$jR{X&!nnT1^Ym2av;~G+TFT@KL0Dkc+zxQqLD<8N(kStJz4$ZMWbaA7C7N;l%Le!U}lQC^5>R`Mb7;E*&0OkN(tbH~2s?*nW*OqW&iGiX#1X$^H(@PJj)YqoBezv8Dl~zpd!g2a9 zla>B9xe_|(*4)NWuz2D+e9d`zC$P$x!ByrK7iNRjDx-6h<*~z|1p@BSuTk8pKRJTTl#Jxkpeb1^m_O)tQ)`I5b_XsvPkUz1!_!2kdN delta 2190 zcmZ8ieQX=$8Gm#4-iI$oeQrYIxU{v?#IXX`CT*s)Sx4hIcg4Q*z3012Lur7fC4sQ2 zlL8glq{*!`iGR8Yddm3F)>MuNiY9~_3l|l^h7cl14TVnYgvOMCLbQoVIFTwI8Sr({gv2bt)1LuWruKIbU6|o#kX=Ltn&s&n2|rrg(xU%rA+|-Iu<}~&)9vTop^v}06rA|rbSWSmKR zS~Vvz@(Du#6Q-tnmDp)@L>NoFU#a+y*YVy?%c$ZMsAS&w~Uu=2YGn@WS9w~P_tYADKmSpV+hmyOTxq(Lox zYGA+|uEds&_aI?b{*S?>?DP?>QjE+1S9d!bM3!QN`$a zO(If=qsmFZX!$JoTma1tZ1ff=8(`}p6QRHKi-8oY~?7!jt8#(co$Wc-p@!V{52 zNPQE`%Re&(NFYOope!Ep zam`#~&v#R<6aZTu&9AY4_$~wJCb8~=rqahxi%;@xxG@lHr>ZDgA?jP;ce%?e>&KA0C$+Jm;1ffiE5iAWV1Mh(qC?k7bW z-F0cuUdGommOS>QSOo@Wvz@kJfsCi&RTvnm;9lK9-uobJO_r(^F&dQ%{UdJr$pP{LD|L#vkidPuOphu#k}M z)Tkoen(z5rpa)4>#jLAAysP>`(x*>`sk`z%i5~J3B>kNd{!7wJwwJ*{kH#){PstB z3Us0tgzbqn_BL6HkEd>vMf`Q)0$X&x{?QzJ#DO(aUU2A4(KVobUW(uBSc-oEzuNu1 z>d2v29op@Lv>##UGkrfpHv8|NwAwSu9Y;z9^(qY0U13F283P-mhwA)I^bQa Ig*G|g05}CeO8@`> diff --git a/8080/CPM/cpmfiles/test-blk.fth b/8080/CPM/cpmfiles/test-blk.fth index 0171163..66f9810 100644 --- a/8080/CPM/cpmfiles/test-blk.fth +++ b/8080/CPM/cpmfiles/test-blk.fth @@ -1,5 +1,5 @@ -include log2file.fb +include logfile.fth ' noop Is .status logopen diff --git a/8080/CPM/cpmfiles/test-krn.fth b/8080/CPM/cpmfiles/test-krn.fth new file mode 100644 index 0000000..60373be --- /dev/null +++ b/8080/CPM/cpmfiles/test-krn.fth @@ -0,0 +1,22 @@ + +include log2file.fb +logopen + +include ans-shim.fth +: \vf [compile] \ ; immediate + +include prelim.fth +include tester.fth + +\ 1 verbose ! +include core.fr +include coreplus.fth + +include util.fth +include errorrep.fth + +include coreext.fth + +REPORT-ERRORS + +logclose diff --git a/8080/CPM/cpmfiles/test-min.fth b/8080/CPM/cpmfiles/test-min.fth index 8e66150..9e6ff59 100644 --- a/8080/CPM/cpmfiles/test-min.fth +++ b/8080/CPM/cpmfiles/test-min.fth @@ -1,5 +1,5 @@ -include log2file.fb +include logfile.fth logopen include ans-shim.fth diff --git a/8080/CPM/cpmfiles/test-std.fth b/8080/CPM/cpmfiles/test-std.fth index dd1818a..2606c25 100644 --- a/8080/CPM/cpmfiles/test-std.fth +++ b/8080/CPM/cpmfiles/test-std.fth @@ -3,7 +3,7 @@ \ blk @ ?dup IF ." Blk " u. ?cr exit THEN \ incfile @ IF tib #tib @ cr type THEN ; -include log2file.fb +include logfile.fth logopen include ans-shim.fth diff --git a/8080/CPM/cpmfiles/testprep.fth b/8080/CPM/cpmfiles/testprep.fth deleted file mode 100644 index d438799..0000000 --- a/8080/CPM/cpmfiles/testprep.fth +++ /dev/null @@ -1,38 +0,0 @@ - -\ *** Block No. 0, Hexblock 0 - -\ include file to bundle what test-*.fth need phz 30jan22 -\ on top of kernel.com - - - - - - - - - - - - - - - -\ *** Block No. 1, Hexblock 1 - -\ loadscreen to prepare kernel.com for test-*.fth phz 30jan22 - - include extend.fb - include multi.vid - include dos.fb - include include.fb - include log2file.fb - - - - - - - - - diff --git a/8080/CPM/cpmfiles/v4th.com b/8080/CPM/cpmfiles/v4th.com index af77fffe6bcec116d26dd7622bbb97ff4baf17e3..be6bbe18ffda43e43a613aa7e54150ec65109e55 100644 GIT binary patch delta 8798 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 Pk?+d+_=56qpymGoe8l30 literal 13440 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 OLvASH-r@i9-+u!Kf`t13 diff --git a/8080/CPM/cpmfiles/v4th.fth b/8080/CPM/cpmfiles/v4th.fth index 88959c4..66ce9c5 100644 --- a/8080/CPM/cpmfiles/v4th.fth +++ b/8080/CPM/cpmfiles/v4th.fth @@ -1,13 +1,13 @@ Onlyforth - $9000 displace ! + $8000 displace ! Target definitions $100 here! include vf-core.fth include vf-io.fth - include vf-bufs.fth include vf-sys.fth include vf-bdos.fth + include vf-file.fth include vf-end.fth cr .( unresolved: ) .unresolved ( ' .blk is .status ) diff --git a/8080/CPM/cpmfiles/v4thblk.com b/8080/CPM/cpmfiles/v4thblk.com new file mode 100644 index 0000000000000000000000000000000000000000..2e7cf411b90d72295d49293e12af1569517c79a7 GIT binary patch literal 14464 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 ' 2+ | Alias >dosfcb -: dos-error? ( n -- f ) $FF = ; +: dos-error? ( n -- f ) 0<> ; $5C Constant fcb : reset ( -- ) 0 &13 bdos ; : openfile ( fcb -- f ) &15 bdosa dos-error? ; : closefile ( fcb -- f ) &16 bdosa dos-error? ; +: read-seq ( fcb -- f ) $14 bdosa dos-error? ; +: write-seq ( fcb -- f ) $15 bdosa dos-error? ; : dma! ( dma -- ) &26 bdos ; : rec@ ( fcb -- f ) &33 bdosa ; : rec! ( fcb -- f ) &34 bdosa ; @@ -97,7 +99,9 @@ $5C Constant fcb \ Default Disk Interface: open and close 20Nov87 -Target Dos also Defer drvinit Dos definitions +Target Dos also Defer drvinit + +Dos definitions | Variable opened : default ( -- ) opened off @@ -106,35 +110,20 @@ Target Dos also Defer drvinit Dos definitions openfile Abort" default file not found!" opened on ; ' default Is drvinit +Defer save-dos-buffers + : close-default ( -- ) opened @ not ?exit fcb closefile Abort" can't close default-file!" ; ' close-default Is save-dos-buffers -\ *** Block No. 125, Hexblock 7d - -\ Default Disk Interface: read/write 14Feb88 - -Target Dos also - -| : rec# ( 'dosfcb -- 'rec# ) &33 + ; - -: (r/w ( adr blk file r/wf -- flag ) >r - dup 0= Abort" no Direct Disk IO supported! " >dosfcb - swap rec/blk * over rec# 0 over 2+ c! ! - r> rot b/blk bounds - DO I dma! 2dup IF rec@ drop - ELSE rec! IF 2drop true endloop exit THEN THEN - over rec# 0 over 2+ c! 1 swap +! - b/rec +LOOP 2drop false ; - -' (r/w Is r/w - \ *** Block No. 126, Hexblock 7e \ Postlude 20Nov87 +Target Dos also + Defer postlude | : (bye ( -- ) postlude 0 0 bdos ; diff --git a/8080/CPM/cpmfiles/vf-bufs.fth b/8080/CPM/cpmfiles/vf-bufs.fth index 8105105..6274848 100644 --- a/8080/CPM/cpmfiles/vf-bufs.fth +++ b/8080/CPM/cpmfiles/vf-bufs.fth @@ -2,12 +2,9 @@ \ buffer mechanism 20Oct86 07Oct87 -User isfile 0 isfile ! \ addr of file control block -Variable fromfile 0 fromfile ! Variable prev 0 prev ! \ Listhead | Variable buffers 0 buffers ! \ Semaphor $408 Constant b/buf \ physikalische Groesse -$400 Constant b/blk \ \\ Struktur eines Buffers: 0 : link \ 2 : file \ 4 : blocknummer @@ -97,7 +94,7 @@ Defer r/w \ backup emptybuf readblk 20Oct86 -| : backup ( bufaddr -- ) dup 6+ @ 0< + : backup ( bufaddr -- ) dup 6+ @ 0< IF 2+ dup @ 1+ \ buffer empty if file = -1 IF input push output push standardi/o BEGIN dup 6+ over 2+ @ 2 pick @ 0 r/w @@ -141,13 +138,16 @@ Defer r/w : (block ( blk file -- addr ) BEGIN (core? take readblk mark REPEAT ; -Code isfile@ ( -- addr ) user' isfile D lxi - UP lhld D dad fetch jmp end-code - : buffer ( blk -- addr ) isfile@ (buffer ; : block ( blk -- addr ) isfile@ (block ; +: (blk-source ( -- addr len) + blk @ ?dup IF loadfile @ (block b/blk exit THEN + tib #tib @ ; + +' (blk-source IS source + \ : isfile@ ( -- addr ) isfile @ ; \ *** Block No. 102, Hexblock 66 @@ -156,11 +156,10 @@ Code isfile@ ( -- addr ) user' isfile D lxi : update $80 prev @ 6+ 1+ ( Byte-Order! ) c! ; -Defer save-dos-buffers - -: save-buffers ( -- ) buffers lock +: (save-buffers ( -- ) buffers lock BEGIN updates? ?dup WHILE backup REPEAT save-dos-buffers buffers unlock ; +' (save-buffers IS save-buffers : empty-buffers ( -- ) buffers lock prev BEGIN @ ?dup WHILE dup emptybuf REPEAT buffers unlock ; @@ -172,7 +171,7 @@ Defer save-dos-buffers \ *** Block No. 103, Hexblock 67 \ Allocating buffers 10Oct87 -$10000 Constant limit Variable first +Variable first : allotbuffer ( -- ) first @ r0 @ - b/buf 2+ u< ?exit @@ -186,5 +185,30 @@ $10000 Constant limit Variable first : all-buffers BEGIN first @ allotbuffer first @ = UNTIL ; -| : init-buffers prev off limit first ! all-buffers ; +| : (init-buffers prev off limit first ! all-buffers flush ; +' (init-buffers IS init-buffers +\ *** Block No. 125, Hexblock 7d + +\ Default Disk Interface: read/write 14Feb88 + +Target Dos also + +| : rec# ( 'dosfcb -- 'rec# ) &33 + ; + +: (r/w ( adr blk file r/wf -- flag ) >r + dup 0= Abort" no Direct Disk IO supported! " >dosfcb + swap rec/blk * over rec# 0 over 2+ c! ! + r> rot b/blk bounds + DO I dma! 2dup IF rec@ drop + ELSE rec! IF 2drop true endloop exit THEN THEN + over rec# 0 over 2+ c! 1 swap +! + b/rec +LOOP 2drop false ; + +' (r/w Is r/w + +: list ( blk -- ) + scr ! ." Scr " scr @ u. + l/s 0 DO + cr I 2 .r space scr @ block I c/l * + c/l -trailing type + LOOP cr ; diff --git a/8080/CPM/cpmfiles/vf-core.fth b/8080/CPM/cpmfiles/vf-core.fth index ba54d5d..686e8b9 100644 --- a/8080/CPM/cpmfiles/vf-core.fth +++ b/8080/CPM/cpmfiles/vf-core.fth @@ -1010,10 +1010,11 @@ Code (word ( char adr0 len0 -- addr ) \ source word parse name 20Oct86UH 25Jan88 -Variable loadfile +defer source -: source ( -- addr len ) blk @ ?dup - IF loadfile @ (block b/blk exit THEN tib #tib @ ; +: (source ( -- addr len) tib #tib @ ; + +' (source IS source : word ( char -- addr ) source (word ; @@ -1054,7 +1055,9 @@ Code "lit RP lhld M E mov H inx M D mov H dcx : ( ascii ) parse 2drop ; immediate : .( ascii ) parse type ; immediate -: \ >in @ negate c/l mod >in +! ; immediate +: \ blk @ IF >in @ negate c/l mod >in +! + ELSE #tib @ >in ! THEN ; immediate + : \\ b/blk >in ! ; immediate : \needs name find nip 0=exit [compile] \ ; diff --git a/8080/CPM/cpmfiles/vf-file.fth b/8080/CPM/cpmfiles/vf-file.fth index 16729d6..f31925c 100644 --- a/8080/CPM/cpmfiles/vf-file.fth +++ b/8080/CPM/cpmfiles/vf-file.fth @@ -1,52 +1,13 @@ -\ *** Block No. 0, Hexblock 0 - -\ include for stream sources for cp/m phz 30aug23 - -cr .( order) order cr - - - - - - - - - - - - - - -\ *** Block No. 1, Hexblock 1 - -\ load screen phz 02sep23 - - \ onlyforth dos also forth definitions - - : idos-error? ( n -- f ) 0<> ; - : iread-seq ( dosfcb -- f ) $14 bdosa idos-error? ; : cr+ex@ ( fcb -- cr+256*ex ) dup &34 + c@ swap &14 + c@ $100 * + ; : cr+ex! ( cr+256*ex fcb -- ) >r $100 u/mod r@ &14 + c! r> &34 + c! ; - \ 1 7 +thru +| variable tibeof tibeof off +| $1a constant ctrl-z - - - - -\ *** Block No. 2, Hexblock 2 - -\ fib /fib #fib eolf? phz 09okt24 - - \ context @ dos also context ! - \ $50 constant /tib - variable tibeof tibeof off - $1a constant ctrl-z - - : eolf? ( c -- f ) +| : eolf? ( c -- f ) \ f=-1: not yet eol; store c and continue \ f=0: eol but not yet eof; return line and flag continue \ f=1: eof: return line and flag eof @@ -54,32 +15,22 @@ cr .( order) order cr dup #lf = IF drop 0 exit THEN ctrl-z = IF tibeof on 1 ELSE -1 THEN ; - - -\ *** Block No. 3, Hexblock 3 - -\ incfile incpos inc-fgetc phz 02sep23 - variable incfile variable increc - variable rec-offset - $80 constant dmabuf | $ff constant dmabuf-last + variable increc-offset +| $80 constant dmabuf +| $ff constant dmabuf-last - : readrec ( fcb -- f ) + : increadrec ( fcb -- f ) dup cr+ex@ increc ! - rec-offset off dmabuf dma! drive iread-seq ; + increc-offset off dmabuf dma! >dosfcb read-seq ; - : inc-fgetc ( -- c ) - rec-offset @ b/rec u< 0= - IF incfile @ readrec IF ctrl-z exit THEN THEN - rec-offset @ dmabuf + c@ 1 rec-offset +! ; +| : inc-fgetc ( -- c ) + increc-offset @ b/rec u< 0= + IF incfile @ increadrec IF ctrl-z exit THEN THEN + increc-offset @ dmabuf + c@ 1 increc-offset +! ; - -\ *** Block No. 4, Hexblock 4 - -\ freadline probe-for-fb phz 25aug23 - - : freadline ( -- eof ) +| : freadline ( -- eof ) tib /tib bounds DO inc-fgetc dup eolf? under 0< IF I c! ELSE drop THEN 0< 0= IF I tib - #tib ! ENDLOOP tibeof @ exit THEN @@ -92,80 +43,28 @@ cr .( order) order cr dmabuf BEGIN dup c@ #lf = IF drop 0 exit THEN 1+ dup dmabuf-last u> UNTIL drop 1 ; +| $50 constant /stash +| create stash[ /stash allot here | constant ]stash +| variable stash> stash[ stash> ! +| : clear-tibstash stash[ stash> ! ; - -\ *** Block No. 5, Hexblock 5 - -\ save/restoretib phz 06okt22 - - $50 constant /stash - create stash[ /stash allot here constant ]stash - variable stash> stash[ stash> ! - - : savetib ( -- n ) +| : savetib ( -- n ) #tib @ >in @ - dup stash> @ + ]stash u> abort" tib stash overflow" >r tib >in @ + stash> @ r@ cmove r@ stash> +! r> ; - : restoretib ( n -- ) +| : restoretib ( n -- ) dup >r negate stash> +! stash> @ tib r@ cmove r> #tib ! >in off ; - -\ *** Block No. 6, Hexblock 6 - -\ interpret-via-tib inner-include phz 02sep23 - - : interpret-via-tib +| : interpret-via-tib BEGIN freadline >r .status >in off interpret r> UNTIL ; - : include-inner ( -- ) + : include-isfile ( -- ) increc push 0 isfile@ cr+ex! - isfile@ readrec Abort" can't read start of file" + isfile@ increadrec Abort" can't read start of file" probe-for-fb IF 1 load exit THEN incfile push isfile@ incfile ! - savetib >r interpret-via-tib close r> restoretib ; - - - - - - -\ *** Block No. 7, Hexblock 7 - -\ include phz 02sep23 - - : include ( -- ) - rec-offset push isfile push fromfile push - use cr file? - include-inner - incfile @ - IF increc @ incfile @ cr+ex! - incfile @ readrec Abort" error re-reading after include" - THEN ; - - - - - - - -\ *** Block No. 8, Hexblock 8 - -\ \ phz 02sep23 - - : (stashquit stash[ stash> ! incfile off increc off - (quit ; - : stashrestore ['] (stashquit IS 'quit ; - ' stashrestore IS 'restart - - : \ blk @ IF >in @ negate c/l mod >in +! - ELSE #tib @ >in ! THEN ; immediate - -\ : \needs have 0=exit -\ blk @ IF >in @ negate c/l mod >in +! -\ ELSE #tib @ >in ! THEN ; - - - + savetib >r interpret-via-tib r> restoretib + incfile @ 2+ closefile Abort" error closing file" ; diff --git a/8080/CPM/cpmfiles/vf-io.fth b/8080/CPM/cpmfiles/vf-io.fth index 61860ee..b5c6d83 100644 --- a/8080/CPM/cpmfiles/vf-io.fth +++ b/8080/CPM/cpmfiles/vf-io.fth @@ -8,6 +8,7 @@ Defer .status ' noop Is .status : push ( addr -- ) r> swap dup >r @ >r pull >r >r ; restrict +Variable loadfile : (load ( blk offset -- ) isfile push loadfile push fromfile push blk push >in push @@ -45,7 +46,7 @@ Defer .status ' noop Is .status Defer prompt ' (prompt Is prompt -: (quit BEGIN prompt query interpret REPEAT ; +: (quit clear-tibstash BEGIN prompt query interpret REPEAT ; Defer 'quit ' (quit Is 'quit : quit r0 @ rp! level off [compile] [ 'quit ; @@ -159,11 +160,6 @@ $20 Constant bl $40 Constant c/l \ Screen line length $10 Constant l/s \ lines per screen -: list ( blk -- ) - scr ! ." Scr " scr @ u. - l/s 0 DO - cr I 2 .r space scr @ block I c/l * + c/l -trailing type - LOOP cr ; @@ -187,3 +183,18 @@ Code pause >next here 2- ! end-code Label wake H pop H dcx UP shld 6 D lxi D dad M A mov H inx M H mov A L mov sphl H pop RP shld IP pop Next end-code + +\ file related definitions moved here from vf-bufs.fth + +User isfile 0 isfile ! \ addr of file control block +Variable fromfile 0 fromfile ! + +Code isfile@ ( -- addr ) user' isfile D lxi + UP lhld D dad fetch jmp end-code + +$FF00 Constant limit + +Defer save-buffers ' noop IS save-buffers +Defer init-buffers ' noop IS init-buffers + +$400 Constant b/blk diff --git a/8080/CPM/cpmfiles/vf-sys.fth b/8080/CPM/cpmfiles/vf-sys.fth index 4686808..8c9ce96 100644 --- a/8080/CPM/cpmfiles/vf-sys.fth +++ b/8080/CPM/cpmfiles/vf-sys.fth @@ -82,7 +82,8 @@ Defer custom-remove ' noop Is custom-remove voc-link @ BEGIN dup 4- @ over 2- ! @ ?dup 0= UNTIL up@ origin $100 cmove ; -: bye flush empty (bye ; +: bye save-buffers (bye ; +\ : bye flush empty (bye ; | : end? key #cr = IF true rdrop THEN ; @@ -146,7 +147,7 @@ Defer 'cold ' noop Is 'cold | : (cold origin up@ $100 cmove $80 count $50 umin >r tib r@ move r> #tib ! >in off blk off - init-vocabularys init-buffers flush 'cold + init-vocabularys init-buffers 'cold Onlyforth page &24 spaces logo count type cr (restart ;