classes/MOS6502.ps1
|
class MOS6502 { # $c=Import-Csv .\MOS6502OpCodes.csv # # To update the Sort Order: $c | %{$o=$_; switch ($o.AddressingMode) { "Implied" { $o.AMSortOrder = 1; }; "Immediate" {$o.AMSortOrder =2;}; "Absolute" {$o.AMSortOrder =3;}; "AbsoluteIndexedX" {$o.AMSortOrder =4;}; "AbsoluteIndexedY" {$o.AMSortOrder =5;}; "ZeroPage" {$o.AMSortOrder =6;}; "ZeroPageIndexedX" {$o.AMSortOrder =7;}; "ZeroPageIndexedY" {$o.AMSortOrder =8;}; "IndexedXIndirect" {$o.AMSortOrder =9;}; "IndirectIndexedY" {$o.AMSortOrder =10;}; "IndirectAbsolute" {$o.AMSortOrder =11;}; "Relative" {$o.AMSortOrder = 12;}; } # To generate below hashtables: $c | ?{$_.Illegal -eq $false} | sort Mnemonic -Unique | %{$mne = $_.Mnemonic; Write-Host "$mne = @{"; $c | ?{$_.Illegal -eq $false -and $_.Mnemonic -eq $mne} | sort AMSortOrder | %{ Write-Host (" {0,-16} = 0x{1}" -f $_.AddressingMode, $_.OpCode)}; Write-Host "}"} # static $OpCodes = [ordered] @{ ADC = @{ Immediate = 0x69 Absolute = 0x6D AbsoluteIndexedX = 0x7D AbsoluteIndexedY = 0x79 ZeroPage = 0x65 ZeroPageIndexedX = 0x75 IndexedXIndirect = 0x61 IndirectIndexedY = 0x71 } AND = @{ Immediate = 0x29 Absolute = 0x2D AbsoluteIndexedX = 0x3D AbsoluteIndexedY = 0x39 ZeroPage = 0x25 ZeroPageIndexedX = 0x35 IndexedXIndirect = 0x21 IndirectIndexedY = 0x31 } ASL = @{ Implied = 0x0A Absolute = 0x0E AbsoluteIndexedX = 0x1E ZeroPage = 0x06 ZeroPageIndexedX = 0x16 } BCC = @{ Relative = 0x90 } BCS = @{ Relative = 0xB0 } BEQ = @{ Relative = 0xF0 } BIT = @{ Absolute = 0x2C ZeroPage = 0x24 } BMI = @{ Relative = 0x30 } BNE = @{ Relative = 0xD0 } BPL = @{ Relative = 0x10 } BRK = @{ Implied = 0x00 } BVC = @{ Relative = 0x50 } BVS = @{ Relative = 0x70 } CLC = @{ Implied = 0x18 } CLD = @{ Implied = 0xD8 } CLI = @{ Implied = 0x58 } CLV = @{ Implied = 0xB8 } CMP = @{ Immediate = 0xC9 Absolute = 0xCD AbsoluteIndexedX = 0xDD AbsoluteIndexedY = 0xD9 ZeroPage = 0xC5 ZeroPageIndexedX = 0xD5 IndexedXIndirect = 0xC1 IndirectIndexedY = 0xD1 } CPX = @{ Immediate = 0xE0 Absolute = 0xEC ZeroPage = 0xE4 } CPY = @{ Immediate = 0xC0 Absolute = 0xCC ZeroPage = 0xC4 } DEC = @{ Absolute = 0xCE AbsoluteIndexedX = 0xDE ZeroPage = 0xC6 ZeroPageIndexedX = 0xD6 } DEX = @{ Implied = 0xCA } DEY = @{ Implied = 0x88 } EOR = @{ Immediate = 0x49 Absolute = 0x4D AbsoluteIndexedX = 0x5D AbsoluteIndexedY = 0x59 ZeroPage = 0x45 ZeroPageIndexedX = 0x55 IndexedXIndirect = 0x41 IndirectIndexedY = 0x51 } INC = @{ Absolute = 0xEE AbsoluteIndexedX = 0xFE ZeroPage = 0xE6 ZeroPageIndexedX = 0xF6 } INX = @{ Implied = 0xE8 } INY = @{ Implied = 0xC8 } JMP = @{ Absolute = 0x4C IndirectAbsolute = 0x6C } JSR = @{ Absolute = 0x20 } LDA = @{ Immediate = 0xA9 Absolute = 0xAD AbsoluteIndexedX = 0xBD AbsoluteIndexedY = 0xB9 ZeroPage = 0xA5 ZeroPageIndexedX = 0xB5 IndexedXIndirect = 0xA1 IndirectIndexedY = 0xB1 } LDX = @{ Immediate = 0xA2 Absolute = 0xAE AbsoluteIndexedY = 0xBE ZeroPage = 0xA6 ZeroPageIndexedY = 0xB6 } LDY = @{ Immediate = 0xA0 Absolute = 0xAC AbsoluteIndexedX = 0xBC ZeroPage = 0xA4 ZeroPageIndexedX = 0xB4 } LSR = @{ Implied = 0x4A Absolute = 0x4E AbsoluteIndexedX = 0x5E ZeroPage = 0x46 ZeroPageIndexedX = 0x56 } NOP = @{ Implied = 0xEA } ORA = @{ Immediate = 0x09 Absolute = 0x0D AbsoluteIndexedX = 0x1D AbsoluteIndexedY = 0x19 ZeroPage = 0x05 ZeroPageIndexedX = 0x15 IndexedXIndirect = 0x01 IndirectIndexedY = 0x11 } PHA = @{ Implied = 0x48 } PHP = @{ Implied = 0x08 } PLA = @{ Implied = 0x68 } PLP = @{ Implied = 0x28 } ROL = @{ Implied = 0x2A Absolute = 0x2E AbsoluteIndexedX = 0x3E ZeroPage = 0x26 ZeroPageIndexedX = 0x36 } ROR = @{ Implied = 0x6A Absolute = 0x6E AbsoluteIndexedX = 0x7E ZeroPage = 0x66 ZeroPageIndexedX = 0x76 } RTI = @{ Implied = 0x40 } RTS = @{ Implied = 0x60 } SBC = @{ Immediate = 0xE9 Absolute = 0xED AbsoluteIndexedX = 0xFD AbsoluteIndexedY = 0xF9 ZeroPage = 0xE5 ZeroPageIndexedX = 0xF5 IndexedXIndirect = 0xE1 IndirectIndexedY = 0xF1 } SEC = @{ Implied = 0x38 } SED = @{ Implied = 0xF8 } SEI = @{ Implied = 0x78 } STA = @{ Absolute = 0x8D AbsoluteIndexedX = 0x9D AbsoluteIndexedY = 0x99 ZeroPage = 0x85 ZeroPageIndexedX = 0x95 IndexedXIndirect = 0x81 IndirectIndexedY = 0x91 } STX = @{ Absolute = 0x8E ZeroPage = 0x86 ZeroPageIndexedY = 0x96 } STY = @{ Absolute = 0x8C ZeroPage = 0x84 ZeroPageIndexedX = 0x94 } TAX = @{ Implied = 0xAA } TAY = @{ Implied = 0xA8 } TSX = @{ Implied = 0xBA } TXA = @{ Implied = 0x8A } TXS = @{ Implied = 0x9A } TYA = @{ Implied = 0x98 } } static $OperandSize = [ordered] @{ Implied = 0 Immediate = 8 Absolute = 16 AbsoluteIndexedX = 16 AbsoluteIndexedY = 16 ZeroPage = 8 ZeroPageIndexedX = 8 ZeroPageIndexedY = 8 IndexedXIndirect = 8 IndirectIndexedY = 8 IndirectAbsolute = 16 Relative = 8 } static $AddressingMode = [ordered] @{ Implied = [MOS6502AddressingMode]::Implied Immediate = [MOS6502AddressingMode]::Immediate Absolute = [MOS6502AddressingMode]::Absolute AbsoluteIndexedX = [MOS6502AddressingMode]::AbsoluteIndexedX AbsoluteIndexedY = [MOS6502AddressingMode]::AbsoluteIndexedY ZeroPage = [MOS6502AddressingMode]::ZeroPage ZeroPageIndexedX = [MOS6502AddressingMode]::ZeroPageIndexedX ZeroPageIndexedY = [MOS6502AddressingMode]::ZeroPageIndexedY IndexedXIndirect = [MOS6502AddressingMode]::IndexedXIndirect IndirectIndexedY = [MOS6502AddressingMode]::IndirectIndexedY IndirectAbsolute = [MOS6502AddressingMode]::IndirectAbsolute Relative = [MOS6502AddressingMode]::Relative } } |