From d9e3ee14e85b64b88524d2503f3157cd2eaadf40 Mon Sep 17 00:00:00 2001 From: Lucas Scharenbroich Date: Mon, 19 Jul 2021 14:18:02 -0500 Subject: [PATCH] Add small header to converted image data --- src/App.Main.s | 131 +++++++++++++++++++++++++++++++++++++++------ tools/pngtoiigs.js | 19 ++++++- 2 files changed, 132 insertions(+), 18 deletions(-) diff --git a/src/App.Main.s b/src/App.Main.s index f89b3ef..2c903f3 100644 --- a/src/App.Main.s +++ b/src/App.Main.s @@ -416,10 +416,34 @@ CopyBinToField :col_cnt equ tmp5 :mask equ tmp6 :data equ tmp7 +:mask_color equ tmp8 sta :srcptr stx :srcptr+2 +; Check that this is a GTERAW image and save the transparent color + + ldy #4 +:chkloop + lda [:srcptr],y + cmp :headerStr,y + beq *+3 + rts + dey + dey + bpl :chkloop + +; We have a valid header, now get the transparency word and load it in + ldy #6 + lda [:srcptr],y + sta :mask_color + +; Advance over the header + lda :srcptr + clc + adc #8 + sta :srcptr + stz :line_cnt :rloop lda :line_cnt ; get the pointer to the code field line @@ -440,12 +464,15 @@ CopyBinToField :cloop phy lda [:srcptr],y ; load the picture data + cmp :mask_color beq :transparent ; a value of $0000 is transparent jsr :toMask ; Infer a mask value for this. If it's $0000, then + cmp #$0000 bne :mixed ; the data is solid, otherwise mixed ; This is a solid word +:solid lda [:srcptr],y ldy Col2CodeOffset,x ; Get the offset to the code from the line start @@ -457,6 +484,10 @@ CopyBinToField sta [:dstptr],y ; PEA operand bra :next :transparent + lda :mask_color ; Make sure we actually have to mask + cmp #$A5A5 + beq :solid + ldy Col2CodeOffset,x ; Get the offset to the code from the line start lda #$B1 ; LDA (dp),y sta [:dstptr],y @@ -494,7 +525,9 @@ CopyBinToField iny iny iny ; advance to the ORA #imm operand - lda :data + lda :mask + eor #$FFFF ; invert the mask to clear up the data + and :data sta [:dstptr],y :next @@ -522,31 +555,57 @@ CopyBinToField :exit rts -:toMask bit #$F000 - beq *+7 - and #$0FFF - bra *+5 - ora #$F000 +:toMask pha ; save original - bit #$0F00 + lda 1,s + eor :mask_color ; only identical bits produce zero + and #$F000 beq *+7 - and #$F0FF + pea #$0000 bra *+5 - ora #$0F00 + pea #$F000 - bit #$00F0 - beq *+7 - and #$FF0F - bra *+5 - ora #$00F0 - bit #$000F + lda 3,s + eor :mask_color + and #$0F00 beq *+7 - and #$FFF0 + pea #$0000 bra *+5 - ora #$000F + pea #$0F00 + + lda 5,s + eor :mask_color + and #$00F0 + beq *+7 + pea #$0000 + bra *+5 + pea #$00F0 + + lda 7,s + eor :mask_color + and #$000F + beq *+7 + lda #$0000 + bra *+5 + lda #$000F + + ora 1,s + sta 1,s + pla + ora 1,s + sta 1,s + pla + ora 1,s + sta 1,s + pla + + sta 1,s ; pop the saved word + pla rts +:headerStr asc 'GTERAW' + ; Copy a loaded SHR picture into the code field ; ; A=low word of picture address @@ -710,6 +769,12 @@ CopyBinToBG1 stx :srcptr+2 sty :dstptr+2 ; Everything goes into this bank + ; Advance over the header + lda :srcptr + clc + adc #8 + sta :srcptr + stz :line_cnt :rloop lda :line_cnt ; get the pointer to the code field line @@ -843,8 +908,14 @@ GrafInit dw $0fa9,$0ff0,$00e0,$04DF dw $0d00,$078f,$0ccc,$0FFF +; Super Mario World Assets DefaultPalette dw $0EEF,$0342,$0C95,$0852,$0DB4,$00C0 dw $0FDA,$0DEE,$0000,$0CC5,$09A0,$0680,$0470,$0051 + +;DefaultPalette dw $0000,$0000,$0778,$0BCC,$0368,$00AF,$0556,$0245 + dw $0000,$0778,$0AAA,$0CFF,$0368,$00AF,$0556 + + ; Return the current border color ($0 - $F) in the accumulator GetBorderColor lda #0000 sep #$20 @@ -1170,6 +1241,32 @@ qtRec adrl $0000 + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tools/pngtoiigs.js b/tools/pngtoiigs.js index ecb5626..94c9870 100644 --- a/tools/pngtoiigs.js +++ b/tools/pngtoiigs.js @@ -5,6 +5,7 @@ const { Buffer } = require('buffer'); // Starting color index let startIndex = 0; +let transparentColor = 0; main(process.argv.slice(2)).then( () => process.exit(0), @@ -110,6 +111,7 @@ async function main(argv) { const data = await fs.readFile(argv[0]); const png = PNG.sync.read(data); startIndex = getArg(argv, '--start-index', x => parseInt(x, 10), 0); + transparentColor = getArg(argv, '--transparent-color-index', x => parseInt(x, 10), 0); console.info(`startIndex = ${startIndex}`); @@ -147,7 +149,22 @@ async function main(argv) { if (buff && argv[1]) { console.log(`Writing to output file ${argv[1]}`); - await fs.writeFile(argv[1], buff); + + // Write a small header. This is useful and avoids triggering a sparse file load + // bug when the first block of the file on the GS/OS drive is sparse. + + // Put the ASCII text of "GTERAW" in the first 6 bytes + const header = Buffer.alloc(8); + header.write('GTERAW', 'latin1'); + + // Use the special value $A5A5 to identify no transparency + if (typeof transparentColor !== 'number') { + header.writeUInt16LE(0xA5A5); + } else { + header.writeUInt16LE(0x1111 * transparentColor, 6); + } + + await fs.writeFile(argv[1], Buffer.concat([header, buff])); } }