Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; 2dofchar.dls ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; Elliott Smith (2016) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;----------------------------------------------------------------------------------------------;
- ;This is a hacky mess to demonstrate how DMA and layer movement can be (ab)used to display a ;
- ;smooth-scrolling map that is larger than the 16x16 tile-wide layer tile buffer offered by the ;
- ;ECOGPU module. ;
- ;Also demonstrated is a horrible method for polling the keypad for movement. ;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;------------------------------------------------------------------------------------------------------------------;
- ;The top of the program should always contain the interrupt handlers. These are one word long, and should either
- ;contain an RFE if no action is to be taken (though they should be disabled in that case...) or a jump operation
- ;to direct the interrupt to the handler.
- ;JAL is a horrible idea here.
- .seg program
- IRQ7 j DMAComp ;DMA COMPLETE - we should only be waiting for DMAs at this time anyway.
- IRQ6 rfe
- IRQ5 j vblank ;VBLANK
- IRQ4 rfe ;HBLANK
- IRQ3 rfe
- IRQ2 rfe
- IRQ1 rfe
- IRQ0 rfe
- UTE rfe
- OFE rfe
- MPE rfe
- IME rfe
- IIE rfe
- FIE rfe
- .seg graphics
- ;Unfortunately this mess is the only way to embed binaries supported by the assembler.
- P_PAL_U .halfu 16#0000,16#1803,16#34C6,16#4D89,16#6006,16#6E61,16#7F12,16#7F44
- P_PAL_L .halfu 16#0000,16#1803,16#3003,16#34C6,16#4D89,16#6006,16#714C,16#0000
- P_PAL_LEN .equ 16#20
- P_U_F_0 .halfu 16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0660,16#0000,16#0660,16#0FF0,16#0000,16#05A0,16#0A50,16#05A0,16#0660,16#0990,16#0660,16#0180,16#0240,16#0E70,16#0000,16#0810,16#1FF8
- P_L_F_0 .halfu 16#0000,16#17E8,16#2BD4,16#0000,16#1BD8,16#2424,16#05A0,16#05A0,16#3A5C,16#0DB0,16#0DB0,16#1248,16#07E0,16#07E0,16#0810,16#0810,16#0810,16#17E8,16#15E8,16#11C8,16#2FF4,16#0FF0,16#03C0,16#1FF8,16#07E0,16#0000,16#0FF0,16#0C30,16#0000,16#03C0,16#0660,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000
- P_U_F_1 .halfu 16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0660,16#0000,16#0660,16#0FF0,16#0000,16#05A0,16#0A50,16#05A0,16#0660,16#0990,16#0660,16#0180,16#0240,16#0E70,16#0000,16#0810,16#1FF8
- P_L_F_1 .halfu 16#0000,16#17E8,16#2BD4,16#0000,16#1BD8,16#2424,16#05A0,16#05A0,16#3A5C,16#0DB0,16#0DB0,16#1248,16#07E0,16#07E0,16#0810,16#0810,16#0810,16#17E8,16#15E8,16#11C8,16#2FF4,16#0FF0,16#03C0,16#1FF8,16#07E0,16#0000,16#0FF0,16#0600,16#0000,16#01E0,16#0300,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000
- P_U_B_0 .halfu 16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0660,16#0000,16#0660,16#0FF0,16#0000,16#05A0,16#0A50,16#05A0,16#0660,16#0990,16#0660,16#0000,16#07E0,16#0990,16#0000,16#0FF0,16#1FF8
- P_L_B_0 .halfu 16#0000,16#1FF8,16#2814,16#0000,16#1FF8,16#25A4,16#0000,16#07E0,16#381C,16#0000,16#0000,16#1FF8,16#0000,16#0000,16#0FF0,16#0810,16#0810,16#17E8,16#17E8,16#13C8,16#2C34,16#0FF0,16#03C0,16#1FF8,16#07E0,16#0000,16#0FF0,16#0C30,16#0000,16#03C0,16#0660,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000
- P_U_B_1 .halfu 16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0660,16#0000,16#0660,16#0FF0,16#0000,16#05A0,16#0A50,16#05A0,16#0660,16#0990,16#0660,16#0000,16#07E0,16#0990,16#0000,16#0FF0,16#1FF8
- P_L_B_1 .halfu 16#0000,16#1FF8,16#2814,16#0000,16#1FF8,16#25A4,16#0000,16#07E0,16#381C,16#0000,16#0000,16#1FF8,16#0000,16#0000,16#0FF0,16#0810,16#0810,16#17E8,16#17E8,16#13C8,16#2C34,16#0FF0,16#03C0,16#1FF8,16#07E0,16#0000,16#0FF0,16#0600,16#0000,16#01E0,16#0300,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000
- P_U_S_0 .halfu 16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#001C,16#0000,16#001C,16#003E,16#0000,16#002C,16#0056,16#0028,16#000C,16#0002,16#03FC,16#0000,16#01F4,16#0FF8,16#0000,16#0EF8,16#1FFC
- P_L_S_0 .halfu 16#0000,16#1CF8,16#3F54,16#0300,16#0F78,16#3084,16#0D00,16#0D78,16#1284,16#0D00,16#0D00,16#12FC,16#07C0,16#07C0,16#0838,16#0300,16#0300,16#04F0,16#0180,16#01C0,16#0620,16#06C0,16#07E0,16#0E10,16#0720,16#00C0,16#0F30,16#0000,16#0000,16#07E0,16#0380,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000
- P_U_S_1 .halfu 16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#001C,16#0000,16#001C,16#003E,16#0000,16#002C,16#0056,16#0028,16#000C,16#0002,16#03FC,16#0000,16#01F4,16#0FF8,16#0000,16#0EF8,16#1FFC
- P_L_S_1 .halfu 16#0000,16#1CF8,16#3F54,16#0300,16#0F78,16#3084,16#0D00,16#0D78,16#1284,16#0D00,16#0D00,16#12FC,16#07C0,16#07C0,16#0838,16#0300,16#0380,16#0470,16#0180,16#01C0,16#0620,16#06C0,16#07E0,16#0E10,16#0730,16#00C0,16#0F20,16#1C18,16#0000,16#03E0,16#0E70,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000
- P_U_S_2 .halfu 16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#001C,16#0000,16#001C,16#003E,16#0000,16#002C,16#0056,16#0028,16#000C,16#0002,16#03FC,16#0000,16#01F4,16#0FF8,16#0000,16#0EF8,16#1FFC
- P_L_S_2 .halfu 16#0000,16#1CF8,16#3F54,16#0300,16#0F78,16#3084,16#0D00,16#0D78,16#1284,16#0D00,16#0D00,16#12FC,16#07C0,16#07C0,16#0838,16#0300,16#0380,16#0470,16#0180,16#01C0,16#0620,16#06C0,16#07E0,16#0E10,16#0728,16#00C0,16#0F30,16#1818,16#0000,16#07E0,16#0E30,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000
- P_SPR_LEN .equ 16#5A0
- sprite .halfu 2#0000000000000000,2#0000000000000000,2#0000000000000000,2#0000000000000000,2#0000000000000000,2#0000000000000000,2#0000000000000000,2#0000000000000000,2#0000000000000000,2#0000000000000000,2#0001111111111000,2#0001111111111000,2#0000000000000000,2#0001000000001000,2#0001000000001000,2#0000000000000000,2#0001001111001000,2#0001000000001000,2#0000000000000000,2#0001010000101000,2#0001001111001000,2#0000000000000000,2#0001000000101000,2#0001000000011000,2#0000000000000000,2#0001000001001000,2#0001000000101000,2#0000000000000000,2#0001000010001000,2#0001000001001000,2#0000000000000000,2#0001000100001000,2#0001000010001000,2#0000000000000000,2#0001000100001000,2#0001000010001000,2#0000000000000000,2#0001111111111000,2#0001111111111000,2#0000000000000000,2#0000000000000000,2#0000000000000000,2#0000000000000000,2#0000000000000000,2#0000000000000000,2#0000000000000000,2#0000000000000000,2#0000000000000000
- inst0 .byteu 2#11000000,2#00000000,2#01000000,2#01000000
- ;inst1 .byteu 2#00010000,2#00000100,2#01010000,2#01000000
- ;inst2 .byteu 2#00100000,2#00000100,2#01100000,2#01000000
- ;inst3 .byteu 2#00110000,2#00000100,2#01110000,2#01000000
- ;inst4 .byteu 2#01000000,2#00000100,2#10000000,2#01000000
- ;inst5 .byteu 2#01010000,2#00000100,2#10010000,2#01000000
- ;inst6 .byteu 2#01100000,2#00000100,2#10100000,2#01000000
- ;inst7 .byteu 2#01110000,2#00000100,2#10110000,2#01000000
- ;Map data
- LAY_0 .word 16#580 ;map length
- LAY_0_WIDTH .word 10#32
- LAY_0_HEIGHT .word 10#22
- LAY_0_DATA .halfu 16#0095,16#8095,16#039D,16#839D,16#039D,16#839D,16#039D,16#839D,16#039D,16#839D,16#039D,16#839D,16#039D,16#839D,16#039D,16#839D,16#039D,16#839D,16#039D,16#839D,16#039D,16#839D,16#039D,16#839D,16#039D,16#839D,16#039D,16#839D,16#039D,16#839D,16#0095,16#8095,16#0199,16#8199,16#0581,16#8582,16#8582,16#8582,16#8582,16#8582,16#8582,16#8582,16#8582,16#8582,16#8582,16#8582,16#8582,16#8582,16#8582,16#8582,16#8582,16#8582,16#8582,16#8582,16#8582,16#8582,16#8582,16#8582,16#8582,16#8582,16#8582,16#8581,16#0199,16#8199,16#0095,16#8095,16#4585,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C585,16#0095,16#8095,16#0199,16#8199,16#4585,16#C586,16#C586,16#0683,16#0684,16#0684,16#0684,16#0684,16#0684,16#0684,16#0684,16#0684,16#0684,16#0684,16#0684,16#0684,16#0684,16#0684,16#0684,16#0684,16#0684,16#0684,16#0684,16#8683,16#C586,16#C586,16#C586,16#C585,16#0199,16#8199,16#0095,16#8095,16#4585,16#C586,16#C586,16#0688,16#C689,16#C689,16#C689,16#C689,16#C689,16#C689,16#C689,16#C689,16#C689,16#C689,16#C689,16#C689,16#C689,16#C689,16#C689,16#C689,16#C689,16#C689,16#C689,16#068A,16#C586,16#C586,16#C586,16#C585,16#0095,16#8095,16#0199,16#8199,16#4585,16#C586,16#C586,16#0688,16#C689,16#C689,16#C689,16#C689,16#C689,16#C689,16#C689,16#C689,16#C689,16#C689,16#C689,16#C689,16#C689,16#C689,16#C689,16#C689,16#C689,16#C689,16#C689,16#068A,16#C586,16#C586,16#C586,16#C585,16#0199,16#8199,16#0095,16#8095,16#4585,16#C586,16#C586,16#068B,16#C684,16#C684,16#C684,16#C684,16#C684,16#C684,16#C684,16#C684,16#C684,16#C684,16#C684,16#C684,16#C684,16#C68E,16#C689,16#C689,16#C689,16#C689,16#C689,16#068A,16#C586,16#C586,16#C586,16#C585,16#0095,16#8095,16#0199,16#8199,16#4585,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C68A,16#C689,16#C689,16#C689,16#C689,16#C689,16#068A,16#C586,16#C586,16#C586,16#C585,16#0199,16#8199,16#0095,16#8095,16#4585,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C68A,16#C689,16#C689,16#C689,16#C689,16#C689,16#068A,16#C586,16#C586,16#C586,16#C585,16#0095,16#8095,16#0199,16#8199,16#4585,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C68A,16#C689,16#C689,16#C689,16#C689,16#C689,16#068A,16#C586,16#C586,16#C586,16#C585,16#0199,16#8199,16#0095,16#8095,16#4585,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C68A,16#C689,16#C689,16#C689,16#C689,16#C689,16#068A,16#C586,16#C586,16#C586,16#C585,16#0095,16#8095,16#0199,16#8199,16#4585,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C68A,16#C689,16#C689,16#C689,16#C689,16#C689,16#068A,16#C586,16#C586,16#C586,16#C585,16#0199,16#8199,16#0095,16#8095,16#4585,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C68A,16#C689,16#C689,16#C689,16#C689,16#C689,16#068A,16#C586,16#C586,16#C586,16#C585,16#0095,16#8095,16#0199,16#8199,16#4585,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C68A,16#C689,16#C689,16#C689,16#C689,16#C689,16#068A,16#C586,16#C586,16#C586,16#C585,16#0199,16#8199,16#0095,16#8095,16#4585,16#C586,16#0683,16#8684,16#8684,16#8684,16#8684,16#8684,16#8684,16#8684,16#8684,16#8684,16#8684,16#8684,16#8684,16#8684,16#8684,16#C68F,16#C689,16#C689,16#C689,16#C689,16#C689,16#068A,16#C586,16#C586,16#C586,16#C585,16#0095,16#8095,16#0199,16#8199,16#4585,16#C586,16#0688,16#C689,16#C689,16#C689,16#C689,16#C689,16#C689,16#C689,16#C689,16#C689,16#C689,16#C689,16#C689,16#C689,16#C689,16#C689,16#C689,16#C689,16#C689,16#C689,16#C689,16#468A,16#C586,16#C586,16#C586,16#C585,16#0199,16#8199,16#0095,16#8095,16#4585,16#C586,16#0688,16#C689,16#C689,16#C689,16#C689,16#C689,16#C689,16#C689,16#C689,16#C689,16#C689,16#C689,16#C689,16#C689,16#C689,16#C689,16#C689,16#C689,16#C689,16#C689,16#C689,16#468A,16#C586,16#C586,16#C586,16#C585,16#0095,16#8095,16#0199,16#8199,16#4585,16#C586,16#0688,16#C689,16#C689,16#C689,16#C689,16#C689,16#C689,16#C689,16#C689,16#C689,16#C689,16#C689,16#C689,16#C689,16#C689,16#C689,16#C689,16#C689,16#C689,16#C689,16#C689,16#468A,16#C586,16#C586,16#C586,16#C585,16#0199,16#8199,16#0095,16#8095,16#4585,16#C586,16#4683,16#4684,16#4684,16#4684,16#4684,16#4684,16#4684,16#4684,16#4684,16#4684,16#4684,16#4684,16#4684,16#4684,16#4684,16#4684,16#4684,16#4684,16#4684,16#4684,16#4684,16#C683,16#C586,16#C586,16#C586,16#C585,16#0095,16#8095,16#0199,16#8199,16#4585,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C586,16#C585,16#0199,16#8199,16#0095,16#8095,16#4581,16#C582,16#C582,16#C582,16#C582,16#C582,16#C582,16#C582,16#C582,16#C582,16#C582,16#C582,16#C582,16#C582,16#C582,16#C582,16#C582,16#C582,16#C582,16#C582,16#C582,16#C582,16#C582,16#C582,16#C582,16#C582,16#C582,16#C581,16#039D,16#839D,16#0199,16#8199,16#0796,16#099C,16#0598,16#0796,16#099C,16#0598,16#0796,16#099C,16#0598,16#0796,16#099C,16#0598,16#0796,16#099C,16#0598,16#0796,16#099C,16#0598,16#0796,16#099C,16#0598,16#0796,16#099C,16#0598,16#0796,16#099C,16#0598,16#0796,16#099C,16#0598
- LAY_1 .word 16#580 ;map length
- LAY_1_WIDTH .word 10#32
- LAY_1_HEIGHT .word 10#22
- LAY_1_DATA .halfu 16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#a590,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#a591,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#a592,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#a590,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#2893,16#a694,16#a893,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#a591,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0696,16#0697,16#0498,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#a592,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#079a,16#809c,16#879b,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#079e,16#829f,16#879e,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#a590,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#a893,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#a591,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#a592,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#2893,16#a694,16#a893,16#2893,16#a694,16#a893,16#2893,16#a694,16#a893,16#2893,16#a694,16#a893,16#2893,16#a694,16#a893,16#2893,16#a694,16#a893,16#2893,16#a694,16#a893,16#2893,16#a694,16#a893,16#2893,16#a694,16#a893,16#2893,16#2694,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000,16#0000
- .seg program
- ;DMA STUFF
- DMA_OFFSET .wordu 16#10000
- DMASRC .equ 16#7300
- DMADST .equ 16#7304
- DMALEN .equ 16#7308
- DMA_GO .equ 16#730F ;WRITE BYTES TO HERE. WRITING BYTES IS FASTER THAN WORDS.
- ;INPUT AND HARDWARE STUFF
- HW_OFFSET .wordu 16#FFFFFF00
- HW_PAD .equ 16#0
- HW_PAD_H .equ 16#0
- HW_PAD_V .equ 16#1
- HW_PAD_AB .equ 16#2
- HW_PAD_SS .equ 16#3
- IRQ_ALL .wordu 2#101000100000000000000001 ;Write to PSW to enable all interrupts except hblank
- IRQ_NOMOVE .wordu 2#100000000000000000000001 ;While we're waiting for DMA to complete
- TILE_SPR .equ 16#3000
- S_PALETTE .equ 16#6000
- T_PALETTE .equ 16#6100
- INSTANCE .equ 16#6200
- LAYER .equ 16#6A00
- TILE .equ 16#6400
- TILE_0 .equ 16#6400
- CONTROL .equ 16#7300
- L0_X .equ 16#6A02
- L0_Y .equ 16#6A03
- L1_X .equ 16#6A06
- L1_Y .equ 16#6A07
- L2_X .equ 16#6A0A
- L2_Y .equ 16#6A0B
- L3_X .equ 16#6A0E
- L3_Y .equ 16#6A0F
- XMAX .equ 10#224;
- YMAX .equ 10#144;
- XSPEED .equ 1;
- YSPEED .equ -1;
- INSTIMG .equ INSTANCE+1;player sprite
- INSTX .equ INSTANCE+2 ;This is the player's absolute position on the screen
- INSTY .equ INSTANCE+3
- RAM .equ 16#8000 ;offset to RAM
- RAMWORD .word 16#8000 ;offset for ram loader
- StackStart .word 16#8000
- .seg ram
- stack .space 10#2048 ;make room for the stack
- .seg program
- .start init
- init lw r1,IRQ_NOMOVE(r0) ;disable VBLANK interrupt
- movi2s psw,r1
- lw r28,RAMWORD ;initialize RAM offset register. NEVER TOUCH R28 AGAIN.
- lw r30,StackStart ;initialize stack pointer
- addi r1,r0,5
- sw PlayerX-RAM(r28),r1
- sw PlayerY-RAM(r28),r1
- ;First let's set up the background
- addui r1,r0,SPR_00;
- addui r2,r0,TILE_SPR
- addui r3,r0,SPR_LEN;
- jal StartDMA
- addui r1,r0,PAL_00
- addui r2,r0,T_PALETTE
- addui r3,r0,PAL_LEN
- jal StartDMA
- addui r1,r0,layer0 ;
- addui r2,r0,LAYER ;dest
- addui r3,r0,16#c ;copies 3 words = all 3 current layers. layer 3 is unused.
- jal StartDMA
- addui r1,r0,P_U_F_0 ;r1 <- pointer to sprite in memory
- addui r2,r0,0 ;r2 <- dest (it's zero still because the tiles go in upper memory)
- addui r3,r0,P_SPR_LEN ;r3 <- length of sprite
- jal StartDMA
- addui r1,r0,inst0
- addui r2,r0,INSTANCE
- addui r3,r0,10#4
- jal StartDMA
- addui r1,r0,P_PAL_U
- addui r2,r0,S_PALETTE ;offset because we already have 5 palettes in memory
- addui r3,r0,16#20
- jal StartDMA
- nop
- nop
- lw r1,IRQ_ALL(r0) ;enable VBLANK interrupt
- movi2s psw,r1
- lw r7,DMA_OFFSET(r0) ;shuffle gpu offset around
- addi r3,r0,10#64 ;x pos
- addi r4,r0,10#64 ;y pos
- lw r20,HW_OFFSET(r0) ;get the location of the hardware
- addui r20,r20,HW_PAD ;move it to the pad location
- addui r1,r0,LAY_0 ;initialize the map at 0,0
- addui r2,r0,0
- addui r3,r0,0
- addui r4,r0,0
- jal loadMap
- ;clr r10 ;r10 <- scrollx
- ;clr r11 ;r11 <- scrolly
- ;clr r12 ;r12 <- toffsetx
- ;clr r13 ;r13 <- toffsety
- lw r1,IRQ_ALL ;enable interrupts
- movi2s psw,r1
- ;halt ;DEBUG: use this halt for testing initial setup without everything else shitting on it
- j vb_draw ;god forgive me
- j main ;everything setup; time to go!
- ;game loop starts here
- main lw r18,PlayerX-RAM(r28) ;debug output
- lw r19,PlayerY-RAM(r28)
- ;slai r18,r18,4
- ;slai r19,r19,4
- ;main wait
- wait ;wait for something to happen!
- j main ;loop!
- .seg ram
- PlayerX .space 4 ;This is the player's position -in tiles-
- PlayerY .space 4
- CameraX .space 4
- CameraY .space 4
- MapX .space 4 ;This is the map tile offset
- MapY .space 4
- MapOSTX .space 4 ;The TOTAL map offset (if it was one big stitched up map with unlimited scrolling)
- MapOSTY .space 4
- MapOSAX .space 4 ;The ACTUAL map offset (offset from the current tile offset)
- MapOSAY .space 4
- WalkCounter .space 4
- WalkH .space 1
- WalkV .space 1
- .align 4
- TempX .space 4
- TempY .space 4
- FinalPX .space 4 ;Player position after all transformations
- FinalPY .space 4
- FinalMOX .space 4 ;Map offset after all transformations
- FinalMOY .space 4
- FinalMTX .space 4 ;Map tile offset after all transformations
- FinalMTY .space 4
- .seg program
- ;vblank interrupt handler
- vblank lw r7,DMA_OFFSET
- lw r3,WalkCounter-RAM(r28)
- beqz r3,vb_check ;if(!WalkCounter){goto dpad check}
- subi r3,r3,4 ;WalkCounter-=4;
- sw WalkCounter-RAM(r28),r3
- jal animatePlayer
- ;bnez r3,vb_notdone ;clear both the walk direction markers if we're done walking
- vb_notdone j vb_draw
- vb_check lb r1,HW_PAD_H(r20) ;load dpad horizontal status
- lb r2,HW_PAD_V(r20) ;and vertically
- bnez r1,vb_walk ;if(!DPAD_H&&!DPAD_Y){
- beqz r2,vb_end ; return;}
- vb_walk jal requestMove ;else{ requestPlayerMove(dpadx, dpady);
- jal setPlayerDir
- lw r3,WalkCounter-RAM(r28)
- vb_draw lw r1,PlayerX-RAM(r28)
- lw r2,PlayerY-RAM(r28)
- slai r1,r1,4 ;PlayerX<<4
- slai r2,r2,4 ;PlayerY<<4 (fast way to PlayerXY*16)
- ;lw r3,WalkCounter ;This is probably not necessary - it should still be loaded from vblank.
- vb_h lb r4,WalkH-RAM(r28)
- beqz r4,vb_v
- slti r5,r4,0 ;if(walkdir>0) {we're walking right}
- bnez r5,vb_h_l
- sub r1,r1,r3 ;PlayerX-=WalkCounter //we're coming from the left.
- ;lw r14,3 ;DEBUG: INTENTIONAL MISALIGNED READ
- j vb_drawp
- vb_h_l add r1,r1,r3 ;PlayerX+=WalkCounter //from the right
- j vb_drawp ;now place the player
- vb_v lb r4,WalkV-RAM(r28)
- beqz r4,vb_drawp ;this should really never trigger but...
- slti r5,r4,0 ;if(walkdir>0) {we're walking down}
- bnez r5,vb_v_u
- sub r2,r2,r3
- j vb_drawp
- vb_v_u add r2,r2,r3
- vb_drawp bnez r3,vb_drawc
- sb WalkV-RAM(r28),r0
- sb WalkH-RAM(r28),r0
- vb_drawc sw FinalPX-RAM(r28),r1
- sw FinalPY-RAM(r28),r2
- subi r3,r1,10#144 ;camera offset from player top left
- slei r5,r3,0 ;if(cameraX<0){
- bnez r5,vb_mosy ; goto cameraY};
- sgei r5,r3,10#256
- bnez r5,vb_fixx
- sub r5,r1,r3
- sw FinalPX-RAM(r28),r5
- sw TempX-RAM(r28),r1
- add r1,r0,r3
- jal Mod16
- add r3,r0,r2 ;shuffle remainder into map offset
- add r4,r0,r1 ;shuffle modulo into temp space
- sw FinalMOX-RAM(r28),r2
- sw FinalMTX-RAM(r28),r1 ;save our map offset for X
- j vb_mosy
- vb_fixx subi r5,r1,10#256
- sw FinalPX-RAM(r28),r5
- vb_mosy lw r1,FinalPY-RAM(r28)
- subi r3,r1,10#80 ;camera offset from player top left
- slei r5,r3,0 ;if(cameraX<0){
- bnez r5,vb_fixdy ; goto cameraY};
- sgei r5,r3,10#192
- bnez r5,vb_fixy
- sub r5,r1,r3
- sw FinalPY-RAM(r28),r5
- sw TempY-RAM(r28),r3
- add r1,r0,r3
- jal Mod16
- add r3,r0,r2 ;shuffle remainder into map offset
- add r4,r0,r1 ;shuffle modulo into temp space
- sw FinalMOY-RAM(r28),r2
- sw FinalMTY-RAM(r28),r1 ;save our map offset for X
- j vb_fixdy
- vb_fixy subi r5,r1,10#192
- sw FinalPY-RAM(r28),r5
- vb_fixdy lw r1,FinalPX-RAM(r28)
- lw r2,FinalPY-RAM(r28)
- lw r3,FinalMOX-RAM(r28)
- lw r4,FinalMOY-RAM(r28)
- sb L0_X(r7),r3 ;offsets the map by the distance walked
- sb L0_Y(r7),r4
- vb_blitp sb INSTX(r7),r1 ;this is what actually places the player.
- sb INSTY(r7),r2
- ;add r24,r0,r1 ;debug output
- ;add r25,r0,r2
- lw r1,FinalMTX-RAM(r28)
- lw r2,FinalMTY-RAM(r28)
- add r26,r0,r1 ;debug output
- add r27,r0,r2
- jal scrollMap
- vb_end lw r1,IRQ_ALL
- movi2s psw,r1
- j main
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;;OffsetCamera ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;Finds the correct camera position based on player position ;
- ;-------------------------------------------------------------;
- ; r1 <- PlayerX ;
- ; r2 <- PlayerY ;
- ; Returns - CamX in r1, CamY in r2. Also saves. ;
- ;-------------------------------------------------------------;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- .seg ram
- ;CamMaxX .word 10#288 ;currently hard-coded for a 32x22 tile map, fix later.
- ;CamMaxY .word 10#192 ;technically instantly fixed by writing over it in the map loader.
- ;TODO: WRITE THIS FUNCTION
- ;CUR_FRAME .word 0
- FRAME_DELAY .space 4
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;;animatePlayer ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;Cycles player animation ;
- ;-------------------------------------------------------------;
- ; uses: Nothing! ;
- ;-------------------------------------------------------------;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- .seg program
- ap_r31 .equ -4
- ap_r1 .equ -8
- ap_r2 .equ -12
- ap_r3 .equ -16
- ap_r4 .equ -20
- ap_r7 .equ -24
- ap_len .equ 28
- animatePlayer addi r30,r30,ap_len
- sw ap_r31(r30),r31
- sw ap_r1(r30),r1
- sw ap_r2(r30),r2
- sw ap_r3(r30),r3
- sw ap_r4(r30),r4
- sw ap_r7(r30),r7
- lw r3,FRAME_DELAY-RAM(r28) ;frame delay is like
- addi r3,r3,1
- sw FRAME_DELAY-RAM(r28),r3
- andi r4,r3,2#11 ;otherwise we go through all that bs to show the same frame
- ;bnez r4,ap_end ;even when the frame is being delayed
- lw r7,DMA_OFFSET
- srai r3,r3,1 ;by shifting right by 1, we give a frame delay of 2 cycles
- andi r3,r3,2#11 ;cut off any overflow to loop animation
- ;lw r1,CUR_FRAME
- lw r2,P_BASE_FRAME-RAM(r28)
- andi r4,r3,2#01 ;if it's an odd frame
- bnez r4,ap_notodd
- ;addi r4,r0,2#11000000
- ;sb INSTANCE(r7),r4
- sb INSTIMG(r7),r2
- j ap_end
- ap_notodd subi r1,r2,8 ;if the base frame offset is 8, we're sideways
- beqz r1,ap_side
- addi r2,r2,2 ;otherwise... inc frame counter
- sb INSTIMG(r7),r2 ;use the second frame
- andi r4,r3,2#10 ;see whether we're on frame 2 or 4
- bnez r4,ap_frame4
- addi r4,r0,2#11000000 ;use unflipped sprite on frame 2
- sb INSTANCE(r7),r4
- j ap_end
- ap_frame4 addi r4,r0,2#11100000 ;use flipped sprite on frame 4
- sb INSTANCE(r7),r4
- j ap_end
- ap_side andi r4,r3,2#10 ;frame 2 or 4?
- bnez r4,ap_sf4
- addi r2,r2,2
- sb INSTIMG(r7),r2
- j ap_end
- ap_sf4 addi r2,r2,4
- sb INSTIMG(r7),r2
- ap_end lw r31,ap_r31(r30)
- lw r1,ap_r1(r30)
- lw r2,ap_r2(r30)
- lw r3,ap_r3(r30)
- lw r4,ap_r4(r30)
- lw r7,ap_r7(r30)
- subi r30,r30,ap_len
- jr r31
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;;setPlayerDir ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;Faces the player sprite in the right direction ;
- ;-------------------------------------------------------------;
- ; uses: Nothing! ;
- ;-------------------------------------------------------------;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- spd_r31 .equ -4
- spd_r1 .equ -8
- spd_r2 .equ -12
- spd_r3 .equ -16
- ;spd_r4 .equ -20
- spd_r7 .equ -24
- spd_len .equ 28
- .seg ram
- P_BASE_FRAME .space 4
- P_OLD_DIR .space 4
- .seg program
- setPlayerDir addi r30,r30,spd_len
- sw spd_r31(r30),r31
- sw spd_r1(r30),r1
- sw spd_r2(r30),r2
- sw spd_r3(r30),r3
- ;sw spd_r4(r30),r4
- sw spd_r7(r30),r7
- lw r7,DMA_OFFSET
- lw r1,PDir-RAM(r28)
- lw r2,P_OLD_DIR-RAM(r28)
- sub r2,r2,r1
- beqz r2,spd_skip
- sw P_OLD_DIR-RAM(r28),r1 ;THIS FREEZES ERRYTHING
- slai r1,r1,2 ;multiply by 4 to make into a jumptable offset
- lw r1,spd_jtp(r1) ;load jump table
- jr r1
- spd_left addi r2,r0,8
- sb INSTIMG(r7),r2
- addi r3,r0,2#11000000
- sb INSTANCE(r7),r3
- j spd_end
- spd_right addi r2,r0,8
- sb INSTIMG(r7),r2
- addi r3,r0,2#11100000
- sb INSTANCE(r7),r3
- j spd_end
- spd_up addi r2,r0,4
- sb INSTIMG(r7),r2
- j spd_end
- spd_down addi r2,r0,0
- sb INSTIMG(r7),r2
- spd_end sw P_BASE_FRAME-RAM(r28),r2
- spd_skip lw r1,spd_r1(r30)
- lw r2,spd_r2(r30)
- lw r3,spd_r3(r30)
- ;lw r4,spd_r4(r30)
- lw r7,spd_r7(r30)
- lw r31,spd_r31(r30)
- subi r30,r30,spd_len
- jr r31
- ;jump table for directional drawing
- spd_jtp .word spd_left
- spd_jtp1 .word spd_right
- spd_jtp2 .word spd_up
- spd_jtp3 .word spd_down
- .seg ram
- PDir .space 4
- .seg program
- PDIR_L .equ 2#00
- PDIR_R .equ 2#01
- PDIR_U .equ 2#10
- PDIR_D .equ 2#11
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;;requestMove ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;Takes dpad input and tries to move the player ;
- ;-------------------------------------------------------------;
- ; r1 <- dpad horizontal ;
- ; r2 <- dpad vertical ;
- ;-------------------------------------------------------------;
- ;TODO: Currently this just checks if we're on the edge and ;
- ; rejects the move in that case. Add a thing to it to ;
- ; make it interract with pathing maps. ;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- .seg program
- rm_r1 .equ -4
- rm_r2 .equ -8
- rm_r3 .equ -12
- rm_r4 .equ -16
- rm_r5 .equ -20
- rm_r6 .equ -24
- rm_r7 .equ -28
- rm_r8 .equ -32
- rm_r31 .equ -36
- rm_len .equ 40
- requestMove addi r30,r30,rm_len
- sw rm_r1(r30),r1 ;backup registers
- sw rm_r2(r30),r2
- sw rm_r3(r30),r3
- sw rm_r4(r30),r4
- sw rm_r5(r30),r5
- sw rm_r6(r30),r6
- sw rm_r7(r30),r7
- sw rm_r8(r30),r8
- sw rm_r31(r30),r31
- bnez r1,rm_h ;h gets priority because yolo.
- bnez r2,rm_v
- j rm_end ;this should never get triggered but, just in case!
- rm_h lw r3,PlayerX-RAM(r28) ;load player's current x position (in tiles)
- andi r8,r1,2#10
- beqz r8,rm_right ;this tests if the controller direction is negative, aka left
- addi r8,r0,PDIR_L ;save
- sw PDir-RAM(r28),r8
- j rm_h_cont
- rm_right addi r8,r0,PDIR_R
- sw PDir-RAM(r28),r8
- rm_h_cont add r3,r3,r1 ;r3<-proposed new player x
- slti r7,r3,1 ;if(PlayerX+dpad_h<0){
- bnez r7,rm_end ; return;} //THIS SECTION REJECTS THE REQUEST
- lw r5,LAY_1_WIDTH ;r5 <- map width //IF IT WOULD PLACE THE PLAYER OUT OF
- subi r5,r5,1 ;sub 1 so we stay on the map intead of going outside
- sgt r7,r3,r5 ;if(PlayerX+dpad_h>map width){ //THE BOUNDS OF THE CURRENT MAP
- bnez r7,rm_end ; return;}
- sb WalkH-RAM(r28),r1
- sb WalkV-RAM(r28),r0
- sw PlayerX-RAM(r28),r3
- j rm_finishup
- rm_v lw r4,PlayerY-RAM(r28)
- andi r8,r2,2#10
- beqz r8,rm_down ;this tests if the controller direction is negative, aka up
- addi r8,r0,PDIR_U ;save
- sw PDir-RAM(r28),r8
- j rm_v_cont
- rm_down addi r8,r0,PDIR_D
- sw PDir-RAM(r28),r8
- rm_v_cont add r4,r4,r2
- slti r7,r4,1
- bnez r7,rm_end
- lw r5,LAY_1_HEIGHT
- subi r5,r5,1
- sgt r7,r4,r5
- bnez r7,rm_end
- sb WalkH-RAM(r28),r0
- sb WalkV-RAM(r28),r2
- sw PlayerY-RAM(r28),r4
- rm_finishup addi r1,r0,10#16
- sw WalkCounter-RAM(r28),r1
- rm_end lw r1,rm_r1(r30) ;restore registers
- lw r2,rm_r2(r30)
- lw r3,rm_r3(r30)
- lw r4,rm_r4(r30)
- lw r5,rm_r5(r30)
- lw r6,rm_r6(r30)
- lw r7,rm_r7(r30)
- lw r8,rm_r8(r30)
- lw r31,rm_r31(r30)
- subi r30,r30,rm_len
- jr r31
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;;scrollMap ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;Takes an x and y value to scroll the map by. ;
- ;-------------------------------------------------------------;
- ; r1 x <- how far to move the map horizontally ;
- ; r2 y <- aaand vertically ;
- ;-------------------------------------------------------------;
- ;Uses: ;
- ;r1,r2 ;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- .seg ram
- mapX .space 4
- mapY .space 4
- .seg program
- ;Temp values
- sm_r3 .equ -4
- sm_r4 .equ -8
- sm_r5 .equ -12
- ;sm_r6 .equ -16
- ;sm_r7 .equ -20
- sm_r31 .equ -24
- sm_len .equ 28
- scrollMap addi r30,r30,sm_len
- sw sm_r3(r30),r3
- sw sm_r4(r30),r4
- sw sm_r5(r30),r5
- ;sw sm_r6(r30),r6
- ;sw sm_r7(r30),r7
- sw sm_r31(r30),r31
- lw r3,mapX-RAM(r28)
- ;seq r5,r1,r3 ;TODO: FIX THIS SECTION, IT FOR SOME REASON IGNORES Y UPDATES ATM
- ;beqz r5,smchanged
- lw r4,mapY-RAM(r28)
- ;seq r5,r2,r4
- ;beqz r5,scrollend
- smchanged sw mapX-RAM(r28),r1 ;store the new map values because the map blitter will eat them
- sw mapY-RAM(r28),r2
- addui r1,r0,LAY_0 ;load the pointer for layer 0, this is temp until we're storing current map somewhere.
- ;add r3,r0,r2 ;shuffle x and y into r2 and r3 to set up to call our function
- ;add r2,r0,r1
- lw r2,mapX-RAM(r28)
- lw r3,mapY-RAM(r28)
- addui r4,r0,0 ;we'll probably replace this with a method for blitting active layers soon(tm)
- jal loadMap
- scrollend lw r3,sm_r3(r30)
- lw r4,sm_r4(r30)
- lw r5,sm_r5(r30)
- ;lw r6,sm_r6(r30)
- ;lw r7,sm_r7(r30)
- lw r31,sm_r31(r30)
- subi r30,r30,sm_len
- scrollfend jr r31
- ;;TODO: Reorder this so it uses r1 for x, r2 for y, r3 for source.
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;;loadMap ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; Fills a whole map buffer from memory using an offset ;
- ;-------------------------------------------------------------;
- ; r1 Source <- start of map data in memory (length) ;
- ; r2 x <- x offset tiles ;
- ; r3 y <- y offset tiles ;
- ; r4 layer <- which layer to draw to ;
- ;-------------------------------------------------------------;
- ; Uses: r1,r2,r3,r4 ;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- lm_r5 .equ -4
- lm_r6 .equ -8
- lm_r7 .equ -12
- lm_r8 .equ -16
- lm_retaddr .equ -20
- lm_psw .equ -24
- lm_len .equ 28
- MAP_LENGTH .equ 16#0 ;these are offsets from the map data in memory
- MAP_WIDTH .equ 16#4 ;assuming the map was exported from the supergamebabby editor tool
- MAP_HEIGHT .equ 16#8
- MAP_DATA .equ 16#c
- loadMap addi r30,r30,lm_len
- sw lm_r5(r30),r5 ;save registers we're gonna use
- sw lm_r6(r30),r6
- sw lm_r7(r30),r7
- sw lm_r8(r30),r8
- sw lm_retaddr(r30),r31 ;so we can get back where we came from
- lw r5,IRQ_NOMOVE
- movi2s psw,r5
- clr r6 ;r6 <- offset
- lw r7,MAP_WIDTH(r1) ;r7 <- map_width
- add r7,r7,r7 ;r7*=2; //so we can add it each loop
- addui r8,r0,10#16 ;r8 <- buffer_length //we'll use this to load all the rows
- lm_ymult beqz r3,lm_xadd ;while(y){
- add r6,r6,r7 ; offset+=16;
- subui r3,r3,1 ; y--;
- j lm_ymult ;}
- lm_xadd add r2,r2,r2 ;x+=x; //double so we get the offset right
- add r6,r6,r2 ;offset+=x;
- ;add r6,r6,r6 ;offset*=2; //double offset because we're working with halfwords
- clr r2 ;make way for dest point
- lm_dstmult beqz r4,lm_tsetup ;while(layerchoice){
- addui r2,r0,10#256 ; layeroffset+=256
- subui r4,r4,1 ; layerchoice--;
- j lm_dstmult ;}
- lm_tsetup add r2,r2,r2 ;layeroffset*=2 //again, double offset
- addui r2,r2,TILE ;layeroffset+=TILE_DATA_OFFSET; //the draw destination
- addui r3,r0,10#32 ;draw_length = 16*2; //we can only draw one row at a time
- addui r1,r1,MAP_DATA ;get the pointer to the data of the map
- add r1,r1,r6 ;map pointer+=offset
- lm_tloop beqz r8,lm_end ;while(buffer_length){
- add r5,r0,r1 ; //StartDMA kills r1, gotta save it
- jal StartDMA ; StartDMA(from, to, length)
- add r1,r0,r5 ; //and restore
- add r1,r1,r7 ; draw_offset+=map_width //this puts us onto the next line
- addui r2,r2,10#32 ; layer_offset+= 16*2; //Gotta draw to the next line too
- subi r8,r8,1 ; buffer_length--;
- j lm_tloop ;}
- lm_end lw r5,lm_r5(r30) ;restore registers
- lw r6,lm_r6(r30)
- lw r7,lm_r7(r30)
- lw r8,lm_r8(r30)
- lw r31,lm_retaddr(r30) ;restore return address
- subi r30,r30,lm_len
- jr r31
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;;StartDMA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; Starts a DMA transfer to the GPU, then sleeps the CPU ;
- ; until the transfer completes. ;
- ; TODO: Rewrite this to use the stack so that we can queue ;
- ; multiple transfers and have the CPU continue ;
- ; working inbetween them. ;
- ;-------------------------------------------------------------;
- ; r1 Source <- Absolute start address of transfer data ;
- ; r2 Dest <- Destination address IN GPU of transfer ;
- ; r3 Length <- Length of data block in BYTES ;
- ;-------------------------------------------------------------;
- ; Uses: r1,r2,r3,r15 ;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- sdma_r31 .equ -4
- sdma_len .equ 10#4
- .seg program
- StartDMA addi r30,r30,sdma_len
- sw sdma_r31(r30),r31
- lw r15,DMA_OFFSET(r0) ;use the offset since it's too long
- sw DMASRC(r15),r1 ;set the source
- sw DMADST(r15),r2 ;Set the destination
- sw DMALEN(r15),r3 ;set the length
- lw r1,IRQ_NOMOVE(r0)
- movi2s psw,r1 ;enable interrupts
- addi r1,r0,1
- DMAWait beqz r1,DMAEnd ;lol this completely defeats the purpose of interrupt requests
- sb DMA_GO(r15),r1 ;GO!
- wait
- j DMAWait
- DMAEnd lw r31,sdma_r31(r30)
- subi r30,sdma_len
- jr r31 ;and we're done!
- DMAComp clr r1
- rfe
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;;Modulo;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; Compute the modulo of x%y, return result and remainder ;
- ;-------------------------------------------------------------;
- ; r1 x ;
- ; r2 y ;
- ;-------------------------------------------------------------;
- ; Returns: r1 <- x%y ;
- ; r2 <- remainder ;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- mod_r3 .equ -4
- mod_r4 .equ -8
- mod_r5 .equ -12
- mod_r31 .equ -16
- mod_len .equ 10#20
- .seg program
- Modulo addi r30,r30,mod_len
- sw mod_r3(r30),r3
- sw mod_r4(r30),r4
- sw mod_r5(r30),r5
- sw mod_r31(r30),r31
- clr r4
- mod_loop sub r3,r1,r2
- slti r5,r3,0
- bnez r5,mod_end
- addi r4,r4,1
- addi r1,r3,0
- j mod_loop
- mod_end add r2,r3,r2
- add r1,r0,r4
- ;add r11,r0,r1 ;debug
- ;add r12,r0,r2 ;debug
- lw r3,mod_r3(r30)
- lw r4,mod_r4(r30)
- lw r5,mod_r5(r30)
- lw r31,mod_r31(r30)
- subi r30,r30,mod_len
- jr r31
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;;Mod16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; Compute the modulo of x%16, return result and remainder ;
- ;-------------------------------------------------------------;
- ; r1 x ;
- ;-------------------------------------------------------------;
- ; Returns: r1 <- quotient ;
- ; r2 <- remainder ;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- mod16_r3 .equ -4
- mod16_r4 .equ -8
- mod16_r5 .equ -12
- mod16_r31 .equ -16
- mod16_len .equ 20
- Mod16 addi r30,r30,mod16_len
- sw mod16_r31(r30),r31
- sw mod16_r3(r30),r3
- andi r2,r1,10#15 ;remainder
- sub r1,r1,r2 ;x -= x%16
- srai r3,r1,31 ;r1= abs(r1)
- xor r1,r1,r3
- sub r1,r1,r3
- srai r1,r1,10#4 ;x /= 16
- lw r31,mod16_r31(r30)
- lw r3,mod16_r3(r30)
- subi r30,r30,mod16_len
- jr r31
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement