.text
.globl main
+.globl VBL
##################################################
# #
.endm
+# convert tile coords in d0, d1 to nametable addr to a0
+.macro XY2NT
+ lsl.w #6,d1
+ add.w d1,d0
+ lsl.w #1,d0
+ movea.l #0xe000,a0
+ add.w d0,a0
+.endm
+
+# check if some d-pad button (and modifier) is pressed
+.macro do_dpad bit op opq val modval
+ btst.b #\bit,d0
+ beq 1f
+ btst.b #4,d0 /* A pressed? */
+ bne 0f
+ \opq.l #\val,a6
+ bra input_end
+0:
+ \op.l #\modval,a6
+ bra input_end
+1:
+.endm
+
#################################################
# #
# DATA #
#################################################
colors:
- dc.w 0x0000,0x0eee
+ dc.w 0x0000,0x0eee,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000
+ dc.w 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000
+ dc.w 0x0000,0x02e2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000
+ dc.w 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000
+ dc.w 0x0000,0x0e44,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000
+ dc.w 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000
colors_end:
-# pattern:
-
sprite_data:
/* Y size link attr X */
dc.w 0; dc.b 0x05; dc.b 0; dc.w 0x6002; dc.w 0
sprite_data_end:
-hello:
- .ascii "hello world"
-
##################################################
# #
# MAIN PROGRAM #
.align 2
main:
+ /* mask irqs during init */
+ move.w #0x2700,sr
+
+ movea.l #0,a6
+ moveq.l #0,d7
+
+ /* Init pads */
+ move.b #0x40,(0xa10009).l
+ move.b #0x40,(0xa10003).l
+
/* Initialize VDP */
jsr init_gfx
jsr load_tiles
/* generate A layer map */
- movea.l #0xe000,a6
+ movea.l #0xe000,a1
move.l #28-1,d4
lmaploop0:
- movea.l a6,a0
+ movea.l a1,a0
jsr load_prepare
move.l #64/2-1,d3
0: move.l #0x00000000,(a0)
dbra d3,0b
- add.l #64*2,a6
+ add.l #64*2,a1
dbra d4,lmaploop0
/* generate B layer map */
0: move.l (a1)+,(a0)
dbra d3,0b
- jsr wait_vsync
-
- movea.l #hello,a0
- moveq.l #1,d0
- moveq.l #1,d1
- jsr print
+ move.w #0x2000,sr
##################################################
# #
# #
##################################################
+# global regs:
+# a6 - page_start[31:8]|cursor_offs[7:0]
+# d7 - byte_mode[0]
+
forever:
+VBL:
+ addq.l #1,(vtimer).l
+ movem.l d0-d6/a0-a5,-(a7)
+
+ /* draw main stuff */
+ clr.l d1
+ move.l a6,d0
+ move.b d0,d1
+ lsr.l #8,d0
+ move.l d0,a1 /* current addr */
+ lsr.b #3,d1
+ neg.b d1
+ add.b #27-1,d1 /* line where the cursor sits */
+ swap d1
+
+ movea.l #0xe004,a2
+ move.l #27-1,d5 /* line counter for dbra */
+ or.l d1,d5
+
+draw_column:
+ move.l a2,a0
+ jsr load_prepare
+
+ /* addr */
+ move.l a1,d2
+ moveq.l #6,d3
+ jsr print_hex_preped
+
+ /* 4 shorts */
+ moveq.l #4,d3
+ moveq.l #4-1,d4
+draw_shorts:
+ move.w #' ',(a0)
+ move.w (a1)+,d2
+ jsr print_hex_preped
+ dbra d4,draw_shorts
+
+ move.l d5,d0
+ swap d0
+ cmp.w d5,d0
+ beq draw_cursor
+
+draw_chars_pre:
+ move.l #(' '<<16)|' ',(a0)
+
+ /* 8 chars */
+ subq.l #8,a1
+ moveq.l #8-1,d4
+draw_chars:
+ move.b (a1)+,d0
+ move.b d0,d1
+ sub.b #0x20,d1
+ cmp.b #0x60,d1
+ blo 0f
+ move.w #'.',d0
+0:
+ move.w d0,(a0)
+ dbra d4,draw_chars
+
+ add.w #0x80,a2
+ dbra d5,draw_column
+
+ /* status bar */
+ movea.l #0xe004+64*2*27,a0
+ jsr load_prepare
+ move.l a6,d2
+ moveq.l #0,d3
+ move.b d2,d3
+ lsr.l #8,d2
+ add.l d3,d2
+ move.l #0x4006,d3
+ jsr print_hex_preped
+
+ /* handle input */
+ jsr get_input /* x0cbrldu x1sa00du */
+
+ do_dpad 0, sub, subq, 0x0008, 0x0800
+ do_dpad 1, add, addq, 0x0008, 0x0800
+ do_dpad 10, sub, subq, 0x0001, 0xd800
+ do_dpad 11, add, addq, 0x0001, 0xd800
+input_end:
+
+ /* update addr */
+ move.l a6,d0
+ cmp.b #0xf0,d0
+ blo 0f
+ sub.l #0xd800,a6
+ add.w #0x00d8,a6
+ bra 1f
+0:
+ cmp.b #0xe0,d0
+ blo 1f
+ add.l #0xd800,a6
+ sub.w #0x00d8,a6
+1:
+
+end:
+ movem.l (a7)+,d0-d6/a0-a5
+ rte
+
+
+draw_cursor:
+ move.l a6,d0
+ and.l #7,d0 /* byte offs */
+ move.l d0,d1
+ lsr.b #1,d1 /* which word */
+ move.b d1,d2
+ lsl.b #2,d2
+ add.b d2,d1 /* num of chars to skip */
+ lsl.b #1,d1
+
+ /* FIXME */
+ move.w (-8,a1,d0),d2
+
+ lea (7*2,a2,d1),a0
+ jsr load_prepare
+
+ move.w #0x2004,d3
+ jsr print_hex_preped
+
+ move.l a2,a0
+ add.w #26*2,a0
+ jsr load_prepare /* restore a0 */
+
+ jmp draw_chars_pre
+
+
#################################################
# #
# Initialize VDP registers #
rts
+# read single phase from controller
+# a0 - addr
+# d0 - result
+get_input:
+ move.b #0x40,(0xa10003)
+ nop
+ nop
+ nop
+ move.b (0xa10003),d0
+ move.b #0x00,(0xa10003)
+ lsl.w #8,d0
+ nop
+ move.b (0xa10003),d0
+ eor.w #0xffff,d0
+# move.b #0x40,(0xa10003)
+ rts
+
# Load tile data from ROM
# a0: VRAM base
# a1: pattern address
print:
move.l a0,a1
- lsl.w #6,d1
- add.w d1,d0
- lsl.w #1,d0
- movea.l #0xe000,a0
- add.w d0,a0
+ XY2NT
jsr load_prepare
moveq.l #0,d0
rts
+# print_hex
+# d0 - x
+# d1 - y
+# d2 - value
+# d3 - digit_cnt[0:7]|tile_bits[11:15]
+# destroys a0, preserves d3
+
+print_hex:
+ XY2NT
+ jsr load_prepare
+
+print_hex_preped:
+ moveq.l #0,d0
+ move.b d3,d0
+ move.l d0,d1
+ lsl.b #2,d0
+ ror.l d0,d2 /* prep value */
+ subq.l #1,d1 /* count */
+ move.w d3,d0
+ and.w #0xf800,d0 /* keep upper bits in d0 */
+
+_print_hex_loop:
+ rol.l #4,d2
+ move.b d2,d0
+ and.b #0xf,d0
+
+ add.b #'0',d0
+ cmp.b #'9',d0
+ ble 0f
+ addq.b #7,d0
+0:
+ move.w d0,(a0)
+ dbra d1,_print_hex_loop
+
+ rts
+
+
#################################################
# #
# Wait for next VBlank interrupt #