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