A2osX/BMP2PIX.S.txt

643 lines
12 KiB
Plaintext
Raw Normal View History

NEW
2019-04-06 18:43:33 +00:00
AUTO 3,1
.LIST OFF
.OP 65C02
.OR $2000
2019-04-06 18:43:33 +00:00
.TF BIN/BMP2PIX
*--------------------------------------
2018-07-23 15:28:42 +00:00
.INB INC/MACROS.I
.INB INC/A2OSX.I
2019-04-06 18:43:33 +00:00
.INB INC/IO.I
.INB INC/GFX.I
2018-07-23 15:28:42 +00:00
.INB INC/LIBGUI.I
*--------------------------------------
2019-04-06 18:43:33 +00:00
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
2019-04-06 18:43:33 +00:00
.DA #0 S.PS.F.EVENT
.DA #0
.DA CS.END-CS.START CS
.DA DS.END-DS.START DS
.DA #64 SS
2019-04-06 18:43:33 +00:00
.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
*--------------------------------------
2019-04-06 18:43:33 +00:00
CS.INIT clc
rts
*--------------------------------------
CS.RUN
.1 >INC.G ArgCount
2018-10-16 15:48:03 +00:00
>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
2019-04-06 18:43:33 +00:00
.99 >PUSHBI 0
>LDYA L.MSG.USAGE
2018-06-21 15:12:10 +00:00
>SYSCALL printf
2018-10-21 20:54:07 +00:00
lda #E.SYN
sec
rts
.3 ldy OptionVars-1,x
lda #$80
sta (pData),y
bra .1
.4 >LDA.G hInputBuf
bne .5
2019-04-06 18:43:33 +00:00
jsr CS.RUN.OPENINPUT
bcc .1 scan for any other args
rts
.5 >LDA.G hOutputFile
bne .99
2019-04-06 18:43:33 +00:00
jsr CS.RUN.CREATEOUTPUT
bcc .1 scan for any other args
2019-04-06 18:43:33 +00:00
.9 rts
.7 >LDA.G hOutputFile
beq .99
>LDYAI 256
2018-07-20 11:51:08 +00:00
>SYSCALL getmem
2019-04-06 18:43:33 +00:00
bcs .9
>STYA ZPBufPtr
txa
>STA.G hBuf
2019-04-06 18:43:33 +00:00
>LDA.G BMP.BPP
cmp #1
beq CS.RUN.1
jmp CS.RUN.24
*--------------------------------------
2019-04-06 18:43:33 +00:00
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
2019-04-06 18:43:33 +00:00
jsr CS.RUN.WRITE.HDR
bcs CS.RUN.RTS
2019-04-06 18:43:33 +00:00
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
2018-07-25 15:26:14 +00:00
>PUSHW ZPBufPtr
>LDA.G hOutputFile
>SYSCALL FWrite
bcs CS.RUN.RTS
2019-04-06 18:43:33 +00:00
bra CS.RUN.1.LOOP
.8 >LDYA L.MSG.DONE
2019-04-06 18:43:33 +00:00
>SYSCALL puts
lda #0
sec
CS.RUN.RTS rts
*--------------------------------------
2019-04-06 18:43:33 +00:00
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
2018-07-18 15:30:42 +00:00
>SYSCALL FreeMem
2019-04-06 18:43:33 +00:00
.1 >LDA.G hInputBuf
beq .2
>SYSCALL FreeMem
.2 >LDA.G hOutputFile
beq .8
2018-07-20 11:51:08 +00:00
>SYSCALL fclose
.8 clc
rts
*--------------------------------------
2019-04-06 18:43:33 +00:00
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
2017-12-12 07:27:36 +00:00
*--------------------------------------
2019-04-06 18:43:33 +00:00
.INB USR/SRC/X.TWIST.G
*--------------------------------------
OptionList >PSTR "Vv"
OptionVars .DA #bVerbose,#bVerbose
2019-04-06 18:43:33 +00:00
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"
2019-04-06 18:43:33 +00:00
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!!!"
2018-11-19 07:43:00 +00:00
*--------------------------------------
* LOWRES Patette : https://comp.sys.apple2.narkive.com/lTSrj2ZI/apple-ii-colour-rgb
*--------------------------------------
2019-04-06 18:43:33 +00:00
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
2019-04-06 18:43:33 +00:00
BMP.BPP .BS 1
ArgCount .BS 1
hInputBuf .BS 1
hOutputFile .BS 1
bVerbose .BS 1
hBuf .BS 1
DS.END
.ED
*--------------------------------------
MAN
2019-04-06 18:43:33 +00:00
SAVE USR/SRC/BIN/BMP2PIX.S
ASM