þþ™ X; ************************** X; * UN - SPRITES * X; **************************(X; Assembler used : MAC652X;<EIF"X;Program to transfer blocks ofPX;screen data in a window.ZX;dX; BY JASON LEIGH 8/28/86nX; ANALOG COMPUTING 1986xX;‚X;To use routine in BASICŒX;–WX;COPY=USR(WDWCPY,Screen Start,StartX,StartY,EndX,EndY,Buffer Address,Graphics Mode) ;X;('Graphics mode' corresponds to those on the XL & XEs)ªX;´AX;PASTE=USR(WDWPSTE,Screen Start,StartX,StartY,Buffer Address)¾X;ÈX;ÒX; *** EQUATES ***ÜX;æð…LOVAL;;Lo Byte Param.ú…HIVAL;;For X and /.†SCRNLO;;Screen RAM.†SCRNHI;;Start.…STXLO;;StartX."…STXHI,ƒSTY;;StartY.6„EXLO;;EndX.@„EXHI J‚EY ;;EndY.T†GRMODE ;;Graphics Mode.^ ‚DX h ‚DYr!‡TLMEMLO;;Top Left corner|‡TLMEMHI;;RAM location.†ƒPPB;;Pixels Per ByteƒBPL;;Bytes Per Lineš†ACROSS¤„DOWN®&†DIRECT;;1=PASTE & 0=COPY WNDW¸†SHIFTS;;Shift alignˆTEMPSHFT̆TEMPLOÐ;;Temporary.Ö†TEMPHIÑà…BUFLOÎ;;Buffer Address.ê …BUFHIÏôˆTMPLOCPYÌ;;TEMPLO-1þˆTMPHICPYÍX;X;*** SUBROUTINES ***X;&X;MULTIPLICATION CONTROLLER0X;:`D„MULTR> ;;Do multiplicationNH‚M1;;of LOVAL,HIVAL toX!ƒX10;;accumulator.b ‚M1R>lH‚M2v!ƒX20€ ‚M2R>ŠH‚M3”!ƒX21ž ‚M3R>(¨H‚M4²!ƒX40¼ ‚M4R>ÆH‚M5Ð!‚X4Ú ‚M5R>äH‚M6î!‚X8ø‚M6:X; X; MULTIPLY BY 10 ALGORITHMX; ƒX10%>;;SHIFT LEFT 3*Q…LOVAL;;TIMES TO X8,4P†TEMPLO;;THEN ADD X2.> Q…HIVALH P†TEMPHIRƒX11,;;3 left shifts.\ U…LOVALf U…HIVALp3z)>„HƒX11Ž,˜!U†TEMPLO;;Add to 1 left shift.¢ U†TEMPHI¬,¶ Q†TEMPLOÀ O…LOVALÊ P…LOVALÔ Q†TEMPHIÞ O…HIVALè P…HIVALò,ü:X;X; MULTIPLY BY 20X;$ƒX20 ƒX10;;Multiply by 10..ƒX21,;;X2 algorithm.8 U…LOVALB U…HIVALL,V:`X;jX; MULTIPLY BY 40tX;~ƒX40 ƒX20;;Multiply by 20.ˆ!ƒX21;;Double it.’X;œX; MULTIPLY BY 4¦X;° ‚X4 ƒX21º!ƒX21ÄX;ÎX; MULTIPLY BY 8ØX;â ‚X8 ‚X4ì!ƒX21öX;X;DIVISION CONTROLLER X;#„DIVSR>;;Divide LOVAL/HIVAL byHƒDV1;;accumulator.( !„DIV22 ƒDV1R><HƒDV2F !„DIV4P ƒDV2R>ZHƒDV3d !„DIV8nƒDV3:xX;‚X;DIVISION BY 2 ALGORITHMŒX;– „DIV2,  W…HIVALª W…LOVAL´,¾:ÈX;ÒX;DIVISION BY 4 ALGORITHMÜX;æ„DIV4 „DIV2ð !„DIV2úX;X;DIVISION BY 8 ALGORITHMX;„DIV8 „DIV4" !„DIV2,X;6 X;Get PPB and BPL from table.@X;JˆCOPYDATA$†GRMODETQˆPIXPBYTE9^PƒPPBhQ‡BYTEPLN9rPƒBPL|:†X;'X;Calculate Top Left Corner Address.šX;¤!X;Equivalent BASIC statement:-®$X;TLMEM=SCRN+STY*BPL+INT(STX/PPB)¸X;†TLCALCQƒSTY;;STY*BPLÌ P…LOVALÖQ>à P…HIVALêQƒBPLô „MULTþ Q…LOVAL P‡TLMEMLO Q…HIVAL P‡TLMEMHI&,0Q†SCRNLO;;Add SCRN: O‡TLMEMLOD P‡TLMEMLON Q†SCRNHIX O‡TLMEMHIb P‡TLMEMHIlQ…STXLO;;STX/PPBv P…LOVAL€ Q…STXHIŠ P…HIVAL”QƒPPBž „DIVS¨,²Q…LOVAL;;Add to TLMEM¼ O‡TLMEMLOÆ P‡TLMEMLOÐ Q…HIVALÚ O‡TLMEMHIä P‡TLMEMHIî:øX;'X;### END OF GENERAL SUBROUTINES ### X;X; %X;**** MAIN COPY BLOCK ROUTINE ****X;4$X;Get parameters from USR command>X;HIR†WDWCPY7;;Remove TOS\EIf7;; Screen Start Addressp P†SCRNHIz7„ P†SCRNLOŽ 7;; StartX of Top Left Corner˜ P…STXHI¢7¬ P…STXLO¶7À7;; StartYÊPƒSTYÔ 7;; EndX of Bottom Right CrnrÞ P„EXHIè7ò P„EXLOü 7;; EndY 7 P‚EY 7;; Storage buffer address$ P…BUFHI. 78 P…BUFLOB 7;; Graphics modeL 7V P†GRMODE` Q>j P†DIRECT;;0=COPY 1=PASTEt X;~ X; Get PPB and BPL for GRMODEˆ X;’ ˆCOPYDATAœ X;¦ !X; Get TLMEM (Top Left Memory)° X;º †TLCALCÄ X;Î X; Calculate DX & DYØ X; DX=INT((EX-STX)/PPB)â X;ì ;ö Q„EXLO;;EX-STX S…STXLO P…LOVAL Q„EXHI S…STXHI( P…HIVAL2 QƒPPB;;Divide by PPB< „DIVSF Q…LOVALP ,Z O>d P‚DXn X;x X;DY=EY-STY‚ X;Œ ;– Q‚EY  SƒSTYª ,´ O>¾ P‚DYÈ X;Ò X;Main Loop To get blockÜ X;æ X;Store DX & DY firstð X;as headers of the buffer.ú X; $> Q‚DX P@…BUFLO6" #…BUFLO, Q…BUFLO6 R>@ H‚G1J #…BUFHIT ‚G1Q‚DY^ P@…BUFLO6h #…BUFLOr Q…BUFLO| R>† H„LOOP #…BUFHIš X;¤ X;Now do loops® X;See equivalent BASIC code.¸ X; „LOOPQ>;;FOR DOWN=0 To DYÌ P„DOWN;;FOR ACROSS=0 To DXÖ P†ACROSSà $>ê ƒREP,ô Q‡TLMEMLOþ O†ACROSS P†TEMPLO Q‡TLMEMHI O>& P†TEMPHI0 Q†DIRECT: R>;; 1 Means PASTE, 0=COPYD F…PASTEN Q@†TEMPLO6;;Get ByteX P@…BUFLO6b !„COPYl …PASTE ‰PASTEBYTEv „COPY#…BUFLO€ Q…BUFLOŠ R>” H‚F1ž #…BUFHI¨ ‚F1#†ACROSS² Q†ACROSS¼ R‚DXÆ DƒREPÐ Q>Ú P†ACROSSä ,î Q‡TLMEMLOø OƒBPL P‡TLMEMLO Q‡TLMEMHIO> P‡TLMEMHI* #„DOWN4 Q„DOWN>R‚DYHDƒREPR:;;Done, RETURN TO BASIC.\X;fX;p&X; *** MAIN PASTE BLOCK ROUTINE ***zX;„IŽ‡WDWPSTE7;;Get parameters.˜EI¢7;;Get Start of¬P†SCRNHI;;screen RAM.¶7À P†SCRNLOÊ7ÔP…STXHI;;StartXÞ7è P…STXLOò7ü7PƒSTY;;StartY7P…BUFHI;;Buffer Address$7. P…BUFLO8Q>BP†DIRECT;;1=PASTELX;VX; Calculate TLMEM`X;j †TLCALCt$>;;Get DX, DY~ Q@…BUFLO6ˆP‚DX’ #…BUFLOœ Q…BUFLO¦R>°H‚H1º #…BUFHIÄ‚H1Q@…BUFLO6ÎP‚DYØ #…BUFLOâ Q…BUFLOìR>öH‚H2 #…BUFHI ‚H2QƒPPB;;IF 1 pixel/ByteR>;;then no shift.&H‰CALCSHIFT;;else calculate shifts.(!ƒESC2‰CALCSHIFT#‡TLMEMLO<Q‡TLMEMLO;;Increment TLMEMFR>P H…CONT1Z #‡TLMEMHIdX;nX;Calculate Shift pntrxX; = STX - ((STX/PPB)*PPB)‚X;Œ…CONT1Q…STXLO;;(STX/PPB)– P…LOVAL  Q…STXHIª P…HIVAL´QƒPPB¾ „DIVSÈ,ÒQƒPPB;;(STX/PPB)*PPBÜ „MULTæ;;; STX-((STX/PPB)*PPB)ð Q…STXLOúS…LOVAL;; Only lo byte>;; relevant.QƒPPB;;Get # of shiftsR>;;from shift tables." H…CCCN1,Q‰SHFTABLE896 !„CCCE@…CCCN1R>J H…CCCN3TQ‰SHFTABLE49^ !„CCCEh…CCCN3Q‰SHFTABLE29r„CCCEP†SHIFTS;;Store shifts.|ƒESC!„LOOP;; Put to screen.†X;X;Subroutine to put bytes inš"X;correct position with correct¤X;number of shifts.®X;¸‰PASTEBYTEQƒPPBÂR>;; If not 1 PixelÌH‡PROCEED;; per byte thenÖQ@…BUFLO6;;shift, elseàP@†TEMPLO6;;just put.ê:ô‡PROCEEDQ>þPˆTEMPSHFT;;Clear Temp Q†TEMPLOPˆTMPLOCPY Q†TEMPHI&PˆTMPHICPY;;Copy TEMPLO/HI &0"ˆTMPLOCPY;;decrement by 1.:QˆTMPLOCPYDR>ÿN H„KONTX"ˆTMPHICPYb„KONT%>;;Do requiredlQ@…BUFLO6;;# of shifts.v…KONT1)†SHIFTS€FƒEXTŠ,”U?žUˆTEMPSHFT¨3² !…KONT1¼ ƒEXTP@†TEMPLO6;;Put on screenÆQ@ˆTMPLOCPY6ÐLˆTEMPSHFT;;OR byte-1ÚP@ˆTMPLOCPY6ä:îX;øX; Pixels per ByteX; <ˆPIXPBYTE ===============X; X;Bytes per Line*X;4;‡BYTEPLN (=== = ===(=(=(=(=(=(=(==(>X;H$X;Table of shifts for 8 PPB modesRX;\(‰SHFTABLE8 ========fX;p$X;Table of shifts for 4 PPB modeszX;„‰SHFTABLE4 ===ŽX;˜$X;Table of shifts for 2 PPB modes¢X;¬‰SHFTABLE2 =¶X;ÀX;767 Bytes.