Previous 15994 Revisions Next

r7643 Friday 26th March, 2010 at 09:47:17 UTC by Curt Coder
[TRS80] Moved /CMD quickload to formats.
[src/mess]mess.mak
[src/mess/drivers]trs80.c
[src/mess/formats]trs_cmd.c* trs_cmd.h*
[src/mess/includes]trs80.h
[src/mess/machine]trs80.c

src/mess/includes/trs80.h
r7642r7643
2424extern const wd17xx_interface trs80_wd17xx_interface;
2525extern UINT8 trs80_mode;
2626
27QUICKLOAD_LOAD( trs80_cmd );
28
2927MACHINE_START( trs80 );
3028MACHINE_RESET( trs80 );
3129MACHINE_RESET( trs80m4 );
src/mess/machine/trs80.c
r7642r7643
103103}
104104
105105
106QUICKLOAD_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
172106/*************************************
173107 *
174108 *              Port handlers.
src/mess/formats/trs_cmd.h
r0r7643
1/*********************************************************************
2
3    formats/trs_cmd.h
4
5    Quickload code for TRS-80 /CMD files
6
7*********************************************************************/
8
9#pragma once
10
11#ifndef __TRS_CMD__
12#define __TRS_CMD__
13
14#include "emu.h"
15#include "devices/snapquik.h"
16
17QUICKLOAD_LOAD( trs80_cmd );
18
19#endif
src/mess/formats/trs_cmd.c
r0r7643
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
36QUICKLOAD_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}
src/mess/mess.mak
r7642r7643
15031503   $(MESS_VIDEO)/trs80.o      \
15041504   $(MESS_FORMATS)/trs_dsk.o   \
15051505   $(MESS_FORMATS)/trs_cas.o   \
1506   $(MESS_FORMATS)/trs_cmd.o   \
15061507   $(MESS_DRIVERS)/trs80.o      \
15071508   $(MESS_DRIVERS)/trs80m2.o   \
15081509   $(MESS_VIDEO)/coco6847.o   \
src/mess/drivers/trs80.c
r7642r7643
156156#include "formats/trs_dsk.h"
157157#include "devices/cassette.h"
158158#include "formats/trs_cas.h"
159#include "formats/trs_cmd.h"
159160
160161UINT8 *trs80_gfxram;
161162UINT8 trs80_model4;

Previous 15994 Revisions Next


© 1998-2018 The MESS Team