I/O fixed and tested
This commit is contained in:
1 parent
a0cabac399
commit
e6a2af6f8a
4 files changed
+27
-22
No files matched your search
+10
-4
@@ -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
|
||||||
@@ -132,9 +137,10 @@ CLOSE:
|
|||||||
lda IO_FILE_STATUS
|
lda IO_FILE_STATUS
|
||||||
and #FILE_STATUS_READY
|
and #FILE_STATUS_READY
|
||||||
beq @wait
|
beq @wait
|
||||||
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
@@ -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:
|
||||||
|
|||||||
+13
-8
@@ -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) {
|
if (fflush(files[fd]) != 0) {
|
||||||
status = STATUS_ERROR;
|
return STATUS_READY | STATUS_ERROR;
|
||||||
} else if (eof != 0) {
|
|
||||||
status = STATUS_EOF;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return STATUS_READY | status;
|
return STATUS_READY | status;
|
||||||
|
|||||||
@@ -64,43 +64,36 @@ void writeMemory(uint16_t address, uint8_t value, uint8_t *ram) {
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case FILE_COMMAND: {
|
case FILE_COMMAND: {
|
||||||
|
ram[IO_BASE + FILE_STATUS] = 0;
|
||||||
|
|
||||||
switch (value) {
|
switch (value) {
|
||||||
case COMMAND_OPEN_R: {
|
case COMMAND_OPEN_R: {
|
||||||
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], "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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in new issue
Block a user