GMW@psuvm.BITNET (06/05/85)
Here is a version of the C64BOOT program written in SIMULA for DEC-10/20 computers. I have commented this version a little more than previous versions of C64BOOT in other languages, to make it simpler for someone who needs to re-write it into yet another language. Note two important points: ALL echoing of characters from the CBM by the HOST must be suppressed. Also the echoing of a line feed when the CBM sends a carriage return. The delimiter between lines sent to the CBM-64 should be only carriage return, not carriage return-line feed. OPTIONS(/l); ! This comment copied from the CLU version of C64BOO: ! Program to download files to my Commodore 64 ! Sends lines, one at a time. Each line is followed by a ! checksum. Commodore validates checksum, and either sends ! "OK" or "NG". If no good, retransmit. Last line's checksum ! is sent with a leading minus sign to show end-of-file; BEGIN EXTERNAL TEXT PROCEDURE frontstrip; EXTERNAL PROCEDURE echo; REF (infile) file; TEXT received, line, outword, outwordbuffer; INTEGER checksum; CHARACTER c, carriagereturn; ! suppress all echoing of terminal input; echo(sysin,2); ! Initialization of data; carriagereturn:= char(13); received:- sysin.image.strip; line:- blanks(80); outwordbuffer:- blanks(10); ! Opening of the input file; file:- NEW infile("INFIL *"); file.open(line); ! Wait for OK from CBM to start transmission; WHILE received <> "OK" DO BEGIN sysin.inimage; received:- sysin.image.strip; END; file.inimage; WHILE NOT file.endfile OR received = "NG" DO BEGIN ! If last line was correctly received by the CBM, ! get the next line from the file; IF received = "OK" AND NOT file.endfile THEN BEGIN line:- copy(file.image.strip); file.inimage; END; ! Compute checksum; checksum:= 0; line.setpos(1); WHILE line.more DO BEGIN c:= line.getchar; checksum:= checksum+rank(c); END; ! Output one line from the file to the CBM-64; sysout.outtext(line); sysout.outchar(carriagereturn); sysout.breakoutimage; ! Output the checksum in decimal format, ! without leading blanks, to the CBM-64; IF file.endfile THEN sysout.outtext("-"); outwordbuffer.setpos(1); outwordbuffer.putint(checksum); outword:- frontstrip(outwordbuffer); ! Strips leading blanks); sysout.outtext(outword); sysout.outchar(carriagereturn); sysout.breakoutimage; ! Read the acknowledgement of the line from the CBM-64; sysin.inimage; received:- sysin.image.strip; END; file.close; ! Resume normal echoing; echo(sysin,0); END;