From 68c54c01d2c0c266349b5f91023ebe6fe5c74de2 Mon Sep 17 00:00:00 2001 From: alpine9000 Date: Wed, 16 Mar 2016 20:17:08 +1100 Subject: [PATCH] First pass at calling C --- 021.calling_c/Makefile | 41 ++++++++++++++ 021.calling_c/README.md | 7 +++ 021.calling_c/bin/calling_c.adf | Bin 0 -> 901120 bytes 021.calling_c/c_code.c | 21 ++++++++ 021.calling_c/calling_c.s | 93 ++++++++++++++++++++++++++++++++ 021.calling_c/constants.i | 13 +++++ 021.calling_c/gigi.pal | 16 ++++++ 021.calling_c/includes.i | 7 +++ 021.calling_c/init.s | 61 +++++++++++++++++++++ 021.calling_c/test.c | 5 ++ 021.calling_c/utils.s | 26 +++++++++ Makefile | 3 +- shared/base.mk | 5 +- 13 files changed, 296 insertions(+), 2 deletions(-) create mode 100644 021.calling_c/Makefile create mode 100644 021.calling_c/README.md create mode 100644 021.calling_c/bin/calling_c.adf create mode 100644 021.calling_c/c_code.c create mode 100644 021.calling_c/calling_c.s create mode 100644 021.calling_c/constants.i create mode 100644 021.calling_c/gigi.pal create mode 100644 021.calling_c/includes.i create mode 100644 021.calling_c/init.s create mode 100644 021.calling_c/test.c create mode 100644 021.calling_c/utils.s diff --git a/021.calling_c/Makefile b/021.calling_c/Makefile new file mode 100644 index 0000000..eb59ecb --- /dev/null +++ b/021.calling_c/Makefile @@ -0,0 +1,41 @@ +SHRINKLER=0 +INTERLACE=0 +HAM_MODE=1 + +EXAMPLE_NAME=calling_c +MODULE=$(EXAMPLE_NAME).s +OBJS=out/init.o out/utils.o out/c_code.o +IMAGEFILE=../assets/gigi_full.png +SIZED_IMAGEFILE=out/image.png +BASE_ADDRESS=50000 +DECOMPRESS_ADDRESS=10000 +FLOPPY=bin/$(EXAMPLE_NAME).adf + +ifeq ($(HAM_MODE),1) +IMAGEDATA=out/image-palette.s out/image-ham.bin +VASM_EXTRA_ARGS=-DINTERLACE=$(INTERLACE) -DHAM_MODE=$(HAM_MODE) +IMAGECON_ARGS=--use-palette gigi.pal --dither --ham +else +VASM_EXTRA_ARGS=-DINTERLACE=$(INTERLACE) -DHAM_MODE=$(HAM_MODE) +IMAGECON_ARGS=--colors 32 --quantize +IMAGEDATA=out/image-palette.s out/image.bin +endif + +ifeq ($(INTERLACE),1) +FLAGS=--height=512 --interlaced +else +FLAGS=--height=256 +endif + +include ../shared/base.mk + + +$(SIZED_IMAGEFILE): $(IMAGEFILE) $(RESIZE) Makefile + $(RESIZE) --width=320 $(FLAGS) --blur=0.75 --input=$(IMAGEFILE) --output=$(SIZED_IMAGEFILE) + +$(IMAGEDATA): $(IMAGECON) $(SIZED_IMAGEFILE) Makefile + $(IMAGECON) --input $(SIZED_IMAGEFILE) $(IMAGECON_ARGS) --output out/image --output-bitplanes --output-palette-asm --output-palette $(DITHER) + + +out/main.o: $(IMAGEDATA) constants.i Makefile +out/init.o: constants.i Makefile \ No newline at end of file diff --git a/021.calling_c/README.md b/021.calling_c/README.md new file mode 100644 index 0000000..687ad87 --- /dev/null +++ b/021.calling_c/README.md @@ -0,0 +1,7 @@ +calling C code +============== + +try it +------ + * [Download disk image](bin/calling_c.adf?raw=true) + * Run in SAE diff --git a/021.calling_c/bin/calling_c.adf b/021.calling_c/bin/calling_c.adf new file mode 100644 index 0000000000000000000000000000000000000000..228906aef6e71d511efed78ef52bfaae11a5c408 GIT binary patch literal 901120 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

-0H3_x!^VlOf7rAhPduSs(&j6Ycos_(%lb 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 16); + bitplanes += screenWidthBytes; + copper += 4; + } +} + +static unsigned short _copperData; +static unsigned char _bitplaneData; +static void +TestCall() +{ + PokeBitplanePointers(&_copperData, &_bitplaneData, 3, 4, 5); +} diff --git a/021.calling_c/calling_c.s b/021.calling_c/calling_c.s new file mode 100644 index 0000000..772ecec --- /dev/null +++ b/021.calling_c/calling_c.s @@ -0,0 +1,93 @@ + include "includes.i" + + xref InstallColorPalette + ;;xref PokeBitplanePointers + xref copperList + xref copperListAlternate + xref bitplanes + +Entry: + lea CUSTOM,a6 + jsr Init + +.mainLoop: + jsr WaitVerticalBlank + + if INTERLACE == 1 + btst.w #VPOSRLOFBIT,VPOSR(a6) + beq.s .lof + lea copperListAlternate(pc),a0 + move.l a0,COP1LC(a6) + bra .done +.lof: + lea copperList(pc),a0 + move.l a0,COP1LC(a6) +.done + endif ; INTERLACE == 1 + bra .mainLoop + +;=========================================================== + if 0 +PokeBitplanePointers: ; d0 = frame offset in bytes, a0 = BPLP copper list address + movem.l d0-a6,-(sp) + move.l bitplanes,a1 + add.l d0,a1 ; Offset for odd/even frames + 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 + endif +;=========================================================== + +InstallColorPalette: + include "out/image-palette.s" + rts + + if INTERLACE == 1 +copperListAlternate: + ;; 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 + endif ; INTERLACE == 1 + +copperList: + ;; 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: + if HAM_MODE == 1 + incbin "out/image-ham.bin" + else + incbin "out/image.bin" + endif \ No newline at end of file diff --git a/021.calling_c/constants.i b/021.calling_c/constants.i new file mode 100644 index 0000000..689db18 --- /dev/null +++ b/021.calling_c/constants.i @@ -0,0 +1,13 @@ +SCREEN_WIDTH equ 320 +SCREEN_HEIGHT equ (256+(256*INTERLACE)) +SCREEN_WIDTH_BYTES equ (SCREEN_WIDTH/8) + if HAM_MODE == 1 +SCREEN_BIT_DEPTH equ 6 + else +SCREEN_BIT_DEPTH equ 5 + endif +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/021.calling_c/gigi.pal b/021.calling_c/gigi.pal new file mode 100644 index 0000000..90b5e5b --- /dev/null +++ b/021.calling_c/gigi.pal @@ -0,0 +1,16 @@ +875 +532 +ea7 +89a +752 +321 +b74 +565 +fc9 +963 +d95 +9ab +689 +742 +a97 +210 diff --git a/021.calling_c/includes.i b/021.calling_c/includes.i new file mode 100644 index 0000000..e5906ae --- /dev/null +++ b/021.calling_c/includes.i @@ -0,0 +1,7 @@ + include "../include/registers.i" + include "../include/vector.i" + include "../include/beambits.i" + include "../include/bplconbits.i" + include "hardware/dmabits.i" + include "hardware/intbits.i" + include "constants.i" \ No newline at end of file diff --git a/021.calling_c/init.s b/021.calling_c/init.s new file mode 100644 index 0000000..b54d055 --- /dev/null +++ b/021.calling_c/init.s @@ -0,0 +1,61 @@ + + include "includes.i" + + xref Init + + ;; 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 + jsr InstallColorPalette + + if INTERLACE == 1 + ;; poke the bitplane pointers for the two copper lists. + move.l #SCREEN_WIDTH_BYTES*SCREEN_BIT_DEPTH,d0 + lea copperListAlternate,a0 + jsr PokeBitplanePointers + endif + + ;; void PokeBitplanePointers(unsigned short* copper, unsigned char* bitplanes, unsigned offset, unsigned numBitplanes, unsigned screenWidthBytes) + move.l #SCREEN_WIDTH_BYTES,-(sp) + move.l #SCREEN_BIT_DEPTH,-(sp) + move.l #0,-(sp) + pea bitplanes + pea copperList + jsr _PokeBitplanePointers + add.l #20,sp + + ;; 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) + + if HAM_MODE == 1 +HAMBIT equ HOMOD + else +HAMBIT equ 0 + endif + + if INTERLACE == 1 + move.w #(SCREEN_BIT_DEPTH<<12)|COLOR_ON|HAMBIT|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) + else + move.w #(SCREEN_BIT_DEPTH<<12)|COLOR_ON|HAMBIT,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) + endif + + ;; install copper list, then enable dma and selected interrupts + lea copperList,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/021.calling_c/test.c b/021.calling_c/test.c new file mode 100644 index 0000000..0445180 --- /dev/null +++ b/021.calling_c/test.c @@ -0,0 +1,5 @@ +int +GetScreenBitDepth() +{ + return 5; +} diff --git a/021.calling_c/utils.s b/021.calling_c/utils.s new file mode 100644 index 0000000..c539984 --- /dev/null +++ b/021.calling_c/utils.s @@ -0,0 +1,26 @@ + xref WaitVerticalBlank + xref WaitRaster + +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 diff --git a/Makefile b/Makefile index 5dc9f13..3199d69 100644 --- a/Makefile +++ b/Makefile @@ -22,7 +22,8 @@ SUBDIRS=tools/makeadf \ 017.dual_playfield\ 018.vert_scroll\ 019.hori_scroll\ - 020.shrinkler + 020.shrinkler\ + 021.calling_c .PHONY: subdirs $(SUBDIRS) diff --git a/shared/base.mk b/shared/base.mk index ab5d6bd..3a4398d 100644 --- a/shared/base.mk +++ b/shared/base.mk @@ -90,11 +90,14 @@ out/main.o: $(MODULE) $(EXTRA) out/%.o: %.s vasmm68k_mot $(VASM_EXTRA_ARGS) -Fhunk -phxass -opt-fconst -nowarn=62 -quiet $< -o $@ -I/usr/local/amiga/os-include +out/%.o: %.c + vc -O3 -c $< -o $@ + -@vc -O3 -S $< -o out/$*.s > /dev/null 2> /dev/null + out/main.bin: out/main.o $(OBJS) @#-T ../link.script vlink -Ttext 0x$(BASE_ADDRESS) -brawbin1 $< $(OBJS) -o $@ - out/shrunk.bin: $(SHRINKLER_EXE) out/main.bin $(SHRINKLEREXE) -d out/main.bin out/shrunk.bin