dissi



dissi window


Dissi only shows sensible data that was LOADED from a file, dissi does NOT read data from the emulator, all addresses not loaded are marked as "unkown" and contain for the purpose of dissi only a "0" (null). That means it is not possible to look at RAM or IO locations and per default these are hidden from view!

Disassembly in general

If no help is given (in form of information, see below) dissi tries to disassemble the given file as follows:

Debugging using dissi

Using vide there will only be one "instance" of dissi and its children be available - usually that will be "enough". In the seldom cases when it might be usefull [debugging link cable connected vectri] to debug two vecxi instances at the same time (in opposite to the non usefull cases, where the user just wants to play around) you can switch dissi from one vecxi to another vecxi by pressing the bug_go.png button on the vecxi instance. Pressing that button ensures that dissi is connected to THAT vecxi instance. Pressing the button also clears all breakpoints (only if dissi realy was connected to a different vecxi instance), after all - where should the debugging be done for a breakpoint - if there is no dissi anymore...

Buttons

For dissi and its "children" you can often find the following icon in the uper left corner:

webcam.png  always update
(that is a "switch" button!) which means the contents of this window will be updated "always". This mainly refers to when not in debug mode. The term "always" is a bit misleading. Always here means after each "emulator call". This does not mean "after each emulated instruction". The later is only true, when in single step or continuous mode. When the emulator is in "play" mode, each emulator call approximately emulates 30000 cycles worth of instructions.

Following buttons are available for dissi:

The table...

The main part of "dissi" is occupied by a "memory" table. Each line represents one memory location of your vectrex. Per default unkown locations are hidden. Addresses which are "part of other" addresses are also per default hidden (both can be viewed toggling the two checkboxes in the upper right area).

It is worth mentioning, that if a dumpi window is displayed, and on dumpi the switches "data display" and "active" are activated, that each selection in dissi is also taken as selection in dumpi. This way you can select regions (vectorlists or bitmap data) also in dissi and use dumpi as a "preview" window for the selected data!

The columns of the table are more or less self explainatory, here some more information:

Popup-Menu



popup window


Selecting rows in dissi enables you to change the "display" of the data on the fly. Right clicking opens a popup. Selecting the menuitems applies the selected entry to the currently selected rows (and their represented addresses). Following options are provided:

Keyboard shortcuts

There are not many yet - dissi is still in development:

Below the table

(This is not finished yet) Below the main table is a split panel, which again consists of two entities.

  1. a "message" board, which at some stage might give you some feedback of what you are doing

  2. a commandline where you can enter dissi commands without getting dizzy from all the mouse movements (although, this is a part which is not complete yet).

Dissi commands



dissi commands


(as you see, these were commands that I at some stage needed while hacking VIDE together :-))

You can enter simple "expression" and use the cli as a small calculator. Conversion between decimal, binary and hex is also supported.

Note:
Using the CLI you are able to set breakpoint otherwise not accessable.

Searching

On the bottom of dissi is a search field. Searches covers all kinds of labels and commentary

Searching in operands

Entering any text will hightlight the operand cells, that contain a match.

Hey dissi...

In order to satisfy old debugging habbits (of doing a "System.out.println(...)" or a Console.writeln("...") or whatever) - I implemented a "hey dissi" routine.

In short, you can tell your source code to output information to the dissi message board. Everything works in form of comments. How comments are entered - see below (CNT, LST or ASSI, which of these is of no importance, as long as dissy knows the comments, when a vectrex program is executed).

As of now there are only a couple of commands implemented, but if needs arise I can improvise and supply more :-).

The comment syntax is quite easy, dissi parses all comments and if it finds the keywords:
      hey dissi
It knows that you are talking to it. Dissi than takes the string it finds after "hey dissi" which is expected to be in quotes and tries to interprete it as commands.
Dissi as of now only knows the following commands:

Example 1:

            

; hey dissi "print I am great"

Will output

"I am great"

Whenever this line is passed in emulation. The emulation is not stopped, only the string is printed.

Example 2:

            

; hey dissi "print value of $c9b5"

Will output

"value of $c9b5 = $89"

(in case the memory location of $c95b equals $89 at the time)

Example 3:

            

; hey dissi "print value of $loop"

Will output

"value of loop = $01"

(in case the memory location of the label "loop" equals $01 at the time)

In short:

Note:
The parameters must be seperated by whitespaces from each other. E.g. a "print Joystick=$Vec Joy 1 X" does at the moment not work, there must be spaces befor/after the variable.

Note:
As of yet you can not ouput 16 bit values, if you want to do so you must output 2 eight bit values and use your brain.

Registers
You can also print registers, to do so, write a "#" befor the register.
Example:

            

; hey dissi "print #a #b #x"

Example 4:

            

; hey dissi "break"


Will simply add a breakpoint to that line. Program execution will be halted.

One can also add an additional parameter "once" - to configure dissi to only use the breakpoint once.

Example 5:

            

; hey dissi "watch RecalCounter"

Adds a watch to a variable called "RecalCounter", per default the locations watched are watched as "bytes".

An additional type parameter can be given after the variable (or memory address):

The watch parameter can be places ANYWHERE in the source code.

Supply dissi with information

There are three (plus one) ways to supply dissy with information.

  1. if you happen to use as09 from: Copyright 1990-..., Frank A. Vorstenbosch, Kingswood Software.
    You can use the "LST" files that this assembler generates. If the "LST" file is in the same directory as the rom file, it will be loaded automatically.

  2. Compile your source file with assi in VIDE.

  3. edit dissi (and save the edited entries)

  4. Supply a "CNT" file, if the "CNT" file is in the same directory as the rom, it will be loaded automatically.

CNT-Files

You can create CNT files manually, but you will usually do is either:

  1. assemble a source code with assi - than an cnt file is generated automatically

  2. comment a "bin" cartridge in dissi - and save your comments - saving "knowledge" in dissi alays saves to a cnt file

Saving is always done to the same directory the binary file was loaded from. In opposition to that cnt files are loaded in the following manner:

A CNT file is a description file for a rom. There are a handfull of entries you can provide. If done with enough endurance and research you can supply a whealth of information. Following entries are possible:

START BANK x / END BANK x
All entries between those tags are only relevant for the given bank. The same CNT file can be used for different banks, but all information not belonging to the corresponding bank are ignored.
If no start or end is given, all information are considered to be relevant for bank 0.
After an END BANK x the default switches back to bank 0.
(Not parsable numbers/characters are treated also as bank 0)

END BANK x

EQU
Defines a "constant".
Example:

        EQU    VECTOR_LENGTH    0x10
        EQU    LENGTH_TIME           $A0
        EQU    LENGTH_POS_X       20

LABEL
Defines a "label".
Example:

        LABEL    $F192    Wait_Recal

DIRECT_LABEL
Defines a "label" for DP addressing, with this option you can assign different names to same values and have dissi enabled to discern the two.
Example:

        DIRECT_LABEL    $D0    $00    ORB
        DIRECT_LABEL    $D0    $01    ORA
        DIRECT_LABEL    $C9    $00    Ship_counter

FORCE_SYMBOL
At the given line dissi should use the following symbol in disassembly. (only makes sense if there are different labels with the same definition to chose from) (if there is no fitting symbol (value related) this is ignored). Example:

        FORCE_SYMBOL    $2622    ship counter

FORCE_NO_SYMBOL
At the given line dissi should not use any symbol (but a number instead). Example:

        FORCE_NO_SYMBOL    $2625    

COMMENT_LINE
Adds a complete line of commentary befor the given address.
Example:

        COMMENT_LINE    $0020    From here on, the wonderfull vectrex program will do ...

COMMENT
Adds a comment to the end of the instruction (group) beginning at the address.
Example:

        COMMENT    $0022    Plus 1 here because the ship exploded yesterday ...

COMMENT_LABEL
Adds a comment to a label (this is mainly interesting for labels in RAM).
Example:

        COMMENT_LABEL    $C89F    Amount of shrimps the player has eaten ...

RANGES
The range keyword has several subdivisions, which all work alike.
First the examples, than a quick explaination.
Example:

        RANGE        $17 -     $28     CHAR_DATA
        RANGE    $1917 - $1943     DB_DATA
        RANGE    $1913 - $1917     BIN_DATA
        RANGE    $1913 - $1917     DW_DATA
        RANGE    $2913 - $2917     DWP_DATA
        RANGE    $1943 - $3499     CODE
        RANGE    $1B2D - $5255    DP $D0

Essentially tell dissi what kind of data/code it has to expect. The example shows all six different type of ranges currently implemented.
CHAR_DATA
Are Vectrex "ASCII" chars, usually terminated by a $80.

DB_DATA
Byte data.

BIN_DATA
Byte data as binary.

DW_DATA
Word data.

DWP_DATA
Word pointer data.

CODE
Code, here dissi should be put to work!

DP
Tell dissi to expect DP to be set to the following value.

The first four of those ranges can have an additional value added. A number describing the maximal group length. If supplied, dissi tries to group the data found in the range into groups with that length.
Example:

        RANGE    $1917 - $1943     DB_DATA 5

Will group data into "packages" of five:

        DB $10, $ff, $03, $06, $0c
        DB $10, $ff, $18, $0c, $08
        DB $10, $ff, $01, $02, $02

Watches



Watches


Watches are "quick" views right inside the dissi window of certain memory locations. Watches can be defined via command line (see help there), as "hey dissi" commands (see there) or via a popup menu. The value of the "operand" is determined (if possible) and used as the watch memory location.

Clicking on the watch itself displays another popup with which the watch can be removed.

cdissi

In order to test the assembler, I wrote a special version of dissi, → cdissi (compare dissi).



compare dissi


CDissi only makes sense if you have two nearly identical binary images.
You can load both of them and have them displayed side by side.

Both lists are in sync, and can not be unsynced.

"Rows" in dissi are compared address wise. All that are equal have white background, all that are different are red.

Below the table you can enter a start and an end address for a CRC generation for both loaded files.

Note:
Format (byte, word, char, code) of the output is respected, so the same data as word and byte shows as a difference.
On both tables you do have the popup-menu to cast the data to anything you like.