parse_logcpu.py 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. """ Parse LOGCPU.TXT from dosbox-x (LOGL)
  2. """
  3. import sys
  4. logfile = sys.argv[1]
  5. with open(logfile, "r") as f:
  6. openfiles = 0
  7. lineno = 0
  8. for line in f:
  9. lineno += 1
  10. # Skip empty lines
  11. if not line.strip():
  12. continue
  13. # Skip comments
  14. if line.startswith("//"):
  15. continue
  16. # Parse line
  17. # 0277:00000B69 int 21 CD 21 EAX:00003D00 EBX:00003C36 ECX:00000000 EDX:00003E92 ESI:00003D4B EDI:00003E62 EBP:00003C36 ESP:00003C34 DS:028F ES:028F FS:0337 GS:02BF SS:028F CF:0 ZF:1 SF:0 OF:0 AF:0 PF:1 IF:1 TF:0 VM:0 FLG:00003246 CR0:00000011
  18. instruction = line[15:15+32]
  19. eax = line[97:97+8]
  20. ax = eax[4:]
  21. ah = ax[0:2]
  22. al = ax[2:]
  23. ebx = line[110:110+8]
  24. bx = ebx[4:]
  25. bh = bx[0:2]
  26. bl = bx[2:]
  27. ecx = line[123:123+8]
  28. cx = ecx[4:]
  29. ch = cx[0:2]
  30. cl = cx[2:]
  31. edx = line[136:136+8]
  32. dx = edx[4:]
  33. dh = dx[0:2]
  34. dl = dx[2:]
  35. ds = line[200:200+4]
  36. if instruction.startswith("call 0000199E"):
  37. print(f"{lineno:5d} call 0000199E")
  38. continue
  39. if not instruction.startswith("int 21"):
  40. continue
  41. if ah == "2C":
  42. print(f"{lineno:5d} Get system time")
  43. # create file
  44. elif ah == "3C":
  45. print(f"{lineno:5d} Create")
  46. # open file
  47. elif ah == "3D":
  48. openfiles += 1
  49. print(f"{lineno:5d} Open")
  50. # close file
  51. elif ah == "3E":
  52. openfiles -= 1
  53. print(f"{lineno:5d} Close handle:{bx}")
  54. # read
  55. elif ah == "3F":
  56. print(f"{lineno:5d} Read handle:{bx} no:0x{cx} to:{ds}:{dx}")
  57. # write file
  58. elif ah == "40":
  59. print(f"{lineno:5d} Write handle:{bx} no:0x{cx} from:{ds}:{dx}")
  60. # delete file
  61. elif ah == "41":
  62. print(f"{lineno:5d} Delete")
  63. # seek
  64. elif ah == "42":
  65. print(f"{lineno:5d} Seek handle:{bx}", int(f"{cx}{dx}", 16), "from", end=' ')
  66. if al == "00":
  67. print("start")
  68. elif al == "01":
  69. print("current")
  70. elif al == "02":
  71. print("end")
  72. else:
  73. print(f"WTF ({al})")
  74. elif ah == "44":
  75. print(f"{lineno:5d} IOCTL Write")
  76. else:
  77. print(f"{lineno:5d} TODO {ah:04X}")
  78. print(openfiles)