Tools


Now an example, how to emulate the V_Flag in C.

This program was used to generate the peculiar looking tables at the previous page.
For A-B, it looks like this:

#include <stdlib.h>

int main(void)
{
 int a,b,c_flag,bi,q;
 int a7,b7,q7,v;

// c_flag= 0;
   c_flag=-1;

 printf("\n  0123456789ABCDEF\n  0000000000000000");
 for(bi=0;bi<0x100;bi+=0x10)
 {
	printf("\n%02X",bi);
        for(a=0;a<0x100;a+=0x10)
	{
         b=~bi; //a-b
//       b=bi;  //a+b

	  q=a+b+(c_flag&1);

	  a7=b7=q7=0;
	  if((int)a&0x0080) a7=-1;
	  if((int)b&0x0080) b7=-1;
	  if((int)q&0x0080) q7=-1;

	  v=(a7^q7)&~(a7^b7);
	  if(v) printf("*"); else printf(".");
	}
	printf("%02X",bi);
 }
 printf("\n  0123456789ABCDEF\n  0000000000000000");
 return(0);
}

For comparing the results with a real 6502, here a short program.
It uses JSR $FFD2 for printing the results, so it should work with
all 6502 based commodore computers.
This progam did A-B, and it was tested on a C64.

1000:a2 00 a9 0d 20 d2 ff a0
1008:00 20 17 10 c8 c0 10 d0
1010:f8 e8 e0 10 d0 ec 60 38
1018:b9 28 10 fd 28 10 70 03
1020:a9 2e 2c a9 2a 4c d2 ff
1028:00 10 20 30 40 50 60 70
1030:80 90 a0 b0 c0 d0 e0 f0

For those, who are interested in an assembler listing:

    LDX #$00  ;outer loop

L1  LDA #$0d  ;new line
    JSR $ffd2
    LDY #$00  ;inner loop

L2  JSR L3    ;process one Byte
    INY       ;next column
    CPY #$10
    BNE L2

    INX       ;next row
    CPX #$10
    BNE L1

    RTS       ;done.
;
L3  SEC
    LDA L10,Y
    SBC L10,X
    BVS L4
    LDA #$2e  ;'.'
    byt $2c   ;skip the next LDA#

L4  LDA #$2a  ;'*'
    JMP $ffd2 ;print character
;
L10 byt $00,$10,$20,$30,$40,$50,$60,$70
    byt $80,$90,$a0,$b0,$c0,$d0,$e0,$f0

The tools on this page here are only a starting_point/example,
for instance when testing your own homebrew 6502 emulator.


[HOME] [UP]/ [BACK] [1] [2] [3] [4] [NEXT]

(c) Dieter Mueller 2005