Previous 199869 Revisions Next

r41735 Sunday 15th November, 2015 at 02:38:06 UTC by Nigel Barnes
bbc: preliminary support for FSD format.
[scripts/src]lib.lua
[src/lib/formats]fsd_dsk.cpp* fsd_dsk.h*
[src/mame/drivers]bbc.cpp

trunk/scripts/src/lib.lua
r250246r250247
261261      MAME_DIR .. "src/lib/formats/fmsx_cas.h",
262262      MAME_DIR .. "src/lib/formats/fmtowns_dsk.cpp",
263263      MAME_DIR .. "src/lib/formats/fmtowns_dsk.h",
264      MAME_DIR .. "src/lib/formats/fsd_dsk.cpp",
265      MAME_DIR .. "src/lib/formats/fsd_dsk.h",
264266      MAME_DIR .. "src/lib/formats/g64_dsk.cpp",
265267      MAME_DIR .. "src/lib/formats/g64_dsk.h",
266268      MAME_DIR .. "src/lib/formats/gtp_cas.cpp",
trunk/src/lib/formats/fsd_dsk.cpp
r0r250247
1// license:BSD-3-Clause
2// copyright-holders:Nigel Barnes
3/***************************************************************************
4
5    BBC Micro 8271 protected disk image format
6
7    Disk image format
8
9***************************************************************************/
10
11#include "emu.h"
12#include "fsd_dsk.h"
13
14
15/*********************************************************************
16
17    BBC Micro 8271 protected disk image format
18
19    Header:
20    =======
21    Identifier: "FSD"  string literal 3 bytes
22       Creator:        5 bytes; date of creation/author
23         Title:        Character string (unlimited length; may contain any but null)
24     Title_End: 0x00   byte literal 1 byte
25        Num_Tr: xx     1 byte, number of tracks
26
27    For each track
28    ==============
29       track_num: 1 byte
30         num_sec: 1 byte (00 == unformatted)
31        readable: 1 byte (00 == unreadable, ff ==readable)
32
33       If readable:
34         For each sector
35         ===============
36               Track_ID: 1 byte
37            Head_number: 1 byte
38              Sector_ID: 1 byte
39          reported_size: 1 byte (2^{7+x}; 0 ==>128, 1 ==> 256, 2==>512, 3==>1024 etc)
40              real_size: 1 byte (2^{7+x})
41             error_code: 1 byte (0==No Error, &20==Deleted Data; &0E = Data CRC Error)
42                   data: <real_size> bytes
43       Note that error_code matches the OSWORD &7F result byte
44
45       If unreadable:
46               Track_ID: 1 byte
47            Head_number: 1 byte
48              Sector_ID: 1 byte
49          reported_size: 1 byte
50
51    Decoding of the "creator" 5 byte field:
52    =======================================
53       (byte1 byte2 byte3 byte4 byte5)
54
55           Date_DD = (byte1 AND &F8)/8
56           Date_MM = (byte3 AND &0F)
57         Date_YYYY = (byte1 AND &07)*256+byte2
58        Creator_ID = (byte3 AND &F0)/16
59       Release_num = ((byte5 AND &C0)/64)*256 + byte4
60
61*********************************************************************/
62
63fsd_format::fsd_format()
64{
65}
66
67const char *fsd_format::name() const
68{
69   return "fsd";
70}
71
72const char *fsd_format::description() const
73{
74   return "BBC Micro 8271 protected disk image";
75}
76
77const char *fsd_format::extensions() const
78{
79   return "fsd";
80}
81
82bool fsd_format::supports_save() const
83{
84   return false;
85}
86
87int fsd_format::identify(io_generic *io, UINT32 form_factor)
88{
89   UINT8 h[3];
90
91   io_generic_read(io, h, 0, 3);
92   if (memcmp(h, "FSD", 3) == 0) {
93      return 100;
94   }
95   return 0;
96}
97
98bool fsd_format::load(io_generic *io, UINT32 form_factor, floppy_image *image)
99{
100   UINT64 size = io_generic_size(io);
101   dynamic_buffer img(size);
102   io_generic_read(io, &img[0], 0, size);
103
104   UINT64 pos;
105   std::string title;
106   for(pos=8; pos < size && img[pos] != NULL; pos++)
107      title += char(img[pos]);
108   pos++;
109
110   if(pos >= size)
111      return false;
112
113   //popmessage("Loading image of '%s'\n", title);
114
115   desc_pc_sector sects[10];
116   UINT8 total_tracks = img[pos++];
117   UINT8 tnum, hnum, snum, ssize, error;
118
119   hnum = 0;
120   //osd_printf_verbose("%d Tracks\n", total_tracks+1);
121   //osd_printf_verbose("Tr.#  No.S  Sec.# Tr.ID Head# SecID IDsiz REsiz Error\n");
122   for(int curr_track=0; curr_track <= total_tracks; curr_track++)
123   {
124      UINT8 track = img[pos++];
125      UINT8 spt = img[pos++];
126      //osd_printf_verbose("%x    %x\n", track, spt);
127      if (spt > 0) // formatted
128      {
129         UINT8 readable = img[pos++];
130         for (int i = 0; i < spt; i++)
131         {
132            tnum = img[pos++];  // logical track
133            hnum = img[pos++];  // head number
134            snum = img[pos++];  // logical sector
135            ssize = img[pos++]; // reported size
136            sects[i].track = tnum;
137            sects[i].head = hnum;
138            sects[i].sector = snum;
139            sects[i].size = ssize;
140            if (readable == 0xff)
141            {
142               sects[i].actual_size = 1 << (img[pos++] + 7);
143               error = img[pos++];
144               sects[i].deleted = (error & 0x20) == 0x20;
145               sects[i].bad_crc = (error & 0x0e) == 0x0e;
146               sects[i].data = &img[pos];
147               pos += sects[i].actual_size;
148               //osd_printf_verbose("Read        %x    %x    %x    %x    %x  %x  %x\n", i, sects[i].track, sects[i].head, sects[i].sector, sects[i].size, sects[i].actual_size, error);
149            }
150            else
151            {
152               throw emu_fatalerror("fsd_format: Unsupported unreadable sector on track %d sector %d head %d", track, i, hnum);
153
154               // Unreadable sectors not supported!!
155               //sects[i].track = track;
156               //sects[i].head = 0;
157               //sects[i].sector = i;
158               //sects[i].size = 0;
159               //sects[i].actual_size = 0;
160               //sects[i].deleted = false;
161               //sects[i].bad_crc = false;
162               //sects[i].data = NULL;
163               //osd_printf_verbose("Unread      %x    %x    %x    %x    %x  %x  %x\n", i, sects[i].track, sects[i].head, sects[i].sector, sects[i].size, sects[i].actual_size, 0);
164            }
165         }
166      }
167      else // unformatted
168      {
169         sects[0].track = curr_track;
170         sects[0].head = hnum;
171         sects[0].sector = 0;
172         sects[0].size = 0;
173         //osd_printf_verbose("Unform      %x    %x    %x    %x    %x  %x  %x\n", 0, sects[0].track, sects[0].head, sects[0].sector, sects[0].size, sects[0].actual_size, 0);
174      }
175      build_wd_track_fm(curr_track, hnum, image, 50000, spt, sects, 10, 40, 10);
176   }
177   return true;
178}
179
180const floppy_format_type FLOPPY_FSD_FORMAT = &floppy_image_format_creator<fsd_format>;
trunk/src/lib/formats/fsd_dsk.h
r0r250247
1// license:BSD-3-Clause
2// copyright-holders:Nigel Barnes
3/***************************************************************************
4
5    BBC Micro
6
7    Disk image formats
8
9***************************************************************************/
10
11#pragma once
12
13#ifndef __FSD_DSK_H__
14#define __FSD_DSK_H__
15
16#include "flopimg.h"
17#include "wd177x_dsk.h"
18
19/**************************************************************************/
20
21LEGACY_FLOPPY_OPTIONS_EXTERN(fsd);
22
23/**************************************************************************/
24
25
26
27class fsd_format : public floppy_image_format_t
28{
29public:
30   fsd_format();
31
32   virtual const char *name() const;
33   virtual const char *description() const;
34   virtual const char *extensions() const;
35   virtual bool supports_save() const;
36
37   virtual int identify(io_generic *io, UINT32 form_factor);
38   virtual bool load(io_generic *io, UINT32 form_factor, floppy_image *image);
39};
40
41extern const floppy_format_type FLOPPY_FSD_FORMAT;
42
43#endif // __FSD_DSK_H__
trunk/src/mame/drivers/bbc.cpp
r250246r250247
5555/* Devices */
5656#include "imagedev/flopdrv.h"
5757#include "formats/bbc_dsk.h"
58//#include "formats/fsd_dsk.h"
58#include "formats/fsd_dsk.h"
5959#include "imagedev/cassette.h"
6060#include "formats/uef_cas.h"
6161#include "formats/csw_cas.h"
r250246r250247
683683
684684FLOPPY_FORMATS_MEMBER( bbc_state::floppy_formats_bbc )
685685   FLOPPY_BBC_DFS_FORMAT,
686   FLOPPY_BBC_CPM_FORMAT
687   //FLOPPY_FSD_FORMAT
686   FLOPPY_BBC_CPM_FORMAT,
687   FLOPPY_FSD_FORMAT
688688FLOPPY_FORMATS_END
689689
690690FLOPPY_FORMATS_MEMBER( bbc_state::floppy_formats_bbcm )
691691   FLOPPY_BBC_DFS_FORMAT,
692692   FLOPPY_BBC_ADFS_FORMAT,
693693   FLOPPY_BBC_CPM_FORMAT,
694   FLOPPY_BBC_DOS_FORMAT
695   //FLOPPY_FSD_FORMAT
694   FLOPPY_BBC_DOS_FORMAT,
695   FLOPPY_FSD_FORMAT
696696FLOPPY_FORMATS_END
697697
698698FLOPPY_FORMATS_MEMBER( bbc_state::floppy_formats_bbcmc )
r250246r250247
882882   /* software lists */
883883   MCFG_SOFTWARE_LIST_ADD("cass_ls_b", "bbcb_cass")
884884   MCFG_SOFTWARE_LIST_ADD("flop_ls_b", "bbcb_flop")
885   //MCFG_SOFTWARE_LIST_ADD("flop_ls_b_orig", "bbcb_orig_flop")
885   MCFG_SOFTWARE_LIST_ADD("flop_ls_b_orig", "bbcb_orig_flop")
886886   MCFG_SOFTWARE_LIST_ADD("flop_ls_z80", "bbc_z80_flop")
887887   MCFG_SOFTWARE_LIST_ADD("flop_ls_32016", "bbc_32016_flop")
888888MACHINE_CONFIG_END
r250246r250247
978978   MCFG_SOFTWARE_LIST_REMOVE("cass_ls_a")
979979   MCFG_SOFTWARE_LIST_REMOVE("cass_ls_b")
980980   MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b")
981   //MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b_orig")
981   MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b_orig")
982982   MCFG_SOFTWARE_LIST_REMOVE("flop_ls_32016")
983983MACHINE_CONFIG_END
984984
r250246r250247
999999   MCFG_SOFTWARE_LIST_REMOVE("cass_ls_a")
10001000   MCFG_SOFTWARE_LIST_REMOVE("cass_ls_b")
10011001   MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b")
1002   //MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b_orig")
1002   MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b_orig")
10031003   MCFG_SOFTWARE_LIST_REMOVE("flop_ls_z80")
10041004MACHINE_CONFIG_END
10051005
r250246r250247
10511051   MCFG_SOFTWARE_LIST_REMOVE("cass_ls_a")
10521052   MCFG_SOFTWARE_LIST_REMOVE("cass_ls_b")
10531053   MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b")
1054   //MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b_orig")
1054   MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b_orig")
10551055   MCFG_SOFTWARE_LIST_REMOVE("flop_ls_z80")
10561056   MCFG_SOFTWARE_LIST_REMOVE("flop_ls_32016")
10571057MACHINE_CONFIG_END
r250246r250247
11401140   MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("cass_ls_a", "bbca_cass")
11411141   MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("cass_ls_b", "bbcb_cass")
11421142   MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("flop_ls_b", "bbcb_flop")
1143   //MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("flop_ls_b_orig", "bbcb_orig_flop")
1143   MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("flop_ls_b_orig", "bbcb_orig_flop")
11441144
11451145   /* acia */
11461146   MCFG_DEVICE_ADD("acia6850", ACIA6850, 0)
r250246r250247
12301230   MCFG_SOFTWARE_LIST_REMOVE("cass_ls_b")
12311231   MCFG_SOFTWARE_LIST_REMOVE("flop_ls_m")
12321232   MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b")
1233   //MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b_orig")
1233   MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b_orig")
12341234   MCFG_SOFTWARE_LIST_REMOVE("flop_ls_z80")
12351235   MCFG_SOFTWARE_LIST_REMOVE("flop_ls_32016")
12361236
r250246r250247
13011301   MCFG_SOFTWARE_LIST_REMOVE("cass_ls_b")
13021302   MCFG_SOFTWARE_LIST_REMOVE("flop_ls_m")
13031303   MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b")
1304   //MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b_orig")
1304   MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b_orig")
13051305   MCFG_SOFTWARE_LIST_REMOVE("flop_ls_z80")
13061306   MCFG_SOFTWARE_LIST_REMOVE("flop_ls_32016")
13071307   MCFG_SOFTWARE_LIST_REMOVE("cart_ls_m")


Previous 199869 Revisions Next


© 1997-2024 The MAME Team