; ; HAM_playfield.asm ; ; The following example code generates a six-bitplane display with ; hold-and-modify mode turned on. All 32 color registers are loaded ; with black to prove that the colors are being generated by ; hold-and-modify. The equates are the usual and are not repeated here. ; First, set up the control registers. ; LEA CUSTOM,a0 ; Point a0 at custom chips MOVE.W #$6A00,BPLCON0(a0) ; Six bitplanes, hold-and-modify mode MOVE.W #0,BPLCON1(a0) ; Horizontal scroll = 0 MOVE.W #0,BPL1MOD(a0) ; Modulo for odd bitplanes = 0 MOVE.W #0,BPL2MOD(a0) ; Ditto for even bitplanes MOVE.W #$0038,DDFSTRT(a0) ; Set data-fetch start MOVE.W #$00D0,DDFSTOP(a0) ; Set data-fetch stop MOVE.W #$2C81,DIWSTRT(a0) ; Set display window start MOVE.W #$F4C1,DIWSTOP(a0) ; Set display window stop ; ; Set all color registers = black to prove that hold-and-modify mode is working. ; MOVE.W #32,d0 ; Initialize counter LEA CUSTOM+COLOR00,a1 ; Point a1 at first color register CREGLOOP: MOVE.W #$0000,(a1)+ ; Write black to a color register DBRA d0,CREGLOOP ; Decrement counter and loop til done... ; ; Fill six bitplanes with an easily recognizable pattern. ; ; NOTE: This is just for example use. Normally these bitplanes would ; need to be allocated from the system MEMF_CHIP memory pool. ; MOVE.W #2000,d0 ; 2000 longwords per bitplane MOVE.L #$21000,a1 ; Point a1 at bitplane 1 MOVE.L #$23000,a2 ; Point a2 at bitplane 2 MOVE.L #$25000,a3 ; Point a3 at bitplane 3 MOVE.L #$27000,a4 ; Point a4 at bitplane 4 MOVE.L #$29000,a5 ; Point a5 at bitplane 5 MOVE.L #$2B000,a6 ; Point a6 at bitplane 6 FPLLOOP: MOVE.L #$55555555,(a1)+ ; Fill bitplane 1 with $55555555 MOVE.L #$33333333,(a2)+ ; Fill bitplane 2 with $33333333 MOVE.L #$0F0F0F0F,(a3)+ ; Fill bitplane 3 with $0F0F0F0F MOVE.L #$00FF00FF,(a4)+ ; Fill bitplane 4 with $00FF00FF MOVE.L #$CF3CF3CF,(a5)+ ; Fill bitplane 5 with $CF3CF3CF MOVE.L #$3CF3CF3C,(a6)+ ; Fill bitplane 6 with $3CF3CF3C DBRA d0,FPLLOOP ; Decrement counter and loop til done... ; ; Set up a Copper list at $20000. ; ; NOTE: As with the bitplanes, the copper list location should be allocated ; from the system MEMF_CHIP memory pool. ; MOVE.L #$20000,a1 ; Point a1 at Copper list destination LEA COPPERL(pc),a2 ; Point a2 at Copper list image CLOOP: MOVE.L (a2),(a1)+ ; Move a long word... CMPI.L #$FFFFFFFE,(a2)+ ; Check for end of Copper list BNE CLOOP ; Loop until entire Copper list moved ; ; Point Copper at Copper list. ; MOVE.L #$20000,COP1LCH(a0) ; Load Copper jump register MOVE.W COPJMP1(a0),d0 ; Force load into Copper P.C. ; ; Start DMA. ; MOVE.W #$8380,DMACON(a0) ; Enable bitplane and Copper DMA BRA .....next stuff to do..... ; ; Copper list for six bitplanes. Bitplane 1 is at $21000; 2 is at $23000; ; 3 is at $25000; 4 is at $27000; 5 is at $29000; 6 is at $2B000. ; ; NOTE: These bitplane addresses are for example purposes only. ; See note above. ; COPPERL: DC.W BPL1PTH,$0002 ; Bitplane 1 pointer = $21000 DC.W BPL1PTL,$1000 DC.W BPL2PTH,$0002 ; Bitplane 2 pointer = $23000 DC.W BPL2PTL,$3000 DC.W BPL3PTH,$0002 ; Bitplane 3 pointer = $25000 DC.W BPL3PTL,$5000 DC.W BPL4PTH,$0002 ; Bitplane 4 pointer = $27000 DC.W BPL4PTL,$7000 DC.W BPL5PTH,$0002 ; Bitplane 5 pointer = $29000 DC.W BPL5PTL,$9000 DC.W BPL6PTH,$0002 ; Bitplane 6 pointer = $2B000 DC.W BPL6PTL,$B000 DC.W $FFFF,$FFFE ; Wait for the impossible, i.e., quit