Skip to content

Instantly share code, notes, and snippets.

@shigemk2
Created June 9, 2014 15:00
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save shigemk2/a09be1cbab9fdef7542b to your computer and use it in GitHub Desktop.
Save shigemk2/a09be1cbab9fdef7542b to your computer and use it in GitHub Desktop.
let aout = System.IO.File.ReadAllBytes "regs.out"
let read16 (a:byte[]) b =
(int a.[b]) ||| ((int a.[b + 1]) <<< 8)
let tsize = read16 aout 2
let dsize = read16 aout 4
let mem = Array.zeroCreate<byte> 0x10000
mem.[0 .. tsize + dsize - 1] <- aout.[16 .. 16 + tsize + dsize - 1]
let mutable ip = 0
let show len dis =
let bin = [ for b in mem.[ip .. ip + len - 1] -> sprintf "%02x" b ]
printfn "%04x: %-12s %s" ip (String.concat "" bin) dis
ip <- ip + len
let op = [|"ax"; "cx"; "dx"; "bx"; "sp"; "bp"; "si"; "di"|]
let movreg x y =
let pc = x - 0xb8
show 3 (sprintf "mov %s, %04x" op.[pc] (read16 mem (ip + 1)))
while ip < tsize do
match int mem.[ip], int mem.[ip + 1] with
| (x, y) when ((0 <= (x - 0xb8)) && ((x - 0xb8) <= 7)) -> movreg x y
| 0xc7, w ->
match w with
| 0x07 -> show 4 (sprintf "mov [bx], %04x" (read16 mem (ip + 2)))
| 0x47 -> show 5 (sprintf "mov [bx+%x], %04x" mem.[ip + 2] (read16 mem (ip + 3)))
| 0x06 -> show 6 (sprintf "mov [%04x], %04x" (read16 mem (ip + 2)) (read16 mem (ip + 4)))
| _ -> show 4 "??"
| 0xc6, w ->
match w with
| 0x07 -> show 3 (sprintf "mov byte [bx], %02x" mem.[ip + 2])
| 0x47 -> show 4 (sprintf "mov byte [bx+%x], %02x" mem.[ip + 2] mem.[ip + 3])
| 0x06 -> show 5 (sprintf "mov byte [%04x], %02x" (read16 mem (ip + 2)) mem.[ip + 4])
| _ -> show 4 "??"
| 0x89, w ->
match w with
| 0x07 -> show 2 (sprintf "mov [bx], ax")
| 0x4f -> show 3 (sprintf "mov [bx+%x], cx" mem.[ip + 2])
| 0x0f -> show 2 (sprintf "mov [bx], cx")
| _ -> show 2 "??"
| 0x88, w ->
match w with
| 0x07 -> show 2 (sprintf "mov [bx], al")
| 0x67 -> show 3 (sprintf "mov [bx+%x], ah" mem.[ip + 2])
| _ -> show 2 "??"
| 0xb5, _ ->
show 2 (sprintf "mov ch, %02x" mem.[ip + 1])
| 0xb1, _ ->
show 2 (sprintf "mov cl, %02x" mem.[ip + 1])
| 0x81, 0x2e ->
show 6 (sprintf "sub [%04x], %04x" (read16 mem (ip + 2)) (read16 mem (ip + 4)))
| 0x80, 0x2e ->
show 5 (sprintf "sub byte[%04x], %02x" (read16 mem (ip + 2)) mem.[ip + 4])
| 0xcd, 0x07 ->
show 2 "int 7"
match int mem.[ip] with
| 1 ->
show 1 "; exit"
| 4 ->
show 1 "; write"
show 2 "; arg"
show 2 "; arg"
| _ ->
show 1 "; ???"
| 0xcd, n ->
show 2 (sprintf "int %x" n)
| _ ->
show 1 "???"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment