📄 bootice.bas
字号:
//
// Atmel AVR JTAGICE Bootloader
//
#device 163
cpu.clock = 7372800;
#include <sys\regs16>
use R19 as WREG;
var i,j,cmd, tmp: byte;
// BOOTSZ = Fuses both blown, Bootrst also!
org $1C00
//
// Main in Boot Block!
//
cpu.stack := $3ff;
ucr := $18;
ubrr := 23; // 19200 Baud @7.3728
repeat
read(uart, cmd);
switch cmd
// Return Programmer Type
"p": write(uart, "S"); // ??
break;
// Auto inc support
"a":
write(uart, "Y"); // ??
break;
// Return Software Ident
"S":
write(uart, "AVRBOOT");
break;
// Return supported devices
"t":
write(uart, $64, 0);
break;
// Return software version
"V":
write(uart, "21");
break;
// Select device
"T": goto eat
// read(uart, wreg); // read and trash..
// write(uart, 13);
// break;
// Set addr
"A":
read(uart, R31, R30); // AH AL
Z := Z + Z; // convert word addr to byte
write(uart, 13);
break;
// Enter Programming Mode
"P":
write(uart, 13);
break;
// Leave Programming Mode
"L":
write(uart, 13);
break;
// Read Signature
// Return ATmega163 always!
"s":
write(uart, $1E,$94,$02);
break;
// Read Data
"d" :
EEARL := R30;
EEARH := R31;
eeprom.read;
R0 := EEPROM.Data
inc W30
write(uart, R0);
break;
// Read Program memory
"R" :
R1 := ROM[W30]; inc Z
R0 := ROM[W30]; inc Z
write(uart, R0, R1);
break;
// Write Code low
// also Write Page is buffer full!
//
"c" :
read(uart,R15);
// Erase Page !
R16 := Z.Lo
and R16,127
if R16 = 0 then
SPMCR := $03; // Erase;
const SPM1 ROM = $E8, $95, $FF, $FF
NOP
R0 := $FF;
R1 := $FF;
push Z
for R17 := 0 to 63
SPMCR := $01; // Load
const SPM5 ROM = $E8, $95, $FF, $FF
NOP
Z := Z + 2; // Increment byte address by 2
next
pop Z
wait !SPMCR.0
wait (milli,30);
end
R0 := R15;
write(uart,13);
break;
// Write Code high
"C" :
read(uart,R1);
// Load to buffer
SPMCR := $01; // Load
const SPM2 ROM = $E8, $95, $FF, $FF
NOP
Z := Z + 2; // Increment byte address by 2
write(uart,13);
break;
// Write Page
"m" :
SPMCR := $05; // Page Write
const SPM3 ROM = $E8, $95, $FF, $FF
NOP
wait !SPMCR.0
write(uart,13); // Done..
break;
// Fake Erase
"e":
write(uart, 13);
break;
// Erase!
"U" :
Z := 0;
For R16 := 0 to 112
SPMCR := $03; // Erase;
const SPM7 ROM = $E8, $95, $FF, $FF
NOP
Wait(milli, 16);
Z := Z+128; // Next Page
next
write(uart,13);
break;
// ---------- FAKE -----------
// set LED
"x": goto eat
// read(uart,wreg);
// write(uart,13);
// break;
// clr LED
"y":
eat:
read(uart,wreg);
write(uart,13);
break;
// ESCAPE
$1B:
break;
default:
write(uart,"?");
break;
end
until false;
// We must include at end, to get Boot Block start OK
#include uart
#include <sys\wait1ms>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -