NEW AUTO 3,1 .LIST OFF .OP 65C02 .OR $2000 .TF BIN/BMP2PIX *-------------------------------------- .INB INC/MACROS.I .INB INC/A2OSX.I .INB INC/IO.I .INB INC/GFX.I .INB INC/LIBGUI.I *-------------------------------------- S.BMP.BM .EQ 0 S.BMP.SIZE .EQ 2 S.BMP.DATA.OFS .EQ $A S.BMP.HDR.SIZE .EQ $E S.BMP.W .EQ $12 S.BMP.H .EQ $16 S.BMP.PLANES .EQ $1A S.BMP.BPP .EQ $1C * S.BMP .EQ $36 *-------------------------------------- .DUMMY .OR ZPBIN ZS.START ZPPTR1 .BS 2 ZPInputBufPtr .BS 2 ZPInputBufLen .BS 2 ZPInputDataPtr .BS 2 ZPBMPRowBytes .BS 2 ZPPIXRowBytes .BS 2 ZPBufPtr .BS 2 ZPLineCount .BS 2 ZPPixel24 .BS 3 ZPPixelScore .BS 3 ZPPixelBest .BS 3 ZPPixelIndex16 .BS 1 ZBTmpB1 .BS 1 ZBTmpW .BS 2 ZPCntX .BS 1 ZPCntY .BS 1 ZS.END .ED *-------------------------------------- * File Header (16 Bytes) *-------------------------------------- CS.START cld jmp (.1,x) .DA #$61 6502,Level 1 (65c02) .DA #1 BIN Layout Version 1 .DA #0 S.PS.F.EVENT .DA #0 .DA CS.END-CS.START CS .DA DS.END-DS.START DS .DA #64 SS .DA #ZS.END-ZS.START Zero Page Size .DA 0 *-------------------------------------- * Relocation Table *-------------------------------------- .1 .DA CS.INIT .DA CS.RUN .DA CS.DOEVENT .DA CS.QUIT L.MSG.USAGE .DA MSG.USAGE L.MSG.FILE.OK .DA MSG.FILE.OK L.MSG.HEADER.OK .DA MSG.HEADER.OK L.MSG.HEADER.KO .DA MSG.HEADER.KO L.MSG.DONE .DA MSG.DONE .DA 0 *-------------------------------------- CS.INIT clc rts *-------------------------------------- CS.RUN .1 >INC.G ArgCount >SYSCALL ArgV bcs .7 >STYA ZPPtr1 lda (ZPPtr1) cmp #'-' bne .4 ldy #1 lda (ZPPtr1),y ldx OptionList .2 cmp OptionList,x beq .3 dex bne .2 .99 >PUSHBI 0 >LDYA L.MSG.USAGE >SYSCALL printf lda #E.SYN sec rts .3 ldy OptionVars-1,x lda #$80 sta (pData),y bra .1 .4 >LDA.G hInputBuf bne .5 jsr CS.RUN.OPENINPUT bcc .1 scan for any other args rts .5 >LDA.G hOutputFile bne .99 jsr CS.RUN.CREATEOUTPUT bcc .1 scan for any other args .9 rts .7 >LDA.G hOutputFile beq .99 >LDYAI 256 >SYSCALL getmem bcs .9 >STYA ZPBufPtr txa >STA.G hBuf >LDA.G BMP.BPP cmp #1 beq CS.RUN.1 jmp CS.RUN.24 *-------------------------------------- CS.RUN.1 lda #S.BM.F.BBP1 >STA.G PIX.Header+S.BM.F >LDA.G PIX.Header+S.BM.W sta ZPBMPRowBytes sta ZPPIXRowBytes iny lda (pData),y sta ZPBMPRowBytes+1 sta ZPPIXRowBytes+1 lda ZPBMPRowBytes and #%00011111 beq .1 lda ZPBMPRowBytes and #%11100000 clc adc #%00100000 bcc .1 inc ZPBMPRowBytes+1 .1 lsr ZPBMPRowBytes+1 ror lsr ZPBMPRowBytes+1 ror lsr ZPBMPRowBytes+1 ror sta ZPBMPRowBytes lda ZPPIXRowBytes and #%00000111 beq .2 lda ZPPIXRowBytes and #%11111000 clc adc #%00001000 bcc .2 inc ZPPIXRowBytes+1 .2 lsr ZPPIXRowBytes+1 ror lsr ZPPIXRowBytes+1 ror lsr ZPPIXRowBytes+1 ror sta ZPPIXRowBytes >STA.G PIX.Header+S.BM.RowBytes lda ZPInputBufPtr clc adc ZPInputBufLen sta ZPInputDataPtr lda ZPInputBufPtr+1 adc ZPInputBufLen+1 sta ZPInputDataPtr+1 jsr CS.RUN.WRITE.HDR bcs CS.RUN.RTS CS.RUN.1.LOOP inc ZPLineCount bne .1 inc ZPLineCount+1 beq .8 .1 lda ZPInputDataPtr sec sbc ZPBMPRowBytes sta ZPInputDataPtr lda ZPInputDataPtr+1 sbc ZPBMPRowBytes+1 sta ZPInputDataPtr+1 >LDYA ZPBufPtr >STYA ZPPTR1 ldy #0 .2 lda (ZPInputDataPtr),y tax lda TWIST,x sta (ZPPTR1) inc ZPPTR1 bne .3 inc ZPPTR1+1 .3 iny cpy ZPPIXRowBytes bne .2 >PUSHW ZPPIXRowBytes >PUSHW ZPBufPtr >LDA.G hOutputFile >SYSCALL FWrite bcs CS.RUN.RTS bra CS.RUN.1.LOOP .8 >LDYA L.MSG.DONE >SYSCALL puts lda #0 sec CS.RUN.RTS rts *-------------------------------------- CS.RUN.24 lda #S.BM.F.BBP4 >STA.G PIX.Header+S.BM.F ldy #S.BMP.DATA.OFS lda (ZPInputBufPtr),y clc adc ZPInputBufPtr tax iny lda (ZPInputBufPtr),y adc ZPInputBufPtr+1 stx ZPInputBufPtr sta ZPInputBufPtr+1 jsr DEBUG.ClrScr lda #0 sta ZPCntX lda #0 sta ZPCntY CS.RUN.24.LOOP ldx #2 ldy #0 .1 lda (ZPInputBufPtr),y sta ZPPixel24,x iny dex bpl .1 lda ZPInputBufPtr clc adc #3 sta ZPInputBufPtr bcc .2 inc ZPInputBufPtr+1 .2 jsr CS.RUN.GetIndexInPalette jsr DEBUG.PLOT inc ZPCntX lda ZPCntX >CMP.G PIX.Header+S.BM.W bne CS.RUN.24.LOOP stz ZPCntX inc ZPCntY lda ZPCntY >CMP.G PIX.Header+S.BM.H bne CS.RUN.24.LOOP lda #0 sec rts *-------------------------------------- CS.RUN.GetIndexInPalette stz ZPPixelIndex16 lda #$ff sta ZPPixelBest sta ZPPixelBest+1 sta ZPPixelBest+2 ldy #63 .30 stz ZPPixelScore stz ZPPixelScore+1 stz ZPPixelScore+2 ldx #2 .40 lda PALETTE.RGB-1,y sec sbc ZPPixel24,x bcs .5 eor #$ff inc .5 phx * sta ZBTmpB1 sta ZBTmpW stz ZBTmpW+1 lda #0 ldx #8 .1 lsr ZBTmpW bcc .2 clc adc ZBTmpB1 .2 ror ror ZBTmpW dex bne .1 sta ZBTmpW+1 lda ZPPixelScore clc adc ZBTmpW sta ZPPixelScore lda ZPPixelScore+1 adc ZBTmpW+1 sta ZPPixelScore+1 bcc .3 inc ZPPixelScore+2 .3 plx dey dex bpl .40 lda ZPPixelBest cmp ZPPixelScore lda ZPPixelBest+1 sbc ZPPixelScore+1 lda ZPPixelBest+2 sbc ZPPixelScore+2 bcc .8 lda ZPPixelScore sta ZPPixelBest lda ZPPixelScore+1 sta ZPPixelBest+1 lda ZPPixelScore+2 sta ZPPixelBest+2 tya lsr lsr sta ZPPixelIndex16 .8 dey bpl .30 lda ZPPixelIndex16 CS.RUN.GetIndexInPalette.RTS rts *-------------------------------------- CS.RUN.OPENINPUT >PUSHWI 0 Aux type >PUSHBI 0 Type >PUSHBI O.RDONLY >LDYA ZPPtr1 >SYSCALL LoadFile bcs CS.RUN.GetIndexInPalette.RTS >STYA ZPInputBufLen txa >STA.G hInputBuf >SYSCALL GetMemPtr >STYA ZPInputBufPtr >PUSHW ZPInputBufLen >PUSHBI 2 >LDYA L.MSG.FILE.OK >SYSCALL printf lda (ZPInputBufPtr) cmp #'B' bne .99 ldy #1 lda (ZPInputBufPtr),y cmp #'M' bne .99 ldy #S.BMP.BPP+1 lda (ZPInputBufPtr),y bne .99 dey lda (ZPInputBufPtr),y >STA.G BMP.BPP cmp #1 beq .1 cmp #24 bne .99 .1 >PUSHA ldy #S.BMP.H lda (ZPInputBufPtr),y >STA.G PIX.Header+S.BM.H pha eor #$ff sta ZPLineCount ldy #S.BMP.H+1 lda (ZPInputBufPtr),y >STA.G PIX.Header+S.BM.H+1 >PUSHA eor #$ff sta ZPLineCount+1 pla >PUSHA ldy #S.BMP.W lda (ZPInputBufPtr),y >STA.G PIX.Header+S.BM.W pha ldy #S.BMP.W+1 lda (ZPInputBufPtr),y >STA.G PIX.Header+S.BM.W+1 >PUSHA pla >PUSHA >PUSHBI 5 >LDYA L.MSG.HEADER.OK >SYSCALL printf .9 rts .99 >LDYA L.MSG.HEADER.KO >SYSCALL puts lda #E.IBIN sec rts *-------------------------------------- CS.RUN.CREATEOUTPUT >PUSHWI 0 Aux type >PUSHBI $CB PIX Type >PUSHBI O.WRONLY+O.CREATE >LDYA ZPPtr1 >SYSCALL FOpen bcs .9 >STA.G hOutputFile .9 rts *-------------------------------------- CS.RUN.WRITE.HDR >PUSHWI S.BM >PUSHEA.G PIX.Header >LDA.G hOutputFile >SYSCALL FWrite rts *-------------------------------------- CS.DOEVENT sec rts *-------------------------------------- CS.QUIT >LDA.G hBuf beq .1 >SYSCALL FreeMem .1 >LDA.G hInputBuf beq .2 >SYSCALL FreeMem .2 >LDA.G hOutputFile beq .8 >SYSCALL fclose .8 clc rts *-------------------------------------- DEBUG.ClrScr sta SETMIXED sta CLRTEXT ldx #19 .1 lda SCR.BASEL,x sta ZPPTR1 lda SCR.BASEH,x sta ZPPTR1+1 lda #0 ldy #39 .2 sta SETPAGE2 sta (ZPPTR1),y sta CLRPAGE2 sta (ZPPTR1),y dey bpl .2 dex bpl .1 rts *-------------------------------------- DEBUG.PLOT pha lda ZPCntX lsr tay sta CLRPAGE2 bcs .1 CS = main sta SETPAGE2 .1 lda ZPCntY lsr tax lda SCR.BASEL,x sta ZPPTR1 lda SCR.BASEH,x sta ZPPTR1+1 pla bcc .2 asl asl asl asl .2 ora (ZPPTR1),y sta (ZPPTR1),y sta CLRPAGE2 rts *-------------------------------------- SCR.BASEL .HS 00.80.00.80.00.80.00.80.28.A8.28.A8.28.A8.28.A8.50.D0.50.D0.50.D0.50.D0 SCR.BASEH .HS 04.04.05.05.06.06.07.07.04.04.05.05.06.06.07.07.04.04.05.05.06.06.07.07 *-------------------------------------- CS.END *-------------------------------------- .INB USR/SRC/X.TWIST.G *-------------------------------------- OptionList >PSTR "Vv" OptionVars .DA #bVerbose,#bVerbose MSG.USAGE .AS "Usage : BMP2PIX BMP-File \r\n" .AZ " -V : Verbose Mode\r\n" MSG.FILE.OK .AZ "BMP Loaded, %D Bytes Read\r\n" MSG.HEADER.OK .AZ "BMP Size : %D x %D pixels, %d bit(s)/pixel\r\n" MSG.HEADER.KO .AZ "Invalid Input File Format" MSG.DONE .AZ "All Done!!!" *-------------------------------------- * LOWRES Patette : https://comp.sys.apple2.narkive.com/lTSrj2ZI/apple-ii-colour-rgb *-------------------------------------- PALETTE.RGB .HS 00000000 BLACK .HS e31e6000 RED .HS 604ebd00 DARK.BLUE .HS ff44fd00 PURPLE .HS 00a36000 DARK.GREEN .HS 9c9c9c00 DARK.GRAY .HS 14cffd00 BLUE .HS d0c3ff00 LIGHT.BLUE .HS 60720300 BROWN .HS ff6a3c00 ORANGE .HS 9c9c9c00 DARK.GRAY .HS ffa0d000 PINK .HS 14f53c00 LIGHT.GREEN .HS d0dd8d00 YELLOW .HS 72ffd000 AQUA .HS ffffff00 WHITE *-------------------------------------- PALETTE.BGR .HS 00000000 BLACK .HS 601ee300 RED .HS bd4e6000 DARK.BLUE .HS fd44ff00 PURPLE .HS 60a30000 DARK.GREEN .HS 9c9c9c00 DARK.GRAY .HS fdcf1400 BLUE .HS ffc3d000 LIGHT.BLUE .HS 03726000 BROWN .HS 3c6aff00 ORANGE .HS 9c9c9c00 DARK.GRAY .HS d0a0ff00 PINK .HS 3cf51400 LIGHT.GREEN .HS 8dddd000 YELLOW .HS d0ff7200 AQUA .HS ffffff00 WHITE *-------------------------------------- .DUMMY .OR 0 DS.START PIX.Header .BS S.BM BMP.BPP .BS 1 ArgCount .BS 1 hInputBuf .BS 1 hOutputFile .BS 1 bVerbose .BS 1 hBuf .BS 1 DS.END .ED *-------------------------------------- MAN SAVE USR/SRC/BIN/BMP2PIX.S ASM