From 23417cb88f61740e0174ff8ece7a491b73ba2c3c Mon Sep 17 00:00:00 2001 From: Adrian Siekierka Date: Sat, 9 May 2026 17:37:22 +0200 Subject: [PATCH] WS: Update default debugger labels. The Wonderful toolchain ships an XML-based hardware MMIO definition format; I have added an output format to it which outputs sequences of addLabel() function calls. Coupled with some manual additions, this creates a set of default labels which is a perfect match for toolchain code; in addition, it benefits from existing comments from said definition set. --- UI/Debugger/Labels/DefaultLabelHelper.cs | 251 ++++++++++++----------- 1 file changed, 131 insertions(+), 120 deletions(-) diff --git a/UI/Debugger/Labels/DefaultLabelHelper.cs b/UI/Debugger/Labels/DefaultLabelHelper.cs index b16ab4434..a917c25ee 100644 --- a/UI/Debugger/Labels/DefaultLabelHelper.cs +++ b/UI/Debugger/Labels/DefaultLabelHelper.cs @@ -521,133 +521,144 @@ private static void SetGbaDefaultLabels() private static void SetWsDefaultLabels() { - Action addLabel = (addr, length, label) => { + Action addLabel = (addr, length, label, desc) => { LabelManager.SetLabel(new CodeLabel() { Address = addr, Length = length, MemoryType = MemoryType.WsPort, - Label = label + Label = label, + Comment = desc }, false); }; - addLabel(0x00, 1, "IO_DISPLAY_CTRL"); - addLabel(0x01, 1, "IO_DISPLAY_BACK"); - addLabel(0x02, 1, "IO_LCD_LINE"); - addLabel(0x03, 1, "IO_LCD_INTERRUPT"); - addLabel(0x04, 1, "IO_SPR_BASE"); - addLabel(0x05, 1, "IO_SPR_FIRST"); - addLabel(0x06, 1, "IO_SPR_COUNT"); - addLabel(0x07, 1, "IO_SCR_BASE"); - addLabel(0x08, 1, "IO_SCR2_WIN_X1"); - addLabel(0x09, 1, "IO_SCR2_WIN_Y1"); - addLabel(0x0A, 1, "IO_SCR2_WIN_X2"); - addLabel(0x0B, 1, "IO_SCR2_WIN_Y2"); - addLabel(0x0C, 1, "IO_SPR_WIN_X1"); - addLabel(0x0D, 1, "IO_SPR_WIN_Y1"); - addLabel(0x0E, 1, "IO_SPR_WIN_X2"); - addLabel(0x0F, 1, "IO_SPR_WIN_Y2"); - addLabel(0x10, 1, "IO_SCR1_SCRL_X"); - addLabel(0x11, 1, "IO_SCR1_SCRL_Y"); - addLabel(0x12, 1, "IO_SCR2_SCRL_X"); - addLabel(0x13, 1, "IO_SCR2_SCRL_Y"); - addLabel(0x14, 1, "IO_LCD_CTRL"); - addLabel(0x15, 1, "IO_LCD_SEG"); - addLabel(0x16, 1, "IO_LCD_VTOTAL"); - addLabel(0x17, 1, "IO_LCD_VSYNC"); - addLabel(0x1A, 1, "IO_LCD_STATUS"); - addLabel(0x1C, 1, "IO_LCD_SHADE_01"); - addLabel(0x1D, 1, "IO_LCD_SHADE_23"); - addLabel(0x1E, 1, "IO_LCD_SHADE_45"); - addLabel(0x1F, 1, "IO_LCD_SHADE_67"); - addLabel(0x20, 2, "IO_PAL_0"); - addLabel(0x22, 2, "IO_PAL_1"); - addLabel(0x24, 2, "IO_PAL_2"); - addLabel(0x26, 2, "IO_PAL_3"); - addLabel(0x28, 2, "IO_PAL_4"); - addLabel(0x2A, 2, "IO_PAL_5"); - addLabel(0x2C, 2, "IO_PAL_6"); - addLabel(0x2E, 2, "IO_PAL_7"); - addLabel(0x30, 2, "IO_PAL_8"); - addLabel(0x32, 2, "IO_PAL_9"); - addLabel(0x34, 2, "IO_PAL_10"); - addLabel(0x36, 2, "IO_PAL_11"); - addLabel(0x38, 2, "IO_PAL_12"); - addLabel(0x3A, 2, "IO_PAL_13"); - addLabel(0x3C, 2, "IO_PAL_14"); - addLabel(0x3E, 2, "IO_PAL_15"); - addLabel(0x40, 2, "IO_DMA_SOURCE_L"); - addLabel(0x42, 1, "IO_DMA_SOURCE_H"); - addLabel(0x44, 2, "IO_DMA_DEST"); - addLabel(0x46, 2, "IO_DMA_LENGTH"); - addLabel(0x48, 1, "IO_DMA_CTRL"); - addLabel(0x4A, 2, "IO_SDMA_SOURCE_L"); - addLabel(0x4C, 1, "IO_SDMA_SOURCE_H"); - addLabel(0x4E, 2, "IO_SDMA_LENGTH_L"); - addLabel(0x50, 1, "IO_SDMA_LENGTH_H"); - addLabel(0x52, 1, "IO_SDMA_CTRL"); - addLabel(0x60, 1, "IO_SYSTEM_CTRL2"); - addLabel(0x62, 1, "IO_SYSTEM_CTRL3"); - addLabel(0x64, 2, "IO_HYPERV_OUT_L"); - addLabel(0x66, 2, "IO_HYPERV_OUT_R"); - addLabel(0x68, 1, "IO_HYPERV_IN_L"); - addLabel(0x69, 1, "IO_HYPERV_IN_R"); - addLabel(0x6A, 2, "IO_HYPERV_CTRL"); - addLabel(0x80, 2, "IO_SND_FREQ_CH1"); - addLabel(0x82, 2, "IO_SND_FREQ_CH2"); - addLabel(0x84, 2, "IO_SND_FREQ_CH3"); - addLabel(0x86, 2, "IO_SND_FREQ_CH4"); - addLabel(0x88, 1, "IO_SND_VOL_CH1"); - addLabel(0x89, 1, "IO_SND_VOL_CH2"); - addLabel(0x8A, 1, "IO_SND_VOL_CH3"); - addLabel(0x8B, 1, "IO_SND_VOL_CH4"); - addLabel(0x8C, 1, "IO_SND_SWEEP"); - addLabel(0x8D, 1, "IO_SND_SWEEP_TIME"); - addLabel(0x8E, 1, "IO_SND_NOISE_CTRL"); - addLabel(0x8F, 1, "IO_SND_WAVE_BASE"); - addLabel(0x90, 1, "IO_SND_CH_CTRL"); - addLabel(0x91, 1, "IO_SND_OUT_CTRL"); - addLabel(0x92, 2, "IO_SND_RANDOM"); - addLabel(0x94, 1, "IO_SND_VOL_CH2_VOICE"); - addLabel(0x95, 1, "IO_SND_TEST"); - addLabel(0x96, 2, "IO_SND_CH_OUT_R"); - addLabel(0x98, 2, "IO_SND_CH_OUT_L"); - addLabel(0x9A, 2, "IO_SND_CH_OUT_LR"); - addLabel(0x9E, 1, "IO_SND_HW_VOL"); - addLabel(0xA0, 1, "IO_SYSTEM_CTRL1"); - addLabel(0xA2, 1, "IO_TIMER_CTRL"); - addLabel(0xA4, 2, "IO_HBLANK_TIMER"); - addLabel(0xA6, 2, "IO_VBLANK_TIMER"); - addLabel(0xA8, 2, "IO_HBLANK_COUNTER"); - addLabel(0xAA, 2, "IO_VBLANK_COUNTER"); - addLabel(0xB0, 1, "IO_HWINT_VECTOR"); - addLabel(0xB2, 1, "IO_HWINT_ENABLE"); - addLabel(0xB4, 1, "IO_HWINT_STATUS"); - addLabel(0xB6, 1, "IO_HWINT_ACK"); - addLabel(0xB1, 1, "IO_SERIAL_DATA"); - addLabel(0xB3, 1, "IO_SERIAL_STATUS"); - addLabel(0xB5, 1, "IO_KEY_SCAN"); - addLabel(0xB7, 1, "IO_INT_NMI_CTRL"); - addLabel(0xBA, 2, "IO_IEEP_DATA"); - addLabel(0xBC, 2, "IO_IEEP_CMD"); - addLabel(0xBE, 1, "IO_IEEP_CTRL"); - addLabel(0xC1, 1, "IO_BANK_RAM"); - addLabel(0xC2, 1, "IO_BANK_ROM0"); - addLabel(0xC3, 1, "IO_BANK_ROM1"); - /*addLabel(0xC0, 1, "IO_BANK_ROM_LINEAR"); - addLabel(0xC4, 1, "IO_CART_EEP_DATA"); - addLabel(0xC6, 1, "IO_CART_EEP_CMD"); - addLabel(0xC8, 1, "IO_CART_EEP_CTRL"); - addLabel(0xCA, 1, "IO_CART_RTC_CTRL"); - addLabel(0xCB, 1, "IO_CART_RTC_DATA"); - addLabel(0xCC, 1, "IO_CART_GPO_CTRL"); - addLabel(0xCD, 1, "IO_CART_GPO_DATA"); - addLabel(0xCE, 1, "IO_CART_FLASH"); - addLabel(0xD0, 1, "IO_BANK_2003_RAM"); - addLabel(0xD2, 1, "IO_BANK_2003_ROM0"); - addLabel(0xD4, 1, "IO_BANK_2003_ROM1"); - addLabel(0xD6, 1, "IO_CART_KARNAK_TIMER"); - addLabel(0xD8, 1, "IO_CART_KARNAK_ADPCM_INPUT"); - addLabel(0xD9, 1, "IO_CART_KARNAK_ADPCM_OUTPUT");*/ + /* Begin auto-generated labels from https://codeberg.org/WonderfulToolchain/hardware-definitions */ + addLabel(0xC0, 1, "WS_CART_BANK_ROML_PORT", "Linear ROM (0x40000 - 0xFFFFF) bank address."); + addLabel(0xC1, 1, "WS_CART_BANK_RAM_PORT", "RAM (0x10000 - 0x1FFFF) bank address (up to 16 MiB)."); + addLabel(0xC2, 1, "WS_CART_BANK_ROM0_PORT", "ROM0 (0x20000 - 0x2FFFF) bank address (up to 16 MiB)."); + addLabel(0xC3, 1, "WS_CART_BANK_ROM1_PORT", "ROM1 (0x30000 - 0x3FFFF) bank address (up to 16 MiB)."); + addLabel(0xCE, 1, "WS_CART_BANK_FLASH_PORT", "Control ROM/Flash access in RAM bank area."); + addLabel(0xCF, 1, "WS_CART_EXTBANK_ROML_PORT", "Linear ROM (0x40000 - 0xFFFFF) bank address."); + addLabel(0xD0, 2, "WS_CART_EXTBANK_RAM_PORT", "RAM (0x10000 - 0x1FFFF) bank address (up to 4 GiB)."); + addLabel(0xD2, 2, "WS_CART_EXTBANK_ROM0_PORT", "ROM0 (0x20000 - 0x2FFFF) bank address (up to 4 GiB)."); + addLabel(0xD4, 2, "WS_CART_EXTBANK_ROM1_PORT", "ROM1 (0x30000 - 0x3FFFF) bank address (up to 4 GiB)."); + addLabel(0xC4, 2, "WS_CART_EEP_DATA_PORT", "Cartridge EEPROM data."); + addLabel(0xC6, 2, "WS_CART_EEP_COMMAND_PORT", "Cartridge EEPROM command."); + addLabel(0xC8, 1, "WS_CART_EEP_CTRL_PORT", ""); + addLabel(0xCC, 1, "WS_CART_GPIO_DIR_PORT", ""); + addLabel(0xCD, 1, "WS_CART_GPIO_DATA_PORT", ""); + addLabel(0xD6, 1, "WS_CART_KARNAK_CTRL_PORT", ""); + addLabel(0xD8, 1, "WS_CART_KARNAK_ADPCM_IN_PORT", ""); + addLabel(0xD9, 1, "WS_CART_KARNAK_ADPCM_OUT_PORT", ""); + addLabel(0xCA, 1, "WS_CART_RTC_CTRL_PORT", ""); + addLabel(0xCB, 1, "WS_CART_RTC_DATA_PORT", ""); + addLabel(0x00, 1, "WS_DISPLAY_CTRL_PORT", ""); + addLabel(0x01, 1, "WS_DISPLAY_BACK_PORT", "The display's background shade/color."); + addLabel(0x02, 1, "WS_DISPLAY_LINE_PORT", "The current line being drawn by the display. Note that final color translation is applied with a one-line delay; for changing LCD shade or color palette values, subtract 1 from this value."); + addLabel(0x03, 1, "WS_DISPLAY_LINE_IRQ_PORT", "The line on the start of which the line interurpt should be requested."); + addLabel(0x04, 1, "WS_SPR_BASE_PORT", "Base address of sprite table data."); + addLabel(0x05, 1, "WS_SPR_FIRST_PORT", "First sprite to draw from the sprite table (0 - 127)."); + addLabel(0x06, 1, "WS_SPR_COUNT_PORT", "Number of consecutive sprites to draw from the sprite table (1 - 128)."); + addLabel(0x07, 1, "WS_SCR_BASE_PORT", "Base address of screen layer data."); + addLabel(0x08, 1, "WS_SCR2_WIN_X1_PORT", "Left-most pixel of the Screen 2 window."); + addLabel(0x09, 1, "WS_SCR2_WIN_Y1_PORT", "Top-most pixel of the Screen 2 window."); + addLabel(0x0A, 1, "WS_SCR2_WIN_X2_PORT", "Right-most pixel of the Screen 2 window."); + addLabel(0x0B, 1, "WS_SCR2_WIN_Y2_PORT", "Bottom-most pixel of the Screen 2 window."); + addLabel(0x0C, 1, "WS_SPR_WIN_X1_PORT", "Left-most pixel of the sprite window."); + addLabel(0x0D, 1, "WS_SPR_WIN_Y1_PORT", "Top-most pixel of the sprite window."); + addLabel(0x0E, 1, "WS_SPR_WIN_X2_PORT", "Right-most pixel of the sprite window."); + addLabel(0x0F, 1, "WS_SPR_WIN_Y2_PORT", "Bottom-most pixel of the sprite window."); + addLabel(0x10, 1, "WS_SCR1_SCRL_X_PORT", "X drawing offset of the Screen 1 layer."); + addLabel(0x11, 1, "WS_SCR1_SCRL_Y_PORT", "Y drawing offset of the Screen 1 layer."); + addLabel(0x12, 1, "WS_SCR2_SCRL_X_PORT", "X drawing offset of the Screen 2 layer."); + addLabel(0x13, 1, "WS_SCR2_SCRL_Y_PORT", "Y drawing offset of the Screen 2 layer."); + addLabel(0x14, 1, "WS_LCD_CTRL_PORT", "Controls LCD driver functionality."); + addLabel(0x15, 1, "WS_LCD_ICON_PORT", "Controls the visibility of LCD sidebar icons."); + addLabel(0x16, 1, "WS_LCD_VTOTAL_PORT", "The final line preceding line counter restart and the beginning of active display. By default, this is set to 158, which equals 159 total lines per frame. For safety reasons, this should only be set to even values."); + addLabel(0x17, 1, "WS_LCD_STN_VSYNC_PORT", "On STN models (WS/WSC), this controls the start of the vertical back porch. For compatibility, this should always be set to 3 less than LCD_VTOTAL."); + addLabel(0x18, 1, "WS_LCD_NEXT_LINE_PORT", "The next line to start drawing on. Write-only. Not recommended for use."); + addLabel(0x1A, 1, "WS_LCD_ICON_LATCH_PORT", "Latched (SoC-controlled) icon status/control."); + addLabel(0x1C, 1, "WS_LCD_SHADE_01_PORT", ""); + addLabel(0x1D, 1, "WS_LCD_SHADE_23_PORT", ""); + addLabel(0x1E, 1, "WS_LCD_SHADE_45_PORT", ""); + addLabel(0x1F, 1, "WS_LCD_SHADE_67_PORT", ""); + + addLabel(0x40, 2, "WS_GDMA_SOURCE_L_PORT", "Low 16 bits of the linear GDMA source address."); + addLabel(0x42, 1, "WS_GDMA_SOURCE_H_PORT", "High 4 bits of the linear GDMA source address."); + addLabel(0x44, 2, "WS_GDMA_DEST_PORT", "Linear GDMA destination address in IRAM."); + addLabel(0x46, 2, "WS_GDMA_LENGTH_PORT", "GDMA length, in bytes; must be a multiple of two."); + addLabel(0x48, 1, "WS_GDMA_CTRL_PORT", "Control GDMA functionality."); + addLabel(0x4A, 2, "WS_SDMA_SOURCE_L_PORT", "Low 16 bits of the linear sound DMA source address."); + addLabel(0x4C, 1, "WS_SDMA_SOURCE_H_PORT", "High 4 bits of the linear sound DMA source address."); + addLabel(0x4E, 2, "WS_SDMA_LENGTH_L_PORT", "Low 16 bits of the sound DMA transfer length."); + addLabel(0x50, 1, "WS_SDMA_LENGTH_H_PORT", "High 4 bits of the sound DMA transfer length."); + addLabel(0x52, 1, "WS_SDMA_CTRL_PORT", ""); + addLabel(0xBA, 2, "WS_IEEP_DATA_PORT", "Internal EEPROM data."); + addLabel(0xBC, 2, "WS_IEEP_COMMAND_PORT", "Internal EEPROM command."); + addLabel(0xBE, 1, "WS_IEEP_CTRL_PORT", ""); + addLabel(0x64, 2, "WS_HYPERV_OUT_L_PORT", ""); + addLabel(0x66, 2, "WS_HYPERV_OUT_R_PORT", ""); + addLabel(0x6A, 2, "WS_HYPERV_CTRL_PORT", ""); + addLabel(0xB0, 1, "WS_INT_VECTOR_PORT", "Currently requested interrupt vector, if any. Bits 3-7 are writable and serve as the vector's offset."); + addLabel(0xB2, 1, "WS_INT_ENABLE_PORT", ""); + addLabel(0xB4, 1, "WS_INT_STATUS_PORT", ""); + addLabel(0xB6, 1, "WS_INT_ACK_PORT", ""); + addLabel(0xB7, 1, "WS_INT_NMI_CTRL_PORT", "Controls NMI (non-maskable interrupt) functionality."); + addLabel(0xB5, 1, "WS_KEY_SCAN_PORT", "Controls keypad scanning."); + addLabel(0x60, 1, "WS_SYSTEM_CTRL_COLOR_PORT", ""); + addLabel(0x62, 1, "WS_SYSTEM_CTRL_COLOR2_PORT", ""); + addLabel(0xA0, 1, "WS_SYSTEM_CTRL_PORT", ""); + addLabel(0xA3, 1, "WS_SYSTEM_TEST_PORT", ""); + addLabel(0x80, 2, "WS_SOUND_FREQ_CH1_PORT", "Sound channel 1 frequency, stored as a divisor. Every `2048 - divisor` cycles, the index of the sample to be fetched from the wavetable is incremented. The resulting frequency is calculated as follows: `sample rate = 3072000 Hz / (2048 - divisor)`. Note that this refers to the sample rate of each sample in the wavetable, and needs to be scaled accordingly for a given waveform. For example, a 50% duty square wave (16 samples of 0 followed by 16 samples of 15) will have an effective sample rate of `(3072000 / 32) Hz / (2048 - divisor)`, or `96000 Hz / (2048 - divisor)`."); + addLabel(0x82, 2, "WS_SOUND_FREQ_CH2_PORT", "Sound channel 2 frequency, stored as a divisor. Ignored in voice mode."); + addLabel(0x84, 2, "WS_SOUND_FREQ_CH3_PORT", "Sound channel 3 frequency, stored as a divisor."); + addLabel(0x86, 2, "WS_SOUND_FREQ_CH4_PORT", "Sound channel 4 frequency, stored as a divisor."); + addLabel(0x88, 1, "WS_SOUND_VOL_CH1_PORT", "Sound channel 1 volume."); + // addLabel(0x89, 1, "WS_SOUND_VOL_CH2_PORT", "Sound channel 2 volume."); + // addLabel(0x89, 1, "WS_SOUND_VOICE_SAMPLE_PORT", "Sound channel 2 unsigned PCM sample; used in voice mode."); + addLabel(0x8A, 1, "WS_SOUND_VOL_CH3_PORT", "Sound channel 3 volume."); + addLabel(0x8B, 1, "WS_SOUND_VOL_CH4_PORT", "Sound channel 4 volume."); + addLabel(0x8C, 1, "WS_SOUND_SWEEP_PORT", "Signed 8-bit value to be added to or subtracted from the channel 3 frequency port every sweep tick."); + addLabel(0x8D, 1, "WS_SOUND_SWEEP_TIME_PORT", "Number of 375 Hz ticks between frequency sweep changes, minus one."); + addLabel(0x8E, 1, "WS_SOUND_NOISE_CTRL_PORT", ""); + addLabel(0x8F, 1, "WS_SOUND_WAVE_BASE_PORT", "Sound wavetable base address."); + addLabel(0x90, 1, "WS_SOUND_CH_CTRL_PORT", "Controls sound channels."); + addLabel(0x91, 1, "WS_SOUND_OUT_CTRL_PORT", "Controls sound output circuitry."); + addLabel(0x92, 2, "WS_SOUND_NOISE_LFSR_PORT", "Current state of the noise channel LFSR."); + addLabel(0x94, 1, "WS_SOUND_VOICE_VOL_PORT", ""); + addLabel(0x95, 1, "WS_SOUND_TEST_PORT", "Sound test port."); + addLabel(0x96, 2, "WS_SOUND_TEST_CHOUT_R_PORT", "Sound test port: synthesizer (channel 1-4) right channel output sample in bits 0-9."); + addLabel(0x98, 2, "WS_SOUND_TEST_CHOUT_L_PORT", "Sound test port: synthesizer (channel 1-4) left channel output sample in bits 0-9."); + addLabel(0x9A, 2, "WS_SOUND_TEST_CHOUT_M_PORT", "Sound test port: synthesizer (channel 1-4) sum of output samples in bits 0-10."); + addLabel(0x9E, 1, "WS_SOUND_SPEAKER_VOL_PORT", "Controls the internal speaker volume."); + addLabel(0xA2, 1, "WS_TIMER_CTRL_PORT", ""); + addLabel(0xA4, 2, "WS_TIMER_HBL_RELOAD_PORT", "Reload value for horizontal blank timer."); + addLabel(0xA6, 2, "WS_TIMER_VBL_RELOAD_PORT", "Reload value for vertical blank timer."); + addLabel(0xA8, 2, "WS_TIMER_HBL_COUNTER_PORT", "Current counter value for horizontal blank timer."); + addLabel(0xAA, 2, "WS_TIMER_VBL_COUNTER_PORT", "Current counter value for vertical blank timer."); + addLabel(0xB1, 1, "WS_UART_DATA_PORT", ""); + addLabel(0xB3, 1, "WS_UART_CTRL_PORT", ""); + /* End auto-generated labels */ + + addLabel(0x68, 1, "WS_HYPERV_IN_L_PORT", ""); + addLabel(0x69, 1, "WS_HYPERV_IN_R_PORT", ""); + addLabel(0x89, 1, "WS_SOUND_VOL_CH2_PORT", "Sound channel 2 volume, or unsigned PCM sample in voice mode."); + + addLabel(0x20, 2, "WS_SCR_PAL_0_PORT", "Palette 0."); + addLabel(0x22, 2, "WS_SCR_PAL_1_PORT", "Palette 1."); + addLabel(0x24, 2, "WS_SCR_PAL_2_PORT", "Palette 2."); + addLabel(0x26, 2, "WS_SCR_PAL_3_PORT", "Palette 3."); + addLabel(0x28, 2, "WS_SCR_PAL_4_PORT", "Palette 4."); + addLabel(0x2A, 2, "WS_SCR_PAL_5_PORT", "Palette 5."); + addLabel(0x2C, 2, "WS_SCR_PAL_6_PORT", "Palette 6."); + addLabel(0x2E, 2, "WS_SCR_PAL_7_PORT", "Palette 7."); + addLabel(0x30, 2, "WS_SCR_PAL_8_PORT", "Palette 8 (sprite palette 0)."); + addLabel(0x32, 2, "WS_SCR_PAL_9_PORT", "Palette 9 (sprite palette 1)."); + addLabel(0x34, 2, "WS_SCR_PAL_10_PORT", "Palette 10 (sprite palette 2)."); + addLabel(0x36, 2, "WS_SCR_PAL_11_PORT", "Palette 11 (sprite palette 3)."); + addLabel(0x38, 2, "WS_SCR_PAL_12_PORT", "Palette 12 (sprite palette 4)."); + addLabel(0x3A, 2, "WS_SCR_PAL_13_PORT", "Palette 13 (sprite palette 5)."); + addLabel(0x3C, 2, "WS_SCR_PAL_14_PORT", "Palette 14 (sprite palette 6)."); + addLabel(0x3E, 2, "WS_SCR_PAL_15_PORT", "Palette 15 (sprite palette 7)."); } } }