]>
cloudbase.mooo.com Git - z180-stamp.git/blob - avr/cmd_loadcpm3.c
2 * (C) Copyright 2015 Leo C. <erbl259-lmu@yahoo.de>
4 * SPDX-License-Identifier: GPL-2.0+
16 #include "con-utils.h"
21 #define RS 128 /* CP/M record size */
26 * Input: addr = Page Address of load top
27 * len = Length in pages of module to read
30 int load(FIL
*File
, uint16_t addr
, uint8_t len
)
33 unsigned int br
; /* bytes read */
36 len
*= 2; /* length in records of module */
37 //debug("## load: addr: 0x%.4X, records: 0x%.4X, (%u)\n", addr, len, len);
41 res
= f_read(File
, buffer
, RS
, &br
);
42 if (res
|| br
!= RS
) {
46 if (!(z80_bus_cmd(Request
) & ZST_ACQUIRED
)) {
47 my_puts_P(PSTR("Bus timeout\n"));
50 z80_write_block(buffer
, addr
, RS
);
52 //debug("## written: 0x%.4X\n", addr);
59 command_ret_t
do_loadcpm3(cmd_tbl_t
*cmdtp
, int flag
, int argc
, char * const argv
[])
65 uint16_t osentry_adr
= 0;
70 char default_fname
[] = CONFIG_PATH_CPM3SYS
;
71 unsigned int br
; /* bytes read */
75 (void) cmdtp
; (void) flag
;
79 offset
= strtoul(argv
[1], NULL
, 16);
81 fname
= getenv(PSTR(ENV_PATH_CPM3SYS
));
87 if (fname
== NULL
|| *fname
== '\0')
88 fname
= default_fname
;
90 res
= f_mount(&FatFs
, fname
, 0);
92 res
= f_open(&File
, fname
, FA_READ
);
94 printf_P(PSTR("Error: failed to open '%s'\n"), fname
);
95 f_mount(NULL
, fname
, 0);
96 return CMD_RET_FAILURE
;
99 printf_P(PSTR("Loading: '%s'...\n"), fname
);
101 /* read the load record */
102 res
= f_read(&File
, buffer
, RS
, &br
);
106 mem_top
= buffer
[0] << 8;
108 bank_top
= buffer
[2] << 8;
109 bank_len
= buffer
[3];
110 osentry_adr
= buffer
[4] + (buffer
[5] << 8);
112 /* read display info */
113 res
= f_read(&File
, buffer
, RS
, &br
);
119 uint8_t *p
= memchr(buffer
, '$', RS
);
121 my_puts((char *)buffer
);
123 /* Main System Load */
125 /* Load Common Portion of System */
126 if ((res
= load(&File
, mem_top
, res_len
)) != 0)
129 /* Load Banked Portion of System */
130 res
= load(&File
, bank_top
, bank_len
);
134 f_mount(NULL
, fname
, 0);
137 printf_P(PSTR("Error: failed to read '%s'\n"), fname
);
138 return CMD_RET_FAILURE
;
141 setenv_hex(PSTR(ENV_STARTADDRESS
), osentry_adr
);
142 printf_P(PSTR("Loaded: Resident: "));
144 printf_P(PSTR("0x%.4X-0x%.4X, "), mem_top
-res_len
*256, mem_top
-1);
146 printf_P(PSTR(" - "));
147 printf_P(PSTR("Banked: "));
149 printf_P(PSTR("0x%.4X-0x%.4X\n"), bank_top
-bank_len
*256, bank_top
-1);
151 printf_P(PSTR(" - \n"));
153 return CMD_RET_SUCCESS
;