PR#3 PREFIX /A2OSX.BUILD NEW INC 1 AUTO 6 .LIST OFF .OP 65C02 .OR $2000 .TF /A2OSX.BUILD/BMP2PIX *-------------------------------------- .INB /A2OSX.BUILD/INC/MACROS.I .INB /A2OSX.BUILD/INC/A2OSX.I .INB /A2OSX.BUILD/INC/LIBGUI.I *-------------------------------------- ZPPTR1 .EQ ZPBIN ZPInputBufPtr .EQ ZPBIN+2 ZPInputBufLen .EQ ZPBIN+4 ZPInputDataPtr .EQ ZPBIN+6 ZPBMPRowBytes .EQ ZPBIN+8 ZPPIXRowBytes .EQ ZPBIN+10 ZPBufPtr .EQ ZPBIN+12 ZPLineCount .EQ ZPBIN+14 *-------------------------------------- * File Header (16 Bytes) *-------------------------------------- CS.START cld jmp (.1,x) .DA #$61 6502,Level 1 (65c02) .DA #1 BIN Layout Version 1 .DA 0 .DA CS.END-CS.START CS .DA DS.END-DS.START DS .DA #64 SS .DA #16 ZP .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 .1 >INC.G ArgCount >SYSCALL GetArg.A 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 >LDYA L.MSG.USAGE >SYSCALL PrintF.YA lda #K.E.SYN sec rts .3 ldy OptionVars-1,x lda #$80 sta (pData),y bra .1 .4 >LDA.G hInputBuf bne .5 jsr CS.INIT.OPENINPUT bcc .1 scan for any other args rts .5 >LDA.G hOutputFile bne .99 jsr CS.INIT.CREATEOUTPUT bcc .1 scan for any other args rts .7 >LDA.G hOutputFile beq .99 >LDYAI 256 >SYSCALL GetMem.YA bcs CS.INIT.RTS >STYA ZPBufPtr txa >STA.G hBuf .8 clc CS.INIT.RTS rts *-------------------------------------- CS.INIT.OPENINPUT >PUSHWI 0 Aux type >PUSHBI 0 Type >PUSHBI SYS.FOpen.R >PUSHW ZPPtr1 >SYSCALL LoadFile bcs CS.INIT.RTS >STYA ZPInputBufLen >PUSHYA txa >STA.G hInputBuf >SYSCALL GetMemPtr.A >STYA ZPInputBufPtr >LDYA L.MSG.FILE.OK >SYSCALL PrintF.YA lda (ZPInputBufPtr) cmp #'B' bne .99 ldy #1 lda (ZPInputBufPtr),y cmp #'M' bne .99 ldy #$1C BBP LO lda (ZPInputBufPtr),y cmp #1 bne .99 iny BBP HI lda (ZPInputBufPtr),y bne .99 ldy #$16 H LO lda (ZPInputBufPtr),y >STA.G PIX.Header+S.BM.H pha eor #$ff sta ZPLineCount ldy #$17 H HI lda (ZPInputBufPtr),y >STA.G PIX.Header+S.BM.H+1 >PUSHA eor #$ff sta ZPLineCount+1 pla >PUSHA ldy #$12 W LO lda (ZPInputBufPtr),y >STA.G PIX.Header+S.BM.W pha ldy #$13 W HI lda (ZPInputBufPtr),y >STA.G PIX.Header+S.BM.W+1 >PUSHA pla >PUSHA >LDYA L.MSG.HEADER.OK >SYSCALL PrintF.YA clc rts .99 >LDYA L.MSG.HEADER.KO >SYSCALL PrintF.YA lda #K.E.IBIN sec rts *-------------------------------------- CS.INIT.CREATEOUTPUT >PUSHWI 0 Aux type >PUSHBI $CB PIX Type >PUSHBI SYS.FOpen.W+SYS.FOpen.X >PUSHW ZPPtr1 >SYSCALL FOpen bcs .9 >STA.G hOutputFile .9 rts *-------------------------------------- CS.RUN 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 >PUSHEA.G PIX.Header >PUSHWI S.BM >LDA.G hOutputFile >PUSHA >SYSCALL FWrite bcs CS.RUN.RTS CS.RUN.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 ZPBufPtr >PUSHW ZPPIXRowBytes >LDA.G hOutputFile >PUSHA >SYSCALL FWrite bcs CS.RUN.RTS bra CS.RUN.LOOP .8 >LDYA L.MSG.DONE >SYSCALL PrintF.YA lda #0 sec CS.RUN.RTS rts *-------------------------------------- CS.DOEVENT sec rts *-------------------------------------- CS.QUIT >LDA.G hBuf beq .1 >SYSCALL FreeMem.A .1 >LDA.G hOutputFile beq .8 >SYSCALL FClose.A .8 clc rts *-------------------------------------- CS.END TWIST .DA #%00000000,#%10000000,#%01000000,#%11000000,#%00100000,#%10100000,#%01100000,#%11100000 .DA #%00010000,#%10010000,#%01010000,#%11010000,#%00110000,#%10110000,#%01110000,#%11110000 .DA #%00001000,#%10001000,#%01001000,#%11001000,#%00101000,#%10101000,#%01101000,#%11101000 .DA #%00011000,#%10011000,#%01011000,#%11011000,#%00111000,#%10111000,#%01111000,#%11111000 .DA #%00000100,#%10000100,#%01000100,#%11000100,#%00100100,#%10100100,#%01100100,#%11100100 .DA #%00010100,#%10010100,#%01010100,#%11010100,#%00110100,#%10110100,#%01110100,#%11110100 .DA #%00001100,#%10001100,#%01001100,#%11001100,#%00101100,#%10101100,#%01101100,#%11101100 .DA #%00011100,#%10011100,#%01011100,#%11011100,#%00111100,#%10111100,#%01111100,#%11111100 .DA #%00000010,#%10000010,#%01000010,#%11000010,#%00100010,#%10100010,#%01100010,#%11100010 .DA #%00010010,#%10010010,#%01010010,#%11010010,#%00110010,#%10110010,#%01110010,#%11110010 .DA #%00001010,#%10001010,#%01001010,#%11001010,#%00101010,#%10101010,#%01101010,#%11101010 .DA #%00011010,#%10011010,#%01011010,#%11011010,#%00111010,#%10111010,#%01111010,#%11111010 .DA #%00000110,#%10000110,#%01000110,#%11000110,#%00100110,#%10100110,#%01100110,#%11100110 .DA #%00010110,#%10010110,#%01010110,#%11010110,#%00110110,#%10110110,#%01110110,#%11110110 .DA #%00001110,#%10001110,#%01001110,#%11001110,#%00101110,#%10101110,#%01101110,#%11101110 .DA #%00011110,#%10011110,#%01011110,#%11011110,#%00111110,#%10111110,#%01111110,#%11111110 .DA #%00000001,#%10000001,#%01000001,#%11000001,#%00100001,#%10100001,#%01100001,#%11100001 .DA #%00010001,#%10010001,#%01010001,#%11010001,#%00110001,#%10110001,#%01110001,#%11110001 .DA #%00001001,#%10001001,#%01001001,#%11001001,#%00101001,#%10101001,#%01101001,#%11101001 .DA #%00011001,#%10011001,#%01011001,#%11011001,#%00111001,#%10111001,#%01111001,#%11111001 .DA #%00000101,#%10000101,#%01000101,#%11000101,#%00100101,#%10100101,#%01100101,#%11100101 .DA #%00010101,#%10010101,#%01010101,#%11010101,#%00110101,#%10110101,#%01110101,#%11110101 .DA #%00001101,#%10001101,#%01001101,#%11001101,#%00101101,#%10101101,#%01101101,#%11101101 .DA #%00011101,#%10011101,#%01011101,#%11011101,#%00111101,#%10111101,#%01111101,#%11111101 .DA #%00000011,#%10000011,#%01000011,#%11000011,#%00100011,#%10100011,#%01100011,#%11100011 .DA #%00010011,#%10010011,#%01010011,#%11010011,#%00110011,#%10110011,#%01110011,#%11110011 .DA #%00001011,#%10001011,#%01001011,#%11001011,#%00101011,#%10101011,#%01101011,#%11101011 .DA #%00011011,#%10011011,#%01011011,#%11011011,#%00111011,#%10111011,#%01111011,#%11111011 .DA #%00000111,#%10000111,#%01000111,#%11000111,#%00100111,#%10100111,#%01100111,#%11100111 .DA #%00010111,#%10010111,#%01010111,#%11010111,#%00110111,#%10110111,#%01110111,#%11110111 .DA #%00001111,#%10001111,#%01001111,#%11001111,#%00101111,#%10101111,#%01101111,#%11101111 .DA #%00011111,#%10011111,#%01011111,#%11011111,#%00111111,#%10111111,#%01111111,#%11111111 *-------------------------------------- OptionList >PSTR "Vv" OptionVars .DA #bVerbose,#bVerbose MSG.USAGE >CSTR "Usage : BMP2PIX BMP-File \r\n -V : Verbose Mode\r\n" MSG.FILE.OK >CSTR "BMP Loaded, %D Bytes Read\r\n" MSG.HEADER.OK >CSTR "BMP Size : %D x %D pixels\r\n" MSG.HEADER.KO >CSTR "Invalid Input File Format\r\n" MSG.DONE >CSTR "All Done!!!\r\n" *-------------------------------------- .DUMMY .OR 0 DS.START PIX.Header .BS S.BM ArgCount .BS 1 hInputBuf .BS 1 hOutputFile .BS 1 bVerbose .BS 1 hBuf .BS 1 DS.END .ED *-------------------------------------- MAN SAVE /A2OSX.BUILD/BMP2PIX.S ASM