diff options
| author | mrb0nk500 <b0nk@b0nk.xyz> | 2020-12-08 10:42:10 -0500 | 
|---|---|---|
| committer | mrb0nk500 <b0nk@b0nk.xyz> | 2020-12-08 11:16:13 -0500 | 
| commit | 673efacc37efa90e61eba224efadbb4be863c77b (patch) | |
| tree | 9b22d4c8b12a5d5b07329df121a13116cb98c4a1 /asmmon.h | |
| parent | 96393257a43ac52f2b911594d106741245dec5f0 (diff) | |
- Implemented support for the Orthogonal extension into
  both the assembler, and the emulator.
  I finally figured out how I could get support for the
  Ortho extension implemented into the old assembler.
  The only reason for doing this, is to buy me some
  while I start work on the new assembler, and to help
  me get an idea for how to do the same in the new
  assembler.
Diffstat (limited to 'asmmon.h')
| -rw-r--r-- | asmmon.h | 64 | 
1 files changed, 53 insertions, 11 deletions
| @@ -4,17 +4,18 @@  #define MAX_TOK 0x1000 -typedef struct tok  token      ; -typedef struct ln   line       ; -typedef struct sym  symbol     ; -typedef struct fix  fixup      ; -typedef struct inst instruction; +typedef struct tok  token	; +typedef struct ln   line	; +typedef struct sym  symbol	; +typedef struct fix  fixup	; +typedef struct inst instruction	;  struct tok { -	token *next;	/* Pointer to the next token. */ -	uint8_t id;	/* Token ID.      */ -	uint8_t type;	/* Token type ID. */ +	token *next;		/* Pointer to the next token. */ +	uint8_t id;		/* Token ID.      */ +	uint8_t type;		/* Token type ID. */ +	uint8_t subtype;	/* Token subtype ID. */  	uint8_t tab;		/* Number of tabs.        */  	uint8_t space;		/* Number of spaces.      */ @@ -120,6 +121,9 @@ enum token {  	TOK_EXTOP,  	TOK_ORTHO,  	TOK_REG, +	TOK_MEM, +	TOK_CC, +	TOK_OS,  	TOK_RS,  	TOK_OF,  	TOK_COMMENT, @@ -130,7 +134,6 @@ enum token {  	TOK_STRUCT,  	TOK_UNION,  	TOK_MEMBER -  };  enum pre_token { @@ -176,6 +179,7 @@ enum expr {  	EXPR_OR,  	EXPR_LSHFT,  	EXPR_RSHFT, +	EXPR_MUL,  	EXPR_NONE  }; @@ -240,6 +244,30 @@ enum eind {  	CPY_EIND  }; +enum baseext_ortho { +	OP_LEA, +	OP_PEA, +	OP_ADD, +	OP_SUB, +	OP_NOT, +	OP_CLZ, +	OP_CLO, +	OP_SWP, +        OP_PCN +}; + +static const uint8_t ext_ortho_ops[9] = { +	[OP_LEA] = 0x63, +	[OP_PEA] = 0x0C, +	[OP_ADD] = 0x03, +	[OP_SUB] = 0x23, +	[OP_NOT] = 0x44, +	[OP_CLZ] = 0xC4, +	[OP_CLO] = 0xE4, +	[OP_SWP] = 0x2C, +	[OP_PCN] = 0x43 +}; +  static const uint8_t ind_ops[20] = {  	[CMP_IND] = CMP_IN,  	[CMP_IDY] = CMP_IY, @@ -461,6 +489,9 @@ static const char *lex_tok[] = {  	[TOK_EXTOP  ] = "TOK_EXTOP",  	[TOK_ORTHO  ] = "TOK_ORTHO",  	[TOK_REG    ] = "TOK_REG", +	[TOK_MEM    ] = "TOK_MEM", +	[TOK_CC     ] = "TOK_CC", +	[TOK_OS     ] = "TOK_OS",  	[TOK_RS     ] = "TOK_RS",  	[TOK_OF     ] = "TOK_OF",  	[TOK_COMMENT] = "TOK_COMMENT", @@ -646,6 +677,17 @@ static const char *ortho_mne[ORTHO_OPNUM] = {  	[SET] = "SET"  }; +static const char *set_cc[8] = { +	"NG", +	"PO", +	"CS", +	"CC", +	"EQ", +	"NE", +	"VS", +	"VC" +}; +  static const char *instdesc[OPNUM] = {  	[ADC] = "ADd accumulator, with operand, Carry if needed.",  	[AND] = "Bitwise AND accumulator, with operand.", @@ -762,8 +804,8 @@ extern uint8_t isfixup;  extern line *find_line(uint32_t ln, uint8_t dbg);  extern uint64_t lex(char *str, uint64_t address, uint16_t bline, uint8_t dbg); -extern uint64_t get_val(token *t, uint64_t addr, uint8_t size, uint8_t dbg); -extern token *skip_expr(token *t, uint8_t dbg); +extern uint64_t get_val(token *t, uint64_t addr, uint8_t size, uint8_t end_expr, uint8_t stop_comma, uint8_t dbg); +extern token *skip_expr(token *t, uint8_t end_expr, uint8_t stop_comma, uint8_t dbg);  extern uint64_t parse_tokens(token *tm, line **l, bytecount *bc, uint8_t isasm, uint64_t address, uint8_t dbg);  extern token *make_token(uint8_t id, uint8_t type, uint8_t space, uint8_t tab, uint64_t value, char *str, symbol *s);  extern void assemble(line *ln, bytecount *bc, uint8_t dbg); | 
