module: disasm author: Jon Thackray Copyright: Original Code is Copyright (c) 1995-2004 Functional Objects, Inc. All rights reserved. License: Functional Objects Library Public License Version 1.0 Dual-license: GNU Lesser General Public License Warranty: Distributed WITHOUT WARRANTY OF ANY KIND // A disassembler for i386, i486 and i586 code define macro concrete-class-definer { define concrete-class ?:name (?supers:*) ?slot-body:* end } => { define sealed class ?name (?supers) ?slot-body end class ?name; define sealed domain make (singleton(?name)); define sealed domain initialize (?name) } supers: { } => { } { ?name1:name, ... } => { ?name1, ... } end macro concrete-class-definer; define constant $empty-vector = #[]; // define constant $empty-byte-vector = as(, #[]); define constant = ; define constant = ; // First some classes to handle externals define abstract class () end class ; define concrete class () end class ; define constant $no-external = make(); define abstract class () constant slot position-in-code-vector :: , required-init-keyword: ext-code-pos:; constant slot label-name :: , required-init-keyword: init-label-name:; end class ; define concrete class () end class; define concrete class () constant slot offset :: , required-init-keyword: init-offset:; end class; define abstract class () end class ; define abstract class () constant slot position-in-code-vector :: , required-init-keyword: position:; end class ; define concrete-class () end concrete-class ; define concrete-class () end concrete-class ; define abstract class () end class ; define concrete-class () constant slot byte-immediate-value :: , required-init-keyword: byte-immediate-value:; end concrete-class ; define constant $zero-byte-immediate-value = make(, byte-immediate-value: 0); define concrete-class () constant slot short-immediate-value :: , required-init-keyword: short-immediate-value:; end concrete-class ; define constant $zero-short-immediate-value = make(, short-immediate-value: 0); define concrete-class () constant slot word-immediate-value :: , required-init-keyword: word-immediate-value:; constant slot word-relocation :: , required-init-keyword: word-relocation:; end concrete-class ; define constant $zero-word-immediate-value = make(, word-immediate-value: 0, word-relocation: $no-external); define concrete-class () constant slot register-integer-rep :: , required-init-keyword: register-integer-rep:; constant slot register-name :: , required-init-keyword: register-name:; end concrete-class ; define concrete-class () // Really a position in the fp stack constant slot fp-register-pos :: , required-init-keyword: fp-register-pos:; end concrete-class ; define abstract class () end class ; define concrete-class () constant slot general-opcode-opcode :: , required-init-keyword: general-opcode-opcode:; constant slot general-opcode-offset :: , required-init-keyword: general-opcode-offset:; constant slot general-opcode-end-offset :: , required-init-keyword: general-opcode-end-offset:; end concrete-class ; define abstract class () end class ; define concrete-class () end concrete-class ; define concrete-class () constant slot segment-register-name :: , required-init-keyword: segment-register-name:; end concrete-class; define concrete-class () constant slot segment-register :: , required-init-keyword: segment-register:; end concrete-class ; define concrete-class () constant slot proper-opcode-name :: , required-init-keyword: proper-opcode-name:; constant slot proper-opcode-args :: , required-init-keyword: proper-opcode-args:; constant slot proper-opcode-seg :: , required-init-keyword: proper-opcode-seg:; end concrete-class ; define constant $nop = make(, proper-opcode-name: "nop", proper-opcode-args: $empty-vector, proper-opcode-seg: make()); define constant $unknown = make(, proper-opcode-name: "???", proper-opcode-args: $empty-vector, proper-opcode-seg: make()); define constant $nop-and-offset = make(, general-opcode-opcode: $nop, general-opcode-offset: 0, general-opcode-end-offset: 1); define concrete-class () constant slot bytes-read :: , required-init-keyword: not-an-opcode-bytes-read:; constant slot not-an-opcode-from :: , required-init-keyword: not-an-opcode-from:; end concrete-class ; ignore(not-an-opcode-from); define concrete-class () // Just like not-an-opcode, but we don't say what produced it end concrete-class ; define constant $unspecified-not-an-opcode = make(); //define abstract class () //end class ; define concrete-class () end concrete-class ; define concrete-class () constant slot arg-immediate-value :: , required-init-keyword: arg-immediate-value:; end concrete-class ; define concrete-class () constant slot register-arg :: , required-init-keyword: register-arg:; end concrete-class ; define concrete-class () constant slot fp-register-arg :: , required-init-keyword: fp-register-arg:; end concrete-class ; define abstract class () end class ; define concrete-class () constant slot byte-offset :: , required-init-keyword: byte-offset:; end concrete-class ; define concrete-class () constant slot short-offset :: , required-init-keyword: short-offset:; end concrete-class ; define concrete-class () constant slot word-offset :: , required-init-keyword: word-offset:; constant slot word-offset-relocation :: , required-init-keyword: word-offset-relocation:; end concrete-class ; define concrete-class () constant slot offset-arg :: , required-init-keyword: offset-arg:; end concrete-class ; define abstract class () end class ; define concrete-class () end concrete-class ; define constant $no-memory-index = make(); define concrete-class () constant slot indexed-memory-index-reg :: , required-init-keyword: indexed-memory-index-reg:; constant slot indexed-memory-index-scale :: , required-init-keyword: indexed-memory-index-scale:; end concrete-class ; define abstract class () end class ; define concrete-class () end concrete-class ; define constant $no-memory-displacement = make(); define concrete-class () constant slot memory-displacement :: , required-init-keyword: memory-displacement:; end concrete-class ; define abstract class () end class ; define concrete-class () end concrete-class ; define constant $no-memory-base = make(); define concrete-class () constant slot memory-base-reg :: , required-init-keyword: memory-base-reg:; end concrete-class ; define abstract class () end class ; define concrete-class () end concrete-class ; define concrete-class () end concrete-class ; define concrete-class () end concrete-class ; define concrete-class () end concrete-class ; define concrete-class () end concrete-class ; define concrete-class () end concrete-class ; define concrete-class () end concrete-class ; define constant $byte-arg-size = make(); define constant $short-arg-size = make(); define constant $word-arg-size = make(); define constant $double-word-arg-size = make(); define constant $word-real-arg-size = make(); define constant $double-word-real-arg-size = make(); define constant $extended-real-arg-size = make(); define concrete-class () constant slot memory-arg-disp :: , required-init-keyword: memory-arg-disp:; constant slot memory-arg-base :: , required-init-keyword: memory-arg-base:; constant slot memory-arg-index :: , required-init-keyword: memory-arg-index:; constant slot memory-arg-size :: , required-init-keyword: memory-arg-size:; end concrete-class ; define concrete-class () slot is-16-bit :: ; end concrete-class ; define concrete-class () slot is-16-bit :: ; end concrete-class ; define abstract class () end class ; define concrete-class () end concrete-class ; define concrete-class () constant slot repeater-value :: , required-init-keyword: repeater-value:; end concrete-class ; ignore(repeater-value);