/* 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