text:
Super Mario Bros. 3/Inventory items

Several of the power-ups and items in Super Mario Bros. 3 were exclusive to said game and its ports (Super Mario All-Stars and Super Mario Advance 4: Super Mario Bros. 3). Exclusive power-ups were never in any game prior to Super Mario Bros. 3 and were never usable in any game, with the exception of ports, that came after it.

Power-Ups
Three of the power-ups in the game were "suits", and were the rare half of the powerups. All three of the suits were exclusive to Super Mario Bros. 3 and have not been usable since except in ports of the game.

Raccoon Leaf
The Raccoon Leaf is the most common power-up exclusive to Super Mario Bros. 3. When worn by Mario or Luigi, the Raccoon Suit grants them the power of flight after a short run to build up momentum. It also allows for a slower descent by rapidly waving its tail. The third benefit of the raccoon was that it enables the wearer to perform a spinning tail-attack.

In Super Smash Bros. Melee, a trophy of Mario's Raccoon Mario form can be obtained. Additionally, in The Adventures of Super Mario Bros. 3, Super Leaves are often used by Mario and Luigi to become Raccoon Mario and Raccoon Luigi, the episode "Super Koopa" even has Bowser utilize a Super Leaf to become "Raccoon Koopa". In Nintendo Comics System, the Raccoon Suit appeared in the story "It's Always Fair Weather".

Although the Raccoon Leaf was missing from following games, functionally it was very similar to the feather introduced in Super Mario World.

Frog Suit
The Frog Suit greatly increases the wearer's speed and control in the water, at the cost of speed and control on land. The earliest this suit is available was in World 2 (to prepare for the water-filled World 3), making it the earliest available out of the suits. This suit also grants the ability to swim through jet-streams coming out of pipes.

In Nintendo Comics System, the Frog Suit's only appearance was "Love Flounders," where Mario is forced to fetch the rare Chuckberries for Princess Toadstool's breakfast cereal. He dons a Frog Suit in order to do this, and as a result is mistaken for a real frog by Bertha the Boss Bass (a former girlfriend of Stanley the Talking Fish), who does not realize her mistake until she kisses him, which removes his Frog Suit.

The Frog Suit was also featured frequently in the animated series based on the game. On The Adventures of Super Mario Bros. 3, the characters often wore Frog Suits as scuba gear or in place of swimming trunks. One episode, "The Ugly Mermaid", featured a storyline like that of "Love Flounders", except in that case, Mario's would-be paramour, the mermaid princess Holly Mackerel, never finds out that Mario is not really a frog. The Princess and Toad are also shown using the Frog Suit, and Bowser even briefly uses it himself in the episode '"Super Koopa".

Tanooki Suit
The Tanooki Suit is the second suit found in Super Mario Bros. 3. It is usually found in treasure chests inside Toad's House.

Wearing the Tanooki Suit gives the wearer all the powers of Raccoon Mario with the added ability to turn into an invulnerable statue for a limited time. The statue has the appearance of Jizō, with Mario's mustache. If Mario jumps above an enemy and activate the statue power, then Mario crushes it, defeating it instantly. This tactic even works on enemies such as Thwomps, Boos and Buzzy Beetles.

The suit is based on the tanuki, a Raccoon Dog native to Japan which features heavily in Japanese mythology.

In Nintendo Comics System, the Tanooki Suit makes an appearance in the story "Tanooki Suits Me". In Super Paper Mario, one of the items listed on nerdy chameleon Francis's to-buy list is a Tanooki Suit with "real Tanooki fur"; additionally, one of the Sammer Guys fought in the game is named "Cloak of Tanooki."

Hammer Bros. Suit
Hammer Brothers' Suit is the third and final suit power-up in Super Mario Bros. 3. There are only 3 ways to obtain it:
 * From one of the Mushroom Houses in World 6
 * From a secret room in World 6, Level 10
 * From Level 8 in World 7

The suit allows the user to throw hammers at enemies, and to crouch into a gray shell invulnerable to most attacks. The hammers can kill nearly any enemy in the game, including several that can not be defeated using an invincibility star. These include the Thwomp, Dry Bones, Boo Diddly and Podoboo. It also enables Mario/Luigi to defeat Boom Boom in just one hit and King Bowser in ten hits.

Though Hammer Brothers Suit never officially appear in any episodes of The Adventures of Super Mario Bros. 3, the episode "Reptiles in the Rose Garden" has Mario and Luigi dressed in the uniforms of two Sledge Brothers.

Exclusive inventory items
These items were not only exclusive to the game, but were also only usable from the inventory on the world map screen.

P-Wing
The P-Wing is rare, although not as rare as some items in the game. When used, it gives Mario or Luigi a Raccoon Suit, and the power of infinite flight for the next level that is entered. If Mario or Luigi is hit in this level, the Raccoon Suit and the infinite flight is lost. After completion of the level, the infinite flight power wears off, but Mario or Luigi keep the Raccoon Suit. These were awarded upon completion of worlds 1, 4, and 6.

In The Adventures of Super Mario Bros. 3, the P-Wing made only one appearance, in the episode "Up, Up, and a Koopa" Toad and Princess Toadstool use it.

The P-Wing makes a cameo appearance in Mario Kart: Double Dash!!. It appears on the side of some trucks in Mushroom Bridge and Mushroom City. The license plate of the truck that has the P-Wing on it is "SMB3," the short name for Super Mario Bros. 3.

Jugem's Cloud
The Jugem's Cloud (known as Lakitu's Cloud in the ports of the game, as Jugem was Lakitu's Japanese name) is a rare inventory item, which, when used, allows the player to skip over one unfinished stage. While it bypasses Hammer Brothers, all levels and even stone castles, it cannot be used on end castles. Once passed, if the player is not successful on the level after they go back to the last level beaten, wasting the effect.

Music Box
When used, Music Boxes plays calming music which causes the wandering Hammer Bros. and the Piranha Plants on the world map to fall asleep. While the Hammer Bros. and Piranha Plants are asleep, Mario and Luigi can walk past them without triggering a battle with them.

Anchor
The Anchor item stops the Airship from moving around on the map after Mario or Luigi make a failed attempt at beating it. The Anchor is one of the rarest items, and can be found after collecting either most or all of the coins in 2-2, 4-2, or 6-7 and earning a White Mushroom House.

Hammer
The Hammer (not to be confused with the Hammer Bros. Suit) allows the player to break through stone barricades that block some paths. Usually this opens up shortcuts, although it's the only way to get to certain areas.

Warp Whistle
Warp Whistles send the user by tornado to the Warp Zone, where the player can skip ahead in the game a few worlds. There are only three Warp Whistles in the entire game, two in World 1, and one in World 2. If one uses the Warp Whistle in the warp zone, they would automatically go to level 8. The Warp Whistle is a reference to the Recorder from The Legend of Zelda. The Warp Zone is set up on four tiers, 1, 2-4, 5-7, then 8. Once at on a level included in that tier, you went to the next tier. For example, if you were already on level 2, you could not warp whistle to level 4, you'd have to choose from 5, 6 or 7.

P-Wing Tanooki Suit
It is possible to combine the powers of the P-Wing and the Tanooki Suit to both wear the suit and have unlimited flight ability. If the player has infinite flight from a P-Wing and then finds a Tanooki Suit in the level, they'll have the use of both items. After completion of the level, the power of the P-Wing wears off, but the Tanooki Suit is still equipped. This is possible only in levels 4-5, 5-5, 6-3, and the first World 7 fortress.

Kuribo's Shoe
"Kuribo", actually is the Japanese name of the Goombas. So, it means "Goomba's Shoe".

The Kuribo's Shoe is a power-up only available in one level, World 5-3. It can be taken from Goombas who wear it by breaking the blocks underneath them. If the Goombas are dispatched in this fashion, they drop a shoe that Mario or Luigi can ride the same way the Goombas do.

While riding in this shoe, Mario or Luigi can stomp on things that they cannot stomp normally, such as Piranha Plants, Nibblers and Spinies. When Mario or Luigi complete the level, the shoe "dies" just as on-screen enemies do when the level is completed, by falling off-screen. It is named Kuribo's Shoe after the Japanese name for Goomba, Kuribo.

In Super Mario Advance 4: Super Mario Bros. 3, the Kuribo Shoe can be found in a few of the game's unlockable levels; additionally, a few of the beta levels of Super Mario Bros. 3 feature the Kuribo Shoe.

In The Adventures of Super Mario Bros. 3, the Kuribo Shoe, despite appearing prominently in the show's opening cinematic, appears in only one episode "Super Koopa"; the Kuribo Shoe is referred to as "Kurobe Shoe" in this appearance.

In Super Paper Mario, one of the Sammer Guys fought in the game is known as Shoe of Kuribo, which is an obvious homage to the Kuribo Shoe.

title: Super Mario Bros. 3/Inventory items


text:
Mario franchise strategy guide/Enemies/Fly Guy

Fly Guys are a fictional species in the Mario series of video games. They are mostly found in the Yoshi series and in Mario spin-offs. Fly Guys are often mistakened for Shy Guys, but the difference between them is that Fly Guys have propellers sticking out of their heads while Shy Guys don't.

Appearances in video games

 * Super Mario RPG: Legend of the Seven Stars: A Fly Guy named "Shy Away" who instead of fighting, watered Pirahna Plants to do battle for him.
 * Super Mario 64: Fly Guys appear as enemies while their primary attack is diving towards Mario, though they can also spit fire. If Mario jumps on them, he can hover by spinning his arms like a helicopter. In Super Mario 64 DS they reprise this role again.
 * Super Smash Brothers: Melee: Fly Guys appear in the Yoshi's Story stage as minor enemies carrying food which is dropped randomly or if they are killed.
 * Mario Power Tennis: Fly Guy appears for the first time as a playable character with his partner being Paratroopa.
 * Mario Party 6: Fly Guys appear in mini-games and as game board helpers. Fly Guys also do this in Mario Party 7.
 * Yoshi Touch & Go: Fly Guys and Shy Guys appear frequently throughout the game as enemies.
 * Yoshi Topsy-Turvy: Fly Guys appear as enemies carrying coins. Shy Guys also appear as enemies in the colors of yellow, green, and their original color red.
 * Mario Hoops 3-on-3: Fly Guy appears playable for the second time in the first ever Mario basketball game.

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


text:
Emulation/Sega Saturn

About the Sega Saturn
The Sega Saturn is an early 3D capable console of the mid-1990s. The Sega Saturn had a very unusual architecture, increasing its historic relevance, while also its difficulty in emulation.

Mednafen
Mednafen is a multi system emulator with support for the Sega Saturn.

Yabause
Yabause is an open source Sega Saturn emulator.

title: Emulation/Sega Saturn


text:
Paper Mario/Bosses/Bosses/General Guy

Backstory
General Guy is one of the bosses in Paper Mario. He was really just a regular Shy Guy until King Bowser Koopa gave him one of the Star Spirits to guard. He resides in Shy Guys' Toy Box, along with the rest of the Shy Guy community. He wanted all the rest of the Shy Guys to follow his orders, but never was able to get them to listen. When Bowser used the Star Rod on General Guy, he became a General among the Shy Guy's and commands them to stop Mario and his friends from rescuing Muskular, the fourth Star Spirit.

title: Paper Mario/Bosses/Bosses/General Guy


text:
Emulation/Sega Dreamcast

About the Sega Dreamcast
The Dreamcast was Sega's final major home video game console.

Reicast
An open source and portable Sega Dreamcast emulator.

Redream
A proprietary Sega Dreamcast emulator.

title: Emulation/Sega Dreamcast


text: Emulation/Atari Jaguar

title: Emulation/Atari Jaguar


text:
Talk:Flora of New York/Caryophyllales 3

Flora of New York/Amaranthus

title: Talk:Flora of New York/Caryophyllales 3


text:
User:DMPenguin

hi i am DMPenguin

title: User:DMPenguin


text: Subject:Arabic language

title: Subject:Arabic language


text: Category:Subject:Arabic language/all books


text: Shelf:Arabic language

title: Shelf:Arabic language


text: Shelf:Arabic language/ancestry

title: Shelf:Arabic language/ancestry


text: Category:Shelf:Arabic language

title: Category:Shelf:Arabic language


text: Category:Shelf:Arabic language/all books


text:
Salom, Jonatan!

'''Salom, Jonatan! Globasa by the Direct Method''' ''Salom, Jonatan! Globasa yon Jinji Metode''

A Globasa translation of Salute, Jonathan!, originally written in Occidental.

Globasali trasbasa fe Salute, Jonathan!, aselli eskrido in Okcidental.

Chapters (monlari)
Chapter 1 — Chapter 2 — Chapter 3 — Chapter 4 — Chapter 5 — Chapter 6 — Chapter 7 — Chapter 8 — Chapter 9 — Chapter 10 — Chapter 11 — Chapter 12 — Chapter 13 — Chapter 14 — Chapter 15 — Chapter 16 — Chapter 17 - Chapter 18 — Chapter 19 — Chapter 20 — Chapter 21 — Chapter 22 — Chapter 23 — Chapter 24 — Chapter 25 — Chapter 26 — Chapter 27 — Chapter 28 — Chapter 29 — Chapter 30 — Chapter 31 — Chapter 32 — Chapter 33 — Chapter 34 — Chapter 35 — Chapter 36 — Chapter 37 — Chapter 38 — Chapter 39 — Chapter 40 — Chapter 41 — Chapter 42 — Chapter 43 — Chapter 44 — Chapter 45 — Chapter 46 — Chapter 47 — Chapter 48 — Chapter 49 — Chapter 50 — Chapter 51 — Chapter 52 — Chapter 53 — Chapter 54 — Chapter 55 — Chapter 56 — Chapter 57 — Chapter 58 — Chapter 59 — Chapter 60 — Chapter 61 — Chapter 62 — Chapter 63 — Chapter 64 — Chapter 65 — Chapter 66 — Chapter 67 — Chapter 68 — Chapter 69 — Chapter 70 — Chapter 71 — Chapter 72 — Chapter 73 — Chapter 74 — Chapter 75 — Chapter 76 — Chapter 77 — Chapter 78 — Chapter 79 — Chapter 80 — Chapter 81 — Chapter 82 — Chapter 83 — Chapter 84 — Chapter 85 — Chapter 86 — Chapter 87 — Chapter 88 — Chapter 89 — Chapter 90 — Chapter 91 — Chapter 92 — Chapter 93 — Chapter 94 — Chapter 95 — Chapter 96 — Chapter 97 — Chapter 98 — Chapter 99 — Chapter 100

title: Salom, Jonatan!


text:
Salom, Jonatan!/Mon 1

Monlari - Mon 1 - Mon 2 - Mon 3

Un de mesi lima (1 de mesi 5)
Ixu estay in xaher. Ixu eskri din-kitabu. Ixu oko xaher.

Kam ixu estay in xaher? Si, te estay in xaher.

Kam ixu estay in…ixu? No, te no estay in ixu. Te estay in xaher.

Kam ixu estay in tren? No, te no estay in tren. Te estay in xaher.

Kam ixu eskri din-kitabu? Si, te eskri din-kitabu.

Kam din-kitabu eskri ixu? No, din-kitabu no eskri ixu. Din-kitabu no eskri. Ixu eskri. Ixu eskri din-kitabu.

Kam xaher oko ixu? No, xaher no oko ixu. Xaher no oko. Ixu oko.

Kam ixu oko xaher? Si, ixu oko xaher.

Ixu estay keloka? Te estay in xaher. Ixu eskri keto? Te eskri din-kitabu. Ixu oko keto? Te oko xaher. Te estay in xaher, ji te eskri din-kitabu, ji te oko xaher.

Kam ixu estay in din-kitabu? No, te eskri in din-kitabu. Kam ixu oko ixu? No, te no oko ixu; te oko xaher.

Ixu sen day. Ixu sen bon, ji ixu sen cinonpul. Te fikir. Te fikir tem xaher. Te fikir: “Xaher sen kepul? Kam xaher sen bon? Kam xaher sen day?”

Kam ixu eskri xaher? No, te no eskri xaher; xaher sen day. Te eskri din-kitabu; din-kitabu no sen day.

Kam din-kitabu fikir tem ixu? No, din-kitabu no fikir. Ixu fikir. Te fikir tem din-kitabu, ji fikir tem xaher.

Te eskri in din-kitabu. Te eskri tem xaher. Te eskri, “Xaher sen bon, ji xaher sen day.”

Te fikir, “Xaher sen bon”; te fikir ki xaher sen bon. Te fikir, “Xaher sen day”; te fikir ki xaher sen day. Te fikir tem xaher, ji te fikir tem din-kitabu.

Din-kitabu sen keto? Din-kitabu sen denloka hu ixu eskri; te eskri in din-kitabu. In din-kitabu, ixu eskri tem xaher. In din-kitabu, ixu no eskri tem tren; ixu estay in xaher, no in tren. Te no fikir tem tren; te fikir tem xaher, xaher Muncen.

Xaher sen keto? To sen Muncen. Muncen sen keto? To sen denloka hu ixu estay. Ixu sen keloka? Te sen in Muncen.

Si, Muncen sen day xaher ji bon xaher. Ixu fikir ki Muncen sen bon xaher, ji te fikir ki to sen day xaher. Ixu sen cinonpul. Te loga, “Salom, Muncen!” Te sen bon ixu!

Ixu estay ji fikir, “Tren sen keloka?” Te oko…te oko tren! Te fikir, “Tren!” Fe nunya, te no fikir tem din-kitabu, ji no fikir tem xaher; te fikir tem tren!

Tarihe

 * Mesi lima, 2019 sen 2019-05.
 * Un de mesi lima sen 2019-05-01.
 * Dua de mesi lima sen 2019-05-02.
 * Tiga de mesi lima sen 2019-05-03.

kam

 * kam = ?
 * Ixu estay in xaher.
 * Kam ixu estay in xaher?

tem

 * Ixu fikir tem Muncen.
 * Ixu eskri tem Muncen.
 * Ixu eskri, “Mi oko tren!” Te eskri tem tren.

·yum

 * un = 1
 * un·yum
 * dua = 2
 * dua·yum
 * tiga = 3
 * tiga·yum

Lexilari

 * bon
 * cinon·pul
 * day
 * den·loka
 * din-kitabu
 * eskri
 * estay
 * fe nun·ya
 * fikir
 * hu
 * in
 * ixu
 * ji
 * kam
 * ke·loka
 * ke·to
 * ki
 * loga
 * no ↔ si
 * oko
 * salom
 * sen
 * si ↔ no
 * te
 * tem
 * tren
 * xaher

Am loga:

 * h = kh
 * hu: khu
 * xaher: xakher
 * x = sh
 * ixu: ishu
 * xaher: shaher

|1

title: Salom, Jonatan!/Mon 1


text: Category:Book:Salom, Jonatan!

title: Category:Book:Salom, Jonatan!


text:
Salom, Jonatan!/Mon 2

Monlari - Mon 1 - Mon 2 - Mon 3

Dua de mesi lima (2 de mesi 5)
Fe nunya, ixu sen in tren. Te no sen in Muncen; te sen in tren. Te turi. Te fikir, “Fe nunya, mi turi of Muncen cel Vina. To sen bon turi. Mi suki turi.”

Te fikir tem Muncen. Te fikir, “Fe nunya, mi sen in tren, mas jaledin, mi le sen in Muncen. Ji fe nunya, mi eskri din-kitabu in tren, mas jaledin, mi le eskri din-kitabu in Muncen. Ji fe nunya, mi fikir in tren, mas jaledin, mi le fikir in Muncen. Jaledin, mi fikir tem Muncen in Muncen, ji fe nunya, mi fikir tem Vina in tren. Fe nunya, mi sen in tren, no in Vina. Mas mi fikir ji eskri tem Vina.”

Kam ixu, fe nunya, fikir in Muncen? No, te, fe nunya, no fikir in Muncen. Te fikir in tren. Jaledin, te le fikir in Muncen. Te loga, “Salom, tren!”

Ixu sen in tren, ji te turi cel xaher. Xaher no sen Muncen; Muncen sen xaher de jaledin. Xaher sen Vina; Vina sen xaher fe nundin.

Ixu fikir tem Muncen ji Vina. Te fikir, “Muncen le sen xaher fe jaledin, ji Muncen le sen bon. Fe nunya, to sen nundin, ji mi sen in tren; tren sen bon. Kam Vina xa sen bon?”

Ixu fikir tem Muncen: Muncen le sen xaher de jaledin. Te fikir in tren: te sen in tren de nundin. Ji te fikir tem Vina: Vina xa sen xaher fe jaxadin.

Ji te fikir, “Muncen le sen day. Tren sen day. Kam Vina xa sen day?”

Ji te fikir, “In Muncen, mi le eskri in din-kitabu. In tren, mi eskri in din-kitabu. Kam in Vina, mi xa eskri in din-kitabu? Si, jaxadin in Vina, mi xa eskri in din-kitabu. Mi suki din-kitabu.” Ixu multi fikir (te multi fikir = te fikir ji fikir ji fikir), ji te multi eskri. Si, te sen cinonpul ixu. Cinonpul ixu multi eskri ji multi fikir. Te sen Jonatan; Jonatan sen cinonpul ixu.

Te eskri, “Mi sen Jonatan. Mi sen in tren. Jaledin, mi le estay in Muncen; jaxadin, mi xa estay in Vina.”

Te fikir, ji eskri, “Hin tren…to sen bon, mas lama. To no sen neo; to sen lama. Kam in Muncen, tren sen lama? Si, tren in Muncen sen lama. Mas tren in Muncen sen bon, ji mi suki tren de Muncen. Jaledin, mi le suki tren in Muncen, ji nundin, mi suki tren fe nunya, ji jaxadin, mi xa suki tren in Vina. Mi suki tren!”

Jonatan eskri, “Muncen sen bon xaher ji lama xaher, ji Vina sen bon xaher ji lama xaher. Muncen ji Vina no sen neo, mas sen bon. Muncen ji Vina sen lama, mas bon xaher. Xaher no sen neo, mas bon. Mi suki xaher!”

Jonatan fikir ki duayum din fe turi sen bon. Te loga, “Nundin le sen bon duayum din fe turi. Mi suki turi!”

ja·le·din, nun·din, ja·xa·din

 * ja·le·din = un de mesi lima (05-01)
 * nun·din = dua de mesi lima (05-02)
 * ja·xa·din = tiga de mesi lima (05-03)

le

 * eskri: nundin, mi eskri; jaledin, mi le eskri
 * fikir: nundin, mi fikir; jaledin, mi le fikir
 * oko: nundin, mi oko; jaledin, mi le oko

xa

 * eskri: nundin, mi eskri; jaxadin, mi xa eskri
 * fikir: nundin, mi fikir; jaxadin, mi xa fikir
 * oko: nundin, mi oko; jaxadin, mi xa oko

sen

 * eskri: eskri, le eskri, xa eskri
 * fikir: fikir, le fikir, xa fikir
 * oko: oko, le oko, xa oko
 * sen: sen, le sen, xa sen

of, cel

 * of Muncen cel Vina:
 * Muncen → Vina
 * of Vina cel Muncen:
 * Muncen ← Vina

Lexilari

 * cel
 * de
 * din
 * fe
 * hin
 * ja·le·din (jaledin → nundin → jaxadin)
 * ja·xa·din (jaledin → nundin → jaxadin)
 * lama ↔ neo
 * le
 * mas
 * multi
 * neo ↔ lama
 * nun·din (jaledin → nundin → jaxadin)
 * of
 * suki
 * to
 * turi
 * xa

Am loga:

 * c = ch
 * cel: chel

|2

title: Salom, Jonatan!/Mon 2


text:
User talk:Birdofadozentides

Welcome, Birdofadozentides!

If you have any questions, you can ask in the assistance reading room or possibly contact me personally. SHB2000 (discuss • contribs) 03:29, 30 July 2021 (UTC)

Thank you, I'll keep that in mind. Thank you for being kind to me. Birdofadozentides (discuss • contribs) 00:13, 31 July 2021 (UTC)

title: User talk:Birdofadozentides


text:
Salom, Jonatan!/Mon 3

Monlari - Mon 2 - Mon 3 - Mon 4

Dua de mesi lima (2 de mesi 5)
Jonatan estay in Vina: xaher Vina. Jonatan fikir ki Vina sen bon, ji ki Vina sen meli. Jonatan no fikir ki Vina sen colo; te fikir ki Vina sen meli. Te loga, “Vina sen meli xaher! Mi xa eskri tem to!” Ji te eskri in din-kitabu tem Vina. In din-kitabu, te eskri, “Misu tigayum din sen daymo bon! In duayum din, mi le estay in Muncen. Mas fe nunya, mi estay in Vina: Vina no sen Muncen. Muncen ji Vina sen dua xaher; Muncen no sen Vina, ji Vina no sen Muncen. Mi estay in Vina, ji xaher sen daymo meli. Mi suki Vina; xaher no sen colo. Vina sen daydenmo meli! Mas mi hare problema.”

Keto? Jonatan hare problema? Ke problema? Fe nunya, te no oko din-kitabu; te oko xaher ji fikir. Te multi fikir tem problema.

Problema de Jonatan sen ki te suki Vina, mas te no hare watu.

Te fikir, “Em. Fe nunya, to sen satu sabe (7). Fe satu des (10), tren xoridi. Satu des (10) minus satu sabe (7) sen tiga (3) satu. Satu tiga no sen multi watu cel meli xaher! Mi no hare watu. Na hare watu sen bon, mas mi no hare to! Na eskri din-kitabu sen bon, mas mi no hare watu cel na eskri to! Na fale keto in Vina?”

Te fikir, “Mi no hare multi watu. Na fale keto—eskri din-kitabu, or yam, or oko xaher? Mi xa fale keto?”

Te max fikir, ji loga, “Mi hare bon idey! Un momento…mi fikir. Misu tren xoridi fe satu des (10). Kam hay tren xafe to, fe satu des un (11), or satu des dua (12), des tiga (13), des care (14), or des lima (15)?”

Te oko…si! Hay tren hu da xoridi fe satu des lima. Fe nunya, Jonatan sen hox.

Jonatan loga, “Des lima (15) minus sabe (7) sen oco (8). Fe nunya, mi hare oco satu fe watu! Mi xa fale keto?”

Te loga, “Mi jixi! Mi xa yam bisteki. Ji mi xa glu bira. Un momento…no, mi xa glu dua bira, or tiga bira. Bon idey!”

Fe nunya, Jonatan glu bira in Vina, ji yam bisteki. Te sen hox. Te loga, “Mi sen daydenmo hox! Mi suki xaher Vina. Mi daydenmo suki turi!”

Falelexi

 * Lexi hu da marka nali forma de falelexi sen “na”. Fikir = na fikir, eskri = na eskri, yam = na yam, hare = na hare.
 * Jonatan fikir, “Na yam keto?”, ji te yam bisteki.
 * Jonatan fikir, “Na hare watu sen bon!” Te no hare watu.

de

 * Jonatan fikir: Misu tren xa xoridi. = Tren de Jonatan xa xoridi.
 * Jonatan eskri in din-kitabu. Te eskri to; to sen din-kitabu de Jonatan.

hay

 * hay = sen
 * Kam hay ixu in tren? Si, hay ixu; te sen Jonatan.
 * Kam hay din-kitabu in bisteki? No, no hay din-kitabu in bisteki.

xa·fe to

 * To sen satu 10. Xafe to, to xa sen satu 11.
 * Jonatan le sen in Muncen. Xafe to, te le sen in Vina.
 * Jonatan le fikir, “Mi xa yam.” Xafe to, te le yam.

1) ke?

 * Jonatan suki tren. Jonatan suki ke tren? Jonatan suki lama tren.
 * Jonatan oko xaher. Jonatan oko ke xaher? Jonatan oko xaher Vina.

2) hu, da

 * Jonatan sen in lama tren. Jonatan suki tren. Tren hu Jonatan suki da sen lama.
 * Jonatan oko Vina. Vina sen xaher. Xaher hu Jonatan oko da sen Vina.

day·den·mo

 * Tren sen daymo, daymo lama. Jonatan loga, “Tren sen daydenmo lama!”
 * Bisteki sen daymo, daymo bon. Jonatan loga, “Bisteki sen daydenmo bon!”
 * Jonatan hare day, daymo day problema. Jonatan loga, “Misu problema sen daydenmo day!”

satu
satu Satu = 60 minuto. Un satu = 60 minuto, dua satu = 120 minuto. 6:00 sen satu sisa, ji 2:00 sen satu dua. 6:00 minus 2:00 sen care satu.
 * To sen satu sisa: 6:00
 * To sen satu dua ji des: 2:10

day·den·mo

 * day·den·mo = !
 * Tren sen meli. Tren sen daydenmo meli!
 * Jonatan sen cinonpul. Jonatan sen daydenmo cinonpul!

xor·idi

 * Tren xoridi of Muncen. Xafe to, tren le sen in Vina.
 * Tiga satu xafe to, Jonatan xoridi.

un, dua, tiga…

 * 1: un
 * 2: dua
 * 3: tiga
 * 4: care
 * 5: lima
 * 6: sisa
 * 7: sabe
 * 8: oco
 * 9: nue
 * 10: des
 * 11: des un
 * 12: des dua…

Lexilari

 * bira
 * bisteki
 * cel
 * colo ↔ meli
 * day·den·mo
 * day·mo
 * de
 * em
 * fale
 * glu
 * hare
 * hay
 * hox
 * idey
 * jixi
 * ke
 * ke·to
 * max: multi
 * meli ↔ colo
 * minus
 * mi·su
 * momento: no multi watu
 * na
 * or
 * problema
 * satu
 * watu
 * xa·fe
 * xor·idi
 * yam

|3

title: Salom, Jonatan!/Mon 3


text:
Traditional Abacus and Bead Arithmetic/Introduction

Forewords
The eastern abacus (simplified Chinese: 算盘; traditional Chinese: 算盤; pinyin: suànpán, Japanese:  そろばん soroban,  simply the abacus in this textbook), as an abacus of fixed beads sliding on rods, originated in China at an uncertain date, but by the late 16th century its use had entirely displaced counting rods as a computing tool in its home country. From China its use spread to other neighboring countries, especially Japan, Korea and Vietnam, remaining as the main calculation instrument until modern times. The way in which it was used, the “Traditional Method”,  remained stable for at least four centuries until the end of the 19th century, when an evolution began towards what we will call the “Modern Method”, that makes use of a “Modern Abacus”. This textbook is intended as an introduction to the traditional method, and is aimed at people who already know how to use a modern abacus using the modern method.

Modern and traditional abacus
Modern abacus is of the 4+1 type, i.e. it has four beads on the lower deck and one on the upper deck.

This is all that is needed to be able to perform decimal arithmetic with the abacus. However, traditional abacuses had additional beads, the most frequent being the 5+2 type (although the 5+1 type were also popular in Japan) and occasionally the 5+3 type.

With three upper beads we can store up to 20 on a single rod, which is convenient for traditional division and multiplication techniques. With two upper beads we can achieve the same by using the suspended bead technique (懸珠, Xuán zhū in Chinese, kenshu in Japanese), a kind of simulated or virtual upper third bead for the rare occasions when this third bead is required (see figure from 15 to 20).

With a lower fifth bead, we have two different ways to represent the numbers 5, 10 and 15. This means that we have options from which we can choose the one that is most convenient for us. In the case of addition and subtraction, the possibility of choosing between two representations for 5 and 10 will allow us to simplify the calculations somewhat.

Traditional techniques can be used on any type of abacus, with only the obvious exception of the use of the lower fifth bead on a 4+1 abacus, the difference between having or not additional upper beads is more a matter of comfort and reliability than of efficiency or capabilities.

Modern and traditional methods
Traditional method was used for at least four centuries, covering Ming and Qing dynasties in China and Edo period in Japan. Beginning with the Meiji Restoration in Japan, students of the abacus changed in the sense that they already knew written mathematics before they began to study the abacus, whereas students of earlier times did not know anything about mathematics previously. For most, the abacus was the only form of math they were going to know. This caused a slow adaptation of the teaching and the methods of the abacus to the new times and circumstances, giving rise, after several decades, to what we now call the Modern Method, in fact, a simplified method.

In the English language, the following two works by Takashi Kojima are frequently cited in reference to the modern method:

Several editions of these books can still be found, including e-books formats, and the first one can be consulted at archive.org. In this wikibook, the reader is assumed to be familiar with the content of at least the first of these works.
 * The Japanese Abacus: its Use and Theory (1954)
 * Advanced Abacus: Theory and Practice (1963)

Today, the modern method may seem optimal in many ways and we may think that some "oddities" of the traditional method, especially the way of organizing the division on the abacus, lack practical sense; but if the traditional method remained stable for centuries despite millions of users, including great figures of mathematics like Seki Takakazu who was a great promoter of the use of the soroban abacus in Japan, it can only be because it was also considered optimal by its users. Only the optimality criterion of the ancients differed from the one we may have today.

Unfortunately, no one in the past bothered to write why things were done that way, they just wrote about how to do things, and we can only speculate on the reasons underlying some of these ancient techniques.

Main differences between traditional and modern methods
These are the three most important points that differentiate traditional techniques from modern ones:

 * The use of the fifth lower bead in addition and subtraction to simplify both operations a bit, which extends to everything that can be done with the abacus since everything ultimately depends on addition and subtraction.
 * The use of a division method using a division table that eliminates the mental effort required to determine the quotient figure. This method (kijohou, guīchúfǎ 帰除法) first described in the Mathematical Enlightenment (Suànxué Qǐméng, 算學啟蒙) by Zhū Shìjié 朱士傑 (1299) using counting rods superseded the old division method based on the multiplication table and whose origin dates back to at least the 3rd to 5th centuries AD, to the book The Mathematical Classic of Master Sun (Sūnzǐ Suànjīng 孫子算經) . This old method, being the basis of the short and long methods of written division, has in turn replaced the traditional method of dividing in modern times. That is, modern times have taken us back to the old!
 * Traditional and modern methods also differ in the way the division operation was organized on the abacus. The traditional division arrangement is somewhat more compact than the modern one and also more problematic as it requires (or benefits from) the use of additional, higher beads. This arrangement of the division in turn conditions the way in which multiplication and roots are organized.

The principle of least effort
As mentioned above, no author in the past has written about why things were done this way, only about how to do things; so we can only guess to try to understand why. But the reader will see throughout this book that the traditional techniques suppose, by comparison to the modern ones, a reduction of the mental effort necessary to use the abacus. This is especially clear in the case of division that uses a division table, but also in the rest of the techniques that will be described since they effectively involve a reduction in the number and/or the extent of "gestures" required to complete an operation. We call gesture here to:

 * finger or bead mouvements
 * hand displacements
 * changes of direction
 * skipping rods (i.e. changing hand position from a starting rod to other  non-adjacent rod)

and each of these gestures,

 * as a physical process, takes a time to complete,
 * as governed by our brains, requires our attention, consuming (mental or biochemical) energy,
 * as done by humans (not machines), has a chance to be done in the wrong way, introducing mistakes.

so that we can expect, by reducing the number and extension of these gestures, a somewhat faster, more relaxed and reliable calculation.

In view of the above, one is tempted to think that by adopting this principle of minimum effort, traditional techniques evolved in the sense of making life with the abacus easier, which could explain its validity throughout the centuries, but it is nothing more than a conjecture without documentary support.

If we think of the modern method, polarized towards simplicity, speed and effectiveness, we could say that it is the sprinter method while the traditional method is the Marathon runner method.

The reader, after following this textbook, will be able to draw their own conclusions about it.

Abacus procedure tables, some terms and notation
As usual, in this book we will use tables to describe procedures on the abacus, for example:

Where, on the left, either the digit by digit evolution of the state of the abacus or the current addition or subtraction operation is shown along with comments, on the right, about what is being done. The columns of the abacus are labeled with letters at the top (blank spaces represent unused / cleared rods).

This representation, which is perfect for the modern abacus, needs a couple of refinements to adapt it to the traditional abacus.

 * A column of a traditional abacus can contain a number greater than 9 and it is not possible to write its two digits in our table without disturbing its vertical alignment. To get around this, we will use underline notation for values between 10 and 19 and the first digit (one) will be represented by an underline on the preceding column (see chapter Dealing with overflow for a reason). For example, the situation represented below occurs shortly after starting the traditional division of 998001 by 999

 * and is represented in procedure table as

 * {| class="wikitable" style="font-family:Courier; line-height: 1.10em;"

! Abacus !! Comment
 * + Using underline notation
 * ABCDEFGHIJKLM
 * 9 88001   999
 * Column B value is 18
 * }
 * 9 88001   999
 * Column B value is 18
 * }

 * 5th bead notation.png seen above, numbers 5, 10 and 15 have two possible representations: using or not the 5th lower bead. When it is pertinent to distinguish between the two, we will use the following codes:
 * F: to denote a lower five (five lower beads activated) as opposed to:
 * 5: upper five (one upper bead activated).
 * T: ten on a rod (one upper bead and five lower beads activated). On 5+2 type abacus, it is also a lower ten as opposed to t an upper ten (two upper beads activated).
 * Q: lower fifteen on a rod (two upper beads and five lower beads activated) as opposed to q upper fifteen (suspended upper bead on the 5+2, three upper beads activated on the 5+3).

Soroban Trainer
If you are interested in traditional techniques but do not have a traditional abacus yet, you can use the JavaScript application Soroban Trainer

 * You can run it directly from GitHub in your browser
 * or you can download it to your computer from the repository on GitHub.


text:
Traditional Abacus and Bead Arithmetic/Addition and subtraction

Introduction
With any abacus type, addition is simulated by gathering the sets of counters representing the two addends, while subtraction is simulated by removing from the set of counters representing the minuend a set of counters representing the subtrahend. Addition and subtraction are the only two possible operations on any type of abacus. Everything else has to be decomposed into a sequence of addition and subtraction.

There is hardly any difference between addition and subtraction with a modern abacus or a traditional one, if the reader already knows how to perform these two operations fluently with a modern abacus, he will also do well with a traditional one. The only two additional points to consider are:

 * use of the lower fifth bead to simplify the operations.
 * alternating rightward and leftward operation to save hand displacements.

of which the first is by far the most important.

5th lower bead
The lower fifth bead can be used in addition and subtraction operations just like its companions. Its use is demonstrated in some ancient books such as: Computational Methods with the Beads in a Tray (Pánzhū Suànfǎ 盤珠算法) by Xú Xīnlǔ 徐心魯 (1573), but over time it ceased to appear in the manuals, perhaps as a non-fundamental technique it was no longer explained in the concise books of the past but surely it continued to be taught verbally, as a trick to abbreviate the operations. We dedicate the following chapter: Use of the 5th lower bead to this subject.

Reverse operation
Some old books on the abacus, for instance, Mathematical Track (Shùxué Tōngguǐ 數學通軌) by Kē Shàngqiān (柯尚遷) (1578), demonstrate the addition using an alternating direction of operation with the obvious intention of saving hand movements. If the reader has already studied the modern abacus he knows for sure why it is preferable to operate from left to right, and this is not only a question of the use of the abacus. In the 19th century, the well-known Canadian-American astronomer Simon Newcomb, a renowned human computer, recommended the practice of adding and subtracting from left to right using pencil and paper in the introduction to his tables of logarithms.

Therefore, the alternation of direction of operation should be considered a secondary matter. If it is mentioned here, it is because regardless of its limited usefulness it is a very interesting exercise that can be difficult at first, resulting in a small challenge that can lead the reader to interesting reflections on the order of movement of the fingers; in particular, on whether carries and borrows should be done before or after.

Chapter Extending the 123456789 exercise proposes its daily use as a way to perfect our understanding of beading.

Learning the abacus in the past
It may be of interest to know that in the past people learned the abacus without having prior knowledge of mathematics, in particular without knowing anything like an addition or subtraction table; instead they memorized a series of mnemonic rules, verses or rhymes, short phrases in Chinese that indicated which beads had to be moved to result in the addition or subtraction of one digit to/from another digit. We have an example in English of what these types of rules were like thanks to the booklet: The Fundamental Operations in Bead Arithmetic, How to Use the Chinese Abacus by Kwa Tak Ming, Printed in Hong Kong (unknown publisher and date), a work aimed to English-speaking Filipinos according to the author. Here are rules/rhymes/verses that appear on it and whose interpretation is left to the reader:

Clearly, the table above does not contain the  trivial rules ; eg. "to add two, activate two lower beads" or "to subtract 6, deactivate both an upper and a lower bead". In the event that we cannot proceed with such rules because we do not have the necessary beads at our disposal, then, we use the non-trivial rules listed in the table.

Once the students learned to add and subtract with these types of rules, they began to memorize the multiplication and division tables also in the form of verses or rymas. In total, learning the basics of the abacus required memorizing about 150 rules that had to be recited or sung while applied.

We will have a chance to see more rules by studying the traditional division in this book.

Use of the 5th lower bead
The specialized use of the 5th lower bead and the non-unique representation of numbers 5, 10 and 15 to simplify operations.

Extending the 123456789 exercise
A plethora of addition and subtraction exercises that can be done without an exercise sheet.


text:
Zelda franchise strategy guide/Enemies/Deku Baba

Deku Babas are a fictional species of enemy that appears in the Legend of Zelda series. They are carnivorous plants, with a venus fly trap-like mouth, and sprout from the ground whenever their roots detect any potential prey. They are known to lash out at an enemy with no provocation (possibly for food, like a Venus fly trap). Sometimes, their stems can be used to fashion Deku Sticks. They also sometimes contain Deku Seeds that are dropped when they die.

Ocarina of Time and Majora's Mask
In Ocarina of Time, there are two main variations of Deku Babas. The first kind will shoot straight up (wiggling occasionally) and will yield Deku Sticks once "killed". However, the roots will remain, allowing the Deku Baba to regenerate (these are usually found in areas where a Deku Stick is required, as they can produce an infinite number of Deku Sticks). The second kind will lunge at Link and will be stunned by an attack. If killed normally, it will yield a Deku Nut. If stunned, it will produce a Deku Stick. Unlike the previous kind, these cannot regenerate.

Twilight Princess
Deku Babas in this game are similar to the second variation in Ocarina of Time/Majora's Mask. However, if they hit Link, they will grab him in their jaws.

Baba Serpent/Hebi Baba
Baba Serpents are only found in Twilight Princess. They look like regular Deku Babas with an orange coloration. Once the stem is cut, however, it will either crawl around and attempt to clamp its jaws onto Link, or, if Link is too far away, it will reattach itself to the roots.

Big Baba
Big Babas are massive variations of the Deku Baba found in Twilight Princess. They, too, are orange in color. They are Baba Serpents and Deku Likes combined. Once the head is killed, it will be destroyed, but the base will remain. The base will open up, allowing Link to throw a bomb into the mouth and kill the Big Baba.

Big Deku Baba
In Ocarina of Time, a larger, stronger species terrorized the village where the Kokiri lived. Link was able to remove them after destroying Phantom Ganon, an evil being created by Ganondorf, in the Forest Temple. All Big Deku Babas in the village were destroyed after that (the ones in the Forest Temple, however, remained). In this game, if destroyed normally, they would drop three Deku nuts. However, if they were slain when stunned by a Deku nut, the Hookshot, or sword attack, they would yield a Deku Stick.

Bio Deku Baba
Bio Deku Baba are vicious plants are located in the Great Bay and Stone Tower Temples, and can only be taken out by one hit with a Powder Keg or a very precise throw of Zora Link's fins. Anything else will sever the stem, allowing the plant to walk freely around its environment. On land this can be very irritating and difficult to time with any form of attack, although the sword works best, while underwater Zora Link's barrier attack is the best option.

Boko Baba
In The Wind Waker, no Deku Babas appear. Instead, a larger and more vicious kind of Baba called Boko Babas appeared. At a distance, they resemble Baba Buds, but if Link comes closer the head emerges and attempts to eat him. They are destroyed by stunning them with a jump-attack and then cutting the stem, which forms a Boko Stick. After obtaining the Boomerang, if you fire it at a Boko Baba it will die instantly. They can also be killed by several shots with the Hero's Bow. They appear mainly in the Forest Haven and Forbidden Woods. They usually drop their seeds after they are defeated. In the Forest Haven, there is a Korok who can make a Blue Potion (which restores all health and magic) with four of them if Link is carrying an empty bottle.

Diababa

The boss of the Forest Temple in Twilight Princess. In the first form, two large Deku Baba heads come out of a pool of a toxic purple liquid. Link must use the Gale Boomerang to transport a Bombling to the head. In the second form, a third, even larger head comes out with an eye on its tongue. Ook will carry a Bombling that Link must again use the Gale Boomerang to hit the head, causing it to reveal its eye. Link must then slash the eye repeatedly with the sword.

Mini Baba
This species of Deku Baba is exclusive to Majora's Mask. They act very much like the unaggresive, regenerating species of Deku Baba. However, this form has no stem and thus will only yield Deku Nuts.

Twilit Deku Baba
Twilit versions of Deku Babas in Twilight Princess. They are almost identical to the Deku Babas or Baba Serpents of that game, except for their color. Their colour stays the same, and the only way to distinguish which Baba (Deku or Serpent) they are is only how they react to getting their stems cut.

Trivia

 * Deku Babas are similar to the Piranha Plants from the Mario series.
 * "Deku" means "wooden figurine", and Deku Babas are likely called that to emphasize they are plants. "Hebi" means "snake", and Hebi Babas are likely called that to emphasize their snakelike behaviour when cut off. However, "Boko" doesn't mean anything and it is unclear why Boko Babas are called what they are called (although it should be noted that enemies called "Bokoblins" appear that wield "Boko" Sticks).


text:
User talk:BurakD53

Welcome, BurakD53!

If you have any questions, you can ask in the assistance reading room or possibly contact me personally. Rubbish computer Ping me or leave a message on my talk page 21:04, 30 July 2021 (UTC)

title: User talk:BurakD53


text:
Oberon/ETH Oberon/2.3.7/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/2.3.7/Input.Mod


text:
Oberon/ETH Oberon/Dialer

Dialer.Dial can be used to establish a modem connection from "home" to "office" for PPP. The office computer runs mgetty in Linux and answers the connection according to the ringback protocol. For Dialer to support ringback, the syntax of the Dial script is extended so that an empty modem command string invokes a pause; 11 "" is an 11 s pause in this script. The script belongs in the Oberon.Text.

{* This is for a USR Sportster modem on an Oberon system calling a USR Sportster on a Linux system. *} Ringback = { Init = { COM1 19200 }    {* modem port and speed *} Dial = { "ATZS0=0&F1&B1&C1" 10 "OK" "ATDT16041234567,,;H0" 10 "OK" 11 ""          "ATDT16041234567" 40 "LAPM)"            CALL "PPPMain.StartInst Ringback peter"      }  }

Dialer can also be used for frequently dialed voice calls. This is such a script, invoked with Dialer.Dial NuvoSomeone Device0 ~. Init specifies the COM port; why should Dial specify the device? A better syntax would allow Dialer.Dial Nuvo 6041234567 ~. That would work with various access protocols and destination numbers. Another detail to work on.

{* This is for the USR Sportster modem. *} NuvoSomeone = { Init = { COM1 19200 }    {* modem port and speed *} Dial = { "ATZS0=0&F1&B1&C1" 2 "OK" "ATDT,,;DT,,,;" 20 "OK" "ATDT,,,,,,;" 20 "OK" "ATDT,,,,,,,;H0" 20 "OK" } }

title: Oberon/ETH Oberon/Dialer


text:
Proto-Turkic/Vocabulary

Welcome to fifth lesson in Proto-Turkic, wikibooks!

Vocabulary
The fact that the Lir group still has a living language keeps its vocabulary wide for Proto-Turkic. Although there are different configurations, they are close to each other. This takes us to a language very close to Xiongnu Turkic.

However, it is necessary not to rely on the Common Turkic and Altaic configurations made unconsciously. In this way, you can prevent information pollution.

The four elements in Proto-Turkic

 * water - *sub
 * earth - *toprak
 * fire - *ōt
 * wind - *yẹl

The words are short for the peoples who lead a nomadic life in the steppes of East Asia. Due to this lifestyle and various factors, people have formed words with one or two syllable roots. Long words are only provided with suffixes. Food and animal names are also made up of short words.

Foods in Proto-Turkic

 * wheat - *bodagay
 * barley - *arpa
 * millet - *tạrïg
 * egg - *yumurtka
 * salt - *tūŕ
 * onion - *sogan
 * hen - *tiakïgu
 * meat - *et
 * milk - *sǖt
 * honey - *bạl
 * butter - *yāg
 * cherry - *yidge (complicated)
 * strawberry - *yidgelek (complicated)
 * bird cherry - *yïmurt
 * fruit, vegetable - *yẹ̄miĺč

In today's Turkic languages, an old Common-Turkic word *čiye and Proto-Turkic *yidgelek are blended. Therefore, there is confusion in inheritances.

Animals in Proto-Turkic

 * horse - *ăt
 * foal - *kulum
 * cow - *ingek
 * calf - *buŕagu
 * dog - *it
 * wolf - *bȫrü
 * fox - *tilkü
 * ox - *öküŕ
 * bull - *buka
 * worm - *kūrt
 * bird - *kuĺ
 * small bird - *torgay
 * hawk, falcon - *kïrguy
 * aquila fulva, eagle - *bürküt
 * fish - *bālïk
 * sheatfish - *yāyïn
 * carp - *sāŕgan
 * lion - *arsïlan
 * snake - *yï̄lan
 * mosquito - *siŋek
 * wasp, bee - *ārï
 * beetle - *koŋuŕ
 * insect - *bȫg
 * elk - *bulan
 * he-goat - *teke
 * sheep - *sarïk
 * donkey - *eĺgek (/eĺčgek)

...

Animals have a very wide range in this language. It's not strange at all, considering the years it was spoken.

Next lesson: Genitive, accusative and dative cases

title: Proto-Turkic/Vocabulary


text:
Accordion/Sample accordion music

ABC notation
Traditional folk musicians and accordion players may find mainstream sheet music unhelpful, as it does not name the chords that correspond to bass buttons. Software developer Chris Walshaw has improved on machine language (eg. MIDI, Lilypond) which enable computers to play music, and produced a compromise called ABC notation. Basically the format devotes a few lines to details of the piece, then note names are used rather than dots on lines. The result is music which can be played by computers, or read by the human eye (with some orientation). To hear the music on computer an ABC player is required. An ABC editor allows users to make changes. This format is in use by adherents of 'The Session' Irish folk website, 'Bush Traditions' wiki and the like.

Sample Hornpipe
X:1

T:Brassey Hornpipe

%Second Earl Lord Brassey was governor of Victoria and leading proponent of Federation%

C:Anonymous 1897

O:Allan's Album No. 37 Melbourne, Australia

O:https://trove.nla.gov.au/work/15781307

L:1/16

M:2/4

R:H

K:C

ed| c2G2 G2dc | BcdB c2cd | efge defd | cdec dGed |

c2G2 G2dc | BcdB c2de | dgBe dcAB | G2G2G2AB |

cBcd ecde | f2F2 F2de | fefg afdc | B2g2 g2gf |

efec facf | egce facf | egce fdcB | c2c2c2:|

title: Accordion/Sample accordion music


text:
User talk:Louisnoww

Welcome, Louisnoww!

If you have any questions, you can ask in the assistance reading room or possibly contact me personally. Rubbish computer Ping me or leave a message on my talk page 12:18, 31 July 2021 (UTC)

title: User talk:Louisnoww


text:
User:Dj vaishak

Dj vaishak is a Indian dj artist and he was greatest Bollywood remix he was disck jokey and video jokey. He was called the mix maestro.

title: User:Dj vaishak


text:
User talk:Dj vaishak

Dj vaishak is a Indian dj artist and he was greatest Bollywood remix he was disck jokey and video jokey. He was called the mix maestro.

title: User talk:Dj vaishak


text:
User talk:77.61.180.106

The malfunctioning filter is: ♞ spam

title: User talk:77.61.180.106


text:
Salom, Jonatan!/Mon 4

Monlari - Mon 3 - Mon 4 - Mon 5

Careyum mon (4yum mon)

Jonatan sen keloka? Kam te estay in Vina? No, te estay in alo xaher. Te estay in Bistritsa. To sen xaher in Rumani. Fe nunya, turi xoru in Rumani.

Jonatan eskri in tesu din-kitabu, “Fe un de mesi lima, mi le sen in Muncen. Fe dua de mesi lima, mi le sen in Vina. Xafe to, mi le sen in Budapext. Budapext le sen meli. Mas mi no hare watu in Budapext. Mi oko dolo in Budapext. In Budapext, mi fikir, “Garebi fini hinloka, ji dongu xoru hinloka. Budapext sen alo.”

Te lilmo max fikir tem Budapext. Te fikir, “Mi sen person hu da ata of Engli, of London. Mi pala Englisa, koski person in Engli pala Englisa. Mas in Budapext, mi le no pala Englisa ton person; mi le pala Doycisa. Misu Doycisa no sen bon, mas person in Budapext no pala Englisa. Imi le pala Doycisa. Ki person in Budapext pala Doycisa sen interesne.

Fe nunya, Jonatan fikir tem tesu turi. Te fikir, “Mi le sen in museum in London. In museum, le hay kitabu tem alo dexa. Mi le doxo kitabu. In museum, le hay harita fe alo dexa. Mi le oko harita. Kitabu ji harita loga ki alo dexa sen teli, mas interesne. In alo dexa, hay multi person, multi alo person.”

Fe nunya, Jonatan max fikir tem tesu turi. Te fikir, “Jaledin, mi le sen in Kluj-Napoka. Mi le yam in Kluj-Napoka. Name de yamxey sen ‘paprika hendl’. Yamxey in Kluj-Napoka sen daymo bon. Hotel le sen bon, mas mi le no bon somno. Mas hin dexa sen daymo meli! In tren, mi le oko multi deha ji multi kastilo. Xaher sen maxmo day kom deha, mas deha sen daymo meli. Kastilo sen maxmo day kom hotel, ji maxmo meli kom hotel! Deha sen minmo day kom xaher, mas oto sen meli, ji hotel sen minmo day kom kastilo.”

Jonatan eskri max to in tesu din-kitabu, “Bistritsa sen interesne loka. Bistritsa sen lama loka, maxmo lama kom alo loka. Pia misu hotel in Bistritsa sen lama, maxmo lama kom alo hotel. In hotel, mi le loga misu name, ‘Mi sen Jonatan Harker’ ji ete le loga tas mi, ‘Bonata cel hotel.’ In hotel, mi le oko suratu tas mi. Fe nunya, mi xa doxo misu suratu.”

Jonatan doxo tesu suratu. To loga,

“Misu doste.—Bonata. Am bon somno. Mi sen in Bukovina; fe lutuf, ata cel Bukovina. Kam turi of London le sen bon? Misu dexa sen daymo meli. Bonata cel misu dexa.

Yusu doste, DRAKULA.”

Jonatan doxo suratu ji fikir tem tesu doste Konte Drakula. Te sen kete? Te no jixi. Mas tesu doste sen interesne. Pia deha Bistritsa sen interesne. Jonatan sen hox, ji fikir tem tesu doste. Xafe to, te somno.

alo

 * Jonatan ata of Engli. Te no ata of Rumani. Rumani sen alo dexa. (= Rumani no sen Engli; to sen alo dexa.)

ete, oto

 * Ixu sen te. Dua, tiga, care…ixu sen ete.
 * Kitabu sen to. Dua, tiga, care…kitabu sen oto.
 * Ixu ji kitabu sen oto.

max·mo … kom, min·mo … kom

 * max·mo … kom: >
 * Jonatan sen maxmo day kom din-kitabu. = Jonatan > din-kitabu (Jonatan sen day; din-kitabu no sen day.)
 * Na yam bisteki sen maxmo bon kom na no yam bisteki. = na yam bisteki > na no yam bisteki (Na yam bisteki sen bon; na no yam bisteki no sen bon.)
 * min·mo … kom: <
 * Baytu sen minmo day kom kastilo. = baytu < kastilo (Kastilo sen day; baytu no sen day.)
 * Na yam din-kitabu sen minmo bon kom na yam bisteki. = na yam din-kitabu < na yam bisteki (Na yam bisteki sen bon; na yam din-kitabu no sen bon.)

teli

 * Nundin, Jonatan sen in tren; jaledin, te le sen in tren; jaxadin, te xa sen in tren. Rumani sen teli.

te·su, to·su

 * te → te·su
 * Jonatan doxo suratu. To sen suratu de Jonatan. To sen tesu suratu.
 * to → to·su
 * Xaher hare museum. To sen museum de xaher. To sen tosu museum.

yu, yu·su

 * Jonatan yam yamxey. Person loga, “Yu yam. Kam yusu yamxey sen bon?” (yusu = de Jonatan)
 * Jonatan fikir tem Drakula. Te fikir, “Drakula, yu sen bon ixu. Yusu dexa sen daymo meli.”

Lexilari

 * alo
 * ata
 * bon·ata
 * da
 * deha
 * dexa
 * dolo
 * dongu
 * doste
 * doxo
 * Doyci·sa
 * Engli
 * Engli·sa
 * ete
 * fini ↔ xoru
 * garebi
 * harita
 * hin·loka
 * hotel
 * interes·ne
 * kastilo
 * ke·te
 * konte
 * kos·ki
 * loka
 * max·mo … kom ↔ min·mo … kom
 * min ↔ max
 * min·mo … kom ↔ max·mo … kom
 * museum
 * name
 * oto
 * pala
 * person
 * pia
 * somno
 * suratu
 * teli
 * te·su
 * ton
 * xoru ↔ fini
 * xosu
 * yam·xey
 * yu·su

|4

title: Salom, Jonatan!/Mon 4


text:
User:GonzalezF6042/sandbox

Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged.

title: User:GonzalezF6042/sandbox


text:
User talk:GonzalezF6042/sandbox

This is a comment test

title: User talk:GonzalezF6042/sandbox


text:
User talk:Thuanphuoc21xd

Hello there! Welcome to my wikipedia!

title: User talk:Thuanphuoc21xd


text:
User:Armirh123/sandbox

Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book.

title: User:Armirh123/sandbox


title: User:Armirh123


text:
User talk:Vinod Kumar

New file

title: User talk:Vinod Kumar


text:
Talk:Dag, Jonathan!

English Wikibooks and Foreign Language books.
Hello,

Preserving the text of an extinct language is a noble goal, and I appreciate the effort which is being made here. However as QuiteUnusual noted, I am unsure if the book in its current form is a good fit for English Wikibooks. In the long run, the English Wikibooks community is ill prepared to maintain texts in other languages. You might consider further annotating your text, so that the original Negerhollands text is side by side with an English translation, perhaps using a collapsable box template to hide it from the reader until desired (Since having them visible side by side by default can defeat some of the language learning value of the text.). If you think this is a good direction for the book but need technical assistance, I would be happy to help! This would be closer to an annotated English text, and would be much more likely to survive an rfd nomination by becoming more in line with Wikibooks policy.

Another option would be to make a Negerhollands edition of Wikibooks (dcr Wikibooks), and transwiki Dag, Jonathan! there. I know a lot less about that process, but this is perhaps ideal if you plan on developing more texts in Negerhollands.

--Mbrickn (discuss • contribs) 21:43, 1 August 2021 (UTC)

title: Talk:Dag, Jonathan!


text: History of video games/Printable version


text:
User talk:Morel

Welcome, Morel!

If you have any questions, you can ask in the assistance reading room or possibly contact me personally. Rubbish computer Ping me or leave a message on my talk page 11:48, 2 August 2021 (UTC)

title: User talk:Morel