LF only, more FS fixes
This commit is contained in:
1 parent
566db4a550
commit
a0cabac399
14 files changed
+113
-68
No files matched your search
+9
-8
@@ -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
@@ -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
@@ -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
|
||||
|
||||
+2
-2
@@ -43,7 +43,7 @@ EASTER_EGG:
|
||||
lda #$80
|
||||
sta LINNUM+1
|
||||
LD758:
|
||||
ldx #$0A
|
||||
ldx #LF
|
||||
LD75A:
|
||||
lda MICROSOFT-1,x
|
||||
jsr MONCOUT
|
||||
@@ -1441,7 +1441,7 @@ POLY_EXP:
|
||||
.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 $7A,$1D,$84,$1C,$2A
|
||||
.byte $7C,$63,$59,$58,$0A
|
||||
.byte $7E,$75,$FD,$E7,$C6
|
||||
.byte $80,$31,$72,$18,$10
|
||||
|
||||
+7
-7
@@ -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
@@ -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
@@ -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
|
||||
+2
-2
@@ -9,8 +9,8 @@ QT_IN:
|
||||
.byte " IN "
|
||||
.byte $00
|
||||
QT_OK:
|
||||
.byte CR,LF,"OK",CR,LF
|
||||
.byte LF,"OK",LF
|
||||
.byte 0
|
||||
QT_BREAK:
|
||||
.byte CR,LF,"BREAK"
|
||||
.byte LF,"BREAK"
|
||||
.byte 0
|
||||
+6
-9
@@ -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
@@ -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
@@ -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
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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';
|
||||
|
||||
Reference in new issue
Block a user