From 160a4255a34dea081cd1fa5bcbcc968e71b9cb24 Mon Sep 17 00:00:00 2001 From: alpine9000 Date: Sun, 28 Feb 2016 22:07:31 +1100 Subject: [PATCH] First attempt at a copper list --- 004.copper_bars/Makefile | 14 +++++++ 004.copper_bars/README.md | 3 ++ 004.copper_bars/copper.s | 58 +++++++++++++++++++++++++++++ 004.copper_bars/copper_gen | Bin 0 -> 8616 bytes 004.copper_bars/copper_gen.c | 69 +++++++++++++++++++++++++++++++++++ Makefile | 2 +- 6 files changed, 145 insertions(+), 1 deletion(-) create mode 100644 004.copper_bars/Makefile create mode 100644 004.copper_bars/README.md create mode 100644 004.copper_bars/copper.s create mode 100755 004.copper_bars/copper_gen create mode 100644 004.copper_bars/copper_gen.c diff --git a/004.copper_bars/Makefile b/004.copper_bars/Makefile new file mode 100644 index 0000000..721ca4b --- /dev/null +++ b/004.copper_bars/Makefile @@ -0,0 +1,14 @@ +MAKEADF=../tools/makeadf +FLOPPY=bin/image.adf +EXTRA=out/copper-list.s + +MODULE=copper.s + +include ../base.mk + +out/copper-list.s: out/copper_gen + ./out/copper_gen > out/copper-list.s + +out/copper_gen: copper_gen.c + gcc copper_gen.c -o out/copper_gen + diff --git a/004.copper_bars/README.md b/004.copper_bars/README.md new file mode 100644 index 0000000..0523cfb --- /dev/null +++ b/004.copper_bars/README.md @@ -0,0 +1,3 @@ +Copper bars +=========== + diff --git a/004.copper_bars/copper.s b/004.copper_bars/copper.s new file mode 100644 index 0000000..60462c0 --- /dev/null +++ b/004.copper_bars/copper.s @@ -0,0 +1,58 @@ + include "../include/registers.i" + include "hardware/dmabits.i" + include "hardware/intbits.i" + +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+SCREEN_HEIGHT + +entry: + ;; custom chip base globally in a6 + lea CUSTOM,a6 + + ;; poke bitplane pointers into the copper list + lea bitplane(pc),a0 + lea copperBitPlanePtr(pc),a1 + move.l a0,d0 + move.w d0,6(a1) ;BPL1PTL + swap d0 + move.w d0,2(a1) ;BPL1PTH + + 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)|$200,BPLCON0(a6) + move.w #SCREEN_WIDTH_BYTES*SCREEN_BIT_DEPTH-SCREEN_WIDTH_BYTES,BPL1MOD(a6) + + ;; install copper list and enable DMA + lea copper(pc),a0 + move.l a0,COP1LC(a6) + move.w COPJMP1(a6),d0 + move.w #(DMAF_SETCLR!DMAF_COPPER!DMAF_RASTER!DMAF_MASTER),dmacon(a6) + +.mainLoop: + bra.b .mainLoop + +copper: +copperBitPlanePtr: + dc.w BPL1PTH,0 ; address of the bitplane will be poked once we know it + dc.w BPL1PTL,0 + + dc.w COLOR00,$0000 + + include "out/copper-list.s" + + dc.l $fffffffe + +bitplane: + dcb.b (SCREEN_WIDTH*SCREEN_HEIGHT)/8,$00 diff --git a/004.copper_bars/copper_gen b/004.copper_bars/copper_gen new file mode 100755 index 0000000000000000000000000000000000000000..2963ca9d76767195e9724d9d62c2b12f070e0f68 GIT binary patch literal 8616 zcmeHNU2IfE6rQCm6e#SjL4qP?C9T%FmTh7p(Ga%KYlqM+$d9RnI<))aZrt5A`xA<> zNgJ%;=B9Du6TIysDi2Mp37VShN<)jOp_pi@;h`Ed+XSPwh9VNy@7$mE?iMj7zL?x0 zGiSb;bH01dnYr!l3|H^`d~Xe7whG1uRx!rxsM#vUhL{UI#vVcCs6rfUZk3KnhYrwa zX|a{U`y%4$!vlmkB6S=oRZ;C7rDIIT@QuM8Mv{sUsbF79>ub1_&#@lCVB#(UqC&V* z>uPN!8!$s5lBslea%rgCzZxWj_#VwK&A0gX?DgVEk#0%PTTE}gGY*C$MQ zUn(p7^Y_G)%K?}39n|@1bppbA=u4F5ju8H2DiMjlt`C;;rF6ch^?AbPQsOHngh)I2G^~5!_GG33)*I`P&`MpqcVHiU$zxQqX+V@K>`;2$iRhBnk zD(7_q^2^M%9Y0q*q~Kz#8loD~hzXFnfa@VSWCtXNvCBXBAj0H(4PmHZHW;jQoacYmb(u)lfzpKIG| zF@{vap>=9)FffgwAeI5LJ3+*zLU1Q4%~6cDbzi`B+w!yV{KKb`sbH*ePb2(@bVCW{ zNmP1X)}_Tk?jg$6wzQqt9uKECM z-0z#=kt_5|g4-s!EKNgA0)K-K2CwE9>>U#5kL3yhd<3B5o1IsOkNIxQ+dJ~}nBodq zImu%QPMIv>6D%A4$7WwIMPv@mj zM$PBo%`B!Sq`PQY;oQAq@nREta=t0|Da9;*!-xAP+lHmWgmjy}*0|iCX_F_ooIWF8 z=E~7CT=osfLvMk&@Cuya%7za~$i5k+>V5QNX_hO#441DeACnf@6x^6lq}$KB=@HWS zgp@-EZj6zm+%Jtc-IC{FHozBulP}BZixbkQrZGZ7kw#yX#_hx3L4B}aow2`7zke}t zZn6L3;2qMk4{cV5a(ehVMHcH-J zJJ#ByIAthS8;aCX6{|}WrxD9wo)S9vN0Fj`_b^&MysI8bn#Vg+1Bv`pkqT{@No-G4 z_ca1jI=Dh$S_Lh3cV50c!U{t$kcXlOeU3ggLHRWVQGNocNF#E7Fi#67`$qm1vAX(0 zVIqdL>YPd=jm|xao!FG)gX39DbY3df-GeOF;j;|wD$-(Y!`r@xXg*x5y9SvF)8O1s zU<=bH zM)n?PJ8;P3abt%5;R93qmL_^CW{GX3{%!jlB-IW0JBSMP@uK6q)`ssyH3S;AZK4*X z;>|sXQRtBsLSQ)S~U}eC{fRzC& z16BsC3|JZXzh%I=-9aZf%;}}eFZD89bmKl3m)9>RScWAWPOpdsW65BO&=#OxTpy=G zgj_($NE}_9FbLe!SBO|x1p9*ibSj8D@GhcxD%QoG@%Kb~5=quZ#};hW8^OJVTN7P@ zNHCsad%)3J!7`h1bTPXH&4`QisAM)zYc}ZHZFKXcor%z)n;j=4#=Yj_gmIoh_il8o zQLAI){{uV^jPa!t4;;vp;MOwSR)%p%tNuR(y2qtEP86?s%!M1+m9gVeR*hT4x)37T S^2m+U8c9{txnd>ou)hG%SDl>z literal 0 HcmV?d00001 diff --git a/004.copper_bars/copper_gen.c b/004.copper_bars/copper_gen.c new file mode 100644 index 0000000..297c0f3 --- /dev/null +++ b/004.copper_bars/copper_gen.c @@ -0,0 +1,69 @@ +// http://krazydad.com/tutorials/makecolors.php + +#include +#include + +typedef struct { + float r; + float g; + float b; +} color; + +#define numColors 50 +color colors[numColors]; + +void +makeColorGradient() +{ + float frequencyr = 02; + float frequencyg = 02; + float frequencyb = 02; + float phase1 = 0.1, phase2 = 0.1, phase3 = 0.1; + float center = 0x7; + float width = 0x7; + float len = numColors; + + for (int i = 0; i < len; ++i) { + color* c = &colors[i]; + c->r = sin(frequencyr*i + phase1) * width + center; + c->g = sin(frequencyg*i + phase2) * width + center; + c->b = sin(frequencyb*i + phase3) * width + center; + } +} + +int +main() +{ + makeColorGradient(); + + int lines = 312; + color start = { 0x0, 0x0, 0x0}; + color end = { 0xF, 0xF, 0xF}; + color current = {0}; + int count = lines-0x2c; + int from = 0, to = 1; + int segment = count/((sizeof(colors)/sizeof(color))-1); + + for (int i = 0, y = 0; i < count; i++) { + if (i != 0 && i % segment == 0) { + from++; + to++; + } + + float distance = (float)((i)%segment)/segment; + color* start = &colors[from]; + color* end = &colors[to]; + current.r = start->r + ((end->r-start->r)*distance); + current.g = start->g + ((end->g-start->g)*distance); + current.b = start->b + ((end->b-start->b)*distance); + + if (0x2c+i <= 255) { + printf("\tdc.w $%xdf,$fffe\n\tdc.w COLOR00,$%x%x%x\n",0x2c+i, (int)(current.r+0.5), (int)(current.g+0.5), (int)(current.b+0.5)); + } else { + printf("\tdc.w $%xdf,$fffe\n\tdc.w COLOR00,$%x%x%x\n",y++, (int)(current.r+0.5), (int)(current.g+0.5), (int)(current.b+0.5)); + } + + } + + return 0; +} diff --git a/Makefile b/Makefile index 926bb6a..ec46c57 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -SUBDIRS=000.trackdisk 001.simple_image 002.sprite_display 003.music +SUBDIRS=000.trackdisk 001.simple_image 002.sprite_display 003.music 004.copper_bars .PHONY: subdirs $(SUBDIRS)