-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathshow
More file actions
273 lines (255 loc) · 6.62 KB
/
Copy pathshow
File metadata and controls
273 lines (255 loc) · 6.62 KB
1
* ----- Module Specifications ----- * nam Show ttl Picture Display Utility ifp1 use /dd/defs/systype.base use /dd/defs/os9defs.base use /dd/defs/winfodefs use showdefs endcRevision set 2TypeLang set Prgrm+ObjctAttrRev set ReEnt+Revision mod procsize,name,TypeLang,AttrRev,start,datasizename fcs /Show/version fcb 1testing equ 1* ----- Constants ----- * use show.const* ----- Memory Reserves ----- * use show.mem* ----- Strings & Tables ----- * use show.str use show.tabs* ----- Main Program ----- *start stu botofmem Setup. Exit with ERROUT/ERRMOUT pshs d,x leax datblkt,u stx dbtaddr leax (datblks-2)*3,x stx dbteaddr ldd #$0000 sta multflpm sta retcode sta error sta scrnscrl sta bgrndscr sta scrnmapd sta slidshow std scrnaddr std myscreen leax stormsg,pcr cmpy #datasize lbne errmout ldb #datblks*3 stb filepath leax datblkt,uclrdatb clr ,x+ decb bne clrdatb ldb #blksend-blkstrt leax blkstrt,uclramblk clr ,x+ decb bne clramblk ldb #8 leax linkfnam,pcr leay linkname,umovelnam lda ,x+ sta ,y+ decb bne movelnam ifeq testing leax intrap,pcr else leax errexit,pcr endc os9 F$Icpt lda #3 leax swint,pcr os9 F$SSWI ldx #0 ldb #1 os9 F$MapBlk stb retcode lbcs errout stu blk0addr puls d,x orcc #IntMasks lbsr flipirqs lbsr flipirqr Initialze "Old IRQ" stuff andcc #^IntMasks lbsr getparms Hereafter, must finish via ERREXIT/ERRMEXIT ldu botofmem leas stackend,u leax strtscrn,pcr lbsr makescrn lbsr echoff lbsr mapscrn clr retcode clr error bra showfileshowerr lda retcode beq showfile sta error lda filepath os9 I$Closeshowfile lbsr openfile bcs showerr lbsr linkshow bcs showerr lbsr memsetup lbsr callshow pshs cc lbsr cleanup puls cc bcs showerr tst scrnscrl Is picture larger than one screen? (Scroll it) bne doscrlsc lda scrnflip deca beq showpaus lbsr copyscrn tst slidshow bne showpaus lbsr os9beepshowpaus lbsr pause No, Wait before continuing anda #%01011111 Make character into upper case cmpa #'Q Does user want to (Q)uit? lbeq weredone bra showfile No, show next picturedoscrlsc tst slidshow Are we doing a slide show? bne showpaus Yes, no scroll allowed clr scrnline clr scrnline+1 No, window starts at line 0 lbsr copyscrn bcs showerrdssbeep lbsr os9beep lda scrnflip deca lbne multscrldsswaitk lbsr getkey cmpa #$0C Was the key an unmodified up-arrow? beq dssup cmpa #$0A No, an unmodified down-arrow? beq dssdown anda #%01111111 (strip off <Alt>) cmpa #'Q No, does the user want to quit? lbeq weredone cmpa #'q lbeq weredone lbra showfile Show next picturedssdown ldd scrnline addd #grflines cmpd scrnysiz bhs dsswaitk ldd scrnline addd #scrlrate std scrnline addd #grflines cmpd scrnysiz bls dsscpscr ldd scrnysiz subd #grflines std scrnline bra dsscpscrdssup ldd scrnline beq dsswaitk subd #scrlrate bhs dssdoup ldd #$0000dssdoup std scrnlinedsscpscr clr scmvcont inc scmvcont Set continue flag lda scrnbpix pshs a ldd scrnxsizscmvstrt lsr ,s Calculate number of bytes per row beq scmvsize lsra rorb bra scmvstrtscmvsize leas 1,s tfr d,y std systemp1 ldx scrnline lbsr mul16x16 Multiply by starting line for starting offset ifne testing pshs b ldb #99 stb retcode puls b cmpx #$0000 Internal error lbne errexit endc sty windstrt ldd windstrt anda #%00011111 std blokstrt (store ofset into block) lda windstrt lsra lsra lsra And size in blocks lsra lsra pshs a lda #grflnmax ldb systemp1+1 mul std windsize Calculate size of displayed window in bytes ldy scrnaddr ldx botofmem leax ramblock,xscmvnxtb ldd #$2000 subd blokstrt std movesize ldd windsize subd movesize How much of this block do we move? bhi scmvmapb ldd windsize std movesize clr scmvcontscmvmapb std windsize ldb ,s clra ldb b,x Get physical block from virtual block table pshs x tfr d,x ldb #1 os9 F$MapBlk Map it in ifne testing bcc scmvdomv leas 3,s ldb #99 stb retcode lbra errexit Internal error endcscmvdomv tfr u,d addd blokstrt tfr d,x ldd movesize addd #127 Round up to nearest movable chunk lslb rola tfr a,b lbsr moveblok ldb #1 os9 F$ClrBlk clr blokstrt clr blokstrt+1 puls x ldd movesize leay d,y inc ,s tst scmvcont bne scmvnxtb leas 1,s lbra dsswaitkmultscrl lbra showpaus* ----- Program Subroutines ----- * use show.subs* ----- Interrupt Routines ----- * use show.swi emodprocsize equ * end