Skip to content

Instantly share code, notes, and snippets.

@flamewing
Created August 6, 2020 20:18
Show Gist options
  • Save flamewing/aa194543693e05a844aa964a451b42a3 to your computer and use it in GitHub Desktop.
Save flamewing/aa194543693e05a844aa964a451b42a3 to your computer and use it in GitHub Desktop.
Incomplete m68k grammar
label_preffix: "$$" | '@' | '.' | ε
label: label_preffix R"[A-Za-z_][A-Za-z0-9_]+"
binary_number: '%' R"[0-1]+" | R"0b[0-1]+"
octal_number: R"0o[0-7]+"
decimal_number: R"[0-9]+" | R"0d[0-9]+"
hexadecimal_number: '$' R"[0-9A-Fa-f]+" | R"0x[0-9A-Fa-f]+"
// Registers
data_register: R"d[0-7]"
address_register: R"a[0-7]" | "sp"
user_stack_pointer: "usp"
program_counter: "pc"
conditon_code_register: "ccr"
status_register: "sr"
// Addressing mode helpers
index_size: 'w' | 'l'
index_register: data_register | address_register
// Addressing modes
data_register_direct: data_register
address_register_direct: address_register
address_register_indirect: '(' address_register ')'
address_register_indirect_post_incr: address_register_indirect '+'
address_register_indirect_post_decr: '-' address_register_indirect
address_register_indirect_displacement: expression_16bitsigned '(' address_register ')'
| '(' expression_16bitsigned ',' address_register ')'
| '(' address_register ',' expression_16bitsigned ')'
address_register_indirect_with_index: expression_8bitsigned '(' address_register ',' index_register '.' index_size ')'
| expression_8bitsigned '(' index_register '.' index_size ',' address_register ')'
| '(' expression_8bitsigned ',' address_register ',' index_register '.' index_size ')'
| '(' expression_8bitsigned ',' index_register '.' index_size ',' address_register ')'
| '(' address_register ',' expression_8bitsigned ',' index_register '.' index_size ')'
| '(' index_register '.' index_size ',' expression_8bitsigned ',' address_register ')'
| '(' address_register ',' index_register '.' index_size ',' expression_8bitsigned ')'
| '(' index_register '.' index_size ',' address_register ',' expression_8bitsigned ')'
program_counter_indirect_displacement: offset_16bitsigned '(' program_counter ')'
| '(' offset_16bitsigned ',' program_counter ')'
| '(' program_counter ',' offset_16bitsigned ')'
| offset_16bitsigned
program_counter_indirect_with_index: offset_8bitsigned '(' program_counter ',' index_register '.' index_size ')'
| offset_8bitsigned '(' index_register '.' index_size ',' program_counter ')'
| '(' offset_8bitsigned ',' program_counter ',' index_register '.' index_size ')'
| '(' offset_8bitsigned ',' index_register '.' index_size ',' program_counter ')'
| '(' program_counter ',' offset_8bitsigned ',' index_register '.' index_size ')'
| '(' index_register '.' index_size ',' offset_8bitsigned ',' program_counter ')'
| '(' program_counter ',' index_register '.' index_size ',' offset_8bitsigned ')'
| '(' index_register '.' index_size ',' program_counter ',' offset_8bitsigned ')'
absolute_short: '(' expression_16bitsigned ')' '.' 'w'
absolute_long: '(' expression_24bit ')' '.' 'l'
absolute_automatic: expression
quick_3bit: '#' expression_3bitsigned
quick_4bit: '#' expression_4bitsigned
immediate_byte: '#' expression_8bitsigned
immediate_short: '#' expression_16bitsigned
immediate_long: '#' expression_32bit
ccr_value: R"[XNZVC]"
ccr_value_list: ccr_value
| ccr_value_list '|' ccr_value
ccr_expr: '#' expression_5bitunsigned
| ccr_values
register_selection: data_register_direct
| address_register_direct
| data_register_direct '-' data_register_direct
| data_register_direct '-' address_register_direct
| address_register_direct '-' address_register_direct
register_selection_list: register_selection
| register_selection_list '/' register_selection
// Address mode categories
register_direct: data_register_direct
| address_register_direct
register_indirect: address_register_indirect
| address_register_indirect_post_incr
| address_register_indirect_post_decr
| address_register_indirect_displacement
register_indirect_with_index: address_register_indirect_with_index
program_counter_indirect: program_counter_indirect_displacement
program_counter_indirect_with_index: program_counter_indirect_with_index
absolute_data: absolute_short | absolute_long | absolute_automatic
immediate: immediate_short | immediate_long
data: data_register_direct
| register_indirect
| register_indirect_with_index
| program_counter_indirect
| program_counter_indirect_with_index
| absolute_data
| immediate
memory: register_indirect
| register_indirect_with_index
| program_counter_indirect
| program_counter_indirect_with_index
| absolute_data
| immediate
control: address_register_indirect
| address_register_indirect_displacement
| register_indirect_with_index
| program_counter_indirect
| program_counter_indirect_with_index
| absolute_data
alterable: register_direct
| register_indirect
| register_indirect_with_index
data_alterable: data_register_direct
| register_indirect
| register_indirect_with_index
memory_alterable: register_indirect
| register_indirect_with_index
control_alterable: address_register_indirect
| address_register_indirect_displacement
| register_indirect_with_index
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment