LF only, more FS fixes

This commit is contained in:
Kilian committed 2026-09-28 17:30:47 +02:00
1 parent 566db4a550
commit a0cabac399
14 files changed
+113 -68

No files matched your search

+9 -8
View File
@@ -1,21 +1,22 @@
#ifndef FILE_H #ifndef FILE_H
#define FILE_H #define FILE_H
#include <stdint.h>
#define STATUS_ERROR 1 #define STATUS_ERROR 1
#define STATUS_EOF 2 #define STATUS_EOF 2
#define STATUS_READY 4 #define STATUS_READY 4
#define COMMAND_OPEN 1 #define COMMAND_OPEN_R 1
#define COMMAND_CLOSE 2 #define COMMAND_OPEN_W 2
#define COMMAND_SELECT_IN 3 #define COMMAND_OPEN_A 3
#define COMMAND_SELECT_OUT 4 #define COMMAND_CLOSE 4
#define COMMAND_READ 5 #define COMMAND_READ 5
#define COMMAND_WRITE 6 #define COMMAND_WRITE 6
#define COMMAND_RESET 7
int openFile(int fd, const char *path); int openFile(int fd, const char *path, const char *mode);
int closeFile(int fd); int closeFile(int fd);
int readByte(const int fd, int *data); int readByte(const int fd, uint8_t *data);
int writeByte(const int fd, const int data); int writeByte(const int fd, const uint8_t data);
#endif // FILE_H #endif // FILE_H
+4 -6
View File
@@ -15,13 +15,12 @@ IO_FILE_DATA := $BC05
IO_FILE_STATUS := $BC07 IO_FILE_STATUS := $BC07
; io commands ; io commands
IO_COMMAND_OPEN := 1 IO_COMMAND_OPEN_R := 1
IO_COMMAND_CLOSE := 2 IO_COMMAND_OPEN_W := 2
IO_COMMAND_SELECT_IN := 3 IO_COMMAND_OPEN_A := 3
IO_COMMAND_SELECT_OUT := 4 IO_COMMAND_CLOSE := 4
IO_COMMAND_READ := 5 IO_COMMAND_READ := 5
IO_COMMAND_WRITE := 6 IO_COMMAND_WRITE := 6
IO_COMMAND_RESET := 7
; io status ; io status
FILE_STATUS_ERROR := $01 FILE_STATUS_ERROR := $01
@@ -41,5 +40,4 @@ STACK2 := STACK
MAX_EXPON = 10 MAX_EXPON = 10
CR = 13
LF = 10 LF = 10
+39 -11
View File
@@ -5,22 +5,16 @@
CHKIN: CHKIN:
stx CURDVC stx CURDVC
stx IO_FILE_DESCRIPTOR stx IO_FILE_DESCRIPTOR
lda IO_COMMAND_SELECT_IN
sta IO_FILE_COMMAND
rts rts
CHKOUT: CHKOUT:
stx CURDVC stx CURDVC
stx IO_FILE_DESCRIPTOR stx IO_FILE_DESCRIPTOR
lda IO_COMMAND_SELECT_OUT
sta IO_FILE_COMMAND
rts rts
CLRCH: CLRCH:
lda #0 lda #0
sta CURDVC sta CURDVC
lda IO_COMMAND_RESET
sta IO_FILE_COMMAND
rts rts
CHRIN: CHRIN:
@@ -31,12 +25,19 @@ CHRIN:
jsr CHROUT ; echo jsr CHROUT ; echo
rts rts
@file: @file:
lda IO_COMMAND_READ lda CURDVC
sta IO_FILE_DESCRIPTOR
lda #IO_COMMAND_READ
sta IO_FILE_COMMAND sta IO_FILE_COMMAND
@wait: @wait:
lda IO_FILE_STATUS lda IO_FILE_STATUS
and #FILE_STATUS_READY and #FILE_STATUS_READY
beq @wait beq @wait
lda IO_FILE_STATUS
and #FILE_STATUS_ERROR
beq :+
jmp IQERR
:
lda IO_FILE_DATA lda IO_FILE_DATA
@end: @end:
rts rts
@@ -49,14 +50,21 @@ CHROUT:
sta IO_SCREEN sta IO_SCREEN
rts rts
@file: @file:
lda CURDVC
sta IO_FILE_DESCRIPTOR
pla 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
@wait: @wait:
lda IO_FILE_STATUS lda IO_FILE_STATUS
and #$4 and #FILE_STATUS_READY
beq @wait beq @wait
lda IO_FILE_STATUS
and #FILE_STATUS_ERROR
beq :+
jmp IQERR
:
rts rts
OPEN: OPEN:
@@ -82,8 +90,28 @@ OPEN:
sta IO_FILE_DATA sta IO_FILE_DATA
lda #>FILE_NAME_BUFFER lda #>FILE_NAME_BUFFER
sta IO_FILE_DATA+1 sta IO_FILE_DATA+1
lda #IO_COMMAND_OPEN jsr CHKCOM
sta IO_FILE_COMMAND jsr FRMEVL
jsr CHKSTR
jsr FREFAC
cmp #1
beq :+
jmp SYNERR
:
ldy #0
lda (INDEX),y
ldy #IO_COMMAND_OPEN_R
cmp #'R'
beq @setCommand
ldy #IO_COMMAND_OPEN_W
cmp #'W'
beq @setCommand
ldy #IO_COMMAND_OPEN_A
cmp #'A'
beq @setCommand
jmp SYNERR
@setCommand:
sty IO_FILE_COMMAND
@wait: @wait:
lda IO_FILE_STATUS lda IO_FILE_STATUS
and #FILE_STATUS_READY and #FILE_STATUS_READY
+2 -2
View File
@@ -43,7 +43,7 @@ EASTER_EGG:
lda #$80 lda #$80
sta LINNUM+1 sta LINNUM+1
LD758: LD758:
ldx #$0A ldx #LF
LD75A: LD75A:
lda MICROSOFT-1,x lda MICROSOFT-1,x
jsr MONCOUT jsr MONCOUT
@@ -1441,7 +1441,7 @@ POLY_EXP:
.byte $71,$34,$58,$3E,$56 .byte $71,$34,$58,$3E,$56
.byte $74,$16,$7E,$B3,$1B .byte $74,$16,$7E,$B3,$1B
.byte $77,$2F,$EE,$E3,$85 .byte $77,$2F,$EE,$E3,$85
.byte $7A,$1D,$84,$1C,$2A .byte $7A,$1D,$84,$1C,$2A
.byte $7C,$63,$59,$58,$0A .byte $7C,$63,$59,$58,$0A
.byte $7E,$75,$FD,$E7,$C6 .byte $7E,$75,$FD,$E7,$C6
.byte $80,$31,$72,$18,$10 .byte $80,$31,$72,$18,$10
+7 -7
View File
@@ -73,7 +73,7 @@ L4098:
sta Z14 sta Z14
lda #$03 lda #$03
sta DSCLEN sta DSCLEN
jsr CRDO jsr LFDO
lda #$01 lda #$01
sta INPUTBUFFER-3 sta INPUTBUFFER-3
sta INPUTBUFFER-4 sta INPUTBUFFER-4
@@ -130,7 +130,7 @@ L4192:
lda TXTTAB lda TXTTAB
ldy TXTTAB+1 ldy TXTTAB+1
jsr REASON jsr REASON
jsr CRDO jsr LFDO
lda MEMSIZ lda MEMSIZ
sec sec
sbc TXTTAB sbc TXTTAB
@@ -156,18 +156,18 @@ L4192:
jmp (GORESTART+1) jmp (GORESTART+1)
QT_WRITTEN_BY: QT_WRITTEN_BY:
.byte CR,LF .byte LF
.byte "WRITTEN BY WEILAND & GATES" .byte "WRITTEN BY WEILAND & GATES"
.byte CR,LF .byte LF
.byte "PORTED BY KILIAN KURT HOFMANN" .byte "PORTED BY KILIAN KURT HOFMANN"
.byte CR,LF,0 .byte LF,0
QT_TERMINAL_WIDTH: QT_TERMINAL_WIDTH:
.byte "TERMINAL " .byte "TERMINAL "
.byte "WIDTH" .byte "WIDTH"
.byte 0 .byte 0
QT_BYTES_FREE: QT_BYTES_FREE:
.byte " BYTES FREE" .byte " BYTES FREE"
.byte CR,LF,0 .byte LF,0
QT_BASIC: QT_BASIC:
.byte "COPYRIGHT 1977 BY MICROSOFT CO." .byte "COPYRIGHT 1977 BY MICROSOFT CO."
.byte CR,LF,CR,LF,0 .byte LF,LF,0
+2 -2
View File
@@ -4,7 +4,7 @@ L2420:
dex dex
bpl INLIN2 bpl INLIN2
L2423: L2423:
jsr CRDO jsr LFDO
; ---------------------------------------------------------------------------- ; ----------------------------------------------------------------------------
; READ A LINE, AND STRIP OFF SIGN BITS ; READ A LINE, AND STRIP OFF SIGN BITS
@@ -15,7 +15,7 @@ INLIN2:
jsr GETLN jsr GETLN
cmp #$07 cmp #$07
beq L2443 beq L2443
cmp #$0D cmp #LF
beq L2453 beq L2453
cmp #$20 cmp #$20
bcc INLIN2 bcc INLIN2
+2 -2
View File
@@ -295,7 +295,7 @@ L2BA1:
; ---------------------------------------------------------------------------- ; ----------------------------------------------------------------------------
ERREXTRA: ERREXTRA:
.byte "?EXTRA IGNORED" .byte "?EXTRA IGNORED"
.byte $0D,$0A,$00 .byte LF,$00
ERRREENTRY: ERRREENTRY:
.byte "?REDO FROM START" .byte "?REDO FROM START"
.byte $0D,$0A,$00 .byte LF,$00
+2 -2
View File
@@ -9,8 +9,8 @@ QT_IN:
.byte " IN " .byte " IN "
.byte $00 .byte $00
QT_OK: QT_OK:
.byte CR,LF,"OK",CR,LF .byte LF,"OK",LF
.byte 0 .byte 0
QT_BREAK: QT_BREAK:
.byte CR,LF,"BREAK" .byte LF,"BREAK"
.byte 0 .byte 0
+6 -9
View File
@@ -9,7 +9,7 @@ L297E:
; "PRINT" STATEMENT ; "PRINT" STATEMENT
; ---------------------------------------------------------------------------- ; ----------------------------------------------------------------------------
PRINT: PRINT:
beq CRDO beq LFDO
PRINT2: PRINT2:
beq L29DD beq L29DD
cmp #TOKEN_TAB cmp #TOKEN_TAB
@@ -32,7 +32,7 @@ PRINT2:
adc POSX adc POSX
cmp Z17 cmp Z17
bcc L29B1 bcc L29B1
jsr CRDO jsr LFDO
L29B1: L29B1:
jsr STRPRT jsr STRPRT
jsr OUTSP jsr OUTSP
@@ -46,12 +46,9 @@ L29B9:
lda CURDVC lda CURDVC
bne L29DD bne L29DD
CRDO: LFDO:
lda #CR
sta POSX
jsr OUTDO
CRDO2:
lda #LF lda #LF
sta POSX
jsr OUTDO jsr OUTDO
PRINTNULLS: PRINTNULLS:
@@ -62,7 +59,7 @@ L29DE:
lda POSX lda POSX
cmp Z18 cmp Z18
bcc L29EA bcc L29EA
jsr CRDO jsr LFDO
jmp L2A0D jmp L2A0D
L29EA: L29EA:
sec sec
@@ -116,7 +113,7 @@ L2A22:
lda (INDEX),y lda (INDEX),y
jsr OUTDO jsr OUTDO
iny iny
cmp #$0D cmp #LF
bne L2A22 bne L2A22
jsr PRINTNULLS jsr PRINTNULLS
jmp L2A22 jmp L2A22
+2 -2
View File
@@ -26,7 +26,7 @@ ERROR:
lda #$00 lda #$00
sta CURDVC sta CURDVC
LC366: LC366:
jsr CRDO jsr LFDO
jsr OUTQUES jsr OUTQUES
L2329: L2329:
lda ERROR_MESSAGES,x lda ERROR_MESSAGES,x
@@ -461,7 +461,7 @@ L25A6X:
lda (LOWTRX),y lda (LOWTRX),y
beq L25E5 beq L25E5
jsr ISCNTC jsr ISCNTC
jsr CRDO jsr LFDO
iny iny
lda (LOWTRX),y lda (LOWTRX),y
tax tax
+5 -5
View File
@@ -12,7 +12,7 @@ IN = $0200 ; Input buffer
RESET: RESET:
LDA #$1B ; Begin with escape. LDA #$1B ; Begin with escape.
NOTCR: NOTLF:
CMP #$08 ; Backspace key? CMP #$08 ; Backspace key?
BEQ BACKSPACE ; Yes. BEQ BACKSPACE ; Yes.
CMP #$1B ; ESC? CMP #$1B ; ESC?
@@ -37,8 +37,8 @@ NEXTCHAR:
BMI NEXTCHAR ; Loop until ready. BMI NEXTCHAR ; Loop until ready.
STA IN,Y ; Add to text buffer. STA IN,Y ; Add to text buffer.
JSR ECHO ; Display character. JSR ECHO ; Display character.
CMP #$0D ; CR? CMP #LF ; LF?
BNE NOTCR ; No. BNE NOTLF ; No.
LDY #$FF ; Reset text index. LDY #$FF ; Reset text index.
LDA #$00 ; For XAM mode. LDA #$00 ; For XAM mode.
@@ -52,7 +52,7 @@ BLSKIP:
INY ; Advance text index. INY ; Advance text index.
NEXTITEM: NEXTITEM:
LDA IN,Y ; Get character. LDA IN,Y ; Get character.
CMP #$0D ; CR? CMP #LF ; LF?
BEQ GETLINE ; Yes, done this line. BEQ GETLINE ; Yes, done this line.
CMP #$2E ; "."? CMP #$2E ; "."?
BCC BLSKIP ; Skip delimiter. BCC BLSKIP ; Skip delimiter.
@@ -118,7 +118,7 @@ SETADR: LDA L-1,X ; Copy hex data to
NXTPRNT: NXTPRNT:
BNE PRDATA ; NE means no address to print. BNE PRDATA ; NE means no address to print.
LDA #$0A ; LF. LDA #LF ; LF.
JSR ECHO ; Output it. JSR ECHO ; Output it.
LDA XAMH ; 'Examine index' high-order byte. LDA XAMH ; 'Examine index' high-order byte.
JSR PRBYTE ; Output it in hex format. JSR PRBYTE ; Output it in hex format.
+5 -5
View File
@@ -6,12 +6,12 @@
// Up to 256 files can be open // Up to 256 files can be open
FILE *files[256]; FILE *files[256];
int openFile(int fd, const char *path) { int openFile(int fd, const char *path, const char *mode) {
if (files[fd] != NULL) { if (files[fd] != NULL) {
return STATUS_READY | STATUS_ERROR; return STATUS_READY | STATUS_ERROR;
} }
files[fd] = fopen(path, "w+"); files[fd] = fopen(path, mode);
if (files[fd] == NULL) { if (files[fd] == NULL) {
return STATUS_READY | STATUS_ERROR; return STATUS_READY | STATUS_ERROR;
} }
@@ -36,9 +36,9 @@ int closeFile(int fd) {
return STATUS_READY; return STATUS_READY;
} }
int readByte(const int fd, int *data) { int readByte(const int fd, uint8_t *data) {
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
if (count != 1) { if (count != 1) {
int error = ferror(files[fd]); int error = ferror(files[fd]);
@@ -53,7 +53,7 @@ int readByte(const int fd, int *data) {
return STATUS_READY | status; return STATUS_READY | status;
} }
int writeByte(const int fd, const int data) { int writeByte(const int fd, const uint8_t data) {
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
+28 -2
View File
@@ -65,12 +65,28 @@ void writeMemory(uint16_t address, uint8_t value, uint8_t *ram) {
case FILE_COMMAND: { case FILE_COMMAND: {
switch (value) { switch (value) {
case COMMAND_OPEN: { case COMMAND_OPEN_R: {
ram[IO_BASE + FILE_STATUS] = 0; 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]); ram[IO_BASE + FILE_STATUS] = openFile(ram[IO_BASE + FILE_DESCRIPTOR], (const char *)&ram[fileAddress], "r");
break;
}
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);
ram[IO_BASE + FILE_STATUS] = openFile(ram[IO_BASE + FILE_DESCRIPTOR], (const char *)&ram[fileAddress], "w+");
break;
}
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);
ram[IO_BASE + FILE_STATUS] = openFile(ram[IO_BASE + FILE_DESCRIPTOR], (const char *)&ram[fileAddress], "a+");
break; break;
} }
case COMMAND_CLOSE: { case COMMAND_CLOSE: {
@@ -78,6 +94,16 @@ void writeMemory(uint16_t address, uint8_t value, uint8_t *ram) {
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: {
ram[IO_BASE + FILE_STATUS] = 0;
ram[IO_BASE + FILE_STATUS] = readByte(ram[IO_BASE + FILE_DESCRIPTOR], &ram[IO_BASE + FILE_DATA]);
break;
}
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]);
break;
}
default: default:
break; break;
-5
View File
@@ -20,11 +20,6 @@ int getChar(void) {
return 0xFF; return 0xFF;
} }
// BASIC expects CR always
if (c == '\n') {
return '\r';
}
// BASIC is uppercase only // BASIC is uppercase only
if (c >= 'a' && c <= 'z') { if (c >= 'a' && c <= 'z') {
c = c - 'a' + 'A'; c = c - 'a' + 'A';