NEW AUTO 3,1 *-------------------------------------- * Built in Keywords *-------------------------------------- KW.IF jsr STMT.NewCPS00 bcs .99 jsr CC.GetCharNB bcs .9 cmp #'(' bne .9 jsr CORE.GetNCharNB bcs .9 jsr EXP.Eval00 Any var type bcs .99 jsr KW.TestZero Y,A=T/Q lda #'E' jsr SYM.LookupLabelA bcs .99 lda #$4C emit JMP else jsr CODE.TOABSYX bcs .99 jsr CC.GetCharNB bcs .99 cmp #')' bne .9 jmp STMT.SetCPSType .9 lda #E.CSYN sec .99 rts *-------------------------------------- KW.IF.END jsr CORE.GetCharNBNL bcs .1 cmp #';' beq .1 >LDYA L.CC.KW2.IF Check allowed KW for IF.... jsr CC.LookupID bcc .2 .1 lda #'E' define ELSE Label jsr SYM.NewLabelA bcs .99 clv pop context rts *-------------------------------------- .2 lda #'X' jsr SYM.LookupLabelA bcs .99 lda #$4C emit JMP exit jsr CODE.TOABSYX bcs .99 lda #'E' define ELSE Label jsr SYM.NewLabelA bcs .99 lda #KW.ELSE.ID replace IF by ELSE keyword ldy CStackPtr sta (ZPCCStack),y jsr STMT.SetCPSType bcs .99 bit .99 set V : DONT pop context rts .9 lda #E.CSYN sec .99 rts *-------------------------------------- KW.ELSE lda #E.CSYN illegal sec rts *-------------------------------------- KW.ELSE.END lda #'X' define EXIT Label jsr SYM.NewLabelA bcs .99 clv pop context .99 rts *-------------------------------------- KW.WHILE jsr STMT.NewCPS00 bcs .99 lda #'C' define CONT Label jsr SYM.NewLabelA bcs .99 jsr CC.GetCharNB bcs .9 cmp #'(' bne .9 jsr CORE.GetNCharNB bcs .9 jsr EXP.Eval00 Any var type bcs .99 jsr KW.TestZero lda #'B' jsr SYM.LookupLabelA bcs .99 lda #$4C emit JMP break: jsr CODE.TOABSYX bcs .99 jsr CC.GetCharNB bcs .99 cmp #')' bne .9 jmp STMT.SetCPSType .9 lda #E.CSYN sec .99 rts *-------------------------------------- KW.WHILE.END >LDYA L.PCC.SLEEP jsr CODE.EmitPCC bcs .99 lda #'C' jsr SYM.LookupLabelA bcs .99 lda #$4C jsr CODE.TOABSYX emit JMP cont: bcs .99 lda #'B' define BREAK Label jsr SYM.NewLabelA bcs .99 clv pop context .99 rts *-------------------------------------- KW.DO jsr STMT.NewCPS00 bcs .99 lda #'C' define CONT Label jsr SYM.NewLabelA bcs .99 jmp STMT.SetCPSType .99 rts *-------------------------------------- KW.DO.END >LDYA L.CC.KW2.DO Check allowed KW for DO.... jsr CC.LookupID bcs .9 jsr CC.GetCharNB bcs .9 cmp #'(' bne .9 jsr CORE.GetNCharNB bcs .9 jsr EXP.Eval00 Any var type bcs .99 jsr KW.TestnZero lda #'C' jsr SYM.LookupLabelA bcs .99 lda #$4C emit JMP cont jsr CODE.TOABSYX bcs .99 lda #'B' define BREAK Label jsr SYM.NewLabelA bcs .99 jsr CC.GetCharNB bcs .99 cmp #')' bne .9 jsr CORE.GetNCharNB bcs .9 clv pop context clc rts .9 lda #E.CSYN sec .99 rts *-------------------------------------- * for (s1;e2;s3) s; * * { <- new scope : allows for(int i=1; ....) * s1; * loop: * while (e2) jmp break: * { * s; jsr s: * cont: * s3; jmp loop: * } * s: * ; * break: * } *-------------------------------------- KW.FOR jsr CC.GetCharNB bcs .29 cmp #'(' bne .29 jsr STMT.NewCPS00 bcs .29 jsr CORE.GetNCharNB skip '(' bcs .29 >LDYA L.CC.TYPEQUAL jsr CC.LookupID bcs .1 jsr DECL.X bcc .2 .19 rts .1 jsr STMT.Get get s1 bcs .19 * jsr KW.StackDiscard .2 jsr CC.GetCharNB bcs .9 cmp #';' bne .9 jsr CORE.GetNCharNB skip ';' bcs .9 *-------------------------------------- lda #'L' LOOP Label jsr SYM.NewLabelA bcs .99 jsr EXP.Eval00 get e2 .29 bcs .99 jsr KW.TestZero bcs .99 lda #'B' jsr SYM.LookupLabelA bcs .99 lda #$4C emit JMP break: jsr CODE.TOABSYX lda #'S' jsr SYM.LookupLabelA bcs .99 lda #$20 emit JSR s: jsr CODE.TOABSYX jsr CC.GetCharNB bcs .9 cmp #';' bne .9 jsr CORE.GetNCharNB skip ';' bcs .9 *-------------------------------------- lda #'C' CONT Label jsr SYM.NewLabelA bcs .99 jsr STMT.Get get s3 bcs .99 * jsr KW.StackDiscard jsr CC.GetCharNB bcs .9 cmp #')' bne .9 lda #'L' jsr SYM.LookupLabelA bcs .99 lda #$4C jsr CODE.TOABSYX emit JMP loop lda #'S' S Label jsr SYM.NewLabelA bcs .99 jmp STMT.SetCPSType .9 lda #E.CSYN sec .99 rts *-------------------------------------- KW.FOR.END lda #$60 jsr CODE.EmitByte set RTS for JSR code; bcs .99 lda #'B' define BREAK Label jsr SYM.NewLabelA bcs .99 clv pop context .99 rts *-------------------------------------- KW.SWITCH jsr CC.GetCharNB bcs .98 cmp #'(' bne .98 jsr CORE.GetNCharNB bcs .98 jsr EXP.Eval00 Any var type bcs .99 Y,A=T/Q tax bne .97 cpy #SYM.T.UCHAR bcc .97 cpy #SYM.T.ULONG bcs .97 cpy #SYM.T.SINT+1 bcs .1 >LDYA L.PCC.8to16 make char an int jsr CODE.EmitPCC bcs .99 .1 >LDYAI 256 >SYSCALL GetMem bcs .99 txa jsr CC.Push push CPS.hMEM lda #0 jsr CC.Push push CPS.Ptr bcs .99 jsr STMT.NewCPS bcs .99 jsr CC.GetCharNB bcs .99 cmp #')' bne .98 lda #'J' jsr SYM.LookupLabelA bcs .99 lda #$4C emit JMP JmpTable jsr CODE.TOABSYX bcs .99 jmp STMT.SetCPSType .97 lda #E.TMISMATCH sec rts .98 lda #E.CSYN sec .99 KW.SWITCH.RTS rts *-------------------------------------- KW.SWITCH.END lda #'J' define JMP Label jsr SYM.NewLabelA bcs KW.SWITCH.RTS lda CStackPtr clc adc #CPS.hMEM tay lda (ZPCCStack),y >SYSCALL GetMemPtr >STYA ZPPtr1 lda CStackPtr clc adc #CPS.Ptr tay lda (ZPCCStack),y sta ZPPtr2+1 stz ZPPtr2 .1 ldy ZPPtr2 cpy ZPPtr2+1 beq .2 lda (ZPPtr1),y pha iny lda (ZPPtr1),y tax pla jsr CODE.LDAXI bcs .99 >LDYA L.PCC.JmpOnYA jsr CODE.EmitPCC bcs .99 ldy ZPPtr2 iny iny lda (ZPPtr1),y tax iny lda (ZPPtr1),y iny sty ZPPtr2 tay lda #$4C emit JMP Case ... jsr CODE.TOABSYX bcs .99 bra .1 .2 >LDYA L.PCC.Pop16 jsr CODE.EmitPCC bcs .99 lda #'D' jsr SYM.LookupLabelA bcs .3 lda #$4C emit JMP Default jsr CODE.TOABSYX bcs .99 .3 lda #'B' define BREAK Label jsr SYM.NewLabelA bcs .99 lda CStackPtr clc adc #CPS.hMEM tay lda (ZPCCStack),y >SYSCALL FreeMem clv pop context .99 rts *-------------------------------------- KW.CASE ldy CStackPtr beq .98 lda (ZPCCStack),y cmp #KW.SWITCH.ID SWITCH ?? bne .98 tya clc adc #CPS.hMEM tay lda (ZPCCStack),y >SYSCALL GetMemPtr >STYA ZPPtr1 jsr EXP.GetIntegral bcs .99 >STYA ZPPtr2 lda CStackPtr clc adc #CPS.Ptr tay lda (ZPCCStack),y tay lda ZPPtr2 sta (ZPPtr1),y iny lda ZPPtr2+1 sta (ZPPtr1),y iny lda ZPCCCode sta (ZPPtr1),y iny lda ZPCCCode+1 sta (ZPPtr1),y iny beq .97 phy lda CStackPtr clc adc #CPS.Ptr tay pla sta (ZPCCStack),y jsr CC.GetCharNB bcs .98 cmp #':' bne .98 jsr CORE.GetNCharNB skip ':' clc rts .97 lda #E.BUF sec rts .98 lda #E.CSYN sec .99 rts *-------------------------------------- KW.DEFAULT ldy CStackPtr beq .9 lda (ZPCCStack),y cmp #KW.SWITCH.ID bne .9 jsr CC.GetCharNB bcs .9 cmp #':' bne .9 jsr CORE.GetNCharNB skip ':' lda #'D' define DEFAULT Label jmp SYM.NewLabelA .9 lda #E.CSYN sec .99 rts *-------------------------------------- KW.BREAK lda #'B' jsr SYM.LookupLabelA bcs .9 lda #$4C emit JMP break jmp CODE.TOABSYX .9 lda #E.CSYN sec rts *-------------------------------------- KW.CONTINUE lda #'C' jsr SYM.LookupLabelA bcs .9 lda #$4C emit JMP cont jmp CODE.TOABSYX .9 lda #E.CSYN sec rts *-------------------------------------- KW.RETURN ldx ZPLineBufPtr phx ldx ZPLineBufPtr+1 phx >LDYA L.CC._RETURN_ >STYA ZPLineBufPtr jsr SYM.Lookup plx stx ZPLineBufPtr+1 plx stx ZPLineBufPtr bcs .99 ldy #SYM.Q lda (ZPLookupSymPtr),y pha lda (ZPLookupSymPtr) SYM.T tay pla jsr EXP.Eval bcs .99 jsr SYM.GetYASizeOfInAXC Y,A=T/Q tax X = sizeof jsr CODE.SetRetValue bcs .99 >LDYA L.PCC.LEAVE jmp CODE.EmitPCC .99 rts *-------------------------------------- KW.SIZEOF lda #E.CSYN sec rts *-------------------------------------- * Input : Value on Stack, Y,A = Type/Qual *-------------------------------------- KW.TestZero jsr EXP.GetYASizeOfInAXC tax cpx #1 bne .1 >LDYA L.PCC.TestZero1 jmp CODE.EmitPCC .1 cpx #2 bne .2 >LDYA L.PCC.TestZero2 jmp CODE.EmitPCC .2 jsr CODE.LDXI bcs .9 >LDYA L.PCC.TestZeroX jmp CODE.EmitPCC .9 rts *-------------------------------------- * Input : Value on Stack, Y,A = Type/Qual *-------------------------------------- KW.TestnZero jsr EXP.GetYASizeOfInAXC tax cpx #1 bne .1 >LDYA L.PCC.TestnZero1 jmp CODE.EmitPCC .1 cpx #2 bne .2 >LDYA L.PCC.TestnZero2 jmp CODE.EmitPCC .2 jsr CODE.LDXI bcs .9 >LDYA L.PCC.TestnZeroX jmp CODE.EmitPCC .9 rts *-------------------------------------- * Input : Value on Stack, Y,A = Type/Qual *-------------------------------------- KW.StackDiscard jsr TYPE.SizeOf txa beq .8 void jsr CODE.AddLocal .8 clc .9 rts *-------------------------------------- MAN SAVE usr/src/bin/cc.s.kw LOAD usr/src/bin/cc.s ASM