aimless debugging, forgot -m68000 in the linker command line
[lugburz] / src / amiga / intr.s
diff --git a/src/amiga/intr.s b/src/amiga/intr.s
new file mode 100644 (file)
index 0000000..946b2d8
--- /dev/null
@@ -0,0 +1,82 @@
+| vi:filetype=gas68k:
+       .section .text
+
+       .equ DMACON, 0x002
+       .equ VPOSR, 0x004
+       .equ VHPOSR, 0x006
+       .equ COLOR0, 0x180
+
+       .global exc_init
+exc_init:
+       move.l #exc_addr, 0xc
+       rts
+
+       .global exc_addr
+exc_addr:
+       ori.w #0x700, %sr
+       move.l #0xdff000, %a0
+       move.w #0x7fff, DMACON(%a0)     | clear all DMACON bits
+
+       move.l #str_exc3beg, -(%sp)
+       jsr ser_print
+       add.l #4, %sp
+
+       move.l 2(%sp), %d0
+       move.l %d0, -(%sp)
+       bsr print_hex
+       add.l #4, %sp
+
+       move.l #str_exc3end, -(%sp)
+       jsr ser_print
+       add.l #4, %sp
+
+       move.l #3, -(%sp)
+
+colbars_infloop:
+       move.l #0xdff000, %a0
+       move.w #0, COLOR0(%a0)
+       move.b #128, %d1
+       move.l (%sp), %d2
+
+0:     move.b VHPOSR(%a0), %d0
+       cmp.b %d1, %d0
+       bne.s 0b
+       add.b #4, %d1
+       move.w #0xfff, COLOR0(%a0)
+1:     move.b VHPOSR(%a0), %d0
+       cmp.b %d1, %d0
+       bne.s 1b
+       add.b #8, %d1
+       move.w #0, COLOR0(%a0)
+       sub.b #1, %d2
+       bne.s 0b
+
+0:     cmp.b #0xff, VHPOSR(%a0)
+       bne.s 0b
+       bra.s colbars_infloop
+
+print_hex:
+       move.l #hexbuf, %a0
+       move.l 4(%sp), %d0
+       move.l #8, %d3
+0:     rol.l #4, %d0
+       move.b %d0, %d1
+       and.b #0xf, %d1
+       cmp.b #10, %d1
+       bhs.s 1f
+       add.b #'0', %d1         | d1 is in [0, 9]
+       bra.s 2f
+1:     add.b #'a'-10, %d1      | d1 is in [10, 15]
+2:     move.b %d1, (%a0)+
+       sub.l #1, %d3
+       bne.s 0b
+
+       move.b #0, (%a0)+
+       move.l #hexbuf, -(%sp)
+       jsr ser_print
+       add.l #4, %sp
+       rts
+
+hexbuf: .fill 16
+str_exc3beg: .asciz "Exception 3: address error ("
+str_exc3end: .asciz ")\n"