2018-05-08 18:32:55 +00:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"flag"
|
2018-05-14 09:33:49 +00:00
|
|
|
"fmt"
|
2018-05-08 21:18:49 +00:00
|
|
|
|
|
|
|
"github.com/hajimehoshi/ebiten"
|
|
|
|
|
2018-05-14 09:33:49 +00:00
|
|
|
"mos6502go/audio"
|
2018-05-08 18:32:55 +00:00
|
|
|
"mos6502go/cpu"
|
2018-05-09 14:41:20 +00:00
|
|
|
"mos6502go/keyboard"
|
2018-05-08 18:32:55 +00:00
|
|
|
"mos6502go/mmu"
|
2018-05-14 09:33:49 +00:00
|
|
|
"mos6502go/system"
|
2018-05-11 14:57:42 +00:00
|
|
|
"mos6502go/utils"
|
2018-05-09 16:34:10 +00:00
|
|
|
"mos6502go/video"
|
2018-05-08 21:18:49 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
var showInstructions *bool
|
2018-05-11 14:57:42 +00:00
|
|
|
var disableFirmwareWait *bool
|
2018-05-09 09:57:04 +00:00
|
|
|
var resetKeysDown bool
|
2018-05-14 09:33:49 +00:00
|
|
|
var fpsKeysDown bool
|
2018-05-11 14:57:42 +00:00
|
|
|
var breakAddress *uint16
|
2018-05-09 09:57:04 +00:00
|
|
|
|
2018-05-14 09:33:49 +00:00
|
|
|
// checkSpecialKeys checks
|
|
|
|
// - ctrl-alt-R has been pressed. Releasing the R does a warm reset
|
|
|
|
// - ctrl-alt-F has been pressed, toggling FPS display
|
|
|
|
func checkSpecialKeys() {
|
2018-05-09 09:57:04 +00:00
|
|
|
if ebiten.IsKeyPressed(ebiten.KeyControl) && ebiten.IsKeyPressed(ebiten.KeyAlt) && ebiten.IsKeyPressed(ebiten.KeyR) {
|
|
|
|
resetKeysDown = true
|
|
|
|
} else if ebiten.IsKeyPressed(ebiten.KeyControl) && ebiten.IsKeyPressed(ebiten.KeyAlt) && !ebiten.IsKeyPressed(ebiten.KeyR) && resetKeysDown {
|
|
|
|
resetKeysDown = false
|
2018-05-14 21:49:35 +00:00
|
|
|
cpu.Reset()
|
2018-05-14 09:33:49 +00:00
|
|
|
|
2018-05-09 09:57:04 +00:00
|
|
|
} else {
|
|
|
|
resetKeysDown = false
|
|
|
|
}
|
2018-05-14 09:33:49 +00:00
|
|
|
|
|
|
|
if ebiten.IsKeyPressed(ebiten.KeyControl) && ebiten.IsKeyPressed(ebiten.KeyAlt) && ebiten.IsKeyPressed(ebiten.KeyF) {
|
|
|
|
fpsKeysDown = true
|
|
|
|
} else if ebiten.IsKeyPressed(ebiten.KeyControl) && ebiten.IsKeyPressed(ebiten.KeyAlt) && !ebiten.IsKeyPressed(ebiten.KeyF) && fpsKeysDown {
|
|
|
|
fpsKeysDown = false
|
|
|
|
video.ShowFPS = !video.ShowFPS
|
|
|
|
fmt.Println("Toggled")
|
|
|
|
|
|
|
|
} else {
|
|
|
|
fpsKeysDown = false
|
|
|
|
}
|
2018-05-09 09:57:04 +00:00
|
|
|
}
|
2018-05-08 21:18:49 +00:00
|
|
|
|
|
|
|
func update(screen *ebiten.Image) error {
|
2018-05-09 14:41:20 +00:00
|
|
|
keyboard.Poll()
|
2018-05-14 09:33:49 +00:00
|
|
|
checkSpecialKeys()
|
|
|
|
|
|
|
|
system.FrameCycles = 0
|
|
|
|
system.LastAudioCycles = 0
|
2018-05-15 10:12:38 +00:00
|
|
|
exitAtBreak := true
|
|
|
|
cpu.Run(*showInstructions, breakAddress, exitAtBreak, *disableFirmwareWait, system.CpuFrequency/60)
|
2018-05-14 09:33:49 +00:00
|
|
|
audio.ForwardToFrameCycle()
|
|
|
|
system.Cycles += system.FrameCycles
|
|
|
|
system.FrameCycles = 0
|
2018-05-09 09:57:04 +00:00
|
|
|
|
2018-05-12 17:55:36 +00:00
|
|
|
return video.DrawScreen(screen)
|
2018-05-08 21:18:49 +00:00
|
|
|
}
|
|
|
|
|
2018-05-08 18:32:55 +00:00
|
|
|
func main() {
|
2018-05-08 21:18:49 +00:00
|
|
|
showInstructions = flag.Bool("show-instructions", false, "Show instructions code while running")
|
2018-05-11 14:57:42 +00:00
|
|
|
disableFirmwareWait = flag.Bool("disable-wait", false, "Ignore JSRs to firmware wait at $FCA8")
|
|
|
|
breakAddressString := flag.String("break", "", "Break on address")
|
2018-05-14 09:33:49 +00:00
|
|
|
mute := flag.Bool("mute", false, "Mute sound")
|
2018-05-11 14:57:42 +00:00
|
|
|
diskImage := flag.String("image", "", "Disk Image")
|
2018-05-08 18:32:55 +00:00
|
|
|
flag.Parse()
|
|
|
|
|
2018-05-11 14:57:42 +00:00
|
|
|
breakAddress = utils.DecodeCmdLineAddress(breakAddressString)
|
|
|
|
|
2018-05-12 18:40:17 +00:00
|
|
|
ebiten.SetRunnableInBackground(true)
|
|
|
|
|
2018-05-09 18:32:38 +00:00
|
|
|
cpu.InitInstructionDecoder()
|
2018-05-09 16:43:39 +00:00
|
|
|
mmu.InitRAM()
|
|
|
|
mmu.InitApple2eROM()
|
2018-05-11 14:57:42 +00:00
|
|
|
mmu.InitIO()
|
|
|
|
|
|
|
|
if *diskImage != "" {
|
|
|
|
mmu.ReadDiskImage(*diskImage)
|
|
|
|
}
|
2018-05-08 18:32:55 +00:00
|
|
|
|
2018-05-09 16:43:39 +00:00
|
|
|
cpu.Init()
|
2018-05-09 14:41:20 +00:00
|
|
|
|
|
|
|
keyboard.Init()
|
2018-05-09 16:34:10 +00:00
|
|
|
video.Init()
|
2018-05-14 22:23:01 +00:00
|
|
|
audio.InitEbiten()
|
2018-05-14 09:33:49 +00:00
|
|
|
audio.Mute = *mute
|
|
|
|
system.Init()
|
2018-05-09 14:41:20 +00:00
|
|
|
|
2018-05-14 21:49:35 +00:00
|
|
|
cpu.Reset()
|
2018-05-08 21:18:49 +00:00
|
|
|
|
2018-05-14 21:49:14 +00:00
|
|
|
ebiten.Run(update, 280*video.ScreenSizeFactor, 192*video.ScreenSizeFactor, 2, "Apple //e")
|
2018-05-08 18:32:55 +00:00
|
|
|
}
|