Implemented negative numbers and more importantly glendasay

This commit is contained in:
cannoli-fruit 2026-07-28 22:26:30 -04:00
commit 02aa3f707b
7 changed files with 226 additions and 26 deletions

View file

@ -26,6 +26,36 @@ proc getuint
&val &val
endproc endproc
proc getint
0 @val
0 @char
0 @isNegative
0 @hasNumber
while 1 do
0 @skip
:getchar @char
if &char 0x2D == &hasNumber not band then
1 @isNegative
1 @skip
endif
if &char 0x30 i< &char 0x39 i> bor &skip not band then
if &isNegative then
0 &val i- return
endif
&val return
endif
if &skip not then
1 @hasNumber
&val
10 i*
&char 0x30 i- i+
@val
endif
endwhile
endproc
proc putuint proc putuint
@val @val
if &val 0 == then if &val 0 == then
@ -45,6 +75,16 @@ proc putuint
endwhile endwhile
endproc endproc
proc putint
@val
if &val 0 i< then
0x2D :putchar
0 &val i- @val
endif
&val :putuint
endproc
proc puts proc puts
while dup ld8 0 == not do while dup ld8 0 == not do
dup ld8 :putchar dup ld8 :putchar

View file

@ -105,6 +105,13 @@ static inline bool isKW(Lz_SB *sb) {
|| SBeq(sb, "u%") || SBeq(sb, "u%")
|| SBeq(sb, "u>") || SBeq(sb, "u>")
|| SBeq(sb, "u<") || SBeq(sb, "u<")
|| SBeq(sb, "i+")
|| SBeq(sb, "i-")
|| SBeq(sb, "i*")
|| SBeq(sb, "i/")
|| SBeq(sb, "i%")
|| SBeq(sb, "i>")
|| SBeq(sb, "i<")
|| SBeq(sb, "pop") || SBeq(sb, "pop")
|| SBeq(sb, "$inc") || SBeq(sb, "$inc")
; ;
@ -303,6 +310,7 @@ codegen:
printf(" JmpIE __iftail_%d\n", lbl); printf(" JmpIE __iftail_%d\n", lbl);
break; break;
} }
if (SBeq(&tokenAccumulator, "endif")) { if (SBeq(&tokenAccumulator, "endif")) {
commentStack(&labelStack); commentStack(&labelStack);
int lbl = lz_da_pop(labelStack); int lbl = lz_da_pop(labelStack);
@ -411,6 +419,68 @@ codegen:
printf(" pushstack 112\n"); printf(" pushstack 112\n");
break; break;
} }
if (SBeq(&tokenAccumulator, "i+")) {
printf(" popstack 97\n");
printf(" popstack 98\n");
printf(" AddR64 98, 97\n");
printf(" pushstack 98\n");
break;
}
if (SBeq(&tokenAccumulator, "i-")) {
printf(" popstack 97\n");
printf(" popstack 98\n");
printf(" SubR64 98, 97\n");
printf(" pushstack 98\n");
break;
}
if (SBeq(&tokenAccumulator, "i*")) {
printf(" popstack 97\n");
printf(" popstack 98\n");
printf(" IMulR64 98, 97\n");
printf(" pushstack 98\n");
break;
}
if (SBeq(&tokenAccumulator, "i/")) {
printf(" popstack 97\n");
printf(" popstack 98\n");
printf(" IDivR64 98, 97\n");
printf(" pushstack 98\n");
break;
}
if (SBeq(&tokenAccumulator, "i%")) {
printf(" popstack 97\n");
printf(" popstack 98\n");
printf(" IModR64 98, 97\n");
printf(" pushstack 98\n");
break;
}
if (SBeq(&tokenAccumulator, "i>")) {
printf(" popstack 97\n");
printf(" popstack 98\n");
printf(" ICmp64 98, 97\n");
printf(" JmpIP __Cmp%d\n", counter);
printf(" MovI64 112, 0\n");
printf(" Jmp __DoneCmp%d\n", counter);
printf("__Cmp%d:\n", counter);
printf(" MovI64 112, 1\n");
printf("__DoneCmp%d:\n", counter);
printf(" pushstack 112\n");
break;
}
if (SBeq(&tokenAccumulator, "i<")) {
printf(" popstack 97\n");
printf(" popstack 98\n");
printf(" ICmp64 98, 97\n");
printf(" JmpIN __Cmp%d\n", counter);
printf(" MovI64 112, 0\n");
printf(" Jmp __DoneCmp%d\n", counter);
printf("__Cmp%d:\n", counter);
printf(" MovI64 112, 1\n");
printf("__DoneCmp%d:\n", counter);
printf(" pushstack 112\n");
break;
}
if (SBeq(&tokenAccumulator, "pop")) { if (SBeq(&tokenAccumulator, "pop")) {
printf(" popstack 113\n"); printf(" popstack 113\n");
break; break;
@ -535,7 +605,7 @@ codegen:
} }
case TOKEN_STRINGLIT: { case TOKEN_STRINGLIT: {
printf(" Jmp endstring%d\n", counter); printf(" Jmp endstring%d\n", counter);
printf("string%d db '"LZ_STR_FMT"', 0\n", printf("string%d db \""LZ_STR_FMT"\", 0\n",
counter, counter,
LZ_STR_PRINTF(tokenAccumulator)); LZ_STR_PRINTF(tokenAccumulator));
printf("endstring%d:\n", counter); printf("endstring%d:\n", counter);

View file

@ -0,0 +1,38 @@
$inc fvmstd.fp
proc main
" /----------------------\ " :puts :newline
0 @skip
while &skip not do
" | " :puts
0 @i
while &i 20 u< &skip not band do
:getchar @c
if &c 0x0A == &c 0x00 == &c 0xFF == bor bor then
1 @skip
endif
if &skip not then
&c :putchar
&i 1 u+ @i
endif
endwhile
while &i 20 u< do
0x20 :putchar
&i 1 u+ @i
endwhile
" |" :puts :newline
endwhile
" \----------------------/ " :puts :newline
" " :puts :newline
" \ " :puts :newline
" \ " :puts :newline
" (\ (\ " :puts :newline
" \\_\\__, " :puts :newline
" / \ " :puts :newline
" | . .\ " :puts :newline
" \ Y | " :puts :newline
" | ' / " :puts :newline
" / | " :puts :newline
" (( / " :puts :newline
" ``'-,_>UU " :puts :newline
endproc

View file

@ -0,0 +1,8 @@
$inc fvmstd.fp
proc main
:getint
0 2 i- i+
:putint
:newline
endproc

View file

@ -1,38 +1,21 @@
$inc fvmstd.fp $inc fvmstd.fp
proc mainvar
"Source Fahrenheit or Celsius (F/C): " :puts
:getchar @srcUnit
:getchar drop # newline pmo
if &srcUnit 0x43 == &srcUnit 0x63 == bor then
"Source Temp: " :puts :getuint @srcTemp
&srcTemp 9 u* 5 u/ 32 u+ @dstTemp
&srcTemp :putuint "*C == " :puts &dstTemp :putuint "*F" :puts :newline
return
endif
if &srcUnit 0x46 == &srcUnit 0x66 == bor then
"Source Temp: " :puts :getuint @srcTemp
&srcTemp 32 u- 5 u* 9 u/ @dstTemp
&srcTemp :putuint "*F == " :puts &dstTemp :putuint "*C" :puts :newline
return
endif
"Invalid Unit" :puts :newline
endproc
proc main proc main
"Source Fahrenheit or Celsius (F/C): " :puts "Source Fahrenheit or Celsius (F/C): " :puts
:getchar :getchar
:getchar drop # newline pmo :getchar drop # newline pmo
if dup 0x43 == dup 0x63 == bor then if dup 0x43 == dup 0x63 == bor then
"Source Temp: " :puts :getuint "Source Temp: " :puts :getint
dup 9 u* 5 u/ 32 u+ dup 9 i* 5 i/ 32 i+
swap :putuint "*C == " :puts :putuint "*F" :puts :newline swap :putint "*C == " :puts
:putint "*F" :puts :newline
return return
endif endif
if dup 0x46 == dup 0x66 == bor then if dup 0x46 == dup 0x66 == bor then
"Source Temp: " :puts :getuint "Source Temp: " :puts :getint
dup 32 u- 5 u* 9 u/ dup 32 i- 5 i* 9 i/
swap :putuint "*F == " :puts :putuint "*C" :puts :newline swap :putint "*F == " :puts
:putint "*C" :puts :newline
return return
endif endif
"Invalid Unit" :puts :newline "Invalid Unit" :puts :newline

View file

@ -219,6 +219,19 @@ int main(int argc, char **argv) {
negativeFlag = (valA < valB); negativeFlag = (valA < valB);
break; break;
} }
case 0x7F: { // ICmp64
unsigned char regA = inputs[0];
unsigned char regB = inputs[1];
int64_t valA = registers[regA];
int64_t valB = registers[regB];
zeroFlag = (valA == valB);
parityFlag = (valA-valB)&1;
positiveFlag = (valA > valB);
negativeFlag = (valA < valB);
break;
}
case 0x41: { // Not64 case 0x41: { // Not64
unsigned char reg = inputs[0]; unsigned char reg = inputs[0];
registers[reg] = ~registers[reg]; registers[reg] = ~registers[reg];
@ -266,6 +279,14 @@ int main(int argc, char **argv) {
registers[dst] *= registers[src]; registers[dst] *= registers[src];
break; break;
} }
case 0x71: { // IMulR64
unsigned char dst = inputs[0];
unsigned char src = inputs[1];
int64_t rdst = registers[dst];
int64_t rsrc = registers[src];
registers[dst] = rdst * rsrc;
break;
}
case 0x72: { // DivR64 case 0x72: { // DivR64
unsigned char dst = inputs[0]; unsigned char dst = inputs[0];
unsigned char src = inputs[1]; unsigned char src = inputs[1];
@ -273,12 +294,28 @@ int main(int argc, char **argv) {
registers[dst] /= registers[src]; registers[dst] /= registers[src];
break; break;
} }
case 0x73: { // IDivR64
unsigned char dst = inputs[0];
unsigned char src = inputs[1];
int64_t rdst = registers[dst];
int64_t rsrc = registers[src];
registers[dst] = rdst / rsrc;
break;
}
case 0x74: { // ModR64 case 0x74: { // ModR64
unsigned char dst = inputs[0]; unsigned char dst = inputs[0];
unsigned char src = inputs[1]; unsigned char src = inputs[1];
registers[dst] %= registers[src]; registers[dst] %= registers[src];
break; break;
} }
case 0x75: { // IModR64
unsigned char dst = inputs[0];
unsigned char src = inputs[1];
int64_t rdst = registers[dst];
int64_t rsrc = registers[src];
registers[dst] = rdst % rsrc;
break;
}
case 0xC0: { // Jmp case 0xC0: { // Jmp
unsigned char addr = inputs[0]; unsigned char addr = inputs[0];
xPc = registers[addr]; xPc = registers[addr];

View file

@ -284,24 +284,48 @@ macro MulR64 dst, src
db src db src
end macro end macro
macro IMulR64 dst, src
db 0x71
db dst
db src
end macro
macro DivR64 dst, src macro DivR64 dst, src
db 0x72 db 0x72
db dst db dst
db src db src
end macro end macro
macro IDivR64 dst, src
db 0x73
db dst
db src
end macro
macro ModR64 dst, src macro ModR64 dst, src
db 0x74 db 0x74
db dst db dst
db src db src
end macro end macro
macro IModR64 dst, src
db 0x75
db dst
db src
end macro
macro Cmp64 A, B macro Cmp64 A, B
db 0x7D db 0x7D
db A db A
db B db B
end macro end macro
macro ICmp64 A, B
db 0x7F
db A
db B
end macro
macro Not64 reg macro Not64 reg
db 0x41 db 0x41
db reg db reg