summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLeo C2016-06-11 00:41:17 +0200
committerLeo C2016-06-11 00:41:17 +0200
commit16af58eaba93819b09becadf7caae0df890baed0 (patch)
tree6b26cfa5f4b3bf5b31afe492a2a329bce269ede2
parent96798b2ce44dd03d5b8c10662d2bfab101a9d378 (diff)
downloadz180-stamp-16af58eaba93819b09becadf7caae0df890baed0.zip
bootcf fixes
-rw-r--r--avr/cmd_boot.c25
-rw-r--r--z180/cfboot.18021
2 files changed, 25 insertions, 21 deletions
diff --git a/avr/cmd_boot.c b/avr/cmd_boot.c
index b00d062..14fbab3 100644
--- a/avr/cmd_boot.c
+++ b/avr/cmd_boot.c
@@ -121,11 +121,11 @@ command_ret_t do_bootcf(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[
uint8_t sec_cnt;
uint8_t part_id;
uint16_t timeout;
- uint8_t stop_stage;
+ uint8_t stages;
} boot_param;
struct {
- uint8_t stop_stage;
+ uint8_t stages;
uint8_t done;
uint8_t result;
uint8_t ide_stat;
@@ -133,14 +133,14 @@ command_ret_t do_bootcf(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[
} boot_res;
int_fast8_t verbosity = 0;
- uint8_t stages;
+ uint8_t default_stages;
uint32_t val;
(void) cmdtp; (void) flag;
/* get default values */
memcpy_P(&boot_param, cfboot, sizeof boot_param);
- stages = boot_param.stop_stage;
+ default_stages = boot_param.stages;
/* reset getopt() */
optind = 0;
@@ -152,8 +152,8 @@ command_ret_t do_bootcf(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[
verbosity++;
break;
case 'n':
- if (boot_param.stop_stage > 0)
- boot_param.stop_stage--;
+ if (boot_param.stages > 0)
+ boot_param.stages--;
break;
case 'a':
val = strtoul(optarg, NULL, 16);
@@ -185,7 +185,7 @@ command_ret_t do_bootcf(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[
printf_P(PSTR("Timeout value out of range: 0x%lX\n"), val);
return CMD_RET_FAILURE;
}
- boot_param.loadaddr = val;
+ boot_param.timeout = val;
break;
case 'i':
val = strtoul(optarg, NULL, 16);
@@ -231,11 +231,11 @@ command_ret_t do_bootcf(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[
cfboot_address[0], sizeof boot_param);
z80_bus_cmd(Release);
- if (boot_param.stop_stage == 0) {
+ if (boot_param.stages == 0) {
printf_P(PSTR("Bootloader loaded at: 0x%.4X\n"), (uint16_t) cfboot_address[0]);
} else {
printf_P(PSTR("Executing %d of %d Bootloader stages...\n"),
- boot_param.stop_stage, stages);
+ boot_param.stages, default_stages);
z80_bus_cmd(Run);
z80_bus_cmd(Release);
@@ -257,12 +257,15 @@ command_ret_t do_bootcf(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[
z80_bus_cmd(Reset);
my_puts_P(PSTR("Abort\n"));
} else {
- if (boot_param.stop_stage == stages) {
+ if (boot_param.stages == default_stages &&
+ boot_res.stages == 0 &&
+ boot_res.result == 0) {
my_puts_P(PSTR("Booting...\n"));
} else {
z80_bus_cmd(Reset);
+ boot_res.stages++;
printf_P(PSTR("Bootloader stopped at stage %d, result: %d, IDE stat/error: 0x%.02x/0x%.02x\n"),
- boot_param.stop_stage - boot_res.stop_stage,
+ boot_param.stages - boot_res.stages,
boot_res.result, boot_res.ide_stat, boot_res.ide_error);
}
}
diff --git a/z180/cfboot.180 b/z180/cfboot.180
index d8c39fd..083aa4c 100644
--- a/z180/cfboot.180
+++ b/z180/cfboot.180
@@ -64,15 +64,15 @@ sec_start: db 0
sec_cnt: db 7
part_id: db PARTID_CPM
timeout: dw 10000
-stop_stage: db number_of_stages
+stages: db number_of_stages
done: db 0
result: db 0
ide_result: db 0,0
-o_part_id equ part_id - para
-o_stop_stage equ stop_stage - para
-o_done equ done - para
-o_result equ result - para
+o_part_id equ part_id - para
+o_stages equ stages - para
+o_done equ done - para
+o_result equ result - para
;-------------------------------------------------------------------------------
@@ -81,6 +81,9 @@ start:
pop ix
pop de
loop:
+ dec (ix+o_stages)
+ jp m,stop
+
pop hl
push de
push hl
@@ -91,9 +94,7 @@ continue:
exx
ld (ix+o_result),a
or a
- jr nz,stop
- dec (ix+o_stop_stage)
- jr nz,loop
+ jr z,loop
stop:
in a,(Idecmd) ;2
ld l,a ;1
@@ -133,7 +134,7 @@ part_start:
stack:
dw para
dw continue
-stages:
+stage_table:
if DO_WAIT_NBSY
dw s_wait_not_bsy
endif
@@ -145,7 +146,7 @@ stages:
dw s_find_partition
dw s_read_sectors
dw s_go
-number_of_stages equ ($-stages)/2
+number_of_stages equ ($-stage_table)/2
if DO_WAIT_NBSY
;-------------------------------------------------------------------------------