; 8086predefs.sr
; by Larry Tesler 7/10/78, last amended 10/27/78
; Intel 8086 Definitions for BCA Cross-Assembler
.rdx 16
@HIORDFIRST = 0
@bytereg = 00
@wordreg = 01
@accreg = 02
@segreg = 04
@basereg = 08
@indexreg = 010
.reg AX @wordreg+@accreg 0
.reg CX @wordreg 1
.reg DX @wordreg 2
.reg BX @wordreg+@basereg 3
.reg SP @wordreg 4
.reg BP @wordreg+@basereg 5
.reg SI @wordreg+@indexreg 6
.reg DI @wordreg+@indexreg 7
.reg AL @bytereg+@accreg 0
.reg CL @bytereg 1
.reg DL @bytereg 2
.reg BL @bytereg 3
.reg AH @bytereg 4
.reg CH @bytereg 5
.reg DH @bytereg 6
.reg BH @bytereg 7
.reg ES @wordreg+@segreg 0
.reg CS @wordreg+@segreg 1
.reg SS @wordreg+@segreg 2
.reg DS @wordreg+@segreg 3
; instruction operands
; label = unsigned16bitvalue
; disp = unsigned16bitvalue
; segbase = unsigned16bitvalue
; lit = ## signed16bitvalue | # signed8or16bitvalue
; byte = unsigned8bitvalue
; mem = disp [!base] [!index]
; Where 2 operands appear, order is {dest, source} unless noted
; arithclass [opcode different when word or lit]
; reg, reg | lit | mem
; mem, reg | lit
@ArithImmRshift = 8.
@ArithImmMask = 38
@ArithImmOffset = 08000
@ArithAccImmRshift = 8.
@ArithAccImmMask = 38
@ArithAccImmOffset = 004
.def ADD @arithclass 00000 ; -00300, 004-005, 08000-08300
.def ADC @arithclass 01000 ; -01300, 014-015, 08010-08310
.def SBB @arithclass 01800 ; -01B00, 01C-01D, 08018-08318
.def SUB @arithclass 02800 ; -2B00, 02C-02D, 08028-08328
.def CMP @arithclass 03800 ; -03B00, 03C-03D, 08038-08338
; bumpclass [opcode different when reg]
; reg
; mem
@BumpRegRshift = 0.
@BumpRegMask = 8
@BumpRegOffset = 040
.def INCW @bumpclass 0FF00 ; 040-047
.def DECW @bumpclass 0FF08 ; 048-04F
; exchgclass [opcode different when word or when one reg is accumulator]
; reg, reg
; reg, mem
@ExchgAccOffset = -08570
.def EXCHG @exchgclass 08600 ; -08700, 090-097
; extclass
; disp
.def RETP @extclass 0C2 ; return and pop intrasegment
.def RETPS @extclass 0CA ; return and pop intersegment
; interclass
; disp, segbase (i.e., segment offset, segment base)
.def CALLS @interclass 09A ; call direct intersegment
.def JMPS @interclass 0EA ; jump direct intersegment
; ldclass
; reg, mem
.def LEA @ldclass 08D00
.def LES @ldclass 0C400
.def LDS @ldclass 0C500
; logicclass [opcode different when word or lit]
; reg, reg | lit | mem
; mem, reg | lit
;@ use ArithClass masks and offsets
.def OR @logicclass 00800 ; -00B00, 00C-00D, 08008-08108
.def AND @logicclass 02000 ; -02300, 024-025, 08020-08120
.def XOR @logicclass 03000 ; -03300, 034-035, 08030-08130
; movclass [opcode different when word, lit, seg, or accumulator-to/from-mem]
; reg, reg | lit | mem
; mem, reg | lit
; seg, reg | mem
; reg | mem, seg
@MovImmOffset = 03E00
@MovRegImmOffset = -08750
@MovAccMemOffset = -08760
@MovMemAccOffset = -0875E
@MovSegFromOffset = 0600
@MovFromSegOffset = 0400
.def MOV @movclass 08800; -08900,08C00,08E00,0A0-A3,0B0-0BF,0C600-0C700
; noparclass (one-byte opcode, no parameters)
.def DAA @noparclass 027
.def DAS @noparclass 02F
.def AAA @noparclass 037
.def AAS @noparclass 03F
.def CBW @noparclass 098
.def CWD @noparclass 099
.def WAIT @noparclass 09B
.def PUSHF @noparclass 09C
.def POPF @noparclass 09D
.def SAHF @noparclass 09E
.def LAHF @noparclass 09F
.def MOVB @noparclass 0A4
.def MOVW @noparclass 0A5
.def CMPB @noparclass 0A6
.def CMPW @noparclass 0A7
.def STOB @noparclass 0AA
.def STOW @noparclass 0AB
.def LODB @noparclass 0AC
.def LODW @noparclass 0AD
.def SCAB @noparclass 0AE
.def SCAW @noparclass 0AF
.def RET @noparclass 0C3
.def RETS @noparclass 0CB
.def INT3 @noparclass 0CC
.def INTO @noparclass 0CE
.def IRET @noparclass 0CF
.def XLAT @noparclass 0D7
.def IND @noparclass 0EC
.def INDW @noparclass 0ED
.def OUTD @noparclass 0EE
.def OUTDW @noparclass 0EF
.def LOCK @noparclass 0F0
.def REP @noparclass 0F2 ; repeat MOV, LOD, or STO while CX nonzero
.def REPNE @noparclass 0F2 ; repeat CMP or SCA while not equal
.def REPE @noparclass 0F3 ; repeat CMP or SCA while equal
.def HLT @noparclass 0F4
.def CMC @noparclass 0F5
.def CLC @noparclass 0F8
.def STC @noparclass 0F9
.def CLI @noparclass 0FA
.def STI @noparclass 0FB
.def CLD @noparclass 0FC
.def STD @noparclass 0FD
; PCRelClass
; label
.def J @PCRelClass 0EB
.def JO @PCRelClass 070
.def JNO @PCRelClass 071
.def JB @PCRelClass 072
.def JC @PCRelClass 072
.def JNAE @PCRelClass 072
.def JNB @PCRelClass 073
.def JNC @PCRelClass 073
.def JAE @PCRelClass 073
.def JE @PCRelClass 074
.def JZ @PCRelClass 074
.def JNE @PCRelClass 075
.def JNZ @PCRelClass 075
.def JBE @PCRelClass 076
.def JNA @PCRelClass 076
.def JNBE @PCRelClass 077
.def JA @PCRelClass 077
.def JS @PCRelClass 078
.def JNS @PCRelClass 079
.def JP @PCRelClass 07A
.def JPE @PCRelClass 07A
.def JNP @PCRelClass 07B
.def JPO @PCRelClass 07B
.def JL @PCRelClass 07C
.def JNGE @PCRelClass 07C
.def JNL @PCRelClass 07D
.def JGE @PCRelClass 07D
.def JLE @PCRelClass 07E
.def JNG @PCRelClass 07E
.def JNLE @PCRelClass 07F
.def JG @PCRelClass 07F
.def JCXZ @PCRelClass 0E3
.def LOOP @PCRelClass 0E2
.def LOOPZ @PCRelClass 0E1
.def LOOPE @PCRelClass 0E1
.def LOOPNZ @PCRelClass 0E0
.def LOOPNE @PCRelClass 0E0
; pcrel16class
; label
.def CALL @pcrel16class 0E8 ; call direct intrasegment
; pcrel8or16class [opcode different when short displacement]
; label
@PCRel8or16ShortOffset = 2
.def JMP @pcrel8or16class 0E9 ; 0EB; jump direct intrasegment
; pgzclass
; byte
.def INT @pgzclass 0CD
.def IN @pgzclass 0E4
.def INW @pgzclass 0E5
.def OUT @pgzclass 0E6
.def OUTW @pgzclass 0E7
; rmclass
; reg
; mem
.def ROL @rmclass 0D000 ; rotate left byte by 1
.def ROR @rmclass 0D008
.def RCL @rmclass 0D010
.def RCR @rmclass 0D018
.def SHL @rmclass 0D020
.def SAL @rmclass 0D020
.def SHR @rmclass 0D028
.def SAR @rmclass 0D038
.def ROLW @rmclass 0D100 ; rotate left word by 1
.def RORW @rmclass 0D108
.def RCLW @rmclass 0D110
.def RCRW @rmclass 0D118
.def SHLW @rmclass 0D120
.def SALW @rmclass 0D120
.def SHRW @rmclass 0D128
.def SARW @rmclass 0D138
.def ROLV @rmclass 0D200 ; rotate left byte variable by CL
.def RORV @rmclass 0D208
.def RCLV @rmclass 0D210
.def RCRV @rmclass 0D218
.def SHLV @rmclass 0D220
.def SALV @rmclass 0D220
.def SHRV @rmclass 0D228
.def SARV @rmclass 0D238
.def ROLVW @rmclass 0D300 ; rotate left word variable by CL
.def RORVW @rmclass 0D308
.def RCLVW @rmclass 0D310
.def RCRVW @rmclass 0D318
.def SHLVW @rmclass 0D320
.def SALVW @rmclass 0D320
.def SHRVW @rmclass 0D328
.def SARVW @rmclass 0D338
.def ESC @rmclass 0D800
.def NOT @rmclass 0F610
.def NEG @rmclass 0F618
.def MUL @rmclass 0F620
.def IMUL @rmclass 0F628
.def DIV @rmclass 0F630
.def IDIV @rmclass 0F638
.def NOTW @rmclass 0F710
.def NEGW @rmclass 0F718
.def MULW @rmclass 0F720
.def IMULW @rmclass 0F728
.def DIVW @rmclass 0F730
.def IDIVW @rmclass 0F738
.def INC @rmclass 0FE00
.def DEC @rmclass 0FE08
.def CALLI @rmclass 0FF10 ; call indirect intrasegment
.def CALLIS @rmclass 0FF18 ; call indirect intersegment
.def JMPI @rmclass 0FF20 ; jump indirect intrasegment
.def JMPIS @rmclass 0FF28 ; jump indirect intrasegment
; rmsclass [opcode different when reg or seg]
; reg
; mem
; seg
@RmsRegRshift = 9.
@RmsRegMaskNot = 8
@RmsRegOffset = 050
@RmsSegRshift = 12.
@RmsSegMaskNot = 1
@RmsSegOffset = 006
.def POP @rmsclass 08F00 ; 007, 00F, 017, 01F, 058-05F
.def PUSH @rmsclass 0FF30 ; 006, 00E, 016, 01E, 050-057
; segclass (segment prefix)
; seg
.def SEG @segclass 026
; testclass [opcode different when word or lit]
; reg, reg | lit | mem
; mem, reg | lit
@TestImmRshift = 0.
@TestImmMask = 0
@TestImmOffset = 0F600
@TestAccImmRshift = 0.
@TestAccImmMask = 0
@TestAccImmOffset = 0A8
.def TEST @testclass 08400 ; -08500, 0A8-0A9, 0F600-0F700
; twoonlyclass (two-byte opcode, no parameters)
.def AAM @twoonlyclass 0D40A
.def AAD @twoonlyclass 0D50A