Fix longjump and kernalio end of file handling

This commit is contained in:
drmortalwombat 2022-01-13 10:37:44 +01:00
parent d9946e12b9
commit c72ca3547b
6 changed files with 89 additions and 15 deletions

View File

@ -80,7 +80,7 @@ enum AsmIns
ASM_BIT = 0x20, ASM_BIT = 0x20,
// Jump // Jump
ASM_JMP = 0x4c, ASM_JMP = 0x40,
ASM_JSR = 0x2c ASM_JSR = 0x2c
}; };

View File

@ -1,5 +1,6 @@
#include "kernalio.h" #include "kernalio.h"
krnioerr krnio_pstatus[16];
void krnio_setnam(const char * name) void krnio_setnam(const char * name)
{ {
@ -24,6 +25,8 @@ void krnio_setnam(const char * name)
bool krnio_open(char fnum, char device, char channel) bool krnio_open(char fnum, char device, char channel)
{ {
krnio_pstatus[fnum] = KRNIO_OK;
__asm __asm
{ {
lda #0 lda #0
@ -75,6 +78,37 @@ krnioerr krnio_status(void)
#pragma native(krnio_status) #pragma native(krnio_status)
bool krnio_load(char fnum, char device, char channel)
{
__asm
{
lda #0
sta accu
sta accu + 1
lda fnum
ldx device
ldy channel
jsr $ffba // setlfs
lda #0
ldx #0
ldy #0
jsr $FFD5 // open
bcc W1
lda #0
jmp E2
W1:
lda #1
sta accu
E2:
}
}
#pragma native(krnio_load)
bool krnio_chkout(char fnum) bool krnio_chkout(char fnum)
{ {
__asm __asm
@ -146,11 +180,15 @@ int krnio_chrin(void)
int krnio_getch(char fnum) int krnio_getch(char fnum)
{ {
if (krnio_pstatus[fnum] == KRNIO_EOF)
return -1;
int ch = -1; int ch = -1;
if (krnio_chkin(fnum)) if (krnio_chkin(fnum))
{ {
ch = krnio_chrin(); ch = krnio_chrin();
krnioerr err = krnio_status(); krnioerr err = krnio_status();
krnio_pstatus[fnum] = err;
if (err) if (err)
{ {
if (err == KRNIO_EOF) if (err == KRNIO_EOF)
@ -209,6 +247,9 @@ int krnio_write(char fnum, const char * data, int num)
int krnio_read(char fnum, char * data, int num) int krnio_read(char fnum, char * data, int num)
{ {
if (krnio_pstatus[fnum] == KRNIO_EOF)
return 0;
if (krnio_chkin(fnum)) if (krnio_chkin(fnum))
{ {
int i = 0; int i = 0;
@ -217,6 +258,7 @@ int krnio_read(char fnum, char * data, int num)
{ {
ch = krnio_chrin(); ch = krnio_chrin();
krnioerr err = krnio_status(); krnioerr err = krnio_status();
krnio_pstatus[fnum] = err;
if (err && err != KRNIO_EOF) if (err && err != KRNIO_EOF)
break; break;
data[i++] = (char)ch; data[i++] = (char)ch;
@ -234,6 +276,9 @@ int krnio_read(char fnum, char * data, int num)
int krnio_gets(char fnum, char * data, int num) int krnio_gets(char fnum, char * data, int num)
{ {
if (krnio_pstatus[fnum] == KRNIO_EOF)
return 0;
if (krnio_chkin(fnum)) if (krnio_chkin(fnum))
{ {
int i = 0; int i = 0;
@ -242,6 +287,7 @@ int krnio_gets(char fnum, char * data, int num)
{ {
ch = krnio_chrin(); ch = krnio_chrin();
krnioerr err = krnio_status(); krnioerr err = krnio_status();
krnio_pstatus[fnum] = err;
if (err && err != KRNIO_EOF) if (err && err != KRNIO_EOF)
break; break;
data[i++] = (char)ch; data[i++] = (char)ch;

View File

@ -16,6 +16,8 @@ enum krnioerr
KRNIO_NODEVICE = 0x80 KRNIO_NODEVICE = 0x80
}; };
extern krnioerr krnio_pstatus[16];
// Set filename for next krnio_open operation, make sure // Set filename for next krnio_open operation, make sure
// that the string is still valid when calling krnio_open // that the string is still valid when calling krnio_open
@ -33,6 +35,8 @@ void krnio_close(char fnum);
krnioerr krnio_status(void); krnioerr krnio_status(void);
bool krnio_load(char fnum, char device, char channel);
// select the given file for stream output // select the given file for stream output
bool krnio_chkout(char fnum); bool krnio_chkout(char fnum);

View File

@ -40,11 +40,11 @@ int setjmp(jmp_buf env)
sta (env), y sta (env), y
iny iny
lda $0100, x lda $0101, x
sta (env), y sta (env), y
iny iny
lda $0101, x lda $0102, x
sta (env), y sta (env), y
iny iny
} }
@ -95,11 +95,11 @@ void longjmp(jmp_buf env, int value)
iny iny
lda (env), y lda (env), y
sta $0100, x sta $0101, x
iny iny
lda (env), y lda (env), y
sta $0101, x sta $0102, x
iny iny
lda value lda value

View File

@ -7825,13 +7825,26 @@ void NativeCodeBasicBlock::CallFunction(InterCodeProcedure* proc, NativeCodeProc
{ {
if (ins->mSrc[0].mTemp < 0) if (ins->mSrc[0].mTemp < 0)
{ {
NativeCodeInstruction lins(ASMIT_LDA, ASMIM_IMMEDIATE_ADDRESS, ins->mSrc[0].mIntConst, ins->mSrc[0].mLinkerObject, NCIF_LOWER); if (ins->mSrc[0].mLinkerObject)
NativeCodeInstruction hins(ASMIT_LDA, ASMIM_IMMEDIATE_ADDRESS, ins->mSrc[0].mIntConst, ins->mSrc[0].mLinkerObject, NCIF_UPPER); {
NativeCodeInstruction lins(ASMIT_LDA, ASMIM_IMMEDIATE_ADDRESS, ins->mSrc[0].mIntConst, ins->mSrc[0].mLinkerObject, NCIF_LOWER);
NativeCodeInstruction hins(ASMIT_LDA, ASMIM_IMMEDIATE_ADDRESS, ins->mSrc[0].mIntConst, ins->mSrc[0].mLinkerObject, NCIF_UPPER);
mIns.Push(lins); mIns.Push(lins);
mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU));
mIns.Push(hins); mIns.Push(hins);
mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 1)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 1));
}
else
{
NativeCodeInstruction lins(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mSrc[0].mIntConst & 0xff);
NativeCodeInstruction hins(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSrc[0].mIntConst >> 8) & 0xff);
mIns.Push(lins);
mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU));
mIns.Push(hins);
mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 1));
}
} }
else else
{ {

View File

@ -271,6 +271,8 @@ Declaration* Parser::ParseBaseTypeDeclaration(uint32 flags)
mScanner->NextToken(); mScanner->NextToken();
if (mScanner->mToken == TK_IDENT) if (mScanner->mToken == TK_IDENT)
{ {
int minValue = 0, maxValue = 0;
for (;;) for (;;)
{ {
Declaration* cdec = new Declaration(mScanner->mLocation, DT_CONST_INTEGER); Declaration* cdec = new Declaration(mScanner->mLocation, DT_CONST_INTEGER);
@ -293,16 +295,25 @@ Declaration* Parser::ParseBaseTypeDeclaration(uint32 flags)
mErrors->Error(mScanner->mLocation, EERR_CONSTANT_TYPE, "Integer constant expected"); mErrors->Error(mScanner->mLocation, EERR_CONSTANT_TYPE, "Integer constant expected");
} }
cdec->mInteger = nitem++; cdec->mInteger = nitem++;
if (dec->mInteger < 0) if (dec->mInteger < minValue)
dec->mFlags |= DTF_SIGNED; minValue = dec->mInteger;
if (cdec->mInteger < -128 || cdec->mInteger > 127) else if (dec->mInteger > maxValue)
dec->mSize = 2; maxValue = dec->mInteger;
if (mScanner->mToken == TK_COMMA) if (mScanner->mToken == TK_COMMA)
mScanner->NextToken(); mScanner->NextToken();
else else
break; break;
} }
if (minValue < 0)
{
dec->mFlags |= DTF_SIGNED;
if (minValue < -128 || maxValue > 127)
dec->mSize = 2;
}
else if (maxValue > 255)
dec->mSize = 2;
} }
if (mScanner->mToken == TK_CLOSE_BRACE) if (mScanner->mToken == TK_CLOSE_BRACE)