From b5d42924bade21a72bafde24650e5acc71d556a3 Mon Sep 17 00:00:00 2001 From: Virgil Dupras Date: Sun, 17 May 2020 09:30:36 -0400 Subject: [PATCH] avra: add arg range checks --- blk/660 | 2 +- blk/661 | 3 ++- blk/662 | 16 ++++++---------- blk/663 | 19 ++++++++++--------- blk/664 | 22 +++++++++------------- blk/665 | 22 ++++++++++++---------- blk/666 | 19 ++++++++++--------- blk/667 | 10 ++++++++++ 8 files changed, 60 insertions(+), 53 deletions(-) create mode 100644 blk/667 diff --git a/blk/660 b/blk/660 index d90f2f3..2bb238b 100644 --- a/blk/660 +++ b/blk/660 @@ -1 +1 @@ -1 6 LOADR+ +1 7 LOADR+ diff --git a/blk/661 b/blk/661 index 18d4775..3fb6b14 100644 --- a/blk/661 +++ b/blk/661 @@ -2,7 +2,8 @@ VARIABLE ORG : SPLITB 256 /MOD SWAP ; -: PC H@ ORG @ ; +( We divide by 2 because each PC represents a word. ) +: PC H@ ORG @ - 1 RSHIFT ; ( A, spits an assembled byte, A,, spits an assembled word Both increase PC. To debug, change C, to .X ) : A, C, ; : A,, SPLITB A, A, ; diff --git a/blk/662 b/blk/662 index 81a2b8d..57cee3f 100644 --- a/blk/662 +++ b/blk/662 @@ -1,11 +1,7 @@ -( 0000 000d dddd 0000 ) +: _oor ." arg out of range: " .X SPC ." PC: " PC .X NL ABORT ; +: _r8c DUP 7 > IF _oor THEN ; +: _r32c DUP 31 > IF _oor THEN ; +: _r16+c _r32c DUP 16 < IF _oor THEN ; +: _r256c DUP 255 > IF _oor THEN ; : _Rdp ( op rd -- op', place Rd ) 4 LSHIFT OR ; -: OPRd CREATE , DOES> @ SWAP _Rdp A,, ; -0b1001010000000101 OPRd ASR, 0b1001010000000000 OPRd COM, -0b1001010000001010 OPRd DEC, 0b1001010000000011 OPRd INC, -0b1001001000000110 OPRd LAC, 0b1001001000000101 OPRd LAS, -0b1001001000000111 OPRd LAT, -0b1001010000000110 OPRd LSR, 0b1001010000000001 OPRd NEG, -0b1001000000001111 OPRd POP, 0b1001001000001111 OPRd PUSH, -0b1001010000000111 OPRd ROR, 0b1001010000000010 OPRd SWAP, -0b1001001000000100 OPRd XCH, + diff --git a/blk/663 b/blk/663 index 5a248cc..021b926 100644 --- a/blk/663 +++ b/blk/663 @@ -1,9 +1,10 @@ -( 0000 00rd dddd rrrr ) -: OPRdRr CREATE C, DOES> C@ ( rd rr op ) - OVER 0x10 AND 3 RSHIFT OR ( rd rr op' ) - 8 LSHIFT OR 0xff0f AND ( rd op' ) - SWAP _Rdp A,, ; -0x1c OPRdRr ADC, 0x0c OPRdRr ADD, 0x20 OPRdRr AND, -0x14 OPRdRr CP, 0x04 OPRdRr CPC, 0x10 OPRdRr CPSE, -0x24 OPRdRr EOR, 0x2c OPRdRr MOV, 0x9c OPRdRr MUL, -0x28 OPRdRr OR, 0x08 OPRdRr SBC, 0x18 OPRdRr SUB, +( 0000 000d dddd 0000 ) +: OPRd CREATE , DOES> @ SWAP _r32c _Rdp A,, ; +0b1001010000000101 OPRd ASR, 0b1001010000000000 OPRd COM, +0b1001010000001010 OPRd DEC, 0b1001010000000011 OPRd INC, +0b1001001000000110 OPRd LAC, 0b1001001000000101 OPRd LAS, +0b1001001000000111 OPRd LAT, +0b1001010000000110 OPRd LSR, 0b1001010000000001 OPRd NEG, +0b1001000000001111 OPRd POP, 0b1001001000001111 OPRd PUSH, +0b1001010000000111 OPRd ROR, 0b1001010000000010 OPRd SWAP, +0b1001001000000100 OPRd XCH, diff --git a/blk/664 b/blk/664 index 71d92d3..46b002f 100644 --- a/blk/664 +++ b/blk/664 @@ -1,13 +1,9 @@ -( 0000 KKKK dddd KKKK ) -: OPRdK CREATE C, DOES> C@ ( rd K op ) - OVER 0xf0 AND 4 RSHIFT OR ( rd K op' ) - ROT 5 LSHIFT ROT 0x0f AND OR ( op' rdK ) A, A, ; -0x70 OPRdK ANDI, 0x30 OPRdK CPI, 0x0e OPRdK LDI, -0x60 OPRdK ORI, 0x40 OPRdK SBCI, 0x60 OPRdK SBR, -0x50 OPRdK SUBI, - -( 0000 0000 AAAA Abbb ) -: OPAb CREATE C, DOES> C@ ( A b op ) - ROT 3 LSHIFT ROT OR A, A, ; -0x98 OPAb CBI, 0x9a OPAb SBI, 0x99 OPAb SBIC, -0x9b OPAb SBIS, +( 0000 00rd dddd rrrr ) +: OPRdRr CREATE C, DOES> C@ ( rd rr op ) + OVER _r32c 0x10 AND 3 RSHIFT OR ( rd rr op' ) + 8 LSHIFT OR 0xff0f AND ( rd op' ) + SWAP _r32c _Rdp A,, ; +0x1c OPRdRr ADC, 0x0c OPRdRr ADD, 0x20 OPRdRr AND, +0x14 OPRdRr CP, 0x04 OPRdRr CPC, 0x10 OPRdRr CPSE, +0x24 OPRdRr EOR, 0x2c OPRdRr MOV, 0x9c OPRdRr MUL, +0x28 OPRdRr OR, 0x08 OPRdRr SBC, 0x18 OPRdRr SUB, diff --git a/blk/665 b/blk/665 index 2f2c56d..2e3c917 100644 --- a/blk/665 +++ b/blk/665 @@ -1,11 +1,13 @@ -: OPNA CREATE , DOES> @ A,, ; -0x9598 OPNA BREAK, 0x9488 OPNA CLC, 0x94d8 OPNA CLH, -0x94f8 OPNA CLI, 0x94a8 OPNA CLN, 0x94c8 OPNA CLS, -0x94e8 OPNA CLT, 0x94b8 OPNA CLV, 0x9498 OPNA CLZ, -0x9419 OPNA EIJMP, 0x9509 OPNA ICALL, 0x9519 OPNA EICALL, -0x9409 OPNA IJMP, 0x0000 OPNA NOP, 0x9508 OPNA RET, -0x9518 OPNA RETI, 0x9408 OPNA SEC, 0x9458 OPNA SEH, -0x9478 OPNA SEI, 0x9428 OPNA SEN, 0x9448 OPNA SES, -0x9468 OPNA SET, 0x9438 OPNA SEV, 0x9418 OPNA SEZ, -0x9588 OPNA SLEEP, 0x95a8 OPNA WDR, +( 0000 KKKK dddd KKKK ) +: OPRdK CREATE C, DOES> C@ ( rd K op ) + OVER _r256c 0xf0 AND 4 RSHIFT OR ( rd K op' ) + ROT _r16+c 4 LSHIFT ROT 0x0f AND OR ( op' rdK ) A, A, ; +0x70 OPRdK ANDI, 0x30 OPRdK CPI, 0x0e OPRdK LDI, +0x60 OPRdK ORI, 0x40 OPRdK SBCI, 0x60 OPRdK SBR, +0x50 OPRdK SUBI, +( 0000 0000 AAAA Abbb ) +: OPAb CREATE C, DOES> C@ ( A b op ) + ROT _r32c 3 LSHIFT ROT _r8c OR A, A, ; +0x98 OPAb CBI, 0x9a OPAb SBI, 0x99 OPAb SBIC, +0x9b OPAb SBIS, diff --git a/blk/666 b/blk/666 index 57711ff..2f2c56d 100644 --- a/blk/666 +++ b/blk/666 @@ -1,10 +1,11 @@ -( 0000 0000 0sss 0000 ) -: OPb CREATE , DOES> @ ( b op ) - SWAP 4 LSHIFT OR A,, ; -0b1001010010001000 OPb BCLR, 0b1001010000001000 OPb BSET, +: OPNA CREATE , DOES> @ A,, ; +0x9598 OPNA BREAK, 0x9488 OPNA CLC, 0x94d8 OPNA CLH, +0x94f8 OPNA CLI, 0x94a8 OPNA CLN, 0x94c8 OPNA CLS, +0x94e8 OPNA CLT, 0x94b8 OPNA CLV, 0x9498 OPNA CLZ, +0x9419 OPNA EIJMP, 0x9509 OPNA ICALL, 0x9519 OPNA EICALL, +0x9409 OPNA IJMP, 0x0000 OPNA NOP, 0x9508 OPNA RET, +0x9518 OPNA RETI, 0x9408 OPNA SEC, 0x9458 OPNA SEH, +0x9478 OPNA SEI, 0x9428 OPNA SEN, 0x9448 OPNA SES, +0x9468 OPNA SET, 0x9438 OPNA SEV, 0x9418 OPNA SEZ, +0x9588 OPNA SLEEP, 0x95a8 OPNA WDR, -( 0000 000d dddd 0bbb ) -: OPRdb CREATE , DOES> @ ( rd b op ) - ROT _Rdp OR A,, ; -0b1111100000000000 OPRdb BLD, 0b1111101000000000 OPRdb BST, -0b1111110000000000 OPRdb SBRC, 0b1111111000000000 OPRdb SBRS, diff --git a/blk/667 b/blk/667 new file mode 100644 index 0000000..30b9310 --- /dev/null +++ b/blk/667 @@ -0,0 +1,10 @@ +( 0000 0000 0sss 0000 ) +: OPb CREATE , DOES> @ ( b op ) + SWAP _r8c _Rdp A,, ; +0b1001010010001000 OPb BCLR, 0b1001010000001000 OPb BSET, + +( 0000 000d dddd 0bbb ) +: OPRdb CREATE , DOES> @ ( rd b op ) + ROT _r32c _Rdp SWAP _r8c OR A,, ; +0b1111100000000000 OPRdb BLD, 0b1111101000000000 OPRdb BST, +0b1111110000000000 OPRdb SBRC, 0b1111111000000000 OPRdb SBRS,