10 HIMEM: 8190 20 REM **************************** 30 REM * CP/M -> APPLE DOS CONV. * 40 REM **************************** 50 REM * BY * 60 REM * ALEX MALUTA * 70 REM * 12-31-81 * 80 REM **************************** 90 REM * DOCUMENTED IN CPDOS.DOC * 100 REM **************************** 110 REM * NEEDS: 48K,APPLESOFT * 120 REM * 2 DRIVES,CP/M * 130 REM **************************** 140 GOTO 830 150 REM FOUND ACTIVE MATCH 160 REM GET DATA 170 EX = PEEK (I + 12):SE = SE + PEEK (I + 15) 180 FOR ZZ = 0 TO 15 190 S = EX * 16 + ZZ: IF S > SG THEN SG = S 200 S(S) = PEEK (I + 16 + ZZ) 210 NEXT : RETURN 220 REM ======================= 230 REM GET NEW SECTOR/TRACK 240 REM POINTED BY GROUP IN S(I) 250 TR = INT (S(I) / 4) + 3 260 O = (S(I) / 4 - INT (S(I) / 4)) * 4 270 X = O * 4 + N 280 DATA 0,6,12,3,9,15,14,5,11,2,8,7,13,4,10,1 290 RESTORE 300 FOR II = 0 TO X: READ SC: NEXT : RETURN 310 REM ======================= 320 REM CALL RWTS SUBROUTINE 330 POKE SS + 2,0 340 POKE SS,SL: POKE SS + 1,DR: POKE SS + 3,TR: POKE SS + 4,SC: POKE SS + 8,BH: POKE SS + 7,BL: POKE SS + 11,CM: CALL RWTS: RETURN 350 REM ======================= 360 REM LOAD DIRECTORY FROM CP/M DISK 370 B1 = B - 256:TR = 3 380 GOTO 400 390 B1 = B1 + 256:BH = INT (B1 / 256):BL = B1 - (BH * 256): GOSUB 320: RETURN 400 SC = 0: GOSUB 390 410 SC = 6: GOSUB 390 420 SC = 12: GOSUB 390 430 SC = 3: GOSUB 390 440 SC = 9: GOSUB 390 450 SC = 15: GOSUB 390 460 SC = 14: GOSUB 390 470 SC = 5: GOSUB 390 480 REM ======================= 490 REM SEARCH FOR FILENAME 500 C = 0 510 FOR I = B TO B + (256 * 8) STEP 32 520 IF PEEK (I) < > 0 THEN 580: REM FILE INACTIVE 530 CS$ = "":CF$ = "" 540 FOR J = 1 TO LEN (F$):CF$ = CF$ + CHR$ ( PEEK (I + J)): NEXT 550 FOR J = 1 TO LEN (S$):CS$ = CS$ + CHR$ ( PEEK (I + J + 8)): NEXT : REM IS 9 BUT J IS 1 XTRA 560 PRINT CF$"."CS$ 570 IF CF$ = F$ AND CS$ = S$ THEN C = 1: GOSUB 150 580 NEXT 590 IF C = 0 THEN PRINT "NO SUCH FILENAME EXISTS": END 600 REM ======================= 610 REM LOAD CP/M FILE INTO MEMORY 620 B1 = B 630 REM CLEAR MEMORY (2000:00 N 2001<2000.95FEM) 640 I = 0: REM CLEAR TO 0 650 POKE 8192,I: POKE 67,32: POKE 66,1: POKE 61,32: POKE 60,0: POKE 63,149: POKE 62,254: CALL R2: REM EXECUTE MEMORY MOVE 660 SE = SE / 2 670 FOR I = 0 TO SG 680 FOR N = 0 TO 3: IF SE < = 0 THEN N = 3:I = SG: GOTO 720 690 GOSUB 230:BH = INT (B1 / 256):BL = B1 - (BH * 256) 700 PRINT TR,SC:SE = SE - 1 710 GOSUB 320:B1 = B1 + 256: IF B1 > = MM THEN : REM OUT OF MEMORY 720 NEXT : NEXT 730 REM ======================= 740 REM SAVE ON APPLE DISK 750 REM SET MSB ON DATA HIGH AND 760 REM CONVERT ANY LINE FEEDS TO SPACES 770 POKE 811,B1 / 256: CALL R3 780 IF SE / 2 < > INT (SE / 2) THEN B1 = B1 - 128: REM CHOP OFF IF LAST SECTOR WAS 1/2 SECTOR 790 A$ = CHR$ (4) + "BSAVE" + F$ + "." + S$ + ",A" + STR$ (B) + ",L" + STR$ (B1 - B + 1) + ",D2" 800 PRINT 810 PRINT A$: END 820 REM ======================= 830 REM SET UP 840 DIM S(32): FOR I = 0 TO 32:S(I) = 0: NEXT : REM ARRAY FOR WHICH CP/M SECTORS TO PULL 850 B = 8192: REM BEGGINNING OF BUFFER 860 MM = 38400!: REM TOP OF BUFFER - BOTTOM OF DOS 870 SL = 6 * 16: REM SLOT OF DISK DRIVE 880 CM = 1:DR = 1: REM READ CP/M IN DRIVE 1 890 SS = 47081!: REM ADDRESS OF IOB 900 FOR I = 1 TO 16: READ A: NEXT : REM GET RID OF LOW DATA 910 REM POKE MOVE, RWTS, INCREMENT ROUTINES 920 DATA 32,44,254,96,169,183,160,232,32,217,3,96,0,173,0,32,201,10,240,27,9,128,141,0,32,238,14,3,238,23,3,208,236,238,15,3,238,24,3,173,24,3,201,150,144,223,96,169,160,76,22,3,0 930 FOR I = 768 TO 820: READ A: POKE I,A: NEXT 940 R2 = 768: REM MEMORY MOVE ADDRESS 950 RWTS = 772: REM RWTS ADDRESS 960 R3 = 781: REM INCREMENT BUFFER ADDRESS 970 REM INPUT FILENAME AND SPLIT INTO 2 PARTS 980 HOME : VTAB 3: PRINT " CP/M -> DOS FILE CONVERTER": VTAB 7 990 INPUT "WHAT CP/M FILE ->";F$: FOR I = 1 TO LEN (F$): IF MID$ (F$,I,1) = "." THEN FF$ = LEFT$ (F$,I - 1):S$ = RIGHT$ (F$, LEN (F$) - I):F$ = FF$ 1000 NEXT 1010 HOME : PRINT "PLACE CP/M DISK IN DRIVE 1" 1020 PRINT : PRINT "PLACE APPLE DOS DISK IN DRIVE 2" 1030 GET R$ 1040 GOTO 360 1050 END