LKDOS Utilities v2.1 (Larken Edition)

Developer(s): Richard Hurd
Date: 1989
Type: Diskette
Platform(s): TS 2068
Tags: Utility

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 10

Note: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.