55//
66
77#include <errno.h>
8+ #include <input.h>
89#include <stdbool.h>
910#include <stdio.h>
1011#include <stdlib.h>
2526
2627static unsigned char old_cpu_speed ;
2728static bool browser = false;
29+ static unsigned char fhi ,fho = 0 ;
30+ static char * mem = NULL ;
2831
2932static uint32_t Get2 (char * mem ) { return (mem [0 ]+ (mem [1 ]* 256UL )); }
3033static uint32_t Get3 (char * mem ) { return (mem [0 ]+ (mem [1 ]* 256UL )+ (mem [2 ]* 256UL * 256UL )); }
3134static uint32_t Get4 (char * mem ) { return (mem [0 ]+ (mem [1 ]* 256UL )+ (mem [2 ]* 256UL * 256UL )+ (mem [3 ]* 256UL * 256UL * 256UL )); }
3235
36+ static unsigned char err_break [] = "D BREAK - no repea" "\xf4" ;
37+
38+ static void user_break (void )
39+ {
40+ if (in_key_pressed (IN_KEY_SCANCODE_SPACE | 0x8000 )) // CAPS+SPACE
41+ exit ((int )err_break );
42+ }
43+
44+
3345// exits with an error message *errstr
3446static int Err (char * errstr , bool browser )
3547{
@@ -110,11 +122,17 @@ static int convert_data(unsigned char fhi, unsigned char fho, uint32_t posn, uin
110122 return 0 ;
111123}
112124
125+ static void cleanup (void )
126+ {
127+ if (fhi ) esx_f_close (fhi );
128+ if (fho ) esx_f_close (fho );
129+ if (mem ) free (mem );
130+ ZXN_NEXTREGA (REG_TURBO_MODE , old_cpu_speed );
131+ }
132+
113133int main (int argc , char * argv [])
114134{
115- unsigned char fhi ,fho = 0 ;
116135 uint32_t flen ;
117- char * mem = NULL ;
118136 char buf [256 ];
119137 uint32_t pos = 10 , p , oldpos = 0 ;
120138 uint32_t len ;
@@ -191,12 +209,13 @@ int main(int argc, char *argv[])
191209 old_cpu_speed = ZXN_READ_REG (REG_TURBO_MODE );
192210 ZXN_NEXTREG (REG_TURBO_MODE , RTM_28MHZ );
193211
212+ atexit (cleanup );
213+
194214 errno = 0 ;
195215 fhi = esx_f_open (src , ESX_MODE_READ );
196216
197217 if (errno ) {
198- err = errno ;
199- goto end ;
218+ exit (errno );
200219 }
201220
202221 if (!list ) {
@@ -207,40 +226,37 @@ int main(int argc, char *argv[])
207226 if (errno == ESX_EEXIST ) {
208227 if (!browser ) printf ("\nFile already converted?" );
209228 err = Err ("File exists" , browser ); //ERRB_4_OUT_OF_MEMORY
210- goto end ;
229+ exit ( ERRB_4_OUT_OF_MEMORY ) ;
211230 } else {
212- err = errno ;
213- goto end ;
231+ exit (errno );
214232 }
215233 }
216234 }
217235
218236 flen = FileLength (fhi );
219237 if (flen == 0 ) {
220- err = errno ;
221- goto end ;
238+ exit (errno );
222239 }
223240
224241 mem = (char * ) malloc (MAX_HEADER_SIZE );
225242
226243 if (mem == NULL ) {
227244 err = Err ("Out of memory" , browser ); //ERRB_4_OUT_OF_MEMORY
228- goto end ;
245+ exit ( ERRB_4_OUT_OF_MEMORY ) ;
229246 }
230247
231248 esx_f_read (fhi ,mem ,10 ); mem [7 ]= 0 ;
232249
233250 if (strcmp (mem ,"ZXTape!" )) {
234- err = ESX_EWRTYPE ;
235- goto end ;
251+ exit ( ESX_EWRTYPE ) ;
252+
236253 }
237254
238255 if (!browser ) printf ("\nZXTape file revision %d.%02d\n" ,mem [8 ],mem [9 ]);
239256
240257 if (!mem [8 ]) {
241258 if (!browser ) printf ("Error: TZX dev ver not supported\n" );
242- err = ESX_EWRTYPE ;
243- goto end ;
259+ exit (ESX_EWRTYPE );
244260 }
245261
246262 if (mem [8 ]> MAJREV )
@@ -258,6 +274,7 @@ int main(int argc, char *argv[])
258274 }
259275
260276 while (pos < flen ) {
277+ user_break ();
261278 start = read_file (fhi , mem , pos );
262279 pos ++ ;
263280 p = pos - start ;
@@ -279,13 +296,11 @@ int main(int argc, char *argv[])
279296 if (!list ) {
280297 err = convert_data (fhi , fho , pos + 0x02 , 2 );
281298 if (err ) {
282- err = 0 ;
283- goto end ;
299+ exit (0 );
284300 }
285301 err = convert_data (fhi , fho , pos + 0x04 , len );
286302 if (err ) {
287- err = 0 ;
288- goto end ;
303+ exit (0 );
289304 }
290305 }
291306 if (verbose ) {
@@ -304,13 +319,11 @@ int main(int argc, char *argv[])
304319 if (!list ) {
305320 err = convert_data (fhi , fho , pos + 0x0F , 2 );
306321 if (err ) {
307- err = 0 ;
308- goto end ;
322+ exit (0 );
309323 }
310324 err = convert_data (fhi , fho , pos + 0x12 , len );
311325 if (err ) {
312- err = 0 ;
313- goto end ;
326+ exit (0 );
314327 }
315328 }
316329 if (verbose ) converted = 2 ;
@@ -337,13 +350,11 @@ int main(int argc, char *argv[])
337350 if (!list ) {
338351 err = convert_data (fhi , fho , pos + 0x07 , 2 );
339352 if (err ) {
340- err = 0 ;
341- goto end ;
353+ exit (0 );
342354 }
343355 err = convert_data (fhi , fho , pos + 0x0A , len );
344356 if (err ) {
345- err = 0 ;
346- goto end ;
357+ exit (0 );
347358 }
348359 }
349360 if (verbose ) converted = 2 ;
@@ -501,10 +512,5 @@ int main(int argc, char *argv[])
501512 }
502513 }
503514
504- end :
505- if (fhi ) esx_f_close (fhi );
506- if (fho ) esx_f_close (fho );
507- if (mem ) free (mem );
508- ZXN_NEXTREGA (REG_TURBO_MODE , old_cpu_speed );
509- return err ;
515+ exit (0 );
510516}
0 commit comments