Initial test of laced mode

This commit is contained in:
alpine9000 2016-03-10 08:44:32 +11:00
parent 1a389ef166
commit 25031ddb67
8 changed files with 207 additions and 0 deletions

15
014.lace_mode/Makefile Normal file
View File

@ -0,0 +1,15 @@
MODULE=lace_mode.s
FLOPPY=bin/lace_mode.adf
IMAGEDATA=out/image-palette.s out/image-ham.bin
IMAGEFILE=../assets/gigi_320x512.png
EXTRA=$(IMAGEDATA) $(BOB_IMAGEDATA) init.s utils.s constants.i Makefile
BASE_ADDRESS=40000
USE_PALETTE=--use-palette gigi.pal
DITHER=--dither
include ../shared/base.mk
$(IMAGEDATA): $(IMAGECON) $(IMAGEFILE) Makefile
$(IMAGECON) --input $(IMAGEFILE) --output out/image --ham --output-bitplanes --output-palette-asm $(USE_PALETTE) --output-palette $(DITHER)

9
014.lace_mode/README.md Normal file
View File

@ -0,0 +1,9 @@
interlaced playfield
====================
Work in progress
try it
------
* [Download disk image](bin/laced_mode.adf?raw=true)
* <a href="http://alpine9000.github.io/ScriptedAmigaEmulator/#amiga_examples/laced_mode.adf" target="_blank">Run in SAE</a>

10
014.lace_mode/constants.i Normal file
View File

@ -0,0 +1,10 @@
LVL3_INT_VECTOR equ $6c
SCREEN_WIDTH equ 320
SCREEN_HEIGHT equ 512
SCREEN_WIDTH_BYTES equ (SCREEN_WIDTH/8)
SCREEN_BIT_DEPTH equ 6
SCREEN_RES equ 8 ; 8=lo resolution, 4=hi resolution
RASTER_X_START equ $81 ; hard coded coordinates from hardware manual
RASTER_Y_START equ $2c
RASTER_X_STOP equ RASTER_X_START+SCREEN_WIDTH
RASTER_Y_STOP equ RASTER_Y_START+256

16
014.lace_mode/demo.pal Normal file
View File

@ -0,0 +1,16 @@
caa
d2d
cef
333
c85
4be
be3
c7f
d18
222
655
25d
c97
6c2
d22
cda

16
014.lace_mode/gigi.pal Normal file
View File

@ -0,0 +1,16 @@
875
542
ca7
89a
421
853
c85
565
cc9
a63
211
642
689
8ab
531
997

29
014.lace_mode/init.s Normal file
View File

@ -0,0 +1,29 @@
include "../include/bplconbits.i"
;; custom chip base globally in a6
init:
movem.l d0-a6,-(sp)
move #$7ff,DMACON(a6) ; disable all dma
move #$7fff,INTENA(a6) ; disable all interrupts
;; set up default palette
bsr.s installColorPalette
;; set up playfield
move.w #(RASTER_Y_START<<8)|RASTER_X_START,DIWSTRT(a6)
move.w #((RASTER_Y_STOP-256)<<8)|(RASTER_X_STOP-256),DIWSTOP(a6)
move.w #(RASTER_X_START/2-SCREEN_RES),DDFSTRT(a6)
move.w #(RASTER_X_START/2-SCREEN_RES)+(8*((SCREEN_WIDTH/16)-1)),DDFSTOP(a6)
move.w #(SCREEN_BIT_DEPTH<<12)|COLOR_ON|HOMOD|LACE,BPLCON0(a6)
move.w #2*SCREEN_WIDTH_BYTES*SCREEN_BIT_DEPTH-SCREEN_WIDTH_BYTES,BPL1MOD(a6)
move.w #2*SCREEN_WIDTH_BYTES*SCREEN_BIT_DEPTH-SCREEN_WIDTH_BYTES,BPL2MOD(a6)
;; install copper list, then enable dma and selected interrupts
lea copper(pc),a0
move.l a0,COP1LC(a6)
move.w COPJMP1(a6),d0
move.w #(DMAF_BLITTER|DMAF_SETCLR!DMAF_COPPER!DMAF_RASTER!DMAF_MASTER),DMACON(a6)
;; move.w #(INTF_SETCLR|INTF_VERTB|INTF_INTEN),INTENA(a6)
movem.l (sp)+,d0-a6
rts

89
014.lace_mode/lace_mode.s Normal file
View File

@ -0,0 +1,89 @@
include "../include/registers.i"
include "hardware/dmabits.i"
include "hardware/intbits.i"
include "constants.i"
entry:
lea CUSTOM,a6
bsr init
bsr.s installColorPalette
.mainLoop:
bsr waitVerticalBlank
cmpi.w #0,cycle
bne.s .alternate
move.w #1,cycle
bsr.s pokeBitplanePointers2
bra .done
.alternate:
move.w #0,cycle
bsr.s pokeBitplanePointers
.done
bra .mainLoop
include "init.s"
include "utils.s"
pokeBitplanePointers:
;; poke bitplane pointers
movem.l d0-a6,-(sp)
lea bitplanes(pc),a1
lea copper(pc),a2
moveq #SCREEN_BIT_DEPTH-1,d0
.bitplaneloop:
move.l a1,d1
move.w d1,2(a2)
swap d1
move.w d1,6(a2)
lea SCREEN_WIDTH_BYTES(a1),a1 ; bit plane data is interleaved
addq #8,a2
dbra d0,.bitplaneloop
movem.l (sp)+,d0-a6
rts
pokeBitplanePointers2:
;; poke bitplane pointers
movem.l d0-a6,-(sp)
lea bitplanes(pc),a1
add.w #SCREEN_WIDTH_BYTES*SCREEN_BIT_DEPTH,a1
lea copper(pc),a2
moveq #SCREEN_BIT_DEPTH-1,d0
.bitplaneloop:
move.l a1,d1
move.w d1,2(a2)
swap d1
move.w d1,6(a2)
lea SCREEN_WIDTH_BYTES(a1),a1 ; bit plane data is interleaved
addq #8,a2
dbra d0,.bitplaneloop
movem.l (sp)+,d0-a6
rts
installColorPalette:
include "out/image-palette.s"
rts
cycle:
dc.l 0
copper:
;; bitplane pointers must be first else poking addresses will be incorrect
dc.w BPL1PTL,0
dc.w BPL1PTH,0
dc.w BPL2PTL,0
dc.w BPL2PTH,0
dc.w BPL3PTL,0
dc.w BPL3PTH,0
dc.w BPL4PTL,0
dc.w BPL4PTH,0
dc.w BPL5PTL,0
dc.w BPL5PTH,0
dc.w BPL6PTL,0
dc.w BPL6PTH,0
dc.l $fffffffe
bitplanes:
incbin "out/image-ham.bin"

23
014.lace_mode/utils.s Normal file
View File

@ -0,0 +1,23 @@
waitVerticalBlank:
movem.l d0-a6,-(sp)
.loop move.l $dff004,d0
and.l #$1ff00,d0
cmp.l #303<<8,d0
bne.b .loop
movem.l (sp)+,d0-a6
rts
waitRaster: ;wait for rasterline d0.w. Modifies d0-d2/a0.
movem.l d0-a6,-(sp)
move.l #$1ff00,d2
lsl.l #8,d0
and.l d2,d0
lea $dff004,a0
.wr: move.l (a0),d1
and.l d2,d1
cmp.l d1,d0
bne.s .wr
movem.l (sp)+,d0-a6
rts