From d22baa3f36cbfd4dcfe440b9dffe23daccd11799 Mon Sep 17 00:00:00 2001 From: slederer Date: Tue, 24 Dec 2024 03:05:46 +0100 Subject: [PATCH 1/3] add sprites library and Xmas demo --- .gitignore | 1 + examples/sprites.inc | 5 + examples/sprites.s | 363 +++++++++++++++++++++++++++++++++++++++++++ examples/xmas.pas | 220 ++++++++++++++++++++++++++ utils/png2pict.py | 110 +++++++++++++ 5 files changed, 699 insertions(+) create mode 100644 examples/sprites.inc create mode 100644 examples/sprites.s create mode 100644 examples/xmas.pas create mode 100644 utils/png2pict.py diff --git a/.gitignore b/.gitignore index 100c169..765db6a 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,7 @@ tests/*.s examples/*.s !runtime.s !stdlibwrap.s +!sprites.s *.o *.exe *.bin diff --git a/examples/sprites.inc b/examples/sprites.inc new file mode 100644 index 0000000..2b25366 --- /dev/null +++ b/examples/sprites.inc @@ -0,0 +1,5 @@ +type SpritePixels = array[0..31] of integer; +type BackgroundPixels = array[0..31999] of integer; + +procedure PutSprite(x,y:integer; var sprite: SpritePixels); external; +procedure UndrawSprite(x,y:integer; var background: BackgroundPixels); external; diff --git a/examples/sprites.s b/examples/sprites.s new file mode 100644 index 0000000..42a3d0e --- /dev/null +++ b/examples/sprites.s @@ -0,0 +1,363 @@ + .EQU SPRITE_HEIGHT 16 + + .EQU WORDS_PER_LINE 80 + .EQU FB_RA $900 + .EQU FB_WA $901 + .EQU FB_IO $902 + .EQU FB_PS $903 + +; calculate mask for a word of pixels +; args: word of pixels with four bits per pixel +; returns: value that masks out all pixels that are set +CALC_MASK: + LOADC $F ; pixel mask +C_M_L0: + SWAP ; swap mask and pixels value + AND.S1.X2Y ; isolate one pixel, keep args + CBRANCH.Z C_M_L1 ; if pixel is zero, dont set mask bits + OVER ; copy current mask + OR ; or into pixels value +C_M_L1: + SWAP ; swap back, ToS is now mask bits + SHL 2 ; shift mask for next pixel to the left + SHL 2 + + DUP + CBRANCH.NZ C_M_L0 ; if mask is zero, we are done + DROP ; remove mask bits + NOT ; invert result + RET + +; calculate vmem address from coordinates +; args: x,y +; returns: vmem word number +CALC_VMEM_ADDR: + ; only works if WORDS_PER_LINE is 80 + ; and pixels per word is 8 + + DUP + ; y + SHL 2 + SHL 2 + SHL 2 ; * 64 + + SWAP + ; + y + SHL 2 + SHL 2 ; * 16 + ADD + + SWAP + ; word offset = X/8 + SHR + SHR + SHR + ADD + + RET + +; put a sprite on screen +; arg: x,y pointer to sprite data + .EQU PS_VMEM_ADDR 0 + .EQU PS_SPRITE_DATA 4 + .EQU PS_SPRITE_LINES 8 + .EQU PS_X 12 + .EQU PS_Y 16 + .EQU PS_SHIFT_C 20 + .EQU PS_SPILL 24 + .EQU PS_FS 28 +PUTSPRITE: + FPADJ -PS_FS + STORE PS_SPRITE_DATA + STORE PS_Y + STORE PS_X + + ; calculate vmem address + LOAD PS_X + LOAD PS_Y + LOADCP CALC_VMEM_ADDR + CALL + STORE PS_VMEM_ADDR + + LOAD PS_X ; shift count = x mod 8 + LOADC 7 + AND + STORE PS_SHIFT_C + + LOADC SPRITE_HEIGHT + STORE PS_SPRITE_LINES + + ; loop over each line of the sprite +PS_LOOP1: + ; set read and write address + ; in the vga controller + LOADC FB_RA ; read address register + LOAD PS_VMEM_ADDR + STOREI 1 ; use autoincrement to get to the next register + LOAD PS_VMEM_ADDR + STOREI + DROP + + LOAD PS_SPRITE_DATA ; address of sprite data + DUP + INC 4 ; increment pointer + STORE PS_SPRITE_DATA ; and store it again + LOADI ; load word from orig. address + + + LOADC 0 + STORE PS_SPILL + + ; loop to shift pixel data to right + LOAD PS_SHIFT_C ; load shift count +PS_LOOP2: + DUP ; test it for zero + CBRANCH.Z PS_LOOP2_X + + SWAP ; swap count with pixels + + ; save the pixel that is shifted out + LOADC $F ; mask the four bits + AND.S0 ; keep original value on stack + BROT ; and move them to MSB + BROT + BROT + SHL 2 + SHL 2 ; shift by 28 in total + + LOAD PS_SPILL ; load spill bits + SHR ; shift by four to make space + SHR + SHR + SHR + OR ; or with orig value + STORE PS_SPILL ; store new value + + SHR ; shift pixels right + SHR ; four bits per pixel + SHR + SHR + + SWAP ; swap back, count now ToS + DEC 1 + BRANCH PS_LOOP2 +PS_LOOP2_X: + DROP ; remove shift count, shifted pixels now in ToS + + DUP + LOADCP CALC_MASK ; calculate sprite mask for this word + CALL + + LOADCP FB_IO ; address of the i/o register + LOADI ; read word from video mem + + AND ; and word with mask + + OR ; OR sprite data with original pixels + + LOADCP FB_IO + SWAP + STOREI ; store result into i/o reg + DROP + + ; + ; process spilled bits and right half of sprite data + ; + + ; put spill bits on stack for later + LOAD PS_SPILL + + LOAD PS_SPRITE_DATA ; address of sprite data + DUP + INC 4 ; increment pointer + STORE PS_SPRITE_DATA ; and store it again + LOADI ; load word from orig. address + + ; reset spill bits + LOADC 0 + STORE PS_SPILL + + ; shift pixel data to right + LOAD PS_SHIFT_C ; load shift count +PS_LOOP3: ; test it for zero + DUP + CBRANCH.Z PS_LOOP3_X + + SWAP ; swap count with pixels + + ; save the pixel that is shifted out + LOADC $F ; mask the four bits + AND.S0 ; keep original value on stack + BROT ; and move them to MSB + BROT + BROT + SHL 2 + SHL 2 ; shift by 28 in total + + LOAD PS_SPILL ; load spill bits + SHR ; shift by four to make space + SHR + SHR + SHR + OR ; or with orig value + STORE PS_SPILL ; store new value + + SHR ; shift pixels right + SHR ; four bits per pixel + SHR + SHR + + SWAP ; swap back, count now ToS + DEC 1 + BRANCH PS_LOOP3 +PS_LOOP3_X: + DROP ; remove shift count, shifted pixels now in ToS + + OR ; or together with spill bits + + DUP + LOADCP CALC_MASK ; calculate sprite mask + CALL + + LOADCP FB_IO ; load original pixels + LOADI + + AND ; and with mask + + OR ; or together with original pixels + + LOADCP FB_IO + SWAP + STOREI + DROP + + ; write spilled bits into next vmem word + LOAD PS_SPILL ; get spill bits + DUP + LOADCP CALC_MASK ; calculate sprite mask for spill bits + CALL + + LOADCP FB_IO + LOADI ; load next vmem word + AND ; apply sprite mask + + OR ; OR in spill bits + + LOADCP FB_IO + SWAP ; swap pixels and addr + STOREI ; write back + DROP + + LOAD PS_SPRITE_LINES ; decrement lines count + DEC 1 + DUP + CBRANCH.Z PS_L_XT ; exit if zero + STORE PS_SPRITE_LINES + ; prepare next line + LOAD PS_VMEM_ADDR + LOADC WORDS_PER_LINE ; increment to next screen line + ADD + STORE PS_VMEM_ADDR + BRANCH PS_LOOP1 +PS_L_XT: + DROP + + FPADJ PS_FS + RET + +; undraw a sprite, i.e. draw background data +; over a sprite location +; args: x,y, ptr to background data + .EQU UD_S_X 0 + .EQU UD_S_Y 4 + .EQU UD_S_PXS 8 + .EQU UD_S_BGDATA 12 + .EQU UD_S_OFFSET 16 + .EQU UD_S_BGORIG 20 + .EQU UD_S_FS 24 +UNDRAWSPRITE: + FPADJ -UD_S_FS + STORE UD_S_BGORIG + STORE UD_S_Y + STORE UD_S_X + + ; calculate pixel shift + LOAD UD_S_X + LOADC $7 + AND + STORE UD_S_PXS + + ; calculate vmem offset + LOAD UD_S_X + LOAD UD_S_Y + LOADCP CALC_VMEM_ADDR + CALL + + DUP + STORE UD_S_OFFSET + + ; calculate background data address from offset + SHL 2 + LOAD UD_S_BGORIG + ADD + STORE UD_S_BGDATA + + LOADC SPRITE_HEIGHT ; line count +UD_S_L1: + ; store vmem offset into write addr reg + LOADCP FB_WA + LOAD UD_S_OFFSET + STOREI 1 ; ugly but fast: reuse addr + ; with postincrement to + ; get to FB_IO for STOREI below + + ; load a word of background data + LOAD UD_S_BGDATA + LOADI + ; and write it to vmem + STOREI + ; reuse addr from STOREI + + ; load 2nd word of background data + LOAD UD_S_BGDATA + INC 4 + DUP + STORE UD_S_BGDATA + LOADI + STOREI ; and write it to vmem + DROP + + ; if pixel shift is zero, no 3rd word + LOAD UD_S_PXS + CBRANCH.Z UD_S_L2 + + ; load 3rd word of background data + LOADCP FB_IO + LOAD UD_S_BGDATA + INC 4 + DUP + STORE UD_S_BGDATA + LOADI + STOREI ; and write it to vmem + DROP + +UD_S_L2: + LOAD UD_S_OFFSET + LOADCP WORDS_PER_LINE + ADD + DUP + STORE UD_S_OFFSET + SHL 2 + LOAD UD_S_BGORIG + ADD + STORE UD_S_BGDATA + + DEC 1 ; decrement counter + DUP + CBRANCH.NZ UD_S_L1 ; check for zero + + DROP ; remove counter + + FPADJ UD_S_FS + RET + diff --git a/examples/xmas.pas b/examples/xmas.pas new file mode 100644 index 0000000..12b2da3 --- /dev/null +++ b/examples/xmas.pas @@ -0,0 +1,220 @@ +program XmasAnimation; +uses sprites; + +type PictData = record + magic, mode:integer; + palette: array [0..15] of integer; + pixeldata: array [0..31999] of integer; + end; + + Sprite = record + x,y:integer; + oldX,oldY:integer; + xdelta,ydelta:integer; + curFrame:integer; + frameCount:integer; + frameTime:integer; + frameLeft:integer; + changed:boolean; + frame:array [0..3] of SpritePixels; + end; + +var pic:PictData; + filename:string; + infile:file; + ch:char; + santaSprite: Sprite; + deerSprite: Sprite; + ohDeerSprite: Sprite; + rudolfSprite: Sprite; + smokeSprite: Sprite; + +procedure WaitVSync; external; + +procedure loadPalette(var pic:PictData); +var i:integer; +begin + for i := 0 to 15 do + setpalette(i, pic.palette[i]); +end; + +procedure showPic(var pic:PictData); +begin + PutScreen(pic.pixeldata); +end; + +procedure loadSpriteFrame(var aSprite:Sprite;spriteIndex:integer; + var sheetFile:file;sheetIndex:integer); +begin + seek(sheetFile, 8 + sheetIndex * 128); + read(sheetFile, aSprite.frame[spriteIndex]); + if aSprite.frameCount <= spriteIndex then + aSprite.frameCount := spriteIndex + 1; + + aSprite.curFrame := 0; + writeln('loaded sprite frame ', spriteIndex, ' from ', sheetIndex); +end; + +procedure animateSprite(var aSprite:Sprite); +var frameIndex:integer; + frameTime,frameLeft:integer; + ydelta:integer; + oldX,oldY:integer; +begin + ydelta := aSprite.ydelta; + frameIndex := aSprite.curFrame; + frameTime := aSprite.frameTime; + frameLeft := aSprite.frameLeft; + oldX := aSprite.x; oldY := aSprite.y; + aSprite.oldX := oldX; aSprite.oldY := oldY; + + frameLeft := frameLeft - 1; + if frameLeft <= 0 then + begin + frameIndex := frameIndex + 1; + frameLeft := aSprite.frameTime; + aSprite.frameLeft := frameLeft; + aSprite.curFrame := frameIndex; + if frameIndex >= aSprite.frameCount + then + aSprite.curFrame := 0; + + if frameIndex = 1 then + begin + ydelta := - ydelta; + aSprite.ydelta := ydelta; + end; + aSprite.y := aSprite.y + ydelta; + end; + + aSprite.frameLeft := frameLeft; + + aSprite.x := aSprite.x + aSprite.xdelta; + if aSprite.x > 620 then aSprite.x := 0; +end; + +procedure animate; +var i:integer; + ydelta:integer; + frameIndex:integer; + frameTime:integer; + oldX,oldY:integer; +begin + santaSprite.x := 0; + santaSprite.y := 60; + santaSprite.frameTime := 10; + santaSprite.xdelta := 2; + santaSprite.ydelta := 1; + + smokeSprite.x := 434; + smokeSprite.y := 252; + smokeSprite.frameTime := 20; + + deerSprite.x := 18; + deerSprite.y := 60; + deerSprite.frameTime := 10; + deerSprite.xdelta := 2; + deerSprite.ydelta := 1; + + ohDeerSprite.x := 33; + ohDeerSprite.y := 61; + ohDeerSprite.frameTime := 10; + ohDeerSprite.xdelta := 2; + ohDeerSprite.ydelta := 1; + + rudolfSprite.x := 49; + rudolfSprite.y := 60; + rudolfSprite.frameTime := 10; + rudolfSprite.xdelta := 2; + rudolfSprite.ydelta := 1; + + ydelta := 1; + + frameTime := santaSprite.frameTime; + + while not ConAvail do + begin + frameIndex := santaSprite.curFrame; + oldX := santaSprite.x; oldY := santaSprite.y; + PutSprite(oldX, oldY, santaSprite.frame[frameIndex]); + i := i + 1; + frameTime := frameTime - 1; + if frameTime = 0 then + begin + frameTime := santaSprite.frameTime; + santaSprite.curFrame := frameIndex + 1; + if frameIndex >= santaSprite.frameCount + then + santaSprite.curFrame := 0; + + if frameIndex = 0 then ydelta := - ydelta; + santaSprite.y := santaSprite.y + ydelta; + end; + santaSprite.x := santaSprite.x + 2; + if santaSprite.x > 620 then santaSprite.x := 0; + + PutSprite(deerSprite.x, deerSprite.y, + deerSprite.frame[deerSprite.curFrame]); + + PutSprite(ohDeerSprite.x, ohDeerSprite.y, + ohDeerSprite.frame[ohDeerSprite.curFrame]); + + PutSprite(rudolfSprite.x, rudolfSprite.y, + rudolfSprite.frame[rudolfSprite.curFrame]); + + PutSprite(smokeSprite.x, smokeSprite.y, + smokeSprite.frame[smokeSprite.curFrame]); + + animateSprite(deerSprite); + animateSprite(ohDeerSprite); + animateSprite(rudolfSprite); + animateSprite(smokeSprite); + + Delay(10); + WaitVSync; + + UndrawSprite(oldX, oldY, pic.pixeldata); + UndrawSprite(deerSprite.oldX, deerSprite.oldY, pic.pixeldata); + UndrawSprite(ohDeerSprite.oldX, ohDeerSprite.oldY, pic.pixeldata); + UndrawSprite(rudolfSprite.oldX, rudolfSprite.oldY, pic.pixeldata); + UndrawSprite(smokeSprite.oldX, smokeSprite.oldY, pic.pixeldata); + end; +end; + + +begin + filename := 'background.pict'; + open(infile, filename, ModeReadonly); + read(infile, pic); + close(infile); + + writeln('magic: ', pic.magic, ' mode:', pic.mode); + + loadPalette(pic); + showPic(pic); + + open(infile, 'sprites.sprt', ModeReadOnly); + loadSpriteFrame(santaSprite, 0, infile, 0); + loadSpriteFrame(santaSprite, 1, infile, 1); + + loadSpriteFrame(deerSprite, 0, infile, 5); + loadSpriteFrame(deerSprite, 1, infile, 6); + loadSpriteFrame(deerSprite, 2, infile, 7); + + loadSpriteFrame(ohDeerSprite, 0, infile, 7); + loadSpriteFrame(ohDeerSprite, 1, infile, 5); + loadSpriteFrame(ohDeerSprite, 2, infile, 6); + + loadSpriteFrame(rudolfSprite, 0, infile, 3); + loadSpriteFrame(rudolfSprite, 1, infile, 4); + loadSpriteFrame(rudolfSprite, 2, infile, 2); + + loadSpriteFrame(smokeSprite, 0, infile, 8); + loadSpriteFrame(smokeSprite, 1, infile, 9); + loadSpriteFrame(smokeSprite, 2, infile, 10); + loadSpriteFrame(smokeSprite, 3, infile, 11); + + close(infile); + + animate; +end. diff --git a/utils/png2pict.py b/utils/png2pict.py new file mode 100644 index 0000000..73c4670 --- /dev/null +++ b/utils/png2pict.py @@ -0,0 +1,110 @@ +#!/usr/bin/python3 +import sys +import png + +def process_pixdata(outfile, pixdata, frameindex = 0, pix_w=640, pix_h=400): + + pixmask = 15 + y = pix_h * frameindex + max_y = y + pix_h - 1 + + while y <= max_y: + x = 0 + max_x = pix_w - 1 + pixline = pixdata[y] + while x <= max_x: + px1 = pixline[x+0] & pixmask + px2 = pixline[x+1] & pixmask + px3 = pixline[x+2] & pixmask + px4 = pixline[x+3] & pixmask + px5 = pixline[x+4] & pixmask + px6 = pixline[x+5] & pixmask + px7 = pixline[x+6] & pixmask + px8 = pixline[x+7] & pixmask + vmem_word = (px1 << 28) | (px2 << 24) | (px3 << 20) | (px4 << 16) | \ + (px5 << 12) | (px6 << 8) | (px7 << 4) | px8 + + outfile.write(vmem_word.to_bytes(4, 'big')) + x += 8 + y += 1 + + +def process_palette(outfile, palette): + for r,g,b in palette: + r4 = r >> 4 + g4 = g >> 4 + b4 = b >> 4 + c12 = r4 << 8 | g4 << 4 | b4 + + outfile.write(c12.to_bytes(4, 'big')) + + +def write_header(outfile): + magic = b'PIct' + mode = 1 + outfile.write(magic); + outfile.write(mode.to_bytes(4, 'big')) + + +def write_sprite_header(outfile): + magic = b'SPRT' + mode = 1 + outfile.write(magic); + outfile.write(mode.to_bytes(4, 'big')) + + +def write_pict_file(width, height, px, metadata, outfile): + print("processing as PICT file...") + if width != 640: + print("width must be 640, aborting") + sys.exit(1) + pixdata = list(px) + palette = metadata['palette'] + + if len(palette) != 16: + print("palette must have 16 colors, aborting") + sys.exit(0) + + with open(outfile,'wb') as f: + write_header(f) + process_palette(f, palette) + process_pixdata(f, pixdata) + + +def write_sprite_file(width, height, px, metadata, outfile): + sprite_height=16 + + print("processing as SPRT file with {} sprites...".format(height//sprite_height)) + if width != 16: + print("width must be 16, aborting") + sys.exit(1) + pixdata = list(px) + palette = metadata['palette'] + + if len(palette) != 16: + print("palette must have 16 colors, aborting") + sys.exit(0) + + with open(outfile,'wb') as f: + write_sprite_header(f) + process_pixdata(f, pixdata, pix_w=16, pix_h=height) + + +if __name__ == '__main__': + if len(sys.argv) != 3: + print("Usage: {} ".format(sys.argv[0])) + sys.exit(1) + + infile = sys.argv[1] + outfile = sys.argv[2] + + r = png.Reader(infile) + p = r.read() + width, height, px, metadata = p + if width == 640: + write_pict_file(width, height, px, metadata, outfile) + elif width == 16: + write_sprite_file(width, height, px, metadata, outfile) + else: + print("Can't handle this file, need a width of\n640 or 16 pixels with 16 color palette.") + From 21bd825a8ab33a98eec05a491365f4dc7e0cd0ba Mon Sep 17 00:00:00 2001 From: slederer Date: Tue, 24 Dec 2024 03:07:16 +0100 Subject: [PATCH 2/3] add image data for Xmas demo --- examples/background.pict | Bin 0 -> 128072 bytes examples/sprites.sprt | Bin 0 -> 1544 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 examples/background.pict create mode 100644 examples/sprites.sprt diff --git a/examples/background.pict b/examples/background.pict new file mode 100644 index 0000000000000000000000000000000000000000..76b99f645b605e71a29ff6884c66fbe0729a00f6 GIT binary patch literal 128072 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 literal 0 HcmV?d00001 diff --git a/examples/sprites.sprt b/examples/sprites.sprt new file mode 100644 index 0000000000000000000000000000000000000000..475bd4df760f1631f1c3cd71185631cc41f9ea17 GIT binary patch literal 1544 zcmd5(yKciU47?&0JQ#?RIYU38{)FsZ)Q6zo@FHmJFU7M5{ff74Mp~d#fT~B@-h!g3 z(V_&bBPo%0q#y0W6M!pz>z)VJ!!QUobb4_R^HHF9zS$^FF^1Tbk{Mni+OC7V@4B|# zZu_#^c4{qlcVZjtG?oT??5_>c!kT+HHR&_*ivW4WcFMn=_?utnS5`SzsMTMsrqmb$ z>7a@7?L<(!#6r1vOkR7WWCI8L!5s!Bq@$nY0gJqfAnv24~=jyjNT4@jp> zB_Gt4v+^e{j?YVy%O^e(XH&ByoIjV%&n3f~Q?i=qqoH~(z^uYbJ% zGxIOszx;zG7PYvDQU7!iVvq!5Ma*c%`yVnD-p@3lq345-nu*b?06*~?Khl1mN6Ui` z&auWgXM;LpAH%eS-gyBOjR`uZL8JU4=7+|HhP{H6J4 Date: Fri, 27 Dec 2024 03:02:11 +0100 Subject: [PATCH 3/3] update Vivado project file --- tridoracpu/tridoracpu.xpr | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tridoracpu/tridoracpu.xpr b/tridoracpu/tridoracpu.xpr index 5e4a64f..a4c6545 100644 --- a/tridoracpu/tridoracpu.xpr +++ b/tridoracpu/tridoracpu.xpr @@ -25,7 +25,7 @@