1//============================================================================
2//
3// SSSS tt lll lll
4// SS SS tt ll ll
5// SS tttttt eeee ll ll aaaa
6// SSSS tt ee ee ll ll aa
7// SS tt eeeeee ll ll aaaaa -- "An Atari 2600 VCS Emulator"
8// SS SS tt ee ll ll aa aa
9// SSSS ttt eeeee llll llll aaaaa
10//
11// Copyright (c) 1995-2019 by Bradford W. Mott, Stephen Anthony
12// and the Stella Team
13//
14// See the file "License.txt" for information on usage and redistribution of
15// this file, and for a DISCLAIMER OF ALL WARRANTIES.
16//============================================================================
17
18#include "Event.hxx"
19#include "Keyboard.hxx"
20
21// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
22Keyboard::Keyboard(Jack jack, const Event& event, const System& system)
23 : Controller(jack, event, system, Controller::Type::Keyboard)
24{
25 if(myJack == Jack::Left)
26 {
27 myOneEvent = Event::KeyboardZero1;
28 myTwoEvent = Event::KeyboardZero2;
29 myThreeEvent = Event::KeyboardZero3;
30 myFourEvent = Event::KeyboardZero4;
31 myFiveEvent = Event::KeyboardZero5;
32 mySixEvent = Event::KeyboardZero6;
33 mySevenEvent = Event::KeyboardZero7;
34 myEightEvent = Event::KeyboardZero8;
35 myNineEvent = Event::KeyboardZero9;
36 myStarEvent = Event::KeyboardZeroStar;
37 myZeroEvent = Event::KeyboardZero0;
38 myPoundEvent = Event::KeyboardZeroPound;
39 }
40 else
41 {
42 myOneEvent = Event::KeyboardOne1;
43 myTwoEvent = Event::KeyboardOne2;
44 myThreeEvent = Event::KeyboardOne3;
45 myFourEvent = Event::KeyboardOne4;
46 myFiveEvent = Event::KeyboardOne5;
47 mySixEvent = Event::KeyboardOne6;
48 mySevenEvent = Event::KeyboardOne7;
49 myEightEvent = Event::KeyboardOne8;
50 myNineEvent = Event::KeyboardOne9;
51 myStarEvent = Event::KeyboardOneStar;
52 myZeroEvent = Event::KeyboardOne0;
53 myPoundEvent = Event::KeyboardOnePound;
54 }
55}
56
57// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
58void Keyboard::write(DigitalPin pin, bool value)
59{
60 setPin(pin, value);
61
62 // Set defaults
63 setPin(DigitalPin::Six, true);
64 Int32 resistanceFive = MIN_RESISTANCE;
65 Int32 resistanceNine = MIN_RESISTANCE;
66
67 // Now scan the rows and columns
68 if(!getPin(DigitalPin::Four))
69 {
70 setPin(DigitalPin::Six, myEvent.get(myPoundEvent) == 0);
71 if(myEvent.get(myZeroEvent) != 0) resistanceFive = MAX_RESISTANCE;
72 if(myEvent.get(myStarEvent) != 0) resistanceNine = MAX_RESISTANCE;
73 }
74 if(!getPin(DigitalPin::Three))
75 {
76 setPin(DigitalPin::Six, myEvent.get(myNineEvent) == 0);
77 if(myEvent.get(myEightEvent) != 0) resistanceFive = MAX_RESISTANCE;
78 if(myEvent.get(mySevenEvent) != 0) resistanceNine = MAX_RESISTANCE;
79 }
80 if(!getPin(DigitalPin::Two))
81 {
82 setPin(DigitalPin::Six, myEvent.get(mySixEvent) == 0);
83 if(myEvent.get(myFiveEvent) != 0) resistanceFive = MAX_RESISTANCE;
84 if(myEvent.get(myFourEvent) != 0) resistanceNine = MAX_RESISTANCE;
85 }
86 if(!getPin(DigitalPin::One))
87 {
88 setPin(DigitalPin::Six, myEvent.get(myThreeEvent) == 0);
89 if(myEvent.get(myTwoEvent) != 0) resistanceFive = MAX_RESISTANCE;
90 if(myEvent.get(myOneEvent) != 0) resistanceNine = MAX_RESISTANCE;
91 }
92
93 if(resistanceFive != read(AnalogPin::Five))
94 setPin(AnalogPin::Five, resistanceFive);
95 if(resistanceNine != read(AnalogPin::Nine))
96 setPin(AnalogPin::Nine, resistanceNine);
97}
98