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
+130 -85

No files matched your search

+9 -8
View File
@@ -1,21 +1,22 @@
#ifndef FILE_H
#define FILE_H
#include <stdint.h>
#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
+4 -6
View File
@@ -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
+39 -11
View File
@@ -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
+18 -18
View File
@@ -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
+7 -7
View File
@@ -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
+2 -2
View File
@@ -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
+2 -2
View File
@@ -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
+3 -3
View File
@@ -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
+6 -9
View File
@@ -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
+2 -2
View File
@@ -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
+5 -5
View File
@@ -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.
+5 -5
View File
@@ -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
+28 -2
View File
@@ -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;
-5
View File
@@ -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';