home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / CPM / ATARI / LETRPRFT.BAS < prev    next >
BASIC Source File  |  2000-06-30  |  5KB  |  145 lines

  1. 1 REM LETTER-PERFECT FILE COPY UTIL
  2. 2 REM DAN FLEYSHER, JUNE 1984
  3. 3 REM 
  4. 4 REM THIS BASIC PROGRAM ACCESSES
  5. 5 REM LETTER-PERFECT DOCUMENTS (v. 1)
  6. 6 REM & COPIES THEM TO AN ATARI DOS
  7. 7 REM SINGLE DENSITY DISK.
  8. 8 GOTO 100
  9. 9 REM 
  10. 10 REM **SUBR. TO WRITE OUT BUFFER CONTENTS**
  11. 20 PRINT :PRINT "REMOVE LETTER-PERFECT DISK,"
  12. 30 PRINT " INSERT ATARI DOS DISK,"
  13. 40 PRINT "  & HIT RETURN":TRAP 50:INPUT DUMMY$
  14. 50 TRAP 40000:OPEN #2,8+APPEND,0,FILE$
  15. 55 PRINT :PRINT "WRITING ";FILE$;"...":TRAP 9100
  16. 60 FOR I=BUF TO BUF+BUFOFF:TEMP=PEEK(I)
  17. 70 IF TEMP=27 THEN POP :GOTO 90:REM END OF FILE
  18. 80 PUT #2,TEMP:NEXT I
  19. 90 CLOSE #2:BUFOFF=0:APPEND=1:TRAP 40000:RETURN 
  20. 99 REM 
  21. 100 REM **INITIALIZATION & STARTUP**
  22. 110 DIM DUMMY$(1),FILE$(14),SLOADER$(40),DIR$(128):DIR$(128)=" "
  23. 120 I=0:APPEND=0:DIRSECT=0:DIROFF=0:INSECT=0:TEMP=0
  24. 125 STAT=0:ENUMSUBR=0:SLOADER=ADR(SLOADER$):DIR=ADR(DIR$)
  25. 130 BUFSIZ=FRE(0)-100
  26. 135 REM USE REST OF RAM FOR DATA BUFFER (LEAVE 100 BYTES SPARE)
  27. 140 DIM BUF$(BUFSIZ):BUF=ADR(BUF$):BUF$(BUFSIZ)=" "
  28. 150 PRINT "}     LETTER-PERFECT COPY UTILITY":PRINT :PRINT 
  29. 160 PRINT "BEFORE PROCEEDING, INSERT DISK"
  30. 170 PRINT " CONTAINING LETTER-PERFECT FILES.":PRINT :PRINT 
  31. 199 REM 
  32. 200 REM **INSTALL MACHINE LANG. SECTOR READER**
  33. 210 RESTORE 
  34. 220 FOR I=SLOADER TO SLOADER+39
  35. 230 READ TEMP:POKE I,TEMP:NEXT I
  36. 299 REM 
  37. 300 REM **SET UP FILE ACCESSING CONTROL**
  38. 310 PRINT "TO READ LETTER-PERFECT DIRECTORY"
  39. 320 PRINT " ENTER 'C' (CURRENT FILES ONLY)"
  40. 330 PRINT "    OR 'A' (ALL - CURRENT + DELETED"
  41. 340 PRINT " AND HIT RETURN."
  42. 350 PRINT "NOTE: ATTEMPT TO SALVAGE DELETED FILE"
  43. 360 PRINT " MAY NOT BE 100% SUCCESSFUL.":PRINT 
  44. 370 TRAP 320:INPUT DUMMY$:TRAP 40000
  45. 380 IF DUMMY$<>"C" AND DUMMY$<>"A" THEN 320
  46. 390 PRINT :IF DUMMY$="A" THEN PRINT "  # INDICATES FILE IS
  47. DELETED":PRINT 
  48. 399 REM 
  49. 400 REM **ENUMERATE LETTER-PERFECT DIRECTORY FILES**
  50. 410 ENUMSUBR=500:REM CALL STEP 500 FOR EACH FILE
  51. 420 GOSUB 1000:REM ENUMERATE!
  52. 430 GOTO 600
  53. 499 REM 
  54. 500 REM **LIST FILES ON SCREEN, 3 TO A LINE**
  55. 510 IF I<10 THEN PRINT " ";
  56. 520 PRINT I;
  57. 530 IF STAT<>76 AND STAT<>108 THEN PRINT "#";:GOTO 550
  58. 540 PRINT " ";
  59. 550 PRINT DIR$(DIROFF+6,DIROFF+13);
  60. 560 IF (I/3)=INT(I/3) THEN PRINT :GOTO 580
  61. 570 PRINT " |";
  62. 580 RETURN 
  63. 599 REM 
  64. 600 REM **HAVE USER SELECT FILE NO. & FIND IT IN DIRECTORY**
  65. 610 IF (I/3)<>INT(I/3) THEN PRINT 
  66. 620 TRAP 620:PRINT "COPY WHICH FILE NO.";:INPUT TEMP:TRAP 40000
  67. 630 IF TEMP<1 OR TEMP>I THEN PRINT "PICK A NUMBER FROM ABOVE LIST":GOTO
  68. 620
  69. 640 ENUMSUBR=700
  70. 650 GOSUB 1000:REM STEP THRU DIRECTORY UNTIL FILE FOUND
  71. 660 STOP :REM ERROR - GOSUB 1000 SHOULD NOT RETURN HERE
  72. 670 GOTO 800
  73. 699 REM 
  74. 700 REM **FOR DESIRED FILE NO. (STORED IN TEMP)**
  75. 701 REM ** STORE 1ST INDEX SECT.NO. IN DIRSECT **
  76. 710 IF I<>TEMP THEN RETURN 
  77. 720 POP :REM DON'T RETURN FROM GOSUB ENUMSUBR
  78. 730 POP :REM DON'T RETURN FROM GOSUB 1000
  79. 740 FILE$="D:"
  80. 750 FILE$(3)=DIR$(DIROFF+6,DIROFF+13)
  81. 760 PRINT :PRINT :PRINT "READING ";FILE$(3);"..."
  82. 770 DIRSECT=PEEK(DIR+DIROFF+3)+256*PEEK(DIR+DIROFF+4)
  83. 799 REM 
  84. 800 REM **LOAD EACH SECTOR REFERENCED BY**
  85. 801 REM **INDEX SECTOR INTO RAM BUFFER  **
  86. 810 IF DIRSECT=0 OR DIRSECT>720 THEN 1200
  87. 820 STAT=USR(SLOADER,DIRSECT,DIR)
  88. 830 IF STAT<>1 THEN GOSUB 9000
  89. 835 DIRSECT=PEEK(DIR+1)+256*PEEK(DIR+2)
  90. 840 FOR DIROFF=8 TO 127 STEP 2
  91. 850 INSECT=PEEK(DIR+DIROFF)+256*PEEK(DIR+DIROFF+1)
  92. 860 IF INSECT=0 OR INSECT>720 THEN 950
  93. 870 STAT=USR(SLOADER,INSECT,BUF+BUFOFF)
  94. 880 IF STAT<>1 THEN GOSUB 9000
  95. 890 BUFOFF=BUFOFF+128:IF BUFOFF<BUFSIZ-128 THEN 950
  96. 900 GOSUB 10:REM BUFFER IS FULL - WRITE IT OUT
  97. 910 IF TEMP=27 THEN POP :GOTO 1200
  98. 920 PRINT :PRINT "REMOVE ATARI DOS DISK,"
  99. 930 PRINT " RE-INSERT LETTER-PERFECT DISK,"
  100. 940 PRINT "  & HIT RETURN":TRAP 945:INPUT DUMMY$
  101. 945 TRAP 40000:PRINT :PRINT "READING ";FILE$(3);"..."
  102. 950 NEXT DIROFF
  103. 960 GOTO 800
  104. 999 REM 
  105. 1000 REM **READ LETTER-PERFECT DIRECTORY:**
  106. 1001 REM ** FOR EACH FILE, CALL ENUMSUBR **
  107. 1005 I=0:REM INIT COUNTER FOR FILES ENUMERATED
  108. 1010 FOR DIRSECT=363 TO 369:REM $16B TO $171
  109. 1020 STAT=USR(SLOADER,DIRSECT,DIR)
  110. 1030 IF STAT<>1 THEN GOSUB 9000
  111. 1040 FOR DIROFF=0 TO 127 STEP 16
  112. 1050 STAT=PEEK(DIR+DIROFF):REM UNLOCKED/LOCKED/DELETED = $4C/$6C/$CC
  113. 1060 IF STAT=0 THEN 1100
  114. 1070 IF DUMMY$="C" AND STAT<>76 AND STAT<>108 THEN 1100
  115. 1080 I=I+1:REM FILE NO. TO BE ENUMERATED
  116. 1090 GOSUB ENUMSUBR:REM DO ENUMSUBR FOR THIS ENTRY
  117. 1100 NEXT DIROFF
  118. 1110 NEXT DIRSECT
  119. 1120 RETURN 
  120. 1199 REM 
  121. 1200 REM **CLEAN UP AND END**
  122. 1210 IF BUFOFF>0 THEN GOSUB 10
  123. 1220 PRINT :PRINT :PRINT "FILE STORED ON ATARI DOS DISK"
  124. 1230 END 
  125. 1999 REM 
  126. 2000 REM **MACHINE LANGUAGE UTILITY TO LOAD   **
  127. 2001 REM **SINGLE-DENSITY DISK SECTOR INTO RAM**
  128. 2002 REM ** STAT=USR(SLOADER,SECTOR NO,BUF ADR)**
  129. 2010 DATA 104,104,141,11,3,104,141,10,3
  130. 2020 DATA 104,141,5,3,104,141,4,3
  131. 2030 DATA 169,82,141,2,3
  132. 2040 DATA 169,1,141,1,3
  133. 2050 DATA 32,83,228
  134. 2060 DATA 173,3,3,133,212,169,0,133,213,96
  135. 8999 REM 
  136. 9000 REM **SUBR. TO PRINT DISK SECTOR READ ERROR**
  137. 9010 PRINT "DISK SECTOR READ ERROR ";STAT
  138. 9020 PRINT " TYPE 'CONT' TO FORGE ON"
  139. 9030 STOP 
  140. 9040 RETURN 
  141. 9099 REM 
  142. 9100 REM **ERROR WRITING TO DOS DISK**
  143. 9110 PRINT "ERROR WRITING TO DOS DISK"
  144. 9120 STOP 
  145.