Fixed Open/Close

This commit is contained in:
Kilian committed 2026-09-28 15:58:39 +02:00
1 parent 03518c4937
commit 566db4a550
10 files changed
+70 -31

No files matched your search

+1 -1
View File
@@ -27,7 +27,7 @@ target_sources(${CMAKE_PROJECT_NAME} PRIVATE
src/ram.c src/ram.c
src/cpu.c src/cpu.c
src/rom.c src/rom.c
src/memory.c src/mem.c
src/file.c src/file.c
src/screen.c src/screen.c
) )
+4
View File
@@ -1,6 +1,10 @@
#ifndef FILE_H #ifndef FILE_H
#define FILE_H #define FILE_H
#define STATUS_ERROR 1
#define STATUS_EOF 2
#define STATUS_READY 4
#define COMMAND_OPEN 1 #define COMMAND_OPEN 1
#define COMMAND_CLOSE 2 #define COMMAND_CLOSE 2
#define COMMAND_SELECT_IN 3 #define COMMAND_SELECT_IN 3
+2 -1
View File
@@ -11,7 +11,8 @@
#define ROM_BANKED_OUT 2 #define ROM_BANKED_OUT 2
#define FILE_COMMAND 3 #define FILE_COMMAND 3
#define FILE_DESCRIPTOR 4 #define FILE_DESCRIPTOR 4
#define FILE_DATA 5 // two bytes, for pointer to string #define FILE_DATA 5 // data, low byte of string pointer
#define FILE_DATA_HIGH 6 // high byte of string pointer
#define FILE_STATUS 7 #define FILE_STATUS 7
#endif // IO_H #endif // IO_H
+2 -2
View File
@@ -1,5 +1,5 @@
#ifndef MEMORY_H #ifndef MEM_H
#define MEMORY_H #define MEM_H
#include <stdint.h> #include <stdint.h>
+19 -2
View File
@@ -29,6 +29,7 @@ CHRIN:
lda IO_KBD lda IO_KBD
bmi @end bmi @end
jsr CHROUT ; echo jsr CHROUT ; echo
rts
@file: @file:
lda IO_COMMAND_READ lda IO_COMMAND_READ
sta IO_FILE_COMMAND sta IO_FILE_COMMAND
@@ -41,11 +42,14 @@ CHRIN:
rts rts
CHROUT: CHROUT:
pha
lda CURDVC lda CURDVC
bne @file bne @file
pla
sta IO_SCREEN sta IO_SCREEN
rts rts
@file: @file:
pla
sta IO_FILE_DATA sta IO_FILE_DATA
lda IO_COMMAND_WRITE lda IO_COMMAND_WRITE
sta IO_FILE_COMMAND sta IO_FILE_COMMAND
@@ -84,15 +88,28 @@ OPEN:
lda IO_FILE_STATUS lda IO_FILE_STATUS
and #FILE_STATUS_READY and #FILE_STATUS_READY
beq @wait beq @wait
lda #FILE_STATUS_READY lda IO_FILE_STATUS
and #$01 and #FILE_STATUS_ERROR
bne @error bne @error
rts rts
@error: @error:
jmp IQERR jmp IQERR
CLOSE: CLOSE:
jsr GETBYT
stx IO_FILE_DESCRIPTOR
lda #IO_COMMAND_CLOSE
sta IO_FILE_COMMAND
@wait:
lda IO_FILE_STATUS
and #FILE_STATUS_READY
beq @wait
lda IO_FILE_STATUS
and #FILE_STATUS_ERROR
bne @error
rts rts
@error:
jmp IQERR
; Default ; Default
+2
View File
@@ -7,6 +7,8 @@ PR_WRITTEN_BY:
jsr STROUT jsr STROUT
COLD_START: COLD_START:
lda #$00
sta CURDVC
ldx #$FF ldx #$FF
stx CURLIN+1 stx CURLIN+1
ldx #$FB ldx #$FB
+3 -3
View File
@@ -149,11 +149,11 @@ SGNCPR = STRNG1
FACEXTENSION = STRNG1+1 FACEXTENSION = STRNG1+1
STRNG2: STRNG2:
.res 2 .res 2
CURDVC:
.res 1
FILE_NAME_BUFFER = $0300
CHRGET: CHRGET:
TXTPTR = <(GENERIC_TXTPTR-GENERIC_CHRGET + CHRGET) TXTPTR = <(GENERIC_TXTPTR-GENERIC_CHRGET + CHRGET)
CHRGOT = <(GENERIC_CHRGOT-GENERIC_CHRGET + CHRGET) CHRGOT = <(GENERIC_CHRGOT-GENERIC_CHRGET + CHRGET)
CHRGOT2 = <(GENERIC_CHRGOT2-GENERIC_CHRGET + CHRGET) CHRGOT2 = <(GENERIC_CHRGOT2-GENERIC_CHRGET + CHRGET)
RNDSEED = <(GENERIC_RNDSEED-GENERIC_CHRGET + CHRGET) RNDSEED = <(GENERIC_RNDSEED-GENERIC_CHRGET + CHRGET)
CURDVC:
.res 1
FILE_NAME_BUFFER = $0300
+1 -1
View File
@@ -1,6 +1,6 @@
#include "cpu.h" #include "cpu.h"
#include "memory.h" #include "mem.h"
#include "opcodes.h" #include "opcodes.h"
#define COMBINE(H, L) ((H << 8) | L) #define COMBINE(H, L) ((H << 8) | L)
+26 -18
View File
@@ -7,21 +7,33 @@
FILE *files[256]; FILE *files[256];
int openFile(int fd, const char *path) { int openFile(int fd, const char *path) {
files[fd] = fopen(path, "r+"); if (files[fd] != NULL) {
if (files[fd] == NULL) { return STATUS_READY | STATUS_ERROR;
return errno;
} }
return 0; files[fd] = fopen(path, "w+");
if (files[fd] == NULL) {
return STATUS_READY | STATUS_ERROR;
}
return STATUS_READY;
} }
int closeFile(int fd) { int closeFile(int fd) {
int ret = fclose(files[fd]); FILE *f = files[fd];
if (ret != 0) {
return errno; if (f == NULL) {
return STATUS_READY | STATUS_ERROR;
} }
return 0; int ret = fclose(files[fd]);
if (ret != 0) {
return STATUS_READY | STATUS_ERROR;
}
files[fd] = NULL;
return STATUS_READY;
} }
int readByte(const int fd, int *data) { int readByte(const int fd, int *data) {
@@ -32,15 +44,13 @@ int readByte(const int fd, int *data) {
int error = ferror(files[fd]); int error = ferror(files[fd]);
int eof = feof(files[fd]); int eof = feof(files[fd]);
if (error != 0) { if (error != 0) {
status = 0x2; status = STATUS_ERROR;
} else if (eof != 0) { } else if (eof != 0) {
status = 0x1; status = STATUS_EOF;
} else {
status = 0x4;
} }
} }
return status; return STATUS_READY | status;
} }
int writeByte(const int fd, const int data) { int writeByte(const int fd, const int data) {
@@ -51,13 +61,11 @@ int writeByte(const int fd, const int data) {
int error = ferror(files[fd]); int error = ferror(files[fd]);
int eof = feof(files[fd]); int eof = feof(files[fd]);
if (error != 0) { if (error != 0) {
status = 0x2; status = STATUS_ERROR;
} else if (eof != 0) { } else if (eof != 0) {
status = 0x1; status = STATUS_EOF;
} else {
status = 0x4;
} }
} }
return status; return STATUS_READY | status;
} }
+10 -3
View File
@@ -1,4 +1,4 @@
#include "memory.h" #include "mem.h"
uint8_t readMemory(uint16_t address, uint8_t *ram, uint8_t *rom) { uint8_t readMemory(uint16_t address, uint8_t *ram, uint8_t *rom) {
// RAM/ROM // RAM/ROM
@@ -64,10 +64,13 @@ void writeMemory(uint16_t address, uint8_t value, uint8_t *ram) {
break; break;
case FILE_COMMAND: { case FILE_COMMAND: {
switch (ram[IO_BASE + FILE_COMMAND]) { switch (value) {
case COMMAND_OPEN: { case COMMAND_OPEN: {
ram[IO_BASE + FILE_STATUS] = 0; ram[IO_BASE + FILE_STATUS] = 0;
ram[IO_BASE + FILE_STATUS] = openFile(ram[IO_BASE + FILE_DESCRIPTOR], (const char *)&ram[IO_BASE + FILE_DATA]);
uint16_t fileAddress = ram[IO_BASE + FILE_DATA] | ((uint16_t)ram[IO_BASE + FILE_DATA_HIGH] << 8);
ram[IO_BASE + FILE_STATUS] = openFile(ram[IO_BASE + FILE_DESCRIPTOR], (const char *)&ram[fileAddress]);
break; break;
} }
case COMMAND_CLOSE: { case COMMAND_CLOSE: {
@@ -89,6 +92,10 @@ void writeMemory(uint16_t address, uint8_t value, uint8_t *ram) {
ram[IO_BASE + FILE_DATA] = value; ram[IO_BASE + FILE_DATA] = value;
break; break;
} }
case FILE_DATA_HIGH: {
ram[IO_BASE + FILE_DATA_HIGH] = value;
break;
}
default: default:
break; break;