142 lines
2.1 KiB
ArmAsm
142 lines
2.1 KiB
ArmAsm
|
/* setjmp/longjmp routines for M68HC11 & M68HC12.
|
||
|
* Copyright (C) 1999, 2000, 2001, 2002 Stephane Carrez (stcarrez@nerim.fr)
|
||
|
*
|
||
|
* The authors hereby grant permission to use, copy, modify, distribute,
|
||
|
* and license this software and its documentation for any purpose, provided
|
||
|
* that existing copyright notices are retained in all copies and that this
|
||
|
* notice is included verbatim in any distributions. No written agreement,
|
||
|
* license, or royalty fee is required for any of the authorized uses.
|
||
|
* Modifications to this software may be copyrighted by their authors
|
||
|
* and need not follow the licensing terms described here, provided that
|
||
|
* the new terms are clearly indicated on the first page of each file where
|
||
|
* they apply.
|
||
|
*/
|
||
|
|
||
|
#if __INT__ == 32
|
||
|
# define val 4
|
||
|
# define INT32(X) X
|
||
|
#else
|
||
|
# define val 2
|
||
|
# define INT32(X)
|
||
|
#endif
|
||
|
|
||
|
#ifdef mc6811
|
||
|
# define REG(X) *X
|
||
|
#else
|
||
|
# define REG(X) X
|
||
|
#endif
|
||
|
|
||
|
.sect .text
|
||
|
.global setjmp
|
||
|
.global longjmp
|
||
|
|
||
|
#ifdef mc6811
|
||
|
setjmp:
|
||
|
xgdx
|
||
|
tsy
|
||
|
ldd 0,y
|
||
|
std 0,x
|
||
|
sty 2,x
|
||
|
ldd REG(_.frame)
|
||
|
std 4,x
|
||
|
ldd REG(_.d1)
|
||
|
std 6,x
|
||
|
ldd REG(_.d2)
|
||
|
std 8,x
|
||
|
ldd REG(_.d3)
|
||
|
std 10,x
|
||
|
ldd REG(_.d4)
|
||
|
std 12,x
|
||
|
ldd REG(_.d5)
|
||
|
std 14,x
|
||
|
ldd REG(_.d6)
|
||
|
std 16,x
|
||
|
ldd REG(_.d7)
|
||
|
std 18,x
|
||
|
ldd REG(_.d8)
|
||
|
std 20,x
|
||
|
INT32( ldx #0)
|
||
|
clra
|
||
|
clrb
|
||
|
rts
|
||
|
#else
|
||
|
setjmp:
|
||
|
xgdx
|
||
|
movw 0,sp,2,x+
|
||
|
sts 2,x+
|
||
|
movw _.frame,2,x+
|
||
|
movw _.d1,2,x+
|
||
|
movw _.d2,2,x+
|
||
|
movw _.d3,2,x+
|
||
|
movw _.d4,2,x+
|
||
|
movw _.d5,2,x+
|
||
|
movw _.d6,2,x+
|
||
|
movw _.d7,2,x+
|
||
|
movw _.d8,2,x+
|
||
|
INT32( ldx #0)
|
||
|
clra
|
||
|
clrb
|
||
|
rts
|
||
|
#endif
|
||
|
|
||
|
#ifdef mc6811
|
||
|
longjmp:
|
||
|
xgdx
|
||
|
tsy
|
||
|
ldd val,y
|
||
|
bne do_jump
|
||
|
ldd #1
|
||
|
do_jump:
|
||
|
xgdy
|
||
|
ldd 4,x
|
||
|
std REG(_.frame)
|
||
|
ldd 6,x
|
||
|
std REG(_.d1)
|
||
|
ldd 8,x
|
||
|
std REG(_.d2)
|
||
|
ldd 10,x
|
||
|
std REG(_.d3)
|
||
|
ldd 12,x
|
||
|
std REG(_.d4)
|
||
|
ldd 14,x
|
||
|
std REG(_.d5)
|
||
|
ldd 16,x
|
||
|
std REG(_.d6)
|
||
|
ldd 18,x
|
||
|
std REG(_.d7)
|
||
|
ldd 20,x
|
||
|
std REG(_.d8)
|
||
|
ldd 0,x
|
||
|
ldx 2,x
|
||
|
txs
|
||
|
std 0,x
|
||
|
INT32( ldx #0)
|
||
|
xgdy
|
||
|
rts
|
||
|
#else
|
||
|
|
||
|
longjmp:
|
||
|
xgdx
|
||
|
ldy val,sp
|
||
|
bne do_jump
|
||
|
ldy #1
|
||
|
do_jump:
|
||
|
ldd 4,x+
|
||
|
movw 2,x+,_.frame
|
||
|
movw 0,x,_.d1
|
||
|
movw 2,x,_.d2
|
||
|
movw 4,x,_.d3
|
||
|
movw 6,x,_.d4
|
||
|
movw 8,x,_.d5
|
||
|
movw 10,x,_.d6
|
||
|
movw 12,x,_.d7
|
||
|
movw 14,x,_.d8
|
||
|
ldx -4,x
|
||
|
txs
|
||
|
std 0,x
|
||
|
INT32( ldx #0)
|
||
|
xgdy
|
||
|
rts
|
||
|
#endif
|
||
|
|