Ocean-240.2-Emulator/debug/dzrp/protocol.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 + "]"
}