started memory allocator, allocated final stack, added move_init_stack
[lugburz] / src / amiga / intr.s
1 | vi:filetype=gas68k:
2         .include "hwregs.inc"
3
4         .section .text
5
6         .global exc_init
7 exc_init:
8         move.l #exc_addr, 0xc
9         rts
10
11         .global exc_addr
12 exc_addr:
13         ori.w #0x700, %sr
14         move.l #0xdff000, %a0
15         move.w #0x7fff, DMACON(%a0)     | clear all DMACON bits
16
17         move.l #str_exc3beg, -(%sp)
18         jsr ser_print
19         add.l #4, %sp
20
21         move.l 2(%sp), %d0
22         move.l %d0, -(%sp)
23         bsr print_hex
24         add.l #4, %sp
25
26         move.l #str_exc3end, -(%sp)
27         jsr ser_print
28         add.l #4, %sp
29
30         move.l #3, -(%sp)
31
32 colbars_infloop:
33         move.l #0xdff000, %a0
34         move.w #0, COLOR0(%a0)
35         move.b #128, %d1
36         move.l (%sp), %d2
37
38 0:      move.b VHPOSR(%a0), %d0
39         cmp.b %d1, %d0
40         bne.s 0b
41         add.b #4, %d1
42         move.w #0xfff, COLOR0(%a0)
43 1:      move.b VHPOSR(%a0), %d0
44         cmp.b %d1, %d0
45         bne.s 1b
46         add.b #8, %d1
47         move.w #0, COLOR0(%a0)
48         sub.b #1, %d2
49         bne.s 0b
50
51 0:      cmp.b #0xff, VHPOSR(%a0)
52         bne.s 0b
53         bra.s colbars_infloop
54
55 print_hex:
56         move.l #hexbuf, %a0
57         move.l 4(%sp), %d0
58         move.l #8, %d3
59 0:      rol.l #4, %d0
60         move.b %d0, %d1
61         and.b #0xf, %d1
62         cmp.b #10, %d1
63         bhs.s 1f
64         add.b #'0', %d1         | d1 is in [0, 9]
65         bra.s 2f
66 1:      add.b #'a'-10, %d1      | d1 is in [10, 15]
67 2:      move.b %d1, (%a0)+
68         sub.l #1, %d3
69         bne.s 0b
70
71         move.b #0, (%a0)+
72         move.l #hexbuf, -(%sp)
73         jsr ser_print
74         add.l #4, %sp
75         rts
76
77 hexbuf: .fill 16
78 str_exc3beg: .asciz "Exception 3: address error ("
79 str_exc3end: .asciz ")\n"