Advertisement
Guest User

Untitled

a guest
Jun 10th, 2016
152
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;       2dofchar.dls        ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  3. ;    Elliott Smith (2016)    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  4. ;----------------------------------------------------------------------------------------------;
  5. ;This is a hacky mess to demonstrate how DMA and layer movement can be (ab)used to display a   ;
  6. ;smooth-scrolling map that is larger than the 16x16 tile-wide layer tile buffer offered by the ;
  7. ;ECOGPU module.                                                                                ;
  8. ;Also demonstrated is a horrible method for polling the keypad for movement.                   ;
  9. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  10. ;------------------------------------------------------------------------------------------------------------------;
  11.  
  12. ;The top of the program should always contain the interrupt handlers. These are one word long, and should either
  13. ;contain an RFE if no action is to be taken (though they should be disabled in that case...) or a jump operation
  14. ;to direct the interrupt to the handler.
  15. ;JAL is a horrible idea here.
  16.             .seg    program
  17. IRQ7        j       DMAComp         ;DMA COMPLETE - we should only be waiting for DMAs at this time anyway.
  18. IRQ6        rfe    
  19. IRQ5        j       vblank          ;VBLANK
  20. IRQ4        rfe                     ;HBLANK
  21. IRQ3        rfe
  22. IRQ2        rfe
  23. IRQ1        rfe
  24. IRQ0        rfe
  25. UTE         rfe
  26. OFE         rfe
  27. MPE         rfe
  28. IME         rfe
  29. IIE         rfe
  30. FIE         rfe
  31.  
  32.             .seg    graphics
  33. ;Unfortunately this mess is the only way to embed binaries supported by the assembler.
  34. P_PAL_U         .halfu  16#0000,16#1803,16#34C6,16#4D89,16#6006,16#6E61,16#7F12,16#7F44
  35. P_PAL_L         .halfu  16#0000,16#1803,16#3003,16#34C6,16#4D89,16#6006,16#714C,16#0000
  36. P_PAL_LEN       .equ        16#20
  37.  
  38. 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
  39. 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
  40. 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
  41. 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
  42. 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
  43. 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
  44. 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
  45. 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
  46. 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
  47. 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
  48. 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
  49. 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
  50. 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
  51. 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
  52. P_SPR_LEN       .equ    16#5A0
  53.  
  54.  
  55. 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
  56. inst0           .byteu  2#11000000,2#00000000,2#01000000,2#01000000
  57. ;inst1          .byteu  2#00010000,2#00000100,2#01010000,2#01000000
  58. ;inst2          .byteu  2#00100000,2#00000100,2#01100000,2#01000000
  59. ;inst3          .byteu  2#00110000,2#00000100,2#01110000,2#01000000
  60. ;inst4          .byteu  2#01000000,2#00000100,2#10000000,2#01000000
  61. ;inst5          .byteu  2#01010000,2#00000100,2#10010000,2#01000000
  62. ;inst6          .byteu  2#01100000,2#00000100,2#10100000,2#01000000
  63. ;inst7          .byteu  2#01110000,2#00000100,2#10110000,2#01000000
  64. ;Map data
  65. LAY_0           .word   16#580 ;map length
  66. LAY_0_WIDTH     .word   10#32
  67. LAY_0_HEIGHT    .word   10#22
  68. 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
  69.  
  70. LAY_1           .word   16#580 ;map length
  71. LAY_1_WIDTH     .word   10#32
  72. LAY_1_HEIGHT    .word   10#22
  73. 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
  74.  
  75.  
  76.  
  77.             .seg    program
  78. ;DMA STUFF
  79. DMA_OFFSET  .wordu  16#10000
  80. DMASRC      .equ    16#7300
  81. DMADST      .equ    16#7304
  82. DMALEN      .equ    16#7308
  83. DMA_GO      .equ    16#730F         ;WRITE BYTES TO HERE. WRITING BYTES IS FASTER THAN WORDS.
  84.  
  85. ;INPUT AND HARDWARE STUFF
  86. HW_OFFSET   .wordu  16#FFFFFF00
  87. HW_PAD      .equ    16#0
  88. HW_PAD_H    .equ    16#0
  89. HW_PAD_V    .equ    16#1
  90. HW_PAD_AB   .equ    16#2
  91. HW_PAD_SS   .equ    16#3
  92.  
  93.  
  94. IRQ_ALL     .wordu  2#101000100000000000000001 ;Write to PSW to enable all interrupts except hblank
  95. IRQ_NOMOVE  .wordu  2#100000000000000000000001 ;While we're waiting for DMA to complete
  96.  
  97. TILE_SPR    .equ    16#3000
  98. S_PALETTE   .equ    16#6000
  99. T_PALETTE   .equ    16#6100
  100. INSTANCE    .equ    16#6200
  101. LAYER       .equ    16#6A00
  102. TILE        .equ    16#6400
  103. TILE_0      .equ    16#6400
  104. CONTROL     .equ    16#7300
  105.  
  106. L0_X        .equ    16#6A02
  107. L0_Y        .equ    16#6A03
  108. L1_X        .equ    16#6A06
  109. L1_Y        .equ    16#6A07
  110. L2_X        .equ    16#6A0A
  111. L2_Y        .equ    16#6A0B
  112. L3_X        .equ    16#6A0E
  113. L3_Y        .equ    16#6A0F
  114.  
  115. XMAX        .equ    10#224;
  116. YMAX        .equ    10#144;
  117. XSPEED      .equ    1;
  118. YSPEED      .equ    -1;
  119.  
  120. INSTIMG     .equ    INSTANCE+1;player sprite
  121. INSTX       .equ    INSTANCE+2  ;This is the player's absolute position on the screen
  122. INSTY       .equ    INSTANCE+3
  123.  
  124. RAM         .equ    16#8000     ;offset to RAM
  125. RAMWORD     .word   16#8000     ;offset for ram loader
  126.  
  127. StackStart  .word   16#8000
  128.  
  129.             .seg    ram
  130. stack       .space  10#2048             ;make room for the stack
  131.                
  132.             .seg    program
  133.             .start      init
  134.  
  135. init        lw      r1,IRQ_NOMOVE(r0)   ;disable VBLANK interrupt
  136.             movi2s  psw,r1
  137.             lw      r28,RAMWORD         ;initialize RAM offset register. NEVER TOUCH R28 AGAIN.
  138.             lw      r30,StackStart      ;initialize stack pointer
  139.             addi    r1,r0,5
  140.             sw      PlayerX-RAM(r28),r1
  141.             sw      PlayerY-RAM(r28),r1
  142.             ;First let's set up the background
  143.             addui   r1,r0,SPR_00;
  144.             addui   r2,r0,TILE_SPR
  145.             addui   r3,r0,SPR_LEN;
  146.             jal     StartDMA
  147.             addui   r1,r0,PAL_00
  148.             addui   r2,r0,T_PALETTE
  149.             addui   r3,r0,PAL_LEN
  150.             jal     StartDMA
  151.             addui   r1,r0,layer0    ;
  152.             addui   r2,r0,LAYER     ;dest
  153.             addui   r3,r0,16#c      ;copies 3 words = all 3 current layers. layer 3 is unused.
  154.             jal     StartDMA
  155.             addui   r1,r0,P_U_F_0           ;r1 <- pointer to sprite in memory
  156.             addui   r2,r0,0                 ;r2 <- dest (it's zero still because the tiles go in upper memory)
  157.             addui   r3,r0,P_SPR_LEN         ;r3 <- length of sprite
  158.             jal     StartDMA
  159.             addui   r1,r0,inst0
  160.             addui   r2,r0,INSTANCE
  161.             addui   r3,r0,10#4
  162.             jal     StartDMA
  163.             addui   r1,r0,P_PAL_U
  164.             addui   r2,r0,S_PALETTE ;offset because we already have 5 palettes in memory
  165.             addui   r3,r0,16#20
  166.             jal     StartDMA
  167.             nop
  168.             nop                        
  169.             lw      r1,IRQ_ALL(r0)      ;enable VBLANK interrupt
  170.             movi2s  psw,r1
  171.             lw      r7,DMA_OFFSET(r0)   ;shuffle gpu offset around
  172.             addi    r3,r0,10#64         ;x pos
  173.             addi    r4,r0,10#64         ;y pos
  174.             lw      r20,HW_OFFSET(r0)   ;get the location of the hardware
  175.             addui   r20,r20,HW_PAD      ;move it to the pad location
  176.             addui   r1,r0,LAY_0         ;initialize the map at 0,0
  177.             addui   r2,r0,0        
  178.             addui   r3,r0,0
  179.             addui   r4,r0,0
  180.             jal     loadMap
  181.             ;clr        r10                 ;r10 <- scrollx
  182.             ;clr        r11                 ;r11 <- scrolly
  183.             ;clr        r12                 ;r12 <- toffsetx
  184.             ;clr        r13                 ;r13 <- toffsety
  185.             lw      r1,IRQ_ALL          ;enable interrupts
  186.             movi2s  psw,r1
  187.             ;halt                       ;DEBUG: use this halt for testing initial setup without everything else shitting on it
  188.             j       vb_draw             ;god forgive me
  189.             j       main                ;everything setup; time to go!
  190.            
  191. ;game loop starts here         
  192. main        lw      r18,PlayerX-RAM(r28)            ;debug output
  193.             lw      r19,PlayerY-RAM(r28)
  194.             ;slai   r18,r18,4
  195.             ;slai   r19,r19,4
  196. ;main       wait
  197.             wait                    ;wait for something to happen!
  198.             j       main                ;loop!
  199.  
  200.            
  201.             .seg    ram
  202. PlayerX     .space  4   ;This is the player's position -in tiles-
  203. PlayerY     .space  4  
  204.  
  205. CameraX     .space  4
  206. CameraY     .space  4
  207.  
  208. MapX        .space  4       ;This is the map tile offset
  209. MapY        .space  4
  210.  
  211. MapOSTX     .space  4       ;The TOTAL map offset (if it was one big stitched up map with unlimited scrolling)
  212. MapOSTY     .space  4  
  213.  
  214. MapOSAX     .space  4       ;The ACTUAL map offset (offset from the current tile offset)
  215. MapOSAY     .space  4
  216.  
  217.  
  218. WalkCounter .space  4
  219. WalkH       .space  1
  220. WalkV       .space  1
  221.             .align  4
  222.            
  223. TempX       .space  4
  224. TempY       .space  4
  225.  
  226. FinalPX     .space  4       ;Player position after all transformations
  227. FinalPY     .space  4
  228. FinalMOX    .space  4       ;Map offset after all transformations
  229. FinalMOY    .space  4
  230. FinalMTX    .space  4       ;Map tile offset after all transformations
  231. FinalMTY    .space  4
  232.  
  233.             .seg    program
  234. ;vblank interrupt handler
  235. vblank      lw      r7,DMA_OFFSET
  236.             lw      r3,WalkCounter-RAM(r28)
  237.             beqz    r3,vb_check         ;if(!WalkCounter){goto dpad check}
  238.             subi    r3,r3,4             ;WalkCounter-=4;
  239.             sw      WalkCounter-RAM(r28),r3
  240.             jal     animatePlayer
  241.             ;bnez   r3,vb_notdone       ;clear both the walk direction markers if we're done walking
  242. vb_notdone  j       vb_draw
  243. vb_check    lb      r1,HW_PAD_H(r20)    ;load dpad horizontal status
  244.             lb      r2,HW_PAD_V(r20)    ;and vertically
  245.             bnez    r1,vb_walk          ;if(!DPAD_H&&!DPAD_Y){
  246.             beqz    r2,vb_end           ;   return;}
  247. vb_walk     jal     requestMove         ;else{ requestPlayerMove(dpadx, dpady);
  248.             jal     setPlayerDir
  249.             lw      r3,WalkCounter-RAM(r28)
  250. vb_draw     lw      r1,PlayerX-RAM(r28)
  251.             lw      r2,PlayerY-RAM(r28)
  252.             slai    r1,r1,4             ;PlayerX<<4
  253.             slai    r2,r2,4             ;PlayerY<<4 (fast way to PlayerXY*16)
  254.             ;lw     r3,WalkCounter      ;This is probably not necessary - it should still be loaded from vblank.
  255. vb_h        lb      r4,WalkH-RAM(r28)
  256.             beqz    r4,vb_v
  257.             slti    r5,r4,0             ;if(walkdir>0) {we're walking right}
  258.             bnez    r5,vb_h_l
  259.             sub     r1,r1,r3            ;PlayerX-=WalkCounter   //we're coming from the left.
  260.             ;lw     r14,3               ;DEBUG: INTENTIONAL MISALIGNED READ
  261.             j       vb_drawp
  262. vb_h_l      add     r1,r1,r3            ;PlayerX+=WalkCounter   //from the right
  263.             j       vb_drawp            ;now place the player
  264. vb_v        lb      r4,WalkV-RAM(r28)
  265.             beqz    r4,vb_drawp         ;this should really never trigger but...
  266.             slti    r5,r4,0             ;if(walkdir>0) {we're walking down}
  267.             bnez    r5,vb_v_u          
  268.             sub     r2,r2,r3
  269.             j       vb_drawp
  270. vb_v_u      add     r2,r2,r3
  271. vb_drawp    bnez    r3,vb_drawc
  272.             sb      WalkV-RAM(r28),r0
  273.             sb      WalkH-RAM(r28),r0
  274. vb_drawc    sw      FinalPX-RAM(r28),r1
  275.             sw      FinalPY-RAM(r28),r2
  276.             subi    r3,r1,10#144            ;camera offset from player top left
  277.             slei    r5,r3,0                 ;if(cameraX<0){
  278.             bnez    r5,vb_mosy              ;   goto cameraY};
  279.             sgei    r5,r3,10#256
  280.             bnez    r5,vb_fixx             
  281.             sub     r5,r1,r3
  282.             sw      FinalPX-RAM(r28),r5
  283.             sw      TempX-RAM(r28),r1
  284.             add     r1,r0,r3
  285.             jal     Mod16
  286.             add     r3,r0,r2                ;shuffle remainder into map offset
  287.             add     r4,r0,r1                ;shuffle modulo into temp space
  288.             sw      FinalMOX-RAM(r28),r2
  289.             sw      FinalMTX-RAM(r28),r1                ;save our map offset for X
  290.             j       vb_mosy
  291. vb_fixx     subi    r5,r1,10#256
  292.             sw      FinalPX-RAM(r28),r5
  293. vb_mosy     lw      r1,FinalPY-RAM(r28)
  294.             subi    r3,r1,10#80             ;camera offset from player top left
  295.             slei    r5,r3,0                 ;if(cameraX<0){
  296.             bnez    r5,vb_fixdy             ;   goto cameraY};
  297.             sgei    r5,r3,10#192
  298.             bnez    r5,vb_fixy
  299.             sub     r5,r1,r3
  300.             sw      FinalPY-RAM(r28),r5
  301.             sw      TempY-RAM(r28),r3
  302.             add     r1,r0,r3
  303.             jal     Mod16
  304.             add     r3,r0,r2                ;shuffle remainder into map offset
  305.             add     r4,r0,r1                ;shuffle modulo into temp space
  306.             sw      FinalMOY-RAM(r28),r2
  307.             sw      FinalMTY-RAM(r28),r1                ;save our map offset for X
  308.             j       vb_fixdy
  309. vb_fixy     subi    r5,r1,10#192
  310.             sw      FinalPY-RAM(r28),r5
  311. vb_fixdy    lw      r1,FinalPX-RAM(r28)
  312.             lw      r2,FinalPY-RAM(r28)
  313.             lw      r3,FinalMOX-RAM(r28)
  314.             lw      r4,FinalMOY-RAM(r28)
  315.             sb      L0_X(r7),r3             ;offsets the map by the distance walked
  316.             sb      L0_Y(r7),r4
  317. vb_blitp    sb      INSTX(r7),r1            ;this is what actually places the player.
  318.             sb      INSTY(r7),r2
  319.             ;add        r24,r0,r1           ;debug output
  320.             ;add        r25,r0,r2
  321.             lw      r1,FinalMTX-RAM(r28)
  322.             lw      r2,FinalMTY-RAM(r28)
  323.             add     r26,r0,r1           ;debug output
  324.             add     r27,r0,r2
  325.             jal     scrollMap      
  326. vb_end      lw      r1,IRQ_ALL
  327.             movi2s  psw,r1
  328.             j       main
  329.            
  330.            
  331. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  332. ;;;OffsetCamera ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  333. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  334. ;Finds the correct camera position based on player position   ;
  335. ;-------------------------------------------------------------;
  336. ;       r1  <-  PlayerX                                       ;
  337. ;       r2  <-  PlayerY                                       ;
  338. ;       Returns - CamX in r1, CamY in r2. Also saves.         ;
  339. ;-------------------------------------------------------------;
  340. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  341.             .seg    ram
  342. ;CamMaxX        .word   10#288      ;currently hard-coded for a 32x22 tile map, fix later.
  343. ;CamMaxY        .word   10#192      ;technically instantly fixed by writing over it in the map loader.
  344. ;TODO: WRITE THIS FUNCTION
  345.  
  346. ;CUR_FRAME  .word   0
  347. FRAME_DELAY .space  4
  348. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  349. ;;;animatePlayer ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  350. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  351. ;Cycles player animation                                      ;
  352. ;-------------------------------------------------------------;
  353. ;       uses: Nothing!                                        ;
  354. ;-------------------------------------------------------------;
  355. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  356.             .seg    program
  357. ap_r31      .equ    -4
  358. ap_r1       .equ    -8
  359. ap_r2       .equ    -12
  360. ap_r3       .equ    -16
  361. ap_r4       .equ    -20
  362. ap_r7       .equ    -24
  363. ap_len      .equ    28
  364.  
  365. animatePlayer   addi    r30,r30,ap_len
  366.                 sw      ap_r31(r30),r31
  367.                 sw      ap_r1(r30),r1
  368.                 sw      ap_r2(r30),r2
  369.                 sw      ap_r3(r30),r3
  370.                 sw      ap_r4(r30),r4
  371.                 sw      ap_r7(r30),r7
  372.                 lw      r3,FRAME_DELAY-RAM(r28)     ;frame delay is like
  373.                 addi    r3,r3,1
  374.                 sw      FRAME_DELAY-RAM(r28),r3
  375.                 andi    r4,r3,2#11          ;otherwise we go through all that bs to show the same frame
  376.                 ;bnez   r4,ap_end           ;even when the frame is being delayed
  377.                 lw      r7,DMA_OFFSET                  
  378.                 srai    r3,r3,1             ;by shifting right by 1, we give a frame delay of 2 cycles
  379.                 andi    r3,r3,2#11          ;cut off any overflow to loop animation
  380.                 ;lw     r1,CUR_FRAME
  381.                 lw      r2,P_BASE_FRAME-RAM(r28)
  382.                 andi    r4,r3,2#01          ;if it's an odd frame
  383.                 bnez    r4,ap_notodd
  384.                 ;addi   r4,r0,2#11000000
  385.                 ;sb     INSTANCE(r7),r4
  386.                 sb      INSTIMG(r7),r2
  387.                 j       ap_end
  388. ap_notodd       subi    r1,r2,8             ;if the base frame offset is 8, we're sideways
  389.                 beqz    r1,ap_side         
  390.                 addi    r2,r2,2             ;otherwise... inc frame counter
  391.                 sb      INSTIMG(r7),r2      ;use the second frame
  392.                 andi    r4,r3,2#10          ;see whether we're on frame 2 or 4
  393.                 bnez    r4,ap_frame4
  394.                 addi    r4,r0,2#11000000    ;use unflipped sprite on frame 2
  395.                 sb      INSTANCE(r7),r4
  396.                 j       ap_end
  397. ap_frame4       addi    r4,r0,2#11100000    ;use flipped sprite on frame 4
  398.                 sb      INSTANCE(r7),r4
  399.                 j       ap_end
  400. ap_side         andi    r4,r3,2#10          ;frame 2 or 4?
  401.                 bnez    r4,ap_sf4
  402.                 addi    r2,r2,2
  403.                 sb      INSTIMG(r7),r2
  404.                 j       ap_end
  405. ap_sf4          addi    r2,r2,4
  406.                 sb      INSTIMG(r7),r2
  407. ap_end          lw      r31,ap_r31(r30)
  408.                 lw      r1,ap_r1(r30)
  409.                 lw      r2,ap_r2(r30)
  410.                 lw      r3,ap_r3(r30)
  411.                 lw      r4,ap_r4(r30)
  412.                 lw      r7,ap_r7(r30)
  413.                 subi    r30,r30,ap_len
  414.                 jr      r31
  415.  
  416.  
  417. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  418. ;;;setPlayerDir ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  419. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  420. ;Faces the player sprite in the right direction               ;
  421. ;-------------------------------------------------------------;
  422. ;       uses: Nothing!                                        ;
  423. ;-------------------------------------------------------------;
  424. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  425. spd_r31         .equ    -4
  426. spd_r1          .equ    -8
  427. spd_r2          .equ    -12
  428. spd_r3          .equ    -16
  429. ;spd_r4         .equ    -20
  430. spd_r7          .equ    -24
  431. spd_len         .equ    28
  432.  
  433.                 .seg    ram
  434. P_BASE_FRAME    .space  4
  435. P_OLD_DIR       .space  4
  436.  
  437.                 .seg    program
  438. setPlayerDir    addi    r30,r30,spd_len
  439.                 sw      spd_r31(r30),r31
  440.                 sw      spd_r1(r30),r1
  441.                 sw      spd_r2(r30),r2
  442.                 sw      spd_r3(r30),r3
  443.                 ;sw     spd_r4(r30),r4
  444.                 sw      spd_r7(r30),r7
  445.                 lw      r7,DMA_OFFSET
  446.                 lw      r1,PDir-RAM(r28)
  447.                 lw      r2,P_OLD_DIR-RAM(r28)
  448.                 sub     r2,r2,r1
  449.                 beqz    r2,spd_skip
  450.                 sw      P_OLD_DIR-RAM(r28),r1   ;THIS FREEZES ERRYTHING
  451.                 slai    r1,r1,2         ;multiply by 4 to make into a jumptable offset
  452.                 lw      r1,spd_jtp(r1)  ;load jump table
  453.                 jr      r1
  454. spd_left        addi    r2,r0,8
  455.                 sb      INSTIMG(r7),r2
  456.                 addi    r3,r0,2#11000000
  457.                 sb      INSTANCE(r7),r3
  458.                 j       spd_end
  459. spd_right       addi    r2,r0,8
  460.                 sb      INSTIMG(r7),r2
  461.                 addi    r3,r0,2#11100000
  462.                 sb      INSTANCE(r7),r3
  463.                 j       spd_end
  464. spd_up          addi    r2,r0,4
  465.                 sb      INSTIMG(r7),r2
  466.                 j       spd_end
  467. spd_down        addi    r2,r0,0
  468.                 sb      INSTIMG(r7),r2
  469. spd_end         sw      P_BASE_FRAME-RAM(r28),r2
  470. spd_skip        lw      r1,spd_r1(r30)
  471.                 lw      r2,spd_r2(r30)
  472.                 lw      r3,spd_r3(r30)
  473.                 ;lw     r4,spd_r4(r30)
  474.                 lw      r7,spd_r7(r30)
  475.                 lw      r31,spd_r31(r30)
  476.                 subi    r30,r30,spd_len
  477.                 jr      r31
  478.  
  479. ;jump table for directional drawing
  480. spd_jtp         .word   spd_left
  481. spd_jtp1        .word   spd_right
  482. spd_jtp2        .word   spd_up
  483. spd_jtp3        .word   spd_down
  484.                
  485.                 .seg    ram
  486. PDir            .space  4
  487.                 .seg    program
  488. PDIR_L          .equ    2#00
  489. PDIR_R          .equ    2#01
  490. PDIR_U          .equ    2#10
  491. PDIR_D          .equ    2#11
  492. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  493. ;;;requestMove ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  494. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  495. ;Takes dpad input and tries to move the player                ;
  496. ;-------------------------------------------------------------;
  497. ;   r1      <-      dpad horizontal                           ;
  498. ;   r2      <-      dpad vertical                             ;
  499. ;-------------------------------------------------------------;
  500. ;TODO: Currently this just checks if we're on the edge and    ;
  501. ;      rejects the move in that case. Add a thing to it to    ;
  502. ;      make it interract with pathing maps.                   ;
  503. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  504.             .seg    program
  505. rm_r1       .equ    -4
  506. rm_r2       .equ    -8
  507. rm_r3       .equ    -12
  508. rm_r4       .equ    -16
  509. rm_r5       .equ    -20
  510. rm_r6       .equ    -24
  511. rm_r7       .equ    -28
  512. rm_r8       .equ    -32
  513. rm_r31      .equ    -36
  514. rm_len      .equ    40
  515.  
  516. requestMove addi    r30,r30,rm_len
  517.             sw      rm_r1(r30),r1       ;backup registers
  518.             sw      rm_r2(r30),r2
  519.             sw      rm_r3(r30),r3
  520.             sw      rm_r4(r30),r4
  521.             sw      rm_r5(r30),r5
  522.             sw      rm_r6(r30),r6
  523.             sw      rm_r7(r30),r7
  524.             sw      rm_r8(r30),r8
  525.             sw      rm_r31(r30),r31
  526.             bnez    r1,rm_h         ;h gets priority because yolo.
  527.             bnez    r2,rm_v
  528.             j       rm_end          ;this should never get triggered but, just in case!
  529. rm_h        lw      r3,PlayerX-RAM(r28)     ;load player's current x position (in tiles)
  530.             andi    r8,r1,2#10
  531.             beqz    r8,rm_right     ;this tests if the controller direction is negative, aka left
  532.             addi    r8,r0,PDIR_L    ;save
  533.             sw      PDir-RAM(r28),r8
  534.             j       rm_h_cont
  535. rm_right    addi    r8,r0,PDIR_R
  536.             sw      PDir-RAM(r28),r8
  537. rm_h_cont   add     r3,r3,r1        ;r3<-proposed new player x
  538.             slti    r7,r3,1         ;if(PlayerX+dpad_h<0){
  539.             bnez    r7,rm_end       ;   return;}                        //THIS SECTION REJECTS THE REQUEST
  540.             lw      r5,LAY_1_WIDTH  ;r5 <-  map width                   //IF IT WOULD PLACE THE PLAYER OUT OF
  541.             subi    r5,r5,1         ;sub 1 so we stay on the map intead of going outside
  542.             sgt     r7,r3,r5        ;if(PlayerX+dpad_h>map width){      //THE BOUNDS OF THE CURRENT MAP
  543.             bnez    r7,rm_end       ;   return;}
  544.             sb      WalkH-RAM(r28),r1
  545.             sb      WalkV-RAM(r28),r0
  546.             sw      PlayerX-RAM(r28),r3
  547.             j       rm_finishup
  548. rm_v        lw      r4,PlayerY-RAM(r28)
  549.             andi    r8,r2,2#10
  550.             beqz    r8,rm_down      ;this tests if the controller direction is negative, aka up
  551.             addi    r8,r0,PDIR_U    ;save
  552.             sw      PDir-RAM(r28),r8
  553.             j       rm_v_cont
  554. rm_down     addi    r8,r0,PDIR_D
  555.             sw      PDir-RAM(r28),r8
  556. rm_v_cont   add     r4,r4,r2
  557.             slti    r7,r4,1
  558.             bnez    r7,rm_end
  559.             lw      r5,LAY_1_HEIGHT
  560.             subi    r5,r5,1
  561.             sgt     r7,r4,r5
  562.             bnez    r7,rm_end
  563.             sb      WalkH-RAM(r28),r0
  564.             sb      WalkV-RAM(r28),r2
  565.             sw      PlayerY-RAM(r28),r4
  566. rm_finishup addi    r1,r0,10#16
  567.             sw      WalkCounter-RAM(r28),r1
  568. rm_end      lw      r1,rm_r1(r30)       ;restore registers
  569.             lw      r2,rm_r2(r30)
  570.             lw      r3,rm_r3(r30)
  571.             lw      r4,rm_r4(r30)
  572.             lw      r5,rm_r5(r30)
  573.             lw      r6,rm_r6(r30)
  574.             lw      r7,rm_r7(r30)
  575.             lw      r8,rm_r8(r30)
  576.             lw      r31,rm_r31(r30)
  577.             subi    r30,r30,rm_len
  578.             jr      r31
  579.            
  580.  
  581.            
  582. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  583. ;;;scrollMap ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  584. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  585. ;Takes an x and y value to scroll the map by.                 ;
  586. ;-------------------------------------------------------------;
  587. ;   r1  x   <- how far to move the map horizontally           ;
  588. ;   r2  y   <- aaand vertically                               ;
  589. ;-------------------------------------------------------------;
  590. ;Uses:                                                        ;
  591. ;r1,r2                                                        ;
  592. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  593.             .seg    ram
  594. mapX        .space  4
  595. mapY        .space  4
  596.             .seg    program
  597. ;Temp values
  598. sm_r3       .equ    -4
  599. sm_r4       .equ    -8
  600. sm_r5       .equ    -12
  601. ;sm_r6      .equ    -16
  602. ;sm_r7      .equ    -20
  603. sm_r31      .equ    -24
  604. sm_len      .equ    28
  605.  
  606. scrollMap   addi    r30,r30,sm_len
  607.             sw      sm_r3(r30),r3
  608.             sw      sm_r4(r30),r4
  609.             sw      sm_r5(r30),r5
  610.             ;sw     sm_r6(r30),r6
  611.             ;sw     sm_r7(r30),r7
  612.             sw      sm_r31(r30),r31
  613.             lw      r3,mapX-RAM(r28)
  614.             ;seq        r5,r1,r3            ;TODO: FIX THIS SECTION, IT FOR SOME REASON IGNORES Y UPDATES ATM
  615.             ;beqz   r5,smchanged
  616.             lw      r4,mapY-RAM(r28)
  617.             ;seq        r5,r2,r4
  618.             ;beqz   r5,scrollend
  619. smchanged   sw      mapX-RAM(r28),r1        ;store the new map values because the map blitter will eat them
  620.             sw      mapY-RAM(r28),r2
  621.             addui   r1,r0,LAY_0 ;load the pointer for layer 0, this is temp until we're storing current map somewhere.
  622.             ;add        r3,r0,r2    ;shuffle x and y into r2 and r3 to set up to call our function
  623.             ;add        r2,r0,r1
  624.             lw      r2,mapX-RAM(r28)
  625.             lw      r3,mapY-RAM(r28)
  626.             addui   r4,r0,0     ;we'll probably replace this with a method for blitting active layers soon(tm)
  627.             jal     loadMap
  628. scrollend   lw      r3,sm_r3(r30)
  629.             lw      r4,sm_r4(r30)
  630.             lw      r5,sm_r5(r30)
  631.             ;lw     r6,sm_r6(r30)
  632.             ;lw     r7,sm_r7(r30)
  633.             lw      r31,sm_r31(r30)
  634.             subi    r30,r30,sm_len
  635. scrollfend  jr      r31
  636.  
  637. ;;TODO: Reorder this so it uses r1 for x, r2 for y, r3 for source.
  638. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  639. ;;;loadMap ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  640. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  641. ;   Fills a whole map buffer from memory using an offset      ;
  642. ;-------------------------------------------------------------;
  643. ;   r1  Source <- start of map data in memory   (length)      ;
  644. ;   r2  x      <- x offset tiles                              ;
  645. ;   r3  y      <- y offset tiles                              ;
  646. ;   r4  layer  <- which layer to draw to                      ;
  647. ;-------------------------------------------------------------;
  648. ;   Uses:   r1,r2,r3,r4                                       ;
  649. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  650. lm_r5       .equ    -4
  651. lm_r6       .equ    -8
  652. lm_r7       .equ    -12
  653. lm_r8       .equ    -16
  654. lm_retaddr  .equ    -20
  655. lm_psw      .equ    -24
  656. lm_len      .equ    28
  657.  
  658. MAP_LENGTH  .equ    16#0        ;these are offsets from the map data in memory
  659. MAP_WIDTH   .equ    16#4        ;assuming the map was exported from the supergamebabby editor tool
  660. MAP_HEIGHT  .equ    16#8
  661. MAP_DATA    .equ    16#c
  662.  
  663. loadMap     addi    r30,r30,lm_len
  664.             sw      lm_r5(r30),r5       ;save registers we're gonna use
  665.             sw      lm_r6(r30),r6
  666.             sw      lm_r7(r30),r7
  667.             sw      lm_r8(r30),r8
  668.             sw      lm_retaddr(r30),r31 ;so we can get back where we came from
  669.             lw      r5,IRQ_NOMOVE
  670.             movi2s  psw,r5
  671.             clr     r6                  ;r6 <- offset
  672.             lw      r7,MAP_WIDTH(r1)    ;r7 <- map_width
  673.             add     r7,r7,r7            ;r7*=2; //so we can add it each loop
  674.             addui   r8,r0,10#16         ;r8 <- buffer_length //we'll use this to load all the rows
  675. lm_ymult    beqz    r3,lm_xadd          ;while(y){
  676.             add     r6,r6,r7            ;   offset+=16;
  677.             subui   r3,r3,1             ;   y--;
  678.             j       lm_ymult            ;}
  679. lm_xadd     add     r2,r2,r2            ;x+=x; //double so we get the offset right
  680.             add     r6,r6,r2            ;offset+=x;
  681.             ;add        r6,r6,r6            ;offset*=2; //double offset because we're working with halfwords
  682.             clr     r2                  ;make way for dest point
  683. lm_dstmult  beqz    r4,lm_tsetup        ;while(layerchoice){
  684.             addui   r2,r0,10#256        ;   layeroffset+=256
  685.             subui   r4,r4,1             ;   layerchoice--;
  686.             j       lm_dstmult          ;}
  687. lm_tsetup   add     r2,r2,r2            ;layeroffset*=2 //again, double offset
  688.             addui   r2,r2,TILE          ;layeroffset+=TILE_DATA_OFFSET; //the draw destination
  689.             addui   r3,r0,10#32         ;draw_length = 16*2; //we can only draw one row at a time
  690.             addui   r1,r1,MAP_DATA      ;get the pointer to the data of the map
  691.             add     r1,r1,r6            ;map pointer+=offset
  692. lm_tloop    beqz    r8,lm_end           ;while(buffer_length){
  693.             add     r5,r0,r1            ;   //StartDMA kills r1, gotta save it
  694.             jal     StartDMA            ;   StartDMA(from, to, length)
  695.             add     r1,r0,r5            ;   //and restore
  696.             add     r1,r1,r7            ;   draw_offset+=map_width //this puts us onto the next line
  697.             addui   r2,r2,10#32         ;   layer_offset+= 16*2; //Gotta draw to the next line too
  698.             subi    r8,r8,1             ;   buffer_length--;
  699.             j       lm_tloop            ;}
  700. lm_end      lw      r5,lm_r5(r30)       ;restore registers
  701.             lw      r6,lm_r6(r30)
  702.             lw      r7,lm_r7(r30)
  703.             lw      r8,lm_r8(r30)
  704.             lw      r31,lm_retaddr(r30)     ;restore return address
  705.             subi    r30,r30,lm_len
  706.             jr      r31
  707.            
  708. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  709. ;;;StartDMA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  710. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  711. ;   Starts a DMA transfer to the GPU, then sleeps the CPU     ;
  712. ;   until the transfer completes.                             ;
  713. ;   TODO: Rewrite this to use the stack so that we can queue  ;
  714. ;         multiple transfers and have the CPU continue        ;
  715. ;         working inbetween them.                             ;
  716. ;-------------------------------------------------------------;
  717. ;   r1  Source <- Absolute start address of transfer data     ;
  718. ;   r2  Dest   <- Destination address IN GPU of transfer      ;
  719. ;   r3  Length <- Length of data block in BYTES               ;
  720. ;-------------------------------------------------------------;
  721. ;   Uses:   r1,r2,r3,r15                                      ;
  722. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  723. sdma_r31    .equ    -4
  724. sdma_len    .equ    10#4
  725.             .seg    program
  726. StartDMA    addi    r30,r30,sdma_len
  727.             sw      sdma_r31(r30),r31
  728.             lw      r15,DMA_OFFSET(r0)  ;use the offset since it's too long
  729.             sw      DMASRC(r15),r1      ;set the source
  730.             sw      DMADST(r15),r2      ;Set the destination
  731.             sw      DMALEN(r15),r3      ;set the length
  732.             lw      r1,IRQ_NOMOVE(r0)
  733.             movi2s  psw,r1              ;enable interrupts
  734.             addi    r1,r0,1    
  735. DMAWait     beqz    r1,DMAEnd           ;lol this completely defeats the purpose of interrupt requests
  736.             sb      DMA_GO(r15),r1      ;GO!
  737.             wait
  738.             j       DMAWait
  739. DMAEnd      lw      r31,sdma_r31(r30)
  740.             subi    r30,sdma_len
  741.             jr      r31                 ;and we're done!
  742.            
  743. DMAComp     clr     r1
  744.             rfe    
  745.            
  746.            
  747. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  748. ;;;Modulo;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  749. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  750. ;   Compute the modulo of x%y, return result and remainder    ;
  751. ;-------------------------------------------------------------;
  752. ;   r1  x                                                     ;
  753. ;   r2  y                                                     ;
  754. ;-------------------------------------------------------------;
  755. ;   Returns:    r1  <-  x%y                                   ;
  756. ;               r2  <-  remainder                             ;
  757. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  758. mod_r3      .equ    -4
  759. mod_r4      .equ    -8
  760. mod_r5      .equ    -12
  761. mod_r31     .equ    -16
  762. mod_len     .equ    10#20
  763.             .seg    program
  764.            
  765. Modulo      addi    r30,r30,mod_len
  766.             sw      mod_r3(r30),r3
  767.             sw      mod_r4(r30),r4
  768.             sw      mod_r5(r30),r5
  769.             sw      mod_r31(r30),r31
  770.             clr     r4
  771. mod_loop    sub     r3,r1,r2
  772.             slti    r5,r3,0
  773.             bnez    r5,mod_end
  774.             addi    r4,r4,1
  775.             addi    r1,r3,0
  776.             j       mod_loop
  777. mod_end     add     r2,r3,r2
  778.             add     r1,r0,r4
  779.             ;add        r11,r0,r1 ;debug
  780.             ;add        r12,r0,r2 ;debug
  781.             lw      r3,mod_r3(r30)
  782.             lw      r4,mod_r4(r30)
  783.             lw      r5,mod_r5(r30)
  784.             lw      r31,mod_r31(r30)
  785.             subi    r30,r30,mod_len
  786.             jr      r31
  787.            
  788. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  789. ;;;Mod16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  790. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  791. ;   Compute the modulo of x%16, return result and remainder   ;
  792. ;-------------------------------------------------------------;
  793. ;   r1  x                                                     ;
  794. ;-------------------------------------------------------------;
  795. ;   Returns:    r1  <-  quotient                              ;
  796. ;               r2  <-  remainder                             ;
  797. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;    
  798. mod16_r3        .equ    -4
  799. mod16_r4        .equ    -8
  800. mod16_r5        .equ    -12
  801. mod16_r31       .equ    -16
  802. mod16_len       .equ    20
  803.  
  804. Mod16       addi    r30,r30,mod16_len
  805.             sw      mod16_r31(r30),r31
  806.             sw      mod16_r3(r30),r3
  807.             andi    r2,r1,10#15     ;remainder
  808.             sub     r1,r1,r2        ;x -= x%16
  809.             srai    r3,r1,31        ;r1= abs(r1)
  810.             xor     r1,r1,r3
  811.             sub     r1,r1,r3
  812.             srai    r1,r1,10#4      ;x /= 16
  813.             lw      r31,mod16_r31(r30)
  814.             lw      r3,mod16_r3(r30)
  815.             subi    r30,r30,mod16_len
  816.             jr      r31
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement