X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=hexed%2Fhexed.s;h=23313dc9f62c411c7dacb7d304d525707c79a86f;hb=4dfddc2f8d289ebec69198164247e0d2f7dfde84;hp=6ca711a0bc7be431f4233c00b404e8ebeb71bfea;hpb=526976b9201d9f7350f7fb0372c70c32df909224;p=megadrive.git diff --git a/hexed/hexed.s b/hexed/hexed.s index 6ca711a..23313dc 100644 --- a/hexed/hexed.s +++ b/hexed/hexed.s @@ -7,6 +7,7 @@ .text .globl main +.globl VBL ################################################## # # @@ -29,7 +30,7 @@ .equ VDP1_PAL, 0x08 .equ VDP1_RESERVED, 0x04 -.equ VDP12_SPR_SHADOWS, 0x08 +.equ VDP12_STE, 0x08 .equ VDP12_SCREEN_V224, 0x00 .equ VDP12_SCREEN_V448, 0x04 .equ VDP12_PROGRESSIVE, 0x00 @@ -44,6 +45,10 @@ .equ VDP16_MAP_H64, 0x01 .equ VDP16_MAP_H128, 0x03 +.equ MMODE_MAIN, 0 +.equ MMODE_VAL_INPUT, 1 +.equ MMODE_EDIT_VAL, 2 +.equ MMODE_GOTO, 3 ################################################## @@ -65,40 +70,31 @@ .endm -# make VDP word from address adr to d0 -# destroys d7 -.macro VRAM_ADDR_var adr +.macro CRAM_ADDR reg adr + move.l #(((0xc000 + (\adr & 0x3fff)) << 16) + (\adr >> 14)),\reg +.endm + + +# make VDP word from address adr and store in d0 +.macro XRAM_ADDR_var adr move.l \adr,d0 - move.l \adr,d7 - and.w #0x3fff,d0 - lsr.w #7,d7 - lsr.w #7,d7 - add.w #0x4000,d0 - lsl.l #7,d0 - lsl.l #7,d0 - lsl.l #2,d0 - or.l d7,d0 + lsl.l #8,d0 + lsl.l #8,d0 + rol.l #2,d0 + lsl.b #2,d0 + lsr.l #2,d0 .endm -.macro CRAM_ADDR reg adr - move.l #(((0xc000 + (\adr & 0x3fff)) << 16) + (\adr >> 14)),\reg +.macro VRAM_ADDR_var adr + XRAM_ADDR_var \adr + or.l #0x40000000,d0 .endm -/* For indirect (variable) addresses */ -.macro CRAM_ADDR_var reg adr - move.l \adr,d6 - move.l \adr,d7 - and.w #0x3fff,d6 - lsr.w #7,d7 - lsr.w #7,d7 - add.w #0xc000,d6 - lsl.l #7,d6 - lsl.l #7,d6 - lsl.l #2,d6 - or.l d7,d6 - move.l d6,\reg +.macro CRAM_ADDR_var adr + XRAM_ADDR_var \adr + or.l #0xc0000000,d0 .endm @@ -112,6 +108,39 @@ .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 val + btst.l #\bit,d0 + beq 0f + \op.l \val,a6 + bra dpad_end +0: +.endm + +# convert a6 to normal addr +# destroys d0 +.macro mk_a6_addr reg + move.l a6,\reg + moveq.l #0,d0 + move.b \reg,d0 + lsr.l #8,\reg + add.l d0,\reg +.endm + +.macro change_mode mode_new mode_back + and.w #0xc0ff,d7 + or.w #(\mode_back<<11)|(\mode_new<<8),d7 +.endm + ################################################# # # # DATA # @@ -119,19 +148,24 @@ ################################################# 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" +txt_edit: + .ascii "- edit -\0" +txt_a_confirm: + .ascii "A-confirm\0" ################################################## # # @@ -142,58 +176,64 @@ hello: .align 2 main: + /* mask irqs during init */ + move.w #0x2700,sr + + movea.l #0,a6 + move.l #0x8000,d7 + moveq.l #0,d6 + + /* Init pads */ + move.b #0x40,(0xa10009).l + move.b #0x40,(0xa10003).l + /* Initialize VDP */ jsr init_gfx /* Load color data */ - movea.l #0,a3 - movea.l #colors,a4 - moveq.l #(colors_end-colors)/2,d4 + movea.l #0,a0 + movea.l #colors,a1 + moveq.l #(colors_end-colors)/2,d0 jsr load_colors /* load patterns */ - movea.l #0,a3 - movea.l #font,a4 - move.l #128,d4 + movea.l #0,a0 + movea.l #font,a1 + move.l #128,d0 jsr load_tiles /* generate A layer map */ - movea.l #0xe000,a6 + movea.l #0xe000,a1 move.l #28-1,d4 lmaploop0: - movea.l a6,a3 + movea.l a1,a0 jsr load_prepare move.l #64/2-1,d3 -0: move.l #0x00000000,(a3) +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 */ - movea.l #0xc000,a3 + movea.l #0xc000,a0 jsr load_prepare move.l #64*28/2-1,d3 -0: move.l #0x00000000,(a3) +0: move.l #0x00000000,(a0) dbra d3,0b /* upload sprite data */ - movea.l #0xfc00,a3 + movea.l #0xfc00,a0 jsr load_prepare - movea.l #sprite_data,a0 + movea.l #sprite_data,a1 move.l #(sprite_data_end-sprite_data)/2-1,d3 -0: move.l (a0)+,(a3) +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 ################################################## # # @@ -201,6 +241,11 @@ lmaploop0: # # ################################################## +# global regs: +# a6 = page_start[31:8]|cursor_offs[7:0] +# d7 = old_inputs[31:16]|edit_bytes[15:14]|g_mode_old[13:11]|g_mode[10:8]|irq_cnt[7:0] +# d6 = edit_word[31:8]|edit_done[7]|edit_pos[6:4]|autorep_cnt[3:0] + forever: @@ -209,6 +254,428 @@ forever: +VBL: + addq.b #1,d7 + movem.l d0-d5/a0-a5,-(a7) + + moveq.l #0,d0 + move.w d7,d0 + lsr.w #6,d0 + and.w #0x1c,d0 + move.l (jumptab,pc,d0),a0 + jmp (a0) +jumptab: + dc.l mode_main + dc.l mode_val_input + dc.l mode_edit_val /* edit val in editor */ + dc.l mode_goto + dc.l mode_main + dc.l mode_main + dc.l mode_main + dc.l mode_main + +##################### main ####################### + +mode_main: + 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 + mk_a6_addr d2 + move.l #0x4006,d3 + jsr print_hex_preped + + /* handle input */ + jsr get_input /* x0cbrldu x1sa00du */ + + btst.l #16+4,d0 /* A - scroll modifier */ + beq input_noa + + do_dpad 16+0, sub, #0x0800 + do_dpad 16+1, add, #0x0800 + do_dpad 16+10, sub, #0xd800 + do_dpad 16+11, add, #0xd800 +input_noa: + moveq.l #0,d1 + move.w d7,d1 + lsr.w #7,d1 + lsr.w #7,d1 + + do_dpad 0, subq, #0x0008 + do_dpad 1, addq, #0x0008 + do_dpad 10, sub, d1 + do_dpad 11, add, d1 + +dpad_end: + /* update addr */ + move.l a6,d1 + cmp.b #0xf0,d1 + blo 0f + sub.l #0xd800,a6 + add.w #0x00d8,a6 + bra 1f +0: + cmp.b #0xd8,d1 + blo 1f + add.l #0xd800,a6 + sub.w #0x00d8,a6 +1: + + /* other btns */ + moveq.l #0,d1 + btst.l #12,d0 /* B - switch byte/word mode */ + beq input_nob + bclr.l #15,d7 + add.w #0x4000,d7 /* changes between 01 10 */ + move.l a6,d1 + and.l #1,d1 + sub.l d1,a6 /* make even, just in case */ + +input_nob: + btst.l #13,d0 /* C - edit selected byte */ + beq input_noc + + change_mode MMODE_EDIT_VAL, MMODE_MAIN + write_vdp_reg 12,(VDP12_SCREEN_V224 | VDP12_SCREEN_H320 | VDP12_STE) + +input_noc: + btst.l #5,d0 /* Start - goto */ + beq input_nos + + change_mode MMODE_GOTO, MMODE_MAIN + write_vdp_reg 12,(VDP12_SCREEN_V224 | VDP12_SCREEN_H320 | VDP12_STE) + +input_nos: +vbl_end: + movem.l (a7)+,d0-d5/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 + move.w #0x2004,d3 + + btst.l #15,d7 + bne draw_cursor_word + +draw_cursor_byte: + move.b (-8,a1,d0),d2 + and.b #1,d0 + lsl.b #2,d0 + add.b d0,d1 + subq.b #2,d3 + bra 0f + +draw_cursor_word: + move.w (-8,a1,d0),d2 +0: + lea (7*2,a2,d1),a0 + jsr load_prepare + jsr print_hex_preped + + move.l a2,a0 + add.w #26*2,a0 + jsr load_prepare /* restore a0 */ + + jmp draw_chars_pre + + +#################### hedit ####################### + +mode_edit_val: + btst.l #7,d6 + bne mode_hedit_finish + + /* read val to edit */ + mk_a6_addr d1 + move.l d1,a0 + moveq.l #0,d0 + btst.l #15,d7 + bne 0f + move.b (a0),d0 + bra 1f +0: + move.w (a0),d0 +1: + lsl.l #8,d0 + and.l #0xff,d6 + or.l d0,d6 + + and.b #0x0f,d6 /* not done, reset pos */ + change_mode MMODE_VAL_INPUT, MMODE_EDIT_VAL + jmp vbl_end + +mode_hedit_finish: + /* write the val */ + mk_a6_addr d1 + move.l d1,a0 + move.l d6,d0 + lsr.l #8,d0 + + btst.l #15,d7 + bne 0f + move.b d0,(a0) + bra 1f +0: + move.w d0,(a0) +1: + + and.l #0xf,d6 /* forget val and pos */ + bra return_to_main + +##################### goto ####################### + +mode_goto: + btst.l #7,d6 + bne mode_goto_finish + + or.w #0xc000,d7 /* 3 bytes */ + bclr.l #7,d6 + change_mode MMODE_VAL_INPUT, MMODE_GOTO + jmp vbl_end + +mode_goto_finish: + move.l d6,d0 + lsr.l #8,d0 + move.l d0,d1 + and.l #7,d1 + and.b #0xf8,d0 + lsl.l #8,d0 + or.l d1,d0 + move.l d0,a6 + + and.w #0x3fff,d7 + or.w #0x8000,d7 /* back to 2 bytes */ + bra return_to_main + +################### val edit ##################### + +mode_val_input: + /* frame */ + movea.l #0xe000+14*2+11*64*2,a1 + moveq.l #6-1,d1 +0: + move.w a1,a0 + jsr load_prepare + moveq.l #11-1,d0 +1: + move.w #0,(a0) + dbra d0,1b + + add.w #64*2,a1 + dbra d1,0b + + /* text */ + lea txt_edit,a0 + move.l #15,d0 + move.l #11,d1 + move.l #0xc000,d2 + jsr print + + lea txt_a_confirm,a0 + move.l #15,d0 + move.l #15,d1 + move.l #0xc000,d2 + jsr print + + /* edit field */ + moveq.l #0,d0 + moveq.l #0,d1 + moveq.l #0,d3 + move.w d7,d3 + lsr.w #7,d3 + lsr.w #7,d3 + + move.b #19,d0 + sub.b d3,d0 + move.b #13,d1 + move.l d6,d2 + lsr.l #8,d2 + add.b d3,d3 + or.w #0x8000,d3 + jsr print_hex + + /* current char */ + moveq.l #0,d0 + moveq.l #0,d1 + + and.w #6,d3 + move.b #19,d0 + move.b d3,d1 + lsr.b #1,d1 /* length in bytes */ + sub.b d1,d0 + move.b d6,d1 + lsr.b #4,d1 + and.b #7,d1 /* nibble to edit */ + add.b d1,d0 + + sub.b d1,d3 + sub.b #1,d3 /* chars to shift out */ + lsl.b #2,d3 + add.b #8,d3 + move.l d6,d2 + lsr.l d3,d2 + + move.b #13,d1 + move.w #0xa001,d3 + jsr print_hex + + /* handle input */ + jsr get_input /* x0cbrldu x1sa00du */ + + move.w d0,d1 + and.w #0x0f00,d1 + beq ai_no_dpad + move.w d7,d1 + lsr.w #7,d1 + lsr.w #7,d1 + add.b d1,d1 /* nibble count */ + sub.b #1,d1 /* max n.t.e. val */ + move.b d6,d2 + lsr.b #4,d2 + and.b #7,d2 /* nibble to edit */ + + move.b d0,d3 + and.b #3,d3 + beq ai_no_ud + moveq.l #0,d3 + moveq.l #0,d4 + move.b #0xf,d3 + move.b #0x1,d4 + sub.b d2,d1 + lsl.b #2,d1 + add.b #8,d1 + lsl.l d1,d3 /* mask */ + lsl.l d1,d4 /* what to add/sub */ + move.l d6,d1 + and.l d3,d1 + btst.l #8,d0 + beq 0f + add.l d4,d1 + bra 1f +0: + sub.l d4,d1 +1: + and.l d3,d1 + eor.l #0xffffffff,d3 + and.l d3,d6 + or.l d1,d6 + jmp vbl_end + +ai_no_ud: + btst.l #10,d0 + bne 0f + add.b #1,d2 + bra 1f +0: + sub.b #1,d2 +1: + cmp.b #0,d2 + bge 0f + move.b d1,d2 +0: + cmp.b d1,d2 + ble 0f + move.b #0,d2 +0: + and.b #0x8f,d6 + lsl.b #4,d2 + or.b d2,d6 + jmp vbl_end + +ai_no_dpad: + move.w d0,d1 + and.w #0x1020,d1 + beq ai_no_sb + + and.l #0xf,d6 /* forget val and pos */ + bra return_to_main + +ai_no_sb: + btst.l #4,d0 + beq ai_no_input + bset.l #7,d6 + move.w d7,d1 + and.w #0x3800,d1 + lsr.w #3,d1 + and.w #0xc0ff,d7 + or.w d1,d7 + +ai_no_input: + jmp vbl_end + + +# go back to main mode +return_to_main: + bclr.l #7,d6 + change_mode MMODE_MAIN, MMODE_MAIN + write_vdp_reg 12,(VDP12_SCREEN_V224 | VDP12_SCREEN_H320) + jmp vbl_end + + ################################################# # # # Initialize VDP registers # @@ -236,101 +703,158 @@ init_gfx: rts +# read single phase from controller +# #a0 - addr +# d0 - result +# destroys d1,d2 +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 + + swap d7 + move.w d7,d1 + eor.w d0,d1 /* changed btns */ + move.w d0,d7 /* old val */ + swap d7 + and.w d0,d1 /* what changed now */ + bne 0f + + addq.b #1,d6 + move.b d6,d2 + and.b #7,d2 /* do autorepeat every 8 frames */ + cmp.b #7,d2 + bne 1f + move.w d0,d1 +0: + and.b #0xf8,d6 +1: + swap d0 + move.w d1,d0 + rts -################################################# -# # -# Load tile data from ROM # -# # -# Parameters: # -# a3: VRAM base # -# a4: pattern address # -# d4: number of tiles to load # -# Destroys a2,d0,d7... # -# # -################################################# +# Load tile data from ROM +# a0: VRAM base +# a1: pattern address +# d0: number of tiles to load +# destroys d1 load_tiles: - move.l #GFXCNTL,a2 - VRAM_ADDR_var a3 - move.l d0,(a2) - lsl #3,d4 + move.l d0,d1 + VRAM_ADDR_var a0 + move.l d0,(GFXCNTL).l - move.l #GFXDATA,a3 - subq.l #1,d4 -_copy_tile_data: - move.l (a4)+,(a3) - dbra d4,_copy_tile_data + move.l #GFXDATA,a0 + lsl.w #3,d1 + subq.l #1,d1 +0: + move.l (a1)+,(a0) + dbra d1,0b rts -# Prepare to write to VDP RAM @a3 -# a3: VRAM base -# a3 set to VDP data port for convenience -# destroys a2,d0,d7 +# Prepare to write to VDP RAM @a0 +# sets a0 to VDP data port for convenience +# a0: VRAM base +# destroys d0 load_prepare: - move.l #GFXCNTL,a2 - VRAM_ADDR_var a3 - move.l d0,(a2) - move.l #GFXDATA,a3 - + VRAM_ADDR_var a0 + move.l d0,(GFXCNTL).l + move.l #GFXDATA,a0 rts -################################################# -# # -# Load color data from ROM # -# # -# Parameters: # -# a3: CRAM base # -# a4: color list address # -# d4: number of colors to load # -# # -################################################# +# Load color data from ROM +# a0: CRAM base +# a1: color list address +# d0: number of colors to load +# destroys d1 load_colors: - move.l #GFXCNTL,a2 - CRAM_ADDR_var d0,a3 - move.l d0,(a2) + move.l d0,d1 + CRAM_ADDR_var a0 + move.l d0,(GFXCNTL).l - move.l #GFXDATA,a3 - subq.w #1,d4 -_copy_color_data: - move.w (a4)+,(a3) - dbra d4,_copy_color_data + move.l #GFXDATA,a0 + subq.w #1,d1 +0: + move.w (a1)+,(a0) + dbra d1,0b rts -################################################# -## -## print -# a0 - string -# d0 - x -# d1 - y + +# print +# a0 - string +# d0 - x +# d1 - y +# d2 - tile_bits[15:11] +# destroys a1 print: - lsl.w #6,d1 - add.w d1,d0 - movea.l #0xe000,a6 - lsl.w #1,d0 - add.w d0,a6 - moveq.l #0,d1 + move.l a0,a1 + XY2NT + jsr load_prepare + move.l d2,d0 + and.w #0xf800,d0 _print_loop: - move.b (a0)+,d1 + move.b (a1)+,d0 beq _print_end - move.l a6,a3 - jsr load_prepare - move.w d1,(a3) - addq.l #2,a6 + move.w d0,(a0) jmp _print_loop _print_end: 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 # @@ -338,11 +862,10 @@ _print_end: ################################################# wait_vsync: - movea.l #vtimer,a0 - move.l (a0),a1 + move.b d7,d0 _wait_change: stop #0x2000 - cmp.l (a0),a1 + cmp.b d7,d0 beq _wait_change rts @@ -355,15 +878,7 @@ _wait_change: .bss -# used by sega_gcc.s -.globl htimer -.globl vtimer -.globl rand_num -htimer: .long 0 -vtimer: .long 0 -rand_num: .long 0 - -# +# nothing :) .end