233 lines
2.9 KiB
OpenEdge ABL
233 lines
2.9 KiB
OpenEdge ABL
.macro start
|
|
.text
|
|
.align 2
|
|
.globl _start
|
|
_start:
|
|
ldi r0, 0
|
|
.endm
|
|
|
|
|
|
.macro exit47
|
|
ldi r4, 1
|
|
ldi r0, 47
|
|
trap 15
|
|
.endm
|
|
|
|
|
|
.macro exit0
|
|
ldi r4, 1
|
|
ldi r0, 0
|
|
trap 15
|
|
.endm
|
|
|
|
|
|
.macro exit1
|
|
ldi r4, 1
|
|
ldi r0, 1
|
|
trap 15
|
|
.endm
|
|
|
|
|
|
.macro exit2
|
|
ldi r4, 1
|
|
ldi r0, 2
|
|
trap 15
|
|
.endm
|
|
|
|
|
|
.macro load reg val
|
|
ldi \reg, #\val
|
|
.endm
|
|
|
|
|
|
.macro load2w reg hi lo
|
|
ld2w \reg, @(1f,r0)
|
|
.data
|
|
.align 2
|
|
1: .short \hi
|
|
.short \lo
|
|
.text
|
|
.endm
|
|
|
|
|
|
.macro check exit reg val
|
|
cmpeqi \reg, #\val
|
|
brf0t 1f
|
|
0: ldi r4, 1
|
|
ldi r0, \exit
|
|
trap 15
|
|
1:
|
|
.endm
|
|
|
|
|
|
.macro check2w2 exit reg hi lo
|
|
st2w \reg, @(1f,r0)
|
|
ld r2, @(1f, r0)
|
|
cmpeqi r2, #\hi
|
|
brf0f 0f
|
|
ld r2, @(1f + 2, r0)
|
|
cmpeqi r2, #\lo
|
|
brf0f 0f
|
|
bra 2f
|
|
0: ldi r4, 1
|
|
ldi r0, \exit
|
|
trap 15
|
|
.data
|
|
.align 2
|
|
1: .long 0
|
|
.text
|
|
2:
|
|
.endm
|
|
|
|
|
|
.macro loadacc2 acc guard hi lo
|
|
ldi r2, #\lo
|
|
mvtaclo r2, \acc
|
|
ldi r2, #\hi
|
|
mvtachi r2, \acc
|
|
ldi r2, #\guard
|
|
mvtacg r2, \acc
|
|
.endm
|
|
|
|
|
|
.macro checkacc2 exit acc guard hi lo
|
|
ldi r2, #\guard
|
|
mvfacg r3, \acc
|
|
cmpeq r2, r3
|
|
brf0f 0f
|
|
ldi r2, #\hi
|
|
mvfachi r3, \acc
|
|
cmpeq r2, r3
|
|
brf0f 0f
|
|
ldi r2, #\lo
|
|
mvfaclo r3, \acc
|
|
cmpeq r2, r3
|
|
brf0f 0f
|
|
bra 4f
|
|
0: ldi r4, 1
|
|
ldi r0, \exit
|
|
trap 15
|
|
4:
|
|
.endm
|
|
|
|
|
|
.macro loadpsw2 val
|
|
ldi r2, #\val
|
|
mvtc r2, cr0
|
|
.endm
|
|
|
|
|
|
.macro checkpsw2 exit val
|
|
mvfc r2, cr0
|
|
cmpeqi r2, #\val
|
|
brf0t 1f
|
|
ldi r4, 1
|
|
ldi r0, \exit
|
|
trap 15
|
|
1:
|
|
.endm
|
|
|
|
|
|
.macro hello
|
|
;; 4:write (1, string, strlen (string))
|
|
ldi r4, 4
|
|
ldi r0, 1
|
|
ldi r1, 1f
|
|
ldi r2, 2f-1f-1
|
|
trap 15
|
|
.section .rodata
|
|
1: .string "Hello World!\n"
|
|
2: .align 2
|
|
.text
|
|
.endm
|
|
|
|
|
|
;;; Blat our DMAP registers so that they point at on-chip imem
|
|
.macro point_dmap_at_imem
|
|
.text
|
|
ldi r2, MAP_INSN | 0xf
|
|
st r2, @(DMAP_REG,r0)
|
|
ldi r2, MAP_INSN
|
|
st r2, @(IMAP1_REG,r0)
|
|
.endm
|
|
|
|
;;; Patch VEC so that it jumps back to code that checks PSW
|
|
;;; and then exits with success.
|
|
.macro check_interrupt vec psw src
|
|
;;; Patch the interrupt vector's AE entry with a jmp to success
|
|
.text
|
|
ldi r4, #1f
|
|
ldi r5, \vec
|
|
;;
|
|
ld2w r2, @(0,r4)
|
|
st2w r2, @(0,r5)
|
|
ld2w r2, @(4,r4)
|
|
st2w r2, @(4,r5)
|
|
;;
|
|
bra 9f
|
|
nop
|
|
;;; Code that gets patched into the interrupt vector
|
|
.data
|
|
1: ldi r1, 2f@word
|
|
jmp r1
|
|
;;; Successfull trap jumps back to here
|
|
.text
|
|
;;; Verify the PSW
|
|
2: mvfc r2, cr0
|
|
cmpeqi r2, #\psw
|
|
brf0t 3f
|
|
nop
|
|
exit1
|
|
;;; Verify the original addr
|
|
3: mvfc r2, bpc
|
|
cmpeqi r2, #\src@word
|
|
brf0t 4f
|
|
exit2
|
|
4: exit0
|
|
;;; continue as normal
|
|
9:
|
|
.endm
|
|
|
|
|
|
PSW_SM = 0x8000
|
|
PSW_01 = 0x4000
|
|
PSW_EA = 0x2000
|
|
PSW_DB = 0x1000
|
|
PSW_DM = 0x0800
|
|
PSW_IE = 0x0400
|
|
PSW_RP = 0x0200
|
|
PSW_MD = 0x0100
|
|
PSW_FX = 0x0080
|
|
PSW_ST = 0x0040
|
|
PSW_10 = 0x0020
|
|
PSW_11 = 0x0010
|
|
PSW_F0 = 0x0008
|
|
PSW_F1 = 0x0004
|
|
PSW_14 = 0x0002
|
|
PSW_C = 0x0001
|
|
|
|
|
|
;;;
|
|
|
|
DMAP_MASK = 0x3fff
|
|
DMAP_BASE = 0x8000
|
|
DMAP_REG = 0xff04
|
|
|
|
IMAP0_REG = 0xff00
|
|
IMAP1_REG = 0xff02
|
|
|
|
MAP_INSN = 0x1000
|
|
|
|
;;;
|
|
|
|
VEC_RI = 0x3ff00
|
|
VEC_BAE = 0x3ff04
|
|
VEC_RIE = 0x3ff08
|
|
VEC_AE = 0x3ff0c
|
|
VEC_TRAP = 0x3ff10
|
|
VEC_DBT = 0x3ff50
|
|
VEC_SDBT = 0x3fff4
|
|
VEC_DBI = 0x3ff58
|
|
VEC_EI = 0x3ff5c
|
|
|
|
|