/Articles/Forth/HTML/CodeAsm/intx.html
0,0 → 1,200
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title> words/intx.asm </title>
<meta name="keywords" content="amforth programming language Forth ATmega ATMEL">
<meta name="description" content="amforth - laguage Forth for ATMEL ATmega">
<!-- AUTOINCLUDE START "Page/Head.en.ihtml" DO NOT REMOVE -->
<link rel="StyleSheet" href="../../../../Web/CSS/MLAB.css" type="text/css" title="MLAB Basic Style">
<link rel="StyleSheet" href="../../../../Web/CSS/MLAB_Print.css" type="text/css" media="print">
<link rel="shortcut icon" type="image/x-icon" href="../../../../Web/PIC/MLAB.ico">
<script type="text/javascript" src="../../../../Web/JS/MLAB_Menu.js"></script>
<!-- AUTOINCLUDE END -->
</head>
 
<body lang="en">
 
<!-- AUTOINCLUDE START "Page/Header.en.ihtml" DO NOT REMOVE -->
<!-- ============== HEADER ============== -->
<div class="Header">
<script type="text/javascript">
<!--
SetRelativePath("../../../../");
DrawHeader();
// -->
</script>
<noscript>
<p><b> JavaScript is required for including of the header </b></p>
</noscript>
</div>
<!-- AUTOINCLUDE END -->
 
<!-- AUTOINCLUDE START "Page/Menu.en.ihtml" DO NOT REMOVE -->
<!-- ============== MENU ============== -->
<div class="Menu">
<script type="text/javascript">
<!--
SetRelativePath("../../../../");
DrawMenu();
// -->
</script>
<noscript>
<p><b> JavaScript is required for including of the menu </b><p>
</noscript>
</div>
<!-- AUTOINCLUDE END -->
 
<!-- ============== TEXT ============== -->
<div class="Text">
 
<h1> words/intx.asm </h1>
 
<p>
<input type=button onClick="history.back()" value="Back">
<input type=button onClick="history.forward()" value="Forward">
<a href="../WordList.en.html">Jump to Vocabulary</a>
</p>
 
<pre>
 
.set intcur = heap ; current interrupt
.set heap = heap + 1
.set intvec = heap ; forth interrupt vector (contain the XT)
.set heap = heap + INTVECTORS * CELLSIZE
 
; interrupt routine gets called (again) by rcall! This gives the
; address of the int-vector on the stack.
isr:
st -Y, r0
in r0, SREG
st -Y, r0
pop r0
pop r0 ; = intnum * intvectorsize + 1 (address following the rcall)
dec r0
.if intvecsize == 1 ;
lsl r0
.endif
sts intcur, r0
ld r0, Y+
out SREG, r0
ld r0, Y+
set ; set the interrupt flag for the inner interpreter
reti ; returns the interrupt, the rcall stack frame is removed!
 
; ( xt i -- ) Interrupt
; R( -- )
; stores XT as interrupt vector i
VE_INTSTORE:
.db $04, &quot;int!&quot;,0
.dw VE_HEAD
.set VE_HEAD = VE_INTSTORE
XT_INTSTORE:
.dw DO_COLON
PFA_INTSTORE:
.dw XT_2STAR
.dw XT_DOLITERAL
.dw intvec
.dw XT_PLUS
.dw XT_STORE
.dw XT_EXIT
 
; ( i -- xt ) Interrupt
; R( -- )
; fetches XT from interrupt vector i
VE_INTFETCH:
.db $04, &quot;int@&quot;,0
.dw VE_HEAD
.set VE_HEAD = VE_INTFETCH
XT_INTFETCH:
.dw DO_COLON
PFA_INTFETCH:
.dw XT_2STAR
.dw XT_DOLITERAL
.dw intvec
.dw XT_PLUS
.dw XT_FETCH
.dw XT_EXIT
 
; ( -- n ) Interrupt
; R( -- )
; number of interrupt vectors (0 based)
VE_NUMINT:
.db $04, &quot;#int&quot;,0
.dw VE_HEAD
.set VE_HEAD = VE_NUMINT
XT_NUMINT:
.dw PFA_DOVARIABLE
PFA_NUMINT:
.dw INTVECTORS
 
 
; ( -- sreg ) Interrupt
; R( -- )
; turns off all interrupts and leaves SREG in TOS
VE_INTOFF:
.db $04, &quot;/int&quot;,0
.dw VE_HEAD
.set VE_HEAD = VE_INTOFF
XT_INTOFF:
.dw PFA_INTOFF
PFA_INTOFF:
savetos
clr tosh
in tosl, SREG
cli
jmp_ DO_NEXT
 
; ( -- ) Interrupt
; R( -- )
; turns on all interrupts
VE_INTON:
.db $03, &quot;int&quot;
.dw VE_HEAD
.set VE_HEAD = VE_INTON
XT_INTON:
.dw PFA_INTON
PFA_INTON:
sei
jmp_ DO_NEXT
 
; ( sreg -- ) Interrupt
; R( -- )
; restores SREG from TOS (
;VE_INTRESTORE:
; .db $0B, &quot;int_restore&quot;
; .dw VE_HEAD
; .set VE_HEAD = VE_INTRESTORE
XT_INTRESTORE:
.dw PFA_INTRESTORE
PFA_INTRESTORE:
out SREG, tosl
loadtos
jmp_ DO_NEXT
</pre>
 
<p>
<input type=button onClick="history.back()" value="Back">
<input type=button onClick="history.forward()" value="Forward">
<a href="../WordList.en.html">Jump to Vocabulary</a>
</p>
 
</div>
 
<!-- AUTOINCLUDE START "Page/Footer.en.ihtml" DO NOT REMOVE -->
<!-- ============== FOOTER ============== -->
<div class="Footer">
<script type="text/javascript">
<!--
SetRelativePath("../../../../");
DrawFooter();
// -->
</script>
<noscript>
<p><b> JavaScript is required for including of the footer </b></p>
</noscript>
</div>
<!-- AUTOINCLUDE END -->
 
</body>
</html>