mirror of
https://github.com/mikpe/pdp10-tools.git
synced 2026-01-22 10:32:25 +00:00
pdp10_opcodes: rewrite in Erlang, resolve ambiguities
This commit is contained in:
parent
690a7c86e8
commit
730bffc28b
213
erlang/apps/lib/include/pdp10_opcodes.hrl
Normal file
213
erlang/apps/lib/include/pdp10_opcodes.hrl
Normal file
@ -0,0 +1,213 @@
|
||||
%%% -*- erlang-indent-level: 2 -*-
|
||||
%%%
|
||||
%%% pdp10_opcodes.hrl
|
||||
%%% Copyright (C) 2013-2019 Mikael Pettersson
|
||||
%%%
|
||||
%%% This file is part of pdp10-tools.
|
||||
%%%
|
||||
%%% pdp10-tools is free software: you can redistribute it and/or modify
|
||||
%%% it under the terms of the GNU General Public License as published by
|
||||
%%% the Free Software Foundation, either version 3 of the License, or
|
||||
%%% (at your option) any later version.
|
||||
%%%
|
||||
%%% pdp10-tools is distributed in the hope that it will be useful,
|
||||
%%% but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
%%% GNU General Public License for more details.
|
||||
%%%
|
||||
%%% You should have received a copy of the GNU General Public License
|
||||
%%% along with pdp10-tools. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
-ifndef(PDP10_OPCODES_HRL).
|
||||
-define(PDP10_OPCODES_HRL, 1).
|
||||
|
||||
%% Data Representation
|
||||
%% ===================
|
||||
%%
|
||||
%%
|
||||
%% 11111111112222222222333333
|
||||
%% 012345678901234567890123456789012345
|
||||
%% +------------------------------------+
|
||||
%% | |
|
||||
%% +------------------------------------+
|
||||
%%
|
||||
%% The basic storage unit is a 36-bit wide word. Its bits are numbered 0
|
||||
%% to 35, in left-to-right order, with bit 0 being the most significant
|
||||
%% and bit 35 the least significant.
|
||||
%%
|
||||
%% The architecture supports sub-word storage units via special instructions
|
||||
%% and specially formatted "byte" pointers, where a byte may be from 0 to 36
|
||||
%% bits wide. Incrementing a byte pointer moves it right over the word towards
|
||||
%% its less significant bits, indicating a big-endian byte order.
|
||||
%%
|
||||
%% A 72-bit long integer consists of two adjacent words, with the most
|
||||
%% significant bits in the first word (lower address) and the least significant
|
||||
%% bits in the second word (higher address), indicating a big-endian word order.
|
||||
|
||||
%% Instruction Representation
|
||||
%% ==========================
|
||||
%%
|
||||
%% Basic instructions are stored in 36-bit words with the following format:
|
||||
%%
|
||||
%% 111 1 1111 112222222222333333
|
||||
%% 012345678 9012 3 4567 890123456789012345
|
||||
%% +---------+----+-+----+------------------+
|
||||
%% | opcode | A |I| X | Y |
|
||||
%% +---------+----+-+----+------------------+
|
||||
%% 9 bits 4 1 4 18 bits
|
||||
%%
|
||||
%% A 9-bit opcode is stored in the high 9 bits.
|
||||
%% A is a 4-bit field specifying the accumulator (a register).
|
||||
%% I is a 1-bit field specifying indirect addressing.
|
||||
%% X is a 4-bit field specifying the index register.
|
||||
%% Y is an 18-bit field specifying an address or offset.
|
||||
%%
|
||||
%% E, the effective addreess, is computed from I, X, and Y.
|
||||
%%
|
||||
%% In some instructions A contains further opcode bits.
|
||||
%%
|
||||
%% In some instructions A is unused and should be zero.
|
||||
%%
|
||||
%% In some instructions A must be non-zero.
|
||||
%%
|
||||
%% Instructions that not compute an effective address E
|
||||
%% should have I, X, and Y set to zero.
|
||||
%%
|
||||
%% IO instructions have a slightly different format:
|
||||
%%
|
||||
%% 111 1 1111 112222222222333333
|
||||
%% 012 3456789 012 3 4567 890123456789012345
|
||||
%% +---+-------+---+-+----+------------------+
|
||||
%% |op1| device|op2|I| X | Y |
|
||||
%% +---+-------+---+-+----+------------------+
|
||||
%% 3 7 bits 3 1 4 18 bits
|
||||
%%
|
||||
%% The op1 field is all-bits-one (7), the device field addresses the selected
|
||||
%% device, and the op2 field specifies the operation. Both devices internal to
|
||||
%% the processor and devices attached via external buses can be accessed.
|
||||
%%
|
||||
%% Some non-IO instructions also have a 7 in their high three bits.
|
||||
%%
|
||||
%% Extended instructions consist of two separate instruction words:
|
||||
%%
|
||||
%% A:
|
||||
%% 111 1 1111 112222222222333333
|
||||
%% 012345678 9012 3 4567 890123456789012345
|
||||
%% +---------+----+-+----+------------------+
|
||||
%% | 0123 | A |I| X | Y |
|
||||
%% +---------+----+-+----+------------------+
|
||||
%% 9 bits 4 1 4 18 bits
|
||||
%%
|
||||
%% E0:
|
||||
%% 111 1 1111 112222222222333333
|
||||
%% 012345678 9012 3 4567 890123456789012345
|
||||
%% +---------+----+-+----+------------------+
|
||||
%% | xopcode |0000|I| X | Y |
|
||||
%% +---------+----+-+----+------------------+
|
||||
%% 9 bits 4 1 4 18 bits
|
||||
%%
|
||||
%% The first word is stored at address A in the instruction stream, in the basic
|
||||
%% format with opcode 0123. The second word is stored at the effective address
|
||||
%% E0 specified by the the first word. Its accumulator field is unused and must
|
||||
%% be zero for compatibility with future extensions.
|
||||
|
||||
%% Known PDP10 CPU models, each represented by a distinct bit value.
|
||||
%%
|
||||
%% These are combined with bit-wise 'and', 'or', and 'not' operations
|
||||
%% to form sets of CPU models, used to check if a given mnemonic or
|
||||
%% opcode is available for a selected set of CPUs.
|
||||
|
||||
%% DEC processors.
|
||||
|
||||
-define(PDP6, (1 bsl 0)). % PDP-6 Type 166 Arithmetic Processor
|
||||
-define(PDP10_KA10, (1 bsl 1)). % KA10
|
||||
-define(PDP10_KA10_ITS, (1 bsl 2)). % KA10, ITS microcode
|
||||
-define(PDP10_KI10, (1 bsl 3)). % KI10
|
||||
-define(PDP10_KL10, (1 bsl 4)). % KL10 (early, non-extended)
|
||||
-define(PDP10_KL10_ITS, (1 bsl 5)). % KL10, ITS microcode
|
||||
-define(PDP10_KL10_271, (1 bsl 6)). % KL10B, microcode >= 271, extended
|
||||
-define(PDP10_KS10, (1 bsl 7)). % KS10
|
||||
-define(PDP10_KS10_ITS, (1 bsl 8)). % KS10, ITS microcode
|
||||
|
||||
%% XKL Processors.
|
||||
|
||||
-define(PDP10_XKL1, (1 bsl 9)). % XKL-1 / TOAD-1
|
||||
|
||||
-define(PDP10_LAST, ?PDP10_XKL1).
|
||||
|
||||
%% Others, not yet supported:
|
||||
%%
|
||||
%% DEC KC10 (Jupiter, KL10B successor with full extended addressing, not built)
|
||||
%% DEC KD10 (Minnow, KS10 successor with full extended addressing, not built)
|
||||
%%
|
||||
%% XKL-2 (XKL-1 successor, no documentation available)
|
||||
%%
|
||||
%% System Concepts SC-20, SC-25, SC-30M, SC-40 (KC10-like)
|
||||
%%
|
||||
%% Foonly F-1, F-2, F-3, F-4 (KI10/KL10-hybrid)
|
||||
%%
|
||||
%% Xerox PARC MAXC (KI10-like?)
|
||||
|
||||
%% Convenience constants for combinations of CPU models.
|
||||
|
||||
-define(PDP10_ALL, (?PDP10_LAST bor (?PDP10_LAST - 1))).
|
||||
|
||||
-define(PDP10_KL10_271up, (?PDP10_KL10_271 bor ?PDP10_XKL1)).
|
||||
-define(PDP10_KL10any, (?PDP10_KL10 bor ?PDP10_KL10_ITS bor ?PDP10_KL10_271up)).
|
||||
-define(PDP10_KL10up, (?PDP10_KL10any bor ?PDP10_KS10)).
|
||||
|
||||
-define(PDP10_KI10_to_KL10, (?PDP10_KI10 bor ?PDP10_KL10any)).
|
||||
-define(PDP10_KI10up, (?PDP10_KI10 bor ?PDP10_KL10up)).
|
||||
|
||||
-define(PDP10_ITS, (?PDP10_KA10_ITS bor ?PDP10_KL10_ITS bor ?PDP10_KS10_ITS)).
|
||||
|
||||
-define(PDP10_KA10any, (?PDP10_KA10 bor ?PDP10_KA10_ITS)).
|
||||
-define(PDP10_KA10up, (?PDP10_KA10any bor ?PDP10_KI10up)).
|
||||
-define(PDP10_KA10up_not_ITS, (?PDP10_KA10up band bnot ?PDP10_ITS)).
|
||||
-define(PDP10_KA10_to_KI10, (?PDP10_KA10 bor ?PDP10_KI10)). % FIXME: should that be KA10any?
|
||||
-define(PDP10_KA10_to_KL10, (?PDP10_KA10_to_KI10 bor ?PDP10_KL10any)).
|
||||
|
||||
-define(PDP10_not_KS10_or_XKL1, (?PDP10_ALL band bnot (?PDP10_KS10 bor ?PDP10_XKL1))). % FIXME: should that be KS10any?
|
||||
|
||||
-define(PDP6_to_KI10, (?PDP6 bor ?PDP10_KA10_to_KI10)).
|
||||
|
||||
-type pdp10_cpu_models() :: 0..?PDP10_ALL.
|
||||
|
||||
%% Device fields in IO instructions.
|
||||
|
||||
-type pdp10_cpu_device() :: 0..127.
|
||||
|
||||
%% Each instruction belongs to exactly one of these primary categories,
|
||||
%% which determine how the high 13 bits are to be interpreted.
|
||||
|
||||
-define(PDP10_INSN_BASIC, 'PDP10_INSN_BASIC').
|
||||
-define(PDP10_INSN_A_OPCODE, 'PDP10_INSN_A_OPCODE').
|
||||
-define(PDP10_INSN_A_NONZERO, 'PDP10_INSN_A_NONZERO').
|
||||
-define(PDP10_INSN_IO, 'PDP10_INSN_IO').
|
||||
|
||||
-type pdp10_insn_format() :: ?PDP10_INSN_BASIC
|
||||
| ?PDP10_INSN_A_OPCODE
|
||||
| ?PDP10_INSN_A_NONZERO
|
||||
| ?PDP10_INSN_IO.
|
||||
|
||||
%% Instruction descriptors.
|
||||
|
||||
-record(pdp10_insn_desc,
|
||||
{ name :: string()
|
||||
%% The high13 field is 13 bits, formatted as:
|
||||
%% <9 bit opcode><0000> BASIC, A_NONZERO
|
||||
%% <9 + 4 bit opcode> A_OPCODE
|
||||
%% <111><0000000><3 bit op> IO
|
||||
%%
|
||||
%% An extended instruction uses the BASIC format with opcode 0123 for
|
||||
%% the first word, and the A_OPCODE(00) EXTENDED format for the second word.
|
||||
, high13 :: 0..((1 bsl 13) - 1)
|
||||
, format :: pdp10_insn_format()
|
||||
, e_unused = false :: boolean()
|
||||
, extended = false :: boolean()
|
||||
, models :: pdp10_cpu_models()
|
||||
, section0 = undefined :: undefined | true | false
|
||||
, priority = undefined :: undefined | non_neg_integer()
|
||||
}).
|
||||
|
||||
-endif. % PDP10_STDINT_HRL
|
||||
978
erlang/apps/lib/src/pdp10_opcodes.erl
Normal file
978
erlang/apps/lib/src/pdp10_opcodes.erl
Normal file
@ -0,0 +1,978 @@
|
||||
%%% -*- erlang-indent-level: 2 -*-
|
||||
%%%
|
||||
%%% pdp10_opcodes.erl
|
||||
%%% Copyright (C) 2013-2019 Mikael Pettersson
|
||||
%%%
|
||||
%%% This file is part of pdp10-tools.
|
||||
%%%
|
||||
%%% pdp10-tools is free software: you can redistribute it and/or modify
|
||||
%%% it under the terms of the GNU General Public License as published by
|
||||
%%% the Free Software Foundation, either version 3 of the License, or
|
||||
%%% (at your option) any later version.
|
||||
%%%
|
||||
%%% pdp10-tools is distributed in the hope that it will be useful,
|
||||
%%% but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
%%% GNU General Public License for more details.
|
||||
%%%
|
||||
%%% You should have received a copy of the GNU General Public License
|
||||
%%% along with pdp10-tools. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
-module(pdp10_opcodes).
|
||||
|
||||
%% API
|
||||
-export([ cpu_device_from_name/2
|
||||
, insn_from_name/3
|
||||
, insn_from_high13/4
|
||||
, models_from_name/1
|
||||
]).
|
||||
|
||||
%% Internal export
|
||||
-export([ own_lookup_table/0 ]).
|
||||
|
||||
-include_lib("lib/include/pdp10_opcodes.hrl").
|
||||
|
||||
-spec insn_from_name(pdp10_cpu_models(), string(), boolean()) -> #pdp10_insn_desc{} | false.
|
||||
insn_from_name(Models, Name, HaveA) ->
|
||||
insn_from_name_1(descs_from_key(Name), Models, HaveA).
|
||||
|
||||
%% Find first matching descriptor.
|
||||
insn_from_name_1([], _Models, _HaveA) -> false;
|
||||
insn_from_name_1([Desc | Descs], Models, HaveA) ->
|
||||
case models_matches(Models, Desc) andalso havea_matches(HaveA, Desc) of
|
||||
true -> Desc;
|
||||
false -> insn_from_name_1(Descs, Models, HaveA)
|
||||
end.
|
||||
|
||||
models_matches(Models, #pdp10_insn_desc{models = Models2}) ->
|
||||
(Models2 band Models) =:= Models.
|
||||
|
||||
havea_matches(HaveA, #pdp10_insn_desc{format = Format}) ->
|
||||
case Format of
|
||||
?PDP10_INSN_A_OPCODE -> not HaveA;
|
||||
_ -> true
|
||||
end.
|
||||
|
||||
-spec insn_from_high13(pdp10_cpu_models(), 0..((1 bsl 13) - 1), boolean(), boolean()) -> #pdp10_insn_desc{} | false.
|
||||
insn_from_high13(Models, High13, Extended, Section0) ->
|
||||
insn_from_high13_1(descs_from_key(High13), Models, Extended, Section0, false).
|
||||
|
||||
%% Find highest-priority matching descriptor.
|
||||
insn_from_high13_1([], _Models, _Extended, _Section0, Result) -> Result;
|
||||
insn_from_high13_1([Desc | Descs], Models, Extended, Section0, Result) ->
|
||||
NewResult =
|
||||
case models_matches(Models, Desc) andalso
|
||||
extended_matches(Extended, Desc) andalso
|
||||
section0_matches(Section0, Desc) of
|
||||
true ->
|
||||
if Result =:= false -> Desc;
|
||||
Desc#pdp10_insn_desc.priority > Result#pdp10_insn_desc.priority -> Desc;
|
||||
true -> Result
|
||||
end;
|
||||
false -> Result
|
||||
end,
|
||||
insn_from_high13_1(Descs, Models, Extended, Section0, NewResult).
|
||||
|
||||
extended_matches(Extended, Desc) ->
|
||||
Extended =:= Desc#pdp10_insn_desc.extended.
|
||||
|
||||
section0_matches(Section0, #pdp10_insn_desc{section0 = RequiredSection0}) ->
|
||||
RequiredSection0 =:= undefined orelse RequiredSection0 =:= Section0.
|
||||
|
||||
%% Access lookup table, mapping names or opcode high13 bits,
|
||||
%% to candidate descriptors.
|
||||
%% TODO: _maybe_ use peristent_term instead
|
||||
descs_from_key(NameOrHigh13) ->
|
||||
ensure_lookup_table(),
|
||||
case ets:lookup(?MODULE, NameOrHigh13) of
|
||||
[{_NameOrHigh13, Descs}] -> Descs;
|
||||
[] -> []
|
||||
end.
|
||||
|
||||
%% One-time initialization of the lookup table.
|
||||
ensure_lookup_table() ->
|
||||
case ets:info(?MODULE, keypos) of
|
||||
undefined ->
|
||||
Self = self(),
|
||||
Pid = spawn_link(fun() -> build_lookup_table(Self) end),
|
||||
MonRef = monitor(process, Pid),
|
||||
Pid ! {Self, MonRef},
|
||||
unlink(Pid),
|
||||
receive
|
||||
{Pid, MonRef, Result} ->
|
||||
demonitor(MonRef, [flush]),
|
||||
case Result of
|
||||
ok -> ok;
|
||||
eagain -> ensure_lookup_table()
|
||||
end;
|
||||
{'DOWN', MonRef, _Type, _Pid, Reason} -> error(Reason)
|
||||
end;
|
||||
_KeyPos -> ok
|
||||
end.
|
||||
|
||||
build_lookup_table(Pid) ->
|
||||
receive {Pid, MonRef} -> ok end,
|
||||
try
|
||||
try register(?MODULE, self())
|
||||
catch error:badarg -> error(eagain)
|
||||
end,
|
||||
Map = build_lookup_map(),
|
||||
Records = maps:to_list(Map),
|
||||
try
|
||||
ets:new(?MODULE, [named_table]),
|
||||
ets:insert(?MODULE, Records)
|
||||
catch error:badarg -> error(eagain)
|
||||
end,
|
||||
Pid ! {self(), MonRef, ok}
|
||||
catch error:eagain ->
|
||||
Pid ! {self(), MonRef, eagain}
|
||||
end,
|
||||
own_lookup_table().
|
||||
|
||||
own_lookup_table() ->
|
||||
receive _ -> ok after 5*60*1000 -> ok end,
|
||||
?MODULE:own_lookup_table().
|
||||
|
||||
build_lookup_map() ->
|
||||
add_descs(pdp10_extended_insns(), add_descs(pdp10_insns(), maps:new())).
|
||||
|
||||
add_descs([], Map) -> Map;
|
||||
add_descs([Desc | Descs], Map) ->
|
||||
add_descs(Descs, add_keys(desc_keys(Desc), Desc, Map)).
|
||||
|
||||
add_keys([], _Desc, Map) -> Map;
|
||||
add_keys([Key | Keys], Desc, Map) ->
|
||||
add_keys(Keys, Desc, add_key(Key, Desc, Map)).
|
||||
|
||||
add_key(Key, Desc, Map) ->
|
||||
Descs = maps:get(Key, Map, []),
|
||||
Models = Desc#pdp10_insn_desc.models,
|
||||
true = Models =/= 0,
|
||||
[check_descs(Key, Desc, Desc2) || Desc2 <- Descs],
|
||||
maps:put(Key, [Desc | Descs], Map).
|
||||
|
||||
check_descs(Key, Desc1, Desc2) ->
|
||||
case Desc1#pdp10_insn_desc.models band Desc2#pdp10_insn_desc.models of
|
||||
0 -> ok;
|
||||
_ ->
|
||||
case is_integer(Key) of
|
||||
true -> % High13, for disassembly
|
||||
case Desc1#pdp10_insn_desc.section0 =/= Desc2#pdp10_insn_desc.section0 orelse
|
||||
Desc1#pdp10_insn_desc.extended =/= Desc2#pdp10_insn_desc.extended of
|
||||
true -> ok;
|
||||
false ->
|
||||
case is_integer(Desc1#pdp10_insn_desc.priority) andalso
|
||||
is_integer(Desc2#pdp10_insn_desc.priority) andalso
|
||||
Desc1#pdp10_insn_desc.priority =/= Desc2#pdp10_insn_desc.priority of
|
||||
true -> ok;
|
||||
false -> error({check_models, Key, Desc1, Desc2})
|
||||
end
|
||||
end;
|
||||
false -> % Name, for assembly
|
||||
case (Desc1#pdp10_insn_desc.format =:= ?PDP10_INSN_A_OPCODE orelse
|
||||
Desc2#pdp10_insn_desc.format =:= ?PDP10_INSN_A_OPCODE) andalso
|
||||
Desc1#pdp10_insn_desc.format =/= Desc2#pdp10_insn_desc.format of
|
||||
true -> ok;
|
||||
false -> error({check_models, Key, Desc1, Desc2})
|
||||
end
|
||||
end
|
||||
end.
|
||||
|
||||
desc_keys(#pdp10_insn_desc{name = Name, high13 = High13, format = Format}) ->
|
||||
[Name | high13_keys(High13, Format)].
|
||||
|
||||
high13_keys(High13, Format) ->
|
||||
case Format of
|
||||
?PDP10_INSN_BASIC ->
|
||||
%% add all values for the A field (low 4 bits)
|
||||
high13_keys(High13, _Shift = 0, _Width = 4);
|
||||
?PDP10_INSN_A_OPCODE ->
|
||||
%% use given bits as-is
|
||||
[High13];
|
||||
?PDP10_INSN_A_NONZERO ->
|
||||
%% add all values for the A field (low 4 bits)
|
||||
[_Key0 | Keys] = high13_keys(High13, _Shift = 0, _Width = 4),
|
||||
Keys;
|
||||
?PDP10_INSN_IO ->
|
||||
%% add all values for the device field (middle 7 bits)
|
||||
high13_keys(High13, _Shift = 3, _Width = 7)
|
||||
end.
|
||||
|
||||
high13_keys(High13, Shift, Width) ->
|
||||
Value = (1 bsl Width) - 1,
|
||||
0 = High13 band (Value bsl Shift),
|
||||
high13_keys(High13, Shift, Value, []).
|
||||
|
||||
high13_keys(_High13, _Shift, -1, Keys) -> Keys;
|
||||
high13_keys(High13, Shift, Value, Keys) ->
|
||||
Key = High13 bor (Value bsl Shift),
|
||||
high13_keys(High13, Shift, Value - 1, [Key | Keys]).
|
||||
|
||||
%% Macros to initialize both high13 and format in instruction descriptors.
|
||||
%% Flags E_UNUSED and EXTENDED may be set separately.
|
||||
%%
|
||||
%% The convention in documentation is to list opcodes as three or five-digit
|
||||
%% octal numbers, with zeros in IO device subfields. Five-digit numbers have
|
||||
%% two excess bits, which are removed by the macros to produce 13 bits.
|
||||
|
||||
-define(BASIC(OPCODE9), high13 = (OPCODE9) bsl 4, format = ?PDP10_INSN_BASIC).
|
||||
-define(A_OPCODE(OPCODE15), high13 = (OPCODE15) bsr 2, format = ?PDP10_INSN_A_OPCODE).
|
||||
-define(A_NONZERO(OPCODE9), high13 = (OPCODE9) bsl 4, format = ?PDP10_INSN_A_NONZERO).
|
||||
-define(IO(OPCODE15), high13 = (OPCODE15) bsr 2, format = ?PDP10_INSN_IO).
|
||||
-define(E_UNUSED(Opcode), Opcode, e_unused = true).
|
||||
-define(SECTION_ZERO(Opcode), Opcode, section0 = true).
|
||||
-define(SECTION_NONZERO(Opcode), Opcode, section0 = false).
|
||||
|
||||
%% A_UNUSED is shorthand for A_OPCODE with the opcode bits in A set to zero.
|
||||
-define(A_UNUSED(OPCODE9), high13 = (OPCODE9) bsl 4, format = ?PDP10_INSN_A_OPCODE).
|
||||
|
||||
%% The .priority field is used to disambiguate lookups when a key maps to
|
||||
%% multiple descriptors, and the models are not mutually exclusive. This
|
||||
%% matters mostly for disassembly, i.e. insn_from_high13/4.
|
||||
-define(PRIO(Opcode, Prio), Opcode, priority = Prio).
|
||||
|
||||
-define(D(Name, Opcode, Models), #pdp10_insn_desc{name = Name, Opcode, models = Models}).
|
||||
|
||||
%% Much of the contents of these tables is based on Lars Brinkhoff's
|
||||
%% pdp10-its-disassembler, but the code is completely rewritten.
|
||||
|
||||
pdp10_insns() ->
|
||||
[
|
||||
%% name, high13, format, flags, models
|
||||
|
||||
%% 000: ILLEGAL
|
||||
%% 001-037: LUUOs
|
||||
%% ITS MUUOs
|
||||
?D(".iot", ?BASIC(8#040), ?PDP10_ITS)
|
||||
, ?D(".open", ?BASIC(8#041), ?PDP10_ITS)
|
||||
, ?D(".oper", ?BASIC(8#042), ?PDP10_ITS)
|
||||
, ?D(".call", ?A_OPCODE(8#04300), ?PDP10_ITS)
|
||||
, ?D(".dismis", ?A_OPCODE(8#04304), ?PDP10_ITS)
|
||||
, ?D(".lose", ?A_OPCODE(8#04310), ?PDP10_ITS)
|
||||
, ?D(".tranad", ?A_OPCODE(8#04314), ?PDP10_ITS)
|
||||
, ?D(".value", ?A_OPCODE(8#04320), ?PDP10_ITS)
|
||||
, ?D(".utran", ?A_OPCODE(8#04324), ?PDP10_ITS)
|
||||
, ?D(".core", ?A_OPCODE(8#04330), ?PDP10_ITS)
|
||||
, ?D(".trand", ?A_OPCODE(8#04334), ?PDP10_ITS)
|
||||
, ?D(".dstart", ?A_OPCODE(8#04340), ?PDP10_ITS)
|
||||
, ?D(".fdele", ?A_OPCODE(8#04344), ?PDP10_ITS)
|
||||
, ?D(".dstrtl", ?A_OPCODE(8#04350), ?PDP10_ITS)
|
||||
, ?D(".suset", ?A_OPCODE(8#04354), ?PDP10_ITS)
|
||||
, ?D(".ltpen", ?A_OPCODE(8#04360), ?PDP10_ITS)
|
||||
, ?D(".vscan", ?A_OPCODE(8#04364), ?PDP10_ITS)
|
||||
, ?D(".potset", ?A_OPCODE(8#04370), ?PDP10_ITS)
|
||||
, ?D(".uset", ?BASIC(8#044), ?PDP10_ITS)
|
||||
, ?D(".break", ?BASIC(8#045), ?PDP10_ITS)
|
||||
, ?D(".status", ?BASIC(8#046), ?PDP10_ITS)
|
||||
, ?D(".access", ?BASIC(8#047), ?PDP10_ITS)
|
||||
|
||||
%% TOPS-10 MUUOs (formats and models guesstimates)
|
||||
, ?D(".call", ?BASIC(8#040), ?PDP10_KA10up_not_ITS)
|
||||
, ?D(".init", ?BASIC(8#041), ?PDP10_KA10up_not_ITS)
|
||||
%% 042-046: reserved MUUOs
|
||||
, ?D(".calli", ?BASIC(8#047), ?PDP10_KA10up_not_ITS)
|
||||
, ?D(".open", ?BASIC(8#050), ?PDP10_KA10up_not_ITS)
|
||||
, ?D(".ttcall", ?BASIC(8#051), ?PDP10_KA10up_not_ITS)
|
||||
, ?D(".rename", ?BASIC(8#055), ?PDP10_KA10up_not_ITS)
|
||||
, ?D(".in", ?BASIC(8#056), ?PDP10_KA10up_not_ITS)
|
||||
, ?D(".out", ?BASIC(8#057), ?PDP10_KA10up_not_ITS)
|
||||
, ?D(".setsts", ?BASIC(8#060), ?PDP10_KA10up_not_ITS)
|
||||
, ?D(".stato", ?BASIC(8#061), ?PDP10_KA10up_not_ITS)
|
||||
, ?D(".status", ?PRIO(?BASIC(8#062), 0), ?PDP10_KA10up_not_ITS)
|
||||
, ?D(".getsts", ?PRIO(?BASIC(8#062), 1), ?PDP10_KA10up_not_ITS) % FIXME: alias for .status?
|
||||
, ?D(".statz", ?BASIC(8#063), ?PDP10_KA10up_not_ITS)
|
||||
, ?D(".inbuf", ?BASIC(8#064), ?PDP10_KA10up_not_ITS)
|
||||
, ?D(".outbuf", ?BASIC(8#065), ?PDP10_KA10up_not_ITS)
|
||||
, ?D(".input", ?BASIC(8#066), ?PDP10_KA10up_not_ITS)
|
||||
, ?D(".output", ?BASIC(8#067), ?PDP10_KA10up_not_ITS)
|
||||
, ?D(".close", ?BASIC(8#070), ?PDP10_KA10up_not_ITS)
|
||||
, ?D(".releas", ?BASIC(8#071), ?PDP10_KA10up_not_ITS)
|
||||
, ?D(".mtape", ?BASIC(8#072), ?PDP10_KA10up_not_ITS)
|
||||
, ?D(".ugetf", ?BASIC(8#073), ?PDP10_KA10up_not_ITS)
|
||||
, ?D(".useti", ?BASIC(8#074), ?PDP10_KA10up_not_ITS)
|
||||
, ?D(".useto", ?BASIC(8#075), ?PDP10_KA10up_not_ITS)
|
||||
, ?D(".lookup", ?BASIC(8#076), ?PDP10_KA10up_not_ITS)
|
||||
, ?D(".enter", ?BASIC(8#077), ?PDP10_KA10up_not_ITS)
|
||||
, ?D(".ujen", ?BASIC(8#100), ?PDP10_KA10) % FIXME: or KI10up? + not ITS
|
||||
%% 101: unassigned
|
||||
, ?D("gfad", ?BASIC(8#102), ?PDP10_KL10_271) % FIXME: or 271up?
|
||||
, ?D("gfsb", ?BASIC(8#103), ?PDP10_KL10_271) % FIXME: or 271up?
|
||||
|
||||
%% TOPS-20 MUUO
|
||||
, ?D("jsys", ?BASIC(8#104), ?PDP10_KI10up band bnot ?PDP10_ITS)
|
||||
|
||||
, ?D("adjsp", ?BASIC(8#105), ?PDP10_KL10up)
|
||||
, ?D("gfmp", ?BASIC(8#106), ?PDP10_KL10_271) % FIXME: or 271up?
|
||||
, ?D("gfdv", ?BASIC(8#107), ?PDP10_KL10_271) % FIXME: or 271up?
|
||||
, ?D("dfad", ?BASIC(8#110), ?PDP10_KI10up)
|
||||
, ?D("dfsb", ?BASIC(8#111), ?PDP10_KI10up)
|
||||
, ?D("dfmp", ?BASIC(8#112), ?PDP10_KI10up)
|
||||
, ?D("dfdv", ?BASIC(8#113), ?PDP10_KI10up)
|
||||
, ?D("dadd", ?BASIC(8#114), ?PDP10_KL10up)
|
||||
, ?D("dsub", ?BASIC(8#115), ?PDP10_KL10up)
|
||||
, ?D("dmul", ?BASIC(8#116), ?PDP10_KL10up)
|
||||
, ?D("ddiv", ?BASIC(8#117), ?PDP10_KL10up)
|
||||
, ?D("dmove", ?BASIC(8#120), ?PDP10_KI10up)
|
||||
, ?D("dmovn", ?BASIC(8#121), ?PDP10_KI10up)
|
||||
, ?D("fix", ?BASIC(8#122), ?PDP10_KI10up)
|
||||
, ?D("extend", ?BASIC(8#123), ?PDP10_KL10up)
|
||||
, ?D("dmovem", ?BASIC(8#124), ?PDP10_KI10up)
|
||||
, ?D("dmovnm", ?BASIC(8#125), ?PDP10_KI10up)
|
||||
, ?D("fixr", ?BASIC(8#126), ?PDP10_KI10up)
|
||||
, ?D("fltr", ?BASIC(8#127), ?PDP10_KI10up)
|
||||
, ?D("ufa", ?BASIC(8#130), ?PDP10_KA10_to_KI10) % FIXME: and TOPS-10 KL10
|
||||
, ?D("dfn", ?BASIC(8#131), ?PDP10_KA10_to_KI10) % FIXME: and TOPS-10 KL10
|
||||
, ?D("fsc", ?BASIC(8#132), ?PDP10_ALL)
|
||||
, ?D("ibp", ?A_OPCODE(8#13300), ?PDP10_ALL)
|
||||
, ?D("adjbp", ?A_NONZERO(8#133), ?PDP10_KL10up)
|
||||
, ?D("ildb", ?BASIC(8#134), ?PDP10_ALL)
|
||||
, ?D("ldb", ?BASIC(8#135), ?PDP10_ALL)
|
||||
, ?D("idpb", ?BASIC(8#136), ?PDP10_ALL)
|
||||
, ?D("dpb", ?BASIC(8#137), ?PDP10_ALL)
|
||||
, ?D("fad", ?BASIC(8#140), ?PDP10_ALL)
|
||||
, ?D("fadl", ?BASIC(8#141), ?PDP6_to_KI10) % FIXME: and TOPS-10 KL10?, not PDP6?
|
||||
, ?D("fadm", ?BASIC(8#142), ?PDP10_ALL)
|
||||
, ?D("fadb", ?BASIC(8#143), ?PDP10_ALL)
|
||||
, ?D("fadr", ?BASIC(8#144), ?PDP10_ALL)
|
||||
, ?D("fadri", ?BASIC(8#145), ?PDP10_KA10up)
|
||||
, ?D("fadrl", ?BASIC(8#145), ?PDP6)
|
||||
, ?D("fadrm", ?BASIC(8#146), ?PDP10_ALL)
|
||||
, ?D("fadrb", ?BASIC(8#147), ?PDP10_ALL)
|
||||
, ?D("fsb", ?BASIC(8#150), ?PDP10_ALL)
|
||||
, ?D("fsbl", ?BASIC(8#151), ?PDP6_to_KI10) % FIXME: and TOPS-10 KL10
|
||||
, ?D("fsbm", ?BASIC(8#152), ?PDP10_ALL)
|
||||
, ?D("fsbb", ?BASIC(8#153), ?PDP10_ALL)
|
||||
, ?D("fsbr", ?BASIC(8#154), ?PDP10_ALL)
|
||||
, ?D("fsbri", ?BASIC(8#155), ?PDP10_KA10up)
|
||||
, ?D("fsbrl", ?BASIC(8#155), ?PDP6)
|
||||
, ?D("fsbrm", ?BASIC(8#156), ?PDP10_ALL)
|
||||
, ?D("fsbrb", ?BASIC(8#157), ?PDP10_ALL)
|
||||
, ?D("fmp", ?BASIC(8#160), ?PDP10_ALL)
|
||||
, ?D("fmpl", ?BASIC(8#161), ?PDP6_to_KI10) % FIXME: and TOPS-10 KL10
|
||||
, ?D("fmpm", ?BASIC(8#162), ?PDP10_ALL)
|
||||
, ?D("fmpb", ?BASIC(8#163), ?PDP10_ALL)
|
||||
, ?D("fmpr", ?BASIC(8#164), ?PDP10_ALL)
|
||||
, ?D("fmpri", ?BASIC(8#165), ?PDP10_KA10up)
|
||||
, ?D("fmprl", ?BASIC(8#165), ?PDP6)
|
||||
, ?D("fmprm", ?BASIC(8#166), ?PDP10_ALL)
|
||||
, ?D("fmprb", ?BASIC(8#167), ?PDP10_ALL)
|
||||
, ?D("fdv", ?BASIC(8#170), ?PDP10_ALL)
|
||||
, ?D("fdvl", ?BASIC(8#171), ?PDP6_to_KI10) % FIXME: and TOPS-10 KL10
|
||||
, ?D("fdvm", ?BASIC(8#172), ?PDP10_ALL)
|
||||
, ?D("fdvb", ?BASIC(8#173), ?PDP10_ALL)
|
||||
, ?D("fdvr", ?BASIC(8#174), ?PDP10_ALL)
|
||||
, ?D("fdvri", ?BASIC(8#175), ?PDP10_KA10up)
|
||||
, ?D("fdvrl", ?BASIC(8#175), ?PDP6)
|
||||
, ?D("fdvrm", ?BASIC(8#176), ?PDP10_ALL)
|
||||
, ?D("fdvrb", ?BASIC(8#177), ?PDP10_ALL)
|
||||
, ?D("move", ?BASIC(8#200), ?PDP10_ALL)
|
||||
, ?D("movei", ?BASIC(8#201), ?PDP10_ALL)
|
||||
, ?D("movem", ?BASIC(8#202), ?PDP10_ALL)
|
||||
, ?D("moves", ?BASIC(8#203), ?PDP10_ALL)
|
||||
, ?D("movs", ?BASIC(8#204), ?PDP10_ALL)
|
||||
, ?D("movsi", ?BASIC(8#205), ?PDP10_ALL)
|
||||
, ?D("movsm", ?BASIC(8#206), ?PDP10_ALL)
|
||||
, ?D("movss", ?BASIC(8#207), ?PDP10_ALL)
|
||||
, ?D("movn", ?BASIC(8#210), ?PDP10_ALL)
|
||||
, ?D("movni", ?BASIC(8#211), ?PDP10_ALL)
|
||||
, ?D("movnm", ?BASIC(8#212), ?PDP10_ALL)
|
||||
, ?D("movns", ?BASIC(8#213), ?PDP10_ALL)
|
||||
, ?D("movm", ?BASIC(8#214), ?PDP10_ALL)
|
||||
, ?D("movmi", ?BASIC(8#215), ?PDP10_ALL)
|
||||
, ?D("movmm", ?BASIC(8#216), ?PDP10_ALL)
|
||||
, ?D("movms", ?BASIC(8#217), ?PDP10_ALL)
|
||||
, ?D("imul", ?BASIC(8#220), ?PDP10_ALL)
|
||||
, ?D("imuli", ?BASIC(8#221), ?PDP10_ALL)
|
||||
, ?D("imulm", ?BASIC(8#222), ?PDP10_ALL)
|
||||
, ?D("imulb", ?BASIC(8#223), ?PDP10_ALL)
|
||||
, ?D("mul", ?BASIC(8#224), ?PDP10_ALL)
|
||||
, ?D("muli", ?BASIC(8#225), ?PDP10_ALL)
|
||||
, ?D("mulm", ?BASIC(8#226), ?PDP10_ALL)
|
||||
, ?D("mulb", ?BASIC(8#227), ?PDP10_ALL)
|
||||
, ?D("idiv", ?BASIC(8#230), ?PDP10_ALL)
|
||||
, ?D("idivi", ?BASIC(8#231), ?PDP10_ALL)
|
||||
, ?D("idivm", ?BASIC(8#232), ?PDP10_ALL)
|
||||
, ?D("idivb", ?BASIC(8#233), ?PDP10_ALL)
|
||||
, ?D("div", ?BASIC(8#234), ?PDP10_ALL)
|
||||
, ?D("divi", ?BASIC(8#235), ?PDP10_ALL)
|
||||
, ?D("divm", ?BASIC(8#236), ?PDP10_ALL)
|
||||
, ?D("divb", ?BASIC(8#237), ?PDP10_ALL)
|
||||
, ?D("ash", ?BASIC(8#240), ?PDP10_ALL)
|
||||
, ?D("rot", ?BASIC(8#241), ?PDP10_ALL)
|
||||
, ?D("lsh", ?BASIC(8#242), ?PDP10_ALL)
|
||||
, ?D("jffo", ?BASIC(8#243), ?PDP10_KA10up)
|
||||
, ?D("ashc", ?BASIC(8#244), ?PDP10_ALL)
|
||||
, ?D("rotc", ?BASIC(8#245), ?PDP10_ALL)
|
||||
, ?D("lshc", ?BASIC(8#246), ?PDP10_ALL)
|
||||
%% 247: MUUO (XKL-1, KD10, KC10), unassigned/trapping (KI10, KL10, KS10?), unassigned/nop (KA10, PDP-6?)
|
||||
, ?D("exch", ?BASIC(8#250), ?PDP10_ALL)
|
||||
, ?D("blt", ?BASIC(8#251), ?PDP10_ALL)
|
||||
, ?D("aobjp", ?BASIC(8#252), ?PDP10_ALL)
|
||||
, ?D("aobjn", ?BASIC(8#253), ?PDP10_ALL)
|
||||
|
||||
%% 254: JRST instruction family.
|
||||
%% Special cases first, followed by the generic entry.
|
||||
%% 25414, 25440 (jrstil?), 25444, 25454, 25464, 25470, 25470: unassigned
|
||||
, ?D("portal", ?A_OPCODE(8#25404), ?PDP10_ALL)
|
||||
, ?D("jrstf", ?A_OPCODE(8#25410), ?PDP10_ALL)
|
||||
, ?D("halt", ?A_OPCODE(8#25420), ?PDP10_ALL)
|
||||
, ?D("xjrstf", ?A_OPCODE(8#25424), ?PDP10_KL10up)
|
||||
, ?D("xjen", ?A_OPCODE(8#25430), ?PDP10_KL10up)
|
||||
, ?D("xpcw", ?A_OPCODE(8#25434), ?PDP10_KL10up)
|
||||
, ?D("jen", ?A_OPCODE(8#25450), ?PDP10_ALL)
|
||||
, ?D("sfm", ?A_OPCODE(8#25460), ?PDP10_KL10up)
|
||||
, ?D("jrst", ?A_UNUSED(8#254), ?PDP10_ALL)
|
||||
|
||||
%% 255: JFCL instruction family.
|
||||
%% Special cases first, followed by the generic entry.
|
||||
%% 25514, 25524, 25534, 25544, 25550, 25554, 25560, 25564, 25570, 25574: unassigned
|
||||
, ?D("nop", ?PRIO(?E_UNUSED(?A_OPCODE(8#25500)), 1), ?PDP10_ALL)
|
||||
, ?D("jfov", ?PRIO(?A_OPCODE(8#25504), 1), ?PDP10_KA10up)
|
||||
, ?D("jpcch", ?PRIO(?A_OPCODE(8#25504), 1), ?PDP6)
|
||||
, ?D("jcry1", ?PRIO(?A_OPCODE(8#25510), 1), ?PDP10_ALL)
|
||||
, ?D("jcry0", ?PRIO(?A_OPCODE(8#25520), 1), ?PDP10_ALL)
|
||||
, ?D("jcry", ?PRIO(?A_OPCODE(8#25530), 1), ?PDP10_ALL)
|
||||
, ?D("jov", ?PRIO(?A_OPCODE(8#25540), 1), ?PDP10_ALL)
|
||||
, ?D("jfcl", ?PRIO(?BASIC(8#255), 0), ?PDP10_ALL)
|
||||
|
||||
, ?D("xct", ?A_UNUSED(8#256), ?PDP10_ALL) % A zero, or in user mode, or is a KA10
|
||||
, ?D("pxct", ?A_NONZERO(8#256), ?PDP10_ALL) % A non-zero and in executive mode
|
||||
, ?D("map", ?BASIC(8#257), ?PDP10_KA10_to_KI10) % FIXME: and TOPS-10 KL10, nop on KA10
|
||||
, ?D("pushj", ?BASIC(8#260), ?PDP10_ALL)
|
||||
, ?D("push", ?BASIC(8#261), ?PDP10_ALL)
|
||||
, ?D("pop", ?BASIC(8#262), ?PDP10_ALL)
|
||||
, ?D("popj", ?E_UNUSED(?BASIC(8#263)), ?PDP10_ALL)
|
||||
, ?D("jsr", ?A_UNUSED(8#264), ?PDP10_ALL)
|
||||
, ?D("jsp", ?BASIC(8#265), ?PDP10_ALL)
|
||||
, ?D("jsa", ?BASIC(8#266), ?PDP10_ALL)
|
||||
, ?D("jra", ?BASIC(8#267), ?PDP10_ALL)
|
||||
, ?D("add", ?BASIC(8#270), ?PDP10_ALL)
|
||||
, ?D("addi", ?BASIC(8#271), ?PDP10_ALL)
|
||||
, ?D("addm", ?BASIC(8#272), ?PDP10_ALL)
|
||||
, ?D("addb", ?BASIC(8#273), ?PDP10_ALL)
|
||||
, ?D("sub", ?BASIC(8#274), ?PDP10_ALL)
|
||||
, ?D("subi", ?BASIC(8#275), ?PDP10_ALL)
|
||||
, ?D("subm", ?BASIC(8#276), ?PDP10_ALL)
|
||||
, ?D("subb", ?BASIC(8#277), ?PDP10_ALL)
|
||||
, ?D("cai", ?BASIC(8#300), ?PDP10_ALL)
|
||||
, ?D("cail", ?BASIC(8#301), ?PDP10_ALL)
|
||||
, ?D("caie", ?BASIC(8#302), ?PDP10_ALL)
|
||||
, ?D("caile", ?BASIC(8#303), ?PDP10_ALL)
|
||||
, ?D("caia", ?BASIC(8#304), ?PDP10_ALL)
|
||||
, ?D("caige", ?BASIC(8#305), ?PDP10_ALL)
|
||||
, ?D("cain", ?BASIC(8#306), ?PDP10_ALL)
|
||||
, ?D("caig", ?BASIC(8#307), ?PDP10_ALL)
|
||||
, ?D("cam", ?BASIC(8#310), ?PDP10_ALL)
|
||||
, ?D("caml", ?BASIC(8#311), ?PDP10_ALL)
|
||||
, ?D("came", ?BASIC(8#312), ?PDP10_ALL)
|
||||
, ?D("camle", ?BASIC(8#313), ?PDP10_ALL)
|
||||
, ?D("cama", ?BASIC(8#314), ?PDP10_ALL)
|
||||
, ?D("camge", ?BASIC(8#315), ?PDP10_ALL)
|
||||
, ?D("camn", ?BASIC(8#316), ?PDP10_ALL)
|
||||
, ?D("camg", ?BASIC(8#317), ?PDP10_ALL)
|
||||
, ?D("jump", ?BASIC(8#320), ?PDP10_ALL)
|
||||
, ?D("jumpl", ?BASIC(8#321), ?PDP10_ALL)
|
||||
, ?D("jumpe", ?BASIC(8#322), ?PDP10_ALL)
|
||||
, ?D("jumple", ?BASIC(8#323), ?PDP10_ALL)
|
||||
, ?D("jumpa", ?BASIC(8#324), ?PDP10_ALL)
|
||||
, ?D("jumpge", ?BASIC(8#325), ?PDP10_ALL)
|
||||
, ?D("jumpn", ?BASIC(8#326), ?PDP10_ALL)
|
||||
, ?D("jumpg", ?BASIC(8#327), ?PDP10_ALL)
|
||||
, ?D("skip", ?BASIC(8#330), ?PDP10_ALL)
|
||||
, ?D("skipl", ?BASIC(8#331), ?PDP10_ALL)
|
||||
, ?D("skipe", ?BASIC(8#332), ?PDP10_ALL)
|
||||
, ?D("skiple", ?BASIC(8#333), ?PDP10_ALL)
|
||||
, ?D("skipa", ?BASIC(8#334), ?PDP10_ALL)
|
||||
, ?D("skipge", ?BASIC(8#335), ?PDP10_ALL)
|
||||
, ?D("skipn", ?BASIC(8#336), ?PDP10_ALL)
|
||||
, ?D("skipg", ?BASIC(8#337), ?PDP10_ALL)
|
||||
, ?D("aoj", ?BASIC(8#340), ?PDP10_ALL)
|
||||
, ?D("aojl", ?BASIC(8#341), ?PDP10_ALL)
|
||||
, ?D("aoje", ?BASIC(8#342), ?PDP10_ALL)
|
||||
, ?D("aojle", ?BASIC(8#343), ?PDP10_ALL)
|
||||
, ?D("aoja", ?BASIC(8#344), ?PDP10_ALL)
|
||||
, ?D("aojge", ?BASIC(8#345), ?PDP10_ALL)
|
||||
, ?D("aojn", ?BASIC(8#346), ?PDP10_ALL)
|
||||
, ?D("aojg", ?BASIC(8#347), ?PDP10_ALL)
|
||||
, ?D("aos", ?BASIC(8#350), ?PDP10_ALL)
|
||||
, ?D("aosl", ?BASIC(8#351), ?PDP10_ALL)
|
||||
, ?D("aose", ?BASIC(8#352), ?PDP10_ALL)
|
||||
, ?D("aosle", ?BASIC(8#353), ?PDP10_ALL)
|
||||
, ?D("aosa", ?BASIC(8#354), ?PDP10_ALL)
|
||||
, ?D("aosge", ?BASIC(8#355), ?PDP10_ALL)
|
||||
, ?D("aosn", ?BASIC(8#356), ?PDP10_ALL)
|
||||
, ?D("aosg", ?BASIC(8#357), ?PDP10_ALL)
|
||||
, ?D("soj", ?BASIC(8#360), ?PDP10_ALL)
|
||||
, ?D("sojl", ?BASIC(8#361), ?PDP10_ALL)
|
||||
, ?D("soje", ?BASIC(8#362), ?PDP10_ALL)
|
||||
, ?D("sojle", ?BASIC(8#363), ?PDP10_ALL)
|
||||
, ?D("soja", ?BASIC(8#364), ?PDP10_ALL)
|
||||
, ?D("sojge", ?BASIC(8#365), ?PDP10_ALL)
|
||||
, ?D("sojn", ?BASIC(8#366), ?PDP10_ALL)
|
||||
, ?D("sojg", ?BASIC(8#367), ?PDP10_ALL)
|
||||
, ?D("sos", ?BASIC(8#370), ?PDP10_ALL)
|
||||
, ?D("sosl", ?BASIC(8#371), ?PDP10_ALL)
|
||||
, ?D("sose", ?BASIC(8#372), ?PDP10_ALL)
|
||||
, ?D("sosle", ?BASIC(8#373), ?PDP10_ALL)
|
||||
, ?D("sosa", ?BASIC(8#374), ?PDP10_ALL)
|
||||
, ?D("sosge", ?BASIC(8#375), ?PDP10_ALL)
|
||||
, ?D("sosn", ?BASIC(8#376), ?PDP10_ALL)
|
||||
, ?D("sosg", ?BASIC(8#377), ?PDP10_ALL)
|
||||
, ?D("setz", ?E_UNUSED(?BASIC(8#400)), ?PDP10_ALL)
|
||||
, ?D("setzi", ?E_UNUSED(?BASIC(8#401)), ?PDP10_ALL)
|
||||
, ?D("setzm", ?A_UNUSED(8#402), ?PDP10_ALL)
|
||||
, ?D("setzb", ?BASIC(8#403), ?PDP10_ALL)
|
||||
, ?D("and", ?BASIC(8#404), ?PDP10_ALL)
|
||||
, ?D("andi", ?BASIC(8#405), ?PDP10_ALL)
|
||||
, ?D("andm", ?BASIC(8#406), ?PDP10_ALL)
|
||||
, ?D("andb", ?BASIC(8#407), ?PDP10_ALL)
|
||||
, ?D("andca", ?BASIC(8#410), ?PDP10_ALL)
|
||||
, ?D("andcai", ?BASIC(8#411), ?PDP10_ALL)
|
||||
, ?D("andcam", ?BASIC(8#412), ?PDP10_ALL)
|
||||
, ?D("andcab", ?BASIC(8#413), ?PDP10_ALL)
|
||||
, ?D("setm", ?BASIC(8#414), ?PDP10_ALL)
|
||||
, ?D("xmovei", ?SECTION_NONZERO(?BASIC(8#415)),?PDP10_KL10up) % in non-zero section, setmi in zero section
|
||||
, ?D("setmi", ?SECTION_ZERO(?BASIC(8#415)), ?PDP10_ALL) % on KL10up depends on current section
|
||||
, ?D("setmm", ?A_UNUSED(8#416), ?PDP10_ALL)
|
||||
, ?D("setmb", ?BASIC(8#417), ?PDP10_ALL)
|
||||
, ?D("andcm", ?BASIC(8#420), ?PDP10_ALL)
|
||||
, ?D("andcmi", ?BASIC(8#421), ?PDP10_ALL)
|
||||
, ?D("andcmm", ?BASIC(8#422), ?PDP10_ALL)
|
||||
, ?D("andcmb", ?BASIC(8#423), ?PDP10_ALL)
|
||||
, ?D("seta", ?E_UNUSED(?BASIC(8#424)), ?PDP10_ALL)
|
||||
, ?D("setai", ?E_UNUSED(?BASIC(8#425)), ?PDP10_ALL)
|
||||
, ?D("setam", ?BASIC(8#426), ?PDP10_ALL)
|
||||
, ?D("setab", ?BASIC(8#427), ?PDP10_ALL)
|
||||
, ?D("xor", ?BASIC(8#430), ?PDP10_ALL)
|
||||
, ?D("xori", ?BASIC(8#431), ?PDP10_ALL)
|
||||
, ?D("xorm", ?BASIC(8#432), ?PDP10_ALL)
|
||||
, ?D("xorb", ?BASIC(8#433), ?PDP10_ALL)
|
||||
, ?D("ior", ?PRIO(?BASIC(8#434), 0), ?PDP10_ALL)
|
||||
, ?D("or", ?PRIO(?BASIC(8#434), 1), ?PDP10_ALL) % alias for ior
|
||||
, ?D("iori", ?PRIO(?BASIC(8#435), 0), ?PDP10_ALL)
|
||||
, ?D("ori", ?PRIO(?BASIC(8#435), 1), ?PDP10_ALL) % alias for iori
|
||||
, ?D("iorm", ?PRIO(?BASIC(8#436), 0), ?PDP10_ALL)
|
||||
, ?D("orm", ?PRIO(?BASIC(8#436), 1), ?PDP10_ALL) % alias for iorm
|
||||
, ?D("iorb", ?PRIO(?BASIC(8#437), 0), ?PDP10_ALL)
|
||||
, ?D("orb", ?PRIO(?BASIC(8#437), 1), ?PDP10_ALL) % alias for iorb
|
||||
, ?D("andcb", ?BASIC(8#440), ?PDP10_ALL)
|
||||
, ?D("andcbi", ?BASIC(8#441), ?PDP10_ALL)
|
||||
, ?D("andcbm", ?BASIC(8#442), ?PDP10_ALL)
|
||||
, ?D("andcbb", ?BASIC(8#443), ?PDP10_ALL)
|
||||
, ?D("eqv", ?BASIC(8#444), ?PDP10_ALL)
|
||||
, ?D("eqvi", ?BASIC(8#445), ?PDP10_ALL)
|
||||
, ?D("eqvm", ?BASIC(8#446), ?PDP10_ALL)
|
||||
, ?D("eqvb", ?BASIC(8#447), ?PDP10_ALL)
|
||||
, ?D("setca", ?E_UNUSED(?BASIC(8#450)), ?PDP10_ALL)
|
||||
, ?D("setcai", ?E_UNUSED(?BASIC(8#451)), ?PDP10_ALL)
|
||||
, ?D("setcam", ?BASIC(8#452), ?PDP10_ALL)
|
||||
, ?D("setcab", ?BASIC(8#453), ?PDP10_ALL)
|
||||
, ?D("orca", ?BASIC(8#454), ?PDP10_ALL)
|
||||
, ?D("orcai", ?BASIC(8#455), ?PDP10_ALL)
|
||||
, ?D("orcam", ?BASIC(8#456), ?PDP10_ALL)
|
||||
, ?D("orcab", ?BASIC(8#457), ?PDP10_ALL)
|
||||
, ?D("setcm", ?BASIC(8#460), ?PDP10_ALL)
|
||||
, ?D("setcmi", ?BASIC(8#461), ?PDP10_ALL)
|
||||
, ?D("setcmm", ?A_UNUSED(8#462), ?PDP10_ALL)
|
||||
, ?D("setcmb", ?BASIC(8#463), ?PDP10_ALL)
|
||||
, ?D("orcm", ?BASIC(8#464), ?PDP10_ALL)
|
||||
, ?D("orcmi", ?BASIC(8#465), ?PDP10_ALL)
|
||||
, ?D("orcmm", ?BASIC(8#466), ?PDP10_ALL)
|
||||
, ?D("orcmb", ?BASIC(8#467), ?PDP10_ALL)
|
||||
, ?D("orcb", ?BASIC(8#470), ?PDP10_ALL)
|
||||
, ?D("orcbi", ?BASIC(8#471), ?PDP10_ALL)
|
||||
, ?D("orcbm", ?BASIC(8#472), ?PDP10_ALL)
|
||||
, ?D("orcbb", ?BASIC(8#473), ?PDP10_ALL)
|
||||
, ?D("seto", ?E_UNUSED(?BASIC(8#474)), ?PDP10_ALL)
|
||||
, ?D("setoi", ?E_UNUSED(?BASIC(8#475)), ?PDP10_ALL)
|
||||
, ?D("setom", ?A_UNUSED(8#476), ?PDP10_ALL)
|
||||
, ?D("setob", ?BASIC(8#477), ?PDP10_ALL)
|
||||
, ?D("hll", ?BASIC(8#500), ?PDP10_ALL)
|
||||
, ?D("xhlli", ?SECTION_NONZERO(?BASIC(8#501)),?PDP10_KL10up) % in non-zero section, hlli in zero section
|
||||
, ?D("hlli", ?SECTION_ZERO(?BASIC(8#501)), ?PDP10_ALL) % on KL10up depends on current section
|
||||
, ?D("hllm", ?BASIC(8#502), ?PDP10_ALL)
|
||||
, ?D("hlls", ?BASIC(8#503), ?PDP10_ALL)
|
||||
, ?D("hrl", ?BASIC(8#504), ?PDP10_ALL)
|
||||
, ?D("hrli", ?BASIC(8#505), ?PDP10_ALL)
|
||||
, ?D("hrlm", ?BASIC(8#506), ?PDP10_ALL)
|
||||
, ?D("hrls", ?BASIC(8#507), ?PDP10_ALL)
|
||||
, ?D("hllz", ?BASIC(8#510), ?PDP10_ALL)
|
||||
, ?D("hllzi", ?BASIC(8#511), ?PDP10_ALL)
|
||||
, ?D("hllzm", ?BASIC(8#512), ?PDP10_ALL)
|
||||
, ?D("hllzs", ?BASIC(8#513), ?PDP10_ALL)
|
||||
, ?D("hrlz", ?BASIC(8#514), ?PDP10_ALL)
|
||||
, ?D("hrlzi", ?BASIC(8#515), ?PDP10_ALL)
|
||||
, ?D("hrlzm", ?BASIC(8#516), ?PDP10_ALL)
|
||||
, ?D("hrlzs", ?BASIC(8#517), ?PDP10_ALL)
|
||||
, ?D("hllo", ?BASIC(8#520), ?PDP10_ALL)
|
||||
, ?D("hlloi", ?BASIC(8#521), ?PDP10_ALL)
|
||||
, ?D("hllom", ?BASIC(8#522), ?PDP10_ALL)
|
||||
, ?D("hllos", ?BASIC(8#523), ?PDP10_ALL)
|
||||
, ?D("hrlo", ?BASIC(8#524), ?PDP10_ALL)
|
||||
, ?D("hrloi", ?BASIC(8#525), ?PDP10_ALL)
|
||||
, ?D("hrlom", ?BASIC(8#526), ?PDP10_ALL)
|
||||
, ?D("hrlos", ?BASIC(8#527), ?PDP10_ALL)
|
||||
, ?D("hlle", ?BASIC(8#530), ?PDP10_ALL)
|
||||
, ?D("hllei", ?BASIC(8#531), ?PDP10_ALL)
|
||||
, ?D("hllem", ?BASIC(8#532), ?PDP10_ALL)
|
||||
, ?D("hlles", ?BASIC(8#533), ?PDP10_ALL)
|
||||
, ?D("hrle", ?BASIC(8#534), ?PDP10_ALL)
|
||||
, ?D("hrlei", ?BASIC(8#535), ?PDP10_ALL)
|
||||
, ?D("hrlem", ?BASIC(8#536), ?PDP10_ALL)
|
||||
, ?D("hrles", ?BASIC(8#537), ?PDP10_ALL)
|
||||
, ?D("hrr", ?BASIC(8#540), ?PDP10_ALL)
|
||||
, ?D("hrri", ?BASIC(8#541), ?PDP10_ALL)
|
||||
, ?D("hrrm", ?BASIC(8#542), ?PDP10_ALL)
|
||||
, ?D("hrrs", ?BASIC(8#543), ?PDP10_ALL)
|
||||
, ?D("hlr", ?BASIC(8#544), ?PDP10_ALL)
|
||||
, ?D("hlri", ?BASIC(8#545), ?PDP10_ALL)
|
||||
, ?D("hlrm", ?BASIC(8#546), ?PDP10_ALL)
|
||||
, ?D("hlrs", ?BASIC(8#547), ?PDP10_ALL)
|
||||
, ?D("hrrz", ?BASIC(8#550), ?PDP10_ALL)
|
||||
, ?D("hrrzi", ?BASIC(8#551), ?PDP10_ALL)
|
||||
, ?D("hrrzm", ?BASIC(8#552), ?PDP10_ALL)
|
||||
, ?D("hrrzs", ?BASIC(8#553), ?PDP10_ALL)
|
||||
, ?D("hlrz", ?BASIC(8#554), ?PDP10_ALL)
|
||||
, ?D("hlrzi", ?BASIC(8#555), ?PDP10_ALL)
|
||||
, ?D("hlrzm", ?BASIC(8#556), ?PDP10_ALL)
|
||||
, ?D("hlrzs", ?BASIC(8#557), ?PDP10_ALL)
|
||||
, ?D("hrro", ?BASIC(8#560), ?PDP10_ALL)
|
||||
, ?D("hrroi", ?BASIC(8#561), ?PDP10_ALL)
|
||||
, ?D("hrrom", ?BASIC(8#562), ?PDP10_ALL)
|
||||
, ?D("hrros", ?BASIC(8#563), ?PDP10_ALL)
|
||||
, ?D("hlro", ?BASIC(8#564), ?PDP10_ALL)
|
||||
, ?D("hlroi", ?BASIC(8#565), ?PDP10_ALL)
|
||||
, ?D("hlrom", ?BASIC(8#566), ?PDP10_ALL)
|
||||
, ?D("hlros", ?BASIC(8#567), ?PDP10_ALL)
|
||||
, ?D("hrre", ?BASIC(8#570), ?PDP10_ALL)
|
||||
, ?D("hrrei", ?BASIC(8#571), ?PDP10_ALL)
|
||||
, ?D("hrrem", ?BASIC(8#572), ?PDP10_ALL)
|
||||
, ?D("hrres", ?BASIC(8#573), ?PDP10_ALL)
|
||||
, ?D("hlre", ?BASIC(8#574), ?PDP10_ALL)
|
||||
, ?D("hlrei", ?BASIC(8#575), ?PDP10_ALL)
|
||||
, ?D("hlrem", ?BASIC(8#576), ?PDP10_ALL)
|
||||
, ?D("hlres", ?BASIC(8#577), ?PDP10_ALL)
|
||||
, ?D("trn", ?BASIC(8#600), ?PDP10_ALL)
|
||||
, ?D("tln", ?BASIC(8#601), ?PDP10_ALL)
|
||||
, ?D("trne", ?BASIC(8#602), ?PDP10_ALL)
|
||||
, ?D("tlne", ?BASIC(8#603), ?PDP10_ALL)
|
||||
, ?D("trna", ?BASIC(8#604), ?PDP10_ALL)
|
||||
, ?D("tlna", ?BASIC(8#605), ?PDP10_ALL)
|
||||
, ?D("trnn", ?BASIC(8#606), ?PDP10_ALL)
|
||||
, ?D("tlnn", ?BASIC(8#607), ?PDP10_ALL)
|
||||
, ?D("tdn", ?BASIC(8#610), ?PDP10_ALL)
|
||||
, ?D("tsn", ?BASIC(8#611), ?PDP10_ALL)
|
||||
, ?D("tdne", ?BASIC(8#612), ?PDP10_ALL)
|
||||
, ?D("tsne", ?BASIC(8#613), ?PDP10_ALL)
|
||||
, ?D("tdna", ?BASIC(8#614), ?PDP10_ALL)
|
||||
, ?D("tsna", ?BASIC(8#615), ?PDP10_ALL)
|
||||
, ?D("tdnn", ?BASIC(8#616), ?PDP10_ALL)
|
||||
, ?D("tsnn", ?BASIC(8#617), ?PDP10_ALL)
|
||||
, ?D("trz", ?BASIC(8#620), ?PDP10_ALL)
|
||||
, ?D("tlz", ?BASIC(8#621), ?PDP10_ALL)
|
||||
, ?D("trze", ?BASIC(8#622), ?PDP10_ALL)
|
||||
, ?D("tlze", ?BASIC(8#623), ?PDP10_ALL)
|
||||
, ?D("trza", ?BASIC(8#624), ?PDP10_ALL)
|
||||
, ?D("tlza", ?BASIC(8#625), ?PDP10_ALL)
|
||||
, ?D("trzn", ?BASIC(8#626), ?PDP10_ALL)
|
||||
, ?D("tlzn", ?BASIC(8#627), ?PDP10_ALL)
|
||||
, ?D("tdz", ?BASIC(8#630), ?PDP10_ALL)
|
||||
, ?D("tsz", ?BASIC(8#631), ?PDP10_ALL)
|
||||
, ?D("tdze", ?BASIC(8#632), ?PDP10_ALL)
|
||||
, ?D("tsze", ?BASIC(8#633), ?PDP10_ALL)
|
||||
, ?D("tdza", ?BASIC(8#634), ?PDP10_ALL)
|
||||
, ?D("tsza", ?BASIC(8#635), ?PDP10_ALL)
|
||||
, ?D("tdzn", ?BASIC(8#636), ?PDP10_ALL)
|
||||
, ?D("tszn", ?BASIC(8#637), ?PDP10_ALL)
|
||||
, ?D("trc", ?BASIC(8#640), ?PDP10_ALL)
|
||||
, ?D("tlc", ?BASIC(8#641), ?PDP10_ALL)
|
||||
, ?D("trce", ?BASIC(8#642), ?PDP10_ALL)
|
||||
, ?D("tlce", ?BASIC(8#643), ?PDP10_ALL)
|
||||
, ?D("trca", ?BASIC(8#644), ?PDP10_ALL)
|
||||
, ?D("tlca", ?BASIC(8#645), ?PDP10_ALL)
|
||||
, ?D("trcn", ?BASIC(8#646), ?PDP10_ALL)
|
||||
, ?D("tlcn", ?BASIC(8#647), ?PDP10_ALL)
|
||||
, ?D("tdc", ?BASIC(8#650), ?PDP10_ALL)
|
||||
, ?D("tsc", ?BASIC(8#651), ?PDP10_ALL)
|
||||
, ?D("tdce", ?BASIC(8#652), ?PDP10_ALL)
|
||||
, ?D("tsce", ?BASIC(8#653), ?PDP10_ALL)
|
||||
, ?D("tdca", ?BASIC(8#654), ?PDP10_ALL)
|
||||
, ?D("tsca", ?BASIC(8#655), ?PDP10_ALL)
|
||||
, ?D("tdcn", ?BASIC(8#656), ?PDP10_ALL)
|
||||
, ?D("tscn", ?BASIC(8#657), ?PDP10_ALL)
|
||||
, ?D("tro", ?BASIC(8#660), ?PDP10_ALL)
|
||||
, ?D("tlo", ?BASIC(8#661), ?PDP10_ALL)
|
||||
, ?D("troe", ?BASIC(8#662), ?PDP10_ALL)
|
||||
, ?D("tloe", ?BASIC(8#663), ?PDP10_ALL)
|
||||
, ?D("troa", ?BASIC(8#664), ?PDP10_ALL)
|
||||
, ?D("tloa", ?BASIC(8#665), ?PDP10_ALL)
|
||||
, ?D("tron", ?BASIC(8#666), ?PDP10_ALL)
|
||||
, ?D("tlon", ?BASIC(8#667), ?PDP10_ALL)
|
||||
, ?D("tdo", ?BASIC(8#670), ?PDP10_ALL)
|
||||
, ?D("tso", ?BASIC(8#671), ?PDP10_ALL)
|
||||
, ?D("tdoe", ?BASIC(8#672), ?PDP10_ALL)
|
||||
, ?D("tsoe", ?BASIC(8#673), ?PDP10_ALL)
|
||||
, ?D("tdoa", ?BASIC(8#674), ?PDP10_ALL)
|
||||
, ?D("tsoa", ?BASIC(8#675), ?PDP10_ALL)
|
||||
, ?D("tdon", ?BASIC(8#676), ?PDP10_ALL)
|
||||
, ?D("tson", ?BASIC(8#677), ?PDP10_ALL)
|
||||
|
||||
%% IO and system instructions. Lots of model-specifics here.
|
||||
, ?D("aprid", ?PRIO(?A_OPCODE(8#70000), 1), ?PDP10_KL10any bor ?PDP10_KS10 bor ?PDP10_XKL1) % aliases BLKI APR, and APR0
|
||||
, ?D("rsw", ?PRIO(?A_OPCODE(8#70004), 1), ?PDP10_KA10_to_KI10) % aliases DATAI APR,
|
||||
, ?D("wrfil", ?PRIO(?A_OPCODE(8#70010), 1), ?PDP10_KL10any) % aliases BLKO APR, and SYSID
|
||||
, ?D("wrapr", ?PRIO(?A_OPCODE(8#70020), 1), ?PDP10_KS10 bor ?PDP10_XKL1) % aliases CONO APR, and APR0
|
||||
, ?D("rdapr", ?PRIO(?A_OPCODE(8#70024), 1), ?PDP10_KS10 bor ?PDP10_XKL1) % aliases CONI APR, and APR0
|
||||
, ?D("rdera", ?PRIO(?A_OPCODE(8#70040), 1), ?PDP10_KL10any) % aliases BLKI PI, and WCTRLF
|
||||
, ?D("sbdiag", ?PRIO(?A_OPCODE(8#70050), 1), ?PDP10_KL10any) % aliases BLKO PI, and SIMIRD
|
||||
, ?D("wrpi", ?PRIO(?A_OPCODE(8#70060), 1), ?PDP10_KS10 bor ?PDP10_XKL1) % aliases CONO PI, and APR0
|
||||
, ?D("rdpi", ?PRIO(?A_OPCODE(8#70064), 1), ?PDP10_KS10 bor ?PDP10_XKL1) % aliases CONI PI, and APR0
|
||||
, ?D("rdubr", ?PRIO(?A_OPCODE(8#70104), 1), ?PDP10_KS10 bor ?PDP10_XKL1) % aliases DATAI PAG, and APR1
|
||||
, ?D("clrpt", ?PRIO(?A_OPCODE(8#70110), 1), ?PDP10_KL10any bor ?PDP10_KS10 bor ?PDP10_XKL1) % aliases BLKO PAG, and APR1
|
||||
, ?D("wrubr", ?PRIO(?A_OPCODE(8#70114), 1), ?PDP10_KS10 bor ?PDP10_XKL1) % aliases DATAO PAG, and APR1
|
||||
, ?D("wrebr", ?A_OPCODE(8#70120), ?PDP10_KS10) % aliases CONO PAG,
|
||||
, ?D("rdebr", ?A_OPCODE(8#70124), ?PDP10_KS10) % aliases CONI PAG,
|
||||
, ?D("swpia", ?PRIO(?E_UNUSED(?A_OPCODE(8#70144)), 1), ?PDP10_KL10any bor ?PDP10_XKL1) % aliases DATAI CCA, and APR1
|
||||
, ?D("swpva", ?PRIO(?E_UNUSED(?A_OPCODE(8#70150)), 1), ?PDP10_KL10any bor ?PDP10_XKL1) % aliases BLKO CCA, and APR1
|
||||
, ?D("swpua", ?PRIO(?E_UNUSED(?A_OPCODE(8#70154)), 1), ?PDP10_KL10any bor ?PDP10_XKL1) % aliases DATAO CCA, and APR1
|
||||
, ?D("swpio", ?PRIO(?A_OPCODE(8#70164), 1), ?PDP10_KL10any bor ?PDP10_XKL1) % aliases CONI CCA, and APR1
|
||||
, ?D("swpvo", ?PRIO(?A_OPCODE(8#70170), 1), ?PDP10_KL10any bor ?PDP10_XKL1) % aliases CONSZ CCA, and APR1
|
||||
, ?D("swpuo", ?PRIO(?A_OPCODE(8#70174), 1), ?PDP10_KL10any bor ?PDP10_XKL1) % aliases CONSO CCA, and APR1
|
||||
, ?D("rdperf", ?PRIO(?A_OPCODE(8#70200), 2), ?PDP10_KL10any) % aliases BLKI TIM, APR2, and RDSPB
|
||||
, ?D("rdspb", ?PRIO(?A_OPCODE(8#70200), 1), ?PDP10_KS10 bor ?PDP10_XKL1) % aliasesr BLKI TIM, APR2, and RDPERF
|
||||
, ?D("rdtime", ?PRIO(?A_OPCODE(8#70204), 1), ?PDP10_KL10any band bnot ?PDP10_XKL1) % aliases DATAI TIM, (FIXME: was KL10any)
|
||||
, ?D("rdcsb", ?PRIO(?A_OPCODE(8#70204), 1), ?PDP10_KS10 bor ?PDP10_XKL1) % aliases DATAI TIM, and APR2
|
||||
, ?D("wrpae", ?PRIO(?A_OPCODE(8#70210), 2), ?PDP10_KL10any) % aliases BLKO TIM, and APR2
|
||||
, ?D("rdpur", ?PRIO(?A_OPCODE(8#70210), 1), ?PDP10_KS10 bor ?PDP10_XKL1) % aliases BLKO TIM, APR2, and WRPAE
|
||||
, ?D("rdcstm", ?PRIO(?A_OPCODE(8#70214), 1), ?PDP10_KS10 bor ?PDP10_XKL1) % aliases APR2
|
||||
, ?D("rdtim", ?A_OPCODE(8#70220), ?PDP10_KS10) % aliases CONO TIM,
|
||||
, ?D("rdint", ?A_OPCODE(8#70224), ?PDP10_KS10) % aliases CONI TIM,
|
||||
, ?D("rdhsb", ?A_OPCODE(8#70230), ?PDP10_KS10) % aliases CONSZ
|
||||
, ?D("rdmact", ?PRIO(?A_OPCODE(8#70240), 2), ?PDP10_KL10any) % aliases BLKI MTR, APR2, and RDMACT
|
||||
, ?D("wrspb", ?PRIO(?A_OPCODE(8#70240), 1), ?PDP10_KS10 bor ?PDP10_XKL1) % aliases BLKI MTR, APR2, and RDMACT
|
||||
, ?D("rdeact", ?PRIO(?A_OPCODE(8#70244), 2), ?PDP10_KL10any) % aliases DATAI MTR, APR2, and WRCSB
|
||||
, ?D("wrcsb", ?PRIO(?A_OPCODE(8#70244), 1), ?PDP10_KS10 bor ?PDP10_XKL1) % aliases DATAI MTR, APR2, and RDEACT
|
||||
, ?D("wrpur", ?PRIO(?A_OPCODE(8#70250), 1), ?PDP10_KS10 bor ?PDP10_XKL1) % aliases APR2
|
||||
, ?D("wrcstm", ?PRIO(?A_OPCODE(8#70254), 1), ?PDP10_KS10 bor ?PDP10_XKL1) % aliases APR2
|
||||
% , ?D("wrtime", ?A_OPCODE(8#70260), ?PDP10_KL10any) % aliases CONO MTR (FIXME: ?)
|
||||
, ?D("wrtim", ?A_OPCODE(8#70260), ?PDP10_KS10)
|
||||
, ?D("wrint", ?A_OPCODE(8#70264), ?PDP10_KS10)
|
||||
, ?D("wrhsb", ?A_OPCODE(8#70270), ?PDP10_KS10)
|
||||
, ?D("umove", ?BASIC(8#704), ?PDP10_KS10)
|
||||
, ?D("umovem", ?BASIC(8#705), ?PDP10_KS10)
|
||||
, ?D("tioe", ?BASIC(8#710), ?PDP10_KS10)
|
||||
, ?D("tion", ?BASIC(8#711), ?PDP10_KS10)
|
||||
, ?D("rdio", ?BASIC(8#712), ?PDP10_KS10)
|
||||
, ?D("wrio", ?BASIC(8#713), ?PDP10_KS10)
|
||||
, ?D("bsio", ?BASIC(8#714), ?PDP10_KS10)
|
||||
, ?D("bcio", ?BASIC(8#715), ?PDP10_KS10)
|
||||
, ?D("tioeb", ?BASIC(8#720), ?PDP10_KS10)
|
||||
, ?D("tionb", ?BASIC(8#721), ?PDP10_KS10)
|
||||
, ?D("rdiob", ?BASIC(8#722), ?PDP10_KS10)
|
||||
, ?D("wriob", ?BASIC(8#723), ?PDP10_KS10)
|
||||
, ?D("bsiob", ?BASIC(8#724), ?PDP10_KS10)
|
||||
, ?D("bciob", ?BASIC(8#725), ?PDP10_KS10)
|
||||
|
||||
%% KA10/KL10 ITS system instructions.
|
||||
, ?D("lpm", ?A_OPCODE(8#10200), ?PDP10_KA10_ITS bor ?PDP10_KL10_ITS)
|
||||
, ?D("spm", ?A_OPCODE(8#10204), ?PDP10_KA10_ITS bor ?PDP10_KL10_ITS)
|
||||
, ?D("lpmr", ?A_OPCODE(8#10210), ?PDP10_KA10_ITS bor ?PDP10_KL10_ITS)
|
||||
, ?D("lpmri", ?A_OPCODE(8#10230), ?PDP10_KA10_ITS bor ?PDP10_KL10_ITS)
|
||||
|
||||
%% KA10 ITS system instructions.
|
||||
, ?D("xctr", ?A_OPCODE(8#10300), ?PDP10_KA10_ITS)
|
||||
, ?D("xctri", ?A_OPCODE(8#10320), ?PDP10_KA10_ITS)
|
||||
|
||||
%% KL10 ITS system instructions.
|
||||
, ?D("xctr", ?BASIC(8#074), ?PDP10_KL10_ITS)
|
||||
, ?D("xctri", ?BASIC(8#075), ?PDP10_KL10_ITS)
|
||||
, ?D("lpmr", ?BASIC(8#076), ?PDP10_KL10_ITS)
|
||||
, ?D("spm", ?BASIC(8#077), ?PDP10_KL10_ITS)
|
||||
|
||||
%% KS10 ITS system instructions.
|
||||
, ?D("xctr", ?BASIC(8#102), ?PDP10_KS10_ITS)
|
||||
, ?D("xctri", ?BASIC(8#103), ?PDP10_KS10_ITS)
|
||||
, ?D("aprid", ?PRIO(?A_OPCODE(8#70000), 1), ?PDP10_KS10_ITS) % aliases blki
|
||||
|
||||
%% ITS appears to prefer CONO and CONI over these mnemonics
|
||||
% , ?D("wrapr", ?A_OPCODE(8#70020), ?PDP10_KS10_ITS)
|
||||
% , ?D("rdapr", ?A_OPCODE(8#70024), ?PDP10_KS10_ITS)
|
||||
% , ?D("wrpi", ?A_OPCODE(8#70060), ?PDP10_KS10_ITS)
|
||||
% , ?D("rdpi", ?A_OPCODE(8#70064), ?PDP10_KS10_ITS)
|
||||
|
||||
, ?D("clrcsh", ?PRIO(?A_OPCODE(8#70100), 1), ?PDP10_KS10_ITS) % aliases blki
|
||||
, ?D("rdubr", ?PRIO(?A_OPCODE(8#70104), 1), ?PDP10_KS10_ITS) % aliases datai
|
||||
, ?D("clrpt", ?PRIO(?A_OPCODE(8#70110), 1), ?PDP10_KS10_ITS) % aliases blko
|
||||
, ?D("wrubr", ?PRIO(?A_OPCODE(8#70114), 1), ?PDP10_KS10_ITS) % aliases datao
|
||||
, ?D("wrebr", ?PRIO(?A_OPCODE(8#70120), 1), ?PDP10_KS10_ITS) % aliases cono
|
||||
, ?D("rdebr", ?PRIO(?A_OPCODE(8#70124), 1), ?PDP10_KS10_ITS) % aliases coni
|
||||
, ?D("sdbr1", ?PRIO(?A_OPCODE(8#70200), 1), ?PDP10_KS10_ITS) % aliases blki
|
||||
, ?D("sdbr2", ?PRIO(?A_OPCODE(8#70204), 1), ?PDP10_KS10_ITS) % aliases datai
|
||||
, ?D("sdbr3", ?PRIO(?A_OPCODE(8#70210), 1), ?PDP10_KS10_ITS) % aliases blko
|
||||
, ?D("sdbr4", ?PRIO(?A_OPCODE(8#70214), 1), ?PDP10_KS10_ITS) % aliases datao
|
||||
, ?D("rdtim", ?PRIO(?A_OPCODE(8#70220), 1), ?PDP10_KS10_ITS) % aliases cono
|
||||
, ?D("rdint", ?PRIO(?A_OPCODE(8#70224), 1), ?PDP10_KS10_ITS) % aliases coni
|
||||
, ?D("rdhsb", ?PRIO(?A_OPCODE(8#70230), 1), ?PDP10_KS10_ITS) % aliases consz
|
||||
, ?D("spm", ?PRIO(?A_OPCODE(8#70234), 1), ?PDP10_KS10_ITS) % aliases conso
|
||||
, ?D("ldbr1", ?PRIO(?A_OPCODE(8#70240), 1), ?PDP10_KS10_ITS) % aliases blki
|
||||
, ?D("ldbr2", ?PRIO(?A_OPCODE(8#70244), 1), ?PDP10_KS10_ITS) % aliases datai
|
||||
, ?D("ldbr3", ?PRIO(?A_OPCODE(8#70250), 1), ?PDP10_KS10_ITS) % aliases blko
|
||||
, ?D("ldbr4", ?PRIO(?A_OPCODE(8#70254), 1), ?PDP10_KS10_ITS) % aliases datao
|
||||
, ?D("wrtim", ?PRIO(?A_OPCODE(8#70260), 1), ?PDP10_KS10_ITS) % aliases cono
|
||||
, ?D("wrint", ?PRIO(?A_OPCODE(8#70264), 1), ?PDP10_KS10_ITS) % aliases coni
|
||||
, ?D("wrhsb", ?PRIO(?A_OPCODE(8#70270), 1), ?PDP10_KS10_ITS) % aliases consz
|
||||
, ?D("lpmr", ?PRIO(?A_OPCODE(8#70274), 1), ?PDP10_KS10_ITS) % aliases conso
|
||||
, ?D("umove", ?PRIO(?BASIC(8#704), 1), ?PDP10_KS10_ITS) % aliases blki
|
||||
, ?D("umovem", ?PRIO(?BASIC(8#705), 1), ?PDP10_KS10_ITS) % aliases blki
|
||||
, ?D("iordi", ?PRIO(?BASIC(8#710), 1), ?PDP10_KS10_ITS) % aliases blki
|
||||
, ?D("iordq", ?PRIO(?BASIC(8#711), 1), ?PDP10_KS10_ITS) % aliases blki
|
||||
, ?D("iord", ?PRIO(?BASIC(8#712), 1), ?PDP10_KS10_ITS) % aliases blki
|
||||
, ?D("iowr", ?PRIO(?BASIC(8#713), 1), ?PDP10_KS10_ITS) % aliases blki
|
||||
, ?D("iowri", ?PRIO(?BASIC(8#714), 1), ?PDP10_KS10_ITS) % aliases blki
|
||||
, ?D("iowrq", ?PRIO(?BASIC(8#715), 1), ?PDP10_KS10_ITS) % aliases blki
|
||||
, ?D("bltbu", ?PRIO(?BASIC(8#716), 1), ?PDP10_KS10_ITS) % aliases blki
|
||||
, ?D("bltub", ?PRIO(?BASIC(8#717), 1), ?PDP10_KS10_ITS) % aliases blki
|
||||
, ?D("iordbi", ?PRIO(?BASIC(8#720), 1), ?PDP10_KS10_ITS) % aliases blki
|
||||
, ?D("iordbq", ?PRIO(?BASIC(8#721), 1), ?PDP10_KS10_ITS) % aliases blki
|
||||
, ?D("iordb", ?PRIO(?BASIC(8#722), 1), ?PDP10_KS10_ITS) % aliases blki
|
||||
, ?D("iowrb", ?PRIO(?BASIC(8#723), 1), ?PDP10_KS10_ITS) % aliases blki
|
||||
, ?D("iowrbi", ?PRIO(?BASIC(8#724), 1), ?PDP10_KS10_ITS) % aliases blki
|
||||
, ?D("iowrbq", ?PRIO(?BASIC(8#725), 1), ?PDP10_KS10_ITS) % aliases blki
|
||||
|
||||
%% XKL-1 system instructions.
|
||||
, ?D("rdadb", ?PRIO(?A_OPCODE(8#70004), 1), ?PDP10_XKL1) % special cases of apr0
|
||||
, ?D("sysid", ?PRIO(?A_OPCODE(8#70010), 2), ?PDP10_XKL1) % aliases WRFIL
|
||||
, ?D("wradb", ?PRIO(?A_OPCODE(8#70014), 1), ?PDP10_XKL1)
|
||||
, ?D("szapr", ?PRIO(?A_OPCODE(8#70030), 1), ?PDP10_XKL1)
|
||||
, ?D("snapr", ?PRIO(?A_OPCODE(8#70034), 1), ?PDP10_XKL1)
|
||||
, ?D("wctrlf", ?PRIO(?A_OPCODE(8#70040), 2), ?PDP10_XKL1) % aliases RDERA
|
||||
, ?D("rctrlf", ?PRIO(?A_OPCODE(8#70044), 1), ?PDP10_XKL1)
|
||||
, ?D("simird", ?PRIO(?A_OPCODE(8#70050), 2), ?PDP10_XKL1) % aliases SBDIAG
|
||||
, ?D("wrkpa", ?PRIO(?A_OPCODE(8#70054), 1), ?PDP10_XKL1)
|
||||
, ?D("szpi", ?PRIO(?A_OPCODE(8#70070), 1), ?PDP10_XKL1)
|
||||
, ?D("snpi", ?PRIO(?A_OPCODE(8#70074), 1), ?PDP10_XKL1)
|
||||
, ?D("apr0", ?PRIO(?BASIC(8#700), 0), ?PDP10_XKL1)
|
||||
, ?D("wrerr", ?PRIO(?A_OPCODE(8#70120), 1), ?PDP10_XKL1) % special cases of apr1
|
||||
, ?D("rderr", ?PRIO(?A_OPCODE(8#70124), 1), ?PDP10_XKL1)
|
||||
, ?D("wrctx", ?PRIO(?A_OPCODE(8#70130), 1), ?PDP10_XKL1)
|
||||
, ?D("rdctx", ?PRIO(?A_OPCODE(8#70134), 1), ?PDP10_XKL1)
|
||||
, ?D("rddcsh", ?PRIO(?A_OPCODE(8#70140), 1), ?PDP10_XKL1)
|
||||
, ?D("dwrcsh", ?PRIO(?A_OPCODE(8#70160), 1), ?PDP10_XKL1)
|
||||
, ?D("apr1", ?PRIO(?BASIC(8#701), 0), ?PDP10_XKL1)
|
||||
, ?D("rditm", ?PRIO(?A_OPCODE(8#70220), 1), ?PDP10_XKL1) % special cases of apr2
|
||||
, ?D("rdtime", ?PRIO(?A_OPCODE(8#70224), 1), ?PDP10_XKL1)
|
||||
, ?D("drdptb", ?PRIO(?A_OPCODE(8#70230), 1), ?PDP10_XKL1)
|
||||
, ?D("wrtime", ?PRIO(?A_OPCODE(8#70234), 1), ?PDP10_XKL1)
|
||||
, ?D("writm", ?PRIO(?A_OPCODE(8#70260), 1), ?PDP10_XKL1)
|
||||
, ?D("dwrptb", ?PRIO(?A_OPCODE(8#70270), 1), ?PDP10_XKL1)
|
||||
, ?D("apr2", ?PRIO(?BASIC(8#702), 0), ?PDP10_XKL1)
|
||||
, ?D("rdcty", ?PRIO(?A_OPCODE(8#70304), 1), ?PDP10_XKL1) % special cases of apr3
|
||||
, ?D("wrcty", ?PRIO(?A_OPCODE(8#70314), 1), ?PDP10_XKL1)
|
||||
, ?D("wrctys", ?PRIO(?A_OPCODE(8#70320), 1), ?PDP10_XKL1)
|
||||
, ?D("rdctys", ?PRIO(?A_OPCODE(8#70324), 1), ?PDP10_XKL1)
|
||||
, ?D("szcty", ?PRIO(?A_OPCODE(8#70330), 1), ?PDP10_XKL1)
|
||||
, ?D("sncty", ?PRIO(?A_OPCODE(8#70334), 1), ?PDP10_XKL1)
|
||||
, ?D("apr3", ?PRIO(?BASIC(8#703), 0), ?PDP10_XKL1)
|
||||
, ?D("pmove", ?BASIC(8#704), ?PDP10_XKL1)
|
||||
, ?D("pmovem", ?BASIC(8#705), ?PDP10_XKL1)
|
||||
, ?D("nmove", ?BASIC(8#706), ?PDP10_XKL1)
|
||||
, ?D("nmovem", ?BASIC(8#707), ?PDP10_XKL1)
|
||||
, ?D("ldlpn", ?BASIC(8#710), ?PDP10_XKL1)
|
||||
, ?D("rdcfg", ?BASIC(8#711), ?PDP10_XKL1)
|
||||
, ?D("amove", ?BASIC(8#714), ?PDP10_XKL1)
|
||||
, ?D("amovem", ?BASIC(8#715), ?PDP10_XKL1)
|
||||
, ?D("umove", ?BASIC(8#716), ?PDP10_XKL1)
|
||||
, ?D("umovem", ?BASIC(8#717), ?PDP10_XKL1)
|
||||
|
||||
%% PDP6 / KA10 / KI10 / KL10 IO instructions.
|
||||
%%
|
||||
%% These take an operand which determines which device to access.
|
||||
%% Most of the system instructions above are instances of these with
|
||||
%% pre-determined values for the device operands.
|
||||
, ?D("blki", ?PRIO(?IO(8#70000), 0), ?PDP10_not_KS10_or_XKL1)
|
||||
, ?D("datai", ?PRIO(?IO(8#70004), 0), ?PDP10_not_KS10_or_XKL1)
|
||||
, ?D("blko", ?PRIO(?IO(8#70010), 0), ?PDP10_not_KS10_or_XKL1)
|
||||
, ?D("datao", ?PRIO(?IO(8#70014), 0), ?PDP10_not_KS10_or_XKL1)
|
||||
, ?D("cono", ?PRIO(?IO(8#70020), 0), ?PDP10_not_KS10_or_XKL1)
|
||||
, ?D("coni", ?PRIO(?IO(8#70024), 0), ?PDP10_not_KS10_or_XKL1)
|
||||
, ?D("consz", ?PRIO(?IO(8#70030), 0), ?PDP10_not_KS10_or_XKL1)
|
||||
, ?D("conso", ?PRIO(?IO(8#70034), 0), ?PDP10_not_KS10_or_XKL1)
|
||||
].
|
||||
|
||||
%% Extended instructions, second word.
|
||||
|
||||
-define(EXTENDED(OPCODE9), ?A_UNUSED(OPCODE9), extended = true).
|
||||
|
||||
pdp10_extended_insns() ->
|
||||
[
|
||||
%% name, high13, format, flags, models
|
||||
?D("cmpsl", ?E_UNUSED(?EXTENDED(8#001)), ?PDP10_KL10up)
|
||||
, ?D("cmpse", ?E_UNUSED(?EXTENDED(8#002)), ?PDP10_KL10up)
|
||||
, ?D("cmpsle", ?E_UNUSED(?EXTENDED(8#003)), ?PDP10_KL10up)
|
||||
, ?D("edit", ?E_UNUSED(?EXTENDED(8#004)), ?PDP10_KL10up)
|
||||
, ?D("cmpsge", ?E_UNUSED(?EXTENDED(8#005)), ?PDP10_KL10up)
|
||||
, ?D("cmpsn", ?E_UNUSED(?EXTENDED(8#006)), ?PDP10_KL10up)
|
||||
, ?D("cmpsg", ?E_UNUSED(?EXTENDED(8#007)), ?PDP10_KL10up)
|
||||
, ?D("cvtdbo", ?EXTENDED(8#010), ?PDP10_KL10up)
|
||||
, ?D("cvtdbt", ?EXTENDED(8#011), ?PDP10_KL10up)
|
||||
, ?D("cvtbdo", ?EXTENDED(8#012), ?PDP10_KL10up)
|
||||
, ?D("cvtbdt", ?EXTENDED(8#013), ?PDP10_KL10up)
|
||||
, ?D("movso", ?EXTENDED(8#014), ?PDP10_KL10up)
|
||||
, ?D("movst", ?EXTENDED(8#015), ?PDP10_KL10up)
|
||||
, ?D("movslj", ?E_UNUSED(?EXTENDED(8#016)), ?PDP10_KL10up)
|
||||
, ?D("movsrj", ?E_UNUSED(?EXTENDED(8#017)), ?PDP10_KL10up)
|
||||
, ?D("xblt", ?E_UNUSED(?EXTENDED(8#020)), ?PDP10_KL10up)
|
||||
, ?D("gsngl", ?EXTENDED(8#021), ?PDP10_KL10_271)
|
||||
, ?D("gdble", ?EXTENDED(8#022), ?PDP10_KL10_271)
|
||||
, ?D("gdfix", ?EXTENDED(8#023), ?PDP10_KL10_271)
|
||||
, ?D("gdfixr", ?EXTENDED(8#025), ?PDP10_KL10_271)
|
||||
, ?D("gfix", ?EXTENDED(8#024), ?PDP10_KL10_271)
|
||||
, ?D("gfixr", ?EXTENDED(8#026), ?PDP10_KL10_271)
|
||||
, ?D("dgfltr", ?EXTENDED(8#027), ?PDP10_KL10_271)
|
||||
, ?D("gfltr", ?EXTENDED(8#030), ?PDP10_KL10_271)
|
||||
, ?D("gfsc", ?EXTENDED(8#031), ?PDP10_KL10_271)
|
||||
].
|
||||
|
||||
%% Internal device names for IO instructions.
|
||||
%%
|
||||
%% The convention in documentation is to list 7-bit device codes as three-digit
|
||||
%% octal numbers, with excess zeros in the low bits. The DEVICE/1 macros
|
||||
%% corrects those values back to 7 bits.
|
||||
|
||||
-spec cpu_device_from_name(pdp10_cpu_models(), string()) -> pdp10_cpu_device() | false.
|
||||
cpu_device_from_name(Models, Name) ->
|
||||
%% This is a short and infrequently queried list, so just do a linear search.
|
||||
cpu_device_from_name(pdp10_cpu_devices(), Models, Name).
|
||||
|
||||
cpu_device_from_name([], _Models, _Name) -> false;
|
||||
cpu_device_from_name([{Name2, Device, Models2} | Devices], Models, Name) ->
|
||||
if Name2 =:= Name, (Models2 band Models) =:= Models -> Device;
|
||||
true -> cpu_device_from_name(Devices, Models, Name)
|
||||
end.
|
||||
|
||||
-define(DEVICE(DEVICE9), ((DEVICE9) bsr 2)).
|
||||
|
||||
pdp10_cpu_devices() ->
|
||||
[
|
||||
%% name, device, models
|
||||
{ "apr", ?DEVICE(8#000), ?PDP10_KA10_to_KL10 } % Arithmetic processor
|
||||
, { "pi", ?DEVICE(8#004), ?PDP10_KA10_to_KL10 } % Priority interrupt
|
||||
, { "pag", ?DEVICE(8#010), ?PDP10_KI10_to_KL10 } % Pager
|
||||
, { "cca", ?DEVICE(8#014), ?PDP10_KL10any } % Cache
|
||||
, { "tim", ?DEVICE(8#020), ?PDP10_KL10any } % Timer
|
||||
, { "mtr", ?DEVICE(8#024), ?PDP10_KL10any } % Meters
|
||||
].
|
||||
|
||||
-spec models_from_name(string()) -> pdp10_cpu_models() | false.
|
||||
models_from_name(Name) ->
|
||||
case Name of
|
||||
"pdp6" -> ?PDP6;
|
||||
"ka10" -> ?PDP10_KA10;
|
||||
"ki10" -> ?PDP10_KI10;
|
||||
"kl10" -> ?PDP10_KL10;
|
||||
"kl10b" -> ?PDP10_KL10_271;
|
||||
"ks10" -> ?PDP10_KS10;
|
||||
"xkl1" -> ?PDP10_XKL1;
|
||||
"all" -> ?PDP10_ALL;
|
||||
_ -> false
|
||||
end.
|
||||
Loading…
x
Reference in New Issue
Block a user