I/O fixed and tested

This commit is contained in:
Kilian committed 2026-09-28 19:52:08 +02:00
1 parent a0cabac399
commit e6a2af6f8a
4 files changed
+25 -20

No files matched your search

+9 -3
View File
@@ -22,6 +22,8 @@ CHRIN:
bne @file bne @file
lda IO_KBD lda IO_KBD
bmi @end bmi @end
cmp #LF
beq @end
jsr CHROUT ; echo jsr CHROUT ; echo
rts rts
@file: @file:
@@ -54,6 +56,7 @@ CHROUT:
sta IO_FILE_DESCRIPTOR sta IO_FILE_DESCRIPTOR
pla pla
sta IO_FILE_DATA sta IO_FILE_DATA
pha
lda #IO_COMMAND_WRITE lda #IO_COMMAND_WRITE
sta IO_FILE_COMMAND sta IO_FILE_COMMAND
@wait: @wait:
@@ -62,10 +65,12 @@ CHROUT:
beq @wait beq @wait
lda IO_FILE_STATUS lda IO_FILE_STATUS
and #FILE_STATUS_ERROR and #FILE_STATUS_ERROR
beq :+ bne @error
jmp IQERR pla
:
rts rts
@error:
pla
jmp IQERR
OPEN: OPEN:
jsr GETBYT jsr GETBYT
@@ -135,6 +140,7 @@ CLOSE:
lda IO_FILE_STATUS lda IO_FILE_STATUS
and #FILE_STATUS_ERROR and #FILE_STATUS_ERROR
bne @error bne @error
jsr CLRCH
rts rts
@error: @error:
jmp IQERR jmp IQERR
+2 -1
View File
@@ -47,8 +47,9 @@ L29B9:
bne L29DD bne L29DD
LFDO: LFDO:
lda #LF lda #$00
sta POSX sta POSX
lda #LF
jsr OUTDO jsr OUTDO
PRINTNULLS: PRINTNULLS:
+12 -7
View File
@@ -37,6 +37,10 @@ int closeFile(int fd) {
} }
int readByte(const int fd, uint8_t *data) { int readByte(const int fd, uint8_t *data) {
if (files[fd] == NULL) {
return STATUS_READY | STATUS_ERROR;
}
int status = 0; int status = 0;
int count = fread(data, 1, 1, files[fd]); int count = fread(data, 1, 1, files[fd]);
// Error or EOF // Error or EOF
@@ -54,17 +58,18 @@ int readByte(const int fd, uint8_t *data) {
} }
int writeByte(const int fd, const uint8_t data) { int writeByte(const int fd, const uint8_t data) {
if (files[fd] == NULL) {
return STATUS_READY | STATUS_ERROR;
}
int status = 0; int status = 0;
int count = fwrite(&data, 1, 1, files[fd]); int count = fwrite(&data, 1, 1, files[fd]);
// Error or EOF // Error or EOF
if (count != 1) { if (count != 1 && ferror(files[fd]) != 0) {
int error = ferror(files[fd]); return STATUS_READY | STATUS_ERROR;
int eof = feof(files[fd]);
if (error != 0) {
status = STATUS_ERROR;
} else if (eof != 0) {
status = STATUS_EOF;
} }
if (fflush(files[fd]) != 0) {
return STATUS_READY | STATUS_ERROR;
} }
return STATUS_READY | status; return STATUS_READY | status;
+2 -9
View File
@@ -64,43 +64,36 @@ void writeMemory(uint16_t address, uint8_t value, uint8_t *ram) {
break; break;
case FILE_COMMAND: { case FILE_COMMAND: {
switch (value) {
case COMMAND_OPEN_R: {
ram[IO_BASE + FILE_STATUS] = 0; ram[IO_BASE + FILE_STATUS] = 0;
switch (value) {
case COMMAND_OPEN_R: {
uint16_t fileAddress = ram[IO_BASE + FILE_DATA] | ((uint16_t)ram[IO_BASE + FILE_DATA_HIGH] << 8); 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], "r"); ram[IO_BASE + FILE_STATUS] = openFile(ram[IO_BASE + FILE_DESCRIPTOR], (const char *)&ram[fileAddress], "r");
break; break;
} }
case COMMAND_OPEN_W: { case COMMAND_OPEN_W: {
ram[IO_BASE + FILE_STATUS] = 0;
uint16_t fileAddress = ram[IO_BASE + FILE_DATA] | ((uint16_t)ram[IO_BASE + FILE_DATA_HIGH] << 8); 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], "w+"); ram[IO_BASE + FILE_STATUS] = openFile(ram[IO_BASE + FILE_DESCRIPTOR], (const char *)&ram[fileAddress], "w+");
break; break;
} }
case COMMAND_OPEN_A: { case COMMAND_OPEN_A: {
ram[IO_BASE + FILE_STATUS] = 0;
uint16_t fileAddress = ram[IO_BASE + FILE_DATA] | ((uint16_t)ram[IO_BASE + FILE_DATA_HIGH] << 8); 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], "a+"); ram[IO_BASE + FILE_STATUS] = openFile(ram[IO_BASE + FILE_DESCRIPTOR], (const char *)&ram[fileAddress], "a+");
break; break;
} }
case COMMAND_CLOSE: { case COMMAND_CLOSE: {
ram[IO_BASE + FILE_STATUS] = 0;
ram[IO_BASE + FILE_STATUS] = closeFile(ram[IO_BASE + FILE_DESCRIPTOR]); ram[IO_BASE + FILE_STATUS] = closeFile(ram[IO_BASE + FILE_DESCRIPTOR]);
break; break;
} }
case COMMAND_READ: { case COMMAND_READ: {
ram[IO_BASE + FILE_STATUS] = 0;
ram[IO_BASE + FILE_STATUS] = readByte(ram[IO_BASE + FILE_DESCRIPTOR], &ram[IO_BASE + FILE_DATA]); ram[IO_BASE + FILE_STATUS] = readByte(ram[IO_BASE + FILE_DESCRIPTOR], &ram[IO_BASE + FILE_DATA]);
break; break;
} }
case COMMAND_WRITE: { case COMMAND_WRITE: {
ram[IO_BASE + FILE_STATUS] = 0;
ram[IO_BASE + FILE_STATUS] = writeByte(ram[IO_BASE + FILE_DESCRIPTOR], ram[IO_BASE + FILE_DATA]); ram[IO_BASE + FILE_STATUS] = writeByte(ram[IO_BASE + FILE_DESCRIPTOR], ram[IO_BASE + FILE_DATA]);
break; break;
} }