X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=hexed%2Fhexed.s;h=ae77a3eb26060395bb65d2da02423eadbc2679a5;hb=HEAD;hp=e4bc24ceac10af1fe37df739e642802c8f26acee;hpb=318e20ff882dfeb2a8176e89f2343f1c3d60bc1d;p=megadrive.git diff --git a/hexed/hexed.s b/hexed/hexed.s index e4bc24c..95a6930 100644 --- a/hexed/hexed.s +++ b/hexed/hexed.s @@ -1,6 +1,6 @@ ############################################################################### # -# Copyright (c) 2009, Gražvydas Ignotas +# Copyright (c) 2009,2011 Gražvydas Ignotas # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -14,10 +14,10 @@ # names of its contributors may be used to endorse or promote products # derived from this software without specific prior written permission. # -# THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY +# THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND ANY # EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -# DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY +# DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE FOR ANY # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND @@ -29,13 +29,17 @@ # --register-prefix-optional --bitwise-or # -.equ USE_VINT, 1 -.equ RELOCATE_TO_RAM, 0 +.equ USE_VINT, 0 +.equ COPY_TO_EXP, 1 +.equ RELOCATE_TO_RAM, 0xff0100 /* addr or 0 to disable */ +.equ COPY_TEST_CODE, 0 /* addr or 0 to disable, copy only */ +.equ PC_TRANSFER, 0 .text .globl main .globl INT .globl VBL +.globl return_to_main ################################################## # # @@ -80,6 +84,7 @@ .equ MMODE_START_MENU, 4 .equ MMODE_GOTO_PREDEF, 5 .equ MMODE_JMP_ADDR, 6 +.equ MMODE_PC, 7 .equ predef_addr_cnt, ((predef_addrs_end-predef_addrs)/4) @@ -102,7 +107,11 @@ # Set up address in VDP, control port in dst .macro VRAM_ADDR adr dst - move.l #(((0x4000 | (\adr & 0x3fff)) << 16) | (\adr >> 14)),\dst + move.l #(0x40000000 | ((\adr & 0x3fff) << 16) | (\adr >> 14)),\dst +.endm + +.macro VSRAM_ADDR adr dst + move.l #(0x40000010 | ((\adr & 0x3fff) << 16) | (\adr >> 14)),\dst .endm @@ -142,7 +151,7 @@ .macro do_dpad bit op val btst.l #\bit,d0 beq 0f - \op.l \val,a6 + \op \val,a6 bra dpad_end 0: .endm @@ -162,6 +171,7 @@ or.w #(\mode_back<<11)|(\mode_new<<8),d7 .endm +# destroys a0,d0-d2 .macro menu_text str x y pal lea (\str,pc),a0 move.l #\x,d0 @@ -195,7 +205,8 @@ sprite_data_end: predef_addrs: dc.l 0x000000, 0x200000, 0x400000, 0xa00000, 0xa10000 - dc.l 0xa11100, 0xa12000, 0xa13000, 0xa14000, 0xc00000 + dc.l 0xa11100, 0xa12000, 0xa13000, 0xa14000, 0xa15100 + dc.l 0xc00000 predef_addrs_end: safe_addrs: @@ -206,6 +217,13 @@ safe_addrs: dc.l 0xa12000, 0xa120ff dc.l 0xa13000, 0xa130ff safe_addrs_end: + dc.l 0xa15100, 0xa1513f +safe_addrs_end_32x: + dc.l 0xa15180, 0xa153ff +safe_addrs_end_32x_vdp: + +sizeof_bin: + dc.l _edata txt_edit: .ascii "- edit -\0" @@ -219,8 +237,14 @@ txt_goto_predef: .ascii "Go to (predef)\0" txt_jmp_addr: .ascii "Jump to address\0" +txt_dump: + .ascii "PC Transfer\0" txt_dtack: .ascii "DTACK safety\0" +txt_transfer_ready: + .ascii "Transfer Ready\0" +txt_working: + .ascii "PC mode \0" txt_dtack_err: .ascii "DTACK err?\0" txt_exc: @@ -243,30 +267,103 @@ txt_exc: .align 2 main: - /* mask irqs during init */ + /* make sure io port 2 is doing inputs */ + move.b #0,(0xa1000b).l + /* make sure irqs are masked */ move.w #0x2700,sr + /* take care of TMSS */ + move.b (0xa10000).l,d0 + andi.b #0x0f,d0 + beq no_tmss + move.l #0x53454741,(0xa14000).l + /* want cart, not OS rom if cart pops in */ + move.w #1,(0xa14100).l + /* touch VDP after TMSS setup? */ + tst.w (0xc00004).l +no_tmss: + +.if PC_TRANSFER + /* want to do early PC transfer (with RAM/VRAM intact and such)? + * also give time PC to see start condition */ + move.l #0x2000,d0 +0: dbra d0,0b + + move.l #0xa10005,a0 + btst.b #5,(a0) + bne no_early_transfer + move.b #0x40,(0xa1000b).l /* port 2 ctrl */ + move.b #0x00,(a0) /* port 2 data - start with TH low */ + move.l #0x2000,d0 +0: + btst.b #4,(a0) + beq do_early_transfer + dbra d0,0b -.if RELOCATE_TO_RAM - lea (0,pc),a0 - move.l a0,d0 - swap d0 - lsr.b #4,d0 - and.b #0x0f,d0 - cmp.b #0,d0 + move.b #0,(0xa1000b).l + bra no_early_transfer /* timeout */ + +do_early_transfer: + bsr do_transfer + +no_early_transfer: +.endif + +.if COPY_TO_EXP + /* copy to expansion device if magic number is set */ + move.l #0x400000,a1 + cmp.w #0x1234,(a1) bne 0f - /* copy, assume 8K size */ - move.w #0x2000/8-1,d0 move.l #0,a0 - move.l #0xFF0100,a1 + move.l (sizeof_bin,pc),d0 + lsr.l #3,d0 1: move.l (a0)+,(a1)+ move.l (a0)+,(a1)+ dbra d0,1b 0: +.endif + +.if RELOCATE_TO_RAM + /* we could be relocated by 32x or something else, adjust start addr */ + lea (pc),a0 + move.l a0,d0 + and.l #0xff0000,d0 + move.l d0,a0 + + /* copy, assume 8K size */ + move.l #RELOCATE_TO_RAM,a2 + move.l (sizeof_bin,pc),d0 + move.l a2, a1 + lsr.l #3,d0 +1: + move.l (a0)+,(a1)+ + move.l (a0)+,(a1)+ + dbra d0,1b + lea (0f,pc),a0 - add.l #0xFF0100,a0 - jmp (a0) + move.l a0,d0 + and.l #0x00ffff,d0 + add.l d0,a2 +.endif + +.if COPY_TEST_CODE + /* copy test code */ + lea (test_code,pc),a0 + move.l #COPY_TEST_CODE,a1 + move.w #(test_code_end - test_code)/2-1,d0 +1: + move.w (a0)+,(a1)+ + dbra d0,1b + + /* patch test code */ + move.l #COPY_TEST_CODE,a1 + add.w #(test_code_ret_op-test_code+2),a1 + move.l a2,(a1) +.endif + +.if RELOCATE_TO_RAM + jmp (a2) 0: .endif @@ -281,6 +378,13 @@ main: /* Initialize VDP */ jsr init_gfx + /* Clear h/v scroll */ + movea.l #GFXDATA,a0 + VRAM_ADDR 0x8000,(GFXCNTL) + move.l #0,(a0) + VSRAM_ADDR 0,(GFXCNTL) + move.l #0,(a0) + /* Load color data */ movea.l #0,a0 lea (colors,pc),a1 @@ -378,6 +482,12 @@ VBL: addq.b #1,d7 # movem.l d0-d4/a0-a5,-(a7) + btst.b #5,(0xa10005).l + bne no_auto_transfer + change_mode MMODE_PC, MMODE_MAIN + write_vdp_r_dst 12,(VDP12_SCREEN_V224 | VDP12_SCREEN_H320 | VDP12_STE),(GFXCNTL) + +no_auto_transfer: moveq.l #0,d0 move.w d7,d0 lsr.w #6,d0 @@ -385,6 +495,7 @@ VBL: lea (jumptab,pc,d0),a0 jmp (a0) jumptab: + /* branch insns here because we want to be position independent */ bra mode_main bra mode_val_input bra mode_edit_val /* edit val in editor */ @@ -392,7 +503,7 @@ jumptab: bra mode_start_menu bra mode_goto_predef bra mode_jmp_addr - bra mode_main + bra mode_transfer ##################### main ####################### @@ -645,20 +756,20 @@ draw_status_bar: 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 + do_dpad 16+0, sub.l, #0x0800 + do_dpad 16+1, add.l, #0x0800 + do_dpad 16+10, sub.l, #0xd800 + do_dpad 16+11, add.l, #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 + do_dpad 0, subq.l, #0x0008 + do_dpad 1, addq.l, #0x0008 + do_dpad 10, sub.l, d1 + do_dpad 11, add.l, d1 dpad_end: /* update addr */ @@ -1030,11 +1141,12 @@ mode_start_menu: menu_text txt_goto, 13, 11, 0 menu_text txt_goto_predef, 13, 12, 0 menu_text txt_jmp_addr, 13, 13, 0 - menu_text txt_dtack, 13, 14, 0 - menu_text txt_a_confirm, 13, 16, 2 + menu_text txt_dump, 13, 14, 0 + menu_text txt_dtack, 13, 15, 0 + menu_text txt_a_confirm, 13, 17, 2 /* dtack safety on/off */ - movea.l #0xe000+26*2+14*64*2,a0 + movea.l #0xe000+26*2+15*64*2,a0 jsr load_prepare move.w #0x8000|'O',(a0) btst.l #4,d6 @@ -1050,7 +1162,7 @@ mode_start_menu: movea.l #0xe000+11*2+11*64*2,a0 moveq.l #0,d0 move.b d5,d0 - and.b #3,d0 + and.b #7,d0 lsl.w #7,d0 add.w d0,a0 jsr load_prepare @@ -1063,20 +1175,20 @@ mode_start_menu: and.w #3,d1 beq msm_no_ud move.b d5,d1 - and.b #3,d1 + and.b #7,d1 btst.l #0,d0 sne d2 or.b #1,d2 /* up -1, down 1 */ add.b d2,d1 cmp.b #0,d1 bge 0f - move.b #3,d1 + move.b #4,d1 0: - cmp.b #3,d1 + cmp.b #4,d1 ble 0f move.b #0,d1 0: - and.b #0xfc,d5 + and.b #0xf8,d5 or.b d1,d5 bra vbl_end @@ -1084,7 +1196,7 @@ msm_no_ud: btst.l #4,d0 /* A - confirm */ beq msm_no_a move.b d5,d1 - and.b #3,d1 + and.b #7,d1 bne 0f change_mode MMODE_GOTO, MMODE_MAIN bsr start_menu_box @@ -1105,6 +1217,12 @@ msm_no_ud: 0: cmp.b #3,d1 bne 0f + change_mode MMODE_PC, MMODE_MAIN + bsr start_menu_box + bra vbl_end +0: + cmp.b #4,d1 + bne 0f bchg.l #4,d6 bra vbl_end 0: @@ -1120,7 +1238,7 @@ msm_no_bc: start_menu_box: movea.l #0xe000+10*2+8*64*2,a1 - move.w #10-1,d1 + move.w #11-1,d1 0: move.w a1,a0 jsr load_prepare @@ -1230,6 +1348,26 @@ mode_jmp_finish: move.l d5,a0 jmp (a0) +mode_transfer: +.if PC_TRANSFER + move.b #0x40,(0xa1000b).l /* port 2 ctrl */ + move.b #0x00,(0xa10005).l /* port 2 data - start with TH low */ + + lea (txt_transfer_ready,pc),a0 + move.l #13,d0 + move.l #13,d1 + move.l #0x8000,d2 + jsr print + +wait_tl_low0: + move.b (0xa10005),d0 + btst.b #4,d0 + bne wait_tl_low0 + + menu_text txt_working, 13, 13, 0 + bsr do_transfer +.endif + bra return_to_main # go back to main mode return_to_main: @@ -1255,14 +1393,15 @@ init_gfx: write_vdp_reg 5,(0xfc00 >> 9) /* Sprite address */ write_vdp_reg 6,0 write_vdp_reg 7,0 /* Backdrop color */ - write_vdp_reg 10,1 /* Lines per hblank interrupt */ - write_vdp_reg 11,0 /* 2-cell vertical scrolling */ - write_vdp_reg 12,(VDP12_SCREEN_V224 | VDP12_SCREEN_H320) - write_vdp_reg 13,(0x8000 >> 10) /* Horizontal scroll address */ - write_vdp_reg 15,2 - write_vdp_reg 16,(VDP16_MAP_V32 | VDP16_MAP_H64) /* layer size */ - write_vdp_reg 17,0 - write_vdp_reg 18,0xff + write_vdp_reg 0x0a,1 /* Lines per hblank interrupt */ + write_vdp_reg 0x0b,0 /* 2-cell vertical scrolling */ + write_vdp_reg 0x0c,(VDP12_SCREEN_V224 | VDP12_SCREEN_H320) + write_vdp_reg 0x0d,(0x8000 >> 10) /* Horizontal scroll address */ + write_vdp_reg 0x0e,0 + write_vdp_reg 0x0f,2 + write_vdp_reg 0x10,(VDP16_MAP_V32 | VDP16_MAP_H64) /* layer size */ + write_vdp_reg 0x11,0 + write_vdp_reg 0x12,0 rts @@ -1275,6 +1414,19 @@ get_safety_mask: lsr.l #8,d1 lea (safe_addrs,pc),a1 move.w #(safe_addrs_end - safe_addrs)/8-1,d2 + cmp.l #0x4D415253,(0xa130ec) /* 'MARS' */ + bne no_32x + move.w #(safe_addrs_end_32x - safe_addrs)/8-1,d2 + move.w (0xa15100),d0 + and.w #3,d0 + cmp.w #3,d0 /* ADEN and nRES */ + bne no_32x_vdp + btst.b #7,d0 /* FM */ + bne no_32x_vdp + move.w #(safe_addrs_end_32x_vdp - safe_addrs)/8-1,d2 +no_32x_vdp: +no_32x: + 0: move.l (a1)+,d0 cmp.l d0,d1 @@ -1493,6 +1645,15 @@ wait_vsync_poll: rts +.if COPY_TEST_CODE +test_code: + nop + +test_code_ret_op: + jmp 0x123456 /* will be patched */ +test_code_end: +.endif + ################################################# # # # RAM DATA #