The MASM Forum Archive 2004 to 2012

Project Support Forums => HLA Forum => Topic started by: indiocolifa on September 30, 2005, 06:19:27 AM

Title: Program crashes on memory access!
Post by: indiocolifa on September 30, 2005, 06:19:27 AM
I'm progessing nicely with my 6502 emulator (a few opcodes are I think, properly emulated)...

the problem is that I'm trying to implement a step-by-step execution command. The preliminary code is:


/*----------------------------------------------------------------

   s : Step-by-step execution
   
  ---------------------------------------------------------------*/
procedure stepexec  (memptr     :   DWORD;
                     var regs   :   cpuRegs;
                     var clk    :   sysclk);@NODISPLAY;
var
    addr : WORD;
    dummy:WORD;
begin stepexec;

    push (ebx);
    mov (regs,ebx);

    IF (esi == 1) THEN    // use program counter as start
        mov (REGS_PTR.PC, addr);
     ELSE
        parsewArgs      (addr,dummy);
        IF (esi == $FFFF_FFFF) THEN jmp exitcmd; ENDIF;
        mov (addr, REGS_PTR.PC); // modify PC
    ENDIF;

exitcmd:   
    pop (ebx);
end stepexec;


Since I need to modify the processor registers, I pass regs:cpuRegs as reference, but when I want to modify the program counter:

mov (addr,REGS_PTR.PC);

the program crashes without reason.
(REGS_PTR is defined as a text equate = "(type cpuRegs[ebx])"

To give more information, the calling sequence before stepexec procedure is:

At main HLA module:


STATIC regs       : cpuRegs;
...
startMonitor    (regs, memBasePtr, clock);
...
// in StartMonitor procedure if 's' command is entered I call:

stepexec (memptr, regs, clk);



Here's the definition of startMonitor procedure:

procedure       startMonitor (var regs:cpuRegs; memptr : DWORD; var clk:sysclk);@nodisplay;



Thank you in advance for ya help!
Title: Re: Program crashes on memory access!
Post by: Sevag.K on September 30, 2005, 08:21:03 PM
Quote from: indiocolifa on September 30, 2005, 06:19:27 AM

/*----------------------------------------------------------------

   s : Step-by-step execution
   
  ---------------------------------------------------------------*/
procedure stepexec  (memptr     :   DWORD;
                     var regs   :   cpuRegs;
                     var clk    :   sysclk);@NODISPLAY;
var
    addr : WORD;
    dummy:WORD;
begin stepexec;

    push (ebx);
    mov (regs,ebx);

    IF (esi == 1) THEN    // use program counter as start
        mov (REGS_PTR.PC, addr);
...


If the program works at this point... (make sure you are getting the proper reg ptr into addr)...

Quote
Since I need to modify the processor registers, I pass regs:cpuRegs as reference, but when I want to modify the program counter:

mov (addr,REGS_PTR.PC);

the program crashes without reason.
(REGS_PTR is defined as a text equate = "(type cpuRegs[ebx])"

... and crashes here, then the primary resaon such a thing happens is if EBX changes somehow between the point that it works and the point that it crashes.  Make sure any procedure you call preserves EBX.


Title: Re: Program crashes on memory access!
Post by: indiocolifa on September 30, 2005, 08:30:08 PM
mmmm.. Maybe the parsewArgs procedure does not preserve EBX....

I'll check that and tell you the results.

Cheers

Hernan
Title: Re: Program crashes on memory access!
Post by: indiocolifa on September 30, 2005, 08:36:01 PM
Yess....  :red

parsewargs pushes

PUSH(EAX);
PUSH(EBX);

...

and pops:

POP(EAX);
POP(EBX);

pops in incorrect order and does mess with regs...  :toothy

thank you ... Those are the very simple errors you can't distinguish when you're coding at 4:00 AM.
:8)