Added ADD and SUB instructions. Also uncovered an issue with how negative numbers were represented.

This commit is contained in:
Russell-S-Harper
2018-08-13 21:01:18 -04:00
parent d47c2615ab
commit 3f7ed92537
5 changed files with 108 additions and 28 deletions

View File

@@ -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

View File

@@ -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 */

View File

@@ -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

View File

@@ -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

View File

@@ -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;