mirror of
https://github.com/ivanizag/izapple2.git
synced 2024-12-28 17:29:57 +00:00
145 lines
3.1 KiB
Go
145 lines
3.1 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"fyne.io/fyne"
|
|
"fyne.io/fyne/driver/desktop"
|
|
"github.com/ivanizag/izapple2"
|
|
"github.com/ivanizag/izapple2/screen"
|
|
)
|
|
|
|
type keyboard struct {
|
|
s *state
|
|
keyChannel *izapple2.KeyboardChannel
|
|
|
|
controlLeft bool
|
|
controlRight bool
|
|
}
|
|
|
|
func newKeyboard(s *state) *keyboard {
|
|
var k keyboard
|
|
k.s = s
|
|
k.keyChannel = izapple2.NewKeyboardChannel(s.a)
|
|
return &k
|
|
}
|
|
|
|
func (k *keyboard) putRune(ch rune) {
|
|
k.keyChannel.PutRune(ch)
|
|
}
|
|
|
|
// PutChar sends a character to the emulator
|
|
func (k *keyboard) PutChar(ch uint8) {
|
|
k.keyChannel.PutChar(ch)
|
|
}
|
|
|
|
func (k *keyboard) putKeyAction(keyEvent *fyne.KeyEvent, press bool) {
|
|
|
|
ctrl := k.controlLeft || k.controlRight
|
|
if press && ctrl && len(keyEvent.Name) == 1 {
|
|
// Hacky. We relay on the letter values to be a single uppercase char.
|
|
ch := keyEvent.Name[0]
|
|
if ch >= 'A' && ch <= 'Z' {
|
|
k.keyChannel.PutChar(uint8(ch) - 65 + 1)
|
|
return
|
|
}
|
|
}
|
|
|
|
if press && ctrl {
|
|
// F keys with ctrl do not generate events in putKey()
|
|
switch keyEvent.Name {
|
|
case fyne.KeyF1:
|
|
k.s.a.SendCommand(izapple2.CommandReset)
|
|
case fyne.KeyF12:
|
|
screen.AddScenario(k.s.a, "../../screen/test_resources/")
|
|
}
|
|
}
|
|
|
|
switch keyEvent.Name {
|
|
case desktop.KeyControlLeft:
|
|
k.controlLeft = press
|
|
case desktop.KeyControlRight:
|
|
k.controlRight = press
|
|
}
|
|
}
|
|
|
|
func (k *keyboard) putKey(keyEvent *fyne.KeyEvent) {
|
|
/*
|
|
See "Apple II reference manual", page 5
|
|
|
|
To get keys as understood by the Apple2 hardware run:
|
|
10 A=PEEK(49152)
|
|
20 PRINT A, A - 128
|
|
30 GOTO 10
|
|
*/
|
|
|
|
// Keys with control are not generating events in putKey()
|
|
//ctrl := k.controlLeft || k.controlRight
|
|
|
|
result := uint8(0)
|
|
switch keyEvent.Name {
|
|
case fyne.KeyEscape:
|
|
result = 27
|
|
case fyne.KeyBackspace:
|
|
result = 8
|
|
case fyne.KeyReturn:
|
|
result = 13
|
|
case fyne.KeyEnter:
|
|
result = 13
|
|
case fyne.KeyLeft:
|
|
result = 8
|
|
case fyne.KeyRight:
|
|
result = 21
|
|
|
|
// Apple //e
|
|
case fyne.KeyUp:
|
|
result = 11 // 31 in the Base64A
|
|
case fyne.KeyDown:
|
|
result = 10
|
|
case fyne.KeyTab:
|
|
result = 9
|
|
case fyne.KeyDelete:
|
|
result = 127 // 24 in the Base64A
|
|
|
|
// Base64A clone particularities
|
|
case fyne.KeyF2:
|
|
result = 127 // Base64A
|
|
|
|
// Control of the emulator
|
|
case fyne.KeyF1:
|
|
/*if ctrl {
|
|
k.s.a.SendCommand(izapple2.CommandReset)
|
|
}*/
|
|
case fyne.KeyF5:
|
|
k.s.a.SendCommand(izapple2.CommandShowSpeed)
|
|
case fyne.KeyF6:
|
|
if k.s.screenMode != screen.ScreenModeGreen {
|
|
k.s.screenMode = screen.ScreenModeGreen
|
|
} else {
|
|
k.s.screenMode = screen.ScreenModeNTSC
|
|
}
|
|
case fyne.KeyF7:
|
|
k.s.showPages = !k.s.showPages
|
|
case fyne.KeyF9:
|
|
k.s.a.SendCommand(izapple2.CommandDumpDebugInfo)
|
|
case fyne.KeyF10:
|
|
k.s.a.SendCommand(izapple2.CommandNextCharGenPage)
|
|
case fyne.KeyF11:
|
|
k.s.a.SendCommand(izapple2.CommandToggleCPUTrace)
|
|
case fyne.KeyF12:
|
|
//case fyne.KeyPrintScreen:
|
|
err := screen.SaveSnapshot(k.s.a, k.s.screenMode, "snapshot.png")
|
|
if err != nil {
|
|
fmt.Printf("Error saving snapshoot: %v.\n.", err)
|
|
} else {
|
|
fmt.Println("Saving snapshot")
|
|
}
|
|
//case fyne.KeyPause:
|
|
// k.s.a.SendCommand(izapple2.CommandPauseUnpauseEmulator)
|
|
}
|
|
|
|
if result != 0 {
|
|
k.keyChannel.PutChar(result)
|
|
}
|
|
}
|