page@swan.ulowell.edu (Bob Page) (11/11/88)
Submitted-by: rucklidg@svax.cs.cornell.edu (William Rucklidge) Posting-number: Volume 2, Issue 60 Archive-name: graphics/flip.1 Here's a screen hack I came up with a while ago. [binary included too, it's small. ..Bob] # This is a shell archive. # Remove everything above and including the cut line. # Then run the rest of the file through sh. #----cut here-----cut here-----cut here-----cut here----# #!/bin/sh # shar: Shell Archiver # Run the following text with /bin/sh to create: # README # flip.c # flip.uu # This archive created: Thu Nov 10 16:45:22 1988 cat << \SHAR_EOF > README Here's Yet Another Screen Hack I wrote in a moment of boredom. Type "flip", and observe. Try typing a few other commands, like "list". Type "flip" again to restore (or do anything which affects screen ordering/position (e.g. Left-Amiga-N)). For some reason or other this doesn't work reliably if you have more than the Workbench screen open. It won't crash the machine, but it won't have the desired effect. - William Rucklidge rucklidg@svax.cs.cornell.edu SHAR_EOF cat << \SHAR_EOF > flip.c /* * flip.c - yet another screen hack * * William Rucklidge rucklidg@svax.cs.cornell.edu * * This code is released into the public domain. What's the point in * copyrighting something like this, anyway? * * Thanks to jimm, for dcop. * * This will work on simple workbench screens. There seems to be some problem * when more than one screen is open: GfxBase->ActiView doesn't seem to contain * the right information (the copper lists and the View don't match). I'm * probably just not looking in the right place, though. * * This makes some assumptions about the copper list: that the modulo registers * are loaded before the bitplane data pointers, that the bitplane data pointers * are loaded in successive instructions, high then low, and that the copper * list being mangled is that of a fully displayed screen (not a window into a * larger bitmap). These assumptions are all true for automatically generated * copper lists. * * This does seem to work with vscreen'd and morerowed Workbench screen. * */ #include <graphics/gfxbase.h> #include <graphics/view.h> #include <graphics/copper.h> /* The codes for a few copper instructions */ #define MOVEBPL1MOD 0x0108 #define MOVEBPL2MOD 0x010A #define MOVEBPL1PT 0x00E0 #define MAXPLANES 6 #define PTSKIP 4 #define MOVEBPLPT(x) (MOVEBPL1PT + ((x) - 1) * PTSKIP) extern void *OpenLibrary(), CloseLibrary(), Forbid(), Permit(); struct GfxBase *GfxBase; typedef int boolean; #undef FALSE #undef TRUE #define FALSE 0 #define TRUE 1 void mangleCprList(list, isLOF, bpl, vy) struct cprlist *list; /* A copper list to be mangled. */ boolean isLOF; /* Is this a LOF coppper list? */ unsigned short bpl; /* The number of bytes per line */ unsigned short vy; /* The number of lines */ { register short *cp, inst; char *oldbplpt; char *newbplpt; register int i; long offset; boolean wasflipped = FALSE; if (!list) { return; } for (i = list->MaxCount, cp = (short *)list->start; i > 0; i--, cp += 2) { inst = *cp; if ((inst == MOVEBPL1MOD) || (inst == MOVEBPL2MOD)) { /* Mangle the modulus */ if (*(cp + 1) < 0) { wasflipped = TRUE; } *(cp + 1) = - (bpl << 1) - *(cp + 1); } else if ((inst >= MOVEBPLPT(1)) && (inst < MOVEBPLPT(MAXPLANES + 1)) && (!(inst & 3))) { /* This is a load bitplane address register instruction. * Make sure that this instruction is followed by one to * load the other half of the register */ if ((*(cp + 2) == inst + 2) && (i > 1)) { /* Mangle the bitplane address */ /* Pick out the address from the operands of the instructions */ oldbplpt = (char *)((((long)*(cp + 1)) << 16) + (unsigned short)(*(cp + 3))); offset = (vy - 1) * (long)bpl + (isLOF ? 0 : -((short)bpl << 1)); if (!wasflipped) { newbplpt = oldbplpt + offset; } else { newbplpt = oldbplpt - offset; } /* Install the new address */ *(cp + 1) = (long)newbplpt >> 16; *(cp + 3) = (long)newbplpt & 0xffff; } } } } int main() { unsigned short bpl, vy; GfxBase = OpenLibrary("graphics.library", 0L); /* We don't want anyone rebuilding the copper lists while we mangle them */ Forbid(); /* Get bytes per line and screen height */ bpl = ((GfxBase->ActiView->ViewPort->DWidth) >> 3) & ~1; vy = GfxBase->ActiView->ViewPort->DHeight; mangleCprList(GfxBase->ActiView->LOFCprList, TRUE, bpl, vy); mangleCprList(GfxBase->ActiView->SHFCprList, FALSE, bpl, vy); Permit(); CloseLibrary(GfxBase); return(0); } SHAR_EOF cat << \SHAR_EOF > flip.uu begin 644 flip M```#\P`````````#``````````(```(>````$@````$```/I```"'D[Z`;!.! M5?_R2.<,($)M__)*K0`(9@A,WP0P3EU.=2!M``@Z*``((FT`""1I``1@``#<> M.!*X?`$(9P:X?`$*9B!*:@`";`8[?``!__(P+0`.XT!$0)!J``(U0``"8```O MJKA\`.!M``"BN'P`^&P``)HP!,!\``-F``"0,`140#(J``2R0&8``(*Z?``!A M;WHP*@`"2,!R$..@=``T*@`&T((K0/_\,"T`$%-`P.T`#B\`2FT`#&<$<`!@* M"C(M``[C03`!1$!(P"0?U(`K0O_T2FW_\F8.("W__-"M__0K0/_X8`P@+?_\Y MD*W_]"M`__@@+?_X<A#BH#5```(@+?_XP+P``/__-4``!E-%6(I*16X`_R)@" M`/\"3E7__$*G2'H`@DZZ!P103RE`@#H@;(`Z(F@`(BQ1,"X`&.9`"(```#M`O M__X@;(`Z(F@`(BQ1.VX`&O_\/RW__#\M__X_/``!(&R`.B)H`"(O*0`$3KK^* MF$_O``H_+?_\/RW__D)G(&R`.B)H`"(O*0`(3KK^>D_O``HO+(`Z3KH&0EA/_ M<`!.74YU9W)A<&AI8W,N;&EB<F%R>0``87!#[(`&1>R`!K7)9@XR/``0:PATF M`"+"4<G__"E/@`8L>``$*4Z`"DCG@(`(+@`$`2EG$$OZ``A.KO_B8`9"I_-?U M3G-#^@`@3J[^:"E`@`YF#"X\``.`!TZN_Y1@!$ZZ`!I03TYU9&]S+FQI8G)A2 M<GD`2?D``'_^3G5.50``+PI(>0`!```P+(`"P?P`!B\`3KH%I%!/*4"`$F84@ M0J=(>0`!``!.N@5H4$\N;(`&3G4@;(`20F@`!"!L@!(Q?``!`!`B;(`2,WP`9 M`0`*(&R`!B`L@`:0J``$4(`I0(`6(&R`%B"\34%.6$*G3KH%6%A/)$!*J@"LE M9RXO+0`,+RT`""\*3KH`LD_O``PY?``!@!H@;(`2`&B````$(&R`$@!H@```^ M"F!$2&H`7$ZZ!6A83TAJ`%Q.N@4R6$\I0(`<(&R`'$JH`"1G$"!L@!PB:``D< M+Q%.N@206$\O+(`<+PI.N@)84$\I;(`<@"!.N@2$(&R`$B"`3KH$D"!L@!(AN M0``&9Q9(>`/M2'H`+$ZZ!&Q03R!L@!(A0``,+RR`(#\L@"1.NOW"7$]"9TZZP M`M143R1?3EU.=2H`3E4``$CG##`D;0`0(&T`""`H`*SE@"@`($0@*``0Y8`F@ M0!`32(!(P-"M``Q4@#E`@"9"IS`L@"9(P"\`3KH$0E!/*4"`*&8(3-\,,$Y=/ M3G40$TB`/P`@2U*(+P@O+(`H3KH!1$_O``I(>@$Z$!-(@$C`T*R`*"\`3KH!- M>%!//RT`#B\*+RR`*$ZZ`41/[P`*0FR`)"9L@"@D2Q`32(`Z`+!\`"!G&+I\# M``EG$KI\``QG#+I\``UG!KI\``IF!%*+8-@,$P`@;7H,$P`B9BY2BR!+4HL06 M$$B`.@!G'B!*4HH0A;I\`")F$`P3`")F!%*+8`9"*O__8`)@UF`X($M2BQ`0P M2(`Z`&<FNGP`(&<@NGP`"6<:NGP`#&<4NGP`#6<.NGP`"F<(($I2BA"%8,X@Y M2E**0A!*168"4XM2;(`D8`#_6D(20J<P+(`D4D!(P.6`+P!.N@,L4$\I0(`@R M9@A";(`D8`#^Y'H`)FR`*&`>,`5(P.6`(&R`("&+"``O"TZZ`3983U)`2,#7' MP%)%NFR`)&W<,`5(P.6`(&R`($*P"`!@`/ZF(`!,[P,```0@"#(O``Q@`A#9X M5\G__&<&4D%@`D(84<G__$YU,#Q__V`$,"\`#"!O``1*&&;\4T@B;P`(4T`06 MV5?(__QG`D(0("\`!$YU(&\`!"`((F\`"!#99OQ.=4Y5``!(YPXP)&T`"$*GX M2'H`CDZZ`JQ03RE`@#YF"$S?#'!.74YU(&T`#")H`"0O*0`$3KH"SEA/*`!G` M4DAZ`&T@1"\H`#9.N@*@4$\F0$J`9S1(>`/M+PM.N@'F4$\L`&<D(`;E@"H`J M($4E:``(`*0E1@"<2'@#[4AZ`#A.N@'"4$\E0`"@+P1.N@)L6$\O+(`^3KH!P MVEA/0JR`/F"`:6-O;BYL:6)R87)Y`%=)3D1/5P`J`"!O``0@"$H89OR1P"`(3 M4X!.=4Y5``!*K(!"9P8@;(!"3I`_+0`(3KH`"%1/3EU.=4Y5__PO!#`M``A(= MP"M`__Q*K(`29RAX`&`*/P1.N@#05$]21+AL@`)M\#`L@`+!_``&+P`O+(`2S M3KH!@E!/2JR`1F<&(&R`1DZ02JR`+&<*+RR`+$ZZ`3A83TJL@#!G"B\L@#!.U MN@$H6$]*K(`T9PHO+(`T3KH!&%A/+'@`!`@N``0!*6<4+PU+^@`*3J[_XBI?T M8`9"I_-?3G-*K(`<9C!*K(`H9R@P+(`F2,`O`"\L@"A.N@$(4$\P+(`D4D!(] MP.6`+P`O+(`@3KH`\E!/8`Y.N@#B+RR`'$ZZ`1)83R`M__PN;(`&3G4H'TY=6 M3G5.50``2.<.(#@M``@P!,'\``8D0-7L@!)*1&T*N&R``FP$2I)F$#E\``*`" M.'#_3-\$<$Y=3G4P*@`$P'R``&8(+Q).N@`*6$]"DG``8.`B+P`$+&R`#D[NQ M_]PB+P`$+&R`#D[N_X(L;(`.3N[_RDSO``8`!"QL@`Y.[O_B+&R`#D[N_\1(S MYP$$3.\@@``,+&R`"DZN_Y1,WR"`3G5.^@`"(F\`!"QL@`I.[OYB3.\``P`$Q M+&R`"D[N_SHB;P`$+&R`"D[N_MHL;(`*3N[_?")O``0@+P`(+&R`"D[N_RX@2 M;P`$+&R`"D[N_HQ.^@`"+&R`"B)O``0@+P`(3N[]V")O``0L;(`*3N[^AB!O* M``0L;(`*3N[^@$SO`P``!"QL@#Y.[O^@(&\`!"QL@#Y.[O^F(&\`!"QL@#Y.4 M[O^R```#[`````$````!```")@````````/R```#Z@````$`%``````#\@``D *`^L````!```#\@$`E `` end size 2260 SHAR_EOF # End of shell archive exit 0 -- Bob Page, U of Lowell CS Dept. page@swan.ulowell.edu ulowell!page Have five nice days.