www.pudn.com > ngcd080s.zip > MEMORY.ASM
; *************************************** ; **** Memory Mapping **** ; *************************************** BITS 32 %include ".\src\helper.asm" GLOBAL _initialize_memmap GLOBAL _cpu_readmem24 GLOBAL _cpu_readmem24_word GLOBAL _cpu_readmem24_dword GLOBAL _cpu_writemem24 GLOBAL _cpu_writemem24_word GLOBAL _cpu_writemem24_dword GLOBAL _cpu_setOPbase24 EXTERN _OP_ROM EXTERN _neogeo_rom_memory EXTERN _neogeo_prg_memory EXTERN _video_vidram EXTERN _video_pointer EXTERN _video_modulo EXTERN _video_paletteram_ng EXTERN _video_paletteram_pc EXTERN _video_palette_bank0_ng EXTERN _video_palette_bank1_ng EXTERN _video_palette_bank0_pc EXTERN _video_palette_bank1_pc EXTERN _read_player1 EXTERN _read_player2 EXTERN _read_pl12_startsel EXTERN _neogeo_frame_counter EXTERN _neogeo_frame_counter_speed EXTERN _neogeo_memorycard EXTERN _video_color_lut EXTERN _sound_code EXTERN _z80_cycles EXTERN _mz80nmi EXTERN _mz80exec EXTERN _neogeo_vline EXTERN _pending_command EXTERN _result_code SECTION .data BeginMemMap DeclareZone 0000000h, 01FFFFFh, H_RAM ; *** RAM *** DeclareZone 0300000h, 030FFFFh, H_CTRL1 ; *** CONTROLLER 1 *** DeclareZone 0320000h, 032FFFFh, H_COMZ80 ; *** Z80 COMMUNICATION *** DeclareZone 0340000h, 034FFFFh, H_CTRL2 ; *** CONTROLLER 2 *** DeclareZone 0380000h, 038FFFFh, H_STSEL ; *** ST/SEL *** DeclareZone 03A0000h, 03AFFFFh, H_SWITCH ; *** SWITCHES *** DeclareZone 03C0000h, 03CFFFFh, H_VIDREGS ; *** VIDREGS *** DeclareZone 0400000h, 040FFFFh, H_PALETTE ; *** PALETTERAM *** DeclareZone 0800000h, 080FFFFh, H_MEMCARD ; *** MEMORY CARD *** DeclareZone 0C00000h, 0C1FFFFh, H_ROM ; *** ROM *** EndMemMap AlignData H_RAM: dd RHB_RAM dd RHW_RAM dd RHL_RAM dd WHB_RAM dd WHW_RAM dd WHL_RAM AlignData H_ROM: dd RHB_ROM dd RHW_ROM dd RHL_ROM dd WH_NOP dd WH_NOP dd WH_NOP AlignData H_NOP: dd RH_NOP dd RH_NOP dd RH_NOP dd WH_NOP dd WH_NOP dd WH_NOP AlignData H_CTRL1: dd RHB_CTRL1 dd RH_NOP dd RH_NOP dd WH_NOP dd WH_NOP dd WH_NOP AlignData H_CTRL2: dd RHB_CTRL2 dd RH_NOP dd RH_NOP dd WH_NOP dd WH_NOP dd WH_NOP AlignData H_STSEL: dd RHB_STSEL dd RH_NOP dd RH_NOP dd WH_NOP dd WH_NOP dd WH_NOP AlignData H_SWITCH: dd RH_NOP dd RH_NOP dd RH_NOP dd WH_SWITCH dd WH_SWITCH dd WH_SWITCH AlignData H_VIDREGS: dd RH_NOP dd RHW_VIDREGS dd RHL_VIDREGS dd WHB_VIDREGS dd WHW_VIDREGS dd WHL_VIDREGS AlignData H_PALETTE: dd RH_NOP dd RHW_PAL dd RHL_PAL dd WH_NOP dd WHW_PAL dd WHL_PAL AlignData H_MEMCARD: dd RHB_MEMCD dd RHW_MEMCD dd RHL_MEMCD dd WHB_MEMCD dd WHW_MEMCD dd WHL_MEMCD AlignData H_COMZ80: dd RHB_COMZ80 dd RH_NOP dd RH_NOP dd WHB_COMZ80 dd WH_NOP dd WH_NOP AlignData SwitchMap: dd SW_NOP ; 00..01 dd SW_NOP ; 02..03 dd SW_NOP ; 04..05 dd SW_NOP ; 06..07 dd SW_NOP ; 08..09 dd SW_NOP ; 0A..0B dd SW_NOP ; 0C..0D dd SW_PALBNK0 ; 0E..0F dd SW_NOP ; 10..11 dd SW_NOP ; 12..13 dd SW_NOP ; 14..15 dd SW_NOP ; 16..17 dd SW_NOP ; 18..19 dd SW_NOP ; 1A..1B dd SW_NOP ; 1C..1D dd SW_PALBNK1 ; 1E..1F AlignData VidRegsMapR: dd VIDR_POINTER dd VIDR_DATA dd VIDR_MODULO dd VIDR_AUTOANM dd VIDR_POINTER dd VIDR_DATA dd VID_NOP dd VID_NOP AlignData VidRegsMapW: dd VIDW_POINTER dd VIDW_DATA dd VIDW_MODULO dd VIDW_AUTOANM dd VID_NOP dd VID_NOP dd VID_NOP dd VID_NOP AlignFunc SECTION .bss MemoryElements: RESD 256 SECTION .text AlignFunc _cpu_readmem24: BEGIN PUSHL ecx PUSHL edx mov edx, [esp + ARGS] mov ecx, edx shr ecx, 14 and ecx, 0x000003FC and edx, 0x00FFFFFF add ecx, MemoryElements mov ecx, [ecx] call [ecx] pop edx pop ecx ret AlignFunc _cpu_readmem24_word: BEGIN PUSHL ecx PUSHL edx mov edx, [esp + ARGS] mov ecx, edx shr ecx, 14 and ecx, 0x000003FC and edx, 0x00FFFFFF add ecx, MemoryElements mov ecx, [ecx] call [ecx + 4] pop edx pop ecx ret AlignFunc _cpu_readmem24_dword: BEGIN PUSHL ecx PUSHL edx mov edx, [esp + ARGS] mov ecx, edx shr ecx, 14 and ecx, 0x000003FC and edx, 0x00FFFFFF add ecx, MemoryElements mov ecx, [ecx] call [ecx + 8] pop edx pop ecx ret AlignFunc _cpu_writemem24: BEGIN PUSHL ebx PUSHL ecx PUSHL edx mov edx, [esp + ARGS] mov ebx, [esp + ARGS + 4] mov ecx, edx shr ecx, 14 and ecx, 0x000003FC and edx, 0x00FFFFFF add ecx, MemoryElements mov ecx, [ecx] call [ecx + 12] pop edx pop ecx pop ebx ret AlignFunc _cpu_writemem24_word: BEGIN PUSHL ebx PUSHL ecx PUSHL edx mov edx, [esp + ARGS] mov ebx, [esp + ARGS + 4] mov ecx, edx shr ecx, 14 and ecx, 0x000003FC and edx, 0x00FFFFFF add ecx, MemoryElements mov ecx, [ecx] call [ecx + 16] pop edx pop ecx pop ebx ret AlignFunc _cpu_writemem24_dword: BEGIN PUSHL ebx PUSHL ecx PUSHL edx mov edx, [esp + ARGS] mov ebx, [esp + ARGS + 4] mov ecx, edx shr ecx, 14 and ecx, 0x000003FC and edx, 0x00FFFFFF add ecx, MemoryElements mov ecx, [ecx] call [ecx + 20] pop edx pop ecx pop ebx ret AlignFunc _cpu_setOPbase24: mov eax, [esp+4] cmp eax, 0C00000h jb neo_RAM mov eax, [_neogeo_rom_memory] sub eax, 0C00000h mov [_OP_ROM], eax ret neo_RAM: mov eax, [_neogeo_prg_memory] mov [_OP_ROM], eax ret AlignFunc _initialize_memmap: pusha mov edi, MemoryElements xor edx, edx init_mm_loop0: mov esi, MemoryMap mov ecx, ZoneCount init_mm_loop1: mov ebx, [esi] cmp edx, ebx jb NextZone mov ebx, [esi + 4] cmp edx, ebx ja NextZone mov ebx, [esi + 8] mov [edi], ebx jmp NextElem NextZone: add esi, 12 loop init_mm_loop1 mov ebx, H_NOP mov [edi], ebx NextElem: add edi, 4 add edx, 0x10000 cmp edx, 0x01000000 jne init_mm_loop0 popa ret AlignFunc RH_NOP: xor eax, eax dec eax ret AlignFunc WH_NOP: ret AlignFunc RHB_RAM: xor eax, eax xor edx, 1 add edx, [_neogeo_prg_memory] mov al, [edx] ret AlignFunc RHW_RAM: xor eax, eax add edx, [_neogeo_prg_memory] mov ax, [edx] ret AlignFunc RHL_RAM: add edx, [_neogeo_prg_memory] mov eax, [edx] ror eax, 16 ret AlignFunc WHB_RAM: xor edx, 1 add edx, [_neogeo_prg_memory] mov [edx], bl ret AlignFunc WHW_RAM: add edx, [_neogeo_prg_memory] mov [edx], bx ret AlignFunc WHL_RAM: add edx, [_neogeo_prg_memory] rol ebx, 16 mov [edx], ebx ret AlignFunc RHB_ROM: xor eax, eax xor edx, 1 and edx, 0x1FFFF add edx, [_neogeo_rom_memory] mov al, [edx] ret AlignFunc RHW_ROM: xor eax, eax and edx, 0x1FFFE add edx, [_neogeo_rom_memory] mov ax, [edx] ret AlignFunc RHL_ROM: and edx, 0x1FFFE add edx, [_neogeo_rom_memory] mov eax, [edx] ror eax, 16 ret AlignFunc RHB_CTRL1: call _read_player1 ret AlignFunc RHB_CTRL2: call _read_player2 ret AlignFunc RHB_STSEL: call _read_pl12_startsel ret AlignFunc WH_SWITCH: and edx, 0x1E add edx, edx add edx, SwitchMap call [edx] ret AlignFunc SW_NOP ret AlignFunc SW_PALBNK0: mov ebx, _video_palette_bank0_ng mov [_video_paletteram_ng], ebx mov ebx, _video_palette_bank0_pc mov [_video_paletteram_pc], ebx ret AlignFunc SW_PALBNK1: mov ebx, _video_palette_bank1_ng mov [_video_paletteram_ng], ebx mov ebx, _video_palette_bank1_pc mov [_video_paletteram_pc], ebx ret AlignFunc RHW_VIDREGS: xor eax, eax and edx, 0xE add edx, edx add edx, VidRegsMapR call [edx] ret AlignFunc RHL_VIDREGS: and edx, 0xE add edx, edx add edx, VidRegsMapR call [edx] rol eax, 16 call [edx + 4] ret AlignFunc WHB_VIDREGS: test edx, 1 jnz odd_write and edx, 0xE add edx, edx push eax push edx add edx, VidRegsMapR call [edx] pop edx mov bl, al pop eax add edx, VidRegsMapW call [edx] ret odd_write: and edx, 0xE add edx, edx push eax push edx add edx, VidRegsMapR call [edx] pop edx mov bh, ah pop eax add edx, VidRegsMapW call [edx] ret AlignFunc WHW_VIDREGS: and edx, 0xE add edx, edx add edx, VidRegsMapW call [edx] ret AlignFunc WHL_VIDREGS: and edx, 0xE add edx, edx add edx, VidRegsMapW rol ebx, 16 call [edx] rol ebx, 16 call [edx + 4] ret AlignFunc VIDR_POINTER: mov ax, [_video_pointer] ret AlignFunc VIDR_DATA: push edx mov edx, [_video_vidram] xor ecx, ecx mov cx, [_video_pointer] add ecx, ecx add edx, ecx mov ax, [edx] pop edx ret AlignFunc VIDR_MODULO: mov ax, [_video_modulo] ret AlignFunc VIDR_AUTOANM: mov edx, [_neogeo_frame_counter_speed] mov eax, [_neogeo_frame_counter] shl dx, 8 and ax, 7 or ax, 128 or ax, dx ret AlignFunc VIDW_POINTER: mov [_video_pointer], bx ret AlignFunc VIDW_DATA: mov eax, [_video_vidram] xor ecx, ecx mov cx, [_video_pointer] add ecx, ecx add eax, ecx mov [eax], bx mov bx, [_video_pointer] add bx, [_video_modulo] mov [_video_pointer], bx ret AlignFunc VIDW_MODULO: mov [_video_modulo], bx ret AlignFunc VIDW_AUTOANM: mov cx, bx shr cx, 12 and ecx, 0Fh jz no_spd1 xor ecx, 0Fh mov [_neogeo_frame_counter_speed], ecx no_spd1: ret AlignFunc VID_NOP: ret AlignFunc WHW_PAL: and edx, 1FFFh and ebx, 7FFFh mov ecx, [_video_paletteram_ng] mov [ecx + edx], bx mov ecx, _video_color_lut mov bx, [ecx + ebx * 2] mov ecx, [_video_paletteram_pc] mov [ecx + edx], bx ret AlignFunc WHL_PAL: and edx, 1FFFh push ebx rol ebx, 16 and ebx, 07FFFh mov ecx, [_video_paletteram_ng] mov [ecx + edx], bx mov ecx, _video_color_lut mov bx, [ecx + ebx * 2] mov ecx, [_video_paletteram_pc] mov [ecx + edx], bx pop ebx and ebx, 07FFFh add edx, 2 mov ecx, [_video_paletteram_ng] mov [ecx + edx], bx mov ecx, _video_color_lut mov bx, [ecx + ebx * 2] mov ecx, [_video_paletteram_pc] mov [ecx + edx], bx ret AlignFunc RHW_PAL: and edx, 1FFFh add edx, [_video_paletteram_ng] mov ax, [edx] ret AlignFunc RHL_PAL: and edx, 1FFFh add edx, [_video_paletteram_ng] mov eax, [edx] rol eax, 16 ret AlignFunc RHB_MEMCD: xor eax, eax and edx, 03FFFh test edx, 1 jnz data_ok dec eax ret data_ok: mov ecx, edx shr ecx, 1 add ecx, _neogeo_memorycard mov al, [ecx] ret AlignFunc RHW_MEMCD: xor eax, eax dec ax and edx, 03FFFh jmp data_ok AlignFunc RHL_MEMCD: xor eax, eax dec eax and edx, 03FFFh call data_ok rol eax, 16 add edx, 2 jmp data_ok WHB_MEMCD: and edx, 03FFFh test edx, 1 jz no_write do_write: mov ecx, edx shr ecx, 1 add ecx, _neogeo_memorycard mov [ecx], bl no_write: ret AlignFunc WHW_MEMCD: and edx, 03FFFh jmp do_write AlignFunc WHL_MEMCD: and edx, 03FFFh rol ebx, 16 call do_write rol ebx, 16 add edx, 2 jmp do_write AlignFunc WHB_COMZ80: and edx, 0FFFFh jnz no_com and ebx, 0FFh mov [_sound_code], ebx mov dword [_pending_command], 1 call _mz80nmi sub dword [_z80_cycles], 300 push dword 300 call _mz80exec pop ebx no_com: ret AlignFunc RHB_COMZ80: and edx, 0FFFFh jnz no_com mov eax, [_result_code] cmp dword [_pending_command], 1 jz no_com and eax, 07Fh ret