Compare commits
No commits in common. "main" and "jb/precise-topaz-replacement" have entirely different histories.
main
...
jb/precise
90
32x50_bun.c
90
32x50_bun.c
|
@ -1,90 +0,0 @@
|
||||||
/**
|
|
||||||
* What do we need
|
|
||||||
* * [ ] screen setup
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <hardware/custom.h>
|
|
||||||
#include <hardware/cia.h>
|
|
||||||
|
|
||||||
#include <clib/graphics_protos.h>
|
|
||||||
|
|
||||||
#include "system/system.h"
|
|
||||||
#include "system/copper.h"
|
|
||||||
#include "system/blitter.h"
|
|
||||||
|
|
||||||
#include "screen.h"
|
|
||||||
|
|
||||||
extern struct Custom far custom;
|
|
||||||
extern struct CIA far ciaa;
|
|
||||||
|
|
||||||
uint16_t custom_color = (uint16_t)offsetof(Custom, color);
|
|
||||||
uint16_t custom_sprite = (uint16_t)offsetof(Custom, sprpt);
|
|
||||||
uint16_t custom_sprite_control = (uint16_t)offsetof(Custom, spr);
|
|
||||||
|
|
||||||
extern unsigned char chip coolbun[];
|
|
||||||
|
|
||||||
int main(void) {
|
|
||||||
struct ScreenDefinition screenDefinition;
|
|
||||||
struct ActiveScreenBufferDetails activeScreenBufferDetails;
|
|
||||||
uint16_t *copperlist, *currentCopperlist;
|
|
||||||
void *copperlistBitplanePointers[8][2];
|
|
||||||
int i, plane;
|
|
||||||
|
|
||||||
allocateDoubleBufferedScreenMemory(
|
|
||||||
&screenDefinition,
|
|
||||||
&activeScreenBufferDetails,
|
|
||||||
320,
|
|
||||||
256,
|
|
||||||
2
|
|
||||||
);
|
|
||||||
|
|
||||||
copperlist = prepareNewCopperlist(300);
|
|
||||||
|
|
||||||
currentCopperlist = addDisplayToCopperlist(
|
|
||||||
copperlist,
|
|
||||||
&screenDefinition,
|
|
||||||
&activeScreenBufferDetails,
|
|
||||||
&copperlistBitplanePointers
|
|
||||||
);
|
|
||||||
|
|
||||||
COPPERLIST_MOVE(currentCopperlist, custom_color, 0x3a6);
|
|
||||||
COPPERLIST_MOVE(currentCopperlist, custom_color + 2, 0x000);
|
|
||||||
COPPERLIST_MOVE(currentCopperlist, custom_color + 4, 0xfff);
|
|
||||||
currentCopperlist = setUpEmptySpritesInCopperlist(currentCopperlist);
|
|
||||||
|
|
||||||
endCopperlist(currentCopperlist);
|
|
||||||
|
|
||||||
takeOverSystem();
|
|
||||||
|
|
||||||
setCopperlist(copperlist);
|
|
||||||
setUpDisplay((uint32_t)screenDefinition.bitplanes);
|
|
||||||
|
|
||||||
// Render a bun at 32x50
|
|
||||||
|
|
||||||
for (plane = 0; plane < 2; ++plane) {
|
|
||||||
custom.bltcon0 = BLTCON0(0xf0, 1, 0, 0, 1, 0);
|
|
||||||
custom.bltcon1 = BLTCON1(BLITTER_ASCENDING, 0);
|
|
||||||
|
|
||||||
custom.bltapt = coolbun + (plane * 4 * 32);
|
|
||||||
custom.bltdpt = activeScreenBufferDetails.planes[plane] + (50 * 320 / 8) + 32 / 8;
|
|
||||||
custom.bltafwm = 0xffff;
|
|
||||||
custom.bltalwm = 0xffff;
|
|
||||||
|
|
||||||
custom.bltamod = 0;
|
|
||||||
custom.bltdmod = 40 - 4;
|
|
||||||
|
|
||||||
custom.bltsize = 2 + (32 << 6);
|
|
||||||
|
|
||||||
WaitBlit();
|
|
||||||
}
|
|
||||||
|
|
||||||
while (1) {
|
|
||||||
if ((ciaa.ciapra >> 6) != 3) break;
|
|
||||||
}
|
|
||||||
|
|
||||||
giveBackSystem();
|
|
||||||
|
|
||||||
freeCopperlist(copperlist);
|
|
||||||
|
|
||||||
teardownScreen(&screenDefinition);
|
|
||||||
}
|
|
127
33x50_bun.c
127
33x50_bun.c
|
@ -1,127 +0,0 @@
|
||||||
/**
|
|
||||||
* What do we need
|
|
||||||
* * [ ] screen setup
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <hardware/custom.h>
|
|
||||||
#include <hardware/cia.h>
|
|
||||||
|
|
||||||
#include <clib/graphics_protos.h>
|
|
||||||
|
|
||||||
#include "system/system.h"
|
|
||||||
#include "system/copper.h"
|
|
||||||
#include "system/blitter.h"
|
|
||||||
|
|
||||||
#include "screen.h"
|
|
||||||
|
|
||||||
extern struct Custom far custom;
|
|
||||||
extern struct CIA far ciaa;
|
|
||||||
|
|
||||||
uint16_t custom_color = (uint16_t)offsetof(Custom, color);
|
|
||||||
uint16_t custom_sprite = (uint16_t)offsetof(Custom, sprpt);
|
|
||||||
uint16_t custom_sprite_control = (uint16_t)offsetof(Custom, spr);
|
|
||||||
|
|
||||||
extern unsigned char chip coolbun[];
|
|
||||||
|
|
||||||
int main(void) {
|
|
||||||
struct ScreenDefinition screenDefinition;
|
|
||||||
struct ActiveScreenBufferDetails activeScreenBufferDetails;
|
|
||||||
uint16_t *copperlist, *currentCopperlist;
|
|
||||||
void *copperlistBitplanePointers[8][2];
|
|
||||||
int i, plane, x, y, dirX, dirY, shift, byteX;
|
|
||||||
|
|
||||||
allocateDoubleBufferedScreenMemory(
|
|
||||||
&screenDefinition,
|
|
||||||
&activeScreenBufferDetails,
|
|
||||||
320,
|
|
||||||
256,
|
|
||||||
2
|
|
||||||
);
|
|
||||||
|
|
||||||
copperlist = prepareNewCopperlist(300);
|
|
||||||
|
|
||||||
currentCopperlist = addDisplayToCopperlist(
|
|
||||||
copperlist,
|
|
||||||
&screenDefinition,
|
|
||||||
&activeScreenBufferDetails,
|
|
||||||
&copperlistBitplanePointers
|
|
||||||
);
|
|
||||||
|
|
||||||
COPPERLIST_MOVE(currentCopperlist, custom_color, 0x3a6);
|
|
||||||
COPPERLIST_MOVE(currentCopperlist, custom_color + 2, 0x000);
|
|
||||||
COPPERLIST_MOVE(currentCopperlist, custom_color + 4, 0xfff);
|
|
||||||
currentCopperlist = setUpEmptySpritesInCopperlist(currentCopperlist);
|
|
||||||
|
|
||||||
endCopperlist(currentCopperlist);
|
|
||||||
|
|
||||||
takeOverSystem();
|
|
||||||
|
|
||||||
setCopperlist(copperlist);
|
|
||||||
setUpDisplay((uint32_t)screenDefinition.bitplanes);
|
|
||||||
|
|
||||||
// Render a bun at 32x50
|
|
||||||
|
|
||||||
x = 32;
|
|
||||||
y = 50;
|
|
||||||
dirX = 1;
|
|
||||||
dirY = 1;
|
|
||||||
|
|
||||||
while (1) {
|
|
||||||
WaitTOF();
|
|
||||||
|
|
||||||
swapCurrentScreenBuffer(&screenDefinition, &activeScreenBufferDetails);
|
|
||||||
|
|
||||||
shift = x & 15;
|
|
||||||
byteX = (x >> 4 * 2);
|
|
||||||
|
|
||||||
for (plane = 0; plane < 2; ++plane) {
|
|
||||||
custom.bltcon0 = BLTCON0(0xf0, 1, 0, 0, 1, shift);
|
|
||||||
custom.bltcon1 = BLTCON1(BLITTER_ASCENDING, 0);
|
|
||||||
|
|
||||||
custom.bltapt = coolbun + (plane * 4 * 32);
|
|
||||||
custom.bltdpt = activeScreenBufferDetails.planes[plane] + (y * 320 / 8) + byteX;
|
|
||||||
custom.bltafwm = 0xffff;
|
|
||||||
|
|
||||||
if (shift == 0) {
|
|
||||||
custom.bltalwm = 0xffff;;
|
|
||||||
} else {
|
|
||||||
custom.bltalwm = 0x0000;
|
|
||||||
}
|
|
||||||
|
|
||||||
custom.bltamod = shift ? -2 : 0;
|
|
||||||
custom.bltdmod = 40 - (shift ? 6 : 4);
|
|
||||||
|
|
||||||
custom.bltsize = (shift ? 3 : 2) + (32 << 6);
|
|
||||||
|
|
||||||
WaitBlit();
|
|
||||||
}
|
|
||||||
|
|
||||||
x += dirX;
|
|
||||||
if (x == 320 - 32) {
|
|
||||||
x -= 1;
|
|
||||||
dirX = -dirX;
|
|
||||||
}
|
|
||||||
if (x < 0) {
|
|
||||||
x = 0;
|
|
||||||
dirX = -dirX;
|
|
||||||
}
|
|
||||||
|
|
||||||
y += dirY;
|
|
||||||
if (y == 256 - 32) {
|
|
||||||
y -= 1;
|
|
||||||
dirY = -dirY;
|
|
||||||
}
|
|
||||||
if (y > 0) {
|
|
||||||
y = 0;
|
|
||||||
dirY -= dirY;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((ciaa.ciapra >> 6) != 3) break;
|
|
||||||
}
|
|
||||||
|
|
||||||
giveBackSystem();
|
|
||||||
|
|
||||||
freeCopperlist(copperlist);
|
|
||||||
|
|
||||||
teardownScreen(&screenDefinition);
|
|
||||||
}
|
|
|
@ -0,0 +1 @@
|
||||||
|
* [ ] Move bun calculation to separate file for CuTest and vamos
|
50
README.md
50
README.md
|
@ -1,50 +0,0 @@
|
||||||
## Cool Bun Demo
|
|
||||||
|
|
||||||
![demo](./demo.gif)
|
|
||||||
|
|
||||||
Built for [The Obligatory Amiga Blitter Video](https://makertube.net/w/eV545ku522sRq8CTcxDuFZ).
|
|
||||||
|
|
||||||
Uses a bunch of C and Assembler code to drive the blitter, sprites, and copper
|
|
||||||
to display high color Topaz art overtop of flying cool bun logos.
|
|
||||||
|
|
||||||
## Running
|
|
||||||
|
|
||||||
Click the mouse to escape any demo.
|
|
||||||
|
|
||||||
* `main`: Main demo
|
|
||||||
* `32x50`, `33x50`, `left_side`, `right_side`: Rendering Cool Bun in various
|
|
||||||
locations on screen.
|
|
||||||
* `any_position`: Cool Bun flies around like a DVD player pause screen.
|
|
||||||
* `keyboard_interrupt`: Tests using `input.device` to access the keyboard.
|
|
||||||
* `blitter_speed_test`: Get the speed of blitter vs. CPU memory operations
|
|
||||||
* `bun_test`: Run some unit tests (yes, really!)
|
|
||||||
|
|
||||||
This will get 50 fps on an 020, and 25 or lower on an 68EC020 and below.
|
|
||||||
|
|
||||||
## Building
|
|
||||||
|
|
||||||
### Vamos
|
|
||||||
|
|
||||||
You'll want [Vamos](https://github.com/cnvogelg/amitools/blob/master/docs/vamos.md),
|
|
||||||
and [SAS/C](https://www.amigaclub.be/blog/steffest/2/amiga-c%20compilers)
|
|
||||||
& [GenAm from DevPac](https://archive.org/details/Devpac_v3.14_1994-12-16_HiSoft)
|
|
||||||
on Vamos's path:
|
|
||||||
|
|
||||||
```
|
|
||||||
# main
|
|
||||||
ruby ./image_converter.rb && touch images.s && vamos -- smake
|
|
||||||
|
|
||||||
# any others
|
|
||||||
vamos -- smake <other>
|
|
||||||
```
|
|
||||||
|
|
||||||
The image converter requires Ruby 3.2.4 and RMagick installed.
|
|
||||||
|
|
||||||
## Performance
|
|
||||||
|
|
||||||
The best way I can think of to make this way faster is for a script in
|
|
||||||
Ruby or Python to calculate every blitter register for every frame of data
|
|
||||||
for bun renders and clears, store that in a list of words, and rip through
|
|
||||||
those lists in Assembler, shotgunning the values directly into the registers
|
|
||||||
without the C code needing to track bun positions and bun clears. That's a
|
|
||||||
project for another day.
|
|
BIN
any_position
BIN
any_position
Binary file not shown.
144
any_position.c
144
any_position.c
|
@ -1,144 +0,0 @@
|
||||||
/**
|
|
||||||
* What do we need
|
|
||||||
* * [ ] screen setup
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <hardware/custom.h>
|
|
||||||
#include <hardware/cia.h>
|
|
||||||
|
|
||||||
#include <clib/graphics_protos.h>
|
|
||||||
|
|
||||||
#include "system/system.h"
|
|
||||||
#include "system/copper.h"
|
|
||||||
#include "system/blitter.h"
|
|
||||||
|
|
||||||
#include "screen.h"
|
|
||||||
|
|
||||||
extern struct Custom far custom;
|
|
||||||
extern struct CIA far ciaa;
|
|
||||||
|
|
||||||
uint16_t custom_color = (uint16_t)offsetof(Custom, color);
|
|
||||||
uint16_t custom_sprite = (uint16_t)offsetof(Custom, sprpt);
|
|
||||||
uint16_t custom_sprite_control = (uint16_t)offsetof(Custom, spr);
|
|
||||||
|
|
||||||
extern unsigned char chip coolbun[];
|
|
||||||
|
|
||||||
int main(void) {
|
|
||||||
struct ScreenDefinition screenDefinition;
|
|
||||||
struct ActiveScreenBufferDetails activeScreenBufferDetails;
|
|
||||||
uint16_t *copperlist, *currentCopperlist;
|
|
||||||
void *copperlistBitplanePointers[8][2];
|
|
||||||
int i, plane, x, y, dirX, dirY, shift, byteX, clearY;
|
|
||||||
|
|
||||||
allocateDoubleBufferedScreenMemory(
|
|
||||||
&screenDefinition,
|
|
||||||
&activeScreenBufferDetails,
|
|
||||||
320,
|
|
||||||
256,
|
|
||||||
2
|
|
||||||
);
|
|
||||||
|
|
||||||
copperlist = prepareNewCopperlist(300);
|
|
||||||
|
|
||||||
currentCopperlist = addDisplayToCopperlist(
|
|
||||||
copperlist,
|
|
||||||
&screenDefinition,
|
|
||||||
&activeScreenBufferDetails,
|
|
||||||
&copperlistBitplanePointers
|
|
||||||
);
|
|
||||||
|
|
||||||
COPPERLIST_MOVE(currentCopperlist, custom_color, 0x3a6);
|
|
||||||
COPPERLIST_MOVE(currentCopperlist, custom_color + 2, 0x000);
|
|
||||||
COPPERLIST_MOVE(currentCopperlist, custom_color + 4, 0xfff);
|
|
||||||
currentCopperlist = setUpEmptySpritesInCopperlist(currentCopperlist);
|
|
||||||
|
|
||||||
endCopperlist(currentCopperlist);
|
|
||||||
|
|
||||||
takeOverSystem();
|
|
||||||
|
|
||||||
setCopperlist(copperlist);
|
|
||||||
setUpDisplay((uint32_t)screenDefinition.bitplanes);
|
|
||||||
|
|
||||||
// Render a bun at 32x50
|
|
||||||
|
|
||||||
x = 32;
|
|
||||||
y = 50;
|
|
||||||
dirX = 1;
|
|
||||||
dirY = 1;
|
|
||||||
|
|
||||||
while (1) {
|
|
||||||
WaitTOF();
|
|
||||||
|
|
||||||
swapCurrentScreenBuffer(&screenDefinition, &activeScreenBufferDetails);
|
|
||||||
|
|
||||||
shift = x & 15;
|
|
||||||
byteX = ((x >> 4) * 2);
|
|
||||||
clearY = y - 4;
|
|
||||||
if (clearY < 0) clearY = 0;
|
|
||||||
if (clearY + 40 > 255) clearY = 255 - 40;
|
|
||||||
|
|
||||||
for (plane = 0; plane < 2; ++plane) {
|
|
||||||
custom.bltcon0 = BLTCON0(0xc0, 0, 0, 0, 1, 0);
|
|
||||||
custom.bltcon1 = 0;
|
|
||||||
|
|
||||||
custom.bltadat = 0x0000;
|
|
||||||
custom.bltdpt = activeScreenBufferDetails.planes[plane] + (clearY * 320 / 8);
|
|
||||||
custom.bltafwm = 0xffff;
|
|
||||||
custom.bltalwm = 0xffff;
|
|
||||||
custom.bltsize = BLTSIZE(20, 40);
|
|
||||||
custom.bltdmod = 0;
|
|
||||||
|
|
||||||
WaitBlit();
|
|
||||||
}
|
|
||||||
|
|
||||||
for (plane = 0; plane < 2; ++plane) {
|
|
||||||
custom.bltcon0 = BLTCON0(0xf0, 1, 0, 0, 1, shift);
|
|
||||||
custom.bltcon1 = BLTCON1(BLITTER_ASCENDING, 0);
|
|
||||||
|
|
||||||
custom.bltapt = coolbun + (plane * 4 * 32);
|
|
||||||
custom.bltdpt = activeScreenBufferDetails.planes[plane] + (y * 320 / 8) + byteX;
|
|
||||||
custom.bltafwm = 0xffff;
|
|
||||||
|
|
||||||
if (shift == 0) {
|
|
||||||
custom.bltalwm = 0xffff;;
|
|
||||||
} else {
|
|
||||||
custom.bltalwm = 0x0000;
|
|
||||||
}
|
|
||||||
|
|
||||||
custom.bltamod = shift ? -2 : 0;
|
|
||||||
custom.bltdmod = 40 - (shift ? 6 : 4);
|
|
||||||
|
|
||||||
custom.bltsize = (shift ? 3 : 2) + (32 << 6);
|
|
||||||
|
|
||||||
WaitBlit();
|
|
||||||
}
|
|
||||||
|
|
||||||
x += dirX;
|
|
||||||
if (x == 320 - 32) {
|
|
||||||
x -= 1;
|
|
||||||
dirX = -dirX;
|
|
||||||
}
|
|
||||||
if (x < 0) {
|
|
||||||
x = 0;
|
|
||||||
dirX = -dirX;
|
|
||||||
}
|
|
||||||
|
|
||||||
y += dirY;
|
|
||||||
if (y == 256 - 32) {
|
|
||||||
y -= 1;
|
|
||||||
dirY = -dirY;
|
|
||||||
}
|
|
||||||
if (y < 0) {
|
|
||||||
y = 0;
|
|
||||||
dirY = -dirY;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((ciaa.ciapra >> 6) != 3) break;
|
|
||||||
}
|
|
||||||
|
|
||||||
giveBackSystem();
|
|
||||||
|
|
||||||
freeCopperlist(copperlist);
|
|
||||||
|
|
||||||
teardownScreen(&screenDefinition);
|
|
||||||
}
|
|
|
@ -0,0 +1,172 @@
|
||||||
|
XREF _custom
|
||||||
|
|
||||||
|
; write this from scratch and get it working
|
||||||
|
; then plug it into C
|
||||||
|
FUNC_CNT SET -30
|
||||||
|
FUNCDEF MACRO
|
||||||
|
_LVO\1 EQU FUNC_CNT
|
||||||
|
FUNC_CNT SET FUNC_CNT-6
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
INCDIR "include_i_39:"
|
||||||
|
INCDIR "extra_lvos_39:"
|
||||||
|
INCLUDE "exec/exec_lib.i"
|
||||||
|
INCLUDE "exec/types.i"
|
||||||
|
INCLUDE "exec/execbase.i"
|
||||||
|
INCLUDE "exec/libraries.i" # get the CALLLIB macro
|
||||||
|
INCLUDE "graphics/gfxbase.i"
|
||||||
|
INCLUDE "graphics_lvo.i"
|
||||||
|
INCLUDE "hardware/custom.i"
|
||||||
|
INCLUDE "hardware/dmabits.i"
|
||||||
|
|
||||||
|
START:
|
||||||
|
BSR _takeOverSystem
|
||||||
|
BSR _giveBackSystem
|
||||||
|
MOVE.L #0,D0
|
||||||
|
RTS
|
||||||
|
|
||||||
|
OpenGraphicsLibrary MACRO
|
||||||
|
LEA GraphicsLibrary,A1
|
||||||
|
MOVEQ #0,D0
|
||||||
|
CALLLIB _LVOOpenLibrary
|
||||||
|
MOVE.L D0,GraphicsBase
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
TakeOverView MACRO
|
||||||
|
MOVE.L GraphicsBase,A6
|
||||||
|
MOVE.L gb_ActiView(A6),OldView
|
||||||
|
MOVEQ #0,D0
|
||||||
|
CALLLIB _LVOLoadView
|
||||||
|
CALLLIB _LVOWaitTOF
|
||||||
|
CALLLIB _LVOWaitTOF
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
PreserveOldCopper MACRO
|
||||||
|
MOVE.L $26(A6),OldCopper1
|
||||||
|
MOVE.L $32(A6),OldCopper2
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
GetVBRPointer MACRO
|
||||||
|
BSR getVBR
|
||||||
|
MOVE.L D0,VBRPtr
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
PreserveOldRegisters MACRO
|
||||||
|
LEA _custom,A6
|
||||||
|
MOVE.W adkconr(A6),Oldadkcon
|
||||||
|
MOVE.W intenar(A6),Oldintena
|
||||||
|
MOVE.W dmaconr(A6),Olddmacon
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
ClearRegisters MACRO
|
||||||
|
MOVE.W #$7FFF,D0
|
||||||
|
BSR waitRaster
|
||||||
|
MOVE.W D0,intena(A6)
|
||||||
|
MOVE.W D0,dmacon(A6)
|
||||||
|
MOVE.W D0,intreq(A6)
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
SetRegisters MACRO
|
||||||
|
MOVE.W #$C000,intena(A6) ; enable master interrupt
|
||||||
|
MOVE.W #$3FFF,intena(A6) ; disable every other interrupt
|
||||||
|
|
||||||
|
MOVE.W #DMAF_SETCLR|DMAF_COPPER|DMAF_RASTER|DMAF_BLITTER,dmacon(A6)
|
||||||
|
MOVE.W #DMAF_AUDIO|DMAF_DISK|DMAF_SPRITE,dmacon(A6)
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
_takeOverSystem:
|
||||||
|
MOVEM.L A6,-(SP)
|
||||||
|
CLR.W $100
|
||||||
|
|
||||||
|
MOVE.L $4,A6
|
||||||
|
CALLLIB _LVOForbid
|
||||||
|
|
||||||
|
OpenGraphicsLibrary
|
||||||
|
PreserveOldCopper
|
||||||
|
|
||||||
|
CALLLIB _LVOOwnBlitter
|
||||||
|
CALLLIB _LVOWaitBlit
|
||||||
|
|
||||||
|
PreserveOldRegisters
|
||||||
|
|
||||||
|
SetRegisters
|
||||||
|
TakeOverView
|
||||||
|
MOVEM.L (SP)+,A6
|
||||||
|
RTS
|
||||||
|
|
||||||
|
waitRaster:
|
||||||
|
MOVE.L D0,-(SP)
|
||||||
|
.loop:
|
||||||
|
MOVE.L $DFF004,D0
|
||||||
|
AND.L #$1FF00,D0
|
||||||
|
CMP.L #303<<8,D0
|
||||||
|
BNE .loop
|
||||||
|
MOVE.L (SP)+,D0
|
||||||
|
RTS
|
||||||
|
|
||||||
|
_giveBackSystem:
|
||||||
|
CLR.W $100
|
||||||
|
|
||||||
|
MOVEM.L A6,-(SP)
|
||||||
|
LEA _custom,A6
|
||||||
|
|
||||||
|
MOVE.W #$8000,d0
|
||||||
|
OR.W D0,Olddmacon
|
||||||
|
OR.W D0,Oldintena
|
||||||
|
OR.W D0,Oldadkcon
|
||||||
|
SUBQ #1,D0
|
||||||
|
|
||||||
|
;ClearRegisters
|
||||||
|
|
||||||
|
MOVE.L OldCopper1,cop1lc(A6)
|
||||||
|
MOVE.L OldCopper2,cop2lc(A6)
|
||||||
|
MOVE.W #1,copjmp1(A6)
|
||||||
|
|
||||||
|
MOVE.W Olddmacon,intena(A6)
|
||||||
|
MOVE.W Olddmacon,dmacon(A6)
|
||||||
|
MOVE.W Oldadkcon,adkcon(A6)
|
||||||
|
|
||||||
|
MOVE.L OldView,A1
|
||||||
|
|
||||||
|
MOVE.L GraphicsBase,A6
|
||||||
|
CALLLIB _LVOLoadView
|
||||||
|
CALLLIB _LVOWaitTOF
|
||||||
|
CALLLIB _LVOWaitTOF
|
||||||
|
|
||||||
|
MOVE.L $4,A6
|
||||||
|
MOVE.L GraphicsBase,D0
|
||||||
|
MOVE.L D0,A1
|
||||||
|
CALLLIB _LVOCloseLibrary
|
||||||
|
|
||||||
|
CALLLIB _LVOPermit
|
||||||
|
MOVEM.L (SP)+,A6
|
||||||
|
RTS
|
||||||
|
|
||||||
|
getVBR:
|
||||||
|
MOVE.L A5,-(SP)
|
||||||
|
MOVEQ #0,D0
|
||||||
|
MOVE.L $4,A6
|
||||||
|
BTST #0,AttnFlags+1(A6)
|
||||||
|
BEQ .is68K
|
||||||
|
LEA .get010VBR(pc),A5
|
||||||
|
CALLLIB _LVOSupervisor
|
||||||
|
.is68K:
|
||||||
|
MOVE.L (SP)+,A5
|
||||||
|
RTS
|
||||||
|
|
||||||
|
.get010VBR:
|
||||||
|
dc.l $4E7A0801 ; movec vcr,d0
|
||||||
|
RTE
|
||||||
|
|
||||||
|
CNOP 0,4
|
||||||
|
GraphicsLibrary dc.b 'graphics.library',0
|
||||||
|
|
||||||
|
CNOP 0,4
|
||||||
|
GraphicsBase dc.l 1
|
||||||
|
OldView dc.l 1
|
||||||
|
OldCopper1 dc.l 1
|
||||||
|
OldCopper2 dc.l 1
|
||||||
|
VBRPtr dc.l 1
|
||||||
|
Oldadkcon dc.w 0
|
||||||
|
Oldintena dc.w 0
|
||||||
|
Olddmacon dc.w 0
|
Binary file not shown.
|
@ -0,0 +1,98 @@
|
||||||
|
#include <clib/exec_protos.h>
|
||||||
|
#include <clib/intuition_protos.h>
|
||||||
|
#include <clib/graphics_protos.h>
|
||||||
|
#include <exec/memory.h>
|
||||||
|
#include <graphics/gfxbase.h>
|
||||||
|
#include <hardware/custom.h>
|
||||||
|
#include <hardware/dmabits.h>
|
||||||
|
#include <exec/types.h>
|
||||||
|
|
||||||
|
extern struct GfxBase *GfxBase;
|
||||||
|
extern far struct Custom custom;
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
UWORD OldDMACON,OldINTENA,OldINTREQ,OldADKCON;
|
||||||
|
struct View *OldView = ((struct GfxBase *)GfxBase)->ActiView;
|
||||||
|
ULONG OldCopper = custom.cop1lc;
|
||||||
|
ULONG OldCopper2 = custom.cop2lc;
|
||||||
|
UWORD *copperlist = AllocMem(10000, MEMF_CHIP | MEMF_CLEAR);
|
||||||
|
UWORD *currentCopperlist;
|
||||||
|
UBYTE *bitplanes = AllocMem(320 * 256, MEMF_CHIP | MEMF_CLEAR);
|
||||||
|
int i;
|
||||||
|
|
||||||
|
LoadView(0);
|
||||||
|
WaitTOF();
|
||||||
|
WaitTOF();
|
||||||
|
OwnBlitter();
|
||||||
|
WaitBlit();
|
||||||
|
|
||||||
|
Forbid();
|
||||||
|
|
||||||
|
OldDMACON = custom.dmaconr | 0x8000;
|
||||||
|
OldINTENA = custom.intenar | 0x8000;
|
||||||
|
//OldINTREQ = custom.intreqr | 0x8000;
|
||||||
|
OldADKCON = custom.adkconr | 0x8000;
|
||||||
|
|
||||||
|
custom.intreq = 0x7fff;
|
||||||
|
custom.cmacon = 0x7fff;
|
||||||
|
custom.cmacon = 0x7fff;
|
||||||
|
|
||||||
|
|
||||||
|
// enable
|
||||||
|
custom.dmacon = DMAF_SETCLR | DMAF_COPPER | DMAF_RASTER | DMAF_BLITTER;
|
||||||
|
|
||||||
|
// disable
|
||||||
|
custom.dmacon = DMAF_AUDIO | DMAF_DISK | DMAF_SPRITE;
|
||||||
|
|
||||||
|
custom.bplcon0 = (1 << 9) + (1 << 12);
|
||||||
|
custom.bplcon1 = 0;
|
||||||
|
custom.bplcon2 = 0;
|
||||||
|
custom.bpl1mod = 0;
|
||||||
|
custom.bpl2mod = 0;
|
||||||
|
custom.diwstrt = 0x2c21;
|
||||||
|
custom.diwstop = 0x2cc1;
|
||||||
|
custom.ddfstrt = 0x0038;
|
||||||
|
custom.ddfstop = 0x00d0;
|
||||||
|
|
||||||
|
currentCopperlist = copperlist;
|
||||||
|
|
||||||
|
*(currentCopperlist++) = 0x0050;
|
||||||
|
*(currentCopperlist++) = ((ULONG)bitplanes >> 16);
|
||||||
|
*(currentCopperlist++) = 0x0020;
|
||||||
|
*(currentCopperlist++) = ((ULONG)bitplanes && 16);
|
||||||
|
*(currentCopperlist++) = 0xffff;
|
||||||
|
*(currentCopperlist++) = 0xfffe;
|
||||||
|
|
||||||
|
custom.cop1lc = copperlist;
|
||||||
|
|
||||||
|
for (i = 0; i < 200; ++i) {
|
||||||
|
WaitTOF();
|
||||||
|
}
|
||||||
|
|
||||||
|
custom.dmacon = 0x7FFF;
|
||||||
|
custom.dmacon = OldDMACON;
|
||||||
|
|
||||||
|
custom.intena = 0x7FFF;
|
||||||
|
custom.intena = OldINTENA;
|
||||||
|
|
||||||
|
/*
|
||||||
|
custom.intreq = 0x7FFF;
|
||||||
|
custom.intreq = OldINTREQ;
|
||||||
|
*/
|
||||||
|
|
||||||
|
custom.adkcon = 0x7FFF;
|
||||||
|
custom.adkcon = OldADKCON;
|
||||||
|
|
||||||
|
custom.cop1lc = OldCopper;
|
||||||
|
custom.cop2lc = OldCopper1;
|
||||||
|
|
||||||
|
LoadView(OldView);
|
||||||
|
WaitTOF();
|
||||||
|
WaitTOF();
|
||||||
|
WaitBlit();
|
||||||
|
DisownBlitter();
|
||||||
|
Permit();
|
||||||
|
|
||||||
|
FreeMem(copperlist, 10000);
|
||||||
|
FreeMem(bitplanes, 320 * 256);
|
||||||
|
}
|
54
bun.c
54
bun.c
|
@ -13,7 +13,6 @@
|
||||||
#include "screen.h"
|
#include "screen.h"
|
||||||
#include "bun.h"
|
#include "bun.h"
|
||||||
#include "system/system.h"
|
#include "system/system.h"
|
||||||
#include "system/blitter.h"
|
|
||||||
|
|
||||||
#define COOL_BUN_WIDTH (32)
|
#define COOL_BUN_WIDTH (32)
|
||||||
#define COOL_BUN_WIDTH_BYTES (COOL_BUN_WIDTH / 8)
|
#define COOL_BUN_WIDTH_BYTES (COOL_BUN_WIDTH / 8)
|
||||||
|
@ -41,8 +40,16 @@
|
||||||
// linked as raw bytes in assembler
|
// linked as raw bytes in assembler
|
||||||
extern unsigned char chip coolbun[];
|
extern unsigned char chip coolbun[];
|
||||||
|
|
||||||
|
#define BLTCON0( \
|
||||||
|
minterm, aChan, bChan, cChan, dChan, shift \
|
||||||
|
) (minterm + (aChan << 11) + (bChan << 10) + (cChan << 9) + (dChan << 8) + (shift << 12))
|
||||||
|
#define BLTCON1(descending, shift) ((descending << 1) + (shift << 12))
|
||||||
|
|
||||||
extern struct Custom far custom;
|
extern struct Custom far custom;
|
||||||
|
|
||||||
|
#define BLITTER_ASCENDING (0)
|
||||||
|
#define BLITTER_DESCENDING (1)
|
||||||
|
|
||||||
struct BunClear {
|
struct BunClear {
|
||||||
uint16_t memoryStartOffsetBytes;
|
uint16_t memoryStartOffsetBytes;
|
||||||
uint16_t widthWords;
|
uint16_t widthWords;
|
||||||
|
@ -56,33 +63,6 @@ struct BunClear {
|
||||||
|
|
||||||
uint8_t *coolbunPlaneStarts[3][2];
|
uint8_t *coolbunPlaneStarts[3][2];
|
||||||
|
|
||||||
uint16_t bunRightSide_bltalwmPrecalc[16];
|
|
||||||
uint16_t bunLeftSide_bltalwmPrecalc[16];
|
|
||||||
|
|
||||||
void precalculateBunBLTALWM() {
|
|
||||||
int shift, j;
|
|
||||||
uint16_t bltalwm;
|
|
||||||
|
|
||||||
for (shift = 0; shift < 16; ++shift) {
|
|
||||||
// right
|
|
||||||
bltalwm = 0x0000;
|
|
||||||
|
|
||||||
for (j = 0; j < 15 - shift; ++j) {
|
|
||||||
bltalwm += (1 << (15 - j));
|
|
||||||
}
|
|
||||||
|
|
||||||
bunRightSide_bltalwmPrecalc[shift] = bltalwm;
|
|
||||||
|
|
||||||
//left
|
|
||||||
bltalwm = 0x0000;
|
|
||||||
for (j = 0; j <= 15 - shift; ++j) {
|
|
||||||
bltalwm += (1 << j);
|
|
||||||
}
|
|
||||||
|
|
||||||
bunLeftSide_bltalwmPrecalc[shift] = bltalwm;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void bun_offRightSide(
|
void bun_offRightSide(
|
||||||
int plusXValue,
|
int plusXValue,
|
||||||
int y,
|
int y,
|
||||||
|
@ -102,14 +82,10 @@ void bun_offRightSide(
|
||||||
bunClear->widthWords = 2 - wordShift;
|
bunClear->widthWords = 2 - wordShift;
|
||||||
bunClear->direction = BLITTER_ASCENDING;
|
bunClear->direction = BLITTER_ASCENDING;
|
||||||
|
|
||||||
bltalwm = bunRightSide_bltalwmPrecalc[shift];
|
|
||||||
|
|
||||||
/*
|
|
||||||
bltalwm = 0x0000;
|
bltalwm = 0x0000;
|
||||||
for (i = 0; i <= 15 - shift; ++i) {
|
for (i = 0; i <= 15 - shift; ++i) {
|
||||||
bltalwm += (1 << (15 - i));
|
bltalwm += (1 << (15 - i));
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
|
||||||
bltcon0 = BLTCON0(0xf0, 1, 0, 0, 1, shift);
|
bltcon0 = BLTCON0(0xf0, 1, 0, 0, 1, shift);
|
||||||
bltcon1 = BLTCON1(bunClear->direction, shift);
|
bltcon1 = BLTCON1(bunClear->direction, shift);
|
||||||
|
@ -161,14 +137,10 @@ void bun_offLeftSide(
|
||||||
bunClear->widthWords = 2 - wordShift;
|
bunClear->widthWords = 2 - wordShift;
|
||||||
bunClear->direction = BLITTER_DESCENDING;
|
bunClear->direction = BLITTER_DESCENDING;
|
||||||
|
|
||||||
bltalwm = bunLeftSide_bltalwmPrecalc[shift];
|
|
||||||
|
|
||||||
/*
|
|
||||||
bltalwm = 0x0000;
|
bltalwm = 0x0000;
|
||||||
for (i = 0; i <= 15 - shift; ++i) {
|
for (i = 0; i <= 15 - shift; ++i) {
|
||||||
bltalwm += (1 << i);
|
bltalwm += (1 << i);
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
|
||||||
bltcon0 = BLTCON0(0xf0, 1, 0, 0, 1, shift);
|
bltcon0 = BLTCON0(0xf0, 1, 0, 0, 1, shift);
|
||||||
bltcon1 = BLTCON1(bunClear->direction, shift);
|
bltcon1 = BLTCON1(bunClear->direction, shift);
|
||||||
|
@ -250,8 +222,6 @@ void bun_anywhere(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#define ENABLE_RENDER_BUN_CHECKING (0)
|
|
||||||
|
|
||||||
void renderBun(
|
void renderBun(
|
||||||
int x,
|
int x,
|
||||||
int y,
|
int y,
|
||||||
|
@ -261,17 +231,14 @@ void renderBun(
|
||||||
) {
|
) {
|
||||||
/**
|
/**
|
||||||
* Conditions that will cause the program to crash if met. If your bun
|
* Conditions that will cause the program to crash if met. If your bun
|
||||||
* isn't rendering, it's due to here. Turn off checking once you know
|
* isn't rendering, it's due to here.
|
||||||
* everything is solid to save some CPU.
|
|
||||||
*
|
*
|
||||||
* TODO: Handle top/bottom off-screen as well.
|
* TODO: Handle top/bottom off-screen as well.
|
||||||
*/
|
*/
|
||||||
if (ENABLE_RENDER_BUN_CHECKING) {
|
|
||||||
if (x < -31) return;
|
if (x < -31) return;
|
||||||
if (x > screenDefinition->width + 31) return;
|
if (x > screenDefinition->width + 31) return;
|
||||||
if (y < 1) return;
|
if (y < 1) return;
|
||||||
if (y > screenDefinition->height - COOL_BUN_HEIGHT - 1) return;
|
if (y > screenDefinition->height - COOL_BUN_HEIGHT - 1) return;
|
||||||
}
|
|
||||||
|
|
||||||
if (x < 0) {
|
if (x < 0) {
|
||||||
bun_offLeftSide(
|
bun_offLeftSide(
|
||||||
|
@ -388,7 +355,6 @@ void setupBunRenderer(
|
||||||
buildBunAngleAdjustments();
|
buildBunAngleAdjustments();
|
||||||
calculateAllBunPositions(screenDefinition);
|
calculateAllBunPositions(screenDefinition);
|
||||||
precalculateBunRenderInfo();
|
precalculateBunRenderInfo();
|
||||||
precalculateBunBLTALWM();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -407,7 +373,7 @@ void clearCurrentBuns(
|
||||||
|
|
||||||
if (!hasBunClear[bunRenderer->activeScreenBufferDetails->currentBuffer]) return;
|
if (!hasBunClear[bunRenderer->activeScreenBufferDetails->currentBuffer]) return;
|
||||||
|
|
||||||
bltcon0 = BLTCON0(0xc0, 0, 0, 0, 1, 0);
|
bltcon0 = 0xc0 + (1 << 8);
|
||||||
|
|
||||||
for (bun = 0; bun < BUN_COUNT; ++bun) {
|
for (bun = 0; bun < BUN_COUNT; ++bun) {
|
||||||
currentBunClear = &bunClearForScreen[bunRenderer->activeScreenBufferDetails->currentBuffer][bun];
|
currentBunClear = &bunClearForScreen[bunRenderer->activeScreenBufferDetails->currentBuffer][bun];
|
||||||
|
|
90
left_side.c
90
left_side.c
|
@ -1,90 +0,0 @@
|
||||||
/**
|
|
||||||
* What do we need
|
|
||||||
* * [ ] screen setup
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <hardware/custom.h>
|
|
||||||
#include <hardware/cia.h>
|
|
||||||
|
|
||||||
#include <clib/graphics_protos.h>
|
|
||||||
|
|
||||||
#include "system/system.h"
|
|
||||||
#include "system/copper.h"
|
|
||||||
#include "system/blitter.h"
|
|
||||||
|
|
||||||
#include "screen.h"
|
|
||||||
|
|
||||||
extern struct Custom far custom;
|
|
||||||
extern struct CIA far ciaa;
|
|
||||||
|
|
||||||
uint16_t custom_color = (uint16_t)offsetof(Custom, color);
|
|
||||||
uint16_t custom_sprite = (uint16_t)offsetof(Custom, sprpt);
|
|
||||||
uint16_t custom_sprite_control = (uint16_t)offsetof(Custom, spr);
|
|
||||||
|
|
||||||
extern unsigned char chip coolbun[];
|
|
||||||
|
|
||||||
int main(void) {
|
|
||||||
struct ScreenDefinition screenDefinition;
|
|
||||||
struct ActiveScreenBufferDetails activeScreenBufferDetails;
|
|
||||||
uint16_t *copperlist, *currentCopperlist;
|
|
||||||
void *copperlistBitplanePointers[8][2];
|
|
||||||
int i, plane;
|
|
||||||
|
|
||||||
allocateDoubleBufferedScreenMemory(
|
|
||||||
&screenDefinition,
|
|
||||||
&activeScreenBufferDetails,
|
|
||||||
320,
|
|
||||||
256,
|
|
||||||
2
|
|
||||||
);
|
|
||||||
|
|
||||||
copperlist = prepareNewCopperlist(300);
|
|
||||||
|
|
||||||
currentCopperlist = addDisplayToCopperlist(
|
|
||||||
copperlist,
|
|
||||||
&screenDefinition,
|
|
||||||
&activeScreenBufferDetails,
|
|
||||||
&copperlistBitplanePointers
|
|
||||||
);
|
|
||||||
|
|
||||||
COPPERLIST_MOVE(currentCopperlist, custom_color, 0x3a6);
|
|
||||||
COPPERLIST_MOVE(currentCopperlist, custom_color + 2, 0x000);
|
|
||||||
COPPERLIST_MOVE(currentCopperlist, custom_color + 4, 0xfff);
|
|
||||||
currentCopperlist = setUpEmptySpritesInCopperlist(currentCopperlist);
|
|
||||||
|
|
||||||
endCopperlist(currentCopperlist);
|
|
||||||
|
|
||||||
takeOverSystem();
|
|
||||||
|
|
||||||
setCopperlist(copperlist);
|
|
||||||
setUpDisplay((uint32_t)screenDefinition.bitplanes);
|
|
||||||
|
|
||||||
// Render a cut off bun at -8x50
|
|
||||||
|
|
||||||
for (plane = 0; plane < 2; ++plane) {
|
|
||||||
custom.bltcon0 = BLTCON0(0xf0, 1, 0, 0, 1, 8);
|
|
||||||
custom.bltcon1 = BLTCON1(BLITTER_DESCENDING, 8);
|
|
||||||
|
|
||||||
custom.bltapt = coolbun + (plane * 4 * 32) + (31 * 4) + 2;
|
|
||||||
custom.bltdpt = activeScreenBufferDetails.planes[plane] + ((50 + 31) * 320 / 8) + 2;
|
|
||||||
custom.bltafwm = 0xffff;
|
|
||||||
custom.bltalwm = 0x00ff;
|
|
||||||
|
|
||||||
custom.bltamod = 0;
|
|
||||||
custom.bltdmod = 40 - 4;
|
|
||||||
|
|
||||||
custom.bltsize = 2 + (32 << 6);
|
|
||||||
|
|
||||||
WaitBlit();
|
|
||||||
}
|
|
||||||
|
|
||||||
while (1) {
|
|
||||||
if ((ciaa.ciapra >> 6) != 3) break;
|
|
||||||
}
|
|
||||||
|
|
||||||
giveBackSystem();
|
|
||||||
|
|
||||||
freeCopperlist(copperlist);
|
|
||||||
|
|
||||||
teardownScreen(&screenDefinition);
|
|
||||||
}
|
|
31
main.c
31
main.c
|
@ -29,22 +29,6 @@
|
||||||
#include "types.h"
|
#include "types.h"
|
||||||
#include "bun.h"
|
#include "bun.h"
|
||||||
|
|
||||||
/**
|
|
||||||
* This barely gets 50fps on an 020 but I'm leaving it for now.
|
|
||||||
* The demo is definitely CPU bound.
|
|
||||||
*
|
|
||||||
* Potential improvements:
|
|
||||||
*
|
|
||||||
* [ ] Precalculate even more of bun.c. This may get 50fps on an A500 if I do this.
|
|
||||||
* It would require more significant caching of as much stuff as possible.
|
|
||||||
* The A500 is spending entirely too much time on CPU tasks.
|
|
||||||
* [ ] Topaz re-rendering is limited to squares or rows that changed in the last frame.
|
|
||||||
* I tried this once but I need a more precise way of redrawing those areas.
|
|
||||||
* [ ] Cool bun clears and re-renders happen in the same pass.
|
|
||||||
* This would likely mean extending the cool bun art to have a blank word on the left,
|
|
||||||
* and enough blank rows above and below to cover clearing areas above and below.
|
|
||||||
*/
|
|
||||||
|
|
||||||
extern struct Custom far custom;
|
extern struct Custom far custom;
|
||||||
extern struct CIA far ciaa;
|
extern struct CIA far ciaa;
|
||||||
|
|
||||||
|
@ -77,17 +61,20 @@ extern uint8_t chip MaskBitplane[];
|
||||||
#define TOPAZ_WIDTH_BYTES (TOPAZ_WIDTH_PIXELS / 8)
|
#define TOPAZ_WIDTH_BYTES (TOPAZ_WIDTH_PIXELS / 8)
|
||||||
#define TOPAZ_WIDTH_WORDS (TOPAZ_WIDTH_PIXELS / 16)
|
#define TOPAZ_WIDTH_WORDS (TOPAZ_WIDTH_PIXELS / 16)
|
||||||
|
|
||||||
|
#define BLTSIZE(w, h) (w + (h << 6))
|
||||||
|
|
||||||
void renderTopaz(void) {
|
void renderTopaz(void) {
|
||||||
int plane;
|
int plane;
|
||||||
|
|
||||||
uint16_t bltcmod;
|
uint16_t bltcon0, bltcmod;
|
||||||
uint8_t *bltbpt;
|
uint8_t *bltbpt;
|
||||||
|
|
||||||
|
bltcon0 = 0xca + (1 << 8) + (1 << 9) + (1 << 10) + (1 << 11);
|
||||||
bltcmod = screenDefinition.byteWidth - TOPAZ_WIDTH_BYTES;
|
bltcmod = screenDefinition.byteWidth - TOPAZ_WIDTH_BYTES;
|
||||||
bltbpt = TopazBitplanes;
|
bltbpt = TopazBitplanes;
|
||||||
|
|
||||||
for (plane = 0; plane < 3; ++plane) {
|
for (plane = 0; plane < 3; ++plane) {
|
||||||
custom.bltcon0 = BLTCON0(0xca, 1, 1, 1, 1, 0);
|
custom.bltcon0 = bltcon0;
|
||||||
custom.bltcon1 = 0;
|
custom.bltcon1 = 0;
|
||||||
custom.bltafwm = 0xffff;
|
custom.bltafwm = 0xffff;
|
||||||
custom.bltalwm = 0xffff;
|
custom.bltalwm = 0xffff;
|
||||||
|
@ -112,14 +99,15 @@ void renderTopaz(void) {
|
||||||
void renderMostlyTopaz(void) {
|
void renderMostlyTopaz(void) {
|
||||||
int plane;
|
int plane;
|
||||||
|
|
||||||
uint16_t bltcmod;
|
uint16_t bltcon0, bltcmod;
|
||||||
uint8_t *bltbpt;
|
uint8_t *bltbpt;
|
||||||
|
|
||||||
|
bltcon0 = 0xca + (1 << 8) + (1 << 9) + (1 << 10) + (1 << 11);
|
||||||
bltcmod = screenDefinition.byteWidth - TOPAZ_WIDTH_BYTES;
|
bltcmod = screenDefinition.byteWidth - TOPAZ_WIDTH_BYTES;
|
||||||
bltbpt = TopazBitplanes;
|
bltbpt = TopazBitplanes;
|
||||||
|
|
||||||
for (plane = 0; plane < 2; ++plane) {
|
for (plane = 0; plane < 2; ++plane) {
|
||||||
custom.bltcon0 = BLTCON0(0xca, 1, 1, 1, 1, 0);
|
custom.bltcon0 = bltcon0;
|
||||||
custom.bltcon1 = 0;
|
custom.bltcon1 = 0;
|
||||||
custom.bltafwm = 0xffff;
|
custom.bltafwm = 0xffff;
|
||||||
custom.bltalwm = 0xffff;
|
custom.bltalwm = 0xffff;
|
||||||
|
@ -374,10 +362,9 @@ int main(void) {
|
||||||
if ((ciaa.ciapra >> 6) != 3) break;
|
if ((ciaa.ciapra >> 6) != 3) break;
|
||||||
|
|
||||||
i++;
|
i++;
|
||||||
if (i > FRAMES_FOR_SCREEN) i = 0;
|
i %= FRAMES_FOR_SCREEN;
|
||||||
}
|
}
|
||||||
|
|
||||||
// somthing in here causes an A500 in KS 1.3 to crash
|
|
||||||
giveBackSystem();
|
giveBackSystem();
|
||||||
teardownKeyboard();
|
teardownKeyboard();
|
||||||
|
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
After Width: | Height: | Size: 62 KiB |
BIN
right_side
BIN
right_side
Binary file not shown.
90
right_side.c
90
right_side.c
|
@ -1,90 +0,0 @@
|
||||||
/**
|
|
||||||
* What do we need
|
|
||||||
* * [ ] screen setup
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <hardware/custom.h>
|
|
||||||
#include <hardware/cia.h>
|
|
||||||
|
|
||||||
#include <clib/graphics_protos.h>
|
|
||||||
|
|
||||||
#include "system/system.h"
|
|
||||||
#include "system/copper.h"
|
|
||||||
#include "system/blitter.h"
|
|
||||||
|
|
||||||
#include "screen.h"
|
|
||||||
|
|
||||||
extern struct Custom far custom;
|
|
||||||
extern struct CIA far ciaa;
|
|
||||||
|
|
||||||
uint16_t custom_color = (uint16_t)offsetof(Custom, color);
|
|
||||||
uint16_t custom_sprite = (uint16_t)offsetof(Custom, sprpt);
|
|
||||||
uint16_t custom_sprite_control = (uint16_t)offsetof(Custom, spr);
|
|
||||||
|
|
||||||
extern unsigned char chip coolbun[];
|
|
||||||
|
|
||||||
int main(void) {
|
|
||||||
struct ScreenDefinition screenDefinition;
|
|
||||||
struct ActiveScreenBufferDetails activeScreenBufferDetails;
|
|
||||||
uint16_t *copperlist, *currentCopperlist;
|
|
||||||
void *copperlistBitplanePointers[8][2];
|
|
||||||
int i, plane;
|
|
||||||
|
|
||||||
allocateDoubleBufferedScreenMemory(
|
|
||||||
&screenDefinition,
|
|
||||||
&activeScreenBufferDetails,
|
|
||||||
320,
|
|
||||||
256,
|
|
||||||
2
|
|
||||||
);
|
|
||||||
|
|
||||||
copperlist = prepareNewCopperlist(300);
|
|
||||||
|
|
||||||
currentCopperlist = addDisplayToCopperlist(
|
|
||||||
copperlist,
|
|
||||||
&screenDefinition,
|
|
||||||
&activeScreenBufferDetails,
|
|
||||||
&copperlistBitplanePointers
|
|
||||||
);
|
|
||||||
|
|
||||||
COPPERLIST_MOVE(currentCopperlist, custom_color, 0x3a6);
|
|
||||||
COPPERLIST_MOVE(currentCopperlist, custom_color + 2, 0x000);
|
|
||||||
COPPERLIST_MOVE(currentCopperlist, custom_color + 4, 0xfff);
|
|
||||||
currentCopperlist = setUpEmptySpritesInCopperlist(currentCopperlist);
|
|
||||||
|
|
||||||
endCopperlist(currentCopperlist);
|
|
||||||
|
|
||||||
takeOverSystem();
|
|
||||||
|
|
||||||
setCopperlist(copperlist);
|
|
||||||
setUpDisplay((uint32_t)screenDefinition.bitplanes);
|
|
||||||
|
|
||||||
// Render a cut off bun at -8x50
|
|
||||||
|
|
||||||
for (plane = 0; plane < 2; ++plane) {
|
|
||||||
custom.bltcon0 = BLTCON0(0xf0, 1, 0, 0, 1, 8);
|
|
||||||
custom.bltcon1 = BLTCON1(BLITTER_ASCENDING, 8);
|
|
||||||
|
|
||||||
custom.bltapt = coolbun + (plane * 4 * 32);
|
|
||||||
custom.bltdpt = activeScreenBufferDetails.planes[plane] + (50 * 320 / 8) + (40 - 4);
|
|
||||||
custom.bltafwm = 0xffff;
|
|
||||||
custom.bltalwm = 0xff00;
|
|
||||||
|
|
||||||
custom.bltamod = 0;
|
|
||||||
custom.bltdmod = 40 - 4;
|
|
||||||
|
|
||||||
custom.bltsize = 2 + (32 << 6);
|
|
||||||
|
|
||||||
WaitBlit();
|
|
||||||
}
|
|
||||||
|
|
||||||
while (1) {
|
|
||||||
if ((ciaa.ciapra >> 6) != 3) break;
|
|
||||||
}
|
|
||||||
|
|
||||||
giveBackSystem();
|
|
||||||
|
|
||||||
freeCopperlist(copperlist);
|
|
||||||
|
|
||||||
teardownScreen(&screenDefinition);
|
|
||||||
}
|
|
13
screen.c
13
screen.c
|
@ -21,7 +21,6 @@ void allocateDoubleBufferedScreenMemory(
|
||||||
uint8_t bitplanes
|
uint8_t bitplanes
|
||||||
) {
|
) {
|
||||||
unsigned char *memory;
|
unsigned char *memory;
|
||||||
int buffer, plane;
|
|
||||||
|
|
||||||
screenDefinition->width = width;
|
screenDefinition->width = width;
|
||||||
screenDefinition->height = height;
|
screenDefinition->height = height;
|
||||||
|
@ -39,14 +38,6 @@ void allocateDoubleBufferedScreenMemory(
|
||||||
screenDefinition->nextBitplaneAdvance = screenDefinition->byteWidth * height;
|
screenDefinition->nextBitplaneAdvance = screenDefinition->byteWidth * height;
|
||||||
screenDefinition->nextBufferAdvance = screenDefinition->nextBitplaneAdvance * bitplanes;
|
screenDefinition->nextBufferAdvance = screenDefinition->nextBitplaneAdvance * bitplanes;
|
||||||
|
|
||||||
for (buffer = 0; buffer < 2; ++buffer) {
|
|
||||||
for (plane = 0; plane < bitplanes; ++plane) {
|
|
||||||
screenDefinition->bufferPlanes[buffer][plane] = screenDefinition->memoryStart +
|
|
||||||
buffer * screenDefinition->nextBufferAdvance +
|
|
||||||
plane * screenDefinition->nextBitplaneAdvance;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
setActiveScreenBuffer(screenDefinition, activeScreenBufferDetails, 0);
|
setActiveScreenBuffer(screenDefinition, activeScreenBufferDetails, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -68,7 +59,9 @@ void setActiveScreenBuffer(
|
||||||
currentScreen->currentBuffer = buffer;
|
currentScreen->currentBuffer = buffer;
|
||||||
|
|
||||||
for (plane = 0; plane < screenDefinition->bitplanes; ++plane) {
|
for (plane = 0; plane < screenDefinition->bitplanes; ++plane) {
|
||||||
currentScreen->planes[plane] = screenDefinition->bufferPlanes[buffer][plane];
|
currentScreen->planes[plane] = screenDefinition->memoryStart +
|
||||||
|
buffer * screenDefinition->nextBufferAdvance +
|
||||||
|
plane * screenDefinition->nextBitplaneAdvance;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
1
screen.h
1
screen.h
|
@ -17,7 +17,6 @@ struct ScreenDefinition {
|
||||||
uint16_t byteWidth;
|
uint16_t byteWidth;
|
||||||
uint16_t nextBitplaneAdvance;
|
uint16_t nextBitplaneAdvance;
|
||||||
uint16_t nextBufferAdvance;
|
uint16_t nextBufferAdvance;
|
||||||
unsigned char *bufferPlanes[2][8];
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ActiveScreenBufferDetails {
|
struct ActiveScreenBufferDetails {
|
||||||
|
|
20
smakefile
20
smakefile
|
@ -1,9 +1,4 @@
|
||||||
MAIN_OBJS = main.o images.o system.lib screen.o bun.o
|
MAIN_OBJS = main.o images.o system.lib screen.o bun.o
|
||||||
32_objs = 32x50_bun.o system.lib screen.o images.o
|
|
||||||
33_objs = 33x50_bun.o system.lib screen.o images.o
|
|
||||||
left_side_objs = left_side.o system.lib screen.o images.o
|
|
||||||
right_side_objs = right_side.o system.lib screen.o images.o
|
|
||||||
any_position = any_position.o system.lib screen.o images.o
|
|
||||||
|
|
||||||
all: main
|
all: main
|
||||||
|
|
||||||
|
@ -19,21 +14,6 @@ system.lib: system/system.o system/copper.o system/blitter.o system/debug.o
|
||||||
main: $(MAIN_OBJS)
|
main: $(MAIN_OBJS)
|
||||||
sc link to main math=standard $(MAIN_OBJS)
|
sc link to main math=standard $(MAIN_OBJS)
|
||||||
|
|
||||||
32x50: $(32_objs)
|
|
||||||
sc link to 32x50 $(32_objs)
|
|
||||||
|
|
||||||
33x50: $(33_objs)
|
|
||||||
sc link to 33x50 $(33_objs)
|
|
||||||
|
|
||||||
left_side: $(left_side_objs)
|
|
||||||
sc link to left_side $(left_side_objs)
|
|
||||||
|
|
||||||
right_side: $(right_side_objs)
|
|
||||||
sc link to right_side $(right_side_objs)
|
|
||||||
|
|
||||||
any_position: $(any_position)
|
|
||||||
sc link to any_position $(any_position)
|
|
||||||
|
|
||||||
test: bun_test.o bun.o
|
test: bun_test.o bun.o
|
||||||
sc link to bun_test identifierlength=32 math=standard bun_test.o bun.o cutest/CuTest.c
|
sc link to bun_test identifierlength=32 math=standard bun_test.o bun.o cutest/CuTest.c
|
||||||
|
|
||||||
|
|
|
@ -1,14 +1,8 @@
|
||||||
#ifndef __BLITTER_H__
|
#ifndef __BLITTER_H__
|
||||||
#define __BLITTER_H__
|
#define __BLITTER_H__
|
||||||
|
|
||||||
#define BLTSIZE(w, h) (w + (h << 6))
|
#include "types.h"
|
||||||
#define BLTCON0( \
|
#include "screen.h"
|
||||||
minterm, aChan, bChan, cChan, dChan, shift \
|
|
||||||
) (minterm + (aChan << 11) + (bChan << 10) + (cChan << 9) + (dChan << 8) + (shift << 12))
|
|
||||||
#define BLTCON1(descending, shift) ((descending << 1) + (shift << 12))
|
|
||||||
|
|
||||||
#define BLITTER_ASCENDING (0)
|
|
||||||
#define BLITTER_DESCENDING (1)
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Binary file not shown.
After Width: | Height: | Size: 24 KiB |
Loading…
Reference in New Issue