Advertisement
Nightseeker

GameHut4 split source

Mar 10th, 2020
1,459
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. GAMEHUT.S
  2. TIMING      EQU 0
  3. ;----------------------------------------------------------
  4. ;       GAMEHUT SHELL
  5. ;       BY JON BURTON - AUG 2018
  6. ;----------------------------------------------------------
  7.         INCLUDE SYSTEM.S        ;INCLUDES LOTS OF SYSTEM CODE TO MAKE ALL THIS POSSIBLE
  8.         INCLUDE RINGS.S
  9.         INCLUDE FLAME.S
  10. USERRAM:    EQU FLAMEEND
  11. ;----------------------------------------------------------
  12. ;       VRAM MEMORY MAP IN HEXADECIMAL
  13. ;       (NOTE: CHARACTERS ARE 8 X 8 PIXEL BLOCKS)
  14. ;----------------------------------------------------------
  15. ;       $0000-$0020         BLANK CHARACTER
  16. ;       $0020-$8000         CHARACTERS FOR PLAYFIELDS AND SPRITES
  17. ;       $C000-$D000         CHARACTER MAP FOR PLAYFIELD 1 (4096 BYTES)
  18. ;       $E000-$F000         CHARACTER MAP FOR PLAYFIELD 2 (4096 BYTES)
  19. ;       $F800               SPRITE TABLE (960 BYTES)
  20.  
  21. ;----------------------------------------------------------
  22. ;       USER VARIABLES
  23. ;       - PUT ANY VARIABLES YOU NEED HERE
  24. ;----------------------------------------------------------
  25.         RSSET   USERRAM
  26. PLAYX:      RS.L    0
  27. PLAY1X:     RS.W    1           ;X POSITION OF PLAYFIELD 1
  28. PLAY2X:     RS.W    1           ;X POSITION OF PLAYFIELD 2
  29. PLAYY:      RS.L    0
  30. PLAY1Y:     RS.W    1           ;Y POSITION OF PLAYFIELD 1
  31. PLAY2Y:     RS.W    1           ;Y POSITION OF PLAYFIELD 2
  32. SONICX:     RS.W    1           ;SONIC'S X POSITION
  33. SONICY:     RS.W    1           ;SONIC'S Y POSITION
  34. SONICD:     RS.W    1           ;SONIC'S DIRECTION
  35. TEMPSCREEN: RS.B    4096            ;RAM TO BUILD TEMPORARY SCREEN MAP
  36. ENDVARS:    RS.B    0
  37.  
  38. ;----------------------------------------------------------
  39. ;       INITIALISE USER STUFF
  40. ;       - THIS IS WHERE YOU SET UP STUFF BEFORE YOU BEGIN
  41. ;----------------------------------------------------------
  42. USERINIT:   MOVE.W  #0,PLAY1X       ;SET START PLAYFIELD 1 X POSITION TO ZERO
  43.         MOVE.W  #0,PLAY1Y       ;SET START PLAYFIELD 1 Y POSITION TO ZERO
  44.  
  45.         DMADUMP MAPGFX,4*32,$820    ;DUMP 4 CHARACTERS (SIZE 32 BYTES EACH) TO VRAM LOCATION $820 (MAP GRAPHICS)
  46.         DMADUMP SPRITEGFX,8*32,$1000    ;DUMP 8 CHARACTERS (SIZE 32 BYTES EACH) TO VRAM LOCATION $1000 (SPRITE GRAPHICS)
  47.         DMADUMP RINGGFX,4*32,$1000+$100 ;DUMP 8 CHARACTERS (SIZE 32 BYTES EACH) TO VRAM LOCATION $1100 (SPRITE GRAPHICS, AFTER SONIC)
  48.  
  49.         LEA.L   TEMPSCREEN,A0       ;POINT A0 TO TEMPORARY BUFFER IN RAM TO BUILD MAP BEFORE WE COPY TO VRAM
  50.         MOVE.W  #8-1,D3         ;WE'LL MAKE 8 COPIES OF THIS PATTERN
  51. @L4:        LEA.L   CHARGFX,A1      ;POINT A1 TO CHARGFX, WHICH IS THE 8 CHARACTER X 4 CHARACTER PATTERN WE'LL COPY MULITPLE TIMES
  52.         MOVE.W  #4-1,D1         ;4 ROWS
  53. @L3:        MOVE.W  #8-1,D0         ;COPY EACH ROW REPEATED ACROSS THE SCREEN 8 TIMES HORIZONTALLY
  54. @L2:        MOVE.W  #4-1,D2         ;4 LONG-WORDS = 8 CHARACTERS WIDE
  55. @L1:        MOVE.L  (A1)+,(A0)+     ;COPY FROM CHARGFX TO THE TEMPSCREEN. THE + MEANS INCREMENT THE POINTERS
  56.         DBRA    D2,@L1          ;LOOP BACK TO @L1
  57.         SUB.L   #16,A1          ;POINT BACK TO THE START OF THE CURRENT CHARGFX ROW
  58.         DBRA    D0,@L2          ;LOOP BACK TO @L2
  59.         ADD.L   #16,A1          ;MOVE ONTO THE NEXT CHARGFX ROW
  60.         DBRA    D1,@L3          ;LOOP BACK TO @L3
  61.         DBRA    D3,@L4          ;LOOP BACK TO @L4
  62.  
  63.         DMADUMP TEMPSCREEN,4096,$C000   ;COPY TEMPSCREEN WHICH IS 4096 BYTES IN SIZE TO VRAM ADDRESS $C000
  64.  
  65.         LEA.L   PALETTE1,A0     ;DOWNLOAD A PALETTE FOR THE MAP TO USE
  66.         BSR SETPAL1         ;OVERRIGHT FIRST PALETTE
  67.  
  68.         LEA.L   PALETTE2,A0     ;DOWNLOAD A PALETTE FOR THE SPRITES TO USE
  69.         BSR SETPAL2         ;OVERRIGHT SECOND PALETTE
  70.  
  71.         MOVE.W  #$80+160-8,SONICX   ;SONIC'S X START POSITION
  72.         MOVE.W  #$80+112-13,SONICY  ;SONIC'S Y START POSITION
  73.         MOVE.W  #0,SONICD       ;SONIC'S START DIRECTION
  74.  
  75.         JSR INITFLAME
  76.         JSR RINGINIT
  77.  
  78.         JSR DUMPCOLS        ;COPY ALL PALETTES TO CRAM (COLOUR RAM)
  79.  
  80.         RTS
  81.  
  82. ;------------------------------
  83. ;   MAIN GAME LOOP
  84. ;------------------------------
  85. MAIN:       WAITVBI                 ;WAITS FOR THE START OF THE NEXT FRAME
  86.         IF  TIMING
  87.         WDEST   CRAMW,$0000         ;COLOUR TIMING BAR
  88.         MOVE.W  #$000F,VDP_DATA         ;IN RED
  89.         ENDC
  90.  
  91.         JSR DRAWFLAME
  92.  
  93.         ADD.W   #1,PLAY1X           ;SCROLL PLAYFIELD 1 RIGHT BY ONE PIXEL
  94.         ADD.W   #1,PLAY1Y           ;SCROLL PLAYFIELD 1 UP BY ONE PIXEL
  95. ;ADD SPRITES
  96.         LEA.L   SPRITETEMP,A1           ;POINT TO TEMPORARY MEMORY TO BUILD SPRITE LIST
  97.         MOVE.W  #1,D7               ;SPRITE NUMBER
  98. ;FIRST SONIC
  99.         MOVE.W  SONICY,(A1)+            ;Y POSITION ($80 IS TOP OF SCREEN)
  100.         MOVE.W  #S_2X4,D0           ;SIZE 2X4 CHARACTERS
  101.         ADD.W   D7,D0               ;ADD CURRENT SPRITE NUMBER
  102.         MOVE.W  D0,(A1)+            ;WRITE TO SPRITE TABLE
  103.         MOVE.W  #S_PAL2+$1000/32,D0     ;PALETTE NUMBER+GRAPHIC VRAM LOCATION/32
  104.         ADD.W   SONICD,D0           ;ADD SONIC'S DIRECTION
  105.         MOVE.W  D0,(A1)+            ;WRITE TO SPRITE TABLE
  106.         MOVE.W  SONICX,(A1)+            ;X POSITION ($80 IS LEFT OF SCREEN)
  107.  
  108.         ADDQ.W  #1,D7               ;MOVE ON TO NEXT SPRITE NUMBER
  109.  
  110.         JSR PROCRING            ;ADD ANY RINGS TO SPRITELIST
  111.                             ;A1=POINTER TO NEXT SPRITE ENTRY
  112.                             ;D7=NEXT SPRITE NUMBER
  113.  
  114. ;FINISHED ADDING SPRITES
  115.         MOVE.L  #$10000,(A1)+           ;TERMINATE SPRITE LIST
  116.         MOVE.L  #1,(A1)+            ;   "  "
  117.  
  118.         JSR CONVFLAME
  119.  
  120. ;MOVE SONIC
  121.         BTST    #J_RIGHT,JOYPAD0
  122.         BNE.S   @MOVE1
  123.         ADD.W   #1,SONICX
  124.         MOVE.W  #0,SONICD
  125. @MOVE1:
  126.         BTST    #J_LEFT,JOYPAD0
  127.         BNE.S   @MOVE2
  128.         SUB.W   #1,SONICX
  129.         MOVE.W  #$800,SONICD
  130. @MOVE2:
  131.         BTST    #J_DOWN,JOYPAD0
  132.         BNE.S   @MOVE3
  133.         ADD.W   #1,SONICY
  134. @MOVE3:
  135.         BTST    #J_UP,JOYPAD0
  136.         BNE.S   @MOVE4
  137.         SUB.W   #1,SONICY
  138. @MOVE4:
  139.         BTST    #J_BUT_A,JOYPAD0
  140.         BNE.S   @NORING
  141. ;ADD A RING
  142.         MOVE.W  SONICX,D3           ;X POS
  143.         MOVE.W  SONICY,D4           ;Y POS
  144.         JSR GETRANDOM           ;RETURNS A RANDOM NUMBER FROM 0-255 IN REGISTER D0
  145.         MOVE.L  D0,D5
  146.         EXT.W   D5              ;NUMBER FROM -126 TO +127
  147.         SWAP    D5              ;ADDS PRECISION
  148.         ASR.L   #6,D5               ;REMOVE A BIT OF PRECISION - X MOMENTUM
  149.         JSR GETRANDOM           ;RETURNS A RANDOM NUMBER FROM 0-255 IN REGISTER D0
  150.         MOVE.L  D0,D6
  151.         EXT.W   D6              ;NUMBER FROM -126 TO +127
  152.         SWAP    D6              ;ADDS PRECISION
  153.         ASR.L   #6,D6               ;REMOVE A BIT OF PRECISION
  154.         ADD.L   #-$30000,D6         ;Y MOMENTUM
  155.         MOVE.L  #$1000,D7           ;GRAVITY
  156.         JSR ADDRING
  157.  
  158. @NORING:
  159.         IF  TIMING
  160.         WDEST   CRAMW,$0000
  161.         MOVE.W  #$0000,VDP_DATA
  162.         ENDC
  163.         BRA MAIN                ;LOOP BACK TO WAIT FOR NEXT FRAME
  164.  
  165. ;----------------------------------------------------------
  166. ;       USER VBI ROUTINES
  167. ;       - PUT TIME CRITICAL CODE THAT MUST CALLED DURING THE VERTICAL BLANK HERE
  168. ;----------------------------------------------------------
  169. USERVBI:    LEA.L   VDP_DATA,A1
  170.         LEA.L   VDP_CONTROL,A2
  171. ;SET HORIZONTAL OFFSETS
  172.         MOVE.L  #$7C000003,(A2)
  173.         MOVE.L  PLAYX,(A1)      ;THIS TELLS THE VDP (VISUAL DISPLAY PROCESSOR) WHAT X POSITION THE PLAYFIELDS SHOULD BE AT
  174.  
  175. ;SET VERTICAL OFFSETS
  176.         MOVE.L  #$40000010,(A2)     ;THIS TELLS THE VDP WHAT Y POSITION THE PLAYFIELDS SHOULD BE AT
  177.         MOVE.L  PLAYY,(A1)
  178.  
  179. ;COPY SPRITE TABLE TO VRAM
  180.         JSR SPRITEDUMP
  181. ;READ JOYPAD
  182.         BSR READJOY         ;READ THE JOYPAD
  183.  
  184.         RTS
  185.  
  186. ;----------------------------------------------------------
  187. ;       PUT DATA BELOW HERE
  188. ;----------------------------------------------------------
  189.  
  190. ;----------------------------------------------------------
  191. ;       CHARACTER CODES TO BUILD OUR PATTERN
  192. ;
  193. ;       THE CODE IS IN THE FORMAT $NNNN
  194. ;
  195. ;       THE LAST TWO NUMBERS ($00NN) REFER TO THE CHARACTER NUMBER IN VRAM TO USE
  196. ;       (THE CHARACTER NUMBER IS THE VRAM ADDRESS DIVIDED BY 32 (OR DIVIDED BY $20 HEXADECIMAL))
  197. ;
  198. ;       IF THE FIRST NUMBER  ($N000) IS '1' IT MEANS MIRROR THE CHARACTER VERTICALLY
  199. ;       IF THE SECOND NUMBER ($0N00) IS '8' IT MEANS MIRROR THE CHARACTER HORIZONTALLY
  200. ;
  201. ;       SO WHEN WE HAVE A DIAGONAL CHARACTER LINE THIS - / WE CAN MIRROR IT TO GET THIS \
  202. ;       SO WE CAN BUILD THIS - /\
  203. ;                      \/   USING ONE DIAGONAL AND MIRRORING
  204. ;----------------------------------------------------------
  205. CHARGFX     incbin  Uncompressed\Mapunc_CHARGFX.bin
  206.  
  207. ;----------------------------------------------------------
  208. ;       MAP GRAPHICS
  209. ;----------------------------------------------------------
  210. MAPGFX      incbin  Uncompressed\Artunc_MAPGFX.smd
  211.  
  212. ;----------------------------------------------------------
  213. ;       SPRITE GRAPHICS
  214. ;       2 X 4 CHARACTERS ARRANGED AS FOLLOWS -
  215. ;
  216. ;       1 5
  217. ;       2 6
  218. ;       3 7
  219. ;       4 8
  220. ;----------------------------------------------------------
  221. SPRITEGFX   incbin  Uncompressed\Artunc_SPRITEGFX.smd
  222.  
  223. ;----------------------------------------------------------
  224. RINGGFX     incbin  Uncompressed\Artunc_RINGGFX.smd
  225.  
  226. ;----------------------------------------------------------
  227. ;       USER PALETTES
  228. ;----------------------------------------------------------
  229. PALETTE1    incbin  Palettes\pallet1.bin
  230.  
  231. PALETTE2    incbin  Palettes\pallet2.bin
  232.  
  233. PALETTE3    incbin  Palettes\pallet3.bin
  234.  
  235. SYSTEM.S
  236. ;----------------------------------------------------------
  237. ;       REGISTER EQUATES
  238. ;----------------------------------------------------------
  239. Z80REQ:     EQU $A11100
  240. Z80RES:     EQU $A11200
  241. Z80RAM:     EQU $A00000
  242.  
  243. B4:     EQU 1<<4
  244. B30:        EQU 1<<30
  245.  
  246. VDP_DATA:   EQU $FFC00000
  247. VDP_STATUS: EQU $FFC00004
  248. VDP_CONTROL:    EQU $FFC00004
  249.  
  250. VRAMW:      EQU %01*B30+%0000*B4
  251. CRAMW:      EQU %11*B30+%0000*B4
  252. VSRAMW:     EQU %01*B30+%0001*B4
  253. VRAMR:      EQU %00*B30+%0000*B4
  254. CRAMR:      EQU %00*B30+%0010*B4
  255. VSRAMR:     EQU %00*B30+%0001*B4
  256.  
  257. ;DMA MEMORY BLOCK DESTINATIONS
  258. DMAVRAM:    EQU %01*B30+%1000*B4
  259. DMACRAM:    EQU %11*B30+%1000*B4
  260. DMAVSRAM:   EQU %01*B30+%1001*B4
  261.  
  262. STACK_SIZE: EQU 1024
  263.  
  264.         RSSET   $FFFF0000
  265. WORKRAM:    RS.B    STACK_SIZE
  266. ENDSTACK:   RS.B    0
  267. SYSTEMRAM:  RS.B    0
  268. DMANUM:     EQU 80
  269.  
  270. ;JOYPAD STUFF
  271. JSDATA1:    EQU $00A10003
  272. JSDATA2:    EQU $00A10005
  273. JSDATA3:    EQU $00A10007
  274. JSCTRL:     EQU $00A10009
  275. JSCTRL1:    EQU $00A10009
  276. JSCTRL2:    EQU $00A1000b
  277. JSCTRL3:    EQU $00A1000d
  278. MDSCTRL1:   EQU $00A10013
  279. MDSCTRL2:   EQU $00A10019
  280. MDSCTRL3:   EQU $00A1001f
  281.  
  282. J_UP:       EQU 0
  283. J_DOWN:     EQU 1
  284. J_LEFT:     EQU 2
  285. J_RIGHT:    EQU 3
  286. J_BUT_B:    EQU 4
  287. J_BUT_C:    EQU 5
  288. J_BUT_A:    EQU 6
  289.  
  290. ;SPRITE STUFF
  291. S_1X1:      EQU 0<<8
  292. S_1X2:      EQU 1<<8
  293. S_1X3:      EQU 2<<8
  294. S_1X4:      EQU 3<<8
  295. S_2X1:      EQU 4<<8
  296. S_2X2:      EQU 5<<8
  297. S_2X3:      EQU 6<<8
  298. S_2X4:      EQU 7<<8
  299. S_3X1:      EQU 8<<8
  300. S_3X2:      EQU 9<<8
  301. S_3X3:      EQU 10<<8
  302. S_3X4:      EQU 11<<8
  303. S_4X1:      EQU 12<<8
  304. S_4X2:      EQU 13<<8
  305. S_4X3:      EQU 14<<8
  306. S_4X4:      EQU 15<<8
  307.  
  308. S_PAL1:     EQU $0000
  309. S_PAL2:     EQU $2000
  310. S_PAL3:     EQU $4000
  311. S_PAL4:     EQU $6000
  312.  
  313. ;----------------------------------------------------------
  314. ;       USEFUL MACROS
  315. ;----------------------------------------------------------
  316. WAITDMA:    MACRO
  317. @LOOP\@     BTST    #1,VDP_STATUS+1
  318.         BNE.S   @LOOP\@
  319.         ENDM
  320.  
  321. WREG:       MACRO
  322.         MOVE    #$8000!((\1)<<8)!((\2)&$FF),VDP_CONTROL
  323.         ENDM
  324.  
  325. WREGR:      MACRO
  326.         AND #$00FF,\2
  327.         OR  #VDP_R\1,\2
  328.         MOVE    \2,VDP_CONTROL
  329.         ENDM
  330.  
  331. WDEST:      MACRO
  332.         MOVE.L  #\1+((\2)&$3FFF)<<16+(\2)>>14,VDP_CONTROL
  333.         ENDM
  334.  
  335. WDESTR:     MACRO
  336.         ROL.L   #2,\2
  337.         ROR #2,\2
  338.         SWAP    \2
  339.         AND.L   #$3FFF0003,\2
  340.         OR.L    #\1,\2
  341.         MOVE.L  \2,VDP_CONTROL
  342.         ENDM
  343.  
  344. WAITVBI:    MACRO
  345.         MOVE.W  #0,VBLANKON
  346. @LOOP\@:    CMP.W   #0,VBLANKON
  347.         BEQ.S   @LOOP\@
  348.         ENDM
  349.  
  350. DMADUMP:    MACRO
  351.         MOVE.L  #(\2)/2,D0
  352.         MOVE.L  #\1,D1
  353.         MOVE.L  #\3,D2
  354.         JSR DMADUMPS
  355.         ENDM
  356.  
  357. DMAFPAL:    MACRO
  358.         MOVE.L  #(((\2)/2)&$FF)<<16+(((\2)/2)&$FF00)>>8+$93009400,D0    ;LENGTH
  359.         MOVE.L  #((((\1)/2)&$FF)<<16)+((((\1)/2)&$FF00)>>8)+$95009600,D1
  360.         MOVE.W  #(((\1)/2)&$7F0000)>>16+$9700,D2    ;SOURCE
  361.         MOVE.W  #((\3)&$3FFF)+$C000,D3          ;CRAM
  362.         MOVE.W  #((\3)&$C000)>>14+$0080,D4      ;CRAM
  363.         JSR RAMDMAF
  364.         ENDM
  365.  
  366. ;----------------------------------------------------------
  367. ;       SYSTEM VARIABLES
  368. ;----------------------------------------------------------
  369.         RSSET   SYSTEMRAM   ;POINT AT SYSTEM RAM (AFTER STACK)
  370. STARTVARS:  RS.B    0       ;POINTER TO START OF VARS
  371. HOTSTART:   RS.W    1       ;HOT START FLAG
  372. VBLANKON:   RS.W    1       ;FLAG TO SAY WHEN VERTICAL BLANK CODE IS FINISHED
  373. VBIVECTOR:  RS.L    1       ;LOCATION OF VBLANK ROUTINE
  374. JOYPAD0:    RS.B    1       ;JOYPAD INFORMATION
  375. JOYPADOLD:  RS.B    1       ;JOYPAD INFORMATION FROM LAST FRAME
  376.         RS.W    1       ;QUICK SOURCE UNUSED
  377. QSOURCE:    RS.L    1       ;QUICK SOURCE
  378.         RS.W    1       ;QUICK SOURCE
  379. QSIZE:      RS.L    1       ;QUICK SIZE RAM
  380. DMAREQ:     RS.W    DMANUM*7    ;DMA REQUEST STORE
  381.         RS.L    1       ;OVERRUN
  382. RAMDMA:     RS.B    200     ;RAM DMAS
  383. PALETTES:   RS.W    16*4        ;PALETTE ON SCREEN
  384. SPRITETEMP: RS.W    120*4       ;TABLE FOR SPRITE DATA(80 SPRITES + 40 OVERRUN)
  385. RANDOM:     RS.L    1       ;POINTER TO RANDOM NUMBER
  386. DECRUNCH:   RS.B    8192        ;TEMP AREA FOR STUFF
  387.  
  388. SYSTEMEND:  RS.B    0
  389.  
  390. ;----------------------------------------------------------
  391. ;       CARTRIDGE HEADER INFORMATION
  392. ;----------------------------------------------------------
  393.         ORG $0000
  394.         DC.L    ENDSTACK        ;STACK POINTER
  395.         DC.L    CODESTART       ;PROGRAM COUNTER
  396.  
  397.         ORG $0068
  398.  
  399.         DC.L    EXTINT
  400.         DC.L    ERROR
  401.         DC.L    HBLANK
  402.         DC.L    ERROR
  403.         DC.L    VBLANK
  404.  
  405.         REPT    33
  406.         DC.L    ERROR
  407.         ENDR
  408.  
  409. CARTRIDGEDATA:  DC.B    "SEGA GENESIS    "
  410.         DC.B    "GAMEHUT 2018.MAR"
  411. TITLE:      DC.B    "GAMEHUT TEST SHELL                              "
  412.         DC.B    "GAMEHUT TEST SHELL                              "
  413.         DC.B    "GH 00-0001 -01"    ;PRODUCT NO;VERSION
  414.         DC.W    0           ;CHECKSUM
  415.         DC.B    "J               "  ;CONTROL DATA
  416.         DC.L    $000000,$3FFFFF     ;ROM ADDRESS
  417.         DC.L    $FF0000,$FFFFFF     ;RAM ADDRESS
  418.         DC.B    "            "      ;EXTERNAL RAM.
  419.         DC.B    "            "      ;MODEM DATA
  420.         DC.B    "                                        "  ;MEMO
  421.         DC.B    "F               "  ;RELEASE CODES
  422. ;       NORG    $0200
  423. ;----------------------------------------------------------
  424. ;   SYSTEM INIT
  425. ;----------------------------------------------------------
  426. CODESTART:  MOVE.W  #$2700,SR
  427.         MOVE.W  #1,HOTSTART
  428.         TST.L   $A10008
  429.         BNE.S   @HOTSTART
  430.         TST.W   $A1000C
  431.         BNE.S   @HOTSTART
  432.         CLR.W   HOTSTART
  433.         MOVE.B  $A10001,D0
  434.         ANDI.B  #$F,D0
  435.         BEQ.S   @J1
  436.         MOVE.L  #'SEGA',$A14000
  437. @J1:
  438.         MOVE.L  #$C0000000,$C00004
  439.         CLR.L   D1
  440.         MOVE.W  #$3F,D0
  441. @CLR1:      MOVE.W  D1,$C00000
  442.         DBF D0,@CLR1
  443.         LEA.L   $FFFF0000,A0
  444.         MOVE.W  #$3FFF,D0
  445. @CLR2:      MOVE.L  D1,(A0)+
  446.         DBF D0,@CLR2
  447.  
  448. @HOTSTART:  LEA.L   ENDSTACK,SP     ;SET UP STACK POINTER
  449.         BSR.W   INIT_Z80
  450.         MOVE.W  #$2300,SR
  451.  
  452.         WAITDMA             ;WAIT FOR ANY DMA'S TO FINISH
  453.         MOVE.W  #$2700,SR       ;STOP ALL INTERUPTS
  454.  
  455.         MOVE.L  #NULL,VBIVECTOR     ;SETUP DUMMY VERTICAL BLANK ROUTINE
  456.  
  457.         JSR INIT_VDP_REG
  458.  
  459.         JSR CLEARCRAM
  460.         JSR CLEARVSRAM
  461.         JSR CLEARVRAM
  462.  
  463.         MOVE    #$2000,SR       ;ENABLE INTERUPTS
  464.         WREG    1,%01100100     ;ENABLE VBLANK
  465.         WREG    0,%00000100     ;DISABLE HBLANK
  466.  
  467.         TST.W   HOTSTART        ;WAS IT A 'HOT START'?
  468.         BNE.S   @HOT
  469. ;HARD RESET CODE HERE IF NEEDED
  470.         BRA.S   @SKIP
  471.  
  472. @HOT:       MOVE.W  #50-1,D0        ;STOP RESET BUG
  473. @PAUSE:     WAITVBI
  474.         DBRA    D0,@PAUSE
  475.  
  476. @SKIP:      JSR JOYINIT         ;INITIALIZE JOYPADS
  477.  
  478.         JSR SETUPRAM        ;COPY IN PERMANENT RAM ROUTINES
  479.  
  480.         WDEST   VSRAMW,$0000        ;VSCROLL OFFSET
  481.         MOVE.L  #0,VDP_DATA
  482.         WDEST   VRAMW,$FC00     ;HSCROLL OFFSET
  483.         MOVE.L  #0,VDP_DATA
  484.  
  485.         MOVE.L  #$FC00,A0       ;CLEAR HSCROLL TABLE
  486.         MOVE.L  #896,D0
  487.         BSR CLEARVRAM2
  488.  
  489.         MOVE.L  #$C000,A0       ;CLEAR MAP1
  490.         MOVE.L  #4096,D0
  491.         BSR CLEARVRAM2
  492.  
  493.         MOVE.L  #$E000,A0       ;CLEAR MAP2
  494.         MOVE.L  #4096,D0
  495.         BSR CLEARVRAM2
  496.  
  497.         MOVE.L  #$0000,A0       ;CLEAR FIRST BLOCK IN VIDEO MEMORY
  498.         MOVE.L  #32,D0
  499.         BSR CLEARVRAM2
  500.  
  501.         LEA.L   SYSPALETTE,A0
  502.         BSR SETPAL1
  503.         LEA.L   SYSPALETTE,A0
  504.         BSR SETPAL2
  505.         LEA.L   SYSPALETTE,A0
  506.         BSR SETPAL3
  507.         LEA.L   SYSPALETTE,A0
  508.         BSR SETPAL4
  509.  
  510.         JSR DUMPCOLS
  511.  
  512.         JSR SPRITEINIT
  513.  
  514.         JSR USERINIT
  515.  
  516.         MOVE.L  #RANDOM_NUMS,RANDOM
  517.         MOVE.L  #MAINVBI,VBIVECTOR  ;START MAIN VERTICAL BLANK ROUTINE
  518.  
  519.         JMP MAIN            ;JUMP TO START OF USER CODE
  520.  
  521. ;----------------------------------------------------------
  522. ;       INITIALIZE VDP
  523. ;       SETUP VIDEO FOR 40 COLUMNS AND
  524. ;       28 LINES (320x224).
  525. ;----------------------------------------------------------
  526. INIT_VDP_REG:   WREG    15,%00000010        ;ALWAYS ASSUME WORD INC
  527.  
  528.         WREG    00,%00000100        ;INTERUPTS OFF
  529.         WREG    01,%00000100        ;SCREEN SETUP
  530.         WREG    02,%00110000        ;SCREEN A
  531.         WREG    03,%00000000        ;WINDOW
  532.         WREG    04,%00000111        ;SCREEN B
  533.         WREG    05,%00000000        ;SPRITE ATTRIBUTE TABLE
  534.         WREG    06,%00000000        ;
  535.         WREG    07,%00000000        ;BACKGROUND COLOUR
  536.         WREG    08,%00000000        ;
  537.         WREG    09,%00000000        ;
  538.         WREG    10,%11111111        ;HORIZ INT COUNT
  539.         WREG    11,%00000000        ;FULL SCROLL
  540.         WREG    12,%10000001        ;320 WIDE NO HALF BRITE
  541.         WREG    13,%00111111        ;HORIZ SCROLL TABLE POINT
  542.         WREG    14,%00000000        ;
  543.         WREG    16,%00000001        ;SCROLL SIZE
  544.         WREG    17,%00000000        ;WINDOW H POS
  545.         WREG    18,%00000000        ;WINDOW V POS
  546.  
  547.         WREG    15,%00000010        ;ALWAYS ASSUME WORD INC
  548.  
  549.         RTS
  550.  
  551. ;----------------------------------------------------------
  552. ;       CLEAR VRAM TO 0
  553. ;----------------------------------------------------------
  554. CLEARVRAM:  WDEST   VRAMW,$0000
  555.         MOVE.L  #$800-1,D0
  556.         MOVEQ.L #$0,D1
  557.         LEA.L   VDP_DATA,A0
  558. @LOOP:      MOVE.L  D1,(A0)
  559.         MOVE.L  D1,(A0)
  560.         MOVE.L  D1,(A0)
  561.         MOVE.L  D1,(A0)
  562.         MOVE.L  D1,(A0)
  563.         MOVE.L  D1,(A0)
  564.         MOVE.L  D1,(A0)
  565.         MOVE.L  D1,(A0)
  566.         DBRA    D0,@LOOP
  567.         RTS
  568.  
  569. ;----------------------------------------------------------
  570. ;       CLEAR VRAM FROM A0
  571. ;       LENGTH D0 TO 0
  572. ;----------------------------------------------------------
  573. CLEARVRAM2: MOVE.L  A0,D1
  574.         WDESTR  VRAMW,D1
  575.         MOVEQ.L #$0,D1
  576.         LSR.L   #2,D0
  577.         SUB.L   #1,D0
  578.         LEA.L   VDP_DATA,A0
  579. @LOOP:      MOVE.L  D1,(A0)
  580.         DBRA    D0,@LOOP
  581.         RTS
  582.  
  583. ;----------------------------------------------------------
  584. ;       CLEAR COLOUR RAM (CRAM) TO 0
  585. ;----------------------------------------------------------
  586. CLEARCRAM:  WDEST   CRAMW,$0000
  587.         MOVE.L  #64-1,D0
  588.         MOVEQ.L #0,D1
  589.         LEA.L   VDP_DATA,A0
  590. @LOOP:      MOVE.W  D1,(A0)
  591.         DBRA    D0,@LOOP
  592.         RTS
  593.  
  594. ;----------------------------------------------------------
  595. ;       CLEAR VIDEO RAM (VSRAM) TO 0
  596. ;----------------------------------------------------------
  597. CLEARVSRAM: WDEST   VSRAMW,$0000
  598.         MOVE.L  #128/2-1,D0
  599.         MOVEQ.L #0,D1
  600.         LEA.L   VDP_DATA,A0
  601. @LOOP:      MOVE.W  D1,(A0)
  602.         DBRA    D0,@LOOP
  603.         RTS
  604.  
  605. ;----------------------------------------------------------
  606. ;       CLEAR USER RAM TO 0
  607. ;----------------------------------------------------------
  608. CLEARRAM:   LEA.L   STARTVARS,A0
  609.         MOVE.L  #(ENDVARS-STARTVARS)-1,D0
  610.         MOVEQ.L #0,D1
  611. @LOOP:      MOVE.B  D1,(A0)+
  612.         DBRA    D0,@LOOP
  613.         RTS
  614.  
  615. ;----------------------------------------------
  616. ;       INITIALIZE THE Z80
  617. ;----------------------------------------------
  618. INIT_Z80:   MOVE.W  #$100,D0
  619.         LEA.L   Z80REQ,A0
  620.         LEA.L   Z80RES,A1
  621.         MOVE.W  D0,(A0)
  622.         MOVE.W  D0,(A1)
  623.  
  624. @WAIT_Z80:  BTST    #0,(A0)
  625.         BNE.S   @WAIT_Z80
  626.  
  627.         LEA.L   @INITCODE,A2
  628.         LEA.L   Z80RAM,A3
  629.         MOVE.W  #@CODEEND-@INITCODE-1,D1
  630.  
  631. @LOOP:      MOVE.B  (A2)+,(A3)+
  632.         DBF D1,@LOOP
  633.  
  634.         CLR.W   (A1)
  635.         CLR.W   (A0)
  636.         MOVE.W  D0,(A1)
  637.         RTS
  638.  
  639. @INITCODE   incbin  Music\Z80_INITCODE.bin
  640.         even
  641. @CODEEND:
  642.  
  643. ;----------------------------------------------------------
  644. ;       INIT JOY
  645. ;----------------------------------------------------------
  646. JOYINIT:    MOVE.B  #$00,MDSCTRL1
  647.         MOVE.B  #$00,MDSCTRL2
  648.         MOVE.B  #$00,MDSCTRL3
  649.         MOVE.B  #$40,JSCTRL
  650.         MOVE.B  #$40,JSCTRL1
  651.         MOVE.B  #$40,JSCTRL2
  652.         MOVE.B  #$40,JSCTRL3
  653.         MOVE.B  #$40,JSDATA1
  654.         MOVE.B  #$40,JSDATA2
  655.         MOVE.B  #$40,JSDATA3
  656.         RTS
  657.  
  658. ;----------------------------------------------------------
  659. ;       READ JOYSTICK
  660. ;----------------------------------------------------------
  661. JOYGET6:    movem.l d1/d2/d3/d4/d5/a0,-(sp)
  662.         moveq       #0,d0
  663.         cmp.w       #$0002,d1
  664.         bhi         @JOYGET6_ERR
  665.         add.w       d1,d1
  666.         move.l  #$00a10003,a0       ;joystick data port address
  667.         move.b  #$40,6(a0,d1.w) ;set TH = output
  668.         nop
  669.         nop
  670.         move.b  #$40,(a0,d1.w)  ; select [ ? 1 TRG-C TRG-B R L D U ]
  671.         moveq       #0,d2
  672.         nop
  673.         nop
  674.         nop
  675.         move.b  $00(a0,d1.w),d2 ; d2 = xxxx|xxxx|? 1 TRG-C TRG-B R L D U
  676.         cmp.b       #$70,d2         ; checking for mouse or other handshaking device
  677.         beq         @JOYGET6_ERR
  678.         move.b  #$00,(a0,d1.w)  ; select [ ? 0 START TRG-A 0 0 D U ]
  679.         lsl.w       #8,d2               ; d2 = ? 1 TRG-C TRG-B R L D U|0 0 0 0 0 0 0 0
  680.         move.b  $00(a0,d1.w),d2 ;d2 = ? 1 TRG-C TRG-B R L D U|? 0 St TRG-A 0 0 D U
  681.         cmp.b       #$3f,d2         ; checking for nothing connected
  682.         beq         @JOYGET6_ERR
  683.         move.b  #$40,(a0,d1.w)  ; select [ ? 1 TRG-C TRG-B R L D U ]
  684.         moveq       #0,d3
  685.         nop
  686.         nop
  687.         nop
  688.         move.b  $00(a0,d1.w),d3 ; d3 = xxxx|xxxx|? 1 TRG-C TRG-B R L D U
  689.         move.b  #$00,(a0,d1.w)  ; select [ ? 0 START TRG-A 0 0 D U ]
  690.         lsl.w       #8,d3
  691.         move.b  $00(a0,d1.w),d3 ;d3 = ? 1 TRG-C TRG-B R L D U|? 0 St TRG-A 0 0 D U
  692.         move.b  #$40,(a0,d1.w)  ; select [ ? 1 TRG-C TRG-B R L D U ]
  693.         moveq       #0,d4
  694.         nop
  695.         nop
  696.         nop
  697.         move.b  $00(a0,d1.w),d4 ; d4 = xxxx|xxxx|? 1 TRG-C TRG-B R L D U
  698.         move.b  #$00,(a0,d1.w)  ; select [ ? 0 START TRG-A 0 0 0 0 ]
  699.         lsl.w       #8,d4
  700.         move.b  $00(a0,d1.w),d4 ;d4 = ? 1 TRG-C TRG-B R L D U|? 0 St TRG-A 0 0 0 0
  701.         move.b  #$40,(a0,d1.w)  ; select [ ? 1 0 0 MD TX TY TZ ]
  702.         moveq       #0,d5
  703.         nop
  704.         nop
  705.         nop
  706.         move.b  $00(a0,d1.w),d5 ; d5 = 0000|0000|? 1 0 0 MD TX TY TZ
  707.         move.b  #$00,(a0,d1.w)  ; select [ ? 0 0 0 1 1 1 1 ]
  708.         lsl.w       #8,d5
  709.         move.b  $00(a0,d1.w),d5 ;d5 = ? 1 0 0 MD TX TY TZ| ? 0 0 0 1 1 1 1
  710.         move.b  #$40,(a0,d1.w)
  711.  
  712.         cmp.w       d2,d3
  713.         bne         @JOYGET6_ERR        ; nothing connected or unknown device
  714.         cmp.w       d3,d4
  715.         beq         @JOYGET3_PAD        ; regular 3 button controller
  716.         and.w       #$000f,d4
  717.         bne         @JOYGET6_ERR
  718.         move.b  d2,d0
  719.         lsl.w       #4,d0           ;d0.w = 0000|? 0 St TA 0 0 D U 0 0 0 0
  720.         lsr.w       #8,d2           ;d2.w = 0000|0000|? 1 TC TB R L D U
  721.         move.b  d2,d0           ;d0.w   = 0000|? 0 St TA ? 1 TC TB R L D U
  722.         lsl.b       #2,d0           ;d0.w   = 0000|? 0 St TA TC TB R L D U 0 0
  723.         lsr.w       #2,d0           ;d0.w   =   0000|0 0 ? 0|St TA TC TB R L D U
  724.         and.l       #$000000ff,d0
  725.         lsl.b       #4,d5           ;d5.w = ? 1 0 0 MD TX TY TZ|1 1 1 1 0 0 0 0
  726.         lsl.w       #4,d5           ;d5.w   =   MD TX TY TZ 1 1 1 1 0 0 0 0 0 0 0 0
  727.         or.w        d5,d0           ;d0.w = MD TX TY TZ 1 1 1 1 St TA TC TB R L D U
  728.         or.l        #$80000000,d0   ;d0.l=1xxx|xxxx|xxxx|xxxx|MD,TX,TY,TZ,St,TA,TC,TB,R,L,D,U
  729.         bra         @JOYGET6_ERR
  730. @JOYGET3_PAD:
  731.         move.b  d2,d0
  732.         lsl.w       #4,d0           ;d0.w = 0000|? 0 St TA 0 0 D U 0 0 0 0
  733.         lsr.w       #8,d2           ;d2.w = 0000|0000|? 1 TC TB R L D U
  734.         move.b  d2,d0           ;d0.w   = 0000|? 0 St TA ? 1 TC TB R L D U
  735.         lsl.b       #2,d0           ;d0.w   = 0000|? 0 St TA TC TB R L D U 0 0
  736.         lsr.w       #2,d0           ;d0.w   =   0000|0 0 ? 0|St TA TC TB R L D U
  737.         and.l       #$000000ff,d0 ;d0.l=0xxx|xxxx|xxxx|xxxx|xxxx|xxxx|St,TA,TC,TB,R,L,D,U
  738. @JOYGET6_ERR:
  739.         movem.l (sp)+,d1/d2/d3/d4/d5/a0
  740.         rts
  741.  
  742. ;----------------------------------------------------------
  743. ;       NEW READ JOY
  744. ;----------------------------------------------------------
  745. READJOY:    MOVE.W  #$100,Z80REQ
  746. @L1:        BTST    #0,Z80REQ
  747.         BNE.S   @L1
  748.  
  749.         MOVE.B  JOYPAD0,JOYPADOLD   ;STORE OLD PAD INFO FOR DEBOUNCE IF NEEDED
  750.  
  751.         MOVE.W  #0,D1
  752.         BSR JOYGET6
  753.  
  754.         MOVE.W  #0,Z80REQ
  755.  
  756.         TST.B   D0      ;DID JOYPAD READ FAIL?
  757.         BNE.S   @PASS
  758.         MOVE.B  #$FF,D0
  759. @PASS:      MOVE.B  D0,JOYPAD0
  760.         RTS
  761.  
  762. ;----------------------------------------------------------
  763. ;       INTERUPT ROUTINES
  764. ;----------------------------------------------------------
  765.  
  766. ;----------------------------------------------------------
  767. ;       VERTICAL BLANK HANDLER
  768. ;----------------------------------------------------------
  769. VBLANK:     MOVE.L  VBIVECTOR,-(A7)
  770.         RTS
  771.  
  772. NULL:       MOVE.W  #1,VBLANKON
  773.         RTE
  774.  
  775. MAINVBI:    MOVEM.L A0-A6/D2-D7,-(SP)   ;PUSH REGISTERS
  776.  
  777.         JSR USERVBI
  778.         JSR READJOY
  779.  
  780.         MOVEM.L (SP)+,A0-A6/D2-D7   ;RESTORE REGISTERS
  781.         MOVE.W  #1,VBLANKON     ;TELL MAIN LOOP THAT VBI CODE HAS FINISHED
  782.         RTE
  783. ;----------------------------------------------------------
  784. ;       HORIZONTAL BLANK INTERUPT
  785. ;----------------------------------------------------------
  786. HBLANK:     RTE
  787.  
  788. ;----------------------------------------------------------
  789. ;       EXTERNAL INTERUPT
  790. ;----------------------------------------------------------
  791. EXTINT:     RTE
  792.  
  793. ;------------------------------
  794. ;   ERROR HANDLING CODE
  795. ;------------------------------
  796. ERROR:      MOVE.W  #$2700,SR       ;TURN OFF INTERUPTS
  797. @INF:       BRA.S   @INF            ;INFINITE LOOP
  798.  
  799. ;----------------------------------------------------------
  800. ;       DUMP DATA VIA DMA
  801. ;       D0=SIZE IN WORDS
  802. ;       D1=SOURCE ADDRESS
  803. ;       D2=DESTINATION ADDRESS
  804. ;       A0,A1,D3,D4,D5,D6 TRASHED
  805. ;----------------------------------------------------------
  806. DMADUMPS:   LEA.L   VDP_CONTROL,A1
  807.  
  808.         AND.L   #$FFFFFF,D1 ;MAKE SURE IN ROM/RAM
  809.  
  810.         MOVE.W  D0,D3
  811.         ADD.W   D3,D3
  812.         MOVE.W  D1,D4
  813.         ADD.W   D3,D4
  814.         BEQ.S   @PASS
  815.         BCS @TWO
  816.  
  817. @PASS:
  818.         MOVE.W  #$100,Z80REQ
  819. @L1:        BTST    #0,Z80REQ
  820.         BNE.S   @L1
  821.         WREG    01,%01110100        ;DMA ENABLE
  822.  
  823.         JSR RAMDMA
  824.  
  825.         WAITDMA
  826.  
  827.         WREG    01,%01100100        ;DMA DISABLE
  828.         MOVE.W  #0,Z80REQ
  829.  
  830.         RTS
  831.  
  832. @TWO:       SUB.W   D4,D3
  833.         LSR.W   #1,D3
  834.         MOVE.W  D3,D0
  835.         MOVE.L  D1,D5
  836.         MOVE.L  D2,D6
  837.  
  838.         MOVE.W  #$100,Z80REQ
  839. @L2:        BTST    #0,Z80REQ
  840.         BNE.S   @L2
  841.         WREG    01,%01110100        ;DMA ENABLE
  842.  
  843.         JSR RAMDMA
  844.  
  845.         MOVE.L  D5,D1
  846.         MOVE.L  D6,D2
  847.         ADD.W   D3,D2
  848.         ADD.W   D3,D2
  849.         ADD.L   #$10000,D1
  850.         CLR.W   D1
  851.         MOVE.W  D4,D0
  852.         LSR.W   #1,D0
  853.  
  854.         JSR RAMDMA
  855.  
  856.         WAITDMA
  857.  
  858.         WREG    01,%01100100        ;DMA DISABLE
  859.         MOVE.W  #0,Z80REQ
  860.  
  861.         RTS
  862.  
  863. ;----------------------------------------------------------
  864. ;       RAM DMA ROUTINES
  865. ;       A1=VDP_CONTROL
  866. ;       D0=SIZE
  867. ;       D1=SOURCE
  868. ;       D2=DEST
  869. ;       A0,D1,D2 TRASHED
  870. ;----------------------------------------------------------
  871. RAMDMAC:    LEA.L   QSOURCE+10,A0
  872.         LSR.L   #1,D1
  873.         LSL.L   #2,D2
  874.         LSR.W   #2,D2
  875.         SWAP    D2
  876.         AND.W   #$3,D2
  877.         OR.L    #$40000080,D2
  878.  
  879.         MOVEP.W D0,-3(A0)
  880.         MOVEP.L D1,-11(A0)
  881.  
  882.         MOVE.W  -(A0),(A1)
  883.         MOVE.W  -(A0),(A1)
  884.         MOVE.W  -(A0),(A1)
  885.         MOVE.W  -(A0),(A1)
  886.         MOVE.W  -(A0),(A1)
  887.         SWAP    D2
  888.         MOVE.W  D2,(A1)
  889.         SWAP    D2
  890.         MOVE.W  D2,(A1)
  891.         RTS
  892.  
  893. RAMDMAFC:   MOVE.L  D0,(A1)
  894.         MOVE.L  D1,(A1)
  895.         MOVE.W  D2,(A1)
  896.         MOVE.W  D3,(A1)
  897.         MOVE.W  D4,(A1)
  898.         RTS
  899.  
  900. RAMVERTC:   LEA.L   DMAREQ,A0
  901.         MOVE.W  #$8000,D1
  902.  
  903.         MOVE.W  #$8174,(A2)     ;DMA ENABLE
  904.  
  905. @BACK:      MOVE.W  (A0)+,D0
  906.         BGE.S   @CHECK
  907. @L1:        MOVE.W  D0,(A2)         ;FIRST PASS
  908.         MOVE.L  (A0)+,(A2)      ;SIZE/SOURCE
  909.         MOVE.L  (A0)+,(A2)      ;SOURCE/SOURCE
  910.         MOVE.W  (A0)+,(A2)      ;DEST
  911.         MOVE.W  (A0)+,(A2)      ;DEST/MODE
  912.  
  913.         MOVE.W  (A0)+,D0        ;SIZE
  914.         BLT.S   @L1
  915.  
  916. @CHECK:     BEQ.S   @DONE           ;END
  917.         OR.W    D1,D0
  918.         MOVE.W  D0,(A2)
  919.         BRA.S   @BACK
  920.  
  921. @DONE:      MOVE.L  #0,DMAREQ
  922.  
  923.         MOVE.W  #$8164,(A2)     ;DMA DISABLE
  924.  
  925.         RTS
  926.  
  927. RAMDMAEND:
  928.  
  929. ;----------------------------------------------------------
  930. ;       COPY RAM ROUTINES TO RAM
  931. ;----------------------------------------------------------
  932. SETUPRAM:   MOVE.L  #$94009300,QSIZE
  933.         MOVE.L  #$97009600,QSOURCE
  934.         MOVE.W  #$9500,QSOURCE+4
  935.  
  936.         LEA.L   RAMDMAC,A0
  937.         LEA.L   RAMDMA,A1
  938.  
  939.         MOVE.W  #RAMDMAEND-RAMDMAC-1,D0
  940. @L1:        MOVE.B  (A0)+,(A1)+
  941.         DBRA    D0,@L1
  942.         RTS
  943.  
  944. RAMDMAF:    EQU RAMDMA+(RAMDMAFC-RAMDMAC)
  945. RAMVERT:    EQU RAMDMA+(RAMVERTC-RAMDMAC)
  946.  
  947. ;----------------------------------------------------------
  948. ;       PALETTE SETUPS
  949. ;----------------------------------------------------------
  950. SETPAL1:    MOVE.W  #16-1,D0
  951.         LEA.L   PALETTES,A1
  952. @LOOP1:     MOVE.W  (A0)+,(A1)+
  953.         DBRA    D0,@LOOP1
  954.         RTS
  955.  
  956. SETPAL2:    MOVE.W  #16-1,D0
  957.         LEA.L   PALETTES+32,A1
  958. @LOOP1:     MOVE.W  (A0)+,(A1)+
  959.         DBRA    D0,@LOOP1
  960.         RTS
  961.  
  962. SETPAL3:    MOVE.W  #16-1,D0
  963.         LEA.L   PALETTES+64,A1
  964. @LOOP1:     MOVE.W  (A0)+,(A1)+
  965.         DBRA    D0,@LOOP1
  966.         RTS
  967.  
  968. SETPAL4:    MOVE.W  #16-1,D0
  969.         LEA.L   PALETTES+96,A1
  970. @LOOP1:     MOVE.W  (A0)+,(A1)+
  971.         DBRA    D0,@LOOP1
  972.         RTS
  973.  
  974. ;----------------------------------------------------------
  975. ;       COPY PALETTE TO MEMORY
  976. ;----------------------------------------------------------
  977. DUMPCOLS:   MOVEM.L D0-D4,-(SP)
  978.  
  979.         MOVE.W  #$100,Z80REQ
  980. @L1:        BTST    #0,Z80REQ
  981.         BNE.S   @L1
  982.         WREG    01,%01110100        ;DMA ENABLE
  983.         LEA.L   VDP_CONTROL,A1
  984.         DMAFPAL PALETTES,128,$0000
  985.         WREG    01,%01100100        ;DMA DISABLE
  986.         MOVE.W  #0,Z80REQ
  987.  
  988.         MOVEM.L (SP)+,D0-D4
  989.  
  990.         RTS
  991.  
  992. ;----------------------------------------------------------
  993. ;       SPRITE CODE
  994. ;----------------------------------------------------------
  995. SPRITEINIT: WREG    5,$7C   ;SPRITE ATTRIBUTE TABLE
  996.  
  997.         LEA.L   VDP_DATA,A1
  998.         WDEST   VRAMW,$F800
  999.  
  1000.         MOVE.W  #1,(A1)
  1001.         MOVE.W  #0,(A1)
  1002.         MOVE.W  #0,(A1)
  1003.         MOVE.W  #1,(A1)
  1004.  
  1005.         LEA.L   SPRITETEMP,A1
  1006.         MOVE.W  #1,(A1)+
  1007.         MOVE.W  #0,(A1)+
  1008.         MOVE.W  #0,(A1)+
  1009.         MOVE.W  #1,(A1)+
  1010.  
  1011.         JSR SPRITEDUMP
  1012.  
  1013.         RTS
  1014.  
  1015. SPRITEDUMP: DMADUMP SPRITETEMP,640,$F800
  1016.         RTS
  1017.  
  1018. ;----------------------------------------------------------
  1019. ;       GET A RANDOM NUMBER FROM 0-255
  1020. ;       TRASHES A0, RETURNS D0
  1021. ;----------------------------------------------------------
  1022. GETRANDOM:  MOVE.L  RANDOM,A0
  1023.         MOVEQ.L #0,D0
  1024.         MOVE.B  (A0)+,D0
  1025.         ADD.L   #1,A0
  1026.         CMP.L   #RANDOM_END,A0
  1027.         BLT.S   @P1
  1028.         MOVE.L  #RANDOM_NUMS,A0
  1029. @P1:        MOVE.L  A0,RANDOM
  1030.         RTS
  1031.  
  1032. ;----------------------------------------------------------
  1033. ;       SYSTEM PALETTE
  1034. ;----------------------------------------------------------
  1035. SYSPALETTE  incbin  Palettes\pallet_system.bin
  1036.  
  1037. ;----------------------------------------------------------
  1038. ;       RANDOM NUMBER TABLE (1024 ENTRIES)
  1039. ;----------------------------------------------------------
  1040. RANDOM_NUMS incbin  Uncompressed\Random_Numunc.bin
  1041. RANDOM_END:
  1042.  
  1043. RINGS.S
  1044. ;----------------------------------------------------------
  1045. ;       RING CODE
  1046. ;----------------------------------------------------------
  1047. ;RING STRUCTURE STUFF
  1048.         RSSET   0
  1049. RING_X:     RS.L    1
  1050. RING_Y:     RS.L    1
  1051. RING_MX:    RS.L    1
  1052. RING_MY:    RS.L    1
  1053. RING_GRAV:  RS.L    1
  1054. RING_LIFE:  RS.W    1
  1055. RING_SIZE:  RS.B    0
  1056.  
  1057. RINGS:      EQU 64  ;TOTAL NUMBER OF RINGS
  1058.  
  1059.         RSSET   SYSTEMEND
  1060. RINGDATA:   RS.B    RINGS*RING_SIZE ;RING SYSTEM
  1061.  
  1062. RINGEND:    RS.B    0
  1063.  
  1064. ;-------------------------
  1065. ;   INITIALISE RINGS
  1066. ;-------------------------
  1067. RINGINIT:   LEA.L   RINGDATA,A0
  1068.         MOVE.W  #RINGS-1,D0         ;NUMBER OF RINGS TO PROCESS
  1069.         MOVE.W  #0,D1
  1070. @L1:        MOVE.W  D1,RING_LIFE(A0)        ;SET LIFE SPAN TO 0
  1071.         ADD.L   #RING_SIZE,A0
  1072.         DBRA    D0,@L1
  1073.         RTS
  1074.  
  1075. ;-------------------------
  1076. ;   PROCESS RINGS
  1077. ;-------------------------
  1078. PROCRING:   LEA.L   RINGDATA,A0
  1079.         MOVE.W  #RINGS-1,D0
  1080.         AND.W   #$FF,D7             ;CLEAR AWAY ANY PREVIOUS SIZE INFO FROM SPRITE COUNT
  1081.         ADD.W   #S_2X2,D7           ;ALL THESE RINGS WILL BE 2X2 IN SIZE
  1082.         MOVE.W  #S_PAL2+$1100/32,D6     ;ALL RINGS WILL USE THIS PALETTE AND VRAM LOCATION
  1083.  
  1084. @L1:        TST.W   RING_LIFE(A0)
  1085.         BEQ.S   @SKIP
  1086. ;ADD SPRITE TO TABLE
  1087.         MOVE.W  RING_Y(A0),(A1)+        ;Y POSITION
  1088.         MOVE.W  D7,(A1)+            ;SIZE 2X2 CHARACTERS AND SPRITE NUM
  1089.         MOVE.W  D6,(A1)+            ;PALETTE NUMBER+GRAPHIC VRAM LOCATION/32
  1090.         MOVE.W  RING_X(A0),(A1)+        ;X POSITION ($80 IS LEFT OF SCREEN)
  1091.         ADD.W   #1,D7               ;INCREMENT SPRITE COUNT
  1092. ;PROCESS PHYSICS
  1093.         MOVE.L  RING_MX(A0),D1
  1094.         ADD.L   D1,RING_X(A0)
  1095.         MOVE.L  RING_MY(A0),D1
  1096.         ADD.L   D1,RING_Y(A0)
  1097.         MOVE.L  RING_GRAV(A0),D1
  1098.         ADD.L   D1,RING_MY(A0)
  1099.         SUB.W   #1,RING_LIFE(A0)
  1100. ;CLIP
  1101.         MOVE.W  RING_Y(A0),D1           ;Y CLIP
  1102.         SUB.W   #$80-16,D1
  1103.         CMP.W   #224+16,D1
  1104.         BHI.S   @CLIP
  1105.         MOVE.W  RING_X(A0),D1           ;X CLIP
  1106.         SUB.W   #$80-16,D1
  1107.         CMP.W   #320+16,D1
  1108.         BLS.S   @SKIP
  1109. @CLIP:
  1110.         CLR.W   RING_LIFE(A0)
  1111.  
  1112. @SKIP:      ADD.L   #RING_SIZE,A0
  1113.         DBRA    D0,@L1
  1114.         RTS
  1115.  
  1116. ;-------------------------
  1117. ;   ADD A RING
  1118. ;-------------------------
  1119. ADDRING:    LEA.L   RINGDATA,A0
  1120.         MOVE.W  #RINGS-1,D0
  1121.         MOVE.W  #10000,D2           ;STORE SHORTEST REMAINING RING LIFE HERE
  1122.         MOVE.L  A0,A1               ;SHORTEST LIFE RING POSITION
  1123.  
  1124. @L1:        MOVE.W  RING_LIFE(A0),D1
  1125.         BEQ.S   @ADD                ;RING WITH ZERO LIFE, SO FREE SLOT FOUND
  1126.         CMP.W   D1,D2               ;SHORTER LIFE THAN CURRENT SHORTEST?
  1127.         BLE.S   @SKIP
  1128.         MOVE.W  D1,D2               ;NEW SHORTEST
  1129.         MOVE.L  A0,A1               ;NEW SHORTEST POSITION
  1130. @SKIP:      ADD.L   #RING_SIZE,A0
  1131.         DBRA    D0,@L1
  1132.  
  1133.         MOVE.L  A1,A0               ;REPLACE RING WITH SHORTEST LIFE LEFT IF ZERO NOT FOUND
  1134.  
  1135. @ADD:       SWAP.W  D3
  1136.         CLR.W   D3
  1137.         SWAP.W  D4
  1138.         CLR.W   D4
  1139.         MOVE.L  D3,RING_X(A0)
  1140.         MOVE.L  D4,RING_Y(A0)
  1141.         MOVE.L  D5,RING_MX(A0)
  1142.         MOVE.L  D6,RING_MY(A0)
  1143.         MOVE.L  D7,RING_GRAV(A0)
  1144.         MOVE.W  #120,RING_LIFE(A0)
  1145.         RTS
  1146.  
  1147. FLAME.S
  1148. ;----------------------------------------------------------
  1149. ;       FLAME CODE
  1150. ;----------------------------------------------------------
  1151.         RSSET   0
  1152. FLAME_X:    RS.W    1
  1153. FLAME_DIR:  RS.W    1
  1154. FLAME_TIME: RS.W    1
  1155. FLAME_SIZE: RS.B    0
  1156.  
  1157.         RSSET   RINGEND
  1158. ;FLAME STUFF
  1159. FBUFFER:    RS.W    1   ;BUFFER FOR FLAME
  1160. XPOS:       RS.W    1   ;XPOS FOR FLAME
  1161.  
  1162. FLAMES:     EQU 12  ;TOTAL NUMBER OF FLAMES
  1163. FLAMEDATA:  RS.B    FLAMES*FLAME_SIZE
  1164.  
  1165. FLAMEEND:   RS.B    0
  1166.  
  1167. FLAMETABLE: EQU DECRUNCH+4096+1160*2
  1168. FLAMEBUF1:  EQU DECRUNCH+4096
  1169. FLAMEBUF2:  EQU DECRUNCH+4096+1160
  1170.  
  1171. ;----------------------------------------------------------
  1172. ;       INIT FLAME
  1173. ;----------------------------------------------------------
  1174. INITFLAME: 
  1175.         LEA.L   PALETTE3,A0     ;FLAME PALETTE
  1176.         JSR SETPAL3
  1177.  
  1178.         LEA.L   DECRUNCH,A0     ;SET UP MASK FOR FLAME PLAYFIELD
  1179.         MOVE.W  #$8000+S_PAL3,D0
  1180.         MOVE.W  #(4096/2)-1,D1
  1181. @L1:        MOVE.W  D0,(A0)+
  1182.         DBRA    D1,@L1
  1183.  
  1184.         LEA.L   DECRUNCH+4096,A0    ;CLEAR FLAME BUFFERS
  1185.         MOVEQ.L #0,D0
  1186.         MOVE.W  #((1160*2)/4)-1,D1
  1187. @L3:        MOVE.L  D0,(A0)+
  1188.         DBRA    D1,@L3
  1189.  
  1190. ;INIT FLAME CREATORS
  1191.         LEA.L   FLAMEDATA,A1
  1192.         MOVE.W  #FLAMES-1,D1
  1193. @L2:        MOVE.W  #-10000,(A1)+       ;START
  1194.         MOVE.W  #1,(A1)+        ;SPEED
  1195.         MOVE.W  #0,(A1)+        ;LIFE
  1196.         DBRA    D1,@L2
  1197.  
  1198.         MOVE.W  #0,FBUFFER
  1199.  
  1200.         DMADUMP FLAMEGFX1,32*32,$0  ;DUMP 4 CHARACTERS (SIZE 32 BYTES EACH) TO VRAM LOCATION $20 (MAP GRAPHICS)
  1201.  
  1202.         BSR CALCFLAME       ;CREATE A TABLE USED TO SPEED UP ANTI-ALIAS MATHS
  1203.  
  1204.         RTS
  1205. ;----------------------------------------------------------
  1206. ;       CALC FLAME TABLE - TO SPEED UP MATHS
  1207. ;----------------------------------------------------------
  1208. CALCFLAME:  LEA.L   FLAMETABLE,A0
  1209.         MOVEQ.L #0,D0
  1210.         MOVEQ.L #0,D2
  1211.  
  1212.         MOVE.W  #255-1,D1
  1213.  
  1214.         MOVE.B  #0,(A0)+
  1215.  
  1216. @L1:        MOVE.B  D0,D2
  1217.         ASR.W   #2,D2
  1218.  
  1219.         MOVE.B  D2,(A0)+
  1220.         ADD.B   #1,D0
  1221.         DBRA    D1,@L1
  1222.  
  1223.         RTS
  1224.  
  1225. ;----------------------------------------------------------
  1226. ;       CONVERT FLAME - COPY FLAME TO PLAYFIELD
  1227. ;----------------------------------------------------------
  1228. CONVFLAME:  LEA.L   DECRUNCH+1,A0
  1229.         LEA.L   FLAMEBUF2,A1
  1230.         SUB.W   FBUFFER,A1
  1231.  
  1232.         MOVE.W  #$8000+S_PAL3,D1
  1233.         MOVE.W  #28-1,D2
  1234. @L2:
  1235.         REPT    9
  1236.         MOVE.L  (A1)+,D1
  1237.         MOVEP.L D1,(0,A0)       ;VERY SNEAKY
  1238.         LEA.L   8(A0),A0
  1239.         ENDR
  1240.         MOVE.L  (A1)+,D1
  1241.         MOVEP.L D1,(0,A0)
  1242.         LEA.L   -72+128(A0),A0
  1243.         DBRA    D2,@L2
  1244.  
  1245.         RTS
  1246.  
  1247. ;----------------------------------------------------------
  1248. ;       MAIN FLAME CODE
  1249. ;----------------------------------------------------------
  1250. DRAWFLAME:
  1251. ;DUMP FLAME TO VRAM
  1252.         DMADUMP DECRUNCH,4096,$E000
  1253. ;TOGGLE BUFFERS
  1254.         CMP.W   #0,FBUFFER
  1255.         BEQ.S   @B1
  1256.         MOVE.W  #0,FBUFFER
  1257.         BRA.S   @B2
  1258. @B1:        MOVE.W  #1160,FBUFFER
  1259. @B2:
  1260.  
  1261. ;ADD AND MOVE FLAME CREATION OBJECTS
  1262.         LEA.L   FLAMEBUF2+40*28,A0
  1263.         SUB.W   FBUFFER,A0
  1264.  
  1265.         MOVEQ.L #0,D0           ;CLEAR BOTTOM LINE OF FLAME TO AVOID OVER SATURATION
  1266.         REPT    10
  1267.         MOVE.L  D0,(A0)+
  1268.         ENDR
  1269.  
  1270.         LEA.L   FLAMEBUF2+40*28+2,A0   
  1271.         SUB.W   FBUFFER,A0
  1272.  
  1273.         LEA.L   FLAMEDATA,A1
  1274.         MOVE.W  #FLAMES-1,D2
  1275.  
  1276.         MOVE.W  #$1F,D1
  1277.  
  1278. @J1:        MOVE.W  (A1)+,D0        ;POSITION
  1279.         ADD.W   (A1)+,D0        ;SPEED/DIR
  1280.         BLT.S   @D1
  1281.         CMP.W   #38*8,D0
  1282.         BLT.S   @D2
  1283. @D1:        LEA.L   2(A1),A1
  1284.         BRA.S   @D3
  1285. @D2:        MOVE.W  D0,-4(A1)
  1286.         ASR.W   #3,D0
  1287.         LEA.L   (A0,D0.W),A2
  1288.  
  1289.         MOVE.B  D1,-2(A2)       ;DRAW CROSS AT RANDOM POSITION
  1290.         MOVE.B  D1,-1(A2)
  1291.         MOVE.B  D1,-(40+1)(A2)
  1292.         MOVE.B  D1,(A2)
  1293.  
  1294.         SUB.W   #1,(A1)+
  1295.         BGE.S   @T1
  1296. @D3:
  1297.         BTST    #5,JOYPAD0
  1298.         BNE @SKIP
  1299.  
  1300.         MOVE.L  A0,A3
  1301.         JSR GETRANDOM
  1302.         ADD.W   #32,D0
  1303.         MOVE.W  D0,-6(A1)       ;POSITION
  1304.         JSR GETRANDOM
  1305.         AND.W   #$1F,D0
  1306.         MOVE.W  D0,-2(A1)       ;TIME
  1307.         JSR GETRANDOM
  1308.         AND.W   #$7,D0
  1309.         SUB.W   #3,D0
  1310.         MOVE.W  D0,-4(A1)       ;SPEED
  1311.         MOVE.L  A3,A0
  1312.         BRA.S   @T1
  1313. @SKIP:      MOVE.W  #-10000,-6(A1)
  1314. @T1:
  1315.         DBRA    D2,@J1
  1316.  
  1317. ;NOW ANTI ALIAS TO BUFFER 1
  1318.         MOVE.W  FBUFFER,D0
  1319.         BEQ.S   @PP1
  1320.         LEA.L   FLAMEBUF1+40,A0
  1321.         LEA.L   FLAMEBUF2+1,A1
  1322.         BRA.S   @PP2
  1323.  
  1324. @PP1:       LEA.L   FLAMEBUF2+40-1,A0
  1325.         LEA.L   FLAMEBUF1,A1
  1326. @PP2:
  1327.         LEA.L   FLAMETABLE,A2   ;FLAME TABLE
  1328.         LEA.L   -39(A0),A3
  1329.         LEA.L   2(A0),A4
  1330.  
  1331.         MOVEQ.L #0,D0
  1332.  
  1333.         MOVE.W  #(28*40)-1,D5
  1334.  
  1335. @LL1:       MOVE.B  (A0)+,D0
  1336.         ADD.B   (A0),D0
  1337.         ADD.B   (A4)+,D0
  1338.         ADD.B   (A3)+,D0
  1339. ;       ASR.W   #2,D0
  1340. ;       MOVE.B  D0,(A1)+
  1341.         MOVE.B  (A2,D0.W),(A1)+
  1342.         DBRA    D5,@LL1
  1343.  
  1344.         RTS
  1345.  
  1346. ;----------------------------------------------------------
  1347. ;       FLAME GFX
  1348. ;----------------------------------------------------------
  1349. FLAMEGFX1   incbin  Uncompressed\Artunc_FLAMEGFX1.smd
  1350.  
  1351. FLAMEGFX2   incbin  Uncompressed\Artunc_FLAMEGFX2.smd
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement