summaryrefslogtreecommitdiff
path: root/arm9/source/core.c
diff options
context:
space:
mode:
authorBen Bridle <ben@derelict.engineering>2024-11-22 16:04:20 +1300
committerBen Bridle <ben@derelict.engineering>2024-11-22 16:15:11 +1300
commit4f8805869c469cb1b3685e03c3ea34d7654b5cb7 (patch)
treeefe555c1064b7a69738e3cf7fd107af7bdc0155f /arm9/source/core.c
parentfcbc3968bd95e4d19b37d9fa4bca51b1db8596ff (diff)
downloadbedrock-nds-4f8805869c469cb1b3685e03c3ea34d7654b5cb7.zip
Implement file device
There is still a small amount of work to be done on the file device: - Read file size only when requested - Hide '.' and '..' directories - Resize files
Diffstat (limited to 'arm9/source/core.c')
-rw-r--r--arm9/source/core.c41
1 files changed, 36 insertions, 5 deletions
diff --git a/arm9/source/core.c b/arm9/source/core.c
index 7136777..d792360 100644
--- a/arm9/source/core.c
+++ b/arm9/source/core.c
@@ -62,12 +62,9 @@ u8 dev_read(Bedrock *br, u8 port) {
case 0x03: return 0x00; // program memory size
case 0x04: return 0x00; // working stack size
case 0x05: return 0x00; // return stack size
- case 0x06: return 0xbc;
- case 0x07: return 0x00;
-
- // TODO: available devices
+ case 0x06: return devices_high();
+ case 0x07: return devices_low();
case 0x0A: return br->sys.wake;
-
// MEMORY DEVICE
case 0x10: return mem_read1(&br->mem);
case 0x11: return mem_read1(&br->mem);
@@ -137,6 +134,23 @@ u8 dev_read(Bedrock *br, u8 port) {
case 0x55: return LOW(br->scr.x);
case 0x56: return HIGH(br->scr.y);
case 0x57: return LOW(br->scr.y);
+// FILE DEVICE
+ case 0xA0: return BOOL(br->fs.open);
+ case 0xA1: return BOOL(br->fs.success);
+ case 0xA2: return pb_read(&br->fs.path);
+ case 0xA3: return BOOL(br->fs.is_dir);
+ case 0xA4: return fs_read_byte(&br->fs);
+ case 0xA5: return fs_read_byte(&br->fs);
+ case 0xA6: return pb_read(&br->fs.child_path);
+ case 0xA7: return BOOL(br->fs.child_is_dir);
+ case 0xA8: return H_HIGH(br->fs.pointer);
+ case 0xA9: return H_LOW(br->fs.pointer);
+ case 0xAA: return L_HIGH(br->fs.pointer);
+ case 0xAB: return L_LOW(br->fs.pointer);
+ case 0xAC: return H_HIGH(br->fs.length);
+ case 0xAD: return H_LOW(br->fs.length);
+ case 0xAE: return L_HIGH(br->fs.length);
+ case 0xAF: return L_LOW(br->fs.length);
default: return 0;
}
@@ -197,6 +211,23 @@ Signal dev_write(Bedrock *br, u8 port, u8 v) {
// LOCAL DEVICE
case 0x86: printf("%c", v); return 0;
case 0x87: printf("%c", v); return 0;
+// FILE DEVICE
+ case 0xA0: fs_push_entry(&br->fs,v); return 0;
+ case 0xA1: fs_push_action(&br->fs,v); return 0;
+ case 0xA2: pb_reset(&br->fs.path,v); return 0;
+ case 0xA3: fs_ascend(&br->fs); return 0;
+ case 0xA4: fs_write_byte(&br->fs,v); return 0;
+ case 0xA5: fs_write_byte(&br->fs,v); return 0;
+ case 0xA6: pb_reset(&br->fs.child_path,v); return 0;
+ case 0xA7: fs_descend(&br->fs); return 0;
+ case 0xA8: SET_H_HIGH(br->fs.pointer_write,v); return 0;
+ case 0xA9: SET_H_LOW(br->fs.pointer_write,v); return 0;
+ case 0xAA: SET_L_HIGH(br->fs.pointer_write,v); return 0;
+ case 0xAB: SET_L_LOW(br->fs.pointer_write,v); fs_seek(&br->fs); return 0;
+ case 0xAC: SET_H_HIGH(br->fs.length_write,v); return 0;
+ case 0xAD: SET_H_LOW(br->fs.length_write,v); return 0;
+ case 0xAE: SET_L_HIGH(br->fs.length_write,v); return 0;
+ case 0xAF: SET_L_LOW(br->fs.length_write,v); fs_resize(&br->fs); return 0;
default: return SIG_NONE;
}