Title: | -={ H A C K E R S }=- |
Notice: | Write locked - see NOTED::HACKERS |
Moderator: | DIEHRD::MORRIS |
Created: | Thu Feb 20 1986 |
Last Modified: | Mon Aug 03 1992 |
Last Successful Update: | Fri Jun 06 1997 |
Number of topics: | 680 |
Total number of notes: | 5456 |
I'm trying to write a hack (as a learning exercise) to turn the display on a VAXstation screen upside-down and backwards while preserving as much as possible the behavior of windows, cursors, fonts, applications, etc. To be done in software only - no touching of the tube's yoke! The normal way of diddling the display on the screen is through the video memory pointed to by the QVB data structure. Unfortunately this won't do what I want. The scan line map pointed to by the QVB is apparently a virtual, rather than the physical map. For example, I can write a program (CMKRNL required) to reverse the order of the entries in the scan line map pointed to by the QVB without immediately affecting what is displayed on the screen (but then when I create new windows or move existing ones boy, does wierd stuff happen!). Applications like UIS apparently only look at the scan line map sometimes, when they think they have to refresh something. There are fields in the QVB for the highest and lowest map entry refreshed and also a reset QIO, but these things don't do the right thing (My hack turns what's visible on the tube upside-down and backwards by swapping contents of video memory pointed to by various map entries, and then my original plan was to turn the map itself upside-down to preserve the order and correspondance.) Perhaps I can bypass all this "virtual" stuff and make my problem simpler if I can get access to the physical memory the hardware uses? According to the documentation contained in appendix C of the "VAXSTATION II Hardware Information" book, the QVSS (VCB01) has 256K of memory that appears at the very end of the MicroVAX I/O space (3FFC0000-3FFFFFFF). The upper 2K bytes of this is the physical scan-line map and the cursor RAM is the upper 16 bytes of that. I wrote a program to map (via $CRMPSC) this into my P0 space, but when I tried to create the section, I got a machine check (followed by a system crash). When I try to access those high locations from the console when the machine is halted, I get Invalid Address (non-existant memory) errors. Anyone know what the poop is with this memory? The book says it's there but I can't see it. Am I doing something dumb? - Lou Falek
T.R | Title | User | Personal Name | Date | Lines |
---|---|---|---|---|---|
431.1 | Try this | TLE::GRIEB | SET TERMINAL/READ_MOSTLY | Mon Mar 23 1987 08:46 | 96 |
I recently found that on my Vaxstation II that if I ran Ultrix with the 32W software installed, then took Ultrix down and booted VMS, that VMS would CRASH when trying to autosize the QVSS. The reason for this appeared to be that Ultrix leaves the scan line map of the QVSS in a weird state and VMS assumes that it's in a known state and blindly uses it. Now by now you're probably saying to yourself "Self... What does any of this have to do with my question ????". Well the answer to the problem I mentioned above was to write a little program that uses a PFN global section and to run it in my SYCONFIG.COM - before the QVSS was used. This program resets the scanline map. I think that you can use it to add whatever code you want to do weird and "wonderful??" things. Code follows: Enjoy --------------------------- Cut here ------------------------------------------ %TITLE 'FIXSCAN - Fix scan map' MODULE fixscan (IDENT = 'X01-001', MAIN=do$it, ADDRESSING_MODE(EXTERNAL=GENERAL, NONEXTERNAL=LONG_RELATIVE) ) = BEGIN LIBRARY 'SYS$LIBRARY:STARLET'; !System stuff MACRO $check_status = IF NOT .status THEN SIGNAL( .status ); %; %SBTTL 'DO$IT ()' GLOBAL ROUTINE do$it = BEGIN EXTERNAL ROUTINE LIB$PUT_OUTPUT; BIND smapdsc = %ASCID'SLMAP', header = %ASCID' Fixing QVSS scan map'; LOCAL in_addr: VECTOR[ 2 ], ret_addr: VECTOR[ 2 ], scanmap: REF VECTOR[,WORD], privmask: BLOCK[8,BYTE], !Privilege mask status; !For completion code BIND quadword = privmask: VECTOR[]; !Access as 2 longwords status = LIB$PUT_OUTPUT( header ); $check_status; quadword[ 0 ] = 0; quadword[ 1 ] = 0; privmask[ PRV$V_CMKRNL ] = 1; !Set needed priv on privmask[ PRV$V_PFNMAP ] = 1; !Set needed priv on status = $SETPRV( PRVADR= privmask, ENBFLG= 1 ); !Do it $check_status; ret_addr[ 0 ] = 0; ret_addr[ 1 ] = 0; in_addr[ 0 ] = 0; in_addr[ 1 ] = 0; status = $CRMPSC( INADR= in_addr, RETADR= ret_addr, FLAGS= (SEC$M_EXPREG OR SEC$M_PFNMAP OR SEC$M_WRT), GSDNAM=smapdsc, VBN=%x'181FFC', PAGCNT= 2*2 ); $check_status; scanmap = .ret_addr[ 0 ]; INCR idx FROM 0 to 863 DO BEGIN scanmap[ .idx ] = .idx; END; INCR idx FROM 864 to 1023 DO BEGIN scanmap[ .idx ] = 21845; END; RETURN ( SS$_NORMAL ); !All is well END; !End of routine do$it END ! End of module ELUDOM |