From 026b6f6f0d2f5ae0e3dc0aac790436f29566a476 Mon Sep 17 00:00:00 2001 From: John Bintz Date: Mon, 29 Apr 2024 22:12:48 -0400 Subject: [PATCH] it works --- .gitignore | 6 ++ blitter.s | 240 +++++++++++++++++++++++++++++++++++++++++++ main | Bin 0 -> 8168 bytes main.c | 291 +++++++++++++++++++++++++++++++++++++++++++++++++++++ smakefile | 10 ++ 5 files changed, 547 insertions(+) create mode 100644 .gitignore create mode 100644 blitter.s create mode 100755 main create mode 100644 main.c create mode 100644 smakefile diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9773373 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +.vamosrc +activate +*.o +*.lnk +*.uaem +.ccls-cache/ diff --git a/blitter.s b/blitter.s new file mode 100644 index 0000000..22d2c51 --- /dev/null +++ b/blitter.s @@ -0,0 +1,240 @@ + XDEF _TakeOverSystem + XDEF _GiveBackSystem + XDEF _InitializeCopperlist + XDEF _SetUpDisplay + XDEF _AddDisplayToCopperlist + XDEF _AddColorsToCopperlist + XDEF _EndCopperlist + + XREF _custom + +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/libraries.i" # get the CALLLIB macro + INCLUDE "graphics/gfxbase.i" + INCLUDE "graphics_lvo.i" + INCLUDE "hardware/custom.i" + INCLUDE "hardware/dmabits.i" + +; @param 1 Pointer to numm terminated name of library +; @param 2 Minimum version of library, 0 for any +; @outreg D0 pointer to library in memory +OpenLibrary MACRO + MOVE.L 4,A6 + MOVEM.L A1,-(SP) + MOVE.L \1,A1 + MOVE.L \2,D0 + CALLLIB _LVOOpenLibrary + MOVEM.L (SP)+,A1 + ENDM + +PreserveRegister MACRO + MOVE.L D0,-(SP) + LEA _custom,A0 + MOVE.W \1r(A0),D0 + OR.W #$8000,D0 + MOVE.W D0,Old\1 + MOVE.L (SP)+,D0 + ENDM + +RestoreRegister MACRO + MOVE.W #$7FFF,\1(A0) + MOVE.W Old\1,\1(A0) + ENDM + + STRUCTURE ScreenSetup,0 + UWORD ScreenSetup_width + UWORD ScreenSetup_height + UWORD ScreenSetup_bitplanes + ULONG ScreenSetup_memoryStart + LABEL ScreenSetup_SIZEOF + +BPLCON0_COLOR EQU $200 + +_TakeOverSystem: + MOVE.L A6,-(SP) + OpenLibrary #GraphicsLibrary,#0 + MOVE.L D0,GraphicsBase + MOVE.L D0,A6 + + MOVE.L gb_ActiView(A6),OldView + MOVE.L gb_copinit(A6),OldCopper + + LEA _custom,A0 + + PreserveRegister dmacon + PreserveRegister intena + PreserveRegister intreq + PreserveRegister adkcon + + ; http://amigadev.elowar.com/read/ADCD_2.1/Hardware_Manual_guide/node0036.html + MOVE.W #$C000,intena(A0) ; enable master interrupt + MOVE.W #$3FFF,intena(A0) ; disable every other interrupt + + MOVE.W #DMAF_SETCLR|DMAF_COPPER|DMAF_RASTER|DMAF_BLITTER,dmacon(A0) + MOVE.W #DMAF_AUDIO|DMAF_DISK|DMAF_SPRITE,dmacon(A0) + + MOVE.L #0,A1 + CALLLIB _LVOLoadView + CALLLIB _LVOWaitTOF + CALLLIB _LVOWaitTOF + CALLLIB _LVOOwnBlitter + CALLLIB _LVOWaitBlit + + MOVE.L $4,A6 + CALLLIB _LVOForbid + MOVE.L (SP)+,A6 + RTS + +_GiveBackSystem: + MOVE.L A6,-(SP) + LEA _custom,A0 + + RestoreRegister dmacon + RestoreRegister intena + RestoreRegister intreq + RestoreRegister adkcon + + MOVE.L OldCopper,cop1lc(A0) + MOVE.L GraphicsBase,A6 + MOVE.L OldView,A1 + CALLLIB _LVOLoadView + CALLLIB _LVOWaitTOF + CALLLIB _LVOWaitTOF + CALLLIB _LVOWaitBlit + CALLLIB _LVODisownBlitter + + MOVE.L $4,A6 + CALLLIB _LVOPermit + MOVE.L (SP)+,A6 + RTS + +; @stack *copperlist Pointer to copperlist +_InitializeCopperlist: + MOVE.L 4(A7),A0 + MOVE.L #$FFFFFFFE,(A0) + + RTS + +; @stack *copperlist Pointer to copperlist +; @stack ScreenSetup Pointer to screensetup struct +_AddDisplayToCopperlist: + MOVE.L 4(A7),A0 ; copperlist + MOVE.L 8(A7),A1 ; struct + + ; A2,D2,D3 + MOVEM.L A2/D2/D3,-(SP) + MOVE.W ScreenSetup_bitplanes(A1),D0 + MOVE.L ScreenSetup_memoryStart(A1),A2 + + ; get bitplane offset + MOVEQ #0,D2 + MOVE.W ScreenSetup_width(A1),D2 + ROR.W #3,D2 + MULU ScreenSetup_height(A1),D2 + + SUBQ #1,D0 +.continue: + ; set up bplpt + MOVEQ #0,D1 + MOVE.L D0,D1 + ROL.L #2,D1 + ADD.W #bplpt,D1 + + ; set up bitplane pointer + MOVE.L D0,D3 + MULU D2,D3 + ADD.L A2,D3 + + ; low + SWAP D3 + MOVE.W D1,(A0)+ + MOVE.W D3,(A0)+ + ; high + SWAP D3 + ADDQ #2,D1 + MOVE.W D1,(A0)+ + MOVE.W D3,(A0)+ + DBRA D0,.continue + MOVE.L A0,D0 + MOVEM.L (SP)+,A2/D2/D3 + + RTS + +; @stack *copperlist +; @stack *colors +; @stach count +_AddColorsToCopperlist: + MOVE.L 4(A7),A0 ; copperlist + MOVE.L 8(A7),A1 ; colors + MOVE.L 12(A7),D0 ; count + + MOVEM.L A2/D2,-(SP) + LEA _custom,A2 + MOVE.L #color,D2 + ADD.L D2,A2 + + SUBQ #1,D0 +.continue: + MOVE.W (A1)+,(A2)+ + DBRA D0,.continue + MOVE.L A2,D0 + MOVEM.L (SP)+,A2/D2 + + RTS + +; @stack *copperlist +_EndCopperlist: + MOVE.L 4(A7),A0 + + MOVE.W #$ffff,(A0)+ + MOVE.W #$fffe,(A0)+ + MOVE.L A0,D0 + + RTS + +; @stack *ScreenSetup +_SetUpDisplay: + MOVE.L 4(A7),A0 + + LEA _custom,A1 + + MOVEQ #0,D0 + MOVE.W #BPLCON0_COLOR,D0 + MOVEQ #0,D1 + MOVE.W ScreenSetup_bitplanes(A0),D1 + AND.W #$7,D1 + ROL.W #8,D1 + ROL.W #4,D1 + ADD.W D1,D0 + MOVE.W D0,bplcon0(A1) + + MOVE.W #0,bplcon1(A1) + MOVE.W #0,bpl1mod(A1) + MOVE.W #$2c21,diwstrt(A1) + MOVE.W #$2cc1,diwstop(A1) + MOVE.W #$0038,ddfstrt(A1) + MOVE.W #$00d0,ddfstop(A1) + + RTS + + CNOP 0,4 +OldView dc.l 0 +OldCopper dc.l 0 +GraphicsBase dc.l 0 + +Olddmacon dc.w 0 +Oldintena dc.w 0 +Oldintreq dc.w 0 +Oldadkcon dc.w 0 + + CNOP 0,4 +GraphicsLibrary GRAPHICSNAME diff --git a/main b/main new file mode 100755 index 0000000000000000000000000000000000000000..a617893aadf3f21f1baca9456a52a1dc7c64163b GIT binary patch literal 8168 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 UKW-6xK3 + +#include +#include +#include + +#include +#include + +extern struct Custom far custom; + +struct ScreenSetup { + short int width; + short int height; + short int bitplanes; + unsigned char *memoryStart; +}; + +typedef UWORD color_t; + +extern void TakeOverSystem(void); +extern void GiveBackSystem(void); +extern void InitializeCopperlist(void *); +extern void SetUpDisplay(struct ScreenSetup *); +extern UWORD* AddDisplayToCopperlist(UWORD *copperlist, struct ScreenSetup *); +extern UWORD* AddColorsToCopperlist(UWORD *copperlist, color_t[], int count); +extern UWORD* EndCopperlist(UWORD *copperlist); + +#define SCREEN_WIDTH (320) +#define SCREEN_HEIGHT (256) + +#define TOTAL_SCREEN_SETUP_SIZE(s) ((s->width / 8) * s->height * s->bitplanes) + +void AllocateScreenMemory(struct ScreenSetup *screenSetup) { + char *memory = (char *)AllocMem( + TOTAL_SCREEN_SETUP_SIZE(screenSetup), + MEMF_CLEAR | MEMF_CHIP + ); + + screenSetup->memoryStart = memory; +} + +void FreeScreenMemory(struct ScreenSetup *screenSetup) { + FreeMem( + screenSetup->memoryStart, + TOTAL_SCREEN_SETUP_SIZE(screenSetup) + ); +} + +#define COPPERLIST_SIZE (10000) + +UWORD * PrepareNewCopperlist(void) { + UWORD *copperlist = AllocMem( + COPPERLIST_SIZE, + MEMF_CHIP | MEMF_CLEAR + ); + + InitializeCopperlist(copperlist); + + return copperlist; +} + +void SetCopperlist(UWORD *copperlist) { + custom.cop1lc = (ULONG)copperlist; +} + +void FreeCopperlist(UWORD *copperlist) { + FreeMem(copperlist, COPPERLIST_SIZE); +} + +void WriteSomethingToScreen(struct ScreenSetup *screenSetup) { + *(screenSetup->memoryStart) = 255; + *(screenSetup->memoryStart + 8) = 0xAA; + *(screenSetup->memoryStart + 16) = 0xF0; + *(screenSetup->memoryStart + SCREEN_WIDTH * SCREEN_HEIGHT / 8 + 4) = 255; +} + +void BlitFirstPlaneFirstRowToSecondRow(struct ScreenSetup *screenSetup) { + unsigned char *source = screenSetup->memoryStart; + unsigned char *target = (screenSetup->memoryStart + SCREEN_WIDTH * 2 / 8); + + // copy a to d + // $09F0 + custom.bltcon0 = 0x09f0; + custom.bltcon1 = 0; + custom.bltapt = source; + custom.bltdpt = target; + custom.bltamod = 0; + custom.bltdmod = 0; + custom.bltafwm = 0xffff; + custom.bltalwm = 0xffff; + custom.bltsize = 0x0041; +} + +void BlitShiftFirstPlaneFirstRowToThirdRow(struct ScreenSetup *screenSetup) { + unsigned char *source = screenSetup->memoryStart; + unsigned char *target = (screenSetup->memoryStart + SCREEN_WIDTH * 4 / 8); + + custom.bltcon0 = 0x49f0; + custom.bltcon1 = 0; + custom.bltapt = source; + custom.bltdpt = target; + custom.bltamod = 0; + custom.bltdmod = 0; + custom.bltafwm = 0xffff; + custom.bltalwm = 0xffff; + custom.bltsize = 0x0041; +} + +void BlitWithMaskInBChannel(struct ScreenSetup *screenSetup) { + unsigned char *source = screenSetup->memoryStart; + unsigned char *target = (screenSetup->memoryStart + SCREEN_WIDTH * 6 / 8); + unsigned char *mask = (screenSetup->memoryStart + 8); + + // a is source + // b is mask + // d is destination + + // so I want AB + + custom.bltcon0 = 0x0dc0; + custom.bltcon1 = 0; + custom.bltapt = mask; + custom.bltbpt = source; + custom.bltdpt = target; + custom.bltamod = 0; + custom.bltdmod = 0; + custom.bltafwm = 0xffff; + custom.bltalwm = 0xffff; + custom.bltsize = 0x0041; +} + +void BlitWithMaskInBDataInCChannel(struct ScreenSetup *screenSetup) { + unsigned char *source = screenSetup->memoryStart; + unsigned char *target = (screenSetup->memoryStart + SCREEN_WIDTH * 8 / 8); + unsigned char *mask = (screenSetup->memoryStart + 8); + unsigned char *background = (screenSetup->memoryStart + 16); + + // a is source + // b is mask + // c is background + // d is destination + + // so I want AB+`AC + + custom.bltcon0 = 0x0fca; + custom.bltcon1 = 0; + custom.bltapt = mask; + custom.bltbpt = source; + custom.bltcpt = background; + custom.bltdpt = target; + custom.bltamod = 0; + custom.bltbmod = 0; + custom.bltcmod = SCREEN_WIDTH / 8; + custom.bltdmod = SCREEN_WIDTH / 8; + custom.bltafwm = 0xffff; + custom.bltalwm = 0xffff; + custom.bltsize = 0x0041; +} + +void BlitDrawHorizontalLine(struct ScreenSetup *screenSetup) { + + // i want to draw a line from 20,20 to 50,80 + // i need to get dx and dy + // dx is 30, dy is 60 + // the shift value is 20 mod 15 = 5 + // a data register gets $8000 + // b data register gets $ffff + // text shift is 0 + // c and d pointers get the word containing the first pixel, so + // screenSetup->memoryStart + 320 * 20 / 8 + 2 + // module registers get width of bitplane in bytes + // blit height is dx + 1 so 31 + // blit width = 2 + // logic is ab+'a, so 6, 7, 2, 3, 1, 0 + + char *target = screenSetup->memoryStart + (320 * 20 + 20) / 8; + int dx = 10; + int dy = 60; + int tmp; + + if (dx < dy) { + tmp = dx; + dx = dy; + dy = tmp; + } + + custom.bltcon0 = (5 << 12) + (11 << 8) + 0xca; + custom.bltcon1 = 1; + custom.bltapt = 4 * dy - 2 * dx; + custom.bltadat = 0x8000; + custom.bltbdat = 0xffff; + custom.bltcpt = target; + custom.bltdpt = target; + custom.bltamod = 4 * (dy - dx); + custom.bltbmod = 4 * dy; + custom.bltcmod = 320 / 8; + custom.bltdmod = 320 / 8; + custom.bltafwm = 0xffff; + custom.bltalwm = 0xffff; + custom.bltsize = 0x02 + (dx + 1 << 7); +} + +void BlitClearScreen(struct ScreenSetup *screenSetup, int color) { + unsigned char *target = screenSetup->memoryStart; + int i; + + // a is source + // b is mask + // c is background + // d is destination + + // so I want AB+`AC + + for (i = 0; i < screenSetup->bitplanes; ++i) { + custom.bltcon0 = (0x01 << 8) + 0xf0; + custom.bltcon1 = 0; + custom.bltadat = color & 1 == 1 ? 0xffff : 0; + custom.bltdpt = target + (320 * 256 / 8) * i; + custom.bltamod = 0; + custom.bltdmod = 0; + custom.bltafwm = 0xffff; + custom.bltalwm = 0xffff; + custom.bltsize = (256 << 7) + (320 / 8); + + color >>= 1; + WaitBlit(); + } +} + +int main(void) { + struct ScreenSetup screenSetup = { SCREEN_WIDTH, SCREEN_HEIGHT, 4, 0 }; + struct ScreenSetup *s = &screenSetup; + UWORD *copperlist, *currentCopperlist; + int i, result; + color_t colors[16]; + + colors[0] = 0x0200; + colors[1] = 0x0f00; + colors[2] = 0x0f0f; + colors[3] = 0x000f; + + SetUpDisplay(&screenSetup); + + AllocateScreenMemory(&screenSetup); + WriteSomethingToScreen(&screenSetup); + + // blitter copy the first bitplane row down to the second + + copperlist = PrepareNewCopperlist(); + + TakeOverSystem(); + + /* + BlitFirstPlaneFirstRowToSecondRow(&screenSetup); + WaitBlit(); + BlitShiftFirstPlaneFirstRowToThirdRow(&screenSetup); + WaitBlit(); + BlitWithMaskInBChannel(&screenSetup); + WaitBlit(); + BlitWithMaskInBDataInCChannel(&screenSetup); + WaitBlit(); + BlitDrawHorizontalLine(&screenSetup); + WaitBlit(); + */ + + BlitClearScreen(&screenSetup, 2); + WaitBlit(); + + SetCopperlist(copperlist); + + SetUpDisplay(&screenSetup); + + currentCopperlist = AddDisplayToCopperlist(copperlist, &screenSetup); + currentCopperlist = AddColorsToCopperlist(currentCopperlist, colors, 16); + EndCopperlist(currentCopperlist); + + for (i = 0; i < 100; ++i) { + WaitTOF(); + } + + GiveBackSystem(); + + FreeScreenMemory(&screenSetup); + + FreeCopperlist(copperlist); + + printf("Hello from C\n"); + + return 0; +} diff --git a/smakefile b/smakefile new file mode 100644 index 0000000..d03ec97 --- /dev/null +++ b/smakefile @@ -0,0 +1,10 @@ +all: main + +.c.o: + sc $@ $*.c + +.s.o: + genam -l $*.s + +main: main.o blitter.o + sc link to main main.o blitter.o