mirror of
https://github.com/romychs/Ocean-240.2-Emulator.git
synced 2026-04-21 11:03:21 +03:00
179 lines
4.0 KiB
Go
179 lines
4.0 KiB
Go
package dzrp
|
|
|
|
import "fmt"
|
|
|
|
const (
|
|
VersionMajor = 2
|
|
VersionMinor = 1
|
|
VersionPatch = 0
|
|
AppName = "okemu v1.0.0"
|
|
)
|
|
|
|
type Command struct {
|
|
Len uint32 // Length of the payload data. (little endian)
|
|
Sn uint8 // Sequence number, 1-255. Increased with each command
|
|
Id uint8 // Command ID
|
|
Payload []uint8 // Payload: Data[0]..Data[n-1]
|
|
}
|
|
|
|
type Notification struct {
|
|
Len uint32 // Length of the following data beginning with the sequence number. (little endian)
|
|
Sn uint8 // Sequence number = 0
|
|
Payload []uint8 // Payload: Data[0]..Data[n-1]
|
|
}
|
|
|
|
type Response struct {
|
|
Len uint32 // Length of the following data beginning with the sequence number. (little endian)
|
|
Sn uint8 // Sequence number, same as command.
|
|
Payload []uint8 // Payload: Data[0]..Data[n-1]
|
|
}
|
|
|
|
// The DRZP commands and responses.
|
|
// The response contains the command with the bit 7 set.
|
|
const (
|
|
CMD_INIT = 1
|
|
CMD_CLOSE = 2
|
|
CMD_GET_REGISTERS = 3
|
|
CMD_SET_REGISTER = 4
|
|
CMD_WRITE_BANK = 5
|
|
CMD_CONTINUE = 6
|
|
CMD_PAUSE = 7
|
|
CMD_READ_MEM = 8
|
|
CMD_WRITE_MEM = 9
|
|
CMD_SET_SLOT = 10
|
|
CMD_GET_TBBLUE_REG = 11
|
|
CMD_SET_BORDER = 12
|
|
CMD_SET_BREAKPOINTS = 13
|
|
CMD_RESTORE_MEM = 14
|
|
CMD_LOOPBACK = 15
|
|
CMD_GET_SPRITES_PALETTE = 16
|
|
CMD_GET_SPRITES_CLIP_WINDOW_AND_CONTROL = 17
|
|
|
|
// Sprites
|
|
CMD_GET_SPRITES = 18
|
|
CMD_GET_SPRITE_PATTERNS = 19
|
|
|
|
CMD_READ_PORT = 20
|
|
CMD_WRITE_PORT = 21
|
|
CMD_EXEC_ASM = 22
|
|
CMD_INTERRUPT_ON_OFF = 23
|
|
|
|
// Breakpoint
|
|
CMD_ADD_BREAKPOINT = 40
|
|
CMD_REMOVE_BREAKPOINT = 41
|
|
|
|
CMD_ADD_WATCHPOINT = 42
|
|
CMD_REMOVE_WATCHPOINT = 43
|
|
|
|
// State
|
|
CMD_READ_STATE = 50
|
|
CMD_WRITE_STATE = 51
|
|
)
|
|
|
|
// DZRP notifications.
|
|
const NTF_PAUSE = 1
|
|
|
|
// Machine type that is returned in CMD_INIT.
|
|
// It is required to determine the memory model
|
|
const (
|
|
MachineUnknown = 0
|
|
MachineZX16K = 1
|
|
MachineZX48K = 2
|
|
MachineZX128K = 3
|
|
MachineZXNEXT = 4
|
|
)
|
|
|
|
const (
|
|
RegPC = iota
|
|
RegSP
|
|
RegAF
|
|
RegBC
|
|
RegDE
|
|
RegHL
|
|
RegIX
|
|
RegIY
|
|
RegAF_
|
|
RegBC_
|
|
RegDE_
|
|
RegHL_
|
|
RegUnk
|
|
RegIM
|
|
RegF
|
|
RegA
|
|
RegC
|
|
RegB
|
|
RegE
|
|
RegD
|
|
RegL
|
|
RegH
|
|
RegIXL
|
|
RegIXH
|
|
RegIYL
|
|
RegIYH
|
|
RegF_
|
|
RegA_
|
|
RegC_
|
|
RegB_
|
|
RegE_
|
|
RegD_
|
|
RegL_
|
|
RegH_
|
|
RegR
|
|
RegI
|
|
)
|
|
|
|
type CmdInitCommand struct {
|
|
Major uint8 // Version (of the command sender): 3 bytes, big endian: Major.Minor.Patch
|
|
Minor uint8
|
|
Patch uint8
|
|
AppName string // 0-terminated string The program name + version as a string. E.g. "DeZog v1.4.0"
|
|
}
|
|
|
|
type CmdInitResponse struct {
|
|
Sn uint8 // Same seq no
|
|
Error uint8 // Error: 0=no error, 1=general (unknown) error.
|
|
Major uint8 // Version (of the response sender) : 3 bytes, big endian: Major.Minor.Patch
|
|
Minor uint8
|
|
Patch uint8
|
|
Machine uint8 // Machine type (memory model): 0 = UNKNOWN, 1 = ZX16K, 2 = ZX48K, 3 = ZX128K, 4 = ZXNEXT.
|
|
AppName string // 0-terminated string The responding program name + version as a string. E.g. "dbg_uart_if v2.0.0"}
|
|
}
|
|
|
|
const (
|
|
BprStepOver = 0
|
|
BprManual = 1
|
|
BprHit = 2
|
|
BprMemRead = 3
|
|
BprMemWrite = 4
|
|
BprOther = 255
|
|
)
|
|
|
|
var BprReasons = map[int]string{
|
|
BprStepOver: "Step-over",
|
|
BprManual: "Manual break",
|
|
BprHit: "Hit",
|
|
BprMemRead: "WP read",
|
|
BprMemWrite: "WP Write",
|
|
BprOther: "Other",
|
|
}
|
|
|
|
func (c *Command) toString() string {
|
|
return fmt.Sprintf("Len: %d, Sn: %d, Id: %d, Payload: %s", c.Len, c.Sn, c.Id, PayloadToString(c.Payload))
|
|
}
|
|
|
|
func NewResponse(cmd *Command, payload []byte) *Response {
|
|
return &Response{
|
|
Len: uint32(len(payload) + 1),
|
|
Sn: cmd.Sn,
|
|
Payload: payload,
|
|
}
|
|
}
|
|
|
|
func PayloadToString(payload []byte) string {
|
|
res := "["
|
|
for _, b := range payload {
|
|
res += fmt.Sprintf("%02X ", b)
|
|
}
|
|
return res + "]"
|
|
}
|