Created
June 9, 2014 15:00
-
-
Save shigemk2/a09be1cbab9fdef7542b to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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