Home | History | Annotate | Line # | Download | only in d10v
      1 # mach: d10v
      2 # output:
      3 # sim: --environment operating
      4 
      5 	.macro start
      6 	.text
      7 	.align 2
      8 	.globl _start
      9 _start:
     10 	ldi r0, 0
     11 	.endm
     12 
     13 
     14 	.macro exit47
     15 	ldi r4, 1
     16 	ldi r0, 47
     17 	trap 15
     18 	.endm
     19 
     20 
     21 	.macro exit0
     22 	ldi r4, 1
     23 	ldi r0, 0
     24 	trap 15
     25 	.endm
     26 
     27 
     28 	.macro exit1
     29 	ldi r4, 1
     30 	ldi r0, 1
     31 	trap 15
     32 	.endm
     33 
     34 
     35 	.macro exit2
     36 	ldi r4, 1
     37 	ldi r0, 2
     38 	trap 15
     39 	.endm
     40 
     41 
     42 	.macro load reg val
     43 	ldi \reg, #\val
     44 	.endm
     45 
     46 
     47 	.macro load2w reg hi lo
     48 	ld2w \reg, @(1f,r0)
     49 	.data
     50 	.align 2
     51 1:	.short \hi
     52 	.short \lo
     53 	.text
     54 	.endm
     55 
     56 
     57 	.macro check exit reg val
     58 	cmpeqi	\reg, #\val
     59 	brf0t 1f
     60 0:	ldi r4, 1
     61 	ldi r0, \exit
     62 	trap 15
     63 1:
     64 	.endm
     65 
     66 
     67 	.macro check2w2 exit reg hi lo
     68 	st2w	\reg, @(1f,r0)
     69 	ld	r2, @(1f, r0)
     70 	cmpeqi	r2, #\hi
     71 	brf0f	0f
     72 	ld	r2, @(1f + 2, r0)
     73 	cmpeqi	r2, #\lo
     74 	brf0f	0f
     75 	bra	2f
     76 0:	ldi r4, 1
     77 	ldi r0, \exit
     78 	trap 15
     79 	.data
     80 	.align 2
     81 1:	.long 0
     82 	.text
     83 2:
     84 	.endm
     85 
     86 
     87 	.macro loadacc2 acc guard hi lo
     88 	ldi	r2, #\lo
     89 	mvtaclo	r2, \acc
     90 	ldi	r2, #\hi
     91 	mvtachi	r2, \acc
     92 	ldi	r2, #\guard
     93 	mvtacg	r2, \acc
     94 	.endm
     95 
     96 
     97 	.macro checkacc2 exit acc guard hi lo
     98 	ldi	r2, #\guard
     99 	mvfacg	r3, \acc
    100 	cmpeq	r2, r3
    101 	brf0f	0f
    102 	ldi	r2, #\hi
    103 	mvfachi	r3, \acc
    104 	cmpeq	r2, r3
    105 	brf0f	0f
    106 	ldi	r2, #\lo
    107 	mvfaclo	r3, \acc
    108 	cmpeq	r2, r3
    109 	brf0f	0f
    110 	bra	4f
    111 0:	ldi r4, 1
    112 	ldi r0, \exit
    113 	trap 15
    114 4:
    115 	.endm
    116 
    117 
    118 	.macro loadpsw2 val
    119 	ldi r2, #\val
    120 	mvtc	r2, cr0
    121 	.endm
    122 
    123 
    124 	.macro checkpsw2 exit val
    125 	mvfc	r2, cr0
    126 	cmpeqi	r2, #\val
    127 	brf0t	1f
    128 	ldi r4, 1
    129 	ldi r0, \exit
    130 	trap 15
    131 1:
    132 	.endm
    133 
    134 
    135 	.macro hello
    136 	;; 4:write (1, string, strlen (string))
    137 	ldi r4, 4
    138 	ldi r0, 1
    139 	ldi r1, 1f
    140 	ldi r2, 2f-1f-1
    141 	trap 15
    142 	.section	.rodata
    143 1:	.string "Hello World!\n"
    144 2:	.align 2
    145 	.text
    146 	.endm
    147 
    148 
    149 ;;; Blat our DMAP registers so that they point at on-chip imem
    150 	.macro point_dmap_at_imem
    151 	.text
    152 	ldi r2, MAP_INSN | 0xf
    153 	st r2, @(DMAP_REG,r0)
    154 	ldi r2, MAP_INSN
    155 	st r2, @(IMAP1_REG,r0)
    156 	.endm
    157 
    158 ;;; Patch VEC so that it jumps back to code that checks PSW
    159 ;;; and then exits with success.
    160 	.macro check_interrupt vec psw src
    161 ;;; Patch the interrupt vector's AE entry with a jmp to success
    162 	.text
    163 	ldi r4, #1f
    164 	ldi r5, \vec
    165 	;;
    166 	ld2w r2, @(0,r4)
    167 	st2w r2, @(0,r5)
    168 	ld2w r2, @(4,r4)
    169 	st2w r2, @(4,r5)
    170 	;;
    171 	bra 9f
    172 	nop
    173 ;;; Code that gets patched into the interrupt vector
    174 	.data
    175 1:	ldi r1, 2f@word
    176 	jmp r1
    177 ;;; Successfull trap jumps back to here
    178 	.text
    179 ;;; Verify the PSW
    180 2:	mvfc	r2, cr0
    181 	cmpeqi	r2, #\psw
    182 	brf0t	3f
    183 	nop
    184 	exit1
    185 ;;; Verify the original addr
    186 3:	mvfc	r2, bpc
    187 	cmpeqi	r2, #\src@word
    188 	brf0t	4f
    189 	exit2
    190 4:	exit0
    191 ;;; continue as normal
    192 9:
    193 	.endm
    194 
    195 
    196 	PSW_SM = 0x8000
    197 	PSW_01 = 0x4000
    198 	PSW_EA = 0x2000
    199 	PSW_DB = 0x1000
    200 	PSW_DM = 0x0800
    201 	PSW_IE = 0x0400
    202 	PSW_RP = 0x0200
    203 	PSW_MD = 0x0100
    204 	PSW_FX = 0x0080
    205 	PSW_ST = 0x0040
    206 	PSW_10 = 0x0020
    207 	PSW_11 = 0x0010
    208 	PSW_F0 = 0x0008
    209 	PSW_F1 = 0x0004
    210 	PSW_14 = 0x0002
    211 	PSW_C  = 0x0001
    212 
    213 
    214 ;;;
    215 
    216 	DMAP_MASK = 0x3fff
    217 	DMAP_BASE = 0x8000
    218 	DMAP_REG = 0xff04
    219 
    220 	IMAP0_REG = 0xff00
    221 	IMAP1_REG = 0xff02
    222 
    223 	MAP_INSN = 0x1000
    224 
    225 ;;;
    226 
    227 	VEC_RI   = 0x3ff00
    228 	VEC_BAE  = 0x3ff04
    229 	VEC_RIE  = 0x3ff08
    230 	VEC_AE   = 0x3ff0c
    231 	VEC_TRAP = 0x3ff10
    232 	VEC_DBT  = 0x3ff50
    233 	VEC_SDBT = 0x3fff4
    234 	VEC_DBI  = 0x3ff58
    235 	VEC_EI   = 0x3ff5c
    236