;++
;
;  Copyright (c) Microsoft Corporation. All rights reserved
;
;  Module Name:
;
;    initcode.inc
;
;  Abstract:
;
;    This module contains code to parse and process the init table opcodes
;--


;
; Load the start address of the init table 
;        
        mov  esi, ROMDEC_INIT_TABLE


InitLoop:
;
; Load command and parameters
;        
        mov     al, ds:[esi]
        mov     ebx, ds:[esi+1]
        mov     ecx, ds:[esi+5]
        
        .if al == COMMAND_USE_RESULT_AS_DATA
;
; Use Result As Data Command 
;        
        mov     edx, ecx
        mov     al, bl
        mov     ebx, edx
        mov     ecx, edi
        .endif


IFDEF MCP_REV_B01
        .if al == COMMAND_RESERVED
;
; This used to be the "Timing Delay Command" but was broken and not used
;
        mov     dx, 80h
        rep     insb

        .elseif al == COMMAND_READ_MEM
ELSE
        .if al == COMMAND_READ_MEM
        
ENDIF   
;
; Read Memory Command 
;        
;    Disallow read memory for top of address space.  The Rev B01
;    implementation used a cmp, others use an and instruction
;
        
IFDEF MCP_REV_B01

IFDEF MCP_XMODE2
        and     ebx, 00FFFFFFFh    
        mov     edi, [ebx]
ELSE
        cmp     ebx, 0FF000000h 
        ja      ReadNotAllowed
        mov     edi, [ebx]

ReadNotAllowed:
ENDIF
        
ELSE    
        and     ebx, 00FFFFFFFh    
        mov     edi, [ebx]
ENDIF   

        .elseif al == COMMAND_WRITE_MEM
;
; Write Memory Command
;        
        mov     [ebx], ecx

        .elseif al == COMMAND_RMW_RESULT
;
; Read Modify Write Result Command
;        
        and     edi, ebx
        or      edi, ecx
        
        .elseif al == COMMAND_PCI_CFG_WRITE 
        
IFNDEF MCP_XMODE2
;
; PCI Config Write Command
;
;    Check to see if the PCI write is for the General SM Ctrl 1 register
;    which is used to turn off the SB ROM.  If it is, turn off the bit 1
;    
        cmp     ebx, 80000880h
        jnz     OKToWrite
        and     ecx, 0FFFFFFFDh 
                
OKToWrite:    

ENDIF
        mov     eax, ebx
        mov     dx, 0cf8h
        out     dx, eax
        add     dl, 4
        mov     eax, ecx
        out     dx,eax

        .elseif al == COMMAND_PCI_CFG_READ
;
; PCI Config Read Command
;        
        mov     eax, ebx
        mov     dx, 0cf8h
        out     dx, eax
        add     dl, 4
        in      eax, dx
        mov     edi, eax

        .elseif al == COMMAND_COMPARE_RESULT_JNE
;
; Compare Result Jump Command
;       
        .if edi != ebx
        add     esi, ecx
        .endif
        
        .elseif al == COMMAND_JMP
;
; Jump Command  
;       
        add  esi, ecx

        .elseif al == COMMAND_RMW_ACCUM
;
; Read Modify Write Accumulator Command
;        
        and     ebp, ebx
        or      ebp, ecx
        mov     edi, ebp
        

        .elseif al == COMMAND_OUT_BYTE
;
; OUT
;       
        mov     edx, ebx
        mov     eax, ecx
        out     dx, al

        .elseif al == COMMAND_IN_BYTE
;
; IN
;       
        mov     edx, ebx
        in      al, dx
        movzx   edi, al
        
        .elseif al == COMMAND_QUIT
        jmp     InitDone
        .endif
        
;
; Advance to next entry in the table
;
Continue:
        add     esi, SIZEOF nv_command_struct
        
        jmp     InitLoop

InitDone:       

