VM Maker: VMMaker.oscog-nice.2220.mcz

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

VM Maker: VMMaker.oscog-nice.2220.mcz

commits-2
 
Nicolas Cellier uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-nice.2220.mcz

==================== Summary ====================

Name: VMMaker.oscog-nice.2220
Author: nice
Time: 24 May 2017, 7:19:44.72644 pm
UUID: 7e5591ac-8f9a-4828-81ba-247f3457ce4f
Ancestors: VMMaker.oscog-cb.2219

Fix display pixel reversal (for debug).

Modern implementation of displayBits is (void *).
We can't calculate an offset (dispalyBits + n) because we don't know the size of void! At least it fails on MSVC compiler.
So it's necessary to convert it to char *, int *, or just sqInt.

While at it, as calculated, the range is a pixel range (assumed on the first display line) not a word range, but this range will be rounded to a whole word boundary.

The formulation now explicitely uses word indices, not word indices disguised in byte offsets.
It should avoid bad alignment cases where word(byte)StartIndex could eventually not be a proper multiple of 4.
It should also now work for any depth.
It might overflow for a pixel range highBit > 26 if sqInt were only 32 bits, that is over 64 million pixel width, but since our screens are not yet that wide, and will never be that wide in a 32 bits addressable space, we're safe.

=============== Diff against VMMaker.oscog-cb.2219 ===============

Item was changed:
  ----- Method: StackInterpreter>>reverseDisplayFrom:to: (in category 'I/O primitive support') -----
  reverseDisplayFrom: startIndex to: endIndex
+ "Reverse the given range of Display pixels, rounded to whole word boundary.
+ Used to give feedback during VM activities such as garbage collection when debugging.
- "Reverse the given range of Display words (at different bit depths, this will reverse different numbers
- of pixels). Used to give feedback during VM activities such as garbage collection when debugging.
  It is assumed that the given word range falls entirely within the first line of the Display."
+
  | wordStartIndex wordEndIndex primFailCodeValue |
  (displayBits = 0 or: [(objectMemory isImmediate: displayBits asInteger) or: [displayDepth = 0]]) ifTrue: [^nil].
+ wordStartIndex := (startIndex max: 0) * displayDepth // 32.
+ wordEndIndex := (endIndex min: displayWidth) * displayDepth // 32.
+ wordStartIndex * 4 to: wordEndIndex * 4 do:
+ [:byteOffset | | reversed |
+ reversed := (objectMemory long32At: displayBits asInteger + byteOffset) bitXor: 16rFFFFFFFF.
+ objectMemory long32At: displayBits asInteger + byteOffset put: reversed].
- wordStartIndex := startIndex * (displayDepth // 8).
- wordEndIndex := endIndex * (displayDepth // 8) min: displayWidth * (displayDepth // 8).
- displayBits + wordStartIndex to: displayBits + wordEndIndex by: 4 do:
- [:ptr | | reversed |
- reversed := (objectMemory long32At: ptr) bitXor: 16rFFFFFFFF.
- objectMemory long32At: ptr put: reversed].
  primFailCodeValue := primFailCode.
  self initPrimCall.
  self updateDisplayLeft: 0 Top: 0 Right: displayWidth Bottom: 1.
  self ioForceDisplayUpdate.
  primFailCode := primFailCodeValue!