QUICK DISASSEMBLER

Ata Atun

 

Abstract

When I started to learn Machine Code, I desperately needed a DISASSEMBLER to investigate and study the Machine Code Programs written by the Advanced ATARI users. The only Disassembler program I could find, wasn't a very helpful and detailing one, but I had to manage with it till I reached a certain knowledge level. I then felt I had to design a better and more detailing program, and now I believe that the DISASSEMBLER program below is a very good one for Machine Code beginners and advanced programmers. It is fast and can detail Addressing Modes, and can address the backward and forward branches.

Before running the Program please save it to Disk as "D:DIS.ASM" or to cassette and then RUN it.

Structure of Disassembler Program

A)

Strings and Variables

M$

DIMensioned (1024) originating from 255 possibilities in a 6502 Machine Code System Byte. (255*4+4=1024) Adding 4 to multiplication 255*4, is the last 4 locations of 255th place.

LCT$

DIMensioned (256) based on same reason explained above. Since 0th place can not be called in a String, for 255 possibilities LCT$ is DIMensioned to 256 places to be used as LCT$(1,256) instead of LCT$(0,255).

TR$

Transfer String to be used in specific location transfer from M$.

LOC1

Content of Main ADDRESS, 1st location.

LOC2

Content of 2nd location.

LOC3

Content of 3rd location.

LOC4

Used in Branches. Backward branching.

LOC5

Used in Branches. Forward branching.

ADRS

Main Address with MNEmonic.

B)

Contents of Strings

M$

Consisted of 255 main MNEmonics, each 4 locations long. First 3 locations hold the Mnemonic. 4th location classifies the Mnemonic.

"#" Immediate
" " (Void) Absolute or Zero Page

"a" Absolute or Zero Page
"b" Absolute,Y
"c" (indirect,X)
"d" (Indirect),Y

LCT$

Total of 256 codes that classifies each Addressing mode in detail, separates Absolute and Zero Page, branching Mnemonics, Implied and Relative addresses.

"1" 1 byte long, Implied or Relative
"2" 2 bytes long, Zero Page
"3" 3 bytes long, Absolute.
"4" Branchers, 1 byte long, Relative.
"5" No MNEmonic, 1 byte long.
"6" JMP (Arg), Implied, 1 byte long, location 108 only.

Combination of M$ and LCT$ specifies Addressing Mode very clearly. For example: Void " " in 4th place of M$ with 2 code in LCT$, specifies a ZERO PAGE, 2 BYTE LONG ADDRESSING MODE.

How The Program Flows

Up to 130

DIMensioning, Opening a Channel and text Graphic plus screen and border colour.

GOSUB 800

This section holds M$ and LCT$. I could keep these values in DATA and use READ-DATA-POKE combination but this routine is boring when you hurry for a quick start

130-200

Head line, start Address, End Address and check address.

200-210

Start of 20 line per screen Disassembling.

220-280

Content of ADRS. Locates exact place in M$. Get the 4 place long string. Get the classifying Code from LCT$ string, exactly the same location. Print address and content of Address.

290

According to the value of TR, GOTO to the matching section.

400-450

1 byte long Mode section. Determines the exact Addressing Mode, Implied or BRK-Implied

450-500

2 byte long Mode section. Determines Zero Page or Absolute.

500-550

3 byte long Mode Section. Determines Absolute or Absolute,X.

550-600

Branching Modes only. Determines forward branch or Backward branch.

600-650

1 byte long but No MNEmonics, abbreviated as "? " in M$ string.

650-700

JMP(Arg), Implied Mode only, which is a special jump.

700-760

Final check and request to continue. If END of address reached, stops the execution.

1000

Gosub section for Determining very quickly the Addressing Modes.

 

 

        

QUICK DISASSEMBLER

Ata Atun