summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
286b0e0)
opcodes just set the scratch register the literal is stored in, causing no harm nor later effect.
also added _XOPEN_SOURCE=600 define to Makefile, now compiles cleanly on both darwin and linux.
PROGRAMS = as-dcpu16 vm-dcpu16
SOURCES = common.c dcpu16.c as-dcpu16.c vm-dcpu16.c
PROGRAMS = as-dcpu16 vm-dcpu16
SOURCES = common.c dcpu16.c as-dcpu16.c vm-dcpu16.c
+CPPFLAGS = -D_XOPEN_SOURCE=600
CFLAGS = -g -Wall -Wextra -pedantic -std=c99
LDFLAGS = -lreadline
CFLAGS = -g -Wall -Wextra -pedantic -std=c99
LDFLAGS = -lreadline
*
* TODO
* change api to print into buffers rather than stdio
*
* TODO
* change api to print into buffers rather than stdio
- * drop checks for assigning to literals -- it won't affect anything anyhow
* refactor opcode functiontables into switch statements
*/
* refactor opcode functiontables into switch statements
*/
#define OPCODE_BASIC_BITS 4
#define OPCODE_OPERAND_BITS 6
#define OPCODE_BASIC_BITS 4
#define OPCODE_OPERAND_BITS 6
-static const char regnames_[] = "ABCXYZIJ";
+static const char * const regnames_ = "ABCXYZIJ";
/* some default warning and debug reporting functions, which can be overridden by clients */
#define WARN(...) do { if (warn_cb_) warn_cb_(__VA_ARGS__); } while (0)
/* some default warning and debug reporting functions, which can be overridden by clients */
#define WARN(...) do { if (warn_cb_) warn_cb_(__VA_ARGS__); } while (0)
- N.B. the following function does not decode values, as the nbi
- instructions only have one operand.
+ N.B. the following function does not decode values, (thus does not advance pc &c)
+ Decoding is handled by the opcode functions it calls.
*/
OP_IMPL(_nbi_) {
/* non-basic instruction */
*/
OP_IMPL(_nbi_) {
/* non-basic instruction */
/* sets a to b */
ACCT_R(ev_b_addr);
/* sets a to b */
ACCT_R(ev_b_addr);
- /* only set non-literal target */
- if (!lit_a) {
- *a = *b;
- }
+ /*
+ if a is a literal, it's aimed at a scratch register,
+ so it's fine to update, as it won't have any effect.
+ */
+ *a = *b;
ACCT_R(ev_b_addr);
ACCT_R(ev_a_addr);
ACCT_R(ev_b_addr);
ACCT_R(ev_a_addr);
- if (!lit_a) {
- *a = acc;
- }
d->o = (acc > 0xffff);
d->cycle += 2;
d->o = (acc > 0xffff);
d->cycle += 2;
ACCT_R(ev_b_addr);
ACCT_R(ev_a_addr);
ACCT_R(ev_b_addr);
ACCT_R(ev_a_addr);
- if (!lit_a) {
- *a = acc;
- }
d->cycle += 2;
ACCT_W(ev_a_addr);
d->cycle += 2;
ACCT_W(ev_a_addr);
ACCT_R(ev_b_addr);
ACCT_R(ev_a_addr);
ACCT_R(ev_b_addr);
ACCT_R(ev_a_addr);
- if (!lit_a) {
- *a = acc;
- }
d->cycle += 2;
ACCT_W(ev_a_addr);
d->cycle += 2;
ACCT_W(ev_a_addr);
ACCT_R(ev_a_addr);
if (*b == 0) {
ACCT_R(ev_a_addr);
if (*b == 0) {
- if (!lit_a) {
- *a = 0;
- }
- unsigned int acc = *a / *b;
-
- if (!lit_a) {
- *a = acc;
- }
-
- acc = (*a << 16) / *b;
- d->o = acc;
+ *a = *a / *b;
+ d->o = (*a << 16) / *b;
ACCT_R(ev_a_addr);
if (*b == 0) {
ACCT_R(ev_a_addr);
if (*b == 0) {
- if (!lit_a) {
- *a = 0;
- }
- if (!lit_a) {
- *a = *a % *b;
- }
ACCT_R(ev_b_addr);
ACCT_R(ev_a_addr);
ACCT_R(ev_b_addr);
ACCT_R(ev_a_addr);
- if (!lit_a) {
- *a = acc;
- }
d->o = acc >> 16;
d->cycle += 2;
d->o = acc >> 16;
d->cycle += 2;
ACCT_R(ev_b_addr);
ACCT_R(ev_a_addr);
ACCT_R(ev_b_addr);
ACCT_R(ev_a_addr);
- if (!lit_a) {
- *a = acc;
- }
d->o = (*a << 16) >> *b;
d->cycle += 2;
d->o = (*a << 16) >> *b;
d->cycle += 2;
ACCT_R(ev_b_addr);
ACCT_R(ev_a_addr);
ACCT_R(ev_b_addr);
ACCT_R(ev_a_addr);
- if (!lit_a) {
- *a = *a & *b;
- }
ACCT_R(ev_b_addr);
ACCT_R(ev_a_addr);
ACCT_R(ev_b_addr);
ACCT_R(ev_a_addr);
- if (!lit_a) {
- *a = *a | *b;
- }
ACCT_R(ev_b_addr);
ACCT_R(ev_a_addr);
ACCT_R(ev_b_addr);
ACCT_R(ev_a_addr);
- if (!lit_a) {
- *a = *a ^ *b;
- }
-
- ACCT_W(ev_a_addr);