Files
emu51/emu51.cpp
Godzil 8999fa051f Code cleanup / reformat
Add changes from official 0.3 release
Add examples
Add missing data.dat
2023-03-22 16:43:36 +00:00

3309 lines
74 KiB
C++
Executable File

typedef unsigned char BYTE;
typedef unsigned short int WORD;
#include <stdio.h>
#define USE_CONSOLE
#include "allegro.h"
#include <string.h>
#include <stdlib.h>
FONT *mainf;
#include "gui.h"
int white, red, lred, green, blue;
#define bit0 0x01
#define bit1 0x02
#define bit2 0x04
#define bit3 0x08
#define bit4 0x10
#define bit5 0x20
#define bit6 0x40
#define bit7 0x80
unsigned long c_time = 0;
BYTE SFR[0x100]; // internal memory and sfr area 256 bytes
BYTE EXT_RAM[0x10000]; // external memory 64kB
BYTE EXT_PMEM[0x10000]; // external memory 64kB for program
BYTE *Acc = &SFR[0xe0]; // 8-bit accumlator
WORD *DPTR = (WORD *) &SFR[0x82]; // 16-bit register
BYTE *DPH = &SFR[0x83]; // high byte of DPTR
BYTE *DPL = &SFR[0x82]; // low byte of DPTR
BYTE *B = &SFR[0xf0]; // B register
BYTE *SP = &SFR[0x81]; // Stack Pointer
BYTE *PSW = &SFR[0xd0]; // Program Status Word
BYTE *P0 = &SFR[0x80]; // 1st Port
BYTE *P1 = &SFR[0x90]; // 2nd Port
BYTE *P2 = &SFR[0xa0]; // 3rd Port
BYTE *P3 = &SFR[0xb0]; // 4th port
BYTE *SBUF = &SFR[0x99]; // Serial transmission Buffer
BYTE *IE = &SFR[0xa8]; // Int Enable
BYTE *SCON = &SFR[0x98]; // Serial Control
BYTE *TH1 = &SFR[0x8d]; // Timer1 High
BYTE *TH0 = &SFR[0x8c]; // Timer0 High
BYTE *TL1 = &SFR[0x8b]; // Timer1 Low
BYTE *TL0 = &SFR[0x8a]; // Timer0 Low
BYTE *TMOD = &SFR[0x89]; // Timer Mode
BYTE *TCON = &SFR[0x88]; // Timer Control
BYTE *PCON = &SFR[0x87]; // Power Control
BYTE *R = &SFR[0x00]; // Additional 8 Rx Registers
WORD PC = 0x0000; // Progam Counter
// initialize the emulator
void init_8051(void)
{
int i;
c_time = 0; // cycles counter
for ( i = 0 ; i < 256 ; i++ )
{
SFR[i] = 0xA5; // all regs in internal RAM & SFR
}
*P0 = 0xff; //
*P1 = 0xff; //
*P2 = 0xff; // Some SFR registers
*P3 = 0xff; // and Program Counter
PC = 0x0000; //
*SP = 0x07; //
}
// 1 or 0
BYTE check_C(void)
{
if ( *PSW & bit7 )
{
return 1;
}
else
{
return 0;
}
}
// 1 or 0
BYTE check_AC(void)
{
if ( *PSW & bit6 )
{
return 1;
}
else
{
return 0;
}
}
// 1 or 0
BYTE check_OV(void)
{
if ( *PSW & bit2 )
{
return 1;
}
else
{
return 0;
}
}
// C <- 1
void set_C(void)
{
*PSW = *PSW | bit7;
}
// AC <- 1
void set_AC(void)
{
*PSW = *PSW | bit6;
}
// OV <- 1
void set_OV(void)
{
*PSW = *PSW | bit2;
}
// C <- 0
void clr_C(void)
{
*PSW = *PSW & 0x7f;
}
// AC <- 0
void clr_AC(void)
{
*PSW = *PSW & 0xbf;
}
// OV <- 0
void clr_OV(void)
{
*PSW = *PSW & 0xfb;
}
// 1 or 0
BYTE check_P(void)
{
if ( *PSW & bit0 )
{
return 1;
}
else
{
return 0;
}
}
// P <- 1
void set_P(void)
{
*PSW = *PSW | bit0;
}
// P <- 0
void clr_P(void)
{
*PSW = *PSW & 0xfe;
}
// (bit) <- 1
void setB(BYTE bit)
{
BYTE tmpB;
BYTE tmpbit;
tmpbit = bit & 0x07;
tmpB = bit & 0xf8;
if ( bit >= 128 )
{
// bit set in SFR area
SFR[tmpB] = SFR[tmpB] | ( 1 << tmpbit );
}
else
{
// bit set in int. RAM
tmpB = ( tmpB >> 3 ) + 32;
SFR[tmpB] = SFR[tmpB] | ( 1 << tmpbit );
}
}
// (bit) <- 0
void clrB(BYTE bit)
{
BYTE tmpB;
BYTE tmpbit;
tmpbit = bit & 0x07;
tmpB = bit & 0xf8;
if ( bit >= 128 )
{
// bit clear in SFR area
SFR[tmpB] = SFR[tmpB] & ~( 1 << tmpbit );
}
else
{
// bit clear in int. RAM
tmpB = ( tmpB >> 3 ) + 32;
SFR[tmpB] = SFR[tmpB] & ~( 1 << tmpbit );
}
}
// returns (bit) 1 or 0
BYTE checkB(BYTE bit)
{
BYTE tmpB;
BYTE tmpbit;
tmpbit = bit & 0x07;
tmpB = bit & 0xf8;
if ( bit >= 128 )
{
// bit check in SFR area
if ( SFR[tmpB] & 1 << tmpbit )
{
return 1;
}
else
{
return 0;
}
}
else
{
// bit check in int. RAM
tmpB = ( tmpB >> 3 ) + 32;
if ( SFR[tmpB] & 1 << tmpbit )
{
return 1;
}
else
{
return 0;
}
}
}
BYTE check_RS0(void)
{
if ( *PSW & bit3 )
{
return 1;
}
else
{
return 0;
}
}
void set_RS0(void)
{
*PSW = *PSW | bit3;
}
void clr_RS0(void)
{
*PSW = *PSW & 0xf7;
}
BYTE check_RS1(void)
{
if ( *PSW & bit4 )
{
return 1;
}
else
{
return 0;
}
}
void set_RS1(void)
{
*PSW = *PSW | bit4;
}
void clr_RS1(void)
{
*PSW = *PSW & 0xef;
}
// 8051 assembler macros
inline void _add(BYTE &a, BYTE &b)
{
int tmp1, tmp2;
(( 0xf & a ) + ( 0xf & b )) > 0xf ? set_AC() : clr_AC();
tmp1 = (( 0x7f & a ) + ( 0x7f & b )) > 0x7f ? 1 : 0;
( tmp2 = a + b ) > 0xff ? ( set_C(), tmp1 ? clr_OV() : set_OV()) : ( clr_C(), tmp1 ? set_OV() : clr_OV());
a = (BYTE) tmp2 & 0xff;
}
inline void _addc(BYTE &a, BYTE &b)
{
int tmp1, tmp2, c;
c = check_C();
(( 0xf & a ) + ( 0xf & b + c )) > 0xf ? set_AC() : clr_AC();
tmp1 = (( 0x7f & a ) + ( 0x7f & b ) + c ) > 0x7f ? 1 : 0;
( tmp2 = a + b + c ) > 0xff ? ( set_C(), tmp1 ? clr_OV() : set_OV()) : ( clr_C(), tmp1 ? set_OV() : clr_OV());
a = (BYTE) tmp2 & 0xff;
}
inline void _subb(BYTE &a, BYTE &b)
{
int tmp1, tmp2, c;
c = check_C();
((char) ( 0xf & a ) - (char) ( 0xf & b ) - c ) < 0 ? set_AC() : clr_AC();
tmp1 = ((char) ( 0x7f & a ) - (char) ( 0x7f & b ) - c ) < 0 ? 1 : 0;
(char) ( tmp2 = a - b - c ) < 0 ? ( set_C(), tmp1 ? clr_OV() : set_OV()) : ( clr_C(), tmp1 ? set_OV() : clr_OV());
a = (BYTE) tmp2 & 0xff;
}
BYTE *ram = EXT_RAM, *prog = EXT_PMEM;
class code_51
{
public:
char mnem[6]; // instruction mnemonic (2-4 characters)
BYTE code; // instruction code
BYTE lenght; // bytes which are needed to write this instruction into memory
BYTE cycles; // time unit
char display_string[20]; // string which is ready for displaying, it's made by make_ds(WORD) method
char datas[12]; // string which contains datas which will be displayed after mnemonic
void make_ds(WORD); // make display string
void process(); // process the instruction
};
void code_51::make_ds(WORD ram_pl)
{
int c, i;
char tmp[3], tmpW[5];
display_string[0] = mnem[0];
display_string[1] = mnem[1];
display_string[2] = ( mnem[2] >= 0x61 && mnem[2] <= 0x7a ) ? mnem[2] : (char) 32;
display_string[3] = ( mnem[3] >= 0x61 && mnem[3] <= 0x7a ) ? mnem[3] : (char) 32;
display_string[4] = ( mnem[4] >= 0x61 && mnem[4] <= 0x7a ) ? mnem[4] : (char) 32;
display_string[5] = (char) 32;
for ( c = 0 ; c <= 10 ; c++ )
{
if ( datas[c] != '%' )
{
if ( datas[c] == 'O' && datas[c + 1] == '%' )
{
if ( datas[c + 2] == '1' )
{
sprintf(tmpW, "%4x", (signed char) prog[ram_pl + 1] + ram_pl + 2);
for ( i = 0 ; i < 4 ; i++ )
{
display_string[c + 6 + i] = ( tmpW[i] == ' ' ) ? '0' : tmpW[i];
}
}
if ( datas[c + 2] == '2' )
{
sprintf(tmpW, "%4x", (signed char) prog[ram_pl + 2] + ram_pl + 3);
for ( i = 0 ; i < 4 ; i++ )
{
display_string[c + 6 + i] = ( tmpW[i] == ' ' ) ? '0' : tmpW[i];
}
}
c += 3;
}
else
{
display_string[c + 6] = datas[c];
}
}
else
{
if ( datas[c + 1] == '1' )
{
sprintf(tmp, "%2x", prog[ram_pl + 1]);
for ( i = 0 ; i < 2 ; i++ )
{
display_string[c + 6 + i] = tmp[i] == ' ' ? '0' : tmp[i];
}
}
if ( datas[c + 1] == '2' )
{
sprintf(tmp, "%2x", prog[ram_pl + 2]);
for ( i = 0 ; i < 2 ; i++ )
{
display_string[c + 6 + i] = tmp[i] == ' ' ? '0' : tmp[i];
}
}
c++;
}
}
}
void code_51::process(void)
{
BYTE tmpB;
WORD tmpW;
switch ( code )
{
case 0x00: //nop 00
PC++;
break;
case 0x74: // mov a,#(byte) 74 xx
PC++;
*Acc = prog[PC];
PC++;
break;
case 0x75: // mov (adress),#(byte) 75 xx yy
PC++;
SFR[prog[PC]] = prog[PC + 1];
PC += 2;
break;
case 0x02: // ljmp 16bit_adres 02 xx yy
PC++;
PC = (WORD) prog[PC] << 8 | prog[PC + 1];
break;
case 0x80: // sjmp offset 80 oo
PC++;
PC += (signed char) prog[PC] + 1;
break;
case 0x85: // mov (adress1),(ardess2) 85 yy xx
PC++;
SFR[prog[PC + 1]] = SFR[prog[PC]];
PC += 2;
break;
case 0xe5: // mov A,(adress)
PC++;
*Acc = SFR[prog[PC]];
PC++;
break;
case 0x92: // mov (bit),C
PC++;
if ( check_C())
{
setB(prog[PC]);
}
else
{
clrB(prog[PC]);
}
PC++;
break;
/* 2003-12-04 : Added */
case 0xA2: // mov C,(bit)
PC++;
if ( checkB(EXT_RAM[PC]))
{
set_C();
}
else
{
clr_C();
}
PC++;
break;
/* End Added */
case 0x04: // inc a
( *Acc )++;
PC++;
break;
case 0x05: // inc (adress)
PC++;
SFR[prog[PC]]++;
PC++;
break;
case 0xa3: // inc DPTR
*DPTR = *DPTR + 1;
PC++;
break;
case 0x06: //inc @R0
SFR[R[0]]++;
PC++;
break;
case 0x07: //inc @R1
SFR[R[1]]++;
PC++;
break;
case 0x08: //inc R0
R[0]++;
PC++;
break;
case 0x09: //inc R1
R[1]++;
PC++;
break;
case 0x0a: //inc R2
R[2]++;
PC++;
break;
case 0x0b: //inc R3
R[3]++;
PC++;
break;
case 0x0c: //inc R4
R[4]++;
PC++;
break;
case 0x0d: //inc R5
R[5]++;
PC++;
break;
case 0x0e: //inc R6
R[6]++;
PC++;
break;
case 0x0f: //inc R7
R[7]++;
PC++;
break;
case 0x14: //dec A
*Acc = *Acc - 1;
PC++;
break;
case 0x15: //dec (adress)
PC++;
SFR[prog[PC]]--;
PC++;
break;
case 0x16: //dec @R0
SFR[R[0]]--;
PC++;
break;
case 0x17: //dec @R1
SFR[R[1]]--;
PC++;
break;
case 0x18: // dec R0
R[0]--;
PC++;
break;
case 0x19: // dec R1
R[1]--;
PC++;
break;
case 0x1a: // dec R2
R[2]--;
PC++;
break;
case 0x1b: // dec R3
R[3]--;
PC++;
break;
case 0x1c: // dec R4
R[4]--;
PC++;
break;
case 0x1d: // dec R5
R[5]--;
PC++;
break;
case 0x1e: // dec R6
R[6]--;
PC++;
break;
case 0x1f: // dec R7
R[7]--;
PC++;
break;
case 0x84: // div AB
clr_C();
if ( *B != 0 )
{
tmpB = *Acc;
*Acc = tmpB / *B;
*B = tmpB % *B;
}
else
{
set_OV();
}
PC++;
break;
case 0xa4: // mul AB
tmpW = (WORD) *Acc * (WORD) *B;
if ( tmpW > 255 )
{
set_OV();
}
else
{
clr_OV();
}
*B = (BYTE) tmpW >> 8;
*Acc = (BYTE) ( tmpW & 0xff );
PC++;
break;
case 0x23: // rl A
tmpB = *Acc;
*Acc = tmpB << 1 | tmpB >> 7;
PC++;
break;
case 0x03: // rr A
tmpB = *Acc;
*Acc = tmpB >> 1 | tmpB << 7;
PC++;
break;
case 0x33: // rlc A
tmpB = *Acc;
*Acc = tmpB << 1 | check_C();
if ( tmpB & 0x80 )
{
set_C();
}
else
{
clr_C();
}
PC++;
break;
case 0x13: // rrc A
tmpB = *Acc;
*Acc = tmpB >> 1 | check_C() << 7;
if ( tmpB & 0x01 )
{
set_C();
}
else
{
clr_C();
}
PC++;
break;
case 0x90: // mov DPTR,#(16-bit data)
PC++;
*DPH = prog[PC];
PC++;
*DPL = prog[PC];
PC++;
break;
case 0xf5: // mov (adress),A
PC++;
SFR[prog[PC]] = *Acc;
PC++;
break;
// ADD (full functional)
case 0x24: // add A,#(data)
PC++;
_add(*Acc, prog[PC]);
PC++;
break;
case 0x25: // add A,(adres)
PC++;
_add(*Acc, SFR[prog[PC]]);
PC++;
break;
case 0x26: // add A,@R0
_add(*Acc, SFR[R[0]]);
PC++;
break;
case 0x27: // add A,@R1
_add(*Acc, SFR[R[1]]);
PC++;
break;
case 0x28: //add A,R0
_add(*Acc, R[0]);
PC++;
break;
case 0x29: //add A,R1
_add(*Acc, R[1]);
PC++;
break;
case 0x2a: //add A,R2
_add(*Acc, R[2]);
PC++;
break;
case 0x2b: //add A,R3
_add(*Acc, R[3]);
PC++;
break;
case 0x2c: //add A,R4
_add(*Acc, R[4]);
PC++;
break;
case 0x2d: //add A,R5
_add(*Acc, R[5]);
PC++;
break;
case 0x2e: //add A,R6
_add(*Acc, R[6]);
PC++;
break;
case 0x2f: //add A,R7
_add(*Acc, R[7]);
PC++;
break;
// ADDC
case 0x34: // addc A,#(data)
PC++;
_addc(*Acc, prog[PC]);
PC++;
break;
case 0x35: // addc A,(adres)
PC++;
_addc(*Acc, SFR[prog[PC]]);
PC++;
break;
case 0x36: // addc A,@R0
_addc(*Acc, SFR[R[0]]);
PC++;
break;
case 0x37: // addc A,@R1
_addc(*Acc, SFR[R[1]]);
PC++;
break;
case 0x38: //addc A,R0
_addc(*Acc, R[0]);
PC++;
break;
case 0x39: //addc A,R1
_addc(*Acc, R[1]);
PC++;
break;
case 0x3a: //addc A,R2
_addc(*Acc, R[2]);
PC++;
break;
case 0x3b: //addc A,R3
_addc(*Acc, R[3]);
PC++;
break;
case 0x3c: //addc A,R4
_addc(*Acc, R[4]);
PC++;
break;
case 0x3d: //addc A,R5
_addc(*Acc, R[5]);
PC++;
break;
case 0x3e: //addc A,R6
_addc(*Acc, R[6]);
PC++;
break;
case 0x3f: //addc A,R7
_addc(*Acc, R[7]);
PC++;
break;
case 0xe0: // movx A,@DPTR
*Acc = ram[*DPTR];
PC++;
break;
case 0xf0: // movx @DPTR,A
ram[*DPTR] = *Acc;
PC++;
break;
case 0xc0: // push (adress)
*SP = *SP + 1;
PC++;
SFR[*SP] = SFR[prog[PC]];
PC++;
break;
case 0xd0: // pop (adress)
PC++;
SFR[prog[PC]] = SFR[*SP];
*SP = *SP - 1;
PC++;
break;
case 0xc3: // clr C
clr_C();
PC++;
break;
case 0xd3: // setb C
set_C();
PC++;
break;
case 0xd2: // setb (bit)
PC++;
setB(prog[PC]);
PC++;
break;
case 0xc2: // clr (bit)
PC++;
clrB(prog[PC]);
PC++;
break;
case 0x62: // xrl (adress),A
PC++;
SFR[prog[PC]] = SFR[prog[PC]] ^ ( *Acc );
PC++;
break;
case 0x63: // xrl (adress),#(data)
PC++;
SFR[prog[PC]] ^= prog[PC + 1];
PC += 2;
break;
case 0x64: // xrl A,#(data)
PC++;
*Acc = *Acc ^ prog[PC];
PC++;
break;
case 0x65: // xrl A,(adress)
PC++;
*Acc = *Acc ^ SFR[prog[PC]];
PC++;
break;
case 0x66: // xrl A,@R0
*Acc = *Acc ^ SFR[R[0]];
PC++;
break;
case 0x67: // xrl A,@R1
*Acc = *Acc ^ SFR[R[1]];
PC++;
break;
case 0x68: // xrl A,R0
*Acc = ( *Acc ) ^ R[0];
PC++;
break;
case 0x69: // xrl A,R1
*Acc = ( *Acc ) ^ R[1];
PC++;
break;
case 0x6a: // xrl A,R2
*Acc = ( *Acc ) ^ R[2];
PC++;
break;
case 0x6b: // xrl A,R3
*Acc = ( *Acc ) ^ R[3];
PC++;
break;
case 0x6c: // xrl A,R4
*Acc = ( *Acc ) ^ R[4];
PC++;
break;
case 0x6d: // xrl A,R5
*Acc = ( *Acc ) ^ R[5];
PC++;
break;
case 0x6e: // xrl A,R6
*Acc = ( *Acc ) ^ R[6];
PC++;
break;
case 0x6f: // xrl A,R7
*Acc = ( *Acc ) ^ R[7];
PC++;
break;
case 0xc5: // xch A,(adress)
PC++;
tmpB = *Acc;
*Acc = SFR[prog[PC]];
SFR[prog[PC]] = tmpB;
PC++;
break;
case 0xc6: // xch A,@R0
tmpB = *Acc;
*Acc = SFR[R[0]];
SFR[R[0]] = tmpB;
PC++;
break;
case 0xc7: // xch A,@R1
tmpB = *Acc;
*Acc = SFR[R[1]];
SFR[R[1]] = tmpB;
PC++;
break;
case 0xc8: // xch A,R0
tmpB = *Acc;
*Acc = R[0];
R[0] = tmpB;
PC++;
break;
case 0xc9: // xch A,R1
tmpB = *Acc;
*Acc = R[1];
R[1] = tmpB;
PC++;
break;
case 0xca: // xch A,R2
tmpB = *Acc;
*Acc = R[2];
R[2] = tmpB;
PC++;
break;
case 0xcb: // xch A,R3
tmpB = *Acc;
*Acc = R[3];
R[3] = tmpB;
PC++;
break;
case 0xcc: // xch A,R4
tmpB = *Acc;
*Acc = R[4];
R[4] = tmpB;
PC++;
break;
case 0xcd: // xch A,R5
tmpB = *Acc;
*Acc = R[5];
R[5] = tmpB;
PC++;
break;
case 0xce: // xch A,R6
tmpB = *Acc;
*Acc = R[6];
R[6] = tmpB;
PC++;
break;
case 0xcf: // xch A,R7
tmpB = *Acc;
*Acc = R[7];
R[7] = tmpB;
PC++;
break;
case 0x12: // lcall 16bit_adres 02 xx yy
tmpW = PC + 3;
PC++;
PC = (WORD) prog[PC] << 8 | prog[PC + 1];
*SP = *SP + 1;
SFR[*SP] = (BYTE) ( tmpW & 0x00ff );
*SP = *SP + 1;
SFR[*SP] = (BYTE) ( tmpW >> 8 );
break;
case 0x22: // ret
PC = (WORD) SFR[*SP] << 8 | (WORD) SFR[*SP - 1];
*SP = *SP - 2;
break;
case 0x70: // jnz (offset)
PC++;
if ( *Acc != 0 )
{
PC += (signed char) prog[PC] + 1;
}
else
{
PC++;
}
break;
case 0x60: // jz (offset)
PC++;
if ( *Acc == 0 )
{
PC += (signed char) prog[PC] + 1;
}
else
{
PC++;
}
break;
case 0x40: // jc (offset)
PC++;
if ( check_C())
{
PC += (signed char) prog[PC] + 1;
}
else
{
PC++;
}
break;
case 0x50: // jnc (offset)
PC++;
if ( !check_C())
{
PC += (signed char) prog[PC] + 1;
}
else
{
PC++;
}
break;
case 0xc4: // swap A
tmpB = *Acc;
tmpB = ( tmpB << 4 ) & 0xf0;
*Acc = ( *Acc >> 4 ) & 0x0f;
*Acc = *Acc | tmpB;
PC++;
break;
case 0x93: // movc A,@DPTR+A
*Acc = ram[*Acc + *DPTR];
PC++;
break;
case 0x83: // movc A,@PC+A
*Acc = ram[*Acc + PC];
PC++;
break;
case 0xe6: // mov A,@R0
*Acc = SFR[R[0]];
PC++;
break;
case 0xe7: // mov A,@R1
*Acc = SFR[R[1]];
PC++;
break;
case 0xf6: // mov @R0,A
SFR[R[0]] = *Acc;
PC++;
break;
case 0xf7: // mov @R1,a
SFR[R[1]] = *Acc;
PC++;
break;
case 0x78: // mov R0,#(data)
PC++;
R[0] = prog[PC];
PC++;
break;
case 0x79: // mov R1,#(data)
PC++;
R[1] = prog[PC];
PC++;
break;
case 0x7a: // mov R2,#(data)
PC++;
R[2] = prog[PC];
PC++;
break;
case 0x7b: // mov R3,#(data)
PC++;
R[3] = prog[PC];
PC++;
break;
case 0x7c: // mov R4,#(data)
PC++;
R[4] = prog[PC];
PC++;
break;
case 0x7d: // mov R5,#(data)
PC++;
R[5] = prog[PC];
PC++;
break;
case 0x7e: // mov R6,#(data)
PC++;
R[6] = prog[PC];
PC++;
break;
case 0x7f: // mov R7,#(data)
PC++;
R[7] = prog[PC];
PC++;
break;
case 0xa8: // mov R0,(adress)
PC++;
R[0] = SFR[prog[PC]];
PC++;
break;
case 0xa9: // mov R1,(adress)
PC++;
R[1] = SFR[prog[PC]];
PC++;
break;
case 0xaa: // mov R2,(adress)
PC++;
R[2] = SFR[prog[PC]];
PC++;
break;
case 0xab: // mov R3,(adress)
PC++;
R[3] = SFR[prog[PC]];
PC++;
break;
case 0xac: // mov R4,(adress)
PC++;
R[4] = SFR[prog[PC]];
PC++;
break;
case 0xad: // mov R5,(adress)
PC++;
R[5] = SFR[prog[PC]];
PC++;
break;
case 0xae: // mov R6,(adress)
PC++;
R[6] = SFR[prog[PC]];
PC++;
break;
case 0xaf: // mov R7,(adress)
PC++;
R[7] = SFR[prog[PC]];
PC++;
break;
case 0x88: // mov (adress),R0
PC++;
SFR[prog[PC]] = R[0];
PC++;
break;
case 0x89: // mov (adress),R1
PC++;
SFR[prog[PC]] = R[1];
PC++;
break;
case 0x8a: // mov (adress),R2
PC++;
SFR[prog[PC]] = R[2];
PC++;
break;
case 0x8b: // mov (adress),R3
PC++;
SFR[prog[PC]] = R[3];
PC++;
break;
case 0x8c: // mov (adress),R4
PC++;
SFR[prog[PC]] = R[4];
PC++;
break;
case 0x8d: // mov (adress),R5
PC++;
SFR[prog[PC]] = R[5];
PC++;
break;
case 0x8e: // mov (adress),R6
PC++;
SFR[prog[PC]] = R[6];
PC++;
break;
case 0x8f: // mov (adress),R7
PC++;
SFR[prog[PC]] = R[7];
PC++;
break;
case 0xf8: // mov R0,A
PC++;
R[0] = *Acc;
break;
case 0xf9: // mov R1,A
PC++;
R[1] = *Acc;
break;
case 0xfa: // mov R2,A
PC++;
R[2] = *Acc;
break;
case 0xfb: // mov R3,A
PC++;
R[3] = *Acc;
break;
case 0xfc: // mov R4,A
PC++;
R[4] = *Acc;
break;
case 0xfd: // mov R5,A
PC++;
R[5] = *Acc;
break;
case 0xfe: // mov R6,A
PC++;
R[6] = *Acc;
break;
case 0xff: // mov R7,A
PC++;
R[7] = *Acc;
break;
case 0xe8: // mov A,R0
PC++;
*Acc = R[0];
break;
case 0xe9: // mov A,R1
PC++;
*Acc = R[1];
break;
case 0xea: // mov A,R2
PC++;
*Acc = R[2];
break;
case 0xeb: // mov A,R3
PC++;
*Acc = R[3];
break;
case 0xec: // mov A,R4
PC++;
*Acc = R[4];
break;
case 0xed: // mov A,R5
PC++;
*Acc = R[5];
break;
case 0xee: // mov A,R6
PC++;
*Acc = R[6];
break;
case 0xef: // mov A,R7
PC++;
*Acc = R[7];
break;
case 0xe4: //clr A
PC++;
*Acc = 0;
break;
case 0x01: // ajmp 00xx
PC++;
PC = (WORD) prog[PC];
break;
case 0x21: // ajmp 01xx
PC++;
PC = 0x0100 | (WORD) prog[PC];
break;
case 0x41: // ajmp 02xx
PC++;
PC = 0x0200 | (WORD) prog[PC];
break;
case 0x61: // ajmp 03xx
PC++;
PC = 0x0300 | (WORD) prog[PC];
break;
case 0x81: // ajmp 04xx
PC++;
PC = 0x0400 | (WORD) prog[PC];
break;
case 0xa1: // ajmp 05xx
PC++;
PC = 0x0500 | (WORD) prog[PC];
break;
case 0xc1: // ajmp 06xx
PC++;
PC = 0x0600 | (WORD) prog[PC];
break;
case 0xe1: // ajmp 07xx
PC++;
PC = 0x0700 | (WORD) prog[PC];
break;
case 0x11: // acall 00xx
tmpW = PC + 2;
PC++;
PC = (WORD) prog[PC];
*SP = *SP + 1;
SFR[*SP] = (BYTE) ( tmpW & 0x00ff );
*SP = *SP + 1;
SFR[*SP] = (BYTE) ( tmpW >> 8 );
break;
case 0x31: // acall 01xx
tmpW = PC + 2;
PC++;
PC = 0x0100 | prog[PC];
*SP = *SP + 1;
SFR[*SP] = (BYTE) ( tmpW & 0x00ff );
*SP = *SP + 1;
SFR[*SP] = (BYTE) ( tmpW >> 8 );
break;
case 0x51: // acall 02xx
tmpW = PC + 2;
PC++;
PC = 0x0200 | prog[PC];
*SP = *SP + 1;
SFR[*SP] = (BYTE) ( tmpW & 0x00ff );
*SP = *SP + 1;
SFR[*SP] = (BYTE) ( tmpW >> 8 );
break;
case 0x71: // acall 03xx
tmpW = PC + 2;
PC++;
PC = 0x0300 | prog[PC];
*SP = *SP + 1;
SFR[*SP] = (BYTE) ( tmpW & 0x00ff );
*SP = *SP + 1;
SFR[*SP] = (BYTE) ( tmpW >> 8 );
break;
case 0x91: // acall 04xx
tmpW = PC + 2;
PC++;
PC = 0x0400 | prog[PC];
*SP = *SP + 1;
SFR[*SP] = (BYTE) ( tmpW & 0x00ff );
*SP = *SP + 1;
SFR[*SP] = (BYTE) ( tmpW >> 8 );
break;
case 0xb1: // acall 05xx
tmpW = PC + 2;
PC++;
PC = 0x0500 | prog[PC];
*SP = *SP + 1;
SFR[*SP] = (BYTE) ( tmpW & 0x00ff );
*SP = *SP + 1;
SFR[*SP] = (BYTE) ( tmpW >> 8 );
break;
case 0xd1: // acall 06xx
tmpW = PC + 2;
PC++;
PC = 0x0600 | prog[PC];
*SP = *SP + 1;
SFR[*SP] = (BYTE) ( tmpW & 0x00ff );
*SP = *SP + 1;
SFR[*SP] = (BYTE) ( tmpW >> 8 );
break;
case 0xf1: // acall 07xx
tmpW = PC + 2;
PC++;
PC = 0x0700 | prog[PC];
*SP = *SP + 1;
SFR[*SP] = (BYTE) ( tmpW & 0x00ff );
*SP = *SP + 1;
SFR[*SP] = (BYTE) ( tmpW >> 8 );
break;
case 0xd8: // djnz R0,(offset)
PC++;
R[0]--;
if ( R[0] != 0 )
{
PC += (signed char) prog[PC];
}
PC++;
break;
case 0xd9: // djnz R1,(offset)
PC++;
R[1]--;
if ( R[1] != 0 )
{
PC += (signed char) prog[PC];
}
PC++;
break;
case 0xda: // djnz R2,(offset)
PC++;
R[2]--;
if ( R[2] != 0 )
{
PC += (signed char) prog[PC];
}
PC++;
break;
case 0xdb: // djnz R3,(offset)
PC++;
R[3]--;
if ( R[3] != 0 )
{
PC += (signed char) prog[PC];
}
PC++;
break;
case 0xdc: // djnz R4,(offset)
PC++;
R[4]--;
if ( R[4] != 0 )
{
PC += (signed char) prog[PC];
}
PC++;
break;
case 0xdd: // djnz R5,(offset)
PC++;
R[5]--;
if ( R[5] != 0 )
{
PC += (signed char) prog[PC];
}
PC++;
break;
case 0xde: // djnz R6,(offset)
PC++;
R[6]--;
if ( R[6] != 0 )
{
PC += (signed char) prog[PC];
}
PC++;
break;
case 0xdf: // djnz R7,(offset)
PC++;
R[7]--;
if ( R[7] != 0 )
{
PC += (signed char) prog[PC];
}
PC++;
break;
case 0xd5: // djnz (adress),(offset)
PC++;
tmpB = prog[PC];
PC++;
SFR[tmpB]--;
if ( SFR[tmpB] != 0 )
{
PC += (signed char) prog[PC];
}
PC++;
break;
case 0x43: // orl (adress),#(data)
PC++;
SFR[prog[PC]] = SFR[prog[PC]] | prog[PC + 1];
PC += 2;
break;
case 0x44: // orl A,#(data)
PC++;
*Acc = prog[PC] | *Acc;
PC++;
break;
case 0x45: // orl A,(adress)
PC++;
*Acc = SFR[prog[PC]] | *Acc;
PC++;
break;
case 0x42: // orl (adress),A
PC++;
SFR[prog[PC]] = SFR[prog[PC]] | *Acc;
PC++;
break;
case 0x48: // orl A,R0
*Acc = *Acc | R[0];
PC++;
break;
case 0x49: // orl A,R1
*Acc = *Acc | R[1];
PC++;
break;
case 0x4a: // orl A,R2
*Acc = *Acc | R[2];
PC++;
break;
case 0x4b: // orl A,R3
*Acc = *Acc | R[3];
PC++;
break;
case 0x4c: // orl A,R4
*Acc = *Acc | R[4];
PC++;
break;
case 0x4d: // orl A,R5
*Acc = *Acc | R[5];
PC++;
break;
case 0x4e: // orl A,R6
*Acc = *Acc | R[6];
PC++;
break;
case 0x4f: // orl A,R7
*Acc = *Acc | R[7];
PC++;
break;
case 0x46: // orl A,@R0
*Acc = *Acc | SFR[R[0]];
PC++;
break;
case 0x47: // orl A,@R1
*Acc = *Acc | SFR[R[1]];
PC++;
break;
case 0x54: // anl A,#(data)
PC++;
*Acc = *Acc & prog[PC];
PC++;
break;
case 0x55: // anl A,(adress)
PC++;
*Acc = SFR[prog[PC]] & *Acc;
PC++;
break;
case 0x52: // anl (adress),A
PC++;
SFR[prog[PC]] = SFR[prog[PC]] & *Acc;
PC++;
break;
case 0x53: // anl (adress),#(data)
PC++;
SFR[prog[PC]] = SFR[prog[PC]] & prog[PC + 1];
PC++;
break;
case 0x58: // anl A,R0
*Acc = *Acc & R[0];
PC++;
break;
case 0x59: // anl A,R1
*Acc = *Acc & R[1];
PC++;
break;
case 0x5a: // anl A,R2
*Acc = *Acc & R[2];
PC++;
break;
case 0x5b: // anl A,R3
*Acc = *Acc & R[3];
PC++;
break;
case 0x5c: // anl A,R4
*Acc = *Acc & R[4];
PC++;
break;
case 0x5d: // anl A,R5
*Acc = *Acc & R[5];
PC++;
break;
case 0x5e: // anl A,R6
*Acc = *Acc & R[6];
PC++;
break;
case 0x5f: // anl A,R7
*Acc = *Acc & R[7];
PC++;
break;
case 0x56: // anl A,@R0
*Acc = *Acc & SFR[R[0]];
PC++;
break;
case 0x57: // anl A,@R1
*Acc = *Acc & SFR[R[1]];
PC++;
break;
case 0xa2: // mov C,(bit)
PC++;
if ( checkB(prog[PC]))
{
set_C();
}
else
{
clr_C();
}
PC++;
break;
case 0xb2: // cpl (bit)
PC++;
if ( checkB(prog[PC]))
{
clrB(prog[PC]);
}
else
{
setB(prog[PC]);
}
PC++;
break;
case 0xb3: // cpl C
PC++;
if ( check_C())
{
clr_C();
}
else
{
set_C();
}
break;
case 0x72: // orl C,(bit)
PC++;
if ( check_C() || checkB(prog[PC]))
{
set_C();
}
else
{
clr_C();
}
PC++;
break;
case 0xa0: // orl C,/(bit)
PC++;
if ( check_C() || !checkB(prog[PC]))
{
set_C();
}
else
{
clr_C();
}
PC++;
break;
case 0x82: // anl C,(bit)
PC++;
if ( check_C() && checkB(prog[PC]))
{
set_C();
}
else
{
clr_C();
}
PC++;
break;
case 0xb0: // anl C,/(bit)
PC++;
if ( check_C() && !checkB(prog[PC]))
{
set_C();
}
else
{
clr_C();
}
PC++;
break;
case 0xf4: // cpl A
*Acc = *Acc ^ 0xff;
PC++;
break;
/* 2003-12-04 : Added */
case 0xB3: // cpl C
if ( check_C())
{
clr_C();
}
else
{
set_C();
}
PC++;
break;
/* End Added */
case 0xa6: // mov @R0,(adress)
PC++;
SFR[R[0]] = SFR[prog[PC]];
PC++;
break;
case 0xa7: // mov @R1,(adress)
PC++;
SFR[R[1]] = SFR[prog[PC]];
PC++;
break;
case 0x76: // mov @R0,#(data)
PC++;
SFR[R[0]] = prog[PC];
PC++;
break;
case 0x77: // mov @R1,#(data)
PC++;
SFR[R[1]] = prog[PC];
PC++;
break;
case 0x86: // mov (adress),@R0
PC++;
SFR[prog[PC]] = SFR[R[0]];
PC++;
break;
case 0x87: // mov (adress),@R1
PC++;
SFR[prog[PC]] = SFR[R[1]];
PC++;
break;
case 0x73: // jmp @A+DPTR
PC = (WORD) ( *Acc + *DPTR );
break;
case 0xb4: // cjne A,#(byte),offset
PC++;
if ( *Acc < prog[PC] )
{
set_C();
}
else
{
clr_C();
}
if ( *Acc != prog[PC] )
{
PC++;
PC += (signed char) prog[PC] + 1;
}
else
{
PC += 2;
}
break;
case 0xb5: // cjne A,(adress),offset
PC++;
if ( *Acc < SFR[prog[PC]] )
{
set_C();
}
else
{
clr_C();
}
if ( *Acc != SFR[prog[PC]] )
{
PC++;
PC += (signed char) prog[PC] + 1;
}
else
{
PC += 2;
}
break;
case 0xb6: // cjne @R0,#(byte),offset
PC++;
if ( SFR[R[0]] < prog[PC] )
{
set_C();
}
else
{
clr_C();
}
if ( SFR[R[0]] != prog[PC] )
{
PC++;
PC += (signed char) prog[PC] + 1;
}
else
{
PC += 2;
}
break;
case 0xb7: // cjne @R1,#(byte),offset
PC++;
if ( SFR[R[1]] < prog[PC] )
{
set_C();
}
else
{
clr_C();
}
if ( SFR[R[1]] != prog[PC] )
{
PC++;
PC += (signed char) prog[PC] + 1;
}
else
{
PC += 2;
}
break;
case 0xb8: // cjne R0,#(byte),offset
PC++;
if ( R[0] < prog[PC] )
{
set_C();
}
else
{
clr_C();
}
if ( R[0] != prog[PC] )
{
PC++;
PC += (signed char) prog[PC] + 1;
}
else
{
PC += 2;
}
break;
case 0xb9: // cjne R1,#(byte),offset
PC++;
if ( R[1] < prog[PC] )
{
set_C();
}
else
{
clr_C();
}
if ( R[1] != prog[PC] )
{
PC++;
PC += (signed char) prog[PC] + 1;
}
else
{
PC += 2;
}
break;
case 0xba: // cjne R2,#(byte),offset
PC++;
if ( R[2] < prog[PC] )
{
set_C();
}
else
{
clr_C();
}
if ( R[2] != prog[PC] )
{
PC++;
PC += (signed char) prog[PC] + 1;
}
else
{
PC += 2;
}
break;
case 0xbb: // cjne R3,#(byte),offset
PC++;
if ( R[3] < prog[PC] )
{
set_C();
}
else
{
clr_C();
}
if ( R[3] != prog[PC] )
{
PC++;
PC += (signed char) prog[PC] + 1;
}
else
{
PC += 2;
}
break;
case 0xbc: // cjne R4,#(byte),offset
PC++;
if ( R[4] < prog[PC] )
{
set_C();
}
else
{
clr_C();
}
if ( R[4] != prog[PC] )
{
PC++;
PC += (signed char) prog[PC] + 1;
}
else
{
PC += 2;
}
break;
case 0xbd: // cjne R5,#(byte),offset
PC++;
if ( R[5] < prog[PC] )
{
set_C();
}
else
{
clr_C();
}
if ( R[5] != prog[PC] )
{
PC++;
PC += (signed char) prog[PC] + 1;
}
else
{
PC += 2;
}
break;
case 0xbe: // cjne R6,#(byte),offset
PC++;
if ( R[6] < prog[PC] )
{
set_C();
}
else
{
clr_C();
}
if ( R[6] != prog[PC] )
{
PC++;
PC += (signed char) prog[PC] + 1;
}
else
{
PC += 2;
}
break;
case 0xbf: // cjne R7,#(byte),offset
PC++;
if ( R[7] < prog[PC] )
{
set_C();
}
else
{
clr_C();
}
if ( R[7] != prog[PC] )
{
PC++;
PC += (signed char) prog[PC] + 1;
}
else
{
PC += 2;
}
break;
case 0x32: // reti
PC = (WORD) SFR[*SP] << 8 | (WORD) SFR[*SP - 1];
*SP = *SP - 2;
break;
case 0x30: //jnb (bit),(offset)
PC++;
if ( !checkB(prog[PC]))
{
PC++;
PC += (signed char) prog[PC] + 1;
}
else
{
PC += 2;
}
break;
case 0x20: //jb (bit),(offset)
PC++;
if ( checkB(prog[PC]))
{
PC++;
PC += (signed char) prog[PC] + 1;
}
else
{
PC += 2;
}
break;
case 0x10: //jbc (bit),(offset)
PC++;
if ( checkB(prog[PC]))
{
clrB(prog[PC]);
PC++;
PC += (signed char) prog[PC] + 1;
}
else
{
PC += 2;
}
break;
case 0x94: // subb A,#(data)
PC++;
_subb(*Acc, prog[PC]); //*Acc=*Acc-prog[PC];
PC++;
break;
case 0x95: // subb A,(adress)
PC++;
_subb(*Acc, SFR[prog[PC]]); //*Acc=*Acc-SFR[prog[PC]];
PC++;
break;
case 0x96: // subb A,@R0
PC++;
_subb(*Acc, SFR[R[0]]); //*Acc=*Acc-SFR[R[0]];
PC++;
break;
case 0x97: // subb A,@R1
PC++;
_subb(*Acc, SFR[R[1]]); //*Acc=*Acc-SFR[R[1]];
PC++;
break;
case 0x98: // subb A,R0
PC++;
_subb(*Acc, R[0]); //*Acc=*Acc-R[0];
PC++;
break;
case 0x99: // subb A,R1
PC++;
_subb(*Acc, R[1]); //*Acc=*Acc-R[1];
PC++;
break;
case 0x9a: // subb A,R2
PC++;
_subb(*Acc, R[2]); //*Acc=*Acc-R[2];
PC++;
break;
case 0x9b: // subb A,R3
PC++;
_subb(*Acc, R[3]); //*Acc=*Acc-R[3];
PC++;
break;
case 0x9c: // subb A,R4
PC++;
_subb(*Acc, R[4]); //*Acc=*Acc-R[4];
PC++;
break;
case 0x9d: // subb A,R5
PC++;
_subb(*Acc, R[5]); //*Acc=*Acc-R[5];
PC++;
break;
case 0x9e: // subb A,R6
PC++;
_subb(*Acc, R[6]); //*Acc=*Acc-R[6];
PC++;
break;
case 0x9f: // subb A,R7
PC++;
_subb(*Acc, R[7]); //*Acc=*Acc-R[7];
PC++;
break;
case 0xd4: // da A
PC++;
tmpB = *Acc;
*Acc &= 0xf;
tmpB >>= 4;
if (( *Acc > 9 ) || check_AC())
{
*Acc += 9;
}
if (( tmpB > 9 ) || check_C())
{
tmpB += 9;
}
*Acc |= tmpB << 4;
break;
case 0xd6: // xchd A,@R0
PC++;
tmpB = SFR[R[0]] & 0xf;
SFR[R[0]] &= 0xf;
SFR[R[0]] |= ( *Acc ) & 0xf;
( *Acc ) &= 0xf;
( *Acc ) |= tmpB;
break;
case 0xd7: // xchd A,@R1
PC++;
tmpB = SFR[R[1]] & 0xf;
SFR[R[1]] &= 0xf;
SFR[R[1]] |= ( *Acc ) & 0xf;
( *Acc ) &= 0xf;
( *Acc ) |= tmpB;
break;
case 0xe2: // movx A,@R0
*Acc = ram[R[0]];
PC++;
break;
case 0xe3: // movx A,@R1
*Acc = ram[R[1]];
PC++;
break;
case 0xf2: // movx @R0,A
ram[R[0]] = *Acc;
PC++;
break;
case 0xf3: // movx @R1,A
ram[R[1]] = *Acc;
PC++;
break;
}
BYTE cnt = 0;
// count cycles
c_time += cycles;
// count bits in Acc
for ( BYTE c = 0 ; c <= 7 ; c++ )
{
if (( 1 << c ) & *Acc )
{
cnt++;
}
}
// parrity check
if ( cnt % 2 ) // if cnt parity isn't true
{
clr_P();
}
else
{
// if cnt parity is true
set_P();
}
// setup Rx bank
tmpB = check_RS1() << 1 | check_RS0();
R = &SFR[tmpB << 3];
BYTE modeT0, modeT1;
// timers & interrupts
modeT0 = *TMOD & 0x03;
modeT1 = ( *TMOD & 0x30 ) >> 4;
// Timer 0
clrB(0x8d); // clr bit TF0 - T0 overflow
if ( checkB(0x8c)) // if TR0
{
switch ( modeT0 )
{
case 0:
break;
case 1:
if ((int) ( *TL0 ) + (int) cycles <= 0xff )
{
*TL0 += cycles;
}
else
{
*TL0 = (BYTE) ((int) *TL0 - (int) 0x100 + cycles );
if ((int) ( *TH0 ) < 0xff )
{
*TH0 += 1;
}
else
{
*TH0 = 0;
setB(0x8d); // set bit TF0 - T0 overflow
}
}
break;
case 2:
if ((int) ( *TL0 ) + (int) cycles <= 0xff )
{
*TL0 += cycles;
}
else
{
*TL0 = *TH0;
setB(0x8d); // set bit TF0 - T0 overflow
}
break;
case 3:
break;
}
}
clrB(0x8f); // clr bit TF1 - T1 overflow
if ( checkB(0x8e)) // if TR1
{
switch ( modeT1 )
{
case 0:
break;
case 1:
if ((int) ( *TL1 ) + (int) cycles <= 0xff )
{
*TL1 += cycles;
}
else
{
*TL1 = (BYTE) ((int) *TL1 - (int) 0x100 + cycles );
if ((int) ( *TH1 ) < 0xff )
{
*TH1 += 1;
}
else
{
*TH1 = 0;
setB(0x8f); // set bit TF0 - T0 overflow
}
}
break;
case 2:
if ((int) ( *TL1 ) + (int) cycles <= 0xff )
{
*TL1 += cycles;
}
else
{
*TL1 = *TH1;
setB(0x8f); // set bit TF0 - T0 overflow
}
break;
case 3:
break;
}
}
// Interrupts
if ( checkB(0xaf)) //if EA is 1
{
// T0 int
if ( checkB(0x8d) && checkB(0xa9)) // if TF0 and ET0
{
*SP = *SP + 1;
SFR[*SP] = (BYTE) ( PC & 0x00ff );
*SP = *SP + 1;
SFR[*SP] = (BYTE) ( PC >> 8 );
PC = 0x0000b;
}
// T1 int
if ( checkB(0x8f) && checkB(0xab)) // if TF1 and ET1
{
*SP = *SP + 1;
SFR[*SP] = (BYTE) ( PC & 0x00ff );
*SP = *SP + 1;
SFR[*SP] = (BYTE) ( PC >> 8 );
PC = 0x001b;
}
}
}
code_51 asm51[256];
class dis_asm // display code class
{
private:
void hexoutB(int, int, int, BYTE);
public:
BYTE *ram; // pointer to external ram table
BITMAP *buf, *surface; // screen buffer, work surface
int frame;
int left;
bool changed;
dis_asm(BYTE *, BITMAP *); // ext. ram, draw bitmap, constructor
void blit_it(int, int);
void draw(WORD); // x,y,PC (PC is an adr. of register which
// string is displayed in the middle
// of the code monitor)
~dis_asm();
};
class regs
{
private:
void hexoutB(int, int, int color, BYTE numb); //x,y,color,byte
public:
int frame;
int left;
bool changed;
BYTE *sfr;
BYTE reg[25];
char reg_label[25][10];
BITMAP *surface, *buf;
void draw();
void blit_it(int, int);
int red;
int white;
int lblue;
int green;
int lred;
regs(BYTE *, BITMAP *);
~regs();
};
regs::regs(BYTE *tmpB, BITMAP *tmpBMP)
{
red = makecol(255, 0, 0);
white = makecol(255, 255, 255);
lblue = makecol(0, 128, 255);
green = makecol(0, 255, 0);
lred = makecol(255, 64, 0);
frame = 2;
left = 12;
changed = true;
sfr = tmpB;
buf = tmpBMP;
surface = create_bitmap(400, 300);
clear(surface);
};
regs::~regs()
{};
void regs::blit_it(int x, int y)
{
blit(surface, buf, 0, 0, x, y, surface->w, surface->h);
};
void regs::draw()
{
clear(surface);
int c2 = 0, c;
textprintf(surface, mainf, left, frame + 20, lblue, "nr label adress hex dec ascii SEG LED(bin)");
for ( c = frame + 30 ; c < surface->h - 20 ; c += 10 )
{
textprintf(surface, mainf, left, c, white, "%2d: %9s (%2x) = %2x %3d %c", c2 + 1, reg_label[c2], reg[c2],
sfr[reg[c2]], sfr[reg[c2]], sfr[reg[c2]]);
draw_SEG_digit(surface, left + 288, c, green, 4, sfr[reg[c2]]);
draw_LED_bin(surface, left + 314, c + 4, lred, sfr[reg[c2]]);
c2++;
if ( c2 == 25 )
{
break;
}
};
hline(surface, frame, surface->h - frame, surface->w - frame, white);
vline(surface, frame, frame, surface->h - frame, white);
vline(surface, surface->w - frame, frame, surface->h - frame, white);
for ( c = frame ; c <= frame + 10 ; c += 2 )
{
hline(surface, frame, c, surface->w - frame, white);
}
textprintf_centre(surface, mainf, surface->w / 2, frame + 2, white, " SFR Registers ");
}
void regs::hexoutB(int x, int y, int color, BYTE numb)
{
if ( numb > 0x10 )
{
textprintf(surface, mainf, x, y, color, "%2x", numb);
}
else
{
textprintf(surface, mainf, x, y, color, "%2x", numb);
textprintf(surface, mainf, x, y, color, "0");
}
}
dis_asm::dis_asm(BYTE *tmpB, BITMAP *tmp_buf)
{
frame = 2;
left = 12;
changed = true;
ram = tmpB;
buf = tmp_buf;
surface = create_bitmap(300, 500);
clear(surface);
}
void dis_asm::hexoutB(int x, int y, int color, BYTE numb)
{
if ( numb > 0x10 )
{
textprintf(surface, mainf, x, y, color, "%2x", numb);
}
else
{
textprintf(surface, mainf, x, y, color, "%2x", numb);
textprintf(surface, mainf, x, y, color, "0");
}
}
void dis_asm::draw(WORD adress)
{
int red = makecol(255, 0, 0);
int white = makecol(255, 255, 255);
int lblue = makecol(0, 128, 255);
int color = white;
int colPC = white;
int c, cnt;
clear(surface);
for ( c = 20 ; c < surface->h - 10 ; c += 10 )
{
if ( PC == adress )
{
color = red;
}
else
{
color = white;
}
asm51[ram[adress]].make_ds(adress);
if ( asm51[ram[adress]].code == ram[adress] )
{
textprintf(surface, mainf, left, c, color, "%4x:", adress);
for ( cnt = 0 ; cnt < asm51[ram[adress]].lenght ; cnt++ )
{
if ( PC == ( adress + cnt ))
{
colPC = lblue;
}
else
{
colPC = color;
}
hexoutB(left + 50 + cnt * 24, c, colPC, ram[adress + cnt]);
}
textprintf(surface, mainf, left + 144, c, color, "%s", asm51[ram[adress]].display_string);
adress += asm51[ram[adress]].lenght;
}
else
{
textprintf(surface, mainf, left, c, color, "%4x: ", adress);
if ( PC == adress )
{
colPC = lblue;
}
else
{
colPC = color;
}
hexoutB(left + 50, c, colPC, ram[adress]);
textprintf(surface, mainf, left + 144, c, color, "???");
adress++;
}
}
hline(surface, frame, surface->h - frame, surface->w - frame, white);
vline(surface, frame, frame, surface->h - frame, white);
vline(surface, surface->w - frame, frame, surface->h - frame, white);
for ( c = frame ; c <= frame + 10 ; c += 2 )
{
hline(surface, frame, c, surface->w - frame, white);
}
textprintf_centre(surface, mainf, surface->w / 2, frame + 2, white, " Disassembler ");
}
void dis_asm::blit_it(int x, int y)
{
blit(surface, buf, 0, 0, x, y, surface->w, surface->h);
}
dis_asm::~dis_asm(void)
{
}
int get_lenght(BYTE code)
{
if ( asm51[code].code == code )
{
return asm51[code].lenght;
}
else
{
return 1;
}
}
class flags
{
private:
void hexoutB(int, int, int color, BYTE numb); //x,y,color,byte
public:
int frame;
int left;
bool changed;
BYTE *sfr;
BITMAP *surface, *buf;
void draw();
void blit_it(int, int);
flags(BITMAP *);
~flags();
};
flags::flags(BITMAP *tmp_buf)
{
buf = tmp_buf;
surface = create_bitmap(100, 300);
frame = 2;
left = 12;
changed = false;
}
flags::~flags()
{
}
void flags::draw()
{
int red = makecol(255, 0, 0);
int white = makecol(255, 255, 255);
int lblue = makecol(0, 128, 255);
clear(surface);
textprintf(surface, mainf, left, frame + 20, white, "C : %d", check_C());
textprintf(surface, mainf, left, frame + 30, white, "AC : %d", check_AC());
textprintf(surface, mainf, left, frame + 40, white, "OV : %d", check_OV());
textprintf(surface, mainf, left, frame + 50, white, "P : %d", check_P());
textprintf(surface, mainf, left, frame + 60, red, "PC : %4x", PC);
textprintf(surface, mainf, left, frame + 70, lblue, "SP : %2x", *SP);
textprintf(surface, mainf, left, frame + 80, lblue, "Acc: %2x", *Acc);
textprintf(surface, mainf, left, frame + 90, lblue, "B : %2x", *B);
textprintf(surface, mainf, left, frame + 100, lblue, "R0 : %2x", R[0]);
textprintf(surface, mainf, left, frame + 110, lblue, "R1 : %2x", R[1]);
textprintf(surface, mainf, left, frame + 120, lblue, "R2 : %2x", R[2]);
textprintf(surface, mainf, left, frame + 130, lblue, "R3 : %2x", R[3]);
textprintf(surface, mainf, left, frame + 140, lblue, "R4 : %2x", R[4]);
textprintf(surface, mainf, left, frame + 150, lblue, "R5 : %2x", R[5]);
textprintf(surface, mainf, left, frame + 160, lblue, "R6 : %2x", R[6]);
textprintf(surface, mainf, left, frame + 170, lblue, "R7 : %2x", R[7]);
textprintf(surface, mainf, left, frame + 180, lblue, "DPTR: %4x", *DPTR);
textprintf(surface, mainf, left, frame + 270, red, "cycles :");
textprintf(surface, mainf, left, frame + 280, red, "%lld", c_time);
hline(surface, frame, surface->h - frame, surface->w - frame, white);
vline(surface, frame, frame, surface->h - frame, white);
vline(surface, surface->w - frame, frame, surface->h - frame, white);
for ( int c = frame ; c <= frame + 10 ; c += 2 )
{
hline(surface, frame, c, surface->w - frame, white);
}
textprintf_centre(surface, mainf, surface->w / 2, frame + 2, white, " RegFlag ");
}
void flags::blit_it(int x, int y)
{
blit(surface, buf, 0, 0, x, y, surface->w, surface->h);
}
class ramv
{
private:
void hexoutB(int, int, int color, BYTE numb); //x,y,color,byte
public:
int frame;
int left;
bool changed;
BYTE reg[25];
char reg_label[25][10];
BITMAP *surface, *buf;
void draw(WORD);
void blit_it(int, int);
ramv(BITMAP *);
~ramv();
};
ramv::ramv(BITMAP *tmpBMP) // extram, screen
{
frame = 2;
left = 12;
changed = true;
buf = tmpBMP;
surface = create_bitmap(500, 200);
clear(surface);
}
ramv::~ramv()
{
}
void ramv::blit_it(int x, int y)
{
blit(surface, buf, 0, 0, x, y, surface->w, surface->h);
}
void ramv::draw(WORD cur)
{
int red = makecol(255, 0, 0);
int white = makecol(255, 255, 255);
int lgreen = makecol(128, 255, 128);
int green = makecol(0, 255, 0);
int lblue = makecol(0, 128, 255);
int yellow = makecol(255, 255, 0);
clear(surface);
int c2 = 0, c;
int y;
y = frame + 20;
int curcol = white;
for ( c = cur ; true ; c += 8 )
{
if ( !( y < surface->h - 10 ))
{
break;
}
textprintf(surface, mainf, left, y, lblue, "%4X: ", (WORD) ( c ));
for ( c2 = 0 ; c2 < 8 ; c2++ )
{
if ( PC == (WORD) ( c + c2 ))
{
curcol = red;
draw_SEG_digit(surface, left + 326 + c2 * 8, y, yellow, 3, ram[(WORD) ( c + c2 )]);
}
else if ( *DPTR == (WORD) ( c + c2 ))
{
curcol = lgreen;
draw_SEG_digit(surface, left + 326 + c2 * 8, y, yellow, 3, ram[(WORD) ( c + c2 )]);
}
else
{
curcol = white;
draw_SEG_digit(surface, left + 326 + c2 * 8, y, green, 3, ram[(WORD) ( c + c2 )]);
}
hexoutB(left + 48 + c2 * 24, y, curcol, ram[(WORD) ( c + c2 )]);
textprintf(surface, font, left + 252 + c2 * 8, y, curcol, "%c", ram[(WORD) ( c + c2 )]);
}
y += 10;
}
hline(surface, frame, surface->h - frame, surface->w - frame, white);
vline(surface, frame, frame, surface->h - frame, white);
vline(surface, surface->w - frame, frame, surface->h - frame, white);
for ( c = frame ; c <= frame + 10 ; c += 2 )
{
hline(surface, frame, c, surface->w - frame, white);
}
textprintf_centre(surface, mainf, surface->w / 2, frame + 2, white, " RAM Monitor ");
}
void ramv::hexoutB(int x, int y, int color, BYTE numb)
{
if ( numb > 0x10 )
{
textprintf(surface, mainf, x, y, color, "%2x", numb);
}
else
{
textprintf(surface, mainf, x, y, color, "%2x", numb);
textprintf(surface, mainf, x, y, color, "0");
}
}
/*bool vret (void)
{
if (inportb(0x3da) & 8) return true;
else return false;
}*/
void wait_for_retrace(void)
{
/*while (!vret())
{
}*/
//vsync();
}
int load_code_table(code_51 *tmp_tab)
{
FILE *strio = NULL;
char _mnem[6];
int _code;
int _lenght;
int _cycles;
char _datas[12];
strio = fopen("list51.txt", "r");
if ( strio )
{
for ( int c = 0 ; c < 256 ; c++ )
{
fscanf(strio, "%x", &_code);
fscanf(strio, "%s", _mnem);
fscanf(strio, "%s", _datas);
fscanf(strio, "%d", &_lenght);
fscanf(strio, "%d", &_cycles);
if ( _mnem[0] == 'E' && _mnem[1] == 'N' && _mnem[2] == 'D' )
{
break;
}
tmp_tab[_code].code = (BYTE) _code;
strcpy(tmp_tab[_code].mnem, _mnem);
strcpy(tmp_tab[_code].datas, _datas);
tmp_tab[_code].lenght = (BYTE) _lenght;
tmp_tab[_code].cycles = (BYTE) _cycles;
}
fclose(strio);
}
else
{
ShowMessage("Can't load list51.txt file", screen, 100, 100, 200, 60, "Error!");
}
return 0;
}
int load_ram(char *filename, BYTE *ram)
{
FILE *strin = NULL;
if ( *filename != 0 )
{
strin = fopen(filename, "rb");
}
if ( strin == NULL )
{
ShowMessage("Can't open the file", screen, 250, 100, 200, 100, "Error!");
}
else
{
WORD c = 0;
for ( c ; !feof(strin) ; c++ )
{
ram[c] = fgetc(strin);
}
fclose(strin);
}
return 0;
}
int load_hex(char *filename, BYTE *ram)
{
FILE *strin;
int Adr = 0;
int Cnt;
//int to_mem;
int i;
char line[50];
char word[5];
char byte[3];
byte[2] = word[4] = 0;
strin = NULL;
if ( *filename != 0 )
{
strin = fopen(filename, "r");
}
if ( strin == NULL )
{
ShowMessage("Can't open the file", screen, 250, 100, 200, 100, "Error!");
return -1;
}
else
{
while ( !feof(strin))
{
fscanf(strin, "%s", line);
//fprintf (out,"%s\n", line);
byte[0] = line[1];
byte[1] = line[2];
sscanf(byte, "%x", &Cnt);
word[0] = line[3];
word[1] = line[4];
word[2] = line[5];
word[3] = line[6];
sscanf(word, "%x", &Adr);
byte[0] = line[7];
byte[1] = line[8];
sscanf(byte, "%x", &i);
if ( i == 1 )
{
break;
}
else
{
byte[2] = 0;
for ( i = 9 ; i < 9 + Cnt * 2 ; i += 2 )
{
byte[0] = line[i];
byte[1] = line[i + 1];
sscanf(byte, "%x", ( ram + Adr ));
Adr++;
}
}
}
fclose(strin);
//fclose (out);
}
return 0;
}
void ChangeMonitedSFRRegister(regs *regwnd)
{
char lab[10];
char ln[3];
int line_num = 0;
int reg_adr = 0;
GetText(ln, screen, 50, 50, 300, 70, 3, "Enter line number (dec)");
sscanf(ln, "%d", &line_num);
if ( line_num < 1 || line_num > 25 )
{
return;
}
GetText(lab, screen, 50, 80, 300, 70, 10, "Enter reg. label (ascii)");
GetText(ln, screen, 50, 100, 300, 70, 3, "Enter register number (hex)");
sscanf(ln, "%x", &reg_adr);
line_num--;
strcpy(regwnd->reg_label[line_num], lab);
regwnd->reg[line_num] = (BYTE) reg_adr;
return;
}
void reset51(void)
{
if ( QuestionBox("Are you sure want to reset 8051", screen, 250, 240, 300, 60, "Confirm!", makecol(255, 255, 255)))
{
init_8051();
}
return;
}
WORD ViewAt(void)
{
char hex4[6];
int tmp_adr;
GetText(hex4, screen, 50, 80, 300, 70, 5, "Enter new view point (hex)");
if ( hex4[0] == 32 )
{
return 0;
}
sscanf(hex4, "%x", &tmp_adr);
return (WORD) tmp_adr;
}
void ChangePC(void)
{
char hex4[5];
int tmpPC = 0;
GetText(hex4, screen, 50, 80, 300, 70, 5, "Enter new PC (hex)");
if ( hex4[0] == 32 )
{
return;
}
sscanf(hex4, "%x", &tmpPC);
PC = (WORD) tmpPC;
return;
}
void ChangeRegValue_SFR(void)
{
char hex2[3];
char hex2_a[3];
int tmp_adr;
int tmp_dat;
GetText(hex2_a, screen, 50, 80, 300, 70, 3, "Enter adress from SFR (hex)");
if ( hex2_a[0] == 32 )
{
return;
}
GetText(hex2, screen, 60, 90, 300, 70, 3, "Enter byte (hex)");
sscanf(hex2_a, "%x", &tmp_adr);
sscanf(hex2, "%x", &tmp_dat);
SFR[(BYTE) tmp_adr] = (BYTE) tmp_dat;
return;
}
void ChangeRegValue_RAM(void)
{
char hex2[3];
char hex4_a[5];
int tmp_adr;
int tmp_dat;
GetText(hex4_a, screen, 50, 80, 400, 70, 5, "Enter adress from External Memory (hex)");
if ( hex4_a[0] == 32 )
{
return;
}
GetText(hex2, screen, 60, 90, 300, 70, 3, "Enter byte (hex)");
sscanf(hex4_a, "%x", &tmp_adr);
sscanf(hex2, "%x", &tmp_dat);
prog[(WORD) tmp_adr] = (BYTE) tmp_dat;
return;
}
void LoadRAM(void)
{
char filename[40];
GetText(filename, screen, 30, 80, 700, 70, 40, "Load *.bin file");
for ( int c = 38 ; filename[c] == ' ' || filename[c] == '\r' ; c-- )
{
filename[c] = 0;
}
load_ram(filename, prog);
return;
}
void LoadHEX(void)
{
char filename[40];
GetText(filename, screen, 30, 80, 700, 70, 40, "Load *.hex file");
for ( int c = 38 ; filename[c] == ' ' || filename[c] == '\r' ; c-- )
{
filename[c] = 0;
}
load_hex(filename, prog);
return;
}
void LoadSrc(void)
{
char cmd[256];
char filename[256];
char comp_msg[512];
FILE *msgin;
int c = 0;
GetText(filename, screen, 30, 80, 700, 70, 40, "Load and compile source file (*.*)");
sprintf(cmd, "asm51.exe %s > out.tmp", filename);
system(cmd);
msgin = NULL;
msgin = fopen("out.tmp", "rb");
if ( msgin == NULL )
{
ShowMessage("Can't open the file: out.tmp", screen, 250, 100, 200, 100, "Error!");
}
else
{
for ( c ; c <= 0xffff ; c++ )
{
comp_msg[c] = fgetc(msgin);
if ( feof(msgin))
{
break;
}
}
fclose(msgin);
}
ShowMsgEx(comp_msg, screen, 100, 80, 600, 140, "Assembling status", makecol(255, 255, 255));
for ( c = 512 ; c > 0 ; c-- )
{
if ( comp_msg[c] == ',' && comp_msg[c + 2] == '0' )
{
change_ext(filename);
if ( load_hex(filename, prog) == 0 )
{
ShowMessage("Compiled file is loaded.", screen, 250, 100, 300, 80, "Message!");
}
break;
}
}
return;
}
void EditSrc(void)
{
code_editor ed1;
ed1.process();
return;
}
void ChMaxI(int *maxi)
{
char dec6_a[7];
GetText(dec6_a, screen, 50, 80, 400, 70, 7, "Enter number of instructions per frame");
if ( dec6_a[0] == 32 )
{
return;
}
sscanf(dec6_a, "%d", maxi);
return;
}
void ChMemMode(void)
{
if ( QuestionBox("Do you want to use memory in mixed mode?", screen, 100, 100, 400, 60, "Qusetion?", white))
{
ram = EXT_PMEM;
}
else
{
ram = EXT_RAM;
}
}
void FillExt(void)
{
char h4beg[5], h4end[5], h2f[3];
int from, to, i, ic = 1, fill;
GetText(h4beg, screen, 50, 80, 400, 70, 5, "From adress... (16bit hex)");
GetText(h4end, screen, 50, 80, 400, 70, 5, "...to adress (16bit hex)");
GetText(h2f, screen, 50, 80, 400, 70, 3, "with byte (8bit hex)");
sscanf(h4beg, "%x", &from);
sscanf(h4end, "%x", &to);
sscanf(h2f, "%x", &fill);
if ( from > to )
{
ic = -1;
}
for ( i = from ; i != to ; i += ic )
{
ram[i] = fill;
}
ram[to] = fill;
return;
}
void main_init(void)
{
load_code_table(asm51);
//load_ram ("lekcja3.bin",ram);
//load_ram ("avt.bin",ram);
init_8051();
allegro_init();
install_timer();
install_keyboard();
//install_mouse();
set_color_depth(8);
set_gfx_mode(GFX_AUTODETECT_WINDOWED, 800, 600, 0, 0);
//set_gfx_mode (GFX_AUTODETECT, 800, 600,0,0);
set_palette(desktop_palette);
//show_mouse (screen);
RGB col;
col.r = 0;
col.g = 0;
col.b = 0;
set_color(0, &col);
col.r = 63;
col.g = 15;
col.b = 0;
set_color(1, &col);
col.r = 20;
col.g = 0;
col.b = 0;
set_color(2, &col);
col.r = 255;
col.g = 255;
col.b = 255;
set_color(255, &col);
DATAFILE *dataf;
dataf = load_datafile("data.dat");
mainf = (FONT *) dataf[0].dat;
}
int main(void)
{
main_init();
white = makecol(255, 255, 255);
red = makecol(255, 0, 0);
lred = makecol(255, 64, 0);
green = makecol(0, 255, 0);
blue = makecol(0, 0, 255);
dis_asm disasm(prog, screen);
regs SFRregs(SFR, screen);
flags FlagWnd(screen);
ramv RMon(screen);
strcpy(SFRregs.reg_label[0], "Delay AVT");
SFRregs.reg[0] = 0x75;
strcpy(SFRregs.reg_label[1], "Key AVT ");
SFRregs.reg[1] = 0x76;
strcpy(SFRregs.reg_label[2], "DPH ");
SFRregs.reg[2] = 0x83;
strcpy(SFRregs.reg_label[3], "DPL ");
SFRregs.reg[3] = 0x82;
strcpy(SFRregs.reg_label[4], "PSW ");
SFRregs.reg[4] = 0xd0;
strcpy(SFRregs.reg_label[5], "P0 ");
SFRregs.reg[5] = 0x80;
strcpy(SFRregs.reg_label[6], "P1 ");
SFRregs.reg[6] = 0x90;
strcpy(SFRregs.reg_label[7], "P2 ");
SFRregs.reg[7] = 0xa0;
strcpy(SFRregs.reg_label[8], "P3 ");
SFRregs.reg[8] = 0xb0;
strcpy(SFRregs.reg_label[9], "TH1 ");
SFRregs.reg[9] = 0x8d;
strcpy(SFRregs.reg_label[10], "TL1 ");
SFRregs.reg[10] = 0x8b;
strcpy(SFRregs.reg_label[11], "TH0 ");
SFRregs.reg[11] = 0x8c;
strcpy(SFRregs.reg_label[12], "TL0 ");
SFRregs.reg[12] = 0x8a;
strcpy(SFRregs.reg_label[13], "IE ");
SFRregs.reg[13] = 0xa8;
strcpy(SFRregs.reg_label[14], "10 ");
SFRregs.reg[14] = 0x12;
strcpy(SFRregs.reg_label[15], "9 ");
SFRregs.reg[15] = 0x11;
strcpy(SFRregs.reg_label[16], "8 ");
SFRregs.reg[16] = 0x10;
strcpy(SFRregs.reg_label[17], "7 ");
SFRregs.reg[17] = 0x0f;
strcpy(SFRregs.reg_label[18], "6 ");
SFRregs.reg[18] = 0x0e;
strcpy(SFRregs.reg_label[19], "5 ");
SFRregs.reg[19] = 0x0d;
strcpy(SFRregs.reg_label[20], "4 ");
SFRregs.reg[20] = 0x0c;
strcpy(SFRregs.reg_label[21], "3 ");
SFRregs.reg[21] = 0x0b;
strcpy(SFRregs.reg_label[22], "2 ");
SFRregs.reg[22] = 0x0a;
strcpy(SFRregs.reg_label[23], "1 ");
SFRregs.reg[23] = 0x09;
strcpy(SFRregs.reg_label[24], "0 ");
SFRregs.reg[24] = 0x08;
PC = 0x0000;
WORD aadr = 0x0000;
WORD madr = 0x0000;
bool manual_scrolling = true;
bool step = true;
bool into = false;
bool over = false;
unsigned long cnt = 0;
int break_point = -1;
char break_str[5];
//load_ram("avt.bin",ram);
int i = 0, maxi = 13000;
while ( !( key[KEY_X] && key[KEY_ALT] ))
{
rect(screen, 2, 2, 798, 18, white);
// key shortcuts disp
rect(screen, 2, 521, 798, 598, white);
textprintf(screen, mainf, 128, 528, white,
"F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12");
textprintf(screen, mainf, 128, 548, white,
"Help ChSFR ManS Debug DView WrPC TInto SOver SrcEd FillE Speed Reset");
textprintf(screen, mainf, 128, 568, white,
"WrRAM WrSFR AutoS Run MView LdBIN LdHEX LdSrc BrkPt MemMod ");
hline(screen, 2, 540, 798, white);
textprintf(screen, mainf, 6, 548, white, "Function key :");
hline(screen, 2, 560, 798, white);
textprintf(screen, mainf, 6, 568, white, "Shift+key :");
hline(screen, 2, 580, 798, white);
textprintf(screen, mainf, 6, 587, white, "Alt+X: Exit ");
textout(screen, mainf, "emu51 v0.03 alpha (Mariusz Kasolik)", 6, 7, white);
textout(screen, mainf, "AVT-2250 Segment display:", 490, 6, white);
if ( ram == prog )
{
rect(screen, 680, 568, 680 + 6, 575, red);
}
cnt++;
if ( manual_scrolling )
{
disasm.draw(aadr);
}
else
{
disasm.draw(PC);
}
disasm.blit_it(0, 20);
RMon.draw(madr);
RMon.blit_it(300, 320);
SFRregs.draw();
SFRregs.blit_it(400, 20);
FlagWnd.draw();
FlagWnd.blit_it(300, 20);
if ( !step )
{
for ( i = 0 ; i < maxi ; i++ )
{
if ( PC == break_point )
{
step = true;
break;
}
asm51[prog[PC]].process();
}
}
else
{
if ( over )
{
asm51[prog[PC]].process();
over = false;
}
if ( into )
{
asm51[prog[PC]].process();
into = false;
}
}
for ( i = 0 ; i <= 7 ; i++ )
{
// for compatibility with avt2250
draw_SEG_digit(screen, 700 + 8 * i, 6, lred, 4, SFR[i + 0x78]);
}
if ( key[KEY_LCONTROL] )
{
if ( key[KEY_0_PAD] )
{
SFR[0x76] = 0x30;
}
if ( key[KEY_1_PAD] )
{
SFR[0x76] = 0x31;
}
if ( key[KEY_2_PAD] )
{
SFR[0x76] = 0x32;
}
if ( key[KEY_3_PAD] )
{
SFR[0x76] = 0x33;
}
if ( key[KEY_4_PAD] )
{
SFR[0x76] = 0x34;
}
if ( key[KEY_5_PAD] )
{
SFR[0x76] = 0x35;
}
if ( key[KEY_6_PAD] )
{
SFR[0x76] = 0x36;
}
if ( key[KEY_7_PAD] )
{
SFR[0x76] = 0x37;
}
if ( key[KEY_8_PAD] )
{
SFR[0x76] = 0x38;
}
if ( key[KEY_9_PAD] )
{
SFR[0x76] = 0x39;
}
if ( key[KEY_INSERT] )
{
SFR[0x76] = 0x41;
}
if ( key[KEY_HOME] )
{
SFR[0x76] = 0x42;
}
if ( key[KEY_PGUP] )
{
SFR[0x76] = 0x43;
}
if ( key[KEY_DEL] )
{
SFR[0x76] = 0x44;
}
if ( key[KEY_END] )
{
SFR[0x76] = 0x45;
}
if ( key[KEY_PGDN] )
{
SFR[0x76] = 0x46;
}
if ( key[KEY_ENTER_PAD] )
{
SFR[0x76] = 0x0d;
}
}
else
{
if ( key[KEY_UP] )
{
aadr -= 3;
}
if ( key[KEY_DOWN] )
{
aadr += get_lenght(prog[aadr]);
aadr += get_lenght(prog[aadr]);
}
if ( key[KEY_PGUP] && !( key[KEY_LSHIFT] || key[KEY_RSHIFT] ))
{
madr -= 16;
}
if ( key[KEY_PGDN] && !( key[KEY_LSHIFT] || key[KEY_RSHIFT] ))
{
madr += 16;
}
if ( key[KEY_PGUP] && ( key[KEY_LSHIFT] || key[KEY_RSHIFT] ))
{
madr -= 1;
}
if ( key[KEY_PGDN] && ( key[KEY_LSHIFT] || key[KEY_RSHIFT] ))
{
madr += 1;
}
if ( !( key[KEY_LSHIFT] || key[KEY_RSHIFT] ) && key[KEY_F2] )
{
ChangeMonitedSFRRegister(&SFRregs);
}
if (( key[KEY_LSHIFT] || key[KEY_RSHIFT] ) && key[KEY_F2] )
{
ChangeRegValue_SFR();
}
if (( key[KEY_LSHIFT] || key[KEY_RSHIFT] ) && key[KEY_F1] )
{
ChangeRegValue_RAM();
}
if ( !( key[KEY_LSHIFT] || key[KEY_RSHIFT] ) && key[KEY_F3] )
{
manual_scrolling = true;
}
if (( key[KEY_LSHIFT] || key[KEY_RSHIFT] ) && key[KEY_F3] )
{
manual_scrolling = false;
}
if ( !( key[KEY_LSHIFT] || key[KEY_RSHIFT] ) && key[KEY_F4] )
{
step = true;
}
if (( key[KEY_LSHIFT] || key[KEY_RSHIFT] ) && key[KEY_F4] )
{
step = false;
}
if ( step )
{
if ( !( key[KEY_LSHIFT] || key[KEY_RSHIFT] ) && key[KEY_F7] )
{
into = true;
}
while ( !( key[KEY_LSHIFT] || key[KEY_RSHIFT] ) && key[KEY_F7] )
{
}
if ( !( key[KEY_LSHIFT] || key[KEY_RSHIFT] ) && key[KEY_F8] )
{
over = true;
}
while ( !( key[KEY_LSHIFT] || key[KEY_RSHIFT] ) && key[KEY_F8] )
{
}
}
if ( !( key[KEY_LSHIFT] || key[KEY_RSHIFT] ) && key[KEY_F5] )
{
aadr = ViewAt();
}
if (( key[KEY_LSHIFT] || key[KEY_RSHIFT] ) && key[KEY_F5] )
{
madr = ViewAt();
}
if ( !( key[KEY_LSHIFT] || key[KEY_RSHIFT] ) && key[KEY_F6] )
{
ChangePC();
}
if (( key[KEY_LSHIFT] || key[KEY_RSHIFT] ) && key[KEY_F7] )
{
LoadRAM();
}
if (( key[KEY_LSHIFT] || key[KEY_RSHIFT] ) && key[KEY_F8] )
{
LoadHEX();
}
if (( key[KEY_LSHIFT] || key[KEY_RSHIFT] ) && key[KEY_F9] )
{
LoadSrc();
}
if ( !( key[KEY_LSHIFT] || key[KEY_RSHIFT] ) && key[KEY_F9] )
{
EditSrc();
}
if ( !( key[KEY_LSHIFT] || key[KEY_RSHIFT] ) && key[KEY_F12] )
{
reset51();
}
if ( !( key[KEY_LSHIFT] || key[KEY_RSHIFT] ) && key[KEY_F11] )
{
ChMaxI(&maxi);
}
if (( key[KEY_LSHIFT] || key[KEY_RSHIFT] ) && key[KEY_F11] )
{
ChMemMode();
}
if ( !( key[KEY_LSHIFT] || key[KEY_RSHIFT] ) && key[KEY_F10] )
{
FillExt();
}
if (( key[KEY_LSHIFT] || key[KEY_RSHIFT] ) && key[KEY_F10] )
{
GetText(break_str, screen, 50, 80, 400, 70, 5, "Enter break piont adress");
sscanf(break_str, "%x", &break_point);
}
}
}
return 0;
}
END_OF_MAIN();