Mercurial > hg > Members > kono > nitros9-code
view 3rdparty/utils/view/view_st.a @ 2488:00e35931156e
Updated
author | boisy |
---|---|
date | Wed, 31 Mar 2010 02:58:46 +0000 |
parents | 37fd74e6fad8 |
children |
line wrap: on
line source
***************************************************************************** * * * SUBS for st picture format * * * * STshowpic -- Displays picture, using putline routine * * * ***************************************************************************** check macro pshs b,cc ldb #\1 os9 F$PErr puls b,cc endm ifp1 use os9defs.d endc psect view_st_a,0,0,0,0,0 vsect dp linesize rmb 2 Bytes per line. totlines rmb 2 total lines in picture. curline rmb 2 Number of current screen line. fitcount rmb 2 Used to decide what lines to skip. linesleft rmb 2 Lines left in picture. endsect STshowpic: bsr header Get header info ldd <Skiplines beq skip01 skip00 lbsr getline subd #1 bne skip00 skip01 spscreens lbsr getline tst <endoffile bne showpicend lbsr setscreen Set up screen lbsr setpals Set up palettes lbsr setbuffer Set up Get/Put Buffer ldd #00 std curline showpicloop lbsr putline ldd fitcount addd totlines spget std fitcount lbsr getline tst <Size bne spnofit ldd fitcount subd #192 bge spget std fitcount spnofit ldd curline addd #1 std curline cmpd #192 bne showpicloop ldd linesleft cmpd #16 bhi spscreens showpicend rts * * read header info from file, and set window type information * vsect dp endoffile rmb 1 endsect header pshs a,b,x,y,u leax altbuff,y read in type and palettes into altbuff pshs y ldy #34 lbsr I_Read lbcs _error puls y leax altbuff,y lda ,x+ lda ,x+ This byte is the screen type. bne head0 lda #8 sta <type ldd #200 std totlines std linesleft ldd #160 std linesize bra headpals head0 cmpa #1 bne head1 lda #7 sta <type ldd #200 std totlines std linesleft ldd #160 std linesize bra headpals head1 cmpa #2 bne head2 lda #5 640 2-color screen. sta <type ldd #400 std totlines std linesleft ldd #80 std linesize bra headpals head2 headpals leau palette,y Need to expand palettes out to 3 bytes/palette ldb #16 16 palettes to expand out. headexp lda ,x+ anda #$0f Red is in lower nybble of first byte. sta ,u+ lda ,x Second byte is: upper nybble green, lower nybble blue. lsra lsra lsra lsra sta ,u+ lda ,x+ anda #$0f sta ,u+ decb bne headexp lbsr palscale First, scale so largest is 255 lbsr palconv Convert palette values from ST to CoCo format * Set some miscellaneous variables lda <cyclestart No cycling sta <cycleend clr <extranum No color rotation ldd <Skiplines cmpd #$ffff Is Skiplines still default? bne headskip No, don't change it. ldd #0 std <Skiplines Set it to 0 headskip lda <Size bpl headsize Default size is BIG lda #1 sta <Size headsize puls a,b,x,y,u,pc * * Getline * getline pshs a,b,x,y,u * First, fill buffers with all zeros leau linebuff,y leax altbuff,y ldb #160 getline3 clr ,u+ clr ,x+ decb bne getline3 * If at end of file, leave it that way tst endoffile beq getline5 ldd #0 std linesleft First, set number of lines remaining to zero. lbra getline1 getline5 * Count down lines left ldd linesleft bne getline6 com endoffile If no lines left, force end of file condition. lbra getline1 getline6 subd #1 std linesleft * Get a line from the file leax altbuff,y read in one line of screen pshs y ldy <linesize Warning: Mung Y! lbsr I_Read puls y lbcs geteof Error through EOF check. * Now, we have to interleave the bits to get CoCo screen format. leax altbuff,y leau linebuff,y ldy <linesize Total number of bytes to convert. lda <type cmpa #5 bne conv5 cnv5loop lda ,x+ This type screen, just copy the data. sta ,u+ leay -1,y bne cnv5loop lbra getline1 conv5 cmpa #7 Type 7 screen requires 2-way interleaving. bne conv7 cnv7loop lbsr twolev leax 1,x lbsr twolev leax 3,x leay -4,y bne cnv7loop lbra getline1 Now we're done. conv7 cmpa #8 Type 8 screen requires 4-way interleaving. bne conv8 cnv8loop lbsr fourlev Convert 4 bytes out of 8 -- X-X-X-X- leax 1,x Offset to next 4 lbsr fourlev Convert 4 bytes out of 8 -- -X-X-X-X leax 7,x Now, skip to next 8. leay -8,y Count down number of bytes. bne cnv8loop bra getline1 Now exit. conv8 bra getline1 Now exit. geteof cmpb #E$EOF bne getline4 com endoffile bra getline1 getline4 lbra _error If not EOF, just exit with error. getline1 puls a,b,x,y,u,pc * converts bytes 0,x 2,x 4,x and 6,x into 4 CoCo-format bytes * at [u]. U is advanced by 4, other regs unchanged. fourtab fdb $0000,$0001,$0010,$0011,$0100,$0101,$0110,$0111 fdb $1000,$1001,$1010,$1011,$1100,$1101,$1110,$1111 fourlev pshs a,b,x,y leay fourtab,pcr ldb #4 pshs b 4 bytes to worry about. bra fourlev1 fourlev0 lsl 3,u rol 2,u rol 1,u rol ,u fourlev1 lda ,x Get high nybble of byte. lsra lsra lsra anda #$1e ldd a,y Expand it out. ora ,u Or it into stuff so far. orb 1,u std ,u lda ,x++ Get low nybble, and advance to next byte. anda #$0f lsla ldd a,y Expand it out. ora 2,u Or into stuff so far. orb 3,u std 2,u dec ,s Have we done all four bytes? bne fourlev0 puls b Clean up stack. leau 4,u puls a,b,x,y,pc twolev bsr twolev1 twolev1 pshs a,b ldb #4 twoloop lsl ,x rola lsl 2,x rola decb bne twoloop sta ,u+ puls a,b,pc endsect