LIB: pm_init
Initialize Pokemon-Mini and provide common declarations
pm_init.s
Type: Header File
Dependency: None
Including Rules: Must be on top of the main file
ROM/RAM Usage: None
Initialization
When the extra flag IRQF_NOSTARTUP isn't expecified in PM_HEADER, the following will be executed:
- Interrupts are disabled
- Upper addresses (Indexes) are cleared
- Register N and stack are initialized
- Upper address of map and sprite bases are set to 0
- Seed of rand is set to 1
- Interrupts enable are all cleared
- Interrupts priorities set: PRC=1, Timers=2, Tmr256=1, Cartridge=3, Keypad=1, IR/Shock=2
- Jump to main
Otherwise only step 8 is executed.
    
Macros
Note: Macros names are case insensitive
| Macro | Description | 
|---|---|
| PM_HEADER game_title, irq_flags, ex_flags | Declare pokémon-mini header, ROM start game_title = Maximum of 12 Characters irq_flags = or IRQ_* flags ex_flags = or IRQF_* flags | 
| PM_ROMINFO | Optional, report ROM and RAM size, must be included on the bottom of the main file. | 
| CPU_CLEAR | Clear BCD and NIBBLE modes | 
| COLORPM_INIT | Initialize Color PM Interface | 
| RIRQ rirq_flag | Return from IRQ, single IRQ_* only | 
| PRIORITY_IRQS priority, irqs_select | Setup IRQ priorities, multiple IRQ_* allowed priority = 0 - IRQs Disabled priority = 1 - Low Priority priority = 2 - Medium Priority priority = 3 - High Priority | 
| ENABLE_IRQS irqs_select | Enable IRQ(s), multiple IRQ_* allowed | 
| DISABLE_IRQS irqs_select | Disable IRQ(s), multiple IRQ_* allowed | 
| ENABLE_MIRQ | Enable Master Interrupt, same as "and f, ~FLAG_ID" | 
| DISABLE_MIRQ | Disable Master Interrupt, same as "or f, FLAG_ID" | 
| PM_ALIGN_MAP PM_ALIGN_TILES | Align data for PRC map tiles, equivalent to ".align 8" but doesn't override assembler's aligment | 
| PM_ALIGN_SPR PM_ALIGN_OAM | Align data for PRC sprites tiles, equivalent to ".align 64" but doesn't override assembler's aligment | 
Peudo-instructions, automatically manage banks before jumping:
| Macro | Description | 
|---|---|
| fjmp label | Far version of JMP | 
| fjc label | Far version of JC | 
| fjnc label | Far version of JNC | 
| fjz label | Far version of JZ | 
| fjnz label | Far version of JNZ | 
| fjdbnz label | Far version of JBDNZ | 
| fjl label | Far version of JL | 
| fjle label | Far version of JLE | 
| fjg label | Far version of JG | 
| fjge label | Far version of JGE | 
| fjo label | Far version of JO | 
| fjno label | Far version of JNO | 
| fjns label | Far version of JNS | 
| fjs label | Far version of JS | 
| fcall label | Far version of CALL | 
| fcallc label | Far version of CALLC | 
| fcallnc label | Far version of CALLNC | 
| fcallz label | Far version of CALLZ | 
| fcallnz label | Far version of CALLNZ | 
| fcalll label | Far version of CALLL | 
| fcallle label | Far version of CALLLE | 
| fcallg label | Far version of CALLG | 
| fcallge label | Far version of CALLGE | 
| fcallo label | Far version of CALLO | 
| fcallno label | Far version of CALLNO | 
| fcallns label | Far version of CALLNS | 
| fcalls label | Far version of CALLS | 
Peudo-instructions, automatically update upper address:
| Macro | Description | 
|---|---|
| add24x number | Add/Sub XI:X by number | 
| add24y number | Add/Sub YI:Y by number | 
| add24hl number | Add/Sub I:HL by number | 
| add24x_a number | Add/Sub XI:X by number, trash A on page cross | 
| add24y_a number | Add/Sub YI:Y by number, trash A on page cross | 
| add24hl_a number | Add/Sub I:HL by number, trash A on page cross | 
number value must be between -65535 and 65535
      "INC" instruction will be used if number is 1
    No code will be generated if number is 0
Defines
Definitions in bold have multiple definitions with the same value, hover the mouse over to see the list
RAM variables
| Definition | Init | Description | 
|---|---|---|
| PMINIT_RAND | 0x0001 | 16-Bits Random Generator Seed | 
| PMINIT_KEYPAD | 0x?? | Keypad status at start of ROM | 
| PMINIT_FRAMECNT | 0x00 | Frame counter, used in CLib PRC wait routines | 
Memory bases
| Definition | Value | Description | 
|---|---|---|
| Registers bases | ||
| SSTACK_BASE | $1FFC | Safe stack base (for RAM vector) | 
| STACK_BASE | $2000 | Stack base | 
| REG_BASE | $2000 | Registers base | 
| N_BASE | $20 | N register base | 
| Memory bases | ||
| VRAM_BASE | $1000 | Videobuffer RAM base | 
| SPR_BASE | $1300 | Sprites base | 
| MAP_BASE | $1360 | MAP base | 
| RAM_BASE | $1500 | RAM base | 
| PRC_MAP_BASE | $2082 | PRC Map base | 
| PRC_SPR_BASE | $2085 | PRC Sprite base | 
| Version | ||
| PMINIT_VER | 5 | pminit library revision number | 
Registers
For more information about registers, check here
| Definition | Value | Description | 
|---|---|---|
| BIOS | ||
| SYS_CTRL1 | $00 | System Control 1 | 
| SYS_CTRL2 | $01 | System Control 2 | 
| SYS_CTRL3 | $02 | System Control 3 | 
| Seconds Timer | ||
| SEC_CTRL | $08 | Second Counter Control | 
| SEC_CNT_LO | $09 | Second Counter Low | 
| SEC_CNT_MID | $0A | Second Counter Middle | 
| SEC_CNT_HI | $0B | Second Counter High | 
| Battery status | ||
| SYS_BATT | $10 | Battery Sensor | 
| Timers control | ||
| TMR1_SCALE | $18 | Timer 1 Prescalar | 
| TMR1_ENA_OSC | $19 | Timers Osc. Enable Timer 1 Osc. Select | 
| TMR2_SCALE | $1A | Timer 2 Prescalar | 
| TMR2_OSC | $1B | Timer 2 Osc. Select | 
| TMR3_SCALE | $1C | Timer 3 Prescalar | 
| TMR3_OSC | $1D | Timer 3 Osc. Select | 
| Interrupts | ||
| IRQ_PRI1 | $20 | IRQ Priority 1 | 
| IRQ_PRI2 | $21 | IRQ Priority 2 | 
| IRQ_PRI3 | $22 | IRQ Priority 3 | 
| IRQ_ENA1 | $23 | IRQ Enable 1 | 
| IRQ_ENA2 | $24 | IRQ Enable 2 | 
| IRQ_ENA3 | $25 | IRQ Enable 3 | 
| IRQ_ENA4 | $26 | IRQ Enable 4 | 
| IRQ_ACT1 | $27 | IRQ Active 1 | 
| IRQ_ACT2 | $28 | IRQ Active 2 | 
| IRQ_ACT3 | $29 | IRQ Active 3 | 
| IRQ_ACT4 | $2A | IRQ Active 4 | 
| Timer 1 | ||
| TMR1_CTRL_L | $30 | Timer 1 Control (Lo) | 
| TMR1_CTRL_H | $31 | Timer 1 Control (Hi) | 
| TMR1_PRE_L | $32 | Timer 1 Preset (Lo) | 
| TMR1_PRE_H | $33 | Timer 1 Preset (Hi) | 
| TMR1_PVT_L | $34 | Timer 1 Pivot (Lo) | 
| TMR1_PVT_H | $35 | Timer 1 Pivot (Hi) | 
| TMR1_CNT_L | $36 | Timer 1 Count (Lo) | 
| TMR1_CNT_H | $37 | Timer 1 Count (Hi) | 
| Timer 2 | ||
| TMR2_CTRL_L | $38 | Timer 2 Control (Lo) | 
| TMR2_CTRL_H | $39 | Timer 2 Control (Hi) | 
| TMR2_PRE_L | $3A | Timer 2 Preset (Lo) | 
| TMR2_PRE_H | $3B | Timer 2 Preset (Hi) | 
| TMR2_PVT_L | $3C | Timer 2 Pivot (Lo) | 
| TMR2_PVT_H | $3D | Timer 2 Pivot (Hi) | 
| TMR2_CNT_L | $3E | Timer 2 Count (Lo) | 
| TMR2_CNT_H | $3F | Timer 2 Count (Hi) | 
| 256 Hz Timer | ||
| TMR256_CTRL | $40 | 256Hz Timer Control | 
| TMR256_CNT | $41 | 256Hz Timer Counter | 
| Timer 3 | ||
| TMR3_CTRL_L | $48 | Timer 3 Control (Lo) | 
| TMR3_CTRL_H | $49 | Timer 3 Control (Hi) | 
| TMR3_PRE_L | $4A | Timer 3 Preset (Lo) | 
| TMR3_PRE_H | $4B | Timer 3 Preset (Hi) | 
| TMR3_PVT_L | $4C | Timer 3 Pivot (Lo) | 
| TMR3_PVT_H | $4D | Timer 3 Pivot (Hi) | 
| TMR3_CNT_L | $4E | Timer 3 Count (Lo) | 
| TMR3_CNT_H | $4F | Timer 3 Count (Hi) | 
| Inputs | ||
| KEY_PAD | $52 | Key-Pad Status (Active 0) | 
| CART_BUS | $53 | Cart Bus | 
| IO | ||
| IO_DIR | $60 | I/O Direction Select | 
| IO_DATA | $61 | I/O Data Register | 
| Audio | ||
| AUD_CTRL | $70 | Audio Control | 
| AUD_VOL | $71 | Audio Volume | 
| PRC | ||
| PRC_MODE | $80 | PRC Stage Control | 
| PRC_RATE | $81 | PRC Rate Control | 
| PRC_MAP_LO | $82 | PRC Map Tile Base Low | 
| PRC_MAP_MID | $83 | PRC Map Tile Base Middle | 
| PRC_MAP_HI | $84 | PRC Map Tile Base High | 
| PRC_SCROLL_Y | $85 | PRC Map Vertical Scroll | 
| PRC_SCROLL_X | $86 | PRC Map Horizontal Scroll | 
| PRC_SPR_LO | $87 | PRC Sprite Tile Base Low | 
| PRC_SPR_MID | $88 | PRC Sprite Tile Base Middle | 
| PRC_SPR_HI | $89 | PRC Sprite Tile Base High | 
| PRC_CNT | $8A | PRC Counter | 
| PokeMini | ||
| POKEMINI_CHR | $D0 | Debug output a character | 
| POKEMINI_HEX | $D1 | Debug output a 8-bits hexadecimal | 
| POKEMINI_UINTB | $D2 | Debug output a unsigned 8-bits number | 
| POKEMINI_SINTB | $D3 | Debug output a signed 8-bits number | 
| POKEMINI_UINTWL | $D4 | Debug output a unsigned 16-bits number (Low Byte) | 
| POKEMINI_UINTWH | $D5 | Debug output a unsigned 16-bits number (High Byte) | 
| POKEMINI_SINTWL | $D6 | Debug output a signed 16-bits number (Low Byte) | 
| POKEMINI_SINTWH | $D7 | Debug output a signed 16-bits number (High Byte) | 
| POKEMINI_FX8_8 | $DE | Debug output a fixed point 8.8 number (Low Byte) | 
| POKEMINI_FX8_8H | $DF | Debug output a fixed point 8.8 number (High Byte) | 
| Color PM Interface | ||
| COLORPM_CMD | $F0 | Color PM Command, writing send a command. Reading will check unlock status: $00 (Locked), $CE (Unlocked) | 
| COLORPM_ADDR | $F1 | CVRAM Address (Low Byte) | 
| COLORPM_ADDRH | $F2 | CVRAM Address (High Byte) | 
| COLORPM_DATA | $F3 | CVRAM Data | 
| COLORPM_LP0 | $F4 | Low Nibble Pixel 0 Color | 
| COLORPM_HP0 | $F5 | High Nibble Pixel 0 Color | 
| COLORPM_LP1 | $F6 | Low Nibble Pixel 1 Color | 
| COLORPM_HP1 | $F7 | Hig Nibble Pixel 1 Color | 
| LCD Raw | ||
| LCD_CTRL | $FE | LCD Raw Control Byte | 
| LCD_DATA | $FF | LCD Raw Data Byte | 
Misc. defines
Definitions to be used to comunicate with the hardware
    For more information about registers, check here
| Definition | Value | Usage | Description | 
|---|---|---|---|
| Master Interrupt | |||
| DISABLE_IRQ | $C0 | mov f, DISABLE_IRQ | Disable Master Interrupt | 
| ENABLE_IRQ | $80 | mov f, ENABLE_IRQ | Enable Master Interrupt | 
| Timers Enable | |||
| TMRS_ENABLE | $30 | or [n+TMR1_ENA_OSC], TMRS_ENABLE | Timers Enable | 
| and [n+TMR1_ENA_OSC], ~TMRS_ENABLE | Timers Disable | ||
| TMRS_OSC1 | $20 | or [n+TMR1_ENA_OSC], TMRS_OSC1 | Timers 2Mhz Oscillator On | 
| and [n+TMR1_ENA_OSC], ~TMRS_OSC1 | Timers 2Mhz Oscillator Off | ||
| TMRS_OSC2 | $10 | or [n+TMR1_ENA_OSC], TMRS_OSC2 | Timers 32Khz Oscillator On | 
| and [n+TMR1_ENA_OSC], ~TMRS_OSC2 | Timers 32Khz Oscillator Off | ||
| Seconds Timer | |||
| SEC_ENABLE | $01 | or [n+SEC_CTRL], SEC_ENABLE | Second Counter Enable | 
| and [n+SEC_CTRL], ~SEC_ENABLE | Second Counter Disable | ||
| SEC_RESET | $02 | or [n+SEC_CTRL], SEC_RESET | Second Counter Reset | 
| Battery status | |||
| LOW_BATTERY | $20 | tst [n+SYS_BATT], LOW_BATTERY | Low battery indicator | 
| 256Hz Timer | |||
| TMR256_ENABLE | $01 | or [n+TMR256_CTRL], TMR256_ENABLE | 256Hz Timer Enable | 
| and [n+TMR256_CTRL], ~TMR256_ENABLE | 256Hz Timer Disable | ||
| TMR256_RESET | $02 | or [n+TMR256_CTRL], TMR256_RESET | 256Hz Timer Reset | 
| Timer 1-3 Control | |||
| TMR_8BITS | $00 | mov [n+TMR1_CTRL_L], TMR8_BITS | .. mov [n+TMR2_CTRL_L], TMR8_BITS | .. mov [n+TMR3_CTRL_L], TMR8_BITS | .. | 8-Bits Timer 1-3 | 
| TMR_16BITS | $80 | mov [n+TMR1_CTRL_L], TMR16_BITS | .. mov [n+TMR2_CTRL_L], TMR16_BITS | .. mov [n+TMR3_CTRL_L], TMR16_BITS | .. | 16-Bits Timer 1-3 | 
| TMR_PRESET | $02 | or [n+TMR1_CTRL_L], TMR_PRESET or [n+TMR1_CTRL_H],TMR_PRESET or [n+TMR2_CTRL_L],TMR_PRESET or [n+TMR2_CTRL_H],TMR_PRESET or [n+TMR3_CTRL_L],TMR_PRESET or [n+TMR3_CTRL_H],TMR_PRESET | Timer 1-3 Preset | 
| TMR_ENABLE | $04 | mov [n+TMR1_CTRL_L], TMR_ENABLE | .. mov [n+TMR1_CTRL_H], TMR_ENABLE | .. mov [n+TMR2_CTRL_L], TMR_ENABLE | .. mov [n+TMR2_CTRL_H], TMR_ENABLE | .. mov [n+TMR3_CTRL_L], TMR_ENABLE | .. mov [n+TMR3_CTRL_H], TMR_ENABLE | .. | Timer 1-3 Enable | 
| Timer 1-3 Scale | |||
| TMR_DIV_OFF | $00 | mov [n+TMR1_SCALE], TMR_DIV_OFF mov [n+TMR2_SCALE], TMR_DIV_OFF mov [n+TMR3_SCALE], TMR_DIV_OFF | Prescalar Off | 
| TMR_DIV_2 | $08 | mov [n+TMR1_SCALE], TMR_DIV_2 mov [n+TMR2_SCALE], TMR_DIV_2 mov [n+TMR3_SCALE], TMR_DIV_2 | Prescalar /2 (Osc. 1) | 
| TMR_DIV_8 | $09 | mov [n+TMR1_SCALE], TMR_DIV_8 mov [n+TMR2_SCALE], TMR_DIV_8 mov [n+TMR3_SCALE], TMR_DIV_8 | Prescalar /8 (Osc. 1) | 
| TMR_DIV_32 | $0A | mov [n+TMR1_SCALE], TMR_DIV_32 mov [n+TMR2_SCALE], TMR_DIV_32 mov [n+TMR3_SCALE], TMR_DIV_32 | Prescalar /32 (Osc. 1) | 
| TMR_DIV_64 | $0B | mov [n+TMR1_SCALE], TMR_DIV_64 mov [n+TMR2_SCALE], TMR_DIV_64 mov [n+TMR3_SCALE], TMR_DIV_64 | Prescalar /64 (Osc. 1) | 
| TMR_DIV_128 | $0C | mov [n+TMR1_SCALE], TMR_DIV_128 mov [n+TMR2_SCALE], TMR_DIV_128 mov [n+TMR3_SCALE], TMR_DIV_128 | Prescalar /128 (Osc. 1) | 
| TMR_DIV_256 | $0D | mov [n+TMR1_SCALE], TMR_DIV_256 mov [n+TMR2_SCALE], TMR_DIV_256 mov [n+TMR3_SCALE], TMR_DIV_256 | Prescalar /256 (Osc. 1) | 
| TMR_DIV_1024 | $0E | mov [n+TMR1_SCALE], TMR_DIV_1024 mov [n+TMR2_SCALE], TMR_DIV_1024 mov [n+TMR3_SCALE], TMR_DIV_1024 | Prescalar /1024 (Osc. 1) | 
| TMR_DIV_4096 | $0F | mov [n+TMR1_SCALE], TMR_DIV_4096 mov [n+TMR2_SCALE], TMR_DIV_4096 mov [n+TMR3_SCALE], TMR_DIV_4096 | Prescalar /4096 (Osc. 1) | 
| TMR_DIV2_OFF | $00 | mov [n+TMR1_SCALE], TMR_DIV2_OFF mov [n+TMR2_SCALE], TMR_DIV2_OFF mov [n+TMR3_SCALE], TMR_DIV2_OFF | Prescalar Off | 
| TMR_DIV2_1 | $08 | mov [n+TMR1_SCALE], TMR_DIV2_1 mov [n+TMR2_SCALE], TMR_DIV2_1 mov [n+TMR3_SCALE], TMR_DIV2_1 | Prescalar /1 (Osc. 2) | 
| TMR_DIV2_2 | $09 | mov [n+TMR1_SCALE], TMR_DIV2_2 mov [n+TMR2_SCALE], TMR_DIV2_2 mov [n+TMR3_SCALE], TMR_DIV2_2 | Prescalar /2 (Osc. 2) | 
| TMR_DIV2_4 | $0A | mov [n+TMR1_SCALE], TMR_DIV2_4 mov [n+TMR2_SCALE], TMR_DIV2_4 mov [n+TMR3_SCALE], TMR_DIV2_4 | Prescalar /4 (Osc. 2) | 
| TMR_DIV2_8 | $0B | mov [n+TMR1_SCALE], TMR_DIV2_8 mov [n+TMR2_SCALE], TMR_DIV2_8 mov [n+TMR3_SCALE], TMR_DIV2_8 | Prescalar /8 (Osc. 2) | 
| TMR_DIV2_16 | $0C | mov [n+TMR1_SCALE], TMR_DIV2_16 mov [n+TMR2_SCALE], TMR_DIV2_16 mov [n+TMR3_SCALE], TMR_DIV2_16 | Prescalar /16 (Osc. 2) | 
| TMR_DIV2_32 | $0D | mov [n+TMR1_SCALE], TMR_DIV2_32 mov [n+TMR2_SCALE], TMR_DIV2_32 mov [n+TMR3_SCALE], TMR_DIV2_32 | Prescalar /32 (Osc. 2) | 
| TMR_DIV2_64 | $0E | mov [n+TMR1_SCALE], TMR_DIV2_64 mov [n+TMR2_SCALE], TMR_DIV2_64 mov [n+TMR3_SCALE], TMR_DIV2_64 | Prescalar /64 (Osc. 2) | 
| TMR_DIV2_128 | $0F | mov [n+TMR1_SCALE], TMR_DIV2_128 mov [n+TMR2_SCALE], TMR_DIV2_128 mov [n+TMR3_SCALE], TMR_DIV2_128 | Prescalar /128 (Osc. 2) | 
| TMR_HI_DIV_OFF | $00 | mov [n+TMR1_SCALE], TMR_HI_DIV_OFF | .. mov [n+TMR2_SCALE], TMR_HI_DIV_OFF | .. mov [n+TMR3_SCALE], TMR_HI_DIV_OFF | .. | Prescalar Off | 
| TMR_HI_DIV_2 | $80 | mov [n+TMR1_SCALE], TMR_HI_DIV_2 | .. mov [n+TMR2_SCALE], TMR_HI_DIV_2 | .. mov [n+TMR3_SCALE], TMR_HI_DIV_2 | .. | Prescalar /2 (Osc. 1) | 
| TMR_HI_DIV_8 | $90 | mov [n+TMR1_SCALE], TMR_HI_DIV_8 | .. mov [n+TMR2_SCALE], TMR_HI_DIV_8 | .. mov [n+TMR3_SCALE], TMR_HI_DIV_8 | .. | Prescalar /8 (Osc. 1) | 
| TMR_HI_DIV_32 | $A0 | mov [n+TMR1_SCALE], TMR_HI_DIV_32 | .. mov [n+TMR2_SCALE], TMR_HI_DIV_32 | .. mov [n+TMR3_SCALE], TMR_HI_DIV_32 | .. | Prescalar /32 (Osc. 1) | 
| TMR_HI_DIV_64 | $B0 | mov [n+TMR1_SCALE], TMR_HI_DIV_64 | .. mov [n+TMR2_SCALE], TMR_HI_DIV_64 | .. mov [n+TMR3_SCALE], TMR_HI_DIV_64 | .. | Prescalar /64 (Osc. 1) | 
| TMR_HI_DIV_128 | $C0 | mov [n+TMR1_SCALE], TMR_HI_DIV_128 | .. mov [n+TMR2_SCALE], TMR_HI_DIV_128 | .. mov [n+TMR3_SCALE], TMR_HI_DIV_128 | .. | Prescalar /128 (Osc. 1) | 
| TMR_HI_DIV_256 | $D0 | mov [n+TMR1_SCALE], TMR_HI_DIV_256 | .. mov [n+TMR2_SCALE], TMR_HI_DIV_256 | .. mov [n+TMR3_SCALE], TMR_HI_DIV_256 | .. | Prescalar /256 (Osc. 1) | 
| TMR_HI_DIV_1024 | $E0 | mov [n+TMR1_SCALE], TMR_HI_DIV_1024 | .. mov [n+TMR2_SCALE], TMR_HI_DIV_1024 | .. mov [n+TMR3_SCALE], TMR_HI_DIV_1024 | .. | Prescalar /1024 (Osc. 1) | 
| TMR_HI_DIV_4096 | $F0 | mov [n+TMR1_SCALE], TMR_HI_DIV_4096 | .. mov [n+TMR2_SCALE], TMR_HI_DIV_4096 | .. mov [n+TMR3_SCALE], TMR_HI_DIV_4096 | .. | Prescalar /4096 (Osc. 1) | 
| TMR_HI_DIV2_OFF | $00 | mov [n+TMR1_SCALE], TMR_HI_DIV2_OFF | .. mov [n+TMR2_SCALE], TMR_HI_DIV2_OFF | .. mov [n+TMR3_SCALE], TMR_HI_DIV2_OFF | .. | Prescalar Off | 
| TMR_HI_DIV2_1 | $80 | mov [n+TMR1_SCALE], TMR_HI_DIV2_1 | .. mov [n+TMR2_SCALE], TMR_HI_DIV2_1 | .. mov [n+TMR3_SCALE], TMR_HI_DIV2_1 | .. | Prescalar /1 (Osc. 2) | 
| TMR_HI_DIV2_2 | $90 | mov [n+TMR1_SCALE], TMR_HI_DIV2_2 | .. mov [n+TMR2_SCALE], TMR_HI_DIV2_2 | .. mov [n+TMR3_SCALE], TMR_HI_DIV2_2 | .. | Prescalar /2 (Osc. 2) | 
| TMR_HI_DIV2_4 | $A0 | mov [n+TMR1_SCALE], TMR_HI_DIV2_4 | .. mov [n+TMR2_SCALE], TMR_HI_DIV2_4 | .. mov [n+TMR3_SCALE], TMR_HI_DIV2_4 | .. | Prescalar /4 (Osc. 2) | 
| TMR_HI_DIV2_8 | $B0 | mov [n+TMR1_SCALE], TMR_HI_DIV2_8 | .. mov [n+TMR2_SCALE], TMR_HI_DIV2_8 | .. mov [n+TMR3_SCALE], TMR_HI_DIV2_8 | .. | Prescalar /8 (Osc. 2) | 
| TMR_HI_DIV2_16 | $C0 | mov [n+TMR1_SCALE], TMR_HI_DIV2_16 | .. mov [n+TMR2_SCALE], TMR_HI_DIV2_16 | .. mov [n+TMR3_SCALE], TMR_HI_DIV2_16 | .. | Prescalar /16 (Osc. 2) | 
| TMR_HI_DIV2_32 | $D0 | mov [n+TMR1_SCALE], TMR_HI_DIV2_32 | .. mov [n+TMR2_SCALE], TMR_HI_DIV2_32 | .. mov [n+TMR3_SCALE], TMR_HI_DIV2_32 | .. | Prescalar /32 (Osc. 2) | 
| TMR_HI_DIV2_64 | $E0 | mov [n+TMR1_SCALE], TMR_HI_DIV2_64 | .. mov [n+TMR2_SCALE], TMR_HI_DIV2_64 | .. mov [n+TMR3_SCALE], TMR_HI_DIV2_64 | .. | Prescalar /64 (Osc. 2) | 
| TMR_HI_DIV2_128 | $F0 | mov [n+TMR1_SCALE], TMR_HI_DIV2_128 | .. mov [n+TMR2_SCALE], TMR_HI_DIV2_128 | .. mov [n+TMR3_SCALE], TMR_HI_DIV2_128 | .. | Prescalar /128 (Osc. 2) | 
| Timer 1-3 Osc. Select | |||
| TMR_OSC1_LO | $00 | mov [n+TMR1_OSC], TMR_OSC1_LO | .. mov [n+TMR2_OSC], TMR_OSC1_LO | .. mov [n+TMR3_OSC], TMR_OSC1_LO | .. | Timer 1-3 Osc. 1 for Lo / 16Bits | 
| TMR_OSC1_HI | $00 | mov [n+TMR1_OSC], TMR_OSC1_HI | .. mov [n+TMR2_OSC], TMR_OSC1_HI | .. mov [n+TMR3_OSC], TMR_OSC1_HI | .. | Timer 1-3 Osc. 1 for Hi | 
| TMR_OSC2_LO | $01 | mov [n+TMR1_OSC], TMR_OSC2_LO | .. mov [n+TMR2_OSC], TMR_OSC2_LO | .. mov [n+TMR3_OSC], TMR_OSC2_LO | .. | Timer 1-3 Osc. 2 for Lo / 16Bits | 
| TMR_OSC2_HI | $02 | mov [n+TMR1_OSC], TMR_OSC2_HI | .. mov [n+TMR2_OSC], TMR_OSC2_HI | .. mov [n+TMR3_OSC], TMR_OSC2_HI | .. | Timer 1-3 Osc. 2 for Hi | 
| Interrupts Priority | |||
| IRQ_PRI1_TMR3 | $03 | mov [n+IRQ_PRI1],IRQ_PRI1_TMR3| .. | IRQ Priority - Timer 3 | 
| IRQ_PRI1_TMR1 | $0C | mov [n+IRQ_PRI1],IRQ_PRI1_TMR1| .. | IRQ Priority - Timer 1 | 
| IRQ_PRI1_TMR2 | $30 | mov [n+IRQ_PRI1] ,IRQ_PRI1_TMR2| .. | IRQ Priority - Timer 2 | 
| IRQ_PRI1_PRC | $C0 | mov [n+IRQ_PRI1], IRQ_PRI1_PRC| .. | IRQ Priority - PRC | 
| IRQ_PRI2_UNKNOWN | $03 | mov [n+IRQ_PRI2], IRQ_PRI2_UNKNOWN| .. | IRQ Priority - Unknown | 
| IRQ_PRI2_KEY_PAD | $0C | mov [n+IRQ_PRI2], IRQ_PRI2_KEY_PAD| .. | IRQ Priority - Keypad | 
| IRQ_PRI2_CARTRIDGE | $30 | mov [n+IRQ_PRI2], IRQ_PRI2_CARTRIDGE| .. | IRQ Priority - Cartridge | 
| IRQ_PRI2_TMR256 | $C0 | mov [n+IRQ_PRI2], IRQ_PRI2_TMR256| .. | IRQ Priority - 256 Hz Timer | 
| IRQ_PRI3_IO | $03 | mov [n+IRQ_PRI3], IRQ_PRI3_IO| .. | IRQ Priority - I/O | 
| Interrupts Enable | |||
| IRQ_ENA1_TMR3_PVT | $01 | mov [n+IRQ_ENA1], IRQ_ENA1_TMR3_PVT| .. | IRQ Enable - Timer 3 Pivot | 
| IRQ_ENA1_TMR3_HI | $02 | mov [n+IRQ_ENA1], IRQ_ENA1_TMR3_HI| .. | IRQ Enable - Timer 3 Upper-8 | 
| IRQ_ENA1_TMR1_LO | $04 | mov [n+IRQ_ENA1], IRQ_ENA1_TMR1_LO| .. | IRQ Enable - Timer 1 Lower-8 | 
| IRQ_ENA1_TMR1_HI | $08 | mov [n+IRQ_ENA1], IRQ_ENA1_TMR1_HI| .. | IRQ Enable - Timer 1 Upper-8 | 
| IRQ_ENA1_TMR2_LO | $10 | mov [n+IRQ_ENA1], IRQ_ENA1_TMR2_LO| .. | IRQ Enable - Timer 2 Lower-8 | 
| IRQ_ENA1_TMR2_HI | $20 | mov [n+IRQ_ENA1], IRQ_ENA1_TMR2_HI| .. | IRQ Enable - Timer 2 Upper-8 | 
| IRQ_ENA1_PRC_DIV | $40 | mov [n+IRQ_ENA1], IRQ_ENA1_PRC_DIV| .. | IRQ Enable - PRC Frame Divider | 
| IRQ_ENA1_PRC_COPY | $80 | mov [n+IRQ_ENA1], IRQ_ENA1_PRC_COPY| .. | IRQ Enable - PRC Frame Copy | 
| IRQ_ENA2_CARTRIDGE | $01 | mov [n+IRQ_ENA2], IRQ_ENA2_CARTRIDGE| .. | IRQ Enable - Cartridge IRQ | 
| IRQ_ENA2_CART_EJECT | $02 | mov [n+IRQ_ENA2], IRQ_ENA2_CARTRIDGE| .. | IRQ Enable - Cartridge Eject | 
| IRQ_ENA2_1HZ | $04 | mov [n+IRQ_ENA2], IRQ_ENA2_1HZ| .. | IRQ Enable - 1Hz (From 256 Hz Timer) | 
| IRQ_ENA2_2HZ | $08 | mov [n+IRQ_ENA2], IRQ_ENA2_2HZ| .. | IRQ Enable - 2 Hz (From 256 Hz Timer) | 
| IRQ_ENA2_8HZ | $10 | mov [n+IRQ_ENA2], IRQ_ENA2_8HZ| .. | IRQ Enable - 8 Hz (From 256 Hz Timer) | 
| IRQ_ENA2_32HZ | $20 | mov [n+IRQ_ENA2], IRQ_ENA2_32HZ| .. | IRQ Enable - 32 Hz (From 256 Hz Timer) | 
| IRQ_ENA3_KEY_A | $01 | mov [n+IRQ_ENA3], IRQ_ENA3_KEY_A| .. | IRQ Enable - A Key | 
| IRQ_ENA3_KEY_B | $02 | mov [n+IRQ_ENA3], IRQ_ENA3_KEY_B| .. | IRQ Enable - B Key | 
| IRQ_ENA3_KEY_C | $04 | mov [n+IRQ_ENA3], IRQ_ENA3_KEY_C| .. | IRQ Enable - C Key | 
| IRQ_ENA3_KEY_UP | $08 | mov [n+IRQ_ENA3], IRQ_ENA3_KEY_UP| .. | IRQ Enable - Up Key | 
| IRQ_ENA3_KEY_DOWN | $10 | mov [n+IRQ_ENA3], IRQ_ENA3_KEY_DOWN| .. | IRQ Enable - Down Key | 
| IRQ_ENA3_KEY_LEFT | $20 | mov [n+IRQ_ENA3], IRQ_ENA3_KEY_LEFT| .. | IRQ Enable - Left Key | 
| IRQ_ENA3_KEY_RIGHT | $40 | mov [n+IRQ_ENA3], IRQ_ENA3_KEY_RIGHT| .. | IRQ Enable - Right Key | 
| IRQ_ENA3_KEY_POWER | $80 | mov [n+IRQ_ENA3], IRQ_ENA3_KEY_POWER| .. | IRQ Enable - Power Key | 
| IRQ_ENA3_KEYS | $FF | mov [n+IRQ_ENA3], IRQ_ENA3_KEYS | IRQ Enable - All Keys | 
| IRQ_ENA4_UNKNOWN1 | $01 | mov [n+IRQ_ENA4], IRQ_ENA4_UNKNOWN1 | IRQ Enable - Unknown 1 | 
| IRQ_ENA4_UNKNOWN2 | $02 | mov [n+IRQ_ENA4], IRQ_ENA4_UNKNOWN2 | IRQ Enable - Unknown 2 | 
| IRQ_ENA4_UNKNOWN3 | $04 | mov [n+IRQ_ENA4], IRQ_ENA4_UNKNOWN3 | IRQ Enable - Unknown 3 | 
| IRQ_ENA4_UNMAPPED1 | $10 | mov [n+IRQ_ENA4], IRQ_ENA4_UNMAPPED1 | IRQ Enable - Unmapped 1 | 
| IRQ_ENA4_UNMAPPED2 | $20 | mov [n+IRQ_ENA4], IRQ_ENA4_UNMAPPED2 | IRQ Enable - Unmapped 2 | 
| IRQ_ENA4_SHOCK | $40 | mov [n+IRQ_ENA4], IRQ_ENA4_SHOCK | IRQ Enable - Shock Detector | 
| IRQ_ENA4_IR_RX | $80 | mov [n+IRQ_ENA4], IRQ_ENA4_IR_RX | IRQ Enable - IR Receiver | 
| Interrupts Active | |||
| IRQ_ACT1_TMR3_PVT | $01 | mov [n+IRQ_ACT1], IRQ_ACT1_TMR3_PVT| .. | IRQ Active - Timer 3 Pivot | 
| IRQ_ACT1_TMR3_HI | $02 | mov [n+IRQ_ACT1], IRQ_ACT1_TMR3_HI| .. | IRQ Active - Timer 3 Upper-8 | 
| IRQ_ACT1_TMR1_LO | $04 | mov [n+IRQ_ACT1], IRQ_ACT1_TMR1_LO| .. | IRQ Active - Timer 1 Lower-8 | 
| IRQ_ACT1_TMR1_HI | $08 | mov [n+IRQ_ACT1], IRQ_ACT1_TMR1_HI| .. | IRQ Active - Timer 1 Upper-8 | 
| IRQ_ACT1_TMR2_LO | $10 | mov [n+IRQ_ACT1], IRQ_ACT1_TMR2_LO| .. | IRQ Active - Timer 2 Lower-8 | 
| IRQ_ACT1_TMR2_HI | $20 | mov [n+IRQ_ACT1], IRQ_ACT1_TMR2_HI| .. | IRQ Active - Timer 2 Upper-8 | 
| IRQ_ACT1_PRC_DIV | $40 | mov [n+IRQ_ACT1], IRQ_ACT1_PRC_DIV| .. | IRQ Active - PRC Frame Divider | 
| IRQ_ACT1_PRC_COPY | $80 | mov [n+IRQ_ACT1], IRQ_ACT1_PRC_COPY| .. | IRQ Active - PRC Frame Copy | 
| IRQ_ACT2_CARTRIDGE | $01 | mov [n+IRQ_ACT2], IRQ_ACT2_CARTRIDGE| .. | IRQ Active - Cartridge IRQ | 
| IRQ_ACT2_CART_EJECT | $02 | mov [n+IRQ_ACT2], IRQ_ACT2_CARTRIDGE| .. | IRQ Active - Cartridge Eject | 
| IRQ_ACT2_1HZ | $04 | mov [n+IRQ_ACT2], IRQ_ACT2_1HZ| .. | IRQ Active - 1Hz (From 256 Hz Timer) | 
| IRQ_ACT2_2HZ | $08 | mov [n+IRQ_ACT2], IRQ_ACT2_2HZ| .. | IRQ Active - 2 Hz (From 256 Hz Timer) | 
| IRQ_ACT2_8HZ | $10 | mov [n+IRQ_ACT2], IRQ_ACT2_8HZ| .. | IRQ Active - 8 Hz (From 256 Hz Timer) | 
| IRQ_ACT2_32HZ | $20 | mov [n+IRQ_ACT2], IRQ_ACT2_32HZ| .. | IRQ Active - 32 Hz (From 256 Hz Timer) | 
| IRQ_ACT3_KEY_A | $01 | mov [n+IRQ_ACT3], IRQ_ACT3_KEY_A| .. | IRQ Active - A Key | 
| IRQ_ACT3_KEY_B | $02 | mov [n+IRQ_ACT3], IRQ_ACT3_KEY_B| .. | IRQ Active - B Key | 
| IRQ_ACT3_KEY_C | $04 | mov [n+IRQ_ACT3], IRQ_ACT3_KEY_C| .. | IRQ Active - C Key | 
| IRQ_ACT3_KEY_UP | $08 | mov [n+IRQ_ACT3], IRQ_ACT3_KEY_UP| .. | IRQ Active - Up Key | 
| IRQ_ACT3_KEY_DOWN | $10 | mov [n+IRQ_ACT3], IRQ_ACT3_KEY_DOWN| .. | IRQ Active - Down Key | 
| IRQ_ACT3_KEY_LEFT | $20 | mov [n+IRQ_ACT3], IRQ_ACT3_KEY_LEFT| .. | IRQ Active - Left Key | 
| IRQ_ACT3_KEY_RIGHT | $40 | mov [n+IRQ_ACT3], IRQ_ACT3_KEY_RIGHT| .. | IRQ Active - Right Key | 
| IRQ_ACT3_KEY_POWER | $80 | mov [n+IRQ_ACT3], IRQ_ACT3_KEY_POWER| .. | IRQ Active - Power Key | 
| IRQ_ACT3_KEYS | $FF | mov [n+IRQ_ACT3], IRQ_ACT3_KEYS | IRQ Active - All Keys | 
| IRQ_ACT4_UNKNOWN1 | $01 | mov [n+IRQ_ACT4], IRQ_ACT4_UNKNOWN1 | IRQ Active - Unknown 1 | 
| IRQ_ACT4_UNKNOWN2 | $02 | mov [n+IRQ_ACT4], IRQ_ACT4_UNKNOWN2 | IRQ Active - Unknown 2 | 
| IRQ_ACT4_UNKNOWN3 | $04 | mov [n+IRQ_ACT4], IRQ_ACT4_UNKNOWN3 | IRQ Active - Unknown 3 | 
| IRQ_ACT4_UNMAPPED1 | $10 | mov [n+IRQ_ACT4], IRQ_ACT4_UNMAPPED1 | IRQ Active - Unmapped 1 | 
| IRQ_ACT4_UNMAPPED2 | $20 | mov [n+IRQ_ACT4], IRQ_ACT4_UNMAPPED2 | IRQ Active - Unmapped 2 | 
| IRQ_ACT4_SHOCK | $40 | mov [n+IRQ_ACT4], IRQ_ACT4_SHOCK | IRQ Active - Shock Detector | 
| IRQ_ACT4_IR_RX | $80 | mov [n+IRQ_ACT4], IRQ_ACT4_IR_RX | IRQ Active - IR Receiver | 
| Keypad Input | |||
| KEY_A | $01 | tst [n+KEY_PAD], KEY_A | A Key (Active Low) | 
| KEY_B | $02 | tst [n+KEY_PAD], KEY_B | B Key (Active Low) | 
| KEY_C | $04 | tst [n+KEY_PAD], KEY_C | C Key (Active Low) | 
| KEY_UP | $08 | tst [n+KEY_PAD], KEY_UP | Up Key (Active Low) | 
| KEY_DOWN | $10 | tst [n+KEY_PAD], KEY_DOWN | Down Key (Active Low) | 
| KEY_LEFT | $20 | tst [n+KEY_PAD], KEY_LEFT | Left Key (Active Low) | 
| KEY_RIGHT | $40 | tst [n+KEY_PAD], KEY_RIGHT | Right Key (Active Low) | 
| KEY_POWER | $80 | tst [n+KEY_PAD], KEY_POWER | Power Key (Active Low) | 
| Parallel I/O | IO_DIR: 0 = Output / 1 = Input | ||
| IO_IR_TX | $01 | mov [n+IO_DIR], IO_IR_TX| .. mov [n+IO_DATA], IO_IR_TX| .. | IR Transmitter | 
| IO_IR_RX | $02 | mov [n+IO_DIR], IO_IR_RX| .. mov [n+IO_DATA], IO_IR_RX| .. | IR Receiver | 
| IO_EEPROM_DAT | $04 | mov [n+IO_DIR], IO_EEPROM_DAT| .. mov [n+IO_DATA], IO_EEPROM_DAT| .. | EEPROM Data | 
| IO_EEPROM_CLK | $08 | mov [n+IO_DIR], IO_EEPROM_CLK| .. mov [n+IO_DATA], IO_EEPROM_CLK| .. | EEPROM Clock | 
| IO_RUMBLE | $10 | mov [n+IO_DIR], IO_RUMBLE| .. mov [n+IO_DATA], IO_RUMBLE| .. | Rumble | 
| IO_IR_DISABLE | $20 | mov [n+IO_DIR], IO_IR_DISABLE| .. mov [n+IO_DATA], IO_IR_DISABLE| .. | IR Disable | 
| PRC Mode | |||
| PRC_INVERTMAP | $01 | mov [n+PRC_MODE], PRC_INVERTMAP| .. | PRC Mode - Invert Map | 
| PRC_ENABLEMAP | $02 | mov [n+PRC_MODE], PRC_ENABLEMAP| .. | PRC Mode - Enable Map | 
| PRC_ENABLESPR | $04 | mov [n+PRC_MODE], PRC_ENABLESPR| .. | PRC Mode - Enable Sprite | 
| PRC_ENABLE | $08 | mov [n+PRC_MODE], PRC_ENABLE| .. | PRC Mode - Enable | 
| PRC_MAP12X16 | $00 | mov [n+PRC_MODE], PRC_MAP12X16| .. | PRC Mode - 12 x 16 Map | 
| PRC_MAP16X12 | $10 | mov [n+PRC_MODE], PRC_MAP16X12| .. | PRC Mode - 16 x 12 Map | 
| PRC_MAP24X8 | $20 | mov [n+PRC_MODE], PRC_MAP24X8| .. | PRC Mode - 24 x 8 Map | 
| PRC_MAP24X16 | $30 | mov [n+PRC_MODE], PRC_MAP24X16| .. | PRC Mode - 24 x 16 Map | 
| PRC_MAPMASK | $30 | mov [n+PRC_MODE], ~PRC_MAPMASK or [n+PRC_MODE], PRC_MAPnXn... | PRC Mode - Map Mask | 
| PRC Rate | |||
| PRC_RATE_3 | $00 | mov [n+PRC_RATE], PRC_RATE_3| .. | PRC Rate - /3, 24 fps | 
| PRC_RATE_6 | $02 | mov [n+PRC_RATE], PRC_RATE_6| .. | PRC Rate - /6, 12 fps | 
| PRC_RATE_9 | $04 | mov [n+PRC_RATE], PRC_RATE_9| .. | PRC Rate - /9, 8 fps | 
| PRC_RATE_12 | $06 | mov [n+PRC_RATE], PRC_RATE_12| .. | PRC Rate - /12, 6 fps | 
| PRC_RATE_2 | $08 | mov [n+PRC_RATE], PRC_RATE_2| .. | PRC Rate - /2, 36 fps | 
| PRC_RATE_4 | $0A | mov [n+PRC_RATE], PRC_RATE_4| .. | PRC Rate - /4, 18 fps | 
| PRC_RATE_6ALT | $0C | mov [n+PRC_RATE], PRC_RATE_6ALT| .. | PRC Rate - /6, 12 fps | 
| PRC_RATE_8 | $0E | mov [n+PRC_RATE], PRC_RATE_8| .. | PRC Rate - /8, 9 fps | 
| PRC_RATEMASK | $0E | and [n+PRC_RATE], ~PRC_RATEMASK or [n+PRC_RATE], PRC_RATE_n | PRC Rate - Mask | 
| LCD Data | |||
| LCD_COLUMN_LO | $00 | mov [n+LCD_CTRL], LCD_COLUMN_LO + #n | LCD - Set Column Low | 
| LCD_COLUMN_HI | $10 | mov [n+LCD_CTRL], LCD_COLUMN_HI + #n | LCD - Set Column High | 
| LCD_STARTLINE | $40 | mov [n+LCD_CTRL], LCD_STARTLINE + #n | LCD - Set Start line | 
| LCD_PAGE | $B0 | mov [n+LCD_CTRL], LCD_PAGE + #n | LCD - Set Page | 
| LCD_CONTRAST | $81 | mov [n+LCD_CTRL], LCD_CONTRAST mov [n+LCD_DATA], #n | LCD - Set Contrast | 
| LCD_SEGDIR | $A0 | mov [n+LCD_CTRL], LCD_SEGDIR | LCD - Segment Direction (Normal) | 
| LCD_INVSEGDIR | $A1 | mov [n+LCD_CTRL], LCD_INVSEGDIR | LCD - Segment Direction (Inverted) | 
| LCD_DISPSEL_ON | $A4 | mov [n+LCD_CTRL], LCD_DISPSEL_ON | LCD - Display Selection On | 
| LCD_DISPSEL_OFF | $A5 | mov [n+LCD_CTRL], LCD_DISPSEL_OFF | LCD - Display Selection Off | 
| LCD_DISPINV_ON | $A6 | mov [n+LCD_CTRL], LCD_DISPINV_ON | LCD - Display Invert On | 
| LCD_DISPINV_OFF | $A7 | mov [n+LCD_CTRL], LCD_DISPINV_OFF | LCD - Display Invert Off | 
| LCD_DISPENABLE | $AE | mov [n+LCD_CTRL], LCD_DISPENABLE | LCD - Display Enable | 
| LCD_DISPDISABLE | $AF | mov [n+LCD_CTRL], LCD_DISPDISABLE | LCD - Display Disable | 
| LCD_ROWNORMAL | $C0 | mov [n+LCD_CTRL], LCD_ROWNORMAL | LCD - Row Normal | 
| LCD_ROWINVERT | $C4 | mov [n+LCD_CTRL], LCD_ROWINVERT | LCD - Row Inverted | 
| LCD_START_RMW | $E0 | mov [n+LCD_CTRL], LCD_START_RMW | LCD - Start Read-Modify-Write | 
| LCD_END_RMW | $EE | mov [n+LCD_CTRL], LCD_END_RMW | LCD - End Read-Modify-Write | 
| LCD_RESET | $E2 | mov [n+LCD_CTRL], LCD_RESET | LCD - Reset | 
| LCD_NOP | $E3 | mov [n+LCD_CTRL], LCD_NOP | LCD - No Operation | 
| Color PM Interface | |||
| COLORPM_UNLOCK1 | $5A | mov [n+COLORPM_CMD], COLORPM_UNLOCK1 | 1st Unlock Code | 
| COLORPM_UNLOCK2 | $CE | mov [n+COLORPM_CMD], COLORPM_UNLOCK2 | 2nd Unlock Code | 
| COLORPM_UNLOCKED | $CE | mov a, COLORPM_UNLOCKED cmp a, [n+COLORPM_CMD] ; Zero if Color PM Interface is unlocked | Check if Color PM interface is unlocked | 
| COLORPM_LOCK | $CF | mov [n+COLORPM_CMD], COLORPM_LOCK | Lock Color PM interface | 
| COLORPM_FIXED | $A0 | mov [n+COLORPM_CMD], COLORPM_FIXED | Set CVRAM Access fixed Address won't change when data R/W | 
| COLORPM_POSTINC | $A1 | mov [n+COLORPM_CMD], COLORPM_POSTINC | Set CVRAM Access post-increment Address add 1 after data R/W | 
| COLORPM_POSTDEC | $A2 | mov [n+COLORPM_CMD], COLORPM_POSTINC | Set CVRAM Access post-decrement Address subtract 1 after data R/W | 
| COLORPM_PREINC | $A3 | mov [n+COLORPM_CMD], COLORPM_POSTINC | Set CVRAM Access pre-increment Address add 1 before data R/W | 
| COLORPM_VRAM_ON | $D0 | mov [n+COLORPM_CMD], COLORPM_VRAM_ON | Enable VRAM updates Any access to VRAM will update CVRAM | 
| COLORPM_LCD_ON | $D1 | mov [n+COLORPM_CMD], COLORPM_LCD_ON | Enable LCD updates Any access to LCD will update CVRAM | 
| COLORPM_PRC_ON | $D2 | mov [n+COLORPM_CMD], COLORPM_PRC_ON | Enable PRC updates Any PRC rendering will update CVRAM | 
| COLORPM_VRAM_OFF | $D8 | mov [n+COLORPM_CMD], COLORPM_VRAM_OFF | Disable VRAM updates Any access to VRAM will be ignored | 
| COLORPM_LCD_OFF | $D9 | mov [n+COLORPM_CMD], COLORPM_LCD_OFF | Disable LCD updates Any access to LCD will be ignred | 
| COLORPM_PRC_OFF | $DA | mov [n+COLORPM_CMD], COLORPM_PRC_OFF | Disable PRC updates Any PRC rendering will be ignored | 
| COLORPM_FLIP | $F0 | mov [n+COLORPM_CMD], COLORPM_FLIP | Flip CVRAM page | 
Sprites
Sprites should be updated after IRQ_PRC_COPY.
| Definition | Value | Usage | Description | 
|---|---|---|---|
| Sprite Content | |||
| SPR_X | $00 | mov x, #sprite_id << 2 mov [x+SPR_X], a | Sprite X Position Starting from -16 | 
| SPR_Y | $01 | mov x, #sprite_id << 2 mov [x+SPR_Y], a | Sprite Y Position Starting from -16 | 
| SPR_TILE | $02 | mov x, #sprite_id << 2 mov [x+SPR_TILE], a | Sprite Tile Number 0 to 255 | 
| SPR_CTRL | $03 | mov x, #sprite_id << 2 mov [x+SPR_CTRL], a | Sprite Control | 
| Sprite Control | |||
| SPR_HFLIP | $01 | mov a, SPR_HFLIP|.. mov [x+SPR_CTRL], a | Sprite Horizontal Flip | 
| SPR_VFLIP | $02 | mov a, SPR_VFLIP|.. mov [x+SPR_CTRL], a | Sprite Vertical Flip | 
| SPR_INVERT | $04 | mov a, SPR_INVERT|.. mov [x+SPR_CTRL], a | Sprite Invert Pixels | 
| SPR_ENABLE | $08 | mov a, SPR_ENABLE|.. mov [x+SPR_CTRL], a | Sprite Enabled (Visible) | 
Call BIOS IRQs
This defines are used on CINT instruction
| Definition | Value | Description | 
|---|---|---|
| CINT_HARDRESET | $00 | Hard Reset | 
| CINT_SOFTRESET | $01 | Soft Reset | 
| CINT_SOFTRESET2 | $02 | Soft Reset | 
| CINT_PRC_COPY | $03 | IRQ PRC Copy Complete | 
| CINT_PRC_DIV | $04 | IRQ PRC Frame Divider Overflow | 
| CINT_TMR2_HI | $05 | Timer 2 Upper-8 Overflow | 
| CINT_TMR2_LO | $06 | Timer 2 Lower-8 Overflow (8b only) | 
| CINT_TMR1_HI | $07 | Timer 1 Upper-8 Overflow | 
| CINT_TMR1_LO | $08 | Timer 1 Lower-8 Overflow (8b only) | 
| CINT_TMR3_HI | $09 | Timer 3 Upper-8 Overflow | 
| CINT_TMR3_PVT | $0A | Timer 3 Pivot | 
| CINT_32HZ | $0B | 32Hz (From 256 Hz Timer) | 
| CINT_8HZ | $0C | 8Hz (From 256 Hz Timer) | 
| CINT_2HZ | $0D | 2Hz (From 256 Hz Timer) | 
| CINT_1HZ | $0E | 1Hz (From 256 Hz Timer) | 
| CINT_IR_RX | $0F | IR Receiver | 
| CINT_SHOCK | $10 | Shock Sensor | 
| CINT_CART_EJECT | $13 | Cartridge Eject | 
| CINT_CARTRIDGE | $14 | Cartridge IRQ | 
| CINT_KEY_POWER | $15 | Power Key | 
| CINT_KEY_RIGHT | $16 | Right Key | 
| CINT_KEY_LEFT | $17 | Left Key | 
| CINT_KEY_DOWN | $18 | Down Key | 
| CINT_KEY_UP | $19 | Up Key | 
| CINT_KEY_C | $1A | C Key | 
| CINT_KEY_B | $1B | B Key | 
| CINT_KEY_A | $1C | A Key | 
| CINT_UNKNOWN1D | $1D | Unknown $1D | 
| CINT_UNKNOWN1E | $1E | Unknown $1E | 
| CINT_UNKNOWN1F | $1F | Unknown $1F | 
| CINT_IRQ_FFF1 | $20 | User IRQ Routine at PC 0xFFF1 | 
| CINT_SUSPEND | $21 | Suspend System | 
| CINT_SLEEP_LCDOFF | $22 | Sleep ?? | 
| CINT_SLEEP_LCDON | $23 | Sleep with display on ?? | 
| CINT_SHUTDOWN | $24 | Shutdown System (Use this to exit your game!) | 
| CINT_UNKNOWN25 | $25 | ?? (Involves Cartridge Eject) | 
| CINT_SET_CONTRAST | $26 | Set default LCD Constrast A = Contrast level 0x00 to 0x3F | 
| CINT_ADD_CONTRAST | $27 | Increase or decrease Contrast based of Zero flag 0 = Increase, 1 = Decrease Return A = 0x00 if succeed, 0xFF if not. | 
| CINT_APPLY_CONTRAST | $28 | Apply default LCD Constrast | 
| CINT_GET_CONTRAST | $29 | Get default LCD Contrast return A | 
| CINT_TMP_CONTRAST | $2A | Set temporary LCD Constrast A = Contrast level 0x00 to 0x3F | 
| CINT_LCD_ON | $2B | Turn LCD On | 
| CINT_LCD_INIT | $2C | Initialize LCD | 
| CINT_LCD_OFF | $2D | Turn LCD Off | 
| CINT_ENABLE_RAMVECTOR | $2E | Enable RAM vector. (Check if Register 0x01 Bit 7 is set, if not, it set bit 6 and 7) | 
| CINT_DISABLE_RAMVECTOR | $2F | Disable RAM vector | 
| CINT_ENABLE_CART_EJECT | $30 | Disable Cart Eject IRQ 13 (with abort) | 
| CINT_DISABLE_CART_EJECT | $31 | Enable Cart Eject IRQ 13 (with abort) | 
| CINT_UNKNOWN32 | $32 | ?? (Involves Cartridge Eject) | 
| CINT_UNKNOWN33 | $33 | ?? (Involves Cartridge Eject) | 
| CINT_UNKNOWN34 | $34 | Nintendo Dev Card (??) | 
| CINT_UNKNOWN35 | $35 | Nintendo Dev Card (??) | 
| CINT_UNKNOWN36 | $36 | ?? (Involves Cartridge Eject) | 
| CINT_UNKNOWN37 | $37 | Disable Cartridge Eject IRQ (Reg 0x24, Bit 1 = 0) | 
| CINT_UNKNOWN38 | $38 | ?? (Involves Cartridge Eject) | 
| CINT_UNKNOWN39 | $39 | ?? (Involves Cartridge Eject) | 
| CINT_UNKNOWN3A | $3A | Rumored to speed up CPU? | 
| CINT_CART_DISABLE | $3B | Recover from IRQ $39? | 
| CINT_CART_ENABLE | $3C | Cart power on and update state | 
| CINT_CART_DETECT | $3D | Cart detect. Z: No cart, NZ: Cart inserted (Test Register 0x53 Bit 1 and invert Zero flag) | 
| CINT_ROUTINE | $3E | Read structure, write 0xFF, compare values and optionally jump to subroutine X point to a structure in memory:
structure {
  byte   type            ; 0x01 = Call subroutine
                         ; 0x00 = Don't call subroutine
  triple write_0xFF_addr ; Address that 0xFF will be written
  triple compare_addr    ; Address to read for compare
  byte   compare_value   ; Value that must match the compare
  triple subroutine      ; Use byte POP to receive flag of the compare
}
if type is 0x00, register A return 0x01 if compare is equal | 
| CINT_SET_PRC_RATE | $3F | Set PRC Rate A = 0 to 7 | 
| CINT_GET_PRC_RATE | $40 | Get PRC Rate Return A | 
| CINT_MULTICART | $41 | Test cart type. Returns Z: non multi cart, NZ: multi cart (Register 0x01 Bit 3) | 
| CINT_DEVCART_READID | $42 | Nintendo Dev Card (Read IDs) | 
| CINT_DEVCART_RESET | $43 | Nintendo Dev Card (Reset) | 
| CINT_DEVCART_PROGRAM | $44 | Nintendo Dev Card (Program Byte) | 
| CINT_DEVCART_ERASE | $45 | Nintendo Dev Card (Erase Sector) | 
| CINT_DEVCART_UNLOCK | $46 | Nintendo Dev Card (Unlock flash page register. Command 0xD0) | 
| CINT_DEVCART_BANK | $47 | Nintendo Dev Card (Select flash bank. A=bank Nr, X last address of flash page) | 
| CINT_DEVCART_CMD_C9 | $48 | Nintendo Dev Card (Command 0xC9) | 
| CINT_DEVCART_PREPID | $49 | Nintendo Dev Card (Prepare Manufacturer and device ID readout. Command 0xC0) | 
| CINT_DEVCART_SELGAME | $4A | Nintendo Dev Card (Select flash game. A = game Nr. ([0x041048 + 96 * A] if 0x08 -> Command 0xC9) | 
| CINT_DEVCART_NSDK | $4B | Nintendo SDK | 
| CINT_IR_PULSE | $4C | IR pulse MOV [Y], $02 ; wait B*16 Cycles ; MOV [Y], $00 | 
IRQ Handling
This defines are used on macro PM_HEADER in the 3rd parameter and macros RIRQ, PRIORITY_IRQS, ENABLE_IRQS and DISABLE_IRQS. They can be combined with logic OR (character | ). Function name is the same as the definition but in lowercase.
| Definition | Description | 
|---|---|
| Individual | |
| IRQ_PRC_COPY | IRQ PRC Copy Complete | 
| IRQ_PRC_DIV | IRQ PRC Frame Divider Overflow | 
| IRQ_TMR2_HI | Timer 2 Upper-8 Overflow | 
| IRQ_TMR2_LO | Timer 2 Lower-8 Overflow (8b only) | 
| IRQ_TMR1_HI | Timer 1 Upper-8 Overflow | 
| IRQ_TMR1_LO | Timer 1 Lower-8 Overflow (8b only) | 
| IRQ_TMR3_HI | Timer 3 Upper-8 Overflow | 
| IRQ_TMR3_PVT | Timer 3 Pivot | 
| IRQ_32HZ | 32Hz (From 256 Hz Timer) | 
| IRQ_8HZ | 8Hz (From 256 Hz Timer) | 
| IRQ_2HZ | 2Hz (From 256 Hz Timer) | 
| IRQ_1HZ | 1Hz (From 256 Hz Timer) | 
| IRQ_IR_RX | IR Receiver | 
| IRQ_SHOCK | Shock Sensor | 
| IRQ_UNKNOWN | Unknown $1D | 
| IRQ_CARTRIDGE | Cartridge IRQ | 
| IRQ_KEY_POWER | Power Key | 
| IRQ_KEY_RIGHT | Right Key | 
| IRQ_KEY_LEFT | Left Key | 
| IRQ_KEY_DOWN | Down Key | 
| IRQ_KEY_UP | Up Key | 
| IRQ_KEY_C | C Key | 
| IRQ_KEY_B | B Key | 
| IRQ_KEY_A | A Key | 
| Combined | |
| IRQ_PRC | INT_PRC_COPY and INT_PRC_DIV | 
| IRQ_TMR2 | INT_TMR2_HI and INT_TMR2_LO | 
| IRQ_TMR1 | INT_TMR1_HI and INT_TMR1_LO | 
| IRQ_TMR3 | INT_TMR3_HI and INT_TMR3_PVT | 
| IRQ_TMR256 | INT_32HZ, INT_8HZ, INT_2HZ and INT_1HZ | 
| IRQ_IO | IRQ_IR_RX and IRQ_SHOCK | 
| IRQ_KEY | INT_KEY_POWER, INT_KEY_RIGHT, INT_KEY_LEFT, INT_KEY_DOWN, INT_KEY_UP, INT_KEY_C, INT_KEY_B and INT_KEY_A | 
| IRQ_ALL | All INT_* except IRQ_UNKNOWN and IRQ_CARTRIDGE | 
| IRQ_TOTALLYALL | All INT_* including IRQ_UNKNOWN and IRQ_CARTRIDGE | 
Header Extra Flags
This defines are used on macro PM_HEADER in the 4th parameter, they can be combined with logic OR (character | ).
| Definition | Description | 
|---|---|
| IRQF_FAR | Allow interrupt handlers to be over 32KB boundary | 
| IRQF_NORIRQ | Don't generate RIRQ Handling (Not recommended) | 
| IRQF_NOSTARTUP | Don't generate initialization (Not recommended) | 
Example
.include "pm_libs/pm_init.s" .ram variable 1 .ram var16bits 2 ; 1st: Game Title string, must be 12 characters ; 2nd: Interrupts to map, OR flags for multiple interrupts ; 3rd: Extra flags pm_header "HelloWorld ", IRQ_KEY_POWER | IRQ_PRC_COPY, 0 ; Power button, shutdown PM irq_key_power: ; Interrupt function (same name as definition but in lowercase) cint CINT_SHUTDOWN ; Call shutdown in BIOS ; PRC copy (for the example) irq_prc_copy: ; Interrupt function (same name as definition but in lowercase) mov hl, variable inc [hl] rirq IRQ_PRC_COPY ; Code starts here main: ; Enable power key and PRC copy interrupts enable_irqs IRQ_KEY_POWER | IRQ_PRC_COPY ; Enable interrupts mov f, ENABLE_IRQ : halt jmp :b pm_rominfo ; Optional, report ROM and RAM size


