
main.hex firmware with an inversion of RESET pin:
https://drive.google.com/file/d/1QiRvCN29H0l-Kq0eJhdKs3WfHdrvEXrB/view?usp=sharing
source code:
https://drive.google.com/file/d/1-idzOalAeA77U9Ony_UZ1YfTT4d_M8j3/view?usp=sharing
avrdude.conf
https://drive.google.com/file/d/1bEraBArDpIUMMW7dt0KzH7qNNhkQd99W/view?usp=sharing
TARGET=atmega8
HFUSE=0xd9
LFUSE=0x9f
You can just flash the MCU without fuses

env for PlatformIO
[env:AT89S51]
platform = intel_mcs51
board = AT89S51
upload_protocol = custom
upload_command = sudo avrdude -c usbasp -p at89s51 -U flash:w:$SOURCE:i -C +./avrdude.conf
Or Avrdudess for Windows has a bug 2026y (it tries to detect as atmega8 but read write works)


Manually detect works fine

Config for avrdude.cong taken from AVRDUDESS
#------------------------------------------------------------
# AT89S51
#------------------------------------------------------------
# MCS-51 family part
# - Tested with -c avrisp
# - USBASP programmers may require different firmware
part # 89S51
desc = "AT89S51";
id = "89S51";
variants =
"AT89S51: N/A, Fmax=33 MHz, T=[N/A, N/A], Vcc=[4 V, 5.5 V]",
"AT89S51-24AU: TQFP44, Fmax=24 MHz, T=[-40 C, 85 C], Vcc=[4 V, 5.5 V]",
"AT89S51-24JU: PLCC44, Fmax=24 MHz, T=[-40 C, 85 C], Vcc=[4 V, 5.5 V]",
"AT89S51-24PU: PDIP40, Fmax=24 MHz, T=[-40 C, 85 C], Vcc=[4 V, 5.5 V]";
prog_modes = PM_ISP | PM_HVPP;
mcuid = 372;
archnum = -1; # Not 8-bit AVR
stk500_devcode = 0xe0;
chip_erase_delay = 250000;
signature = 0x1e 0x51 0x06;
timeout = 200;
stabdelay = 100;
cmdexedelay = 25;
synchloops = 32;
pollindex = 4;
pollvalue = 0x69;
predelay = 1;
postdelay = 1;
chiperasepulsewidth = 15;
programfusepulsewidth = 2;
programlockpolltimeout = 1;
chip_erase = "1010.1100--100x.xxxx--xxxx.xxxx--xxxx.xxxx";
pgm_enable = "1010.1100--0101.0011--xxxx.xxxx--xxxx.xxxx";
memory "flash"
size = 4096;
min_write_delay = 4500;
max_write_delay = 4500;
readback = 0xff 0xff;
mode = 0x02;
delay = 10;
blocksize = 256;
read = "0010.0000--xxxa.aaaa--aaaa.aaaa--oooo.oooo";
write = "0100.0000--xxxa.aaaa--aaaa.aaaa--iiii.iiii";
# Nonstandard page mode is available but not implemented
;
memory "lock"
size = 1;
read = "0010.0100--xxxx.xxxx--xxxx.xxxx--xxxo.ooxx";
# Nonstandard write: expect verification errors
# See datasheet Page 20, Note 1 https://ww1.microchip.com/downloads/en/DeviceDoc/doc2487.pdf
# Activate lock mode 0 through chip erase: avrdude -e
# Activate lock mode 1: avrdude -e -V -U lock:w:1:m
# Activate lock mode 2: avrdude -e -V -U lock:w:1:m -U lock:w:2:m
# Activate lock mode 3: avrdude -e -V -U lock:w:1:m -U lock:w:2:m -U lock:w:3:m
write = "1010.1100--1110.00ii--xxxx.xxxx--xxxx.xxxx";
;
memory "signature"
size = 3;
read = "0 0 1 0 1 0 0 0 x x x x x x a1 a0 x x x x x x x 0 o o o o o o o o";
;
;
#------------------------------------------------------------
# AT89S52
#------------------------------------------------------------
part parent "89S51" # 89S52
desc = "AT89S52";
id = "89S52";
variants =
"AT89S52: N/A, Fmax=33 MHz, T=[N/A, N/A], Vcc=[4 V, 5.5 V]",
"AT89S52-24AU: TQFP44, Fmax=24 MHz, T=[-40 C, 85 C], Vcc=[4 V, 5.5 V]",
"AT89S52-24AUR: TQFP44, Fmax=24 MHz, T=[-40 C, 85 C], Vcc=[4 V, 5.5 V]",
"AT89S52-24JU: PLCC44, Fmax=24 MHz, T=[-40 C, 85 C], Vcc=[4 V, 5.5 V]",
"AT89S52-24PU: PDIP40, Fmax=24 MHz, T=[-40 C, 85 C], Vcc=[4 V, 5.5 V]";
mcuid = 373;
stk500_devcode = 0xe1;
signature = 0x1e 0x52 0x06;
memory "flash"
size = 8192;
;
;
