diff 3rdparty/utils/view/view_img.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_img.a	Tue Aug 10 23:46:24 2004 +0000
@@ -0,0 +1,317 @@
+********************************************************************************
+*
+* SUBS for IMG picture formats
+*
+* IMGshowpic -- displays picture on screen
+*
+********************************************************************************
+
+check macro
+      pshs b,cc      This macro will print "ERROR #xxx", where xxx is the
+      ldb  #\1       . number given as an argument.  Very useful for
+      os9  F$PErr    . checkpointing, to make sure certain routines are
+      puls b,cc      . executed.  Printed to StdErr path.
+      endm
+
+ ifp1
+ use /dd/defs/os9defs.a
+ endc
+
+StdOut equ 1
+StdErr equ 2
+
+ psect view_img_a,0,0,0,0,0
+
+ vsect dp
+nscreens rmb 1   Number of screens in this picture.
+ endsect 
+
+IMGshowpic:
+ bsr  header
+*lbsr setscreen  Unlike some formats, these are handled by "header".
+*lbsr setpals
+ lbsr setbuffer
+
+spscreens
+ lbsr flipscreen   Select next screen
+ ldd  <Skiplines  First, skip any lines.
+ beq  skip01
+skip00
+ lbsr getline
+ subd #1
+ bne  skip00
+skip01
+
+ ldd  #00
+ ldx  #25
+showpicloop
+ lbsr getline
+
+ tst  <Size     If we're displaying a "small" pic, skip every 25th line.
+ bne  showpic2
+ leax -1,x
+ bne  showpic2
+ ldx  #25
+ bra  spnoput
+showpic2
+
+ lbsr putline
+ addd #1
+spnoput
+ cmpd #192
+ bne  showpicloop
+spfinish
+ lbsr getline   Read rest of this screen.
+ tst  <endofpic
+ beq  spfinish
+ clr  <endofpic  Clear for next screen.
+spendscreen
+ dec  nscreens  Any more?
+ bne  spscreens Yes, get it.
+ rts
+
+*
+* read header info from file, and set window type information
+*    Uses altbuff.
+*
+ vsect dp
+count      rmb 1     Count/value is used for compressed packets
+value      rmb 1
+straight   rmb 1     Number of straight bytes.
+compressed fcb $ff   T=we're in a compressed block.
+endoffile  rmb 1     T= EOF reached, so always return linebuff all 0
+endofpic   rmb 1     T= end-of-picture seen.
+zeroflag   rmb 1     T= We've seen one zero.. another will be end-of-pic
+ endsect
+
+header
+ pshs a,b,x,y,u
+
+* Set default Skiplines.
+ ldd  <Skiplines
+ cmpd #$ffff
+ bne  headskip
+ ldd  #0
+ std  <Skiplines
+headskip
+
+* Set default Size
+ lda  <Size
+ bpl  headsize
+ lda  #1
+ sta  <Size
+headsize
+
+* Cancel any color cycling or rotation
+ lda  <cyclestart   one-palette cycle is effectively none
+ sta  <cycleend
+ clr  <extranum     no colors to rotate.
+
+* Now, read in header
+ leax altbuff,y read in type and palettes
+ pshs y
+ ldy  #18      Number of bytes in header.
+ lbsr I_Read
+ lbcs _error
+ puls y
+ leax altbuff,y
+ lda  ,x+      This byte contains RGB/CMP bit and other useless info.
+
+ lda  ,x+      This specifies the picture format and palettes to be used.
+
+ cmpa #0       Dithered grey
+ bne  header0
+ lda  #7
+ sta  <type
+ lbsr setscreen
+ lda  #1
+ sta  nscreens
+ lda  #3
+ lbsr setborder
+ leax greypals,pcr
+ lbsr headpals
+ bra  headend
+header0
+
+ cmpa #1       false 16-color
+ bne  header1
+ lda  #8
+ sta  <type
+ lbsr setscreen
+ lda  #1
+ sta  nscreens
+ lda  #15
+ lbsr setborder
+ lbsr  headpals  Use palettes in header
+ bra   headend
+header1
+
+ cmpa #2        Solid grey
+ bne  header2
+ leax greypals,pcr  Set pals to grey palettes.
+ lda  #7            Use type 7 screen
+ sta  <type
+ lbsr setscreen     Set it.
+ lda  #1
+ sta  nscreens  Only one screen for this format.
+ lda  #3
+ lbsr setborder
+ lbsr headpals
+ bra  headend
+header2
+
+ cmpa #3
+ bne  header3
+ lda  #7
+ sta  <type
+ lda  #3
+ sta  nscreens
+ lda  #$ff
+ sta  <flipping   Turn on flipping.
+ lbsr setscreen   Set up red screen
+ lda  #3
+ lbsr setborder
+ leax redpals,pcr
+ lbsr headpals
+ lbsr setscreen   Set up green screen
+ lbsr setborder
+ leax greenpals,pcr
+ lbsr headpals
+ lbsr setscreen   Set up blue screen
+ lbsr setborder
+ leax bluepals,pcr
+ lbsr headpals
+ bra  headend
+header3
+
+ lbsr E$Format   Illegal file format.
+
+
+headend
+ puls a,b,x,y,u,pc
+
+headpals 
+ pshs a,b,x,u    Set the palettes.
+ leau palette,y
+ ldb  #16
+headloop
+ lda  ,x+
+ sta  ,u+
+ decb
+ bne  headloop
+ lbsr setpals
+ puls a,b,x,u,pc
+
+greypals  fcb $3f,$38,$07,$00  Only first four palettes matter here.
+redpals   fcb $24,$20,$04,$00
+greenpals fcb $12,$10,$02,$00
+bluepals  fcb $09,$08,$01,$00
+
+*
+* Getline
+*
+getline
+ pshs a,b,x,y,u
+ leau linebuff,y   First, clear out line buffer to $ff, the background pattern.
+ ldx  #160
+ lda  #$ff   Since palette 3 is the background, use this for fill pattern.
+getl1
+ sta  ,u+
+ leax -1,x
+ bne  getl1
+
+ tst  endoffile    Are we at end-of-file?
+ lbne getline1     Yes, just leave buffer of zeros
+ tst  endofpic
+ lbne getline1
+
+* Get a line from file
+ leau linebuff,y   Where we'll put the line.
+ ldx  #160         Number of bytes in one line.
+* Check if we're in a compressed or uncompressed packet.
+ tst  count      Did we reach the end of the line in a compressed packet?
+ bne  uncompress Yes, finish uncompressing
+ tst  straight   Did we reach it in a straight packet?
+ bne  copystraight Yes, finish the packet.
+ tst  compressed Did we just finish a straight packet?
+ beq  getcomp    Yes, we're just starting a compressed one.
+* Get a straight packet
+getstraight
+ clr  compressed    Mark that we're in a straight packet
+ lbsr I_GetByte
+ bcs  geteof
+ sta  straight
+ bne  copystraight non-zero count, handle it.
+ tst  zeroflag
+ bne  geteop       If already one zero, set endofpic
+ com  zeroflag     Otherwise, set zeroflag.
+ bra  getcomp      If zero, next type of packet.
+* Read in straight data
+copystraight
+ clr  zeroflag
+ ldb  straight     Get number of bytes
+getstr1
+ lbsr I_GetByte    Get the next byte
+ bcs  geteof
+ sta  ,u+          Store the byte.
+ decb              Count down number of reps
+ leax -1,x         Count down size of line
+ beq  getstr2      If end of line, finish.
+ tstb
+ bne  getstr1
+ stb  straight
+ bra  getcomp      Get a compressed packet.
+getstr2
+ stb  straight     Hit end of line, store remaining count.
+ bra  getline1
+* Get a compressed packet
+getcomp
+ com  compressed    Mark that we're in a compressed packet
+ lbsr I_GetByte
+ bcs  geteof
+ sta  count
+ bne  getcomp1
+ tst  zeroflag
+ bne  geteop       If already one zero, set endofpic
+ com  zeroflag     Otherwise, set zeroflag.
+ bra  getstraight  If zero, next type of packet.
+getcomp1
+ lbsr I_GetByte
+ bcs  geteof
+ sta  value
+* Expand compressed data
+uncompress
+ clr  zeroflag
+ ldd  count        Get count/value
+getunc1
+ stb  ,u+          Store a copy of current value
+ deca              Count down number of reps
+ leax -1,x         Count down size of line
+ beq  getunc2      If end of line, finish.
+ tsta
+ bne  getunc1
+ std  count
+ bra  getstraight  Get a straight packet.
+getunc2
+ std  count        Otherwise, store remaining count.
+ bra  getline1
+
+geteop
+ lda  #$ff
+ sta  endofpic    Mark end of picture.
+ sta  compressed
+ clr  straight
+ clr  count
+ clr  zeroflag    Clear zeroflag.
+ bra  getline1
+geteof
+ cmpb #E$EOF
+ lbne _error
+ lda  #$ff
+ sta  endoffile   endoffile is also endofpic
+ sta  endofpic
+getline1
+ puls a,b,x,y,u,pc
+
+
+ endsect