mirror of
https://github.com/irmen/prog8.git
synced 2024-07-05 22:29:04 +00:00
added diskio.list_files(). ci-viewer now loads all *.ci files it finds.
This commit is contained in:
parent
4f6c45c86c
commit
34babfb5de
@ -10,11 +10,11 @@ diskio {
|
|||||||
; -- Prints the directory contents of disk drive 8-11 to the screen. Returns success.
|
; -- Prints the directory contents of disk drive 8-11 to the screen. Returns success.
|
||||||
|
|
||||||
c64.SETNAM(1, "$")
|
c64.SETNAM(1, "$")
|
||||||
c64.SETLFS(1, drivenumber, 0)
|
c64.SETLFS(13, drivenumber, 0)
|
||||||
void c64.OPEN() ; open 1,8,0,"$"
|
void c64.OPEN() ; open 13,8,0,"$"
|
||||||
if_cs
|
if_cs
|
||||||
goto io_error
|
goto io_error
|
||||||
void c64.CHKIN(1) ; use #1 as input channel
|
void c64.CHKIN(13) ; use #13 as input channel
|
||||||
if_cs
|
if_cs
|
||||||
goto io_error
|
goto io_error
|
||||||
|
|
||||||
@ -39,14 +39,14 @@ diskio {
|
|||||||
void c64.CHRIN()
|
void c64.CHRIN()
|
||||||
status = c64.READST()
|
status = c64.READST()
|
||||||
void c64.STOP()
|
void c64.STOP()
|
||||||
if_nz
|
if_z
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
io_error:
|
io_error:
|
||||||
status = c64.READST()
|
status = c64.READST()
|
||||||
c64.CLRCHN() ; restore default i/o devices
|
c64.CLRCHN() ; restore default i/o devices
|
||||||
c64.CLOSE(1)
|
c64.CLOSE(13)
|
||||||
|
|
||||||
if status and status != 64 { ; 64=end of file
|
if status and status != 64 { ; 64=end of file
|
||||||
txt.print("\ni/o error, status: ")
|
txt.print("\ni/o error, status: ")
|
||||||
@ -66,13 +66,41 @@ io_error:
|
|||||||
uword list_pattern
|
uword list_pattern
|
||||||
uword list_blocks
|
uword list_blocks
|
||||||
ubyte iteration_in_progress = false
|
ubyte iteration_in_progress = false
|
||||||
str list_filename = "????????????????"
|
str list_filename = "?" * 32
|
||||||
|
|
||||||
|
|
||||||
|
; ----- get a list of files (uses iteration functions internally -----
|
||||||
|
|
||||||
|
sub list_files(ubyte drivenumber, uword pattern, ubyte suffixmatch, uword name_ptrs, ubyte max_names) -> ubyte {
|
||||||
|
; -- fill the array 'name_ptrs' with (pointers to) the names of the files requested.
|
||||||
|
ubyte[256] names_buffer
|
||||||
|
uword buf_ptr = &names_buffer
|
||||||
|
ubyte files_found = 0
|
||||||
|
if lf_start_list(drivenumber, pattern, suffixmatch) {
|
||||||
|
while lf_next_entry() {
|
||||||
|
@(name_ptrs) = lsb(buf_ptr)
|
||||||
|
name_ptrs++
|
||||||
|
@(name_ptrs) = msb(buf_ptr)
|
||||||
|
name_ptrs++
|
||||||
|
; ubyte length = strcpy(diskio.list_filename, buf_ptr)
|
||||||
|
memcopy(diskio.list_filename, buf_ptr, strlen(list_filename)+1) ; todo replace with strcpy()
|
||||||
|
buf_ptr += strlen(list_filename)+1
|
||||||
|
files_found++
|
||||||
|
if buf_ptr - &names_buffer > 256-18
|
||||||
|
break
|
||||||
|
if files_found == max_names
|
||||||
|
break
|
||||||
|
}
|
||||||
|
lf_end_list()
|
||||||
|
}
|
||||||
|
return files_found
|
||||||
|
}
|
||||||
|
|
||||||
; ----- iterative file lister functions -----
|
; ----- iterative file lister functions -----
|
||||||
|
|
||||||
sub lf_start_list(ubyte drivenumber, uword pattern, ubyte suffixmatch) -> ubyte {
|
sub lf_start_list(ubyte drivenumber, uword pattern, ubyte suffixmatch) -> ubyte {
|
||||||
; -- start an iterative file listing with optional prefix or suffix name matching.
|
; -- start an iterative file listing with optional prefix or suffix name matching.
|
||||||
|
; note: only a single iteration loop can be active at a time!
|
||||||
lf_end_list()
|
lf_end_list()
|
||||||
list_pattern = pattern
|
list_pattern = pattern
|
||||||
list_suffixmatch = suffixmatch
|
list_suffixmatch = suffixmatch
|
||||||
@ -84,11 +112,11 @@ io_error:
|
|||||||
list_pattern_size = strlen(pattern)
|
list_pattern_size = strlen(pattern)
|
||||||
|
|
||||||
c64.SETNAM(1, "$")
|
c64.SETNAM(1, "$")
|
||||||
c64.SETLFS(1, drivenumber, 0)
|
c64.SETLFS(12, drivenumber, 0)
|
||||||
void c64.OPEN() ; open 1,8,0,"$"
|
void c64.OPEN() ; open 12,8,0,"$"
|
||||||
if_cs
|
if_cs
|
||||||
goto io_error
|
goto io_error
|
||||||
void c64.CHKIN(1) ; use #1 as input channel
|
void c64.CHKIN(12) ; use #12 as input channel
|
||||||
if_cs
|
if_cs
|
||||||
goto io_error
|
goto io_error
|
||||||
|
|
||||||
@ -112,10 +140,16 @@ io_error:
|
|||||||
if not iteration_in_progress
|
if not iteration_in_progress
|
||||||
return false
|
return false
|
||||||
|
|
||||||
while not c64.READST() {
|
repeat {
|
||||||
|
void c64.CHKIN(12) ; use #12 as input channel again
|
||||||
|
|
||||||
uword nameptr = &list_filename
|
uword nameptr = &list_filename
|
||||||
ubyte blocks_lsb = c64.CHRIN()
|
ubyte blocks_lsb = c64.CHRIN()
|
||||||
ubyte blocks_msb = c64.CHRIN()
|
ubyte blocks_msb = c64.CHRIN()
|
||||||
|
|
||||||
|
if c64.READST()
|
||||||
|
goto close_end
|
||||||
|
|
||||||
list_blocks = mkword(blocks_msb, blocks_lsb)
|
list_blocks = mkword(blocks_msb, blocks_lsb)
|
||||||
|
|
||||||
; read until the filename starts after the first "
|
; read until the filename starts after the first "
|
||||||
@ -168,7 +202,7 @@ close_end:
|
|||||||
; -- end an iterative file listing session (close channels).
|
; -- end an iterative file listing session (close channels).
|
||||||
if iteration_in_progress {
|
if iteration_in_progress {
|
||||||
c64.CLRCHN()
|
c64.CLRCHN()
|
||||||
c64.CLOSE(1)
|
c64.CLOSE(12)
|
||||||
iteration_in_progress = false
|
iteration_in_progress = false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -177,6 +211,8 @@ close_end:
|
|||||||
; ----- iterative file loader functions -----
|
; ----- iterative file loader functions -----
|
||||||
|
|
||||||
sub f_open(ubyte drivenumber, uword filenameptr) -> ubyte {
|
sub f_open(ubyte drivenumber, uword filenameptr) -> ubyte {
|
||||||
|
; -- open a file for iterative reading with f_read
|
||||||
|
; note: only a single iteration loop can be active at a time!
|
||||||
f_close()
|
f_close()
|
||||||
|
|
||||||
c64.SETNAM(strlen(filenameptr), filenameptr)
|
c64.SETNAM(strlen(filenameptr), filenameptr)
|
||||||
@ -184,7 +220,7 @@ close_end:
|
|||||||
void c64.OPEN() ; open 11,8,0,"filename"
|
void c64.OPEN() ; open 11,8,0,"filename"
|
||||||
if_cc {
|
if_cc {
|
||||||
iteration_in_progress = true
|
iteration_in_progress = true
|
||||||
void c64.CHKIN(11) ; use #2 as input channel
|
void c64.CHKIN(11) ; use #11 as input channel
|
||||||
if_cc
|
if_cc
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
@ -197,6 +233,7 @@ close_end:
|
|||||||
return 0
|
return 0
|
||||||
|
|
||||||
uword actual = 0
|
uword actual = 0
|
||||||
|
void c64.CHKIN(11) ; use #11 as input channel again
|
||||||
repeat buffersize {
|
repeat buffersize {
|
||||||
ubyte data = c64.CHRIN()
|
ubyte data = c64.CHRIN()
|
||||||
@(bufferpointer) = data
|
@(bufferpointer) = data
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
TODO
|
TODO
|
||||||
====
|
====
|
||||||
|
|
||||||
|
- add strcpy()
|
||||||
- see if we can group some errors together for instance the (now single) errors about unidentified symbols
|
- see if we can group some errors together for instance the (now single) errors about unidentified symbols
|
||||||
- Cx16 target: support full-screen 640x480 and 320x240 graphics? That requires our own custom graphics routines though to draw lines.
|
- Cx16 target: support full-screen 640x480 and 320x240 graphics? That requires our own custom graphics routines though to draw lines.
|
||||||
- hoist all variable declarations up to the subroutine scope *before* even the constant folding takes place (to avoid undefined symbol errors when referring to a variable from another nested scope in the subroutine)
|
- hoist all variable declarations up to the subroutine scope *before* even the constant folding takes place (to avoid undefined symbol errors when referring to a variable from another nested scope in the subroutine)
|
||||||
|
@ -54,9 +54,20 @@ main {
|
|||||||
ubyte[256] buffer4 ; .. and some more to be able to store 1280=
|
ubyte[256] buffer4 ; .. and some more to be able to store 1280=
|
||||||
ubyte[256] buffer5 ; two 640 bytes worth of bitmap scanline data
|
ubyte[256] buffer5 ; two 640 bytes worth of bitmap scanline data
|
||||||
|
|
||||||
str filename = "trsi256.ci"
|
|
||||||
|
|
||||||
sub start() {
|
sub start() {
|
||||||
|
str[20] filename_ptrs
|
||||||
|
ubyte num_files = diskio.list_files(8, ".ci", true, &filename_ptrs, len(filename_ptrs))
|
||||||
|
while num_files {
|
||||||
|
num_files--
|
||||||
|
show_image(filename_ptrs[num_files])
|
||||||
|
}
|
||||||
|
|
||||||
|
repeat {
|
||||||
|
; endless loop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sub show_image(uword filename) {
|
||||||
ubyte read_success = false
|
ubyte read_success = false
|
||||||
uword bitmap_load_address = progend()
|
uword bitmap_load_address = progend()
|
||||||
; uword max_bitmap_size = $9eff - bitmap_load_address
|
; uword max_bitmap_size = $9eff - bitmap_load_address
|
||||||
@ -115,7 +126,7 @@ main {
|
|||||||
for y in 0 to lsb(height)-1 {
|
for y in 0 to lsb(height)-1 {
|
||||||
void diskio.f_read(buffer, scanline_size)
|
void diskio.f_read(buffer, scanline_size)
|
||||||
when bpp {
|
when bpp {
|
||||||
8 -> display_scanline_256c(buffer, scanline_size)
|
8 -> cx16.FB_set_pixels_from_buf(buffer, scanline_size) ; FB_set_pixels in rom v38 crashes with a size > 255 so we use our own replacement for now
|
||||||
4 -> display_scanline_16c(buffer, scanline_size)
|
4 -> display_scanline_16c(buffer, scanline_size)
|
||||||
2 -> display_scanline_4c(buffer, scanline_size)
|
2 -> display_scanline_4c(buffer, scanline_size)
|
||||||
1 -> display_scanline_2c(buffer, scanline_size)
|
1 -> display_scanline_2c(buffer, scanline_size)
|
||||||
@ -129,14 +140,10 @@ main {
|
|||||||
}
|
}
|
||||||
|
|
||||||
diskio.f_close()
|
diskio.f_close()
|
||||||
|
if not read_success
|
||||||
if not read_success {
|
|
||||||
txt.print("error!\n")
|
txt.print("error!\n")
|
||||||
}
|
else
|
||||||
}
|
txt.print("ok\n")
|
||||||
|
|
||||||
repeat {
|
|
||||||
; endless loop
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -171,11 +178,6 @@ main {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sub display_scanline_256c(uword dataptr, uword numbytes) {
|
|
||||||
; FB_set_pixels in rom v38 crashes with a size > 255 so we use our own replacement for now
|
|
||||||
cx16.FB_set_pixels_from_buf(dataptr, numbytes)
|
|
||||||
}
|
|
||||||
|
|
||||||
sub display_scanline_16c(uword dataptr, uword numbytes) {
|
sub display_scanline_16c(uword dataptr, uword numbytes) {
|
||||||
; TODO
|
; TODO
|
||||||
}
|
}
|
||||||
|
@ -6,6 +6,9 @@
|
|||||||
|
|
||||||
main {
|
main {
|
||||||
sub start() {
|
sub start() {
|
||||||
|
txt.print("showing the full directory of drive 8:\n")
|
||||||
|
diskio.directory(8)
|
||||||
|
txt.chrout('\n')
|
||||||
|
|
||||||
if diskio.lf_start_list(8, "cub", false) {
|
if diskio.lf_start_list(8, "cub", false) {
|
||||||
txt.print("\nfiles starting with 'cub':\n")
|
txt.print("\nfiles starting with 'cub':\n")
|
||||||
|
Loading…
Reference in New Issue
Block a user