mirror of
https://github.com/Russell-S-Harper/COMMON.git
synced 2025-08-08 23:24:58 +00:00
Added ADD and SUB instructions. Also uncovered an issue with how negative numbers were represented.
This commit is contained in:
@@ -269,12 +269,101 @@ _HEX .( ; HEX r 9r Rr <- hex(Rr) - convert Rr from decimal ######.## to hex
|
|||||||
RTS
|
RTS
|
||||||
.)
|
.)
|
||||||
|
|
||||||
|
_GETPQ .( ; sets X as p register and Y as q register, advances PC
|
||||||
|
LDY #0
|
||||||
|
LDA (_PC),Y ; get source registers
|
||||||
|
LSR
|
||||||
|
LSR
|
||||||
|
AND #_MSK_R ; p register
|
||||||
|
TAX
|
||||||
|
LDA (_PC),Y
|
||||||
|
ASL
|
||||||
|
ASL
|
||||||
|
AND #_MSK_R ; q register
|
||||||
|
TAY
|
||||||
|
LDA _R0+3,X
|
||||||
|
AND #_MSK_O ; check for existing overflow condition
|
||||||
|
BEQ _1 ; sign and overflow are both clear
|
||||||
|
EOR #_MSK_O
|
||||||
|
BEQ _1 ; sign and overflow are both set
|
||||||
|
BRK ; an operand is in an overflow condition, abort and call exception handler (TODO)
|
||||||
|
_1 LDA _R0+3,Y
|
||||||
|
AND #_MSK_O ; check for existing overflow condition
|
||||||
|
BEQ _2 ; sign and overflow are both clear
|
||||||
|
EOR #_MSK_O
|
||||||
|
BEQ _2 ; sign and overflow are both set
|
||||||
|
BRK ; an operand is in an overflow condition, abort and call exception handler (TODO)
|
||||||
|
_2 INC _PCL ; advance PC
|
||||||
|
BNE _3
|
||||||
|
INC _PCH
|
||||||
|
_3 RTS
|
||||||
|
.)
|
||||||
|
|
||||||
|
_TRFDR .( ; transfers RD to X as r register, updates overflow flag
|
||||||
|
LDA _RD ; transfer result to Rr
|
||||||
|
STA _R0,X
|
||||||
|
LDA _RD+1
|
||||||
|
STA _R0+1,X
|
||||||
|
LDA _RD+2
|
||||||
|
STA _R0+2,X
|
||||||
|
LDA _RD+3
|
||||||
|
STA _R0+3,X
|
||||||
|
AND #_MSK_O ; check for overflow
|
||||||
|
BEQ _4
|
||||||
|
EOR #_MSK_O
|
||||||
|
BEQ _4
|
||||||
|
_3 LDA _F ; set overflow
|
||||||
|
ORA #_F_O
|
||||||
|
STA _F
|
||||||
|
BNE _5
|
||||||
|
_4 LDA _F ; clear overflow
|
||||||
|
AND #_F_O^$FF
|
||||||
|
STA _F
|
||||||
|
_5 RTS
|
||||||
|
.)
|
||||||
|
|
||||||
_ADD .( ; ADD r pq ar pq Rr <- Rp + Rq - addition
|
_ADD .( ; ADD r pq ar pq Rr <- Rp + Rq - addition
|
||||||
RTS
|
TXA
|
||||||
|
PHA ; save r register for later
|
||||||
|
JSR _GETPQ
|
||||||
|
CLC ; set RD to Rp + Rq
|
||||||
|
LDA _R0,X
|
||||||
|
ADC _R0,Y
|
||||||
|
STA _RD
|
||||||
|
LDA _R0+1,X
|
||||||
|
ADC _R0+1,Y
|
||||||
|
STA _RD+1
|
||||||
|
LDA _R0+2,X
|
||||||
|
ADC _R0+2,Y
|
||||||
|
STA _RD+2
|
||||||
|
LDA _R0+3,X
|
||||||
|
ADC _R0+3,Y
|
||||||
|
STA _RD+3
|
||||||
|
PLA ; get r register
|
||||||
|
TAX
|
||||||
|
JMP _TRFDR ; transfer RD to r register, let it handle the return
|
||||||
.)
|
.)
|
||||||
|
|
||||||
_SUB .( ; SUB r pq br pq Rr <- Rp - Rq - subtraction
|
_SUB .( ; SUB r pq br pq Rr <- Rp - Rq - subtraction
|
||||||
RTS
|
TXA
|
||||||
|
PHA ; save r register for later
|
||||||
|
JSR _GETPQ
|
||||||
|
SEC ; set RD to Rp - Rq
|
||||||
|
LDA _R0,X
|
||||||
|
SBC _R0,Y
|
||||||
|
STA _RD
|
||||||
|
LDA _R0+1,X
|
||||||
|
SBC _R0+1,Y
|
||||||
|
STA _RD+1
|
||||||
|
LDA _R0+2,X
|
||||||
|
SBC _R0+2,Y
|
||||||
|
STA _RD+2
|
||||||
|
LDA _R0+3,X
|
||||||
|
SBC _R0+3,Y
|
||||||
|
STA _RD+3
|
||||||
|
PLA ; get r register
|
||||||
|
TAX
|
||||||
|
JMP _TRFDR ; transfer RD to r register, let it handle the return
|
||||||
.)
|
.)
|
||||||
|
|
||||||
_MUL .( ; MUL r pq cr pq Rr <- Rp * Rq - multiplication
|
_MUL .( ; MUL r pq cr pq Rr <- Rp * Rq - multiplication
|
||||||
|
@@ -7,9 +7,9 @@
|
|||||||
; calculation.
|
; calculation.
|
||||||
|
|
||||||
; Largest value: $3fffffff or 1048575.999(5)
|
; Largest value: $3fffffff or 1048575.999(5)
|
||||||
; Smallest value: $c0000001 or -1048575.998(5) <- note 998(5)
|
; Smallest value: $c0000000 or -1048576.000(0)
|
||||||
; Largest value for DEC/HEX: $3d08ffff or 999999.999(5)
|
; Largest value for DEC/HEX: $3d08ffff or 999999.999
|
||||||
; Smallest value for DEC/HEX: $c2f70000 or -999999.999(5)
|
; Smallest value for DEC/HEX: $c2f70001 or -999999.999
|
||||||
|
|
||||||
; Instructions
|
; Instructions
|
||||||
|
|
||||||
@@ -47,7 +47,7 @@
|
|||||||
; CMR pq 0f pq F <- Rp <=> Rq - compare registers
|
; CMR pq 0f pq F <- Rp <=> Rq - compare registers
|
||||||
|
|
||||||
; 64 bytes in page zero for common registers
|
; 64 bytes in page zero for common registers
|
||||||
_R0 = $C0
|
_R0 = $c0
|
||||||
_R1 = _R0 + 4
|
_R1 = _R0 + 4
|
||||||
_R2 = _R1 + 4
|
_R2 = _R1 + 4
|
||||||
_R3 = _R2 + 4
|
_R3 = _R2 + 4
|
||||||
@@ -94,7 +94,7 @@ _RS = $200 ; register stack
|
|||||||
_RSS = (FN_FX - _RS) ; register stack size
|
_RSS = (FN_FX - _RS) ; register stack size
|
||||||
|
|
||||||
; last 32 bytes of page two
|
; last 32 bytes of page two
|
||||||
FN_FX = $2E0 ; list of system and user functions
|
FN_FX = $2e0 ; list of system and user functions
|
||||||
|
|
||||||
; function constants
|
; function constants
|
||||||
_ESC_C = $00
|
_ESC_C = $00
|
||||||
@@ -134,11 +134,12 @@ _EXT_C = $f0
|
|||||||
|
|
||||||
; plus and minus 1 for increment and decrement
|
; plus and minus 1 for increment and decrement
|
||||||
_PLS_1 = %00000100 ; i.e. the $04 part of $00000400
|
_PLS_1 = %00000100 ; i.e. the $04 part of $00000400
|
||||||
_MNS_1 = %11111100 ; i.e. the $FC part of $FFFFFC00
|
_MNS_1 = %11111100 ; i.e. the $fc part of $fffffc00
|
||||||
|
|
||||||
_MSK_O = %11000000 ; mask for overflow
|
_MSK_O = %11000000 ; mask for overflow
|
||||||
|
_MSK_R = %00111100 ; mask for registers
|
||||||
|
|
||||||
; mask for TST
|
; mask for TST
|
||||||
_MSK_T = (_F_Z + _F_P + _F_N)^$FF
|
_MSK_T = (_F_Z + _F_P + _F_N)^$ff
|
||||||
|
|
||||||
#endif /* __COMMON_H */
|
#endif /* __COMMON_H */
|
||||||
|
@@ -83,7 +83,7 @@
|
|||||||
#define TST(r) .BYTE _TST_C + r
|
#define TST(r) .BYTE _TST_C + r
|
||||||
#define DEC(r) .BYTE _DEC_C + r
|
#define DEC(r) .BYTE _DEC_C + r
|
||||||
#define HEX(r) .BYTE _HEX_C + r
|
#define HEX(r) .BYTE _HEX_C + r
|
||||||
#define ADD(r) .BYTE _ADD_C + r
|
#define ADD(r, p, q) .BYTE _ADD_C + r, p * 16 + q
|
||||||
#define SUB(r, p, q) .BYTE _SUB_C + r, p * 16 + q
|
#define SUB(r, p, q) .BYTE _SUB_C + r, p * 16 + q
|
||||||
#define MUL(r, p, q) .BYTE _MUL_C + r, p * 16 + q
|
#define MUL(r, p, q) .BYTE _MUL_C + r, p * 16 + q
|
||||||
#define DIV(r, p, q) .BYTE _DIV_C + r, p * 16 + q
|
#define DIV(r, p, q) .BYTE _DIV_C + r, p * 16 + q
|
||||||
|
@@ -5,19 +5,10 @@
|
|||||||
|
|
||||||
HDR(DEMO)
|
HDR(DEMO)
|
||||||
CMN
|
CMN
|
||||||
SET(R0, +1048575.999)
|
SET(R0, 1/1024)
|
||||||
SET(R1, -1048575.999)
|
SET(R1, -1/1024)
|
||||||
SET(R2, 0.0)
|
ADD(R2, R0, R1)
|
||||||
SET(R3, 0.0)
|
SUB(R3, R0, R1)
|
||||||
INR(R0)
|
|
||||||
DCR(R1)
|
|
||||||
INR(R2)
|
|
||||||
DCR(R3)
|
|
||||||
INR(R0)
|
|
||||||
DCR(R1)
|
|
||||||
TST(R4)
|
|
||||||
TST(R2)
|
|
||||||
TST(R3)
|
|
||||||
ESC
|
ESC
|
||||||
BRK
|
BRK
|
||||||
|
|
||||||
|
@@ -24,7 +24,6 @@ int main(int argc, char **argv)
|
|||||||
for (i = 0; i < count; ++i)
|
for (i = 0; i < count; ++i)
|
||||||
{
|
{
|
||||||
int j, sign;
|
int j, sign;
|
||||||
unsigned long working;
|
|
||||||
const char *s = "", *p, *q;
|
const char *s = "", *p, *q;
|
||||||
switch (tokens[i].type)
|
switch (tokens[i].type)
|
||||||
{
|
{
|
||||||
@@ -41,14 +40,14 @@ int main(int argc, char **argv)
|
|||||||
sign = result < 0? -1: +1;
|
sign = result < 0? -1: +1;
|
||||||
if (sign < 0) result = -result;
|
if (sign < 0) result = -result;
|
||||||
result += 1 << (INT_FRAC - EXP_FRAC - 1);
|
result += 1 << (INT_FRAC - EXP_FRAC - 1);
|
||||||
if (sign < 0) result = -result;
|
|
||||||
/* Normalize */
|
/* Normalize */
|
||||||
working = (unsigned long)((result >> (INT_FRAC - EXP_FRAC)) % (1 << EXP_FULL));
|
result >>= (INT_FRAC - EXP_FRAC);
|
||||||
|
if (sign < 0) result = -result;
|
||||||
/* Output in .BYTE format */
|
/* Output in .BYTE format */
|
||||||
for (j = 0; j < EXP_FULL; j += CHAR_BIT)
|
for (j = 0; j < EXP_FULL; j += CHAR_BIT)
|
||||||
{
|
{
|
||||||
printf("%s$%02lX", s, working & 0xff);
|
printf("%s$%02llX", s, result & 0xff);
|
||||||
working >>= CHAR_BIT;
|
result >>= CHAR_BIT;
|
||||||
s = ", ";
|
s = ", ";
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
Reference in New Issue
Block a user