text:
Pokémon/Pokédex/Paldea Index

 * 1) Sprigatito
 * 2) Floragato
 * 3) Meowscrada
 * 4) Fuecoco
 * 5) Crocalor
 * 6) Skeledirge
 * 7) Quaxly
 * 8) Quaxwell
 * 9) Quaquaval
 * 10) Lechonk
 * 11) Oinkologne
 * 12) Tarountula
 * 13) Spidops
 * 14) Nymble
 * 15) Lokix
 * 16) Hoppip
 * 17) Skiploom
 * 18) Jumpluff
 * 19) Fletchling
 * 20) Fletchinder
 * 21) Talonflame
 * 22) Pawmi
 * 23) Pawmo
 * 24) Pawmot
 * 25) Houndor
 * 26) Houndoom
 * 27) Yungoos
 * 28) Gumshoos
 * 29) Skwovet
 * 30) Greedent
 * 31) Sunkern
 * 32) Sunflora
 * 33) Kriketot
 * 34) Kricketune
 * 35) Scatterbug
 * 36) Spewpa
 * 37) Vivillon
 * 38) Combee
 * 39) Vespiquen
 * 40) Rookidee
 * 41) Corvisquire
 * 42) Corviknight
 * 43) Happiny
 * 44) Chansey
 * 45) Blissey
 * 46) Azurill
 * 47) Marill
 * 48) Azumarill
 * 49) Surskit
 * 50) Masquerain
 * 51) Buizel
 * 52) Floatzel
 * 53) Wooper
 * 54) Clodsire
 * 55) Psyduck
 * 56) Golduck
 * 57) Chewtle
 * 58) Drednaw
 * 59) Igglybuff
 * 60) Jigglypuff
 * 61) Wigglytuff
 * 62) Ralts
 * 63) Kirlia
 * 64) Gardevoir
 * 65) Gallade
 * 66) Drowzee
 * 67) Hypno
 * 68) Gastly
 * 69) Haunter
 * 70) Gengar
 * 71) Tandemaus
 * 72) Maushold
 * 73) Pichu
 * 74) Pikachu
 * 75) Raichu
 * 76) Fidough
 * 77) Dachsbun
 * 78) Slakoth
 * 79) Vigoroth
 * 80) Slaking
 * 81) Bounsweet
 * 82) Steenee
 * 83) Tsareena
 * 84) Smoliv
 * 85) Dolliv
 * 86) Arboliva
 * 87) Bonsly
 * 88) Sudowoodo
 * 89) Rockruff
 * 90) Lycanroc
 * 91) Rolycoly
 * 92) Carkol
 * 93) Coalossal
 * 94) Shinx
 * 95) Luxio
 * 96) Luxray
 * 97) Starly
 * 98) Staravia
 * 99) Staraptor
 * 100) Oricorio
 * 101) Mareep
 * 102) Flaaffy
 * 103) Ampharos
 * 104) Petilil
 * 105) Lilligant
 * 106) Shroomish
 * 107) Breloom
 * 108) Applin
 * 109) Flapple
 * 110) Appletun
 * 111) Spoink
 * 112) Grumpig
 * 113) Squawkability
 * 114) Misdreavus
 * 115) Mismagius
 * 116) Makuhita
 * 117) Hariyama
 * 118) Crabrawler
 * 119) Crabominable
 * 120) Salandit
 * 121) Salazzle
 * 122) Phanpy
 * 123) Donphan
 * 124) Cufant
 * 125) Copperajah
 * 126) Gible
 * 127) Gabite
 * 128) Garchomp
 * 129) Nacli
 * 130) Naclstack
 * 131) Gargancl
 * 132) Wingull
 * 133) Pelipper
 * 134) Magikarp
 * 135) Gyarados
 * 136) Arrokuda
 * 137) Barraskewda
 * 138) Basculin
 * 139) Gulpin
 * 140) Swalot
 * 141) Meowth
 * 142) Persian
 * 143) Drifloon
 * 144) Drifblim
 * 145) Flabébé
 * 146) Floette
 * 147) Florges
 * 148) Diglett
 * 149) Dugtrio
 * 150) Torkoal
 * 151) Numel
 * 152) Camerupt
 * 153) Bronzor
 * 154) Bronzong
 * 155) Axew
 * 156) Fraxure
 * 157) Haxorus
 * 158) Mankey
 * 159) Primeape
 * 160) Annihilape
 * 161) Meditite
 * 162) Medicham
 * 163) Riolu
 * 164) Lucario
 * 165) Charcadet
 * 166) Armarouge
 * 167) Ceruledge
 * 168) Barboach
 * 169) Whiscash
 * 170) Tadbulb
 * 171) Bellibolt
 * 172) Goomy
 * 173) Sliggoo
 * 174) Goodra
 * 175) Croagunk
 * 176) Toxicroak
 * 177) Wattrel
 * 178) Kilowattrel
 * 179) Eevee
 * 180) Vaporeon
 * 181) Jolteon
 * 182) Flareon
 * 183) Espeon
 * 184) Umbreon
 * 185) Leafeon
 * 186) Glaceon
 * 187) Sylveon
 * 188) Dunsparce
 * 189) Dudunsparce
 * 190) Deerling
 * 191) Sawsbuck
 * 192) Girafarig
 * 193) Farigiraf
 * 194) Grimer
 * 195) Muk
 * 196) Maschiff
 * 197) Mabosstiff
 * 198) Toxel
 * 199) Toxtricity
 * 200) Dedenne
 * 201) Pachirisu
 * 202) Shroodle
 * 203) Grafaiai
 * 204) Stantler
 * 205) Foongus
 * 206) Amoonguss
 * 207) Voltorb
 * 208) Electrode
 * 209) Magnemite
 * 210) Magneton
 * 211) Magnezone
 * 212) Ditto
 * 213) Growlithe
 * 214) Arcanine
 * 215) Teddiursa
 * 216) Ursaring
 * 217) Zangoose
 * 218) Seviper
 * 219) Swablu
 * 220) Altaria
 * 221) Skidoo
 * 222) Gogoat
 * 223) Tauros
 * 224) Litleo
 * 225) Pyroar
 * 226) Stunky
 * 227) Skuntank
 * 228) Zorua
 * 229) Zoroark
 * 230) Sneasel
 * 231) Weavile
 * 232) Murkrow
 * 233) Honchkrow
 * 234) Gothita
 * 235) Gothorita
 * 236) Gothitelle
 * 237) Sinistea
 * 238) Polteageist
 * 239) Mimikyu
 * 240) Klefki
 * 241) Indeedee
 * 242) Bramblin
 * 243) Brambleghast
 * 244) Toedscool
 * 245) Toedscruel
 * 246) Tropius
 * 247) Fomantis
 * 248) Lurantis
 * 249) Klawf
 * 250) Capsakid
 * 251) Scovillain
 * 252) Cacnea
 * 253) Cacturne
 * 254) Rellor
 * 255) Rabsca
 * 256) Venonat
 * 257) Venomoth
 * 258) Pineco
 * 259) Forretress
 * 260) Scyther
 * 261) Scizor
 * 262) Heracross
 * 263) Flittle
 * 264) Espathra
 * 265) Hippopotas
 * 266) Hippowdon
 * 267) Sandile
 * 268) Krokorok
 * 269) Krookodile
 * 270) Silicobra
 * 271) Sandaconda
 * 272) Mudbray
 * 273) Mudsdale
 * 274) Larvesta
 * 275) Volcarona
 * 276) Bagon
 * 277) Shelgon
 * 278) Salamene
 * 279) Tinkatink
 * 280) Tinkatuff
 * 281) Tinkaton
 * 282) Hatenna
 * 283) Hattrem
 * 284) Hatterene
 * 285) Impidimp
 * 286) Morgrem
 * 287) Grimmsnarl
 * 288) Wiglett
 * 289) Wugtrio
 * 290) Bombirdier
 * 291) Finizen
 * 292) Palafin
 * 293) Varoom
 * 294) Revavroom
 * 295) Cyclizar
 * 296) Orthworm
 * 297) Sableye
 * 298) Shuppet
 * 299) Banette
 * 300) Falinks
 * 301) Hawlucha
 * 302) Spiritomb
 * 303) Noibat
 * 304) Noivern
 * 305) Dreepy
 * 306) Drakloak
 * 307) Dragapult
 * 308) Glimmet
 * 309) Glimmora
 * 310) Rotom
 * 311) Greavard
 * 312) Houndstone
 * 313) Oranguru
 * 314) Passimian
 * 315) Komala
 * 316) Larvitar
 * 317) Pupitar
 * 318) Tyranitar
 * 319) Stonjourner
 * 320) Eiscue
 * 321) Pincurchin
 * 322) Sandygast
 * 323) Palossand
 * 324) Slowpoke
 * 325) Slowbro
 * 326) Slowking
 * 327) Shellos
 * 328) Gastrodon
 * 329) Shellder
 * 330) Cloyster
 * 331) Qwilfish
 * 332) Luvdisc
 * 333) Finneon
 * 334) Lumineon
 * 335) Bruxish
 * 336) Alomomola
 * 337) Skrelp
 * 338) Dragalge
 * 339) Clauncher
 * 340) Clawitzer
 * 341) Tynamo
 * 342) Eelektrik
 * 343) Elektross
 * 344) Mareanie
 * 345) Toxapex
 * 346) Flamigo
 * 347) Dratini
 * 348) Dragonair
 * 349) Dragonite
 * 350) Snom
 * 351) Frosmoth
 * 352) Snover
 * 353) Abomasnow
 * 354) Delibird
 * 355) Cubchoo
 * 356) Beartic
 * 357) Snorunt
 * 358) Glalie
 * 359) Froslass
 * 360) Cryogonal
 * 361) Cetoddle
 * 362) Cetitan
 * 363) Bergmite
 * 364) Avalugg
 * 365) Rufflet
 * 366) Braviary
 * 367) Pawniard
 * 368) Bisharp
 * 369) Kingambit
 * 370) Deino
 * 371) Zweilous
 * 372) Hydreigon
 * 373) Veluza
 * 374) Dondozo
 * 375) Tatsugiri
 * 376) Great Tusk
 * 377) Scream Tail
 * 378) Brute Bonnet
 * 379) Flutter Mane
 * 380) Slither Wing
 * 381) Sandy Shocks
 * 382) Iron Treads
 * 383) Iron Bundle
 * 384) Iron Hands
 * 385) Iron Jugulis
 * 386) Iron Moth
 * 387) Iron Thorns
 * 388) Frigibax
 * 389) Arctibax
 * 390) Baxcalibur
 * 391) Gimmighoul
 * 392) Gholdengo
 * 393) Wo-Chien
 * 394) Chain-Pao
 * 395) Ting-Lu
 * 396) Chi-Yu
 * 397) Roaring Moon
 * 398) Iron Valiant
 * 399) Koraidon
 * 400) Miraidon

title: Pokémon/Pokédex/Paldea Index


text:
Pokémon/Pokédex/Maschiff

Description
A doglike Pokémon with a yellow mane.

Basic Statistics
A dark type Pokémon.

How to Evolve
Maschiff evolves into Mabosstiff at level 30.

Name
The name is likely a play on the Mastiff, a real world dog bread.

license: Creative Commons - Attribution Share-Alike - https://creativecommons.org/licenses/by-sa/4.0/

title: Pokémon/Pokédex/Maschiff


text:
Talk:Lombard/Irregular verbs

Translated from
Translated from https://it.wikibooks.org/wiki/Lombardo/Verbi_irregolari

Updated from wiktionary:lmo:Apendice:Verb_iregolar_in_lombard on december 15th 2022 Gat lombard (discuss • contribs) 10:04, 15 December 2022 (UTC)

title: Talk:Lombard/Irregular verbs


text:
JavaScript/Changing element styles/Exercises

Topic: CSS style

We use the HTML page of the previous page for the exercises.

1. Modify the function.
 * If the background color of 'div_1' is green, change it to aqua; else, change it back to green.
 * If the background color of the button is red, change it to yellow; else, change it back to red.

2. Be creative. Modify the function  so that other CSS properties change, e.g., div's text size, body's padding or background color, ... .

3. Modify the function.
 * Ask the user  which background color he prefers for the first div.
 * Change the background color of the first div to this color.


text:
Judaism/Jewish Population

According to Wikipedia "As of 2020, the world's "core" Jewish population (those identifying as Jews above all else) was estimated at 14.8 million, 0.19% of the 7.95 billion worldwide population. This number rises to 18 million with the addition of the "connected" Jewish population, including those who say they are partly Jewish or that have Jewish backgrounds from at least one Jewish parent, and rises again to 21 million with the addition of the "enlarged" Jewish population, including those who say they have Jewish backgrounds but no Jewish parents and all non-Jewish household members who live with Jews. Counting all those who are eligible for Israeli citizenship under Israel's Law of Return, in addition to Israeli Jews, raised the total to 23.8 million."

title: Judaism/Jewish Population


text:
Fractals/fraktaler-3

Fraktaler 3 is a
 * cross-platform (Linux, Windows, Android, Web)
 * fractal program by Claude Heiland-Allen
 * for fast deep zooming of hybrid escape-time 2D fractals.

It has a graphical explorer using SDL2, OpenGLES and Dear ImGUI, and a batch mode for high resolution images and zoom sequences, with optional export of raw data in EXR format compatible with Kalles Fraktaler 2 + and zoomasm.

=dependencies=
 * SDL2
 * OpenGLES
 * Dear ImGUI
 * OpenCl

git clone https://github.com/ocornut/imgui.git git clone https://github.com/AirGuanZ/imgui-filebrowser.git git clone https://github.com/ToruNiina/toml11.git git clone https://code.mathr.co.uk/fraktaler-3.git

sudo apt install \ build-essential \ git \ libglm-dev \ libmpfr-dev \ libmpfrc++-dev \ libopenexr-dev \ libsdl2-dev \ ocl-icd-opencl-dev \ opencl-headers \ p7zip \ pkg-config \ pocl-opencl-icd \ xxd

=run= ./fraktaler-3.gcc

fraktaler-3-2 -P -b zoom-out-sequence.toml loaded wisdom /home/claude/.local/share/uk.co.mathr/fraktaler-3/wisdom.toml Frame[100%] Ref[100%] BLA[100%] Tile[100%] $ ls fraktaler-3.00000000.exr fraktaler-3.00000006.exr  fraktaler-3.00000012.exr fraktaler-3.00000001.exr fraktaler-3.00000007.exr  fraktaler-3.00000013.exr fraktaler-3.00000002.exr fraktaler-3.00000008.exr  fraktaler-3.00000014.exr fraktaler-3.00000003.exr fraktaler-3.00000009.exr  fraktaler-3.00000015.exr fraktaler-3.00000004.exr fraktaler-3.00000010.exr  zoom-out-sequence.toml fraktaler-3.00000005.exr fraktaler-3.00000011.exr $ exrheader fraktaler-3.00000000.exr ... dataWindow (type box2i): (0 0) - (12287 1359) ... $ display *.exr (images are all white, because they are 100% exterior due to starting at default zoom 1e0) $

help
Output of fraktaler-3 --help:

usage: fraktaler-3 [mode] [flags ...] [inputfile [inputfile ...]] modes of operation: -h, --help               print this message and exit -V, --version            print version information and exit -i, --interactive        interactive graphical user interface -b, --batch              command line batch processing -W, --generate-wisdom    generate initial hardware configuration -B, --benchmark-wisdom   benchmark hardware for optimal efficiency -S, --export-source      export this program's source code flags: -v, --verbose            increase verbosity -q, --quiet              decrease verbosity -p, --persistence file   path to persist state -P, --no-persistence     don't persist state -w, --wisdom file        path to wisdom input files are merged in command line order The help text will list the default locations for persistence and wisdom files on your system, as well as the file name for the --export-source option.

Multiple parameter files may be specified on the command line. After persistence is loaded, they are merged in order (later files override earlier files). This allows you to keep different aspects of parameters in different files.

=transformations=
 * The exponential map feature is not so useful in the graphical program, but can be used in the command line version for rendering a zoom out sequence for later assembly into a video using zoomasm

=Links= =files=
 * fraktaler - home page
 * live online version
 * git repo
 * parameter file text (suggested extension .f3.toml) - TOML format
 * images (EXR format, extension .exr) - OpenEXR

exrheader fraktaler-3.00000037.exr

file fraktaler-3.00000037.exr:

file format version: 2, flags 0x0 Fraktaler3 (type string): "program = "fraktaler-3" version = "0-414-g61fa84a" location.real = "-1.748764520194788535" location.imag = "3e-13" location.zoom = "1.0000000e15" bailout.iterations = 262144 bailout.maximum_reference_iterations = 262144 bailout.maximum_perturb_iterations = 4096 bailout.inscape_radius = 0.000976562 image.width = 601 image.height = 67 image.subframes = 64 transform.reflect = true transform.exponential_map = true render.zoom_out_sequence = true opencl.tile_width = 601 opencl.tile_height = 67 " channels (type chlist): B, 32-bit floating-point, sampling 1 1 G, 32-bit floating-point, sampling 1 1 R, 32-bit floating-point, sampling 1 1 compression (type compression): zip, multi-scanline blocks dataWindow (type box2i): (0 0) - (600 66) displayWindow (type box2i): (0 0) - (600 66) lineOrder (type lineOrder): increasing y pixelAspectRatio (type float): 1 screenWindowCenter (type v2f): (0 0) screenWindowWidth (type float): 1 type (type string): "scanlineimage"

title: Fractals/fraktaler-3


text:
Oberon/ETH Oberon/Input.Mod

(* ETH Oberon, Copyright 1990-2003 Computer Systems Institute, ETH Zurich, CH-8092 Zurich. Refer to the license.txt file provided with this distribution. *) MODULE Input;	(** portable, except where noted *)	(* pjm *) (* 	Native Oberon Input, pjm 09.06.95 	Mouse protocol information from XFree in X11R6 distribution (Thomas Roell & David Dawes) 	PS/2 Aux port information from Linux (Johan Myreen et al.) 	Added support for 82C710 controller (QuickPort), pr 12.09.2000 	- information about 82C710 from Linux (qpmouse.c, 8-Sep-95) *) (** Module Input is responsible for event timing, mouse and keyboard input. *) IMPORT Files, Kernel, V24, SYSTEM; CONST TimeUnit* = 1000;	(** portable, but VAR on other ports *)	(** timer ticks per second (platform dependent). *) SHIFT* = 0; CTRL* = 1;  ALT* = 2;	(** for KeyState *) BufSize = 32;	(* keyboard buffer size *) AuxSize = 301;	(* PS/2 aux port buffer size (multiple of 3 + 1)*) ScrollLock = 0; NumLock = 1;  CapsLock = 2;  LAlt = 3;  RAlt = 4; LCtrl = 5; RCtrl = 6;  LShift = 7;  RShift = 8;  GreyEsc = 9; Resetting = 10; SetTypematic = 11;  SendingLEDs = 12; MenuShift = 13; DeadKey = 0; AUX = -1; NONE = -2; Trace = FALSE; (* mouse types *) MinType = 0; MaxType = 9; MS = 0; MSC1 = 1;  MM = 2;  Logi = 3;  MSC2 = 4;  LogiMan = 5;  PS2 = 6;  MSI = 7;  MSC3 = 8;  MSC4 = 9; (* Native.Install.Text & build tool 	0 Microsoft serial (2-button) 	1  Mouse Systems Corp serial type a (dtr on, rts on) 	2  Logitech serial Type a (old models) 	3  Logitech serial Type b (old models) 	4  Mouse Systems Corp serial type b (dtr off, rts off) 	5  Logitech serial Type c (new models) 	6  PS/2 mouse (default) 	7  Microsoft serial IntelliMouse 	8  Mouse Systems Corp serial type c (dtr off, rts on) 	9  Mouse Systems Corp serial type d (dtr on, rts off) 	MT=PS2  PS/2 or built-in 	MT=LM1  Logitech 1 	MT=LM2  Logitech 2 	MT=LM3  Logitech 3 	MT=MS1  Mouse Systems 1 	MT=MS2  Mouse Systems 2 	MT=MS3  Mouse Systems 3 	MT=MS4  Mouse Systems 4 	MT=MSM  Microsoft (2-button) 	MT=MSI  Microsoft IntelliMouse 	MP=1 	MP=2 *) (* 82C710 controller command and status bits *) QpDevIdle = 0; QpRxFull = 1; QpTxIdle = 2; QpReset = 3; QpIntsOn = 4; QpErrorFlag = 5; QpClear = 6; QpEnable = 7; TYPE PollMouse* = PROCEDURE (VAR keys: SET; VAR dx, dy, dz: INTEGER): BOOLEAN;	(** non-portable *) PollKeyboard* = PROCEDURE (VAR ch: CHAR; VAR keys: SET): BOOLEAN;	(** non-portable *) MousePoller = POINTER TO RECORD poll: PollMouse; next: MousePoller END; KeyboardPoller = POINTER TO RECORD poll: PollKeyboard; next: KeyboardPoller END; KeyTable = POINTER TO ARRAY OF CHAR; VAR mouseErrors, auxoverflows: LONGINT; (* mouse state *) mouse: MousePoller; minX, minY, maxX, maxY, mouseX, mouseY, height: LONGINT; port, oldport, newport, rate: INTEGER;	(* Serial mouse port, bps and report rate (if supported) *) bps: LONGINT; type: SHORTINT;	(* mouse type *) buttons: SHORTINT;	(* -2, -3, 2, 3 *) mapkeys: ARRAY 8 OF SET; mbufp, numb: SHORTINT;	(* buffer pointer & protocol bytes *) mbuf: ARRAY 5 OF SET;	(* protocol buffer *) mask0, val0, mask1, val1, lastkeys: SET;	(* protocol parameters *) auxbuf: ARRAY AuxSize OF CHAR;	(* aux port buffer *) auxhd, auxtl: INTEGER;	(* aux buffer pointers *) threshold: INTEGER;	(* speedup threshold *) speedup: LONGINT; auxinit: BOOLEAN; auxId: CHAR; (* 82C710 mouse port *) qp: BOOLEAN; qpStatusPort: LONGINT; qpDataPort: LONGINT; (* keyboard state *) keyboard: KeyboardPoller; buffer: ARRAY 1+BufSize OF CHAR;	(* first byte not used (System.State security) *) head, tail, dkey: SHORTINT; lastport: LONGINT; lastvalue: SYSTEM.BYTE; keyval: INTEGER; table: LONGINT; flags, pollkeys: SET; breakproc, timerproc: Kernel.Proc; keytable: KeyTable;	(* anchor for keyboard table loaded from file *) kpmap: SET; kdx, kdy, counter0, counter1: INTEGER; (* Keyboard Driver  *) (* Translation table format:  	table = { scancode unshifted-code shifted-code flags }  0FFX . 	scancode = <scancode byte from keyboard, bit 7 set for "grey" extended keys> 	unshifted-code = <CHAR produced by this scancode, without shift> 	shifted-code = <CHAR produced by this scancode, with shift> 	flags = <bit-mapped flag byte indicating special behaviour> 	flag bit	function 		0	01	DeadKey: Set dead key flag according to translated key code (1-7) 		1	02	NumLock: if set, the state of NumLock will reverse the action of shift (for num keypad) 		2	04	CapsLock: if set, the state of CapsLock will reverse the action of shift (for alpha keys) 		3	08	LAlt:  \ the state of these two flags in the table and the current state of the two... 		4	10	RAlt: / ...Alt keys must match exactly, otherwise the search is continued. 		5	20	\ 		6	40	 >  dead key number (0-7), must match current dead key flag 7	80	/ 	The table is scanned sequentially (speed not critical). Ctrl-Break, Ctrl-F10 and Ctrl-Alt-Del are always defined and are not in the table. The control keys are also always defined. *) (* TableUS - US keyboard translation table (dead keys: ^=1, '=2, `=3, ~=4, "=5) *) PROCEDURE TableUS: LONGINT; CODE {SYSTEM.i386} 	CALL L1 L1: 	POP EAX 	ADD EAX,8 	POP EBP 	RET 		(* alphabet *) 	DB 1EX, "a", "A", 4X,	30X, "b", "B", 4X,	2EX, "c", "C", 4X,	20X, "d", "D", 4X 	DB 12X, "e", "E", 4X,	21X, "f", "F", 4X,	22X, "g", "G", 4X,	23X, "h", "H", 4X 	DB 17X, "i", "I", 4X,	24X, "j", "J", 4X,	25X, "k", "K", 4X,	26X, "l", "L", 4X 	DB 32X, "m", "M", 4X,	31X, "n", "N", 4X,	18X, "o", "O", 4X,	19X, "p", "P", 4X 	DB 10X, "q", "Q", 4X,	13X, "r", "R", 4X,	1FX, "s", "S", 4X,	14X, "t", "T", 4X 	DB 16X, "u", "U", 4X,	2FX, "v", "V", 4X,	11X, "w", "W", 4X,	2DX, "x", "X", 4X 	DB 15X, "y", "Y", 4X,	2CX, "z", "Z", 4X 		(* Oberon accents (LAlt & RAlt) *) 	DB 1EX, "ä", "Ä", 0CX,	12X, "ë", 0FFX, 0CX,	18X, "õ", "Õ", 0CX,	16X, "ü", "Ü", 0CX 	DB 17X, "ï", 0FFX, 0CX,	1FX, "ß", 0FFX, 0CX,	2EX, "ç", 0FFX, 0CX,	31X, "ñ", 0FFX, 0CX DB 1EX, "ä", "Ä", 14X,	12X, "ë", 0FFX, 14X,	18X, "õ", "Õ", 14X,	16X, "ü", "Ü", 14X DB 17X, "ï", 0FFX, 14X,	1FX, "ß", 0FFX, 14X,	2EX, "ç", 0FFX, 14X,	31X, "ñ", 0FFX, 14X (* dead keys (LAlt & RAlt) *) DB 07X, 0FFX, 1X, 9X,	28X, 2X , 5X , 9X,	29X, 3X , 4X , 9X, DB 07X, 0FFX, 1X, 11X,	28X, 2X , 5X , 11X,	29X, 3X , 4X , 11X, (* following keys *) DB 1EX, "â", 0FFX, 20X,	12X, "ê", 0FFX, 20X,	17X, "î", 0FFX, 20X,	18X, "ô", 0FFX, 20X DB 16X, "û", 0FFX, 20X,	1EX, "à", 0FFX, 60X,	12X, "è", 0FFX, 60X,	17X, "ì", 0FFX, 60X DB 18X, "ò", 0FFX, 60X,	16X, "ù", 0FFX, 60X,	1EX, "á", 0FFX, 40X,	12X, "é", 0FFX, 40X DB 1EX, "ä", "Ä", 0A4X,	12X, "ë", 0FFX, 0A0X,	17X, "ï", 0FFX, 0A0X,	18X, "õ", "Õ", 0A4X DB 16X, "ü", "Ü", 0A4X,	31X, "ñ", 0FFX, 80X (* numbers at top *) DB 0BX, "0", ")", 0X,	02X, "1", "!", 0X,	03X, "2", "@", 0X,	04X, "3", "#", 0X 	DB 05X, "4", "$", 0X,	06X, "5", "%", 0X,	07X, "6", "^", 0X,	08X, "7", "&", 0X 	DB 09X, "8", "*", 0X,	0AX, "9", "(", 0X (* symbol keys *) DB 28X, "'", 22X, 0X,	33X, ",", "<", 0X,	0CX, "-", "_", 0X,	34X, ".", ">", 0X DB 35X, "/", "?", 0X,	27X, ";", ":", 0X,	0DX, "=", "+", 0X,	1AX, "[", "{", 0X DB 2BX, "\", "|", 0X,	1BX, "]", "}", 0X,	29X, "`", "~", 0X (* control keys *) DB 0EX, 7FX, 7FX, 0X	(* backspace *) DB 0FX, 09X, 09X, 0X	(* tab *) DB 1CX, 0DX, 0DX, 0X	(* enter *) DB 39X, 20X, 20X, 0X	(* space *) DB 01X, 1BX, 1BX, 0X	(* esc *) (* keypad *) DB 4FX, 0A9X, "1", 2X	(* end/1 *) DB 50X, 0C2X, "2", 2X	(* down/2 *) DB 51X, 0A3X, "3", 2X	(* pgdn/3 *) DB 4BX, 0C4X, "4", 2X	(* left/4 *) DB 4CX, 0FFX, "5", 2X	(* center/5 *) DB 4DX, 0C3X, "6", 2X	(* right/6 *) DB 47X, 0A8X, "7", 2X	(* home/7 *) DB 48X, 0C1X, "8", 2X	(* up/8 *) DB 49X, 0A2X, "9", 2X	(* pgup/9 *) DB 52X, 0A0X, "0", 2X	(* insert/0 *) DB 53X, 0A1X, 2EX, 2X	(* del/. *) (* grey keys *) DB 4AX, "-", "-", 0X	(* grey - *) DB 4EX, "+", "+", 0X	(* grey + *) DB 0B5X, "/", "/", 0X	(* grey / *) DB 37X, "*", "*", 0X	(* grey * *) DB 0D0X, 0C2X, 0C2X, 0X	(* grey down *) DB 0CBX, 0C4X, 0C4X, 0X	(* grey left *) DB 0CDX, 0C3X, 0C3X, 0X	(* grey right *) DB 0C8X, 0C1X, 0C1X, 0X	(* grey up *) DB 09CX, 0DX, 0DX, 0X	(* grey enter *) DB 0D2X, 0A0X, 0A0X, 0X	(* grey ins *) DB 0D3X, 0A1X, 0A1X, 0X	(* grey del *) DB 0C9X, 0A2X, 0A2X, 0X	(* grey pgup *) DB 0D1X, 0A3X, 0A3X, 0X	(* grey pgdn *) DB 0C7X, 0A8X, 0A8X, 0X	(* grey home *) DB 0CFX, 0A9X, 0A9X, 0X	(* grey end *) (* function keys *) DB 3BX, 0A4X, 0FFX, 0X	(* F1 *) DB 3CX, 0A5X, 0FFX, 0X	(* F2 *) DB 3DX, 1BX, 0FFX, 0X	(* F3 *) DB 3EX, 0A7X, 0FFX, 0X	(* F4 *) DB 3FX, 0F5X, 0FFX, 0X	(* F5 *) DB 40X, 0F6X, 0FFX, 0X	(* F6 *) DB 41X, 0F7X, 0FFX, 0X	(* F7 *) DB 42X, 0F8X, 0FFX, 0X	(* F8 *) DB 43X, 0F9X, 0FFX, 0X	(* F9 *) DB 44X, 0FAX, 0FFX, 0X	(* F10 *) DB 57X, 0FBX, 0FFX, 0X	(* F11 *) DB 58X, 0FCX, 0FFX, 0X	(* F12 *) DB 0FFX END TableUS; PROCEDURE TableFromFile(name: ARRAY OF CHAR): KeyTable; VAR f: Files.File; r: Files.Rider;  len: LONGINT;  t: KeyTable; BEGIN Kernel.WriteString("Keyboard: "); Kernel.WriteString(name); f := Files.Old(name); IF f # NIL THEN len := Files.Length(f); IF len MOD 4 = 0 THEN NEW(t, len+1); Files.Set(r, f, 0); Files.ReadBytes(r, t^, len); IF r.res = 0 THEN Kernel.WriteLn; t[len] := 0FFX; RETURN t 			END END END; Kernel.WriteString(" not used"); Kernel.WriteLn; RETURN NIL END TableFromFile; (* Translate - Translate scan code "c" to key. *) PROCEDURE Translate(flags: SET; c: CHAR): INTEGER; CONST Alt = {LAlt, RAlt}; Ctrl = {LCtrl, RCtrl};  Shift = {LShift, RShift}; VAR a: LONGINT; s1: CHAR;  s: SET;  k: INTEGER;  dkn: SHORTINT; BEGIN IF (c = 46X) & (flags * Ctrl # {}) THEN RETURN -2 END;	(* Ctrl-Break - break *) IF (c = 44X) & (flags * Ctrl # {}) THEN RETURN 0FFH END;	(* Ctrl-F10 - exit *) IF (c = 53X) & (flags * Ctrl # {}) & (flags * Alt # {}) THEN RETURN 0FFH END;	(* Ctrl-Alt-Del - exit *) IF GreyEsc IN flags THEN c := CHR(ORD(c)+80H) END; a := table; LOOP SYSTEM.GET(a, s1); IF s1 = 0FFX THEN	(* end of table, unmapped key *) k := -1; dkey := 0;  EXIT ELSIF s1 = c THEN	(* found scan code in table *) SYSTEM.GET(a+3, SYSTEM.VAL(CHAR, s));	(* flags from table *) dkn := SHORT(SHORT(SYSTEM.VAL(LONGINT, SYSTEM.LSH(s * {5..7}, -5)))); s := s * {DeadKey, NumLock, CapsLock, LAlt, RAlt, LCtrl, RCtrl}; k := 0; IF ((s * Alt = flags * Alt) OR (NumLock IN s)) & (dkn = dkey) THEN	(* Alt & dead keys match exactly *) IF flags * Shift # {} THEN INCL(s, LShift) END;	(* check if shift pressed *) (* handle CapsLock *) IF (CapsLock IN s) & (CapsLock IN flags) THEN s := s / {LShift} END; (* handle NumLock *) IF NumLock IN s THEN IF flags * Alt # {} THEN INCL(s, LShift) ELSIF NumLock IN flags THEN s := s / {LShift} END END; (* get key code *) IF LShift IN s THEN SYSTEM.GET(a+2, SYSTEM.VAL(CHAR, k))	(* shifted value *) ELSE SYSTEM.GET(a+1, SYSTEM.VAL(CHAR, k))	(* unshifted value *) END; IF (DeadKey IN s) & (k <= 7) THEN	(* dead key *) dkey := SHORT(k); k := -1	(* set new dead key state *) ELSIF k = 0FFH THEN	(* unmapped key *) k := -1; dkey := 0	(* reset dead key state *) ELSE	(* mapped key *) IF flags * Ctrl # {} THEN IF ((k >= 64) & (k <= 95)) OR ((k >= 97) & (k <= 122)) THEN k := SHORT(SYSTEM.VAL(LONGINT, SYSTEM.VAL(SET, k) * {0..4}))	(* control *) ELSIF k = 13 THEN	(* Ctrl-Enter *) k := 10 END END; IF flags * Alt # {} THEN	(* Alt-keypad *) IF (k >= ORD("0")) & (k <= ORD("9")) & (NumLock IN s) THEN	(* keypad num *) IF keyval = -1 THEN keyval := k-ORD("0") ELSE keyval := (10*keyval + (k-ORD("0"))) MOD 1000 END; k := -1 END END; dkey := 0	(* reset dead key state *) END; EXIT END END; INC(a, 4) END; (* LOOP *) RETURN k END Translate; (* Wait - Wait for keyboard serial port to acknowledge byte. *) PROCEDURE Wait; VAR t: Kernel.MilliTimer; s: SET; BEGIN Kernel.SetTimer(t, Kernel.TimeUnit DIV 50);	(* wait up to 17 ms *) REPEAT SYSTEM.PORTIN(64H, SYSTEM.VAL(CHAR, s)) UNTIL ~(1 IN s) OR Kernel.Expired(t) END Wait; (* SendByte - Send a byte to the keyboard. *) PROCEDURE SendByte(port: LONGINT; value: SYSTEM.BYTE); BEGIN Wait; SYSTEM.PORTOUT(port, SYSTEM.VAL(CHAR, value)); lastport := port; lastvalue := value END SendByte; (* ShiftKey - Handle shift keys. *) PROCEDURE ShiftKey(left, right: SHORTINT; in: BOOLEAN); BEGIN IF in THEN IF GreyEsc IN flags THEN INCL(flags, right) ELSE INCL(flags, left) END ELSE IF GreyEsc IN flags THEN EXCL(flags, right) ELSE EXCL(flags, left) END END END ShiftKey; (* LedKey - Handle "lock" keys. *) PROCEDURE LedKey(VAR flags: SET; lock: SHORTINT;  c: CHAR; 		VAR k: INTEGER); BEGIN IF flags * {LAlt, RAlt, LCtrl, RCtrl, LShift, RShift} = {} THEN flags := flags / {lock} ELSE k := Translate(flags, c) 	END END LedKey; (* DisableInterrupts - Disable interrupts and return original flags state *) PROCEDURE -DisableInterrupts: SET; CODE {SYSTEM.i386} PUSHFD POP EAX CLI END DisableInterrupts; (* RestoreInterrupts - Set flags state to restore interrupts to previous state *) PROCEDURE -RestoreInterrupts(state: SET); CODE {SYSTEM.i386} POPFD END RestoreInterrupts; (* MapScanCode - Map a scan code "c" to a key code. *) PROCEDURE MapScanCode(c: CHAR): INTEGER; VAR k: INTEGER; oldleds, state: SET; BEGIN SendByte(64H, 0ADX); Wait;	(* disable keyboard *) k := -1; oldleds := flags * {ScrollLock, NumLock, CapsLock}; IF c = 0X THEN	(* overrun, ignore *) ELSIF c = 0FAX THEN	(* keyboard ack *) IF Resetting IN flags THEN EXCL(flags, Resetting); INCL(flags, SendingLEDs); SendByte(60H, 0EDX)	(* set keyboard LEDs *) ELSIF SendingLEDs IN flags THEN SendByte(60H, SYSTEM.VAL(CHAR, oldleds)); EXCL(flags, SendingLEDs) ELSIF SetTypematic IN flags THEN EXCL(flags, SetTypematic); INCL(flags, Resetting); SendByte(60H, 020X)	(* 30Hz, 500 ms *) ELSE (* assume ack was for something else *) END ELSIF c = 0FEX THEN	(* keyboard resend *) SendByte(lastport, lastvalue) ELSIF c = 038X THEN	(* Alt make *) ShiftKey(LAlt, RAlt, TRUE) ELSIF c = 01DX THEN	(* Ctrl make *) ShiftKey(LCtrl, RCtrl, TRUE) ELSIF c = 02AX THEN	(* LShift make *) INCL(flags, LShift) ELSIF c = 036X THEN	(* RShift make *) INCL(flags, RShift) ELSIF c = 05DX THEN	(* menu make *) INCL(flags, MenuShift) ELSIF c = 03AX THEN	(* Caps make *) LedKey(flags, CapsLock, c, k) 	ELSIF c = 046X THEN	(* Scroll make *) LedKey(flags, ScrollLock, c, k); state := DisableInterrupts; IF ScrollLock IN flags THEN IF Kernel.timer = NIL THEN Kernel.timer := timerproc END ELSE IF Kernel.timer = timerproc THEN Kernel.timer := NIL END END; RestoreInterrupts(state) ELSIF c = 045X THEN	(* Num make *) LedKey(flags, NumLock, c, k) 	ELSIF c = 0B8X THEN	(* Alt break *) ShiftKey(LAlt, RAlt, FALSE); IF (keyval >= 0) & (keyval < 255) THEN k := keyval END;	(* exclude 255 - reboot *) keyval := -1 ELSIF c = 09DX THEN	(* Ctrl break *) ShiftKey(LCtrl, RCtrl, FALSE) ELSIF c = 0AAX THEN	(* LShift break *) EXCL(flags, LShift) ELSIF c = 0B6X THEN	(* RShift break *) EXCL(flags, RShift) ELSIF c = 0DDX THEN	(* menu break *) EXCL(flags, MenuShift) ELSIF (flags * {ScrollLock, GreyEsc} = {ScrollLock}) & (c >= 47X) & (c <= 53X) & (c # 4AX) & (c # 4EX) THEN	(* key mouse *) INCL(kpmap, ORD(c)-47H) ELSIF c < 080X THEN	(* Other make *) k := Translate(flags, c) 	ELSIF (flags * {ScrollLock, GreyEsc} = {ScrollLock}) & (c >= 0C7X) & (c <= 0D3X) THEN	(* key mouse *) EXCL(kpmap, ORD(c)-0C7H) ELSE	(* ignore *) END; IF c = 0E0X THEN INCL(flags, GreyEsc) ELSE EXCL(flags, GreyEsc) END; IF flags * {ScrollLock, NumLock, CapsLock} # oldleds THEN INCL(flags, SendingLEDs); SendByte(60H, 0EDX)	(* set keyboard LEDs *) END; SendByte(64H, 0AEX);	(* enable keyboard *) RETURN k END MapScanCode; (* PROCEDURE -CS: LONGINT 	033H, 0C0H,	(* XOR EAX,EAX *) 	066H, 08CH, 0C8H;	(* MOV AX,CS *) *) PROCEDURE -CS: LONGINT; CODE {SYSTEM.i386} XOR EAX, EAX MOV AX, CS END CS; (* KeyboardInterrupt - Handle interrupts from keyboard *) PROCEDURE KeyboardInterrupt; VAR m: SET; c: CHAR;  k: INTEGER;  fp, esp, tmp, cs: LONGINT;  i: SHORTINT; BEGIN SYSTEM.PORTIN(060H, c);	(* get scan code *) SYSTEM.PORTIN(061H, SYSTEM.VAL(CHAR, m)); INCL(m, 7); SYSTEM.PORTOUT(061H, SYSTEM.VAL(CHAR, m)); EXCL(m, 7); SYSTEM.PORTOUT(061H, SYSTEM.VAL(CHAR, m));	(* ack *) SYSTEM.STI; k := MapScanCode(c); IF k = -2 THEN	(* break *) head := 0; tail := 0;	(* clear buffer *) IF ~Kernel.break THEN	(* first try: soft break *) Kernel.break := TRUE ELSIF ~Kernel.inGC THEN	(* second try: do hard break *) Kernel.break := FALSE;	(* cancel other break *) SYSTEM.GETREG(5, fp);	(* EBP *) SYSTEM.GET(fp+52, tmp);	(* get CS'' *) cs := CS; IF tmp MOD 4 # cs MOD 4 THEN	(* we interrupted at different level *) (* assume we are currently on system stack *) (* simulate a CALL to breakproc *) SYSTEM.GET(fp+48, tmp);	(* save old EIP *) SYSTEM.PUT(fp+48, breakproc); SYSTEM.GET(fp+60, esp);	(* get outer ESP *) DEC(esp, 4); SYSTEM.PUT(fp+60, esp); SYSTEM.PUT(esp, tmp)	(* PUSH old EIP *) ELSE	(* we interrupted at same level *) (* simulate a JMP to breakproc *) SYSTEM.PUT(fp+48, breakproc) END END ELSIF k >= 0 THEN i := (tail+1) MOD BufSize; IF i # head THEN buffer[1+tail] := CHR(k); tail := i 		END END END KeyboardInterrupt; (* InitKeyboard - Initialise the keyboard. *) PROCEDURE InitKeyboard; VAR s: SET; c: CHAR;  i: SHORTINT;  k: ARRAY 8 OF CHAR; BEGIN head := 0; tail := 0;  keyval := -1;  buffer[0] := 0X; (* Get table *) Setting("Keyboard"); (* install interrupt *) flags := {}; Kernel.InstallIP(KeyboardInterrupt, Kernel.IRQ+1); (* clear the keyboard's internal buffer *) i := 8; LOOP SYSTEM.PORTIN(64H, SYSTEM.VAL(CHAR, s)); IF ~(0 IN s) OR (i = 0) THEN EXIT END; SYSTEM.PORTIN(60H, c);	(* read byte *) SYSTEM.PORTIN(61H, SYSTEM.VAL(CHAR, s)); INCL(s, 7); SYSTEM.PORTOUT(61H, SYSTEM.VAL(CHAR, s)); EXCL(s, 7); SYSTEM.PORTOUT(61H, SYSTEM.VAL(CHAR, s));	(* ack *) DEC(i) END; flags := {SetTypematic}; Kernel.GetConfig("NumLock", k); IF k[0] = "1" THEN INCL(flags, NumLock) END; SendByte(60H, 0F3X)	(* settypedel, will cause Ack from keyboard *) END InitKeyboard; (* PS/2 aux port driver  *) PROCEDURE PollAux; VAR s: SET; t: Kernel.MilliTimer;  i: SHORTINT; BEGIN i := 10;	(* up to 0.2s! *) LOOP IF qp THEN SYSTEM.PORTIN(qpStatusPort, SYSTEM.VAL(CHAR, s)); IF (s * {QpRxFull, QpTxIdle, QpDevIdle} = {QpTxIdle, QpDevIdle}) OR (i = 0) THEN EXIT END; SYSTEM.PORTIN(qpStatusPort, SYSTEM.VAL(CHAR, s)); IF s * {QpRxFull} = {QpRxFull} THEN SYSTEM.PORTIN(qpDataPort, SYSTEM.VAL(CHAR, s)) END;	(* byte avail *) ELSE SYSTEM.PORTIN(64H, SYSTEM.VAL(CHAR, s)); IF (s * {0,1} = {}) OR (i = 0) THEN EXIT END; SYSTEM.PORTIN(64H, SYSTEM.VAL(CHAR, s)); IF s * {0,5} = {0,5} THEN SYSTEM.PORTIN(60H, SYSTEM.VAL(CHAR, s)) END;	(* byte avail *) END; Kernel.SetTimer(t, TimeUnit DIV 50);	(* 20ms *) REPEAT UNTIL Kernel.Expired(t); DEC(i) END END PollAux; PROCEDURE InAux: CHAR; VAR s: SET; ch: CHAR; t: Kernel.MilliTimer;  i: SHORTINT; BEGIN i := 10;	(* up to 0.2s! *) REPEAT IF qp THEN SYSTEM.PORTIN(qpStatusPort, SYSTEM.VAL(CHAR, s)); IF s * {QpRxFull} = {QpRxFull} THEN 	(* byte avail *) SYSTEM.PORTIN(qpDataPort, ch); RETURN ch 			END ELSE SYSTEM.PORTIN(64H, SYSTEM.VAL(CHAR, s)); IF s * {0,5} = {0,5} THEN 	(* byte avail *) SYSTEM.PORTIN(60H, ch); RETURN ch 			END END; Kernel.SetTimer(t, TimeUnit DIV 50);	(* 20ms *) REPEAT UNTIL Kernel.Expired(t); DEC(i); UNTIL i = 0; RETURN 0X END InAux; PROCEDURE WriteDev(b: CHAR); BEGIN IF qp THEN PollAux; SYSTEM.PORTOUT(qpDataPort, b) 	ELSE PollAux; SYSTEM.PORTOUT(64H, 0D4X);	(* aux data coming *) PollAux; SYSTEM.PORTOUT(60H, b) 	END END WriteDev; PROCEDURE WriteAck(b: CHAR); VAR s: SET; t: Kernel.MilliTimer;  i: SHORTINT; BEGIN WriteDev(b); i := 10;	(* up to 0.2s! *) LOOP IF qp THEN SYSTEM.PORTIN(qpStatusPort, SYSTEM.VAL(CHAR, s)); IF (s * {QpRxFull} = {QpRxFull}) OR (i = 0) THEN EXIT END; ELSE SYSTEM.PORTIN(64H, SYSTEM.VAL(CHAR, s)); IF (s * {0,5} = {0,5}) OR (i = 0) THEN EXIT END; END; Kernel.SetTimer(t, TimeUnit DIV 50);	(* 20ms *) REPEAT UNTIL Kernel.Expired(t); DEC(i) END; IF i # 0 THEN				(* byte avail *) IF qp THEN SYSTEM.PORTIN(qpDataPort, SYSTEM.VAL(CHAR, s)) ELSE SYSTEM.PORTIN(60H, SYSTEM.VAL(CHAR, s)) END END END WriteAck; PROCEDURE WriteCmd(b: CHAR); BEGIN ASSERT(~qp, 100); PollAux; SYSTEM.PORTOUT(64H, 60X); PollAux; SYSTEM.PORTOUT(60H, b) END WriteCmd; PROCEDURE AuxInterrupt; VAR c: CHAR; t: INTEGER; BEGIN IF qp THEN SYSTEM.PORTIN(qpDataPort, c);	(* read byte *) ELSE SYSTEM.PORTIN(60H, c);	(* read byte *) END; t := (auxtl+1) MOD AuxSize; IF t # auxhd THEN auxbuf[auxtl] := c; auxtl := t 	ELSE INC(auxoverflows) END END AuxInterrupt; PROCEDURE SerialRead(port: LONGINT; VAR c: SYSTEM.BYTE); VAR state: SET; res: LONGINT; BEGIN IF port = AUX THEN REPEAT UNTIL auxhd # auxtl; state := DisableInterrupts; c := auxbuf[auxhd]; auxhd := (auxhd+1) MOD AuxSize; RestoreInterrupts(state); res := 0 ELSE V24.Receive(port, c, res) END END SerialRead; PROCEDURE SerialWrite(port: LONGINT; c: SYSTEM.BYTE); VAR res: LONGINT; BEGIN IF port # AUX THEN V24.Send(port, c, res) END END SerialWrite; PROCEDURE SerialAvailable(port: LONGINT): LONGINT; VAR n: LONGINT; state: SET; BEGIN IF port = AUX THEN state := DisableInterrupts; n := auxtl-auxhd; RestoreInterrupts(state); IF n < 0 THEN INC(n, AuxSize) END ELSIF port # NONE THEN n := V24.Available(port) ELSE n := 0 END; RETURN n END SerialAvailable; PROCEDURE StartAux; VAR state, status: SET; PROCEDURE SetRate(r: INTEGER); BEGIN WriteAck(0F3X); WriteAck(CHR(r)) END SetRate; BEGIN state := DisableInterrupts; auxhd := 0; auxtl := 0; RestoreInterrupts(state); IF ~auxinit THEN auxinit := TRUE; PollAux; IF qp THEN SYSTEM.PORTIN(qpStatusPort, SYSTEM.VAL(CHAR, status)); INCL(status, QpEnable + QpReset); SYSTEM.PORTOUT(qpStatusPort, SYSTEM.VAL(CHAR, status)); EXCL(status, QpReset); SYSTEM.PORTOUT(qpStatusPort, SYSTEM.VAL(CHAR, status)); ELSE SYSTEM.PORTOUT(64H, 0A8X);	(* enable aux *) END; (* enable MS Intellimouse 3rd button *) SetRate(200); SetRate(100); SetRate(80); SetRate(rate); WriteAck(0F2X); auxId := InAux; (*Ident*) WriteAck(0E8X); WriteAck(3X);	(* 8 counts/mm *) WriteAck(0E7X);	(* 2:1 scale *) PollAux; Kernel.InstallIP(AuxInterrupt, Kernel.IRQ+12); WriteDev(0F4X);	(* enable aux device *) IF qp THEN INCL(status, QpIntsOn); SYSTEM.PORTOUT(qpStatusPort, SYSTEM.VAL(CHAR, status)) ELSE WriteCmd(47X)	(* controller interrupts on *) END; PollAux END END StartAux; (* Mouse driver  *) (* SetSpeed - Set mouse speed *) PROCEDURE SetSpeed(old, new: LONGINT); VAR word, stop, par: INTEGER; c: CHAR;  res: LONGINT;  timer: Kernel.MilliTimer; BEGIN IF port # AUX THEN IF (oldport # NONE) & (oldport # AUX) THEN V24.Stop(oldport) END; oldport := port; CASE type OF 			MS: word := 7;  stop := V24.Stop1;  par := V24.ParNo | MSC1, MSC2, MSC3, MSC4: word := 8;  stop := V24.Stop2;  par := V24.ParNo | MM: word := 8;  stop := V24.Stop1;  par := V24.ParOdd | Logi: word := 8;  stop := V24.Stop2;  par := V24.ParNo | LogiMan: word := 7;  stop := V24.Stop1;  par := V24.ParNo | MSI: word := 7;  stop := V24.Stop1;  par := V24.ParNo END; IF (type = Logi) OR (type = LogiMan) THEN V24.Start(port, old, word, par, stop, res); IF res = V24.Ok THEN IF new = 9600 THEN c := "q" ELSIF new = 4800 THEN c := "p" ELSIF new = 2400 THEN c := "o" ELSE c := "n" END; SerialWrite(port, "*"); SerialWrite(port, c); Kernel.SetTimer(timer, TimeUnit DIV 10); REPEAT UNTIL Kernel.Expired(timer); V24.Stop(port) END END; V24.Start(port, new, word, par, stop, res); IF res = V24.Ok THEN V24.SetMC(port, {V24.DTR, V24.RTS}) END END END SetSpeed; (* InitMouse - Initialise mouse. 	"type" - mouse type from list 	"port" - V24.COM[12], AUX 	"bps" - V24.BPS* 	"rate" - sample rate (not all mice support this) *) PROCEDURE InitMouse; VAR c: CHAR; timer: Kernel.MilliTimer; n: INTEGER; BEGIN port := newport; mouseErrors := 0; auxoverflows := 0; IF (oldport # NONE) & (oldport # AUX) THEN V24.Stop(oldport) END; oldport := NONE; IF port = AUX THEN StartAux; oldport := port ELSE IF type = LogiMan THEN SetSpeed(1200, 1200); SerialWrite(port, "*"); SerialWrite(port, "X"); SetSpeed(1200, bps) ELSE SetSpeed(9600, bps); SetSpeed(4800, bps); SetSpeed(2400, bps); SetSpeed(1200, bps); IF type = Logi THEN SerialWrite(port, "S"); type := MM;  SetSpeed(bps, bps);  type := Logi END; (* set sample rate *) IF rate <= 0 THEN c := "O"	(* continuous - don't use *) ELSIF rate <= 15 THEN c := "J"	(* 10 Hz *) ELSIF rate <= 27 THEN c := "K"	(* 20 *) ELSIF rate <= 42 THEN c := "L"	(* 35 *) ELSIF rate <= 60 THEN c := "R"	(* 50 *) ELSIF rate <= 85 THEN c := "M"	(* 70 *) ELSIF rate <= 125 THEN c := "Q"	(* 100 *) ELSE c := "N"	(* 150 *) END; SerialWrite(port, c); IF type = MSC2 THEN V24.ClearMC(port, {V24.DTR, V24.RTS}) ELSIF type = MSC3 THEN V24.ClearMC(port, {V24.DTR}) ELSIF type = MSC4 THEN V24.ClearMC(port, {V24.RTS}) END END END; mbufp := 0; lastkeys := {}; (* protocol parameters *) CASE type OF 		MS: numb := 3;  mask0 := {6};  val0 := {6};  mask1 := {6};  val1 := {} | MSC1, MSC2, MSC3, MSC4: numb := 5;  mask0 := {3..7};  val0 := {7};  mask1 := {};  val1 := {} | MM: numb := 3;  mask0 := {5..7};  val0 := {7};  mask1 := {7};  val1 := {} | Logi: numb := 3;  mask0 := {5..7};  val0 := {7};  mask1 := {7};  val1 := {} | LogiMan: numb := 3;  mask0 := {6};  val0 := {6};  mask1 := {6};  val1 := {} | PS2: IF auxId # 0X THEN numb := 4 ELSE numb := 3 END; mask0 := {6,7}; val0 := {};  mask1 := {};  val1 := {} | MSI: numb := 4; mask0 := {6};  val0 := {6};  mask1 := {6};  val1 := {} END; (* ignore the first few bytes from the mouse (e.g. Logitech MouseMan Sensa) *) n := 4; REPEAT WHILE SerialAvailable(port) # 0 DO SerialRead(port, c) END; Kernel.SetTimer(timer, TimeUnit DIV n); DEC(n); (* wait 1/4s, 1/3s, 1/2s, 1s *) REPEAT UNTIL Kernel.Expired(timer); UNTIL (SerialAvailable(port) = 0) OR (n = 0); (* Lower/Raise DTR/RTS for autodetection, and to start an Intellimouse *) IF port # AUX THEN V24.ClearMC(port, {V24.DTR, V24.RTS}); Kernel.SetTimer(timer, TimeUnit DIV 4); REPEAT UNTIL Kernel.Expired(timer); V24.SetMC(port, {V24.DTR, V24.RTS}); Kernel.SetTimer(timer, TimeUnit DIV 4); REPEAT UNTIL Kernel.Expired(timer) END END InitMouse; (* GetMouseEvent - Read a mouse event *) PROCEDURE GetMouseEvent(VAR keys: SET; VAR dx, dy, dz: INTEGER): BOOLEAN; VAR b: SET; BEGIN WHILE SerialAvailable(port) > 0 DO 		b := {}; SerialRead(port, SYSTEM.VAL(CHAR, b)); (* check for resync *) IF (mbufp # 0) & (type # PS2) & ((b * mask1 # val1) OR (b = {7})) THEN mbufp := 0 END; IF (mbufp = 0) & (b * mask0 # val0) THEN (* skip package, unless it is a LogiMan middle button... *) IF ((type = MS) OR (type = LogiMan)) & (b * {2..4,6,7} = {}) THEN keys := lastkeys * {0,2}; IF 5 IN b THEN INCL(keys, 1) END; dx := 0; dy := 0; RETURN TRUE ELSE INC(mouseErrors) END ELSE mbuf[mbufp] := b; INC(mbufp); IF mbufp = numb THEN CASE type OF 					MS, LogiMan: keys := lastkeys * {1}; IF 5 IN mbuf[0] THEN INCL(keys, 2) END; IF 4 IN mbuf[0] THEN INCL(keys, 0) END; dx := LONG(SYSTEM.VAL(SHORTINT, SYSTEM.LSH(mbuf[0] * {0,1}, 6) + mbuf[1] * {0..5})); dy := LONG(SYSTEM.VAL(SHORTINT, SYSTEM.LSH(mbuf[0] * {2,3}, 4) + mbuf[2] * {0..5})) | MSC1, MSC2, MSC3, MSC4: keys := {0..2} - (mbuf[0] * {0..2}); dx := LONG(SYSTEM.VAL(SHORTINT, mbuf[1])) + LONG(SYSTEM.VAL(SHORTINT, mbuf[3])); dy := -(LONG(SYSTEM.VAL(SHORTINT, mbuf[2])) + LONG(SYSTEM.VAL(SHORTINT, mbuf[4]))) | MM, Logi: keys := mbuf[0] * {0..2}; dx := SYSTEM.VAL(INTEGER, mbuf[1]); IF ~(4 IN mbuf[0]) THEN dx := -dx END; dy := SYSTEM.VAL(INTEGER, mbuf[2]); IF 3 IN mbuf[0] THEN dy := -dy END | PS2: keys := {}; IF 2 IN mbuf[0] THEN INCL(keys, 1) END; IF 1 IN mbuf[0] THEN INCL(keys, 0) END; IF 0 IN mbuf[0] THEN INCL(keys, 2) END; dx := SYSTEM.VAL(INTEGER, mbuf[1]); IF 4 IN mbuf[0] THEN DEC(dx, 256) END; dy := -SYSTEM.VAL(INTEGER, mbuf[2]); IF 5 IN mbuf[0] THEN INC(dy, 256) END | MSI: keys := {}; IF 4 IN mbuf[0] THEN INCL(keys, 0) END; IF 5 IN mbuf[0] THEN INCL(keys, 2) END; IF 3 IN mbuf[3] THEN INCL(keys, 3) END; IF 4 IN mbuf[3] THEN INCL(keys, 1) END; IF ~(3 IN mbuf[3]) & (mbuf[3] * {0..2} # {}) THEN INCL(keys, 4) END; dx := LONG(SYSTEM.VAL(SHORTINT, SYSTEM.LSH(mbuf[0] * {0,1}, 6) + mbuf[1] * {0..7})); dy := LONG(SYSTEM.VAL(SHORTINT, SYSTEM.LSH(mbuf[0] * {2,3}, 4) + mbuf[2] * {0..7})) END; (* CASE *) mbufp := 0; RETURN TRUE END END END; keys := lastkeys; dx := 0;  dy := 0; RETURN FALSE END GetMouseEvent; (* Interface  *) (** Returns the number of keystrokes in the keyboard input buffer. *) PROCEDURE Available* : INTEGER; VAR state, keys: SET; p: KeyboardPoller; x: INTEGER; ch: CHAR; i: SHORTINT; BEGIN (* poll all extra keyboards *) p := keyboard; pollkeys := {}; WHILE p # NIL DO 		IF p.poll(ch, keys) THEN state := DisableInterrupts; i := (tail+1) MOD BufSize; IF i # head THEN buffer[1+tail] := ch; tail := i 			END; RestoreInterrupts(state) END; pollkeys := pollkeys + keys; p := p.next END; (* check buffer *) state := DisableInterrupts; x := (tail-head) MOD BufSize; RestoreInterrupts(state); RETURN x END Available; (** Reads the current mouse position x, y and the key state of the mouse buttons (also called keys). The mouse buttons are numbered from the right to the left as  0, 1, 2 (i.e. 1 is the middle mouse button). For example, when the left and middle  buttons are pressed, keys will be set to {1, 2}. *) PROCEDURE Mouse*(VAR keys: SET; VAR x, y: INTEGER); VAR dx, dy, dz: INTEGER; ok: BOOLEAN;  mousekeys, rawkeys, state: SET; p: MousePoller; BEGIN IF Kernel.break THEN Kernel.break := FALSE; SYSTEM.HALT(13) END; IF ScrollLock IN flags THEN keys := {}; IF 11 IN kpmap THEN INCL(keys, 2) END; IF 5 IN kpmap THEN INCL(keys, 1) END; IF 12 IN kpmap THEN INCL(keys, 0) END; state := DisableInterrupts; INC(mouseX, LONG(kdx)); INC(mouseY, LONG(kdy)); kdx := 0; kdy := 0; RestoreInterrupts(state) ELSE REPEAT	(* get all available mouse events, or until keys change *) p := mouse; rawkeys := {}; ok := FALSE; WHILE p # NIL DO	(* poll all mice and sum keys and movements *) IF p.poll(mousekeys, dx, dy, dz) THEN ok := TRUE; rawkeys := rawkeys + mousekeys; IF (ABS(dx) > threshold) OR (ABS(dy) > threshold) THEN dx := SHORT(dx*speedup DIV 10); dy := SHORT(dy*speedup DIV 10) END; INC(mouseX, LONG(dx)); INC(mouseY, LONG(dy)) END; p := p.next END UNTIL ~ok OR (rawkeys # lastkeys); IF ok THEN IF ~(1 IN lastkeys) & (1 IN rawkeys) THEN	(* mouse generated middle button *) IF buttons = -3 THEN buttons := 3 END	(* switch off emulation *) END; lastkeys := rawkeys	(* save last known mouse key state *) ELSE rawkeys := lastkeys	(* restore last known mouse key state *) END; IF MenuShift IN flags THEN	(* menu key emulates middle button *) INCL(rawkeys, 1); IF buttons = -3 THEN buttons := 3 END	(* switch off emulation *) END; (* middle button emulation *) IF buttons # 3 THEN	(* -2, 2, -3 *) IF buttons = 2 THEN	(* 2 => Ctrl is middle button *) IF flags * {LCtrl, RCtrl} # {} THEN INCL(rawkeys, 1) ELSE EXCL(rawkeys, 1) END ELSE	(* -2 OR -3 => MM OR Ctrl is middle button *) IF flags * {LCtrl, RCtrl} # {} THEN INCL(rawkeys, 1) END END END; (* key mapping *) keys := mapkeys[SYSTEM.VAL(LONGINT, rawkeys * {0,1,2})] END; IF mouseX < minX THEN mouseX := minX ELSIF mouseX > maxX THEN mouseX := maxX END; IF mouseY < minY THEN mouseY := minY ELSIF mouseY > maxY THEN mouseY := maxY END; x := SHORT(mouseX); y := SHORT(height-1-mouseY) END Mouse; (** Read a character from the keyboard buffer. Blocks if no character is available. *) PROCEDURE Read*(VAR ch: CHAR); VAR state: SET; BEGIN REPEAT (* skip *) UNTIL (Available # 0) OR Kernel.break; IF Kernel.break THEN Kernel.break := FALSE; SYSTEM.HALT(13) END; state := DisableInterrupts; ch := buffer[1+head]; head := (head+1) MOD BufSize; RestoreInterrupts(state) END Read; (** Returns the elapsed number of timer ticks from Oberon startup. *) PROCEDURE Time*: LONGINT; BEGIN IF Kernel.break THEN Kernel.break := FALSE; SYSTEM.HALT(13) END; RETURN Kernel.GetTimer END Time; (** Return the state of the shift keys. *) PROCEDURE KeyState*(VAR keys: SET); BEGIN keys := pollkeys; IF flags * {LAlt, RAlt} # {} THEN INCL(keys, ALT) END; IF flags * {LCtrl, RCtrl} # {} THEN INCL(keys, CTRL) END; IF flags * {LShift, RShift} # {} THEN INCL(keys, SHIFT) END END KeyState; (** Restricts the extent of the mouse coordinates returned by Mouse. *) PROCEDURE SetMouseLimits*(x, y, w, h: INTEGER);	(** non-portable *) BEGIN IF height = 0 THEN height := h END; y := SHORT(height-1) - y; 	minX := x; maxY := y;  maxX := x + w-1;  minY := y - (h-1); mouseX := minX + (maxX-minX) DIV 2; mouseY := minY + (maxY-minY) DIV 2 END SetMouseLimits; PROCEDURE SetMouseType(s: ARRAY OF CHAR); BEGIN type := MinType-1; IF (s[0] >= "0") & (s[0] <= "9") THEN	(* old style config *) type := SHORT(ORD(s[0])-ORD("0")) ELSE	(* new style config *) IF s = "" THEN (* default if none specified *) ELSIF (CAP(s[0]) = "L") & (CAP(s[1]) = "M") THEN	(* Logitech *) CASE s[2] OF 				"1": type := LogiMan |"2": type := MM 				|"3": type := Logi END ELSIF (CAP(s[0]) = "M") & (CAP(s[1]) = "S") THEN	(* Mouse Systems or Microsoft *) IF CAP(s[2]) = "M" THEN type := MS 			ELSIF CAP(s[2]) = "I" THEN type := MSI ELSE CASE s[2] OF 					"1": type := MSC1 |"2": type := MSC2 |"3": type := MSC3 |"4": type := MSC4 END END ELSIF CAP(s[0]) = "P" THEN	(* PS/2 *) type := PS2 END END; IF (type < MinType) OR (type > MaxType) THEN type := PS2 END;	(* unknown mouse type *) IF type = PS2 THEN newport := AUX END; IF Trace THEN Kernel.WriteString("MouseType="); Kernel.WriteInt(type, 1); Kernel.WriteChar(" "); Kernel.WriteInt(newport, 1); Kernel.WriteLn END; InitMouse END SetMouseType; PROCEDURE Read710(adr: CHAR; VAR x: CHAR); BEGIN SYSTEM.PORTOUT(390H, adr); SYSTEM.PORTIN(391H, x) END Read710; PROCEDURE Detect82C710; VAR x: CHAR; BEGIN SYSTEM.PORTOUT(2FAH, 55X); SYSTEM.PORTOUT(3FAH, 0AAX); SYSTEM.PORTOUT(3FAH, 36X); SYSTEM.PORTOUT(3FAH, 0E4X); SYSTEM.PORTOUT(2FAH, 1BX); Read710(0FX, x); qp := x = 0E4X; IF qp THEN Read710(0DX, x); qpDataPort := ORD(x)*4; qpStatusPort := qpDataPort+1; SYSTEM.PORTOUT(390H, 0FX); SYSTEM.PORTOUT(391H, 0FX) END END Detect82C710; (* InitMouse lowered and raised DTR/RTS - place result in KBD buffer (ugh!) *) PROCEDURE DetectMouse; VAR state: SET; i: SHORTINT; res: LONGINT; ch: CHAR; BEGIN IF port = AUX THEN Detect82C710 ELSE LOOP IF V24.Available(port) = 0 THEN EXIT END; state := DisableInterrupts; i := (tail+1) MOD BufSize; IF i = head THEN RestoreInterrupts(state); EXIT END; V24.Receive(port, ch, res); IF ch >= 80X THEN ch := CHR(ORD(ch)-80H) END; buffer[1+tail] := ch; tail := i; 			RestoreInterrupts(state) END END END DetectMouse; (** Configure input device parameters. Normally only used by installation program. *) PROCEDURE Configure*(config, value: ARRAY OF CHAR);	(** non-portable *) VAR mk: ARRAY 3 OF LONGINT; kt: KeyTable; state: SET; i: SHORTINT; BEGIN IF Trace THEN Kernel.WriteString("Input: "); Kernel.WriteString(config);  Kernel.WriteChar("="); Kernel.WriteString(value); Kernel.WriteLn END; IF config = "MT" THEN	(* mouse type *) SetMouseType(value); DetectMouse ELSIF config = "MTX" THEN	(* mouse type explicit *) SetMouseType(value) ELSIF config = "MP" THEN	(* mouse port *) IF (value[0] >= "1") & (value[0] <= "4") THEN newport := V24.COM1 + (ORD(value[0])-ORD("1")) ELSE newport := V24.COM1 END ELSIF config = "MB" THEN	(* mouse buttons *) IF value = "2" THEN buttons := 2 ELSIF value = "3" THEN buttons := 3 ELSIF value = "-2" THEN buttons := -2 ELSE buttons := -3	(* default MM and Ctrl *) END ELSIF config = "MM" THEN	(* mouse key remapping *) mk[0] := 0; mk[1] := 1;  mk[2] := 2; IF value[0] # 0X THEN mk[0] := ORD(value[0])-48; IF value[1] # 0X THEN mk[1] := ORD(value[1])-48; IF value[2] # 0X THEN mk[2] := ORD(value[2])-48 END END END; FOR i := 0 TO 7 DO 			mapkeys[i] := {}; IF 0 IN SYSTEM.VAL(SET, i) THEN INCL(mapkeys[i], mk[0]) END; IF 1 IN SYSTEM.VAL(SET, i) THEN INCL(mapkeys[i], mk[1]) END; IF 2 IN SYSTEM.VAL(SET, i) THEN INCL(mapkeys[i], mk[2]) END END ELSIF config = "Keyboard" THEN i := 0; WHILE (value[i] # 0X) & (value[i] # ".") DO INC(i) END; IF value[i] = "." THEN kt := TableFromFile(value) ELSE kt := NIL END; (* atomically set the table *) state := DisableInterrupts; IF kt = NIL THEN table := TableUS ELSE keytable := kt; table := SYSTEM.ADR(kt[0]) END; dkey := 0; RestoreInterrupts(state) ELSE IF Trace THEN Kernel.WriteString("Unknown setting"); Kernel.WriteLn END END END Configure; (** Add a mouse driver. The poll procedure will be called from Mouse and should return the next mouse event, including the current key state.  It returns TRUE iff a mouse event is available. *) PROCEDURE AddMouse*(poll: PollMouse);	(** non-portable *) VAR n: MousePoller; BEGIN NEW(n); n.poll := poll; n.next := mouse; mouse := n END AddMouse; (** Remove a mouse driver. *) PROCEDURE RemoveMouse*(poll: PollMouse);	(** non-portable *) VAR p, n: MousePoller; BEGIN p := NIL; n := mouse; WHILE (n # NIL) & (n.poll # poll) DO p := n; n := n.next END; IF n # NIL THEN IF p = NIL THEN mouse := n.next ELSE p.next := n.next END END END RemoveMouse; (** Add a keyboard driver. The poll procedure will be called from Available and Read and should return the next ASCII character.  It returns TRUE iff a key is available.  The current shift state (SHIFT, CTRL, ALT) should always be returned, and will be added to KeyState. *) PROCEDURE AddKeyboard*(poll: PollKeyboard);	(** non-portable *) VAR n: KeyboardPoller; BEGIN NEW(n); n.poll := poll; n.next := keyboard; keyboard := n END AddKeyboard; (** Remove a keyboard driver. *) PROCEDURE RemoveKeyboard*(poll: PollKeyboard);	(** non-portable *) VAR p, n: KeyboardPoller; BEGIN p := NIL; n := keyboard; WHILE (n # NIL) & (n.poll # poll) DO p := n; n := n.next END; IF n # NIL THEN IF p = NIL THEN keyboard := n.next ELSE p.next := n.next END END END RemoveKeyboard; PROCEDURE Setting(name: ARRAY OF CHAR); VAR s: ARRAY 32 OF CHAR; BEGIN Kernel.GetConfig(name, s); Configure(name, s) END Setting; PROCEDURE ConfigMouse; VAR s: ARRAY 16 OF CHAR; i: SHORTINT; BEGIN (* boot-time settings *) Kernel.GetConfig("MouseBPS", s); IF s = "9600" THEN bps := 9600 ELSE bps := 1200 END; (* rate *) Kernel.GetConfig("MouseRate", s); rate := 0; i := 0; WHILE s[i] # 0X DO rate := rate*10+ORD(s[i])-48; INC(i) END; IF (rate <= 0) OR (rate > 150) THEN rate := 100 END; (* threshold *) Kernel.GetConfig("Threshold", s); threshold := 0; i := 0; WHILE s[i] # 0X DO threshold := threshold*10+ORD(s[i])-48; INC(i) END; IF threshold <= 0 THEN threshold := 5 END; (* speedup *) Kernel.GetConfig("Speedup", s); speedup := 0; i := 0; WHILE s[i] # 0X DO speedup := speedup*10+ORD(s[i])-48; INC(i) END; IF speedup <= 0 THEN speedup := 15 END; Setting("MP"); Setting("MB");  Setting("MM"); Setting("MT")	(* also calls InitMouse *) END ConfigMouse; PROCEDURE *UnsafeBreak; VAR note1, note2, note3: ARRAY 32 OF CHAR; BEGIN note1 := "Warning: Interrupting a module"; note2 := "may invalidate its invariants"; note3 := "and make it unstable."; SYSTEM.HALT(13) END UnsafeBreak; PROCEDURE *Timer; VAR i: INTEGER; BEGIN IF counter1 = TimeUnit DIV 100 THEN counter1 := 0; IF kpmap * {0..2, 4, 6, 8..10} = {} THEN counter0 := 0 ELSIF counter0 < 100 THEN INC(counter0) END; i := counter0 DIV (100 DIV 12)+1; IF kpmap * {0,4,8} # {} THEN DEC(kdx, i) END; IF kpmap * {0,1,2} # {} THEN DEC(kdy, i) END; IF kpmap * {2,6,10} # {} THEN INC(kdx, i) END; IF kpmap * {8,9,10} # {} THEN INC(kdy, i) END ELSE INC(counter1) END END Timer; BEGIN mouse := NIL; keyboard := NIL; pollkeys := {}; AddMouse(GetMouseEvent); timerproc := Timer; kpmap := {};  kdx := 0;  kdy := 0;  counter0 := 0; maxX := 0; height := 0; breakproc := UnsafeBreak; InitKeyboard; (* initialise mouse state *) oldport := NONE; auxinit := FALSE; ConfigMouse END Input. (** Remarks: 1. Keyboard character codes correspond to the ASCII character set. Some other important codes are: 	F1, SETUP	0A4X 	F2, NEUTRALISE	0A5X 	F3, SCRL	0A6X	(used in Draw) 	F4, NOSCRL	0A7X	(used in Draw) 	UP ARROW	0C1X 	RIGHT ARROW	0C3X 	DOWN ARROW	0C2X 	LEFT ARROW	0C4X 	INSERT	0A0X 	DELETE	0A1X 	PAGE-UP	0A2X 	PAGE-DOWN	0A3X 	ä, Ä	131, 128 	õ, Õ	132, 129 	ü, Ü	133, 130 	ß	150 The module EditKeys allows you to determine the keyboard code of any key pressed.  For cross-platform portability, Oberon does not normally support all keys available  on your keyboard. *)

title: Oberon/ETH Oberon/Input.Mod


text:
Talk:Saginaw Chippewa Tribal College

SCTC page purpose
This page is started to not only explain the institution and its mission, but to give students of SCTC an opportunity to express their own ideas and thoughts, but to also make constructive contributions. Dpfowler (discuss • contribs) 15:57, 15 December 2022 (UTC)

title: Talk:Saginaw Chippewa Tribal College


text:
Lombard/Auxiliary verbs

What are auxiliary verbs?
Auxiliary verbs are verbs that are used to construct compound tenses of verbs as already explained with regard to tenses. Compound tenses are constructed by placing the auxiliary verb conjugated in the corresponding simple tense before the past participle.

There are two possible auxiliary verbs: vesser and havé. The auxiliary verb is vesser (►conjugation) for the majority of intransitive verbs or in reflexive, passive or impersonal form, havé (►conjugation) for transitive verbs in the non-impersonal active form and for some of the intransitive verbs. The following paragraphs show the conjugations of auxiliary verbs in the simple tenses in Milanese and Bergamasque dialects, for the other dialects, please refer to the consultation of the Lombard language dictionary:
 * vesser (conjugation)
 * havé (conjugation)

In many dialects, for the construction of the passive form, the verb vegnì (►conjugation) can replace the verb “vesser”.

The verb andà with the meaning of “to have to be” / “to need to be” (+ past participle) is used similarly to auxiliary verbs, but only in the finite modes excluding the imperative.

If the auxiliary verb is “vesser” and the subject is plural, the past participle must also be plural. If the auxiliary is “havé” the past participle is always used in the singular.

Milanese dialect
Talking about auxiliary verbs, indicating the the imperative and the past participle of the verb "havé" is not necessary, they exist when the verb to have is used in the form "havégh" with the meaning of "to possess" but they never serve when the verb " havé" plays the role of an auxiliary verb.

Attention: In Lombard the verb "havé" in the pure form is used only as an auxiliary verb. The verb "havé" when instead used with the meaning of “to possess” must be preceded by the particle “ghe” (or "ga " depending on the dialect) for the indicative, subjunctive and conditional moods and imperative (excluding 2nd person singular) or followed by the same particle “-gh” (or -ga depending on the dialect) in the form of a suffix in the remaining cases. (example: present tense: mi gh'hoo, ti te gh'heet, lu el gh'ha...; imperative habigh tì, gh'habia lu ....; infinitive havégh)

Bergamasque dialect
It is not necessary to indicate the imperative and the past participle of the verb "hì", they exist only when the verb is used in the form "hìga / hvìga" with the meaning of "to possess". Unlike western Lombard, in Bergamasque dialect, as in all eastern Lombard dialects, the verb as an auxiliary is still used in the form "hvìga" / "hìga" (corresponding to "havégh" in western Lombard), i.e. with the particle "ghe".

title: Lombard/Auxiliary verbs


text:
Lombard/Alphabet

Apart from these letters there are also k, x, y and w sometimes used only in Lombard words recently imported from foreign languages.

 * Note

title: Lombard/Alphabet


text:
User:Kiara.B228/sandbox

Keys to the Labyrinth

A labyrinth is a complicated, irregular network of passages or paths in which it is difficult to find one's way. In Greek mythology, the labyrinth is used by King Minos to hold the Minotaur captive, which Theseus eventually kills. The characters in Waiting for the Barbarians align with those of the myth. The Magistrate is Theseus, the Minotaur is the Empire, and the barbarian girl is the string that guides the Magistrate through his journey of escaping the Empire's vicious mindset. A minotaur is "a fabulous monster of Crete that had the body of a man and the head of a bull." (“Minotaur”). The Empire is the Minotaur because the inhabitants have a man's body and a monster's mind. Throughout his journey, the Magistrate views the barbarian girl as the key to his labyrinth because her presence encourages him to change his point of view on the Empire's actions.

The Magistrate's empathy towards the barbarian community wavers. His mindset changes several times throughout the novel after he comes in contact with the barbarian girl.The Magistrate comforts the barbarian boy, Joll is torturing during the night, when Joll is not around. The narrator states, "listen to me, boy, … I am not going to harm you”(Coetzee 7). The Magistrate goes out of his way to inform the boy of the actions he should take to avoid further punishment. By doing this, he shows that he is sensitive to the barbarian boy's feelings. Unfortunately, he makes no move to counteract Joll's harsh treatment. The unveiled sympathy, yet the hesitancy to take action suggests that the Magistrate is under the control of the Empire and refuses to be seen as a betrayer.

After finding the barbarian girl and having a one-sided relationship with her, he begins to break away from the Empire's treacherous mentality. The Magistrate meets the physically blind barbarian girl when she is begging in the settlement. He takes her in and gives her a job. In return, he explores the barbarian girl's body. His first encounter with the girl suggests that he does not want the settlement to become a haven for beggars. Nonetheless, the desire the Magistrate displays to take the woman from the public eye contradicts his determination to save the barbarians from the cruelty of the Empire. The relationship between the Magistrate and the barbarian girl is not one-sided, as earlier stated. It is more of a soothing, sexual release ritual he partakes in daily. According to him, "My eyes close. It becomes an intense pleasure to keep them closed, to savour the blissful giddiness” (28). Despite not engaging in sexual activities, the Magistrate still feels pleasure from his perverted actions towards the girl.

The Magistrate discovers the true strength of the barbarians that the Empire overlooks through the girl's body. The "barbarians" are viewed as such due to their way of living, which is significantly different from those living in civilization. He tries to read her body throughout his time with the barbarian girl. According to the narrator, "It has been growing more and more clear to me that until the marks on this girl's body are deciphered and understood…(31). To him, the barbarian girl's body is an impenetrable surface he must get through. Similar to the sensitivity the storyteller displays towards the barbarian boy, it is also shown towards the barbarian girl, which is why he tries so hard to read her. Jennifer Wenzel states, "In allowing the girl to refuse translation of her tortured body into language, Coetzee presents the body as "key to the labyrinth" and a way out of the deconstructive wilderness”(Wenzel 66). The girl refuses to allow the Magistrate to translate the torture on her body into language, which is why he does not know the full extent of her suffering until she tells him. The barbarian girl's reluctance to expose her suffering suggests that she wanted to keep something private to herself, seeing as everything else was already taken from her, like her freedom, her sight, her balance, and her body.

The barbarian girl's body can also be seen as impenetrable because the speaker can not decipher the full extent of her torture; but because her body can sustain itself against the frontier environment. In her earlier quote, Wenzel mentions "deconstructive wilderness," which is the perception that individuals have different histories and relationships with the environment. When the Magistrate takes the girl back to her people, he and the other men display difficulty surviving the trip, while the barbarian girl does not struggle despite living in the settlement for a while. In truth, people from the Empire need multiple necessities to survive on the frontier and even live in the settlement. In contrast, the barbarians living with the land prove that the barbarians are more robust than the civilians of the Empire. This ties to the girl being the key to the labyrinth as the speaker realizes that the Empire will never possess the same strength as the barbarians. The barbarians know that they are stronger than the people from the Empire, and the storyteller acknowledges this while discussing barbarians. The Magistrate is aware that the barbarians believe they should "be patient, one of these days their crops will start withering from the salt, they will not be able to feed themselves, they will have to go”(51). The nomads are just waiting for disaster to strike so the people can leave, and they can graze and be one with nature once again.

The Magistrate shows this newly founded determination to bring justice to the barbarian community. He has a conversation with the new conscript about the barbarians, where he unleashes his pent-up rage at the Empire's treatment. The Magistrate states, "Instead I hear my voice rise in tone and anger”(50). He acknowledges that he should "be cautious" and end the conversation. However, he is determined to prove to this new conscript that the people of the Empire are the real barbarians. The Magistrate realizes that even though he is not physically torturing the barbarian girl, his actions are equivalent to Joll's. After this revelation, he eventually decides to bring the girl back to her people. In the letter, the Magistrate tells the provincial governor that he will "restore some of the goodwill that previously existed, I am undertaking a brief visit to the Barbarians”(57). He is going to correct the wrongs the Empire has done to the barbarians. At this point, the Magistrate has become so anti- Empire that he does not care about how rebellious his actions may seem to the high officials. Due to his recent mindset changes, he is not surprised that he would be imprisoned upon arriving at the settlement.

After he learns he is imprisoned, the Magistrate realizes he is "a free man”(73). Despite being imprisoned, he still feels free. However, the Magistrate quickly becomes aware of his barbarism that has been trying to show itself from when he could not shoot the buck. While he is unable to explain his actions or lack of action, it is clear that being around the barbarian girl and witnessing the freedom of the buck foreshadows his own life when he is free. He states, "Never before have I had the feeling of not living my own life on my terms”(40). After being imprisoned, the Magistrate experiences this as he no longer has the right to request things from people in the settlement. At this point, he defends the "barbarians," (the fisher people), in front of the entire settlement, which connects back to my earlier point of how being around the barbarian girl changes the Magistrate's mindset toward the barbarians.

In closing, the barbarian girl is the last push the Magistrate needs to break his monstrous mindset fully, yet he fails to achieve his primary goal. From the beginning, he expresses his ambition to change the Empire's and the barbarians' history. With the help of the barbarian girl, he can free himself. However, he has failed to change the mindset of the other people as no matter where the people move, the mindset will always be the same. History is similar to a labyrinth as it continuously circles until those trapped can be guided out. The barbarian girl was the Magistrate's guide. However, in the end, he is just as lost as he was before he met the girl. The Magistrate’s ending also aligns with the previously stated myth. At the end of the myth, Theseus abandons Ariadne after she helps him escape from the labyrinth and ends up living a life full of fighting after his father's death. Whereas, in a way the barbarian girl has abandoned the Magistrate and now he must fight for not only a change in history but also for his life after everyone is aware of where he stands between the Empire and the barbarians. The barbarian girl is referred to as the keys to the labyrinth, but truthfully, she did not unlock anything except for the Magistrate's freedom.

title: User:Kiara.B228/sandbox


text:
Wikibooks:Collections/Cook County Clerk

Wikibooks

 * History of Edmeston, New York/1830s
 * History of Edmeston, New York/Churches
 * History of Western Theatre: 17th Century to Now/Complete list of plays in English on the Internet
 * History of wireless telegraphy and broadcasting in Australia/Topical/Biographies/George Archibald Scott/Notes
 * History of wireless telegraphy and broadcasting in Australia/Topical/Biographies/Vernon Francis Kenna/Notes
 * History of wireless telegraphy and broadcasting in Australia/Topical/Biographies/William Philip Bechervaise/Notes/1880s
 * History of wireless telegraphy and broadcasting in Australia/Topical/Biographies/William Tamillas Stephen Crawford/Notes
 * History of wireless telegraphy and broadcasting in Australia/Topical/Publications/On Air
 * Living in a Connected World/Print version
 * Mirad-English Lexicon N-Z
 * Principles of Microeconomics/Print version
 * Suburb Garden Town/Lead-up to War
 * The Rowers of Vanity Fair/Print version
 * Victoriana Schooldays/Education and Training for Life
 * Volapük/English-Volapük dictionary
 * XML - Managing Data Exchange/Print version

title: Wikibooks:Collections/Cook County Clerk


text:
User talk:Saber1122

A-14b night wolf
As the renowned A-10 Warthog faces an uncertain future, might the US produce a stealth version of this air support giant for employment in the disputed airspaces of the twenty-first century?

That’s a topic I’ve been asked several times in various ways over the last few months – and the idea clearly has its supporters. Saber1122 (discuss • contribs) 06:21, 16 December 2022 (UTC)

title: User talk:Saber1122


text:
User:MSmNDIS

At MSM Plan Management, we care about you, your goals and aspirations. Our specialist Accounts Team works tirelessly to process all of your invoices, aiming for a quick payment turn-around time. Our aim is to help people with disabilities live their best life by getting the most out of their NDIS Plans.

https://www.msmpm.com.au/

title: User:MSmNDIS


text:
Template:Colored disproof

  Disproof. $$\Box$$ {	"params": { "1": {			"description": "Content", "required": true },		"2": {			"description": "Color", "default": "magenta" }	},	"paramOrder": [ "1",		"2"	],	"description": "" }

title: Template:Colored disproof


text:
Themes in Literature/Belonging and Exile/Keys to the Labyrinth

A labyrinth is a complicated, irregular network of passages or paths in which it is difficult to find one's way. In Greek mythology, the labyrinth is used by King Minos to hold the Minotaur captive, which Theseus eventually kills. The characters in Waiting for the Barbarians align with those of the myth. The Magistrate is Theseus, the Minotaur is the Empire, and the barbarian girl is the string that guides the Magistrate through his journey of escaping the Empire's vicious mindset. A minotaur is "a fabulous monster of Crete that had the body of a man and the head of a bull." The Empire is the Minotaur because the inhabitants have a man's body and a monster's mind. Throughout his journey, the Magistrate views the barbarian girl as the key to his labyrinth because her presence encourages him to change his point of view on the Empire's actions.

The Magistrate's empathy towards the barbarian community wavers. His mindset changes several times throughout the novel after he comes in contact with the barbarian girl.The Magistrate comforts the barbarian boy, Joll is torturing during the night, when Joll is not around. The narrator states, "listen to me, boy, … I am not going to harm you." The Magistrate goes out of his way to inform the boy of the actions he should take to avoid further punishment. By doing this, he shows that he is sensitive to the barbarian boy's feelings. Unfortunately, he makes no move to counteract Joll's harsh treatment. The unveiled sympathy, yet the hesitancy to take action suggests that the Magistrate is under the control of the Empire and refuses to be seen as a betrayer.

After finding the barbarian girl and having a one-sided relationship with her, he begins to break away from the Empire's treacherous mentality. The Magistrate meets the physically blind barbarian girl when she is begging in the settlement. He takes her in and gives her a job. In return, he explores the barbarian girl's body. His first encounter with the girl suggests that he does not want the settlement to become a haven for beggars. Nonetheless, the desire the Magistrate displays to take the woman from the public eye contradicts his determination to save the barbarians from the cruelty of the Empire. The relationship between the Magistrate and the barbarian girl is not one-sided, as earlier stated. It is more of a soothing, sexual release ritual he partakes in daily. According to him, "My eyes close. It becomes an intense pleasure to keep them closed, to savour the blissful giddiness.” Despite not engaging in sexual activities, the Magistrate still feels pleasure from his perverted actions towards the girl.

The Magistrate discovers the true strength of the barbarians that the Empire overlooks through the girl's body. The "barbarians" are viewed as such due to their way of living, which is significantly different from those living in civilization. He tries to read her body throughout his time with the barbarian girl. According to the narrator, "It has been growing more and more clear to me that until the marks on this girl's body are deciphered and understood…" To him, the barbarian girl's body is an impenetrable surface he must get through. Similar to the sensitivity the storyteller displays towards the barbarian boy, it is also shown towards the barbarian girl, which is why he tries so hard to read her. Jennifer Wenzel states, "In allowing the girl to refuse translation of her tortured body into language, Coetzee presents the body as "key to the labyrinth" and a way out of the deconstructive wilderness." The girl refuses to allow the Magistrate to translate the torture on her body into language, which is why he does not know the full extent of her suffering until she tells him. The barbarian girl's reluctance to expose her suffering suggests that she wanted to keep something private to herself, seeing as everything else was already taken from her, like her freedom, her sight, her balance, and her body.

The barbarian girl's body can also be seen as impenetrable because the speaker can not decipher the full extent of her torture; but because her body can sustain itself against the frontier environment. In her earlier quote, Wenzel mentions "deconstructive wilderness," which is the perception that individuals have different histories and relationships with the environment. When the Magistrate takes the girl back to her people, he and the other men display difficulty surviving the trip, while the barbarian girl does not struggle despite living in the settlement for a while. In truth, people from the Empire need multiple necessities to survive on the frontier and even live in the settlement. In contrast, the barbarians living with the land prove that the barbarians are more robust than the civilians of the Empire. This ties to the girl being the key to the labyrinth as the speaker realizes that the Empire will never possess the same strength as the barbarians. The barbarians know that they are stronger than the people from the Empire, and the storyteller acknowledges this while discussing barbarians. The Magistrate is aware that the barbarians believe they should "be patient, one of these days their crops will start withering from the salt, they will not be able to feed themselves, they will have to go” . The nomads are just waiting for disaster to strike so the people can leave, and they can graze and be one with nature once again.

The Magistrate shows this newly founded determination to bring justice to the barbarian community. He has a conversation with the new conscript about the barbarians, where he unleashes his pent-up rage at the Empire's treatment. The Magistrate states, "Instead I hear my voice rise in tone and anger” . He acknowledges that he should "be cautious" and end the conversation. However, he is determined to prove to this new conscript that the people of the Empire are the real barbarians. The Magistrate realizes that even though he is not physically torturing the barbarian girl, his actions are equivalent to Joll's. After this revelation, he eventually decides to bring the girl back to her people. In the letter, the Magistrate tells the provincial governor that he will "restore some of the goodwill that previously existed, I am undertaking a brief visit to the Barbarians”. He is going to correct the wrongs the Empire has done to the barbarians. At this point, the Magistrate has become so anti- Empire that he does not care about how rebellious his actions may seem to the high officials. Due to his recent mindset changes, he is not surprised that he would be imprisoned upon arriving at the settlement.

After he learns he is imprisoned, the Magistrate realizes he is "a free man." Despite being imprisoned, he still feels free. However, the Magistrate quickly becomes aware of his barbarism that has been trying to show itself from when he could not shoot the buck. While he is unable to explain his actions or lack of action, it is clear that being around the barbarian girl and witnessing the freedom of the buck foreshadows his own life when he is free. He states, "Never before have I had the feeling of not living my own life on my terms” . After being imprisoned, the Magistrate experiences this as he no longer has the right to request things from people in the settlement. At this point, he defends the "barbarians," (the fisher people), in front of the entire settlement, which connects back to my earlier point of how being around the barbarian girl changes the Magistrate's mindset toward the barbarians.

In closing, the barbarian girl is the last push the Magistrate needs to break his monstrous mindset fully, yet he fails to achieve his primary goal. From the beginning, he expresses his ambition to change the Empire's and the barbarians' history. With the help of the barbarian girl, he can free himself. However, he has failed to change the mindset of the other people as no matter where the people move, the mindset will always be the same. History is similar to a labyrinth as it continuously circles until those trapped can be guided out. The barbarian girl was the Magistrate's guide. However, in the end, he is just as lost as he was before he met the girl. The Magistrate’s ending also aligns with the previously stated myth. At the end of the myth, Theseus abandons Ariadne after she helps him escape from the labyrinth and ends up living a life full of fighting after his father's death. Whereas, in a way the barbarian girl has abandoned the Magistrate and now he must fight for not only a change in history but also for his life after everyone is aware of where he stands between the Empire and the barbarians. The barbarian girl is referred to as the keys to the labyrinth, but truthfully, she did not unlock anything except for the Magistrate's freedom.

--Kiara Byrd


text: Lombard/Phonology of the Milanese dialect in the New Lombard Orthography


text:
User:Lesleysiri/sandbox

''“So I was sold at last! A human being sold in the free city of New York! The bill of sale is on record, and future generations will learn from it that women were articles of traffic in New York, late in the nineteenth century of the Christian religion.”'' ― Harriet Ann Jacobs

Summary
Kindred is a novel by American writer Octavia E. Butler that incorporates time travel and is modeled on slave narratives. First published in 1979, it is still widely popular. It has been frequently chosen as a text for community-wide reading programs and book organizations, as well as being a common choice for high school and college courses.

The book is the first-person account of a young African-Americanwriter, Dana, who finds herself being shunted in time between her Los Angeles, California home in 1976 and a pre-Civil War Maryland plantation. There she meets her ancestors: a proud Black freewoman and a white planter who has forced her into slavery and concubinage. As Dana's stays in the past become longer, she becomes intimately entangled with the plantation community. She makes hard choices to survive slavery and to ensure her return to her own time.

Context
Antebellum: The Antebellum Period in American history is generally considered to be the period before the Civil War and after the War of 1812, although some historians expand it to all the years from the adoption of the Constitution in 1789 to the beginning of the Civil War. It was characterized by the rise of abolition and the gradual polarization of the country between abolitionists and supporters of slavery. During this same time, the country’s economy began shifting in the north to manufacturing as the Industrial Revolution began, while in the south, a cotton boom made plantations the center of the economy. The annexation of new territory and western expansion saw the reinforcement of American individualism and of Manifest Destiny, the idea that Americans and the institutions of the U.S. are morally superior and Americans are morally obligated to spread these institutions.

Butler often said she was inspired to write it when she heard young black people minimize the severity of slavery, and strongly assert what they would or would not have tolerated if they were enslaved. She wanted them to not only know the facts of slavery, but how slavery felt. She wanted to make those militant young people see that even surviving such an institution made their ancestors heroic.

Quotes from Kindred
"I lost an arm on my last trip home. My left arm. And I lost about a year of my life and much of the comfort and security I had not valued until it was gone"(Butler 1)

"I tried. I showered, washed away the mud and the brackish water, put on clean clothes, combed my hair. . . “That’s a lot better,” said Kevin when he saw me. But it wasn’t."(Butler 18)"I touched the scar Tom Weylin’s boot had left on my face, touched my empty left sleeve. “I know,” I repeated. “Why did I even want to come here. You’d think I would have had enough of the past.” (Butler 264)

Close Reading and Critical Thinking Questions
In Kindred, Butler depicts the community within the slaves and how they come together to help Dana. Without the isolating experience of slavery, do you think the slaves would have still had a sense of community and risk their own lives to help her? If you were born during the time of slavery would you take the risk of escaping?

What long term effects do you think slavery caused on African American people?

The linked articles and videos below show the struggle and fight for justice that not only African American people experience but minorities as a whole.
James Baldwin vs. William F. Buckley

Ta-Nehisi Coates take on Reparations

Mendez vs. Westminister

The long term effects of the African slave trade

Asian Americans

title: User:Lesleysiri/sandbox


text:
Themes in Literature/Isolation and Community/Kindred1

"“So I was sold at last! A human being sold in the free city of New York! The bill of sale is on record, and future generations will learn from it that women were articles of traffic in New York, late in the nineteenth century of the Christian religion.”- Harriet Ann Jacobs"

Text
Kindred is a novel by American writer Octavia E. Butler that incorporates time travel and is modeled on slave narratives. First published in 1979, it is still widely popular. It has been frequently chosen as a text for community-wide reading programs and book organizations, as well as being a common choice for high school and college courses. Here is the audio version of the text.

Context
Kindred is the first-person account of a young African-Americanwriter, Dana, who finds herself being shunted in time between her Los Angeles, California home in 1976 and an ante-bellum Maryland plantation. There she meets her ancestors: a proud Black freewoman and a white planter who has forced her into slavery and concubinage. As Dana's stays in the past become longer, she becomes intimately entangled with the plantation community. She makes hard choices to survive slavery and to ensure her return to her own time.

Butler often said she was inspired to write it when she heard young black people minimize the severity of slavery, and strongly assert what they would or would not have tolerated if they were enslaved. She wanted them to not only know the facts of slavery, but how slavery felt. She wanted to make those militant young people see that even surviving such an institution made their ancestors heroic.

Analysis: America is a disabled body

In Kindred, Butler reveals how slavery has disabled America. The reader sees Dana, the protagonist, go back and forth from the present day to a pre-civil war plantation in Maryland. While going back to the past, we see Dana trying to save her white ancestor, Rufus, who is a dangerous slave master, even though she is putting her own life in danger as a black woman during the time of slavery. Dana faces violence and is shown the brutality and horror of slavery. Butler uses Dana and Rufus' relationship to portray the connection that black and white people have. This connection portrays just how much our lives affect each other. We see Dana going back in time to help her ancestors which further helps her in her present time. These two completely different people from different backgrounds affect each other's lives.

What Rufus does directly affects Dana, we are shown that our histories connect. Dana is continuously being thrown into danger to save Rufus so that he could meet Alice and have her ancestors, while Rufus depends on Dana because she is constantly saving him from the danger that he himself causes. This dependency sheds light on the relationship white people and black people have in America. America was a country founded by white people but thrived off of the labor of black people. Without black people, America would not be the powerful country it is today. In a debate between James Baldwin and William F. Buckley, Baldwin states

 * It is a terrible thing for an entire people to surrender to the notion that one-ninth of its population is beneath them. And until that moment, until the moment comes when we, the Americans, we, the American people, are able to accept the fact, that I have to accept, for example, that my ancestors are both white and Black. That on that continent we are trying to forge a new identity for which we need each other and that I am not a ward of America. I am not an object of missionary charity. I am one of the people who built the country–until this moment there is scarcely any hope for the American dream, because the people who are denied participation in it, by their very presence, will wreck it.

Baldwin further pushes the idea that African American people have white ancestry as well and that a lot of black people have ancestors in the white people who “created” America. He states that in the denial of black people, America will never be able to grow. The white and black experience is so different, but our history is one and it affects all of us. Butler chooses to make Rufus and Dana related because it exposes that we are all connected, we all come from the same source so how could one community be praised and the other disregarded when we are one unit working together like the human body, all parts are affected. When one community is silenced and disabled, the entire humanity is disabled, if one community can not function that directly affects other communities.

The novel gets the reader thinking about who exactly makes up America. If we look at American media, the most privileged and represented are white people. The media chooses to portray white people as the face of America. As consumers, we see it in our politics, sports, and media. Butler offers a different representation of who America actually is. The reality is that America was built on the oppression of black people, America is built off of slavery. Kindred expresses this idea in multiple ways, one being the realistic portrayal of slavery and all of the trauma  African American people actually had to face at the hands of their white oppressors. Dana being a well-educated person, she knows all of the hardships slaves went through, but when she is actually experiencing slavery, she expresses how much worse it actually is:

 * I had seen people beaten on television and in the movies. “I had seen the too-red blood substitute streaked across their backs and heard their well-rehearsed screams. But I hadn’t lain nearby and smelled their sweat or heard them pleading and praying, shamed before their families and themselves. I was probably less prepared for the reality than the child crying not far from me. In fact, she and I were reacting very much alike. My face too was wet with tears. And my mind was darting from one thought to another, trying to tune out the whipping.

This quote leads us to believe that slavery was much worse than what America portrays. The inhumanity and shame is hidden by America creating an inaccurate portrayal of slavery. Langston Hughes, an African American poet and social activist that was most known for his work during the Harlem Renaissance, hints at this shame that America now carries regarding the topic of slavery. In his poem "I, too," Hughes states “Tomorrow I'll be at the table when company comes/ Nobody'll dare say to me “ eat in the kitchen” then besides, they'll see how beautiful I am and be ashamed- I too am America” (8-17). In this poem, Hughes speaks about the day America realizes just how much black people have sacrificed for this nation and how important they are/ were to our survival as a nation.

In American history, there have been plenty of times when we the people as a nation were left disabled. The first occurrence was the creation of slavery. America was built because England wanted more control over the colonies. Our nation was created in the fight for freedom and justice. We have to question how the fight for freedom led to the many years and continuation of the oppression black people face. Again, poet Langston Hughes, touches on this idea in his poem “Let America Be America Again”, Hughes states,

O, let America be America again The land that never has been yet And yet must be—the land where every man is free. The land that’s mine—the poor man’s, Indian’s, Negro’s, ME Who made America, Whose sweat and blood, whose faith and pain, Whose hand at the foundry, whose plow in the rain, Must bring back our mighty dream again (60-68).

Langston Hughes speaks of America never being a country built on freedom, and expresses the blood and sweat his people have put into building America. Wikipedia states,

 * The legal institution of human chattel slavery, comprising the enslavement primarily of Africans and African Americans, was prevalent in the United States of America from its founding in 1776 until 1865, predominantly in the South. Slavery was established throughout European colonization in the Americas. From 1526, during early colonial days, it was practiced in what became Britain's colonies, including the Thirteen Colonies that formed the United States. Under the law, an enslaved person was treated as property that could be bought, sold, or given away. Slavery lasted in about half of U.S. states until abolition. In the decades after the end of Reconstruction, many of slavery's economic and social functions were continued through segregation, sharecropping, and convict leasing.

These people were viciously preyed on and captured. They were separated from their families and brought to a land they had never seen. In Kindred, Butler sheds light on this common reality with the character Sarah. Sarah is a slave on the plantation whose family has been sold and her husband is dead. Dana states, “The expression in her eyes had gone from sadness—she seemed almost ready to cry—to anger. Quiet, almost frightening anger. Her husband died, three children sold, the fourth defective, and she had to thank God for the defect. She had reason for more than anger. How amazing that Weylin had sold her children and still kept her to cook his meals. How amazing that he was still alive.”

The reader closely follows another slave named Alice who is Dana’s ancestor, that looks exactly like her. We see her struggle with the toll Rufus takes on her, ultimately leading to her taking her own life. Butler portrays Sarah and Alice as a symbol of the lifelong effects trauma causes on the black psyche. Slavery might have been a while ago but it directly affects America. In an article about the long-term effects of slavery written by Nathan Nunn, Nunn  states,

 * Although research understanding the long-term impacts of Africa’s slave trades is still in progress, the evidence accumulated up to this point suggests that this historic event played an important part in the shaping of the continent, in terms of not only economic outcomes, but cultural and social outcomes as well. The evidence suggests that it has affected a wide range of important outcomes, including economic prosperity, ethnic diversity, institutional quality, the prevalence of conflict, the prevalence of HIV, trust levels, female labour force participation rates, and the practice of polygyny. Thus, the slave trades appear to have played an important role in shaping the fabric of African society today.

The ancestors of the black community never actually experienced life, they experienced trauma and the art of survival. The people who survived slavery then went on to have families and create generations of people. As humans, we learn first from our families especially how to raise families. These generations of black American people have taken on the generational trauma of their ancestors. Not only that, but they are forced to live under the societal constructs that slavery created. These social constructs further oppress black people and are still present in America today. This oppression might not be as bad as slavery, but it still silences and pushes back the black community. Things like being passed over for a job opportunity, or housing opportunity, being hated, crimed, or even harassed because of their race, creates a world where black people can not live up to their full potential. These societal constructs that slavery has created, and america has fulfilled, creates the same experience that slavery was for there acestoes, survival no actual living. In creating these social constructs, and further oppressing black people, white people have stunned their own growth as a community. If black and white people were given the same opportunities, they would be able to work together to further advance our country. Butler expresses this in Kindred with the protagonist Dana. Dana, like her white husband, is a great writer, Dana is as talented as her white counterpart. We see that in having the tools Dana was able to be as successful as a white man. Alice, who looks exactly like Dana, is used to portray the lost potential slavery caused. We are shown how much slavery actually oppressed the black people. Not only physically, but the owners would make sure to keep their slaves illiterate and used all of their power to keep the slaves in line. Alice could be as successful as Dana, many of the slaves are talented in their own ways, but are not allowed to even try to explore said talents. The ADA defines a person with a disability as a person who has a physical or mental impairment that substantially limits one or more major life activities. If we look at America as the body, slavery has limited major life activities. With the oppression of slavery, America as a whole has not been able to experience the full potential of African American people.Slavery forever traumatized an entire group of people and even today we see the life long effect it has had on us. We see the prejudgment of black people in politics, media, school, and even the workforce. Butler represents America’s disability through the scars and, in the case of Dana, loss of a limb,  at the end of the novel. They both understand that their life will never be the same and they will forever have to live with what they experienced, that is slavery. These injuries represent the life long effect experiencing slavery left on black people and the scar its left on America.

Critical thinking questions

 * In Kindred, Butler depicts the community within the slaves and how they come together to help Dana. Without the isolating experience of slavery, do you think the slaves would have still had a sense of community and risk their own lives to help her?
 * If you were born during the time of slavery would you take the risk of escaping?
 * What long-term effects do you think slavery caused on African American people?