src/mess/machine/trs80.c
| r7642 | r7643 | |
| 103 | 103 | } |
| 104 | 104 | |
| 105 | 105 | |
| 106 | | QUICKLOAD_LOAD( trs80_cmd ) |
| 107 | | { |
| 108 | | const address_space *space = cputag_get_address_space(image->machine, "maincpu", ADDRESS_SPACE_PROGRAM); |
| 109 | | UINT16 entry = 0, block_ofs = 0, block_len = 0; |
| 110 | | unsigned offs = 0; |
| 111 | | UINT8 *cmd_buff; |
| 112 | | |
| 113 | | cmd_buff = (UINT8 *)malloc(quickload_size); |
| 114 | | if (!cmd_buff) |
| 115 | | return INIT_FAIL; |
| 116 | | |
| 117 | | while( quickload_size > 3 ) |
| 118 | | { |
| 119 | | UINT8 data = cmd_buff[offs++]; |
| 120 | | |
| 121 | | switch( data ) { |
| 122 | | case 0x01: /* CMD file header */ |
| 123 | | case 0x07: /* another type of CMD file header */ |
| 124 | | block_len = cmd_buff[offs++]; |
| 125 | | /* on CMD files size=zero means size 256 */ |
| 126 | | if( block_len == 0 ) |
| 127 | | block_len += 256; |
| 128 | | block_ofs = cmd_buff[offs++]; |
| 129 | | block_ofs += 256 * cmd_buff[offs++]; |
| 130 | | block_len -= 2; |
| 131 | | if( block_len == 0 ) |
| 132 | | block_len = 256; |
| 133 | | quickload_size -= 4; |
| 134 | | LOG(("trs80_cmd_load block ($%02X) %d at $%04X\n", data, block_len, block_ofs)); |
| 135 | | while( block_len && quickload_size ) |
| 136 | | { |
| 137 | | memory_write_byte(space, block_ofs, cmd_buff[offs]); |
| 138 | | offs++; |
| 139 | | block_ofs++; |
| 140 | | block_len--; |
| 141 | | quickload_size--; |
| 142 | | } |
| 143 | | break; |
| 144 | | case 0x02: |
| 145 | | block_len = cmd_buff[offs++]; |
| 146 | | quickload_size -= 1; |
| 147 | | if (entry == 0) |
| 148 | | { |
| 149 | | entry = cmd_buff[offs++]; |
| 150 | | entry += 256 * cmd_buff[offs++]; |
| 151 | | LOG(("trs80_cmd_load entry ($%02X) at $%04X\n", data, entry)); |
| 152 | | } |
| 153 | | else |
| 154 | | { |
| 155 | | UINT16 temp; |
| 156 | | temp = cmd_buff[offs++]; |
| 157 | | temp += 256 * cmd_buff[offs++]; |
| 158 | | LOG(("trs80_cmd_load 2nd entry ($%02X) at $%04X ignored\n", data, temp)); |
| 159 | | } |
| 160 | | quickload_size -= 3; |
| 161 | | break; |
| 162 | | default: |
| 163 | | quickload_size--; |
| 164 | | } |
| 165 | | } |
| 166 | | cpu_set_reg(devtag_get_device(image->machine, "maincpu"), Z80_PC, entry); |
| 167 | | |
| 168 | | free(cmd_buff); |
| 169 | | return INIT_PASS; |
| 170 | | } |
| 171 | | |
| 172 | 106 | /************************************* |
| 173 | 107 | * |
| 174 | 108 | * Port handlers. |
src/mess/formats/trs_cmd.c
| r0 | r7643 | |
| 1 | /********************************************************************* |
| 2 | |
| 3 | formats/trs_cmd.c |
| 4 | |
| 5 | Quickload code for TRS-80 /CMD files |
| 6 | |
| 7 | *********************************************************************/ |
| 8 | |
| 9 | #include "emu.h" |
| 10 | #include "formats/trs_cmd.h" |
| 11 | #include "cpu/z80/z80.h" |
| 12 | |
| 13 | /*************************************************************************** |
| 14 | PARAMETERS |
| 15 | ***************************************************************************/ |
| 16 | |
| 17 | #define LOG 1 |
| 18 | |
| 19 | #define CMD_TYPE_OBJECT_CODE 0x01 |
| 20 | #define CMD_TYPE_TRANSFER_ADDRESS 0x02 |
| 21 | #define CMD_TYPE_END_OF_PARTITIONED_DATA_SET_MEMBER 0x04 |
| 22 | #define CMD_TYPE_LOAD_MODULE_HEADER 0x05 |
| 23 | #define CMD_TYPE_PARTITIONED_DATA_SET_HEADER 0x06 |
| 24 | #define CMD_TYPE_PATCH_NAME_HEADER 0x07 |
| 25 | #define CMD_TYPE_ISAM_DIRECTORY_ENTRY 0x08 |
| 26 | #define CMD_TYPE_END_OF_ISAM_DIRECTORY_ENTRY 0x0a |
| 27 | #define CMD_TYPE_PDS_DIRECTORY_ENTRY 0x0c |
| 28 | #define CMD_TYPE_END_OF_PDS_DIRECTORY_ENTRY 0x0e |
| 29 | #define CMD_TYPE_YANKED_LOAD_BLOCK 0x10 |
| 30 | #define CMD_TYPE_COPYRIGHT_BLOCK 0x1f |
| 31 | |
| 32 | /*************************************************************************** |
| 33 | IMPLEMENTATION |
| 34 | ***************************************************************************/ |
| 35 | |
| 36 | QUICKLOAD_LOAD( trs80_cmd ) |
| 37 | { |
| 38 | const address_space *program = cpu_get_address_space(image->machine->firstcpu, ADDRESS_SPACE_PROGRAM); |
| 39 | |
| 40 | UINT8 type, length; |
| 41 | UINT8 data[0x100]; |
| 42 | UINT8 addr[2]; |
| 43 | void *ptr; |
| 44 | |
| 45 | while (!image_feof(image)) |
| 46 | { |
| 47 | image_fread(image, &type, 1); |
| 48 | image_fread(image, &length, 1); |
| 49 | |
| 50 | length -= 2; |
| 51 | int block_length = length ? length : 256; |
| 52 | |
| 53 | switch (type) |
| 54 | { |
| 55 | case CMD_TYPE_OBJECT_CODE: |
| 56 | { |
| 57 | image_fread(image, &addr, 2); |
| 58 | UINT16 address = (addr[1] << 8) | addr[0]; |
| 59 | if (LOG) logerror("/CMD object code block: address %04x length %u\n", address, block_length); |
| 60 | ptr = memory_get_write_ptr(program, address); |
| 61 | image_fread(image, ptr, block_length); |
| 62 | } |
| 63 | break; |
| 64 | |
| 65 | case CMD_TYPE_TRANSFER_ADDRESS: |
| 66 | { |
| 67 | image_fread(image, &addr, 2); |
| 68 | UINT16 address = (addr[1] << 8) | addr[0]; |
| 69 | if (LOG) logerror("/CMD transfer address %04x\n", address); |
| 70 | cpu_set_reg(image->machine->firstcpu, Z80_PC, address); |
| 71 | } |
| 72 | break; |
| 73 | |
| 74 | case CMD_TYPE_LOAD_MODULE_HEADER: |
| 75 | image_fread(image, &data, block_length); |
| 76 | if (LOG) logerror("/CMD load module header '%s'\n", data); |
| 77 | break; |
| 78 | |
| 79 | case CMD_TYPE_COPYRIGHT_BLOCK: |
| 80 | image_fread(image, &data, block_length); |
| 81 | if (LOG) logerror("/CMD copyright block '%s'\n", data); |
| 82 | break; |
| 83 | |
| 84 | default: |
| 85 | image_fread(image, &data, block_length); |
| 86 | logerror("/CMD unsupported block type %u!\n", type); |
| 87 | } |
| 88 | } |
| 89 | |
| 90 | return INIT_PASS; |
| 91 | } |