Blame cpu/ip2k.cpu

Packit ba3681
; Ubicom IP2K CPU description.  -*- Scheme -*-
Packit ba3681
; Copyright (C) 2002, 2009, 2011 Free Software Foundation, Inc.
Packit ba3681
;
Packit ba3681
; Contributed by Red Hat Inc;
Packit ba3681
;
Packit ba3681
; This file is part of the GNU Binutils.
Packit ba3681
;
Packit ba3681
; This program is free software; you can redistribute it and/or modify
Packit ba3681
; it under the terms of the GNU General Public License as published by
Packit ba3681
; the Free Software Foundation; either version 3 of the License, or
Packit ba3681
; (at your option) any later version.
Packit ba3681
;
Packit ba3681
; This program is distributed in the hope that it will be useful,
Packit ba3681
; but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit ba3681
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit ba3681
; GNU General Public License for more details.
Packit ba3681
;
Packit ba3681
; You should have received a copy of the GNU General Public License
Packit ba3681
; along with this program; if not, write to the Free Software
Packit ba3681
; Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
Packit ba3681
; MA 02110-1301, USA.
Packit ba3681
Packit ba3681
(define-rtl-version 0 8)
Packit ba3681
Packit ba3681
(include "simplify.inc")
Packit ba3681
Packit ba3681
; define-arch must appear first
Packit ba3681
Packit ba3681
(define-arch
Packit ba3681
  (name ip2k) ; name of cpu family
Packit ba3681
  (comment "Ubicom IP2000 family")
Packit ba3681
  (default-alignment aligned)
Packit ba3681
  (insn-lsb0? #t)
Packit ba3681
  (machs ip2022 ip2022ext)
Packit ba3681
  (isas ip2k)
Packit ba3681
)
Packit ba3681
Packit ba3681
; Attributes.
Packit ba3681
Packit ba3681
(define-attr
Packit ba3681
  (for insn)
Packit ba3681
  (type boolean)
Packit ba3681
  (name EXT-SKIP-INSN)
Packit ba3681
  (comment "instruction is a PAGE, LOADL, LOADH or BREAKX instruction")
Packit ba3681
)
Packit ba3681
Packit ba3681
(define-attr
Packit ba3681
  (for insn)
Packit ba3681
  (type boolean)
Packit ba3681
  (name SKIPA)
Packit ba3681
  (comment "instruction is a SKIP instruction")
Packit ba3681
)
Packit ba3681
Packit ba3681
; Instruction set parameters.
Packit ba3681
Packit ba3681
(define-isa
Packit ba3681
  (name ip2k)
Packit ba3681
  (comment "Ubicom IP2000 ISA")
Packit ba3681
Packit ba3681
  (default-insn-word-bitsize 16)
Packit ba3681
  (default-insn-bitsize 16)
Packit ba3681
  (base-insn-bitsize 16)
Packit ba3681
)
Packit ba3681

Packit ba3681
; Cpu family definitions.
Packit ba3681
Packit ba3681
Packit ba3681
(define-cpu
Packit ba3681
  ; cpu names must be distinct from the architecture name and machine names.
Packit ba3681
  (name ip2kbf)
Packit ba3681
  (comment "Ubicom IP2000 Family")
Packit ba3681
  (endian big)
Packit ba3681
  (word-bitsize 16)
Packit ba3681
)
Packit ba3681
Packit ba3681
(define-mach
Packit ba3681
  (name ip2022)
Packit ba3681
  (comment "Ubicom IP2022")
Packit ba3681
  (cpu ip2kbf)
Packit ba3681
)
Packit ba3681
Packit ba3681
(define-mach
Packit ba3681
  (name ip2022ext)
Packit ba3681
  (comment "Ubicom IP2022 extended")
Packit ba3681
  (cpu ip2kbf)
Packit ba3681
)
Packit ba3681
Packit ba3681

Packit ba3681
; Model descriptions.
Packit ba3681
Packit ba3681
(define-model
Packit ba3681
  (name ip2k) (comment "VPE 2xxx") (attrs)
Packit ba3681
  (mach ip2022ext)
Packit ba3681
Packit ba3681
  (unit u-exec "Execution Unit" ()
Packit ba3681
	1 1 ; issue done
Packit ba3681
	() ; state
Packit ba3681
	() ; inputs
Packit ba3681
	() ; outputs
Packit ba3681
	() ; profile action (default)
Packit ba3681
	)
Packit ba3681
)
Packit ba3681
Packit ba3681
Packit ba3681
; FIXME: It might simplify things to separate the execute process from the
Packit ba3681
; one that updates the PC.
Packit ba3681

Packit ba3681
; Instruction fields.
Packit ba3681
;
Packit ba3681
; Attributes:
Packit ba3681
; XXX: what VPE attrs
Packit ba3681
; PCREL-ADDR: pc relative value (for reloc and disassembly purposes)
Packit ba3681
; ABS-ADDR: absolute address (for reloc and disassembly purposes?)
Packit ba3681
; RESERVED: bits are not used to decode insn, must be all 0
Packit ba3681
; RELOC: there is a relocation associated with this field (experiment)
Packit ba3681
Packit ba3681
Packit ba3681
(dnf f-imm8      "imm8"                () 7 8)
Packit ba3681
(dnf f-reg       "reg"         (ABS-ADDR) 8 9)
Packit ba3681
(dnf f-addr16cjp "addr16cjp"   (ABS-ADDR) 12 13)
Packit ba3681
(dnf f-dir       "dir"                 () 9 1)
Packit ba3681
(dnf f-bitno     "bit number"          () 11 3)
Packit ba3681
(dnf f-op3       "op3"                 () 15 3)
Packit ba3681
(dnf f-op4       "op4"                 () 15 4)
Packit ba3681
(dnf f-op4mid    "op4mid"              () 11 4)
Packit ba3681
(dnf f-op6       "op6"                 () 15 6)
Packit ba3681
(dnf f-op8       "op8"                 () 15 8)
Packit ba3681
(dnf f-op6-10low "op6-10low"           () 9 10)
Packit ba3681
(dnf f-op6-7low  "op6-7low"            () 9 7)
Packit ba3681
(dnf f-reti3     "reti3"               () 2 3)
Packit ba3681
(dnf f-skipb     "sb/snb"      (ABS-ADDR) 12 1)
Packit ba3681
(dnf f-page3     "page3"               ()  2 3)
Packit ba3681
;(define-ifield (name f-page3) (comment "page3") (attrs) (start 2) (length 3)
Packit ba3681
;  (encode (value pc) (srl WI value 13))
Packit ba3681
;  (decode (value pc) (sll WI value 13))
Packit ba3681
;)
Packit ba3681
; To fix the page/call asymmetry
Packit ba3681
;(define-ifield (name f-page3) (comment "page3") (attrs) (start 2) (length 3)
Packit ba3681
;  (encode (value pc) (srl WI value 13))
Packit ba3681
;  (decode (value pc) (sll WI value 13))
Packit ba3681
;)
Packit ba3681
Packit ba3681
Packit ba3681

Packit ba3681
; Enums.
Packit ba3681
Packit ba3681
; insn-op6: bits 15-10
Packit ba3681
(define-normal-insn-enum insn-op6 "op6 enums" () OP6_ f-op6
Packit ba3681
  (OTHER1 OTHER2 SUB DEC OR AND XOR ADD 
Packit ba3681
   TEST NOT INC DECSZ RR RL SWAP INCSZ
Packit ba3681
   CSE POP SUBC DECSNZ MULU MULS INCSNZ  ADDC
Packit ba3681
   - - - - - - - -   
Packit ba3681
   - - - - - - - -
Packit ba3681
   - - - - - - - -
Packit ba3681
   - - - - - - - -
Packit ba3681
   - - - - - - - -   
Packit ba3681
   )
Packit ba3681
)
Packit ba3681
Packit ba3681
; insn-dir: bit 9
Packit ba3681
(define-normal-insn-enum insn-dir "dir enums" () DIR_ f-dir
Packit ba3681
  ; This bit specifies the polarity of many two-operand instructions:
Packit ba3681
  ; TO_W writes result to W regiser  (eg. ADDC W,$fr)
Packit ba3681
  ; NOTTO_W writes result in general register  (eg. ADDC $fr,W)
Packit ba3681
  (TO_W NOTTO_W)
Packit ba3681
)
Packit ba3681
Packit ba3681
Packit ba3681
; insn-op4: bits 15-12
Packit ba3681
(define-normal-insn-enum insn-op4 "op4 enums" () OP4_ f-op4
Packit ba3681
  (- - - - - - - LITERAL
Packit ba3681
   CLRB SETB SNB SB - - - -
Packit ba3681
   )
Packit ba3681
)
Packit ba3681
Packit ba3681
; insn-op4mid: bits 11-8
Packit ba3681
; used for f-op4=LITERAL
Packit ba3681
(define-normal-insn-enum insn-op4mid "op4mid enums" () OP4MID_ f-op4mid
Packit ba3681
  (LOADH_L LOADL_L MULU_L MULS_L PUSH_L  -  CSNE_L CSE_L
Packit ba3681
   RETW_L CMP_L SUB_L ADD_L MOV_L OR_L AND_L XOR_L)
Packit ba3681
)
Packit ba3681
Packit ba3681
; insn-op3: bits 15-13
Packit ba3681
(define-normal-insn-enum insn-op3 "op3 enums" () OP3_ f-op3
Packit ba3681
  (- - - - - - CALL JMP)
Packit ba3681
)
Packit ba3681
Packit ba3681
Packit ba3681
  
Packit ba3681
; Hardware pieces.
Packit ba3681
Packit ba3681
; Bank-relative general purpose registers
Packit ba3681
Packit ba3681
; (define-pmacro (build-reg-name n) (.splice (.str "$" n) n))
Packit ba3681
Packit ba3681
(define-keyword
Packit ba3681
  (name register-names)
Packit ba3681
  (enum-prefix H-REGISTERS-)
Packit ba3681
  (values
Packit ba3681
   ; These are the "Special Purpose Registers" that are not reserved
Packit ba3681
   ("ADDRSEL" #x2) ("ADDRX" #x3)
Packit ba3681
   ("IPH" #x4) ("IPL" #x5) ("SPH" #x6) ("SPL" #x7)
Packit ba3681
   ("PCH" #x8) ("PCL" #x9) ("WREG" #xA) ("STATUS" #xB)
Packit ba3681
   ("DPH" #xC) ("DPL" #xD) ("SPDREG" #xE) ("MULH" #xF)
Packit ba3681
   ("ADDRH" #x10) ("ADDRL" #x11) ("DATAH" #x12) ("DATAL" #x13)
Packit ba3681
   ("INTVECH" #x14) ("INTVECL" #x15) ("INTSPD" #x16) ("INTF" #x17)
Packit ba3681
   ("INTE" #x18) ("INTED" #x19) ("FCFG" #x1A) ("TCTRL" #x1B)
Packit ba3681
   ("XCFG" #x1C) ("EMCFG" #x1D) ("IPCH" #x1E) ("IPCL" #x1F)
Packit ba3681
   ("RAIN" #x20) ("RAOUT" #x21) ("RADIR" #x22) ("LFSRH" #x23)
Packit ba3681
   ("RBIN" #x24) ("RBOUT" #x25) ("RBDIR" #x26) ("LFSRL" #x27)
Packit ba3681
   ("RCIN" #x28) ("RCOUT" #x29) ("RCDIR" #x2A) ("LFSRA" #x2B)
Packit ba3681
   ("RDIN" #x2C) ("RDOUT" #x2D) ("RDDIR" #x2E)   
Packit ba3681
   ("REIN" #x30) ("REOUT" #x31) ("REDIR" #x32)   
Packit ba3681
   ("RFIN" #x34) ("RFOUT" #x35) ("RFDIR" #x36)
Packit ba3681
                 ("RGOUT" #x39) ("RGDIR" #x3A)
Packit ba3681
   ("RTTMR" #x40) ("RTCFG" #x41) ("T0TMR" #x42) ("T0CFG" #x43)
Packit ba3681
   ("T1CNTH" #x44) ("T1CNTL" #x45) ("T1CAP1H" #x46) ("T1CAP1L" #x47)
Packit ba3681
   ("T1CAP2H" #x48) ("T1CMP2H" #x48) ("T1CAP2L" #x49) ("T1CMP2L" #x49) ; note aliases
Packit ba3681
                                     ("T1CMP1H" #x4A) ("T1CMP1L" #x4B)
Packit ba3681
   ("T1CFG1H" #x4C) ("T1CFG1L" #x4D) ("T1CFG2H" #x4E) ("T1CFG2L" #x4F)
Packit ba3681
   ("ADCH" #x50) ("ADCL" #x51) ("ADCCFG" #x52) ("ADCTMR" #x53)
Packit ba3681
   ("T2CNTH" #x54) ("T2CNTL" #x55) ("T2CAP1H" #x56) ("T2CAP1L" #x57)
Packit ba3681
   ("T2CAP2H" #x58) ("T2CMP2H" #x58) ("T2CAP2L" #x59) ("T2CMP2L" #x59) ; note aliases
Packit ba3681
                                     ("T2CMP1H" #x5A) ("T2CMP1L" #x5B)
Packit ba3681
   ("T2CFG1H" #x5C) ("T2CFG1L" #x5D) ("T2CFG2H" #x5E) ("T2CFG2L" #x5F)
Packit ba3681
   ("S1TMRH" #x60) ("S1TMRL" #x61) ("S1TBUFH" #x62) ("S1TBUFL" #x63)
Packit ba3681
   ("S1TCFG" #x64) ("S1RCNT" #x65) ("S1RBUFH" #x66) ("S1RBUFL" #x67)
Packit ba3681
   ("S1RCFG" #x68) ("S1RSYNC" #x69) ("S1INTF" #x6A) ("S1INTE" #x6B)
Packit ba3681
   ("S1MODE" #x6C) ("S1SMASK" #x6D) ("PSPCFG" #x6E) ("CMPCFG" #x6F)
Packit ba3681
   ("S2TMRH" #x70) ("S2TMRL" #x71) ("S2TBUFH" #x72) ("S2TBUFL" #x73)
Packit ba3681
   ("S2TCFG" #x74) ("S2RCNT" #x75) ("S2RBUFH" #x76) ("S2RBUFL" #x77)
Packit ba3681
   ("S2RCFG" #x78) ("S2RSYNC" #x79) ("S2INTF" #x7A) ("S2INTE" #x7B)
Packit ba3681
   ("S2MODE" #x7C) ("S2SMASK" #x7D) ("CALLH" #x7E) ("CALLL" #x7F))
Packit ba3681
  )
Packit ba3681
Packit ba3681
(define-hardware
Packit ba3681
  (name h-spr)
Packit ba3681
  (comment "special-purpose registers")
Packit ba3681
  (type register QI (128))
Packit ba3681
  (get (index) (c-call QI "get_spr" index ))
Packit ba3681
  (set (index newval) (c-call VOID "set_spr" index newval ))
Packit ba3681
)
Packit ba3681
Packit ba3681
Packit ba3681
;;(define-hardware
Packit ba3681
;;  (name h-gpr-global)
Packit ba3681
;;  (comment "gpr registers - global")
Packit ba3681
;;  (type register QI (128))
Packit ba3681
;;)
Packit ba3681
Packit ba3681
; The general register
Packit ba3681
Packit ba3681
(define-hardware
Packit ba3681
  (name h-registers)
Packit ba3681
  (comment "all addressable registers")
Packit ba3681
  (attrs VIRTUAL)
Packit ba3681
  (type register QI (512))
Packit ba3681
  (get (index) (c-call QI "get_h_registers" index ))
Packit ba3681
  (set (index newval) (c-call VOID "set_h_registers" index newval ))
Packit ba3681
)
Packit ba3681
Packit ba3681
; The hardware stack.
Packit ba3681
; Use {push,pop}_pc_stack c-calls to operate on this hardware element.
Packit ba3681
Packit ba3681
(define-hardware
Packit ba3681
  (name h-stack)
Packit ba3681
  (comment "hardware stack")
Packit ba3681
  (type register UHI (16))
Packit ba3681
)
Packit ba3681
Packit ba3681
(dsh h-pabits "page bits" () (register QI))
Packit ba3681
(dsh h-zbit "zero bit" () (register BI))
Packit ba3681
(dsh h-cbit "carry bit" () (register BI))
Packit ba3681
(dsh h-dcbit "digit-carry bit" () (register BI))
Packit ba3681
(dnh h-pc "program counter" (PC PROFILE) (pc) () () ())
Packit ba3681
Packit ba3681
Packit ba3681
; Operands
Packit ba3681
Packit ba3681
(define-operand (name addr16cjp) (comment "13-bit address") (attrs) 
Packit ba3681
  (type h-uint) (index f-addr16cjp) (handlers (parse "addr16_cjp") (print "dollarhex_cj"))) ; overload lit8 printer
Packit ba3681
(define-operand (name fr) (comment "register") (attrs) 
Packit ba3681
  (type h-registers) (index f-reg) (handlers (parse "fr") (print "fr")))
Packit ba3681
(define-operand (name lit8) (comment "8-bit signed literal") (attrs)
Packit ba3681
  (type h-sint) (index f-imm8) (handlers (parse "lit8") (print "dollarhex8")))
Packit ba3681
(define-operand (name bitno) (comment "bit number") (attrs)
Packit ba3681
  (type h-uint) (index f-bitno) (handlers (parse "bit3")(print "decimal")))
Packit ba3681
(define-operand (name addr16p) (comment "page number") (attrs)
Packit ba3681
  (type h-uint) (index f-page3) (handlers (parse "addr16_cjp") (print "dollarhex_p")))
Packit ba3681
(define-operand (name addr16h) (comment "high 8 bits of address") (attrs)
Packit ba3681
  (type h-uint) (index f-imm8) (handlers (parse "addr16") (print "dollarhex_addr16h")))
Packit ba3681
(define-operand (name addr16l) (comment "low 8 bits of address") (attrs)
Packit ba3681
  (type h-uint) (index f-imm8) (handlers (parse "addr16") (print "dollarhex_addr16l")))
Packit ba3681
(define-operand (name reti3) (comment "reti flags") (attrs)
Packit ba3681
  (type h-uint) (index f-reti3) (handlers (print "dollarhex")))
Packit ba3681
(dnop pabits   "page bits"                 () h-pabits f-nil)
Packit ba3681
(dnop zbit     "zero bit"                  () h-zbit f-nil)
Packit ba3681
(dnop cbit     "carry bit"                 () h-cbit f-nil)
Packit ba3681
(dnop dcbit    "digit carry bit"           () h-dcbit f-nil)
Packit ba3681
;;(dnop bank     "bank register"             () h-bank-no f-nil)
Packit ba3681
Packit ba3681
(define-pmacro w     (reg h-spr #x0A))
Packit ba3681
(define-pmacro mulh  (reg h-spr #x0F))
Packit ba3681
(define-pmacro dph   (reg h-spr #x0C))
Packit ba3681
(define-pmacro dpl   (reg h-spr #x0D))
Packit ba3681
(define-pmacro sph   (reg h-spr #x06))
Packit ba3681
(define-pmacro spl   (reg h-spr #x07))
Packit ba3681
(define-pmacro iph   (reg h-spr #x04))
Packit ba3681
(define-pmacro ipl   (reg h-spr #x05))
Packit ba3681
(define-pmacro addrh (reg h-spr #x10))
Packit ba3681
(define-pmacro addrl (reg h-spr #x11))
Packit ba3681
Packit ba3681
Packit ba3681
Packit ba3681
; Pseudo-RTL for DC flag calculations
Packit ba3681
; "DC" = "digit carry", ie carry between nibbles
Packit ba3681
(define-pmacro (add-dcflag a b c)
Packit ba3681
  (add-cflag (sll QI a 4) (sll QI b 4) c)
Packit ba3681
)
Packit ba3681
Packit ba3681
(define-pmacro (sub-dcflag a b c)
Packit ba3681
  (sub-cflag (sll QI a 4) (sll QI b 4) c)
Packit ba3681
)
Packit ba3681
Packit ba3681
; Check to see if an fr is one of IPL, SPL, DPL, ADDRL, PCL.
Packit ba3681
(define-pmacro (LregCheck isLreg fr9bit)
Packit ba3681
   (sequence()
Packit ba3681
      (set isLreg #x0) ;; Assume it's not an Lreg
Packit ba3681
      (if (or (or (eq fr9bit #x5) (eq fr9bit #x7))
Packit ba3681
	      (or (eq fr9bit #x9)
Packit ba3681
		  (or (eq fr9bit #xd) (eq fr9bit #x11))))
Packit ba3681
          (set isLreg #x1)
Packit ba3681
      )
Packit ba3681
   )
Packit ba3681
) 
Packit ba3681
Packit ba3681
Packit ba3681
; Instructions, in order of the "Instruction Set Map" table on
Packit ba3681
; pp 19-20 of IP2022 spec V1.09
Packit ba3681
Packit ba3681
(dni jmp "Jump"
Packit ba3681
     ()
Packit ba3681
     "jmp $addr16cjp"
Packit ba3681
     (+ OP3_JMP addr16cjp)
Packit ba3681
     (set pc (or (sll pabits 13) addr16cjp))
Packit ba3681
     ()
Packit ba3681
)
Packit ba3681
Packit ba3681
; note that in call, we push pc instead of pc + 1 because the ip2k increments
Packit ba3681
; the pc prior to execution of the instruction
Packit ba3681
(dni call "Call"
Packit ba3681
     ()
Packit ba3681
     "call $addr16cjp"
Packit ba3681
     (+ OP3_CALL addr16cjp)
Packit ba3681
     (sequence ()
Packit ba3681
	       (c-call "push_pc_stack" pc)
Packit ba3681
	       (set pc (or (sll pabits 13) addr16cjp)))
Packit ba3681
     ()
Packit ba3681
)
Packit ba3681
Packit ba3681
(dni sb "Skip if bit set"
Packit ba3681
     ()
Packit ba3681
     "sb $fr,$bitno"
Packit ba3681
     (+ OP4_SB bitno fr)
Packit ba3681
     (if (and fr (sll 1 bitno))
Packit ba3681
	 (skip 1))
Packit ba3681
     ()
Packit ba3681
)
Packit ba3681
Packit ba3681
(dni snb "Skip if bit clear"
Packit ba3681
     ()
Packit ba3681
     "snb $fr,$bitno"
Packit ba3681
     (+ OP4_SNB bitno fr)
Packit ba3681
     (if (not (and fr (sll 1 bitno)))
Packit ba3681
	 (skip 1))
Packit ba3681
     ()
Packit ba3681
)
Packit ba3681
Packit ba3681
(dni setb "Set bit"
Packit ba3681
     ()
Packit ba3681
     "setb $fr,$bitno"
Packit ba3681
     (+ OP4_SETB bitno fr)
Packit ba3681
     (set fr (or fr (sll 1 bitno)))
Packit ba3681
     ()
Packit ba3681
)
Packit ba3681
Packit ba3681
(dni clrb "Clear bit"
Packit ba3681
     ()
Packit ba3681
     "clrb $fr,$bitno"
Packit ba3681
     (+ OP4_CLRB bitno fr)
Packit ba3681
     (set fr (and fr (inv (sll 1 bitno))))
Packit ba3681
     ()
Packit ba3681
)
Packit ba3681
Packit ba3681
(dni xorw_l "XOR W,literal"
Packit ba3681
     ()
Packit ba3681
     "xor W,#$lit8"
Packit ba3681
     (+ OP4_LITERAL OP4MID_XOR_L lit8)
Packit ba3681
     (sequence ()
Packit ba3681
	       (set w (xor w lit8))
Packit ba3681
	       (set zbit (zflag w)))
Packit ba3681
     ()
Packit ba3681
)
Packit ba3681
Packit ba3681
(dni andw_l "AND W,literal"
Packit ba3681
     ()
Packit ba3681
     "and W,#$lit8"
Packit ba3681
     (+ OP4_LITERAL OP4MID_AND_L lit8)
Packit ba3681
     (sequence ()
Packit ba3681
	       (set w (and w lit8))
Packit ba3681
	       (set zbit (zflag w)))
Packit ba3681
     ()
Packit ba3681
)
Packit ba3681
Packit ba3681
(dni orw_l "OR W,literal"
Packit ba3681
     ()
Packit ba3681
     "or W,#$lit8"
Packit ba3681
     (+ OP4_LITERAL OP4MID_OR_L lit8)
Packit ba3681
     (sequence ()
Packit ba3681
	       (set w (or w lit8))
Packit ba3681
	       (set zbit (zflag w)))
Packit ba3681
     ()
Packit ba3681
)
Packit ba3681
Packit ba3681
(dni addw_l "ADD W,literal"
Packit ba3681
     ()
Packit ba3681
     "add W,#$lit8"
Packit ba3681
     (+ OP4_LITERAL OP4MID_ADD_L lit8)
Packit ba3681
     (sequence ()
Packit ba3681
	       (set cbit (add-cflag w lit8 0))
Packit ba3681
	       (set dcbit (add-dcflag w lit8 0))
Packit ba3681
	       (set w (add w lit8))
Packit ba3681
	       (set zbit (zflag w)))
Packit ba3681
     ()
Packit ba3681
)
Packit ba3681
Packit ba3681
(dni subw_l "SUB W,literal"
Packit ba3681
     ()
Packit ba3681
     "sub W,#$lit8"
Packit ba3681
     (+ OP4_LITERAL OP4MID_SUB_L lit8)
Packit ba3681
     (sequence ()
Packit ba3681
	       (set cbit (not (sub-cflag lit8 w 0)))
Packit ba3681
	       (set dcbit (not (sub-dcflag lit8 w 0)))
Packit ba3681
	       (set zbit (zflag (sub w lit8)))
Packit ba3681
	       (set w (sub lit8 w)))
Packit ba3681
     ()
Packit ba3681
)
Packit ba3681
Packit ba3681
(dni cmpw_l "CMP W,literal"
Packit ba3681
     ()
Packit ba3681
     "cmp W,#$lit8"
Packit ba3681
     (+ OP4_LITERAL OP4MID_CMP_L lit8)
Packit ba3681
     (sequence ()
Packit ba3681
	       (set cbit (not (sub-cflag lit8 w 0)))
Packit ba3681
	       (set dcbit (not (sub-dcflag lit8 w 0)))
Packit ba3681
	       (set zbit (zflag (sub w lit8))))
Packit ba3681
     ()
Packit ba3681
)
Packit ba3681
Packit ba3681
(dni retw_l "RETW literal"
Packit ba3681
     ()
Packit ba3681
     "retw #$lit8"
Packit ba3681
     (+ OP4_LITERAL OP4MID_RETW_L lit8)
Packit ba3681
     (sequence ((USI new_pc))
Packit ba3681
	       (set w lit8)
Packit ba3681
	       (set new_pc (c-call UHI "pop_pc_stack"))
Packit ba3681
	       (set pabits (srl new_pc 13))
Packit ba3681
	       (set pc new_pc))
Packit ba3681
     ()
Packit ba3681
)
Packit ba3681
Packit ba3681
(dni csew_l "CSE W,literal"
Packit ba3681
     ()
Packit ba3681
     "cse W,#$lit8"
Packit ba3681
     (+ OP4_LITERAL OP4MID_CSE_L lit8)
Packit ba3681
     (if (eq w lit8)
Packit ba3681
	 (skip 1))
Packit ba3681
     ()
Packit ba3681
)
Packit ba3681
Packit ba3681
(dni csnew_l "CSNE W,literal"
Packit ba3681
     ()
Packit ba3681
     "csne W,#$lit8"
Packit ba3681
     (+ OP4_LITERAL OP4MID_CSNE_L lit8)
Packit ba3681
     (if (not (eq w lit8))
Packit ba3681
	 (skip 1))
Packit ba3681
     ()
Packit ba3681
)
Packit ba3681
Packit ba3681
(dni push_l "Push #lit8"
Packit ba3681
     ()
Packit ba3681
     "push #$lit8"
Packit ba3681
     (+ OP4_LITERAL OP4MID_PUSH_L lit8)
Packit ba3681
     (sequence ()
Packit ba3681
        (c-call "push" lit8)
Packit ba3681
        (c-call VOID "adjuststackptr" (const -1))
Packit ba3681
Packit ba3681
     )
Packit ba3681
     ()
Packit ba3681
)
Packit ba3681
Packit ba3681
(dni mulsw_l "Multiply W,literal (signed)"
Packit ba3681
     ()
Packit ba3681
     "muls W,#$lit8"
Packit ba3681
     (+ OP4_LITERAL OP4MID_MULS_L lit8)
Packit ba3681
     (sequence ((SI tmp))
Packit ba3681
	       (set tmp (mul (ext SI w) (ext SI (and UQI #xff lit8))))
Packit ba3681
	       (set w (and tmp #xFF))
Packit ba3681
	       (set mulh (srl tmp 8)))
Packit ba3681
     ()
Packit ba3681
)
Packit ba3681
Packit ba3681
(dni muluw_l "Multiply W,literal (unsigned)"
Packit ba3681
     ()
Packit ba3681
     "mulu W,#$lit8"
Packit ba3681
     (+ OP4_LITERAL OP4MID_MULU_L lit8)
Packit ba3681
     (sequence ((USI tmp))
Packit ba3681
	       (set tmp (and #xFFFF (mul (zext USI w) (zext USI lit8))))
Packit ba3681
	       (set w (and tmp #xFF))
Packit ba3681
	       (set mulh (srl tmp 8)))
Packit ba3681
     ()
Packit ba3681
)
Packit ba3681
Packit ba3681
(dni loadl_l "LoadL literal"
Packit ba3681
    (EXT-SKIP-INSN)
Packit ba3681
    "loadl #$lit8"
Packit ba3681
    (+ OP4_LITERAL OP4MID_LOADL_L lit8)
Packit ba3681
    (set dpl (and lit8 #x00FF))
Packit ba3681
    ()
Packit ba3681
)
Packit ba3681
Packit ba3681
(dni loadh_l "LoadH literal"
Packit ba3681
    (EXT-SKIP-INSN)
Packit ba3681
    "loadh #$lit8"
Packit ba3681
    (+ OP4_LITERAL OP4MID_LOADH_L lit8)
Packit ba3681
    (set dph (and lit8 #x00FF))
Packit ba3681
    ()
Packit ba3681
)
Packit ba3681
Packit ba3681
(dni loadl_a "LoadL addr16l"
Packit ba3681
    (EXT-SKIP-INSN)
Packit ba3681
    "loadl $addr16l"
Packit ba3681
    (+ OP4_LITERAL OP4MID_LOADL_L addr16l)
Packit ba3681
    (set dpl (and addr16l #x00FF))
Packit ba3681
    ()
Packit ba3681
)
Packit ba3681
Packit ba3681
(dni loadh_a "LoadH addr16h"
Packit ba3681
    (EXT-SKIP-INSN)
Packit ba3681
    "loadh $addr16h"
Packit ba3681
    (+ OP4_LITERAL OP4MID_LOADH_L addr16h)
Packit ba3681
    (set dph (and addr16l #x0FF00))
Packit ba3681
    ()
Packit ba3681
)
Packit ba3681
Packit ba3681
;; THIS NO LONGER EXISTS -> Now LOADL
Packit ba3681
;;(dni bank_l "Bank literal"
Packit ba3681
;;     ()
Packit ba3681
;;     "bank #$lit8"
Packit ba3681
;;     (+ OP4_LITERAL OP4MID_BANK_L lit8)
Packit ba3681
;;     (set bank lit8)
Packit ba3681
;;     ()
Packit ba3681
;;)
Packit ba3681
Packit ba3681
(dni addcfr_w "Add w/carry fr,W"
Packit ba3681
     ()
Packit ba3681
     "addc $fr,W"
Packit ba3681
     (+ OP6_ADDC DIR_NOTTO_W fr)
Packit ba3681
     (sequence ((QI result) (BI newcbit) (QI isLreg) (HI 16bval))
Packit ba3681
	       (set newcbit (add-cflag w fr cbit))
Packit ba3681
	       (set dcbit (add-dcflag w fr cbit))
Packit ba3681
               ;; If fr is an Lreg, then we have to do 16-bit arithmetic.
Packit ba3681
               ;; We can take advantage of the fact that by a lucky
Packit ba3681
               ;; coincidence, the address of register xxxH is always      
Packit ba3681
               ;; one lower than the address of register xxxL.
Packit ba3681
               (LregCheck isLreg (ifield f-reg))
Packit ba3681
	       (if (eq isLreg #x1)
Packit ba3681
                  (sequence() 
Packit ba3681
                     (set 16bval (reg h-spr (sub (ifield f-reg) 1)))
Packit ba3681
		     (set 16bval (sll 16bval 8))
Packit ba3681
		     (set 16bval (or 16bval (and (reg h-spr (ifield f-reg)) #xFF))) 
Packit ba3681
                     (set 16bval (addc HI 16bval w cbit))
Packit ba3681
		     (set (reg h-spr (ifield f-reg)) (and 16bval #xFF))
Packit ba3681
		     (set (reg h-spr (sub (ifield f-reg) 1)) 
Packit ba3681
                          (and (srl 16bval 8) #xFF))
Packit ba3681
                     (set result (reg h-spr (ifield f-reg)))
Packit ba3681
                  )      
Packit ba3681
	       (set result (addc w fr cbit)) ;; else part
Packit ba3681
               )
Packit ba3681
Packit ba3681
	       (set zbit (zflag result))
Packit ba3681
	       (set cbit newcbit)
Packit ba3681
	       (set fr result))
Packit ba3681
     ()
Packit ba3681
)
Packit ba3681
Packit ba3681
(dni addcw_fr "Add w/carry W,fr"
Packit ba3681
     ()
Packit ba3681
     "addc W,$fr"
Packit ba3681
     (+ OP6_ADDC DIR_TO_W fr)
Packit ba3681
     (sequence ((QI result) (BI newcbit))
Packit ba3681
	       (set newcbit (add-cflag w fr cbit))
Packit ba3681
	       (set dcbit (add-dcflag w fr cbit))
Packit ba3681
	       (set result (addc w fr cbit))
Packit ba3681
	       (set zbit (zflag result))
Packit ba3681
	       (set cbit newcbit)
Packit ba3681
	       (set w result))
Packit ba3681
     ()
Packit ba3681
)
Packit ba3681
Packit ba3681
Packit ba3681
(dni incsnz_fr "Skip if fr++ not zero"
Packit ba3681
     ()
Packit ba3681
     "incsnz $fr"
Packit ba3681
     (+ OP6_INCSNZ DIR_NOTTO_W fr)
Packit ba3681
     (sequence ((QI isLreg) (HI 16bval))
Packit ba3681
        (LregCheck isLreg (ifield f-reg))
Packit ba3681
        ;; If fr is an Lreg, then we have to do 16-bit arithmetic.
Packit ba3681
        ;; We can take advantage of the fact that by a lucky
Packit ba3681
        ;; coincidence, the address of register xxxH is always
Packit ba3681
        ;; one lower than the address of register xxxL.
Packit ba3681
        (if (eq isLreg #x1)
Packit ba3681
           (sequence()
Packit ba3681
              ; Create the 16 bit value
Packit ba3681
              (set 16bval (reg h-spr (sub (ifield f-reg) 1)))
Packit ba3681
              (set 16bval (sll 16bval 8))
Packit ba3681
              (set 16bval (or 16bval (and (reg h-spr (ifield f-reg)) #xFF)))
Packit ba3681
              ; Do 16 bit arithmetic.
Packit ba3681
	      (set 16bval (add HI 16bval 1))
Packit ba3681
              ; Separate the 16 bit values into the H and L regs
Packit ba3681
              (set (reg h-spr (ifield f-reg)) (and 16bval #xFF))
Packit ba3681
              (set (reg h-spr (sub (ifield f-reg) 1))
Packit ba3681
                   (and (srl 16bval 8) #xFF))
Packit ba3681
              (set fr (reg h-spr (ifield f-reg)))
Packit ba3681
           )
Packit ba3681
	   (set fr (add fr 1)) ; Do 8 bit arithmetic.
Packit ba3681
        )
Packit ba3681
	(if (not (zflag fr))
Packit ba3681
	   (skip 1)))
Packit ba3681
     ()
Packit ba3681
)
Packit ba3681
Packit ba3681
(dni incsnzw_fr "Skip if W=fr+1  not zero"
Packit ba3681
     ()
Packit ba3681
     "incsnz W,$fr"
Packit ba3681
     (+ OP6_INCSNZ DIR_TO_W fr)
Packit ba3681
     (sequence ()
Packit ba3681
	       (set w (add fr 1))
Packit ba3681
	       (if (not (zflag w))
Packit ba3681
		   (skip 1)))
Packit ba3681
     ()
Packit ba3681
)
Packit ba3681
Packit ba3681
(dni mulsw_fr "Multiply W,fr (signed)"
Packit ba3681
     ()
Packit ba3681
     "muls W,$fr"
Packit ba3681
     (+ OP6_MULS DIR_TO_W fr)
Packit ba3681
     (sequence ((SI tmp))
Packit ba3681
	       (set tmp (mul (ext SI w) (ext SI fr)))
Packit ba3681
	       (set w (and tmp #xFF))
Packit ba3681
	       (set mulh (srl tmp 8)))
Packit ba3681
     ()
Packit ba3681
)
Packit ba3681
Packit ba3681
(dni muluw_fr "Multiply W,fr (unsigned)"
Packit ba3681
     ()
Packit ba3681
     "mulu W,$fr"
Packit ba3681
     (+ OP6_MULU DIR_TO_W fr)
Packit ba3681
     (sequence ((USI tmp))
Packit ba3681
	       (set tmp (and #xFFFF (mul (zext USI w) (zext USI fr))))
Packit ba3681
	       (set w (and tmp #xFF))
Packit ba3681
	       (set mulh (srl tmp 8)))
Packit ba3681
     ()
Packit ba3681
)
Packit ba3681
Packit ba3681
(dni decsnz_fr "Skip if fr-- not zero"
Packit ba3681
     ()
Packit ba3681
     "decsnz $fr"
Packit ba3681
     (+ OP6_DECSNZ DIR_NOTTO_W fr)
Packit ba3681
     (sequence ((QI isLreg) (HI 16bval))
Packit ba3681
         (LregCheck isLreg (ifield f-reg))
Packit ba3681
         ;; If fr is an Lreg, then we have to do 16-bit arithmetic.
Packit ba3681
         ;; We can take advantage of the fact that by a lucky
Packit ba3681
         ;; coincidence, the address of register xxxH is always
Packit ba3681
         ;; one lower than the address of register xxxL.
Packit ba3681
         (if (eq isLreg #x1)
Packit ba3681
            (sequence()
Packit ba3681
               ; Create the 16 bit value
Packit ba3681
               (set 16bval (reg h-spr (sub (ifield f-reg) 1)))
Packit ba3681
               (set 16bval (sll 16bval 8))
Packit ba3681
               (set 16bval (or 16bval (and (reg h-spr (ifield f-reg)) #xFF)))
Packit ba3681
               ; New 16 bit instruction
Packit ba3681
               (set 16bval (sub HI 16bval 1))
Packit ba3681
               ; Separate the 16 bit values into the H and L regs
Packit ba3681
               (set (reg h-spr (ifield f-reg)) (and 16bval #xFF))
Packit ba3681
               (set (reg h-spr (sub (ifield f-reg) 1))
Packit ba3681
                    (and (srl 16bval 8) #xFF))
Packit ba3681
               (set fr (reg h-spr (ifield f-reg)))
Packit ba3681
            )
Packit ba3681
            ; Original instruction
Packit ba3681
	    (set fr (sub fr 1))
Packit ba3681
         )
Packit ba3681
	    (if (not (zflag fr))
Packit ba3681
	       (skip 1)))
Packit ba3681
     ()
Packit ba3681
)
Packit ba3681
Packit ba3681
(dni decsnzw_fr "Skip if W=fr-1 not zero"
Packit ba3681
     ()
Packit ba3681
     "decsnz W,$fr"
Packit ba3681
     (+ OP6_DECSNZ DIR_TO_W fr)
Packit ba3681
     (sequence ()
Packit ba3681
	       (set w (sub fr 1))
Packit ba3681
	       (if (not (zflag w))
Packit ba3681
		   (skip 1)))
Packit ba3681
     ()
Packit ba3681
)
Packit ba3681
Packit ba3681
(dni subcw_fr "Subract w/carry W,fr"
Packit ba3681
     ()
Packit ba3681
     "subc W,$fr"
Packit ba3681
     (+ OP6_SUBC DIR_TO_W fr)
Packit ba3681
     (sequence ((QI result) (BI newcbit))
Packit ba3681
	       (set newcbit (not (sub-cflag fr w (not cbit))))
Packit ba3681
	       (set dcbit (not (sub-dcflag fr w (not cbit))))
Packit ba3681
	       (set result (subc fr w (not cbit)))
Packit ba3681
	       (set zbit (zflag result))
Packit ba3681
	       (set cbit newcbit)
Packit ba3681
	       (set w result))
Packit ba3681
     ()
Packit ba3681
)
Packit ba3681
Packit ba3681
(dni subcfr_w "Subtract w/carry fr,W"
Packit ba3681
     ()
Packit ba3681
     "subc $fr,W"
Packit ba3681
     (+ OP6_SUBC DIR_NOTTO_W fr)
Packit ba3681
     (sequence ((QI result) (BI newcbit) (QI isLreg) (HI 16bval))
Packit ba3681
	       (set newcbit (not (sub-cflag fr w (not cbit))))
Packit ba3681
	       (set dcbit (not (sub-dcflag fr w (not cbit))))
Packit ba3681
               (LregCheck isLreg (ifield f-reg))
Packit ba3681
               ;; If fr is an Lreg, then we have to do 16-bit arithmetic.
Packit ba3681
               ;; We can take advantage of the fact that by a lucky
Packit ba3681
               ;; coincidence, the address of register xxxH is always
Packit ba3681
               ;; one lower than the address of register xxxL.
Packit ba3681
               (if (eq isLreg #x1)
Packit ba3681
                  (sequence()
Packit ba3681
                     ; Create the 16 bit value
Packit ba3681
                     (set 16bval (reg h-spr (sub (ifield f-reg) 1)))
Packit ba3681
                     (set 16bval (sll 16bval 8))
Packit ba3681
                     (set 16bval (or 16bval (and (reg h-spr (ifield f-reg)) #xFF)))
Packit ba3681
                     ; New 16 bit instruction
Packit ba3681
	             (set 16bval (subc HI 16bval w (not cbit)))
Packit ba3681
                     ; Separate the 16 bit values into the H and L regs
Packit ba3681
                     (set (reg h-spr (ifield f-reg)) (and 16bval #xFF))
Packit ba3681
                     (set (reg h-spr (sub (ifield f-reg) 1))
Packit ba3681
                          (and (srl 16bval 8) #xFF))
Packit ba3681
                     (set result (reg h-spr (ifield f-reg)))
Packit ba3681
                  )
Packit ba3681
               ; Original instruction
Packit ba3681
	       (set result (subc fr w (not cbit)))
Packit ba3681
               )
Packit ba3681
Packit ba3681
Packit ba3681
	       (set zbit (zflag result))
Packit ba3681
	       (set cbit newcbit)
Packit ba3681
	       (set fr result))
Packit ba3681
     ()
Packit ba3681
)
Packit ba3681
Packit ba3681
Packit ba3681
(dni pop_fr "Pop fr"
Packit ba3681
     ()
Packit ba3681
     "pop $fr"
Packit ba3681
     (+ OP6_POP (f-dir 1) fr)
Packit ba3681
     (sequence()
Packit ba3681
        (set fr (c-call QI "pop")) 
Packit ba3681
        (c-call VOID "adjuststackptr" (const 1))
Packit ba3681
     )
Packit ba3681
     ()
Packit ba3681
)
Packit ba3681
Packit ba3681
(dni push_fr "Push fr"
Packit ba3681
     ()
Packit ba3681
     "push $fr"
Packit ba3681
     (+ OP6_POP (f-dir 0) fr)
Packit ba3681
     (sequence()
Packit ba3681
        (c-call "push" fr)
Packit ba3681
        (c-call VOID "adjuststackptr" (const -1))
Packit ba3681
     )
Packit ba3681
     ()
Packit ba3681
)
Packit ba3681
Packit ba3681
(dni csew_fr "Skip if equal W,fr"
Packit ba3681
     ()
Packit ba3681
     "cse W,$fr"
Packit ba3681
     (+ OP6_CSE (f-dir 1) fr)
Packit ba3681
     (if (eq w fr)
Packit ba3681
	 (skip 1))
Packit ba3681
     ()
Packit ba3681
)
Packit ba3681
Packit ba3681
(dni csnew_fr "Skip if not-equal W,fr"
Packit ba3681
     ()
Packit ba3681
     "csne W,$fr"
Packit ba3681
     (+ OP6_CSE (f-dir 0) fr)
Packit ba3681
     (if (not (eq w fr))
Packit ba3681
	 (skip 1))
Packit ba3681
     ()
Packit ba3681
)
Packit ba3681
Packit ba3681
;;(dni csaw_fr "Skip if W above fr"
Packit ba3681
;;     ((MACH ip2022ext))
Packit ba3681
;;     "csa W,$fr"
Packit ba3681
;;     (+ OP6_CSAB (f-dir 1) fr)
Packit ba3681
;;     (if (gt w fr)
Packit ba3681
;;	 (skip 1))
Packit ba3681
;;    ()
Packit ba3681
;;)
Packit ba3681
Packit ba3681
;;(dni csbw_fr "Skip if W below fr"
Packit ba3681
;;     ((MACH ip2022ext))
Packit ba3681
;;     "csb W,$fr"
Packit ba3681
;;     (+ OP6_CSAB (f-dir 0) fr)
Packit ba3681
;;     (if (lt w fr)
Packit ba3681
;;	 (skip 1))
Packit ba3681
;;    ()
Packit ba3681
;;)
Packit ba3681
Packit ba3681
(dni incsz_fr "Skip if fr++ zero"
Packit ba3681
     ()
Packit ba3681
     "incsz $fr"
Packit ba3681
     (+ OP6_INCSZ DIR_NOTTO_W fr)
Packit ba3681
     (sequence ((QI isLreg) (HI 16bval))
Packit ba3681
          (LregCheck isLreg (ifield f-reg))
Packit ba3681
          ;; If fr is an Lreg, then we have to do 16-bit arithmetic.
Packit ba3681
          ;; We can take advantage of the fact that by a lucky
Packit ba3681
          ;; coincidence, the address of register xxxH is always
Packit ba3681
          ;; one lower than the address of register xxxL.
Packit ba3681
          (if (eq isLreg #x1)
Packit ba3681
             (sequence()
Packit ba3681
                ; Create the 16 bit value
Packit ba3681
                (set 16bval (reg h-spr (sub (ifield f-reg) 1)))
Packit ba3681
                (set 16bval (sll 16bval 8))
Packit ba3681
                (set 16bval (or 16bval (and (reg h-spr (ifield f-reg)) #xFF)))
Packit ba3681
                ; New 16 bit instruction
Packit ba3681
                (set 16bval (add HI 16bval 1))
Packit ba3681
                ; Separate the 16 bit values into the H and L regs
Packit ba3681
                (set (reg h-spr (ifield f-reg)) (and 16bval #xFF))
Packit ba3681
                (set (reg h-spr (sub (ifield f-reg) 1))
Packit ba3681
                     (and (srl 16bval 8) #xFF))
Packit ba3681
                (set fr (reg h-spr (ifield f-reg)))
Packit ba3681
             )
Packit ba3681
             ; Original instruction
Packit ba3681
	     (set fr (add fr 1))
Packit ba3681
          )
Packit ba3681
	       (if (zflag fr)
Packit ba3681
		   (skip 1)))
Packit ba3681
     ()
Packit ba3681
)
Packit ba3681
Packit ba3681
(dni incszw_fr "Skip if W=fr+1 zero"
Packit ba3681
     ()
Packit ba3681
     "incsz W,$fr"
Packit ba3681
     (+ OP6_INCSZ DIR_TO_W fr)
Packit ba3681
     (sequence ()
Packit ba3681
	       (set w (add fr 1))
Packit ba3681
	       (if (zflag w)
Packit ba3681
		   (skip 1)))
Packit ba3681
     ()
Packit ba3681
)
Packit ba3681
Packit ba3681
(dni swap_fr "Swap fr nibbles"
Packit ba3681
     ()
Packit ba3681
     "swap $fr"
Packit ba3681
     (+ OP6_SWAP DIR_NOTTO_W fr)
Packit ba3681
     (set fr (or (and (sll fr 4) #xf0)
Packit ba3681
		 (and (srl fr 4) #x0f)))
Packit ba3681
     ()
Packit ba3681
)
Packit ba3681
Packit ba3681
(dni swapw_fr "Swap fr nibbles into W"
Packit ba3681
     ()
Packit ba3681
     "swap W,$fr"
Packit ba3681
     (+ OP6_SWAP DIR_TO_W fr)
Packit ba3681
     (set w (or (and (sll fr 4) #xf0)
Packit ba3681
		(and (srl fr 4) #x0f)))
Packit ba3681
     ()
Packit ba3681
)
Packit ba3681
Packit ba3681
(dni rl_fr "Rotate fr left with carry"
Packit ba3681
     ()
Packit ba3681
     "rl $fr"
Packit ba3681
     (+ OP6_RL DIR_NOTTO_W fr)
Packit ba3681
     (sequence ((QI newfr) (BI newc))
Packit ba3681
	       (set newc (and fr #x80))
Packit ba3681
	       (set newfr (or (sll fr 1) (if QI cbit 1 0)))
Packit ba3681
	       (set cbit (if QI newc 1 0))
Packit ba3681
	       (set fr newfr))
Packit ba3681
     ()
Packit ba3681
)
Packit ba3681
Packit ba3681
(dni rlw_fr "Rotate fr left with carry into W"
Packit ba3681
     ()
Packit ba3681
     "rl W,$fr"
Packit ba3681
     (+ OP6_RL DIR_TO_W fr)
Packit ba3681
     (sequence ((QI newfr) (BI newc))
Packit ba3681
	       (set newc (and fr #x80))
Packit ba3681
	       (set newfr (or (sll fr 1) (if QI cbit 1 0)))
Packit ba3681
	       (set cbit (if QI newc 1 0))
Packit ba3681
	       (set w newfr))
Packit ba3681
     ()
Packit ba3681
)
Packit ba3681
Packit ba3681
(dni rr_fr "Rotate fr right with carry"
Packit ba3681
     ()
Packit ba3681
     "rr $fr"
Packit ba3681
     (+ OP6_RR DIR_NOTTO_W fr)
Packit ba3681
     (sequence ((QI newfr) (BI newc))
Packit ba3681
	       (set newc (and fr #x01))
Packit ba3681
	       (set newfr (or (srl fr 1) (if QI cbit #x80 #x00)))
Packit ba3681
	       (set cbit (if QI newc 1 0))
Packit ba3681
	       (set fr newfr))
Packit ba3681
     ()
Packit ba3681
)
Packit ba3681
Packit ba3681
(dni rrw_fr "Rotate fr right with carry into W"
Packit ba3681
     ()
Packit ba3681
     "rr W,$fr"
Packit ba3681
     (+ OP6_RR DIR_TO_W fr)
Packit ba3681
     (sequence ((QI newfr) (BI newc))
Packit ba3681
	       (set newc (and fr #x01))
Packit ba3681
	       (set newfr (or (srl fr 1) (if QI cbit #x80 #x00)))
Packit ba3681
	       (set cbit (if QI newc 1 0))
Packit ba3681
	       (set w newfr))
Packit ba3681
     ()
Packit ba3681
)
Packit ba3681
Packit ba3681
(dni decsz_fr "Skip if fr-- zero"
Packit ba3681
     ()
Packit ba3681
     "decsz $fr"
Packit ba3681
     (+ OP6_DECSZ DIR_NOTTO_W fr)
Packit ba3681
     (sequence ((QI isLreg) (HI 16bval))
Packit ba3681
          (LregCheck isLreg (ifield f-reg))
Packit ba3681
          ;; If fr is an Lreg, then we have to do 16-bit arithmetic.
Packit ba3681
          ;; We can take advantage of the fact that by a lucky
Packit ba3681
          ;; coincidence, the address of register xxxH is always
Packit ba3681
          ;; one lower than the address of register xxxL.
Packit ba3681
          (if (eq isLreg #x1)
Packit ba3681
             (sequence()
Packit ba3681
                ; Create the 16 bit value
Packit ba3681
                (set 16bval (reg h-spr (sub (ifield f-reg) 1)))
Packit ba3681
                (set 16bval (sll 16bval 8))
Packit ba3681
                (set 16bval (or 16bval (and (reg h-spr (ifield f-reg)) #xFF)))
Packit ba3681
                ; New 16 bit instruction
Packit ba3681
                (set 16bval (sub HI 16bval 1))
Packit ba3681
                ; Separate the 16 bit values into the H and L regs
Packit ba3681
                (set (reg h-spr (ifield f-reg)) (and 16bval #xFF))
Packit ba3681
                (set (reg h-spr (sub (ifield f-reg) 1))
Packit ba3681
                     (and (srl 16bval 8) #xFF))
Packit ba3681
                (set fr (reg h-spr (ifield f-reg)))
Packit ba3681
             )
Packit ba3681
             ; Original instruction
Packit ba3681
	     (set fr (sub fr 1))
Packit ba3681
          )
Packit ba3681
	       (if (zflag fr)
Packit ba3681
		   (skip 1)))
Packit ba3681
     ()
Packit ba3681
)
Packit ba3681
Packit ba3681
(dni decszw_fr "Skip if W=fr-1 zero"
Packit ba3681
     ()
Packit ba3681
     "decsz W,$fr"
Packit ba3681
     (+ OP6_DECSZ DIR_TO_W fr)
Packit ba3681
     (sequence ()
Packit ba3681
	       (set w (sub fr 1))
Packit ba3681
	       (if (zflag w)
Packit ba3681
		   (skip 1)))
Packit ba3681
     ()
Packit ba3681
)
Packit ba3681
Packit ba3681
(dni inc_fr "Increment fr"
Packit ba3681
     ()
Packit ba3681
     "inc $fr"
Packit ba3681
     (+ OP6_INC DIR_NOTTO_W fr)
Packit ba3681
     (sequence ((QI isLreg) (HI 16bval))
Packit ba3681
          (LregCheck isLreg (ifield f-reg))
Packit ba3681
          ;; If fr is an Lreg, then we have to do 16-bit arithmetic.
Packit ba3681
          ;; We can take advantage of the fact that by a lucky
Packit ba3681
          ;; coincidence, the address of register xxxH is always
Packit ba3681
          ;; one lower than the address of register xxxL.
Packit ba3681
          (if (eq isLreg #x1)
Packit ba3681
             (sequence()
Packit ba3681
                ; Create the 16 bit value
Packit ba3681
                (set 16bval (reg h-spr (sub (ifield f-reg) 1)))
Packit ba3681
                (set 16bval (sll 16bval 8))
Packit ba3681
                (set 16bval (or 16bval (and (reg h-spr (ifield f-reg)) #xFF)))
Packit ba3681
                ; New 16 bit instruction
Packit ba3681
		(set 16bval (add HI 16bval 1))
Packit ba3681
                ; Separate the 16 bit values into the H and L regs
Packit ba3681
                (set (reg h-spr (ifield f-reg)) (and 16bval #xFF))
Packit ba3681
                (set (reg h-spr (sub (ifield f-reg) 1))
Packit ba3681
                     (and (srl 16bval 8) #xFF))
Packit ba3681
                (set fr (reg h-spr (ifield f-reg)))
Packit ba3681
             )
Packit ba3681
             ; Original instruction
Packit ba3681
	     (set fr (add fr 1))
Packit ba3681
           )
Packit ba3681
	       (set zbit (zflag fr)))
Packit ba3681
     ()
Packit ba3681
)
Packit ba3681
Packit ba3681
(dni incw_fr "Increment fr into w"
Packit ba3681
     ()
Packit ba3681
     "inc W,$fr"
Packit ba3681
     (+ OP6_INC DIR_TO_W fr)
Packit ba3681
     (sequence ()
Packit ba3681
	       (set w (add fr 1))
Packit ba3681
	       (set zbit (zflag w)))
Packit ba3681
     ()
Packit ba3681
)
Packit ba3681
Packit ba3681
(dni not_fr "Invert fr"
Packit ba3681
     ()
Packit ba3681
     "not $fr"
Packit ba3681
     (+ OP6_NOT DIR_NOTTO_W fr)
Packit ba3681
     (sequence ()
Packit ba3681
	       (set fr (inv fr))
Packit ba3681
	       (set zbit (zflag fr)))
Packit ba3681
     ()
Packit ba3681
)
Packit ba3681
Packit ba3681
(dni notw_fr "Invert fr into w"
Packit ba3681
     ()
Packit ba3681
     "not W,$fr"
Packit ba3681
     (+ OP6_NOT DIR_TO_W fr)
Packit ba3681
     (sequence ()
Packit ba3681
	       (set w (inv fr))
Packit ba3681
	       (set zbit (zflag w)))
Packit ba3681
     ()
Packit ba3681
)
Packit ba3681
Packit ba3681
(dni test_fr "Test fr"
Packit ba3681
     ()
Packit ba3681
     "test $fr"
Packit ba3681
     (+ OP6_TEST DIR_NOTTO_W fr)
Packit ba3681
     (sequence ()
Packit ba3681
	       (set zbit (zflag fr)))
Packit ba3681
     ()
Packit ba3681
)
Packit ba3681
Packit ba3681
(dni movw_l "MOV W,literal"
Packit ba3681
     ()
Packit ba3681
     "mov W,#$lit8"
Packit ba3681
     (+ OP4_LITERAL OP4MID_MOV_L lit8)
Packit ba3681
     (set w lit8)
Packit ba3681
     ()
Packit ba3681
)
Packit ba3681
Packit ba3681
(dni movfr_w "Move/test w into fr"
Packit ba3681
     ()
Packit ba3681
     "mov $fr,W"
Packit ba3681
     (+ OP6_OTHER1 DIR_NOTTO_W fr)
Packit ba3681
     (set fr w)
Packit ba3681
     ()
Packit ba3681
)
Packit ba3681
Packit ba3681
(dni movw_fr "Move/test fr into w"
Packit ba3681
     ()
Packit ba3681
     "mov W,$fr"
Packit ba3681
     (+ OP6_TEST DIR_TO_W fr)
Packit ba3681
     (sequence ()
Packit ba3681
	       (set w fr)
Packit ba3681
	       (set zbit (zflag w)))
Packit ba3681
     ()
Packit ba3681
)
Packit ba3681
Packit ba3681
Packit ba3681
(dni addfr_w "Add fr,W"
Packit ba3681
     ()
Packit ba3681
     "add $fr,W"
Packit ba3681
     (+ OP6_ADD DIR_NOTTO_W fr)
Packit ba3681
     (sequence ((QI result) (QI isLreg) (HI 16bval))
Packit ba3681
	       (set cbit (add-cflag w fr 0))
Packit ba3681
	       (set dcbit (add-dcflag w fr 0))
Packit ba3681
               (LregCheck isLreg (ifield f-reg))
Packit ba3681
Packit ba3681
               ;; If fr is an Lreg, then we have to do 16-bit arithmetic.
Packit ba3681
               ;; We can take advantage of the fact that by a lucky
Packit ba3681
               ;; coincidence, the address of register xxxH is always 
Packit ba3681
               ;; one lower than the address of register xxxL.
Packit ba3681
               (if (eq isLreg #x1)
Packit ba3681
                  (sequence()
Packit ba3681
                     (set 16bval (reg h-spr (sub (ifield f-reg) 1)))
Packit ba3681
                     (set 16bval (sll 16bval 8))
Packit ba3681
                     (set 16bval (or 16bval (and (reg h-spr (ifield f-reg)) #xFF)))
Packit ba3681
                     (set 16bval (add HI (and w #xFF) 16bval))
Packit ba3681
                     (set (reg h-spr (ifield f-reg)) (and 16bval #xFF))
Packit ba3681
                     (set (reg h-spr (sub (ifield f-reg) 1))
Packit ba3681
                          (and (srl 16bval 8) #xFF))
Packit ba3681
                     (set result (reg h-spr (ifield f-reg)))
Packit ba3681
                  )
Packit ba3681
	       (set result (addc w fr 0)) ;; else part
Packit ba3681
               )
Packit ba3681
	       (set zbit (zflag result))
Packit ba3681
	       (set fr result))
Packit ba3681
     ()
Packit ba3681
)
Packit ba3681
Packit ba3681
(dni addw_fr "Add W,fr"
Packit ba3681
     ()
Packit ba3681
     "add W,$fr"
Packit ba3681
     (+ OP6_ADD DIR_TO_W fr)
Packit ba3681
     (sequence ((QI result))
Packit ba3681
	       (set cbit (add-cflag w fr 0))
Packit ba3681
	       (set dcbit (add-dcflag w fr 0))
Packit ba3681
	       (set result (addc w fr 0))
Packit ba3681
	       (set zbit (zflag result))
Packit ba3681
	       (set w result))
Packit ba3681
     ()
Packit ba3681
)
Packit ba3681
Packit ba3681
(dni xorfr_w "XOR fr,W"
Packit ba3681
     ()
Packit ba3681
     "xor $fr,W"
Packit ba3681
     (+ OP6_XOR DIR_NOTTO_W fr)
Packit ba3681
     (sequence ()
Packit ba3681
	       (set fr (xor w fr))
Packit ba3681
	       (set zbit (zflag fr)))
Packit ba3681
     ()
Packit ba3681
)
Packit ba3681
Packit ba3681
(dni xorw_fr "XOR W,fr"
Packit ba3681
     ()
Packit ba3681
     "xor W,$fr"
Packit ba3681
     (+ OP6_XOR DIR_TO_W fr)
Packit ba3681
     (sequence ()
Packit ba3681
	       (set w (xor fr w))
Packit ba3681
	       (set zbit (zflag w)))
Packit ba3681
     ()
Packit ba3681
)
Packit ba3681
Packit ba3681
(dni andfr_w "AND fr,W"
Packit ba3681
     ()
Packit ba3681
     "and $fr,W"
Packit ba3681
     (+ OP6_AND DIR_NOTTO_W fr)
Packit ba3681
     (sequence ()
Packit ba3681
	       (set fr (and w fr))
Packit ba3681
	       (set zbit (zflag fr)))
Packit ba3681
     ()
Packit ba3681
)
Packit ba3681
Packit ba3681
(dni andw_fr "AND W,fr"
Packit ba3681
     ()
Packit ba3681
     "and W,$fr"
Packit ba3681
     (+ OP6_AND DIR_TO_W fr)
Packit ba3681
     (sequence ()
Packit ba3681
	       (set w (and fr w))
Packit ba3681
	       (set zbit (zflag w)))
Packit ba3681
     ()
Packit ba3681
)
Packit ba3681
Packit ba3681
(dni orfr_w "OR fr,W"
Packit ba3681
     ()
Packit ba3681
     "or $fr,W"
Packit ba3681
     (+ OP6_OR DIR_NOTTO_W fr)
Packit ba3681
     (sequence ()
Packit ba3681
	       (set fr (or w fr))
Packit ba3681
	       (set zbit (zflag fr)))
Packit ba3681
     ()
Packit ba3681
)
Packit ba3681
Packit ba3681
(dni orw_fr "OR W,fr"
Packit ba3681
     ()
Packit ba3681
     "or W,$fr"
Packit ba3681
     (+ OP6_OR DIR_TO_W fr)
Packit ba3681
     (sequence ()
Packit ba3681
	       (set w (or fr w))
Packit ba3681
	       (set zbit (zflag w)))
Packit ba3681
     ()
Packit ba3681
)
Packit ba3681
Packit ba3681
(dni dec_fr "Decrement fr"
Packit ba3681
     ()
Packit ba3681
     "dec $fr"
Packit ba3681
     (+ OP6_DEC DIR_NOTTO_W fr)
Packit ba3681
     (sequence ((QI isLreg) (HI 16bval))
Packit ba3681
          (LregCheck isLreg (ifield f-reg))
Packit ba3681
          ;; If fr is an Lreg, then we have to do 16-bit arithmetic.
Packit ba3681
          ;; We can take advantage of the fact that by a lucky
Packit ba3681
          ;; coincidence, the address of register xxxH is always
Packit ba3681
          ;; one lower than the address of register xxxL.
Packit ba3681
          (if (eq isLreg #x1)
Packit ba3681
             (sequence()
Packit ba3681
                ; Create the 16 bit value
Packit ba3681
                (set 16bval (reg h-spr (sub (ifield f-reg) 1)))
Packit ba3681
                (set 16bval (sll 16bval 8))
Packit ba3681
                (set 16bval (or 16bval (and (reg h-spr (ifield f-reg)) #xFF)))
Packit ba3681
                ; New 16 bit instruction
Packit ba3681
		(set 16bval (sub HI 16bval 1))
Packit ba3681
                ; Separate the 16 bit values into the H and L regs
Packit ba3681
                (set (reg h-spr (ifield f-reg)) (and 16bval #xFF))
Packit ba3681
                (set (reg h-spr (sub (ifield f-reg) 1))
Packit ba3681
                     (and (srl 16bval 8) #xFF))
Packit ba3681
                (set fr (reg h-spr (ifield f-reg)))
Packit ba3681
             )
Packit ba3681
             ; Original instruction
Packit ba3681
	     (set fr (sub fr 1))
Packit ba3681
	  )
Packit ba3681
	     (set zbit (zflag fr)))
Packit ba3681
     ()
Packit ba3681
)
Packit ba3681
Packit ba3681
(dni decw_fr "Decrement fr into w"
Packit ba3681
     ()
Packit ba3681
     "dec W,$fr"
Packit ba3681
     (+ OP6_DEC DIR_TO_W fr)
Packit ba3681
     (sequence ()
Packit ba3681
	       (set w (sub fr 1))
Packit ba3681
	       (set zbit (zflag w)))
Packit ba3681
     ()
Packit ba3681
)
Packit ba3681
Packit ba3681
(dni subfr_w "Sub fr,W"
Packit ba3681
     ()
Packit ba3681
     "sub $fr,W"
Packit ba3681
     (+ OP6_SUB DIR_NOTTO_W fr)
Packit ba3681
     (sequence ((QI result) (QI isLreg) (HI 16bval))
Packit ba3681
	       (set cbit (not (sub-cflag fr w 0)))
Packit ba3681
	       (set dcbit (not (sub-dcflag fr w 0)))
Packit ba3681
               (LregCheck isLreg (ifield f-reg))
Packit ba3681
               ;; If fr is an Lreg, then we have to do 16-bit arithmetic.
Packit ba3681
               ;; We can take advantage of the fact that by a lucky
Packit ba3681
               ;; coincidence, the address of register xxxH is always
Packit ba3681
               ;; one lower than the address of register xxxL.
Packit ba3681
               (if (eq isLreg #x1)
Packit ba3681
                  (sequence()
Packit ba3681
                     ; Create the 16 bit value
Packit ba3681
                     (set 16bval (reg h-spr (sub (ifield f-reg) 1)))
Packit ba3681
                     (set 16bval (sll 16bval 8))
Packit ba3681
                     (set 16bval (or 16bval (and (reg h-spr (ifield f-reg)) #xFF)))
Packit ba3681
                     ; New 16 bit instruction
Packit ba3681
                     (set 16bval (sub HI 16bval (and w #xFF)))
Packit ba3681
                     ; Separate the 16 bit values into the H and L regs
Packit ba3681
                     (set (reg h-spr (ifield f-reg)) (and 16bval #xFF))
Packit ba3681
                     (set (reg h-spr (sub (ifield f-reg) 1))
Packit ba3681
                          (and (srl 16bval 8) #xFF))
Packit ba3681
                     (set result (reg h-spr (ifield f-reg)))
Packit ba3681
                  )
Packit ba3681
               ; Original instruction
Packit ba3681
	       (set result (subc fr w 0))
Packit ba3681
               )
Packit ba3681
	       (set zbit (zflag result))
Packit ba3681
	       (set fr result))
Packit ba3681
     ()
Packit ba3681
)
Packit ba3681
Packit ba3681
(dni subw_fr "Sub W,fr"
Packit ba3681
     ()
Packit ba3681
     "sub W,$fr"
Packit ba3681
     (+ OP6_SUB DIR_TO_W fr)
Packit ba3681
     (sequence ((QI result))
Packit ba3681
	       (set cbit (not (sub-cflag fr w 0)))
Packit ba3681
	       (set dcbit (not (sub-dcflag fr w 0)))
Packit ba3681
	       (set result (subc fr w 0))
Packit ba3681
	       (set zbit (zflag result))
Packit ba3681
	       (set w result))
Packit ba3681
     ()
Packit ba3681
)
Packit ba3681
Packit ba3681
(dni clr_fr "Clear fr"
Packit ba3681
     ()
Packit ba3681
     "clr $fr"
Packit ba3681
     (+ OP6_OTHER2 (f-dir 1) fr)
Packit ba3681
     (sequence ()
Packit ba3681
	       (set fr 0)
Packit ba3681
	       (set zbit (zflag fr)))
Packit ba3681
     ()
Packit ba3681
)
Packit ba3681
Packit ba3681
(dni cmpw_fr "CMP W,fr"
Packit ba3681
     ()
Packit ba3681
     "cmp W,$fr"
Packit ba3681
     (+ OP6_OTHER2 (f-dir 0) fr)
Packit ba3681
     (sequence ()
Packit ba3681
	       (set cbit (not (sub-cflag fr w 0)))
Packit ba3681
	       (set dcbit (not (sub-dcflag fr w 0)))
Packit ba3681
	       (set zbit (zflag (sub w fr))))
Packit ba3681
     ()
Packit ba3681
)
Packit ba3681
Packit ba3681
(dni speed "Set speed"
Packit ba3681
     ()
Packit ba3681
     "speed #$lit8"
Packit ba3681
     (+ (f-op8 1) lit8)
Packit ba3681
     (set (reg h-registers #x0E) lit8)
Packit ba3681
     ()
Packit ba3681
)
Packit ba3681
Packit ba3681
(dni ireadi "Insn memory read with increment"
Packit ba3681
     ()
Packit ba3681
     "ireadi"
Packit ba3681
     (+ OP6_OTHER1 (f-op6-10low #x1D))
Packit ba3681
     (c-call "do_insn_read")
Packit ba3681
     ()
Packit ba3681
)
Packit ba3681
Packit ba3681
(dni iwritei "Insn memory write with increment"
Packit ba3681
     ()
Packit ba3681
     "iwritei"
Packit ba3681
     (+ OP6_OTHER1 (f-op6-10low #x1C))
Packit ba3681
     (c-call "do_insn_write")
Packit ba3681
     ()
Packit ba3681
)
Packit ba3681
Packit ba3681
(dni fread "Flash read"
Packit ba3681
     ()
Packit ba3681
     "fread"
Packit ba3681
     (+ OP6_OTHER1 (f-op6-10low #x1B))
Packit ba3681
     (c-call "do_flash_read")
Packit ba3681
     ()
Packit ba3681
)
Packit ba3681
Packit ba3681
(dni fwrite "Flash write"
Packit ba3681
     ()
Packit ba3681
     "fwrite"
Packit ba3681
     (+ OP6_OTHER1 (f-op6-10low #x1A))
Packit ba3681
     (c-call "do_flash_write")
Packit ba3681
     ()
Packit ba3681
)
Packit ba3681
Packit ba3681
(dni iread "Insn memory read"
Packit ba3681
     ()
Packit ba3681
     "iread"
Packit ba3681
     (+ OP6_OTHER1 (f-op6-10low #x19))
Packit ba3681
     (c-call "do_insn_read")
Packit ba3681
     ()
Packit ba3681
)
Packit ba3681
Packit ba3681
(dni iwrite "Insn memory write"
Packit ba3681
     ()
Packit ba3681
     "iwrite"
Packit ba3681
     (+ OP6_OTHER1 (f-op6-10low #x18))
Packit ba3681
     (c-call "do_insn_write")
Packit ba3681
     ()
Packit ba3681
)
Packit ba3681
Packit ba3681
(dni page "Set insn page"
Packit ba3681
     (EXT-SKIP-INSN)
Packit ba3681
     ;"page $page3"
Packit ba3681
     "page $addr16p"
Packit ba3681
     ;(+ OP6_OTHER1 (f-op6-7low #x2) page3)
Packit ba3681
     ;(set pabits (srl page3 13))
Packit ba3681
     (+ OP6_OTHER1 (f-op6-7low #x2) addr16p)
Packit ba3681
     (set pabits addr16p)
Packit ba3681
     ()
Packit ba3681
)
Packit ba3681
Packit ba3681
(dni system "System call"
Packit ba3681
     ()
Packit ba3681
     "system"
Packit ba3681
     (+ OP6_OTHER1 (f-op6-10low #xff))
Packit ba3681
     (c-call "do_system")
Packit ba3681
     ()
Packit ba3681
)
Packit ba3681
Packit ba3681
(dni reti "Return from interrupt"
Packit ba3681
     ()
Packit ba3681
     "reti #$reti3"
Packit ba3681
     (+ OP6_OTHER1 (f-op6-7low #x1) reti3)
Packit ba3681
     (c-call "do_reti" reti3)
Packit ba3681
     ()
Packit ba3681
)
Packit ba3681
Packit ba3681
(dni ret "Return"
Packit ba3681
     ()
Packit ba3681
     "ret"
Packit ba3681
     (+ OP6_OTHER1 (f-op6-10low #x07))
Packit ba3681
     (sequence ((USI new_pc))
Packit ba3681
	       (set new_pc (c-call UHI "pop_pc_stack"))
Packit ba3681
	       (set pabits (srl new_pc 13))
Packit ba3681
	       (set pc new_pc))
Packit ba3681
     ()
Packit ba3681
)
Packit ba3681
Packit ba3681
(dni int "Software interrupt"
Packit ba3681
     ()
Packit ba3681
     "int"
Packit ba3681
     (+ OP6_OTHER1 (f-op6-10low #x6))
Packit ba3681
     (nop)
Packit ba3681
     ()
Packit ba3681
)
Packit ba3681
Packit ba3681
(dni breakx "Breakpoint with extended skip"
Packit ba3681
     (EXT-SKIP-INSN)
Packit ba3681
     "breakx"
Packit ba3681
     (+ OP6_OTHER1 (f-op6-10low #x5))
Packit ba3681
     (c-call "do_break" pc)
Packit ba3681
     ()
Packit ba3681
)
Packit ba3681
Packit ba3681
(dni cwdt "Clear watchdog timer"
Packit ba3681
     ()
Packit ba3681
     "cwdt"
Packit ba3681
     (+ OP6_OTHER1 (f-op6-10low #x4))
Packit ba3681
     (c-call "do_clear_wdt")
Packit ba3681
     ()
Packit ba3681
)
Packit ba3681
Packit ba3681
(dni ferase "Flash erase"
Packit ba3681
     ()
Packit ba3681
     "ferase"
Packit ba3681
     (+ OP6_OTHER1 (f-op6-10low #x3))
Packit ba3681
     (c-call "do_flash_erase")
Packit ba3681
     ()
Packit ba3681
)
Packit ba3681
Packit ba3681
(dni retnp "Return, no page"
Packit ba3681
     ()
Packit ba3681
     "retnp"
Packit ba3681
     (+ OP6_OTHER1 (f-op6-10low #x2))
Packit ba3681
     (sequence ((USI new_pc))
Packit ba3681
	       (set new_pc (c-call UHI "pop_pc_stack"))
Packit ba3681
	       (set pc new_pc))
Packit ba3681
     ()
Packit ba3681
)
Packit ba3681
Packit ba3681
(dni break "Breakpoint"
Packit ba3681
     ()
Packit ba3681
     "break"
Packit ba3681
     (+ OP6_OTHER1 (f-op6-10low #x1))
Packit ba3681
     (c-call "do_break" pc)
Packit ba3681
     ()
Packit ba3681
)
Packit ba3681
Packit ba3681
(dni nop "No operation"
Packit ba3681
     ()
Packit ba3681
     "nop"
Packit ba3681
     (+ OP6_OTHER1 (f-op6-10low #x0))
Packit ba3681
     (nop)
Packit ba3681
     ()
Packit ba3681
)
Packit ba3681
			   
Packit ba3681
Packit ba3681
; Macro instructions
Packit ba3681
(dnmi sc "Skip on carry"
Packit ba3681
      ()
Packit ba3681
      "sc"
Packit ba3681
      (emit sb (bitno 0) (fr #xB)) ; sb status.0
Packit ba3681
)
Packit ba3681
Packit ba3681
(dnmi snc "Skip on no carry"
Packit ba3681
      ()
Packit ba3681
      "snc"
Packit ba3681
      (emit snb (bitno 0) (fr #xB)) ; snb status.0
Packit ba3681
)
Packit ba3681
      
Packit ba3681
(dnmi sz "Skip on zero"
Packit ba3681
      ()
Packit ba3681
      "sz"
Packit ba3681
      (emit sb (bitno 2) (fr #xB)) ; sb status.2
Packit ba3681
)
Packit ba3681
Packit ba3681
(dnmi snz "Skip on no zero"
Packit ba3681
      ()
Packit ba3681
      "snz"
Packit ba3681
      (emit snb (bitno 2) (fr #xB)) ; snb status.2
Packit ba3681
)
Packit ba3681
Packit ba3681
(dnmi skip "Skip always"
Packit ba3681
      (SKIPA)
Packit ba3681
      "skip"
Packit ba3681
      (emit snb (bitno 0) (fr 9)) ; snb pcl.0 | (pcl&1)<<12
Packit ba3681
)
Packit ba3681
Packit ba3681
(dnmi skipb "Skip always"
Packit ba3681
      (SKIPA)
Packit ba3681
      "skip"
Packit ba3681
      (emit sb (bitno 0) (fr 9)) ; sb pcl.0 | (pcl&1)<<12
Packit ba3681
)
Packit ba3681