Register code trainer

Share your advanced PureBasic knowledge/code with the community.
Trond
Always Here
Always Here
Posts: 7446
Joined: Mon Sep 22, 2003 6:45 pm
Location: Norway

Register code trainer

Post by Trond »

I wrote this tool to learn the register code part of intel x86 opcodes. I learned them all during the debugging phase, don't know if this means I'm a quick learner or that I'm not quick with debugging? :lol:

For most people this program will probably be a bit useless as it stands. However, feel free to alter the program for your own use.

Code: Select all

; Register code trainer

; A tool to learn the binary codes for registers used in cpu opcodes
; Input format is code as three digits ("000") or register name ("eax")
; depending on the question asked. Press enter to answer.

; For some hints for starters, read this source code:

Global Dim reg32.s(8)
reg32(0) = "eax"
reg32(1) = "ecx"
reg32(2) = "edx"
reg32(3) = "ebx"
reg32(4) = "esp"
reg32(5) = "ebp"
reg32(6) = "esi"
reg32(7) = "edi"

Global _ans.s
Global _qst.s

OpenWindow(0, 0, 0, 310, 384, "Register code trainer", #PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_MinimizeGadget)

TextGadget(0, 10, 10, 500, 22, "")
TextGadget(100, 10, 65, 80, 24, "Type here:")
StringGadget(1, 90, 62, 200, 21, "")
EditorGadget(2, 10, 90, 290, 250)

Procedure NextQuestion()
  Static regprev
  Repeat
    reg = Random(7)
  Until reg <> regprev
  regprev = reg
  type = Random(2)
  _qst = reg32(reg)
  _ans = RSet(Bin(reg), 3, "0")
  If type = 0 ; (1/3)
    q.s = "What is the binary register code for " + _qst + "?"
  Else ; (2/3)
    Swap _qst, _ans
    q.s = "What register has the register code " + _qst + "?"
  EndIf
  SetGadgetText(0, q)
EndProcedure

Procedure Removeanswer()
  t.s = GetGadgetItemText(2, 0)
  If t
    t = Left(t, Len(t)-3) + "___"
    SetGadgetItemText(2, 0, t)
  EndIf
EndProcedure

Procedure Printok()
  Removeanswer()
  SetGadgetText(1, "")
  AddGadgetItem(2, 0, "Correct! " + _qst + " = " + _ans)
EndProcedure

Procedure Printwrong(t.s)
  Removeanswer()
  AddGadgetItem(2, 0, "Wrong! " + _qst + " <> " + t)
  SetGadgetColor(1, #PB_Gadget_BackColor, #Red)
  SetGadgetColor(1, #PB_Gadget_FrontColor, #White)
EndProcedure

Procedure Answer()
  t.s = GetGadgetText(1)
  If Left(t, 1) = "%"
    t = Mid(t, 2)
  EndIf
  If t = _ans
    Printok()
    NextQuestion()
  Else
    Printwrong(t)
  EndIf
EndProcedure

AddKeyboardShortcut(0, #PB_Shortcut_Return, 0)
NextQuestion()
SetActiveGadget(1)

Repeat
  Select WaitWindowEvent()
    Case #PB_Event_Gadget
      Select EventGadget()
        Case 1
          If EventType() = #PB_EventType_Change
            SetGadgetColor(1, #PB_Gadget_BackColor, -1)
            SetGadgetColor(1, #PB_Gadget_FrontColor, -1)
          EndIf
      EndSelect
    Case #PB_Event_Menu
      Answer()
    Case #PB_Event_CloseWindow
      Break
  EndSelect
ForEver