From 7677ed6951aa69f7260e79a4c9f55fe2f3303a84 Mon Sep 17 00:00:00 2001 From: alpine9000 Date: Tue, 1 Mar 2016 15:18:22 +1100 Subject: [PATCH] Converted 001.simple_image to use imagecon --- 001.simple_image/Makefile | 8 +- 001.simple_image/image.s | 4 +- README.md | 23 ++++ base.mk | 5 + tools/imagecon/Makefile | 21 +++- tools/imagecon/imagecon.c | 160 +++++++------------------ tools/imagecon/reference/bitplane.bin | Bin 0 -> 40960 bytes tools/imagecon/reference/copper-list.s | 16 +++ 8 files changed, 114 insertions(+), 123 deletions(-) create mode 100644 tools/imagecon/reference/bitplane.bin create mode 100644 tools/imagecon/reference/copper-list.s diff --git a/001.simple_image/Makefile b/001.simple_image/Makefile index 41e51c0..060348c 100644 --- a/001.simple_image/Makefile +++ b/001.simple_image/Makefile @@ -1,11 +1,11 @@ MAKEADF=../tools/makeadf FLOPPY=bin/image.adf -EXTRA=out/image-copper.s out/image-data.bin +EXTRA=out/image-copper-list.s out/image.bin +IMAGEFILE=../assets/hello.png MODULE=image.s include ../base.mk -$(EXTRA): ../assets/hello.png ../tools/bitplanify.py - ../tools/bitplanify.py ../assets/hello.png --copper $(EXTRA) - +$(EXTRA): $(IMAGECON) $(IMAGEFILE) + $(IMAGECON) $(IMAGEFILE) out/image diff --git a/001.simple_image/image.s b/001.simple_image/image.s index e86c0b2..82a08d5 100644 --- a/001.simple_image/image.s +++ b/001.simple_image/image.s @@ -61,9 +61,9 @@ copper: dc.w BPL1MOD,SCREEN_WIDTH_BYTES*SCREEN_BIT_DEPTH-SCREEN_WIDTH_BYTES dc.w BPL2MOD,SCREEN_WIDTH_BYTES*SCREEN_BIT_DEPTH-SCREEN_WIDTH_BYTES - include "out/image-copper.s" + include "out/image-copper-list.s" dc.l $fffffffe bitplanes: - incbin "out/image-data.bin" + incbin "out/image.bin" \ No newline at end of file diff --git a/README.md b/README.md index 946547b..7c2fb7a 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,8 @@ (re)Learning how to program an Amiga after a 20 year break ========================================================== +Introduction +------------ +This repo is not meant to be an amiga programming guide. Documentation ------------- @@ -71,3 +74,23 @@ Notes: # make # make install ``` + +5. libtool + ``` + # wget http://ftpmirror.gnu.org/libtool/libtool-2.4.6.tar.gz + # tar zxfv libtool-2.4.6.tar.gz + # cd libtool-2.4.6 + # ./configure --prefix=/usr/local + # make + # make install +``` + +6. libpng + ``` + # wget ftp://ftp.simplesystems.org/pub/png/src/libpng16/libpng-1.6.21.tar.gz + # tar zxfv libpng-1.6.21.tar.gz + # cd libpng-1.6.21 + # ./configure --prefix=/usr/local + # make + # make install +``` diff --git a/base.mk b/base.mk index 62fd25e..e2935c4 100644 --- a/base.mk +++ b/base.mk @@ -1,5 +1,7 @@ HOST_WARNINGS=-pedantic-errors -Wfatal-errors -Wall -Werror -Wextra -Wno-unused-parameter -Wshadow HOST_CFLAGS=-g $(HOST_WARNINGS) +IMAGECONDIR=../tools/imagecon +IMAGECON=$(IMAGECONDIR)/bin/imagecon all: bin out $(MAKEADF) $(FLOPPY) @@ -21,6 +23,9 @@ bin: out: mkdir out +$(IMAGECON): + make -C $(IMAGECONDIR) + $(MAKEADF): ../tools/makeadf.c gcc ../tools/makeadf.c -o $(MAKEADF) diff --git a/tools/imagecon/Makefile b/tools/imagecon/Makefile index c712eaf..e12a0f5 100644 --- a/tools/imagecon/Makefile +++ b/tools/imagecon/Makefile @@ -1,6 +1,23 @@ +IMAGECON=./bin/imagecon SRCS=imagecon.c HOST_WARNINGS=-pedantic-errors -Wfatal-errors -Wall -Werror -Wextra -Wno-unused-parameter -Wshadow HOST_CFLAGS=$(HOST_WARNINGS) -imagecon: $(SRCS) - gcc $(HOST_CFLAGS) $(SRCS) -o imagecon -lpng \ No newline at end of file +imagecon: out bin $(SRCS) + gcc $(HOST_CFLAGS) $(SRCS) -o $(IMAGECON) -lpng + +out: + mkdir out + +bin: + mkdir bin + +bitplane.bin copper-list.s: bin/imagecon + $(IMAGECON) ../../assets/hello.png out/hello + +test: bitplane.bin copper-list.s + diff out/hello.bin reference/bitplane.bin + diff out/hello-copper-list.s reference/copper-list.s + +clean: + rm -r out bin \ No newline at end of file diff --git a/tools/imagecon/imagecon.c b/tools/imagecon/imagecon.c index e9dc647..23c2503 100644 --- a/tools/imagecon/imagecon.c +++ b/tools/imagecon/imagecon.c @@ -16,88 +16,73 @@ #define PNG_DEBUG 3 #include +char** _argv; + void abort_(const char * s, ...) { + fprintf(stderr, "%s: ", _argv[0]); va_list args; va_start(args, s); vfprintf(stderr, s, args); fprintf(stderr, "\n"); va_end(args); - abort(); + exit(1); } -//int x, y; -int width, height, rowbytes; -png_byte color_type; -png_byte bit_depth; -png_structp png_ptr; -png_infop info_ptr; -int number_of_passes; -png_bytep * row_pointers; - - +int width, height; +png_bytep* rowPointers; +#define MAX_PALETTE 16 typedef struct { unsigned char r; unsigned char g; unsigned char b; } amiga_color_t; -#define MAX_PALETTE 16 -int blah[MAX_PALETTE] = {0xfff, 0xd12, 0x744, 0xe20, 0x362, 0x06a, 0x0b0, 0x1ae, 0x2b5, 0xf92, 0xe9a, 0xfa7, 0x9dc, 0xddd , 0xfe0 , 0xee9}; amiga_color_t palette[MAX_PALETTE]; int paletteIndex = 0; unsigned* amigaImage = 0; -void read_png_file(char* file_name) +void readFile(char* file_name) { - - /* for (int i = 0; i < MAX_PALETTE; i++) { - palette[i].r = blah[i] >> 8 & 0xf; - palette[i].g = blah[i] >> 4 & 0xf; - palette[i].b = blah[i] & 0xf; - } - paletteIndex = 16; - */ + png_structp png_ptr; + png_byte color_type; + png_byte bit_depth; + png_infop info_ptr; + int number_of_passes, rowbytes; unsigned char header[8]; // 8 is the maximum size that can be checked /* open file and test for it being a png */ FILE *fp = fopen(file_name, "rb"); if (!fp) - abort_("[read_png_file] File %s could not be opened for reading", file_name); + abort_("Failed to open %s", file_name); fread(header, 1, 8, fp); if (png_sig_cmp(header, 0, 8)) - abort_("[read_png_file] File %s is not recognized as a PNG file", file_name); - - - /* initialize stuff */ - png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); - + abort_("File %s is not recognized as a PNG file", file_name); + + png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); if (!png_ptr) - abort_("[read_png_file] png_create_read_struct failed"); + abort_("png_create_read_struct failed"); info_ptr = png_create_info_struct(png_ptr); if (!info_ptr) - abort_("[read_png_file] png_create_info_struct failed"); + abort_("png_create_info_struct failed"); if (setjmp(png_jmpbuf(png_ptr))) - abort_("[read_png_file] Error during init_io"); + abort_("Error during init_io"); png_init_io(png_ptr, fp); png_set_sig_bytes(png_ptr, 8); png_read_info(png_ptr, info_ptr); - - width = png_get_image_width(png_ptr, info_ptr); height = png_get_image_height(png_ptr, info_ptr); color_type = png_get_color_type(png_ptr, info_ptr); bit_depth = png_get_bit_depth(png_ptr, info_ptr); - printf("width = %d\n", width); printf("height = %d\n", height); printf("color_type = %d (palette = %s)\n", color_type, color_type == PNG_COLOR_TYPE_PALETTE ? "yes" : "no"); @@ -129,12 +114,10 @@ void read_png_file(char* file_name) color_type = png_get_color_type(png_ptr, info_ptr); bit_depth = png_get_bit_depth(png_ptr, info_ptr); - - /* read file */ if (setjmp(png_jmpbuf(png_ptr))) - abort_("[read_png_file] Error during read_image"); + abort_("Error during read_image"); - row_pointers = (png_bytep*) malloc(sizeof(png_bytep) * height); + rowPointers = (png_bytep*) malloc(sizeof(png_bytep) * height); if (bit_depth == 16) rowbytes = width*8; @@ -142,9 +125,9 @@ void read_png_file(char* file_name) rowbytes = width*4; for (int y=0; y "); - - read_png_file(argv[1]); - process_file(); - // write_png_file(argv[2]); + _argv = argv; + + if (argc != 3) + abort_("usage: %s: ", argv[0]); + readFile(argv[1]); + processFile(argv[2]); + return 0; } diff --git a/tools/imagecon/reference/bitplane.bin b/tools/imagecon/reference/bitplane.bin new file mode 100644 index 0000000000000000000000000000000000000000..3564258c95ffc305437058748ed4de5abe872348 GIT binary patch literal 40960 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 literal 0 HcmV?d00001 diff --git a/tools/imagecon/reference/copper-list.s b/tools/imagecon/reference/copper-list.s new file mode 100644 index 0000000..c5310eb --- /dev/null +++ b/tools/imagecon/reference/copper-list.s @@ -0,0 +1,16 @@ + dc.w $180,$fff + dc.w $182,$ee9 + dc.w $184,$ddd + dc.w $186,$fe0 + dc.w $188,$fa7 + dc.w $18a,$9dc + dc.w $18c,$f92 + dc.w $18e,$2b5 + dc.w $190,$e20 + dc.w $192,$e9a + dc.w $194,$b0 + dc.w $196,$d12 + dc.w $198,$1ae + dc.w $19a,$6a + dc.w $19c,$744 + dc.w $19e,$362