-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathshowbin
More file actions
287 lines (261 loc) · 7.24 KB
/
Copy pathshowbin
File metadata and controls
287 lines (261 loc) · 7.24 KB
1
* ----- Module Specifications ----- * nam ShowBIN ttl Picture Display Utility -- Decode BIN 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 /ShowBIN/version fcb 1* ----- Constants ----- *expantbl fcb %00000000,%00000011,%00001100,%00001111 fcb %00110000,%00110011,%00111100,%00111111 fcb %11000000,%11000011,%11001100,%11001111 fcb %11110000,%11110011,%11111100,%11111111* ----- Memory Reserves ----- *botofmem rmb 2bufraddr rmb 2bufrsiz rmb 2stackhld rmb 2path rmb 1callcode rmb 1scrnaddr rmb 2scposmsw rmb 2scposlsw rmb 2scrnwid rmb 2scrnlen rmb 2scrnend rmb 2snglscrn rmb 1scrnsize rmb 1outbyte rmb 1palette rmb 16scrnclrs rmb 1linehold rmb 2linecnt rmb 2bytepix rmb 1expanpix rmb 1counter rmb 1hoffset rmb 1voffset rmb 1skipme rmb 1buffer rmb 256/8datasize equ .* ----- Strings ----- ** ----- Main Program ----- *start stu botofmem sts stackhld sta path stb callcode stx scrnaddr ldd #$0000 std scposmsw std scposlsw leax buffer,u stx bufraddr clr snglscrn lda path ldb #$2 $2 = SS.SIZ os9 I$GetStt cmpx #$0000 bne setscrsz cmpu #1536*6 Add divide routine here!?! bhs setscrsz inc snglscrnsetscrsz ldb callcode comb If set to single screen (not andb #FullSize "FullSize") and file has addb snglscrn only one page picture then stb scrnsize set to single screen picturesetupscr lda #1 Only 1 flipped screen for BIN pictures ldb #2 Only 2 colors in BIN picturessetxscr ldx #320 tst snglscrn bne setyscr Single screen picture in the file? tst scrnsize No beq setyscr Are we restricted to a single screen? ldx #640 Yessetyscr ldy #192 tst snglscrn bne dosetscr Single screen picture in the file? ldy #384 Nodosetscr swi3 fcb S$ScrnSz lbcs showerr sty scrnlen sty linecnt pshs b andb #clrsmask stb scrnclrs puls b andb #bpixmask lsrb addb #%00010000 Increment pixels-per-byte AFTER first shift stb expanpix so there is an extra bit to expand into lsrb lsrb Finish moving top 3 bits to bottom 3 bits lsrb lsrb stb bytepix lsrb stb counter tfr x,d beq donexpanexpndwid lsra Divide by BYTEPIX rorb lsr counter bne expndwiddonexpan std scrnwid leax -256,x lda bytepix sta counter tfr x,dexpndpix lsra Divide by BYTEPIX*2 rorb lsr counter bne expndpix stb hoffset ldd scrnaddr leax d,u stx scrnend cmpy scrnlen bhs showpic ldb #E$BadSSz lbra showerrshowpic tfr y,d subd scrnlen lsrb stb voffset stb counter ldb scrnclrs decb ldx botofmem leax palette,x lda #$3fwhitepal sta b,x decb bne whitepal clr ,x ldb #0 swi3 fcb S$SetPal lbcs showerr clr skipme ldu scrnaddr ldd scrnwiddovofset dec counter bmi skiphdr leau d,u bne dovofsetskiphdr lda path ldx bufraddr ldy #5 os9 I$Read bcc readbufreaderr cmpb #E$EOF lbeq showexit lbra showerrreadbuf lda path ldx bufraddr ldy #256/8 os9 I$Read bcs readerr cmpy #256/8 lbne showexit sty bufrsizdohofset stu linehold ldb hoffset clra leau d,u leay expantbl,pcr ldb #256/8 stb counter lda expanpix tst snglscrn bne dobuffer Single screen picture in the file? tst scrnsize No beq dobuffer Are we restricted to a single screen? tst skipme Yes beq dobuffer clr skipme ldu linehold bra readbufdobuffer ldb ,x+ bsr expandb dec counter bne dobuffer inc skipme ldd linecnt subd #1 beq showexit std linecnt ldu linehold ldd scrnwid leau d,u bra readbufexpandb pshs a,b lsla beq putbyte lsrb lsrb lsrb lsrb ldb b,y bsr expandb ldb 1,s andb #%00001111 ldb b,y bsr expandb puls a,b,pcputbyte cmpu scrnend Are we at the end of the screen yet? bhs moremem 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 linehold Calculate "linehold" offset from U std linehold Save offset for later use tfr u,d subd scrnaddr Get offset into screen from absolute 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 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 tfr d,u subd linehold Subtract "linehold" offset for new "linehold" std linehold 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