M(I),160:TT1PP:CM(I),(Y(I))::C`R$"ݠݠݠݠݠݠݠݠ"DaR$R$""VDbA$" A"R$:P$"P"R$DcX$" X"R$:Y$" .AND END"r"IS STORED AT $2D/$2E.":63000Ps"., B5DC A5 2B LDA $2B _"||63400:"SO WE LDA $2B GETTING READY""TO ADD 2..":6300063400:"BUT REMEMBER TO CLC FIRST!":63000"., B5DE 18 1 2B STA ($2B),Y  _"363400:"SINCE $2B CONTAINS THE"^"THE START OF BASIC,(USUALLY $0801)""#$00 IS STORED IN ($2B)+Y.":63000"63400:"THEN INY GETS READY TO STORE #$00 INTO","THE SECOND BYTE OF 'BASIC' AT ( 01/$0802 MUST BE 00 00 00."9"BUT $0800 ALWAYS HAS 00 ANYWAY SO"e"WE JUST FILL $0801/$0802 WITH 00.""THE START OF BASIC IS KEPT IN $2B/$2C.""THE END OF BASIC, KEPT IN $2D/$2E,""MUST BE JUST 2 BYTES PAST THE ST"., E06A 9D 00 04 STA $0400,X>"., E06D 9D 00 05 STA $0500,Xc"., E070 9D 00 06 STA $0600,X"., E073 9D 00 07 STA $0700,X"., E076 CA DEX"., E077 D0 F1 BNE $E06A"THESE ARE THE LOCATIONS IN DEX ". t"., E077 D0 F1 BNE $E06A "f x"RECOGNIZE THE ASSEMBLER INSTRUCTIONS?":63000 "., E068 A9 20 LDA #$20 " "., E06A 9D 00 04 STA $0400,X" "., E06D 9D 00 05 STA $0500,X" "., E070 9D 00 06 STADED"9 Z"MONITOR LIKE J.BUTTERFIELD'S SUPERMON!!":63000Z d"., E068 A9 20 LDA #$20} e"., E06A 9D 00 04 STA $0400,X f"., E06D 9D 00 05 STA $0500,X g"., E070 9D 00 06 STA $0600,X h"., E073 9D 00 07 STA $0700,X i"., E076 CA !" PONZO*83*WATERLOO/"L 53281,15:53280,12:""p " C64 TUTOR-6"""  MORE 6510 MACHINE LANGUAGE  ":MS$" WELCOME! " "003HH"BT$CL$;H#BT$"RETURN TO SEE IT HAPPEN";H$Z$:Z$""63012H%Z$:Z$""63013H&I|T15:PT$MS$;$I}PT$" ";3I~PT$MS$;:9IDI63000eISD$;:T110:CL$::SD$;:yID63100:63010:I$BT$"":FPT$""GPT$PT$"Σ============"[GPT$PT$"ϣϑ"GPT$BT$"Y"R$DdM$"M"R$DeCR$""%EfCC$" A       "@EgWD40:CRT1024:(142)EhI07:A(I)CRTWD32I:P(I)A(I)20:X(I)A(I)3WD:Y(I)X(I) CLC _":63000@"., B5DF 69 02 ADC #$02 _"|63400:"SEE..WE ADD 2.":"THEN WE STORE THIS LO-BYTE""INTO $2D.":63000"., B5E1 85 2D STA $2D _":63000 63400:"USUALLY)"6"$0802.">@"., B5D9 C8 INY _":63000tJ"., B5DA 91 2B STA ($2B),Y _"T63400:"THERE SHE GOES!":63000^63400:"THE END OF BASIC NOW HAS TO"h"BE CHANGED TO READ $0803.ART.""LET'S SEE HOW IT'S DONE..":63000-"";["., B5D4 A9 00 LDA #$00 _""., B5D6 A8 TAY _"63400:"BOTH A AND Y ARE FILLED ""WITH #$00..TO START.":63000 "., B5D7 9 MEMORY"%" WHICH CONTAIN THE M-L CODE.":63000AMS$" ONWARD ":63100h"NOW LET'S LOOK AT HOW A BASIC ""NEW IS DONE. WE'LL PRETEND THE""CODE IS FROM $B5D4 TO $B5E8.""RECALL THAT THE FIRST 3 BYTES" "AT $0800/$08 $0600,X"% "., E073 9D 00 07 STA $0700,X"K "., E076 CA DEX "q "., E077 D0 F1 BNE $E06A " "THESE ARE THE HEX BYTES THAT ARE " " ACTUALLY IN MEMORY. ":63000 "., E068 A9 20 LDA #$20 DEX* j"., E077 D0 F1 BNE $E06A":63000P n"., E068 A9 20 LDA #$20 "u o"., E06A 9D 00 04 STA $0400,X" p"., E06D 9D 00 05 STA $0500,X" q"., E070 9D 00 06 STA $0600,X" r"., E073 9D 00 07 STA $0700,X" s"., E076 CA ". #60000:63100:63000\ ("LET'S LOOK AT HOW BASIC " 2" CLEARS THE SCREEN " <"WE'LL DISASSEMBLE THE MACHINE LANGUAGE" F"(ASSUMED TO BE AT $E06B)." P"IT'S HANDY IF YOU HAVE AN EXTEN60000:"":1630ML$""GWD40:CRT1024:(142)HW2WD2:W3WD1:W1$((WD),2):#HW2$((W2),2):W3$((W3),2))H6HBT$CL$;VHBT$"RETURN TO CONTINUE";lHZ$:Z$""63002HZ$:Z$""63"PT$""GML$""GWD40:CRT1024:(142)HW2WD2:W3WD1:W1$((WD),2):#HW2$((W2),2):W3$((W3),2))H6HBT$CL$;VHBT$"RETURN TO CONTINUE";lHZ$:Z$""63002HZ$:Z$""63 20EiM(I)Y(I)3WD::CCRT7WD1EjSD$"":CL$"":I1WD2:CL$CL$" ":EkBT$"":I124:BT$BT$"":1FlC$CR$"_CARRY BIT"aFsML$""kFtPP20FBT$"":I124:BT RECT..AS IN LDA ($0400,X)"."IF WE INDIRECT THEN INDEX IT'S"0/"INDIRECT INDEXED..AS IN LDA ($B0),Y":63000S/MS$"CLEAR?!*$&":63100:63000y/"LET'S EXPLAIN ABOUT MEMORY."/"6510 INSTRUCTIONS ARE STORED IN MEMORY"/ :Y(I),160:TT1PP:A͜Y(I),((N$,I1,1))48::AI07:M(I),160:TT1PP:B᜗M(I),((N$,I1,1))48::!BI07:P(I),160:TT1PP:7BP(I),(A(I))::WBI07:X(I),160:TT1PP:mBX(I),(A(I))::BI07:Y(I),160:TT1P ACT WITH CARRY."?@ "HOWEVER, WITH SBC YOU MUST HAVE" @J "CARRY=1 TO START WITH!!":MS$"*?UGH!*?!!":63000:63100-@T 63010:"SEC ":63000Y@ "":MS$"AU REVOIR!":63100:"":c@'9999@A(0),32:TT1PP::I06:A(I1),32 "NOTE:ADC MEANS ADD WITH CARRY.":63000> "":I18:CL$::""2> "OF COURSE THE CARRY MAY BE 1 WHEN"]> "THE ABOVE PIECE OF CODE STARTS, SO"> "WE MUST ALWAYS CLC BEFORE AN  THAN";n "$0001 OR $0100 (INC $B0 OR INC $B1)";x "THEN YOU NEED TO ADD THE INCREMENT." <} "SUPPOSE WE WANT TO ADD $1F:"?< "LDA $B0 _GET LO-BYTE"e< "ADC #$1F_ADD #$1F TO LO-BYTE"< "STA $B0 _PUT IT BACK"< "LDA $B1 _GRES"9 "INC $B1. IF YOU WANT TO INCREMENT"9 "BY $0001 YOU CAN DO IT THIS WAY:" : " ------- "D: " INC $B0 ":" BNE NEXT":" INC $B1 "Z: "NEXT ------- ": "THIS ADDS '1' TO ($B0).IF IT DOESN'T":( "OVERFLOW F7t "FOR LDX #$81,OR HIGHER,DEX"7~ "WILL LEAVE 'MSB'=1 IN THE X-REGISTER"8 "AND X<0 WILL RESULT AND BPL WILL"G8 "NOT TAKE US BACK TO 'LOOP'!":63000n8 "":I16:CL$:8 "NOTE THAT ($B1) WILL NO DEX ":" BPL LP1 ":630006 "WE NEEDN'T LDY #$00 EACH";6$ "TIME WE BPL LP1":"Y=0 ALREADY SO:":63010p6. " ":"LOOP":"LOOP"63 "LOOP":6300068 ""WITH LDA #$00 STA $B0 LDA #$04 STA $B1." 4"ALSO INC $B0 BY #$100 IS CHANGED TO:"44"INC $B1... WE NEED ONLY INC THE"R4"HI-BYTE BY '1'!":63000w4"WE'LL CHANGE OUR PROGRAM TO:"4"BEGIN LDA #$00 ":" STA $B0 LDA ($B0),Y!!":630001H"LET'S GET BACK TO:"2R"BEGIN LDA #$0400 _??*!#$0400 TOO BIG!!"=2\" STA $B0 _$B0 NOW HAS #$0400"m2f" LDX #$03 ":"LP1 LDY #$00 "2p"LP2 LDA ($B0),Y_ INDIRECT INDEXED?":" EOR #"AS 1- OR 2- OR 3- HEX BYTES."/"INX=E8 IS ONE BYTE LONG0"LDA #$05=AD 05 IS TWO BYTES"J0"LDA $1234,X=BD 34 12 IS THREE BYTES."f0" ^^ ^^"0"IN GENERAL, 2-BYTE ADDRESSES ARE"0"STORED IN MEMORY IN REVERP:BY(I),(A(I))::BȠI07:M(I),160:TT1PP:BɠM(I),(A(I))::B|I07:A(I),160:TT1PP:C}A(I),(X(I))::/CI07:M(I),160:TT1PP:ECM(I),(X(I))::eC¡I07:A(I),160:TT1PP:{CáA(I),(Y(I))::CI07:@A(I),((N$,I1,1))48:TT1PP:::A(7),48:@I07:A(I),160:TT1PP:AA(I),((N$,I1,1))48::!AI07:P(I),160:TT1PP:AAP(I),((N$,I1,1))48::aAœI07:X(I),160:TT1PP:AÜX(I),((N$,I1,1))48::A̜I07ADC!":63010> "CLC ":63000> "IF YOU WANT TO SUBTRACT #$1F YOU:")?" "LDA $B0 ":"SBC #$1F_SUBTRACT $1F":"STA $B0 "d?, "LDA $B1 ":"SBC #$00_SUBTRACT $00!!":"STA $B1 "?6 "NOTE:SBC MEANS SUBTRET HI-BYTE"< "ADC #$00_ADD ZERO(?!)":"STA $B1 _PUT IT BACK"= "YOU SEE..ADDING #$1F MIGHT JUST CAUSE"7= "THE CONTENTS OF $B0 TO OVERFLOW WHICH"d= "CAUSES CARRY=1. SO WE ADD THE CARRY"= "TO ($B1) WITH LDA $B1 & ADC #$00"= ROM FF TO 00 WE CONTINUE":2 "WITH THE 'NEXT' INTRUCTION.":< "IF IT DOES OVERFLOW TO 00"$;F "THE BNE NEXT WILL NOT TAKE US TO"Q;P "'NEXT', AND WE ADD '1' TO THE HI-BYTE"o;Z "WITH INC $B1.":63000;d "IF YOU WANT TO INCREMENT BY OTHERT"8 "OVERFLOW AFTER A NUMBER OF INC $B1"8 "INSTR'NS. AFTER ALL,MEMORY ONLY GOES"9 "TO $FFFF, SO, UNLESS YOU GOOF"L9 "($B1)<=FF WILL ALWAYS BE TRUE!":63000w9 "NOTE THAT INCREMENTING THE ADDRESS"9 "IN $B0/$B1 BY $0100 ONLY REQUI":I16:CL$:6B "NOTE THAT LDX #$03 CAN" 7L "BE CHANGED TO ANYTHING FROM"67V "LDX #$01 TO LDX #$80.":63000]7` "":I16:CL$:7j "FOR LDX #$00 WE'LL X-LOOP ONCE ANYWAY!" "4" LDA #$04 ":" STA $B1 " 5" LDX #$03 ":"LP1 LDY #$00 ":5"LP2 LDA ($B0),Y":" EOR #$80 "k5" STA ($B0),Y":" DEY "5 " BNE LP2 ":" INC $B1 "5 " $80 "2z" STA ($B0),Y_ INDIRECT INDEXED!":" DEY "63" BNE LP2 ":" INC $B0 BY #$100_??*!!HOW??"x3" DEX ":" BPL LP1 _BRANCH ON PLUS!!"3"WE NOW MUST PUT $0400 INTO $B0/$B1"3 SE ORDER:"0"LO-BYTE THEN HI-BYTE."0 "SO IF YOU HAVE:"1"LDA ($B0),Y=B1 CA THE 6510 WILL"E1 "GET FROM $B0 THE LO-BYTE OF THE"p1*"ADDRESS,AND FROM $B1 THE HI-BYTE!"14"BE SURE TO PUT BOTH BYTES IN $B0/$B1"1>"BEFORE  "" LDX #$FF ":"LOOP STA $0400,X"(" STA $0500,X"B" STA $0600,X"\" STA $0700,X"v" DEX "" BNE LOOP ":" ":63000SD$"";:T110:CL$::SD$""; "A=M(M(5)+Y)"20)"LDA ($05),Y" -"INDIRECT INDEXED. FIRST, THE CONTENTS"6-&"OF LOC'N 5 ARE EXTRACTED.THEN 'Y'"`-0"IS ADDED AND THE RESULT GIVES THE"-:"ADDRESS OF THE BYTE LOADED INTO 'A'.":63000-D"INDIRECT MEANS WE GO  THE ACCUMULATOR"*"IS LOADED WITH THE # 5." +"A=M(5)"20)"LDA $05".+"ABSOLUTE ADDRESSING. 'A' IS"Q+"LOADED WITH THE CONTENTS OF"k+"MEMORY LOCATION 5."+"A=M(5+X)"20)"LDA $0005,X"+"ABSOLUTE INDEXED. THE CONTENT (T"MEMORY LOC'N $B0, ADDS Y, AND THIS")Y"GIVES THE ADDRESS OF THE BYTE WHICH "D)Z"GETS LOADED INTO 'A'!!":63000t)^"THERE ARE SOME NEW IDEAS..AND PROBLEMS!")c"BUT FIRST LET'S AGREE THAT WE'LL")d"USE $B0 TO REFER TO TATIVE NO.!";:63000&"LET'S TRY SOMETHING LIKE:")'"BEGIN LDA #$0400 _??*!#$0400 TOO BIG!!"W'" STA $B0 _$B0 NOW HAS #$0400"'" LDX #$03 ":"LP1 LDY #$00 "'""LP2 LDA ($B0),Y_ INDIRECT INDEXED?":" E=Y-1"$"WILL CHANGE Y=00 TO Y=FF(!) AND WE'LL"&%"CONTINUE WITH M+FF THEN M+FE..TO M+01"K%"AND WE STOP THE Y-LOOP THERE!"v%"THE X-LOOP STARTS WITH X=N AND EACH"%"X=X-1 CHANGES X TO N-1,N-2,..2,1,0 THEN"%"ONE MORE X=X-1 CHA00":" X=X-1""" IFX<>0 GOTO LP1 ":630002#""23)"_WON'T DO Y=0!"[#""23)"_WON'T DO X=0!!":63000#"";:I110:CL$::"WE'LL CHANGE IT TO:"#63010:" M=$0400":" X=N" $0500,X":"ETC. ETC..UNTIL.."!" STA $0700,X">!" DEX ":" BNE LOOP ":63000j!"IT'S CLEAR THAT THIS WILL NOT DO IF"!"WE WANT TO GO FROM $0400 TO $0500 TO"!"..TO $0N00,INSTEAD OF JUST TO $0700."!"R""IS IN RVS-FIELD)!"4("WE'LL:":"LDA $0400,X":"EOR #$80 __???":"STA $0400,X"a2"EOR IS AN EXCLUSIVE OR!":63000<"IF A CONTAINS 10110101 (AFTER LDA)"F"THEN EOR #$80 DOES AN EXCLUSIVE-OR"P"WITH 100L"DEC $1234":"BNE LOOP "V"HERE WE BRANCH TO LOOP IF"E`"DECREMENTING $1234 IS NOT ZERO.":""sj"NOTE: CPX INVOLVES A SUBTRACTION"t"(TO CHECK FOR ZERO RESULT)"~"BUT IT DOES NOT CHANGE ANY REGISTERS!":63000 "HOW CAN WE BNE WHEN WE DON'T DO ANY"$"COMPARE?":63000P"YOU SEE, BNE REALLY CHECKS TO SEE"~"IF '0' IS THE RESULT OF AN ARITHMETIC""OPERATION..INCLUDING A COMPARE.""IN THE PAIR OF INSTRUCTIONS:" "CPTO A MEMORY LOC'N"-N"TO GET THE ADDRESS OF THE BYTE TO BE".X"LOADED INTO THE ACCUMULATOR."E.b"INDEXED MEANS WE ADD THE CONTENTS"q.l"OF A 6510 REGISTER TO AN ADDRESS.".v"IF WE INDEX THEN INDIRECT IT'S"."INDEXED INDIS"+"OF LOC'N (5+X) ARE LOADED INTO 'A'.","A=M(M(5+X))"20)"LDA ($0005,X)"9,"INDEXED INDIRECT. THE CONTENTS"c,"OF LOC'N (5+X) GIVE THE ADDRESS OF","THE BYTE TO BE LOADED INTO 'A'.":63000,"THEN THERE'S OUR FRIEND:",HE MEMORY LOC'N")e"AND ($B0) TO REFER TO THE CONTENTS"*f"OF MEMORY LOCATION $B0."K*h"LET'S LOOK AT ADDRESSING MODES:":63000h*r"BASIC"20)"ASSEMBLER"*w""20)""*|"A=5"20)"LDA #$05"*"IMMEDIATE MODE. OR #$80 "(," STA ($B0),Y_ INDIRECT INDEXED!":" DEY "P(6" BNE LP2 ":" INC $B0 BY #$100_??*!!HOW??"(@" DEX ":" BPL LP1 _BRANCH ON PLUS!!"(J"LDA ($B0),Y TAKES THE CONTENTS OF"NGES X TO FF(!) WHICH" &"IS NEGATIVE(!) AND WE STOP THE X-LOOP!"9&"NOTE:THE 6510 REGISTERS CAN HOLD #'S"d&"FROM $00 TO $FF.IF WE HAVE 00 AND"&"DECREMENT,IT CHANGES TO FF..AND FF+1=00"&"FINALLY,MSB=1 SIGNIFIES A NEG " $"LP1 Y=#$00 ":"LP2 LDA M+Y":" EOR #$80"-$" STA M+Y":" Y=Y-1"j$" IF Y<>0 GOTO LP2 ":" M=M+$100":" X=X-1"$" IFX>=0 GOTO LP1 ":63000:"";$"WE WORK ON M+00 FIRST,THEN YWE NEED A LOOP-WITHIN-A-LOOP"""FOR LARGE N...SOMETHING LIKE:"H"" M=$0400":" X=N _N INSTEAD OF 3"|""LP1 Y=#$FF":"LP2 LDA M+Y":" EOR #$80""" STA M+Y":" Y=Y-1""" IF Y<>0 GOTO LP2 ":" M=M+$100000 ($80 IN HEX)" Z"AND GIVES 00110101..VERY NICE!"+ d"OUR PROGRAM MIGHT GO:"\ n"BEGIN LDX #$FF ":"LOOP LDA $0400,X" x" EOR #$80 ":" STA $0400,X" " LDA $0500,X":" EOR #$80 " " STA "LET'S RVS THE SCREEN."!"THIS REQUIRES LOOKING AT EVERY SCREEN"Q"MEMORY LOCATION AND CHECKING THE MSB."|"IF IT'S 1 THEN CHANGE IT TO 0.""IF IT'S 0 THEN CHANGE IT TO 1.""(THE MSB DETERMINES IF THE CHARACTE X #$FF":"BNE LOOP":"WE SUBTRACT #$FF FROM THE"5"VALUE OF X AND BRANCH TO LOOP IF"\$"THE RESULT IS NOT ZERO!":63000{."INX ":"BNE LOOP"8"WE BRANCH TO LOOP IF THE RESULT OF"B"INCREMENTING X IS NOT ZERO.":"" "DcPT$PT$"Σ============";EdPT$PT$"ϣϑ"rEePT$BT$""PT$""EgML$" E CAN CPX #$N ONLY IF N LIES" *"IN THE RANGE $00 TO $FF."I4"SO WE CHANGE THE CODE TO:":63010g>"BEGIN LDA #$20 "H" LDX #$00 ":"LOOP STA $0400,X"R" STA $0500,X"\" STA $0600,X"f" STA $ & BRANCH INSTRUCTIONS!":"WHAT WE NEED ABOVE IS:":"COMPARE X TO #$3FF"p"& BRANCH IF NOT EQUAL..TO 'LOOP'":63010"BEGIN LDA #$20 "" LDX #$00 ":"LOOP STA $0400,X"" ^ INX ITH #$20='SPACE'.")l"STA $0400 ":"STA $0401 _FILLS SCREEN"Nv"STA $0402 _MEMORY WITH #$20.""--- ----- .----------------":"STA $07FF _HENCE CLEAR SCREEN""BUT WE CLEARLY NEED SOMETHING LIKE:":"LDA #$20""FOR X=0 TO #$3FF":SIGNIFICANT BIT"MS$" A=2*A ":63300OC$:C,49:N$"10111010":PP500:40098:63200:PP20^CC$:C,32SD$"SEC":"SET THE CARRY BIT."CR$:MS$" CARRY=1 ":63300:C,49:63200SD$"CLC":"CLEAR CARRY BIT.":MS$" #JM$:N$"10110101":PP0:40160:ML$"$1234":PP20`TSD$"INC $1234":"INCREMENTS MEMORY LOCATION $1234"^MS$" M=M+1 ":63300:N$"10110110":40160:63200h"DEC $1234":"DECREMENTS MEMORY LOCATION $1234" rMS$" M=M-1 ":63300::"TRANSFER CONTENTS OF A TO X."EMS$" X=A ":63300:41130:63200"TYA":"TRANSFER CONTENTS OF Y TO A.":MS$" A=Y "63300:41410:63200"..AND THERE'S TXA AND TAY.""HERE ARE SOME MORE:":632002"( d"LET'S GO THROUGH SOME OF THESE 6510"C n"COMMANDS...":63000R x""A$X$Y${ SD$"HERE ARE A FEW OF THE COMMANDS" "IN MY REPERTOIRE:" 63200 "LDA #$F3" "LOAD THE ACCUMULATOR WITH THE" "NUMBER F3 IN HEX"( $"WE'LL LEARN SOME MACHINE LANGUAGE"B %"IN THIS TUTORIAL."n &"BUT LET'S LET THE 6510 TELL IT..."y '63000 ("THE 6510" -"WE'VE GOT A NUMBER OF INTERNAL" 2"'REGISTERS' WHICH HOLD 8-BIT BINARY"!" PONZO*83*WATERLOO."K 53281,15:53280,12:""n " C64 TUTOR-5 "" " THE ADC'S OF 6510 MACHINE LANGUAGE  ":MS$" WELCOME! " ""EhWD40:CRT1024:(142)EiW2WD2:W3WD1:W1$((WD),2):53281,15:53280,12:""FjW2$((W2),2):W3$((W3),2)!Ft,F063000BF1SD$CL$:CL$:CL$HF3F"HIT RETURN TO CONTINUE";0700,X"p" INX ":" CPX #$FF "8z" BNE LOOP ":63000cSD$"";:T110:CL$::SD$"";"OR, WE CAN SIMPLIFY THIS A LITTLE BY""COUNTING DOWN FROM X=$FF TO $00":63010"BEGIN LDA #$20  ":" CPX #$3FF "I" BNE LOOP ":63200~"NOTE:WE WILL NEVER STA IN $07FF" "IN THE ABOVE PROGRAM...SO...":63010" CPX #$400 ":63200 "ALSO, W"STA $0400+X":"NEXT X":63000<"OR":"BEGIN LDA #$20 _NOTE STATEMENT LABEL"|" LDX #$00":"LOOP STA $0400,X _INDEXED ADDRESSING"" ^ INX":" ?CHECK FOR X=#$3FF?"" IF NOT,GOTO 'LOOP'""WE HAVE COMPARECARRY=0 "63300:CR$:C,48:63200:CC$E"STA $1234":"STORE THE A-REGISTER"~"IN MEMORY LOCATION $1234":MS$" M=A ":63300N$"10111010":41160:63000X"THAT'S ENOUGH. LET'S CLEAR THE SCREEN."b"LDA #$20 _LOAD A WN$"10110101":40160:632006|"ASL":"ARITHMETIC SHIFT LEFT"f"ALL BITS OF THE A-REGISTER MOVE LEFT.""A '0' COMES INTO THE 'LSB' AND""THE 'MSB' DROPS INTO THE 'CARRY'.""LSB=LEAST SIGNIFICANT BIT""MSB=MOST "INX":"INCREMENT THE X-REGISTER BY 1.":MS$" X=X+1 "Y"63300:N$"10101100":40130:63200,"DEX":"DECREMENT THE X-REGISTER BY 1.":MS$" X=X-1 "663300:N$"10101011":40130:63200@"AND THERE'S INY AND DEY.":63200..#$F3"" "THIS IS AN IMMEDIATE LOAD."Z MS$" A=#$F3 ":63300:N$"11110011":40110:63200 "LDX #$AB":MS$" X=#$AB ":63300 N$"10101011":40130:63200 "LDY #$DD":MS$" Y=#$DD ":63300:N$"11011101":4014063200:"TAX"+ <"NUMBERS(BYTES) FROM $00 TO $FF (IN HEX)."V A"WE CALL THEM 'A' AND 'X' AND 'Y'." B"(WE HAVE A FEW MORE..BUT WAIT..)" F"YOU MAY LOAD THEM WITH NUMBERS" P"AND PERFORM ADDITION,SUBTRACTION," Z"TESTS FOR ZERO , > , < ETC.ETC.", 60000:63100:63000Z "THE MICROPROCESSOR UNIT (MPU)"| "IN THE C64 IS THE 6510." !"HE (SHE?) WILL OBEY YOUR COMMANDS" ""IF YOU CAN SPEAK THE RIGHT LANGUAGE" #"...AND THAT'S MACHINE LANGUAGE.FA$:A$""63001FA$:A$""63002FF|T15:PT$MS$;F}PT$" ";F~PT$MS$;:F:AGSD$"":CL$" "tGSR$""zG 5E 00 F8"/a".M 002B 0033"/b".: 002B 01 08 03 08 03 08 03 08"0c".: 0033 00 80 00 00 00 80 00 FF";0d".X _ =EXIT...REMEMBER?"^0hSD14:SR09:CC$"01 08":550000rSD$"THIS SAYS BASIC PROGRAMS START"0|"AT $0801..READ IT BACKWARDS!"0 =POINTER TO TOPOF RAM(Y/N)"B ˁQ1QQ:M$(Q):B!˃ A 'STANDARD' C-64 HAS BASIC 2.0B"˃ FROM $A000 TO $BFFF.(C#˃ T0 $07FF..JUST BEFORE START OF BASIC.BC$˃ 2048=$0800 HAS '00']C%˃ THE 'LINK' IS 00 00.C&˃ ABOVE GIVES 'LINK' TO 2ND STATEMENT @Uà $A000,$0400,$0801,3,N,Y,$033C,Y,Y@8ǁI1QQ:Q$(I):@9ǃ "WHAT BRAND OF BASIC HAVE I GOT 2.0/4.0%A:ǃ "WHERE DO THE BASIC ROMS START"NA;ǃ "WHERE DOES SCREEN MEMORY START"wA<ǃ "WHERE DO BASIC PROGRAMS START"A=ǃ "BASIC PROGR 08":55010>SD15:SR09:CC$"00 80 DA 7F 00 80 14 FF":55010>SD$"JUST THE PROGRAM..FROM $0801"?"TO $082E"?62000=?SD$"..AND GUESS WHAT HAPPENS IF YOU"Q?"TYPE NEW!!"\?Ƞ62000?ܠSD14:SR09:CC$"01 08 03 08 03 08 03 08":5501:SR21:CC$"35 08 9B 08":55000ǃ "PEEK(2049)+256*PEEK(2050)=1ST STATEMENT NUMBER(Y/N)"B?ǃ "STRINGS ARE STORED AT TOP OF RAM(Y/N)"?B@ǃ "THE CASSETTE BUFFER STARTS WHERE"uBAǃ "$002B/$002C=POINTER TO START OF BASIC(Y/N)"BBǃ "$0037/$00380?SD15:SR09:CC$"00 80 DA 7F 00 80 14 FF":55010?SD$"I PUT 00 00 00 INTO $0800-$0802"@"..AND THAT'S ALL FOLKS!"9@62000:"":MS$"THAT'S ALL":63100:S@PQQ10:AN$"ANSWER="z@QA$(1)"V2":(32768)9 A$(1)"V4"@TÁI2QQ:A$(I):ED IN HI RAM."=<62000:55010=FSD$"IF YOU TYPE CLR AFTER RUNING" >P"THE PROGRAM,ALL VARIABLES,ARRAYS AND"'>Z"STRINGS GET CLEARED."2>d62000\>nSD$"THE ABOVE POINTERS REVERT TO..."g>x62000>SD14:SR09:CC$"01 08 2E 08 2E 08 2E 62000:55010;SD14:SR15:CC$"2E 08 35 08":55000;SD$"SO...THE VALUE OF 'I' IS STORED"<"IN 7 BYTES FROM $082E TO $0834"*<ğ62000N<ΟSD$"2 BYTES FOR IT'S NAME:I"z<؟"5 BYTES FOR IT'S VALUE=1,THEN 2,ETC."<⟍62000:5501062000:55010K6HSD14:SR15:CC$"2E 08":55000l6RSD$"THE BASIC PROGRAM ENDS"6\"AT $082E..AFTER THE 3 '00' BYTES."6f62000:15:SR27:CC$"14 FF":550003SD$"THIS IS THE CURRENT BASIC "4"LINE NUMBER..IGNORE!"462000:55010P4"OK..NOW WE'LL WRITE A SHORT PROGRAM:":I1500:~4"10 FORI=1TO10:A(I)=I*I:A$(I)=STR$(I)"4"20 PRINT"(34)"+"(34)":NEXT  62000:550101SD14:SR27:CC$"03 08":550001ꜙSD$"THIS SAYS ARRAYS END""2"AT $0803 TOO..NO ARRAYS YET!"4262000:55010W2SD15:SR09:CC$"00 08":55000{2SD$"THIS SAYS STRINGS GO DOWN"2"TO $8000..NO STRINGS YET!"2&62000: 055010 SD9:SR22:CC$"00":55000( SD$"THIS IS THE BYTE MEANING"C "END OF STATEMENT."N$ 62000Y% 55010{. SD9:SR25:CC$"18 08":550008 SD$"THESE POINT TO ADDRESS OF"B "THE NEXT STATEMENT"L 62000W 55010j S LONG!"-SD3:SR9:CC$"7":55000-(55010:A$:A$""6430-2".?"":MS$"AU REVOIR!":63100:"":N.@"LET'S LOOK AT SOME POINTERS.":63900u.A"(WE'LL ASSUME WE'VE GOT A C-64".B" LINK SO 'TOP OF RAM' IS AT $8000".C" AND THE 'B 62000:55010+SD8:SR27:CC$"12 08":55000,SD$"AND WHERE DOES IT SAY IT'S"#,"2 BYTES LONG?"E,"..AT MEMORY LOC'N $0812!"d,SD4:SR15:CC$"02":55000,55010:A$:A$""6330,"IF, HOWEVER, YOUR PROGRAM WAS:"," 10 AB$= 3 '00'-BYTES THAT END")"THE PROGRAM.")62000:55010*SD4:SR9:CC$"41 C2":550005*SD$"41='A' IN ASCII"W*"42='B'..BUT $80 IS ADDED"*"INDICATING A STRING, GIVING C2"*$62000:55010*.SD4:SR15:CC$"02":55000*8SDER RUNNING A PROGRAM LIKE:":QT$(34):63900(" 10 AB$=STR$(7)"2("LET'S SEE WHERE I PUT THE STRING '7'."T("WE'LL TYPE SYS2048 THEN"~(".M 0800-0830 TO SEE THE PROGRAM"(".M 7FF8-7FFF TO SEE THE STRING."(63000:"";(qSK YOU QUESTIONS ABOUT MYSELF.":MS$"GOOD!GOOD!"&"IF THE ANSWER IS AN 'ADDRESS' OR"H&"MEMORY LOCATION GIVE IT TO ME AS A"k&"4 DIGIT HEX NUMBER WITH $"&"(LIKE $1234)"&"...UNLESS OTHERWISE SPECIFIED!"&50000:63000&N1) A BASIC PROGRAM"$ "BY SIMPLY ENTERING THE APPROPRIATE"4$ "BYTES (IN HEX!) INTO THE RIGHT LOC'NS!"Z$ "..BUT LEARN YOUR ASCII CODE.."$ "AND THE SINGLE-BYTE 'TOKENS' I USE"$ "TO IDENTIFY THE VARIOUS BASIC COMMANDS"$ "LIKE PRIN5000! SD$"THIS ONE IS THE NORMAL" "" "END OF STATEMENT"", 62000!"- 55010D". SD11:SR10:CC$"00 00":55000k"6 SD$"THESE GIVE 00 00 AS A LINK""@ "TO THE 'NEXT' STATEMENT.""J "MEANING NO NEXT STATEMENT.""T 62000"U 55010"V 55010x SD10:SR22:CC$"22":55000( SD$"..THE ASCII CODE FOR "(34):"...AGAIN"3 62000> 55010^ SD10:SR25:CC$"3A":55000 SD$"THE ASCII CODE FOR :" 62000 55010 SD10:SR28:CC$"82":55000 SD$"THE TOKEN FOR 55010 SD$"THEN COMES 2 BYTES FOR THE " "STATEMENT NUMBER 20"> "(1ST BYTE)+256*(2ND BYTE)"] SD9:SR31:CC$"14":55000} SD10:SR10:CC$"00":55000 62000 (SD$,9)31)"14" (SD$,10)10)"00" SD10:SR13:CC$"99":55D$"THIS 2ND STATEMENT BEGINS"t "AT $080D AS NOTED EARLIER."9~ SD8:SR13:CC$"0D 08":55000G I150:R 55010f A$:A$""2430| SD$CL$:CL$:CL$ SD9:SR25:CC$"18 08":55000 SD$"THE ADDRESS OF THE 'NEXT' STATEMENT" "IS ASIC' IS BASIC 4.0)":63000.E"BEFORE WRITING ANY PROGRAM"$/F"(AFTER FIRST TURNING ON THE C64)"R/J"WE'LL SYS2048 TO GET INTO THE MLM.."q/T"THEN .M 002B 0033..."{/^"B*/_" PC SR AC XR YR SP"/`".; 0801 32 04 "QT$"7"QT$,"WHERE DO YOU THINK THE POINTER WILL","POINT TO?"*-"NOT TO $7FFC, BUT TO THE LOCATION"T-"IN THE BASIC PROGRAM ITSELF WHERE"l- "'7' IS LOCATED."w-62000-SD$"THAT IS, TO $080A"-"..AND IT WILL BE 1 BYTE $"THE STRING AB$ IS 02 BYTES LONG."*B62000:55010+LSD4:SR18:CC$"FC 7F":55000:+VSD$"AND IT'S LOCATED AT $7FFC."L+`62000:55010n+jSD8:SR21:CC$"20 37":55000+tSD$"HERE, AT $7FFC, IS AB$."+~"AB$ IS:20='SPACE'+37='7'"+".: 0800 00 0E 08 0A 00 41 42 24)r".: 0808 B2 C4 28 37 29 00 00 00/)s".: 0810 41 C2 02 FC 7F 00 00 AAV)t".: 0818 AA AA AA AA AA AA AA AA)u".: 7FF8 AA AA AA AA 20 37 12 08)SD3:SR24:CC$"00 00 00":55000)SD$"THESE ARE THE QQ:""Q$(N)&A$:A$""4085'" ֝";A$:""1'A$A$(N)63100:"":4120?'AN$A$(N)V'""M$(N):63000:'""WANT TO TAKE THE **TEST** AGAIN?"'," Y";A$'6A$"Y""":4080'@39999'"AFTT,FOR,NEXT,RUN,LIST,ETC."% "(TRY IT AFTER YOU END TUTOR)"1% 63000:40000:5000P%"NOW... **********"m%" * A TEST *%" **********"%I1500::MS$" A TEST?!":63100%"I'LL A(SD$,11)16)"AA AA AA AA AA AA"#^ SD$"THE BUNCH OF AAS IS JUST.......")#h "GARBAGE!"P#| 62000:"": MS$"AA AA AA":63100# "IF YOU REALLY WANTED TO YOU"# "COULD ENTER THE MLM WITH SYS2048"# "AND WRITE (OR CHANGENEXT" 62000 55010 ! SD10:SR31:CC$"00":55000-! SD11:SR10:CC$"00 00":55000L! SD$"THE 3 ZERO BYTES SAY"i! "END OF THE PROGRAM!"t! 62000! (SD$,10)31)"00"! (SD$,11)10)"00 00"! 62000! SD10:SR31:CC$"00":5000( SD$"THIS IS THE 'TOKEN' FOR PRINT" 2 620003 550105< SD10:SR16:CC$"22":55000aF SD$"THIS IS THE ASCII CODE FOR "(34)lP 62000wQ 55010Z SD10:SR19:CC$"2A":55000d SD$"THIS IS THE ASCII CODE FOR *"n 62000o  GIVEN LO-BYTE THEN HI-BYTE." "IT'S (LO-BYTE)+256*(HI-BYTE)."& 620001 55010^ SD$"..SAME FOR THE 'STATEMENT NUMBER'." SD8:SR19:CC$"0A 00":55000 I150: SD8:SR19:CC$"0A 00":55000 A$:A$""2520 62000  91,(789)PKEY740961525613168P(KEY): KEY FOR IRQ SWAPPCPD*SWITCH TO NEW WORKSPACEPE63600: RUN NUMBERQF61000: NEW THE WORKSPACEQG634037Q*SWITCH TO OLD WORKSPACEBQ63600bQSWTCH740961525691615Q(SWT >SD8:SR31:CC$"B2":55000#HSD$"THIS IS THE ASCII CODE FOR";/R" =":\62000E]55010dfSD9:SR10:CC$"31":55000pSD$"THIS IS THE ASCII CODE FOR";z" 1"6200055010SD9:SR13:CC$"A4":55000SD$"THIS IS "THAT'S WHY 'SYS2048' WORKS!"6200055010;SD8:SR13:CC$"0D 08":55000gSD$"THIS IS THE ADDRESS OF THE NEXT""BASIC INSTRUCTION."6200055010SD8:SR19:CC$"0A 00":55000SD$"THIS IS THE LINE NUMBER 10" "0"THE MEMORY HOLDING THIS SIMPLE PROGRAM."+563000:"FOR:"E6"10 FORI=1TO10 "j7"20 PRINT"(34)"*"(34)":NEXT"}8"WE'LL GET:":" .: 0800 00 0D 08 0A 00 81 49 B2D" .: 0808 31 A4 31 30 00 18 08 14N" .: 0810 00 99_"6" __ MAY BE"6;" USED BY"[<" CARTRIDGE"w@"32768=$8000 _"|63000" HOW BASIC PROGRAMS ARE STORED""RECALL THAT BASIC PROGRAMS (NORMALLY)" "GO I THE 'TOP OF BASIC RAM' MAY BE AT"="$A000..IF NO 'CARTRIDGE' IS INVOLVED."o"WE'LL COME BACK TO THESE POINTERS LATER!"z63000"TOP HALF OF MEMORY""DECIMAL HEX""65535=$FFFF-_TOP OF MEMORY""  IN LOW MEMORY:" 630007"THE ADDRESS OF"25)" IS STORED AT"b""25)"""START OF BASIC"25)"43/44 =$2B/$2C""^(USUALLY 2049=$0801)""END OF PROGRAM"25)"45/46 =$2D/$2E""^(VARIES WITH PROGRA_BOTTOM" 63000: "I STORE BYTES READ FROM A DATASETTE"b "IN 'BUFFERS' UNTIL I GET ENOUGH" ("TO STUFF INTO 'BASIC MEMORY'" 2"(IF THEY'RE BASIC PROGRAMS)." <"THESE ARE (USUALLY) NICE PLACES TO PUT" F"MACHINE LANGUAGE BASIC"$ t" PROGRAMS"G ~" _IN HERE"u " 2048=$0800-_BASIC MEMORY STARTS" " 2047=$07FF-_SCREEN MEMORY" " 1024=$0400-_" " 1023=$03FF _" " MY WORK", 60000:63100:63000L "C64 MEMORY"z "MEMORY RUNS FROM 0 TO 65535 (DECIMAL)" "OR 0000 TO FFFF (HEXADECIMAL)" "(WRITTEN $0000 $FFFF)" "SOME IS FOR YOU..SOME FOR ME." "(ABOUT HALF/HALFCH): SWAP POINTERSQ204,2:Q *RESTORE PETQ SN$"100":63600QM740961525612163:(789)71615MQRp*INSERT RUN NUMBERRqM2059:SN$"00000"SN$;RrI15:MI,((SN$,I))::1,239,127,96,76,255,255wPM90,(788):M THE 'TOKEN' FOR";" TO"62000550100SD9:SR16:CC$"31":55000VSD$"THIS IS THE ASCII CODE FOR";i" 1(AGAIN)"t6200055010SD9:SR19:CC$"30":55000SD$"THIS IS THE ASCII CODE FOR";" 0"6200" IN HEX."6200055010%SD8:SR25:CC$"81":55000HSD$"THIS IS THE 'TOKEN' FOR";V" FOR"a 62000l 55010w55010SD8:SR28:CC$"49":55000 SD$"THIS IS THE ASCII CODE FOR";*" I"462000555010 22 2A 22 3A 82 00X" .: 0818 00 00 AA AA AA AA AA AAkbSD$"":CL$" "cSR$""lSD8:SR10:CC$"00":55000vSD$"I ALWAYS HAVE 00 HERE."NTO MEMORY STARTING AT $0801(HEX)."9"LET'S LOOK AT THE BYTES THERE FOR THE"Q"SIMPLE PROGRAM:"k"10 FORI=1TO10 ""20 PRINT"(34)"*"(34)":NEXT""WE'LL SYS2048 TO GET TO THE MLM"&"THEN WE'LL .M 0800-0820 TO DISPLAY _"" RAM &"7" ROM"S""49152=$C000 _"o'" _"(" BASIC")" INTERPRETER"*" ","40960=$A000 M)"" (AND GIVES START OF )")" (VARIABLES TOO)"W"BOTTOM OF STRINGS"25)"51/52 =$33/$34"u"^(VARIES WITH PROGRAM)"" ($7FFF & DOWN_STRINGS)""TOP OF BASIC RAM"25)"55/56 =$37/$38""^(USUALLY 40960=$A000)""NOTE:PROGRAMS.".P"WHEN YOU DEFINE VARIABLES X,Y,A(I),ETC."]Z"I STORE THEM AFTER YOUR BASIC PROGRAM."d"WHEN YOU DEFINE STRINGS A$,C$(I),ETC."n"I STORE THEM AT THE 'TOP'."x"TO KEEP TRACK OF WHERE I PUT THINGS""I STORE POINTERSSPACE" " "6 " "X " _POINTERSz " _TO MAGIC " _MEMORY LOC'NS" " _FLAGS,ETC." " " " 0=$0000-)" $"LET ME SHOW YOU..."$ .63000J 8"BOTTOM HALF OF MEMORY"] B"DECIMAL HEX" L"40960=$A000-_TOP OF BASIC MEMORY" V" _" `" - - - +" e" " j"  !" PONZO*82*WATERLOO."K253281,15:53280,12:""nd" C64 TUTOR-4e""f"  INSIDE THE C64  ":MS$" WELCOME! " g" COMMANDS FOR ME.";6"THIS 'BASIC INTERPRETER' IS A SET OF"<7"MACHINE LANGUAGE INSTRUCTIONS WHICH"(< 7"RESIDE IN MEMORY FROM 40960."?<7"THAT IS: $A000"J<763000t<(7"MACHINE LANGUAGE INSTRUCTIONS ARE"<27"NUMBERS FROM 0 TO 255..AND N56,96:52,96:55,0:51,0:61000NWD40:CRT1024:CRT,96:(CRT1024)96WD80:(142)NM7409615256916OIMM91:K:I,K:GO165,203,201,46,208,83,32,195,127,165,44,201,8,240,3,32,177,127,32O142,166,165,44,201,8,240,3,76,128,1 024:(142)LiW2WD2:W3WD1:W1$((WD),2):LjW2$((W2),2):W3$((W3),2)Lt"":53281,15:53280,12:""MF(789)71615(740961525612163)MG1MH*NEW WORKSPACEKMIM74096152561516QMJiMKIMM15:K:I,K:ML 1,96 "WHEN YOU WISH TO CONTINUE WITH"J"THE TUTORIAL, HIT THE @-KEY!":63000JMS$"@_REMEMBER":63100J63000:K`204,1: INITIALIZE1KaBT$"":I124:BT$BT$"":{KbPT$"IMAL!"HdF"IN FACT YOU'VE SEEN THEM BEFORE."HnF"THEY'RE FROM 'THE INTERPRETER'."IxF"I LAST GAVE THEM TO YOU IN 'DECIMAL'."+IF"(PEEK ALWAYS GIVES DECIMAL)";IF63000:""bIFMS$"AU REVOIR!":63100:63500:rIx"":63100Iy"DU; 0801 30 30 3A 2A F7FB".FB"NOW IF YOU TYPE :"FB".M A000 A00F"FB"SO IT LOOKS LIKE:"FB63000GB"B*"GB" PC SR AC XR YR SP=GB".; 0801 32 04 5E 00 F8PGB".M A000 A00FGB"THEN HIT 'RETURN'...I'LL DISPLAY MEMORYEMORY LOCATION WHICH"D>"CONTAINS '0' AND SEND ME THERE WITH SYS."D>"ONE GOOD PLACE IS 2048. IT ALWAYS.." E>".....WELL , ALMOST ALWAYS...."6E>"CONTAINS '0'."eE>"TRY SYS2048. (REMEMBER 'X' TO EXIT)"E>"THEN TYPE @ TO CONTIC64 DOESN'T HAVE A MLM."B:"YOU CAN USE JIM BUTTERFIELD'S...":"JUST:"C:"LOAD"(34)"BUTTERMON*"(34)",8,1"4C:"NEW":"SYS50000":"X AND RETURN.":63000ZC:"LET'S TRY JUMPING TO THE MLM."C:"HIT A KEY WHEN YOU'RE READY TO TRY.""ENTER THESE, THEN RUN10, THEN SYS25000"@68"(THEN TYPE @ TO CONTINUE)"@@8"":SN$"15000":63300)A:60000:"":MS$" SLICK EH?":63100SA:"ONE M-L INSTRUCTION WHICH IS NICE"oA:"IS ZERO (I MEAN 0)."A:"THIS INSTRUCTION TELL000, THEN SYS 20000">7"WILL SEND ME THERE TO OBEY.">7"YOU MIGHT STICK YOUR PROGRAM UP AT THE"#?7"'TOP OF BASIC RAM' SOMEWHERE AND"M?7"PROTECT IT FROM BEING OVERWRITTEN"|?7"BY CHANGING 'TOP' (AT 55/56 REMEMBER?)"?763000?8" EACH MEANS"<<7"SOMETHING SPECIAL."60000:"OK..IF YOU WANT TO ENTER THE MLM"D>"YOU CAN FIND ANY MS ME TO JUMP TO THE"A:"'MACHINE LANGUAGE MONITOR'."A:"(I LIKE THE MLM SO MUCH I SOMETIMES"B:"JUMP THERE ON MY OWN!)"FB:"TO GET OUT OF THE MLM JUST TYPE AN 'X'"hB:"AND HIT THE 'RETURN' KEY."sB:63000B:"THE 'STANDARD' "?8"10 FORI=25000TO25024:READK:POKEI,K:NEXT:END"@8"20 DATA 162,4,160,4,132,177,160,0,132,176,177,176,73,128"?@"8"30 DATA 145,176,200,208,247,230,177,202,208,242,96"L@#8"RUN10"^@$8"SYS25000"@'8"HERE'S A M-L PROGRAM YOU CAN TRY"@,8 THE INTERPRETER 'HIMSELF' (HERSELF?):":63000:""=7I015:(40960I);:J1100::=763000+>7"OK...IF YOU CAN TALK MACHINE LANGUAGE"U>7"THEN YOU CAN PUT YOUR M-L PROGRAM"z>7"INTO MEMORY STARTING AT SOME">7"LOCATION, SAY 20 &"10 X=RND(K)"&"EACH NEGATIVE K DETERMINES A"'" UNIQUE SEED. THEN:"2'"20 X1=RND(1)"G'"30 X2=RND(1)"\' "40 X3=RND(1)"'"HERE X1,X2,X3,..IS A 'RANDOM SEQUENCE'"'" OF NUMBERS IN 08h3"AT LOCATION"ML" ARE INSTRUCTIONS"d8r3"WHICH CHECK FOR STOP, ETC.."8|3"YOU CAN BYPASS THE 'CHECK FOR STOP'"83"BY HAV 52"9"52"EVERY JIFFY (60 TIMES/SECOND) I" 62"STOP WHAT I'M DOING AND UPDATE THE";62"JIFFY CLOCK,AND..AMONG OTHER THINGS.."c62"CHECK TO SEE IF YOU PRESSED THE"}62"RUN/STOP KEY..."63"..AND, IF SO, THEN I WILL STO 3*+"THEN TYPE @"34+"?PEEK(55)+256*PEEK(56)":SN$"12000":633004.60000:X32768,4."8SUPPOSE TOP="XV4."IF YOU WANT TO STORE SOME NUMBERS"4/"FOR SAFE KEEPING, YOU CAN CHANGE THE"4/"TOP OF BASIC MEMORY, BY POK $"10000":633001'60000:"6"2'"MEMORY LOCATION 198 (DECIMAL) HOLDS"02$'"THE NUMBER OF CHARACTERS IN THE "I2.'"KEYBOARD BUFFER."p28'"YOU CAN CLEAR THE BUFFER WITH:"2B'"10 FORI=1TO10:GETA$:NEXT"2L'"OR"2V'"10 G  A=THE CURRENT TIME"/r"20 IFTI7,3"THIS MAGIC LOCATION IS STORED IN"b763"MEMORY LOCATIONS 788 & 789."7@3"I JUMP TO PEEK(788)+256*PEEK(789)"7J3"HOLD ON..I ING A NEW"4/"'TOP' INTO 55 & 56, SO THE NEW TOP IS":X$((X100),2)5&/"SAY, "X$", GIVING YOU 100 PLACES"=50/"TO STORE YOUR NUMBERS."n5:/"HOW TO STORE THEM? POKE THEM INTO RAM!"5D/"10 FORI=0TO99:POKE"X$"+I,A(I):NEXT":63000 ETA$:IFA$<>"(34)(34)"THEN10"2`'"OR"2j'"10 POKE198,0"2t'63000 3*"7"83+"MEMORY LOCATIONS 55 AND 56 HOLD THE"g3 +"LOCATION OF THE 'END OF BASIC MEMORY'."3+"PRINT IT OUT BY TYPING:"3 +"?PEEK(55)+256*PEEK(56)" GETA$:?A$;:NEXT"0Z#"THEN, DURING THE DELAY, YOU CAN HIT"1d#"10 KEYS (OR LESS) AND THEY WILL BE "31n#"SAVED IN THE BUFFER."]1x#"BUT..DON'T HIT > 10 KEYS!"1}#"(ELSE I WON'T GET THEM ALL)"1#"TRY IT? THEN:"1#"TYPE @ ":SN TER LISTING, TYPE:"."PRINT#4:CLOSE4" /"TO PROPERLY CLOSE THE PRINTER CHANNEL."/630000/@"4"M/J"10 FORI=1TO1000:NEXT"u/T"IS GOOD FOR BUILDING IN DELAYS."/^"BUT THE FOLLOWING IS OK TOO:"/h"10 A=TI $",10)" ^ ^",10)" 3 3",10)"SPC CRSR LEFT" -"THIS GIVES.."-" 7";A$I-"HIT 'RETURN' AND I SET A$='7'"T-63000f-"OF COURSE"|-"10 INPUT"(34)-""9)"OK YȒ"(34)";A$"-"IS NICE TOO. 54276,17 "*r"30 POKE54273,100-100*RND(0) "+w"40 NEXT "C+x"CAN YOU GUESS WHAT ^ WILL DO???":63000d+54296,15:54276,17:I0100~+54273,100100(0):+54296,0:54277,0+MS$"BEAUTIFUL!":63100:63000 "(;"A REPRODUCIBLE 'RANDOM SEQUENCE'.":63000")@"IF YOU REALLY WANT A RANDOM NUMBER:"7)E"10 X=RND(0)"f)J"WILL GIVE YOU ONE. SUCCESSIVE 'RND(0)'")O"STATEMENTS YIELD NO'S TOTALLY UNRELATED.")PMS$"SO IT SAYS":63100)Y630 TRY IT!" "IN PARTICULAR, TRY RUNNING:"5 "10 FOR I=0 TO 255 "Q "20 POKE1024+I,I "r "30 POKE55296+I,15*RND(1)" "40 PRINTCHR$(14+K);" "50 FORJ=1TO200: NEXT " "60 K=128-K:NEXT " MS$"DO A CHR$!":63100  TC."$P"70 OPENS A READ CHANNEL TO FILE NM$.")%Z"90 CHECKS FOR END-OF-FILE(STATUS=64)."4%`63000p%b"TO REITERATE: WHEN WRITING DATA":"DO NOT USE:"%c"PRINT#1,A,B$,C OR PRINT#1,A;B$;C;"%d"INSTEAD USE:"%e"PRINT#1, ANNEL,#2,"#"FOR A SEQUENTIAL(DATA) FILE CALLED NM$"7#"30 PRINTS A NUMBER,A,TO THE DATA FILE."z#"YOU MAY REPEAT STATEMENT 30":"WITH VARIOUS A'S,THEN.."#"40 CLOSE2:CLOSE15":# 63000#"TO READ FROM A FILE:"#" J=J+1:GOTO310"!`"330 CLOSE2 "!!j63000:SN$"05000":63600,!60000H!"TO CREATE A FILE:"}!"10 OPEN15,8,15,"(34)"I"(34)"+DR$ "!"20 OPEN2,8,2,DR$+"(34)":"(34)"+NM$+"(34)",S,W"(34)!"30 PRINT#  MARKER ON TAPE.""WHEN READING DATA YOU CHECK FOR THIS:"/"IF ST=64 THEN ..."LMS$" CLOSE!":63100W63000"THE WRITE TO TAPE ROUTINE IS THEN:""200 OPEN3,1,1,"(34)"DATA"(34)" ""210 FOR I=1TO10 ANS READ"H"IT IS ASSUMED THERE ARE 10 NO'S TO READ."\630009f"A PRINT# STATEMENT:"Pp"220 PRINT#3,I"~z"WILL WRITE THE VALUE OF I,FOLLOWED BY""A RETURN & SPACES!""YOU DON'T WANT THE 'SPACES'!""THE CORR THIS WRITES THE NUMBERS 1,2,..10"." ON THE TAPE-FILE CALLED "(34)"DATA"(34)963000e"IT'S VERY IMPORTANT TO CLOSE THE ""WRITE CHANNEL AFTER PRINTING TO TAPE!!""(ELSE I WON'T PRINT AN END-MARKER""AND MAY NOT WRITE T INPUT/OUTPUT"":"TO WRITE DATA ON TAPE YOU "QD" OPEN A WRITE CHANNEL TO THE CASSETTE"N"YOU'LL WANT TO GIVE THE DATA A NAME,TOO"X" AND YOU'LL WANT TO DISTINGUISH BETWEEN"b" WRITING TO TAPE AND READING FR N..":63001"YOU CAN SET THE CORRECT TIME BY TYPING:">"TI$="(34)"093000"(34)l"THEN I'LL COUNT JIFFIES STARTING WITH""A COUNT CORRESPONDING TO 9:30 A.M.""(000000=MIDNIGHT!!)":63000"THE VARIABLE TI GIVES THE JI SECONDS..""" OR YOU COULD USE MY BUILT-IN ROUTINE!"4,"100 PRINT TI$"l6" HERE,TI$ WILL GIVE HHMMSS LIKE SO:":"015209";"01=HOURS 52=MINUTES 09=SECONDS.":63000@"I'LL PRINT OUT TI$ SO YOU CAN SEE HIM:" JAA$TI$:  "PRINTCHR$(142) "4 "WILL PUT ME BACK TO UPPER CASE."k "...THEN TYPE @ TO CONTINUE" SN$"04000":6330059468,12:60000"IN 160,161 & 162 I KEEP THE TIME"" ...FROM THE MOMENT YOU TURN ME O A;CHR$(13);B$;CHR$(13);..ETC"&f"IF IT'S PAINFULL TO TYPE 'CHR$(13)' THEN"8&g"DEFINE CR$=CHR$(13) AND USE:"^&h"PRINT#1,A;CR$;B$;CR$;C;CR$;"i&j63000&"RANDOM NUMBERS"&"I HAVE A RANDOM NUMBER GENERATOR." 60 OPEN15,8,15,"(34)"I"(34)"+DR$ "4$("70 OPEN2,8,2,DR$+"(34)":"(34)"+NM$+"(34)",S,R"(34)\$2"80 INPUT#2,A(J) "$<"90 IFST<>64THENJ=J+1:GOTO80 "$F"100 CLOSE2:CLOSE15 "$K"60 INITIALIZES E 2,A;CHR$(13); " ""DR$ IS DRIVE # PREVIOUSLY".""NM$ IS FILE NAME DEFINED!"Y""10 OPENS THE COMMAND CHANNEL #15"""AND INITIALIZES THE DRIVE DR$."""(NOT NECESSARY ON 'NEWER' DRIVES)."""20 OPENS A WRITE CH ""220 PRINT#3,I;CHR$(13);" $"230 NEXT "1 ."240 CLOSE 3 "Z 8"THE READ FROM TAPE ROUTINE IS:" B"300 OPEN2,1,0,"(34)"DATA"(34)" " L"310 INPUT#2,A(J) " V"320 IF ST<>64THEN ECT WAY IS:""220 PRINT#3,I;CHR$(13);"2"HERE YOU SPECIFY THE RETURN=CHR$(13)"O"..WITHOUT SPACES....""THE ; AT THE END AVOIDS 'LINE FEED' TOO!":63000"THE STATEMENT:""240 CLOSE 3""WRITES AN END-OF-FILE HE LAST BIT OF DATA)." "TO READ A FILE(CALLED,SAY,'DATA')"B"300 OPEN2,1,0,"(34)"DATA"(34)_"310 FOR I=1TO10 "| "320 INPUT#2,A(I) "*"330 NEXT "4"HERE THE READ CHANNEL IS #2">"..THE LAST #0 ME OM TAPE."l"200 OPEN3,1,1,"(34)"DATA"(34)""@v"OPEN A CHANNEL(#3)TO THE TAPE DRIVE(#1)"r" FOR WRITING (THE LAST #1 MEANS WRITE)""210 FOR I=1TO10""220 PRINT#3,I ""230 NEXT ""240 CLOSE 3 "" FFIE-COUNT""I'LL PRINT HIM TOO:":T1500::""4" "TI\" ^ THAT'S HIM!""PLEASE, DON'T USE TI$ OR TI FOR ANY""OF YOUR VARIABLE NAMES!""  "RETURN..":630010" H$(AA$,2):M$(AA$,3,2):S$(AA$,2)OT1500:8T" "AA$c^" ^ THAT'S HIM!"wc"IT'S BEEN:"d""H$" HOURS,"M$" MINUTES & "S$" SECONDS"e"SINCE YOU TURNED THE C64 ON!"h"RETUR N." "I'VE GOT A BUILT-IN "+" CRYSTAL-CONTROLLED CLOCK."U" I KEEP THE NUMBER OF JIFFIES IN"w" MEMORY LOC'NS 160,161,162"" A JIFFIE IS 1/60 SECOND.""YOU COULD WRITE A PROGRAM TO CONVERT"" THIS TO HOURS:MINUTES: HAVE HOME";?O" "(34)""(34)?OI1200:?O"..AND CLEAR ";?O" "(34)""(34)@OI1200:%@$O"..AND RVS "(34)""(34)4@%OI1200:Z@.O"..AND RVS-OFF "(34)""(34)k@8OI1500::@BO">>>GET TO KNOW THEM<<<"@GO O CONTINUE!":63100i63000:"",nSN$"02000":63300^60000:"SOME SPECIAL LOCATIONS":"IN 197 I KEEP TRACK OF WHAT KEY IS"" DEPRESSED. TO SEE THE KEY VS. NUMBER"" CORRESPONDENCE, TRY:""50 PRINT P )"ABC"(34)&" OR BY 'POKEING' SCREEN MEMORY:":" POKE1100,1"i "THIS PUTS 1 INTO SCREEN MEMORY LOC'N"" 1100, AND 1 CORRESPONDS TO AN "(34)"A"(34)" SO I'LL PRINT THE LETTER "(34)"A"(34)$63000("TO SEE WHAT NO. I FOR POKE M,N "; :"M MUST BE IN [0,65535],N IN [0,255]."g "I USE 0 THRU' 1023 MYSELF..YOU USE " " 2048 TO 40959 FOR BASIC PROGRAMS.." "I USE 1024 THRU' 2047 " TO STORE THE 1000 CHARACTERS APPEARING" " ON THE SCREEN, TWO BYTES ARE USED TO ADDRESS"H " 2^16 MEMORY LOCATIONS:0,1,2,...,65535"z $"YOU CAN FIND WHAT'S IN EACH BY PEEKING:" ."FOR I=100 TO 200:PRINT PEEK(I);:NEXT" 8"THIS MAY BE ENTERED DIRECTLY" B" AND WILL PRINT THE CONTENTS" L"  00100";" PONZ0*1983*WATERLOOH"d53281,15:53280,12:"":" C64 TUTOR-3e""f"  MORE ON THE C64  ":MS$" WELCOME! ") g H*SWITCH TO OLD WORKSPACEH63600HSWTCH740961525691615H(SWTCH): SWAP POINTERSH204,2:I *RESTORE PETI SN$"100":63600FIM740961525612163:(789)71615MLIdIp*INSERT RUN NUMBERIqM2059:SN$"00000" ,195,127,165,44,201,8,240,3,32,177,127,32F142,166,165,44,201,8,240,3,76,128,164,76,174,167,162,16,189,2399G127,72,181,42,157,239,127,104,149,42,202,208,241,96,120,173,238,127~G77,20,3,141,20,3,173,239,127,77,21,3,141,21,3,88,96,173,20,3,73 15(740961525612163)DGDH*NEW WORKSPACEDIM74096152561516DJDKIMM15:K:I,K:EL 1,96,3,96,3,96,3,96,EM 144,127,0,0,144,127,0,0IENM64096:I02:MI,0:OEOE"HIT RETURN TO CONTIN 4,1: INITIALIZEBaBT$"":I124:BT$BT$"":CbPT$""NCcPT$PT$"Σ============"CdPT$PT$"ϣϑ I1200::@LO"INSIDE QUOTES,THEY DO THEIR THING."@OI1500::@P63000:@@[63000@x"":63100&Ay"DURING THE TUTORIAL YOU MAY WISH"NAz"TO RETURN TO AN EARLIER 'PAGE'."yA{"JUST HIT THE @-KEY, AT ANY TIME,"A|"AND THE TUT EEK(197);""60 GO TO 50 "9 "THEN RUN AND BANG ON A KEY!"]"THEN TYPE @ TO CONTINUE."tSN$"03000":63300 60000 "PRINTCHR$(14) WILL CAUSE" "ME TO SWITCH TO "(34)"LOWER"(34)" CASE." "YOU MIGHT LIKE TO N [0,255] CORRESPONDS"22"TO WHICH SYMBOL, YOU CAN TRY THIS:"M<"10 FOR I=0 TO 255"gF"20 POKE1024+I,I "P"30 NEXT "Z"..AND TRY POKE1100,N"["WITH 'N'=0,1,2,...OR 255.":MS$" TRY IT!"d"THEN TYPE @ T ETC.ETC"$ "(NOTE:80 COLUMN PETS HAVE 2000)< "SCREEN MEMORY"e "THESE 1000 LOC'NS START AT $0400" " 0400(HEXADECIMAL)=4*256=1024(DECIMAL)" "YOU CAN CHANGE WHAT'S" " ON THE SCREEN WITH A PRINT STATEMENT" " PRINT "(34 OF LOCATIONS 100 TO 200."C V"SOME OF MEMORY IS READ ONLY(ROM)."k `"SOME IS RANDOM ACCESS(RAM)." j"YOU CAN WRITE INTO RAM BY POKEING." t" POKE1100,1" y"THIS WILL PUT THE NO. 1 IN LOC'N 1100." z63000 "NOTE: ""F hSN$"1000":63200:63600X i60000:59000c 60000 "I STORE INFO IN 8 (BINARY) BIT "(34)"BYTES"(34)"." "SINCE 2^8=256, EACH BYTE CAN HOLD A" " NUMBER FROM 0 TO 255 INCLUSIVE." "'SN$IrI15:MI,((SN$,I))::1,239,127,96,76,255,255GM90,(788):M91,(789)GKEY740961525613168H(KEY): KEY FOR IRQ SWAPHC;HD*SWITCH TO NEW WORKSPACESHE63600: RUN NUMBERrHF61000: NEW THE WORKSPACE}HG63403 G144,141,238,127,173,21,3,73,127,141,239,127,96,76,255,255GM90,(788):M91,(789)GKEY740961525613168H(KEY): KEY FOR IRQ SWAPHC;HD*SWITCH TO NEW WORKSPACESHE63600: RUN NUMBERrHF61000: NEW THE WORKSPACE}HG63403 UE";EA$:A$""63001EA$:A$""63002E:E|T15:PT$MS$;E}PT$" ";E~PT$MS$;:E:!F56,96:52,96:55,0:51,0:610003FWD40:(142)LFM7409615256916dFIMM91:K:I,K:F165,203,201,46,208,83,32 "CePT$BT$""PT$""CgML$"" DhWD40:CRT1024:(142)0DiW2WD2:W3WD1:W1$((WD),2):RDjW2$((W2),2):W3$((W3),2)tDt"":53281,15:53280,12:""DF(789)716 ORIAL WILL BACK UP"A}"A PAGE OR TWO."A~"ALSO, YOU HAVE AN OPPORTUNITY TO"B"COMPOSE YOUR OWN PROGRAMS.")B"WHEN YOU WISH TO CONTINUE WITH"WB"THE TUTORIAL, HIT THE @-KEY!":63000uBMS$"@_REMEMBER":63100B63000:B`20 'S SO"*'" THE LARGEST IS 30. THE REDUCED VALUE"+'" IS CALLED S."+'"HIT A KEY",+'A$:A$""10230[+(:"#250 GETS THE INTEGER PART OF S..(IS)"+ (" AND THE FRACTIONAL PART OF S..(FS)"+("#260 PRINTS A BUNCH OF  'S"+("#270 P =HNI12000:=RNI110=\N"";:=fN14);=pNI18:T150:=zN"  ";:=NI1500:>N" _THAT'S HIM"C>NCSR327688WD14:I1100:CSR,32:CSR,160:c>N"THEN WE HAVE CRSR-LEFT";{>N" "(34)""(34)>NI1500::>N "DURING TUTOR YOU MAY HAVE NOTICED:";;"'HIT RETURN TO CONTINUE'."<$;"THE LITTLE SUBROUTINE WHICH PRINTS"<<);"THIS AT THE BOTTOM OF THE SCREEN.."W<*;"THEN WAITS!..IS:"b<.;63000<=;"":MS$"AU REVOIR!":63100:63500:""N" "(34)""(34)>NI1500::>N"AND CRSR-UP";>N" "(34)""(34) ?NI1500::#?N"AND CRSR-DOWN";=?N" "(34)""(34)O?NI11500::p?N"(ALL BROTHERS,OF COURSE)."?NI11000::?N"WE ALSO 6300063003< N""<%N" BEFORE I FORGET, I SHOULD INTRODUCE"<*N"MY FRIEND"(34)"CURSOR"(34)"."=/NI11000:;=0NWD80:327681024,96:(32768)96WD40_=4N"I CALL HIM CRSR FOR SHORT."o=9NI11500:=>N"COME ON CRSR..DON'T BE SHY." NEXT":::"..TAKING 10 CHARACTERS FROM THE BUFFER.":::"THAT'S ENOUGH TO EMPTY IT!";::"..OR YOU CAN HAVE:">;;:"100 GETA$:IFA$<>"(34)(34)"THEN100"m; ;"THIS WILL 'GET' A CHARACTER UNTIL THE ";;"BUFFER IS EMPTY.";;:63000;;  BUFFER"8::"AND TAKE THE ENTRIES FROM THERE."8::"(IN FACT I ALWAYS TAKE KEYBOARD INPUT"#9::"FROM THE KEYBOARD BUFFER)."09::63000_9:"WHEN WRITING A PROGRAM YOU CAN INCLUDE"z9::"A STATEMENT LIKE:"9::"100 GETA$:IFA$="(34)(3 8*FS)"6T3"280 NEXT"6Y3:"(NOTE THAT #230 INCLUDES A RVS-OFF)"7^3:"ENTER THESE STATEMENTS AND TRY IT"07h3"TYPE @ TO CONTINUE."G7r3SN$"15000":63400n7:60000:"":MS$"IT WORKS!":631007:"LET ME SAY ONE LAST THING..ABOUT GET." 270"440"THEN,IN #270,YOU PRINT THE FRACT'L PIECE"4>0"OF S$(8) ONLY."4H063000*5R0"THE "(34)"FINISHED"(34)" PRODUCT IS:"A52:"170 FORI=1TO12q52"180 ?"(34)""(34)"M$(I)"(34)"-"(34)";52"190 L$=STR$(V(I))53"200 L=LEN(L$)53" O BE PRINTED HAS"2/"MAX'M LENGTH (L=ML) WE OMIT THE  'S."2/" "3/63000(3/"FINALLY,IN A FOR-NEXT LOOP"Q3/"I ALWAYS OBEY THE INST'NS BETWEEN"|3/" "(34)"FOR"(34)" AND "(34)"NEXT"3/"AT LEAST ONCE BEFORE CHECKING IF I'VE NOW ..."0!/"WE'LL INSERT #210 & #220:":0&/"210 IF L=ML GOTO23010/"220 FORJ=1TOML-L:?S$(8);:NEXTF1:/"230 ?"(34)""(34)"L$"(34)""(34)";"`1D/"240 S=V(I)*30/MAXV"n1N/"ETC.":1X/"HIT A KEY"1b/A$:A$""121301l/:"IF THE VALUE L=LEN(L$).R+"230 ?"(34)""(34)"L$"(34)""(34)";"/\+"240 S=V(I)*30/MAXV" /f+"250 IS=INT(S):FS=S-IS"C/p+"260 FORJ=1TOIS:?S$(8);:NEXT"X/z+"270 ?S$(8*FS)"h/+"280 NEXT"/+:"(TYPE @ TO CONT.)"/+SN$"12000":63400/.60000:"": M "#99-#160. AFTER YOU HAVE ENTERED IT..",("TRY IT!"-("IN PARTICULAR, ENTER VALUES"@-("WHICH HAVE DIFFERENT LENGTHS,LIKE:"V-("123 AND 1234."-("(THEN YOU'LL SEE WE'VE GOT SOME WORK TO"-)"DO ON THE PROGRAM!)"-h)"SEE IF YOU "(34)" TO M$(2)..ETC."y 630005~ "YOU'LL HAVE TO TELL ME HOW MANY OF THE"a "M$(1),M$(2),ETC. YOU HAVE, SO I CAN" "LEAVE ROOM FOR THEM IN MY MEMORY," "SO YOU'LL NEED A STATEMENT:" "90 DIM M$(12)" "THIS SAYS: THE DIMEN =1TO12(8'"180 ?"(34)""(34)"M$(I)"(34)"-"(34)"; )B'"190 L$=STR$(V(I)) )L'"200 L=LEN(L$)N)j'"230 ?"(34)""(34)"L$"(34)""(34)";"h)t'"240 S=V(I)*30/MAXV")~'"250 IS=INT(S):FS=S-IS")'"260 FORJ=1TOIS:?S$(8);:NEXT")'"270 ?S$(8*FS) ,JUN"&!"101 DATA JUL,AUG,SEP,OCT,NOV,DEC"'!:"102 FORI=1TO12:READ M$(I):NEXT"-'!"104 MAXV=0:ML=0"D'!"105 FOR I=1TO12"i'!"110 ?M$(I)"(34)" VALUE="(34)'!"120 INPUT V(I)"'""130 IF MAXV"140 L=LEN(STR$(V(I)))"#H"150 IF MLV(1)10:V(2)15:V(3)20:V(4)25:V(5)30:V(6)31HV(7)25:V(8)20:V(9)15:V(10)12:V, THEN KEEP PRESSING RETURN,"<"SO I'LL THINK YOU TYPED THEM,AND I'LL"U"REMEMBER THEM."e""~"10 S$(1)="(34)"""20 S$(2)="(34)"""30 S$(3)="(34)"""40 S$(4)="(34)"""50 S$(5)="(34)"""60 S$STRANGE?"+ "WELL, THE 1ST 4 ARE ON THE KEYBOARD."V "THE LAST 4 ARE OBTAINED BY RVSING" "THE CHARACTERS> ,,,AND " 32)"^" (31)"THAT'S A" 231)"SPACE. " <"NOTE THAT WE TURN" F"THE RVS OFF TOO!" P"  "2 `"(..AND I CERTAINLY WON'T EVALUATE A$)"[ j" " t"NOW, ONE VERY NICE SET OF SYMBOLS IS:" ~"     "  "WE'LL CALL THEM S$(1), S$(2),..,S$(8)" 63000 "WE'LL TYPE"D hSN$"1000":63200:63600V i60000:59000h 60000:20000 "IN THIS,THE 2ND PART OF "(34)"TUTOR"(34) "WE'LL TALK ABOUT THE MANIPULATION OF" " STRINGS." " " "RECALL: AN(SWTCH): SWAP POINTERSL204,2:L *RESTORE PETL SN$"100":63600LM740961525612163:(789)71615MLMp*INSERT RUN NUMBER+MqM2059:SN$"00000"SN$KMrI15:MI,((SN$,I))::1,239,127,96,76,255,255KM90,(78,128,164,76,174,167,162,16,189,239J127,72,181,42,157,239,127,104,149,42,202,208,241,96,120,173,238,127*K77,20,3,141,20,3,173,239,127,77,21,3,141,21,3,88,96,173,20,3,73iK144,141,238,127,173,21,3,73,127,141,239,127,96,76,255,255KM90,(78 1516HJHKIMM15:K:I,K:HL 1,96,3,96,3,96,3,96HM 144,127,0,0,144,127,0,0HNM64096:I02:MI,0:HO6I"HIT RETURN TO CONTINUE";LIA$:A$""63001aIA$:A$""63002gI{I|T15:PT$MS$; 4)1:" 31 NEXT I _NOTE"1:" 40 NEXT J _NOTE"2:"IF YOU GET CONFUSED WITH".2:"ALL THOSE NEXTS..."O2:"TYPE: NEXT I & NEXT J"Z2:63000q2:"WANT TO TRY?"2:"I'LL REPEAT THE INSTRUCTIONS."2 ;"YOU CAN ENT U REVOIR!":63100:63500:Dx""Dy"DURING THE TUTORIAL YOU MAY WISH"Dz"TO RETURN TO AN EARLIER 'PAGE'."&E{"JUST HIT THE @-KEY, AT ANY TIME,"LE|"AND THE TUTORIAL WILL BACK UP"cE}"A PAGE OR TWO."E~"ALSO, YOU HAVE AN OPPORTU AND 'Y' AND 'SAM'"BpN"AND WILL START FROM SCRATCH."BzN"GOTO.. AND I'LL REMEMBER THEM!"BN63000 CN"THIS IS HANDY:"9CN"STOP A PROGRAM WHILE IT'S RUNNING"KCN"AND TYPE:"^CN"?X:?Y:?SAM"CN"AND I'LL PRINT THE VALUES OF THESE )" "(34)"S$"(34)""(34)";"@M"21NEXT"@M"29FORI=1TO"W1$":GOSUB500"@M"30?"(34)""(34)"S$;"AM"31NEXT" AM"40NEXT":"50GOTO1"@AM"500FORT=1TO5:NEXT:RETURN"fAM"TYPE IT IN & RUN TO RUN IT."AM"THEN TYPE @ TO CONTINUE":SN$>ZF"THOSE SEMI-COLONS!!!">dF" ">nF"SO END EACH PRINT STATEMENT"?xF"..NAMELY #10,#20 & #30...".?F"WITH A SEMI-COLON! ;"`?F"BUT FIRST, LET'S FORGE AHEAD!":63000:""t?FMS$"GO!GO!GO!"?F63100?F?8J"";:<2A" ^ THAT'S RVS OFF!"60000:"DOESN'T WORK DOES IT?"4>180005>"NOW SUPPOSE YOU'D LIKE TO SPECIFY"75>"THE SYMBOL USED..INSTEAD OF *."]5>"IN THE PROGRAM, REPLACE * IN "5?"STATEMENTS #10,20&30 BY,SAY,S$"5 ?"THEN INCLUDE THE STATEMEER THE INST'NS BY PUTTING"2 ;"THE CURSOR AT THE FIRST INSTR'N"3 ;"THEN REPEATEDLY PRESSING 'RETURN'"A3;"SO I'LL THINK YOU TYPED THEM IN."L3;63000d3="";:"5FORJ=1TO2"x3="9FORI=1TO"W3$3="10?"(34)" *"(34)3="11NEXT"3="1NITY TO"E"COMPOSE YOUR OWN PROGRAMS."E"WHEN YOU WISH TO CONTINUE WITH"F"THE TUTORIAL, HIT THE @-KEY!":63000"FMS$"@_REMEMBER":63100/F63000:GF`204,1: INITIALIZEiFaBT$"":I124:BT$BT$"":FbPT$""CN"VARIABLES AT THE TIME I WAS STOPPED."CN"YOU CAN TYPE CONT TO CONTINUE"DN"WHERE I LEFT OFF...OR.."/DN"GOTO100 TO CONTINUE AT STATEMENT 100"[DN"WITHOUT FORGETTING 'X' AND 'Y' ETC."jDN""uDN63000DO"":MS$"A"20000":63300A N60000:"A FINAL WORD (..OR TWO..):"A*N"SOMETIMES YOU RUN A PROGRAM WITH:"A4N"RUN 10"B>N"SOMETIMES WITH:"'BHN"GOTO10"FBRN"WHAT'S THE DIFFERENCE?"qB\N"WELL..IF YOU TYPE RUN.. I FORGET"BfN"THE VALUES OF 'X'"1?"(34)""(34)?BJ"2INPUT"(34)"LINES="(34)";L"?LJ"3?"(34)"SYMBOL?"(34)?VJ"4INPUTS$"@bM"5FORJ=1TOL"$@lM"9FORI=1TO"W3$":GOSUB500"Q@vM"10?"(34)" "(34)"S$"(34)""(34)";"_@M"11NEXT"@M"19FORI=1TO"W3$":GOSUB500"@M"20?"(34NSTRUCTIONS AT 500:"=B"500 FORT=1 TO1000"=B"510 NEXT "="B"520 RETURN "%>,B"AFTER DOING 'NOTHING' 1000 TIMES I'LL"T>6B"'RETURN' TO CONTINUE THE MAIN PROGRAM."f>@B63000:19000>PF"OF COURSE WE FORGOT TO INCLUDE ALL"4)" *"(34);@" ^";@"THAT'S A 'RVS' COMMAND!";@63000<@"I'LL PRINT LOTS OF THINGS IN"<A" REVERSE FIELD"1< A" "[<A" SO IF YOU WANT IT "(34)"OFF"(34)|<A" INSERT A PRINT COMMAND:"<(A:"41?"(34)""(34))"L"(34)98@"SO INSERT THE STATEMENT:"9B@"2 INPUT"(34)"LINES="(34)";L":V@"I'LL PRINT THE PROMPTING REMARK:"&:`@"LINES=?"R:a@"AND WILL WAIT FOR L TO BE TYPED IN."]:j@63000:t@"THEN YOU MAY WANT TO USE MY CLASSY":~@""(34)"REVIVE ME SOMETHING TO DO,LIKE:"7?"50 FORI=1TO5000:G=0:NEXT" 8?"THAT WAY I'LL GO AWAY AND SET G=0"8?"5000 TIMES!":8?"..OR YOU COULD HAVE:"O8?"50 GO TO 50"{8?"THEN I'D 'LOOP' ON STATEMENT#50 AND"8?"TO STOP ME YOU'D HIT STOPNTS:"5?"3?"(34)"SYMBOL?"(34)5 ?"4 INPUT S$"6*?"NOW I'LL WAIT FOR YOU TO ENTER THE",64?"SYMBOL(OR STRING)WHICH IS LATER"G6>?"REFERRED TO AS S$."R6C?63000j6H?"ANOTHER THING.."6R?"YOU WILL WANT TO CLEAR THE "6\?"SCREEN AT TH 9FORI=1TO"W3$3="20?"(34)" *"(34)3="21NEXT"3>"29FORI=1TO"W1$ 4>"30?"(34)"*"(34)4>"31NEXT"(4>"40NEXT"U4!>"AFTER ENTERING STATEMENTS 5-40 TYPE:"z4">"RUN TO RUN YOUR PROGRAMME."4&>"(TYPE @ TO CONTINUE TUTOR 1).":SN$ SAM=10"#"SALLY=20"#"TO ME, BOTH HAVE THE SAME NAME!",#"NAMELY SA!"X#"HENCE SA=10 FOLLOWED BY SA=20 MAKES"n#"SAM=SALLY=20."#MS$"SAM=SALLY?":63100#63000':'" IN ADDITION TO MANIPULATING NUMBERS"'"I CA T"(34)"*"(34)/4:" 40 NEXT"/5:" 40 NEXT"0H:"NOTE THAT WE USE "(34)"J"(34)50R:"FOR THE LOOP THAT REPEATS FOR 2 LINES."\0\:"(THAT IS, THE OUTERMOST LOOP)."0f:"WITHIN THIS LOOP DON'T USE J AGAIN!"0u:"(SO WE USED I)"0{:630 NK SPACES IN THE INST'NS."-&9"(ME SMART FELLOW!)".09"ANYWAY..THE LAST FOR-NEXT LOOP"5.:9"REPEATS ALL THE ABOVE TWICE!"I.D9" "`.N9"SO YOU'D TYPE:".X9"5FORJ=1TO2 _FIRST STATEMENT".b9"40NEXT _LAST STATEMENT".l963 =1 TO "W3$" ",t8"10?"(34)" *"(34)" WE HAVE THIS SO FAR",u8"11 NEXT "3,8"NOW YOU'D TYPE:"L,8"19 FOR I=1 TO"W3$h,8"20?"(34)" *"(34)w,8"21 NEXT",8"NOTE THE SEQUENCE OF PRINT INST'NS:",8"SPACE-C'BE REPEATED")7"2 TIMES,FOR 2 LINES!")763000 *7"HERE WE GO!"*7I1500:B*7"ASSUME THE CURSOR IS 'OVER' A *."e*7"TO ERASE WE TYPE 'SPACE'.."*7"THEN *,THEN A 'CURSOR-LEFT'"*7"(LEAVING THE CURSOR AGAIN 'OVER' *)."'6J1WD1:T15:'6" *";:'6J1WD:T15: (7"*";::( 763000E(7"":MS$" NICE ! ":60000:63100:"";[(F7"LET'S TRY IT!"(P7"THERE WILL BE 4 FOR-NEXT LOOPS."(Z7"1:"W3$" MOVEMENTS TO THE RIGHT."(d7"2:"W32 ETC.ETC."%3"OR,YOU COULD REPEAT THE INSTRUCTION:"&3"10 ?N*N">&3"AGAIN & AGAIN,FOR N=1 THEN N=2..ETC."m&"3"TO DO THIS YOU PUT THE INSTRUCTION TO "&,3"BE REPEATED WITHIN A FOR-NEXT LOOP:"&@3"10 FOR N=1 TO 100 _HERE'S THE A"#D/"40?"(34)"ENTER SIDE B"(34)$N/"50 INPUT B".$X/"60 C=SQR(A*A+B*B):?"(34)"HYP="(34)"C"A$b/"70 GO TO 20"h$l/"THE ONLY THING NEW IS INPUT."$/"AT STATEMENT#30 I'LL WAIT FOR YOU"$/"TO TYPE IN A NUMBER, AND I'LL CALL"$/" IT! THEN TYPE @"!+MS$" GREAT? ":63100"+SN$"12000":63300F".60000:"WELL..IF YOU TRIED IT YOU'LL NOTICE""u"."THAT A$ STANDS FOR EVERYTHING INSIDE""."THE QUOTES. IF YOU WANT A SPACE""."AFTER I..THEN INCLUDE THE SPACE TOO!""'"X=2+3"'"X$="(34)"2+3"(34) '"?X" '"?X$"/ '"..SEE WHAT I'LL PRINT?"k '"THEN TYPE @ TO CONTINUE.":MS$" ???? ":63100 'SN$"11000":63300 *60000 +"YOU GUESSED IT!" +"I'LL PRINT:" +:" 5" +"2+3"N MANIPULATE STRINGS OF SYMBOLS."&$'"IN THE SAME WAY THAT YOU ASSIGN A NAME"N.'"TO A NUMBER,LIKE X OR Y OR SAM,"w8'"YOU CAN GIVE A NAME TO A STRING"B'"OF CHARACTERS."L'"SO THAT I DON'T BECOME CONFUSED"V'"I MUST KNOW WHETHER 000:" 5 FORJ=1TO2"0:" 9 FORI=1TO"W3$0:" 10 PRINT"(34)" *"(34)1:" 11 NEXT I _NOTE"61:" 19 FORI=1TO"W3$X1:" 20 PRINT"(34)" *"(34)y1:" 21 NEXT I _NOTE"1:" 29 FORI=1TO"W1$1:" 30 PRINT"(34)"*"(3000.9"NOW OUR PROGRAM(PROGRAMME?)LISTS LIKE:".9" 5 FORJ=1TO2"/9" 9 FORI=1TO"W3$1/9" 10 PRINT"(34)" *"(34)A/9" 11 NEXT"X/:" 19 FORI=1TO"W3$z/ :" 20 PRINT"(34)" *"(34)/:" 21 NEXT"/ :" 29 FORI=1TO"W1$/*:" 30 PRINSORLEFT-C'SORLEFT-*-C'SORLEFT"-8"NOW WE HAVE * MOVING TO THE RIGHT,"'-8"AND TO THE LEFT,"4-8"NOW:"J-8"29FORI=1TO"W1$b-8"30?"(34)"*"(34)p-8"31NEXT"{-963000-9"NOTE THAT YOU NEEDN'T LEAVE ALL THOSE"-9"BLA*8"10?"(34)" *"(34)*8" ^"+8" THIS IS CURSOR-LEFT!"/+68"REPEAT THESE INST'NS "W3$" TIMES"H+@8"WITH A FOR-NEXT"[+J8"LIKE SO:":t+T8"9 FOR I=1 TO "W3$+^8"10?"(34)" *"(34)+h8"11 NEXT";+r863000+s8"9 FOR I$" TO THE LEFT.."(n7"(EACH OF THE ABOVE WILL PRINT A NEW *"$)x7"AND ERASE THE OLD *..GIVING THEC)7"APPEARANCE OF MOTION)."n)7"3:THEN, RIGHT AGAIN (BUT WITHOUT")7"ERASING) LEAVING THE *'S.")7"4:THEN ALL 3 LOOPS WILL  "(34)"FOR"(34)&J3"20 ?N*N "%'T3"30 NEXT _HERE'S THE "(34)"NEXT"(34)5'^363000:""Q'h3MS$" WATCH!! ":63100|'660000:"HOW'S THIS FOR A DIVERSION?"'6T1500::""'6I12'6J1WD1:T15:'6" *";:THE NUMBER A,IF YOU SAY INPUTA."% 0"TRY IT!(THEN TYPE @)"#%0MS$"HYPO/WHAT?":63100:%0SN$"13000":63300f%260000:"SUPPOSE YOU WANT THE SQUARES"%2"OF THE INTEGERS FROM 1 TO 100."%2"YOU COULD TYPE:"%2"10 ?1*1"%2"20 ?2*"/" "" /"A$="(34)"I "(34)#/" ^"#/" SEE?"#/63000N#/"OK..LET'S WORK ALL THIS INTO A PROGRAM."a#/"LET'S TYPE:"#&/"10?"(34)"CALCULATION OF THE HYPOTENUSE"(34)#0/"20?"(34)"ENTER SIDE A"(34)#:/"30 INPUT: %+63000!*+" NOW WHAT DO YOU THINK X$+Y$ MEANS?"!4+"TRY TYPING:":6!>+"A$="(34)"I"(34)P!H+"B$="(34)"YOU"(34)p!R+"Y$="(34)"AM GREAT!"(34)!\+"Z$="(34)"ARE TOO?"(34)!f+"THEN ASK ME:"!p+"?A$+Y$"!z+"?B$+Z$"!+"TRY 2*3 IS A NUMBER"`'"OR A STRING OF THREE SYMBOLS."7j'"HENCE, I MUST INSIST THAT THE NAME YOU"at'"GIVE IT ENDS WITH A $ ..IF IT'S A"~'"STRING OF SYMBOLS..LIKE X$,Y$ OR SAM$."'63000'" YOU CAN NOW TRY THE FOLLOWING:"'"TYPE:  00100"9"PONZO*1983*WATERLOOF"d53281,15:53280,12:"":" C64 TUTOR-1e""f"  C64 BASICS  ":MS$" WELCOME! "& g" . AND THE NEW INSTRUCTION."F#"(I'LL FORGET THE OLD INSTRUCTION)."?P#"TO DELETE A STATEMENT"iZ#"TYPE THE NO. THEN PRESS 'RETURN'!"#"WHICH REMINDS ME.."#"DO NOT TYPE IN SOME NUMBER.."#"CHANGE YOUR MIND...HIT RETURN.."# R"h" 20 PRINTY "%|"TO CONVINCE YOURSELF THAT I HAVE"N"ALL YOUR INSTRUCTIONS,IN ORDER.."k"JUST TYPE:LIST10-20""I'LL PRINT EVERY STATEMENT :10 TO 20.""YOU CAN EDIT STATEMENTS RIGHT""ON THE SCREEN. JUST  63000"TYPE STATEMENTS IN ANY ORDER."A"I'LL REMEMBER THEM IN THE ORDER"k"OF THEIR STATEMENT #'S! YOU TYPE:""10Y=(A+B)/2""20?Y ""15? ""16?SPC("W2$");""I REMEMBER THEM AS:"" LL OBEY!" "TRY IT! THEN TYPE @"(MS$" GOTO 10":63100?SN$"07000":63300nX60000:"SUPPOSE YOU WANT THE VALUE OF Y"b"PRINTED IN THE MIDDLE OF THE SCREEN.""TYPE:""15?""16?SPC("W2$");""#15 SAYS:PRINT NO...MY MORE IMPRESSIVE TALENT.."!u" PROGRAMS"6z" "P{MS$" AHEM...":63100[63000"IF YOU GIVE EACH INSTRUCTION A 'NUMBER'""I'LL REMEMBER THE INSTRUCTION!""FOR EXAMPLE, TYPE:""10 Y=(A+B)/2"100jSN$"05000":63300<60000:"IF YOU GIVE ME NEW VALUES FOR A,B &C"c"BY TYPING A=5.3:B=-2.1:C=.011""(YOU CAN GIVE ME SEVERAL INSTR'NS"|"ON THE SAME LINE,SEPARATED BY A COLON:)"D"I'LL REMEMBER THESE NEW VALUES" N"AE VALUE OF JOE."!0 "TRY IT!THEN TYPE.. @"8: SN$"04000":63300e60000:"OK..IF YOU TELL ME THE VALUES""OF A,B & C THEN TYPE:"h"Y=(-B+SQR(B*B-4*A*C))/(2*A)""?Y "0"I'LL CALCULATE Y AND PRINT ITYOU HAVE THE CURSOR"% "OVER THE S IN SIN."I ( "THAT WAY YOU INSERT A SPACE"a 2 "TO TYPE IN '*'." "TRY IT! THEN TYPE @" SN$"03000":63300 60000:"IF YOU WANT ME TO REMEMBER THE" "RESULT OF SOME CALCULATION.." "THE"( ("..HIT RETURN..I PRINT THE ANSWER!"J 2"TRY IT. WHEN FINISHED.."o 3"TYPE @_" 4MS$"@_REMEMBER":63100 7SN$"02000":63300 "":MS$" GOOD":60000:63100:""; 4"TO CORRECT A MISTYPED SYMBOL " "C hSN$"1000":63200:63600\ i60000:63100:59000g 60000 "HI! LET ME TELL YOU ABOUT MYSELF." "I'M A CLASSY CALCULATOR:" "I CAN ADD: 2+2=4 SUBTRACT:2-3=-1" "MULTIPLY:3*17=51 DI"..THEN REENTER THE NUMBER."#"YOU MAY HAVE WIPED OUT A STATEMENT!"C#"NOTE,TOO,THAT YOU MAY USE ?"j#"I WILL REMEMBER IT AS PRINT."u#63000#"ALSO..I REMEMBER ONLY THE FIRST TWO"#"CHARACTERS IN ANY NAME YOU ASSIGN."#"LIST ..THEN MOVE""THE CURSOR..THEN INST/DEL ETC."B"TO CHECK THE CHANGES, LIST AGAIN.k"WANT TO TRY? (CONTINUE WITH @)"SN$"09000":63300(#60000:MS$"SOME NOTES":631002#"TO CHANGE A STATEMENT"<#"TYPE THE NO10 Y=(A+B)/2"" 15 PRINT"" 16 PRINTSPC("W2$");"," 20 PRINTY"U "TRY IT!..THEN TYPE @ TO GO ON."l\SN$"08000":63300w@60000J" 10 Y=(A+B)/2 "T" 15 PRINT THE PROGRAM"^" 16 PRINTSPC("W2$"); SO FATHING..A BLANK LINE."$"#16 SAYS:SPACE RIGHT "W2$" PLACES."M">THE SEMI-COLON AFTER SPC("W2$")"r"SAYS:LEAVE THE CURSOR THERE!""YOU SEE,I NORMALLY RETURN THE CURSOR""TO THE LEFT MARGIN..""UNLESS YOU INCLUDE THE ;""20 ?Y " "#10 SAYS:COMPUTE THE AVERAGE OF"J"TWO NUMBERS A & B, AND CALL IT Y."q"#20 SAYS:PRINT THE VALUE OF Y.""NOW I'LL 'REMEMBER' THESE INSTRUCTIONS!""CLEAR THE SCREEN,TYPE A=1.5:B=-4""THEN GOTO 10...I'ND IF YOU WANT Y RECALCULATED"."JUST MOVE THE CURSOR TO THE"]"STATEMENT DEFINING Y AND HIT 'RETURN'.""I'LL THINK YOU JUST TYPED IT IN!""THEN YOU CAN ASK ?Y""TRY IT! THEN TYPE @"oSN$"06000":63300 p60000:"NOW .""UNFORTUNATELY, IF YOU GIVE ME"@"NEW VALUES FOR A,B & C...WELL.."k"YOU'LL HAVE TO RETYPE THE FORMULA!""(BUT WAIT TILL WE WRITE 'PROGRAMS')."."WANT TO TRY THIS?"V"THEN:TYPE @ TO CONTINUE."[MS$"@_":63N GIVE IT A NAME!"! "TYPE:SAM=2*3/4+5"B "THEN I'LL REMEMBER SAM."l "YOU CAN ASK FOR THE VALUE OF SAM." "TYPE:?SAM" "YOU CAN ALSO TYPE:" "JOE=SAM^2+SIN(*SAM/3)" "?JOE "& "THEN I'LL PRINT TH>"JUST PRESS THE KEY MARKED DEL.9 f" "] z"SUPPOSE YOU TYPED 2SIN(/3)." "TO INSERT A * BETWEEN 2 AND SIN(/3)" "TO INDICATE MULTIPLY.... "PRESS SHIFT AND DEL!" ` " "DO THIS AFTER  VIDE:4/16=.25"2 8"I COMPUTE SINES AND LOGARITHMS"X B"SQUARE ROOTS AND ARCTANGENTS." L"I RAISE NO'S TO A POWER:2^(-3)=.125" "TYPE:?2*SIN(/3)+LOG(1.2^3)-SQR(4*5.6)" "(THE ? IN FRONT MEANS PRINT)" " AlTWSPD 006 PROGRAM.GB>6ASPD-DISKETTERNA UTGES AV SYS PD-BIBLIOTEKET. F\R ADESS, SE OMST]ENDE SIDA,SAMMA BLOCK MENUPONZO TUTOR-1.64FPONZO TUTOR-2.64C PONZO TUTOR-3.64KPONZO TUTOR-4.64@ PONZO TUTOR-5.64CPONZO TUTOR-6.64=PONZO TUTOR-7.64<SPRITES TUT-1.64L SPRITES TUT-2.64TYPE TUTORBUTTERMON@50000    SYS PUBLIC  DOMAIN  SPD-DISK 6/A   01 LDY #$01$"., B4C1 B1 22 LDA ($22),Y%"., B4C3 F0 1C BEQ $B4E1<%"THAT'S WHAT WE HAVE SO FAR."j%"NOW WE'RE GOING TO MOVE AHEAD 5 BYTES"%"AND START CHECKING EACH BYTE FROM THERE"%"FOR THE 00 END-OF-STATEMENT.":6 T THE LO-BYTE LINK."'("WE CHECK THIS BYTE FOR 00, TO SEE".'<"IF IT'S THE END-OF-STATEMENT, AND"_'F"BRANCH IF NOT EQUAL TO ZERO TO THE"'P"INY INSTRUCTION. FROM NOW ON WE MOVE"'Z"A BYTE AT A TIME, LOOKING FOR 00,"'d NOW WE MUST FIX UP THE HI-BYTE AT $2E."="WE LDA $2C WHICH WILL GO TO $2E.":63000"., B5E3 A5 2C LDA $2C _":6300063400:"BUT, JUST IN CASE THERE'S A CARRY""LEFT OVER FROM THE ADC #$02 WE..":6300 000"NOW LET'S LOOK AT HOW BASIC CHAINING"::"MIGHT BE ACCOMPLISHED IN BASIC ."i;"(THE STATEMENTS IN BASIC ARE LINKED"<"AND THESE LINKS MUST BE RECREATED"="EACH TIME WE INSERT OR MODIFY.">"THAT'S CHAINING.)"D" "(13)""6vBT$""BA$"LINKLINKSTMTSTMTBASICZEROLINK"d"BYTEBYTENUMNUMTEXT BYTEBYTE"" LO  HI  LO  HI AREA=END LO"M1$BT$" ^^^^ ^^^^":M1$:"THIS IS THE ADDRESS OF THE NEXT".":63000M4$BT$" ^^^^":M4$F"END-OF-STATEMENT.":63000M5$BT$" ^^^^":M5$"THE NEXT LINK.":63000M5$" " 39000:"WE WAND STORE THE ADDRESS OF THE NEXT LINK.."GHM5$:63000:"INTO THE LINKS AT $0801/$0802."fRM5$" ":M1$:63000\39000:M1$" "f"IN FACT, ONCE AT THE LO-BYTE OF THE"p"LINK WE CAN JUMP AHEAD 5 BYTEB4BA 85 22 STA $22 " "., B4BC 84 23 STY $23 "? "WE GET THE START-OF-BASIC ADDRESS FROM"h "$2B/$2C AND STORE IT IN $22/$23." "WE WILL BE MODIFYING THIS ADDRESS AND" "WILL DO THE MODIFYING TO THE COPY AT" "$22FOR AN ADC LATER ON..":63000""., B4BF A0 01 LDY #$01 "7"$"., B4C1 B1 22 LDA ($22),Y"c"."NOW THE A-REGISTER HOLDS THE BYTE"|"8"STORED AT $0802.""B"THAT'S THE HI-BYTE LINK TO THE""L"NEXT BASIC STATEMENT.""`" ZERO"#"AND BEQ TO $B4E1 WHICH IS AN EXIT"$"FROM THIS ROUTINE!":63000<$"., B4B6 A5 2B LDA $2B[$"., B4B8 A4 2C LDY $2Cz$"., B4BA 85 22 STA $22$"., B4BC 84 23 STY $23$"., B4BE 18 CLC$"., B4BF A0 3000%"., B4C5 A0 04 LDY #$04 "&"., B4C7 C8 INY "8&"., B4C8 B1 22 LDA ($22),Y"]&"., B4CA D0 FB BNE $B4C7 "& "HERE WE LDY #$04 THEN INY WHICH"&"MAKES $(22),Y 5 BYTES PAST OUR 'BASE'"&"A"AND STAY IN THIS LOOP UNTIL WE DO!":63000(n"EVENTUALLY WE FIND THE END-OF-STATEMENT"J(x"AND MUST NOW DETERMINE THE ADDRESS OF"|("OF THE 'NEXT' LO-BYTE LINK."("TWO THINGS ARE DONE WITH THIS ADDRESS."("1:IT WILL B0&"., B5E5 69 00 ADC #$00 _":63000Y63400:"NOW WE CAN STICK THE HI-BYTE"r"INTO $2E.":63000"., B5E7 85 2E STA $2E _":63000&63400:MS$"NICE!NICE!":63100:630RECALL THAT BASIC STATEMENTS ARE STORED"?N"FROM $0801 IN THE FOLLOWING FORMAT:":63000:""vXBA$" "(13)bZ$" ݠ ݠ -- "(13)lBA$BA$Z$Z$Z$""BASIC STATEMENT.":63000%M2$BT$" ^^^^ ^^^^":M2$R"THIS IS BASIC STATEMENT NUMBER:"w"LO-BYTE THEN HI-BYTE.":63000M3$BT$" ^^^^-^":M3$"THIS IS THE BASIC TEXT ITSELFILL LOOK IN $2B/$2C TO""FIND THE START OF BASIC (USUALLY $0801)"a "POINTING TO THE FIRST LINK (LO-BYTE).":M1$" ":63000*"THEN WE WILL MARCH THROUGH TO THE END"4"OF THE FIRST BASIC STATEMENT....":M4$>63000:"S BEFORE" z"WE TEST FOR THE 00 BYTE MARKING THE"<"END OF THE CURRENT BASIC STATEMENT.":63000kT1200::M2$:T1200::M3$:T1200:{M4$:63000"., B4B6 A5 2B LDA $2B ""., B4B8 A4 2C LDY $2C ""., /$23."!"$22/$23 WILL HOLD THE ADDRESS OF THE",!"LO-BYTE LINK AS WE MARCH THROUGH"J!"THE BASIC STATEMENTS."w!"TO START WITH IT HOLDS $0801.":63000!"., B4BE 18 CLC "!"WE DO THIS CLC IN PREPARATION"!" IF THIS IS 00 THEN WE MUST BE AT" #j"END OF THE PROGRAM!"?#t"(REMEMBER..END-OF-PROGRAM HAS 00 00 00"q#~"WHICH IMPLIES A 00 HI-BYTE LINK.":63000#"., B4C3 F0 1C BEQ $B4E1 "#T120:CL$::"..SO WE TEST IT FOR E HAVE"7"THIS 'NEW BASE' ADDRESS(=THE ADDRESS"8"OF THE 'NEXT' LO-LINK) IN X AND A."68"X HAS THE LO-BYTE!":"A HAS THE HI-BYTE!!"\8 MS$" CLEVER! ":63000:631008"LET'S SEE IT ALL..PAY ATTENTION!":630008"., B4B6 A5 :"., B4C3 F0 1C BEQ $B4E1963002:"., B4C5 A0 04 LDY #$04: 63002:"., B4C7 C8 INY,:!63002:"., B4C8 B1 22 LDA ($22),YT:"63002:"., B4CA D0 FB BNE $B4C7v:#63002:"., B4CC C8 INY:$63002:"., B4CD 98 TYA E STORED IN THE EARLIER"(" LINKS (ORIGINALLY $0801/$0802)."&)"2:OUR 'BASE' (KEPT IN $22/$23)"Q)" ORIGINALLY WAS THE LINK AT $0801.")" $22/$23 WILL BE CHANGED TO POINT":" TO THIS 'NEXT' LINK.")"AT THE MOMENT WE'RE (Y) BYTES P Y POINTS TO THE 'NEXT'"*"LO-LINK AND WE DO OUR '2 THINGS'" +"WITH THIS ADDRESS..":63000F+"., B4CD 98 TYA "j+"., B4CE 65 22 ADC $22 "+"., B4D0 AA TAX "+"., B4D1 A0 00 LDY #$00 "+ "., B4CE 65 22 ADC $22 ":63000-6SD$"NOW A CONTAINS THE LO-BYTE OF THE"@-@"NEW 'BASE' ADDRESS=THE 'NEXT' LO-LINK."o-E"WE SAVE THIS MAGIC BYTE IN 'X'..":63000-F"., B4D0 AA TAX ":63000-JSD$"THEN"., B4D3 91 22 STA ($22),Y":63000.rSD$;:I115:CL$:/wMS$"GO!GO!GO!":63100'/|SD$;:I115:CL$:R/}"., B4D5 98 TYA "w/~"., B4D6 65 23 ADC $23 "/"., B4D8 C8 INY "/"., B4D9 91 222.":630000"., B4D5 98 TYA ":630001SD$"THEN WE ADC $23"61"ADDING THE CARRY BIT (IF ANY!)"^1"TO THE HI-BYTE OF OUR NEW 'BASE'"1"ADDRESS IN $22/$23-WHICH ALWAYS"1"POINTS TO THE LO-LINK.":63000 IS HELD IN $22/$23!!!":630002:MS$"  OUCH!! ":631003;"., B4D8 C8 INY "?3<"., B4D9 91 22 STA ($22),Y":63000_3b"., B4B6 A5 2B LDA $2B~3c"., B4B8 A4 2C LDY $2C3d"., B4BA 85 22 STA $223e"., BA D0 FB BNE $B4C74n"., B4CC C8 INY4o"., B4CD 98 TYA5p"., B4CE 65 22 ADC $22*5q"., B4D0 AA TAXJ5r"., B4D1 A0 00 LDY #$00m5s"., B4D3 91 22 STA ($22),Y5t"., B4D5 98 TYA5u"., B4D6 65 23 ADC "NOW WE STORE THE 'NEXT' LO-LINK"6"ADDRESS INTO $22/$23 AND START ALL"7"OVER AGAIN WITH THIS NEW BASE!!"M7"(AT LEAST UNTIL WE RUN ACROSS 00 00 00"|7"SIGNIFYING THE END-OF-PROGRAM).":630007"YOU MAY NOT REALIZE IT BUT W 2B LDA $2B863002:"., B4B8 A4 2C LDY $2C863002:"., B4BA 85 22 STA $22963002:"., B4BC 84 23 STY $23@963002:"., B4BE 18 CLCg963002:"., B4BF A0 01 LDY #$01963002:"., B4C1 B1 22 LDA ($22),Y963002:%63002:"., B4CE 65 22 ADC $22:&63002:"., B4D0 AA TAX;'63002:"., B4D1 A0 00 LDY #$001;(63002:"., B4D3 91 22 STA ($22),YS;)63002:"., B4D5 98 TYAy;*63002:"., B4D6 65 23 ADC $23;463002:"., B4D8 C8 AST")"THE ADDRESS IN $22/$23."!*"LET'S FORGE AHEAD...":MS$"GO!GO!GO!":63000:63100G*"., B4CC C8 INY "u*SD$"INY ADVANCES 1 BYTE PAST THE 00"*"END-OF-STATEMENT TO THE 'NEXT' LO-LINK."*"NOW ($22),"., B4D3 91 22 STA ($22),Y"+SD$;:T110:CL$:!,SD$"WE ADC THE ADDRESS AT $22 TO Y.."Q,""BUT ADC ONLY WORKS WITH THE A-REGISTER",,"SO WE TYA FIRST THEN ADC $22.":63000,-"., B4CD 98 TYA ",. PUT IT INTO $0801 WHICH IS THE"-T"ADDRESS CURRENTLY HELD IN $22/$23.").^"WE DO THIS WITH STA INTO ($22),0"V.c"WHICH REQUIRES 'Y=0' SO WE LDY #$00".h"THEN STA ($22),Y!":63000.i"., B4D1 A0 00 LDY #$00 ".j STA ($22),Y"/SD$"WE HAVE THE LO-LINK FIXED UP."0"NOW FOR THE HI-LINK.":6300020SD$"";:I18:CL$:_0SD$"WE CLEAR THE A-REGISTER TO 00"0"WITHOUT AFFECTING ANY CARRY "0"LEFT OVER FROM THE EARLIER ADC $21"., B4D6 65 20 ADC $23 ":630001SD$"";:I18:CL$:,2SD$"WE NOW HAVE THE HI-BYTE OF OUR"R2"NEW LO-LINK ADDRESS IN 'A' AND"x2"WE NEED TO STUFF IT INTO $0802"2&"WHICH IS 1 BYTE PAST $0801 AND"20"$08014BC 84 23 STY $233f"., B4BE 18 CLC3g"., B4BF A0 01 LDY #$014h"., B4C1 B1 22 LDA ($22),Y;4i"., B4C3 F0 1C BEQ $B4E1[4j"., B4C5 A0 04 LDY #$04v4k"., B4C7 C8 INY4l"., B4C8 B1 22 LDA ($22),Y4m"., B4C $235v"., B4D8 C8 INY5"., B4D9 91 22 STA ($22),Y6BT$"WHAT'S LEFT TO DO???":63000=6"WE'VE FIXED THE LINKS AT $0801/$0802."l6"THEY POINT TO THE 'NEXT' LO-BYTE LINK."6"THAT'S THE FIRST OF OUR '2 THINGS' DONE."6 Y-REGISTERS IS PERFORMED,"=,"AND THE MSB OF THE RESULT IS '1', THEN"e6"N=1. IT'S THAT SIMPLE!":63000@MS$" N=MSB ":63100:63000J"BMI $1234 WILL TEST THE N-BIT AND,"T"IF IT'S '1', WILL BRANCH TO $1234." ^"(SINCE T "TO $1234.":MS$" CAREFUL!!":63000:631008" THE V-BIT"f"SINCE THE MSB CARRIES THE 'SIGN' OF A""NUMBER (IN 'SIGNED ARITHMETIC')""THEN AN ADC OR SBC WHICH CAUSES""THE NEXT-TO-MSB TO 'OVERFLOW' INTO THE"  INY;563002:"., B4D9 91 22 STA ($22),Y;663002:"., B4DB 86 22 STX $22 "<763002:"., B4DD 85 23 STA $23 "P<863002:"., B4DF 90 DE BCC $B4BF_BRANCH BACK"{<9" TO $B4BF"<:"  =I07:P(I),160:TT1PP:=P(I),((N$,I1,1))48::=œI07:X(I),160:TT1PP:>ÜX(I),((N$,I1,1))48::4>̜I07:Y(I),160:TT1PP:T>͜Y(I),((N$,I1,1))48::t>I07:M(I),160:TT1PP:>᜗M(I),((N$,I1,1))48:A(I),(X(I))::?I07:M(I),160:TT1PP:?M(I),(X(I))::?¡I07:A(I),160:TT1PP:@áA(I),(Y(I))::.@I07:M(I),160:TT1PP:D@M(I),(Y(I))::U@` INITIALIZEw@aBT$"":I124:BT$BT$"":@bPT$""AhWD40:CRT1024:(142)AiW2WD2:W3WD1:W1$((WD),2): BjW2$((W2),2):W3$((W3),2)ABsSD$"":CL$"":I1WD1:CL$CL$" ":GBtTBBT$CL$;tBBT$"RETURN TO CONTINUE";BZ$:Z$""63002_15:CL$::SD$;:CD63100:63010:C"";:I15:CL$::"";:C60000:"":2020: BjW2$((W2),2):W3$((W3),2)ABsSD$"":CL$"":I1WD1:CL$CL$" ":GBtTBBT$CL$;tBBT$"RETURN TO CONTINUE";BZ$:Z$""63002". #60000:63100:630009 (20000e -"":SD$"RECALL THAT THE 6510 HAS A" 2"NUMBER OF INTERNAL REGISTERS...":63000:A$X$Y$ <39100:"SOME COMMANDS AFFECT THE NUMBERS" F"CONTAINED IN THESE REGISTERS..":63000:SD:"THE 6510 KEEPS TRACK OF WHETHER"Q "ONE OF THESE OPERATIONS PRODUCES A ZERO"~ "OR NEGATIVE RESULT..AND, FOR ADC" "AND SBC (ADD & SUBTRACT), WHETHER" "THE OPERATION PRODUCES AN OVERFLOW.":63000 39100:"THE PROCESULT,N=1":P(0),177:63000@ 39100:"IF IT'S NOT NEGATIVE THEN N=0"r "(MEANING IT'S POSITIVE!)":P(0),176:63000 "A NEGATIVE NUMBER HAS A '1'" "IN THE MSB POSITION." "IF ONE OF THE OPERATIONS WHICH AFFECT"""THE A,X OR HE 'RESULT' IS MINUS!)"6h"BPL $1234 WILL BRANCH TO $1234"_r"IF THE 'RESULT' IS PLUS (N=0)."|"IF WE LDA #$D3, THEN N=1""BECAUSE $D0=11010011 IN BINARY AND MSB=1""SO..BPL $1234 WILL NOT TAKE US""SIGN-BIT WILL CAUSE V=1."8"IF 'SIGNED ARITHMETIC' IS NOT BEING"h"PERFORMED THEN WE CAN IGNORE THE V-BIT.""ALTHOUGH ADC AND SBC MAY SET V=1""WE CAN FORCE V=0 WITH THE COMMAND:""CLV=CLEAR THE V-BIT.":63000: & REPEAT!"<:63000:"":MS$"AU REVOIR!":63100:I07:P(I),160:TT1PP:>P(I),(A(I))::>I07:X(I),160:TT1PP:?X(I),(A(I)):: ?I07:Y(I),160:TT1PP:6?Y(I),(A(I))::V?ȠI07:M(I),160:TT1PP:l?ɠM(I),(A(I))::?|I07:A(I),160:TT1PP:?}" AcPT$PT$"Σ============"EAdPT$PT$"ϣϑ"|AePT$BT$""PT$""AgML$"BZ$:Z$""63003BB"BT$CL$;:TT150:B#BT$"RETURN TO SEE IT HAPPEN";:TT150:C$Z$:Z$""63012(C%Z$:Z$""63013.C&BC|T15:PT$MS$;XC}PT$" ";gC~PT$MS$;:mCxC63000CSD$;:T1!" PONZO*82*WATERLOO/"L53281,15:53280,12:""p " C64 TUTOR-7"""  ...AND MORE MACHINE LANGUAGE...  ":MS$" WELCOME! " "$""= Z"ADC AND ASL CMP CPX CPY DEC DEX DEY"z d"EOR INC INX INY LDA LDX LDY LSR ORA" n"PLA PLP ROL ROR RTI SBC TAX TSX TXA" x"..AND TYA!!":MS$"WHERE'SBIT" :63100:63000 39100 SSOR STATUS REGISTER"; "HAS 8 BITS. THREE BITS ARE DEVOTED TO"p "NEGATIVE,OVERFLOW AND ZERO.":63000:P$ P(0),142:P(1),150:P(6),154:63000 P(0),32:P(1),32:P(6),32 39100:"IF AN OPERATION PRODUCES A NEGATIVE" "RE E IN 'DECIMAL" !"MODE' WE MUST SET THE D-FLAG TO '1':"!"SED"E!"TO GET OUT OF THIS MODE WE CLEAR THE"g!"DECIMAL MODE FLAG TO '0':"{!"CLD":63000!"FURTHER..THE 6510 CAN BE INTERRUPTED"! "BY LOWERING THE VOLTAGE ON ..THEN RETURNS"#P"FROM THE INTERRUPT TO CONTINUE.":630007#Z"FOR EXAMPLE, EVERY JIFFY(=1/60 SECOND)"g#d"THE 6510 INTERRUPTS WHATEVER IT'S DOIN'"#n"AND UPDATES THE INTERNAL CLOCK,CHECKS"#x"THE KEYBOARD TO SEE IF YOU'RE PRESSING"# 10000"IT'S OFTEN NECESSARY TO JUMP FROM"J"ONE PLACE TO ANOTHER IN A PROGRAM."k"WE CAN USE: JMP $1234."&"OF COURSE WEHAD BETTER HAVE SOME"0"INSTRUCTIONS AT $1234!!":"IF OUR PROGRAM IS AT $1000-$2000" N"AND  63000"HERE'S ANOTHER USE OF THE V-BIT."B"SUPPOSE WE HAVE JMP $1234 LOCATED"i"IN OUR PROGRAM AT $1200-$1202.""$1200 $1201 $1202 $1203"" 4C 34 12 ***"" ^JMP ^LO ^HI ^NEXT"" ^INSTE JUMP, BY""$31 MEMORY LOCATIONS, BY WRITING:"F "CLV =CLEAR V-BIT (SET V=0)."w"BVC #$31=BRANCH AHEAD $31 LOC'NS IF V=0" "THIS WILL TAKE US TO $1234 AND THE"*"PROGRAM IS 'RELOCATABLE'!":63000:SD$4"$1200 $12"l"OR SHOULD WE SAY BVC #$31?*!"7m"ACTUALLY, ALTHOUGH AN 'ASSEMBLER' SUCH"bn"AS MICROMON WILL ALLOW US TO SAY"o"BVC $1234, THE MACHINE LANGUAGE CODE"p"GENERATED WILL READ BVC #$31!!"q"THAT IS, THE INSTRUCTION WILL Z-BIT IS SET(Z=1)""BNE=BRANCH IF Z-BIT IS CLEAR(Z=0)"E"BMI=BRANCH IF N-BIT IS SET(N=1)"q"BPL=BRANCH IF N-BIT IS CLEAR(N=0)""BVS=BRANCH IF V-BIT IS SET(V=1)""BVC=BRANCH IF V-BIT IS CLEAR(V=0)":63000MS$"RERRY":P(7),176:63000:39100P(7),32:"CLD=CLEARS DECIMAL MODE FLAG":P(4),176:63000nMS$"WHAT FLAG?":63100:63000:39100:P(4),132"CLI=CLEARS INTERRUPT FLAG":P(5),176:63000 MS$"WHAT FLAG!":63100:P(5),137:63000:3ECIMAL MODE FLAG BIT.":P(4),(P(4))128963000DBSD$"I=INTERRUPT FLAG BIT.":P(5),(P(5))128OC63000LSD$"Z=ZERO FLAG BIT.":P(6),(P(6))128:63000VSD$"C=CARRY FLAG BIT.":P(7),(P(7))128[6"JUST IN CASE YOU'RE WONDERING.."" "THE 6510 HAS A DECIMAL MODE WHEREBY"N "ARITHMETIC OPERATIONS ARE PERFORMED" "ASSUMING ALL NUMBERS ARE NOT IN DECIMAL" "BUT RATHER IN BINARY CODED DECIMAL!" "IF WE WANT TO OPERAT ONE OF IT'S"""PINS..THE IRQ OR INTERRUPT REQUEST PIN."E""(EXTERNAL DEVICES DO THIS TO THE 6510"["("ALL THE TIME!)""2"WHEN THE 6510 GETS AN IRQ IT STOPS""<"WHAT IT'S DOIN'...SERVICES THE""F"INTERRUPTING DEVICE"THE STOP KEY, ETC."$"WHETHER OR NOT THE 6510 WILL LET ITSELF"=$"BE INTERRUPTED DEPENDS UPON A MAGIC"^$"BIT IN THE P-REGISTER."$"GUESS WHICH ONE?!!":63000$""P$:P(0),14:P(1),22:P(3),2:P(4),4:P(5),137$P(6),26:IT HAS A JMP $1234,THAT'S OK."9X"IF WEPHYSICALLY MOVE THIS PROGRAM TO,"fb"SAY, $3000 TO $4000 (PERHAPS TO MAKE"l"ROOM FOR SOME BASIC AT $0801 TO $2000)"v"THEN THE RELOCATED PROGRAM SHOULD NOT""HAVE JMP $1234 IN IT!!": ^BYTE ^BYTE ^INST"*"WE WOULD NORMALLY CONTINUE TO THE NEXT"X"INSTRUCTION AT $1203 BUT,BECAUSE OF""THE JMP, WE ACTUALLY MOVE AHEAD TO $1234""WHICH IS $31 MEMORY LOC'NS FARTHER ON!":63000"WE CAN PERFORM A RELATIV01 $1202" >" B8 50 31",H" ^CLV ^BVC ^# LOC'NS"ZR"IF WE DON'T USE JMPS, BUT 'RELATIVE"\"BRANCHES' INSTEAD, OUR PROGRAM WILL"f"RUN ANYWHERE IN MEMORY!":63000k"CONFUSING??":"SHOULD WE SAY BVC $1234 APPEAR"r"IN MEMORY AS 50 31..MEANING BRANCH"=s"AHEAD $31 LOC'NS IF V=0.":63000ou"ALL BRANCH INSTRUCTIONS ARE 'RELATIVE':"z"BCS=BRANCH IF CARRY IS SET(C=1)""BCC=BRANCH IF CARRY IS CLEAR(C=0)""BEQ=BRANCH IFLATIVES?":63100!"":P$:SD$"SOME OF THE BITS OF THE PROCESSOR"M"STATUS REGISTER CAN BE SET(=1), AND"|"SOME CAN BE CLEARED(=0).":63000:39100"CLV=CLEARS OVERFLOW":P(1),176:63000:39100P(1),32"CLC=CLEARS CA9100""SD$"ALTOGETHER NOW..":P$3P(0),14:P(1),22:P(4),4:P(5),9:P(6),26:P(7),3>63000w$39100:"N=NEGATIVE FLAG BIT.":P(0),(P(0))128%63000.SD$"V=OVERFLOW FLAG BIT.":P(1),(P(1))128:630008SD$"D=D 3000`P(2),214:MS$"NOT USED!!":63100eZ$:Z$""P(2),32:1120YjP(3),130:39100:"WHEN THE 6510 GETS A BREAK COMMAND"rt"(WHICH IS 00) "~"THE BREAK BIT IS SET(B=1)":63000:P(3),130MS$"COMMAND=00":63100:63000 4 STA $04A0,X3 "., 601A 68 PLA3 "., 601B 9D E0 05 STA $05E0,X4 "., 601E E8 INX.4 "., 601F D0 E1 CPX #$A0O4 "., 6021 D0 DF BNE $6002j4 "., 6023 60 RTS4 M64096:IMM35:K:I,K:4 162,0,189,0,4,72,189, TOR7"5+ MS$"AU REVOIR!"50 I110:64096:T1500:::6310065 I110:Z$::BT$"SYS6*4096":E6'"":P$:SD$"THE Z-BIT IS SET TO '1'"x6'"IF EVERY BIT OF A 'RESULT' IS 00.":630006$'P(6),177:63000:SD$"";6.'"Z P(7),3$SD$"YOU BET!" %"IF THE I BIT IS CLEAR(=0) THE 6510"7%"WILL LET ITSELF BE INTERRUPTED."]%"IF I=1 HOWEVER IT WILL NOT!"x%"SEI WILL SET I=1"%"CLI WILL CLEAR I=0"%63000%"SO, IF YOU WANT THE 6510 TO  &T"IF WE WRITE LO-O-ONG MACHINE LANGUAGE"'^"PROGRAMS (USING AN ASSEMBLER SO WE"E'h"DON'T HAVE TO ENTER THE HEX BYTES"n'r"INTO MEMORY BUT CAN USE ASSEMBLY"'|"LANGUAGE) THEN IT'S CONVENIENT TO"'"BREAK UP OUR LONG PROGRAM INTO W THE PROGRAM CAN GO BACK FROM WHERE"("IT WAS 'CALLED'."()"IN ASSEMBLER WE END SUBROUTINES WITH"V)"RTS=RETURN FROM SUBROUTINE:"n)"$1000 LDA #$00 ")"$1002 JSR $1234")"$1005 ----- ")" ----- " ----- "*" ----- "+" ----- ."&+"$1234 ***** "A+" ***** "{+" RTS ":MS$"BACK AGAIN":63100:63000+"JUST ONE MORE COMMAND...":63000+ "":A$P$+^";:P(7),49,540096:""CL$:CL$-6SD$"A-REGISTER ROTATED ..INTO CARRY!":63000\-:"^":A(0),48-DSD$"CARRY BIT STUFFED INTO MSB OF A.":63000-N"..AND THERE'S ROL WONTO"."THE STACK WHICH CONSISTS OF SEVERAL"/"MEMORY LOCATIONS IN RAM..$100-$1FF."D/"PHA=PUSH THE A-REGISTER ONTO THE STACK"|/"PHP=PUSH THE P-REGISTER ONTO THE STACK":63000/"TO PUSH THE X AND Y REGISTERS WE:"/"TREVERSE ORDER!!!"0"PLA TAY PLA TAX PLP PLA":630001 "THE STACK IS A NICE PLACE TO STORE"F1*"BYTES TEMPORARILY. IF WE WANT TO"u14"EXCHANGE THE CONTENTS OF MEMORY LOC'NS"1>"$2000 AND $3000 THEN WE CAN:"1H"LDA $2000PHA2 "., 6006 BD 40 05 LDA $0540,X2 "., 6009 9D 00 04 STA $0400,X3 "., 600C 68 PLA13 "., 600D 9D 40 05 STA $0540,XT3 "., 6010 BD A0 04 LDA $04A0,Xo3 "., 6013 48 PHA3 "., 6014 BD E0 05 LDA $05E0,X3 "., 6017 9D A0 064,5,157,0,4,104,157,64,5,189,160,4 5 72,189,224,5,157,160,4,104,157,224,5,232,224,160,208,223,96;5 U$"":V$"":I1WD1:U$U$"*":V$V$" ":Z5 BT$"YOU CAN TRY IT!"5 63000:"";:I14:U$::I14:V$:5& "END OF TU=0 IF A 'RESULT' IS NOT ZERO.":P(6),17668'630007B'"":P$:SD$"AND THE CARRY BIT.."67L'"WHERE'S THE CARRY BIT!!":T110:(14);[7V'T1150::(142);:T1150::y7`'63000:P(7),131:63000:7 N"HERE'S THE SET OF 6510 COMIGNORE"%"INTERRUPTS (INCLUDING THE POOR GUY"&""BANGING ON THE STOP KEY!)"E&,"START YOUR PROGRAM WITH SEI AND,"i&6"...TO AVOID ANY VIOLENCE..."&@"(EVENTUALLY) END IT WITH CLI.":63000&J"AND THEN THERE ARE SUBROUTINES:"EE"'"PIECES=SUBROUTINES."("IN BASIC WE'D SAY: GOSUB 1000"3("IN ASSEMBLER WE'D SAY: JSR $1234"`("WHICH TRANSLATES TO: 20 34 12"(" IN MACHINE LANGUAGE!":63000("BASIC SUBROUTINES MUST END IN RETURN"("SO ")" ----- ")" ----- ."*"$1234 ***** _SUBROUTINE".*" ***** "F*" RTS "i*MS$"THERE..AND":63100:63002}*""*"$1002 JSR $1234 "*"$1005 ----- _"*SD$"LDA #$D3":N$"11010011":63010:40110 ,N$"10000000":40120:63000:PP300=,&SD$"ROR=ROTATE RIGHT":N$"01101001":63010[,+P(7),32:""37)"0",,SD$"CARRY BIT REMOVED FOR SAFE KEEPING":63000,0""17)"HICH ALSO"-X"INVOLVES THE CARRY BIT..":63000.b"SUPPOSE WE WANT TO JSR $1234">.l"BUT ALSO WANT TO RETAIN ALL THE NUMBERS"m.v"IN THE 6510 REGISTERS, AFTER RETURNING"."FROM THE SUBROUTINE."."WE CAN PUSH ALL THE REGISTERS XA PHA AND TYA PHA."/"SO..WE:"0"PHA PHP TXA PHA TYA PHA" 0"THEN..JSR $1234."H0"LATER, AFTER RTS, WE WANT ALL"u0"THOSE NUMBERS BACK IN THE REGISTERS."0"SO WE PULL THEM FROM THE STACK"0 "IN THE  PHA LDA $3000 STA $2000"2R"PLA STA $3000":MS$" SLICK!":63000:63100-2\"YOU DETERMINE WHAT THE FOLLOWING"N2f"SUBROUTINE DOES..":63000o2 "., 6000 A2 00 LDX #$002 "., 6002 BD 00 04 LDA $0400,X2 "., 6005 48  :[;]=QWERTYUIOP@*^ZXCVBNM,<.>/?_1!2 3#4$5%6&7'8(9)0+-\"~ x208,210,212,214,216,218,220,222,224,226,186,228,188,230,127,129,131,133 K1Y:P(K):P(K)P(K)1024:K$(K)(A$,K,1):C%(K)(K$(K)) C%(K)C%(K)(64C%(K))::K0:K$(45)(34):C%(45)344  1 TO 16 ? ";:60000:X(IN$)U X16X1" ":"";:180 "DO YOU WANT ME TO":"FLASH THE KEYS TO TYPE" "  Y=YES AND N=NO " D$:D$""210 D$"Y"250 D$"N"2 MANDS:"7*N"ADC AND ASL BCC BCS BEQ BIT BMI BNE"!84N"BPL BRK BVC BVS CLC CLD CLI CLV CMP"^8>N"CPX CPY DEC DEX DEY EOR INC INX INY"8HN"JMP JSR LDA LDX LDY LSR NOP ORA PHA"8 9A(7),32:TT1PP::I711:A(I1),329A(I),((N$,I,1))48:TT1PP::::A(0),32:TT1PP::I06:A(I1),32P:A(I),((N$,I1,1))48:TT1PP:::A(7),48:p:I07:A(I),160:TT1PP::A(I),((N$,I1,1))48:::I007:P(I),160:TT1PP:;P(I),(A(I))::;I07:X(I),160:TT1PP:;X(I),(A(I))::cX$" X"R$:Y$"Y"R$R>dM$"M"R$u>eCR$"">fCC$" A   ?lC$CR$"_CARRY BIT"?sML$""@tBT$"":I124:BT$BT$"":]@uPT$""@vPT$PT$"Σ2AZ$:Z$""63003AA"BT$CL$;:TT150:B#BT$"RETURN TO SEE IT HAPPEN";:TT150:B$Z$:Z$""63012+B%Z$:Z$""630131B&EB|T15:PT$MS$;[B}PT$" ";jB~PT$MS$;:pB{B63000BSD$;:T1HBD53280:SRBD1:BD,0:SR,0:""(142);12)"THIS PROGRAM IS"c12)"CONTRIBUTED TO"~12)"YOUR SCHOOL BY"9)"AMERICAN PERIPHERALS"12)"YOUR SOURCE FOR"15)"VIC/PET" 9)"HARDWARE & SOFT54291,9% 754278,48:54285,48:54292,48G <54276,17:54288,17:54290,17 FG(1)54273:G(2)54272:G(3)54280:G(4)54279:G(5)54287:G(6)54286 PSL16:G(SL),0: dY63:Z30:K$(64),P(64),C%(64):A$ iU$" "1 n"ASDFGHJKL" T Y P E T U T O R "Z "FOR THE COMMODORE-64"g CZ150 DL((1)255)1:SL16:G(SL),DL::BD,DL:SR,DL :BD,0:SR,0:SL16:G(SL),0: 8)" PICK A LESSON FROM " H$"":"60 210F1N"THIS LESSON COVERS":"THE FOLLOWING KEYS:"X280,650,660,670,680,700,720,740,750,760,770,780,790,800,810,820G1:BG:H5:EH:H$"S":D5:L5@H$"H"360JCBE:" "K$(C);:: T"RN"PHP PLA PLP ROL ROR RTI SBC SEC SED"9\N"TXA STA STX STY TAX TAY TYA TSX TXA"19fN"..AND TXS!":63000M9pNMS$"IMPRESSIVE":63100Z9zN63000:{9X"";:I117:CL$::"";:9SD$;:I115:CL$::SD$;:7:P(I),160:TT1PP::P(I),((N$,I1,1))48:::œI07:X(I),160:TT1PP:;ÜX(I),((N$,I1,1))48::0;̜I07:Y(I),160:TT1PP:P;͜Y(I),((N$,I1,1))48::p;I07:M(I),160:TT1PP:;᜗M(I),((N$,I1,1))48::;I(I))::gWD40:CRT1024:(142)?hI07:A(I)CRTWD32I:P(I)A(I)20:X(I)A(I)3WD:Y(I)X(I)208?iM(I)Y(I)3WD::CCRT7WD1l?jSD$"":CL$"":I1WD1:CL$CL$" ":?kBT$"":I124:BT$BT$"":============"@wPT$PT$"ϣϑ"AxPT$BT$""PT$""$Ay(142).APP504ALABT$CL$;:TT150:wABT$"RETURN TO CONTINUE";:TT150:AZ$:Z$""6300`15:CL$::SD$;:BD63100:63010:B"";:I15:CL$::"";:B60000:"":3000""PT$""$Ay(142).APP504ALABT$CL$;:TT150:wABT$"RETURN TO CONTINUE";:TT150:AZ$:Z$""6300 WARE.":54296,15) S832880:PV:S,PV:v 169,25,133,0,169,0,133,251,169,4,133,252,162,0,160,0,177,251,73,128,145 251,200,192,40,208,245,232,228,0,240,16,165,251,24,105,40,133,251,165,252 (105,0,133,252,76,78,3,96 254277,9:54284,96: :L5:G41:H53:D13:H$"H":320/ B6:E14:L9:G54:H63:D10:H$"H":320\B1:E14:L14:G41:H63:D23:H$"H":320 B1:E27:L27:G41:H63:D23:H$"H":320*B1:E14:L14:G28:H63:D36:H$"H":3204B1:GB:EY:HE:LY:DL:H$"S":320\ ") J<ʰJJJJ)ʅ*)) JJJ Ȉ` %Ȣ aȐ`ʅ(ʅ))&(*i? , L 7 H Ţ( -ȅ  ưL 7Ʃ  !L( ` 7 Ŏ /Hh8?Jnn    HIT A KEY ":370,hCGH:" "K$(C);:::330>r198,0:198,1cw"! #$%&'()"|"_1234567890+-\":1034,162"QWERTYUIOP@*^""ASDFGHJKL[:] ZD$(20):CR$(13) jZ$:Z$""60070@t646,((1)15)1:("",ZC,1);"";:ZC(3ZC)1R~646,1:60010Z(Z$):ZL(IN$):(Z127)32" ";:60110ZL260010IN$IN$Z$:Z$;ZD$;Z$;Z13IN$(IN$,2):CR$;:Z20ZL1IN(1)D)G:520 H$"H"490510/W((1)2)1:W14608510SR(TI):R((1)L)B^198,0 "****** TYPE "K$(R):22)" ******"F1P(R),32:S150:HF((TIBT)60)R$:P(R),C%(PíIˍJˍ h>h=h<h;hh8:9? ȢB* ũR4&` hh & . ũ .  *H)H`LPƥ:9` ȱ ` Ő LP `;©`H h.Lũ M ; %ĭ9 **SORRY ABOUT THAT**"G?JJ1:CC1:S1900::""U$:860:TI$TW$:C50610PD520iNCC1:860:C50610rX440bPCJ:TPC100:" YOUR SCORE WAS":10)""T"% ON LESSON"Xg"YOU TYPED "C"CHARACTERS IN " `l0l2 ԩ Rť)L ,к ,Э ť… И ULå ťHJJJJ Ūh) H hL 0:i`H•h` Ő Ő`* `  * *8`:i)`,&` ` / Ő `7:D7:H$"H":320 B1:E14:L14(G15:H27:D11:H$"H":3208B1:E5:L5VG28:H32:D5:H$"H":320B6:E14:L9:G33:H40:D8:H$"H":320B1:E14:L14:G28:H40:D13:H$"H":320B1:GB:E40:HE:L40:DL:H$"S":320B1:E5 "  ŐƝ Ő  Ȣ  æ&Ѝ ưL 7ƅ …!(  -ȅ Là, % Ȣ .?/SHIFT"W" SPACE BAR """:C0BTTIH$"S"460470R(\$(IN$,ZL1):"";:60010+Z141Z$(20(ZL1)):Z2ZL:Z$;:Z:60000660010145,147,149,151,289,291,293,295,297,299,301,303,263p305,265,307,267,46,48,8,50,10,52,12,54,14,56,16,58,18,60,20,62,22,64,24z66,68,70,72`IN$" ":ZC1:R)128:S1100::R$""530F&I162:G(I),68:G(I1),149::S1Z::I16:G(I),0:X+R$K$(R)590l-TW$TI$:FL140BD,1:832:S16:G(S),170::DL170:5832:BD,0:S16:G(S),120::DL170::6S16:G(S),0::"ŭ:  \ Ő3 Ő( ũ <&8.: % LP Ő  Ő L Ő é ?x9H:H;H<=>@ ?l@ 8" " )LP , )((HF60)100)100"MINS." lF0:C0:T0:J0:B0:E0KC%(5)7:C%(6)8:C%(7)10:C%(8)11:165tB6:GB:E14:HE:L9:DL:H$"S":320B1:GB:E14:HE:L14:DL:H$"S":320B1:E5:L5:G15:H20:D6:H$"H":320B6:E14:L9G21:H2 Űޮ? ? L ``H'h'`ä8 ()Lƥä8¨` 7 H o H Ő&d Ɛ_ h eÅØeą oƦ&= ư4  L 7 H Ő& Ɛ  LPL 7 H â ' Ý  "OK..YOU PICK AN N (THE SPRITE #)">"AND A B (THE BLOCK NUMBER)."e("HINT:B=11,13,14 & 15"2"ARE VERY NICE BLOCKS 'CAUSE"<"THE 63 BYTES OF MEMORY STARTING"F"AT 64*11=704,64*13=832,64*14=896"P"AND 64*15 2^5=32"-MS$" 00100000":63100:63000?6"FOR OUR 'SPRITE #N' WE WILL:"Y;"130 POKEV+21,2^N"<"(YOU WON'T BE SURPRISED TO SEE"@"THAT ANY OTHER SPRITES WILL"J"DISAPPEAR!)"T"IF YOU WANT SPRITE #0 AND SPRITE -" P.J.PONZO*83*WATERLOO/ONTARIO:"l60000:(142):" SPRITES-1""""  SPRITES AND STUFF  ":MS$"PONZOTUTOR"( " @ 0"E3@ @E3@ @E@ "D3ЌD"D3ЌD"D3@ "D3@ bx!YMJ,),#($YX$$#]#)i#$S#$S[[i$$)|mi)S4i#bZH&bTDThDt(ntJrtttrDh2"&&rr&HDD:;RMGXLSTFHDP,AĘ/ZĹWoš#(B$,31X2):X2X2(X232):X1X11:T110::X 63000:I015:V39,I:T1150:::V21,0 MS$" YUM YUM":63100:"IT IS EASY TO HAVE UP TO 8 'SPRITES'" "ON THE SCREEN AT ONE TIME." "LET'S LABEL THE SPRITES 0,1,..7." "PICK A NUMD X:POKE64*B+I,X:NEXT"'"NOW YOU TELL THE C64 WHERE"K"THE SPRITE SHAPE IS STORED."m"FOR SPRITE N, YOU MUST:""110 POKE 2040+N,B:REM B=BLOCK #""NOW TO HAVE SPRITE #N DISPLAYED""ON THE SCREEN YOU MUST ENABLE"WIDE AND 21 DOTS TALL."2 V"(24*21=504 DOTS IN TOTAL)."[ `"EACH DOT IS EITHER 'ON' OR 'OFF'" e"AND WE CAN INDICATE THIS WITH" j"A '1' OR '0' (1=ON & 0=OFF)" t"THE 'SHAPE' INFO CAN THEN BE" ~" STORED AS 504 BINARY DIGITS" INFORMATION MUST GO TO":"THE VIDEO CHIP!":MS$"NICE CHIP!":63100:63000R"THE VIDEO CHIP"y"THIS SEXY CHIP HAS 47 INTERNAL""MEMORY LOCATIONS OR REGISTERS.""THEY START AT $D000 IN HEXADECIMAL""(NICE) AND 53248HE 'BLOCK' NUMBER"*"AND I'LL KNOW WHERE TO LOOK"H"FOR THE SPRITE SHAPE!"n"IN FACT IF YOU SAY BLOCK 90""I'LL GO TO MEMORY LOCATION""64*90=5760 TO GET THE FIRST OF" "THE 63 BYTES!":MS$"63 BITES?!":63100:63000"WHICH 'ENABLES' SPRITES HAS 8 BITS."/#"WE LABEL THE BITS 0,1,...7"I$"(SOUND FAMILIAR?)"s'"EACH BIT CORRESPONDS TO A SPRITE."("TO 'SEE' SPRITE #5, TURN ON THE")"BIT #5!"*"HOW? JUST POKE V+21,32","NOTE: =960 ARE AVAILABLE!"4Z"(..LET'S SAY 'RESERVED' FOR SPRITES)."[d"THEN YOU MUST POKE THE 1'S"}n"AND 0'S INTO THE BLOCK."s"100 FORI=0TO62:READ X:POKE64*B+I,X:NEXT":63000x"LET'S SAY THAT AGAIN:""100 FORI=0TO62:REA #3"^"AND SPRITE #7 ALL 'ENABLED' OR 'VISIBLE'";h"THEN POKEV+21,1+8+128"dr"NOTE:2^0+2^3+2^7=1+8+128 (NICE)!"|"YOU WANT ALL 8 SPRITES?"POKEV+21,255":MS$" 10001001":63100:63000"SO FAR WE HAVE:""100 FORI":63100:MS$" WELCOME!"c 63100:I062: X:832I,X::V53248:2040,13:V21,1 V39,1:V1,100:A$" " B$"THIS IS A SPRITE" V39,1:V1,100:X02558:V,X:(A$,8X1);( 'ǛǾɩbP PC SR AC XR YR SPu& <Ȧ*)ʽ *0! " $Lj* ʽ е Ы Ц(Р Ť()ɝ Ɛ  LP& -ȅ© A % ȩ Lɨ "(`0G`8`@EBER N (0 TO 7) AND"3 "A BLOCK OF MEMORY TO HOLD THE"Y $"INFORMATION ON THE 'SHAPE' OF"l )"SPRITE #N." .MS$"NICE SHAPE":63100:63000 8"NOW A SPRITE IS MADE UP OF AN ARRAY" B"OF 'PIXELS' OR 'DOTS' ON THE SCREEN." L"24 DOTS "THIS SPRITE.":MS$" 2040+N":63100:63000@"YOU'LL ALSO WANT TO PUT IT AT"g"THE RIGHT PLACE ON THE SCREEN,""GIVE IT A NICE COLOUR, MOVE IT""AROUND, MAKE IT BIGGER OR SMALLER""AND OTHER CLEVER THINGS.""ALL THIS "(BITS),EITHER '1' OR '0'."= "SINCE WE STORE NUMBERS IN BYTES"c "IT WILL TAKE 504/8=63 BYTES!"n 63000 "WE WILL RESERVE 63 BYTES OF MEMORY" "(LET'S CALL THEM 'BLOCKS')" "FOR EACH SPRITE 'SHAPE'.""YOU TELL ME T IN DECIMAL""(NOT SO NICE). ANYWAY LET:"A"120 V=53248:REM VIDEO CHIP BASE"a"TO 'TURN ON' SPRITE #N:"|"130 POKE V+21,2^N""YES....THAT'S 2^N."MS$"TURN ME ON":63100:63000"YOU SEE, THE REGISTER AT V+21" " "% "160 X=T/2:Y=180+T/5 "*& "170 POKE V+2*N,X:POKE V+2*N+1,Y "`& "180 NEXT T ":4000~& MS$" YUM !!! ":63100& "THAT'S FOR ONE SPRITE..N=3":V21,0& "LET'S HAVE 3 NY(T) ">"POKE V+2*N,X:POKE V+2*N+1,Y"*H"NEXT T "OR"THEN OUR SPRITE WOULD FOLLOW"w\"A CURVE GIVEN BY SOME FUNCTIONS"f"FNX AND FNY, PREVIOUSLY DEFINED."kMS$"DEF FNX(T)":63100:63000p"IF  2630' "120 V=53248: REM VIDEO CHIP BASE ":2640;( "130 POKE V+39+0,10:REM #0 IS RED ":2650x( "131 POKE V+39+3,12:REM #3 IS WHITE ":2660( "132 POKE V+39+7,14:REM #7 IS BLUE ":2670( " =0TO62:READ X:POKE64*B+I,X:NEXT"0"110 POKE2040+N,B:REM WHERE SHAPE IS "`"120 V=53248: REM VIDEO CHIP BASE ""130 POKEV+21,2^N:REM ENABLE SPRITE ""..AND SPRITE #N IS ON THE SCREEN!""BUT WHERE AND WHAT COLOUR?!*+16, HAS"!"8 BITS, ONE FOR EACH OF 8 SPRITES,"$!"AND FOR SPRITE #N WE WILL";!"POKE V+16,2^N"b!"THIS TURNS ON 'BIT #N' SO THAT"!"SPRITE #N WILL BE ABLE TO MOVE THRU'"!"X-POSITIONS 256 TO 320!":MS$" 256-320!":63100:6300"MAYBE WE SHOULD HAVE PICKED A")0"COLOUR BEFORE WE MADE THE SPRITE"Q5"VISIBLE! THE LAST THING WE WANT"x7"TO DO IS TO DISPLAY OUR SPRITE"8"BEFORE IT'S PRESENTABLE!":"ANYWAY, WE'LL FIX THAT UP LATER.":MS$" PATIENCE":63100""% MS$" V+16":63100:63000#) "IF YOU WANT SPRITE #0 AND SPRITE #3"H#. "AND SPRITE #7 ALL 'AT THE RIGHT'"i#8 "THEN PICK AN X0,X3 & X7:"#B "POKE V+2*0,X0:REM X-POS'N OF #0"#L "POKE V+2*3,X3:REM X-POS'N OF #3"#V "POKEBE ABLE TO 'POSITION' OUR SPRITE #N"v"IN ANY OF 320 X-POSITIONS."I"ALSO, THE C64 HAS 25 ROWS, EACH "s"8 DOTS HIGH AND 25*8=200 SO THERE""WILL BE 200 POSSIBLE Y-POSITIONS""FOR OUR SPRITE.":63000"WHERE DO WE PUT THI:POKE64*B+I,X:NEXT " %t "110 POKE2040+3,B: REM WHERE SHAPE IS ":%~ "120 V=53248: REM VIDEO CHIP BASE "j% "130 POKE V+39+N,10:REM RED SPRITE "% "140 POKEV+21,2^N: REM ENABLE SPRITE "% "150 FOR T=0 TO 500 STEP 5 OULD:""FOR T=0 TO 500 "# "X=T/2:Y=T/3 "G"POKE V+2*N,X:POKE V+2*N+1,Y"r"NEXT T ":63000 "HOW ABOUT SOMETHING CUTE LIKE:"*"FOR T=0 TO 500 "4"X=FNX(T):Y=F SPRITES..#0, #3 AND #7.":63000' "100 FORI=0TO62:READ X:POKE64*B+I,X:NEXT":2600Q' "110 POKE2040+0,B: REM #0'SHAPE BLOCK' ":2610' "111 POKE2040+3,B: REM #3'SHAPE BLOCK' ":2620' "112 POKE2040+7,B: REM #7'SHAPE BLOCK' ":YOU'D LIKE TO HAVE THE SPRITE" z"AT THE RIGHT ON THE SCREEN, IN"9 "PIXEL POSITIONS 256 TO 320,"c "THEN WE HAVE TO DO THE FOLLOWING:" "TELL IT TO THE VIDEO CHIP!":MS$"NICE CHAP!":63100 63000 "YET ANOTHER REGISTER, AT V140 POKEV+21,1+8+128:REM ENABLE SPRITES":26805) "150 FOR T=0 TO 500: TT=T/50 ":2690v) "160 X0=T/2:Y0=T/3 ":2700) "161 X3=250-T/2:Y3=200-T/3 ":2710)+!""THERE ARE 16 COLOURS TO CHOOSE FROM."1"WE LABEL THEM 0,1,2,...15."V"TO MAKE SPRITE #N COLOUR #10"|"(A LIGHT RED) WE POKE ANOTHER""MAGIC REGISTER IN THE VIDEO CHIP."""POKEV+39+N,10:SPRITE #N IS RED!":63000&0!"NOTE:POKE V+16,32 WILL AFFECT THE"(""X-POSITION OF SPRITE #5 BY ADDING 256"U" "TO THE VALUE OF X POKED INTO V+2*5"~" "POKE V+2*5,50:REM X-POS'N IS 50"" "POKE V+16,32:REM ADD 256""$ "THIS PUTS SPRITE #5 IN X-POS'N 306?63000 D"HOW ABOUT THE POSITION ON THE"6N"SCREEN? WELL THE C64 HAS 40 COLUMNS"\X"OR 'PRINT POSITIONS'. EACH IS"b"8 'DOTS' WIDE. THAT MAKES 40*8=320" "c"DOTS HORIZONTALLY AND WE SHOULD"l" V+2*7,X7:REM X-POS'N OF #7"$` "POKE V+16,1+8+128:ADD 256 TO ALL!"Q$e MS$" V+2*N":63100:63000:"CHOOSE BLOCK 13 & SPRITE 3"y$f "AND MAKE ALL 'SHAPE' BYTES=240"$g " 99 B=13:N=3 "$j "100 FORI=0TO62:X=240 S X-POSITION &""Y-POSITION INFORMATION?"2"INTO ANOTHER V+SOMETHING REGISTER."H"THIS TIME WE:"m"POKE V+2*N,X:POKE V+2*N+1,Y""AS LONG AS 'X' AND 'Y' ARE BOTH""LESS THAN 256 WE'RE IN GOOD SHAPE!""IN FACT WE C O62:READ X:POKE64*B7+I,X:NEXT"., "AND HAVE B0, B3 AND B7 ALL DIFFERENT",/6 "THEN WE'D TELL THE C64 WHERE THEY ARE:"C/@ "POKE2040+0,B0"Y/A "POKE2040+3,B3"o/B "POKE2040+7,B7"/E MS$" 2040+N":63100/J 63000/T "LET'S PLAY WITH TH g I1T:7p " 0011111100000111111100007q I1T:7z " 0111111100000111111110008{ I1T:'8 " 11111111011101111111000048 I1T:U8 " 111111110111011111100000b8 I1T:8 " 1111111111111111110000008 I1T:8 " 11111 0 "WE POKE ANOTHER V+SOMETHING REGISTER!":63000 1 "WE'LL EXPAND THE X-DIMENSION:"L1 " POKE V+29,2^N ":63000:V29,2Nt1 "WE'LL EXPAND THE Y-DIMENSION:"1 " POKE V+23,2^N ":63000: I1T:9 " 0000111111111111111100009 I1T:9 " 000001111111111111111000: I1T:!: " 000000011111111111111100.: I1T:O: " 000000000111111111111000\: I1T:}:" 000000000001111110000000:I1T::" 0000000 "162 X7=150+100*SIN(TT):Y7=100+50*COS(TT)":2720@* "170 POKE V+2*0,X0:POKE V+2*0+1,Y0 ":2730* "171 POKE V+2*3,X3:POKE V+2*3+1,Y3 ":2740* "172 POKE V+2*7,X7:POKE V+2*7+BOUT THIS READ X:POKE 832+I,X?"2 "READ WHAT?" 3 "A SPRITE, REMEMBER, IS 24 PIXELS WIDE.":3 "THAT'S 3 BYTES WHICH THEN GIVE THE"k3 "FIRST OF 21 ROWS OF PIXEL INFORMATION."3 "IF THE 3 BYTES WERE 255,85 AND 8"3 "WHICH,IN BIN+F "TELL WHERE #7 SHAPE IS ":63000:,P "REMEMBER THIS NUMBER!!!":63000:/,Z "POKE V+39+N & N=0..OK? ":63000:W,d "POKE V+39+N & N=3..OK! ":63000:,n ".....WHAT ELSE?....... ":63000:,x "TURN THEM ALL ON!!!!!!!":63000:, "NOW,FOR  "4 630004 "SEE!":63000 5 "111111110101010100001000"+5 "^^^^^^^^ ^ ^ ^ ^ ^ "R5 " ":630005 "IF THE NEXT 3 BYTES IN THE"5 "BLOCK OF MEMORY WHICH HAS TH ":63000:- "ON TO NEXT T. ":63000:. "OF COURSE WE COULD HAVE THE SPRITES"4. "EACH A DIFFERENT SHAPE."F. "WE COULD:"t. "FORI=0TO62:READ X:POKE64*B0+I,X:NEXT". "FORI=0TO62:READ X:POKE64*B3+I,X:NEXT"." "FORI=0TNOW..."6 "IN BINARY!":63000:T2007H " 000000001111111100000000 7I I1T:A7R " 000001111111111110000000N7S I1T:o7\ " 000011111111111111000000|7] I1T:7f " 0001111111111111111000007E SPRITE CREATED WITH:"/^ " 99 B=13:N=3 "(0h "100 FORI=0TO62:X=240:POKE64*B+I,X:NEXT "X0r "110 ETC. ETC. ETC. "y0| N3:B13:T0500:T1500:41000 630000 "TO CHANGE IT'S SIZE"11111111111100000008 I1T:8 " 1111111111111111000000008 I1T: 9 " 1111111111111111000000009 I1T:;9 " 011111111111111110000000H9 I1T:i9 " 001111111111111111000000v9 I1T:9 " 0001111111111111111000009 V23,2N1 "WE'LL SHRINK THE X-DIMENSION:"2 " POKE V+29,0 ":63000:V29,0J2 "WE'LL SHRINK THE Y-DIMENSION:"2 " POKE V+23,0 ":63000:V23,02 63000:V21,02 "WHAT A00000111000000000:I1T::63000:"PICK OUT"';$"THE BYTES!":63000:T200K;." <0><255><0>X;/I1T:y;8" <7><255><128>;9I1T:;B" <15><1,Y7 ":2750 + "180 NEXT T "?+ 2760:12500:MS$" WHEE!!":63100:63000:2800g+( "PUT DATA INTO BLOCK 'B'":63000:+2 "TELL WHERE #0 SHAPE IS ":63000:+< "TELL WHERE #3 SHAPE IS ":63000:ARY LOOK LIKE A STRING"3 "OF 1'S AND 0'S, NAMELY:"4 "11111111 & 01010101 & 00001000" 4 "OR, SIDE BY SIDE:"A4 "111111110101010100001000"L4 63000m4 "111111110101010100001000"4 "THEN THE FIRST ROW OF PIXELS WOULD BE:"4 "500 STEPS OR SO":63000:, "DEFINE X- AND Y-POS'NS.":63000:- "FOR #3 TOO ":63000:G- "AND #7...!?* ":63000:o- "MOVE SPRITE #0 ":63000:- "MOVE SPRITE #3 ":63000:- "MOVE SPRITE #7  E 'SHAPE'"5 "WERE 170,0,170 THEN:":630006 "101010100000000010101010""6 " "J6 "<170><0><170>":630006 "LET'S MAKE A PACMAN:":63000:"":7000:69006 63000:" G]" G^" G_" G`" Ha" )Hb" BHc" \Hd" wHe" Hf" KE "@63000:""@"100 FORI=0TO62:READ X:POKE832+I,X:NEXT "@"101 DATA 0,255,0"A("102 DATA 7,255,128"!A2"103 DATA 15,255,192<192>;CI1T:;L" <31><255><224>;MI1T:<7><240><7><248>><119><240>l<119><224><192>=I1T:=" <31><255><224>=I1T:=" <15><255><240> >I1T:+>" <7><255><248>8>I1T:Y>" <1><255><252>f>I1T:>" <0><127><248>>I1T"11"F"12"F"13"F"14"F"15"F"16"F"17"F"18"F"19"F "20"F "21"F GX" 0GY" KGZ" gG[" G\" INTO DATA "?"STATEMENTS" @"..THEN.. "8@" READ "f@" AND "@" PO Hg" Hh" Hi" Ij" 'Ik" BIl" HImrI'63000:"BETTER STILL..LET'S ENABLE"I'"SP$"":3931:10000A[""Q$"100 FORI=0TO62:READ X:POKE832+I,X:NEXT "B\Q$"200 POKE2040+3,13: REM WHERE SHAPE IS ":GG13934@B]Q$"300 V=53248: REM VIDEO CHIP BASE "qB^Q$"400 POKE V+39+3,10:REM RED SPRITE #3 "B_Q$"500 X=250:Y=200:21,8JL'"100 FORI=0TO62:READ X:POKE832+I,X:NEXT "JQ':I062: X:832I,X:KV'"200 POKE2040+3,13: TELL WHERE SHAPE IS"K['20403,13:10500PK`'"400 POKE V+39+3,1: SPRITE #3 IS WHITE "fKe' V393,1:10500Kj'"500255,0,255,255,0,127,255,128Cf63,255,192,31,255,224,15,255,240,7,255,248,1,255,252,0,127,248Cg0,31,128,0,14,0 D SPRITESDB13: BLOCK 133DN3 : SPRITE #0KDT00:T1500:4100:iDI062:X240:64BI,X:D2040N,B: WHERE SHAPID N=3:POKEV+39+N,"CL'63000L'"PICK AN X-POSITION";: X$:X%(X$):X%0X%35510140L'X%255 XH%8:X%X%256 M'V23,X%:V16,XH%EM'"WE DID: N=3:POKEV+2*N,"X%":POKEV+16,"XH%:63000fM'V16,0:V23,150:V393,1M'"WHT:<~" <255><255><192><I1T:<" <255><255><128><I1T:=" <255><255><0>$=I1T:E=" <255><255><0>R=I1T:s=" <127><255><128>=I1T:=" <63><2!":63100E"LOAD"(34)">SPRITES-2"(34)",8":"RUN":E" 111111111122222 "F" 123456789012345678901234 "F" 1"$F" 2"/F" 3":F" 4"EF" 5"PF" 6"[F" 7"fF" 8"qF" 9"|F"10"F :>" <0><31><128>>I1T:>" <0><14><0>>I1T:$? 63000:"NOW... "R? "PUT THESE "? "NUMBERS "? " "Σ============"PdPT$PT$"ϣϑ"QePT$BT$""PT$JQgML$""]QhWD40:CRT1024QiW2WD2:W3 000:DN$"SET COLOUR #1=0(BLACK)"5PS$"POKEV+37,0 ":V37,0i63000:DN$"V+37=SPRITE MULTI-COLOUR REG'R #0"63000:DN$"SET COLOUR #2=2(RED)"PS$"POKEV+39,2 ":63000:V39,263000:DN$"V+39=COLOUR REGISTER FOR SPRITE #0"ڧ63002vRR|T15:PT$MS$;R}PT$" ";R~PT$MS$;:R"":SSD$"":CL$" ":SSR$""@S"]QhWD40:CRT1024QiW2WD2:W3 UND":630002I15<3DN$"BUT WHERE'S THE BLACK AND CYAN??":T150:r4DN$" ":T150:x5<MS$" WATCH!!":"":V21,0:63100:"":10700F60000:MS$"HOW TO DO?":63100P"THE 00 COLOUR WAS 'BAC":63100:MS$" WELCOME!": 63100:10000w V53248:2040,13:V1,150:V,150:V39,1:V29,1:V23,1 V39,6:V21,1:"THIS IS A BLUE SPRITE.":T1900: "A 'SORT-OF' LUNAR LANDER.":T11000: "LET'S LOOK AT IRITE #N, WITH N=0 TO 7).",MS$"01 & 11???":63100:63000W"THEN, IN REGISTERS V+37 & V+38""ARE THE SPRITE MULTI-COLOURS!!""POKE V+37 AND POKE V+38 WITH THE""COLOURS YOU WANT FOR THE 01 AND 11""BIT PAIAT WILL POKE V+29,2^3 DO?":63000:V29,8M'"WHAT WILL POKE V+23,2^3 DO?":63000:V23,8M)11000N)J13:" ":K1100::"DONE!"0N)"DONE!":K1100:::630006N)^N*63000:MS$"AU REVOIR!":"":63100N+"POKE 5324" ":T150:/ @:10400: BI15k CDN$"...AND IN BIT-PAIRS ":T150: DDN$" ":T150: E L10500:63000 VPS$"NOW WE'LL " `PS$"CHOOSE 4 " jPS$"COLOURS A10050(T50)O1 V20,X0: V201,Y0O1 V23,X3: V231,Y3O 1 V27,X7: V271,Y7O$1 T:V21,0:O` INITIALIZEPaBT$"":I124:BT$BT$"":aPbPT$""PcPT$PT$630000 10600:I15:DN$"BASE OF VIDEO CHIP":T150:Z DN$"BASE OF VIDEO CHIP":T150::z PS$"V=53248:VIDEO":V53248 63000:DN$"SET COLOUR #0=1(WHITE)" PS$"POKEV+33,1 ":V33,1 63000:DN$"V+33=53281(BACKGROUND)"63WD1:W1$((WD),2):53281,15:53280,12:""QjV53248:I016:VI,0:QkV23,0:V29,0:I07:V39I,0:QtQ063000R1SD$CL$:CL$:CL$ R3ER"HIT RETURN TO CONTINUE";[RA$:A$""63001pRA$:A$""63000:DN$"SET COLOUR #3=3(CYAN)"7 PS$"POKEV+38,3 ":V38,3s63000:DN$"V+38=SPRITE MULTI-COLOUR REG'R #1" :63000DN$"PLEASE NOTE!!!":63000DN$"POKEV+39,2 CHANGED SPRITE TO RED":63000(DN$"& POKEV+33,1 CHANGED BACKGRO-" P.J.PONZO*83*WATERLOO/ONTARIO:"l60000:(142):" SPRITES-2""""  MORE ON SPRITES  ":MS$"PONZOTUTOR"( "KGROUND'"#Z"(AND SHARED BY ALL VISIBLE SPRITES)"Pd"AND POKE V+33 CHANGES THIS COLOUR."n"THE 10 COLOUR WAS THE 'SPRITE COLOUR'"x"(AND CAN BE DIFFERENT FOR EACH SPRITE)""AND POKE V+39+N CHANGES THIS COLOUR""(FOR SPT MORE CLOSELY."7 MS$"LET'S LOOK":63100:63000:V21,0h $"WE'LL DISPLAY THE PIXELS THAT MAKE" ."UP THIS SPRITE...":63000 3V,255:V1,180:V21,1 8"":10200 =I15 >DN$"NOW, IN BINARY ":T150:" ?DN$RS!!":MS$"ALL SHARED":63100:63000="OK..OUR BACKGROUND CHANGES AND SO DOES"["OUR 'SORT-OF' SPRITE.""NOW TO ENABLE MULTI-COLOUR FOR""SPRITE #N, WE: POKE V+28,2^N!!":MS$"ENABLE #N":63100:63000"STILL NO CHANGE 8+21,0:REM TURN OFF!":N0 SPRITESN0I062:X240:832I,X:N02040,13:20403,13:20407,13O0V53248: V39,10:V393,1:V397,14O0V21,18128)O1 T0 500 5;O1X0T2:Y0T3UO1X3250T2:Y3200T3~O1X7150100(T50):Y7 ND " tPS$"SET EACH "1 ~PS$"PIXEL PAIR "M PS$"TO A COLOUR "j PS$"ACCORDING TO" PS$"00=COLOUR #0" PS$"01=COLOUR #1" PS$"10=COLOUR #2" PS$"11=COLOUR #3": 8,2^N)".6"BECOME 'MULTI-COLOURED'!!":MS$"BEAUTIFUL!":63100:63000\@"NOW YOU CHANGE THE COLOURS"yJ"OF OUT LUNAR LANDER!"T"JUST HIT 0 OR 1 OR 2 OR 3 TO"^"CHANGE COLOUR #0,#1,#2 OR #3." h"...AND HIT 'Q' :A$"Q"10795 *10800: *V29,1:V23,13!*TGF1:XT:YGT:V,X:V1,Y:A$:A$"Q"10795G!&*10800::10710T!(*10800:b!+*V21,0:o!0*A$""!:*A(A$):CCCC1:CC15CC0!D* A1 10830,10840,10850,10860!I*!N*V33,CC:!X* ,21,84,30,170,100'30,170,100,27,187,116,27,187,1165'27,187,116,27,163,116,27,163,116T'5,85,80,7,227,80,23,35,84s '17,97,68,84,85,21,84,0,21t' SPRITE BORDERy'" 111111111122222"~'" 123456789012345678901234"' CM$(4)"SET 00 COLOUR (BACKGROUND)"7wCM$(5)"SET 01 COLOUR (COLOUR REG'R #0)"dxCM$(6)"SET 10 COLOUR (SPRITE COLOUR)"yCM$(7)"SET 11 COLOUR (COLOUR REG'R #1)"zCM$(8)"GIVE SPRITE #N AN X-POSITION"{CM$(9)"GIVE SPRITE #N A Y-POSΣ============"7#dPT$PT$"ϣϑ"j#ePT$BT$""PT$#gML$""#hWD40:CRT1024#i53281,15:53280,12:"(XP(J)S$(1);:10320F(S$(0); P(:::10100:!( SPRITE IN BINARY0("";e(I020:J326:(110440IJ)160"1";:10430p("0";:(::"";::) SPRITE IN BIT PAIRS )"";:K0:A1104:B0:C20:D3:E26:F4:G4900"FORI=0TO62:READX:POKE832+I,X:NEXT":10900C"POKE2040+N,13 ":10900t"POKEV+33,C0 ":10900"POKEV+37,C1 ":10900"POKEV+39+N,C2 ":10900IN OUR SPRITE!":63000+"WE MUST PUT THE C64 VIDEO CHIP INTO:"e"MULTI-COLOUR MODE":"POKE V+22,PEEK(V+22)OR16""SETTING BIT 4=MULTI COLOUR MODE BIT"""THEN THOSE SPRITES WHICH WERE","MULTI-COLOUR ENABLED (POKEV+2)V53248:V28,1:V21,1:V29,O:V23,0:F0:G2553 )TFG:XT:YT:V,X:V1,Y:A$:A$"Q"10795@ )10800:T )V29,1:V23,0 )TGF1:XT:YT:V,X:V1,Y:A$:A$"Q"10795 )10800: )V29,0:V23,1 *TFG:XT:YGT:V,X:V1,Y:A$2,PEEK(V+22)OR16 ":10900-&"POKEV+28,2^N ":10900O'MS$"AU REVOIR":"":63100:c' LANDER SPRITE'I062:X:832I,X::'0,119,64,1,189,208,7,191,116'30,170,100,30,170,100,30,170,100'21,21,84,21 TO QUIT!":MS$" READY?":63100:63000,m"":V53248:V22,216:10700rr CM$(15):DD$"":K1:D0$DD$BL$DD$:"";sCM$(1)"VIDEO CHIP BASE ADDRESS"tCM$(2)"PUT 'SHAPE' INTO A BLOCK"uCM$(3)"POINT CHIP TO BLOCK"vV37,CC:!b*V39,CC:!l*V38,CC:"* COMMENT,"*D0$CM$(K):63000:(DD$,K3):KK1:="` INITIALIZEg"aBT$"":I124:BT$BT$""::(142)"bPT$"""cPT$PT$"I121:I$(I):I$(" "I$,2):""I$::' DISPLAY PIXELS2'"":I0623:X(832I)@'J701['XP(J)S$(1);:10240g'S$(0);z(:X(832I1) (J701(XP(J)S$(1);:10280(S$(0);((:X(832I2)2(J701<ITION" |CM$(10)"EXPAND IN Y-DIRECTION".}CM$(11)"EXPAND IN X-DIRECTION"^~CM$(12)"PUT CHIP INTO MULTI-COLOUR MODE"CM$(13)"SPRITE #N INTO MULTI-COLOUR MODE"60000:"REVIEW:":"""V=53248 ":10 "#jV53248:I016:VI,0: $kV23,0:V29,0:I07:V39I,0::V22,200:V28,0:$tS$(0)" ":S$(1)" "]$~DN$""$BL$" ":DN$DN$BL$DN$$PS$"9:H40:A$"1":B$"0")IBC:JDE:(AHIJ)GR$(K)A$;:10530%)R$(K)B$;8")KK1:KFKBP,)::KB:"";::\h) CLEARr)I120:PS$"";:J1I:"";:|)" "::) MOVE SPRITE)"HIT 'Q' TO QUIT":53281,1  "POKEV+38,C3 ":109008"POKEV+2*N,X ":10900i"POKEV+2*N+1,Y ":10900"POKEV+23,1 ":10900"POKEV+29,1 ":10900"POKEV+2 ";%~PT$MS$;:%"":4&SD$"":CL$" "g&SR$""m& ":DN$DN$BL$DN$$PS$" 3>"PLEASE INSERT SPD-006":198,.:198,1:198,.:3n"PLEASE CHANGE SIDE":198,.:198,1:198,.53281,15:53280,12:" SPD-006" "  MAIN MENU PS 10 A$"2.PONZO TUTOR 2",B$"2.MICROS 'N CHIPS 2` A$"3.PONZO TUTOR 3",B$"3.MICROS 'N CHIPS 3 A$"4.PONZO TUTOR 4",B$"4.MICROS 'N CHIPS 4 A$"5.PONZO TUTOR 5",B$"5.MICROS 'N CHIPS 5 A$"6.PONZO TUTOR 6",B$"6.MICROS 'N CHIPS 6 A$"7 "9"A$"A"A$"B"24? I1((A$)10(A$"A")11(A$"B"))21:P$:b "LOAD"(34)P$(34)",8,1"T$ "RUN";:A$"B""NEW:REM STARTA MED SYS50000 198,2:631,13:632,13:"";: A$"1"A$"7"24 I1(A$)2:P$::T$"":2 "$R$(0)"":R$(1)"":R$(2)"":R$(3)"" %J07:P(J)2J:%(%0630001%1SD$CL$:CL$:CL$7%3r%"HIT RETURN TO CONTINUE";%A$:A$""63001%A$:A$""63002%%|T15:PT$MS$;%}PT$" B*]󜥥*W}]3zWyud{W]5v]7|wyr]5u]՗^u_)vnut'UMv^n]Utu]Ւu_)vout'UMv^oשwV]{|Z]e|WWw7%z9ZReuRRS7wVJ{|Z]e|WWw7%z9Z_9jM_7v^=g)jMke)J   "5 "n 1,8,0,"$0":I126:#1,A$::#1,D$,A$:1:S(A$)65 D$"G"S1S21 A$"":B$"":S1A$"":B$"" A$"ON SIDE A:",B$"ON SIDE B:" A$"1.PONZO TUTOR 1",B$"1.MICROS 'N CHI .PONZO TUTOR 7",B$"7.MICROS 'N CHIPS 79 A$"8.SPRITE TUTOR 1P "9.SPRITE TUTOR 2e "A.TYPING TUTORw "B.BUTTERMON "PRESS SPACE BAR TO CHANGE SIDE "ENTER YOUR CHOICE. 198,.:198,1:A$:A$" "2 S26,31 A$"1"A$8" !P*,MI*,PONZO TUTOR-2*,MICROS'NCHIPS2*e "PONZO TUTOR-3*,MICROS'NCHIPS3*,PONZO TUTOR-4*,MICROS'NCHIPS4* #PONZO TUTOR-5*,MICROS'NCHIPS5*,PONZO TUTOR-6*,MICROS'NCHIPS6* $PONZO TUTOR-7*,MICROS'NCHIPS7*,S*,,SPRITES TUT-2*,,T*,,B*[)9)J