Mercurial > hg > Members > kono > nitros9-code
diff 3rdparty/utils/view/view_st.a @ 1706:6b23465701c0
Tim Kientzle's VIEW
author | boisy |
---|---|
date | Tue, 10 Aug 2004 23:46:24 +0000 |
parents | |
children | b7fb6a9aead4 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/3rdparty/utils/view/view_st.a Tue Aug 10 23:46:24 2004 +0000 @@ -0,0 +1,318 @@ +***************************************************************************** +* * +* 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 /dd/defs/os9defs.a + 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