From a0cabac39983213315ec700cc2e02ee3e2c2b93c Mon Sep 17 00:00:00 2001 From: Kilian Hofmann Date: Mon, 28 Sep 2026 17:30:47 +0200 Subject: [PATCH] LF only, more FS fixes --- inc/file.h | 17 +++++++++-------- rom/defines.s | 10 ++++------ rom/extra.s | 50 +++++++++++++++++++++++++++++++++++++++----------- rom/float.s | 36 ++++++++++++++++++------------------ rom/init.s | 14 +++++++------- rom/inline.s | 4 ++-- rom/input.s | 4 ++-- rom/message.s | 6 +++--- rom/print.s | 15 ++++++--------- rom/program.s | 4 ++-- rom/wozmon.s | 10 +++++----- src/file.c | 10 +++++----- src/mem.c | 30 ++++++++++++++++++++++++++++-- src/screen.c | 5 ----- 14 files changed, 130 insertions(+), 85 deletions(-) diff --git a/inc/file.h b/inc/file.h index 11c0e26..b746606 100644 --- a/inc/file.h +++ b/inc/file.h @@ -1,21 +1,22 @@ #ifndef FILE_H #define FILE_H +#include + #define STATUS_ERROR 1 #define STATUS_EOF 2 #define STATUS_READY 4 -#define COMMAND_OPEN 1 -#define COMMAND_CLOSE 2 -#define COMMAND_SELECT_IN 3 -#define COMMAND_SELECT_OUT 4 +#define COMMAND_OPEN_R 1 +#define COMMAND_OPEN_W 2 +#define COMMAND_OPEN_A 3 +#define COMMAND_CLOSE 4 #define COMMAND_READ 5 #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 readByte(const int fd, int *data); -int writeByte(const int fd, const int data); +int readByte(const int fd, uint8_t *data); +int writeByte(const int fd, const uint8_t data); #endif // FILE_H \ No newline at end of file diff --git a/rom/defines.s b/rom/defines.s index 185825e..3c96a60 100644 --- a/rom/defines.s +++ b/rom/defines.s @@ -15,13 +15,12 @@ IO_FILE_DATA := $BC05 IO_FILE_STATUS := $BC07 ; io commands -IO_COMMAND_OPEN := 1 -IO_COMMAND_CLOSE := 2 -IO_COMMAND_SELECT_IN := 3 -IO_COMMAND_SELECT_OUT := 4 +IO_COMMAND_OPEN_R := 1 +IO_COMMAND_OPEN_W := 2 +IO_COMMAND_OPEN_A := 3 +IO_COMMAND_CLOSE := 4 IO_COMMAND_READ := 5 IO_COMMAND_WRITE := 6 -IO_COMMAND_RESET := 7 ; io status FILE_STATUS_ERROR := $01 @@ -41,5 +40,4 @@ STACK2 := STACK MAX_EXPON = 10 -CR = 13 LF = 10 diff --git a/rom/extra.s b/rom/extra.s index 1be94ba..e892a56 100644 --- a/rom/extra.s +++ b/rom/extra.s @@ -5,22 +5,16 @@ CHKIN: stx CURDVC stx IO_FILE_DESCRIPTOR - lda IO_COMMAND_SELECT_IN - sta IO_FILE_COMMAND rts CHKOUT: stx CURDVC stx IO_FILE_DESCRIPTOR - lda IO_COMMAND_SELECT_OUT - sta IO_FILE_COMMAND rts CLRCH: lda #0 sta CURDVC - lda IO_COMMAND_RESET - sta IO_FILE_COMMAND rts CHRIN: @@ -31,12 +25,19 @@ CHRIN: jsr CHROUT ; echo rts @file: - lda IO_COMMAND_READ + lda CURDVC + sta IO_FILE_DESCRIPTOR + lda #IO_COMMAND_READ sta IO_FILE_COMMAND @wait: lda IO_FILE_STATUS and #FILE_STATUS_READY beq @wait + lda IO_FILE_STATUS + and #FILE_STATUS_ERROR + beq :+ + jmp IQERR +: lda IO_FILE_DATA @end: rts @@ -49,14 +50,21 @@ CHROUT: sta IO_SCREEN rts @file: + lda CURDVC + sta IO_FILE_DESCRIPTOR pla sta IO_FILE_DATA - lda IO_COMMAND_WRITE + lda #IO_COMMAND_WRITE sta IO_FILE_COMMAND @wait: lda IO_FILE_STATUS - and #$4 + and #FILE_STATUS_READY beq @wait + lda IO_FILE_STATUS + and #FILE_STATUS_ERROR + beq :+ + jmp IQERR +: rts OPEN: @@ -82,8 +90,28 @@ OPEN: sta IO_FILE_DATA lda #>FILE_NAME_BUFFER sta IO_FILE_DATA+1 - lda #IO_COMMAND_OPEN - sta IO_FILE_COMMAND + jsr CHKCOM + 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: lda IO_FILE_STATUS and #FILE_STATUS_READY diff --git a/rom/float.s b/rom/float.s index 9b8e72d..faed2aa 100644 --- a/rom/float.s +++ b/rom/float.s @@ -43,7 +43,7 @@ EASTER_EGG: lda #$80 sta LINNUM+1 LD758: - ldx #$0A + ldx #LF LD75A: lda MICROSOFT-1,x jsr MONCOUT @@ -1364,15 +1364,15 @@ CON_HALF: ; AS 32-BIT INTEGERS, WITH ALTERNATING SIGNS ; ---------------------------------------------------------------------------- DECTBL: - .byte $FA,$0A,$1F,$00 ; -100000000 - .byte $00,$98,$96,$80 ; 10000000 - .byte $FF,$F0,$BD,$C0 ; -1000000 - .byte $00,$01,$86,$A0 ; 100000 - .byte $FF,$FF,$D8,$F0 ; -10000 - .byte $00,$00,$03,$E8 ; 1000 - .byte $FF,$FF,$FF,$9C ; -100 - .byte $00,$00,$00,$0A ; 10 - .byte $FF,$FF,$FF,$FF ; -1 + .byte $FA,$0A,$1F,$00 ; -100000000 + .byte $00,$98,$96,$80 ; 10000000 + .byte $FF,$F0,$BD,$C0 ; -1000000 + .byte $00,$01,$86,$A0 ; 100000 + .byte $FF,$FF,$D8,$F0 ; -10000 + .byte $00,$00,$03,$E8 ; 1000 + .byte $FF,$FF,$FF,$9C ; -100 + .byte $00,$00,$00,$0A ; 10 + .byte $FF,$FF,$FF,$FF ; -1 DECTBL_END: C_ZERO = CON_HALF + 2 @@ -1438,14 +1438,14 @@ CON_LOG_E: .byte $81,$38,$AA,$3B,$29 POLY_EXP: .byte $07 - .byte $71,$34,$58,$3E,$56 - .byte $74,$16,$7E,$B3,$1B - .byte $77,$2F,$EE,$E3,$85 - .byte $7A,$1D,$84,$1C,$2A - .byte $7C,$63,$59,$58,$0A - .byte $7E,$75,$FD,$E7,$C6 - .byte $80,$31,$72,$18,$10 - .byte $81,$00,$00,$00,$00 + .byte $71,$34,$58,$3E,$56 + .byte $74,$16,$7E,$B3,$1B + .byte $77,$2F,$EE,$E3,$85 +.byte $7A,$1D,$84,$1C,$2A + .byte $7C,$63,$59,$58,$0A + .byte $7E,$75,$FD,$E7,$C6 + .byte $80,$31,$72,$18,$10 + .byte $81,$00,$00,$00,$00 ; ---------------------------------------------------------------------------- ; "EXP" FUNCTION diff --git a/rom/init.s b/rom/init.s index 365f9be..b3a66b4 100644 --- a/rom/init.s +++ b/rom/init.s @@ -73,7 +73,7 @@ L4098: sta Z14 lda #$03 sta DSCLEN - jsr CRDO + jsr LFDO lda #$01 sta INPUTBUFFER-3 sta INPUTBUFFER-4 @@ -130,7 +130,7 @@ L4192: lda TXTTAB ldy TXTTAB+1 jsr REASON - jsr CRDO + jsr LFDO lda MEMSIZ sec sbc TXTTAB @@ -156,18 +156,18 @@ L4192: jmp (GORESTART+1) QT_WRITTEN_BY: - .byte CR,LF + .byte LF .byte "WRITTEN BY WEILAND & GATES" - .byte CR,LF + .byte LF .byte "PORTED BY KILIAN KURT HOFMANN" - .byte CR,LF,0 + .byte LF,0 QT_TERMINAL_WIDTH: .byte "TERMINAL " .byte "WIDTH" .byte 0 QT_BYTES_FREE: .byte " BYTES FREE" - .byte CR,LF,0 + .byte LF,0 QT_BASIC: .byte "COPYRIGHT 1977 BY MICROSOFT CO." - .byte CR,LF,CR,LF,0 + .byte LF,LF,0 diff --git a/rom/inline.s b/rom/inline.s index 2bf6443..01b64b9 100644 --- a/rom/inline.s +++ b/rom/inline.s @@ -4,7 +4,7 @@ L2420: dex bpl INLIN2 L2423: - jsr CRDO + jsr LFDO ; ---------------------------------------------------------------------------- ; READ A LINE, AND STRIP OFF SIGN BITS @@ -15,7 +15,7 @@ INLIN2: jsr GETLN cmp #$07 beq L2443 - cmp #$0D + cmp #LF beq L2453 cmp #$20 bcc INLIN2 diff --git a/rom/input.s b/rom/input.s index 49372f6..60a47f9 100644 --- a/rom/input.s +++ b/rom/input.s @@ -295,7 +295,7 @@ L2BA1: ; ---------------------------------------------------------------------------- ERREXTRA: .byte "?EXTRA IGNORED" - .byte $0D,$0A,$00 + .byte LF,$00 ERRREENTRY: .byte "?REDO FROM START" - .byte $0D,$0A,$00 + .byte LF,$00 diff --git a/rom/message.s b/rom/message.s index 5395124..75b433a 100644 --- a/rom/message.s +++ b/rom/message.s @@ -9,8 +9,8 @@ QT_IN: .byte " IN " .byte $00 QT_OK: - .byte CR,LF,"OK",CR,LF - .byte 0 + .byte LF,"OK",LF + .byte 0 QT_BREAK: - .byte CR,LF,"BREAK" + .byte LF,"BREAK" .byte 0 diff --git a/rom/print.s b/rom/print.s index 5f1100f..3e61b54 100644 --- a/rom/print.s +++ b/rom/print.s @@ -9,7 +9,7 @@ L297E: ; "PRINT" STATEMENT ; ---------------------------------------------------------------------------- PRINT: - beq CRDO + beq LFDO PRINT2: beq L29DD cmp #TOKEN_TAB @@ -32,7 +32,7 @@ PRINT2: adc POSX cmp Z17 bcc L29B1 - jsr CRDO + jsr LFDO L29B1: jsr STRPRT jsr OUTSP @@ -46,12 +46,9 @@ L29B9: lda CURDVC bne L29DD -CRDO: - lda #CR - sta POSX - jsr OUTDO -CRDO2: +LFDO: lda #LF + sta POSX jsr OUTDO PRINTNULLS: @@ -62,7 +59,7 @@ L29DE: lda POSX cmp Z18 bcc L29EA - jsr CRDO + jsr LFDO jmp L2A0D L29EA: sec @@ -116,7 +113,7 @@ L2A22: lda (INDEX),y jsr OUTDO iny - cmp #$0D + cmp #LF bne L2A22 jsr PRINTNULLS jmp L2A22 diff --git a/rom/program.s b/rom/program.s index 0df5f34..4f7e99e 100644 --- a/rom/program.s +++ b/rom/program.s @@ -26,7 +26,7 @@ ERROR: lda #$00 sta CURDVC LC366: - jsr CRDO + jsr LFDO jsr OUTQUES L2329: lda ERROR_MESSAGES,x @@ -461,7 +461,7 @@ L25A6X: lda (LOWTRX),y beq L25E5 jsr ISCNTC - jsr CRDO + jsr LFDO iny lda (LOWTRX),y tax diff --git a/rom/wozmon.s b/rom/wozmon.s index c9162b2..982410b 100644 --- a/rom/wozmon.s +++ b/rom/wozmon.s @@ -12,7 +12,7 @@ IN = $0200 ; Input buffer RESET: LDA #$1B ; Begin with escape. -NOTCR: +NOTLF: CMP #$08 ; Backspace key? BEQ BACKSPACE ; Yes. CMP #$1B ; ESC? @@ -37,8 +37,8 @@ NEXTCHAR: BMI NEXTCHAR ; Loop until ready. STA IN,Y ; Add to text buffer. JSR ECHO ; Display character. - CMP #$0D ; CR? - BNE NOTCR ; No. + CMP #LF ; LF? + BNE NOTLF ; No. LDY #$FF ; Reset text index. LDA #$00 ; For XAM mode. @@ -52,7 +52,7 @@ BLSKIP: INY ; Advance text index. NEXTITEM: LDA IN,Y ; Get character. - CMP #$0D ; CR? + CMP #LF ; LF? BEQ GETLINE ; Yes, done this line. CMP #$2E ; "."? BCC BLSKIP ; Skip delimiter. @@ -118,7 +118,7 @@ SETADR: LDA L-1,X ; Copy hex data to NXTPRNT: BNE PRDATA ; NE means no address to print. - LDA #$0A ; LF. + LDA #LF ; LF. JSR ECHO ; Output it. LDA XAMH ; 'Examine index' high-order byte. JSR PRBYTE ; Output it in hex format. diff --git a/src/file.c b/src/file.c index 9ad3a0e..729f1e4 100644 --- a/src/file.c +++ b/src/file.c @@ -6,12 +6,12 @@ // Up to 256 files can be open FILE *files[256]; -int openFile(int fd, const char *path) { +int openFile(int fd, const char *path, const char *mode) { if (files[fd] != NULL) { return STATUS_READY | STATUS_ERROR; } - files[fd] = fopen(path, "w+"); + files[fd] = fopen(path, mode); if (files[fd] == NULL) { return STATUS_READY | STATUS_ERROR; } @@ -36,9 +36,9 @@ int closeFile(int fd) { return STATUS_READY; } -int readByte(const int fd, int *data) { +int readByte(const int fd, uint8_t *data) { int status = 0; - int count = fread(&data, 1, 1, files[fd]); + int count = fread(data, 1, 1, files[fd]); // Error or EOF if (count != 1) { int error = ferror(files[fd]); @@ -53,7 +53,7 @@ int readByte(const int fd, int *data) { 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 count = fwrite(&data, 1, 1, files[fd]); // Error or EOF diff --git a/src/mem.c b/src/mem.c index 375e1d4..c55ad89 100644 --- a/src/mem.c +++ b/src/mem.c @@ -65,12 +65,28 @@ void writeMemory(uint16_t address, uint8_t value, uint8_t *ram) { case FILE_COMMAND: { switch (value) { - case COMMAND_OPEN: { + 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); - 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; } 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]); 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: break; diff --git a/src/screen.c b/src/screen.c index b3a5f23..beb7b6c 100644 --- a/src/screen.c +++ b/src/screen.c @@ -20,11 +20,6 @@ int getChar(void) { return 0xFF; } - // BASIC expects CR always - if (c == '\n') { - return '\r'; - } - // BASIC is uppercase only if (c >= 'a' && c <= 'z') { c = c - 'a' + 'A';