src/mess/devices/z80bin.c
| r1994 | r1995 | |
| 7 | 7 | |
| 8 | 8 | NOTE: INIT_FAIL == 1, INIT_PASS == 0, EOF == 0xffffffff |
| 9 | 9 | |
| 10 | | The return_code consists of start_addr | end_addr | exec_addr | status. |
| 11 | | Status: 0 = good data, 1 = corrupted quickload file. |
| 10 | Return status: 0 = good data, 1 = corrupted quickload file. |
| 12 | 11 | |
| 13 | 12 | *********************************************************************/ |
| 14 | 13 | |
| r1994 | r1995 | |
| 17 | 16 | #include "z80bin.h" |
| 18 | 17 | #include "snapquik.h" |
| 19 | 18 | |
| 20 | | UINT64 z80bin_load_file( running_machine *machine, mess_image *image, const char *file_type ) |
| 19 | |
| 20 | int z80bin_load_file( running_machine *machine, mess_image *image, const char *file_type, UINT16 *exec_addr, UINT16 *start_addr, UINT16 *end_addr ) |
| 21 | 21 | { |
| 22 | 22 | int ch; |
| 23 | 23 | UINT16 args[3]; |
| 24 | 24 | UINT16 i=0, j, size; |
| 25 | | UINT64 start_addr, exec_addr, end_addr; /* need to be this size for return at end */ |
| 26 | 25 | UINT8 data; |
| 27 | 26 | char * pgmname; |
| 28 | 27 | pgmname = (char *) malloc(256); |
| r1994 | r1995 | |
| 54 | 53 | return INIT_FAIL; |
| 55 | 54 | } |
| 56 | 55 | |
| 57 | | exec_addr = LITTLE_ENDIANIZE_INT16(args[0]); |
| 58 | | start_addr = LITTLE_ENDIANIZE_INT16(args[1]); |
| 59 | | end_addr = LITTLE_ENDIANIZE_INT16(args[2]); |
| 56 | exec_addr[0] = LITTLE_ENDIANIZE_INT16(args[0]); |
| 57 | start_addr[0] = LITTLE_ENDIANIZE_INT16(args[1]); |
| 58 | end_addr[0] = LITTLE_ENDIANIZE_INT16(args[2]); |
| 60 | 59 | |
| 61 | | size = (end_addr - start_addr + 1) & 0xffff; |
| 60 | size = (end_addr[0] - start_addr[0] + 1) & 0xffff; |
| 62 | 61 | |
| 63 | | popmessage("%s\nsize=%04X : start=%04X : end=%04X : exec=%04X",pgmname,size,(int)start_addr,(int)end_addr,(int)exec_addr); |
| 62 | popmessage("%s\nsize=%04X : start=%04X : end=%04X : exec=%04X",pgmname,size,start_addr[0],end_addr[0],exec_addr[0]); |
| 64 | 63 | |
| 65 | 64 | for (i = 0; i < size; i++) |
| 66 | 65 | { |
| 67 | | j = (start_addr + i) & 0xffff; |
| 66 | j = (start_addr[0] + i) & 0xffff; |
| 68 | 67 | if (image_fread(image, &data, 1) != 1) |
| 69 | 68 | { |
| 70 | 69 | ui_popup_time(10,"QUICKLOAD: %s\nUnexpected EOF while writing byte to %04X",pgmname,j); |
| r1994 | r1995 | |
| 76 | 75 | |
| 77 | 76 | free(pgmname); |
| 78 | 77 | |
| 79 | | return (start_addr << 48) | (end_addr << 32) | (exec_addr << 16); |
| 78 | return INIT_PASS; |
| 80 | 79 | } |
| 81 | 80 | |
| 81 | |
| 82 | 82 | static QUICKLOAD_LOAD( z80bin ) |
| 83 | 83 | { |
| 84 | | UINT16 exec_addr; |
| 85 | | UINT64 return_info = z80bin_load_file( machine, image, file_type ); /* load file */ |
| 86 | | if (return_info == INIT_FAIL) return INIT_FAIL; /* failure */ |
| 87 | | exec_addr = (return_info & 0xffff0000) >> 16; /* get program run address */ |
| 84 | UINT16 exec_addr, start_addr, end_addr; |
| 85 | |
| 86 | if (z80bin_load_file( machine, image, file_type, &exec_addr, &start_addr, &end_addr ) == INIT_FAIL) |
| 87 | return INIT_FAIL; |
| 88 | |
| 88 | 89 | if (exec_addr == 0xffff) return INIT_PASS; /* non-executable data file */ |
| 89 | 90 | cpunum_set_reg(0, REG_PC, exec_addr); /* start program */ |
| 90 | 91 | return INIT_PASS; |
| 91 | 92 | } |
| 92 | 93 | |
| 93 | 94 | |
| 94 | | |
| 95 | 95 | void z80bin_quickload_getinfo(const mess_device_class *devclass, UINT32 state, union devinfo *info) |
| 96 | 96 | { |
| 97 | 97 | /* quickload */ |
src/mess/drivers/mbee.c
| r1994 | r1995 | |
| 435 | 435 | static QUICKLOAD_LOAD( mbee ) |
| 436 | 436 | { |
| 437 | 437 | UINT8 sw = readinputportbytag("CONFIG") & 1; /* reading the dipswitch: 1 = autorun */ |
| 438 | | UINT16 exec_addr; |
| 439 | | UINT64 return_info = z80bin_load_file( machine, image, file_type ); /* load file */ |
| 438 | UINT16 exec_addr, start_addr, end_addr; |
| 440 | 439 | |
| 441 | | if (return_info == INIT_FAIL) return INIT_FAIL; /* failure */ |
| 440 | if (z80bin_load_file( machine, image, file_type, &exec_addr, &start_addr, &end_addr ) == INIT_FAIL) |
| 441 | return INIT_FAIL; |
| 442 | 442 | |
| 443 | | exec_addr = (return_info & 0xffff0000) >> 16; /* get program run address */ |
| 444 | | |
| 445 | 443 | if (exec_addr == 0xffff) return INIT_PASS; /* data file */ |
| 446 | 444 | |
| 447 | 445 | program_write_word_16le(0xa6,exec_addr); /* fix the EXEC command */ |
src/mess/drivers/super80.c
| r1994 | r1995 | |
| 981 | 981 | static QUICKLOAD_LOAD( super80 ) |
| 982 | 982 | { |
| 983 | 983 | UINT8 sw = readinputportbytag("CONFIG") & 1; /* reading the dipswitch: 1 = autorun */ |
| 984 | | UINT16 exec_addr; |
| 985 | | UINT64 return_info = z80bin_load_file( machine, image, file_type ); /* load file */ |
| 984 | UINT16 exec_addr, start_addr, end_addr; |
| 986 | 985 | |
| 987 | | if (return_info == INIT_FAIL) return INIT_FAIL; /* failure */ |
| 986 | if (z80bin_load_file( machine, image, file_type, &exec_addr, &start_addr, &end_addr ) == INIT_FAIL) |
| 987 | return INIT_FAIL; |
| 988 | 988 | |
| 989 | | exec_addr = (return_info & 0xffff0000) >> 16; /* get program run address */ |
| 990 | | |
| 991 | 989 | if ((exec_addr != 0xffff) && (sw)) |
| 992 | 990 | cpunum_set_reg(0, REG_PC, exec_addr); |
| 993 | 991 | |