/BR1/ASM80/MISC/W_MOA.CPP
https://gitlab.com/Mednonogov/ZX0 · C++ · 141 lines · 117 code · 22 blank · 2 comment · 13 complexity · 0f3ff70d5bb752e01362fb593064ca52 MD5 · raw file
- /* -- Convert files from sinclair to the IBM PC -- */
- //(c) MOA
-
- #include <stdio.h>
- #include <conio.h>
- #include <string.h>
- #include <io.h>
- #include <dos.h>
- #include <bios.h>
- #include <process.h>
- #include <fcntl.h>
- #include <sys\stat.h>
-
- #define DOR 0x3F2 /* disk output reg. */
- #define MSR 0x3F4 /* master state reg. */
- #define DR 0x3F5 /* data reg. */
- #define DIR 0x3F7 /* disk input reg. */
- #define CCR 0x3F7 /* data transfer rate */
-
- void main (int argc,char * argv[])
- {
- struct catalog
- {
- char name [8];
- char type ;
- char begin [2];
- char size [2];
- char sectors;
- char beg_sec;
- char beg_trk;
- }
- cat [128];
- int err_code,i,j,seg_dpt,off_dpt,old_sec_typ,sector,track,head,ci;
- char bufer[256],fname[15],DRIVE;
- FILE *file_wr;
-
- if(argc!=2)
- {
- printf("\n TR DOS to IBM PC converter");
- printf("\n Usage: convert [drive], where drive = A,B");
- printf("\n Disk must be formated with ADS !");
- printf("\n Disable all residents at int 13h !\n");
- exit(0);
- }
- DRIVE=((*argv[1])&1)^1;
- off_dpt=peek (0,0x78);
- seg_dpt=peek (0,0x7A);
- old_sec_typ=peek (seg_dpt,off_dpt+3);
-
- pokeb (seg_dpt,off_dpt+3,1); /* 256 bytes sector */
- pokeb (seg_dpt,off_dpt+4,16); /* 16 sectors track */
-
-
- outportb (CCR,0x01);
- delay(500);
- err_code = biosdisk (2,DRIVE,0,0,1,8,cat);
-
-
- if (err_code != 0)
- {
- printf ("\nError catalog - code %d\n",err_code);
- goto err_end;
- }
-
- printf ("\n file begin size sec 1sec 1trk\n");
-
- for (i=0;i<128;i++)
- {
- if (cat[i].name[0]==0) break;
- if (cat[i].name[0]==1) continue;
-
- printf (" ");
- printf ("%.8s",cat[i].name);
- printf (".%c ",cat[i].type);
- printf (" %4X %4X %2X",cat[i].begin[0]+cat[i].begin[1]*256,
- cat[i].size[0]+cat[i].size[1]*256,cat[i].sectors);
- printf (" %2X %2X\n",cat[i].beg_sec+1,cat[i].beg_trk);
-
- strncpy (fname,cat[i].name,8);
- fname[8]='.';
- fname[9]=cat[i].type;
- fname[10]=0;
- for(ci=0;ci!=8;ci++)
- {
- switch(fname[ci])
- {
- case '.' : fname[ci]='^';break;
- case '+' : fname[ci]='p';break;
- case '-' : fname[ci]='m';break;
- case ' ' : fname[ci]='_';break;
- case '/' : fname[ci]='%';break;
- case '\\': fname[ci]='%';break;
- }
- }
- file_wr=fopen(fname,"wb");
-
- if(file_wr==NULL)
- {
- perror ("Unable to create file");
- goto err_end ;
- }
-
- sector= cat[i].beg_sec+1;
- track = cat[i].beg_trk/2;
- head = cat[i].beg_trk%2;
-
- for (j=0;j<cat[i].sectors;j++)
- {
- loop_read:
- err_code = biosdisk (2,DRIVE,head,track,sector,1,bufer);
- if((err_code&0xFF00)!=0)
- {
- printf("\n Read Error !");
- goto loop_read;
- }
- fwrite (bufer,1,256,file_wr);
-
- sector++;
-
- if (sector>16)
- {
- sector=1;
- head++;
- if (head>1)
- {
- head=0;
- track++;
- }
- }
- }
- fclose (file_wr);
- }
-
- printf ("\nO.K.");
-
- err_end:
-
- poke (seg_dpt,off_dpt+3,old_sec_typ);
- biosdisk(0,DRIVE,0,0,0,0,NULL);
-
- }