/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

  1. /* -- Convert files from sinclair to the IBM PC -- */
  2. //(c) MOA
  3. #include <stdio.h>
  4. #include <conio.h>
  5. #include <string.h>
  6. #include <io.h>
  7. #include <dos.h>
  8. #include <bios.h>
  9. #include <process.h>
  10. #include <fcntl.h>
  11. #include <sys\stat.h>
  12. #define DOR 0x3F2 /* disk output reg. */
  13. #define MSR 0x3F4 /* master state reg. */
  14. #define DR 0x3F5 /* data reg. */
  15. #define DIR 0x3F7 /* disk input reg. */
  16. #define CCR 0x3F7 /* data transfer rate */
  17. void main (int argc,char * argv[])
  18. {
  19. struct catalog
  20. {
  21. char name [8];
  22. char type ;
  23. char begin [2];
  24. char size [2];
  25. char sectors;
  26. char beg_sec;
  27. char beg_trk;
  28. }
  29. cat [128];
  30. int err_code,i,j,seg_dpt,off_dpt,old_sec_typ,sector,track,head,ci;
  31. char bufer[256],fname[15],DRIVE;
  32. FILE *file_wr;
  33. if(argc!=2)
  34. {
  35. printf("\n TR DOS to IBM PC converter");
  36. printf("\n Usage: convert [drive], where drive = A,B");
  37. printf("\n Disk must be formated with ADS !");
  38. printf("\n Disable all residents at int 13h !\n");
  39. exit(0);
  40. }
  41. DRIVE=((*argv[1])&1)^1;
  42. off_dpt=peek (0,0x78);
  43. seg_dpt=peek (0,0x7A);
  44. old_sec_typ=peek (seg_dpt,off_dpt+3);
  45. pokeb (seg_dpt,off_dpt+3,1); /* 256 bytes sector */
  46. pokeb (seg_dpt,off_dpt+4,16); /* 16 sectors track */
  47. outportb (CCR,0x01);
  48. delay(500);
  49. err_code = biosdisk (2,DRIVE,0,0,1,8,cat);
  50. if (err_code != 0)
  51. {
  52. printf ("\nError catalog - code %d\n",err_code);
  53. goto err_end;
  54. }
  55. printf ("\n file begin size sec 1sec 1trk\n");
  56. for (i=0;i<128;i++)
  57. {
  58. if (cat[i].name[0]==0) break;
  59. if (cat[i].name[0]==1) continue;
  60. printf (" ");
  61. printf ("%.8s",cat[i].name);
  62. printf (".%c ",cat[i].type);
  63. printf (" %4X %4X %2X",cat[i].begin[0]+cat[i].begin[1]*256,
  64. cat[i].size[0]+cat[i].size[1]*256,cat[i].sectors);
  65. printf (" %2X %2X\n",cat[i].beg_sec+1,cat[i].beg_trk);
  66. strncpy (fname,cat[i].name,8);
  67. fname[8]='.';
  68. fname[9]=cat[i].type;
  69. fname[10]=0;
  70. for(ci=0;ci!=8;ci++)
  71. {
  72. switch(fname[ci])
  73. {
  74. case '.' : fname[ci]='^';break;
  75. case '+' : fname[ci]='p';break;
  76. case '-' : fname[ci]='m';break;
  77. case ' ' : fname[ci]='_';break;
  78. case '/' : fname[ci]='%';break;
  79. case '\\': fname[ci]='%';break;
  80. }
  81. }
  82. file_wr=fopen(fname,"wb");
  83. if(file_wr==NULL)
  84. {
  85. perror ("Unable to create file");
  86. goto err_end ;
  87. }
  88. sector= cat[i].beg_sec+1;
  89. track = cat[i].beg_trk/2;
  90. head = cat[i].beg_trk%2;
  91. for (j=0;j<cat[i].sectors;j++)
  92. {
  93. loop_read:
  94. err_code = biosdisk (2,DRIVE,head,track,sector,1,bufer);
  95. if((err_code&0xFF00)!=0)
  96. {
  97. printf("\n Read Error !");
  98. goto loop_read;
  99. }
  100. fwrite (bufer,1,256,file_wr);
  101. sector++;
  102. if (sector>16)
  103. {
  104. sector=1;
  105. head++;
  106. if (head>1)
  107. {
  108. head=0;
  109. track++;
  110. }
  111. }
  112. }
  113. fclose (file_wr);
  114. }
  115. printf ("\nO.K.");
  116. err_end:
  117. poke (seg_dpt,off_dpt+3,old_sec_typ);
  118. biosdisk(0,DRIVE,0,0,0,0,NULL);
  119. }