732 lines
20 KiB
NASM
732 lines
20 KiB
NASM
include "hardware.inc"
|
|
include "constants.inc"
|
|
include "signals.asm"
|
|
include "ops.asm"
|
|
include "tick.asm"
|
|
|
|
; --------------------------------------------------------------------------------------------------------------------
|
|
; Interrupt Vectors
|
|
; --------------------------------------------------------------------------------------------------------------------
|
|
SECTION "Vblank", ROM0[$0040]
|
|
jp UpdateTiles
|
|
|
|
SECTION "LCDC", ROM0[$0048]
|
|
reti
|
|
|
|
SECTION "Timer", ROM0[$0050]
|
|
jp Timer
|
|
|
|
SECTION "Serial", ROM0[$0058]
|
|
reti
|
|
|
|
SECTION "Joypad", ROM0[$0060]
|
|
reti
|
|
|
|
; Entry point
|
|
SECTION "Entry", ROM0[$100]
|
|
nop
|
|
jp start
|
|
|
|
; --------------------------------------------------------------------------------------------------------------------
|
|
; Header
|
|
; --------------------------------------------------------------------------------------------------------------------
|
|
SECTION "Header",ROM0[$0104]
|
|
|
|
; Logo
|
|
DB $CE,$ED,$66,$66,$CC,$0D,$00,$0B,$03,$73,$00,$83,$00,$0C,$00,$0D
|
|
DB $00,$08,$11,$1F,$88,$89,$00,$0E,$DC,$CC,$6E,$E6,$DD,$DD,$D9,$99
|
|
DB $BB,$BB,$67,$63,$6E,$0E,$EC,$CC,$DD,$DC,$99,$9F,$BB,$B9,$33,$3E
|
|
|
|
; ROM Details
|
|
DB "8BIT00000000000" ; $134 - Title (exactly 15 characters)
|
|
DB 0 ; $143 - GBC Functionality: No
|
|
DB 0,0 ; $144 - Licensee code
|
|
DB 0 ; $146 - SGB Support: No
|
|
DB 0 ; $147 - Cart type: No MBC (32K ROM only)
|
|
DB 0 ; $148 - ROM Size: 32K (No Banking)
|
|
DB 0 ; $149 - External ram Size: None
|
|
DB 1 ; $14a - Destination: Non-Japan
|
|
DB $33 ; $14b - Old Licensee code: must be $33
|
|
DB 0 ; $14c - Mask ROM version
|
|
DB 0 ; $14d - Complement check (RGBDS will fill)
|
|
DW 0 ; $14e - Checksum (RGBDS will fill)
|
|
|
|
; --------------------------------------------------------------------------------------------------------------------
|
|
; Entry Point
|
|
; --------------------------------------------------------------------------------------------------------------------
|
|
SECTION "Main", ROM0[$150]
|
|
start:
|
|
di
|
|
ld SP, $FFFF
|
|
|
|
; Turn LCD off
|
|
.wait_for_vblank
|
|
ldh a, [rLY]
|
|
cp 145
|
|
jr nz, .wait_for_vblank
|
|
ld a, [rLCDC]
|
|
xor LCDCF_ON
|
|
ld [rLCDC], a
|
|
|
|
; Load tiles into VRAM
|
|
ld hl, _VRAM
|
|
ld de, Tiles_Begin
|
|
ld bc, Tiles_End-Tiles_Begin
|
|
call CopyBytes
|
|
|
|
; Fill the map
|
|
ld hl, _SCRN0
|
|
ld de, TileMap_Begin
|
|
ld bc, TileMap_End-TileMap_Begin
|
|
call CopyBytes
|
|
|
|
; Set background palette
|
|
ld a, %11100100
|
|
ld [rBGP], a
|
|
|
|
; Turn LCD back on
|
|
ld a, [rLCDC]
|
|
or LCDCF_ON
|
|
ld [rLCDC], a
|
|
|
|
; Set up timer and vblank interrupts
|
|
ld a, IEF_TIMER | IEF_VBLANK
|
|
ld [rIE], a
|
|
|
|
; Configure timer
|
|
; TODO: Make this adjustable at runtime (clock speed adjust)
|
|
ld a, TACF_4KHZ | TACF_START
|
|
ld [rTAC], a
|
|
xor a
|
|
ld [rTMA], a
|
|
|
|
; Zero all state
|
|
ld hl, StateBegin
|
|
ld bc, StateEnd-StateBegin
|
|
call SetByte
|
|
|
|
; Zero all values
|
|
ld hl, DataBegin
|
|
ld bc, DataEnd-DataBegin
|
|
call SetByte
|
|
|
|
; Turn off all LEDs
|
|
ld a, LED_OFF
|
|
ld hl, LedBegin
|
|
ld bc, LedEnd-LedBegin
|
|
call SetByte
|
|
|
|
; Load the program
|
|
; TODO: Make this programmable at runtime
|
|
ld a, $e0
|
|
ld [ram], a ; OUT
|
|
ld a, $2f
|
|
ld [ram+1], a ; ADD 15
|
|
ld a, $74
|
|
ld [ram+2], a ; JC 4
|
|
ld a, $60
|
|
ld [ram+3], a ; JMP 0
|
|
ld a, $3f
|
|
ld [ram+4], a ; SUB 15
|
|
ld a, $e0
|
|
ld [ram+5], a ; OUT
|
|
ld a, $80
|
|
ld [ram+6], a ; JZ 0
|
|
ld a, $64
|
|
ld [ram+7], a ; JMP 4
|
|
xor a
|
|
ld [ram+8], a ; NOP
|
|
ld [ram+9], a ; NOP
|
|
ld [ram+10], a ; NOP
|
|
ld [ram+11], a ; NOP
|
|
ld [ram+12], a ; NOP
|
|
ld [ram+13], a ; NOP
|
|
ld [ram+14], a ; NOP
|
|
ld a, 15
|
|
ld [ram+15], a ; Data
|
|
|
|
; Load default clock of 1Hz (16 timer interrupts)
|
|
ld a, 2
|
|
ld [clk], a
|
|
ld a, 1
|
|
ld [clk_div2], a
|
|
|
|
; Initialize as running
|
|
ld a, 1
|
|
ld [running], a
|
|
|
|
; Tick once before we begin to set the stage
|
|
call Tick
|
|
|
|
ei
|
|
|
|
.loop
|
|
halt
|
|
nop
|
|
|
|
; If we aren't running, loop
|
|
ld a, [running]
|
|
cp 1
|
|
jr nz, .loop
|
|
|
|
; Check for Button A state
|
|
; State is only set once per press; no repeats
|
|
call ReadKeys
|
|
bit 0, a
|
|
jr z, .key_released
|
|
|
|
.key_pressed:
|
|
ld a, LED_ON
|
|
ld [clk_led], a
|
|
ld a, [button_state]
|
|
cp 0
|
|
jr z, .tick
|
|
jr .loop
|
|
|
|
.key_released:
|
|
xor a
|
|
ld [button_state], a
|
|
ld a, LED_OFF
|
|
ld [clk_led], a
|
|
jr .loop
|
|
|
|
.tick:
|
|
; Key press = rising edge
|
|
; Key release = falling edge
|
|
ld a, 1
|
|
ld [button_state], a
|
|
call Tick
|
|
jr .loop
|
|
|
|
|
|
; [in] de: Source address
|
|
; [in] hl: Destination address
|
|
; [in] bc: Count
|
|
CopyBytes:
|
|
; Increment each by one to prevent rolling over when decrementing
|
|
inc b
|
|
inc c
|
|
jr .skip
|
|
|
|
.loop:
|
|
ld a, [de]
|
|
ld [hl+], a
|
|
inc de
|
|
|
|
.skip:
|
|
dec c
|
|
jr nz, .loop
|
|
dec b
|
|
jr nz, .loop
|
|
|
|
ret
|
|
|
|
|
|
; [in] a: Byte to set
|
|
; [in] hl: Destination address
|
|
; [in] bc: Count
|
|
SetByte:
|
|
; Increment each by one to prevent rolling over when decrementing
|
|
inc b
|
|
inc c
|
|
jr .skip
|
|
|
|
.loop
|
|
ld [hl+], a
|
|
|
|
.skip:
|
|
dec c
|
|
jr nz, .loop
|
|
dec b
|
|
jr nz, .loop
|
|
ret
|
|
|
|
; [out] a: x x x x start select b a
|
|
ReadKeys:
|
|
ld a, P1F_GET_BTN ;
|
|
ld [rP1], a ; joypad info
|
|
ld a, [rP1] ;
|
|
ld a, [rP1] ; read twice to make sure
|
|
and $0f ; low nibble contains buttons
|
|
cpl ; low means pressed so we complement for logic purposes
|
|
ret
|
|
|
|
|
|
SECTION "Handlers", ROM0
|
|
Timer:
|
|
push af
|
|
|
|
ld a, [w_counter]
|
|
add a, 1
|
|
ld [w_counter], a
|
|
ld hl, clk_div2
|
|
cp [hl]
|
|
jr z, .rising_edge
|
|
ld hl, clk
|
|
cp [hl]
|
|
jr z, .falling_edge
|
|
jr .exit
|
|
|
|
.rising_edge:
|
|
ld a, LED_ON
|
|
ld [clk_led], a
|
|
call Tick
|
|
jr .exit
|
|
|
|
.falling_edge:
|
|
ld a, LED_OFF
|
|
ld [clk_led], a
|
|
xor a
|
|
ld [w_counter], a
|
|
|
|
.exit:
|
|
pop af
|
|
reti
|
|
|
|
UpdateTiles:
|
|
push af
|
|
|
|
; CLK
|
|
ld hl, _SCRN0 + 4
|
|
ld a, [clk_led]
|
|
ld [hl], a
|
|
|
|
; PC
|
|
ld hl, _SCRN0 + 13
|
|
ld a, [pc_led_3]
|
|
ld [hl+], a
|
|
ld a, [pc_led_2]
|
|
ld [hl+], a
|
|
ld a, [pc_led_1]
|
|
ld [hl+], a
|
|
ld a, [pc_led_0]
|
|
ld [hl], a
|
|
|
|
; OP
|
|
ld hl, _SCRN0 + $040 + 14
|
|
ld a, [opc_led_2]
|
|
ld [hl+], a
|
|
ld a, [opc_led_1]
|
|
ld [hl+], a
|
|
ld a, [opc_led_0]
|
|
ld [hl], a
|
|
|
|
; IR
|
|
ld hl, _SCRN0 + $040 + 4
|
|
ld a, [ir_led_7]
|
|
ld [hl+], a
|
|
ld a, [ir_led_6]
|
|
ld [hl+], a
|
|
ld a, [ir_led_5]
|
|
ld [hl+], a
|
|
ld a, [ir_led_4]
|
|
ld [hl+], a
|
|
ld a, [ir_led_3]
|
|
ld [hl+], a
|
|
ld a, [ir_led_2]
|
|
ld [hl+], a
|
|
ld a, [ir_led_1]
|
|
ld [hl+], a
|
|
ld a, [ir_led_0]
|
|
ld [hl], a
|
|
|
|
; MAR
|
|
ld hl, _SCRN0 + $080 + 4
|
|
ld a, [mar_led_3]
|
|
ld [hl+], a
|
|
ld a, [mar_led_2]
|
|
ld [hl+], a
|
|
ld a, [mar_led_1]
|
|
ld [hl+], a
|
|
ld a, [mar_led_0]
|
|
ld [hl], a
|
|
|
|
; BUS
|
|
ld hl, _SCRN0 + $0A0 + 4
|
|
ld a, [mem_led_7]
|
|
ld [hl+], a
|
|
ld a, [mem_led_6]
|
|
ld [hl+], a
|
|
ld a, [mem_led_5]
|
|
ld [hl+], a
|
|
ld a, [mem_led_4]
|
|
ld [hl+], a
|
|
ld a, [mem_led_3]
|
|
ld [hl+], a
|
|
ld a, [mem_led_2]
|
|
ld [hl+], a
|
|
ld a, [mem_led_1]
|
|
ld [hl+], a
|
|
ld a, [mem_led_0]
|
|
ld [hl], a
|
|
|
|
; BUS
|
|
ld hl, _SCRN0 + $0E0 + 4
|
|
ld a, [bus_led_7]
|
|
ld [hl+], a
|
|
ld a, [bus_led_6]
|
|
ld [hl+], a
|
|
ld a, [bus_led_5]
|
|
ld [hl+], a
|
|
ld a, [bus_led_4]
|
|
ld [hl+], a
|
|
ld a, [bus_led_3]
|
|
ld [hl+], a
|
|
ld a, [bus_led_2]
|
|
ld [hl+], a
|
|
ld a, [bus_led_1]
|
|
ld [hl+], a
|
|
ld a, [bus_led_0]
|
|
ld [hl], a
|
|
|
|
; A
|
|
ld hl, _SCRN0 + $120 + 4
|
|
ld a, [a_led_7]
|
|
ld [hl+], a
|
|
ld a, [a_led_6]
|
|
ld [hl+], a
|
|
ld a, [a_led_5]
|
|
ld [hl+], a
|
|
ld a, [a_led_4]
|
|
ld [hl+], a
|
|
ld a, [a_led_3]
|
|
ld [hl+], a
|
|
ld a, [a_led_2]
|
|
ld [hl+], a
|
|
ld a, [a_led_1]
|
|
ld [hl+], a
|
|
ld a, [a_led_0]
|
|
ld [hl], a
|
|
|
|
; B
|
|
ld hl, _SCRN0 + $140 + 4
|
|
ld a, [b_led_7]
|
|
ld [hl+], a
|
|
ld a, [b_led_6]
|
|
ld [hl+], a
|
|
ld a, [b_led_5]
|
|
ld [hl+], a
|
|
ld a, [b_led_4]
|
|
ld [hl+], a
|
|
ld a, [b_led_3]
|
|
ld [hl+], a
|
|
ld a, [b_led_2]
|
|
ld [hl+], a
|
|
ld a, [b_led_1]
|
|
ld [hl+], a
|
|
ld a, [b_led_0]
|
|
ld [hl], a
|
|
|
|
; ALU
|
|
ld hl, _SCRN0 + $160 + 4
|
|
ld a, [alu_led_7]
|
|
ld [hl+], a
|
|
ld a, [alu_led_6]
|
|
ld [hl+], a
|
|
ld a, [alu_led_5]
|
|
ld [hl+], a
|
|
ld a, [alu_led_4]
|
|
ld [hl+], a
|
|
ld a, [alu_led_3]
|
|
ld [hl+], a
|
|
ld a, [alu_led_2]
|
|
ld [hl+], a
|
|
ld a, [alu_led_1]
|
|
ld [hl+], a
|
|
ld a, [alu_led_0]
|
|
ld [hl], a
|
|
|
|
; CTRL
|
|
ld hl, _SCRN0 + $1A0 + 4
|
|
ld a, [ctrl_led_ht]
|
|
ld [hl+], a
|
|
ld a, [ctrl_led_mi]
|
|
ld [hl+], a
|
|
ld a, [ctrl_led_ri]
|
|
ld [hl+], a
|
|
ld a, [ctrl_led_ro]
|
|
ld [hl+], a
|
|
ld a, [ctrl_led_io]
|
|
ld [hl+], a
|
|
ld a, [ctrl_led_ii]
|
|
ld [hl+], a
|
|
ld a, [ctrl_led_ai]
|
|
ld [hl+], a
|
|
ld a, [ctrl_led_ao]
|
|
ld [hl+], a
|
|
ld a, [ctrl_led_eo]
|
|
ld [hl+], a
|
|
ld a, [ctrl_led_su]
|
|
ld [hl+], a
|
|
ld a, [ctrl_led_bi]
|
|
ld [hl+], a
|
|
ld a, [ctrl_led_oi]
|
|
ld [hl+], a
|
|
ld a, [ctrl_led_ce]
|
|
ld [hl+], a
|
|
ld a, [ctrl_led_co]
|
|
ld [hl+], a
|
|
ld a, [ctrl_led_jp]
|
|
ld [hl+], a
|
|
ld a, [ctrl_led_fi]
|
|
ld [hl], a
|
|
|
|
; Flags
|
|
ld hl, _SCRN0 + $160 + 13
|
|
ld a, [flag_led_c]
|
|
ld [hl+], a
|
|
ld a, [flag_led_z]
|
|
ld [hl], a
|
|
|
|
; OUT
|
|
ld hl, _SCRN0 + $220 + 4
|
|
; 100s
|
|
ld a, [display]
|
|
add a, $1 ; $1 = tile id of 0
|
|
ld [hl+], a
|
|
; 10s
|
|
ld a, [display+1]
|
|
add a, $1
|
|
ld [hl+], a
|
|
; 1s
|
|
ld a, [display+2]
|
|
add a, $1
|
|
ld [hl], a
|
|
|
|
.exit
|
|
pop af
|
|
reti
|
|
|
|
|
|
; --------------------------------------------------------------------------------------------------------------------
|
|
; Tile Data
|
|
; --------------------------------------------------------------------------------------------------------------------
|
|
SECTION "Tile Data", ROM0
|
|
|
|
Tiles_Begin:
|
|
DB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF ; Blank ($00)
|
|
DB $83,$83,$7D,$7D,$6D,$6D,$6D,$6D,$6D,$6D,$7D,$7D,$83,$83,$FF,$FF ; 0 ($01)
|
|
DB $EF,$EF,$EF,$EF,$EF,$EF,$EF,$EF,$EF,$EF,$EF,$EF,$EF,$EF,$FF,$FF ; 1 ($02)
|
|
DB $07,$07,$FB,$FB,$FB,$FB,$87,$87,$7F,$7F,$7F,$7F,$03,$03,$FF,$FF ; 2 ($03)
|
|
DB $03,$03,$FD,$FD,$FD,$FD,$83,$83,$FD,$FD,$FD,$FD,$03,$03,$FF,$FF ; 3 ($04)
|
|
DB $7D,$7D,$7D,$7D,$7D,$7D,$81,$81,$FD,$FD,$FD,$FD,$FD,$FD,$FF,$FF ; 4 ($05)
|
|
DB $03,$03,$7F,$7F,$7F,$7F,$07,$07,$FB,$FB,$FB,$FB,$07,$07,$FF,$FF ; 5 ($06)
|
|
DB $83,$83,$7F,$7F,$7F,$7F,$03,$03,$7D,$7D,$7D,$7D,$83,$83,$FF,$FF ; 6 ($07)
|
|
DB $01,$01,$FD,$FD,$FD,$FD,$FD,$FD,$FD,$FD,$FD,$FD,$FD,$FD,$FF,$FF ; 7 ($08)
|
|
DB $83,$83,$7D,$7D,$7D,$7D,$83,$83,$7D,$7D,$7D,$7D,$83,$83,$FF,$FF ; 8 ($09)
|
|
DB $83,$83,$7D,$7D,$7D,$7D,$81,$81,$FD,$FD,$FD,$FD,$FD,$FD,$FF,$FF ; 9 ($0A)
|
|
DB $C7,$C7,$BB,$BB,$7D,$7D,$7D,$7D,$01,$01,$7D,$7D,$7D,$7D,$FF,$FF ; A ($0B)
|
|
DB $03,$03,$7D,$7D,$7D,$7D,$03,$03,$7D,$7D,$7D,$7D,$03,$03,$FF,$FF ; B ($0C)
|
|
DB $83,$83,$7D,$7D,$7F,$7F,$7F,$7F,$7F,$7F,$7D,$7D,$83,$83,$FF,$FF ; C ($0D)
|
|
DB $03,$03,$7D,$7D,$7D,$7D,$7D,$7D,$7D,$7D,$7D,$7D,$03,$03,$FF,$FF ; D ($0E)
|
|
DB $83,$83,$7F,$7F,$7F,$7F,$07,$07,$7F,$7F,$7F,$7F,$83,$83,$FF,$FF ; E ($0F)
|
|
DB $01,$01,$7F,$7F,$7F,$7F,$03,$03,$7F,$7F,$7F,$7F,$7F,$7F,$FF,$FF ; F ($10)
|
|
DB $83,$83,$7D,$7D,$7F,$7F,$61,$61,$7D,$7D,$7D,$7D,$83,$83,$FF,$FF ; G ($11)
|
|
DB $7D,$7D,$7D,$7D,$7D,$7D,$01,$01,$7D,$7D,$7D,$7D,$7D,$7D,$FF,$FF ; H ($12)
|
|
DB $01,$01,$EF,$EF,$EF,$EF,$EF,$EF,$EF,$EF,$EF,$EF,$01,$01,$FF,$FF ; I ($13)
|
|
DB $01,$01,$F7,$F7,$F7,$F7,$F7,$F7,$77,$77,$77,$77,$8F,$8F,$FF,$FF ; J ($14)
|
|
DB $7B,$7B,$7B,$7B,$7B,$7B,$07,$07,$7B,$7B,$7B,$7B,$7B,$7B,$FF,$FF ; K ($15)
|
|
DB $7F,$7F,$7F,$7F,$7F,$7F,$7F,$7F,$7F,$7F,$7F,$7F,$03,$03,$FF,$FF ; L ($16)
|
|
DB $BB,$BB,$55,$55,$6D,$6D,$7D,$7D,$7D,$7D,$7D,$7D,$7D,$7D,$FF,$FF ; M ($17)
|
|
DB $03,$03,$7D,$7D,$7D,$7D,$7D,$7D,$7D,$7D,$7D,$7D,$7D,$7D,$FF,$FF ; N ($18)
|
|
DB $83,$83,$7D,$7D,$7D,$7D,$7D,$7D,$7D,$7D,$7D,$7D,$83,$83,$FF,$FF ; O ($19)
|
|
DB $03,$03,$7D,$7D,$7D,$7D,$03,$03,$7F,$7F,$7F,$7F,$7F,$7F,$FF,$FF ; P ($1A)
|
|
DB $83,$83,$7D,$7D,$7D,$7D,$7D,$7D,$75,$75,$7B,$7B,$85,$85,$FF,$FF ; Q ($1B)
|
|
DB $83,$83,$7D,$7D,$7D,$7D,$03,$03,$7D,$7D,$7D,$7D,$7D,$7D,$FF,$FF ; R ($1C)
|
|
DB $81,$81,$7F,$7F,$7F,$7F,$83,$83,$FD,$FD,$FD,$FD,$03,$03,$FF,$FF ; S ($1D)
|
|
DB $01,$01,$EF,$EF,$EF,$EF,$EF,$EF,$EF,$EF,$EF,$EF,$EF,$EF,$FF,$FF ; T ($1E)
|
|
DB $7D,$7D,$7D,$7D,$7D,$7D,$7D,$7D,$7D,$7D,$7D,$7D,$83,$83,$FF,$FF ; U ($1F)
|
|
DB $7D,$7D,$7D,$7D,$BB,$BB,$BB,$BB,$D7,$D7,$D7,$D7,$EF,$EF,$FF,$FF ; V ($20)
|
|
DB $7D,$7D,$7D,$7D,$7D,$7D,$7D,$7D,$6D,$6D,$55,$55,$BB,$BB,$FF,$FF ; W ($21)
|
|
DB $7D,$7D,$BB,$BB,$D7,$D7,$EF,$EF,$D7,$D7,$BB,$BB,$7D,$7D,$FF,$FF ; X ($22)
|
|
DB $7D,$7D,$7D,$7D,$BB,$BB,$D7,$D7,$EF,$EF,$EF,$EF,$EF,$EF,$FF,$FF ; Y ($23)
|
|
DB $01,$01,$FD,$FD,$FB,$FB,$C7,$C7,$BF,$BF,$7F,$7F,$01,$01,$FF,$FF ; Z ($24)
|
|
DB $FF,$83,$83,$7D,$83,$7D,$83,$7D,$83,$7D,$83,$7D,$FF,$83,$FF,$FF ; LED Off ($25)
|
|
DB $FF,$83,$83,$01,$83,$01,$83,$01,$83,$01,$83,$01,$FF,$83,$FF,$FF ; LED On ($26)
|
|
Tiles_End:
|
|
|
|
; --------------------------------------------------------------------------------------------------------------------
|
|
; Tile Map
|
|
; --------------------------------------------------------------------------------------------------------------------
|
|
SECTION "Tile Map", ROM0
|
|
|
|
TileMap_Begin:
|
|
DB $0D,$16,$15,$00,$25,$00,$00,$00,$00,$00,$00,$00,$00,$25,$25,$25,$25,$00,$1A,$0D, $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ; [$000] CLK PC
|
|
DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00, $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ; [$020]
|
|
DB $00,$13,$1C,$00,$25,$25,$25,$25,$25,$25,$25,$25,$00,$00,$25,$25,$25,$00,$19,$1A, $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ; [$040] IR OP
|
|
DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00, $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ; [$060]
|
|
DB $17,$0B,$1C,$00,$25,$25,$25,$25,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00, $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ; [$080] MAR
|
|
DB $17,$0F,$17,$00,$25,$25,$25,$25,$25,$25,$25,$25,$00,$00,$00,$00,$00,$00,$00,$00, $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ; [$0A0] MEM
|
|
DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00, $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ; [$0C0]
|
|
DB $0C,$1F,$1D,$00,$25,$25,$25,$25,$25,$25,$25,$25,$00,$00,$00,$00,$00,$00,$00,$00, $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ; [$0E0] BUS
|
|
DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00, $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ; [$100]
|
|
DB $00,$00,$0B,$00,$25,$25,$25,$25,$25,$25,$25,$25,$00,$00,$00,$00,$00,$00,$00,$00, $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ; [$120] A
|
|
DB $00,$00,$0C,$00,$25,$25,$25,$25,$25,$25,$25,$25,$00,$0D,$24,$00,$00,$00,$00,$00, $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ; [$140] B C Z
|
|
DB $0B,$16,$1F,$00,$25,$25,$25,$25,$25,$25,$25,$25,$00,$25,$25,$00,$00,$00,$00,$00, $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ; [$160] ALU x x
|
|
DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00, $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ; [$080]
|
|
DB $0D,$1E,$16,$00,$25,$25,$25,$25,$25,$25,$25,$25,$25,$25,$25,$25,$25,$25,$25,$25, $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ; [$1A0] CTL
|
|
DB $00,$00,$00,$00,$12,$17,$1C,$1C,$13,$13,$0B,$0B,$0F,$1D,$0C,$19,$0D,$0D,$14,$10, $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ; [$1C0] H M R R I I A A E S B O C C J F
|
|
DB $00,$00,$00,$00,$1E,$13,$13,$19,$19,$13,$13,$19,$19,$1F,$13,$13,$0F,$19,$1A,$13, $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ; [$1E0] T I I O O I I O O U I I E O P I
|
|
DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00, $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ; [$200]
|
|
DB $19,$1F,$1E,$00,$01,$01,$01,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00, $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ; [$220] OUT
|
|
|
|
DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00, $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
|
DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00, $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
|
DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00, $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
|
DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00, $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
|
DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00, $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
|
DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00, $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
|
DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00, $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
|
DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00, $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
|
DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00, $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
|
DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00, $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
|
DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00, $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
|
DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00, $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
|
DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00, $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
|
DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00, $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
|
DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00, $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
|
TileMap_End:
|
|
|
|
|
|
; --------------------------------------------------------------------------------------------------------------------
|
|
; State
|
|
; --------------------------------------------------------------------------------------------------------------------
|
|
SECTION "State", WRAM0
|
|
|
|
StateBegin:
|
|
|
|
w_counter: DS 1
|
|
clk: DS 1
|
|
clk_div2: DS 1
|
|
button_state: DS 1
|
|
running: DS 1
|
|
flags_temp: DS 1
|
|
|
|
StateEnd:
|
|
|
|
; --------------------------------------------------------------------------------------------------------------------
|
|
; Data
|
|
; --------------------------------------------------------------------------------------------------------------------
|
|
SECTION "Data", WRAM0
|
|
|
|
DataBegin:
|
|
|
|
bus: DS 1 ; 8 bit
|
|
mar: DS 1 ; 4 bit
|
|
mem: DS 1 ; 8 bit
|
|
ir: DS 1 ; 8 bit
|
|
pc: DS 1 ; 4 bit
|
|
opc: DS 1 ; 3 bit
|
|
a_reg: DS 1 ; 8 bit
|
|
b_reg: DS 1 ; 8 bit
|
|
alu: DS 1 ; 8 bit
|
|
out_reg: DS 1 ; 8 bit
|
|
ctrl: DS 2 ; ht | mi | ri | ro | io | ii | ai | ao || eo | su | bi | oi | ce | co | jp | fi
|
|
flags: DS 1 ; c | z
|
|
ram: DS 16
|
|
|
|
DataEnd:
|
|
|
|
; --------------------------------------------------------------------------------------------------------------------
|
|
; LEDs
|
|
; --------------------------------------------------------------------------------------------------------------------
|
|
SECTION "LEDs", WRAM0
|
|
|
|
LedBegin:
|
|
|
|
clk_led: DS 1
|
|
|
|
bus_led_7: DS 1
|
|
bus_led_6: DS 1
|
|
bus_led_5: DS 1
|
|
bus_led_4: DS 1
|
|
bus_led_3: DS 1
|
|
bus_led_2: DS 1
|
|
bus_led_1: DS 1
|
|
bus_led_0: DS 1
|
|
|
|
mar_led_3: DS 1
|
|
mar_led_2: DS 1
|
|
mar_led_1: DS 1
|
|
mar_led_0: DS 1
|
|
|
|
mem_led_7: DS 1
|
|
mem_led_6: DS 1
|
|
mem_led_5: DS 1
|
|
mem_led_4: DS 1
|
|
mem_led_3: DS 1
|
|
mem_led_2: DS 1
|
|
mem_led_1: DS 1
|
|
mem_led_0: DS 1
|
|
|
|
opc_led_2: DS 1
|
|
opc_led_1: DS 1
|
|
opc_led_0: DS 1
|
|
|
|
pc_led_3: DS 1
|
|
pc_led_2: DS 1
|
|
pc_led_1: DS 1
|
|
pc_led_0: DS 1
|
|
|
|
ir_led_7: DS 1
|
|
ir_led_6: DS 1
|
|
ir_led_5: DS 1
|
|
ir_led_4: DS 1
|
|
ir_led_3: DS 1
|
|
ir_led_2: DS 1
|
|
ir_led_1: DS 1
|
|
ir_led_0: DS 1
|
|
|
|
a_led_7: DS 1
|
|
a_led_6: DS 1
|
|
a_led_5: DS 1
|
|
a_led_4: DS 1
|
|
a_led_3: DS 1
|
|
a_led_2: DS 1
|
|
a_led_1: DS 1
|
|
a_led_0: DS 1
|
|
|
|
b_led_7: DS 1
|
|
b_led_6: DS 1
|
|
b_led_5: DS 1
|
|
b_led_4: DS 1
|
|
b_led_3: DS 1
|
|
b_led_2: DS 1
|
|
b_led_1: DS 1
|
|
b_led_0: DS 1
|
|
|
|
alu_led_7: DS 1
|
|
alu_led_6: DS 1
|
|
alu_led_5: DS 1
|
|
alu_led_4: DS 1
|
|
alu_led_3: DS 1
|
|
alu_led_2: DS 1
|
|
alu_led_1: DS 1
|
|
alu_led_0: DS 1
|
|
|
|
ctrl_led_ht: DS 1
|
|
ctrl_led_mi: DS 1
|
|
ctrl_led_ri: DS 1
|
|
ctrl_led_ro: DS 1
|
|
ctrl_led_io: DS 1
|
|
ctrl_led_ii: DS 1
|
|
ctrl_led_ai: DS 1
|
|
ctrl_led_ao: DS 1
|
|
|
|
ctrl_led_eo: DS 1
|
|
ctrl_led_su: DS 1
|
|
ctrl_led_bi: DS 1
|
|
ctrl_led_oi: DS 1
|
|
ctrl_led_ce: DS 1
|
|
ctrl_led_co: DS 1
|
|
ctrl_led_jp: DS 1
|
|
ctrl_led_fi: DS 1
|
|
|
|
flag_led_c: DS 1
|
|
flag_led_z: DS 1
|
|
|
|
display: DS 3 ; 3 digits
|
|
|
|
LedEnd:
|
|
|