Index


RISC World

Desktop Hacker

Foundation RISCWorld

5. Technical stuff.

These section supersedes the text files that used to be available in the 'Documents' directory on older releases of Desktop Hacker.

5.1. Writing code for Desktop Hacker.

The old external code system used by The Hacker is no longer supported.

Instead, you should code a normal Wimp task, and use Desktop Hacker's SWIs and messages to communicate. This has the advantage that you don't need to program in ARM code - you can use C, BASIC, or any other language. Create yourself an application with a Desktop Hacker axe somewhere in the icon;

ideally, the application name should begin '!dH', but this may not always be appropriate.

There are two parts to Desktop Hacker: the actual DesktopHacker module task, which provides all the hacking facilities that the user uses; and the SWIVe code (so named because it works by claiming the SWI hardware vector), which, when the hot-keys are pressed, stops the game and starts a Wimp task. SWIVe sends Wimp messages to Desktop Hacker (and external tasks; it is a broadcast message) when the game is stopped, restarted, or quit.

Desktop Hacker sends a message to SWIVe telling it to continue when the Continue button is clicked, or when Select is clicked on the icon bar icon, or whatever. Desktop Hacker may also send a Wimp Message_Quit (message 0) telling SWIVe to shut the game down entirely. Other external tasks (including the Task Manager) may send messages to SWIVe. SWIVe will appear in the Task Display either as 'Desktop Hacker Game' if the program interrupted did not call Wimp_Initialise, or the real name of the stopped task if it did.

Apart from the memory of the SWIVe task, there are a few other details Desktop Hacker holds. The only directly readable one is the environment variable dHacker$Obey$Dir, which holds what Obey$Dir held when the hot-keys were pressed.

WIMP messages

Message_HackerTask
Message &82740
Purpose

This message is broadcast by SWIVe to inform Desktop Hacker and any external tasks of a hacking session starting/ending. No parameters are passed using the message; external tasks should call the SWI DesktopHacker_ReadState to find out the current state.

SWIVe sends this message when:

  1. The hotkeys have been pressed (or dHacker has been activated by a hackpoint) and the task is initialising.
  2. SWIVe has been told to continue by Desktop Hacker, or an external task, and the task is ending.
  3. SWIVe has been told to quit by Desktop Hacker, an external task, or the Task Manager, and the task is ending.
  4. SWIVe has been told to load a game file; this has been done successfully, and a completely new game position is established.
Message_HackerContinue
Message &82741
Purpose
This message is sent by Desktop Hacker, or any other task, to tell the SWIVe code to restart the stopped program. No parameters are passed.
Message_HackerGameFile
Message &82742
Purpose
This message is sent by Desktop Hacker, or any other task, to tell the SWIVe code to load in the game file whose path is specified.
Format
+12 = 0 (this is never a reply)
+16 = &82742 (Message_HackerGameFile)
+20 = unused
+24 = unused
+28 = unused
+32 = unused
+36 = unused
+40 = unused
+44 = null-terminated filename of game file to load
Message_HackerAltered
Message &82743
Purpose

This message is broadcast by Desktop Hacker whenever the memory of the stopped task has been altered, either by the user, or by certain DesktopHacker_MemoryAccess calls. External tasks that display details in a window that depend on the contents of the stopped game's application memory should rescan and redraw where necessary when this message is received. No parameters are passed.

Note that this message is not broadcast when a game file is loaded which changes the application memory contents completely; instead the SWIVe code broadcasts Message_HackerTask.

SWIs

DesktopHacker_ReadState
SWI &82740
Purpose
This SWI allows external tasks to read information about Desktop Hacker which may be needed to perform their function.
On entry
-
On exit
R0 = 0 if Desktop Hacker is idling or running a single-tasking task
R0 = 1 if Desktop Hacker is running a task that's called Wimp_Init
R0 = 2 if Desktop Hacker has interrupted a task
R1 = task handle of hacked task if R0=1 or 2, else preserved
Use

If your task requires the application memory of a hacked game, you should only allow use of the task when R0=2.

Note that the task specified in R1 does not have the same in it when stopped as when it is running. See the format of saved game files for details of what is in the application area when stopped.

If you just want to access the main application area, though, and not the full info bundles, you should use the SWI DesktopHacker_MemoryAccess.

If you do access Desktop Hacker or its game's WimpSlot directly using Wimp_TransferBlock, be aware that there is a bug in RISC OS 3.7's implementation of the SWI affecting use of the call twice or more in a row between code synchronisations. To combat this, you should call OS_SynchroniseCodeAreas once after each call to Wimp_TransferBlock. Failure to do so on a machine equipped with RISC OS 3.7 but not equipped with the patches produced by Acorn or DoggySoft will result in things going wrong in inexplicable ways - you have been warned.

DesktopHacker_MemoryAccess
SWI &82741
Purpose

This SWI loads and stores data to and from the game's WimpSlot. You should always use this SWI to access the game's application memory, rather than using Wimp_TransferBlock, as (a) this SWI automatically re-maps the word at &8000, and (b) it uses a cache in RMA to make access much quicker (Wimp_TransferBlock is very, very slow). At present, the cache is 8K long. If you do alter the game using Wimp_TransferBlock, you must call DesktopHacker_MemoryAccess 4 to invalidate the cache, or other users of the cache may not like it.

Note, if you're searching through memory, you will find it is much quicker to search forwards rather than backwards, due to the rather simplistic cache algorithm. Only read-cacheing is performed, not write-buffering.

No DesktopHacker_MemoryAccess operation may be used when the game is not being hacked (R0 on exit from DesktopHacker_ReadState is not 2).

On entry
R0 = reason code
other registers dependent on reason code
On exit
dependent on reason code

DesktopHacker_MemoryAccess 0

Purpose
Load one word
On entry
R0 = 0 (reason code)
R1 = address
On exit
R0=value
R1 preserved

DesktopHacker_MemoryAccess 1

Purpose
Store one word
On entry
R0 = 1 (reason code)
R1 = address
R2 = value
On exit
R0 corrupted
R1, R2 preserved

DesktopHacker_MemoryAccess 2

Purpose
Load block
On entry
R0 = 2 (reason code)
R1 = start address (game)
R2 = length
R3 = buffer (in your memory)
On exit
R0-R3 preserved

DesktopHacker_MemoryAccess 3

Purpose
Store block
On entry
R0 = 3 (reason code)
R1 = start address (game)
R2 = length
R3 = buffer (in your memory)
R4 = your task handle, or -1 if in unpaged memory such as RMA
On exit
R0-R4 preserved
Use
Note that the buffer must be paged in when the SWI is used, despite the fact that you pass the task handle. The task handle is needed by Wimp_TransferBlock for efficient transfer.

DesktopHacker_MemoryAccess 4

Purpose
Invalidate cache
On entry
R0 = 4 (reason code)
On exit
R0 preserved
Use
Under Desktop Hacker 1.05 or later, invalidating the cache also ensures that its contents are zeroed. This is to make sure that programs like dHMusic don't find portions of the game's memory in the RMA and generate false alarms.

DesktopHacker_MemoryAccess 5

Purpose
Find length of game
On entry
R0 = 5 (reason code)
On exit
R0 = length of game's real WimpSlot in bytes
Errors
MemoryAccess cannot be used as no game is hacking (&82760)
Bad DesktopHacker_MemoryAccess address (&8275F)
Unknown DesktopHacker_MemoryAccess reason code (&82750)
Plus any errors returned by Wimp_TransferBlock
DesktopHacker_ReadList
SWI &82742
On entry
R0 = list number
On exit
R0 = Desktop Hacker's task handle
R1 = pointer to list block
R2 = length of list block
Use

On exit R1 points to a list (see format of list files), the only difference being that the first four bytes are an offset to the first byte after the end of the list, rather than the header "List".

Note that the pointer is in Desktop Hacker's application space. If you want to read the contents of the list you will need to use Wimp_TransferBlock with the R0 and R1 supplied by this SWI, and the length of block to transfer as R2.

There is no SWI provided to alter lists - doing so would be very slow as very many calls to Wimp_TransferBlock would be needed, along, perhaps, with resizing of the WimpSlot which is not possible as Desktop Hacker is not paged in. If you do want to send a list to Desktop Hacker, simply use the data transfer protocol - make up a Wimp message block as if a list file was dragged to Desktop Hacker (use the icon bar (-2) as the destination window handle; the destination icon handle is unimportant), using Message_DataSave. Data transfer will be conducted as normal, and the window containing the list will be opened. Note that Desktop Hacker does not support RAMTransfer.

Errors
Invalid list number (&8275E)
Any errors returned by Wimp_TransferBlock
DesktopHacker_BreakPoint
SWI &82743
On entry
-
On exit
Registers preserved
Use

This SWI sets a flag which tells Desktop Hacker to interrupt as soon as possible. Usually, this will be immediately, but it may be called later if IRQs or FIQs are disabled, or the processor is in IRQ or FIQ mode. Of course it will also only interrupt if you are the current hacking task.

In order to get all the registers for the Game Info window, not just R0-R8, this SWI is trapped in the SWIVe code; the actual SWI command code does nothing. You will not receive an error if the situation isn't suitable for a breakpoint. Instead, just the SWI command code is called, and so nothing will happen.

This SWI is only implemented on Desktop Hacker 1.06 and above.

* commands

*DesktopHacker command
Purpose
Start a new task or game file to be hacked
Use

This command is used by Desktop Hacker when a game is dragged to it. It cannot be used from the command line. However, there is no reason why external tasks should not use it, if they need to. It should only be used by being passed to Wimp_StartTask, and to be sure of compatibility with special fields, you should surround the parameter of a Run command (if that's what you're using) with quotes. For example, for BASIC:

SYS "Wimp_StartTask","DesktopHacker Run ""CFS#adfs::HD.$.File"""

*Desktop_Hacker
Purpose
This is just the command used to start the Desktop Hacker Wimp task, as is needed by module tasks. Don't use it.
*SetHackPoint *ClearHackPoint *ListHackPoints

5.2 Format of game files and list files.

New GamePos files are typed &3F7. Old files are typed &0D0 and will not be accepted by newer versions of Desktop Hacker. However, their contents are compatible, so old GamePos files may be converted simply by re-typing them.

GamePos files are (optionally compressed) copies of what's inside a stopped game's application memory whilst being hacked, with the following small header. The contents of a stopped game's application memory follow.

Position Length Contents
0 4 "Game"
4 4

Version ID string - currently 'D100' or 'D101'

D means Desktop Hacker (the creator). dHacker only loads 'D's. Extra data is added to the end of the file only, so dHacker can load files from later versions, and later versions will detect the bundle terminator, and know to stop. Any changes to bundle format can be controlled by taking note of the version number.

8 4 Compression ID string. 'None' for no compression, or 'Sqsh' for compression using RISC OS 3's Squash module. Other compression types may be defined. The error 'Unknown compression type' will appear with other types.
12 0 or 4 On compressed files only - length of following decompressed data.

There then follows (at 12 or 16) the data. When decompressed, it is exactly the same as what is stored from &8000 in a stopped game. There is a BASIC routine to decompress a game file with compression method 'Sqsh' in !GameInfo.!RunImage, look for 'Squash_Decompress' to find it.

Squashed game files are only supported by Desktop Hacker version 1.06 and later, and dHInfo version 1.04 and later.

Files with version ID 'D101' are only understood by Desktop Hacker 1.07 and later. They are only produced when the 'Don't keep screen memory' option has been switched on.

From &8000 upwards, the data is stored in bundles of:

Position Length Contents
+0 4 Offset to next bundle
+4 offset-4 Data
+offset ... Next bundle

The order of bundles is important. A null data length (ie. offset of 4) may be used. An offset of 0 terminates the list of bundles, and is the last word in the file.

Order of bundles defined so far under IDs 'D100' and 'D101':

  1. The game code itself. Since this starts in memory at &8004 (thanks to the bundle header), the word at &8000 is at the very end of the block, and all the memory from &8004 comes first in the block. This avoids major memory shunting. If data length 0, zero WimpSlot is used. This bundle must exist, even if with a data length of 0.
  2. Registers bundle. R0 to PC, all USR mode. This bundle must exist, and have a data length of 64 (16 words). A bundle terminator may occur at any bundle after this.
  3. FP registers bundle. Unlike the normal registers, this bundle may have a data length of 0, and indeed will if the machine the game was stopped on had no FP hardware and no FPEmulator loaded. If this bundle does have a non-null data area, it must be 64 bytes long. F0-F7 are stored in double precision (D) format. Some accuracy is lost in the 64-bit D format. This is likely to be insignificant. (E and EP formats cannot be used due to inter-FP system incompatibility.)
  4. Mode definition bundle. A data length of 0 means screen unimportant. A data length of 4 means it's a standard RISC OS 2/3.0/3.1 mode number. A data length of more than 4 can only be handled by RISC OS 3.5, and is a mode selector block. Position files saved out from RISC OS 3.5 with a mode selector rather than a mode number cannot be read under RISC OS 2 to 3.1. Desktop Hacker in itself fully supports the new mode and sprite formats. Note, if the mode is in old format, it may well be a shadow variant, so clear the seventh bit before using it where shadow modes are inappropriate, eg. sprites.
  5. Screen memory contents bundle. Screen memory must be a fixed number of pages. Transfer from a machine with a small page size to one with a bigger page size may cause problems (the screen appearing too far up, and flickering, generally) if the page boundaries where the screen starts don't coincide.

    Under files of ID "D101" or greater, a data length of 4 has a special meaning (as 4 bytes screen memory seems a tad unlikely!): the one word in such a bundle if the length of screen memory. The actual contents of screen memory in this case are not stored, to save memory on machines that are short on RAM.

  6. Miscellaneous info bundle.

    Position Length Contents
    +0 4 Mouse shape number and linkage flag (as from OS_Byte 106)
    +4 4 Mouse X co-ordinate
    +8 4 Mouse Y co-ordinate
    +12 4

    Flags

    bits 0-29 as from OS_Byte 200 (Escape/Break state)
    bit 30 set if mouse bbox is full-screen, else infinite
    bit 31 as from OS_Byte 229

    +16 4 Keyboard disable state (as from OS_Byte 201)
    +20 4 Escape key number (as from OS_Byte 220)
    +24 4 MonotonicTime when game was interrupted
    +28 4 Key initial delay (OS_Byte 11) when game interrupted
    +32 4 Key repeat delay (OS_Byte 12) when game interrupted

    Further data may be added to this bundle in future. Under Desktop Hacker 1.00, bit 30 of flags (+12) will always be unset. It is impractical to read mouse bboxes directly, more accurately than full- screen/infinite as there is no SWI to do this. However, Future versions of Desktop Hacker may trap the OS_Word calls that set the mouse bbox, and save the bbox, which would allow this. In this case, bit 30 will again become reserved, a new bundle will be added, and the version ID will be increased to D102.

  7. Screen info bundle. (If only screen context save areas were more flexible, I could just use them, but no...)

    Position Length Contents
    +0 4 Text foreground colour (*)
    +4 4 Text background colour (*)
    +8 4 Text foreground tint
    +12 4 Text background tint
    +16 4 Graphics foreground colour
    +20 4 Graphics backgound colour
    +24 4 Graphics foreground tint
    +28 4 Graphics background tint
    +32 4 Graphics foreground action
    +36 4 Graphics background action
    +40 4 Text window left
    +44 4 Text window bottom
    +48 4 Text window right
    +52 4 Text window top
    +56 4 Graphics origin X
    +60 4 Graphics origin Y
    +64 4 Graphics cursor X
    +68 4 Graphics cursor Y
    +72 4 Text cursor X
    +76 4 Text cursor Y
    +80 4 VDU status register
    +84 4 ScreenStart offset
    +88 4 DisplayStart offset
    +92 4 Screen bank (**)
    +96 4 Display bank (**)
    +100 4 Border colour word (ReadPalette)
    +104 4 Mouse colour 1 word (ReadPalette)
    +108 4 Mouse colour 2 word (ReadPalette)
    +112 4 Mouse colour 3 word (ReadPalette)

    Further data may be added to this bundle in future.

    (*) These values are not accurate in any mode with >16 colours, so you'll notice changing text colours in Desktop Hacker sometimes. This is not my fault - OS_ReadVduVariables simply doesn't return the correct values sometimes!

    (**) The default screen bank (0) in this position is not allowed - you will have to work out the real screen bank number from the shadowness of the mode, if the game has specified a default bank.

  8. Palette bundle, only in <16bpp modes. Data length always zero in 16/32 bpp modes. Data length is 256 double words in all 8bpp modes. List of double words (flash1, flash2) in OS_ReadPalette format, starting from the maximum colour, and going down to colour 0; ie. in reverse order. Don't ask why; it's just like that, and not worth changing now.
  9. Vector bundle. The data area contains a block of vectors as returned by OS_DelinkApplication.
  10. Device vector bundle. This data area contains 12-byte blocks as for the vector bundle, but for device vectors (interrupts). Types 8 and 13 (used by expansion cards) need extra registers, and are ignored - Desktop Hacker shouldn't touch expansion cards anyway.
  11. CallEvery ticker events bundle. Each ticker event has three words. The first is the interval, the second the address, the third the workspace.
  12. CallAfter ticker events bundle. Each ticker event has three words. The first is the monotonic time (as seen by the application) at which to interrupt, the second the address, the third the workspace.
  13. Module chain bundle. Each word is a pointer to a module in application space. This is to prevent games' modules in application space being called when the game is not paged in. However, the only way Desktop Hacker can delink these modules is by killing them and re-initialising them when returning (with OS_Module 10). This is not at all satisfactory (music modules may, for example, go silent), but it's all that can be done. Modules inserted in RMA are disabled by having their service and SWI decode entry points poked to 0.

Further bundles may be added in future. The Version ID will only be increased when the internal format of existing bundles changes, as old versions will refuse to load newer IDs. Bundles marked 'further data...' may be extended without increasing the version ID, so be prepared for them being longer than documented here - always use the bundle length header word to get the length.

5.3. Format of list files

Position Length Contents
0 4 ID String 'List'
4 4 Number of items in list
8 4 Base of file (always &8000 under dHacker)
12 20 Zero terminated info text (always 'Created by dHacker[00][00]' under Desktop Hacker)
32 4n List of addresses, offset from base. (-ve allowed.)

Info text can be used to specify the type of search that produced the list, or the list creator program.

The file type for address lists is &B6E and is titled 'AddrList'. Lists produced by versions of Desktop Hacker earlier than 1.06 have the file type &0D1, and will not be recognised by newer versions. The file contents, however, are compatible, so you can convert an old list to a new list simply by re-typing it.

5.4. Internationalisation.

Desktop Hacker may be altered to work in another language. If more than one language is available, the language may be picked from the Choices window. Currently available languages are English (UK) and German (D). To make a new language, shift-double-click on !dHacker and copy the 'UK' directory with the name of the new language.

The language directory contains a Messages file and a Templates file. The Messages file is self-explanatory, but in the Templates file Desktop Hacker uses its own system of 3D borders, which you will not be able to see in a template editor. However, they have a similar numbering system to the WimpExt and Interface modules, so if you have an editor that supports either of these modules you'll be able to see them if you alter all '�bnumber' validation commands to 'wnumber' for WimpExt, or 'bnumber' for Interface.

The borders are not quite the same, especially as their look can be configured; 0-6 are the same as WimpExt (6 being a new-style group title), and 7 is a version of 0 that can also be slabbed in by pressing Menu (for menu arrows). Remember to change the validation commands back to '�bnumber' once you have finished!

Desktop Hacker supports some other validation commands, again prefixed with '�'. You shouldn't need to tamper with these when translating templates to other languages, but for the record they are:

�r[-]offset
When Return is pressed with the caret in this icon, the icon offset away from the icon number is 'pressed'. The offset system is used rather than absolute icon number so that icon groups can easily be copied, moved, and renumbered.
�e[-]offset
Same as �r, but for the Escape key, to allow persistent dialogue boxes to be closed by pressing Escape, as the Style Guide rightly says, but everyone ignores. Pressing Escape should 'click' the Cancel icon.
�u[-]offset
When the up-arrow key, or Shift-Tab is pressed with the caret in this icon, the caret moves to icon number current icon-offset. (Yes, it's -ve. So if you specify a -ve number, the real offset used will be +ve. This is done because normally pressing up arrow moves to lesser-numbered icons.)
�d[-]offset

When the down-arrow key, or Tab is pressed with the caret in this icon, the caret moves to icon number current icon+offset.

Note that �r, �e, �u, and �d do the same thing with icons affected: If they're writable, the caret will be moved to the icon, if they are option icons, they are selected (deselecting others in the ESG), and otherwise a Mouse_Click event is generated for the icon (possibly making it pop in too).

Note that the validations �r, �e, �u and �d may be used more than once in the same validation, as long as all except the last one select icons rather than position the caret or click icons. For example, the Compare window sets two options and then clicks Compare when Return is pressed in any of the bottom three fields.

�s
When this button is clicked upon, it slabs by being selected. This is useful to give odd-shaped slabbing sprites, like up and down arrows.
�-
When this button is clicked upon, the number in the icon after it is increased by one.
�+
When this button is clicked upon, the number in the icon before it is decreased by one. (Excuse the perverse naming of these two validations!)

You must keep the red 'help' icons in the right place, but you will find that you have to move them around in order to get at the icons beneath them. The help_icon system works by checking each help icon and seeing whether the pointer lies under it. If it does, the icon's message (translated from the token in the red help_icon) is sent to !Help. This is not hierarchical - it is always the first match that is copied. So if icon areas overlap, it is the lowest numbered icon's message that is used.

The only window sizes that are fixed are:

Disser Must retain its current width
DisserLink Must retain its current size
ListLink Must retain its current size
XferSend Must retain its current height and icon vertical positions
Print Must retain its current height and icon vertical positions
ProgInfo Must retain its current width and icon horizontal positions

All other window dimensions and icon positions may be altered, for example to accommodate any larger icons. If you do make any bits of window bigger, remember to move the help icons over them! Oh, and remember when you alter icons that the fonts may eventually be bigger than those you're using so leave lots of space in the icons.

If you drag Desktop Hacker's Sprites file to your template editor, you notice you can't actually see the icons. This is because Desktop Hacker processes the sprite names in the file to allow the icons to change on a mode change. To see the icons properly, make a copy of sprite file, and rename all sprites called '22_name' (for VGA-res) or '24_name' (for TV-res) to 'name>'. Then drag this new file into the template editor.

Leave all icons deselected. On startup, Desktop Hacker sets the default option and radio icons itself. Setting any others may mess it up. Also, leave all writable icons empty save for list selectors, the slowdown selector, and the print_copies selector, which should have the default (1) in them. All writable icons must be indirected.

5.5. History of Desktop Hacker.

Name Version Description
The Hacker 0.01 (alpha) Stops at any time to execute * commands.
The Hacker 1.00 Features a single list that can be used in word, byte and string searches; also Kill game.
The Hacker 1.01 (beta) Bug fixes.
The Hacker 1.02 (alpha) Printer spooling options added.
The Hacker 1.03 Alter features added. First release. Summer 1992.
The Hacker 2.00 (beta) Disassembler added.
The Hacker 2.01 Bug fixes.
The Hacker 2.02 Filing features added.
The Hacker 3.00 (beta) First version with a GUI. Released at the BAU show 1992. Had hardly any features.
The Hacker 3.01 (alpha) Now uses callback handler. Most features present.
The Hacker 3.02 First commercial release, January 1993. Bug fixes; desktop interface task added. The Hacker itself changed into a utility file from a module.
The Hacker 3.03 Bug fixes; SWI window extended.
The Hacker 3.04 Bug fixes; graphical changes; Ctrl-Alt added for A4.
The Hacker 3.05 Bug fixes; pointer changes added for clarity.
The Hacker 3.06 New entire saved position file format.
The Hacker 3.07 Very minor release, before new bug in CheatMod spotted. Interactive help added to desktop interface.
The Hacker 3.08 Code-around through Software 42's anti-Hacker routines; DeviceVector delinking.
The Hacker 3.09 Bug fixes; graphical changes; at last the flickering screen is gone!
The Hacker 3.09i Internationalisable release; graphical changes.
The Hacker 3.10i The icon is improved at last! New Savings... entry, Options renamed to Choices.
Desktop Hacker 0.01 (alpha) Testing version using CallBacks instead of the SWI hardware vector.
Desktop Hacker 1.00 Acorn Action demo version. Never released as a full version.
Desktop Hacker 1.01 Mouse limits added. Many minor additions. System workspace bug fixed.
Desktop Hacker 1.02 Modules inserted from application space are now delinked over hacking. New game filetype used. Two-letter mnemonic search bug fixed. Wildcard bug fixed. Minor changes to windows. Savebox bug fixed. Sprite-not-found bug fixed.
Desktop Hacker 1.03 Error window bugs fixed. SWIVe26 appmodule delinking bug fixed. Save menu click/hot-key bug fixed.
Desktop Hacker 1.04 One-byte MemoryAccess block transfer bug fixed. FP CDP bit 15 bug fixed. Source=destination search bug fixed.
Desktop Hacker 1.05 Info version number font fixed. Info/Error windows WimpPatch-aware. Cache now zeroed when invalidated. (So things like dHMusic don't find parts of other memory lurking in the RMA.)
Desktop Hacker 1.06 First major upgrade. HackPoint *commands added for SWI, SWIGroup, and Delay. BreakPoint SWI implemented. Memory reserving allowed. Desktop redrawn on continue. Squashed game files now supported. Forking added, so that you don't end up hacking the WIMP front end instead of the game itself. A few minor bugs fixed. Desktop Hacker 1.07 dr Fixed R9 corruption on forking bug. Added 'Don't keep screen memory' option for machines with little RAM.
Desktop Hacker 1.08 Changed * command slightly to make it work with games that check the command used to run themselves (Empire Soccer), and added 'speed up'.
Desktop Hacker 1.09 (beta) Abortive attempt to add the assembler and further delink modules.
Desktop Hacker 1.10 Fixed for StrongARM/RISC OS 3.7. (Actually, coded around Acorn's bugs in Wimp_TransferBlock would be a more accurate description.) Made to understand OS_CallASWI and OS_CallASWIR12 so you can trap SWIs called via this method. Disassembler updated to include the new ARMv4 architecture SWIs LDR/STRH, LDRS[B/H], BX. MSR commands now disassembled to ARMv4 standard mnemonics.
Desktop Hacker 1.11 Oops, I forgot to add the MULL instructions to the disassembler. Desktop Hacker now supports all ARMv4 architecture instructions, including (S/U)(MUL/MLA)L.
Desktop Hacker 1.12 Fixed bug in disassembly of some undefined instructions.
Desktop Hacker 1.20 RISC User release, probably the final one. Fixed some minor bugs, added the re-assembly feature, finally got around to rewriting the manual and making it available in HTML.

Foundation RISCWorld

 Index