📄 pcode.asm
字号:
; P-Code Interpreter (c)Copyright 2000, Radek Benedikt; benedikt@lphard.cz, http://benedikt.lphard.cz; History: 1.00 -- Radek Benedikt 31-Oct-2000; initial version;*************************************************************;*** PROJECT WWW8052 http://8052.lphard.cz **;*************************************************************; This program is free software; you can redistribute it and/or modify; it under the terms of the GNU General Public License as published by; the Free Software Foundation, version 2.;; This program is distributed in the hope that it will be useful,; but WITHOUT ANY WARRANTY; without even the implied warranty of; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the; GNU General Public License for more details.;; You should have received a copy of the GNU General Public License; along with this program; if not, write to the Free Software; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.; Tento program je volne programove vybaveni; muzete jej sirit a; modifikovat podle ustanoveni Obecne verejne licence GNU, vydavane Free; Software Foundation, verze 2;; Tento program je rozsirovan v nadeji, ze bude uzitecny, avsak BEZ; JAKEKOLI ZARUKY; neposkytuji se ani odvozene zaruky PRODEJNOSTI anebo; VHODNOSTI PRO URCITY UCEL.; Dalsi podrobnosti hledejte v Obecne verejne licenci GNU.;; Kopii Obecne verejne licence GNU jste mel obdrzet spolu s timto; programem; pokud se tak nestalo, napiste o ni Free Software Foundation,; Inc., 675 Mass Ave, Cambridge, MA 02139, USA.; .global pcode .global pcall .global pret .global pjumpeq .global pjump .global pjumpne .global pjumpCarry .global pjumpnCarry .global pjumpZero .global pjumpnZero .global zflag .global cflag .global pcodeLSB .global pcodeMSB; .bcomm token, 1 .bcomm pcodeOption, 1;;;***** Pcode status flags ***** .bitcomm zflag, 1 ;Zero flag .bitcomm cflag, 1 ;Carry flag; .comm pcodeMSB, 1 .comm pcodeLSB, 1; .text;; *** PCALL *** Call ***; pcall address; R6R7pcall: ;mov a,#'>' ;lcall putchar POP DPH ;pop return address (Pcode0) POP DPL PUSH pcodeLSB ;push Pcode return address PUSH pcodeMSB MOV DPH,R6 ;new Pcode pointer MOV DPL,R7 SJMP Pcode00;; *** PRET *** Return ***; pretpret: ;mov a,#'<' ;lcall putchar POP DPH ;pop return address (Pcode0) POP DPL POP DPH ;pop Pcode return address POP DPL SJMP Pcode00;; *** PJUMPEQ *** Jump if zflag is set ***; *** PJUMPZERO *** Jump if zflag is set ***; pjumpeq address; R6R7pjumpZero:pjumpeq:JNB zflag,NoJump;; *** PJUMP *** Jump ***; pjump address; R6R7pjump:Jump: POP DPH ;pop return address POP DPL MOV pcodeMSB,R6 ;new Pcode pointer MOV pcodeLSB,R7 SJMP Pcode0; *** PJUMPNE *** Jump if zflag is not set ***; *** PJUMPNZERO *** Jump if zflag is not set ***; pjumpne address; R6R7pjumpnZero:pjumpne:JNB zflag,JumpNoJump: RET;; *** PJUMPCARRY *** Jump if Cflag is set ***pjumpCarry: JB cflag,Jump RET;; *** PJUMPNCARRY *** Jump if Cflag is not set ***pjumpnCarry: JNB cflag,Jump RETpcode: pop dph ;get token address pop dpl ;from stack; push pcodeLSB; push pcodeMSB MOV pcodeMSB,DPH MOV pcodeLSB,DPLPcode0: MOV DPH,pcodeMSB MOV DPL,pcodeLSBPcode00:CLR A MOVC A,@A+DPTR ;get token CJNE A,#0,Pcode1 ;exec token INC DPTR ;end of token; pop pcodeMSB; pop pcodeLSB push dpl ;push return address on stack push dph RET;Pcode1: MOV token,A ;save token MSB MOV A,#LOW(Pcode0) ;push return address PUSH Acc MOV A,#HIGH(Pcode0) PUSH Acc INC DPTR CLR A MOV R7,A MOV R6,A MOV R5,A MOV R4,A MOV R3,A MOV R2,A MOVC A,@A+DPTR ;get token LSB PUSH Acc ;push LSB MOV A,token ANL A,#0b00011111 PUSH Acc ;push MSB INC DPTR CLR A MOVC A,@A+DPTR ;get option MOV pcodeOption,A INC DPTR jnb B2B(pcodeOption, 7), NoOpt7 CLR A MOVC A,@A+DPTR ;get par1 MSB MOV R6,A ;par1 - R6R7 INC DPTRNoOpt7: jnb B2B(pcodeOption, 6), NoOpt6 CLR A MOVC A,@A+DPTR ;get par1 LSB MOV R7,A INC DPTRNoOpt6: jnb B2B(pcodeOption, 5), NoOpt5 CLR A MOVC A,@A+DPTR ;get par2 MSB MOV R4,A ;par2 - R4R5 INC DPTRNoOpt5: jnb B2B(pcodeOption, 4), NoOpt4 CLR A MOVC A,@A+DPTR ;get par2 LSB MOV R5,A INC DPTRNoOpt4: jnb B2B(pcodeOption, 3), NoOpt3 CLR A MOVC A,@A+DPTR ;get par3 MSB MOV R2,A ;par3 - R2R3 INC DPTRNoOpt3: jnb B2B(pcodeOption, 2), NoOpt2 CLR A MOVC A,@A+DPTR ;get par3 LSB MOV R3,A INC DPTRNoOpt2: JNB B2B(token, 7), noI1 MOV A,R7 MOV R0,A MOV A,@R0 MOV R6,A INC R0 MOV A,@R0 MOV R7,AnoI1: JNB B2B(token, 6), noI2 MOV A,R5 MOV R0,A MOV A,@R0 MOV R4,A INC R0 MOV A,@R0 MOV R5,AnoI2: JNB B2B(token, 5), noI3 MOV A,R3 MOV R0,A MOV A,@R0 MOV R2,A INC R0 MOV A,@R0 MOV R3,AnoI3: jnb B2B(pcodeOption, 1), NoOpt1 MOV A,R6 ;swap1 XCH A,R7 MOV R6,A; MOV A,R4 ;swap2; XCH A,R5; MOV R4,ANoOpt1: jnb B2B(pcodeOption, 0), NoOpt0 MOV A,R2 ;swap3 XCH A,R3 MOV R2,ANoOpt0: MOV pcodeMSB,DPH MOV pcodeLSB,DPL RET ;and exec ;; END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -