version 1.3, 1999/10/13 13:00:07
|
version 1.4, 2000/06/17 12:01:55
|
Line 2
|
Line 2
|
\ bernd thallner 9725890 881 |
\ bernd thallner 9725890 881 |
\ assembler in forth for alpha |
\ assembler in forth for alpha |
|
|
\ requires code.fs |
\ require ../../code.fs |
|
|
\ also assembler definitions |
get-current |
|
also assembler definitions |
|
|
\ register |
\ register |
|
|
Line 24
|
Line 25
|
$d constant s4 |
$d constant s4 |
$e constant s5 |
$e constant s5 |
$f constant fp |
$f constant fp |
$10 constant a0 |
\ commented out to avoid shadowing hex numbers |
$11 constant a1 |
\ $10 constant a0 |
$12 constant a2 |
\ $11 constant a1 |
$13 constant a3 |
\ $12 constant a2 |
$14 constant a4 |
\ $13 constant a3 |
$15 constant a5 |
\ $14 constant a4 |
|
\ $15 constant a5 |
$16 constant t8 |
$16 constant t8 |
$17 constant t9 |
$17 constant t9 |
$18 constant t10 |
$18 constant t10 |
Line 458 $12 $31 Opr# zapnot#,
|
Line 460 $12 $31 Opr# zapnot#,
|
endif, |
endif, |
; |
; |
|
|
\ jump marks |
\ \ jump marks |
|
|
\ example: |
\ \ example: |
|
|
\ init_marktbl \ initializes mark table |
\ \ init_marktbl \ initializes mark table |
\ 31 0 br, |
\ \ 31 0 br, |
\ 0 store_branch \ store jump address for mark 0 |
\ \ 0 store_branch \ store jump address for mark 0 |
\ 1 2 3 addf, |
\ \ 1 2 3 addf, |
\ 0 set_mark \ store mark 0 |
\ \ 0 set_mark \ store mark 0 |
\ 2 3 4 addf, |
\ \ 2 3 4 addf, |
\ 2 0 beq, |
\ \ 2 0 beq, |
\ 0 store_branch \ store jump address for mark 0 |
\ \ 0 store_branch \ store jump address for mark 0 |
\ calculate_marks \ calculate all jumps |
\ \ calculate_marks \ calculate all jumps |
|
|
\ with <mark_address> <jump_address> calculate_branch you can calculate the |
\ \ with <mark_address> <jump_address> calculate_branch you can calculate the |
\ displacement field without the mark_table for one branch |
\ \ displacement field without the mark_table for one branch |
|
|
\ example: |
\ \ example: |
\ here 31 0 br, |
\ \ here 31 0 br, |
\ here 1 2 3 addf, |
\ \ here 1 2 3 addf, |
\ calculate_branch |
\ \ calculate_branch |
|
|
5 constant mark_numbers |
\ 5 constant mark_numbers |
5 constant mark_uses |
\ 5 constant mark_uses |
|
|
create mark_table |
\ create mark_table |
mark_numbers mark_uses 1+ * cells allot |
\ mark_numbers mark_uses 1+ * cells allot |
|
|
: init_marktbl ( -- ) \ initializes mark table |
\ : init_marktbl ( -- ) \ initializes mark table |
mark_table mark_numbers mark_uses 1+ * cells + |
\ mark_table mark_numbers mark_uses 1+ * cells + |
mark_table |
\ mark_table |
begin |
\ begin |
over over > |
\ over over > |
while |
\ while |
dup 0 swap ! |
\ dup 0 swap ! |
1 cells + |
\ 1 cells + |
repeat |
\ repeat |
drop drop |
\ drop drop |
; |
\ ; |
|
|
: set_mark ( mark_number -- ) \ sets mark, store address in mark table |
\ : set_mark ( mark_number -- ) \ sets mark, store address in mark table |
dup mark_numbers >= abort" error, illegal mark number" |
\ dup mark_numbers >= abort" error, illegal mark number" |
mark_uses 1+ * cells |
\ mark_uses 1+ * cells |
mark_table + here 8 - swap ! |
\ mark_table + here 8 - swap ! |
; |
\ ; |
|
|
: store_branch ( mark_number -- ) \ stores address of branch in mark table |
\ : store_branch ( mark_number -- ) \ stores address of branch in mark table |
dup mark_numbers >= abort" error, illegal mark number" |
\ dup mark_numbers >= abort" error, illegal mark number" |
mark_uses 1+ * cells |
\ mark_uses 1+ * cells |
mark_table + 1 cells + |
\ mark_table + 1 cells + |
dup mark_uses cells + swap |
\ dup mark_uses cells + swap |
begin |
\ begin |
over over > over @ and |
\ over over > over @ and |
while |
\ while |
1 cells + |
\ 1 cells + |
repeat |
\ repeat |
swap over = abort" error, not enough space in mark_table, increase mark_uses" |
\ swap over = abort" error, not enough space in mark_table, increase mark_uses" |
here 4 - swap ! |
\ here 4 - swap ! |
; |
\ ; |
|
|
|
\ : calculate_branch ( mark_addr branch_addr -- ) \ calculate branch displacement field for one branch |
|
\ swap over - 4 + 4 / |
|
\ $1fffff and |
|
\ over h@ or swap h! |
|
\ ; |
|
|
|
\ : calculate_mark ( tb mark_address -- tb ) \ calculates branch displacement field for one mark |
|
\ over 1 cells + |
|
\ dup mark_uses cells + swap |
|
\ begin |
|
\ over over > |
|
\ while |
|
\ 2over swap drop ( ei i markaddr ej j markaddr ) |
|
\ over @ |
|
\ dup if |
|
\ calculate_branch |
|
\ else |
|
\ drop drop |
|
\ endif |
|
\ 1 cells + |
|
\ repeat drop drop drop |
|
\ ; |
|
|
|
\ : calculate_marks ( -- ) \ calculates branch displacement field for all marks |
|
\ mark_table mark_numbers 1- mark_uses 1+ * cells + |
|
\ mark_table |
|
\ begin |
|
\ over over >= |
|
\ while |
|
\ dup @ |
|
\ dup if \ used mark |
|
\ calculate_mark |
|
\ else |
|
\ drop |
|
\ endif |
|
\ mark_uses 1+ cells + |
|
\ repeat |
|
\ drop drop |
|
\ ; |
|
|
|
previous set-current |
|
|
: calculate_branch ( mark_addr branch_addr -- ) \ calculate branch displacement field for one branch |
|
swap over - 4 + 4 / |
|
$1fffff and |
|
over h@ or swap h! |
|
; |
|
|
|
: calculate_mark ( tb mark_address -- tb ) \ calculates branch displacement field for one mark |
|
over 1 cells + |
|
dup mark_uses cells + swap |
|
begin |
|
over over > |
|
while |
|
2over swap drop ( ei i markaddr ej j markaddr ) |
|
over @ |
|
dup if |
|
calculate_branch |
|
else |
|
drop drop |
|
endif |
|
1 cells + |
|
repeat drop drop drop |
|
; |
|
|
|
: calculate_marks ( -- ) \ calculates branch displacement field for all marks |
|
mark_table mark_numbers 1- mark_uses 1+ * cells + |
|
mark_table |
|
begin |
|
over over >= |
|
while |
|
dup @ |
|
dup if \ used mark |
|
calculate_mark |
|
else |
|
drop |
|
endif |
|
mark_uses 1+ cells + |
|
repeat |
|
drop drop |
|
; |
|