From 6959200abf12a6ea8d28d4280642c0af7c764ec6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20GIBERT?= Date: Sun, 30 May 2021 22:34:03 +0200 Subject: [PATCH] Kernel 0.94++ --- .Floppies/A2OSX.BUILD.po | Bin 33553920 -> 33553920 bytes BIN/CSH.S.CORE.txt | 534 +++++++++++++++++++++++++----------- BIN/CSH.S.EXEC.txt | 16 +- BIN/CSH.S.EXP.txt | 323 ++++++++++++++++++---- BIN/CSH.S.KW.txt | 238 +++++----------- BIN/CSH.S.txt | 330 +++++++++++++++------- BIN/NSCUTIL.S.txt | 194 ++++++++----- INC/IO.D2.I.txt | 8 +- INC/IO.I.txt | 2 +- INC/MACROS.I.txt | 8 +- INCLUDE/math.h.txt | 16 ++ INCLUDE/stdio.h.txt | 26 +- INCLUDE/stdlib.h.txt | 3 + INCLUDE/string.h.txt | 6 +- INCLUDE/unistd.h.txt | 4 +- ProDOS.FX/ProDOS.S.LDR.txt | 62 +++-- ProDOS.FX/ProDOS.S.NCLK.txt | 94 ++++--- SYS/KM.NSC.S.txt | 177 +++++++----- 18 files changed, 1332 insertions(+), 709 deletions(-) create mode 100644 INCLUDE/math.h.txt diff --git a/.Floppies/A2OSX.BUILD.po b/.Floppies/A2OSX.BUILD.po index cbc43182aa90cb4640d7f7a4d03f51e61872d4c0..199801936b1538d07d0a90c7b6e4f0ab666aa860 100644 GIT binary patch delta 63130 zcma&P30zZG_BeiDLdb&(p zy*gcnGQ}3F9c(+&cC^~*rtP%FX*->9thLp4I&P(%uCD)c?|n%C`~7|Xor&+gbI;w* zJ@?#m&pG$fe(k2F9e({^2L!xoixzfV42TbS*~Y1M=oRq*5kq%OqAzhlJF4hQO3;oi zidB#lA?&!WNRhv43)ztpm;ivu!j96w7qnkYMXu!7P=wAR@l~7J_<~*;#swU<1qQ!h zbKICTzTeY&(S^tI@}J=9p8K-xX&fF-$>hV6#n0h`c8<~llm@q zqQRn!B!1og@S}XE>S!l=y@&7S_XoT_dyQtx;7{)ieh2T}0D8GUX?DLN4ZYqjPvc(S zGWgv)gXevylNoA?L*5yDG^L0Cv*zQ;gNkon+gWY!g3<>(zD6{iL(>lgi7NlD^XQ>W&{9e5G=eVWZGFMNGT@XwMY! zT%wqf)Hk!k*!M|CxTs3*E9wk9(#M7DI#RjcdE~gd|7S?=35I^%gno4@j`oDWyG*=} zExSXbrkqQx(e}L!l`En0=Po5ZaXCr6l+a(^ee-~JFsvi24|QHh>Kp95n3O3-C$vvK zesgGIw-VA6;=4OmeH-Dvl=S!yNqdhS&;lN`_F~c*86du;d;e0>;G@G!K72W8DEROX zNyp_~ak_!naPlO14EHux zPSC{0e3Q_x5kE+L>Rj)aMKWu5@PU(=m12B+|CR0#@$E$1{GmJ?-!?%Lil3Pz*F)Yz zljNp}kEV35fz-E7J$z~x`KNpR@UNb2B0AKs5?_iJq4bEN4vY9%d>1c%gH@B|lQqNh zK^^!EGy}Iymg{9u--#-@fS;HwkB%FK=C7=0CMjMnetNF_-hdXYjyfhvFR`5tN&cj7-ykvDMP;Har`v-|DDo*ASq zLC{a2A?YY|cpP~?n$kZ(G$!?@c5?^5vNjI}ifM^O>*J2YOaRD9t^WCQ$L&LE0zGHx zn*%g|B3_)G($7_jcU${K@vs$&fK<^E-=Ej51oG0VNcnOozgvFbqyw+{Oy=MLfsPfv zG*uoQdNiS5)g8F~WOqp4{o+x4&qU2$80mp&@&^6ei5t&!eC{7J7(qN?x_s;{2{4#= z-E?`q{%&j6)$UMetz7I%0De#V~EeG~UX+%Iuq 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

%u@DHB536zwt{5-h7X*D%E}PN;p0p#kUiA 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 S1NblCcfcQ(yYxRT8UF`}Yguyu delta 61207 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 diff --git a/BIN/CSH.S.CORE.txt b/BIN/CSH.S.CORE.txt index ad8c1022..78cb3792 100644 --- a/BIN/CSH.S.CORE.txt +++ b/BIN/CSH.S.CORE.txt @@ -140,59 +140,64 @@ CSH.Run.1 cmp #C.CR empty line.... .10 jsr CSH.IsLetter bcc .20 +* TODO: PREOPS ++ --..... - - bcs .29 error, todo : PREOPS ++ --..... + bcs .29 *-------------------------------------- .20 >LDYA L.CSH.TMODS jsr CSH.LookupID bcs .50 - jsr CSH.tDecl.JMP + jsr CSH.tDecl bcs .59 - jsr CSH.AddSymbol add with undef value... - bcs .99 OOM or DUP + >STYA ZPVarType Type/Qual + jsr CSH.AddSymbol add with undef value... + bcs .29 OOM or DUP + + lda ZPVarQual + bit #CSH.Q.FUNC + bne .21 + jsr CSH.GetCharNB bcs .99 cmp #';' - beq .8 + beq .69 cmp #'=' - bne .21 + bne .99 jsr CSH.GetNextCharNB skip '=' bcs .99 - lda ZPVarType + >LDYA ZPVarType T/Q jsr CSH.ExpEval bcs .9 - jsr CSH.SetVarValueFromStack X= Type, Set value to this var -.29 bcs .99 + jsr CSH.SetVarValue Y,A Type/qual, Set value to this var +.29 bcs .9 bra .68 -.21 cmp #'(' - bne .99 - - jsr CSH.fDecl - bcs .99 +.21 jsr CSH.fDecl + bcs .9 bra .68 *-------------------------------------- .50 jsr CSH.SavePtr Save Ptr, in case of while,for.... + >LDYA L.CSH.KW jsr CSH.LookupID bcs .6 not an internal CSH keyword.... jsr CSH.KW.JMP .59 bcs .9 - bra .8 -.6 jsr CSH.GetVar + bra .8 +*-------------------------------------- +.6 jsr CSH.GetVar I = ? bcs .7 >STYA ZPVarID @@ -202,8 +207,13 @@ CSH.Run.1 cmp #C.CR empty line.... lda ZPVarQual bit #CSH.Q.FUNC beq .60 - + ldy #0 func( ? + lda #0 + jsr CSH.fExec + bcs .9 + + bra .8 *-------------------------------------- .60 jsr CSH.GetCharNB bcs .9 @@ -214,27 +224,29 @@ CSH.Run.1 cmp #C.CR empty line.... jsr CSH.GetNextChar Skip = bcs .99 - lda ZPVarType + >LDYA ZPVarType T/Q jsr CSH.ExpEval bcs .9 - jsr CSH.SetVarValueFromStack X = Exp Type + jsr CSH.SetVarValue bcs .9 .68 jsr CSH.GetCharNB cmp #';' - beq .8 +.69 beq .8 .99 lda #E.CSYN sec .9 rts - -.7 lda #0 no return value type check required - jsr CSH.fCall +*-------------------------------------- +.7 ldy #0 no return value type check required + lda #0 + + jsr CSH.fCall Y,A = Type/Qual bcs .9 - jsr CSH.GetVarSize X = returned value type - clc A = Sizeof CC to ignore Pointer hMem + jsr CSH.GetVarSize Y,A = returned value type + clc A = Sizeof, CC to ignore Pointer hMem adc pStack sta pStack Discard value on stack @@ -260,10 +272,12 @@ CSH.COMMENTS jsr CSH.GetNextChar *-------------------------------------- CSH.SkipLine jsr CSH.GetNextChar bcs .9 + cmp #C.CR bne CSH.SkipLine - clc + jmp CSH.GetNextChar Skip CR + .9 rts *-------------------------------------- CSH.SavePtr >LDYA ZPInputBufPtr @@ -328,9 +342,10 @@ CSH.Lookup phy Y = len >LDA.G CSH.LookupOpt bpl .1 - ldy #$0 Start at Y=1 for VOID func() + ldy #$0 Start at Y=2 for VOID func() .6 iny + iny lda (ZPPtr1),y bne .6 @@ -342,9 +357,27 @@ CSH.Lookup phy Y = len sec rts *-------------------------------------- -CSH.ZPPtr1Next inc ZPPtr1 +CSH.ZPPtr1GetNextW + jsr CSH.ZPPtr1NextW +*-------------------------------------- +CSH.ZPPtr1GetW lda (ZPPtr1) + beq .8 + + pha + + ldy #1 + lda (ZPPtr1),y + ply + +.8 rts +*-------------------------------------- +CSH.ZPPtr1NextW jsr .1 + +.1 inc ZPPtr1 bne .8 + inc ZPPtr1+1 + .8 rts *-------------------------------------- CSH.ZPPtr1AddAp1 @@ -363,7 +396,8 @@ CSH.AddSymbol >LDA.G CSH.hSymbols bcs .9 >STYA ZPVarID - ldx ZPVarType + + >LDYA ZPVarType jsr CSH.GetVarSize CS if pointer sta ZPVarSizeOf @@ -386,10 +420,33 @@ CSH.AddSymbol >LDA.G CSH.hSymbols bcs .99 - >PUSHB.G CSH.hSymbols + jsr CSH.GetCharNB + bcs .8 + + cmp #'(' + beq .7 + + lda ZPVarQual + and #CSH.Q.FUNC + beq .8 + + lda #E.CSYN + sec + rts + +.7 lda #CSH.Q.FUNC + tsb ZPVarQual + + lda ZPCSHfDecl + sta ZPVarDefPtr + + lda ZPCSHfDecl+1 + sta ZPVarDefPtr+1 + +.8 >PUSHB.G CSH.hSymbols >PUSHW ZPVarID >PUSHWI ZPVarDef - >PUSHWI 6 + >PUSHWI 8 >SYSCALL SListAddData .9 rts @@ -397,91 +454,288 @@ CSH.AddSymbol >LDA.G CSH.hSymbols * sec rts *-------------------------------------- -CSH.fDecl lda ZPCSHfDecl - sta ZPVarDataPtr - - lda ZPCSHfDecl+1 - sta ZPVarDataPtr+1 +* ZPVarDataPtr = fDef +*-------------------------------------- +CSH.fExec ldx ZPPtr1 + phx + ldx ZPPtr1+1 local : fdef Ptr + phx + ldx ZPPtr2 local : type + phx + ldx ZPPtr2+1 local : qual + phx + ldx ZPPtr3 local : variadic size + phx + ldx ZPPtr3+1 local : f + phx - lda ZPVarID + >STYA ZPPtr2 save Type/qual + + >LDYA ZPVarDefPtr + >STYA ZPPtr1 + + stz ZPPtr3 Reset VARIADIC byte count + + jsr CSH.GetNextCharNB skip '(' + bcs .10 + + jsr CSH.ZPPtr1GetW Y,A = Return value Type/Qual + + ldx ZPPtr2 + beq .1 no check required + + cpy ZPPtr2 + bne .91 + + cmp ZPPtr2+1 + bne .91 + +.1 eor #CSH.Q.FUNC + >STYA ZPPtr2 this will be the returned type/qual + + jsr CSH.ZPPtr1GetNextW advance to arg list type + beq .7 end of list, go check ending ')' +*-------------------------------------- +.3 cpy #CSH.T.VARIADIC if VARIADIC, don't advance to next arg and assume type = 0 + bne .4 + + ldy #0 + lda #0 + +.4 jsr CSH.ExpEval Y,A = 0 if VARIADIC + bcs .93 + + jsr CSH.GetVarSize Y,A = Var Type/Qual + + tax + lda (ZPPtr1) + eor #CSH.T.VARIADIC + bne .5 + + txa + clc make sure pointer only 2 bytes + adc ZPPtr3 + sta ZPPtr3 Add to byte count + bra .51 stay on VARIADIC tag + +.5 jsr CSH.ZPPtr1NextW + +.51 jsr CSH.GetCharNB +.10 bcs .90 + + cmp #',' + bne .6 + + jsr CSH.GetNextCharNB Skip ',' + + jsr CSH.ZPPtr1GetW + bne .3 Another ARG.... + +.52 bra .90 extra args....error + +.6 cmp #')' + bne .90 + + jsr CSH.ZPPtr1GetW + beq .8 no more arg after ')', exit + + cpy #CSH.T.VARIADIC + bne .90 missing arg + + >PUSHB ZPPtr3 push VARIADIC byte count + +.7 jsr CSH.GetCharNB + bcs .90 + + cmp #')' + bne .90 + +.8 jsr CSH.GetNextCharNB Skip ) + +* ldx ZPPtr3+1 +* jsr CSH.Exec +* bcs .93 + + >LDYA ZPPtr2 type/qual + bra .93 + +.90 lda #E.CSYN + bra .92 + +.91 lda #E.TMISMATCH + +.92 sec + +.93 plx + stx ZPPtr3+1 + plx + stx ZPPtr3 + + plx + stx ZPPtr2+1 + plx + stx ZPPtr2 + + plx + stx ZPPtr1+1 + plx + stx ZPPtr1 + +.99 rts +*-------------------------------------- +CSH.fDecl >ENTER 2 + + lda #0 + sta (pStack) hLocal + + lda ZPVarType jsr CSH.fDeclAddA - lda ZPVarID+1 + lda ZPVarQual jsr CSH.fDeclAddA - >DEBUG + jsr CSH.GetNextCharNB Skip ( bcs .9 .1 cmp #')' - beq .5 + beq .6 .2 jsr CSH.fDeclGetArg bcs .99 + pha + + tya + jsr CSH.fDeclAddA + + pla + jsr CSH.fDeclAddA + jsr CSH.GetCharNB bcs .9 + + jsr CSH.IsLetter + bcs .5 - cmp #')' - beq .5 +* TODO: AddLocal - cmp #',' - bne .9 - - jsr CSH.GetNextCharNB Skip , +.3 jsr CSH.GetNextCharNB bcs .9 + jsr CSH.IsLetterOrDigit + bcc .3 + + + +.5 cmp #')' + beq .6 + + cmp #',' + bne .9 + + jsr CSH.GetNextCharNB Skip , + bcs .9 + bra .2 -.5 jsr CSH.GetNextCharNB Skip ) +.6 jsr CSH.GetNextCharNB Skip ) bcs .9 cmp #';' - bne .9 - - jsr CSH.GetNextCharNB Skip ; + beq .7 + + +* TODO: f() body + + bra .9 +*-------------------------------------- +.7 lda #0 +* sta ZPVarDataPtr +* sta ZPVarDataPtr+1 .8 lda #0 - sta (ZPCSHfDecl) - - jmp CSH.SetVarValueFromStack + jsr CSH.fDeclAddA + + clc + bra .99 .9 lda #E.CSYN sec -.99 rts + +.99 >LEAVE + rts *-------------------------------------- -CSH.fDeclGetArg >ENTER 4 - - >LDYA L.CSH.TMODS +CSH.fDeclGetArg lda (ZPInputBufPtr) + cmp #'.' + bne .5 + + ldx #2 + +.1 jsr CSH.GetNextChar + bcs .9 + + cmp #'.' + bne .9 + + dex + bne .1 + + jsr CSH.GetNextCharNB + bcs .9 + + eor #')' + bne .9 + + ldy #CSH.T.VARIADIC Type +* lda #0 Qual +* clc + rts + +.5 >LDYA L.CSH.TMODS jsr CSH.LookupID bcs .9 - + jsr CSH.tDecl bcs .9 - - + +* Y,A = Type/Qual + bra .8 - + .9 lda #E.CSYN sec -.8 >LEAVE - rts +.8 rts *-------------------------------------- CSH.fDeclAddA sta (ZPCSHfDecl) inc ZPCSHfDecl bne .8 - - inc ZPCSHfDecl+1 - -.8 rts -*-------------------------------------- -CSH.tDecl jsr CSH.tDecl.JMP - bcs .9 - - - -.9 rts -CSH.tDecl.JMP jmp (J.CSH.TMODS,x) + inc ZPCSHfDecl+1 + +.8 rts +*-------------------------------------- +CSH.tDecl >ENTER 2 + lda #0 + sta (pStack) Type + ldy #1 + sta (pStack),y Qual + + jsr .7 + bcs .99 + + ldy #1 + lda (pStack),y + pha + lda (pStack) + tay Y = Type + pla A = Qual + + clc + +.99 >LEAVE + rts + +.7 jmp (J.CSH.TMODS,x) *-------------------------------------- CSH.NewKey >PUSHA >PUSHW ZPInputBufPtr @@ -489,6 +743,8 @@ CSH.NewKey >PUSHA bcs .9 pha + phy + txa * clc adc ZPInputBufPtr @@ -498,15 +754,18 @@ CSH.NewKey >PUSHA inc ZPInputBufPtr+1 .1 clc + ply pla .9 rts *-------------------------------------- -* X=Type +* Y,A = Type/Qual *-------------------------------------- -CSH.SetVarValueFromStack - cpx ZPVarType X = type +CSH.SetVarValue cpy ZPVarType bne .99 + cmp ZPVarQual + bne .99 + ldy #0 .1 lda (pStack) @@ -565,9 +824,12 @@ CSH.Get >PUSHW ZPInputBufPtr adc ZPInputBufPtr sta ZPInputBufPtr bcc .1 + inc ZPInputBufPtr+1 clc + .1 pla Y,A = VarID + .9 rts *-------------------------------------- CSH.GetVarDef phy @@ -580,85 +842,18 @@ CSH.GetVarDef phy >PUSHA KeyID >PUSHWI ZPVarDef - >PUSHWI 6 6 bytes + >PUSHWI 8 8 bytes >PUSHWI 0 From Start >SYSCALL SListGetData rts *-------------------------------------- -* Input : -* X=Var Type (or 0) -* YA=VarID -* Output : Stack, X = Var Type -*-------------------------------------- -CSH.GetVarValueOnStack - phx - phy - pha - >PUSHB.G CSH.hSymbols - - pla - >PUSHA - pla - >PUSHA KeyID - - >PUSHEA.G CSH.VarDef - >PUSHWI 6 6 bytes - >PUSHWI 0 From Start - >SYSCALL SListGetData - plx - - bcs .9 - - txa - beq .1 any type - - >CMP.G CSH.VarDef Type - beq .2 - - and #CSH.Q.PPPOINTER - beq .99 not pointer....mismatch - - >EOR.G CSH.VarDef - and #CSH.Q.PPPOINTER - bne .99 compare only pointer depth - -.1 >LDA.G CSH.VarDef - beq * - -.2 tax - jsr CSH.GetVarSize - pha - - >LDA.G CSH.VarDef+4 - sta ZPPtr3 - iny - lda (pData),y - sta ZPPtr3+1 - - ply - -.3 dey - lda (ZPPtr3),y - >PUSHA - tya - bne .3 - - >LDA.G CSH.VarDef - tax - clc X = Var Type -.9 rts - -.99 lda #E.TMISMATCH - sec - rts -*-------------------------------------- -* Input : Value on Stack, X = Var Type +* Input : Value on Stack, Y,A = Type/Qual * Output : CC = true, CS = false *-------------------------------------- -CSH.IsValue0 cpx #CSH.T.FLOAT +CSH.IsValue0 cpy #CSH.T.FLOAT bcc .1 char,int,long - ldy CSH.TYPESIZE,x + lda CSH.TYPESIZE-1,y lda (ZPVarDataPtr),y bne .9 @@ -763,10 +958,13 @@ CSH.SkipBlock ldy #0 not in "", TOTO:skip comments .1 jsr CSH.GetNextCharNB bcs .9 + cmp #'{' bne .2 + tya bmi .1 + inx bra .1 @@ -775,55 +973,66 @@ CSH.SkipBlock ldy #0 not in "", TOTO:skip comments tya bmi .1 + dex bne .1 + clc rts .3 cmp #'"' bne .1 + tya eor #$ff tay bra .1 - jmp CSH.GetNextCharNB skip '}' + .9 rts *-------------------------------------- CSH.GetCharNB jsr CSH.GetChar bcs CSH.GetNextCharNB.RTS + jsr CSH.CheckCharNB bcc CSH.GetNextCharNB.RTS *-------------------------------------- CSH.GetNextCharNB jsr CSH.GetNextChar bcs CSH.GetNextCharNB.RTS + jsr CSH.CheckCharNB bcs CSH.GetNextCharNB + CSH.GetNextCharNB.RTS rts *-------------------------------------- CSH.CheckSpace jsr CSH.GetChar bcs .90 + cmp #C.SPACE bne .90 jsr CSH.GetNextCharNB - bcc CSH.GetNextCharNB.RTS + bcc .99 .90 lda #E.CSYN sec - rts +.99 rts *-------------------------------------- CSH.CheckCharNB cmp #C.SPACE beq .9 + cmp #C.LF beq .9 + cmp #C.TAB beq .9 + clc .9 rts *-------------------------------------- CSH.GetNextChar inc ZPInputBufPtr bne CSH.GetChar + inc ZPInputBufPtr+1 *-------------------------------------- CSH.GetChar lda (ZPInputBufPtr) @@ -911,29 +1120,26 @@ CSH.IsLetterRTS rts *--------------------------------------- CSH.IsDigit10 cmp #'0' bcc .9 + cmp #'9'+1 rts cc if ok, cs if not + .9 sec rts *-------------------------------------- -* in : X = type, out : X = type, A = size +* in : Y,A = type/qual +* out : A = size *-------------------------------------- -CSH.GetVarSize txa - and #CSH.Q.PPPOINTER +CSH.GetVarSize and #CSH.Q.PPPOINTER bne .2 - txa - and #$f - phx - tax - lda CSH.TYPESIZE,x - plx + lda CSH.TYPESIZE-1,y clc rts -.2 sec +1 for hMem Storage - lda #2 +.2 lda #2 pointer + sec +1 for hMem Storage rts *-------------------------------------- MAN diff --git a/BIN/CSH.S.EXEC.txt b/BIN/CSH.S.EXEC.txt index ed743890..97915a11 100644 --- a/BIN/CSH.S.EXEC.txt +++ b/BIN/CSH.S.EXEC.txt @@ -2,7 +2,7 @@ NEW AUTO 3,1 .LIST OFF *-------------------------------------- -* Y = Type, A = OP +* Y,A = Type/Qual, X = OP *-------------------------------------- CSH.BOP.EXEC cpy #CSH.T.UINT bcs .3 @@ -17,13 +17,12 @@ CSH.BOP.EXEC cpy #CSH.T.UINT sec rts -.1 tax - jmp (J.CSH.bBOPS,x) +.1 jmp (J.CSH.bBOPS,x) -.2 tax - jmp (J.CSH.cBOPS,x) +.2 jmp (J.CSH.cBOPS,x) -.3 clc +.3 txa + clc adc CSH.Type2FPU-CSH.T.UINT,y tax jsr A2osX.FPUCALL @@ -114,6 +113,8 @@ CSH.BOPS.LOR clc rts *-------------------------------------- +CSH.Exec jmp (J.CSH.EXEC,x) +**-------------------------------------- EXEC.pwr >FPU PWR clc rts @@ -190,7 +191,8 @@ EXEC.malloc >PULLYA EXEC.fopen >SYSCALL FOpen >PUSHYA *-------------------------------------- -EXEC.fclose >SYSCALL FClose +EXEC.fclose >PULLA + >SYSCALL FClose >PUSHYA *-------------------------------------- EXEC.fread >SYSCALL FRead diff --git a/BIN/CSH.S.EXP.txt b/BIN/CSH.S.EXP.txt index f9b4a2d6..a8fe6460 100644 --- a/BIN/CSH.S.EXP.txt +++ b/BIN/CSH.S.EXP.txt @@ -3,23 +3,27 @@ NEW .LIST OFF *-------------------------------------- * Input: -* ZPInputBufPtr, A = Expected type +* ZPInputBufPtr, Y,A = Expected type/qual * Output: * CS, A = EC -* CC, X = Var Type, Value on Stack +* CC, Y,A = type/qual, Value on Stack *-------------------------------------- CSH.ExpEval ldx ZPPtr1 phx ldx ZPPtr1+1 local : used by lookup phx + ldx ZPPtr2 local : VarType phx - ldx ZPPtr2+1 local : BOP + ldx ZPPtr2+1 local : VarQual phx - sta ZPPtr2 local : expected type + ldx ZPPtr3 local : BOP + phx - lda #$ff + >STYA ZPPtr2 local : expected type/qual + + lda #$ff no previous OP pha *-------------------------------------- .10 jsr CSH.GetCharNB @@ -31,12 +35,11 @@ CSH.ExpEval ldx ZPPtr1 jsr CSH.GetNextCharNB skip ( bcs .19 - lda ZPPtr2 - + >LDYA ZPPtr2 jsr CSH.ExpEval bcs .19 - stx ZPPtr2 + >STYA ZPPtr2 update type/qual jsr CSH.GetCharNB bcs .19 @@ -55,32 +58,30 @@ CSH.ExpEval ldx ZPPtr1 jsr CSH.GetDefine bcc .10 - jsr CSH.GetVar + jsr CSH.VarLookup bcs .21 - ldx ZPPtr2 YA=VarID, X=expected var type (or 0=any) - - jsr CSH.GetVarValueOnStack Y,A = VarID, Get value on stack + jsr CSH.GetValue Check type & Get value on stack bcs .29 - stx ZPPtr2 store real var type bra .30 -.21 lda ZPPtr2 var type +.21 >LDYA ZPPtr2 var type/qual jsr CSH.fCall X = function index bcs .29 - stx ZPPtr2 store real var type + >STYA ZPPtr2 store real var type bra .30 - +*-------------------------------------- .22 jsr CSH.IsDigit10 number ? bcs .24 - ldx ZPPtr2 + ldy ZPPtr2 bne .23 - ldx #CSH.T.SINT - stx ZPPtr2 + ldy #CSH.T.SINT + sty ZPPtr2 + stz ZPPtr2+1 .23 jsr CSH.GetNumOnStack bcs .29 @@ -112,31 +113,31 @@ CSH.ExpEval ldx ZPPtr1 jsr CSH.LookupOP bcs .90 - stx ZPPtr2+1 save OP(n) + stx ZPPtr3 save OP(n) -.32 pla get OP(n-1) +.32 plx get OP(n-1) bmi .33 $ff.... - cmp ZPPtr2+1 + cpx ZPPtr3 bcc .33 OP(n) has precedence, on stack : V1,V2 - ldy ZPPtr2 OP(n-1) has precedence... - + >LDYA ZPPtr2 OP(n-1) has precedence... jsr CSH.BOP.EXEC compute V(n-1) V(n) bcc .32 bcs .99 -.33 pha push back OP(n-1) - lda ZPPtr2+1 get OP(n) +.33 phx push back OP(n-1) + + lda ZPPtr3 get OP(n) pha push OP(n) on stack jmp .10 go check for next token *-------------------------------------- -.80 pla any OP on stack ? +.80 plx any OP on stack ? bmi .88 - ldy ZPPtr2 Var Type + >LDYA ZPPtr2 Var Type jsr CSH.BOP.EXEC bcc .80 @@ -148,19 +149,23 @@ CSH.ExpEval ldx ZPPtr1 bpl .99 sec - .HS 90 BCC + bra .89 + .88 clc - ldx ZPPtr2 X = Var Type + >LDYA ZPPtr2 Type/Qual + +.89 plx + stx ZPPtr3 + plx + stx ZPPtr2+1 + plx + stx ZPPtr2 + plx + stx ZPPtr1+1 + plx + stx ZPPtr1 - ply - sty ZPPtr2+1 - ply - sty ZPPtr2 - ply - sty ZPPtr1+1 - ply - sty ZPPtr1 rts *-------------------------------------- CSH.AddContCharP @@ -188,6 +193,7 @@ CSH.AddContCharP adc ZPCSHConst sta ZPCSHConst bcc .3 + inc ZPCSHConst+1 .3 jsr CSH.GetNextChar Skip " @@ -199,11 +205,9 @@ CSH.AddContCharP rts *-------------------------------------- CSH.GetNumOnStack - txa - beq .99 - - cpx #CSH.T.FLOAT + cpy #CSH.T.FLOAT bcc .1 + bne .99 >PUSHW ZPInputBufPtr @@ -215,8 +219,6 @@ CSH.GetNumOnStack .1 >PUSHW ZPInputBufPtr >PUSHWI ZPInputBufPtr >PUSHBI 10 - phx - bcc .2 >SYSCALL StrToUL @@ -224,10 +226,10 @@ CSH.GetNumOnStack .2 >SYSCALL StrToL -.3 plx - bcs .9 +.3 bcs .9 - lda CSH.TYPESIZE,x + ldy ZPPtr2 + lda CSH.TYPESIZE-1,y cmp #4 beq .8 @@ -254,6 +256,233 @@ CSH.GetNumOnStack sec rts *-------------------------------------- +CSH.VarLookup >PUSHB.G CSH.hSymbols + + >PUSHW ZPInputBufPtr + >SYSCALL SListLookup + bcs .9 + + phy + pha + + txa +* clc + adc ZPInputBufPtr + sta ZPInputBufPtr + bcc .1 + + inc ZPInputBufPtr+1 + clc + +.1 >PUSHB.G CSH.hSymbols + + pla + >PUSHA + pla + >PUSHA KeyID + + >PUSHEA.G CSH.VarDef + >PUSHWI 8 8 bytes + >PUSHWI 0 From Start + >SYSCALL SListGetData +.9 rts +*-------------------------------------- +CSH.GetValue lda ZPPtr2 target type + beq .1 + + >LDA.G CSH.VarDef Type + cmp #CSH.T.VOID + beq .11 + + cmp ZPPtr2 + bne .9 + +.11 lda ZPPtr2+1 qual + >CMP.G CSH.VarDef+1 + beq .2 + +.9 lda #E.TMISMATCH + sec + rts + +.1 >LDA.G CSH.VarDef Type + sta ZPPtr2 + iny + lda (pData),y + sta ZPPtr2+1 + +.2 lda ZPPtr3 + pha + lda ZPPtr3+1 + pha + + >LDA.G CSH.VarDef+4 + sta ZPPtr3 + iny + lda (pData),y + sta ZPPtr3+1 + + ldx ZPPtr2 + ldy CSH.TYPESIZE-1,x + +.3 dey + lda (ZPPtr3),y + >PUSHA + tya + bne .3 + + pla + sta ZPPtr3+1 + pla + sta ZPPtr3 + + clc + rts +*-------------------------------------- +* Input: +* ZPInputBufPtr, Y,A = Expected type/qual +* Output: +* CS, A = EC +* CC, Y,A = type/qual, Result on Stack +*-------------------------------------- +CSH.fCall ldx ZPPtr1 + phx + ldx ZPPtr1+1 local : fdef Ptr + phx + ldx ZPPtr2 local : type + phx + ldx ZPPtr2+1 local : qual + phx + ldx ZPPtr3 local : variadic size + phx + ldx ZPPtr3+1 local : f + phx + + >STYA ZPPtr2 save Type/qual + + stz ZPPtr3 Reset VARIADIC byte count + + >LDYA L.CSH.FN + jsr CSH.LookupFN + bcs .10 + + stx ZPPtr3+1 X = function index + + >STYA ZPPtr1 f() definition, starting at returned type + + jsr CSH.GetCharNB + bcs .10 + + cmp #'(' + bne .52 + + jsr CSH.GetNextCharNB skip '(' + + bcs .10 + + jsr CSH.ZPPtr1GetW Y,A = Return value Type/Qual + + ldx ZPPtr2 + beq .1 no check required + + cpy ZPPtr2 + bne .91 + + cmp ZPPtr2+1 + bne .91 + +.1 >STYA ZPPtr2 this will be the returned type/qual + + jsr CSH.ZPPtr1GetNextW advance to arg list type + beq .7 end of list, go check ending ')' +*-------------------------------------- +.3 cpy #CSH.T.VARIADIC if VARIADIC, don't advance to next arg and assume type = 0 + bne .4 + + ldy #0 + lda #0 + +.4 jsr CSH.ExpEval Y,A = 0 if VARIADIC + bcs .93 + + jsr CSH.GetVarSize Y,A = Var Type/Qual + + tax + lda (ZPPtr1) + eor #CSH.T.VARIADIC + bne .5 + + txa + clc make sure pointer only 2 bytes + adc ZPPtr3 + sta ZPPtr3 Add to byte count + bra .51 stay on VARIADIC tag + +.5 jsr CSH.ZPPtr1NextW + +.51 jsr CSH.GetCharNB +.10 bcs .90 + + cmp #',' + bne .6 + + jsr CSH.GetNextCharNB Skip , + jsr CSH.ZPPtr1GetW + bne .3 Another ARG.... + +.52 bra .90 extra args....error + +.6 cmp #')' + bne .90 + + jsr CSH.ZPPtr1GetW + beq .8 no more arg after ')', exit + + cpy #CSH.T.VARIADIC + bne .90 missing arg + + >PUSHB ZPPtr3 push VARIADIC byte count + bra .8 + +.7 jsr CSH.GetCharNB + bcs .90 + + cmp #')' + bne .90 + +.8 jsr CSH.GetNextCharNB Skip ) + + ldx ZPPtr3+1 + jsr CSH.Exec + bcs .93 + + >LDYA ZPPtr2 type/qual + bra .93 + +.90 lda #E.CSYN + bra .92 + +.91 lda #E.TMISMATCH + +.92 sec + +.93 plx + stx ZPPtr3+1 + plx + stx ZPPtr3 + + plx + stx ZPPtr2+1 + plx + stx ZPPtr2 + + plx + stx ZPPtr1+1 + plx + stx ZPPtr1 + +.99 rts +*-------------------------------------- MAN SAVE usr/src/bin/csh.s.exp LOAD usr/src/bin/csh.s diff --git a/BIN/CSH.S.KW.txt b/BIN/CSH.S.KW.txt index e4a8f839..a7b83459 100644 --- a/BIN/CSH.S.KW.txt +++ b/BIN/CSH.S.KW.txt @@ -18,10 +18,13 @@ CSH.IF jsr CSH.GetCharNB jsr CSH.GetNextCharNB bcs .9 - lda #0 Any var type + ldy #0 Any var type + lda #0 jsr CSH.ExpEval bcs .99 + jsr CSH.IsValue0 result in X + jsr CSH.GetCharNB bcs .99 @@ -29,16 +32,16 @@ CSH.IF jsr CSH.GetCharNB bne .9 jsr CSH.GetNextCharNB skip ')' - bcs .99 + bcs .9 cmp #'{' bne .9 jsr CSH.GetNextCharNB Skip '{' - bcs .99 + bcs .9 - jsr CSH.IsValue0 X = var type from ExpEval - bcc .6 Value=0, skip {{....}} + txa + beq .6 Value=0, skip {{....}} >LDA.G CSH.CmdSave beq .1 IF @@ -54,15 +57,16 @@ CSH.IF jsr CSH.GetCharNB lda #'}' Tell '}' is expected at the end of block jsr CSH.Push - bcs .99 - rts +.99 rts + .6 jsr CSH.SkipBlock bcc .99 + .9 lda #E.CSYN sec -.99 rts + rts *-------------------------------------- CSH.IF.END clc rts @@ -97,16 +101,20 @@ CSH.STRUCT >ENTER 4 jsr CSH.NewKey bcs .99 - sta (pStack) - + sta (pStack) Y,A = KeyID + tya + ldy #1 + sta (pStack),y jsr CSH.GetNextCharNB bcs .99 + cmp #'{' bne .99 .1 jsr CSH.GetNextCharNB bcs .99 + cmp #'}' bne .1 @@ -116,14 +124,22 @@ CSH.STRUCT >ENTER 4 .99 >LEAVE rts *-------------------------------------- -CSH.CONST lda #CSH.Q.CONST +* Type Declaration keywords +*-------------------------------------- +CSH.CONST ldy #1 - tsb ZPVarQual + lda (pStack),y + ora #CSH.Q.CONST + sta (pStack),y + + jsr CSH.CheckSpace + bcs .9 + >LDYA L.CSH.TMODS2 jsr CSH.LookupID bcs .9 - jmp (J.CSH.TMODS2-2,x) + jmp (J.CSH.TMODS2,x) .9 lda #E.CSYN sec @@ -143,10 +159,10 @@ CSH.UNSIGNED clc bcs .9 - cpx #2 - bcc .9 + cpx #CSH.T.UCHAR + bcc .9 void - cpx #8 only char int long allowed + cpx #CSH.T.SLONG+1 only char int long allowed bcs .9 plp @@ -177,44 +193,55 @@ CSH.SHORT jsr CSH.CheckSpace sec rts *-------------------------------------- -CSH.VOID ldx #CSH.T.VOID +CSH.VOID lda #CSH.T.VOID bra CSH.TYPE -CSH.SCHAR ldx #CSH.T.SCHAR - bra CSH.TYPE CSH.CHAR -CSH.UCHAR ldx #CSH.T.UCHAR +CSH.UCHAR lda #CSH.T.UCHAR bra CSH.TYPE + +CSH.SCHAR lda #CSH.T.SCHAR + bra CSH.TYPE + +CSH.UINT lda #CSH.T.UINT + bra CSH.TYPE + CSH.INT -CSH.SINT ldx #CSH.T.SINT +CSH.SINT lda #CSH.T.SINT bra CSH.TYPE -CSH.UINT ldx #CSH.T.UINT +CSH.ULONG lda #CSH.T.ULONG bra CSH.TYPE + CSH.LONG -CSH.SLONG ldx #CSH.T.SLONG +CSH.SLONG lda #CSH.T.SLONG bra CSH.TYPE -CSH.ULONG ldx #CSH.T.ULONG - bra CSH.TYPE +CSH.FLOAT lda #CSH.T.FLOAT -CSH.FLOAT ldx #CSH.T.FLOAT +CSH.TYPE sta (pStack) -CSH.TYPE stx ZPVarType - -.11 jsr CSH.GetNextCharNB + jsr CSH.GetCharNB bcs .9 - cmp #'*' + ldy #1 + +.1 cmp #'*' bne .10 - lda ZPVarType + lda (pStack),y clc adc #CSH.Q.POINTER - sta ZPVarType - bcc .11 + bcs .9 more than *** + + sta (pStack),y - bra .9 more than *** + jsr CSH.GetNextCharNB + bcc .1 + +.9 lda #E.CSYN + sec +.99 rts .10 jsr CSH.IsLetter bcs .8 @@ -226,151 +253,16 @@ CSH.TYPE stx ZPVarType sec ror bFastCall - lda #CSH.Q.FUNC - tsb ZPVarQual + ldy #1 + lda (pStack),y + ora #CSH.Q.FUNC + sta (pStack),y jsr CSH.GetNextCharNB bcs .9 next char is an identifier, ",", "(",")" .8 clc rts - -.9 lda #E.CSYN - sec -.99 rts -*-------------------------------------- -* Input: -* ZPInputBufPtr, A = Expected type -* Output: -* CS, A = EC -* CC, Result on Stack, X = Type -*-------------------------------------- -CSH.fCall ldx ZPPtr1 - phx - ldx ZPPtr1+1 local : fdef - phx - ldx ZPPtr2 local : type - phx - ldx ZPPtr2+1 local : variadic size - phx - - sta ZPPtr2 save Type - stz ZPPtr2+1 Reset VARIADIC byte count - >LDYA L.CSH.FN - jsr CSH.LookupFN - phx X = function index - bcs .10 - - >STYA ZPPtr1 f() definition, starting at returned type - - jsr CSH.GetCharNB - bcs .10 - - cmp #'(' - bne .52 - - jsr CSH.GetNextCharNB skip '(' -.10 bcs .90 - - lda ZPPtr2 - bne .11 - - lda (ZPPtr1) - sta ZPPtr2 - bra .1 expected type is 0, no check - -.11 cmp (ZPPtr1) Get Return value Type - bne .91 - -.1 jsr CSH.ZPPtr1Next advance to arg list type - - lda (ZPPtr1) get type of first arg - beq .7 end of list, go check ending ')' -*-------------------------------------- -.3 eor #CSH.T.VARIADIC if VARIADIC, don't advance to next arg and assume type = 0 - beq .4 - - eor #CSH.T.VARIADIC restore type... - -.4 jsr CSH.ExpEval A=0 if VARIADIC - bcs .9 X = Var Type - - lda (ZPPtr1) get current arg type - eor #CSH.T.VARIADIC - bne .5 - - jsr CSH.GetVarSize X = Var Type - - clc make sure pointer only 2 bytes - adc ZPPtr2+1 - sta ZPPtr2+1 Add to byte count - bra .51 - -.5 jsr CSH.ZPPtr1Next - -.51 jsr CSH.GetCharNB - bcs .90 - - cmp #',' - bne .6 - - jsr CSH.GetNextCharNB Skip , - lda (ZPPtr1) - bne .3 Another ARG.... - -.52 bra .90 extra args....error - -.6 cmp #')' - bne .90 - lda (ZPPtr1) - beq .8 no more arg after ')', exit - - eor #CSH.T.VARIADIC - bne .90 missing arg - - >PUSHB ZPPtr2+1 push VARIADIC byte count - bra .8 -.7 jsr CSH.GetCharNB - bcs .90 - cmp #')' - bne .90 - -.8 jsr CSH.GetNextCharNB Skip ) - - plx restore X = function index - ldy ZPPtr2 get type in Y - pla - sta ZPPtr2+1 - pla - sta ZPPtr2 - pla - sta ZPPtr1+1 - pla - sta ZPPtr1 - phy - jsr CSH.fCall.Exec - plx restore returned type - rts - -.90 lda #E.CSYN - .HS 2C BIT ABS -.91 lda #E.TMISMATCH - sec - -.9 plx Discard function index - - plx - stx ZPPtr2+1 - plx - stx ZPPtr2 - plx - stx ZPPtr1+1 - plx - stx ZPPtr1 - -.99 rts -*-------------------------------------- -CSH.fCall.Exec jmp (J.CSH.EXEC,x) *-------------------------------------- MAN SAVE usr/src/bin/csh.s.kw diff --git a/BIN/CSH.S.txt b/BIN/CSH.S.txt index c39b142c..be7391f1 100644 --- a/BIN/CSH.S.txt +++ b/BIN/CSH.S.txt @@ -10,20 +10,19 @@ NEW .INB inc/mli.i .INB inc/mli.e.i *-------------------------------------- -CSH.T.VOID .EQ 0 -CSH.T.UCHAR .EQ 1 -CSH.T.SCHAR .EQ 2 -CSH.T.UINT .EQ 3 -CSH.T.SINT .EQ 4 -CSH.T.ULONG .EQ 5 -CSH.T.SLONG .EQ 6 -CSH.T.FLOAT .EQ 7 +CSH.T.VOID .EQ 1 +CSH.T.UCHAR .EQ 2 +CSH.T.SCHAR .EQ 3 +CSH.T.UINT .EQ 4 +CSH.T.SINT .EQ 5 +CSH.T.ULONG .EQ 6 +CSH.T.SLONG .EQ 7 +CSH.T.FLOAT .EQ 8 CSH.T.VARIADIC .EQ $FF *-------------------------------------- CSH.Q.POINTER .EQ %01000000 CSH.Q.PPOINTER .EQ %10000000 CSH.Q.PPPOINTER .EQ %11000000 -CSH.Q.PCONST .EQ %00100000 CSH.Q.CONST .EQ %00010000 CSH.Q.FUNC .EQ %00001000 *-------------------------------------- @@ -36,30 +35,26 @@ ZPCSHCode .BS 2 ZPCSHConst .BS 2 ZPCSHData .BS 2 ZPCSHStack .BS 2 -ZPCSHfDecl .BS 2 +ZPCSHfDecl .BS 2 +ZPInputBufPtr .BS 2 +hDefine .BS 1 +hInclude .BS 1 ZPVarID .BS 2 -ZPVarDef .EQ * + +ZPVarDef .EQ * ZPVarType .BS 1 ZPVarQual .BS 1 ZPVarSizeOf .BS 2 ZPVarDataPtr .BS 2 +ZPVarDefPtr .BS 2 -ZPInputBufPtr .BS 2 - - +ArgIndex .BS 1 bFastCall .BS 1 -bCompil .BS 1 - -hDefine .BS 1 -hInclude .BS 1 - ZPPtr1 .BS 2 ZPPtr2 .BS 2 ZPPtr3 .BS 2 -ArgIndex .BS 1 - ZS.END .ED *-------------------------------------- * File Header (16 Bytes) @@ -163,9 +158,12 @@ J.CSH.UTYPES .DA CSH.UCHAR J.CSH.STYPES .DA CSH.SCHAR .DA CSH.SINT .DA CSH.SLONG +*-------------------------------------- J.CSH.KW.END .DA CSH.IF.END .DA CSH.WHILE.END *-------------------------------------- +L.CSH.LIBC .DA CSH.LIBC +*-------------------------------------- J.CSH.EXEC .DA EXEC.pwr .DA EXEC.log .DA EXEC.sqr @@ -239,12 +237,12 @@ CS.RUN >PUSHW L.MSG.GREETINGS sec rts *-------------------------------------- -CS.RUN.ARGS inc ArgIndex +CS.RUN.ARGS inc ArgIndex lda ArgIndex >SYSCALL ArgV bcs .7 - + >STYA ZPPtr1 lda (ZPPtr1) cmp #'-' @@ -276,7 +274,7 @@ CS.RUN.ARGS inc ArgIndex bcs .9 >STYA ZPInputBufPtr - + txa >STA.G hFileBuf bra CS.RUN.ARGS @@ -317,23 +315,24 @@ PrintErrMsg lda hDefine >LDYA.G CSH.SaveDefine >STYA ZPInputBufPtr - + .10 lda hInclude beq .11 - - + + bra .12 .11 >LDA.G hFileBuf .12 >SYSCALL GetMemPtr >STYA ZPPtr1 - + stz ZPPtr2 stz ZPPtr2+1 Line counter .1 inc ZPPtr2 bne .2 + inc ZPPtr2+1 .2 >LDYA ZPPtr1 @@ -343,9 +342,11 @@ PrintErrMsg lda hDefine inc ZPPtr1 bne .3 + inc ZPPtr1+1 .3 cmp #C.CR bne .20 Scan until EoL + ldx ZPPtr1 cpx ZPInputBufPtr lda ZPPtr1+1 @@ -354,7 +355,7 @@ PrintErrMsg lda hDefine .4 >LDA.G bTrace bmi .5 - + jsr PrintTraceMsg.3 .5 lda ZPPtr3 @@ -362,7 +363,7 @@ PrintErrMsg lda hDefine bne .6 lda ZPPtr3+1 - cmp ZPInputBufPtr+1 + cmp ZPInputBufPtr+1 beq .8 .6 ldy #S.PS.hStdErr @@ -375,7 +376,7 @@ PrintErrMsg lda hDefine inc ZPPtr3+1 bra .5 - + .8 ldy #S.PS.hStdErr lda (pPS),y >PUSHA @@ -389,9 +390,9 @@ PrintErrMsg lda hDefine PrintDebugMsg >LDYA pStack >STYA ZPPtr2 >PUSHW L.MSG.DEBUG - + >PUSHW ZPPtr2 - + >PUSHBI 2 >SYSCALL PrintF rts @@ -403,16 +404,16 @@ PrintTraceMsg.3 ldy #S.PS.hStdErr >PUSHA >PUSHBI '>' >SYSCALL FPutC - + ldy #$ff .1 iny lda (ZPPtr3),y beq .8 - + cmp #C.CR beq .8 - + phy pha ldy #S.PS.hStdErr @@ -423,11 +424,11 @@ PrintTraceMsg.3 ldy #S.PS.hStdErr >SYSCALL FPutC ply bra .1 - + .8 ldy #S.PS.hStdErr lda (pPS),y >PUSHA - + >PUSHW L.MSG.ECHOCRLF >PUSHBI 0 >SYSCALL FPrintF @@ -449,8 +450,8 @@ MSG.USAGE .AS "Usage : CSH