1
0
mirror of https://github.com/dschmenk/PLASMA.git synced 2025-03-22 01:30:45 +00:00

Just easier to add a divmod opcode

This commit is contained in:
David Schmenk 2018-01-15 14:13:50 -08:00
parent a92301908a
commit 5f9ba155eb
8 changed files with 168 additions and 143 deletions

View File

@ -352,28 +352,8 @@ asm uword_islt(a,b)#1
RTS
end
asm divmod(a,b)#2
LDA #>(_divmod-1)
PHA
LDA #<(_divmod-1)
PHA
JSR INTERP
!BYTE $0A, $5C ; MOD, RET
_divmod DEX
LDA DSTL ; DVDNDL
STA ESTKL,X
LDA DSTH ; DVDNDH
STA ESTKH,X
LSR DVSIGN ; SIGN(RESULT) = (SIGN(DIVIDEND) + SIGN(DIVISOR)) & 1
BCS +
RTS
+ LDA #$00
; SEC
SBC ESTKL,X
STA ESTKL,X
LDA #$00
SBC ESTKH,X
STA ESTKH,X
RTS
JSR INTERP ; CALL DINTERP
!BYTE $36, $5C ; DIVMOD, RET
end
asm sext(a)#1
LDY #$00

View File

@ -515,29 +515,8 @@ asm uword_islt(a,b)#1
RTS
end
asm divmod(a,b)#2
JSR _divmod
DEX
LDA ESTKL+1,X
STA ESTKL,X
LDA ESTKH+1,X
STA ESTKH,X
LDA DSTL ; DVDNDL
STA ESTKL+1,X
LDA DSTH ; DVDNDH
STA ESTKH+1,X
LSR DVSIGN ; SIGN(RESULT) = (SIGN(DIVIDEND) + SIGN(DIVISOR)) & 1
BCS +
RTS
+ LDA #$00
; SEC
SBC ESTKL+1,X
STA ESTKL+1,X
LDA #$00
SBC ESTKH+1,X
STA ESTKH+1,X
RTS
_divmod JSR $03D0 ; CALL DINTERP
!BYTE $0A, $5C ; MOD, RET
JSR INTERP ; CALL INTERP
!BYTE $36, $5C ; DIVMOD, RET
end
asm sext(a)#1
LDY #$00

View File

@ -10,6 +10,7 @@ SELFMODIFY = 1
;* VM ZERO PAGE LOCATIONS
;*
!SOURCE "vmsrc/plvmzp.inc"
DVSIGN = TMP+2
DROP = $EF
NEXTOP = $F0
FETCHOP = NEXTOP+3
@ -122,7 +123,7 @@ COMP LDA #$FF
OPTBL !WORD ZERO,ADD,SUB,MUL,DIV,MOD,INCR,DECR ; 00 02 04 06 08 0A 0C 0E
!WORD NEG,COMP,BAND,IOR,XOR,SHL,SHR,IDXW ; 10 12 14 16 18 1A 1C 1E
!WORD LNOT,LOR,LAND,LA,LLA,CB,CW,CS ; 20 22 24 26 28 2A 2C 2E
!WORD DROP,DUP,NEXTOP,NEXTOP,BRGT,BRLT,BREQ,BRNE ; 30 32 34 36 38 3A 3C 3E
!WORD DROP,DUP,NEXTOP,DIVMOD,BRGT,BRLT,BREQ,BRNE ; 30 32 34 36 38 3A 3C 3E
!WORD ISEQ,ISNE,ISGT,ISLT,ISGE,ISLE,BRFLS,BRTRU ; 40 42 44 46 48 4A 4C 4E
!WORD BRNCH,IBRNCH,CALL,ICAL,ENTER,LEAVE,RET,CFFB ; 50 52 54 56 58 5A 5C 5E
!WORD LB,LW,LLB,LLW,LAB,LAW,DLB,DLW ; 60 62 64 66 68 6A 6C 6E
@ -130,25 +131,37 @@ OPTBL !WORD ZERO,ADD,SUB,MUL,DIV,MOD,INCR,DECR ; 00 02 04 06 08 0A 0C 0
;*
;* DIV TOS-1 BY TOS
;*
DIV JSR _DIV
LSR DVSIGN ; SIGN(RESULT) = (SIGN(DIVIDEND) + SIGN(DIVISOR)) & 1
BCS NEG
JMP NEXTOP
DIV JSR _DIV
LSR DVSIGN ; SIGN(RESULT) = (SIGN(DIVIDEND) + SIGN(DIVISOR)) & 1
BCS NEG
JMP NEXTOP
;*
;* MOD TOS-1 BY TOS
;*
MOD JSR _DIV
LDA ESTKL,X ; SAVE IN CASE OF DIVMOD
STA DSTL
LDA ESTKH,X
STA DSTH
LDA TMPL ; REMNDRL
STA ESTKL,X
LDA TMPH ; REMNDRH
STA ESTKH,X
LDA DVSIGN ; REMAINDER IS SIGN OF DIVIDEND
BMI NEG
JMP NEXTOP
MOD JSR _DIV
LDA TMPL ; REMNDRL
STA ESTKL,X
LDA TMPH ; REMNDRH
STA ESTKH,X
LDA DVSIGN ; REMAINDER IS SIGN OF DIVIDEND
BMI NEG
JMP NEXTOP
;*
;* DIVMOD TOS-1 BY TOS
;*
DIVMOD JSR _DIV
LSR DVSIGN ; SIGN(RESULT) = (SIGN(DIVIDEND) + SIGN(DIVISOR)) & 1
BCC +
INX
JSR _NEG
DEX
+ LDA TMPL ; REMNDRL
STA ESTKL,X
LDA TMPH ; REMNDRH
STA ESTKH,X
LDA DVSIGN ; REMAINDER IS SIGN OF DIVIDEND
BMI NEG
JMP NEXTOP
;*
;* NEGATE TOS
;*

View File

@ -40,7 +40,8 @@ ALTRDON = $C003
ALTWROFF= $C004
ALTWRON = $C005
!SOURCE "vmsrc/plvmzp.inc"
PSR = TMPH+1
PSR = TMP+2
DVSIGN = PSR+1
DROP = $EF
NEXTOP = $F0
FETCHOP = NEXTOP+3
@ -181,7 +182,7 @@ VMCORE = *
OPTBL !WORD ZERO,ADD,SUB,MUL,DIV,MOD,INCR,DECR ; 00 02 04 06 08 0A 0C 0E
!WORD NEG,COMP,BAND,IOR,XOR,SHL,SHR,IDXW ; 10 12 14 16 18 1A 1C 1E
!WORD LNOT,LOR,LAND,LA,LLA,CB,CW,CS ; 20 22 24 26 28 2A 2C 2E
!WORD DROP,DUP,NEXTOP,NEXTOP,BRGT,BRLT,BREQ,BRNE ; 30 32 34 36 38 3A 3C 3E
!WORD DROP,DUP,NEXTOP,DIVMOD,BRGT,BRLT,BREQ,BRNE ; 30 32 34 36 38 3A 3C 3E
!WORD ISEQ,ISNE,ISGT,ISLT,ISGE,ISLE,BRFLS,BRTRU ; 40 42 44 46 48 4A 4C 4E
!WORD BRNCH,IBRNCH,CALL,ICAL,ENTER,LEAVE,RET,CFFB ; 50 52 54 56 58 5A 5C 5E
!WORD LB,LW,LLB,LLW,LAB,LAW,DLB,DLW ; 60 62 64 66 68 6A 6C 6E
@ -422,7 +423,7 @@ LCDEFCMD = *-28 ; DEFCMD IN LC MEMORY
OPXTBL !WORD ZERO,ADD,SUB,MUL,DIV,MOD,INCR,DECR ; 00 02 04 06 08 0A 0C 0E
!WORD NEG,COMP,BAND,IOR,XOR,SHL,SHR,IDXW ; 10 12 14 16 18 1A 1C 1E
!WORD LNOT,LOR,LAND,LA,LLA,CB,CW,CSX ; 20 22 24 26 28 2A 2C 2E
!WORD DROP,DUP,NEXTOP,NEXTOP,BRGT,BRLT,BREQ,BRNE ; 30 32 34 36 38 3A 3C 3E
!WORD DROP,DUP,NEXTOP,DIVMOD,BRGT,BRLT,BREQ,BRNE ; 30 32 34 36 38 3A 3C 3E
!WORD ISEQ,ISNE,ISGT,ISLT,ISGE,ISLE,BRFLS,BRTRU ; 40 42 44 46 48 4A 4C 4E
!WORD BRNCH,IBRNCH,CALLX,ICALX,ENTER,LEAVEX,RETX,CFFB ; 50 52 54 56 58 5A 5C 5E
!WORD LBX,LWX,LLBX,LLWX,LABX,LAWX,DLB,DLW ; 60 62 64 66 68 6A 6C 6E
@ -543,8 +544,7 @@ _DIVLP ROL TMPL ; REMNDRL
ROL ESTKH+1,X ; DVDNDH
DEY
BNE _DIVLP
_DIVEX INX
LDY IPY
_DIVEX LDY IPY
RTS
;*
;* NEGATE TOS
@ -561,6 +561,7 @@ NEG LDA #$00
;* DIV TOS-1 BY TOS
;*
DIV JSR _DIV
INX
LSR DVSIGN ; SIGN(RESULT) = (SIGN(DIVIDEND) + SIGN(DIVISOR)) & 1
BCS NEG
JMP NEXTOP
@ -568,10 +569,7 @@ DIV JSR _DIV
;* MOD TOS-1 BY TOS
;*
MOD JSR _DIV
LDA ESTKL,X ; SAVE IN CASE OF DIVMOD
STA DSTL
LDA ESTKH,X
STA DSTH
INX
LDA TMPL ; REMNDRL
STA ESTKL,X
LDA TMPH ; REMNDRH
@ -580,6 +578,22 @@ MOD JSR _DIV
BMI NEG
JMP NEXTOP
;*
;* DIVMOD TOS-1 BY TOS
;*
DIVMOD JSR _DIV
LSR DVSIGN ; SIGN(RESULT) = (SIGN(DIVIDEND) + SIGN(DIVISOR)) & 1
BCC +
INX
JSR _NEG
DEX
+ LDA TMPL ; REMNDRL
STA ESTKL,X
LDA TMPH ; REMNDRH
STA ESTKH,X
LDA DVSIGN ; REMAINDER IS SIGN OF DIVIDEND
BMI NEG
JMP NEXTOP
;*
;* INCREMENT TOS
;*
INCR INC ESTKL,X
@ -1528,7 +1542,6 @@ JMPTMP JMP (TMP)
;*
ENTER INY
LDA (IP),Y
; PHA ; SAVE ON STACK FOR LEAVE
EOR #$FF ; ALLOCATE FRAME
SEC
ADC PPL
@ -1556,12 +1569,24 @@ ENTER INY
;*
;* LEAVE FUNCTION
;*
LEAVEX STA ALTRDOFF
LEAVEX +INC_IP
LDA (IP),Y
STA ALTRDOFF
CLC
ADC IFPL
STA PPL
LDA #$00
ADC IFPH
STA PPH
PLA ; RESTORE PREVIOUS FRAME
STA IFPL
PLA
STA IFPH
LDA PSR
PHA
PLP
LEAVE ;PLA ; DEALLOCATE POOL + FRAME
+INC_IP
RTS
LEAVE +INC_IP
LDA (IP),Y
CLC
ADC IFPL

View File

@ -11,6 +11,7 @@ SELFMODIFY = 1
;
MEMBANK = $FFEF
!SOURCE "vmsrc/plvmzp.inc"
DVSIGN = TMP+2
DROP = $EF
NEXTOP = $F0
FETCHOP = NEXTOP+3
@ -227,7 +228,7 @@ _DIVEX INX
OPTBL !WORD ZERO,ADD,SUB,MUL,DIV,MOD,INCR,DECR ; 00 02 04 06 08 0A 0C 0E
!WORD NEG,COMP,BAND,IOR,XOR,SHL,SHR,IDXW ; 10 12 14 16 18 1A 1C 1E
!WORD LNOT,LOR,LAND,LA,LLA,CB,CW,CS ; 20 22 24 26 28 2A 2C 2E
!WORD DROP,DUP,NEXTOP,NEXTOP,BRGT,BRLT,BREQ,BRNE ; 30 32 34 36 38 3A 3C 3E
!WORD DROP,DUP,NEXTOP,DIVMOD,BRGT,BRLT,BREQ,BRNE ; 30 32 34 36 38 3A 3C 3E
!WORD ISEQ,ISNE,ISGT,ISLT,ISGE,ISLE,BRFLS,BRTRU ; 40 42 44 46 48 4A 4C 4E
!WORD BRNCH,IBRNCH,CALL,ICAL,ENTER,LEAVE,RET,CFFB ; 50 52 54 56 58 5A 5C 5E
!WORD LB,LW,LLB,LLW,LAB,LAW,DLB,DLW ; 60 62 64 66 68 6A 6C 6E
@ -286,10 +287,6 @@ DIV JSR _DIV
;* MOD TOS-1 BY TOS
;*
MOD JSR _DIV
LDA ESTKL,X ; SAVE IN CASE OF DIVMOD
STA DSTL
LDA ESTKH,X
STA DSTH
LDA TMPL ; REMNDRL
STA ESTKL,X
LDA TMPH ; REMNDRH
@ -298,6 +295,22 @@ MOD JSR _DIV
BMI NEG
JMP NEXTOP
;*
;* DIVMOD TOS-1 BY TOS
;*
DIVMOD JSR _DIV
LSR DVSIGN ; SIGN(RESULT) = (SIGN(DIVIDEND) + SIGN(DIVISOR)) & 1
BCC +
INX
JSR _NEG
DEX
+ LDA TMPL ; REMNDRL
STA ESTKL,X
LDA TMPH ; REMNDRH
STA ESTKH,X
LDA DVSIGN ; REMAINDER IS SIGN OF DIVIDEND
BMI NEG
JMP NEXTOP
;*
;* ADD TOS TO TOS-1
;*
ADD LDA ESTKL,X

View File

@ -51,8 +51,8 @@ ALTRDON = $C003
ALTWROFF= $C004
ALTWRON = $C005
!SOURCE "vmsrc/plvmzp.inc"
HWSP = TMPH+1
PSR = HWSP+1
PSR = TMP+2
HWSP = PSR+1
DROP = $EF
NEXTOP = DROP+1
FETCHOP = NEXTOP+3
@ -246,7 +246,7 @@ VMCORE = *
OPTBL !WORD ZERO,ADD,SUB,MUL,DIV,MOD,INCR,DECR ; 00 02 04 06 08 0A 0C 0E
!WORD NEG,COMP,BAND,IOR,XOR,SHL,SHR,IDXW ; 10 12 14 16 18 1A 1C 1E
!WORD LNOT,LOR,LAND,LA,LLA,CB,CW,CS ; 20 22 24 26 28 2A 2C 2E
!WORD DROP,DUP,NEXTOP,NEXTOP,BRGT,BRLT,BREQ,BRNE ; 30 32 34 36 38 3A 3C 3E
!WORD DROP,DUP,NEXTOP,DIVMOD,BRGT,BRLT,BREQ,BRNE ; 30 32 34 36 38 3A 3C 3E
!WORD ISEQ,ISNE,ISGT,ISLT,ISGE,ISLE,BRFLS,BRTRU ; 40 42 44 46 48 4A 4C 4E
!WORD BRNCH,IBRNCH,CALL,ICAL,ENTER,LEAVE,RET,CFFB ; 50 52 54 56 58 5A 5C 5E
!WORD LB,LW,LLB,LLW,LAB,LAW,DLB,DLW ; 60 62 64 66 68 6A 6C 6E
@ -518,7 +518,7 @@ LCDEFCMD = *-28 ; DEFCMD IN LC MEMORY
OPXTBL !WORD ZERO,ADD,SUB,MUL,DIV,MOD,INCR,DECR ; 00 02 04 06 08 0A 0C 0E
!WORD NEG,COMP,BAND,IOR,XOR,SHL,SHR,IDXW ; 10 12 14 16 18 1A 1C 1E
!WORD LNOT,LOR,LAND,LA,LLA,CB,CW,CSX ; 20 22 24 26 28 2A 2C 2E
!WORD DROP,DUP,NEXTOP,NEXTOP,BRGT,BRLT,BREQ,BRNE ; 30 32 34 36 38 3A 3C 3E
!WORD DROP,DUP,NEXTOP,DIVMOD,BRGT,BRLT,BREQ,BRNE ; 30 32 34 36 38 3A 3C 3E
!WORD ISEQ,ISNE,ISGT,ISLT,ISGE,ISLE,BRFLS,BRTRU ; 40 42 44 46 48 4A 4C 4E
!WORD BRNCH,IBRNCH,CALLX,ICALX,ENTER,LEAVEX,RETX,CFFB ; 50 52 54 56 58 5A 5C 5E
!WORD LBX,LWX,LLBX,LLWX,LABX,LAWX,DLB,DLW ; 60 62 64 66 68 6A 6C 6E
@ -611,7 +611,7 @@ DIV JSR _DIV
LDA TMP
STA NOS,S
PLA
TXA
TXA ; DIVSGN
LSR ; SIGN(RESULT) = (SIGN(DIVIDEND) + SIGN(DIVISOR)) & 1
BCS NEG
JMP NEXTOP
@ -620,12 +620,48 @@ DIV JSR _DIV
;*
MOD JSR _DIV
STA NOS,S ; REMNDR
LDA TMP
STA DST ; SAVE IN CASE OF DIVMOD
PLA
CPX #$80 ; DIVSGN
BCS NEG ; REMAINDER IS SIGN OF DIVIDEND
JMP NEXTOP
;*
;* DIVMOD TOS-1 BY TOS - !!!HACK!!! MUST COPY ESTK TO HW STACK
;*
DIVMOD +ACCMEM8
LDX ESP
LDA ESTKH+1,X
PHA
LDA ESTKL+1,X
PHA
LDA ESTKH,X
PHA
LDA ESTKL,X
PHA
+ACCMEM16
JSR _DIV
CPX #$80 ; DIVSGN
BCC + ; REMAINDER IS SIGN OF DIVIDEND
EOR #$FFFF
INC
+ STA TOS,S ; REMNDR
TXA ; DIVSGN
AND #$0080 ; REMAINDER IS SIGN OF DIVIDEND
BNE NEG
LSR ; SIGN(RESULT) = (SIGN(DIVIDEND) + SIGN(DIVISOR)) & 1
LDA TMP
BCC +
EOR #$FFFF
INC
+ STA NOS,S ; DVDND
+ACCMEM8
LDX ESP
PLA
STA ESTKL,X
PLA
STA ESTKH,X
PLA
STA ESTKL+1,X
PLA
STA ESTKH+1,X
+ACCMEM16
JMP NEXTOP
;*
;* NEGATE TOS
@ -1507,20 +1543,17 @@ JMPTMP JMP (TMP)
;* ENTER FUNCTION WITH FRAME SIZE AND PARAM COUNT
;*
ENTER INY
TYA ; QUICKY CLEAR OUT MSB
+ACCMEM8 ; 8 BIT A/M
LDA (IP),Y
AND #$00FF
!IF DEBUG {
+ACCMEM8 ; 8 BIT A/M
PHA
CLC
ADC #$80+'0'
STA $7D0+31
PLA
}
;PHA ; SAVE ON STACK FOR LEAVE
;DEC HWSP ; UPDATE HWSP TO SKIP FRAME SIZE
+ACCMEM16 ; 16 BIT A/M
; AND #$00FF
}
EOR #$FFFF ; ALLOCATE FRAME
SEC
ADC PP
@ -1548,17 +1581,15 @@ ENTER INY
;*
;* LEAVE FUNCTION
;*
LEAVEX STX ALTRDOFF
LEAVE ;PLA ; DEALLOCATE POOL + FRAME
+INC_IP
LDA (IP),Y
AND #$00FF
CLC
ADC IFP
STA PP
PLA ; RESTORE PREVIOUS FRAME
STA IFP
LEAVEX +INC_IP
+ACCMEM8 ; 8 BIT A/M
LDA (IP),Y ; DEALLOCATE POOL + FRAME
STA ALTRDOFF
BRA +
LEAVE +INC_IP
+ACCMEM8 ; 8 BIT A/M
LDA (IP),Y ; DEALLOCATE POOL + FRAME
+ STA TMPL
TSC ; MOVE HW EVAL STACK TO ZP EVAL STACK
EOR #$FF
SEC
@ -1585,7 +1616,6 @@ LEAVE ;PLA ; DEALLOCATE POOL + FRAME
+ CPX ESP
BNE -
!IF DEBUG {
STX TMPL
TSX
CPX HWSP
BEQ +
@ -1594,9 +1624,17 @@ LEAVE ;PLA ; DEALLOCATE POOL + FRAME
- LDX $C000
BPL -
LDX $C010
+ LDX TMPL
+
}
TYX ; RESTORE NEW ESP
TYX ; RESTORE NEW ESP
LDA TMPL ; DEALLOCATE POOL + FRAME
+ACCMEM16 ; 16 BIT A/M
AND #$00FF
CLC
ADC IFP
STA PP
PLA ; RESTORE PREVIOUS FRAME
STA IFP
SEC ; SWITCH TO EMULATED MODE
XCE
!AS
@ -1604,6 +1642,7 @@ LEAVE ;PLA ; DEALLOCATE POOL + FRAME
PHA
PLP
RTS
+ACCMEM16 ; 16 BIT A/M
;
RETX STX ALTRDOFF
RET +ACCMEM8 ; 8 BIT A/M
@ -1633,19 +1672,18 @@ RET +ACCMEM8 ; 8 BIT A/M
+ CPX ESP
BNE -
!IF DEBUG {
STX TMPL
TSX
CPX HWSP
BEQ +
LDX #$80+'R'
LDX #$80+'X'
STX $7D0+30
- LDX $C000
BPL -
LDX $C010
+ LDX TMPL
+
}
TYX
+ACCMEM16 ; 16 BIT A/M
+ACCMEM16
LDA IFP ; DEALLOCATE POOL
STA PP
PLA ; RESTORE PREVIOUS FRAME
@ -1830,9 +1868,9 @@ STEP STX TMPL
TSX
CMP #$10
BCC DBGKEY
LDX TMPL
CPX #$54 ; FORCE PAUSE AT 'CALL'
BEQ DBGKEY
; LDX TMPL
; CPX #$54 ; FORCE PAUSE AT 'CALL'
; BEQ DBGKEY
- LDX $C000
CPX #$9B
BNE +

View File

@ -17,17 +17,14 @@ ESTK = $C0
ESTKL = ESTK
ESTKH = ESTK+ESTKSZ/2
VMZP = ESTK+ESTKSZ
ESP = VMZP
DVSIGN = VMZP
IFP = ESP+1
IFP = VMZP
IFPL = IFP
IFPH = IFP+1
PP = IFP+2
PPL = PP
PPH = PP+1
IPY = PP+2
TMP = IPY+1
ESP = IPY+1
TMP = ESP+1
TMPL = TMP
TMPH = TMP+1
NPARMS = TMPL
FRMSZ = TMPH

View File

@ -414,28 +414,8 @@ asm uword_islt(a,b)#1
RTS
end
asm divmod(a,b)#2
LDA #>(_divmod-1)
PHA
LDA #<(_divmod-1)
PHA
JSR INTERP
!BYTE $0A, $5C ; MOD, RET
_divmod DEX
LDA DSTL ; DVDNDL
STA ESTKL,X
LDA DSTH ; DVDNDH
STA ESTKH,X
LSR DVSIGN ; SIGN(RESULT) = (SIGN(DIVIDEND) + SIGN(DIVISOR)) & 1
BCS +
RTS
+ LDA #$00
; SEC
SBC ESTKL,X
STA ESTKL,X
LDA #$00
SBC ESTKH,X
STA ESTKH,X
RTS
JSR INTERP ; CALL INTERP
!BYTE $36, $5C ; DIVMOD, RET
end
asm sext(a)#1
LDY #$00