LKDOS Utilities v2.1 is Richard Hurd’s set of disk utilities for the Larken (LKDOS) disk system, written for the Toronto T/S Users Club in 1988–89. It needs a TS2068 with the Larken disk interface; it has not been converted for tape. The disk’s own menu runs:
- The Copy Machine: copies or erases a batch of files flagged in a 64-column file list. Its copy routine comes from Larry Kenny’s MOVE and its 64-column display from Wes Brzozowski’s SINCUS 64 Column BASIC.
- ODDBALL COPY v2: copies whole disks between two drives of different kinds, through a buffer disk.
- FORMAT PLUS: formats custom quad-density disks with room for up to 159 files.
- DOUBLE TO QUAD v1.1: converts double-density disks to quad density.
- SINGLE DRIVE COPY and LARKEN TWO DRIVE COPY (“tweaked by Richard Hurd”).
- RAMDISK BACKUP & RESTORE.
The programs are credited “© 1988 Richard Hurd for the Toronto T/S Users Club”, “(C) 1989 Richard Hurd” and “by R.H.”. The disk includes the Copy Machine instructions, an annotated copy of its BASIC and the ODDBALL COPY documentation, which are included as text. The menu loads FORMAT PLUS as form+.B1, but the file extracted from this disk is named form.B1.
The download has the raw disk image, every file from the disk as a TAP, the three documents as text, and a README.
Source Code
5 REM THE COPY MACHINE
10 RANDOMIZE USR 100: POKE 23730,39999: RANDOMIZE USR 100: LOAD "batch.C1"CODE
20 RANDOMIZE USR 60000
30 PRINT a$
40 IF INKEY$<>"" THEN GO TO 40
50 IF INKEY$="" THEN GO TO 50
60 RANDOMIZE USR 60651
100 PAPER 1: INK 9: BORDER 1
110 POKE 23658,8: CLS : PRINT AT 0,0; INVERSE 1;" "'" LKDOS "'" COPY "'" MACHINE "'" "''' INVERSE 0;"Catalog A Disk?"
120 IF INKEY$="" THEN GO TO 120
130 IF INKEY$<>"Y" THEN GO TO 170
140 INPUT "Drive 0 1 2 3 or 4 ";a: IF a>4 THEN GO TO 140
150 CLS : RANDOMIZE USR 100: GO TO a: RANDOMIZE USR 100: CAT "",: INPUT "Another Catalog? "; LINE b$: IF b$="Y" THEN GO TO 140
160 CLS
190 FOR f=0 TO 7: POKE USR "a"+f,0: NEXT f: POKE USR "a"+3,255
200 RANDOMIZE USR 60000
210 PRINT INK 0
220 BRIGHT 1
230 PRINT FLASH 0
280 RANDOMIZE USR 52837
290 IF PEEK 56872=2 THEN GO TO 310
300 IF PEEK 56872=1 THEN RANDOMIZE USR 100: GO TO PEEK 56880: RANDOMIZE USR 53225
310 BEEP .1,10
320 RANDOMIZE USR 60651: CLEAR 31999: PRINT AT 0,0; INVERSE 1;" "'" LKDOS "'" COPY "'" MACHINE "'" "
330 PRINT
340 IF PEEK 56864=1 THEN PRINT TAB 10;"MODE> BATCH COPY"
350 IF PEEK 56864=2 THEN PRINT TAB 10;"MODE> COPY ALL"
360 IF PEEK 56864=3 THEN PRINT TAB 10;"MODE> BATCH ERASE"
370 GO TO 390
380 STOP : REM gotta start over
390 DELETE 0,220: IF PEEK 56876=0 THEN GO TO 500
400 DIM n$(PEEK 56876,9)
410 RANDOMIZE USR 40063: RANDOMIZE USR 46195
420 LET u=PEEK 56876
430 LET Odrv=PEEK 56860: LET Ddrv=PEEK 56862
440 IF PEEK 56864=3 THEN GO TO 460
450 GO TO 1000
460 REM batch erase
470 FOR n=1 TO u
480 RANDOMIZE USR 100: ERASE n$(n),
490 NEXT n
500 GO TO 8000
999 REM batch copy
1000 FOR n=1 TO PEEK 56876
1005 PRINT AT 16,6;" ": GO SUB 7000
1010 FOR f=1 TO 9: POKE Onam,CODE n$(n,f): LET Onam=Onam+1: NEXT f
1130 FOR a=1 TO 9: POKE Dnam,CODE n$(n,a): LET Dnam=Dnam+1: NEXT a
1140 PRINT AT 10,0;"Copying ";n$(n);AT 10,18;" on Drive ";Odrv
1150 PRINT AT 12,14;"TO"
1160 PRINT AT 14,8;n$(n);" on Drive ";Ddrv
1170 IF n>1 AND Odrv=Ddrv THEN GO SUB 7320
1200 RANDOMIZE USR 100: GO TO Odrv: LET rt=USR indir: IF rt<>0 THEN GO TO rt
2000: LET rt=USR Ld1: IF rt<>0 THEN GO TO rt
2010 LET Tlen=PEEK 34002: LET pass=1: IF Tlen>(PEEK Nbcs)-1 THEN LET Pass=2
2100 GO SUB DesDrv
2200 LET rt=USR Svnam: IF rt<>0 THEN GO TO rt
2300 LET rt=USR Svdata: IF rt<>0 THEN GO TO rt
2400 IF pass=1 THEN GO TO 5000
2500 GO SUB OrgDrv: LET rt=USR Ld2: IF rt<>0 THEN GO TO rt
2700 GO SUB DesDrv: LET rt=USR Svdata: IF rt<>0 THEN GO TO rt
5000 LET rt=USR Svend: IF rt<>0 THEN GO TO rt
5050 PRINT AT 16,6;"File Copied": BEEP .1,10: BEEP .1,10
5060 NEXT n
5070 GO TO 8000
5990 REM -- Error Msgs --
6000 PRINT FLASH 1;"File Not Found": GO TO 6500
6010 PRINT FLASH 1;"Disk Full": GO TO 6500
6020 PRINT FLASH 1;"Data Error": GO TO 6500
6030 PRINT FLASH 1;"Rename Error": GO TO 6500
6500 BEEP .5,5: BEEP .5,1: PAUSE 100: GO TO 1005
7000 LET Mem=34800: LET Owka=34700: LET Dwka=34750: LET Onam=34600: LET Dnam=34650
7100 LET indir=32000: LET Ld1=32003: LET Ld2=32006: LET Svnam=32009: LET Svdata=32012: LET Svend=32015: LET Renam=32018
7150 LET OrgDrv=7300: LET DesDrv=7400: LET Nbcs=34003: LET Bsize=34004
7160 REM DDen Bsize=5120 Nbcs=7 SDen Bsize=2050 Nbcs=14
7170 POKE Nbcs,7: RANDOMIZE USR 100: POKE Bsize,5120
7200 RETURN
7300 IF Odrv<>Ddrv THEN RANDOMIZE USR 100: GO TO Odrv: RETURN
7320 INPUT "Insert Source Disk"; LINE a$: RETURN
7400 IF Odrv<>Ddrv THEN RANDOMIZE USR 100: GO TO Ddrv: RETURN
7420 INPUT "Insert Destination Disk"; LINE a$: RETURN
8000 REM end routine
8010 CLS : PRINT AT 0,0; INVERSE 1;" "'" LKDOS "'" COPY "'" MACHINE "'" "
8030 PRINT ''"1) RESTART COPY MACHINE"
8040 PRINT '"2) RESTART AN AUTOSTART PROGRAM"
8050 PRINT '"3) RESET COMPUTER"
8060 PRINT ''" PRESS 1 - 3"
8070 IF INKEY$<>"" THEN GO TO 8070
8080 IF INKEY$="" THEN GO TO 8080
8090 IF INKEY$="3" THEN PRINT USR 0
8100 CLS : PRINT "WHICH DRIVE 0-4?"
8110 IF INKEY$<>"" THEN GO TO 8110
8120 IF INKEY$="" THEN GO TO 8120
8130 LET d=CODE INKEY$-48: IF d<0 OR d>4 THEN BEEP .1,0: GO TO 8130
8140 RANDOMIZE USR 100: GO TO d
8150 RANDOMIZE USR 100: NEW
9998 STOP
9999 RANDOMIZE USR 100: SAVE "cpmach.B1" LINE 10Note: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.