www.pudn.com > sn068s.zip > SCREEN.NI
%ifndef SNEeSe_screen_ni %define SNEeSe_screen_ni %define NO_EARLY_CACHE_LOAD %ifndef SNEeSe_screen_asm extern DisplayZ extern Zbase,Zpositions,Zbase_main,Zbase_sub extern _screen_text_start,_screen_data_start,_screen_bss_start extern Tile_Offset_Table_64_8 extern Screen_Mode extern LineAddress,LineAddressY extern TileMask extern OffsetChangeMap_HOffset,OffsetChangeMap_VOffset extern OffsetChangeVMap_VOffset extern _Current_Line_Render,Ready_Line_Render,BaseDestPtr extern Render_Select,Render_Mode extern Tile_priority_opcode extern _Render_Layering_Option_0 extern _Render_Layering_Option_1 extern _Render_Layering_Option_2 extern _Sync_Render extern _Recalc_Window_Effects extern _Render_8x8_C2,_Render_16x16_C2 extern _Render_8x8_C4,_Render_16x16_C4 extern _Render_8x8_C8,_Render_16x16_C8 extern _Render_Offset_8x8_C2,_Render_Offset_16x16_C2 extern _Render_Offset_8x8_C4,_Render_Offset_16x16_C4 extern _Render_Offset_8x8_C8,_Render_Offset_16x16_C8 extern _Render_16x8_Even_C2,_Render_16x16_Even_C2 extern _Render_16x8_Even_C4,_Render_16x16_Even_C4 extern Tile_Width,Tile_Height extern NO_PLANES extern _SCREEN_MODE_0 extern _SCREEN_MODE_1 extern _SCREEN_MODE_2 extern _SCREEN_MODE_3 extern _SCREEN_MODE_4 extern _SCREEN_MODE_5 extern _SCREEN_MODE_6 %endif %define GfxBufferLineSlack (1 << GfxBufferLineSlackShift) %define GfxBufferLineSlackShift 3 %define GfxBufferLinePitch (256+GfxBufferLineSlack) %macro Render_Start_Frame 0 mov dword [BaseDestPtr],0 mov dword [_Current_Line_Render],0 mov dword [Ready_Line_Render],0 %endmacro %macro Render_Start_Frame_Skipped 0 mov dword [_Current_Line_Render],1024 %endmacro %macro SyncRender 0 mov edi,[Ready_Line_Render] sub edi,[_Current_Line_Render] jbe %%no_sync_needed call _Sync_Render %%no_sync_needed: %endmacro %macro RenderScanline 0 inc dword [Ready_Line_Render] %if 0 mov eax,[Ready_Line_Render] inc eax mov ebx,[BG1VOFS] mov [Ready_Line_Render],eax mov esi,[BG1HOFS] mov [eax*4+LineBG1OFS+0],bx mov edi,[BG2VOFS] mov [eax*4+LineBG1OFS+4],si mov ebx,[BG2HOFS] mov [eax*4+LineBG2OFS+0],di mov esi,[BG3VOFS] mov [eax*4+LineBG2OFS+4],bx mov edi,[BG3HOFS] mov [eax*4+LineBG3OFS+0],si mov ebx,[BG4VOFS] mov [eax*4+LineBG3OFS+4],di mov esi,[BG4HOFS] mov [eax*4+LineBG4OFS+0],bx mov [eax*4+LineBG4OFS+4],si %endif %if 0 mov edi,[ScreenDestPtr] xor eax,eax mov ebp,byte 256/32 ALIGNC %%clear_loop: lea esi,[16+edi] mov [edi],eax mov [4+edi],eax mov [8+edi],eax mov [12+edi],eax mov %eax,[esi] lea edi,[16+esi] mov [4+esi],eax mov [8+esi],eax mov [12+esi],eax dec ebp jnz %%clear_loop mov ah,[_INIDISP] test ah,ah ; Check for screen off js %%screen_off mov bl,[SCR_TM] ; Get BG status for main screens call [Render_Mode] mov bl,[SCR_TS] ; Get BG status for sub screens call [Render_Mode] mov edi,[ScreenDestPtr] add edi,256 ; Point screen to next line %%screen_off: add edi,byte GfxBufferLineSlack mov [ScreenDestPtr],edi %endif %endmacro %macro Get_Current_Line 0 ; parameters: none ; uses: eax (_Current_Line_Render), ebx ; returns: eax ; Handle vertical mosaic mov bl,[Mosaic+edx] test bl,bl jz %%no_mosaic mov ebx,[Mosaic_Size_Select] mov al,[_MosaicLine+eax+ebx] %%no_mosaic: ; End vertical mosaic %endmacro ; v0.25 - One macro for 8x8 and 16x8 tiles ;%1 = offset_change %macro SORT_TILES_8_TALL 0-1 0 ; parameters: edx ; uses: eax (_Current_Line_Render, mosaic-adjusted), esi, 0-label ; returns: ebx, LineAddress, LineAddressY add eax,[VScroll+edx] mov ebx,0xF8 ; Current line + V scroll * 32words mov esi,7 and ebx,eax and eax,byte 7 ; Line offset in tile shl ebx,3 ; Get screen offset sub esi,eax %ifnidni %1,0 mov %1,ebx %endif mov [LineAddress],eax mov [LineAddressY],esi %endmacro %macro SORT_TILES_16_TALL 0-1 0 ; parameters: edx ; uses: eax (_Current_Line_Render, mosaic-adjusted), esi, 0-label ; returns: ebx, LineAddress, LineAddressY add eax,[VScroll+edx] shl eax,2 ; Get screen offset mov ebx,0x1F0*4 ; Current line + V scroll * 32words and ebx,eax and eax,byte 0x0F*4 ; Offset into table of line offsets mov esi,16*8+7 %ifnidni %1,0 mov %1,ebx %endif mov eax,[Tile_Offset_Table_16_8+eax] sub esi,eax mov [LineAddress],eax mov [LineAddressY],esi %endmacro %macro LOAD_BG_TABLE 1 mov edx,TableBG%1 %endmacro %endif ; SNEeSe_screen_ni