{ "cells": [ { "cell_type": "raw", "metadata": {}, "source": [ "---\n", "title: \"Notebook 2: Machine Architecture & Data Representation\"\n", "subtitle: \"COMP 1150 โ€” Computer Science Concepts\"\n", "author: \"Brendan Shea, PhD\"\n", "date: last-modified\n", "---" ] }, { "cell_type": "markdown", "metadata": { "colab_header": true, "id": "juJiKC-ptAFl" }, "source": [ "\n", "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/brendanpshea/computing_concepts_python/blob/main/v2/notebooks/COMP1150_NB02_MachineArchitecture.ipynb) \n", "[Download .ipynb](https://raw.githubusercontent.com/brendanpshea/computing_concepts_python/main/v2/notebooks/COMP1150_NB02_MachineArchitecture.ipynb) ยท [View on GitHub](https://github.com/brendanpshea/computing_concepts_python/blob/main/v2/notebooks/COMP1150_NB02_MachineArchitecture.ipynb)\n" ], "id": "juJiKC-ptAFl" }, { "cell_type": "markdown", "id": "nb2-02-video", "metadata": { "id": "nb2-02-video" }, "source": [ "๐Ÿ“บ **Lecture video:** *(link coming soon)*" ] }, { "cell_type": "markdown", "id": "nb2-03-outcomes", "metadata": { "id": "nb2-03-outcomes" }, "source": [ "## Learning Outcomes\n", "\n", "By the end of this notebook, you will be able to:\n", "\n", "- **Explain** how a transistor becomes a logic gate, and how logic gates combine to do arithmetic\n", "- **Describe** the von Neumann architecture, including the control unit, ALU, registers, and the fetchโ€“decodeโ€“execute cycle\n", "- **Explain** the memory hierarchy and why caching exists\n", "- **Convert** numbers between binary, decimal, and hexadecimal by hand\n", "- **Represent** negative numbers using two's complement, and decode a two's-complement byte\n", "- **Explain** how text, images, and sound are all stored as numbers\n", "- **Identify** how a representation choice (like a fixed-size integer) can cause real bugs\n", "\n", "*Maps to course LOs: 1 (machine architecture, data representation, processorโ€“memory interaction) and 2 (data storage, number systems, binary)*" ] }, { "cell_type": "markdown", "id": "nb2-04-hook", "metadata": { "id": "nb2-04-hook" }, "source": [ "## A Memory Budget Crisis\n", "\n", "Welcome to **Eight Bits & Bob**, a small game studio shipping its next title onto the **PixelBox 8** โ€” an 8-bit console that, per the box, comes \"with up to four colours, two of which are brown.\"\n", "\n", "The game is *Quest for the Reasonably Priced Sword*. The studio director, **Vesper Crunch** โ€” who measures everything in bytes, including lunch โ€” has just delivered the bad news: the entire game must fit in a memory budget smaller than a single modern photo. Every character, every sound, every number on screen has to be squeezed into 0s and 1s, efficiently.\n", "\n", "That constraint is a gift. It forces us to answer a question most programmers never think about: **when everything is just 0s and 1s, how do you store *anything*?** A score? A minus sign? A dragon? A trumpet? And once it's stored, **how does the machine actually compute with it?**\n", "\n", "This notebook answers both, from the transistor up." ] }, { "cell_type": "markdown", "id": "nb2-05-roadmap", "metadata": { "id": "nb2-05-roadmap" }, "source": [ "## The Roadmap\n", "\n", "We'll build understanding bottom-up โ€” the same direction a computer is physically built:\n", "\n", "| Part | Question it answers |\n", "|---|---|\n", "| Transistors โ†’ gates โ†’ arithmetic | How does a chip *do* anything? |\n", "| Inside the machine | How are the CPU, memory, and I/O actually wired and used? |\n", "| The memory hierarchy | Why are there so many *kinds* of memory? |\n", "| Consoles as a fossil record | How has all of this changed over 45 years? |\n", "| Binary & hexadecimal | How do we write numbers with only 0s and 1s? |\n", "| Two's complement | How do we store *negative* numbers? |\n", "| Text, images, sound | How is everything else stored as numbers? |\n", "| When representation breaks | Why does this matter for real bugs? |\n", "\n", "Several parts end with a hands-on activity โ€” including **practice games built into this notebook** that you can replay before a quiz." ] }, { "cell_type": "markdown", "id": "nb2-06-callback", "metadata": { "id": "nb2-06-callback" }, "source": [ "Notebook 1 closed with a promise: *we'd see how a transistor becomes a logic gate, a logic gate becomes an adder, and an adder becomes a computer.* Let's pay it off." ] }, { "cell_type": "markdown", "id": "nb2-07-transistor", "metadata": { "id": "nb2-07-transistor" }, "source": [ "## From Transistor to Arithmetic\n", "\n", "**Dot Mainframe**, the studio's hardware engineer โ€” who named her cat \"Cache\" โ€” starts at the bottom.\n", "\n", "A **transistor** is a tiny electrical switch with no moving parts. It has two states: current flows (call it **1**) or it doesn't (call it **0**). That's it. That's the whole physical foundation of computing. A modern chip has *billions* of these switches; the PixelBox 8 has a few thousand.\n", "\n", "One switch isn't interesting. The magic starts when you wire a few together so their combined behavior follows a *rule*. A small bundle of transistors wired to follow one logical rule is called a **logic gate**." ] }, { "cell_type": "code", "execution_count": 1, "id": "nb2-08-gates-graphviz", "metadata": { "cellView": "form", "jupyter": { "source_hidden": true }, "id": "nb2-08-gates-graphviz", "outputId": "00e19578-a0d7-48a8-a3b3-282c08e02485", "colab": { "base_uri": "https://localhost:8080/", "height": 536 } }, "outputs": [ { "output_type": "execute_result", "data": { "image/svg+xml": "\n\n\n\n\n\n%3\n\n\n\nAND_A\n\nA\n\n\n\nAND_G\n\nAND\ngate\n\n\n\nAND_A->AND_G\n\n\n\n\n\nAND_B\n\nB\n\n\n\nAND_B->AND_G\n\n\n\n\n\nAND_Y\n\noutput\n\n\n\nAND_G->AND_Y\n\n\n\n\n\nOR_A\n\nA\n\n\n\nOR_G\n\nOR\ngate\n\n\n\nOR_A->OR_G\n\n\n\n\n\nOR_B\n\nB\n\n\n\nOR_B->OR_G\n\n\n\n\n\nOR_Y\n\noutput\n\n\n\nOR_G->OR_Y\n\n\n\n\n\nXOR_A\n\nA\n\n\n\nXOR_G\n\nXOR\ngate\n\n\n\nXOR_A->XOR_G\n\n\n\n\n\nXOR_B\n\nB\n\n\n\nXOR_B->XOR_G\n\n\n\n\n\nXOR_Y\n\noutput\n\n\n\nXOR_G->XOR_Y\n\n\n\n\n\nNOT_A\n\nA\n\n\n\nNOT_G\n\nNOT\ngate\n\n\n\nNOT_A->NOT_G\n\n\n\n\n\nNOT_Y\n\noutput\n\n\n\nNOT_G->NOT_Y\n\n\n\n\n\n", "text/plain": [ "" ] }, "metadata": {}, "execution_count": 1 } ], "source": [ "#| echo: false\n", "#@title ๐Ÿ“Š Logic gates diagram (click to show code)\n", "# The four gates you must know. Each takes inputs (0 or 1) and produces one output.\n", "from graphviz import Digraph\n", "\n", "g = Digraph(graph_attr={\"rankdir\": \"LR\"})\n", "g.attr(\"node\", shape=\"box\", style=\"rounded,filled\", fillcolor=\"lightyellow\")\n", "\n", "for name in [\"AND\", \"OR\", \"XOR\"]:\n", " g.node(f\"{name}_A\", \"A\", shape=\"circle\", fillcolor=\"lightgreen\")\n", " g.node(f\"{name}_B\", \"B\", shape=\"circle\", fillcolor=\"lightgreen\")\n", " g.node(f\"{name}_G\", f\"{name}\\ngate\")\n", " g.node(f\"{name}_Y\", \"output\", shape=\"circle\", fillcolor=\"lightcoral\")\n", " g.edge(f\"{name}_A\", f\"{name}_G\")\n", " g.edge(f\"{name}_B\", f\"{name}_G\")\n", " g.edge(f\"{name}_G\", f\"{name}_Y\")\n", "\n", "g.node(\"NOT_A\", \"A\", shape=\"circle\", fillcolor=\"lightgreen\")\n", "g.node(\"NOT_G\", \"NOT\\ngate\")\n", "g.node(\"NOT_Y\", \"output\", shape=\"circle\", fillcolor=\"lightcoral\")\n", "g.edge(\"NOT_A\", \"NOT_G\")\n", "g.edge(\"NOT_G\", \"NOT_Y\")\n", "\n", "g" ] }, { "cell_type": "markdown", "id": "nb2-cap-gates", "metadata": { "id": "nb2-cap-gates" }, "source": [ "**Reading it:** each gate takes inputs **A** and **B** (NOT takes just **A**) and produces one output. *What* each one outputs is defined by its truth table โ€” next." ] }, { "cell_type": "markdown", "id": "nb2-09-truthtables", "metadata": { "id": "nb2-09-truthtables" }, "source": [ "### How Each Gate Behaves\n", "\n", "A gate's rule is captured in a **truth table** โ€” every possible input, and the output it produces. There are no surprises and no choices: same inputs, same output, every time.\n", "\n", "**AND** โ€” output 1 only if *both* inputs are 1:\n", "\n", "| A | B | A AND B |\n", "|---|---|---|\n", "| 0 | 0 | 0 |\n", "| 0 | 1 | 0 |\n", "| 1 | 0 | 0 |\n", "| 1 | 1 | **1** |\n", "\n", "**OR** โ€” output 1 if *either* input is 1.    **XOR** (\"exclusive or\") โ€” output 1 if the inputs are *different*.    **NOT** โ€” one input, flipped.\n", "\n", "| A | B | A OR B | A XOR B |  | A | NOT A |\n", "|---|---|---|---|---|---|---|\n", "| 0 | 0 | 0 | 0 |  | 0 | 1 |\n", "| 0 | 1 | 1 | 1 |  | 1 | 0 |\n", "| 1 | 0 | 1 | 1 |  | | |\n", "| 1 | 1 | 1 | 0 |  | | |\n", "\n", "Memorize these four. Every calculation a computer has ever done is built from them." ] }, { "cell_type": "markdown", "id": "nb2-10-halfadder", "metadata": { "id": "nb2-10-halfadder" }, "source": [ "### From Gates to Addition\n", "\n", "**Junior Dev Tobble** โ€” who has never seen a number bigger than 255 and would like to keep it that way โ€” asks the obvious question: *how does a pile of gates actually add 1 + 1?*\n", "\n", "Look at the XOR and AND results for the inputs `1` and `1`:\n", "\n", "- `1 XOR 1 = 0` โ†’ that's the **sum digit** (1 + 1 in binary is `10`, so the digit you write down is 0)\n", "- `1 AND 1 = 1` โ†’ that's the **carry digit** (the 1 you carry into the next column)\n", "\n", "So an XOR gate and an AND gate, side by side, *add two bits*: XOR gives the result digit, AND gives the carry. This pairing is called a **half-adder**. You don't need to build one โ€” just hold onto the idea: **arithmetic is just gates wired cleverly.**" ] }, { "cell_type": "code", "execution_count": 2, "id": "nb2-11-halfadder-graphviz", "metadata": { "cellView": "form", "jupyter": { "source_hidden": true }, "id": "nb2-11-halfadder-graphviz", "outputId": "b510d715-1800-41ed-f008-127460bfa3cf", "colab": { "base_uri": "https://localhost:8080/", "height": 344 } }, "outputs": [ { "output_type": "execute_result", "data": { "image/svg+xml": "\n\n\n\n\n\n%3\n\n\n\nA\n\nbit A\n\n\n\nX\n\nXOR\n\n\n\nA->X\n\n\n\n\n\nN\n\nAND\n\n\n\nA->N\n\n\n\n\n\nB\n\nbit B\n\n\n\nB->X\n\n\n\n\n\nB->N\n\n\n\n\n\nS\n\nSUM digit\n\n\n\nX->S\n\n\n\n\n\nC\n\nCARRY digit\n\n\n\nN->C\n\n\n\n\n\n", "text/plain": [ "" ] }, "metadata": {}, "execution_count": 2 } ], "source": [ "#| echo: false\n", "#@title ๐Ÿ“Š Half-adder diagram (click to show code)\n", "# Conceptual view of a half-adder: the same two input bits feed two gates.\n", "ha = Digraph(graph_attr={\"rankdir\": \"LR\"})\n", "ha.attr(\"node\", shape=\"box\", style=\"rounded,filled\", fillcolor=\"lightyellow\")\n", "\n", "ha.node(\"A\", \"bit A\", shape=\"circle\", fillcolor=\"lightgreen\")\n", "ha.node(\"B\", \"bit B\", shape=\"circle\", fillcolor=\"lightgreen\")\n", "ha.node(\"X\", \"XOR\")\n", "ha.node(\"N\", \"AND\")\n", "ha.node(\"S\", \"SUM digit\", shape=\"circle\", fillcolor=\"lightcoral\")\n", "ha.node(\"C\", \"CARRY digit\", shape=\"circle\", fillcolor=\"lightcoral\")\n", "\n", "ha.edge(\"A\", \"X\"); ha.edge(\"B\", \"X\"); ha.edge(\"X\", \"S\")\n", "ha.edge(\"A\", \"N\"); ha.edge(\"B\", \"N\"); ha.edge(\"N\", \"C\")\n", "\n", "ha" ] }, { "cell_type": "markdown", "id": "nb2-12-alu-closer", "metadata": { "id": "nb2-12-alu-closer" }, "source": [ "Chain eight half-adders together (passing each carry into the next column) and you can add two 8-bit numbers. That chain is the core of the **ALU** โ€” the **Arithmetic Logic Unit**, the part of the chip that does math and comparisons. Add some gates that select *which* operation to run, and you have, essentially, a processor's calculator.\n", "\n", "That's the whole bottom of the stack: **transistor โ†’ gate โ†’ half-adder โ†’ ALU.** Next we'll see where the ALU sits inside a complete machine." ] }, { "cell_type": "markdown", "id": "nb2-13-gatearcade-setup", "metadata": { "id": "nb2-13-gatearcade-setup" }, "source": [ "Before we go up a level, here's a practice game for the gates. You don't need to read its code โ€” that comes in Notebook 4. Just **run it and drill** until the answers come fast.\n" ] }, { "cell_type": "code", "metadata": { "cellView": "form", "id": "wQ9IMWC-tAF2" }, "execution_count": 3, "outputs": [], "source": [ "#| echo: false\n", "#@title ๐ŸŽฎ Gate Arcade โ€” game code (run this cell, then the one below)\n", "import random\n", "\n", "def gate_arcade(rounds=8):\n", " \"\"\"Drill the logic gates: AND, OR, XOR, NOT, NAND. Type 0 or 1.\"\"\"\n", " one_input = {\"NOT\": lambda a: 1 - a}\n", " two_input = {\n", " \"AND\": lambda a, b: a & b,\n", " \"OR\": lambda a, b: a | b,\n", " \"XOR\": lambda a, b: a ^ b,\n", " \"NAND\": lambda a, b: 1 - (a & b),\n", " }\n", " score = 0\n", " for r in range(1, rounds + 1):\n", " if random.random() < 0.25:\n", " a = random.randint(0, 1)\n", " correct = one_input[\"NOT\"](a)\n", " guess = input(f\"Round {r}: NOT {a} = ? \").strip()\n", " else:\n", " name = random.choice(list(two_input))\n", " a, b = random.randint(0, 1), random.randint(0, 1)\n", " correct = two_input[name](a, b)\n", " guess = input(f\"Round {r}: {a} {name} {b} = ? \").strip()\n", " if guess == str(correct):\n", " print(\"โœ… Correct!\"); score += 1\n", " else:\n", " print(f\"โŒ Not quite โ€” the answer was {correct}\")\n", " print(f\"\\nFinal score: {score}/{rounds}\")\n" ], "id": "wQ9IMWC-tAF2" }, { "cell_type": "markdown", "metadata": { "id": "EP5fLPwctAF3" }, "source": [ "**๐ŸŽฎ This is a practice tool โ€” not code to study.** The hidden cell above defines the game; the cell below runs it. You're not expected to understand *how* it's built yet โ€” functions arrive in Notebook 4. For now, just play: drill the gates until the answers come automatically.\n" ], "id": "EP5fLPwctAF3" }, { "cell_type": "code", "metadata": { "id": "A4vzd_2ytAF3" }, "execution_count": 4, "outputs": [], "source": [ "# โ–ถ TO PLAY: delete the # on the next line, then run this cell.\n", "# Drill AND, OR, XOR, NOT, and NAND. Replay as often as you like.\n", "# gate_arcade()\n" ], "id": "A4vzd_2ytAF3" }, { "cell_type": "markdown", "metadata": { "id": "RStZ3BwztAF4" }, "source": [ "### ๐Ÿ’ญ Think About It โ€” Why So Few Gates?\n", "\n", "Every gate you just drilled โ€” even AND, OR, and XOR โ€” can be built out of nothing but **NAND** gates wired together. For that reason NAND is called a *universal* gate.\n", "\n", "- In your own words, why might a chip designer prefer to manufacture **one** kind of gate, over and over, rather than five different kinds? Think about cost, testing, and what could go wrong on a production line.\n", "- A single gate is just a tiny decision: *given these inputs, what comes out?* Describe something from everyday life that turns two yes/no conditions into one yes/no answer (for example: \"the door unlocks only if I have the key **AND** the alarm is off\"). Which gate does your example behave like?\n", "- A computer does breathtakingly complex things, yet at the bottom it is millions of these one-bit decisions. Does that change how you think about what a computer \"understands\"? Why or why not?\n", "\n", "Share a sentence or two on each.\n" ], "id": "RStZ3BwztAF4" }, { "cell_type": "markdown", "id": "nb2-17-vn-intro", "metadata": { "id": "nb2-17-vn-intro" }, "source": [ "## Inside the Machine: How a Computer Actually Works\n", "\n", "We have an ALU that can do math. But where do the numbers *live*, what tells the ALU *which* math to do, and how do instructions reach the chip at all?\n", "\n", "**Cmdr. Marlow Stack**, the lead engineer โ€” who refers to RAM as \"the good china\" โ€” explains the layout almost every computer since 1945 has used: the **von Neumann architecture**. The quick analogy is a kitchen:\n", "\n", "- **CPU** = the cook โ€” does the actual work, very fast, holds only a few things at once\n", "- **Memory (RAM)** = the counter space โ€” what you're working on *right now*; cleared when power is lost\n", "- **Storage** (the cartridge) = the pantry โ€” big, slow, keeps its contents unplugged\n", "- **Input/Output** = the serving window โ€” controller in, picture and sound out\n", "\n", "The crucial von Neumann idea: **the program and its data live in the *same* memory.** An instruction is just a number too. Now let's open up the cook." ] }, { "cell_type": "markdown", "id": "nb2-18-inside-cpu", "metadata": { "id": "nb2-18-inside-cpu" }, "source": [ "### Inside the CPU\n", "\n", "A CPU is not one thing โ€” it's a few cooperating parts:\n", "\n", "- **Control Unit (CU)** โ€” the traffic cop. It reads each instruction and tells every other part what to do and when. It makes no decisions of its own; it just follows the instruction.\n", "- **ALU** โ€” the calculator from the previous section. It only acts when the Control Unit hands it operands and an operation.\n", "- **Registers** โ€” a handful of ultra-fast storage slots *inside* the CPU. The named ones you should know:\n", " - **Program Counter (PC)** โ€” holds the memory address of the *next* instruction. \"Where am I in the program?\"\n", " - **Instruction Register (IR)** โ€” holds the instruction currently being carried out. \"What am I doing right now?\"\n", " - **Accumulator / general registers** โ€” scratch space for the numbers being worked on.\n", "\n", "When the CPU needs something from memory, it puts the address on the **address bus** and the data travels back on the **data bus** โ€” think of buses as the hallways between the cook and the counter." ] }, { "cell_type": "code", "execution_count": 5, "id": "nb2-19-vn-graphviz", "metadata": { "cellView": "form", "jupyter": { "source_hidden": true }, "id": "nb2-19-vn-graphviz", "outputId": "998abbb6-5c10-45ce-b70b-0d4700f8669e", "colab": { "base_uri": "https://localhost:8080/", "height": 281 } }, "outputs": [ { "output_type": "execute_result", "data": { "image/svg+xml": "\n\n\n\n\n\n%3\n\n\ncluster_cpu\n\nCPU\n\n\n\nCU\n\nControl Unit\n\n\n\nALU\n\nALU\n\n\n\nCU->ALU\n\n\n\n\n\nREG\n\nRegisters\n(PC, IR, accumulator)\n\n\n\nCU->REG\n\n\n\n\n\nMEM\n\nMemory (RAM)\nprogram + data\n\n\n\nCU->MEM\n\n\n\n address bus \n\n\n\nALU->REG\n\n\n\n\n\nREG->MEM\n\n\n\n data bus \n\n\n\nIO\n\nInput / Output\n\n\n\nIO->MEM\n\n\n\n\n\n\n", "text/plain": [ "" ] }, "metadata": {}, "execution_count": 5 } ], "source": [ "#| echo: false\n", "#@title ๐Ÿ“Š Von Neumann machine diagram (click to show code)\n", "# The von Neumann machine with the CPU opened up.\n", "vn = Digraph(graph_attr={\"rankdir\": \"LR\"})\n", "vn.attr(\"node\", shape=\"box\", style=\"rounded,filled\", fillcolor=\"lightyellow\")\n", "\n", "with vn.subgraph(name=\"cluster_cpu\") as c:\n", " c.attr(label=\"CPU\", style=\"filled\", fillcolor=\"oldlace\")\n", " c.node(\"CU\", \"Control Unit\")\n", " c.node(\"ALU\", \"ALU\")\n", " c.node(\"REG\", \"Registers\\n(PC, IR, accumulator)\")\n", " c.edge(\"CU\", \"ALU\"); c.edge(\"CU\", \"REG\"); c.edge(\"ALU\", \"REG\")\n", "\n", "vn.node(\"MEM\", \"Memory (RAM)\\nprogram + data\")\n", "vn.node(\"IO\", \"Input / Output\", fillcolor=\"lightgreen\")\n", "\n", "vn.edge(\"CU\", \"MEM\", label=\" address bus \", dir=\"both\")\n", "vn.edge(\"REG\", \"MEM\", label=\" data bus \", dir=\"both\")\n", "vn.edge(\"IO\", \"MEM\", dir=\"both\")\n", "vn" ] }, { "cell_type": "markdown", "id": "nb2-cap-vn", "metadata": { "id": "nb2-cap-vn" }, "source": [ "**Reading it:** the shaded box is the CPU. The Control Unit directs the ALU and registers; the **address bus** carries *where* in memory, the **data bus** carries *what*. Everything outside the box is reached only through those buses." ] }, { "cell_type": "markdown", "id": "nb2-20-trace", "metadata": { "id": "nb2-20-trace" }, "source": [ "### Watching One Instruction Run\n", "\n", "Suppose memory holds this tiny program. Each line is an instruction stored as a number:\n", "\n", "| Address | Instruction | Meaning |\n", "|---|---|---|\n", "| 0 | `LOAD 5` | put 5 into the accumulator |\n", "| 1 | `ADD 3` | add 3 to the accumulator |\n", "| 2 | `STORE 9` | copy the accumulator into memory address 9 |\n", "\n", "Here is exactly what the CPU does to run the `ADD 3` instruction (the one at address 1), step by step:\n", "\n", "| Stage | What happens | Which part |\n", "|---|---|---|\n", "| **Fetch** | PC says 1 โ†’ read memory[1] โ†’ `ADD 3` lands in the IR | Control Unit, PC, IR |\n", "| **Decode** | CU inspects the IR: \"this is ADD, operand 3\" | Control Unit |\n", "| **Execute** | CU routes accumulator (5) and 3 into the ALU; ALU outputs 8; 8 goes back to the accumulator | ALU, registers |\n", "| **Advance** | PC = 1 + 1 = 2, ready for the next instruction | Program Counter |\n", "\n", "Every part did exactly one small job. Nothing \"understood\" addition โ€” the gates from the previous section just produced 8. That is the entire trick of computing." ] }, { "cell_type": "code", "execution_count": 6, "id": "nb2-21-fde-graphviz", "metadata": { "cellView": "form", "jupyter": { "source_hidden": true }, "id": "nb2-21-fde-graphviz", "outputId": "a912c638-b27b-4ea7-d623-361ffb59d7c7", "colab": { "base_uri": "https://localhost:8080/", "height": 401 } }, "outputs": [ { "output_type": "execute_result", "data": { "image/svg+xml": "\n\n\n\n\n\n%3\n\n\n\nF\n\nFETCH\nread instruction at PC\n\n\n\nD\n\nDECODE\nControl Unit reads the IR\n\n\n\nF->D\n\n\n\n\n\nE\n\nEXECUTE\nALU / registers do the work\n\n\n\nD->E\n\n\n\n\n\nS\n\nADVANCE PC\nto the next instruction\n\n\n\nE->S\n\n\n\n\n\nS->F\n\n\n repeat \n\n\n\n", "text/plain": [ "" ] }, "metadata": {}, "execution_count": 6 } ], "source": [ "#| echo: false\n", "#@title ๐Ÿ“Š Fetch-decode-execute loop (click to show code)\n", "# The same four stages, drawn as the endless loop the CPU actually runs.\n", "fde = Digraph(graph_attr={\"rankdir\": \"TB\"})\n", "fde.attr(\"node\", shape=\"box\", style=\"rounded,filled\", fillcolor=\"lightyellow\")\n", "\n", "fde.node(\"F\", \"FETCH\\nread instruction at PC\", fillcolor=\"lightgreen\")\n", "fde.node(\"D\", \"DECODE\\nControl Unit reads the IR\")\n", "fde.node(\"E\", \"EXECUTE\\nALU / registers do the work\")\n", "fde.node(\"S\", \"ADVANCE PC\\nto the next instruction\", fillcolor=\"lightcoral\")\n", "\n", "fde.edge(\"F\", \"D\"); fde.edge(\"D\", \"E\"); fde.edge(\"E\", \"S\")\n", "fde.edge(\"S\", \"F\", label=\" repeat \")\n", "fde" ] }, { "cell_type": "markdown", "id": "nb2-22-fde-pseudo", "metadata": { "id": "nb2-22-fde-pseudo" }, "source": [ "That loop is the **fetchโ€“decodeโ€“execute cycle**, and in pseudocode it is almost insultingly simple:\n", "\n", "```text\n", "REPEAT FOREVER:\n", " 1. FETCH the instruction at the address in the Program Counter\n", " 2. DECODE it in the Control Unit (what operation? what operands?)\n", " 3. EXECUTE it using the ALU and registers\n", " 4. ADVANCE the Program Counter to the next instruction\n", "```\n", "\n", "Your phone runs this loop several **billion** times per second. The PixelBox 8 manages a little under two million. The *idea* is identical; only the speed changed โ€” the same theme that ran through Notebook 1." ] }, { "cell_type": "markdown", "id": "nb2-23-memhier", "metadata": { "id": "nb2-23-memhier" }, "source": [ "## The Memory Hierarchy\n", "\n", "Why is there RAM *and* storage *and* registers *and* something called cache? Because no single memory technology is fast, big, and cheap at the same time. So computers use **layers**: a little very-fast memory close to the CPU, backed by progressively larger, slower, cheaper memory further away.\n", "\n", "| Level | What it is | Speed | Typical size | Keeps data without power? |\n", "|---|---|---|---|---|\n", "| Registers | Slots inside the CPU | Fastest | A few dozen values | No |\n", "| L1 / L2 cache | Tiny memory beside the cores | Very fast | KBโ€“MB | No |\n", "| RAM | Main working memory | Fast | GB | No |\n", "| SSD | Flash storage | Slow-ish | Hundreds of GB | **Yes** |\n", "| Hard disk / network | Spinning platters or remote servers | Slowest | TB and up | **Yes** |\n", "\n", "The pattern is strict: **the closer to the CPU, the faster and more expensive per byte, and the smaller.** This is not a design flaw โ€” it's the only way to get both speed *and* capacity at a price anyone can afford." ] }, { "cell_type": "markdown", "id": "nb2-24-latency-analogy", "metadata": { "id": "nb2-24-latency-analogy" }, "source": [ "### How Big Are These Speed Gaps, Really?\n", "\n", "The numbers are too small to feel. So scale them up: imagine one register access takes **1 second**. Then, very roughly:\n", "\n", "| Memory | Real time | If a register were 1 secondโ€ฆ |\n", "|---|---|---|\n", "| Register / L1 cache | ~1 ns | **1 second** |\n", "| L2 cache | ~4 ns | ~4 seconds |\n", "| RAM | ~100 ns | ~1.5 **minutes** |\n", "| SSD | ~0.1 ms | ~1 **day** |\n", "| Hard disk | ~10 ms | ~4 **months** |\n", "\n", "Reaching all the way to a hard disk, in human terms, is the difference between answering a question now and answering it next spring. That gap is *why* games have loading screens, and why \"is the data already in RAM?\" is one of the most important questions in performance." ] }, { "cell_type": "code", "execution_count": 7, "id": "nb2-25-latency-chart", "metadata": { "cellView": "form", "jupyter": { "source_hidden": true }, "id": "nb2-25-latency-chart", "outputId": "5c1e6d6a-e146-4243-ef01-1df6cec13b20", "colab": { "base_uri": "https://localhost:8080/", "height": 407 } }, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "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rbW3AwMDAQC+vr5Yv349evXqhfj4eMycORMxMTFwcnLC/v37M0zoJiIiIiKigiO5sChbtiwuXboEe3t7nfaLFy+idOnSkgO0atXqg6epDQgIQEBAgOS+s8PJ20RERERE8pE8FKpPnz4YM2YMjh49CrVaDbVajSNHjmDs2LH5Nok7P3AoFBERERGRfCQfsfjqq69w7949tG3bFiVKvL27RqPBwIEDczXHoqDwiAURERERkXwUIpeXy7516xYiIyNhbGyM+vXro3LlynJn+yjSTzebmJgICwuLgo5DRERElK8iBgwo6AgkQaONGwt0+1K+K0s+YpGuRo0aqFGjBtRqNS5fvgwLCwuULFkyt90REREREVERJnmOxRdffIE1a9YAANRqNVq2bIlGjRrBzs4Ox44dkzsfEREREREVAZILi+3bt8PR0REA8L///Q93797F9evXMW7cOEybNk32gPmFF8gjIiIiIpKP5MLiyZMnKFeuHADgzz//RM+ePVGzZk0MHjwYly9flj1gfuFZoYiIiIiI5CO5sLCxsUFUVBTUajX279+Pdu3aAQBevnwJfX192QMSEREREVHhJ3nytp+fH3r27Iny5ctDoVDAw8MDAHD69GnUrl1b9oBERERERFT4SS4sZs2ahXr16uHhw4fo0aMHlEolAEBfXx+TJ0+WPWB+4XUsiIiIiIjkk+vrWPxX8DoWREREVJzwOhZFS1G6joXkORZERERERETvY2FBRERERER5xsKCiIiIiIjyrNgWFrxAHhERERGRfCSfFSopKSnTdoVCAaVSCUNDwzyH+hj8/f3h7++vnZBCRERERES5J7mwsLKygkKhyHJ5xYoVMWjQIAQFBUFPr9geECEiIiIiKlYkFxbr16/HtGnTMGjQIDRp0gQAcObMGWzYsAHTp09HfHw8Fi1aBKVSialTp8oemIiIiIiICh/JhcWGDRuwePFi9OzZU9vm4+OD+vXrY9WqVQgJCUGlSpXw9ddfs7AgIiIiIiomJI9VOnnyJBo2bJihvWHDhggPDwcAtGjRAg8ePMh7OiIiIiIiKhIkFxZ2dnZYs2ZNhvY1a9bAzs4OAPD06VOULFky7+mIiIiIiKhIkDwUatGiRejRowf27dunPVXruXPncP36dWzfvh0AcPbsWfTq1UvepEREREREVGhJLiw6deqE69evY9WqVbh58yYAwMvLC7t27YK9vT0AYOTIkbKGzA8qlQoqlQpqtbqgoxARERERFXkKIYQo6BAFKf06FomJibCwsCjoOERERET5KmLAgIKOQBI02rixQLcv5buy5CMWAPD8+XOsWbMG165dAwDUrVsXgwcP5oXmiIiIiIiKKcmTt8+dO4dq1arh22+/RUJCAhISErBkyRJUq1YNERER+ZGRiIiIiIgKOclHLMaNG4dOnTph9erVKFHi7d3fvHmDoUOH4osvvkBoaKjsIYmIiIiIqHCTXFicO3dOp6gAgBIlSmDixIlwcXGRNRwRERERERUNkgsLCwsLPHjwALVr19Zpf/jwIczNzWULJoW9vT0sLCygp6eHkiVL4ujRowWSg4iIiIiouJJcWPTq1QtDhgzBokWL0KxZMwDAiRMn8OWXX6JPnz6yB8ypkydPwszMrMC2T0RERERUnOXqAnkKhQIDBw7EmzdvAAAGBgYYOXIkvvnmG9kDEhERERFR4Sf5rFCGhob47rvv8OzZM0RGRiIyMhIJCQn49ttvoVQqJQcIDQ2Fj48PbG1toVAosGvXrgzrqFQq2Nvbw8jICK6urjhz5ozOcoVCgZYtW6Jx48bYvHmz5AxERERERJQ3kguLdCYmJqhfvz7q168PExOTXAdISUmBo6MjVCpVpsu3bt2KwMBABAUFISIiAo6OjvD09ERcXJx2nePHj+P8+fPYs2cP5s2bh0uXLuU6DxERERERSZejoVDdunXLcYc7d+6UFMDLywteXl5ZLl+yZAmGDRsGPz8/AMDKlSuxd+9erF27FpMnTwYAVKhQAQBQvnx5dOzYEREREWjQoEGm/aWmpiI1NVV7OykpSVJeIiIiIiLKKEeFRUFdUTstLQ3nz5/HlClTtG16enrw8PBAeHg4gLdHPDQaDczNzZGcnIwjR46gZ8+eWfYZHByM2bNn53t2IiKighQxYEBBRyAJGm3cWNARiPIsR4XFunXr8jtHpp48eQK1Wg0bGxuddhsbG1y/fh0AEBsbi65duwIA1Go1hg0bhsaNG2fZ55QpUxAYGKi9nZSUBDs7u3xIT0RERERUfEg+K1RhU7VqVVy8eDHH6yuVSiiVSqhUKqhUKqjV6nxMR0RERERUPOR68vbHYG1tDX19fcTGxuq0x8bGoly5cnnq29/fH1FRUTh79mye+iEiIiIiokJeWBgaGsLZ2RkhISHaNo1Gg5CQEDRt2jRPfatUKjg4OGQ7bIqIiIiIiHKmwIdCJScn4/bt29rb0dHRiIyMRKlSpVCpUiUEBgbC19cXLi4uaNKkCZYuXYqUlBTtWaJyy9/fH/7+/khKSiqwyelERERERP8VBV5YnDt3Dq1bt9beTp9Y7evri/Xr16NXr16Ij4/HzJkzERMTAycnJ+zfvz/DhG4iIiIiIio4shYWP//8M5o3b45q1arl+D6tWrWCECLbdQICAhAQEJDXeDo4eZuIiIiISD6yzrEYNGgQHBwcMHr0aDm7zRecvE1EREREJB9ZCwuNRoPr16+jTp06cnZLRERERESFnOxnhapSpQpGjRold7ey41mhiIiIiIjkI7mwiIiIwOXLl7W3d+/ejS5dumDq1KlIS0uTNVx+4lAoIiIiIiL5SC4sRowYgZs3bwIA7t69i969e8PExATbtm3DxIkTZQ9IRERERESFn+TC4ubNm3BycgIAbNu2De7u7vjll1+wfv167NixQ+58+YZDoYiIiIiI5CO5sBBCQKPRAAAOHz6Mjh07AgDs7Ozw5MkTedPlIw6FIiIiIiKSj+TCwsXFBXPnzsXGjRvx119/wdvbG8DbK2bzonVERERERMWT5MJi6dKliIiIQEBAAKZNm4bq1asDALZv345mzZrJHpCIiIiIiAo/yVfebtCggc5ZodItXLgQ+vr6soT6GHjlbSIiIiIi+ch2HQsjIyMYGBjI1V2+4xwLIiIiIiL55OiIRcmSJaFQKHLUYUJCQp4CERERERFR0ZOjwmLp0qXa/3/69Cnmzp0LT09PNG3aFAAQHh6OAwcOYMaMGfkSkoiIiIiICrccFRa+vr7a/+/evTvmzJmDgIAAbduYMWPw/fff4/Dhwxg3bpz8KYmIiIiIqFCTPMfiwIED6NChQ4b2Dh064PDhw7KE+hh4gTwiIiIiIvlILixKly6N3bt3Z2jfvXs3SpcuLUuoj4GTt4mIiIiI5CP5dLOzZ8/G0KFDcezYMbi6ugIATp8+jf3792P16tWyByQiIiIiosJPcmExaNAg1KlTB8uWLcPOnTsBAHXq1MHx48e1hQYRERERERUvkgsLAHB1dcXmzZvlzkJEREREREVUrgoLjUaD27dvIy4uDhqNRmeZu7u7LMGIiIiIiKjokFxYnDp1Cn379sX9+/chhNBZplAooFarZQtHRERERERFg+TC4vPPP4eLiwv27t2L8uXL5/iK3ERERERE9N8lubC4desWtm/fjurVq+dHno9GpVJBpVLxCAsRERERkQwkX8fC1dUVt2/fzo8sHxWvY0FEREREJB/JRyxGjx6N8ePHIyYmBvXr14eBgYHO8gYNGsgWjoiIiIiIigbJhUX37t0BAIMHD9a2KRQKCCE4eZuIiIiIqJiSXFhER0fnRw4iIiIiIirCJBcWlStXzo8cRERERERUhEmevA0Ad+7cwejRo+Hh4QEPDw+MGTMGd+7ckTubJC9fvkTlypUxYcKEAs1BRERERFQcSS4sDhw4AAcHB5w5cwYNGjRAgwYNcPr0adStWxeHDh3Kj4w58vXXX+OTTz4psO0TERERERVnkodCTZ48GePGjcM333yToX3SpElo166dbOFy6tatW7h+/Tp8fHxw5cqVj759IiIiIqLiTvIRi2vXrmHIkCEZ2gcPHoyoqCjJAUJDQ+Hj4wNbW1soFArs2rUrwzoqlQr29vYwMjKCq6srzpw5o7N8woQJCA4OlrxtIiIiIiKSh+TCokyZMoiMjMzQHhkZibJly0oOkJKSAkdHR6hUqkyXb926FYGBgQgKCkJERAQcHR3h6emJuLg4AMDu3btRs2ZN1KxZU/K2iYiIiIhIHpKHQg0bNgzDhw/H3bt30axZMwDAiRMnMH/+fAQGBkoO4OXlBS8vryyXL1myBMOGDYOfnx8AYOXKldi7dy/Wrl2LyZMn49SpU9iyZQu2bduG5ORk/Pvvv7CwsMDMmTMz7S81NRWpqana20lJSZIzExERERGRLsmFxYwZM2Bubo7FixdjypQpAABbW1vMmjULY8aMkTVcWloazp8/r90OAOjp6cHDwwPh4eEAgODgYO0wqPXr1+PKlStZFhXp68+ePVvWnERERERExZ3koVAKhQLjxo3D33//jcTERCQmJuLvv//G2LFjoVAoZA335MkTqNVq2NjY6LTb2NggJiYmV31OmTJFmzsxMREPHz6UIyoRERERUbGWqytvv3nzBjVq1IC5ubm2/datWzAwMIC9vb2c+SQZNGjQB9dRKpVQKpVQqVRQqVRQq9X5H4yIiIiI6D9O8hGLQYMG4eTJkxnaT58+naMv9lJYW1tDX18fsbGxOu2xsbEoV65cnvr29/dHVFQUzp49m6d+iIiIiIgoF4XFhQsX0Lx58wztn3zySaZni8oLQ0NDODs7IyQkRNum0WgQEhKCpk2b5qlvlUoFBwcHNG7cOK8xiYiIiIiKPclDoRQKBV68eJGhPTExMVfDipKTk3H79m3t7ejoaERGRqJUqVKoVKkSAgMD4evrCxcXFzRp0gRLly5FSkqK9ixRueXv7w9/f38kJSXB0tIyT30RERERERV3kgsLd3d3BAcH49dff4W+vj4AQK1WIzg4GC1atJAc4Ny5c2jdurX2dvopa319fbF+/Xr06tUL8fHxmDlzJmJiYuDk5IT9+/dnmNBNREREREQFR3JhMX/+fLi7u6NWrVpwc3MDAISFhSEpKQlHjhyRHKBVq1YQQmS7TkBAAAICAiT3nR1O3iYiIiIiko/kORYODg64dOkSevbsibi4OLx48QIDBw7E9evXUa9evfzImC84eZuIiIiISD6Sj1gAby+IN2/ePLmzEBERERFRESX5iAXwduhT//790axZM/zzzz8AgI0bN+L48eOyhstPPCsUEREREZF8JBcWO3bsgKenJ4yNjREREYHU1FQAb88KVZSOYnAoFBERERGRfCQXFnPnzsXKlSuxevVqGBgYaNubN2+OiIgIWcMREREREVHRILmwuHHjBtzd3TO0W1pa4vnz53Jk+ig4FIqIiIiISD6SC4ty5crpXNAu3fHjx1G1alVZQn0MHApFRERERCQfyYXFsGHDMHbsWJw+fRoKhQKPHj3C5s2bMWHCBIwcOTI/MhIRERERUSEn+XSzkydPhkajQdu2bfHy5Uu4u7tDqVRiwoQJGD16dH5kJCIiIiKiQk5yYaFQKDBt2jR8+eWXuH37NpKTk+Hg4AAzM7P8yJdveOVtIiIiIiL55Oo6FgBgaGgIBwcH1K5dG4cPH8a1a9fkzJXvOMeCiIiIiEg+kguLnj174vvvvwcAvHr1Co0bN0bPnj3RoEED7NixQ/aARERERERU+EkuLEJDQ+Hm5gYA+P3336HRaPD8+XMsW7YMc+fOlT0gEREREREVfpILi8TERJQqVQoAsH//fnTv3h0mJibw9vbGrVu3ZA9IRERERESFn+TCws7ODuHh4UhJScH+/fvRvn17AMCzZ89gZGQke8D8wgvkERERERHJR3Jh8cUXX6Bfv36oWLEibG1t0apVKwBvh0jVr19f7nz5hpO3iYiIiIjkI/l0s6NGjUKTJk3w8OFDtGvXDnp6b2uTqlWrco4FEREREVExJbmwAAAXFxe4uLhACAEhBBQKBby9veXORkRERERERUSurmPx888/o379+jA2NoaxsTEaNGiAjRs3yp2NiIiIiIiKCMlHLJYsWYIZM2YgICAAzZs3BwAcP34cn3/+OZ48eYJx48bJHpKIiIiIiAo3yYXF8uXLsWLFCgwcOFDb1qlTJ9StWxezZs1iYUFEREREVAxJHgr1+PFjNGvWLEN7s2bN8PjxY1lCERERERFR0SK5sKhevTp+++23DO1bt25FjRo1ZAn1MfA6FkRERERE8pE8FGr27Nno1asXQkNDtXMsTpw4gZCQkEwLjsLK398f/v7+SEpKgqWlZUHHISIiIiIq0iQfsejevTtOnz4Na2tr7Nq1C7t27YK1tTXOnDmDrl275kdGIiIiIiIq5HJ1HQtnZ2ds2rRJ7ixERERERFRE5aqw0Gg0uH37NuLi4qDRaHSWubu7yxKMiIiIiIiKDsmFxalTp9C3b1/cv38fQgidZQqFAmq1WrZwRERERERUNEieY/H555/DxcUFV65cQUJCAp49e6b9S0hIyI+M2Xr+/DlcXFzg5OSEevXqYfXq1R89AxERERFRcSf5iMWtW7ewfft2VK9ePT/ySGZubo7Q0FCYmJggJSUF9erVQ7du3VC6dOmCjkZEREREVGxIPmLh6uqK27dv50eWXNHX14eJiQkAIDU1FUKIDEO0iIiIiIgof0kuLEaPHo3x48dj/fr1OH/+PC5duqTzJ1VoaCh8fHxga2sLhUKBXbt2ZVhHpVLB3t4eRkZGcHV1xZkzZ3SWP3/+HI6OjqhYsSK+/PJLWFtbS85BRERERES5J3koVPfu3QEAgwcP1rYpFAoIIXI1eTslJQWOjo4YPHgwunXrlmH51q1bERgYiJUrV8LV1RVLly6Fp6cnbty4gbJlywIArKyscPHiRcTGxqJbt2747LPPYGNjI/WhERERERFRLkkuLKKjo2UN4OXlBS8vryyXL1myBMOGDYOfnx8AYOXKldi7dy/Wrl2LyZMn66xrY2MDR0dHhIWF4bPPPsu0v9TUVKSmpmpvJyUlyfAoiIiIiIiKN8mFReXKlfMjR6bS0tJw/vx5TJkyRdump6cHDw8PhIeHAwBiY2NhYmICc3NzJCYmIjQ0FCNHjsyyz+DgYMyePTvfsxMRERERFSe5ukAeAERFReHBgwdIS0vTae/UqVOeQ6V78uQJ1Gp1hmFNNjY2uH79OgDg/v37GD58uHbS9ujRo1G/fv0s+5wyZQoCAwO1t5OSkmBnZydbZiIiIiKi4khyYXH37l107doVly9f1s6tAN7OswDw0S+Q16RJE0RGRuZ4faVSCaVSCZVKBZVKxQv6ERERERHJQPJZocaOHYsqVaogLi4OJiYmuHr1KkJDQ+Hi4oJjx47JGs7a2hr6+vqIjY3VaY+NjUW5cuXy1Le/vz+ioqJw9uzZPPVDRERERES5KCzCw8MxZ84cWFtbQ09PD3p6emjRogWCg4MxZswYWcMZGhrC2dkZISEh2jaNRoOQkBA0bdo0T32rVCo4ODigcePGeY1JRERERFTsSS4s1Go1zM3NAbw9ovDo0SMAbyd137hxQ3KA5ORkREZGaoczRUdHIzIyEg8ePAAABAYGYvXq1diwYQOuXbuGkSNHIiUlRXuWqNziEQsiIiIiIvlInmNRr149XLx4EVWqVIGrqysWLFgAQ0ND/Pjjj6hatarkAOfOnUPr1q21t9MnVvv6+mL9+vXo1asX4uPjMXPmTMTExMDJyQn79+/ndSqIiIiIiAoRyYXF9OnTkZKSAgCYM2cOPv30U7i5uaF06dLYunWr5ACtWrXSTgDPSkBAAAICAiT3nR1O3iYiIiIiko/kwsLT01P7/9WrV8f169eRkJCAkiVLas8MVRT4+/vD398fSUlJsLS0LOg4RERERERFWq6vY/GuUqVKydENEREREREVUZILi5SUFHzzzTcICQlBXFwcNBqNzvK7d+/KFi4/cSgUEREREZF8JBcWQ4cOxV9//YUBAwagfPnyRWr407s4FIqIiIiISD6SC4t9+/Zh7969aN68eX7kISIiIiKiIkjydSxKliz5n5hTwQvkERERERHJR3Jh8dVXX2HmzJl4+fJlfuT5aHiBPCIiIiIi+UgeCrV48WLcuXMHNjY2sLe3h4GBgc7yiIgI2cIREREREVHRILmw6NKlSz7EICIiIiKiokxyYREUFJQfOT46nm6WiIiIiEg+OZpjIYTI7xwfHedYEBERERHJJ0eFRd26dbFlyxakpaVlu96tW7cwcuRIfPPNN7KEIyIiIiKioiFHQ6GWL1+OSZMmYdSoUWjXrh1cXFxga2sLIyMjPHv2DFFRUTh+/DiuXr2KgIAAjBw5Mr9zExERERFRIZKjwqJt27Y4d+4cjh8/jq1bt2Lz5s24f/8+Xr16BWtrazRs2BADBw5Ev379ULJkyfzOTEREREREhYykydstWrRAixYt8ivLR8XJ20RERERE8pF8gbz/Ck7eJiIiIiKST7EtLIiIiIiISD4sLIiIiIiIKM9YWBARERERUZ6xsCAiIiIiojzLVWFx584dTJ8+HX369EFcXBwAYN++fbh69aqs4YiIiIiIqGiQXFj89ddfqF+/Pk6fPo2dO3ciOTkZAHDx4kUEBQXJHpCIiIiIiAo/yYXF5MmTMXfuXBw6dAiGhoba9jZt2uDUqVOyhstPKpUKDg4OaNy4cUFHISIiIiIq8iQXFpcvX0bXrl0ztJctWxZPnjyRJdTHwOtYEBERERHJR3JhYWVlhcePH2dov3DhAipUqCBLKCIiIiIiKlokFxa9e/fGpEmTEBMTA4VCAY1GgxMnTmDChAkYOHBgfmQkIiIiIqJCTnJhMW/ePNSuXRt2dnZITk6Gg4MD3N3d0axZM0yfPj0/MhIRERERUSFXQuodDA0NsXr1asyYMQNXrlxBcnIyGjZsiBo1auRHPiIiIiIiKgIkFxbpKlWqhEqVKsmZJVcePnyIAQMGIC4uDiVKlMCMGTPQo0ePgo5FRERERFSsSC4shBDYvn07jh49iri4OGg0Gp3lO3fulC1cTpQoUQJLly6Fk5MTYmJi4OzsjI4dO8LU1PSj5iAiIiIiKs4kFxZffPEFVq1ahdatW8PGxgYKhSI/cuVY+fLlUb58eQBAuXLlYG1tjYSEBBYWREREREQfkeTCYuPGjdi5cyc6duwoS4DQ0FAsXLgQ58+fx+PHj/H777+jS5cuOuuoVCosXLgQMTExcHR0xPLly9GkSZMMfZ0/fx5qtRp2dnayZCMiIiIiopyRfFYoS0tLVK1aVbYAKSkpcHR0hEqlynT51q1bERgYiKCgIERERMDR0RGenp6Ii4vTWS8hIQEDBw7Ejz/+KFs2IiIiIiLKGcmFxaxZszB79my8evVKlgBeXl6YO3duplfzBoAlS5Zg2LBh8PPzg4ODA1auXAkTExOsXbtWu05qaiq6dOmCyZMno1mzZtluLzU1FUlJSTp/RERERESUN5KHQvXs2RO//vorypYtC3t7exgYGOgsj4iIkC1cWloazp8/jylTpmjb9PT04OHhgfDwcABvJ5MPGjQIbdq0wYABAz7YZ3BwMGbPni1bRiKighKRg888KlwabdxY0BGIiPKN5MLC19cX58+fR//+/fN98vaTJ0+gVqthY2Oj025jY4Pr168DAE6cOIGtW7eiQYMG2LVrF4C380Dq16+faZ9TpkxBYGCg9nZSUhLnZBARERER5ZHkwmLv3r04cOAAWrRokR95JGvRokWGU95mR6lUQqlUQqVSQaVSQa1W52M6IiIiIqLiQfIcCzs7O1hYWORHlgysra2hr6+P2NhYnfbY2FiUK1cuT337+/sjKioKZ8+ezVM/RERERESUi8Ji8eLFmDhxIu7du5cPcXQZGhrC2dkZISEh2jaNRoOQkBA0bdo0T32rVCo4ODigcePGeY1JRERERFTsSR4K1b9/f7x8+RLVqlWDiYlJhsnbCQkJkvpLTk7G7du3tbejo6MRGRmJUqVKoVKlSggMDISvry9cXFzQpEkTLF26FCkpKfDz85MaXYe/vz/8/f2RlJQES0vLPPVFRERERFTcSS4sli5dKmuAc+fOoXXr1trb6ROrfX19sX79evTq1Qvx8fGYOXMmYmJi4OTkhP3792eY0E1ERERERAUnV2eFklOrVq0ghMh2nYCAAAQEBMi6XU7eJiIiIiKST44Ki6SkJO2E7Q9dUO5jTezOKw6FIiIiIiKST44Ki5IlS+Lx48coW7YsrKysMr12hRACCoWCRwCIiIiIiIqhHBUWR44cQalSpQAAR48ezddAHwuHQhERERERySdHhUXLli21/1+lShXY2dllOGohhMDDhw/lTZePOBSKiIiIiEg+kq9jUaVKFcTHx2doT0hIQJUqVWQJRURERERERYvkwiJ9LsX7kpOTYWRkJEuoj4EXyCMiIiIikk+OTzebfn0JhUKBGTNmwMTERLtMrVbj9OnTcHJykj1gfuFQKCIiIiIi+eS4sLhw4QKAt0csLl++DENDQ+0yQ0NDODo6YsKECfInJCIiIiKiQi/HhUX62aD8/Pzw3XffFZnrVRARERERUf6TPMdi3bp1/4mignMsiIiIiIjkI7mw+K/w9/dHVFQUzp49W9BRiIiIiIiKvGJbWBARERERkXxYWBARERERUZ6xsCAiIiIiojyTXFhs2LABe/fu1d6eOHEirKys0KxZM9y/f1/WcPmJk7eJiIiIiOQjubCYN28ejI2NAQDh4eFQqVRYsGABrK2tMW7cONkD5hdO3iYiIiIikk+Or2OR7uHDh6hevToAYNeuXejevTuGDx+O5s2bo1WrVnLnIyIiIiKiIkDyEQszMzM8ffoUAHDw4EG0a9cOAGBkZIRXr17Jm46IiIiIiIoEyUcs2rVrh6FDh6Jhw4a4efMmOnbsCAC4evUq7O3t5c5HRERERERFgOQjFiqVCk2bNkV8fDx27NiB0qVLAwDOnz+PPn36yB6QiIiIiIgKP8lHLKysrPD9999naJ89e7YsgYiIiIiIqOiRfMRi//79OH78uPa2SqWCk5MT+vbti2fPnskajoiIiIiIigbJhcWXX36JpKQkAMDly5cxfvx4dOzYEdHR0QgMDJQ9YH7hdSyIiIiIiOQjeShUdHQ0HBwcAAA7duzAp59+innz5iEiIkI7kbso8Pf3h7+/P5KSkmBpaVnQcYiIiIiIijTJRywMDQ3x8uVLAMDhw4fRvn17AECpUqW0RzKIiIiIiKh4kXzEokWLFggMDETz5s1x5swZbN26FQBw8+ZNVKxYUfaARERERERU+Ek+YvH999+jRIkS2L59O1asWIEKFSoAAPbt24cOHTrIHpCIiIiIiAo/yUcsKlWqhD/++CND+7fffitLICIiIiIiKnokH7EAgDt37mD69Ono06cP4uLiALw9YnH16lVZw+VU165dUbJkSXz22WcFsn0iIiIiouJOcmHx119/oX79+jh9+jR27tyJ5ORkAMDFixcRFBQke8CcGDt2LH7++ecC2TYREREREeWisJg8eTLmzp2LQ4cOwdDQUNvepk0bnDp1StZwOdWqVSuYm5sXyLaJiIiIiCgXhcXly5fRtWvXDO1ly5bFkydPJAcIDQ2Fj48PbG1toVAosGvXrgzrqFQq2Nvbw8jICK6urjhz5ozk7RARERERUf6RXFhYWVnh8ePHGdovXLigPUOUFCkpKXB0dIRKpcp0+datWxEYGIigoCBERETA0dERnp6e2rkdRERERERU8CQXFr1798akSZMQExMDhUIBjUaDEydOYMKECRg4cKDkAF5eXpg7d26mR0EAYMmSJRg2bBj8/Pzg4OCAlStXwsTEBGvXrpW8LQBITU1FUlKSzh8REREREeWN5MJi3rx5qF27Nuzs7JCcnAwHBwe4u7ujWbNmmD59uqzh0tLScP78eXh4ePxfYD09eHh4IDw8PFd9BgcHw9LSUvtnZ2cnV1wiIiIiomJLcmFhaGiI1atX4+7du/jjjz+wadMmXL9+HRs3boS+vr6s4Z48eQK1Wg0bGxuddhsbG8TExGhve3h4oEePHvjzzz9RsWLFbIuOKVOmIDExUfv38OFDWTMTERERERVHki+Ql87Ozq7Q/Np/+PDhHK+rVCqhVCqhUqmgUqmgVqvzMRkRERERUfEg+YhF9+7dMX/+/AztCxYsQI8ePWQJlc7a2hr6+vqIjY3VaY+NjUW5cuXy1Le/vz+ioqJw9uzZPPVDRERERES5KCxCQ0PRsWPHDO1eXl4IDQ2VJVQ6Q0NDODs7IyQkRNum0WgQEhKCpk2byrotIiIiIiLKPclDoZKTk3UujJfOwMAgV2dYSk5Oxu3bt7W3o6OjERkZiVKlSqFSpUoIDAyEr68vXFxc0KRJEyxduhQpKSnw8/OTvK13cSgUEREREZF8JB+xqF+/PrZu3ZqhfcuWLXBwcJAc4Ny5c2jYsCEaNmwIAAgMDETDhg0xc+ZMAECvXr2waNEizJw5E05OToiMjMT+/fszTOiWikOhiIiIiIjkI/mIxYwZM9CtWzfcuXMHbdq0AQCEhITg119/xbZt2yQHaNWqFYQQ2a4TEBCAgIAAyX1nh0csiIiIiIjkI/mIhY+PD3bt2oXbt29j1KhRGD9+PP7++28cPnwYXbp0yYeI+YNHLIiIiIiI5JOr0816e3vD29tb7ixERERERFREST5icfbsWZw+fTpD++nTp3Hu3DlZQn0MKpUKDg4OaNy4cUFHISIiIiIq8iQXFv7+/plerfqff/6Bv7+/LKE+Bg6FIiIiIiKSj+TCIioqCo0aNcrQ3rBhQ0RFRckSioiIiIiIihbJhYVSqcxwJWwAePz4MUqUyNWUjQLBoVBERERERPKRXFi0b98eU6ZMQWJiorbt+fPnmDp1Ktq1aydruPzEoVBERERERPKRfIhh0aJFcHd3R+XKlbUXtYuMjISNjQ02btwoe0AiIiIiIir8JBcWFSpUwKVLl7B582ZcvHgRxsbG8PPzQ58+fWBgYJAfGYmIiIiIqJDL1aQIU1NTDB8+XO4sHxWvvE1FRcSAAQUdgSRoxCO3RERUTOV6tnVUVBQePHiAtLQ0nfZOnTrlOdTH4O/vD39/fyQlJcHS0rKg4xARERERFWmSC4u7d++ia9euuHz5MhQKBYQQAACFQgEAPAJARERERFQMST4r1NixY1GlShXExcXBxMQEV69eRWhoKFxcXHDs2LF8iEhERERERIWd5CMW4eHhOHLkCKytraGnpwc9PT20aNECwcHBGDNmDC5cuJAfOYmIiIiIqBCTfMRCrVbD3NwcAGBtbY1Hjx4BACpXrowbN27Imy4f8QJ5RERERETykXzEol69erh48SKqVKkCV1dXLFiwAIaGhvjxxx9RtWrV/MiYLzh5m4iIiIhIPpILi+nTpyMlJQUAMGfOHHz66adwc3ND6dKlsXXrVtkDEhERERFR4Se5sPD09NT+f/Xq1XH9+nUkJCSgZMmS2jNDERERERFR8ZLr61i8q1SpUnJ0Q0RERERERZTkydtERERERETvY2FBRERERER5xsKCiIiIiIjyrNgWFryOBRERERGRfIptYeHv74+oqCicPXu2oKMQERERERV5xbawICIiIiIi+bCwICIiIiKiPGNhQUREREREecbCgoiIiIiI8uw/UVj88ccfqFWrFmrUqIGffvqpoOMQERERERU7JQo6QF69efMGgYGBOHr0KCwtLeHs7IyuXbuidOnSBR2NiIiIiKjYKPJHLM6cOYO6deuiQoUKMDMzg5eXFw4ePFjQsYiIiIiIipUCLyxCQ0Ph4+MDW1tbKBQK7Nq1K8M6KpUK9vb2MDIygqurK86cOaNd9ujRI1SoUEF7u0KFCvjnn38+RnQiIiIiIvr/CrywSElJgaOjI1QqVabLt27disDAQAQFBSEiIgKOjo7w9PREXFzcR05KRERERERZKfDCwsvLC3PnzkXXrl0zXb5kyRIMGzYMfn5+cHBwwMqVK2FiYoK1a9cCAGxtbXWOUPzzzz+wtbX9KNmJiIiIiOitAi8sspOWlobz58/Dw8ND26anpwcPDw+Eh4cDAJo0aYIrV67gn3/+QXJyMvbt2wdPT88s+0xNTUVSUpLOHxERERER5U2hPivUkydPoFarYWNjo9NuY2OD69evAwBKlCiBxYsXo3Xr1tBoNJg4cWK2Z4QKDg7G7Nmz8zW3VBEDBhR0BJKo0caNBR2BiIiIqFAp1EcscqpTp064efMmbt++jeHDh2e77pQpU5CYmIhFixahVq1aqF69+kdKSURERET031WoCwtra2vo6+sjNjZWpz02NhblypXLVZ9KpRIWFhYYP348rl+/jvPnz8sRlYiIiIioWCvUhYWhoSGcnZ0REhKibdNoNAgJCUHTpk0LMBkREREREb2rwOdYJCcn4/bt29rb0dHRiIyMRKlSpVCpUiUEBgbC19cXLi4uaNKkCZYuXYqUlBT4+fnlabsqlQoqlQpqtTqvD4GIiIiIqNgr8MLi3LlzaN26tfZ2YGAgAMDX1xfr169Hr169EB8fj5kzZyImJgZOTk7Yv39/hgndUvn7+8Pf3x9JSUmwtLTMU19ERERERMVdgRcWrVq1ghAi23UCAgIQEBAg63Z5xIKIiIiISD6Feo5FfvL390dUVBTOnj1b0FGIiIiIiIq8YltYEBERERGRfIptYaFSqeDg4IDGjRsXdBQiIiIioiKv2BYWHApFRERERCSfYltYEBERERGRfIptYcGhUERERERE8inw080WlPTrWCQmJsLKygpJSUkFliU5La3Atk258zH3F+4fRQv3DcoO9w/KCvcNykpBfkd9d/sfujwEAChETtb6D/v7779hZ2dX0DGIiIiIiAqthw8fomLFitmuU+wLC41Gg0ePHsHc3BwKhaKg4/xnJCUlwc7ODg8fPoSFhUVBx6FChvsHZYX7BmWH+wdlhftG/hFC4MWLF7C1tYWeXvazKIrtUKh0enp6H6y+KPcsLCz4Bqcscf+grHDfoOxw/6CscN/IH5aWljlar9hO3iYiIiIiIvmwsCAiIiIiojxjYUH5QqlUIigoCEqlsqCjUCHE/YOywn2DssP9g7LCfaNwKPaTt4mIiIiIKO94xIKIiIiIiPKMhQUREREREeUZCwsiIiIiIsozFhYku/Xr18PKyqqgY9B/mEKhwK5duwo6BhERFbBjx45BoVDg+fPnku737r8j9+7dg0KhQGRk5AfvJ2Xd4oiFRTEzaNAgKBQKKBQKGBgYoEqVKpg4cSJev34t2zZ69eqFmzdv5mhdFiEFb9CgQejSpUumyxISEjB69GjUqlULxsbGqFSpEsaMGYPExMSPG5KKpJx+3vz9998wNDREvXr1Mu0nvY9Tp07ptKempqJ06dJQKBQ4duxYfj0Mymfx8fEYOXIkKlWqBKVSiXLlysHT0xMnTpwAAFy8eBGdOnVC2bJlYWRkBHt7e/Tq1QtxcXEA/u+LXvqfubk56tatC39/f9y6dasgH1qxk9W/J7n98v+x2NnZ4fHjx1l+BlHOsbAohjp06IDHjx/j7t27+Pbbb7Fq1SoEBQXJ1r+xsTHKli0rW385oVarodFoPuo2i4NHjx7h0aNHWLRoEa5cuYL169dj//79GDJkSEFHoyIiJ58369evR8+ePZGUlITTp09n2o+dnR3WrVun0/b777/DzMws37LTx9G9e3dcuHABGzZswM2bN7Fnzx60atUKT58+RXx8PNq2bYtSpUrhwIEDuHbtGtatWwdbW1ukpKTo9HP48GE8fvwYFy9exLx583Dt2jU4OjoiJCSkgB4ZySktLS3f+tbX10e5cuVQokSJfNtGccHCohhK/0XIzs4OXbp0gYeHBw4dOgQA0Gg0CA4ORpUqVWBsbAxHR0ds375d5/579uxBjRo1YGRkhNatW2PDhg06v0S8fxTi4sWLaN26NczNzWFhYQFnZ2ecO3cOx44dg5+fHxITE7W/NM2aNQvA218iJ0yYgAoVKsDU1BSurq46v0imb2PPnj1wcHCAUqnEgwcP8vNpK5bq1auHHTt2wMfHB9WqVUObNm3w9ddf43//+x/evHmT5f1SU1MxadIk2NnZQalUonr16lizZg2At0XgkCFDtPtYrVq18N1332XoY+3atahbty6USiXKly+PgIAAneVPnjxB165dYWJigho1amDPnj06y69cuQIvLy+YmZnBxsYGAwYMwJMnT2R4VkiK7D5vAEAIgXXr1mHAgAHo27evdj95n6+vL7Zs2YJXr15p29auXQtfX998fwyUf54/f46wsDDMnz8frVu3RuXKldGkSRNMmTIFnTp1wokTJ5CYmIiffvoJDRs2RJUqVdC6dWt8++23qFKlik5fpUuXRrly5VC1alV07twZhw8fhqurK4YMGQK1Wl1Aj5Ay8/TpU/Tp0wcVKlSAiYkJ6tevj19//VVnnVatWiEgIABffPEFrK2t4enpCQD4888/UbNmTRgbG6N169a4d+/eB7d369YtuLu7w8jICA4ODjqfQUDG4U3Pnj1Dv379UKZMGRgbG6NGjRoZfthIp1arMXjwYNSuXZvfQ8DCoti7cuUKTp48CUNDQwBAcHAwfv75Z6xcuRJXr17FuHHj0L9/f/z1118AgOjoaHz22Wfo0qULLl68iBEjRmDatGnZbqNfv36oWLEizp49i/Pnz2Py5MkwMDBAs2bNsHTpUlhYWODx48d4/PgxJkyYAAAICAhA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EUePHs10GQARHR2dZZ+vXr0S48aNE+XLlxeGhoaievXqYu3atUIIIV6/fi0GDRokLC0thZWVlRg5cqSYPHmycHR01Olj5cqV2v2wfPnyYvTo0dpleGfSXTpLS0udSb83b94UXbt2FVZWVsLY2FjUrl1bfPHFF0Kj0eT1KaMcyu7zpkSJEsLe3j7T+z1+/Fjo6emJ3bt3CyEyf73TcfJ20fb69WsxefJk0ahRI2FpaSlMTExErVq1xPTp08XLly/FnTt3xLBhw0TNmjWFsbGxsLKyEo0bN9Z5r6dPpk3/MzExEXXq1BGjRo0St27dKrgHVwxl9Z5P/7ckfYL106dPRefOnYWZmZkoW7asmD59uhg4cKDOfVu2bCnGjh2boa///e9/2u8gbm5uYu3atR+cGH7jxg3RokULYWhoKGrWrCn279+f7eTtr776StSpU0cYGxuLUqVKic6dO4u7d+9muq4QQixevFiYm5uLEydOSHi2/psUQkg8fxvRe77++mvtaeCIiIiIqHji5G2S7IcffkDjxo1RunRpnDhxAgsXLsxw8TIiIiIiKl5YWJBkt27dwty5c5GQkIBKlSph/PjxmDJlSkHHIiIiIqICxKFQRERERESUZzwrFBERERER5RkLCyIiIiIiyjMWFkRERERElGcsLIiIiIiIKM9YWBARERERUZ6xsCAiIiIiojxjYUFERERERHnGwoKIiIiIiPKMhQUREREREeXZ/wNN6fMifLrwDAAAAABJRU5ErkJggg==\n" }, "metadata": {} } ], "source": [ "#| echo: false\n", "#@title ๐Ÿ“ˆ Memory-hierarchy chart (click to show code)\n", "import matplotlib.pyplot as plt\n", "\n", "levels = [\"Register\", \"L2 cache\", \"RAM\", \"SSD\", \"Hard disk\"]\n", "nanoseconds = [1, 4, 100, 100_000, 10_000_000] # rough order-of-magnitude\n", "\n", "plt.figure(figsize=(8, 4))\n", "plt.bar(levels, nanoseconds, color=\"indianred\")\n", "plt.yscale(\"log\") # log scale: each gap is ~10x+\n", "plt.ylabel(\"access time (nanoseconds, log scale)\")\n", "plt.title(\"Each step away from the CPU is dramatically slower\")\n", "plt.tight_layout()\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "nb2-26-cache", "metadata": { "id": "nb2-26-cache" }, "source": [ "### Why Cache Works\n", "\n", "Notice the y-axis is a **log scale** โ€” each bar is many times taller than the last, so a linear chart would be unreadable. That extreme gap is the whole reason **cache** exists.\n", "\n", "Programs have a helpful habit called **locality**: if you use a piece of data, you'll probably use it (or its neighbors) again soon. A loop runs the same instructions repeatedly; a sprite's pixels sit next to each other. So the CPU keeps recently-used data in fast cache. If the next thing it needs is there, that's a **cache hit** (fast). If not, a **cache miss** โ€” it must trek out to RAM and wait.\n", "\n", "\"The game is loading\" is exactly this: copying data from the slow pantry (disk) up to the fast counter (RAM and cache) *before* the cook needs it, so play doesn't stall mid-action." ] }, { "cell_type": "markdown", "id": "nb2-27-consoles-intro", "metadata": { "id": "nb2-27-consoles-intro" }, "source": [ "## Consoles as a Fossil Record\n", "\n", "The von Neumann architecture has barely changed since 1945. What changed is the *numbers*. Game consoles are a perfect fossil record because each generation is a fixed, well-documented snapshot of consumer hardware:\n", "\n", "| Console | Year | CPU clock | RAM | Storage |\n", "|---|---|---|---|---|\n", "| Atari 2600 | 1977 | 1.2 MHz | 128 **bytes** | ROM cartridge (~4 KB) |\n", "| NES | 1983 | 1.8 MHz | 2 KB | cartridge (~256 KB) |\n", "| SNES | 1990 | 3.6 MHz | 128 KB | cartridge (~4 MB) |\n", "| Nintendo 64 | 1996 | 94 MHz | 4 MB | cartridge (~32 MB) |\n", "| PlayStation 2 | 2000 | 294 MHz | 32 MB | DVD (~4.7 GB) |\n", "| PlayStation 5 | 2020 | ~3.5 GHz ร—8 cores | 16 GB | SSD (825 GB) |\n", "\n", "The Atari 2600 had **128 bytes** of RAM โ€” not kilobytes, *bytes*. You could not store this sentence in it. Programmers squeezed entire games into that space by hand. The PixelBox 8 lives in roughly this era." ] }, { "cell_type": "code", "execution_count": 8, "id": "nb2-28-console-chart", "metadata": { "cellView": "form", "jupyter": { "source_hidden": true }, "id": "nb2-28-console-chart", "outputId": "3097e83d-784e-45d6-bf12-b2b472d294ab", "colab": { "base_uri": "https://localhost:8080/", "height": 407 } }, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "iVBORw0KGgoAAAANSUhEUgAAA3kAAAGGCAYAAADGq0gwAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAbfpJREFUeJzt3XdcU9f/P/BXWAFEQARBlOGoA1FQVMSNooh7o1ZFam1rcRVHtX4qtnXU1lo70jqKolZbR6221VoVt6K4cG9xC05AUBnJ+f3hj/s1BDSBhAC+no9HHg9z7sm578sxIW/OuDIhhAARERERERGVCSbGDoCIiIiIiIj0h0keERERERFRGcIkj4iIiIiIqAxhkkdERERERFSGMMkjIiIiIiIqQ5jkERERERERlSFM8oiIiIiIiMoQJnlERERERERlCJM8IiIiIiKiMoRJHhEZVUxMDGQyGa5du2bsUIj04tq1a5DJZJg7d66xQ3ljeXp6YtiwYdLzXbt2QSaTYdeuXVLZsGHD4OnpqfY6mUyG6dOnF0uM2iqJMb2OTCbDqFGjXluPn/9EhsMkj6gUu3LlCt5//31Ur14dlpaWsLW1RYsWLfDdd9/h2bNnxg7PKHK/zOU+TE1NUalSJfTt2xfnzp0r8HWbN2+GTCaDq6srVCpVvnU8PT0hk8kQFBSU7/HFixdL5z1y5Eih4t+6dSuGDx8Ob29vmJqaanwJfdnly5fRt29fVKhQAdbW1mjZsiV27typUe/ln0feR4cOHaR606dPf2Xd/fv3a30dhw8fxqhRo1CvXj2UK1cO7u7u6N+/Py5evJhv/XPnzqFTp06wsbGBg4MDhgwZgvv376vVOX/+PCZNmgRfX1+UL18elStXRpcuXQr8Wd++fRv9+/eHvb09bG1t0aNHD1y9elXrayitZs2ahQ0bNmhd/+eff0a/fv3g7u4OmUymlhy9bM+ePejevTvc3NxgaWkJFxcXdOrUqcD/FwcOHEDLli1hbW0NFxcXjBkzBunp6YW4orJv8+bNpS6RI6KSzczYARBR4WzatAn9+vWDXC7H0KFD4e3tjaysLOzbtw8TJ07EmTNnsGjRImOHaTRjxoxBkyZNkJ2djZMnT2LBggXYtWsXTp8+DRcXF436K1euhKenJ65du4YdO3YUmMhZWlpi586dSEpK0mhn5cqVsLS0xPPnzwsd96pVq7B69Wo0atQIrq6uBda7efMmAgICYGpqiokTJ6JcuXJYunQpOnbsiNjYWLRu3Vqqu2LFCo3XHzlyBN999x06duwolfXu3Rs1a9bUqPvJJ58gPT0dTZo00fo65syZg/3796Nfv35o0KABkpKS8OOPP6JRo0Y4ePAgvL29pbq3bt1C69atYWdnh1mzZiE9PR1z587FqVOnEB8fDwsLCwDAL7/8gujoaPTp0wcffvghUlNTsXDhQjRr1gxbtmxR67P09HQEBgYiNTUVn3zyCczNzfHtt9+iTZs2SEhIQMWKFbW+ltJm1qxZ6Nu3L3r27KlV/Tlz5uDJkydo2rQp7t69W2C9ixcvwsTEBB988AFcXFzw+PFj/Prrr2jdujU2bdqETp06SXUTEhLQvn171K1bF/PmzcOtW7cwd+5cXLp0Cf/++29RL/G1Lly4ABMT3f+O/ezZM5iZFf9Xo82bN0OhUOSb6BkrpuIwZMgQDBgwAHK53NihEJU9gohKnatXrwobGxtRp04dcefOHY3jly5dEvPnzzdCZLpbunSpACASExP10t7OnTsFALF27Vq18p9//lkAEHPmzNF4TXp6uihXrpz4/vvvRcOGDcWwYcPybdvDw0O0b99e2Nraavx8b968KUxMTESfPn0EAHH48OFCxX/79m2RlZUlhBCiS5cuwsPDI996H374oTAzMxPnz5+XyjIyMoSbm5to1KjRa88zfPhwIZPJxM2bN19Z78aNG0Imk4kRI0ZofxFCiP3794vMzEy1sosXLwq5XC7efvtttfKRI0cKKysrcf36dals27ZtAoBYuHChVHbkyBHx5MkTtdc+ePBAODk5iRYtWqiVz5kzRwAQ8fHxUtm5c+eEqampmDJlik7XoqvExEQBQHz99dcGPU9BypUrJ8LCwrSuf+3aNaFSqQr12oyMDOHs7CyCg4PVykNCQkTlypVFamqqVLZ48WIBQPz3339at68vuZ8LO3fulMrCwsIKfH8Vt4iICFGWvpIBEBEREcYOQy/S09ONHQJRoXC6JlEp9NVXXyE9PR3R0dGoXLmyxvGaNWti7Nix0vOcnBx88cUXqFGjBuRyOTw9PfHJJ58gMzNT7XWenp7o2rUr9u3bh6ZNm8LS0hLVq1fH8uXL1eplZ2fjs88+w1tvvQVLS0tUrFgRLVu2xLZt29Tq7dixA61atUK5cuVgb2+PHj16vHLK5Mv+/fdf6bXly5dHly5dcObMGW1/RBpatWoF4MUU17z+/PNPPHv2DP369cOAAQOwfv36AkfjLC0t0bt3b6xatUqt/LfffkOFChUQHBxc6BgBwNXVFebm5q+tt3fvXjRs2BC1a9eWyqytrdG9e3ccO3YMly5dKvC1mZmZ+OOPP9CmTRtUrVr1lef57bffIITA22+/rf1FAGjevLk0ApfrrbfeQr169TT+D/zxxx/o2rUr3N3dpbKgoCDUqlULa9askcr8/PxgY2Oj9tqKFSuiVatWGm2uW7cOTZo0URt9rFOnDtq3b6/WJgDcuHED58+ff+01ZWVlYdq0afDz84OdnR3KlSuHVq1a5TtFNte3334LDw8PWFlZoU2bNjh9+rRGHW3eJ/mtHwP+b4ptLplMhoyMDCxbtkyaZlvQ9MtcHh4eam3owtraGk5OTkhJSZHK0tLSsG3bNgwePBi2trZS+dChQ2FjY6Px888rd8r1mjVr8Nlnn6FKlSooX748+vbti9TUVGRmZmLcuHGoVKkSbGxsEB4enu9n2euuOz/5rX87fvw4QkJCYGtrCxsbG7Rv3x4HDx5Uq5O7tmz//v2IjIyEk5MTypUrh169emlMO85r2LBhUCgU0vlzHwXFlNvnFy9exODBg2FnZwcnJyd8+umnEELg5s2b6NGjB2xtbeHi4oJvvvlG45yZmZmIiopCzZo1IZfL4ebmhkmTJmn8HLdt24aWLVvC3t4eNjY2qF27Nj755BNtfpQAXsxuqF27NiwtLeHn54c9e/bk+3N7eU2eSqXC9OnT4erqCmtrawQGBuLs2bP59unJkyfRpk0bWFlZoWrVqpgxYwaWLl2a7zo/bX6nDBs2DDY2Nrhy5Qo6d+6M8uXL6/zZR1RSlM3xf6Iy7u+//0b16tXRvHlzreq/++67WLZsGfr27Yvx48fj0KFDmD17Ns6dO4c///xTrW7uOq/hw4cjLCwMS5YswbBhw+Dn54d69eoBePElY/bs2Xj33XfRtGlTpKWl4ciRIzh27Ji0xmv79u0ICQlB9erVMX36dDx79gw//PADWrRogWPHjr1yrdmKFSsQFhaG4OBgzJkzB0+fPsXPP/+Mli1b4vjx4698bUFyf+FXqFBB49jKlSsRGBgIFxcXDBgwAJMnT8bff/+Nfv365dvWoEGD0LFjR1y5cgU1atQA8GKaZd++fbVK0PQhMzMz32uxtrYGABw9ehRvvfVWvq/dvHkzUlJStPrysnLlSri5ualN/ywsIQSSk5Ol/0fAi3Vz9+7dQ+PGjTXqN23aFJs3b35tu0lJSXB0dJSeq1QqnDx5Eu+8806+bW7duhVPnjxB+fLlAbxIPnbv3g0hxCvPk5aWhl9++QUDBw7EiBEj8OTJE0RHRyM4OBjx8fHw9fVVq798+XI8efIEEREReP78Ob777ju0a9cOp06dgrOzM4CivU/ys2LFCul9+d577wGA9H9UX9LS0pCVlYUHDx5g+fLlOH36tNoX/1OnTiEnJ0ejTy0sLODr64vjx49rdZ7Zs2fDysoKkydPxuXLl/HDDz/A3NwcJiYmePz4MaZPn46DBw8iJiYG1apVw7Rp0/R6nQBw5swZtGrVCra2tpg0aRLMzc2xcOFCtG3bFrt374a/v79a/dGjR6NChQqIiorCtWvXMH/+fIwaNQqrV68u8Bzvv/8+7ty5g23btuU7tbogoaGhqFu3Lr788kts2rQJM2bMgIODAxYuXIh27dphzpw5WLlyJSZMmIAmTZpI72GVSoXu3btj3759eO+991C3bl2cOnUK3377LS5evCit5zxz5gy6du2KBg0a4PPPP4dcLsfly5e1Xpu7e/durF69GmPGjIFcLsdPP/2ETp06IT4+Xm26dl5TpkzBV199hW7duiE4OBgnTpxAcHCwxh/ebt++jcDAQMhkMkyZMgXlypXDL7/8ku/UT11+p+Tk5CA4OBgtW7bE3Llzpc9UolLHuAOJRKSr1NRUAUD06NFDq/oJCQkCgHj33XfVyidMmCAAiB07dkhlHh4eAoDYs2ePVHbv3j0hl8vF+PHjpTIfHx/RpUuXV57X19dXVKpUSTx8+FAqO3HihDAxMRFDhw6VyvJO13zy5Imwt7fXmB6YlJQk7OzsXjttMHda1pIlS8T9+/fFnTt3xJYtW0TNmjWFTCZTm74nhBDJycnCzMxMLF68WCpr3rx5vj9fDw8P0aVLF5GTkyNcXFzEF198IYQQ4uzZswKA2L17t3Q9hZ2u+bJXTdfs1q2bsLe3F2lpaWrlAQEBAoCYO3duge326dNHyOVy8fjx41ee//Tp0wKAmDRpkq6h52vFihUCgIiOjpbKDh8+LACI5cuXa9SfOHGiACCeP39eYJt79uwRMplMfPrpp1LZ/fv3BQDx+eefa9RXKBQCgNo01zZt2mg1VS4nJ0djCurjx4+Fs7OzeOedd6Sy3OmaVlZW4tatW1L5oUOHBADx0UcfSWXavk8KmloYFRWlEbuuUy51fW1wcLAAIAAICwsL8f7774tnz55Jx9euXavxOZKrX79+wsXF5ZXt576Hvb29panLQggxcOBAIZPJREhIiFr9gIAAjZ+Nh4eH2nVoO10TgIiKipKe9+zZU1hYWIgrV65IZXfu3BHly5cXrVu3lspy3/dBQUHS1FchhPjoo4+EqampSElJeeU1v2q6Zt6Ycvv8vffek8pycnJE1apVhUwmE19++aVU/vjxY2FlZaX2s1ixYoUwMTERe/fuVTvPggULBACxf/9+IYQQ3377rQAg7t+//8rYC4oZgDhy5IhUdv36dWFpaSl69eolleX9/E9KShJmZmaiZ8+eau1Nnz5dAFC7jtGjRwuZTCaOHz8ulT18+FA4ODgU+ndKWFiYACAmT56s8zUTlTScrklUyqSlpQGANArxOrkjIZGRkWrl48ePB/BiA5eXeXl5SVMbAcDJyQm1a9dW25XQ3t4eZ86cKXBK4N27d5GQkIBhw4bBwcFBKm/QoAE6dOjwytGZbdu2ISUlBQMHDsSDBw+kh6mpKfz9/V85Ne5l77zzDpycnODq6opOnTohNTUVK1as0Ng85Pfff4eJiQn69OkjlQ0cOBD//vsvHj9+nG/bpqam6N+/P3777TcA/zfa9fLPzdBGjhyJlJQUhIaG4vjx47h48SLGjRsn7TRZ0O6qaWlp2LRpEzp37gx7e/tXnmPlypUAoJfpSufPn0dERAQCAgIQFhYmlefGmd9f3y0tLdXq5HXv3j0MGjQI1apVw6RJkwrd5q5du147ige86PfcKagqlQqPHj2SRqyOHTumUb9nz56oUqWK9Lxp06bw9/eX/v8X5X1iTF9++SW2bt2K6OhoNGvWDFlZWcjJyZGOv+7nr+3Ov0OHDlUbGff394cQQmOE1t/fHzdv3lSLQR+USiW2bt2Knj17onr16lJ55cqVMWjQIOzbt0/6PM713nvvqU21bNWqFZRKJa5fv67X2IAXMzRymZqaonHjxhBCYPjw4VK5vb29xuf32rVrUbduXdSpU0ftM7Zdu3YAIH3G5n4+bNy4scAdh18lICAAfn5+0nN3d3f06NED//33H5RKZb6viY2NRU5ODj788EO18tGjR2vU3bJlCwICAtRG0B0cHDQ+rwrzO2XkyJG6XCpRicQkj6iUyV3j8uTJE63qX79+HSYmJhq7Jrq4uMDe3l7jy8fL66JyVahQQS3h+fzzz5GSkoJatWqhfv36mDhxIk6ePKl2TgBq68Vy1a1bFw8ePEBGRka+8eYmju3atYOTk5PaY+vWrbh3755W1z1t2jRs27YNf/75J4YOHYrU1NR8d9v79ddf0bRpUzx8+BCXL1/G5cuX0bBhQ2RlZWHt2rUFtj9o0CCcPXsWJ06cwKpVqzBgwIBCr2sqjJCQEPzwww/Ys2cPGjVqhNq1a2PTpk2YOXMmAGisXcv1xx9/4Pnz569N3IQQWLVqFby9vdGgQQO1Y6mpqUhKSsr3kd+Xt6SkJHTp0gV2dnZYt24dTE1NpWNWVlYAoLEWCIA0PSu3zssyMjLQtWtXPHnyBBs3blS73sK2qY1ly5ahQYMG0lpUJycnbNq0CampqRp185suW6tWLWnqcFHeJ8bk6+uLDh064J133sG2bdsQHx+vtlbqdT9/bX/2eT+L7OzsAABubm4a5SqVKt8+KIr79+/j6dOnBfaPSqXCzZs3Xxlz7pTqgv5gVBT5/XwsLS3Vpi7nlr98/kuXLuHMmTMan6+1atUCAOkzNjQ0FC1atMC7774LZ2dnDBgwAGvWrNE64Svo///Tp08LXKeY+57I+/vKwcFBY3r69evX890NOG+Zrr9TzMzMXrtWmag04Jo8olLG1tYWrq6u+W7g8CraJiAvfwF/2csjHa1bt8aVK1ewceNGbN26Fb/88gu+/fZbLFiwQO2vy4WR+wVixYoV+d7qQNutxOvXry9tqd+zZ088ffoUI0aMQMuWLaUviZcuXcLhw4cB5P+FZOXKldK6prz8/f1Ro0YNjBs3DomJiRg0aJBWcenTqFGjEB4ejpMnT0rrnaKjowFA+sKW18qVK2FnZ4euXbu+su39+/fj+vXrmD17tsaxsWPHYtmyZfm+LjExUW19S2pqKkJCQpCSkoK9e/dq3BYid+Og/Lbuv3v3LhwcHDRGhLKystC7d2+cPHkS//33n8b6ntzXFNQmgFfenqIgv/76K4YNG4aePXti4sSJqFSpEkxNTTF79ux8N/TRp4LevwWNiBQXCwsLdO/eHV9++SWePXsGKyur1/aptj/7gj6LtPmMMpbijC2/c2lzfpVKhfr162PevHn51s39fLSyssKePXuwc+dObNq0CVu2bMHq1avRrl07bN26tcBzlTS6/k6Ry+WFuv0GUUnDJI+oFOratSsWLVqEuLg4BAQEvLKuh4cHVCoVLl26hLp160rlycnJSElJgYeHR6FicHBwQHh4OMLDw5Geno7WrVtj+vTpePfdd6U2L1y4oPG68+fPw9HREeXKlcu33dxNIipVqlTgveoK48svv8Sff/6JmTNnYsGCBQBeJDzm5uZYsWKFxheWffv24fvvv8eNGzfyHd0EXkzrnDFjBurWraux6UZxKVeunNr/ge3bt8PKygotWrTQqHv37l3s3LkTw4YNe+19qVauXAmZTJZv8jpp0iQMHjw439e9/CXq+fPn6NatGy5evIjt27fDy8tLo36VKlXg5OSU7w3N89vMRKVSYejQoYiNjcWaNWvQpk0bjdeZmJigfv36+bZ56NAhVK9eXevpzi9bt24dqlevjvXr16slXVFRUfnWz28688WLF6UkWJf3SYUKFdR2sMyV3zTA4hxRBl5MzxRC4MmTJ7CysoK3tzfMzMxw5MgR9O/fX6qXlZWFhIQEtbKSzMnJCdbW1gX2j4mJicaoYmEVZ5/VqFEDJ06cQPv27V97XhMTE7Rv3x7t27fHvHnzMGvWLEydOhU7d+587edzQf//c3dkzU/ue+Ly5cuoVq2aVP7w4UON0VAPDw9cvnxZo428ZYb6nUJU0vFPFUSl0KRJk1CuXDm8++67SE5O1jh+5coVfPfddwCAzp07AwDmz5+vVif3r7hdunTR+fwPHz5Ue25jY4OaNWtK07MqV64MX19fLFu2TO2L6enTp7F161YppvwEBwfD1tYWs2bNQnZ2tsbx121HXpAaNWqgT58+iImJQVJSEoAXiUyrVq0QGhqKvn37qj0mTpwIANK6u/y8++67iIqKyneLcmM4cOAA1q9fj+HDh0tT2172+++/Q6VSvXaqZnZ2NtauXYuWLVvmm+B6eXkhKCgo30fumjelUonQ0FDExcVh7dq1r/xjRJ8+ffDPP/+oTX2LjY3FxYsXNXY4HT16NFavXo2ffvoJvXv3LrDNvn374vDhw2qJ3oULF7Bjxw6NNrW9hULuHwJeHhU5dOgQ4uLi8q2/YcMG3L59W3oeHx+PQ4cOISQkBIBu75MaNWogNTVVbVr03bt3NXbHBV4k/vklhEWV31TplJQU/PHHH3Bzc0OlSpUAvJgeGBQUhF9//VVtWvmKFSuQnp5e4K61JY2pqSk6duyIjRs3qm3Hn5ycjFWrVqFly5Zqt4goitxk3hD9llf//v1x+/ZtLF68WOPYs2fPpCnCjx490jie+0eX/Kbi5hUXF6e2VvXmzZvYuHEjOnbsWOAoYPv27WFmZoaff/5ZrfzHH3/UqBscHIy4uDgkJCRIZY8ePZLWEr9czxC/U4hKOo7kEZVCNWrUwKpVq6QttIcOHQpvb29kZWXhwIEDWLt2rbRGxsfHB2FhYVi0aBFSUlLQpk0bxMfHY9myZejZsycCAwN1Pr+Xlxfatm0LPz8/ODg44MiRI1i3bh1GjRol1fn6668REhKCgIAADB8+XNoa3s7OTuM+VC+ztbXFzz//jCFDhqBRo0YYMGAAnJyccOPGDWzatAktWrTI9xe+NiZOnIg1a9Zg/vz56NWrFy5fvqwW88uqVKmCRo0aYeXKlfj444/zrePh4fHKa8l17do1VKtWDWFhYYiJiXll3ZMnT+Kvv/4C8OIv0qmpqZgxYwaAF33ZrVs3AC9GcPr374/u3bvDxcUFZ86cwYIFC9CgQQPMmjUr37ZXrlwJV1dXtG3b9pUx/Pfff3j48GGRNlwZP348/vrrL3Tr1g2PHj3Cr7/+qnb85ZHATz75BGvXrkVgYCDGjh2L9PR0fP3116hfvz7Cw8OlevPnz8dPP/2EgIAAWFtba7TZq1cv6cvyhx9+iMWLF6NLly6YMGECzM3NMW/ePDg7O0ubDuXS9hYKXbt2xfr169GrVy906dIFiYmJWLBgAby8vJCenq5Rv2bNmmjZsiVGjhyJzMxMzJ8/HxUrVlTbJEbb98mAAQPw8ccfo1evXhgzZoy0BXytWrU0Nn3x8/PD9u3bMW/ePLi6uqJatWoaW/2/7O+//8aJEycAvEjwT548Kf2f6969u7QmMyQkBFWrVoW/vz8qVaqEGzduYOnSpbhz547GLQJmzpyJ5s2bo02bNnjvvfdw69YtfPPNN+jYsSM6der0yp9zSTJjxgzpXnEffvghzMzMsHDhQmRmZuKrr77S23lyNygZM2YMgoODYWpqigEDBuit/ZcNGTIEa9aswQcffICdO3eiRYsWUCqVOH/+PNasWYP//vsPjRs3xueff449e/agS5cu8PDwwL179/DTTz+hatWqaNmy5WvP4+3tjeDgYLVbKADAZ599VuBrnJ2dMXbsWHzzzTfo3r07OnXqhBMnTuDff/+Fo6Oj2sjjpEmT8Ouvv6JDhw4YPXq0dAsFd3d3PHr0SKpryN8pRCWakXb1JCI9uHjxohgxYoTw9PQUFhYWonz58qJFixbihx9+UNt2Pjs7W3z22WeiWrVqwtzcXLi5uYkpU6ZobE2fe4uAvNq0aSPatGkjPZ8xY4Zo2rSpsLe3F1ZWVqJOnTpi5syZatudCyHE9u3bRYsWLYSVlZWwtbUV3bp1E2fPnlWrk3cL7Vw7d+4UwcHBws7OTlhaWooaNWqIYcOGqW3JnZ/crdLXrl2b7/G2bdsKW1tbMWzYMAFAbWv0vHK37T5x4oQQouCfT37X8/ItFE6dOqX1tty5r8/v8fL24Y8ePRI9evQQLi4uwsLCQlSrVk18/PHHGrdUyHX+/HkBQERGRr42hgEDBghzc3O1bf11lXtbgoIeeZ0+fVp07NhRWFtbC3t7e/H222+LpKQktTq525sX9Mj7f+jmzZuib9++wtbWVtjY2IiuXbuKS5cuFRjr66hUKjFr1izh4eEh5HK5aNiwofjnn380tuLPvYXC119/Lb755hvh5uYm5HK5aNWqlfR/6WXavE+EEGLr1q3C29tbWFhYiNq1a4tff/0131sonD9/XrRu3VpYWVlp/L/Jz6t+rkuXLpXq/fjjj6Jly5bC0dFRmJmZCScnJ9GtW7d8b5UghBB79+4VzZs3F5aWlsLJyUlEREQU+P/zZQW9hwu6PUnuz+Dlrf71dQsFIYQ4duyYCA4OFjY2NsLa2loEBgaKAwcOaBVbfufNT05Ojhg9erRwcnISMplMrU/zxpTf9eZeT7ly5TTabtOmjahXr55aWVZWlpgzZ46oV6+ekMvlokKFCsLPz0989tlnIjU1VQghRGxsrOjRo4dwdXUVFhYWwtXVVQwcOFBcvHjxldeSG3NERIT49ddfxVtvvSW9X/L+HPL7/M/JyRGffvqpcHFxEVZWVqJdu3bi3LlzomLFiuKDDz5Qe/3x48dFq1athFwuF1WrVhWzZ88W33//vQCg8fmhze+Ugn6GRKWRTIgSsFKZiKgM++mnnzBp0iRcuXJFugk2ERFpJyUlBRUqVMCMGTMwderUV9YdN24cFi5ciPT09FKzOQyRIXBNHhGRge3cuRNjxoxhgkdE9Br53Ucxd0153qnmees+fPgQK1asQMuWLZng0RuPI3lEREREVCLExMQgJiYGnTt3ho2NDfbt24fffvsNHTt2xH///adW19fXF23btkXdunWRnJyM6Oho3LlzB7GxsWjdurWRroCoZODGK0RERERUIjRo0ABmZmb46quvkJaWJm3GkrsZ0Ms6d+6MdevWYdGiRZDJZGjUqBGio6OZ4BGBI3lERERERERlCtfkERERERERlSFM8oiIiIiIiMoQrskrgEqlwp07d1C+fHm1m28SEREREREZgxACT548gaurK0xMCh6vY5JXgDt37sDNzc3YYRAREREREam5efMmqlatWuBxJnkFKF++PIAXP0BbW1sjR0NERERERG+6tLQ0uLm5SblKQZjk5aFQKKBQKKBUKgEAtra2TPKIiIiIiKjEeN1yMt5CoQBpaWmws7NDamoqkzwiIiIiIjI6bXMU7q5JRERERERUhjDJIyIiIiIiKkOY5OWhUCjg5eWFJk2aGDsUIiIiIiIinXFNXgG4Jo+IiIiIiEoSrskjIiIiIiJ6AzHJIyIiIiIiKkOY5BEREREREZUhTPKIiIiIiIjKECZ5eXB3TSIiIiIiKs24u2YBuLsmERERERGVJNrmKGbFGBMRERERERUg4u1jxg6B8lCsbGTsEAqF0zWJiIiIiIjKkDKR5PXq1QsVKlRA37591cr/+ecf1K5dG2+99RZ++eUXI0VHRERERERUfMpEkjd27FgsX75crSwnJweRkZHYsWMHjh8/jq+//hoPHz40UoRERERERETFo0wkeW3btkX58uXVyuLj41GvXj1UqVIFNjY2CAkJwdatW40UIRERERERUfEwepK3Z88edOvWDa6urpDJZNiwYYNGHYVCAU9PT1haWsLf3x/x8fGvbffOnTuoUqWK9LxKlSq4ffu2PkMnIiIiIiIqcYye5GVkZMDHxwcKhSLf46tXr0ZkZCSioqJw7Ngx+Pj4IDg4GPfu3SvmSImIiIiIiEo+oyd5ISEhmDFjBnr16pXv8Xnz5mHEiBEIDw+Hl5cXFixYAGtrayxZsuSV7bq6uqqN3N2+fRuurq4F1s/MzERaWprag4iIiIiIqLQxepL3KllZWTh69CiCgoKkMhMTEwQFBSEuLu6Vr23atClOnz6N27dv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TdfUNsEDAHNz81Kf4BEREREREZVWhdpdc+/evRg8eDACAgJw+/ZtAMCKFSuwb98+vQZHREREREREutE5yfvjjz8QHBwMKysrHD9+HJmZmQCA1NRUzJo1S+8BEhERERERkfZ0TvJmzJiBBQsWYPHixWobsLRo0QLHjnEeMRERERERkTHpnORduHABrVu31ii3s7NDSkqKPmIyKoVCAS8vLzRp0sTYoRAREREREelM5yTPxcUFly9f1ijft28fqlevrpegjCkiIgJnz57F4cOHjR0KERERERGRznRO8kaMGIGxY8fi0KFDkMlkuHPnDlauXIkJEyZg5MiRhoiRiIiIiIiItKTVzdBfNnnyZKhUKrRv3x5Pnz5F69atIZfLMWHCBIwePdoQMRIREREREZGWdB7Jk8lkmDp1Kh49eoTTp0/j4MGDuH//Pr744gtDxFck3377LerVqwcvLy+MGTMGWtz3nYiIiIiIqFTTeSQvl4WFBby8vPQZi17dv38fP/74I86cOQNzc3O0bt0aBw8eREBAgLFDIyIiIiIiMhitkrzevXtr3eD69esLHYy+5eTk4Pnz5wCA7OxsVKpUycgRERERERERGZZW0zXt7Oy0fujLnj170K1bN7i6ukImk2HDhg0adRQKBTw9PWFpaQl/f3/Ex8dLx5ycnDBhwgS4u7vD1dUVQUFBqFGjht7iIyIiIiIiKom0GslbunSpoePQkJGRAR8fH7zzzjv5jiSuXr0akZGRWLBgAfz9/TF//nwEBwfjwoULqFSpEh4/fox//vkH165dg5WVFUJCQrBnz5587/FHRERERERUVui88UpxCQkJwYwZM9CrV698j8+bNw8jRoxAeHg4vLy8sGDBAlhbW2PJkiUAgO3bt6NmzZpwcHCAlZUVunTpgoMHDxZ4vszMTKSlpak9iIiIiIiISptCJXnr1q1D//790axZMzRq1EjtURyysrJw9OhRBAUFSWUmJiYICgpCXFwcAMDNzQ0HDhzA8+fPoVQqsWvXLtSuXbvANmfPnq027dTNzc3g10FERERERKRvOid533//PcLDw+Hs7Izjx4+jadOmqFixIq5evYqQkBBDxKjhwYMHUCqVcHZ2Vit3dnZGUlISAKBZs2bo3LkzGjZsiAYNGqBGjRro3r17gW1OmTIFqamp0uPmzZsGvQYiIiIiIiJD0PkWCj/9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W6FQQKFQQKlU6iFSIiIiIiKi4qVzkpeYmGiIODSkp6fj8uXLaudNSEiAg4MD3N3dERkZibCwMDRu3BhNmzbF/PnzkZGRIe22WVgRERGIiIjgSB4REREREZVKhbpPXnE4cuQIAgMDpeeRkZEAgLCwMMTExCA0NBT379/HtGnTkJSUBF9fX2zZskVjMxZdcSSPiIiIiIhKM62SvMjISHzxxRcoV66clGwVZN68eXoJrG3bthBCvLLOqFGjijw9My+O5BERERERUWmmVZJ3/PhxZGdnS/8uyMs3Ri+tOJJHRERERESlmVZJ3s6dO/P9d1nEkTwiIiIiIirNdL5PHhEREREREZVcTPLyUCgU8PLyQpMmTYwdChERERERkc6Y5OURERGBs2fP4vDhw8YOhYiIiIiISGdM8oiIiIiIiMoQJnl5cLomERERERGVZlrfDH3Pnj1a1WvdunWhgykJuLsmERERERGVZloneW3btpXug1fQTcplMhnvL0dERERERGREWid5FSpUQPny5TFs2DAMGTIEjo6OhoyLiIiIiIiICkHrNXl3797FnDlzEBcXh/r162P48OE4cOAAbG1tYWdnJz2IiIiIiIjIeLRO8iwsLBAaGor//vsP58+fR4MGDTBq1Ci4ublh6tSpyMnJMWScxYYbrxARERERUWlWqN013d3dMW3aNGzfvh21atXCl19+ibS0NH3HZhS8Tx4REREREZVmOid5mZmZWLVqFYKCguDt7Q1HR0ds2rQJDg4OhoiPiIiIiIiIdKD1xivx8fFYunQpfv/9d3h6eiI8PBxr1qxhckdERERERFSCaJ3kNWvWDO7u7hgzZgz8/PwAAPv27dOo1717d/1FR0RERERERDrROskDgBs3buCLL74o8Djvk0dERERERGRcWid5KpXKkHGUGAqFAgqFgskqERERERGVSoXaXTM/KpUK//zzj76aMxrurklERERERKWZTtM183P58mUsWbIEMTExuH//PrKzs/URFxERERERERVCoUbynj17huXLl6N169aoXbs2Dhw4gGnTpuHWrVv6jo+IiIiIiIh0oFOSd/jwYbz//vtwcXHB/Pnz0aNHD8hkMvz000/44IMP4OzsbKg4C+3p06fw8PDAhAkTjB0KERERERGRwWk9XbNBgwZIS0vDoEGDcODAAdSrVw8AMHnyZIMFpw8zZ85E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\n" }, "metadata": {} } ], "source": [ "#| echo: false\n", "#@title ๐Ÿ“Š Console RAM over time โ€” chart (click to show code)\n", "consoles = [\"Atari 2600\\n1977\", \"NES\\n1983\", \"SNES\\n1990\",\n", " \"N64\\n1996\", \"PS2\\n2000\", \"PS5\\n2020\"]\n", "ram_bytes = [128, 2_048, 131_072, 4_194_304, 33_554_432, 17_179_869_184]\n", "\n", "plt.figure(figsize=(9, 4))\n", "plt.bar(consoles, ram_bytes, color=\"slateblue\")\n", "plt.yscale(\"log\")\n", "plt.ylabel(\"RAM in bytes (log scale)\")\n", "plt.title(\"Console RAM, 1977โ€“2020: about 130 million times bigger\")\n", "plt.tight_layout()\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### ๐Ÿ’ญ Think About It โ€” When the Hardware Outlives the Software\n", "\n", "Old consoles and cartridges show how tightly software used to be bound to one specific machine.\n", "\n", "- Games written for a 1985 console often can't run today without emulation. Whose job is it โ€” if anyone's โ€” to keep old software playable: companies, museums, hobbyists, or no one?\n", "- Binding software tightly to specific hardware made old games fast but fragile. Where else in life do you see a trade-off between squeezing out maximum performance now and keeping flexibility for later?\n", "- Think of a device or file format you once owned that became unusable when the hardware around it changed. What did that cost you?\n", "\n", "There are no single right answers here โ€” share a sentence or two on each." ] }, { "cell_type": "markdown", "id": "nb2-29-consoles-closer", "metadata": { "id": "nb2-29-consoles-closer" }, "source": [ "From the Atari 2600 to the PS5, RAM grew **roughly 130 million-fold**, CPU clock about 3,000-fold, and storage moved through three physical technologies (cartridge โ†’ optical disc โ†’ SSD). And yet: every one of these machines is a von Neumann computer running a fetchโ€“decodeโ€“execute loop over the registers, ALU, and memory we just diagrammed.\n", "\n", "**The architecture is the constant. The magnitudes are the variable.** Hold onto that โ€” it is the single most useful idea for understanding any computer you will ever meet, from a 1977 console to whatever ships in 2040." ] }, { "cell_type": "markdown", "id": "nb2-30-binary-intro", "metadata": { "id": "nb2-30-binary-intro" }, "source": [ "## Counting in Binary and Hexadecimal\n", "\n", "The CPU only has transistors, and a transistor only knows two states. So every number must be written using only **two digits: 0 and 1**. This is **binary** (base 2).\n", "\n", "You already know base 10. In `375`, each position is a power of ten: 3ร—100 + 7ร—10 + 5ร—1. Binary works the same way, but each position is a power of **two**. A group of 8 bits is a **byte**, with these place values:" ] }, { "cell_type": "code", "execution_count": 9, "id": "nb2-31-placevalue", "metadata": { "cellView": "form", "jupyter": { "source_hidden": true }, "id": "nb2-31-placevalue", "outputId": "a6fb5849-d880-457e-d588-0eb6831506fb", "colab": { "base_uri": "https://localhost:8080/", "height": 409 } }, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "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pdzHLvij6s+PYeHChZJk13OwLFxcXDRgwABt2rSpyD8EC65vr169tG/fPpsvGMnKytKKFSvUqFEjhYeHF3uOJk2a6LvvvrP5tsGvvvpKn332WQU+kvK5cOGCze1atWqpadOmRU4jAsqDkVugjDZv3mwdIUlNTdWaNWt0/PhxPf744/L29r7m4/fs2VNubm7q27evNZSuXLlSgYGBRb6tX5JbbrlFERERWrt2rVq0aKFbb721TPd74okntHbtWnXr1k3jxo1TZmamnn32WbVq1UrDhw+36fvGG2/oxIkT1rV6d+/erTlz5ki6Gq4LRpEeeughrVy5Ur1799Zjjz2m6tWra+HChQoKCrJ+UEe6Os1i9uzZiouL0z333KOYmBh98sknevPNNzV37lybNWjT09OtX8tb8Mv5xRdflK+vr3x9ffXwww9b+z777LPq16+fevbsqSFDhigxMVEvvviiRo0aVeiPkoL6C9ZqfeONN/Tpp59Kks0yal9//bU2btwo6eqSR+np6db7RkZGqm/fvmW63mUVHh6uH374QcHBwXYfo0+fPnrjjTfk4+Oj8PBw7dmzRx999JHNN8RJ0uTJk/XGG2/ojjvu0Lhx46xLgTVs2NBmPmTBurPz589Xnz591KtXL3355ZfavHmz6tSpU2o9np6eCg8P1zvvvKObbrpJfn5+ioiIKHXe6R916dJFDz74oObPn6/Dhw+rZ8+eql69uo4fP661a9fqhRdeKNcfMJGRkYqNjdWKFSuUlpamLl26aN++fXrttdc0YMAAdevWrczHKq958+Zp69at6tKli8aMGaMWLVro7NmzWrt2rT799FP5+vrq8ccf11tvvaU777xTY8eOlZ+fn1577TUlJSXpP//5j1xcih+vGjFihBYuXKiYmBiNHDlSqampWr58uVq2bGnzodbKFB4erq5du6pNmzby8/PTgQMHtG7dOpvXL2AXxyzSAFQdRS0F5uHhYbRu3dqIj4+3WQbJMIpfCuzcuXNFHvePS1ht3LjRuPnmmw0PDw+jUaNGxoIFC4xXX321UL+GDRuWuoTOM888Y0gy5s2bV67Hm5iYaPTs2dOoUaOG4evrawwdOtRITk4u1K9Lly5FLpGmIpbQOnXqlHH33Xcb3t7eRq1atYw+ffoYx48fL/L8K1asMJo3b264ubkZTZo0MRYtWlToGhcsV1TU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\n" }, "metadata": {} }, { "output_type": "stream", "name": "stdout", "text": [ "Sum of the 'on' columns: 75\n" ] } ], "source": [ "#| echo: false\n", "#@title ๐Ÿ“Š Binary place values โ€” chart (click to show code)\n", "places = [128, 64, 32, 16, 8, 4, 2, 1]\n", "byte = [0, 1, 0, 0, 1, 0, 1, 1] # the binary number 01001011\n", "values = [bit * place for bit, place in zip(byte, places)]\n", "\n", "plt.figure(figsize=(8, 4))\n", "plt.bar([str(p) for p in places], places, color=\"lightgray\") # all columns\n", "bars = plt.bar([str(p) for p in places], values, color=\"teal\") # 'on' columns\n", "for bar, bit in zip(bars, byte):\n", " plt.text(bar.get_x() + bar.get_width()/2, 4, str(bit), ha=\"center\")\n", "plt.title(\"Binary 01001011 โ†’ add the 'on' columns\")\n", "plt.ylabel(\"contribution\")\n", "plt.show()\n", "\n", "print(\"Sum of the 'on' columns:\", sum(values))" ] }, { "cell_type": "markdown", "id": "nb2-cap-place", "metadata": { "id": "nb2-cap-place" }, "source": [ "**Reading it:** each bar is a place value (a power of two). A bit of `1` switches its column *on*; add the lit columns to get the number. The worked example next does exactly this." ] }, { "cell_type": "markdown", "id": "nb2-32-binary-worked", "metadata": { "id": "nb2-32-binary-worked" }, "source": [ "### Worked Example: `01001011` โ†’ decimal\n", "\n", "Walk left to right. Wherever the bit is 1, add that column's place value:\n", "\n", "| Bit | 0 | 1 | 0 | 0 | 1 | 0 | 1 | 1 |\n", "|---|---|---|---|---|---|---|---|---|\n", "| Place | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |\n", "| Add? | โ€” | 64 | โ€” | โ€” | 8 | โ€” | 2 | 1 |\n", "\n", "**64 + 8 + 2 + 1 = 75.** Going the other way (decimal โ†’ binary): repeatedly subtract the largest place value you can.\n", "\n", "An 8-bit byte holds 0 through 255 โ€” that's 2โธ = 256 different values. Remember that 255. Tobble certainly does." ] }, { "cell_type": "code", "execution_count": 10, "id": "nb2-33-binary-python", "metadata": { "cellView": "form", "id": "nb2-33-binary-python", "outputId": "15e426d4-62f9-404c-d74e-b1a98f0358ce", "colab": { "base_uri": "https://localhost:8080/" } }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "75 in binary: 01001011\n", "75 in hex: 4B\n", "int('01001011', 2) = 75\n" ] } ], "source": [ "#| echo: false\n", "#@title ๐Ÿ”ข Letting Python check binary/hex by hand (click to show code)\n", "# Python can convert for you โ€” useful for CHECKING hand work, not replacing it.\n", "n = 75\n", "print(f\"{n} in binary: {n:08b}\") # :08b -> binary, padded to 8 digits\n", "print(f\"{n} in hex: {n:02X}\") # :02X -> hex, 2 digits, uppercase\n", "\n", "from_binary = int(\"01001011\", 2) # the 2 means 'read this string as base 2'\n", "print(\"int('01001011', 2) =\", from_binary)" ] }, { "cell_type": "markdown", "id": "nb2-35-hex-intro", "metadata": { "id": "nb2-35-hex-intro" }, "source": [ "### Hexadecimal: Binary for Humans\n", "\n", "**Pip Renderwick**, the studio's sprite and audio artist โ€” who can draw a dragon in 8ร—8 pixels and insists it's *clearly* a dragon โ€” never writes binary by hand. She uses **hexadecimal** (base 16).\n", "\n", "Long binary strings are error-prone for humans (`01001011` โ€” did you miscount?). Hex fixes this because **exactly 4 bits = 1 hex digit**. Hex needs 16 digit symbols, so after 9 it borrows letters:\n", "\n", "| Dec | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |\n", "|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|\n", "| Hex | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |\n", "\n", "So `01001011` splits into `0100` (= 4) and `1011` (= B) โ†’ **`4B`**. Two readable characters instead of eight bits. This is why colors look like `#4B2C9F` and memory addresses look like `0x1A3F`." ] }, { "cell_type": "code", "execution_count": 11, "id": "nb2-36-hexstrip", "metadata": { "cellView": "form", "jupyter": { "source_hidden": true }, "id": "nb2-36-hexstrip", "outputId": "bf07e8cc-fa9f-4574-c1b9-8c4671380499", "colab": { "base_uri": "https://localhost:8080/", "height": 244 } }, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "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nIiOHTvCy8sL586dw+jRo9GnTx/FfirVt29fTJ48GU2bNkWtWrUwY8YMuLm56T+FV5qHDx9i27ZtWLNmjdxRiuTs7Ix69ephwoQJcHFxgaurK+bOnQudTocmTZrIHc+kw4cPIz09HVWrVkV0dDS++OILDB48GB4eHnJHA1D0+0LXrl0xefJkjB49GgMHDsSiRYuQmZmJbt26KS6rp6cnrl27hrS0NCQmJiIlJQWnTp2CpaWlpO/7UuUt+E6FWbNmoVatWvr3ODs7O/3VH0rKu3r1anh5eSEoKAhqtRobN27E3r17sXnzZlmyFpf36UFOHB0dkZuba/K9r7QU17++vr6oWbMm0tLSMG3aNJiZmSlqKOxn8qLDVqWmporu3bsLW1tbUaZMGfHtt98aDBWbk5MjJk2aJHx9fYWFhYUoW7as+OCDD8SZM2f064iKihJvv/22sLKyEk5OTiI8PFw8fvxYCGF6eNunh9MDIDZt2qR/fPPmTQFAxMTECCHyh+5s27atsLOzEx4eHmLChAmiZ8+eom3btvplXnR4W51OJ7744gvh5uYmbG1txUcffaR/DUpU0EdP/0yePFnuaEZM5QQgbt68KXc0kzIzM0X79u1FuXLlhKWlpfDw8BDt27dX5JCbpkDBw9tmZGSIJk2aCGdnZ2FhYSEqVaokxo8fLzIyMuSOViitVivGjRsnypQpIzQajQgNDRWnTp2SO1ahpk2bJtzc3EROTo7cUYp1584d0alTJ+Hu7i7s7OxEgwYNxJ9//il3rEL98ccfomLFisLCwkJ4e3uLCRMmiNzcXLlj6RX3vhAZGSlq1KghLC0tRWBgoNi/f79is4aFhRlN8/HxUWTeiIgIxb0fF5X3hx9+EDVq1BB2dnZCo9GIWrVqiVWrVsmWtbi8T1PC8LZF5Z0+fbooX768sLKyEq6urqJVq1biwoULsuZ9ESoh/h0DloiIiIiISCKK/2ZwIiIiIiJ69bDQICIiIiIiybHQICIiIiIiybHQICIiIiIiybHQICIiIiIiybHQICIiIiIiybHQICIiIiIiybHQICIiIiIiybHQICIiIiIiybHQICIiIiIiybHQICIiIiIiybHQICIiIiIiybHQICIiIiIiybHQICIiIiIiybHQICIiIiIiybHQICIiIiIiybHQICIiIiIiybHQICIiIiIiybHQICIiIiIiybHQICIiIiIiybHQICIiIiIiybHQICIiIiIiybHQICIiIiIiybHQICIiIiIiybHQICIiIiIiybHQICIiIiIiybHQICIiIiIiybHQICIiIiIiybHQICIiIiIiybHQICIiIiIiybHQICIiIiIiybHQICIiIiIiybHQICIiIiIiybHQICIiIiIiybHQICIiIiIiybHQICIiIiIiybHQICIiIiIiyf0/GtSudPqusbIAAAAASUVORK5CYII=\n" }, "metadata": {} } ], "source": [ "#| echo: false\n", "#@title ๐Ÿ“Š Hex and binary table โ€” figure (click to show code)\n", "fig, ax = plt.subplots(figsize=(10, 2.4))\n", "for d in range(16):\n", " ax.text(d, 1.0, f\"{d:04b}\", ha=\"center\", family=\"monospace\")\n", " ax.text(d, 0.6, f\"{d:X}\", ha=\"center\", family=\"monospace\",\n", " color=\"crimson\", fontsize=14)\n", " ax.text(d, 0.2, str(d), ha=\"center\", family=\"monospace\")\n", "ax.text(-1.6, 1.0, \"binary\", ha=\"left\")\n", "ax.text(-1.6, 0.6, \"hex\", ha=\"left\")\n", "ax.text(-1.6, 0.2, \"decimal\", ha=\"left\")\n", "ax.set_xlim(-1.7, 16); ax.set_ylim(0, 1.3); ax.axis(\"off\")\n", "ax.set_title(\"One reference strip: 4 bits โ†” 1 hex digit\")\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "nb2-cap-hex", "metadata": { "id": "nb2-cap-hex" }, "source": [ "**Reading it:** read any column top-to-bottom โ€” 4 binary digits, one hex digit, one decimal value. That 4-bits-to-1-hex-digit mapping is the entire trick of hexadecimal." ] }, { "cell_type": "markdown", "id": "nb2-37-hex-closer", "metadata": { "id": "nb2-37-hex-closer" }, "source": [ "Hex isn't a *different* number system from binary in any deep sense โ€” it's a compact, human-friendly way to write the same bits. You'll see it constantly: colors, memory addresses, error codes, file signatures. You'll drill it in the arcade shortly." ] }, { "cell_type": "markdown", "id": "nb2-38-twos-problem", "metadata": { "id": "nb2-38-twos-problem" }, "source": [ "## Representing Negative Numbers\n", "\n", "Tobble hits a wall. *Quest for the Reasonably Priced Sword* needs to track when the hero falls in a pit: **โˆ’50 points**. But a byte is just eight 0s and 1s. **Where does the minus sign go?**\n", "\n", "**Naive idea โ€” a \"sign bit\":** use the leftmost bit as a sign (0 = positive, 1 = negative), the other 7 bits as the size. This is *sign-magnitude*, and it almost works โ€” but it has two ugly problems:\n", "\n", "- There are **two zeros**: `00000000` (+0) and `10000000` (โˆ’0). Wasteful, and it breaks comparisons.\n", "- The hardware needs special cases โ€” the simple adder from earlier stops working.\n", "\n", "Computers use a cleverer scheme with only one zero, where the *same* adder handles positive and negative numbers: **two's complement**." ] }, { "cell_type": "markdown", "id": "nb2-39-twos-rule", "metadata": { "id": "nb2-39-twos-rule" }, "source": [ "### The Two's Complement Rule\n", "\n", "In an 8-bit two's-complement system:\n", "\n", "- The leftmost bit still signals sign: **0 = non-negative, 1 = negative**.\n", "- **Positive numbers** look exactly like normal binary (`00000101` = 5).\n", "- To get **โˆ’x**: take the binary for `x`, **flip every bit**, then **add 1**.\n", "\n", "That's the whole rule: **invert, then add one.** The range an 8-bit byte can hold shifts to **โˆ’128 through +127** (still 256 distinct values, still one zero).\n", "\n", "Why does it work? Because \"invert and add 1\" makes `x + (โˆ’x)` overflow cleanly to zero in 8 bits โ€” so the ordinary adder just works, with no special cases. The hardware never even knows the number was \"negative.\"" ] }, { "cell_type": "markdown", "id": "nb2-40-twos-encode", "metadata": { "id": "nb2-40-twos-encode" }, "source": [ "### Worked Example 1: encode **โˆ’37** as an 8-bit byte\n", "\n", "| Step | Result |\n", "|---|---|\n", "| 1. Write +37 in binary | `00100101` |\n", "| 2. Flip every bit | `11011010` |\n", "| 3. Add 1 | `11011011` |\n", "\n", "So **โˆ’37 = `11011011`**. The leftmost bit is 1, correctly signaling \"negative.\"\n", "\n", "**Check:** add `00100101` (+37) and `11011011` (โˆ’37) column by column, discard any 9th-bit carry โ†’ `00000000`. A number plus its negative is zero, exactly as it should be." ] }, { "cell_type": "markdown", "id": "nb2-41-twos-decode", "metadata": { "id": "nb2-41-twos-decode" }, "source": [ "### Worked Example 2: decode `11011011` back to a signed number\n", "\n", "The leftmost bit is **1**, so this byte is negative. Reverse the process to find the magnitude:\n", "\n", "| Step | Result |\n", "|---|---|\n", "| Given byte (leftmost bit 1 โ†’ negative) | `11011011` |\n", "| 1. Flip every bit | `00100100` |\n", "| 2. Add 1 | `00100101` |\n", "| 3. Read that magnitude in decimal | 37 |\n", "| 4. Apply the negative sign | **โˆ’37** |\n", "\n", "**Exam tip:** leftmost bit 0 โ†’ just read it as normal binary. Leftmost bit 1 โ†’ *flip and add 1* to get the magnitude, then attach a minus sign. That one rule answers every two's-complement quiz question." ] }, { "cell_type": "markdown", "id": "nb2-int-wheel", "metadata": { "id": "nb2-int-wheel" }, "source": [ "### Picture It: the Two's-Complement Wheel\n", "\n", "The diagram below lays all 16 four-bit patterns around a clock face, with the value each one *means* in the centre. Watch what happens as you pass the halfway point." ] }, { "cell_type": "code", "execution_count": 12, "id": "nb2-42-numberwheel", "metadata": { "cellView": "form", "jupyter": { "source_hidden": true }, "id": "nb2-42-numberwheel", "outputId": "65e00f3e-fc97-44dc-b02c-67edd8c8da71", "colab": { "base_uri": "https://localhost:8080/", "height": 482 } }, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "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/EuXLonExEQBQHz//ffa58+YMUNIpVIRFhamnRYfHy8AiD179gghhNBoNGLcuHFCIpGIpUuXivfff19Mnz5dABDPPfeczvp9fHzEP//5T+3jF198UUgkEvHEE0+ITZs2iTfffFNERkaK119/vdHfV2lpqQgNDRUymUw88cQT4qOPPhKvvvqqGDp0qDhz5owQQojy8nLRp08fYW1tLVasWCHeffddER4eLgCId955p97vfuDAgaJv377irbfeEn//+9+FjY2NGD58uHjxxRfFyJEjxbvvviuWL18uJBKJWLJkSb3XFRgYKLp06SL++te/irfeekv069dPSKVSceDAAe3zYmNjBQARGxurnXb48GFhY2MjRowYId58803x9ttvi/79+wsbGxvxyy+/aJ9X974PHDhQREZGig8//FDcf//9AoB46623RFBQkPjjH/8oPvzwQzFq1CgBQMTFxWnbq9VqMXHiROHg4CCee+458fHHH4tnnnlGWFlZiRkzZui8HgBiwIABwsPDQ7z66qvinXfeEb179xYODg7ixo0bQgghkpKSRGRkpAAg3n77be1nqaysTKfeO19rQwCI0NBQ4eLiIl555RWxbt064ePjI+zt7cXZs2e1z9uyZYsAIK5cuSKEEGL37t3Cy8tLBAcHa9df9/tu7Wfr559/FgDEd999V2/eokWLBADx0EMPiQ8++EAsXLhQABAzZ86s93ru/JzX8fHxEYsWLRJCCHHp0iWxfPlyAUC8+OKL2vrrtvXPP/9cSCQSMXnyZPHee++JdevWCV9fX9GlSxft66+rydbWVvj5+YlFixaJDRs2iM8//1w7v6amRtjb24uVK1c2+rpfeeUVIZVKRU5Ojs70uLg4AUBs375dCCHEgQMHBAAxfvx48cEHH4gPPvhAPPPMM2LOnDmNLl+fvLw84ezsLAIDA8Ubb7whNm3aJF566SXRp08fnefd/ftMTEwUtra2wtfXV7z++uti7dq1wtPTUwwYMEDcvetuzmdZiNv7Ri8vL9GzZ0/xyiuviI8++kg88MAD2s93nfLychEYGCjs7OzE888/L9555x0xZMgQ0b9//yY/7+Xl5cLR0VE89dRT9ebde++9On8v1q9fL8LDw8Urr7wiNm7cKJ599llhb28vhg0bJjQajfZ5d28T+n5fde78/AkhhEqlEv379xfdunUTL774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qbTtcnNzxaRJk4S9vb3o3bu32LNnj85yfXx86i33ypUr7fjKqDkaex8bew8b+9w01ZbI3PBW0URERKQXDzcQERGRXgwJREREpBdDAhEREenFkEBkpoxxg6um2hKReWFIIDJTxrjBVVNtici8MCQQmamIiAg89NBDcHNz05keFRWFyZMnY/To0VAqlVi1ahW++uorAEBpaSn27NmDl156CXK5HLNnz0ZgYCCio6ObbEtE5ochgcjCtOUGV421JSLzw5BAZGHacoOrxtoSkflhSCCyMG25wVVjbYnI/DAkEFmYttzgqrG2RGR+GBKIzJQxbnDVWFsiMkOmvnkEERmHsW5w1VhbIjIvvMETERER6cXDDURERKQXQwIRERHpxZBAREREejEkEBERkV4MCURERKQXQwIRERHpxZBAREREejEkEBERkV4MCURERKQXQwIRERHpxZBAREREejEkEBERkV4MCURERKQXQwIRERHpxZBAREREejEkEBERkV4MCURERKQXQwIRERHpxZBAREREejEkEBERkV4MCURERKQXQwIRERHpxZBAREREejEkEBERkV4MCURERKQXQwIRERHpxZBAREREejEkEBERkV4MCURERKQXQwIRERHpxZBAREREejEkEBERkV4MCURERKQXQwIRERHpxZBAREREejEkEBERkV4MCURERKQXQwIRERHpxZBAREREejEkEBERkV4MCURERKQXQwIRERHpxZBAREREejEkEBERkV4MCURERKQXQwIRERHpxZBAREREejEkEBERkV4MCURERKQXQwIRERHp9f9Iu9l8z3dkQAAAAABJRU5ErkJggg==\n" }, "metadata": {} } ], "source": [ "#| echo: false\n", "#@title ๐Ÿ• Two's-complement clock โ€” figure (click to show code)\n", "import numpy as np\n", "\n", "fig, ax = plt.subplots(figsize=(5.5, 5.5))\n", "for raw in range(16):\n", " angle = np.pi/2 - raw * (2*np.pi/16)\n", " x, y = np.cos(angle), np.sin(angle)\n", " signed = raw if raw < 8 else raw - 16 # 4-bit two's complement\n", " ax.text(x*1.18, y*1.18, f\"{raw:04b}\", ha=\"center\", va=\"center\",\n", " family=\"monospace\", fontsize=9)\n", " ax.text(x*0.85, y*0.85, str(signed), ha=\"center\", va=\"center\",\n", " color=(\"navy\" if signed >= 0 else \"crimson\"),\n", " fontsize=13, fontweight=\"bold\")\n", "ax.add_patch(plt.Circle((0, 0), 1.0, fill=False, color=\"gray\"))\n", "ax.set_xlim(-1.5, 1.5); ax.set_ylim(-1.5, 1.5)\n", "ax.set_aspect(\"equal\"); ax.axis(\"off\")\n", "ax.set_title(\"4-bit two's complement: bits (outer) vs. signed value (inner)\")\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "nb2-43-twos-fixedwidth", "metadata": { "id": "nb2-43-twos-fixedwidth" }, "source": [ "On the wheel, as the bits climb past the halfway point (`1000`) the *meaning* jumps to the most negative value and climbs back toward โˆ’1 โ€” the numbers wrap like an odometer. Python's own integers don't have this limit (they grow as large as needed), but **fixed-width** values โ€” registers, image pixels, the PixelBox 8's score counter โ€” absolutely do. We can simulate a fixed 8-bit value with a *mask*:" ] }, { "cell_type": "code", "execution_count": 13, "id": "nb2-44-mask", "metadata": { "id": "nb2-44-mask", "outputId": "337e1a33-f926-4b32-9149-a6e5999c58e6", "colab": { "base_uri": "https://localhost:8080/" } }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "-37 stored in 8 bits: 11011011 (raw value 219)\n", "11011011 interpreted as signed: -37\n" ] } ], "source": [ "#| echo: false\n", "#@title โž– Letting Python check two's-complement work (click to show code)\n", "value = -37\n", "byte = value & 0xFF # keep only the lowest 8 bits\n", "print(f\"{value} stored in 8 bits: {byte:08b} (raw value {byte})\")\n", "\n", "raw = 0b11011011\n", "signed = raw - 256 if raw >= 128 else raw # leftmost bit set -> negative\n", "print(\"11011011 interpreted as signed:\", signed)" ] }, { "cell_type": "markdown", "id": "nb2-46-basearcade-setup", "metadata": { "id": "nb2-46-basearcade-setup" }, "source": [ "Here are the notebook's main test-prep tools โ€” two self-grading drills. You don't need to read their code yet (that's Notebook 4); just **run them and practice** until you can hit a streak of 5.\n" ] }, { "cell_type": "code", "metadata": { "cellView": "form", "id": "vvgeXCQ7tAGI" }, "execution_count": 14, "outputs": [], "source": [ "#| echo: false\n", "#@title ๐ŸŽฎ Number-Base Arcade โ€” game code (run this cell, then the one below)\n", "import random\n", "\n", "def base_arcade(rounds=8):\n", " \"\"\"Random conversions among decimal, binary, and hex (values 0โ€“255).\"\"\"\n", " bases = {\n", " \"decimal\": lambda n: str(n),\n", " \"binary\": lambda n: f\"{n:08b}\",\n", " \"hex\": lambda n: f\"{n:02X}\",\n", " }\n", " score = 0\n", " for r in range(1, rounds + 1):\n", " n = random.randint(0, 255)\n", " src, dst = random.sample(list(bases), 2)\n", " guess = input(f\"Round {r}: {src} {bases[src](n)} = ? ({dst}) \").strip().upper()\n", " if guess == bases[dst](n):\n", " print(\"โœ… Correct!\"); score += 1\n", " else:\n", " print(f\"โŒ Answer was {bases[dst](n)}\")\n", " print(f\"\\nFinal score: {score}/{rounds}\")\n" ], "id": "vvgeXCQ7tAGI" }, { "cell_type": "code", "metadata": { "id": "FDnEDzX7tAGI" }, "execution_count": 15, "outputs": [], "source": [ "# โ–ถ TO PLAY: delete the # on the next line, then run this cell.\n", "# Each round converts between decimal, binary, and hex. Drill to a streak of 5.\n", "# base_arcade()\n" ], "id": "FDnEDzX7tAGI" }, { "cell_type": "code", "metadata": { "id": "HPjoE7c9tAGJ" }, "execution_count": 16, "outputs": [], "source": [ "#| echo: false\n", "#@title ๐ŸŽฎ Two's-Complement Arcade โ€” game code (run the cell below, not this one)\n", "import random\n", "\n", "def twos_arcade(rounds=8):\n", " \"\"\"Encode and decode signed 8-bit two's-complement bytes (-128..127).\"\"\"\n", " score = 0\n", " for r in range(1, rounds + 1):\n", " if random.random() < 0.5:\n", " n = random.randint(-128, 127)\n", " correct = f\"{n & 0xFF:08b}\"\n", " guess = input(f\"Round {r}: encode {n} as an 8-bit byte = ? \").strip()\n", " else:\n", " bits = random.randint(0, 255)\n", " correct = str(bits - 256 if bits >= 128 else bits)\n", " guess = input(f\"Round {r}: decode {bits:08b} as a signed number = ? \").strip()\n", " if guess == correct:\n", " print(\"โœ… Correct!\"); score += 1\n", " else:\n", " print(f\"โŒ Answer was {correct}\")\n", " print(f\"\\nFinal score: {score}/{rounds}\")\n" ], "id": "HPjoE7c9tAGJ" }, { "cell_type": "code", "metadata": { "id": "nDFYNrzctAGJ" }, "execution_count": 17, "outputs": [], "source": [ "# โ–ถ TO PLAY: delete the # on the next line, then run this cell.\n", "# Encode and decode signed bytes โ€” the trickiest skill on the quiz. Drill it.\n", "# twos_arcade()\n" ], "id": "nDFYNrzctAGJ" }, { "cell_type": "markdown", "metadata": { "id": "KenYjyWFtAGK" }, "source": [ "### ๐Ÿ’ญ Think About It โ€” Why Hexadecimal Exists\n", "\n", "You just drilled converting among decimal, binary, and hexadecimal.\n", "\n", "- Humans *could* read raw binary if we had to, so why do programmers bother with hexadecimal at all? What does grouping bits into hex digits buy you? (Think about how many binary digits a single hex digit stands in for.)\n", "- We almost certainly count in base 10 because of an accident of human anatomy. What \"anatomy\" makes base 2 the natural choice for a machine built from transistors?\n", "- Imagine a civilization whose computers were built from *three*-state switches instead of two-state ones. How might their everyday number system differ from ours? There's no single right answer โ€” reason it out.\n", "\n", "Share a sentence or two on each.\n" ], "id": "KenYjyWFtAGK" }, { "cell_type": "markdown", "id": "nb2-50-encoding-intro", "metadata": { "id": "nb2-50-encoding-intro" }, "source": [ "## Encoding Text, Images, and Sound\n", "\n", "Pip Renderwick's rule for the whole studio: **\"if it's in the game, it's a number somewhere.\"** Numbers were the easy part โ€” they *are* numbers. The trick is turning everything else into numbers too." ] }, { "cell_type": "markdown", "id": "nb2-51-text", "metadata": { "id": "nb2-51-text" }, "source": [ "### Text = Numbers in a Lookup Table\n", "\n", "A computer stores the letter `A` by agreeing, in advance, that `A` *is* the number 65. That agreement is a **character encoding**. The classic one is **ASCII**: `A` = 65, `B` = 66, `a` = 97, `space` = 32, and so on.\n", "\n", "You met this in Notebook 1's Caesar cipher โ€” `ord()` gives a character's code, `chr()` turns a code back into a character. ASCII only covers 128 characters (enough for English). Modern systems use **Unicode**, extending the same idea to every writing system on Earth plus emoji โ€” `๐Ÿ‰` is just a (large) number with an agreed meaning." ] }, { "cell_type": "code", "execution_count": 18, "id": "nb2-52-ascii", "metadata": { "cellView": "form", "jupyter": { "source_hidden": true }, "id": "nb2-52-ascii", "outputId": "2b993c94-eab3-4754-c992-6a96ae57e058", "colab": { "base_uri": "https://localhost:8080/", "height": 499 } }, "outputs": [ { "output_type": "stream", "name": "stderr", "text": [ "/usr/local/lib/python3.12/dist-packages/IPython/core/pylabtools.py:151: UserWarning: Glyph 127 () missing from font(s) DejaVu Sans.\n", " fig.canvas.print_figure(bytes_io, **kw)\n" ] }, { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "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\n" }, "metadata": {} } ], "source": [ "#| echo: false\n", "#@title ๐Ÿ”ก ASCII grid โ€” figure (click to show code)\n", "codes = np.arange(32, 128).reshape(8, 12) # printable ASCII as an 8x12 grid\n", "fig, ax = plt.subplots(figsize=(10, 5))\n", "ax.imshow(codes, cmap=\"viridis\")\n", "for i in range(8):\n", " for j in range(12):\n", " c = int(codes[i, j])\n", " ax.text(j, i, f\"{chr(c)}\\n{c}\", ha=\"center\", va=\"center\",\n", " color=\"white\", fontsize=8)\n", "ax.set_title(\"Printable ASCII: every character is just a number\")\n", "ax.axis(\"off\")\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "nb2-54-images", "metadata": { "id": "nb2-54-images" }, "source": [ "### Images = Grids of Numbers\n", "\n", "A digital image is a grid of **pixels**, and each pixel is a number. The simplest case: 1 bit per pixel โ€” 0 is background, 1 is drawn. That's exactly how a PixelBox 8 sprite works. Color just means more bits per pixel plus a small **palette** (Vesper only paid for four colors). The image below is rendered straight from a grid of 0s and 1s." ] }, { "cell_type": "code", "execution_count": 19, "id": "nb2-55-sprite", "metadata": { "id": "nb2-55-sprite", "outputId": "a42f11fc-9c9f-4ec7-d547-eccb6fd42402", "colab": { "base_uri": "https://localhost:8080/", "height": 290 } }, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "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\n" }, "metadata": {} } ], "source": [ "# Pip's 8x8 'definitely a dragon' sprite โ€” just a grid of bits.\n", "dragon = [\n", " [0, 0, 1, 1, 0, 0, 0, 0],\n", " [0, 1, 1, 1, 1, 0, 0, 0],\n", " [1, 1, 0, 1, 1, 1, 0, 0],\n", " [1, 1, 1, 1, 1, 1, 1, 0],\n", " [0, 1, 1, 1, 1, 1, 1, 1],\n", " [0, 0, 1, 1, 1, 1, 1, 0],\n", " [0, 1, 1, 0, 0, 1, 1, 0],\n", " [1, 1, 0, 0, 0, 0, 1, 1],\n", "]\n", "\n", "plt.figure(figsize=(3, 3))\n", "plt.imshow(dragon, cmap=\"binary\") # same imshow as the ASCII grid\n", "plt.title(\"8 bytes = one sprite\")\n", "plt.axis(\"off\")\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "nb2-cap-sprite", "metadata": { "id": "nb2-cap-sprite" }, "source": [ "**Reading it:** that picture is literally the 8ร—8 grid of `0`s and `1`s above โ€” `imshow` painted each `1` dark. No image file: the bytes *are* the sprite." ] }, { "cell_type": "markdown", "id": "nb2-56-sound", "metadata": { "id": "nb2-56-sound" }, "source": [ "### Sound = Numbers Over Time\n", "\n", "Sound is a wave. To store it, the computer measures the wave's height many times per second; each measurement is a number โ€” that's **sampling**, and the stored sound is literally just that list of numbers. The PixelBox 8's audio chip is cheap, so instead of smooth waves it mostly produces blocky **square waves** โ€” the classic \"chiptune\" buzz." ] }, { "cell_type": "code", "execution_count": 20, "id": "nb2-57-wave", "metadata": { "cellView": "form", "jupyter": { "source_hidden": true }, "id": "nb2-57-wave", "outputId": "f294e49e-0db0-4279-939b-1a84cbe5970c", "colab": { "base_uri": "https://localhost:8080/", "height": 314 } }, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "iVBORw0KGgoAAAANSUhEUgAAAusAAAEpCAYAAAAqMWwfAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAqLBJREFUeJzsnXd8VFX6h587Lb0XQgmEEnrvTUBAEQELq2BZe1117a66rr2vWH4WbLuCBRdcFdde6NJ7kV4SIBBI72WSmfv7Y+beTNpkZu5MJpOc5/OJksktZ+68c8573vd73iPJsiwjEAgEAoFAIBAIWhw6fzdAIBAIBAKBQCAQNIxw1gUCgUAgEAgEghaKcNYFAoFAIBAIBIIWinDWBQKBQCAQCASCFopw1gUCgUAgEAgEghaKcNYFAoFAIBAIBIIWinDWBQKBQCAQCASCFopw1gUCgUAgEAgEghaKcNYFAoFAIBAIBIIWinDWBQJBLSRJ4qmnnvJ3M/zCpEmTmDRpkr+boYmFCxciSRLp6enqay3tff38888MHjyY4OBgJEmioKDA301ymVWrViFJEl9++aW/m9Lquf7660lJSfF3MwQCvyOcdYGgCebPn48kSYwaNcrfTQl4ysrKeOqpp1i1apW/myJogvXr1/PUU0953ZHOzc1lzpw5hISE8M477/Dpp58SFhbm1XsIAofTp0/z1FNPsXPnTn83RSBosRj83QCBoKWzaNEiUlJS2Lx5M0eOHKFHjx7+blLAUlZWxtNPPw3QoiK9rZ1ff/3V7XPWr1/P008/zfXXX090dLTX2rJlyxaKi4t59tlnmTp1qteuKwhMTp8+zdNPP01KSgqDBw+u9bcPP/wQq9Xqn4YJBC0IEVkXCJyQlpbG+vXree2110hISGDRokX+bpKgAUpLS/3dhBaNyWTCZDL5uxkAZGVlAXh1AtAaaU027el7MRqNBAUFebk1AkHgIZx1gcAJixYtIiYmhhkzZnDZZZe55axv3bqVadOmER8fT0hICF27duXGG2+sdUxpaSkPPPAAycnJBAUF0atXL+bNm4csy+ox6enpSJLEwoUL692jrr78qaeeQpIkjhw5okZEo6KiuOGGGygrK6t1bmVlJffddx8JCQlERERw0UUXkZGR4fL7c/c9p6enk5CQAMDTTz+NJEn12r9ixQrOOeccwsLCiI6O5uKLL2b//v217qG8x3379nHVVVcRExPD+PHj1b9/9tlnDBs2jJCQEGJjY7niiis4efJkvbZ+8MEHdO/enZCQEEaOHMnvv//u8vtcsGABkydPJjExkaCgIPr27cu7777r1vNwxv/+9z9mzJhBhw4dCAoKonv37jz77LNYLBaX2+hIQ5r1t956i379+hEaGkpMTAzDhw/n888/B2zP+KGHHgKga9eu6mflqINviP/+97/qs4+Pj+fPf/4zp06dqtWO6667DoARI0YgSRLXX399o9dz1Z49+Y4cOnSIP//5z0RFRZGQkMDjjz+OLMucPHmSiy++mMjISJKSknj11VcbbJvFYuHvf/87SUlJhIWFcdFFFzVoZ5s2beKCCy4gKiqK0NBQJk6cyLp16xp8nw3Z9JkzZ7jhhhvo1KkTQUFBtG/fnosvvrjJzwKa/j59+eWXSJLE6tWr6537/vvvI0kSf/zxh/ragQMHuOyyy4iNjSU4OJjhw4fz7bff1jpPWTOxevVq7rjjDhITE+nUqVOD7Vu1ahUjRowA4IYbblDtTPkc62rWlc953rx5vPPOO3Tr1o3Q0FDOP/98Tp48iSzLPPvss3Tq1ImQkBAuvvhi8vLy6t33p59+Up9LREQEM2bMYO/evU0+T4HAXwgZjEDghEWLFjF79mxMJhNXXnkl7777Llu2bFEHmMbIysri/PPPJyEhgUceeYTo6GjS09P5+uuv1WNkWeaiiy5i5cqV3HTTTQwePJhffvmFhx56iFOnTvH666973O45c+bQtWtXXnzxRbZv386//vUvEhMTefnll9Vjbr75Zj777DOuuuoqxo4dy4oVK5gxY4bH92zqPSckJPDuu+/yl7/8hUsvvZTZs2cDMHDgQACWLVvG9OnT6datG0899RTl5eW89dZbjBs3ju3bt9dbaHb55ZeTmprKCy+8oE5unn/+eR5//HHmzJnDzTffTHZ2Nm+99RYTJkxgx44dajT33//+N7fddhtjx47l3nvv5dixY1x00UXExsaSnJzc5Ht999136devHxdddBEGg4HvvvuOO+64A6vVyp133unS83DGwoULCQ8P5/777yc8PJwVK1bwxBNPUFRUxCuvvOLS5+GMDz/8kLvvvpvLLruMe+65h4qKCnbv3s2mTZu46qqrmD17NocOHeI///kPr7/+OvHx8QDqZKuxNt9www2MGDGCF198kbNnz/J///d/rFu3Tn32jz32GL169eKDDz7gmWeeoWvXrnTv3r3J9rpiz+4yd+5c+vTpw0svvcQPP/zAc889R2xsLO+//z6TJ0/m5ZdfZtGiRTz44IOMGDGCCRMm1Dr/+eefR5IkHn74YbKysnjjjTeYOnUqO3fuJCQkBLA5y9OnT2fYsGE8+eST6HQ6daL3+++/M3LkyFrXbMim//SnP7F3717++te/kpKSQlZWFr/99hsnTpxwuvjSle/TjBkzCA8P54svvmDixIm1zl+yZAn9+vWjf//+AOzdu5dx48bRsWNHHnnkEcLCwvjiiy+45JJL+Oqrr7j00ktrnX/HHXeQkJDAE0880WhkvU+fPjzzzDM88cQT3HrrrZxzzjkAjB071ulnt2jRIsxmM3/961/Jy8vjn//8J3PmzGHy5MmsWrWKhx9+mCNHjvDWW2/x4IMP8tFHH6nnfvrpp1x33XVMmzaNl19+mbKyMt59913Gjx/Pjh07xIJWQctEFggEDbJ161YZkH/77TdZlmXZarXKnTp1ku+5554mz126dKkMyFu2bGn0mG+++UYG5Oeee67W65dddpksSZJ85MgRWZZlOS0tTQbkBQsW1LsGID/55JPq708++aQMyDfeeGOt4y699FI5Li5O/X3nzp0yIN9xxx21jrvqqqvqXdNVXHnP2dnZjV5/8ODBcmJiopybm6u+tmvXLlmn08nXXnut+pryHq+88spa56enp8t6vV5+/vnna72+Z88e2WAwqK+bzWY5MTFRHjx4sFxZWake98EHH8iAPHHixCbfa1lZWb3Xpk2bJnfr1k393ZXn4c71b7vtNjk0NFSuqKhweu6CBQtkQE5LS1NfmzhxYq33dfHFF8v9+vVzep1XXnml3nUaQ3mm/fv3l8vLy9XXv//+exmQn3jiiXrtc+W5uGrPnnxHbr31VvW16upquVOnTrIkSfJLL72kvp6fny+HhITI1113nfraypUrZUDu2LGjXFRUpL7+xRdfyID8f//3f7Is2/qL1NRUedq0abLValWPKysrk7t27Sqfd9559dpU16bz8/NlQH7llVeaeFL1cfX7dOWVV8qJiYlydXW1+lpmZqas0+nkZ555Rn1typQp8oABA2rZn9VqlceOHSunpqaqrymf7/jx42tdszG2bNnS6Gd33XXXyV26dFF/Vz7n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u5wprODzzbZJ4n1Te3p9kghw+6RuBBl07DxZwO+HGy+l5xUCYJlOZGQka9as4cILL6Rnz5784x//4NVXX2X69OkeXzM0NJRffvmFvLw8RowYwWWXXcaUKVN4++231WPuvvtu7r//fh544AEGDBjAzz//zLfffktqaioABoOBN998k/c/XUKHodO4+PKrNL3PiRMnYrFYVKcTbI6n8lp2cSVWWebCmRdx7733ctdddzF48GDWr1/P448/Xu96ERERzJo1i127dnH11VfX+psSZbZYLJx//vkMGDCABx+4n4S4WHQ6HVlFFQ32eTfffHOj5QwdGThwIKtXr+bQoUOcc8456j41yoQhISGBhe+/zX+/X0bfcdN56aWXmDdvnptPzLaQd8CAASQkJKh6/AkTJmC1WmtVz4GmP09XmTt3Lo8//jh/+9vfGDZsGMePH68lMVJYvHhxowuK2xKS3IJDDkVFRURFRVFYWEhkZGTzN+D0TvhgIkR2hPt9t7vafUt2snTHKab2SeRf143w2X3+vnQPn286wYSeCXxyow91nJ/9CY4sg4vnw5Crmz5eUJutH8H390HvmXBF0x26p2TklzHxlVVYrDLf3DnOZ5ryzMJyJv5zFWaLlc9vHsVYL2eOavFyCpTnw52bIaGZqh+1Jv53J+z4DKY8Aee4r1N1lae+3cvC9emMTIllyW2jfeKsAzzz3T4+WpfGsC4xfHn7GK/dp6KigrS0NLp27UpwcDBUV0LWPltgp/0gr9yjzZG1H6orIK4HBGlbaNwYVRYrB88UY5VlusaHEeHGPhLuUG2xcsB+n5S4MCJDat+nvLycXr16sWTJkgYXVbpFWR4UHAdTOMS75zC3dH766SceeOABdu/ejcEQuEss6/UXDrjq54rIujOaYQfTzMJyvtt1GoB7ptQv8+RNbp/QHb1OYs2hbHZnFPjuRqJ8njaaaf780dp0LFaZcT3ifLr4s31UCFeOtG1E8taKIz67jw2R1dGE+th8FyrOKq6Jqt87NdVnjjrA7RNt0fVtx/NZd6Q5ZFiClkxOiS2qHmoyuLQzs6cY9Driwm1a/KziynrR9ZCQED755BOnmycJbHX8FyxYENCOurcQzrozZN/LERauS6faKjO6WywDOkX57D4AneNCuWiQLX32zkpfOk3CYdKG7+2usKyKxVtsDtOtE7xThcMZt020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+YT33nuPvXv3ct999/HnP/+Z1atXN/o8fv/9d4YPHw6glixtaL1ESEgIYHN46/Lmm29SWlrKI488AsBjjz1GQUEBb7/9NiDx+6btXHvXI9xzzz3s27eP999/n4ULF/L888832q66HDp0iBUrVjBq1Cj1taVLl3LPPffwwAMP8Mcff3Dbbbdxww03sHLlShfa1TBjx45l+fLlHDp0CIBdu3axdu1apk+f3ug5JSUlXHjhhSxfvpwdO3ZwwQUXMGvWLE6cOOHy+yspKWHmzJn07duXbdu28dRTT/Hggw86PWfbtm3MmTOHK664gj179vDUU0/x+OOP15oAAIwcOZLff//d5bZ4gn91GC0dL9ccXrrDFmGaNaiD3zXDjswa2IHdGYV8tzuTa+y7m2pCfV4iuukRXpbBpOeUsuNEATrJVuO6pTA+NZ7YMBM5JWbWHc1lYk9vOHMiq6MJL9ve/+xR9en9kwj2Q9m8xrhoUAe2pOfz7a7T3DKhm/YLVpXBgsadDZ/y99NgCmvysMzMTKqrq5k9ezZdutiqQQ0YMED9+xtvvMGjjz7K7NmzAXjvvff45Zdf3G7Ovffeq/47JSWF5557jttvv5358+err1dVVTF//nwGDRoE2KQiC5Z8w4nNP9JhwDgwhvLggw/y888/s2DBAl544YV69znnnHMoLi5mx44dDBs2jDVr1vDQQw/xzTffUGWxsmb1KhKTOjCkf28AJk+eXOv8Dz74gOjoaFavXs3MmTOZNm0aYWFhLF26lGuuuQaAzz//nIsuuoiIiAgqKyt54YUXWLZsGWPGjAGgW7durF27lvfff5+JEyc2+DyOHz+uOuuhJj1GvY66oYTMzEzmzZtHx44d6dWrF+vXr6/19/DwcD777DMmTpxIREQEb7zxBitXriQyMhIqinj6tQ945K+3cN1116ntevbZZ/nb3/7Gk08+2ehndeWVV6LX66murqayspKZM2fy6KOPqn+fN28e119/PXfccQcA999/Pxs3bmTevHmce+65ztvVCI888ghFRUX07t0bvV6PxWLh+eef5+qrr270nEGDBqm2AvDss8+ydOlSvv32W+66665Gz3Pk888/x2q18u9//5vg4GD69etHRkYGf/nLXxo957XXXmPKlCk8/vjjAPTs2ZN9+/bxyiuvcP3116vHdejQgZMnT2K1WtHpfOPbtRyP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2osI7HY70tLSYDCMfGa6ro+sGwwGTJ06VesYiI2N5QYcplj78MXahyfWPXyx9uFLy9qPdkTdgxeYEhERERHpFJt1IiIiIiKdYrM+CkVRYLVaoSiK1lFIZax9+GLtwxPrHr5Y+/AVKrXX9QWmREREREThjEfWiYiIiIh0is06EREREZFOsVknIiIiItIpNutERERERDoV9s16TU0Npk+fDrPZjLy8PHzzzTejjv/444+RnZ0Ns9mMnJwc1NfXq5SUAs2X2m/btg2FhYVISEhAQkICioqKxlxXSL983e496urqEBERgaVLlwY3IAWFr3W/dOkSysvLkZqaCkVRkJWVxX1+iPK19m+99RbuvfdeREdHw2KxoKKiAn19fSqlpUA5dOgQFi1ahLS0NERERGDPnj1jLtPY2IhZs2ZBURRkZmaitrY26DnHJGGsrq5OTCaTfPDBB3LixAl54oknJD4+Xrq6uoYdf/jwYTEajbJp0yZpaWmRF154QaKiouT48eMqJ6fx8rX2JSUlUlNTI83NzdLa2iorVqyQuLg4+emnn1ROTuPla+092tvbZcqUKVJYWChLlixRJywFjK917+/vl9mzZ8vChQulqalJ2tvbpbGxUWw2m8rJabx8rf2OHTtEURTZsWOHtLe3y2effSapqalSUVGhcnIar/r6eqmqqpJdu3YJANm9e/eo49va2mTChAmyZs0aaWlpkS1btojRaJT9+/erE3gEYd2sz5kzR8rLy71fu1wuSUtLk40bNw47ftmyZfLoo48OmZeXlydPPvlkUHNS4Pla+1s5nU6JiYmR7du3BysiBYk/tXc6nTJ37lx57733pKysjM16CPK17u+8846kp6fLwMCAWhEpSHytfXl5uTzyyCND5q1Zs0YKCgqCmpOC606a9eeee05mzJgxZN7y5culuLg4iMnGFranwQwMDODo0aMoKiryzjMYDCgqKsKRI0eGXebIkSNDxgNAcXHxiONJn/yp/a16e3vhcDgwadKkYMWkIPC39q+88gqSk5Px+OOPqxGTAsyfun/66afIz89HeXk5UlJScP/992PDhg1wuVxqxaYA8Kf2c+fOxdGjR72nyrS1taG+vh4LFy5UJTNpR699XqSmP11D3d3dcLlcSElJGTI/JSUF33///bDLdHZ2Dju+s7MzaDkp8Pyp/a2ef/55pKWl3bZRk775U/umpia8//77sNlsKiSkYPCn7m1tbTh48CAee+wx1NfX49SpU1i9ejUcDgesVqsasSkA/Kl9SUkJuru7MW/ePIgInE4nnnrqKaxdu1aNyKShkfq8np4eXLt2DdHR0ZrkCtsj60T+qq6uRl1dHXbv3g2z2ax1HAoiu92O0tJSbNu2DYmJiVrHIRW53W4kJydj69atyM3NxfLly1FVVYV3331X62gUZI2NjdiwYQPefvttHDt2DLt27cK+ffuwfv16raNRmArbI+uJiYkwGo3o6uoaMr+rqwuTJ08edpnJkyf7NJ70yZ/ae2zevBnV1dX48ssv8cADDwQzJgWBr7U/ffo0zpw5g0WLFnnnud1uAEBkZCROnjyJjIyM4IamcfNnm09NTUVUVBSMRqN33n333YfOzk4MDAzAZDIFNTMFhj+1X7duHUpLS7Fy5UoAQE5ODq5evYpVq1ahqqoKBgOPc96tRurzYmNjNTuqDoTxkXWTyYTc3FwcOHDAO8/tduPAgQPIz88fdpn8/Pwh4wHgiy++GHE86ZM/tQeATZs2Yf369di/fz9mz56tRlQKMF9rn52djePHj8Nms3mnxYsXY8GCBbDZbLBYLGrGJz/5s80XFBTg1KlT3jdnAPDDDz8gNTWVjXoI8af2vb29tzXknjdtIhK8sKQ53fZ5ml7eqrG6ujpRFEVqa2ulpaVFVq1aJfHx8dLZ2SkiIqWlpVJZWekdf/jwYYmMjJTNmzdLa2urWK1W3roxRPla++rqajGZTPLJJ5/IhQsXvJPdbtfqVyA/+Vr7W/FuMKHJ17p3dHRITEyMPP3003Ly5EnZu3evJCcny6uvvqrVr0B+8rX2VqtVYmJi5KOPPpK2tjb5/PPPJSMjQ5YtW6bVr0B+stvt0tzcLM3NzQJA3njjDWlubpazZ8+KiEhlZaWUlpZ6x3tu3fjss89Ka2ur1NTU8NaNerBlyxaZNm2amEwmmTNnjnz99dfe1+bPny9lZWVDxu/cuVOysrLEZDLJjBkzZN++fSonpkDxpfb33HOPALhtslqt6gencfN1u78Zm/XQ5Wvdv/rqK8nLyxNFUSQ9PV1ee+01cTqdKqemQPCl9g6HQ1566SXJyMgQs9ksFotFVq9eLRcvXlQ/OI1LQ0PDsP+7PfUuKyuT+fPn37bMQw89JCaTSdLT0+XDDz9UPfetIkT4mQ4RERERkR6F7TnrRERERER6x2adiIiIiEin2KwTEREREekUm3UiIiIiIp1is05EREREpFNs1omIiIiIdIrNOhERERGRTrFZJyIiIiLSKTbrREREREQ6xWadiIiIiEin2KwTEREREekUm3UiIiIiIp36P5M7OHhVQbEGAAAAAElFTkSuQmCC\n" }, "metadata": {} } ], "source": [ "#| echo: false\n", "#@title ๐ŸŒŠ Sampling a sound wave โ€” chart (click to show code)\n", "t = np.linspace(0, 1, 600) # 600 evenly spaced sample times\n", "sine = np.sin(2 * np.pi * 4 * t)\n", "square = np.sign(sine) # np.sign flattens the wave to -1 / +1\n", "\n", "plt.figure(figsize=(9, 3))\n", "plt.plot(t, sine, label=\"smooth wave (real world)\")\n", "plt.plot(t, square, label=\"square wave (PixelBox 8 audio)\")\n", "plt.legend(loc=\"upper right\")\n", "plt.title(\"A sound, stored as a list of numbers over time\")\n", "plt.yticks([-1, 0, 1])\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "nb2-58-encoding-closer", "metadata": { "id": "nb2-58-encoding-closer" }, "source": [ "Text, image, sound: three completely different experiences, **one underlying idea** โ€” a sequence of numbers plus an agreed rule for what those numbers mean. Change the rule and the same bytes become gibberish. That's the bridge to the final part.\n" ] }, { "cell_type": "markdown", "id": "nb2-59-ex3-setup", "metadata": { "id": "nb2-59-ex3-setup" }, "source": [ "### โœ๏ธ Exercise 3 โ€” Design Your Own Sprite\n", "\n", "The next cell is **yours to edit directly**. Run it first to see the starter shape, then read the task below it." ] }, { "cell_type": "code", "execution_count": 21, "id": "nb2-60-spritedesigner", "metadata": { "id": "nb2-60-spritedesigner", "outputId": "83b53a48-148d-4531-bd43-b0cd79bbd96e", "colab": { "base_uri": "https://localhost:8080/", "height": 290 } }, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAERCAYAAABSGLrIAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAACsZJREFUeJzt3WtolXUAx/HfxpnHXZjOXUyWl2250ZprJKS51aKL44SlS4gkMLu9WEpQSO1NbBG+WnYhyi4vwpAuoq1QokZJr0xbDJfZTasFxjBnJUOdafv3Qjw5z9R5vJyx3/cDe7Hn/Pc8/7PxPc95nvOwJy2EEARgTEtP9QQAXHqEDhggdMAAoQMGCB0wQOiAAUIHDBA6YIDQAQOEjotu2bJlmjFjRqqngVMQ+kUSi8WUl5enffv2JTx28OBBTZkyRXPmzNHg4GAKZpdahw8fVmtrq7744otUT8VXwEXxyy+/hKysrLBkyZKExx599NEQiUTCjh07UjCzy++ff/4JAwMD8e/3798fJIWWlpbUTcoce/SLpKSkRC0tLXr33XfV0dERX97Z2anXXntNTzzxhK699tpLOofBwUENDAxc0m2czaFDhyRJGRkZikajKZsHhpHqV5qx5NixY6G6ujqUlZWFI0eOhOPHj4frrrsulJSUhEOHDoXPP/881NXVhaysrDBhwoRw1113he+++27IOu6///4wffr0hHW3tLSE0/9cksLy5cvDunXrQmVlZYhEIqG9vf2M8+vs7Azz588P+fn5Yfz48WHGjBnhgQceiD/+66+/Bkmhra0tPP/882HatGlh/Pjx4aabbgo7d+5MmGd2dnbYs2dPiMViIScnJyxcuDDhOZxc5+lfp+7dv//++7B48eKQl5cXotFomD17dvjoo4/O/QvHiEVS9xIz9kQiEb3xxhuaN2+enn32WRUVFamrq0uffPKJtm7dqlgsptLSUrW2turIkSN6+eWXVVtbq66urqRPXm3ZskXr16/XihUrVFBQcMb1/PHHH5o/f74KCwvV3NysiRMnqqenRx988EHC2Lffflv9/f1avny5BgYG9NJLL+mWW27Rzp07NXny5Pi448ePq6GhQXV1dXruueeUlZWVsK7CwkKtWbNGTU1Namxs1N133y1Jqq6uliTt2rVLtbW1Ki4uVnNzs7Kzs7V+/XotWrRIGzduVGNjY1K/F5wm1a80Y9GKFStCRkZGyMnJiR+z19TUhKKionDgwIH4uO7u7pCenh6WLl0aX3a+e/T09PSwa9euc86pvb09SAqdnZ1nHHNy75uZmRn27t0bX759+/YgKTz++OND5ikpNDc3J6zn9OdwtmP0W2+9NcyaNWvIMf3g4GCYN29emDlz5jmfF0aGY/RLYNWqVcrPz1d6erpeeOEF9fb2aseOHVq2bJkmTZoUH1ddXa3bb79dH3/8cdLbqq+vV2Vl5TnHTZw4UZK0efNmHTt27KxjFy1apOLi4vj3119/vebMmTPsPJuams5vwqf4888/tWXLFt1zzz3q7+9XX1+f+vr6dODAATU0NGj37t36/fffk14//kfol0Bubq4qKio0depUTZ48Wb/99pskqaKiImHs1Vdfrb6+vviJrPNVUlIyonH19fVavHixnnnmGRUUFGjhwoV66623dPTo0YSxM2fOTFhWXl6unp6eIcsikYiuvPLKpOYtSXv27FEIQU8//bQKCwuHfLW0tEg6cciBC8cx+iiTlpY27PJ///132OWZmZkjXu+GDRu0bds2bdq0SZ9++qkefPBBrV69Wtu2bVNOTs55zzUajSo9Pfl9xclrClauXKmGhoZhx1x11VVJrx//I/TLYPr06ZKkH3/8MeGxH374QQUFBcrOzpYk5eXl6e+//04Yd/JdwYWaO3eu5s6dq1WrVumdd97Rfffdp/fee08PP/xwfMzu3bsTfu6nn35K+oThmV68SktLJZ34OO62225Lat0YGd66XwZTpkxRTU2N1q5dOyTib7/9Vh0dHbrjjjviy8rKynTw4EF988038WW9vb1qb2+/oDn89ddfCqf9H9CamhpJSnj7/uGHHw45Nv7qq6+0fft2xWKxpLZ98mz86S9gRUVFuvnmm/X666+rt7c34ef279+f1PaQiD36ZdLW1qZYLKYbbrhBDz30UPzjtQkTJqi1tTU+7t5779VTTz2lxsZGPfbYYzp8+LDWrFmj8vJydXV1Jb39tWvX6tVXX1VjY6PKysrU39+vN998U7m5uUNeaKQTb5fr6urU1NSko0eP6sUXX1R+fr6efPLJpLadmZmpyspKvf/++yovL9ekSZNUVVWlqqoqvfLKK6qrq9OsWbP0yCOPqLS0VPv27dOXX36pvXv3qru7O+nnjFOk+rT/WFVfXx+uueaaIcs+++yzUFtbGzIzM0Nubm648847Ey6YCSGEjo6OUFVVFcaNGxcqKirCunXrznrBzEh0dXWFJUuWhGnTpoVoNBqKiorCggULwtdffx0fc+oFM6tXrw5Tp04N0Wg03HjjjaG7u3vI+k5eMDOc4T4i3Lp1a5g9e3YYN25cwkdtP//8c1i6dGm44oorQkZGRiguLg4LFiwIGzZsGNFzw7mlhcD/dccJPT09KikpUVtbm1auXJnq6eAi4hgdMEDogAFCBwxwjA4YYI8OGCB0wAChAwa4Mm4UONO14GMJp4JSiz06YIDQAQOEDhggdMAAoQMGCB0wQOiAAUIHDBA6YIDQAQOEDhggdMAAoQMGCB0wQOiAAUIHDBA6YIDQAQOEDhggdMAAoQMGCB0wQOiAAUIHDBA6YIDQAQOEDhggdMAAoQMGCB0wQOiAAUIHDBA6YIDQAQOEDhggdMAAoQMGCB0wQOiAAUIHDBA6YIDQAQOEDhggdMAAoQMGCB0wQOiAAUIHDBA6YIDQAQOEDhggdMAAoQMGCB0wQOiAAUIHDBA6YIDQAQOEDhggdMAAoQMGCB0wQOiAAUIHDBA6YIDQAQOEDhggdMAAoQMGCB0wQOiAAUIHDBA6YIDQAQOEDhggdMAAoQMGCB0wQOiAAUIHDBA6YIDQAQOEDhggdMAAoQMGCB0wQOiAAUIHDBA6YIDQAQOEDhggdMAAoQMGCB0wQOiAAUIHDBA6YIDQAQOEDhggdMAAoQMGCB0wQOiAAUIHDBA6YIDQAQOEDhggdMAAoQMGCB0wQOiAAUIHDBA6YIDQAQORVE9gtElLS0v1FMakVPxeQwiXfZujFXt0wAChAwYIHTBA6IABQgcMEDpggNABA4QOGCB0wAChAwYIHTBA6IABQgcMEDpggNABA4QOGCB0wAChAwYIHTBA6IABQgcMEDpggNABA4QOGCB0wAChAwYIHTBA6ICBUX2TRW54iAvBjR3/xx4dMEDogAFCBwwQOmCA0AEDhA4YIHTAAKEDBggdMEDogAFCBwwQOmCA0AEDhA4YIHTAAKEDBggdMEDogAFCBwwQOmCA0AEDhA4YIHTAAKEDBggdMEDogAFCBwwQOmBgVN9kcbTesO5ic7iZpMvfcrRijw4YIHTAAKEDBggdMEDogAFCBwwQOmCA0AEDhA4YIHTAAKEDBggdMEDogAFCBwwQOmCA0AEDhA4YIHTAAKEDBggdMEDogAFCBwwQOmCA0AEDhA4YIHTAAKEDBggdMEDogAFCBwwQOmCA0AEDhA4YIHTAAKEDBggdMEDogAFCBwwQOmCA0AEDhA4YIHTAAKEDBggdMEDogAFCBwwQOmCA0AEDhA4YIHTAAKEDBggdMEDogAFCBwwQOmCA0AEDhA4YiKR6ApBCCKmeAsY49uiAAUIHDBA6YIDQAQOEDhggdMAAoQMGCB0wQOiAgf8A6DHytFQGLyoAAAAASUVORK5CYII=\n" }, "metadata": {} } ], "source": [ "# โœ๏ธ EDIT THESE 0s and 1s to draw your own 8x8 sprite.\n", "frame1 = [\n", " [0, 0, 0, 1, 1, 0, 0, 0],\n", " [0, 0, 0, 1, 1, 0, 0, 0],\n", " [0, 0, 0, 1, 1, 0, 0, 0],\n", " [0, 0, 0, 1, 1, 0, 0, 0],\n", " [0, 0, 1, 1, 1, 1, 0, 0],\n", " [0, 1, 1, 1, 1, 1, 1, 0],\n", " [0, 0, 0, 1, 1, 0, 0, 0],\n", " [0, 0, 0, 1, 1, 0, 0, 0],\n", "]\n", "\n", "# Optional second frame for the animation bonus (start as a copy, then tweak):\n", "frame2 = [\n", " [0, 0, 0, 0, 0, 0, 0, 0],\n", " [0, 0, 0, 1, 1, 0, 0, 0],\n", " [0, 0, 0, 1, 1, 0, 0, 0],\n", " [0, 0, 0, 1, 1, 0, 0, 0],\n", " [0, 0, 1, 1, 1, 1, 0, 0],\n", " [0, 1, 1, 1, 1, 1, 1, 0],\n", " [0, 0, 0, 1, 1, 0, 0, 0],\n", " [0, 0, 0, 1, 1, 0, 0, 0],\n", "]\n", "\n", "plt.figure(figsize=(3, 3))\n", "plt.imshow(frame1, cmap=\"binary\")\n", "plt.title(\"Your sprite\")\n", "plt.axis(\"off\")\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "nb2-61-ex3-task", "metadata": { "id": "nb2-61-ex3-task" }, "source": [ "**Your task:** edit the `0`s and `1`s in `frame1` above to draw something for *Quest for the Reasonably Priced Sword* โ€” a sword, a coin, a slime, anything. A `1` is a filled pixel, a `0` is empty. Re-run the cell to see your art.\n", "\n", "**Optional bonus โ€” animation:** fill in `frame2` with a slightly different pose, then run the cell below to flip between them. Two frames is exactly how 1980s games made things \"move\" on a tiny memory budget.\n", "\n", "**Using AI here (optional):** ask Gemini *\"give me an 8ร—8 grid of 0s and 1s that looks like a sword\"* โ€” then paste it in and judge whether it actually does. You are the art director; the AI is a junior intern." ] }, { "cell_type": "code", "execution_count": 22, "id": "nb2-62-spriteanim", "metadata": { "id": "nb2-62-spriteanim", "outputId": "aa9d65df-8676-4c30-cebe-5b5f15680f7b", "colab": { "base_uri": "https://localhost:8080/", "height": 290 } }, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "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\n" }, "metadata": {} } ], "source": [ "# โ–ถ ANIMATION BONUS: run this after filling in frame2.\n", "import time\n", "from IPython.display import clear_output\n", "\n", "for _ in range(6): # 6 flips, then stop\n", " for frame, label in [(frame1, \"frame 1\"), (frame2, \"frame 2\")]:\n", " clear_output(wait=True)\n", " plt.figure(figsize=(3, 3))\n", " plt.imshow(frame, cmap=\"binary\")\n", " plt.title(label)\n", " plt.axis(\"off\")\n", " plt.show()\n", " time.sleep(0.3)" ] }, { "cell_type": "markdown", "id": "nb2-63-overflow-problem", "metadata": { "id": "nb2-63-overflow-problem" }, "source": [ "## When Representation Breaks\n", "\n", "**Quoth Bugbear**, the studio's QA tester โ€” who finds the bug, was right all along, and is insufferable about it โ€” files report #256:\n", "\n", "> *\"At level 256, the game corrupts. Enemies turn into garbage tiles. Half the screen is hex soup. Unplayable.\"*\n", "\n", "The level counter is stored in **one byte**. A byte holds 0โ€“255. When the game adds 1 to level 255, the value doesn't become 256 โ€” there's no room for a 9th bit, so it **wraps around to 0** (or worse, corrupts neighboring memory). This is **integer overflow**, and it is not a fictional problem." ] }, { "cell_type": "markdown", "id": "nb2-64-pacman", "metadata": { "id": "nb2-64-pacman" }, "source": [ "### The Real One: the Pac-Man Kill Screen\n", "\n", "The 1980 arcade game **Pac-Man** stored its level number in a single byte and used it to draw the bonus-fruit display. At **level 256** that byte overflowed; the draw routine ran wild and corrupted the right half of the screen into a famous garbled mess โ€” the \"**kill screen**.\" The game was literally unbeatable past that point, not by design, but because of one undersized integer.\n", "\n", "| Decision | Consequence |\n", "|---|---|\n", "| Store level in 1 byte | Saves memory (precious in 1980) |\n", "| Never expect 256 levels | Reasonable โ€” almost no one got there |\n", "| No overflow check | Level 256 corrupts memory โ†’ kill screen |\n", "\n", "The same bug class still bites: a 2015 FAA directive warned that a Boeing 787 counter could overflow after 248 days of continuous power, potentially shutting down electrical generators in flight. **Representation size is a safety decision.**" ] }, { "cell_type": "code", "execution_count": 23, "id": "nb2-65-overflow", "metadata": { "id": "nb2-65-overflow", "outputId": "81837d50-0828-4b2a-bb26-ea774f7ae34d", "colab": { "base_uri": "https://localhost:8080/" } }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "next level -> stored as 254 (11111110)\n", "next level -> stored as 255 (11111111)\n", "next level -> stored as 0 (00000000) <-- overflow! wrapped around\n", "next level -> stored as 1 (00000001)\n", "next level -> stored as 2 (00000010)\n", "next level -> stored as 3 (00000011)\n" ] } ], "source": [ "#| echo: false\n", "#@title ๐ŸŸก The overflow that crashed Pac-Man (click to show code)\n", "# Simulate an 8-bit level counter. & 0xFF forces it to stay 8 bits wide.\n", "level = 253\n", "for _ in range(6):\n", " level = (level + 1) & 0xFF\n", " note = \" <-- overflow! wrapped around\" if level == 0 else \"\"\n", " print(f\"next level -> stored as {level:3d} ({level:08b}){note}\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### ๐Ÿ’ญ Think About It โ€” When the Numbers Run Out\n", "\n", "The Pac-Man kill screen happens because a counter overflows a single byte. Every number on a computer has a hidden ceiling.\n", "\n", "- The bug wasn't bad luck โ€” it was a limit baked into how the machine stores numbers. Does it change how you think about software to know every program rests on finite, fixed-size representations?\n", "- The Pac-Man overflow was harmless fun. Where might a silent overflow like this be dangerous instead? Reason about a system where running out of digits could really matter.\n", "- Have you ever hit an invisible limit in an app or game โ€” a max level, a character cap, a counter that froze? What do you now think was happening underneath?\n", "\n", "There are no single right answers here โ€” share a sentence or two on each." ] }, { "cell_type": "markdown", "id": "nb2-66-overflow-closer", "metadata": { "id": "nb2-66-overflow-closer" }, "source": [ "Run that cell and watch 254 โ†’ 255 โ†’ **0**. Nothing is \"broken\" โ€” the hardware did exactly what fixed-width wrap-around always does (the same `& 0xFF` masking from the two's-complement section). The bug was a *human* decision: choosing a box too small for the numbers that would eventually go in it.\n", "\n", "Every representation choice in this notebook โ€” byte width, palette size, sample rate, character encoding โ€” is an engineering trade-off with real consequences. That is the deep lesson of data representation, and it's why this is Learning Outcomes 1 and 2 of the course, not an afterthought." ] }, { "cell_type": "markdown", "id": "nb2-67-ex4", "metadata": { "id": "nb2-67-ex4" }, "source": [ "### โœ๏ธ Exercise 4 โ€” Build a Retro Text Adventure with AI\n", "\n", "In the late 1970s and early '80s, before graphics were cheap, the hottest games were **text adventures**: you typed commands like `go north` or `take lamp`, and the computer described a world back to you in words. You'll build a tiny one with an AI partner โ€” but the *imagination* has to be yours.\n", "\n", "**Step 1 โ€” Design your world first (do this before touching the AI).** A generic prompt gives a generic game. Spend two minutes deciding:\n", "\n", "- **Setting & era:** far-future starship? haunted Victorian manor? noir detective's city? sword-and-sorcery dungeon? a real place you know? Anything goes โ€” make it yours.\n", "- **The goal:** what is the player trying to find, escape, or solve?\n", "- **Three or four rooms** and a one-line description of each.\n", "- **One thing that wins** the game and **one thing that ends it badly**.\n", "\n", "Jot these down in a markdown cell. This is the part the AI *can't* do for you.\n", "\n", "**Step 2 โ€” Turn your design into a prompt.** Fill your ideas into this skeleton and send it to Gemini (or Claude / ChatGPT):\n", "\n", "> *Write a short text-adventure game as a single Python cell that runs in Google Colab.*\n", "> *Setting: **[your setting and era]**. The player is **[who they are]** trying to **[the goal]**.*\n", "> *Include these rooms: **[room 1 โ€” description]**, **[room 2 โ€” description]**, **[room 3 โ€” description]**.*\n", "> *The player moves by typing `north`, `south`, `east`, `west`, or `quit`. Each room prints its description.*\n", "> *Reaching **[the win room]** wins the game; entering **[the hazard]** ends it.*\n", "> *Use a dictionary of rooms and a simple input loop. Keep it short and beginner-readable.*\n", "\n", "**Step 3 โ€” Get the bones working, then test.** Paste the result into the empty cell below and **run it right away**. It probably won't be perfect โ€” walk every path, hit the win, hit the loss, and fix what breaks. Don't add anything new until the basic game runs end to end. *Get it working small first.*\n", "\n", "**Step 4 โ€” Now add the whistles and bells.** Once the core loop is solid, layer in **one or two** extras โ€” adding them one at a time and re-testing after each:\n", "\n", "- **An item to pick up** (a key, a keycard, a lantern) that a later room requires before it lets you through.\n", "- **A hidden room** reachable only by an unusual command.\n", "- **A richer ending** โ€” a real win *and* a real lose message.\n", "- **Something that wraps** โ€” a torch or oxygen meter that drops one unit per move (a callback to overflow!).\n", "\n", "For each addition you can ask the AI for help โ€” but **run it and read the output yourself** before trusting it.\n", "\n", "**Step 5 โ€” Reflect.** In a markdown cell, write 2โ€“3 sentences: what did the AI get wrong, or what did you improve, and how did you fix it?\n", "\n", "Remember the course rule: *AI is a fast first draft. You verify.*\n" ] }, { "cell_type": "code", "execution_count": 24, "id": "nb2-68-ex4-scaffold", "metadata": { "id": "nb2-68-ex4-scaffold" }, "outputs": [], "source": [ "# โœ๏ธ Paste your AI-built retro toy here, then run it and fix what's broken.\n" ] }, { "cell_type": "markdown", "id": "nb2-69-keyterms", "metadata": { "id": "nb2-69-keyterms" }, "source": [ "## Key Terms\n", "\n", "- **Transistor** โ€” A microscopic electrical switch with two states (on/off); the physical basis of all digital computing.\n", "- **Logic gate** โ€” A small group of transistors that follows one logical rule (AND, OR, NOT, XOR).\n", "- **Truth table** โ€” A table listing every input combination for a gate or circuit and the resulting output.\n", "- **Half-adder** โ€” An XOR gate plus an AND gate that together add two bits (XOR = sum, AND = carry).\n", "- **ALU (Arithmetic Logic Unit)** โ€” The CPU part that performs arithmetic and logic, built from chained adders and gates.\n", "- **Control Unit** โ€” The CPU part that reads each instruction and directs all other parts.\n", "- **Register** โ€” A tiny, extremely fast storage slot inside the CPU.\n", "- **Program Counter (PC)** โ€” The register holding the address of the next instruction.\n", "- **Instruction Register (IR)** โ€” The register holding the instruction currently being executed.\n", "- **Bus** โ€” The wiring that carries addresses or data between the CPU and memory.\n", "- **von Neumann architecture** โ€” The standard design where CPU, memory, and I/O are connected and program instructions live in the same memory as data.\n", "- **Fetchโ€“decodeโ€“execute cycle** โ€” The repeating loop a CPU performs to run a program.\n", "- **Memory hierarchy** โ€” The layered arrangement of registers, cache, RAM, and storage trading speed against size and cost.\n", "- **Cache** โ€” Small fast memory near the CPU that holds recently used data; a **hit** is found there, a **miss** is not.\n", "- **Locality** โ€” The tendency of programs to reuse recent data and nearby data, which makes caching effective.\n", "- **Bit / Byte** โ€” A bit is one binary digit; a byte is 8 bits (256 possible values).\n", "- **Binary (base 2)** โ€” A number system using only 0 and 1; place values are powers of two.\n", "- **Hexadecimal (base 16)** โ€” Compact notation where 4 bits map to one hex digit (0โ€“9, Aโ€“F).\n", "- **Two's complement** โ€” The standard scheme for storing signed integers: negate by flipping all bits and adding 1.\n", "- **Integer overflow** โ€” When a value exceeds the maximum its fixed-size storage can hold and wraps around.\n", "- **Character encoding (ASCII / Unicode)** โ€” An agreed mapping from characters to numbers.\n", "- **Pixel** โ€” One dot of an image, stored as a number; more bits per pixel means more possible colors.\n", "- **Sampling** โ€” Measuring a sound wave's height many times per second to store it as a list of numbers.\n", "- **Palette** โ€” A small fixed set of colors an image is allowed to use, to save memory." ] }, { "cell_type": "markdown", "id": "nb2-70-summary", "metadata": { "id": "nb2-70-summary" }, "source": [ "## Summary\n", "\n", "- **Transistors โ†’ gates โ†’ half-adders โ†’ ALU.** Computation is switches wired to follow logical rules.\n", "- **Inside the CPU**, a Control Unit directs an ALU and registers (PC, IR, accumulator) through the **fetchโ€“decodeโ€“execute** loop, talking to memory over buses.\n", "- **The memory hierarchy** (registers โ†’ cache โ†’ RAM โ†’ SSD โ†’ disk) exists because no memory is fast, big, and cheap at once; **caching** works because programs have locality.\n", "- **Consoles from 1977 to 2020** show RAM growing ~130 million-fold while the architecture stayed the same โ€” magnitudes change, ideas don't.\n", "- **Binary** is counting in powers of two; **hexadecimal** is the same bits, written for humans.\n", "- **Two's complement** stores negatives so the ordinary adder still works โ€” *flip the bits, add one*.\n", "- **Text, images, and sound** are all numbers plus an agreed rule for reading them.\n", "- **Representation size is an engineering and safety decision** โ€” the Pac-Man kill screen was one byte, chosen too small.\n", "\n", "Everything is numbers. The size of the box you put them in matters." ] }, { "cell_type": "markdown", "id": "nb2-71-next", "metadata": { "id": "nb2-71-next" }, "source": [ "## What's Next\n", "\n", "You now know what the machine *is*, how it computes, and how it stores things. **Notebook 3** turns to instructing it: we'll go from a plain-English description of a problem, to **pseudocode**, to a **flowchart**, to working **Python** โ€” the authoring workflow this whole course runs on. Eight Bits & Bob still has a game to finish, and the code isn't going to write itself. (Bob keeps insisting it will. Nobody listens to Bob.)\n", "\n", "*COMP 1150 โ€” Computer Science Concepts ยท Brendan Shea, PhD* \n", "*Content licensed under [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/).*" ] } ], "metadata": { "colab": { "provenance": [] }, "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "name": "python", "version": "3.13.9" } }, "nbformat": 4, "nbformat_minor": 5 }