mirror of
https://github.com/A2osX/A2osX.git
synced 2024-08-13 06:29:03 +00:00
643 lines
12 KiB
Plaintext
643 lines
12 KiB
Plaintext
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
|