home *** CD-ROM | disk | FTP | other *** search
/ Commodore Free 6 / Commodore_Free_Issue_06_2007_Commodore_Computer_Club.d64 / t.bible < prev    next >
Text File  |  2023-02-26  |  12KB  |  477 lines

  1. u        THE REST OF THE BIBLE
  2.            By Dave Moorman
  3.  
  4. OPEN lf,dv,ch(com) Here is how you
  5. access the disk drive. LF is the
  6. Logical File number, which you pick.
  7. You can open more than one file, but
  8. each must have its own Logical File
  9. number.
  10.  
  11. DV is the device number (8 or higher
  12. for disk drive). CH is the Channel,
  13. again a unique number for each open
  14. file (we often just use the LF number,
  15. unless the OPEN is for a DISK
  16. COMMAND).
  17.  
  18. DISK COMMANDS
  19.  
  20.  We can send commands to the disk to
  21. Scratch a file, Format (New) a disk,
  22. Rename a file, or Copy a file. Each
  23. is sent over the Command  Channel --
  24. 15. Here are some examples.
  25.  
  26. OPEN 1,8,15,"S0:FILE":CLOSE1 This
  27. will Scratch the file named FILE from
  28. the disk.
  29.  
  30.  OPEN 1,8,15,"N0:DISK NAME,ID":CLOSE1
  31. This will format a new disk,
  32. preparing it to accept data.
  33.  
  34.  OPEN 1,8,15,"N0:NEW NAME":CLOSE1
  35. NOTE: no ID characters. This will
  36. wipe a formatted disk clean and give
  37. it a new name.
  38.  
  39. OPEN 1,8,15,"C0:NEW FILENAME=OLD
  40. FILENAME":CLOSE1 This copies the file
  41. OLD FILENAME to another file called
  42. NEW FILENAME.
  43.  
  44. OPEN
  45. 1,8,15,"R0:NEWNAME=OLDNAME":CLOSE1
  46. This changes the name of the file
  47. OLDNAME to NEWNAME.
  48.  
  49. Channel 15 also lets the disk
  50. communicate with the computer. Here
  51. is a trick we use all the time to
  52. find out whether a certain filename
  53. is on the disk.
  54.  
  55.     10 F$ = "FILENAME"
  56.     20 OPEN 1,8,15,"R0:"+F$+"="+F$
  57.     30 INPUT#1,EN
  58.     40 CLOSE1
  59.  
  60.     When this is done, EN will
  61. contain either 62 or 63. If EN=62
  62. then the filename is not on the disk.
  63. If EN=63, the file name IS on the
  64. disk.
  65.  
  66. Once the command channel is open, we
  67. can use PRINT#lf to send further
  68. commands to the drive. We do this in
  69. our Scratch and Save routine:
  70.  
  71. 60000 D=PEEK(186):IFD<8THEND=8
  72. 60001 OPEN1,D,15,"I0":N$="PROGNAME"
  73. 60002 PRINT#1,"S0:"+N$:CLOSE1
  74. 60003 SAVEN$,D:VERIFYN$,D:END
  75.  
  76.    OPEN1,D,15,"IO" (should be "I"
  77. zero) makes sure the disk drive is
  78. awake and aware. Then the program
  79. name is put into N$. Line 60002
  80. scratches the program name, and
  81. CLOSEs the logical file. Finally, we
  82. SAVE N$,D, then VERIFY N$,D to make
  83. sure we got a good save.
  84.  
  85. We also use OPEN to open a file for
  86. reading or writing. Here is code that
  87. will save three variables to a file,
  88. followed by the routine to get those
  89. three variables.
  90.  
  91.     10 DV=PEEK(186):IFDV<8THENDV=8
  92.     :
  93.     1000 OPEN
  94. 1,DV,15,"S0:DATAFILE":CLOSE1
  95.     1005 OPEN4,DV,4,"DATAFILE,W,S"
  96.     1010 PRINT#4,A$
  97.     1011 PRINT#4,B$
  98.     1012 PRINT#4,C$
  99.     1013 CLOSE4
  100.     1014 RETURN
  101.     :
  102.     2000 OPEN4,DV,4,"DATAFILE,R,S"
  103.     2001 INPUT#4,A$
  104.     2002 INPUT#4,B$
  105.     2003 INPUT#4,C$
  106.     2004 CLOSE4
  107.     2005 RETURN
  108.  
  109. When we OPEN a file, we need to tell
  110. it the filename, whether we will be
  111. Writing it or Reading it (W or R),
  112. and what kind of file it is. We have
  113. two normal kinds of files: Program
  114. and Sequential. For short data
  115. information, use a Sequential file.
  116.  
  117. So, after scratching the file, we
  118. open it to Write, Sequential (,W,S).
  119. Then we use PRINT#lf to print the
  120. data to the file. The best way is
  121. shown above, with each variable
  122. printed separately. We CLOSElf and
  123. RETURN when finished.
  124.  
  125. To get the data back into the
  126. variables, we open the file to Read,
  127. Sequential. (You can leave off the
  128. ",R,S" when opening a file to Read.)
  129. Then we INPUT#lf each variable
  130. exactly the same order as we did the
  131. PRINT#lf, CLOSElf, and RETURN to the
  132. main program.
  133.  
  134.     OPEN is also our way to get data
  135. to the printer.
  136.  
  137.     100 OPEN4,4,7
  138.     110 FOR X = 0 TO 50
  139.     120 PRINT#4,A$(X)
  140.     130 NEXT
  141.     140 CLOSE4
  142.  
  143.  Here we assume that each element of
  144. the A$ array has one line of text for
  145. the printer. You will have to
  146. experiment with your printer on this
  147. -- and read the manual for special
  148. characters and effects. At LOADSTAR,
  149. we assume a 66 line page with 80
  150. characters to a line -- and don't do
  151. much that is fancy.
  152.  
  153. [NICKEL GAMES has a built in function
  154. to turn a C-64 print-out into a PC
  155. TXT file. After doing a print-out in
  156. VICE, press <Alt-Tab>, and click on
  157. File>Print. In a moment, your
  158. print-out will be displayed. You can
  159. copy and past it to a word processor,
  160. save it as a TXT file, or send it to
  161. your printer.]
  162.  
  163. NOTE: Always CLOSE the logical file
  164. after use. Getting proficient with
  165. OPEN takes a lot of practice! See
  166. SECRETS for other stuff about disk
  167. access.
  168.  
  169. PEEK(loc) (fun) Returns the contents
  170. of the memory byte at LOC. We use
  171. PEEK(186) to discover which disk
  172. drive device was last used. You will
  173. use it a lot for advanced tricks.
  174.  
  175.     10 DV = PEEK(186)
  176.  
  177. POKE loc,byte Puts BYTE value into
  178. memory location LOC. Especially
  179. important for controlling C-64
  180. features not included in BASIC 2.0.
  181.  
  182. 10 POKE 53280, 0:POKE 53281, 0 (Turns
  183. screen border and background black)
  184.  
  185. POS(0) (fun) Returns the current
  186. position of the cursor on the screen
  187. row (0 - 39). I have no idea what
  188. this would be good for!
  189.  
  190. PRINT (com) Probably the most
  191. important and versatile command in
  192. BASIC 2.0. It puts characters,
  193. strings, and values on the screen.
  194.  
  195. End the PRINT with a semicolon to
  196. keep the cursor from automatically
  197. dropping down to the first column of
  198. the next row (called a carriage
  199. return). Use a comma to move the
  200. cursor to the next pre-set tab
  201. location on the line.
  202.  
  203. Semicolons and commas can separate
  204. data in a PRINT command. This is a
  205. command you will have to play with!
  206.  
  207. READ (com) Reads values or strings in
  208. DATA statements into variables.
  209.  
  210.  Make sure the number of data items
  211. in the DATA statements match up with
  212. what you are expecting! For string
  213. data, enclose each string in
  214. double-quote marks.
  215.  
  216.     100 FOR X=1TO4
  217.     110 READ A$(X)
  218.     120 ? A$(X)
  219.     130 NEXT
  220.     140 END
  221.     20000 DATA"DADDY","MOMMY"
  222.     20001 DATA"JUNIOR","SIS"
  223.  
  224. REM (com) Short for REMark.
  225. Everything on the program line after
  226. REM is ignored by the computer. Good
  227. for commenting on what the program is
  228. doing at a particular point.
  229.  
  230.     10 REM BEGINNING OF PROGRAM
  231.     :
  232.     199 REM MAIN LOOP AT 200
  233.     :
  234.     60100 REM (C)2005 DAVE MOORMAN
  235.     60110 REM COPYING THIS PROGRAM BY
  236.     60111 REM ANY MEANS WILL GET YOU
  237.     60112 REM A SLAP ON THE HAND!
  238.  
  239. RESTORE (com) Resets data point so
  240. that the next READ receives the first
  241. data element from the first DATA
  242. statement. Not very useful, really,
  243. since we usually READ data into
  244. arrays, which are a lot easier to
  245. handle.
  246.  
  247. RETURN (com) Ends a subroutine and
  248. sends the program back to the GOSUB
  249. that jumped to this place.
  250.  
  251. RND(n) (fun) Returns a random number
  252. between (but not including) 0 and 1.
  253. If N is a negative value, the value
  254. is used to seed the random number
  255. generator. The result will always be
  256. the same for each negative number. If
  257. N is 0 or positive, a new random
  258. number is generated. Most say using 1
  259. is best.
  260.  
  261. Actually, computers cannot do truly
  262. random numbers. Everything inside a
  263. computer is far too logical. However,
  264. with a bit of math, it can generate a
  265. list of unknown numbers. When you use
  266. a negative argument, you reset the
  267. generator.
  268.  
  269. I have heard some arguments about how
  270. an argument of 0 is not as random as
  271. a positive argument. Who knows?
  272.  
  273. To get a useable number, you might
  274. use this custom function:
  275.  
  276.     10 DEF FNR(X)=INT(RND(1)*X)+1
  277.  
  278. If you want values from 0 to X-1,
  279. leave off the last +1. Now any time
  280. you need a random number, just use
  281. the function. Here is a routine to
  282. shuffle 52 "cards".
  283.  
  284.     10 DIM CD(52)
  285.     15 DEF FNR(X)=INT(RND(1)*X)+1
  286.     20 FOR X = 1 TO 52: CD(X)=X:NEXT
  287.     30 FOR X = 1 TO 52: R=FNR(52)
  288.     40 C=CD(R): CD(R)=CD(X): CD(X)=C
  289.     50 NEXT
  290.  
  291.     Please do NOT do this:
  292.  
  293.     10 DIMCD(52)
  294.     :
  295.     200 DEF FNR(X)=INT(RND(1)*X)+1
  296.     210 CD=FNR(X):IFCD(CD)<>0THEN210
  297.     220 CD(CD)=1
  298.     230 RETURN
  299.  
  300.  You will be able to quickly "pick a
  301. card" at first, but as the cards are
  302. taken, each pick will take longer. To
  303. find the last card, you are likely to
  304. look at about 52 taken cards!
  305.  
  306. RUN [ln] (com) Runs a program. You
  307. can begin a program at a given line
  308. number. You can also use RUN in a
  309. program to start all over from the
  310. beginning.
  311.  
  312. RIGHT$(s,n) (fun) Return the
  313. rightmost N characters from string S.
  314.  
  315.     10 A$ = "THIS IS A TEST"
  316.     20 ? RIGHT$(A$,4)
  317.     (This will print "TEST".)
  318.  
  319. SAVE (com) We have already covered
  320. the correct way to put a Scratch and
  321. Save routine in every program. In a
  322. pinch, you can simply
  323.  
  324.     SAVE"FILENAME",8
  325.  
  326. SGN(n) (fun) Returns -1 if N is
  327. negative, 0 if N is 0, and 1 if N is
  328. positive.
  329.  
  330. SIN(n) (fun) Returns the sine of N in
  331. radians.
  332.  
  333.     10 A = SIN(1)
  334.     (A contains the value
  335. 0.841470985.
  336.  
  337. SQR(n) (fun)
  338.     Returns the SQuare Root of N.
  339.  
  340.     10 A = SQR(9)
  341.     (A contains 3)
  342.  
  343. STOP (com) Causes a break in the
  344. program. Line number is reported.
  345. Useful for debugging.
  346.  
  347. STR$(n) (fun) Returns a string of the
  348. value N.
  349.  
  350.     10 A$ = STR$(123)
  351.     (A$ contains " 123")
  352.     15 V = 4
  353.     20 B$ =
  354. RIGHT$("0"+MID$(STR$(V),2),2)
  355.     (B$ will contain "04")
  356.  
  357. SYS loc (com) Executes an ML routine
  358. at memory LOCation. SYSie commands
  359. are often used with ML Modules just
  360. like BASIC commands, complete with
  361. parameters. Be sure to read the
  362. documentation that comes with
  363. modules.
  364.  
  365. TAB(n) (print com) Moves cursor to N
  366. column when printing.
  367.  
  368.     10 PRINT TAB(17)"CENTER"
  369.     (The word "CENTER" is printed in
  370. the center of the line.)
  371.  
  372. TAN(n) (fun) Returns the tangent of N
  373. in radians
  374.  
  375.     10 A = TAN(1)
  376.     (A contains 1.55740772.)
  377.  
  378. USR(n) (fun) Executes ML routine in
  379. memory pointed to by locations
  380. 784/785. N is placed in the Floating
  381. Point Accumulator. Returns the value
  382. in the Floating Point Accumulator.
  383. This is a function, not a command, so
  384. you must either PRINT USR(N), or put
  385. the result into a variable -- A =
  386. USR(N).
  387.  
  388. VAL(s) (fun) Returns the value of
  389. string S. Non-numeric characters
  390. return 0.
  391.  
  392.     10 ? VAL("12A7")
  393.     20 ? VAL("NAME")
  394.     (Prints 12 and 0.)
  395.  
  396. VERIFY (com) Like LOAD, except VERIFY
  397. compares the program in memory with
  398. that on disk without changing either.
  399. If the memory matches the disk file,
  400. OK is printed.
  401.  
  402. WAIT loc,v [,eor] (com) Causes the
  403. program to pause while waiting for
  404. the byte at memory LOCation ANDed
  405. with V and EORed with C is not zero.
  406. C is optional. This is a great
  407. command for waiting for a keystroke.
  408.  
  409.     10 POKE 198,0
  410.     20 WAIT 198,1
  411.     30 GETZ$ The program pauses while
  412. WAIT watches location 198 (which
  413. holds the number of keystrokes
  414. currently in the keyboard buffer).
  415. When a key is pressed, the program
  416. continues, GETting Z$.
  417.  
  418. SECRETS
  419.  
  420. Here are some "secret" routines that
  421. do useful things.
  422.  
  423. BLOAD To load a binary file or block
  424. of data to any place in memory
  425. (except between 53248 and 57343).
  426.  
  427.     1 DV=PEEK(186):IF DV<8 THEN DV=8
  428.     5 DEF FNH(X) = INT(X/256)
  429.     6 DEF FNL(X) = X - FNH(X)*256
  430.     9 ADDR = 49152: REM ADDRESS WHERE
  431. FILE         WILL BE LOADED
  432.     10
  433. SYS57812"FILENAME",DV,0:POKE780,0
  434.     20 POKE781,FNL(ADDR)
  435.     25 POKE782,FNH(ADDR)
  436.     30 SYS65493
  437.  
  438. BSAVE To save memory to a file.
  439. Cannot save from 40960-49151, or
  440. above 53248.
  441.  
  442.     35 B = 49152:REM  BEGIN ADDRESS
  443.     36 E = 53248: REM END ADDRESS + 1
  444.     40 SYS57812"FILENAME",DV
  445.     50 POKE 193,FNL(B):POKE
  446. 194,FNH(B)
  447.     60 POKE 174,FNL(E):POKE
  448. 175,FNH(E)
  449.     70 SYS62954
  450.  
  451. POSITION CURSOR ON SCREEN his handy
  452. routine will put the cursor anywhere
  453. on the screen, where X = 0 through 39
  454. and Y = 0 through 24.
  455.  
  456.     1000 IF Y=0 THEN
  457. ?"<Shift-HOME>";:GOTO1020
  458.     1010 POKE214, Y-1:?
  459.     1020 ? TAB(X)"WHATEVER!"
  460.  
  461. Note: If the printing wraps around,
  462. an extra screen line may be inserted.
  463. Avoid printing to column 39 if
  464. possible!
  465.  
  466. Read through these commands and
  467. functions again! Try the code. Try
  468. experiments. Programming requires a
  469. broad knowledge of possible commands
  470. and functions and ways they can go
  471. together.
  472.  
  473. Dave Moorman Editor, LOADSTAR
  474. September 12, 2005
  475.  
  476. ...end...
  477.  
  478.