---
title: Hence
version: 1.0.0
theme: uncover
class:
  - invert
marp: true
size: 4K
---

# Hence

Ein Ausflug in die Welt einer virtuellen CPU

_Dominic Grimm_

<style scoped>
h1 {
    padding-top: 1.5em;
}
</style>

![bg left](./assets/brian-kostiuk-S4jSvcHYcOs-unsplash.jpg)

---

# Inhalt

- Was ist eine CPU?
- Überblick Assembler
- Hence
- (Hence-)Forth

=> _Workshop_

---

# Was ist eine CPU?

- Herzstück eines Computers
- Kleiner Chip auf Hauptplatine
- Verarbeitung Arithmetik und Logik
- Zugriff auf Speicher und Peripherie

![bg right](./assets/harrison-broadbent-VOz0gV9HC0I-unsplash.jpg)

---

## Aufbau

![bg right:35% fit](./assets/was-ist-cpu-darstellung.png)

- _Steuerwerk, Rechenwerk, Cache, Register_
- Cache: schneller Speicher für oft benötigte Daten
- CPU kommuniziert über Bus-Systeme
- Leistung abhängig von Kernzahl, Taktfrequenz, Cache und Architektur

---

## Machine code

- Niedrigste Ebene der Programmierung.
- Binäre Instruktionen, direkt von der CPU ausgeführt
- Jede CPU-Architektur hat ihre eigene Maschinensprache, die spezifisch für diese Architektur ist

- Sehr effizient, da direkt von CPU ausgeführt
- Meist in höherer Programmiersprache geschrieben

=> _Assembler_

---

### Beispiel

_hexadezimal kodiert (`hexdump`)_

```
00000000  03 7f fc 86 03 a0 00 06  00 06 03 c0 02 8b 06 00  |................|
00000010  05 03 c0 01 8c 04 00 06  8c 03 00 01 06 00 05 03  |................|
*
```

| Code       | Opcode         | Argument         |
| ---------- | -------------- | ---------------- |
| `03 7f fc` | `0x03` (`ts`)  | `0x7ffc` (32764) |
| `86`       | `0x06` (`tlr`) |                  |
| `03 a0 00` | `0x03` (`ts`)  | `0xa000` (40960) |

---

# Überblick Assembler

![width:30cm](./assets/assembler.png)

---

# Hence

- Virtuelle "CPU" (eher SBC)
- Single core
- 16-bit Architektur

=> **_maximal 64kb Speicher_**

---

## Assembly

```assembly
.include "$lib/core.asm"
.include "$lib/std.asm"
.include "$lib/main.asm"

data:
; ...

.jump_main

main: .main main
	ts 40		; tmp = 40
	tlr CORE_REG_A	; reg_a = 40
	
	ts 2		; tmp = 2

	tlr CORE_REG_B	; reg_a = 40
			; reg_b = 2

	ts CORE_ALU_ADD	; tmp = 6
			; reg_a = 40
			; reg_b = 2
	alu		; tmp = 42
	tls		; stack = [42]

	dbg		; => DEBUG: [42]
	pop		; stack = []
.std_stop
```

