62 lines
939 B
Forth
62 lines
939 B
Forth
: slash-count ( addr count -- addr num )
|
|
over swap ( addr0 addr count )
|
|
begin
|
|
over c@ [char] / <>
|
|
over 0 > and
|
|
while
|
|
1 /string
|
|
repeat
|
|
drop over -
|
|
;
|
|
|
|
\ Change directory
|
|
: cd-path
|
|
\ Check if count <= 0
|
|
dup 0 <=
|
|
if
|
|
spi_rootdir @
|
|
spi_currdir !
|
|
2drop exit
|
|
then
|
|
|
|
\ Save current directory on return stack
|
|
spi_currdir @ >r
|
|
|
|
\ Check if absolute path or relative path
|
|
over c@ [char] / =
|
|
if
|
|
spi_rootdir @
|
|
spi_currdir !
|
|
1 /string
|
|
then
|
|
|
|
\ Loop on directory list
|
|
begin
|
|
dup 0 >
|
|
while
|
|
2dup slash-count
|
|
dup 0=
|
|
if
|
|
." Unexpected /" cr
|
|
r> spi_currdir !
|
|
2drop 2drop exit
|
|
then
|
|
dup 1+ >r
|
|
0 open-file
|
|
if
|
|
drop
|
|
." Could not open file" cr
|
|
r> drop
|
|
r> spi_currdir !
|
|
2drop exit
|
|
then
|
|
file_sector0 @
|
|
spi_currdir !
|
|
close-file drop
|
|
r> /string
|
|
repeat
|
|
r> drop 2drop
|
|
;
|
|
|
|
: cd bl word count cd-path ;
|