From 1fd19b7844e48e1535a8c232cb11c3dd3090e823 Mon Sep 17 00:00:00 2001 From: alpine9000 Date: Sun, 13 Mar 2016 18:05:59 +1100 Subject: [PATCH] First try and dual playfield --- 017.dual_playfield/Makefile | 17 +++++ 017.dual_playfield/README.md | 18 +++++ .../bin/dual_playfield_mode.adf | Bin 0 -> 901120 bytes 017.dual_playfield/constants.i | 11 +++ 017.dual_playfield/dual_playfield_mode.s | 63 ++++++++++++++++++ 017.dual_playfield/init.s | 38 +++++++++++ 017.dual_playfield/utils.s | 23 +++++++ 7 files changed, 170 insertions(+) create mode 100644 017.dual_playfield/Makefile create mode 100644 017.dual_playfield/README.md create mode 100644 017.dual_playfield/bin/dual_playfield_mode.adf create mode 100644 017.dual_playfield/constants.i create mode 100644 017.dual_playfield/dual_playfield_mode.s create mode 100644 017.dual_playfield/init.s create mode 100644 017.dual_playfield/utils.s diff --git a/017.dual_playfield/Makefile b/017.dual_playfield/Makefile new file mode 100644 index 0000000..e488a6e --- /dev/null +++ b/017.dual_playfield/Makefile @@ -0,0 +1,17 @@ +MODULE=dual_playfield_mode.s +FLOPPY=bin/dual_playfield_mode.adf +IMAGEDATA=out/playfield1-palette.s out/playfield2-palette.s out/playfield1.bin out/playfield2.bin +PF1_FILE=../assets/playfield1.png +PF2_FILE=../assets/playfield2.png + +EXTRA=$(IMAGEDATA) init.s utils.s constants.i Makefile +BASE_ADDRESS=10000 + +include ../shared/base.mk + +$(IMAGEDATA): $(IMAGECON) $(PF1_FILE) $(PF2_FILE) + echo "imagecon = " $(IMAGECON) + $(IMAGECON) --input $(PF1_FILE) --output out/playfield1 --output-bitplanes --output-palette-asm --output-palette + $(IMAGECON) --input $(PF2_FILE) --output out/playfield2 --output-bitplanes --output-palette-asm --palette-offset 8 --output-palette + + diff --git a/017.dual_playfield/README.md b/017.dual_playfield/README.md new file mode 100644 index 0000000..ccd1f43 --- /dev/null +++ b/017.dual_playfield/README.md @@ -0,0 +1,18 @@ +dual playfield +============== + +Work in progress + +try it +------ + * [Download disk image](bin/dual_playfield_mode.adf?raw=true) + * Run in SAE + + +interlaced +---------- +![interlaced](screenshots/laced-new.png?raw=true) + +non-interlaced +-------------- +![non-interlaced](../013.dithered_ham/screenshots/dithered.png?raw=true) diff --git a/017.dual_playfield/bin/dual_playfield_mode.adf b/017.dual_playfield/bin/dual_playfield_mode.adf new file mode 100644 index 0000000000000000000000000000000000000000..611b2331ab48f17b8d30e0bafd5394aaa105c277 GIT binary patch literal 901120 zcmeI)zmFVe9S7idS&K<%h8`=65(^nAfDuiQa<@8}!U$r1{R456ioz6htJ^ytl2avC zgi_E@(4$mTR_WYTmw-(u+5Ld;C(~j^)a?M(Npf zIlprA&o_VO9{~cNUV&F0rw7w?>zP|A{pHr}SLZkWSs(9=iaNc$GaA?FSMmD0dr#8r z`jg((*uEFrA6t}XkY$zoWZ5Z{nV?|JMs99^x6lfd#}8lUw`=e z2o*s;_>s>|DCS>@Wzk+P%n+qUgO?}y@PA_ z%Q~L##B<6cwR#g4tliaYklZS{MTSjzym2@eRUG&1c##{_{b?H4kEXqPQXUNF+j8UjXc}MckETT(>f_^l-Mg`# zE=84Myt;mWnm&$PS%-REZ_MqMhxL08XH9Mpxx+2F{qk^LKAiPt&-JE**gTq*8^=2? z52r;n?@c2&4E3XFu_;&PJ^gCd;^c%!ttHJ9gAQSEoR zVR?7b%!f6XxVXrb)qau3o2S9nTzmrky4o!!k&9oX<(re{SL@n%RlakEbv3+5E^ekl z`SkG)>yIOM@YLfT9rvrjn>ja+v)F!q*}436id_63Xv_8H>&VU*$;BsC6%X3+!nxYy zoX5Lc6;*MZbNgFAw>DRHxnazME%POx-*iy*=Xt#0LCl^l^DlBSY1-T%X3w_y+~#`C zc<0?8DUUGk&GK>E`)%`m6!V~d)a7F0bocMteVLkNIEmY+*%}|jb>(TlZE0+`?Ob~O zqPc#x^rmw*iwoxdI5}sKrCs$!a|cUrI%l)KVD9*wG3+8hfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U_{<1w?@PYAa*dn&lF{{v z9@O#@xea~E$PHGDEs@*MmyFzSwNMke4SmVTjq7UVxEuSDk*il*NJX`&FB!RcQ_@=u z8M#GYvTepiyDoa9y_14dmyFz^FZq<*qA!_qZC^6Rn>OXtZnWTR`i<*-$!)pyzT~#t zdS7y5F83wt)xKops;q|DdrY{-e#ThIwMHSa^ zw<>ZEGICvCGUnCl<)$vz^d%$L^(C8mnwFO)*YzcHuI)?C)@D_FzEvEz>q|zi>q|y1 zzIW2nvdBeWGICvCa!ao3OGd8iOK!<^eaXmmeaW-A_7wCbmp+Qs&DCEQtNWIJx@c}~ z{w@z;n*ad<1PBlyK!5;&PrAUT>u*7R(lwnQ0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF S5FkK+009C72oU%z2>c&aaW)+Q literal 0 HcmV?d00001 diff --git a/017.dual_playfield/constants.i b/017.dual_playfield/constants.i new file mode 100644 index 0000000..2f85b31 --- /dev/null +++ b/017.dual_playfield/constants.i @@ -0,0 +1,11 @@ +VPOSRLOFBIT equ 15 +LVL3_INT_VECTOR equ $6c +SCREEN_WIDTH equ 320 +SCREEN_HEIGHT equ 256 +SCREEN_WIDTH_BYTES equ (SCREEN_WIDTH/8) +SCREEN_BIT_DEPTH equ 1 +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 diff --git a/017.dual_playfield/dual_playfield_mode.s b/017.dual_playfield/dual_playfield_mode.s new file mode 100644 index 0000000..c553969 --- /dev/null +++ b/017.dual_playfield/dual_playfield_mode.s @@ -0,0 +1,63 @@ + 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 + + bra .mainLoop + + include "init.s" + include "utils.s" + + +pokeBitplanePointers: ; d0 = frame offset in bytes, a0 = BPLP copper list address + movem.l d0-a6,-(sp) + moveq #SCREEN_BIT_DEPTH-1,d0 +.bitplaneloop: + move.l a1,d1 + move.w d1,2(a0) + swap d1 + move.w d1,6(a0) + lea SCREEN_WIDTH_BYTES(a1),a1 + addq #8,a0 + dbra d0,.bitplaneloop + movem.l (sp)+,d0-a6 + rts + + +installColorPalette: + include "out/playfield1-palette.s" + include "out/playfield2-palette.s" + rts + +copper: + ;; bitplane pointers must be first else poking addresses will be incorrect +pf1_bitplanepointers: + dc.w BPL1PTL,0 + dc.w BPL1PTH,0 +pf2_bitplanepointers: + 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 + +pf1_bitplanes: + incbin "out/playfield1.bin" + +pf2_bitplanes: + incbin "out/playfield2.bin" \ No newline at end of file diff --git a/017.dual_playfield/init.s b/017.dual_playfield/init.s new file mode 100644 index 0000000..140a440 --- /dev/null +++ b/017.dual_playfield/init.s @@ -0,0 +1,38 @@ + 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 + + lea pf1_bitplanepointers(pc),a0 + lea pf1_bitplanes(pc),a1 + bsr.s pokeBitplanePointers + + lea pf2_bitplanepointers(pc),a0 + lea pf2_bitplanes(pc),a1 + bsr.s pokeBitplanePointers + + ;; 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*2)<<12)|COLOR_ON|DBLPF,BPLCON0(a6) + move.w #SCREEN_WIDTH_BYTES*SCREEN_BIT_DEPTH-SCREEN_WIDTH_BYTES,BPL1MOD(a6) + move.w #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 \ No newline at end of file diff --git a/017.dual_playfield/utils.s b/017.dual_playfield/utils.s new file mode 100644 index 0000000..bdde568 --- /dev/null +++ b/017.dual_playfield/utils.s @@ -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 \ No newline at end of file