home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Developer CD v1.2
/
amidev_cd_12.iso
/
reference_library
/
hardware
/
hard_examples
/
hires_playfield.asm
< prev
next >
Wrap
Assembly Source File
|
1992-08-20
|
3KB
|
70 lines
;
; hires_payfield.asm
;
; This example sets up a high resolution, interlaced display with one
; bitplane. This example also relies on the include file hw_examples.i.
;
LEA CUSTOM,a0 ; Address of custom chips
MOVE.W #$9204,BPLCON0(a0) ; Hires, one bitplane, interlaced
MOVE.W #0,BPLCON1(a0) ; Horizontal scroll value = 0
MOVE.W #80,BPL1MOD(a0) ; Modulo = 80 for odd bitplanes
MOVE.W #80,BPL2MOD(a0) ; Ditto for even bitplanes
MOVE.W #$003C,DDFSTRT(a0) ; Set data-fetch start for Hires
MOVE.W #$00D4,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 up color registers
;
MOVE.W #$000F,COLOR00(a0) ; Background color = blue
MOVE.W #$0FFF,COLOR01(a0) ; Foreground color = white
;
; Set up bitplane at $20000
;
LEA $20000,a1 ; Point a1 at bitplane
LEA CHARLIST(pc),a2 ; a2 points at character data
MOVE.W #400,d1 ; Write 400 lines of data
MOVE.W #20,d0 ; Write 20 long words per line
L1:
MOVE.L (a2),(a1)+ ; Write a long word
DBRA d0,L1 ; Decrement counter and loop until full...
;
MOVE.W #20,d0 ; Reset long word counter
ADDQ.L #4,a2 ; Point at next word in char list
CMPI.L #$FFFFFFFF,(a2) ; End of char list?
BNE L2
LEA CHARLIST(pc),a2 ; Yes, reset a2 to beginning of list
L2: DBRA d1,L1 ; Decrement line counter and loop until done...
;
; Start DMA
;
MOVE.W #(DMAF_SETCLR!DMAF_RASTER!DMAF_MASTER),DMACON(a0)
; Enable bitplane DMA only, no Copper
; Because this example has no Copper list, it sits in a loop waiting
; for the vertical blanking interval. When it comes, you check the LOF
; ( long frame ) bit in VPOSR. If LOF = 0, this is a short frame and the
; bitplane pointers are set to point to $20050. If LOF = 1, then this is
; a long frame and the bitplane pointers are set to point to $20000. This
; keeps the long and short frames in the right relationship to each other.
VLOOP: MOVE.W INTREQR(a0),d0 ; Read interrupt requests
AND.W #$0020,d0 ; Mask off all but vertical blank
BEQ VLOOP ; Loop until vertical blank comes
MOVE.W #$0020,INTREQ(a0) ; Reset vertical interrupt
MOVE.W VPOSR(a0),d0 ; Read LOF bit into d0 bit 15
BPL VL1 ; If LOF = 0, jump
MOVE.L #$20000,BPL1PTH(a0) ; LOF = 1, point to $20000
BRA VLOOP ; Back to top
VL1:
MOVE.L #$20050,BPL1PTH(a0) ; LOF = 0, point to $20050
BRA VLOOP ; Back to top
;
; Character list
;
CHARLIST:
DC.L $18FC3DF0,$3C6666D8,$3C66C0CC,$667CC0CC
DC.L $7E66C0CC,$C36666D8,$C3FC3DF0,$00000000
DC.L $FFFFFFFF