Previous 15994 Revisions Next

r3288 Thursday 18th September, 2008 at 18:04:38 UTC by Wilbert Pol
[TRS80] Added support for .cas files to the level 2 drivers.
[src/mess]mess.mak
[src/mess/drivers]trs80.c
[src/mess/formats]trs_cas.c* trs_cas.h*

src/mess/mess.mak
r3287r3288
670670   $(MESS_MACHINE)/trs80.o    \
671671   $(MESS_VIDEO)/trs80.o    \
672672   $(MESS_FORMATS)/trs_dsk.o   \
673   $(MESS_FORMATS)/trs_cas.o   \
673674   $(MESS_DRIVERS)/trs80.o
674675
675676$(MESSOBJ)/cgenie.a:   \
src/mess/formats/trs_cas.c
r0r3288
1/********************************************************************
2
3Support for TRS80 .cas cassette images
4
5********************************************************************/
6
7#include "formats/trs_cas.h"
8
9#define SILENCE   0
10#define SMPLO   -32768
11#define SMPHI   32768
12
13
14static int cas_size;
15
16
17/*******************************************************************
18   Generate one high-low cycle of sample data
19********************************************************************/
20INLINE int trs80l2_cas_cycle(INT16 *buffer, int sample_pos, int silence, int high, int low)
21{
22   int i = 0;
23
24   if ( buffer )
25   {
26      while( i < silence )
27      {
28         buffer[ sample_pos + i ] = SILENCE;
29         i++;
30      }
31      while( i < silence + high)
32      {
33         buffer[ sample_pos + i ] = SMPHI;
34         i++;
35      }
36
37      while( i < silence + high + low )
38      {
39         buffer[ sample_pos + i ] = SMPLO;
40         i++;
41      }
42   }
43   return silence + high + low;
44}
45
46
47static int trs80l2_handle_cas(INT16 *buffer, const UINT8 *casdata)
48{
49   int   data_pos, sample_count;
50
51   data_pos = 0;
52   sample_count = 0;
53
54   while( data_pos < cas_size )
55   {
56      UINT8   data = casdata[data_pos];
57      int      i;
58
59      for ( i = 0; i < 8; i++ )
60      {
61         /* Signal code */
62         sample_count += trs80l2_cas_cycle( buffer, sample_count, 33, 6, 6 );
63
64         /* Bit code */
65         if ( data & 0x80 )
66            sample_count += trs80l2_cas_cycle( buffer, sample_count, 33, 6, 6 );
67         else
68            sample_count += trs80l2_cas_cycle( buffer, sample_count, 33 + 6 + 6, 0, 0 );
69
70         data <<= 1;
71      }
72
73      data_pos++;
74   }
75   return sample_count;
76}
77
78
79/*******************************************************************
80   Generate samples for the tape image
81********************************************************************/
82static int trs80l2_cas_fill_wave(INT16 *buffer, int sample_count, UINT8 *bytes)
83{
84   return trs80l2_handle_cas( buffer, bytes );
85}
86
87
88/*******************************************************************
89   Calculate the number of samples needed for this tape image
90********************************************************************/
91static int trs80l2_cas_to_wav_size(const UINT8 *casdata, int caslen)
92{
93   cas_size = caslen;
94
95   return trs80l2_handle_cas( NULL, casdata );
96}
97
98static const struct CassetteLegacyWaveFiller trs80l2_cas_legacy_fill_wave =
99{
100   trs80l2_cas_fill_wave,               /* fill_wave */
101   -1,                              /* chunk_size */
102   0,                              /* chunk_samples */
103   trs80l2_cas_to_wav_size,            /* chunk_sample_calc */
104   44100,                           /* sample_frequency */
105   0,                              /* header_samples */
106   0                              /* trailer_samples */
107};
108
109
110static casserr_t trs80l2_cas_identify(cassette_image *cassette, struct CassetteOptions *opts)
111{
112   return cassette_legacy_identify(cassette, opts, &trs80l2_cas_legacy_fill_wave);
113}
114
115
116static casserr_t trs80l2_cas_load(cassette_image *cassette)
117{
118   return cassette_legacy_construct(cassette, &trs80l2_cas_legacy_fill_wave);
119}
120
121
122static const struct CassetteFormat trs80l2_cas_format =
123{
124   "cas",
125   trs80l2_cas_identify,
126   trs80l2_cas_load,
127   NULL
128};
129
130
131CASSETTE_FORMATLIST_START(trs80l2_cassette_formats)
132   CASSETTE_FORMAT(trs80l2_cas_format)
133CASSETTE_FORMATLIST_END
134
src/mess/formats/trs_cas.h
r0r3288
1/*********************************************************************
2
3    trs_cas.h
4
5    Format code for TRS80 (level 2) casette files.
6
7*********************************************************************/
8
9#ifndef __TRS_CAS_H
10#define __TRS_CAS_H
11
12#include "formats/cassimg.h"
13
14CASSETTE_FORMATLIST_EXTERN(trs80l2_cassette_formats);
15
16#endif /* __TRS_CAS_H */
17
src/mess/drivers/trs80.c
r3287r3288
8888/* Devices */
8989#include "devices/basicdsk.h"
9090#include "devices/cassette.h"
91#include "formats/trs_cas.h"
9192
9293
9394#define FW   TRS80_FONT_W
r3287r3288
369370   speaker_levels   /* optional: level lookup table */
370371};
371372
373static const cassette_config trs80l2_cassette_config =
374{
375   trs80l2_cassette_formats,
376   NULL,
377   CASSETTE_PLAY
378};
372379
373380static MACHINE_DRIVER_START( level1 )
374381   /* basic machine hardware */
r3287r3288
413420   MDRV_CPU_MODIFY( "main" )
414421   MDRV_CPU_PROGRAM_MAP( mem_model1, 0 )
415422   MDRV_CPU_IO_MAP( io_model1, 0 )
423
424   MDRV_CASSETTE_MODIFY( "cassette", trs80l2_cassette_config )
416425MACHINE_DRIVER_END
417426
418427
r3287r3288
422431   MDRV_CPU_PROGRAM_MAP( mem_model3, 0 )
423432   MDRV_CPU_IO_MAP( io_model3, 0 )
424433   MDRV_CPU_VBLANK_INT_HACK(trs80_frame_interrupt, 2)
434
435   MDRV_CASSETTE_MODIFY( "cassette", trs80l2_cassette_config )
425436MACHINE_DRIVER_END
426437
427438static MACHINE_DRIVER_START( ht1080z )

Previous 15994 Revisions Next


© 1998-2018 The MESS Team