From 6fc772ce787d924db1f3525cd7dfc72f6b3e12df Mon Sep 17 00:00:00 2001 From: Lucas Scharenbroich Date: Fri, 16 Jul 2021 17:05:29 -0500 Subject: [PATCH] Sorted out BG1 edge artifacts --- assets/gba-cloud-bgnd-8-color.png | Bin 0 -> 3843 bytes assets/gba-cloud-bgnd.png | Bin 0 -> 4411 bytes assets/smb-2bit-328x208-shift.png | Bin 0 -> 3941 bytes assets/smb-2bit-328x208.png | Bin 0 -> 3968 bytes assets/smb-2bit-512x223.png | Bin 0 -> 6341 bytes build-image.bat | 3 +- package.json | 2 +- src/Actions.s | 9 +- src/App.Init.s | 6 +- src/App.Main.s | 117 ++++++++++++-- src/Render.s | 2 + src/blitter/BG1.s | 49 +++++- src/blitter/Blitter.s | 9 +- src/blitter/DirectPage.s | 18 ++- src/blitter/Tiles.s | 255 +++++++++++++++++------------- tools/pngtoiigs.js | 21 ++- 16 files changed, 358 insertions(+), 133 deletions(-) create mode 100644 assets/gba-cloud-bgnd-8-color.png create mode 100644 assets/gba-cloud-bgnd.png create mode 100644 assets/smb-2bit-328x208-shift.png create mode 100644 assets/smb-2bit-328x208.png create mode 100644 assets/smb-2bit-512x223.png diff --git a/assets/gba-cloud-bgnd-8-color.png b/assets/gba-cloud-bgnd-8-color.png new file mode 100644 index 0000000000000000000000000000000000000000..efaa328de4c14760444f517d5448f1a8bcfb9fa4 GIT binary patch literal 3843 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 literal 0 HcmV?d00001 diff --git a/assets/smb-2bit-328x208-shift.png b/assets/smb-2bit-328x208-shift.png new file mode 100644 index 0000000000000000000000000000000000000000..91a66deee740cffbe167e91748645418c23af8cb GIT binary patch literal 3941 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 literal 0 HcmV?d00001 diff --git a/assets/smb-2bit-512x223.png b/assets/smb-2bit-512x223.png new file mode 100644 index 0000000000000000000000000000000000000000..a8965bdb815d10384746f64075c8391d4acc2c8c GIT binary patch literal 6341 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 literal 0 HcmV?d00001 diff --git a/build-image.bat b/build-image.bat index f526bd4..be18e14 100644 --- a/build-image.bat +++ b/build-image.bat @@ -15,4 +15,5 @@ REM Cadius does not overwrite files, so clear the root folder first REM Now copy files and folders as needed %CADIUS% ADDFILE %IMAGE% %FOLDER% src\\GTETestApp %CADIUS% ADDFILE %IMAGE% %FOLDER% emu\\test.pic -%CADIUS% ADDFILE %IMAGE% %FOLDER% emu\\bg1.bin +%CADIUS% ADDFILE %IMAGE% %FOLDER% emu\\bg1a.bin +%CADIUS% ADDFILE %IMAGE% %FOLDER% emu\\bg1b.bin diff --git a/package.json b/package.json index 925551d..f9f67e6 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "debug": "%npm_package_config_crossrunner% src\\GTETestApp -Source src\\GTETestApp_S02_MAINSEG_Output.txt -Debug -CompatibilityLayer", "build": "%npm_package_config_merlin32% -V %npm_package_config_macros% src\\App.s", "build:watch": "watch \"npm run build\" src", - "build:assets": "node ./tools/pngtoiigs.js ./assets/gba-cloud-bgnd-8-color.png ./emu/bg1.bin" + "build:assets": "node ./tools/pngtoiigs.js ./assets/smb-2bit-328x208.png ./emu/bg1a.bin && node ./tools/pngtoiigs.js ./assets/smb-2bit-328x208-shift.png ./emu/bg1b.bin" }, "repository": { "type": "git", diff --git a/src/Actions.s b/src/Actions.s index f27536a..6a40663 100644 --- a/src/Actions.s +++ b/src/Actions.s @@ -1,10 +1,12 @@ MoveLeft clc adc StartX ; Increment the virtual X-position - cmp #164 - bcc *+5 - lda #0 jsr SetBG0XPos + + lda StartX + lsr + jsr SetBG1XPos + jsr DoFrame rts @@ -84,3 +86,4 @@ Demo FPSStr str 'FPS' + diff --git a/src/App.Init.s b/src/App.Init.s index dc51b72..ea48faf 100644 --- a/src/App.Init.s +++ b/src/App.Init.s @@ -51,10 +51,13 @@ MemInit PushLong #0 ; space for result _Deref stx BlitterDP -; Allocate a bank of memory for BG1 +; Allocate banks of memory for BG1 jsr AllocOneBank2 sta BG1DataBank + jsr AllocOneBank2 + sta BG1AltBank + ; Allocate the 13 banks of memory we need and store in double-length array ]step equ 0 lup 13 @@ -200,5 +203,6 @@ ShutDown rts + diff --git a/src/App.Main.s b/src/App.Main.s index 64caf5b..4a503be 100644 --- a/src/App.Main.s +++ b/src/App.Main.s @@ -102,6 +102,9 @@ NO_INTERRUPTS equ 0 ; turn off for crossrunner jsr _InitBG1 ; Initialize the second background + lda #0 + jsr _ClearBG1Buffer + ; Load a picture and copy it into Bank $E1. Then turn on the screen. jsr AllocOneBank ; Alloc 64KB for Load/Unpack @@ -303,7 +306,7 @@ DoTiles :rowloop lda #0 sta :column,s - lda #$0015 + lda #$0010 sta :tile,s :colloop @@ -314,9 +317,9 @@ DoTiles lda :tile,s jsr CopyTile - lda :tile,s - eor #$0003 - sta :tile,s +; lda :tile,s +; eor #$0003 +; sta :tile,s lda :column,s inc @@ -344,12 +347,34 @@ DoFrame ; Load a binary file in the BG1 buffer DoLoadBG1 - lda BG1DataBank - xba - and #$FF00 - ora #$0001 ; Load directly into the BG1 buffer bank on Page 1 + lda BankLoad ldx #BG1DataFile jsr LoadFile + + lda BankLoad + xba + pha + and #$00FF + tax + pla + and #$FF00 + ldy BG1DataBank + jsr CopyBinToBG1 + + lda BankLoad + ldx #BG1AltDataFile + jsr LoadFile + + lda BankLoad + xba + pha + and #$00FF + tax + pla + and #$FF00 + ldy BG1AltBank + jsr CopyBinToBG1 + rts ; Load a simple picture format onto the SHR screen @@ -448,6 +473,56 @@ CopyPicToField rts +; Copy a binary image data file into BG1. Assumes the file is the correct size. +; +; A=low word of picture address +; X=high word of pixture address +; Y=high word of BG1 bank + +CopyBinToBG1 +:srcptr equ tmp0 +:line_cnt equ tmp2 +:dstptr equ tmp3 +:col_cnt equ tmp5 + + sta :srcptr + stx :srcptr+2 + sty :dstptr+2 ; Everything goes into this bank + + stz :line_cnt +:rloop + lda :line_cnt ; get the pointer to the code field line + asl + tax + + lda BG1YTable,x + sta :dstptr + + ldy #0 ; move forward in the image data and image data +:cloop + lda [:srcptr],y + sta [:dstptr],y + + iny + iny + + cpy #164 + bcc :cloop + + lda [:srcptr] ; Duplicate the last byte in the extra space at the end of the line + sta [:dstptr],y + + lda :srcptr + clc + adc #164 ; Each line is 328 pixels + sta :srcptr + + inc :line_cnt + lda :line_cnt + cmp #208 ; A total of 208 lines + bcc :rloop + rts + **************************************** * Fatal Error Handler * **************************************** @@ -536,7 +611,8 @@ GrafInit dw $0fa9,$0ff0,$00e0,$04DF dw $0d00,$078f,$0ccc,$0FFF -DefaultPalette dw $0ADF,$0FF8,$0CD6,$09CF,$0AC6,$08A5,$0FFF,$0694 +DefaultPalette dw $09BE,$0AA6,$0DC9,$0DB7,$09AA + dw $0080,$0f70,$0FFF dw $0fa9,$0ff0,$00e0,$04DF dw $0d00,$078f,$0ccc,$0FFF @@ -735,7 +811,9 @@ msgLine3 str ' -> Return to Try Again' msgLine4 str ' -> Esc to Quit' ; Data storage -BG1DataFile strl '1/bg1.bin' +BG1DataFile strl '1/bg1a.bin' +BG1AltDataFile strl '1/bg1b.bin' + ImageName strl '1/test.pic' MasterId ds 2 UserId ds 2 @@ -785,4 +863,23 @@ qtRec adrl $0000 + + + + + + + + + + + + + + + + + + + diff --git a/src/Render.s b/src/Render.s index 83e0df6..10d4e0c 100644 --- a/src/Render.s +++ b/src/Render.s @@ -67,6 +67,7 @@ Render jsr _ApplyBG0XPos ; Patch the PEA instructions with exit BRA opcode jsr _ApplyBG0YPos ; Set stack addresses for the virtual lines to the physical screen jsr _ApplyBG1XPos ; Adjust the direct page pointers to the BG1 bank + jsr _ApplyBG1YPos ldx #0 ; Blit the full virtual buffer to the screen ldy ScreenHeight @@ -88,3 +89,4 @@ Render + diff --git a/src/blitter/BG1.s b/src/blitter/BG1.s index 022fcf1..4c49872 100644 --- a/src/blitter/BG1.s +++ b/src/blitter/BG1.s @@ -4,6 +4,10 @@ _InitBG1 jsr _ApplyBG1YPos rts +SetBG1XPos + sta BG1StartX + rts + ; Everytime either BG1 or BG0 X-position changes, we have to update the direct page values. We ; *could* do this by adjusting the since address offset, but we have to change up to 200 values ; when the vertical position changes, and only 41 when the horizontal value changes. Plus @@ -11,12 +15,21 @@ _InitBG1 ; ; Note: This routine can be optimized as an unrolled loop of PEI instructions _ApplyBG1XPos + lda BG1StartX + jsr Mod164 + sta BG1StartXMod164 + lda #162 sec sbc StartXMod164 bpl *+6 clc adc #164 + clc + adc BG1StartXMod164 + cmp #164 + bcc *+5 + sbc #164 tay phd ; save the direct page because we are going to switch to the @@ -39,6 +52,28 @@ _ApplyBG1XPos pld rts +_ClearBG1Buffer + phb + pha + sep #$20 + lda BG1DataBank + pha + plb + rep #$20 + + pla + ldx #0 +:loop + sta: $0000,x + inc + inx + inx + cpx #0 + bne :loop + + plb + rts + ; Everytime either BG1 or BG0 Y-position changes, we have to update the Y-register ; value in all of the code fields (within the visible screen) _ApplyBG1YPos @@ -47,7 +82,7 @@ _ApplyBG1YPos :draw_count equ tmp2 :ytbl_idx equ tmp3 - stz :rtbl_idx ; Start copying from the first entry in the table + stz :ytbl_idx ; Start copying from the first entry in the table lda StartY ; This is the base line of the virtual screen sta :virt_line ; Keep track of it @@ -194,6 +229,18 @@ CopyBG1YTableToBG1Addr + + + + + + + + + + + + diff --git a/src/blitter/Blitter.s b/src/blitter/Blitter.s index 30c83b2..ea7846b 100644 --- a/src/blitter/Blitter.s +++ b/src/blitter/Blitter.s @@ -54,7 +54,13 @@ _BltRange ; Now we need to set up the Bank, Stack Pointer and Direct Page registers for calling into ; the code field - lda BG1DataBank ; Set the data bank for BG1 data + lda StartX + bit #$01 + beq :primary + lda BG1AltBank + bra :alt +:primary lda BG1DataBank +:alt pha plb rep #$20 @@ -84,3 +90,4 @@ stk_save lda #0000 ; load the stack plb ; restore the bank rts + diff --git a/src/blitter/DirectPage.s b/src/blitter/DirectPage.s index ac331a3..b4bdc82 100644 --- a/src/blitter/DirectPage.s +++ b/src/blitter/DirectPage.s @@ -15,13 +15,18 @@ EngineMode equ 20 ; Defined the mode/capabilities that are ena DirtyBits equ 22 ; Identify values that have changed between frames BG1DataBank equ 24 ; Data bank that holds BG1 layer data -BlitterDP equ 26 ; Direct page address the holder blitter data +BG1AltBank equ 26 ; Alternate BG1 bank -OldStartX equ 28 -OldStartY equ 30 +BlitterDP equ 28 ; Direct page address the holder blitter data -LastPatchOffset equ 32 ; Offset into code field that was patched with BRA instructions -StartXMod164 equ 34 +OldStartX equ 30 +OldStartY equ 32 + +LastPatchOffset equ 34 ; Offset into code field that was patched with BRA instructions +StartXMod164 equ 36 + +BG1StartX equ 38 ; Logical offset of the second background +BG1StartXMod164 equ 40 bstk equ 208 ; 16-byte stack to push bank addresses @@ -59,3 +64,6 @@ DIRTY_BIT_BG1_Y equ $0008 + + + diff --git a/src/blitter/Tiles.s b/src/blitter/Tiles.s index c4e9783..a4d5afe 100644 --- a/src/blitter/Tiles.s +++ b/src/blitter/Tiles.s @@ -16,41 +16,42 @@ ; X = Tile column (0 - 40) ; Y = Tile row (0 - 25) CopyTile - phb ; save the current bank - pha ; save the tile ID + phb ; save the current bank + phx ; save the original x-value + pha ; save the tile ID - tya ; lookup the address of the virtual line (y * 8) - asl - asl - asl - asl - tay + tya ; lookup the address of the virtual line (y * 8) + asl + asl + asl + asl + tay - sep #$20 ; set the bank register - lda BTableHigh,y - pha ; save for a few instruction - rep #$20 + sep #$20 ; set the bank register + lda BTableHigh,y + pha ; save for a few instruction + rep #$20 - phx ; Reverse the tile index since x = 0 is at the end - lda #40 - sec - sbc 1,s - plx + phx ; Reverse the tile index since x = 0 is at the end + lda #40 + sec + sbc 1,s + plx - asl ; there are two columns per tile, so multiple by 4 - asl ; asl will clear the carry bit - tax - lda Col2CodeOffset,x - adc BTableLow,y - tay - iny ; +1 to move past to opcode to the operand + asl ; there are two columns per tile, so multiple by 4 + asl ; asl will clear the carry bit + tax + lda Col2CodeOffset,x + adc BTableLow,y + tay - plb ; set the bank - pla ; pop the tile ID - jsr _CopyTile + plb ; set the bank + pla ; pop the tile ID + jsr :ClearTile ; :_CopyTile - plb ; restore the data bank and return - rts + plx ; pop the x-register + plb ; restore the data bank and return + rts ; _CopyTile ; @@ -60,90 +61,130 @@ CopyTile ; A = Tile ID (0 - 1023) ; Y = Base Adddress in the code field -_CopyTile cmp #$0010 - bcc :FillWord - cmp #$0400 - bcc :CopyTileMem - rts ; Tile number is too large - -:TilePatterns dw $0000,$1111,$2222,$3333 - dw $4444,$5555,$6666,$7777 - dw $8888,$9999,$AAAA,$BBBB - dw $CCCC,$DDDD,$EEEE,$FFFF - -:FillWord asl - tax - ldal :TilePatterns,x - -CopyTileConst sta: $0000,y - sta: $0003,y - sta $1000,y - sta $1003,y - sta $2000,y - sta $2003,y - sta $3000,y - sta $3003,y - sta $4000,y - sta $4003,y - sta $5000,y - sta $5003,y - sta $6000,y - sta $6003,y - sta $7000,y - sta $7003,y - rts - -:CopyTileMem sec - sbc #$0010 - - asl - asl - asl - asl - asl - tax - -CopyTileLinear ldal tiledata+0,x ; The low word goes in the *next* instruction - sta: $0003,y - ldal tiledata+2,x - sta: $0000,y - ldal tiledata+4,x - sta $1003,y - ldal tiledata+6,x - sta $1000,y - ldal tiledata+8,x - sta $2003,y - ldal tiledata+10,x - sta $2000,y - ldal tiledata+12,x - sta $3003,y - ldal tiledata+14,x - sta $3000,y - ldal tiledata+16,x - sta $4003,y - ldal tiledata+18,x - sta $4000,y - ldal tiledata+20,x - sta $5003,y - ldal tiledata+22,x - sta $5000,y - ldal tiledata+24,x - sta $6003,y - ldal tiledata+26,x - sta $6000,y - ldal tiledata+28,x - sta $7003,y - ldal tiledata+30,x - sta $7000,y - rts - - +:_CopyTile cmp #$0010 + bcs *+5 + brl :FillWord + cmp #$0400 + bcs *+5 + brl :CopyTileMem + rts ; Tile number is too large +:TilePatterns dw $0000,$1111,$2222,$3333 + dw $4444,$5555,$6666,$7777 + dw $8888,$9999,$AAAA,$BBBB + dw $CCCC,$DDDD,$EEEE,$FFFF +:ClearTile sep #$20 + lda #$B1 + sta: $0000,y + sta: $0003,y + sta $1000,y + sta $1003,y + sta $2000,y + sta $2003,y + sta $3000,y + sta $3003,y + sta $4000,y + sta $4003,y + sta $5000,y + sta $5003,y + sta $6000,y + sta $6003,y + sta $7000,y + sta $7003,y + rep #$20 + lda 3,s + asl + asl + and #$00FF + ora #$4800 + sta: $0004,y + sta $1004,y + sta $2004,y + sta $3004,y + sta $4004,y + sta $5004,y + sta $6004,y + sta $7004,y + inc + inc + sta: $0001,y + sta $1001,y + sta $2001,y + sta $3001,y + sta $4001,y + sta $5001,y + sta $6001,y + sta $7001,y + rts +:FillWord asl + tax + ldal :TilePatterns,x + sta: $0001,y + sta: $0004,y + sta $1001,y + sta $1004,y + sta $2001,y + sta $2004,y + sta $3001,y + sta $3004,y + sta $4001,y + sta $4004,y + sta $5001,y + sta $5004,y + sta $6001,y + sta $6004,y + sta $7001,y + sta $7004,y + rts + +:CopyTileMem sec + sbc #$0010 + + asl + asl + asl + asl + asl + tax + + ldal tiledata+0,x ; The low word goes in the *next* instruction + sta: $0004,y + ldal tiledata+2,x + sta: $0001,y + ldal tiledata+4,x + sta $1004,y + ldal tiledata+6,x + sta $1001,y + ldal tiledata+8,x + sta $2004,y + ldal tiledata+10,x + sta $2001,y + ldal tiledata+12,x + sta $3004,y + ldal tiledata+14,x + sta $3001,y + ldal tiledata+16,x + sta $4004,y + ldal tiledata+18,x + sta $4001,y + ldal tiledata+20,x + sta $5004,y + ldal tiledata+22,x + sta $5001,y + ldal tiledata+24,x + sta $6004,y + ldal tiledata+26,x + sta $6001,y + ldal tiledata+28,x + sta $7004,y + ldal tiledata+30,x + sta $7001,y + rts diff --git a/tools/pngtoiigs.js b/tools/pngtoiigs.js index 6913c62..9898b10 100644 --- a/tools/pngtoiigs.js +++ b/tools/pngtoiigs.js @@ -29,13 +29,18 @@ function pngToIIgsBuff(png) { for (let x = 0; x < png.width; x += 1, i += 4) { const pixel = png.data.slice(i, i + 4); const index = findColorIndex(png, pixel); - const j = i / 8; + const j = y * (png.width / 2) + Math.floor(x / 2); + + if (index > 15) { + console.warn('Pixel index greater than 15. Skipping...'); + continue; + } if (x % 2 === 0) { - buff[j] = buff[j] + (16 * index); + buff[j] = 16 * index; } else { - buff[j] = buff[j] + index + buff[j] = buff[j] | index; } } } @@ -43,6 +48,16 @@ function pngToIIgsBuff(png) { return buff; } +function shiftImage(src) { + const { width, height, colorType, bitDepth } = src; + const dst = new PNG({ width, height, colorType, bitDepth }); + + PNG.bitblt(src, dst, 1, 0, width - 1, height, 0, 0); + PNG.bitblt(src, dst, 0, 0, 1, height, width - 1, 0); + + return dst; +} + function pngToIIgsBuffRepeat(png) { let i = 0; const buff = Buffer.alloc(png.height * png.width, 0);