start bastext 1025 start tok64 d64-GX6VYx 1 RUN00010 10 GOSUB63100:sn$="00100" 100 POKE53281,15:POKE53280,12:PRINT"{black}":PRINT"{clear}{space*11}{reverse on}{blue}micros'n'chips-2" 101 PRINT"{red}{cm a}{sh asterisk*37}{cm s}":GOSUB63100 102 PRINT"{sh -} {reverse on}{blue}{space*8}bring on the chips{space*9}{red}{reverse off} {sh -}":ms$="ponzotutor" 103 PRINT"{red}{cm z}{sh asterisk*37}{cm x}{black}":GOSUB63200 104 ms$=" welcome! ":GOSUB63200:POKE53280,15 105 PRINT"{home}{down*10}Qnote{down}{left*4}{cm u*4}{up}:hit the @-key at any" 106 PRINT"{down}{space*6}time to return to an":PRINT"{down}{space*6}earlier section{.*3}":GOSUB50000 1000 GOSUB63100:REM micros-1 1001 sn$="01{0*3}" 1005 t$="1's and 0's on the address bus":GOSUB63000 1010 PRINT"{down*2}Qin order to easily describe" 1020 PRINT"{down} the various addresses which" 1030 PRINT"{down} go onto the {reverse on}address bus" 1040 PRINT"{down} we do not{down}{left*3}{cm u*3}{up} want to say:" 1050 GOSUB50000:b$(0)="{space*7}{reverse on}zero":b$(1)="{space*7}{reverse on}one " 1055 FORi=1TO16:PRINTb$(2*RND(1)):FORt=1TO100:NEXT:NEXT 1060 ms$="{space*2}ouch!!":GOSUB63200:GOSUB50000 1070 PRINT"{clear}{down}Qwe could say '53281'" 1080 PRINT"{down} or '64738', etc." 1090 PRINT"{down} but what's that in {reverse on}binary{reverse off}":PRINT"{down} {.*4}{reverse on}1{reverse off}s and {reverse on}0{reverse off}s?" 1095 GOSUB50000:ms$="{space*2}ouch^2":GOSUB63300 1100 PRINT"{clear}{down*2}Qno{.*3}what we need to use" 1110 PRINT"{down} is {reverse on}hexadecimal{reverse off} notation." 1120 PRINT"{down}Qif we consider the 16 bits" 1130 PRINT"{down} of the {reverse on}address bus{reverse off} as" 1140 PRINT"{down} 4 groups-of-four then" 1150 PRINT"{down} we can describe each group." 1160 PRINT"{down}Qeach group-of-four can have" 1170 PRINT"{down} 2^4=16 possible {reverse on}1/0{reverse off} configurations" 1180 PRINT"{down} so can be described by" 1190 PRINT"{down} a number from 1 to 16..":GOSUB50000:PRINT"{down*2} {reverse on}or why not 0 to 15?" 1200 ms$=" yes!yes!":GOSUB50000:GOSUB63300 1210 t$="hexadecimal":GOSUB63000 1220 PRINT"{down}Qwe use a number system based" 1230 PRINT"{down} on {reverse on}16{reverse off} rather than {reverse on}10{reverse off}." 1240 PRINT"{down}Qin {reverse on}decimal{reverse off}, 1234{down}{left*4}{cm u*4}{up} means:" 1250 PRINT"{down} {reverse on}1{reverse off}*1{0*3}+{reverse on}2{reverse off}*100+{reverse on}3{reverse off}*10+{reverse on}4{reverse off}*1" 1260 PRINT"{down*2}Q{reverse on}1{reverse off} & {reverse on}2{reverse off} & {reverse on}3{reverse off} & {reverse on}4{reverse off} give the number" 1270 PRINT"{down} of {reverse on}1{0*3}{reverse off}s & {reverse on}100{reverse off}s & {reverse on}10{reverse off}s & {reverse on}1{reverse off}s" 1280 PRINT"{down*2}Qwe use a number system" 1290 PRINT"{down} which gives the number of" 1300 PRINT"{down} {reverse on}4096{reverse off}s & {reverse on}256{reverse off}s & {reverse on}16{reverse off}s & {reverse on}1{reverse off}s.":ms$="{space*2}ouch?" 1310 GOSUB50000:GOSUB63300 1320 PRINT"{clear}{down*4}Qin {reverse on}decimal{reverse off} we use:" 1330 PRINT"{down} 1{0*3}=10^3":PRINT"{space*2}100=10^2":PRINT"{space*3}10=10^1":PRINT"{space*4}1=10^0" 1340 PRINT"{down*3}Qin {reverse on}hexadecimal{reverse off} we use:":ms$="looks good" 1350 PRINT"{down} 4096=16^3":PRINT"{space*2}256=16^2":PRINT"{space*3}16=16^1":PRINT"{space*4}1=16^0" 1360 GOSUB50000:GOSUB63300:PRINT"{clear}{down}Qin {reverse on}decimal{reverse off} we use {reverse on}10{reverse off} digits:" 1370 PRINT"{down} 0,1,2,3,4,5,6,7,8 & 9." 1375 PRINT"{down*2}Qin {reverse on}hexadecimal{reverse off} we use {reverse on}16{reverse off} digits:" 1380 PRINT"{down} 0,1,2,3,4,5,6,7,8,9{.*3}":GOSUB50000:ms$="{space*2}ready?":GOSUB63300 1390 GOSUB50000:PRINT"{home}{down*8}{right*20},{reverse on}a,b,c,d,e & f.":GOSUB50000 1400 PRINT"{clear}{down}Qfour bits vs. hexadecimal:{down}":DIM bi$(15) 1405 FORi=0TO15:x=i:GOSUB51000:bi$(i)=x$ 1410 PRINT"{space*3}"bi$(i)"={reverse on}"CHR$(48+i-7*(i>9)):NEXT 1420 ms$="terrific!":GOSUB63200:GOSUB50000 1430 PRINT"{clear}{down}Qto distinguish '5678' in" 1440 PRINT"{down} {reverse on}hexadecimal{reverse off} from '5678' in" 1450 PRINT"{down} {reverse on}decimal{reverse off}, we normally" 1460 PRINT"{down} write:":PRINT"{down} $5678" 1470 PRINT"{down} so.. {reverse on}${reverse off} means {reverse on}hexadecimal{reverse off}!" 1480 PRINT"{down}Qnote{down}{left*4}{cm u*4}{up}:" 1490 PRINT"{down} $5678={reverse on}5{reverse off}*4096+{reverse on}6{reverse off}*256+{reverse on}7{reverse off}*16+{reverse on}8{reverse off}*1" 1500 PRINT"{space*6}="5*4096+6*256+7*16+8*1"(decimal)":GOSUB50000 1510 PRINT"{clear}{down*3}Qand..":PRINT"{down} $d021={reverse on}13{reverse off}*4096+{reverse on}0{reverse off}*256+{reverse on}2{reverse off}*16+{reverse on}1{reverse off}*1" 1520 PRINT"{space*6}="13*4096+0*256+2*16+1*1:GOSUB50000:ms$="familiar?":GOSUB63300 2000 GOSUB63100:REM micros-2 2001 sn$="02{0*3}" 2005 t$="c64 memory":GOSUB63000 2010 PRINT"{down*4}Qlet's look at the way" 2020 PRINT"{down} memory is laid out on a" 2030 PRINT"{down} commodore 64:":GOSUB50000 2040 GOSUB63000:PRINT"{home}{down*4}":ram$="{cm +}{cm -}":FORi=1TO16:PRINTram$;:NEXT:PRINT 2041 h$="0123456789abcdef" 2045 FORi=1TO16:PRINTMID$(h$,i,1)" ";:FORt=1TO50:NEXT:NEXT:PRINT 2050 PRINT"{down*2}Qthis is the {reverse on}ram{reverse off}{.*3}" 2060 PRINT" in 4k chunks.":ms$="64k worth":GOSUB63200:GOSUB50000 2070 PRINT"{home}{down*3}":rom$="{reverse on} {reverse off}{cm k}":PRINTSPC(20)rom$rom$"{space*2}"rom$rom$rom$ 2080 PRINT"{home}{down*12}Qthis is 20k of {reverse on}rom{reverse off}.":ms$="4k chunks!":GOSUB63200 2090 GOSUB50000:PRINT"{home}{down*12}Q8k for the {reverse on}basic interpreter":GOSUB50000 2100 FORi=1TO4:PRINT"{home}{down*4}"SPC(20)"{space*4}":FORt=1TO50:NEXT 2110 PRINT"{home}{down*4}"SPC(20)rom$rom$:FORt=1TO50:NEXT:NEXT 2120 GOSUB50000:PRINT"{home}{down*12}Q4k for the {reverse on}input/output{reverse off} chips":GOSUB50000 2130 FORi=1TO4:PRINT"{home}{down*4}"SPC(26)"{space*2}":FORt=1TO50:NEXT 2140 PRINT"{home}{down*4}"SPC(26)rom$:FORt=1TO50:NEXT:NEXT 2145 GOSUB50000:PRINT"{home}{down*12}Q(also the {reverse on}video/sound{reverse off} chips){space*2}" 2150 GOSUB50000:PRINT"{home}{down*12}Q8k for the so-called {reverse on}kernal{reverse off}{space*2}":GOSUB50000 2160 FORi=1TO4:PRINT"{home}{down*4}"SPC(28)"{space*4}":FORt=1TO50:NEXT 2170 PRINT"{home}{down*4}"SPC(28)rom$rom$:FORt=1TO50:NEXT:NEXT 2175 GOSUB50000:PRINT"{home}{down*12}Qlots of smarts in here!!{space*7}" 2180 GOSUB50000:PRINT"{home}{down*12}Qall piled on top of {reverse on}ram{reverse off}!!{space*4}":GOSUB50000 2190 t$="{space*6}howsit work?{space*6}":GOSUB63000:ms$="go!go!go!":GOSUB63300 3000 GOSUB63100:REM micros-3 3001 sn$="03{0*3}" 3010 t$="rom-over-ram":GOSUB63000 3020 PRINT"{down*2}Qif we {reverse on}poke{reverse off} a memory location" 3030 PRINT"{down} which has {reverse on}rom/ram{reverse off}, it can't go" 3040 PRINT"{down} into {reverse on}rom{reverse off} (read only{down}{left*9}{cm u*9}{up} remember?)" 3050 PRINT"{down} so it goes into {reverse on}ram{reverse off} ('underneath')." 3060 PRINT"{down}Qthe {reverse on}ram{reverse off} gets a {reverse on}chip enable{reverse off} when" 3070 PRINT"{down} {reverse on}read/write{reverse off}=0 (meaning 'write').":ms$="poke=write":GOSUB63200 3080 GOSUB50000:GOSUB63000:PRINT"{down*2}Qif we {reverse on}peek{reverse off} a memory location" 3090 PRINT"{down} which has {reverse on}rom/ram{reverse off}, then we get" 3100 PRINT"{down} the {reverse on}rom{reverse off} (read{down}{left*4}{cm u*4}{up} only!)." 3110 PRINT"{down}Qthe {reverse on}rom{reverse off} gets a {reverse on}chip enable{reverse off} when" 3120 PRINT"{down} {reverse on}read/write{reverse off}=1 (meaning 'read').":ms$="peek=read!":GOSUB63200 3130 GOSUB50000:GOSUB63000:PRINT"{down*2}Qok{.*3}{reverse on}rom/ram{reverse off} memory starts" 3140 PRINT"{down} with the {reverse on}basic interpreter{reverse off} at" 3150 PRINT"{down} $a{0*3}{.*3}";:GOSUB50000:PRINT" which is {reverse on}40960{reverse off}(decimal){.*3}" 3160 GOSUB50000:PRINT"{down} and since 'basic programs' start at" 3170 PRINT"{down} $0801={reverse on}2049{reverse off}(decimal){.*3}":GOSUB50000 3180 PRINT"{down} that leaves 40960-2049 {reverse on}free ram{reverse off}" 3190 PRINT"{down} for writing our programs..":GOSUB50000 3200 PRINT"{down} and that's how many":PRINT"{down} {reverse on}bytes free{reverse off}?" 3210 GOSUB50000:ms$="{space*2}{reverse on}38911":GOSUB63200:GOSUB50000 4000 GOSUB63100:REM micros-4 4001 sn$="04{0*3}" 4010 t$="goodbye rom":GOSUB63000 4020 PRINT"{down*2}Qwe can get rid of blocks of {reverse on}rom{reverse off}!" 4030 PRINT"{down}Qjust make sure that the {reverse on}ram{reverse off} gets" 4040 PRINT"{down} a 'chip enable' during both" 4050 PRINT"{down} {reverse on}read{reverse off} and{down}{left*3}{cm u*3}{up} {reverse on}write{reverse off}." 4060 PRINT"{down}Qand give the {reverse on}rom{reverse off} nothing!" 4070 ms$="how to do?":GOSUB63200:GOSUB50000 4080 GOSUB63000:PRINT"{down*2}Qfortunately the {reverse on}6510{reverse off} knows how!" 4090 PRINT"{down}Qmemory location {reverse on}one{reverse off} in the" 4100 PRINT"{down} commodore 64 is special.{down}{left*8}{cm u*7}":t$="memory location 1" 4110 GOSUB50000:GOSUB63000:PRINT"{down*2}Qmake {reverse on}bit 0{reverse off}=0 and the" 4120 PRINT"{down} rom at $a{0*3}-$b{f*3} is gone!":PRINT"{down} (call this bit 'loram')" 4130 PRINT"{down*2}Qmake {reverse on}bit 1{reverse off}=0 and the" 4140 PRINT"{down} rom at $e{0*3}-${f*4} is gone!!":PRINT"{down} (call this bit 'hiram')" 4150 PRINT"{down*2}Qmake {reverse on}bit 2{reverse off}=0 and the" 4160 PRINT"{down} rom at $d{0*3}-$d{f*3} is gone!!":GOSUB50000 4170 PRINT"{down}{.*4}well ..sort of{.*3}":GOSUB50000 4180 PRINT"{clear}{down*11}Q'rom' at $d{0*3}-$d{f*3} is" 4190 PRINT"{down} sort of special.{down}{left*8}{cm u*7}" 4200 ms$="{space*2}tell us!":GOSUB63200:GOSUB50000 5000 GOSUB63100:REM micros-5 5001 sn$="05{0*3}" 5010 t$="$d{0*3}-$d{f*3}":GOSUB63000 5020 ms$="remember?":GOSUB63200 5030 PRINT"{home}{down*4}":ram$="{cm +}{cm -}":FORi=1TO16:PRINTram$;:NEXT:PRINT 5035 h$="0123456789abcdef" 5040 FORi=1TO16:PRINTMID$(h$,i,1)" ";:FORt=1TO50:NEXT:NEXT:PRINT 5050 PRINT"{home}{down*3}":rom$="{reverse on} {reverse off}{cm k}":PRINTSPC(20)rom$rom$"{space*2}"rom$rom$rom$ 5060 PRINT"{down*4}Q$d{0*3}-$d{f*3} is {reverse on}three layers deep{reverse off}!":ms$="2{reverse on}ram{reverse off}&1{reverse on}rom" 5070 GOSUB63200:GOSUB50000:FORi=1TO6:PRINT"{home}{down*2}":PRINTSPC(26)"{space*2}" 5080 FORt=1TO50:NEXT:PRINT"{home}{down*2}":PRINTSPC(26)ram$:FORt=1TO50:NEXT:NEXT 5090 GOSUB50000:PRINT"{home}{down*11}Qtop ram is {reverse on}input/output{reverse off} chips." 5100 PRINT" (and the video/sound chips":PRINT"{space*2}to which you {reverse on}read{reverse off}&{reverse on}write{reverse off}.." 5110 PRINT"{space*2}except for most of the sound chip.." 5120 PRINT"{space*2}but that's another story!)" 5130 GOSUB50000:PRINT"{home}{down*17}Qbottom ram is 'free'." 5140 PRINT"{down}Qand {reverse on}middle rom{reverse off}?":GOSUB50000 5150 PRINT"{clear}{down*10}Qthat's the {reverse on}character rom{reverse off}" 5160 PRINT"{down} which stores the pixel info" 5170 PRINT"{down} which describes how to draw each" 5180 PRINT"{down} character{.*3}like a,b,c,*,!,etc.":ms$="hidden rom":GOSUB63200 5190 GOSUB50000:PRINT"{clear}{down*2}Qthat explains why you must" 5200 PRINT"{down} get the {reverse on}i/o{reverse off} chips out-of-the-way" 5210 PRINT"{down} to move the character {reverse on}rom{reverse off} to {reverse on}ram" 5220 PRINT"{down} and 'create' a few characters of" 5230 PRINT"{down} your own!":ms$="*=pacman!":GOSUB63200:GOSUB50000 6000 GOSUB63100:REM micros-6 6001 sn$="06{0*3}" 6010 t$="more on $d{0*3}-$d{f*3} top ram":GOSUB63000 6020 PRINT"{down*2}Q$d{0*3}-$d3ff={reverse on}video{reverse off} chip=1k bytes" 6030 PRINT"{down}Q$d400-$d7ff={reverse on}sound{reverse off} chip=1k bytes" 6040 PRINT"{down}Q$d800-$dbff={reverse on}colour{reverse off} memory=1k nybbles" 6050 PRINT"{down}Q$dc00-$dcff={reverse on}6526 i/0{reverse off} chip=256 bytes" 6060 PRINT"{down}Q$dd00-$ddff={reverse on}6526 i/0{reverse off} chip=256 bytes" 6070 PRINT"{down}Q$de00-$d{f*3}=nothing there.":GOSUB50000 6080 PRINT"{down*2}>>1k bytes for the video chip?":GOSUB50000 6090 PRINT"{down}>>but it only has 47 internal registers!?":GOSUB50000 7000 GOSUB63100:REM micros-7 7001 sn$="07{0*3}" 7010 t$="partial decoding":GOSUB63000 7020 PRINT"{down*2}Qconsider the following decoder for" 7030 PRINT"{down} a 256-byte chip which is " 7040 PRINT"{down} supposed to answer the {reverse on}6510{reverse off} when" 7050 PRINT"{down} the {reverse on}address bus{reverse off} contains an" 7060 PRINT"{down} address in the range, say:" 7070 PRINT"{down} $d800-$d8ff.":ms$="d800=55296":GOSUB63200:GOSUB50000 7080 PRINT"{clear}{down}{reverse on}address bus with $d8xx{reverse off}{down}" 7090 PRINT"{space*3}1101 1{0*3} {x*4} {x*4}" 7100 PRINT"{space*3}{sh -*4} {sh -}{space*4}{sh -*4} {sh -*4}" 7110 PRINT"{space*2}{cm a}{cm x}{sh -*3} {sh -}{space*4}{sh -*4} {sh -*4}" 7120 PRINT"{space*2}{sh -}{cm a}{cm x}{sh -*2} {sh -}{space*4}{sh -*4} {sh -*4}" 7130 PRINT"{space*2}{sh -*2}{cm a}{sh +}{cm x} {sh -}{space*4}{sh -*4} {sh -*4}" 7140 PRINT"{space*2}{sh -*3}{cm z}{sh asterisk}{cm s}{sh -}{space*4}{sh -*4} {sh -*4}" 7150 PRINT"{space*2}{sh -*3}{cm a}{sh asterisk}{sh +}{cm x}{space*4}{sh -*4} {sh -*4}" 7160 PRINT" {cm a}{cm e*4}{cm s}{sh -}{space*5}{sh -*4} {sh -*4}" 7170 PRINT" {sh -}{reverse on}nand{reverse off}{sh -*2}{space*5}{sh -*4} {sh -*4}" 7180 PRINT" {cm z}{sh asterisk*2}{cm r}{sh asterisk}{cm x}{sh -}{space*5}{sh -*4} {sh -*4}" 7190 PRINT"{space*4}{sh -}{space*2}{sh -}{space*5}{sh -*4} {sh -*4}" 7200 PRINT"{space*3}{cm a}{cm e}{sh asterisk*2}{cm e}{cm s}{space*4}{sh -*4} {sh -*4}" 7210 PRINT"{space*3}{sh -} {reverse on}or{reverse off} {sh -}{space*4}{sh -*4} {sh -*4}" 7220 PRINT"{space*3}{cm z}{sh asterisk*2}{cm r}{sh asterisk}{cm x}{space*4}{sh -*4} {sh -*4}" 7230 PRINT"{space*6}{sh -}{arrow left}{reverse on}ce{reverse off}{space*3}{sh -*4} {sh -*4} 7240 PRINT"{space*2}{cm a}{sh asterisk*3}{cm e}{sh asterisk*3}{cm s}{space*2}{sh -*4} {sh -*4} 7250 PRINT"{space*2}{sh -}memory {cm q}{arrow left}{sh asterisk}{cm x*4} {cm x*4} 7260 PRINT"{space*2}{cm z}{sh asterisk*7}{cm x}{space*2}8 wires" 7270 ps$="{right*26}" 7280 PRINT"{home}":PRINTps$"{reverse on}c{reverse off}hip {reverse on}e{reverse off}nable=0" 7290 PRINTps$"for address":PRINTps$"Q$d800-d8ff" 7295 pp$="{home}{down*3}{space*3}1101 {reverse on}" 7300 GOSUB50000:PRINTps$"{down} {reverse on}but{reverse off} also for":PRINTps$"Q$d900-d9ff" 7305 PRINTpp$"1001":GOSUB50000 7310 PRINTps$"{down*3} {reverse on}and{reverse off} also for":PRINTps$"Q$da00-daff" 7315 PRINTpp$"1010":GOSUB50000 7320 PRINTps$"{down*5} {reverse on}and{reverse off} also for":PRINTps$"Q$db00-dbff" 7325 PRINTpp$"1011":GOSUB50000 7330 PRINTps$"{down*9} {reverse on}and{reverse off} also for ":PRINTps$"Q$df00-d{f*3}" 7340 PRINTpp$"{1*4}":GOSUB50000 7345 ms$="{space*2}partial ":GOSUB63200:GOSUB50000 7350 ms$="decoding!!":GOSUB63300:GOSUB50000 7360 PRINT"{clear}{down}Qthis little ol' 256-bytes" 7370 PRINT"{down} answers every when the {reverse on}6510{reverse off}" 7380 PRINT"{down} calls{.*3}and he/she answers" 7390 PRINT"{down} 8 times from $d800 to $d{f*3}!" 7400 PRINT"{down*2}Qthere appears to be 2k of" 7410 PRINT"{down} memory{.*3}but it's just the" 7420 PRINT"{down} same old 256 bytes answering" 7430 PRINT"{down} again and again{.*3}" 7440 ms$="256=2048?":GOSUB63200:GOSUB50000 7450 PRINT"{clear}{down}Qto see 'partial decoding' at work" 7460 PRINT"{down} in a {reverse on}pet{reverse off} you can {reverse on}poke59468,14" 7470 PRINT"{down} to change to lower case." 7480 PRINT"{down}Qthis puts 14 into a special memory" 7490 PRINT"{down} location (a register inside a chip)" 7500 PRINT"{down} and this switches the characters" 7505 PRINT"{down} to a 'lower case' set." 7510 PRINT"{down}Qbut {reverse on}poke59500,14{reverse off} will put 14 into" 7520 PRINT"{down} the same{down}{left*4}{cm u*4}{up} memory location!!":GOSUB50000 7530 PRINT"{clear}{down}Qnote that the difference between" 7540 PRINT"{down} 59500 and 59468 is {reverse on}32{reverse off}{.*3}" 7550 PRINT"{down} (=one address bus bit!)" 7560 PRINT"{down}Qthis bit is ignored by the 'partial" 7570 PRINT"{down} decoding' involved in enabling this" 7580 PRINT"{down} chip!" 7900 GOSUB50000 8000 GOSUB63100:REM micros-8 8001 sn$="08{0*3}" 8005 DIM i$(15),o$(15) 8010 t$="decoder chips":GOSUB63000 8020 PRINT"{down*2}Qthere are some nice chips" 8030 PRINT"{down} which have n inputs and" 8040 PRINT"{down} give 2^n outputs." 8046 FORi=0TO7:x=i:GOSUB51000:i$(i)=x$:NEXT 8050 PRINT"{down}Qonly one output wire is 'low'" 8060 PRINT"{down} (or {reverse on}0{reverse off}) depending upon" 8070 PRINT"{down} which of the 2^n possible" 8080 PRINT"{down} {reverse on}1/0{reverse off} configurations" 8090 PRINT"{down} occurs at the n inputs." 8095 FORi=8TO15:x=i:GOSUB51000:i$(i)=x$:NEXT 8100 GOSUB50000:ms$="{space*2}{reverse on}what!":GOSUB63300 8110 PRINT"{clear}{down*2}Qtake for example the {reverse on}74154{reverse off}:" 8120 PRINT"{space*3}{cm a}{sh asterisk*3}{cm s}":FORi=1TO16:PRINT"{space*3}{sh -}{space*3}{cm q}{sh asterisk*2}":NEXT:PRINT"{space*3}{cm z}{sh asterisk*3}{cm x}" 8130 ms$="16 outputs":GOSUB63200:GOSUB50000 8140 PRINT"{home}{down*3}":FORi=1TO4:PRINT" {sh asterisk*2}{cm w}"CHR$(13)"{down*2}":NEXT 8150 ms$="4 inputs":GOSUB63200:GOSUB50000:ps$="":FORi=1TO15:ps$=ps$+"{right}":NEXT 8160 PRINT"{home}{down*4}"ps$"Qlet's see how it works." 8165 PRINT"{down*2}"ps$"Qhit {reverse on}return{reverse off} 16 times!" 8170 o$="{1*16}" 8180 FORi=0TO15:o$(i)=LEFT$(o$,15-i)+"0"+RIGHT$(o$,i):NEXT 8185 FORi=0TO15 8190 PRINT"{home}":FORj=1TO4:PRINT"{down*3}"MID$(i$(i),j,1):NEXT 8200 PRINT"{home}{down*4}{right*10}";:FORj=1TO16:PRINTMID$(o$(i),j,1)"{down}{left}";:NEXT 8210 GOSUB50000:NEXT:PRINT"{home}{down*3}" 8220 PRINTps$"Qas{space*2}you{space*2}can{space*2}see, each" 8230 PRINTps$" of{space*2}the{space*2}16 outputs can" 8240 PRINTps$" be used as {reverse on}chip enable" 8250 PRINTps$" for 16 'other' chips{!*3}" 8260 GOSUB50000 8270 PRINTps$"Qthe 4 input pins can be" 8280 PRINTps$" connected to the top{space*2}4" 8290 PRINTps$" wires{space*2}of{space*2}the{space*2}address" 8300 PRINTps$" bus, so we can identify" 8310 PRINTps$" the first hex digit!{space*3}" 8315 GOSUB50000:ms$="terrific!!":GOSUB63300 8320 PRINT"{clear}{down}Qthe {reverse on}pet{reverse off} uses this {reverse on}74154{reverse off} to" 8330 PRINT"{down} enable{down}{left*6}{cm y*6}{up} the 4k {reverse on}rom{reverse off}s which live" 8340 PRINT"{down} at $b{0*3}-$b{f*3} or $c{0*3}-$c{f*3}" 8350 PRINT"{down} etc.. or $f{0*3}-${f*4}." 8360 PRINT"{down*2}":FORi=1TO7:PRINT"{sh -}rom{sh -}";:NEXT:PRINT 8370 FORi=1TO7:PRINT"{cm z}{sh asterisk}{cm r}{sh asterisk}{cm x}";:NEXT:PRINT 8380 FORi=1TO7:PRINT"{space*2}{sh -}{space*2}";:NEXT:PRINT 8390 PRINT"{home}{down*10}{right*2}";:PRINT"f{space*4}e{space*4}d{space*4}c{space*4}b{space*4}a{space*4}9" 8400 PRINT"{down*3}{cm a}{sh asterisk}";:FORi=1TO7:PRINT"{cm e}{sh asterisk*4}";:NEXT:PRINT" {sh asterisk}" 8405 PRINT"{sh -}{space*13}{reverse on}74154{reverse off}" 8410 PRINT"{cm z}{sh asterisk}";:FORi=1TO4:PRINT"{cm r}{sh asterisk}";:NEXT:FORi=1TO25:PRINT"{sh asterisk}";:NEXT:PRINT" {sh asterisk}" 8420 PRINT"{space*2}{sh -} {sh -} {sh -} {sh -}":PRINT"{sh asterisk*2}Q{sh asterisk}{sh +}{sh asterisk}{sh +}{sh asterisk}{sh +}{sh asterisk*2} top four" 8430 PRINT"{sh asterisk*4}Q{sh asterisk}{sh +}{sh asterisk}{sh +}{sh asterisk*2} bits of":PRINT"{sh asterisk*6}Q{sh asterisk}{sh +}{sh asterisk*2} address bus" 8440 PRINT"{sh asterisk*8}Q{sh asterisk*2} {cm u*11}":ms$="{space*2}slick":GOSUB63200:GOSUB50000 9000 GOSUB63100:REM micros-9 9001 sn$="09{0*3}" 9010 t$="more decoding":GOSUB63000 9020 PRINT"{down*2}Qbesides the {reverse on}74154{reverse off} "; 9030 PRINT"4-to-16 decoder{down}{left*15}{cm u*15}" 9040 PRINT" how about a nice 2-to-4 decoder{down}{left*14}{cm u*14}{up}?" 9050 PRINT"{down*3}{space*4}{cm a}{sh asterisk*3}{cm s}":FORi=1TO2:PRINT"{space*2}{sh asterisk*2}{cm w}{space*3}{cm q}{sh asterisk*2}":NEXT 9060 FORi=1TO2:PRINT"{space*4}{sh -}{space*3}{cm q}{sh asterisk*2}":NEXT:PRINT"{space*4}{cm z}{sh asterisk*3}{cm x}":GOSUB50000 9070 PRINT"{down*3}Qdecoders also{down}{left*4}{cm u*4}{up} need a {reverse on}chip enable{reverse off}!":GOSUB50000 9080 PRINT"{home}{down*15}{right*6}{cm r}{down}{left}^{down}{left}ce={reverse on}0{reverse off} to enable outputs" 9090 PRINT"{down*3} (else all outputs=1)":GOSUB50000 9100 PRINT"{clear}":GOSUB9500:PRINT"{down*2}Qnow we {reverse on}enable{reverse off} our decoder" 9110 PRINT" when the top{down}{left*3}{cm u*3}{up} 4 bits on the" 9120 PRINT" address bus are 1101":GOSUB50000 9130 PRINT"{home}{down*8}{right*6}ce={reverse on}0{reverse off} when address bus=$d{x*3}":GOSUB50000 9140 PRINT"{down*5}(we could use a 4-16 decoder for this)" :GOSUB50000 9150 PRINT"{down}Qthen we feed the 2 inputs with the" 9160 PRINT" next{down}{left*4}{cm u*4}{up} 2 bits on the address bus.":GOSUB50000 9170 PRINT"{home}{down*2}a11":PRINT"a10" 9180 PRINT"{home}{down*19} (we call the 16 bits on the" 9190 PRINT" {reverse on}address bus{reverse off}: a0,a1,{.*3},a15)":GOSUB50000 9200 PRINT"{down}Qnow we have 4 {reverse on}chip enable{reverse off} ouputs for" 9210 PRINT" address ranges:$d{0*3}-$d3ff/$d400-$d7ff" 9220 PRINT"{space*15}:$d800-$dbff/$dc00-$d{f*3}{home}":GOSUB50000 9230 PRINT"{home}{down}":ps$="{right*12}":PRINTps$"to 6567 {reverse on}video{reverse off} chip" 9235 PRINTps$"to 6581 {reverse on}sound{reverse off} chip" 9340 PRINTps$"to {reverse on}colour rom{reverse off} chip" 9345 PRINTps$"$dc00-$d{f*3} enable" 9350 GOSUB50000:PRINT"{clear}{down*6}Qnow the 4k address range from" 9360 PRINT"{down} $d{0*3} to $d{f*3} has been divided" 9370 PRINT"{down} into 4 {reverse on}1k{reverse off} chunks.":GOSUB50000 9380 PRINT"{down*2}Qeach of the {reverse on}video{reverse off},{reverse on}sound{reverse off} and {reverse on}colour rom{reverse off}" 9390 PRINT"{down} chips get {reverse on}1k{reverse off},":GOSUB50000:PRINT"{down}Q(whether they need it or not)" 9400 GOSUB50000:PRINT"{down}Qand the $dc00-$d{f*3} enable{.*3}?":GOSUB50000 9410 PRINT"{clear}":GOSUB9500:PRINT"{home}{down*2}a9":PRINT"a8" 9420 PRINT"{home}{down*8}{right*8}={reverse on}$dc00-$d{f*3} enable{reverse off}!":GOSUB50000 9425 ps$="{home}{down*2}{right*11}" 9430 PRINTps$"to 6526 {reverse on}i/o{reverse off} chip{sh space}#1":PRINT"{home}{down*10}Q($dc00-$dcff)" 9435 GOSUB50000 9440 PRINTps$"{down}to 6526 {reverse on}i/o{reverse off} chip{sh space}#2":PRINT"{home}{down*12}Q($dd00-$ddff)" 9445 GOSUB50000 9450 PRINTps$"{down*2}to cartridge:i/o #1":PRINT"{home}{down*14}Q($de00-$deff)" 9455 GOSUB50000 9460 PRINTps$"{down*3}to cartridge:i/o #2":PRINT"{home}{down*16}Q($df00-$d{f*3})" 9465 GOSUB50000 9470 PRINT"{home}{down*18}Qthe {reverse on}1k{reverse off}:{space*2}$dc00-$d{f*3}" 9480 PRINT" gets{space*2}divided{space*2}into":PRINT" 4{space*2}{reverse on}256{reverse off}-byte{space*2}chunks!":GOSUB50000 9490 ms$="{space*2}{reverse on}whee{reverse off}!!":GOSUB63300:GOTO10000 9500 PRINT"{space*4}{cm a}{sh asterisk*3}{cm s}":FORi=1TO2:PRINT"{space*2}{sh asterisk*2}{cm w}{space*3}{cm q}{sh asterisk*2}":NEXT 9510 FORi=1TO2:PRINT"{space*4}{sh -}{space*3}{cm q}{sh asterisk*2}":NEXT:PRINT"{space*4}{cm z}{sh asterisk}{cm r}{sh asterisk}{cm x}{down}{left*3}^{down}{left}ce":RETURN 10000 GOSUB63100:REM micros-10 10001 sn$="1{0*4}" 10005 t$="recap on $d{0*3}-$d{f*3}":GOSUB63000 10006 PRINT"{down*3}Qit has 3 layers:" 10007 PRINT"{down} 'top' is {reverse on}video{reverse off},{reverse on}sound{reverse off}{space*6}{cm a}":PRINTSPC(27)"{sh -}" 10008 PRINT" {reverse on}colour rom{reverse off}{down}{left*3}{E*3}{up} & {reverse on}input/output{reverse off}{sh asterisk}{cm w}":PRINTSPC(27)"{cm z}" 10009 PRINTSPC(27)"{cm a}":PRINT" 'middle' is {reverse on}character rom{reverse off}{sh asterisk}{cm w}":PRINTSPC(27)"{sh -}" 10010 PRINTSPC(27)"{cm z}":PRINTSPC(27)"{cm a}":PRINT" 'bottom' is 'free' {reverse on}ram{reverse off}{sh asterisk*4}{cm w}" 10011 PRINTSPC(27)"{sh -}":PRINTSPC(27)"{cm z}":PRINT"{home}{down*7}{right*28}"; 10012 PRINT"{red}{cm +*5}{down}{left*5}{green}{cm +*5}{down}{left*5}{blue}{cm +*5}{down}{left*5}{156}{cm +*5}{down}{left*5}{black}"; 10013 FORi=1TO4:PRINT"{reverse on}{space*5}{down}{left*5}";:NEXT 10014 FORi=1TO4:PRINT"{cm +*5}{down}{left*5}";:NEXT 10015 GOSUB50000:PRINT"{clear}{down*8}Qlet's look more closely" 10016 PRINT"{down} at the {reverse on}top ram/rom{reverse off}.":ms$="go!go!go!":GOSUB63200:GOSUB50000 10020 t$="$d{0*3}-$d{f*3}:top stuff":GOSUB63000:PRINT"{down*2}" 10100 PRINT"{space*6}{cm a}{sh asterisk*4}{cm s} 10110 PRINT" a11{sh asterisk*2}{cm w}{space*4}{cm q}{sh asterisk*3}video 10120 PRINT" a10{sh asterisk*2}{cm w}{space*4}{cm q}{sh asterisk*3}sound 10130 PRINT"{space*6}{sh -}{reverse on}2to4{reverse off}{cm q}{sh asterisk*3}colour 10140 PRINT"{space*6}{sh -}{space*4}{cm q}{sh asterisk}{cm s} 10150 PRINT"{space*6}{cm z}{sh asterisk}{cm r}{sh asterisk*2}{cm x} {sh -} 10160 PRINT" {F*3}{space*4}^{space*4}{sh -} {cm a}{sh asterisk*4}{cm s} 10170 PRINT" ce1{sh asterisk*4}{cm x}{space*4}{sh -} {sh -}{space*4}{cm q}{sh asterisk*2}to cia #1 10180 PRINT"{space*10}a9{sh asterisk}{sh +}{sh asterisk}{cm w}{space*4}{cm q}{sh asterisk*2}to cia #2 10190 PRINT"{space*10}a8{sh asterisk}{sh +}{sh asterisk}{cm w}{reverse on}2to4{reverse off}{cm q}{sh asterisk*2}{cm s} 10200 PRINT"{space*13}{sh -} {sh -}{space*4}{cm q}{sh asterisk}{cm s}{sh -} 10210 PRINT"{space*13}{sh -} {cm z}{sh asterisk}{cm r}{sh asterisk*2}{cm x} {sh -*2} 10220 PRINT"{space*10}{F*3}{sh -}{space*3}^{space*4}{sh -*2} 10230 PRINT"{space*10}ce2{cm z}{sh asterisk*3}{cm x}{space*4}{sh -*2} 10240 PRINT"{space*15}{reverse on}{cm e*10}" 10250 PRINT"{space*15}{reverse on}cartridge" 10260 PRINT"{space*15}{reverse on}{space*3}port{space*2}" 10270 GOSUB50000:ms$="{reverse on}$d{x*3}=ce1":GOSUB63200:GOSUB50000 10280 ps$="{right*26}":PRINT"{home}{down*2}"ps$" note{down}{left*4}{cm u*4}" 10290 PRINTps$"Qoverbar on":PRINTps$" ce1 & ce2":PRINTps$" means:" 10300 PRINTps$" {reverse on}enable{reverse off}={reverse on}0":GOSUB50000 10301 PRINT"{home}{down*2}"ps$"Qnote that" 10302 PRINTps$"the $d{x*3}":PRINTps$"memory range" 10303 PRINTps$"gets split":PRINTps$"into 4 {reverse on}1k{reverse off}" 10304 PRINTps$"chunks{.*4}":PRINTps$"with the" 10305 PRINTps$"last split":PRINTps$"again into" 10306 PRINTps$"4 chunks!":GOSUB50000 10307 dn$="{home}{down*23}":PRINTdn$"Qthe last 4 chunks?":GOSUB50000 10308 PRINTdn$"Q2 for 'inside' i/0.." 10309 PRINT"{home}{down*12}{right*26}{reverse on}cia #1{down}{left*6}cia #2" 10310 GOSUB50000:PRINTdn$"Q2 for 'outside' i/0! {up*5}{reverse on}{sh -*2}":GOSUB50000 10315 PRINT"{home}{down*2}"ps$"{reverse on} where does " 10320 PRINTps$"{reverse on}ce1 really{space*2}":PRINTps$"{reverse on}come from?{space*2}" 10330 FORi=1TO7:PRINTps$"{space*10}":NEXT:GOSUB50000 10340 ms$="{reverse on}patience!":GOSUB63300 11000 GOSUB63100:REM micros-11 11001 sn$="11{0*3}" 11010 t$="more chips":GOSUB63000 11020 x=0:GOSUB11500 11030 a$="{home}{down*8}{right*5}UI UI{down}{left*4}Q Q{down}{left*2}{cm e}{down}{left*2}M{cm @}N" 11040 b$="{home}{down*8}{right*5}{space*5}{down}{left*4}{space*3}{down}{left*2} {down}{left*2}{space*3}" 11050 l=LEN(a$):FORi=1TOl:PRINTMID$(a$,i,1);:NEXT:FORt=1TO50:NEXT 11060 FORi=1TOl:PRINTMID$(b$,i,1);:NEXT:a$="input":b$="output" 11070 GOSUB63000:x=25:GOSUB11500:PRINT"{home}{down*4}Qin general a chip has" 11080 PRINT"{down} several inputs and" 11090 PRINT"{down} several outputs." 11100 PRINT"{down}Qwhat comes out " 11110 PRINT"{down} depends upon what" 11120 PRINT"{down} what goes in!":GOSUB50000:PRINT"{clear}{down*3}" 11130 PRINT"Qfor a{space*2}{reverse on}rom{reverse off}{space*2}memory chip the {reverse on}inputs" 11140 PRINT"{down} are the bits from the address bus" 11150 PRINT"{down} which tell the chip which internal" 11160 PRINT"{down} memory{space*2}locations{space*2}are supposed to" 11170 PRINT"{down} give up their data to the {reverse on}outputs" 11180 PRINT"{down} {.*3}namely the data bus.":GOSUB50000 11190 PRINT"{down}Qand the {reverse on}chip enable{reverse off} is also an input" 11200 PRINT"{down} telling the chip : {reverse on}keep off the{space*2}bus{reverse off}" 11210 PRINT"{down} (unless, of course, chip enable = {reverse on}0{reverse off})":GOSUB50000 11220 PRINT"{clear}{down*2}Qif we want to provide several {reverse on}enables{reverse off}" 11230 PRINT"{down} for lots of chips,and which chips get" 11240 PRINT"{down} {reverse on}enabled{reverse off}{space*2}is{space*2}to{space*2}depend{space*2}upon{space*2}such" 11250 PRINT"{down} things{space*2}as{space*2}the{space*2}{reverse on}address{space*2}bus{reverse off}{space*2}bits," 11260 PRINT"{down} 3 bits in {reverse on}memory location 1{reverse off}(remember?)" 11270 PRINT"{down} and whether we are {reverse on}reading{reverse off} or {reverse on}writing{reverse off}" 11280 PRINT"{down} (as in write{down}{left*5}{cm u*5}{up} to {reverse on}ram{reverse off} & read{down}{left*4}{cm u*4}{up} from {reverse on}rom{reverse off}) 11290 PRINT"{down} then we need a chip which has as inputs" 11300 PRINT"{down} {reverse on}address bus bits,3 bits from loc'n 1," 11310 PRINT"{down} {reverse on}the read/write line, etc. etc.{space*7}" 11340 PRINT"{down} and has as outputs the various {reverse on}enables":GOSUB50000 11350 PRINT"{clear}{down}{space*6}{cm a}{sh asterisk*4}{cm s}":FORi=1TO10:PRINT"{space*5}{sh asterisk}{cm w}{space*4}{cm q}{sh asterisk}":NEXT 11360 PRINT"{space*3}{sh space}{space*2}{cm z}{sh asterisk*4}{cm x}":r$="{sh asterisk*2}":s$="{sh asterisk}" 11370 PRINT"{home}{down*2}{reverse on}a15{reverse off}"r$:PRINT"{reverse on}a14{reverse off}"r$:PRINT"{reverse on}a13{reverse off}"r$:PRINT"{reverse on}a12{reverse off}"r$ 11380 PRINT"r/w"r$:PRINT"{reverse on}bit0{reverse off}"s$:PRINT"{reverse on}bit1{reverse off}"s$:PRINT"{reverse on}bit2{reverse off}"s$ 11390 PRINT"{space*2}{cm a}{sh asterisk*3}{right*6}{sh asterisk*4}{cm s}" 11400 PRINT"{space*2}{sh -} {cm a}{sh asterisk}{right*6}{sh asterisk*2}{cm s} {sh -}" 11410 PRINT"{home}{down*6}{right*11}{sh -} {down}{left*2}{sh -} {down}{left*2}{sh -} {down}{left*2}{sh -} ":PRINT"{home}{down}" 11420 PRINTTAB(13)"to basic roms($a{0*3}-$b{f*3})":GOSUB50000 11430 PRINTTAB(13)"to char rom{space*2}($d{0*3}-$d{f*3})":GOSUB50000 11440 PRINTTAB(13)"to kernal rom($e{0*3}-${f*4})":GOSUB50000 11450 PRINTTAB(13)"to input/output enable=ce1{reverse on}!{reverse off}":GOSUB50000 11460 ms$="see {reverse on}ce1{reverse off}!":GOSUB63200:GOSUB50000 11470 PRINT"{home}{down*13} {reverse on}exrom{up}{left*4}^":ms$="{reverse on}{space*3}who?{space*2}":GOSUB63200:GOSUB50000 11475 PRINT"{home}{down*13}{space*3}{reverse on}game{up}{left*3}^":ms$="{reverse on}{space*3}what! ":GOSUB63200:GOSUB50000 11480 PRINT"{home}{down*13}{space*13}{reverse on}romh{up}{left*3}v":ms$="{reverse on}{space*3}{?*5} ":GOSUB63200 11485 GOSUB50000 11490 PRINT"{home}{down*13}{space*15}{reverse on}roml{up}{left*3}v":ms$="{reverse on}{space*10}" 11495 GOSUB63200:GOSUB50000:PRINT"{clear}{down*3}Qbut that's{down}{left*6}{cm u*6}{up} another story" 11496 ms$="au revoir!":GOSUB63200 11499 sn$="{0*3}10":GOSUB63520:END 11500 PRINT"{home}{down*3}":PRINTSPC(x)"{space*4}{cm a}{sh asterisk*5}{cm s}":FORi=1TO10:PRINTSPC(x)"{space*3}{sh asterisk}{cm w}{space*5}{cm q}{sh asterisk}" 11510 NEXT:PRINTSPC(x)"{space*4}{cm z}{sh asterisk*5}{cm x}":PRINT"{home}{down*6}" 11520 l=LEN(a$):FORi=1TOl:PRINTSPC(x+5)MID$(a$,i,1):NEXT 11530 PRINT"{home}{down*6}":l=LEN(b$):FORi=1TOl:PRINTSPC(x+9)MID$(b$,i,1):NEXT:RETURN 14999 PRINT"{home}":GOTO14999 15000 GOSUB63100:ms$="au revoir!":GOSUB63200:sn$="{0*3}10":GOSUB63520 50000 GETa$:IFa$<>""THEN50000 50001 GETa$:IFa$=""THEN50001 50002 IFa$="@"THEN63500 50003 RETURN 51000 n=3 51001 x$="":FORu=nTO0STEP-1:x%=x/(2^u):x=x-x%*(2^u):x$=x$+CHR$(48+x%) 51002 NEXT:RETURN 52000 m=3 52001 y$="":FORv=mTO0STEP-1:y%=y/(16^v):y=y-y%*(16^v) 52002 y$=y$+CHR$(48+y%-7*(y%>9)):NEXT:RETURN 63000 PRINT"{clear}"; 63001 l=LEN(t$):uu$="":FORi=1TOl:uu$=uu$+" ":NEXT:tt$=uu$+t$ 63002 PRINT" {cm a}";:FORi=1TOl:PRINT"{sh asterisk}";:NEXT:PRINT"{cm s}" 63003 PRINT" {sh -}";:FORi=1TOl:PRINT" ";:NEXT:PRINT"{reverse off}{sh -}" 63004 PRINT" {cm z}";:FORi=1TOl:PRINT"{sh asterisk}";:NEXT:PRINT"{cm x}":PRINT"{up*2}{right*2}{reverse on}{red}"; 63005 FORi=1TOl:PRINTMID$(tt$,i+1,l):PRINT"{up}{right*2}{reverse on}";:FORt=1TO50:NEXT 63006 NEXT:PRINT"{black}":RETURN 63100 bt$="{home}{down*24}" 63101 pt$="{red}{cm a}{sh asterisk*10}{cm s}{down}{left*12}{sh -}{right*10}{sh -}{down}{left*12}{cm z}{cm r}{sh asterisk*8}{cm r}{cm x}" 63102 pt$=pt$+"{down}{left*13}N{cm t*12}M{down}{left*14}{cm g}{=*12}{cm m}" 63103 pt$=pt$+"{down}{left*14}PO{cm t*10}PO{up*4}{left*12}" 63104 pt$=bt$+"{up*6}{right*26}"+pt$+"{black}" 63105 sn=1030:IFPEEK(0)=47THENsn=2054 63199 RETURN 63200 FORi=1TO2:PRINTpt$"{space*10}" 63201 FORt=1TO50:NEXT 63202 PRINTpt$ms$ 63203 FORt=1TO50:NEXT:NEXT:RETURN 63300 GOSUB63200:FORt=1TO1000:NEXT:RETURN 63500 vs=VAL(sn$):vs=vs-1000:IFvs<1000THENvs=100 63510 sn$=MID$(STR$(vs),2):sn$=RIGHT$("{0*5}"+sn$,5):GOSUB63520:RUN 63520 FORi=1TO5:POKEsn+i-1,ASC(MID$(sn$,i,1)):NEXT:RETURN stop tok64 (bastext 1.0)