-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathshowimg
More file actions
362 lines (333 loc) · 8.65 KB
/
Copy pathshowimg
File metadata and controls
362 lines (333 loc) · 8.65 KB
1
* ----- Module Specifications ----- * nam ShowIMG ttl Picture Display Utility -- Decode IMG files ifp1 use /dd/defs/systype.base use /dd/defs/os9defs.base use showdefs endcRevision set 2TypeLang set SbRtn+ObjctAttrRev set ReEnt+Revision mod procsize,name,TypeLang,AttrRev,start,datasizename fcs /ShowIMG/version fcb 1* ----- Constants ----- *rbufsiz equ SubMemSz-256expantbl fcb %00000000,%00000011,%00001100,%00001111 fcb %00110000,%00110011,%00111100,%00111111 fcb %11000000,%11000011,%11001100,%11001111 fcb %11110000,%11110011,%11111100,%11111111allpals equ *redpals fcb $24,$20,$04,$00,0,0,0,0,0,0,0,0,0,0,0,0grnpals fcb $12,$10,$02,$00,0,0,0,0,0,0,0,0,0,0,0,0bluepals fcb $09,$08,$01,$00,0,0,0,0,0,0,0,0,0,0,0,0bdrpals fcb $00,$00,$00 (3 screens)greypals fcb $3f,$38,$07,$00,0,0,0,0,0,0,0,0,0,0,0,0* ----- Memory Reserves ----- *botofmem rmb 2stackhld rmb 2bufraddr rmb 2bufrsiz rmb 2path rmb 1callcode rmb 1maxlines rmb 2rowbytes rmb 2scposmsw rmb 2scposlsw rmb 2scrnaddr rmb 2scrnclrs rmb 1scrnwid rmb 2scrnlen rmb 2scrnend rmb 2scrnxsiz rmb 2scrnysiz rmb 2snglscrn rmb 1scrnsize rmb 1outbyte rmb 1picpixb rmb 1bufrinfo rmb 1vidmode rmb 1palette rmb 16hdrsize equ .-bufrinfobytepix rmb 1expanpix rmb 1expantad rmb 2counter rmb 1multibuf rmb 1paletptr rmb 2bufrnum rmb 1dblzero rmb 1baseadj rmb 2scrnbyte rmb 2numscrns rmb 1buffer rmb rbufsizdatasize equ .* ----- Strings ----- ** ----- Main Program ----- *start stu botofmem sts stackhld sta path stb callcode stx scrnaddr sty maxlines bitb #Enhanced bne strtcont ldb #E$NoRsrc lbra showerrstrtcont leay expantbl,pcr sty expantad ldd #$0000 std scposmsw std scposlsw lda path leax buffer,u stx bufraddr clr snglscrn ldb #$2 $2 = SS.SIZ os9 I$GetStt lbcs showerr cmpu #hdrsize bhi setupscr ldb #E$EOF cmpx #$0000 lbeq showerrsetupscr lda path ldx botofmem leax bufrinfo,x ldy #hdrsize os9 I$Read lbcs readerrcnvrtsty clr multibuf lda vidmode cmpa #0 bhi csty1 lda #128/4 ldb #4 Number of colors on the screen ldx #640 Number of X pixels leay greypals,pcr bra setlinszcsty1 cmpa #1 bhi csty2 lda #128/2 ldb #16 ldx #320 ldy botofmem leay palette,y bra setlinszcsty2 cmpa #2 bhi csty3 lda #128/4 ldb #4 ldx #640 leay greypals,pcr bra setlinszcsty3 cmpa #3 bhi csty4 lda #128/4 ldb #4 ldx #640 leay allpals,pcr com multibuf bra setlinszcsty4 ldb #E$BadPic orcc #Carry rtssetlinsz sta picpixb stb scrnclrs stx scrnxsiz sty paletptrsetscrsz ldb callcode andb #FullSize If set to single screen (not eorb #FullSize "FullSize") and file has addb snglscrn only one page picture then stb scrnsize set to single screen picturedosetscr lda #1 Only 1 flipped screen for normal IMG pics ldy #200 tst scrnsize beq dosmulti ldy maxlinesdosmulti tst multibuf beq dossswi lda #3 But 3 screens for 1000 colors!dossswi sta numscrns ldb scrnclrs ldx scrnxsiz swi3 fcb S$ScrnSz lbcs showerr stx scrnxsiz sty scrnlen stu scrnbyte pshs b andb #clrsmask stb scrnclrs puls b andb #bpixmask lsrb addb #%00010000 Increment pixels-per-byte AFTER first shift lsrb so there is an extra bit to overflow into lsrb lsrb lsrb stb counter lslb lda picpixb mul stb expanpix tfr x,d beq donexpanexpndwid lsra Divide by BYTEPIX rorb lsr counter bne expndwiddonexpan std scrnwid ldd scrnaddr leax d,u stx scrnendshowpic ldb #3 Palette-3 contains black ldx paletptr swi3 fcb S$SetPal lbcs showerr ldu scrnaddr ldy #0 sty baseadj clr dblzero clr bufrnum bra dobufferreaderr cmpb #E$EOF lbeq showexit orcc #Carry rtsreadbuf pshs a lda path ldx bufraddr ldy #rbufsiz os9 I$Read bcs readerr cmpy #0 beq readbuf leay -1,y ldb ,x+ puls a,pcgetbyte leay -1,y cmpy #-1 beq readbuf ldb ,x+ rtsnextscrn inc bufrnum ldb bufrnum cmpb numscrns lbhs showexit pshs b,x,y ldx #$0000 stx scposmsw Start of new flipped screen stx scposlsw leay ,x swi3 fcb S$ReqMem lbcs showerr std scrnbyte stx scposmsw sty scposlsw stu scrnaddr ldd #0nsincadj addd scrnbyte dec ,s bne nsincadj std baseadj addd scrnaddr tfr d,u addd scrnbyte std scrnend puls b,x,ydobuffer lda expanpixdbnotcmp bsr getbyte bne dbnotval com dblzero beq nextscrn bra dbiscmpdbnotval pshs bdbnotlop bsr getbyte bsr expandb dec ,s bne dbnotlop leas 1,s clr dblzerodbiscmp bsr getbyte bne dbiscval com dblzero beq nextscrn bra dbnotcmpdbiscval pshs b bsr getbytedbcmplop bsr expandb dec ,s bne dbcmplop leas 1,s clr dblzero bra dbnotcmpexpandb pshs a,b lsla beq putbyte pshs y ldy expantad lsrb lsrb lsrb lsrb ldb b,y bsr expandb ldb 3,s andb #%00001111 ldb b,y bsr expandb puls y puls a,b,pcputbyte cmpu scrnend Are we at the end of the screen yet? bhs morememdoputbyt stb ,u+ No, store output byte puls a,b,pc and returnmoremem stb outbyte Yes, hold output byte tfr u,d Copy screen address to D for math subd scrnaddr Get offset into screen from absolute subd baseadj Discard flipped screen offset addd scposlsw Add to global offset (longword) std scposlsw bcc mmswi Overflow to MSW? inc scposmsw+1 Yes, increment it. bne mmswi inc scposmswmmswi pshs x,y Store X and Y for later use ldx scposmsw Get global screen offset into X and Y ldy scposlsw swi3 fcb S$ReqMem Request additional memory bcs showerr pshs x,y Store new global window address stu scrnaddr addd scrnaddr Add screen size to screen address for end address addd baseadj Add flipped screen offset std scrnend ldd scposlsw subd 2,s Calc offset from requested mem to returned mem puls x,y stx scposmsw Store new global offsets sty scposlsw addd scrnaddr Add offset to screen start address for new U addd baseadj Add flipped screen offset tfr d,u puls x,y Retrieve X and Y ldb outbyte Retrieve output byte stb ,u+ Store output byte puls a,b,pc Continue where we left offshowexit lds stackhld andcc #^Carry rtsshowerr lds stackhld orcc #Carry rts emodprocsize equ * end