[Scummvm-cvs-logs] SF.net SVN: scummvm: [27888] tools/branches/gsoc2007-decompiler

brixxie at users.sourceforge.net brixxie at users.sourceforge.net
Wed Jul 4 02:01:18 CEST 2007


Revision: 27888
          http://scummvm.svn.sourceforge.net/scummvm/?rev=27888&view=rev
Author:   brixxie
Date:     2007-07-03 17:01:18 -0700 (Tue, 03 Jul 2007)

Log Message:
-----------
Minor refactoring and additional opcodes

Modified Paths:
--------------
    tools/branches/gsoc2007-decompiler/antipasto.scm
    tools/branches/gsoc2007-decompiler/util.scm

Property Changed:
----------------
    tools/branches/gsoc2007-decompiler/


Property changes on: tools/branches/gsoc2007-decompiler
___________________________________________________________________
Name: svk:merge
   - 489ca303-0d3d-4dc1-a57d-017c7912a06a:/local/gsoc2007-decompiler:22
   + 489ca303-0d3d-4dc1-a57d-017c7912a06a:/local/gsoc2007-decompiler:24

Modified: tools/branches/gsoc2007-decompiler/antipasto.scm
===================================================================
--- tools/branches/gsoc2007-decompiler/antipasto.scm	2007-07-03 19:44:31 UTC (rev 27887)
+++ tools/branches/gsoc2007-decompiler/antipasto.scm	2007-07-04 00:01:18 UTC (rev 27888)
@@ -2,7 +2,7 @@
 
 ;;; Antipasto - Scumm Script Disassembler Prototype (version 5 scripts)
 ;;; Copyright (C) 2007 Andreas Scholta
-;;; Time-stamp: <2007-07-03 06:35:55 brx>
+;;; Time-stamp: <2007-07-04 01:53:37 brx>
 
 ;;; This program is free software; you can redistribute it and/or
 ;;; modify it under the terms of the GNU General Public License
@@ -31,6 +31,9 @@
 (define (register-opcode name code handler)
   (hash-table-set! opcode-register code (cons name handler)))
 
+(define (register-complex-opcode name codes handler)
+  (for-each (cut register-opcode name <> handler) codes))
+
 (define (decode-op op)
   (let ((opcode-handler (hash-table-ref/default opcode-register
                                                 op
@@ -180,7 +183,7 @@
                            (get-var/byte byte param-1)
                            (get-var/byte byte param-2)))
                ((12) (list "TalkColor" (get-var/byte byte param-1)))
-               ((13) (list "Name" "uuuuh..."))
+               ((13) (list "Name" (get-ascii)))
                ((14) (list "InitAnimNr" (get-var/byte byte param-1)))
                ((16) (list "Width" (get-var/byte byte param-1)))
                ((17) (list "Scale"
@@ -193,16 +196,14 @@
                ((22) (list "AnimSpeed" (get-var/byte byte param-1)))
                (else (error "actorOps fucked up"))))))))
 
-(register-opcode "actorOps" #x13 handle-actor-ops)
-(register-opcode "actorOps" #x53 handle-actor-ops)
-(register-opcode "actorOps" #x93 handle-actor-ops)
-(register-opcode "actorOps" #xd3 handle-actor-ops)
+(register-complex-opcode "actorOps"
+                         '(#x13 #x53 #x93 #xd3)
+                         handle-actor-ops)
 
 (register-opcode "breakHere" #x80 (constantly '()))
 (register-opcode "endCutscene" #xc0 (constantly '()))
 
-(register-opcode "stopObjectCode" #x00 (constantly '()))
-(register-opcode "stopObjectCode" #xa0 (constantly '()))
+(register-complex-opcode "stopObjectCode" '(#x00 #xa0) (constantly '()))
 
 (register-opcode "printEgo" #xd8 (compose list (hole decode-parse-string)))
 
@@ -210,14 +211,9 @@
   (list (get-var/byte op param-1)
         (get-arg-list)))
 
-(register-opcode "startScript" #x0a handle-start-script)
-(register-opcode "startScript" #x2a handle-start-script)
-(register-opcode "startScript" #x4a handle-start-script)
-(register-opcode "startScript" #x6a handle-start-script)
-(register-opcode "startScript" #x8a handle-start-script)
-(register-opcode "startScript" #xaa handle-start-script)
-(register-opcode "startScript" #xca handle-start-script)
-(register-opcode "startScript" #xea handle-start-script)
+(register-complex-opcode "startScript"
+                         '(#x0a #x2a #x4a #x6a #x8a #xaa #xca #xea)
+                         handle-start-script)
 
 (register-opcode "wait"
                  #xae
@@ -238,28 +234,80 @@
                                (ash (fetch-byte) 8)
                                (ash (fetch-byte) 16)))))
 
-(define (register-simple-set op set)
-  (make-123-op "set"
-               op
-               (lambda (op)
-                 (list (get-var)
-                       (list set (get-var/byte op param-1))))
-               1))
+(make-123-op "setClass"
+             #x5d
+             (lambda (op)
+               (list (get-var/word op param-1)
+                     (get-arg-list)))
+             1)
 
+(make-123-op "setObjectName"
+             #x54
+             (lambda (op)
+               (list (get-var/word op param-1)
+                     (get-ascii)))
+             1)
+
+(make-123-op "startSound"
+             #x1c
+             (compose list (cut get-var/byte <> param-1))
+             1)
+
+(register-complex-opcode "setState"
+                         '(#x7 #x47 #x87 #xc7)
+                         (lambda (op)
+                           (list (get-var/word op param-1)
+                                 (get-var/byte op param-2))))
+
+(register-opcode "soundKludge" #x4c (compose list (hole get-arg-list)))
+
+(define suck-vb (compose list (cut get-var/byte <> param-1)))
+(define suck-vw (compose list (cut get-var/word <> param-1)))
+(define suck-vw-vw
+  (lambda (op)
+    (list (get-var/word op param-1)
+          (get-var/word op param-2))))
+
+(define (register-complex-set ops set suck-set-params)
+  (for-each (lambda (op)
+              (register-opcode 'set!
+                               op
+                               (lambda (op)
+                                 (list (get-var)
+                                       (cons set (suck-set-params op))))))
+            ops))
+
+(register-complex-set '(#x15 #x55 #x95 #xd5)
+                      "actorFromPos"
+                      suck-vw-vw)
+
+(define (register-simple-set op set
+                             #!optional (suck-set-params suck-vb))
+  (register-complex-set (make-opcodes op (list param-1))
+                        set
+                        suck-set-params))
+
+(register-simple-set #x16 "getRandomNr")
 (register-simple-set #x68 "isScriptRunning")
 (register-simple-set #x71 "getActorCostume")
 
+;; o5_move
+(register-simple-set #x1a 'identity suck-vw)
+
+(register-opcode 'inc! #x46 (compose list (hole get-var)))
+(register-opcode 'dec! #xc6 (compose list (hole get-var)))
+
 (define (calc-abs-jump relative)
   (sprintf "~X" ;only for testing purposes with intermediary format
            (band #x7fff (+ relative current-script-offset))))
 
-(register-opcode "goto"
+(register-opcode 'goto
                  #x18
                  (lambda (_)
                    (list (calc-abs-jump (fetch-word)))))
 
 (define (register-simple-cond-jump op pred)
-  (register-opcode "goto-unless"
+  (register-opcode 'goto-unless
                    op
                    (lambda (_)
                      (let ((var (get-var)))
@@ -270,7 +318,7 @@
 (register-simple-cond-jump #x28 'zero?)
 
 (define (register-binary-cond-jump op bpred)
-  (make-123-op "goto-unless"
+  (make-123-op 'goto-unless
                op
                (lambda (op)
                  (let ((a (get-var))
@@ -286,6 +334,31 @@
 (register-binary-cond-jump #x8 '/=)
 (register-binary-cond-jump #x48 '=)
 
+(register-complex-opcode 'goto-unless
+                         '(#x1d #x9d)
+                         (lambda (op)
+                           (let ((a (get-var/word op param-1))
+                                 (bl (get-arg-list)))
+                             (list (calc-abs-jump (fetch-word))
+                                   (list "classOfIs" a bl)))))
+
+(define (handle-expression)
+  (list
+   (get-var)
+   (process-bytes-from-script
+    (cut = #xff <>)
+    (lambda (byte)
+      (let ((b (band byte #x1f)))
+        (case b
+          ((1) (get-var/word byte param-1))
+          ((2) '+)
+          ((3) '-)
+          ((4) '*)
+          ((5) '/)
+          ((6) (cddr (decode-op (fetch-byte))))))))))
+
+(register-opcode 'set! #xac (hole handle-expression))
+
 (define lscr (string->u32 "LSCR")) ; 9
 (define scrp (string->u32 "SCRP")) ; 8
 (define encd (string->u32 "ENCD")) ; 8
@@ -309,11 +382,13 @@
       ((= lscr script-type)
        (parse-local-script-header))
       ((= scrp script-type)
-       'global-script)
+       (set-file-position! current-script-port 8))
       ((= encd script-type)
-       'room-entry-script)
+       (set-file-position! current-script-port 8))
       ((= excd script-type)
-       'room-exit-script)
+       (set-file-position! current-script-port 8))
+      ((= verb script-type)
+       (error "VERB script header skipping not yet implemented"))
       (else (error "unknown script type")))))
 
 (define (decode-ops decoded)
@@ -325,7 +400,10 @@
 
 (define (test-run)
   (set! current-script-file
-        "/home/brx/code/gsoc2007-decompiler/M1.scummV5/01.beach.0201") ;01.beach.0201
+        "/home/brx/code/gsoc2007-decompiler/M2.scummV5/entry-4.dmp"
+        ;"/home/brx/code/gsoc2007-decompiler/M2.scummV5/room-15-203.dmp";
+        ;"/home/brx/code/gsoc2007-decompiler/M1.scummV5/01.beach.0201"
+        )
   (set! current-script-port (open-input-file current-script-file))
   (set! current-script-offset 0)
   (parse-header)

Modified: tools/branches/gsoc2007-decompiler/util.scm
===================================================================
--- tools/branches/gsoc2007-decompiler/util.scm	2007-07-03 19:44:31 UTC (rev 27887)
+++ tools/branches/gsoc2007-decompiler/util.scm	2007-07-04 00:01:18 UTC (rev 27888)
@@ -2,7 +2,7 @@
 
 ;;; Antipasto - Scumm Script Disassembler Prototype (version 5 scripts)
 ;;; Copyright (C) 2007 Andreas Scholta
-;;; Time-stamp: <2007-07-03 06:39:09 brx>
+;;; Time-stamp: <2007-07-04 01:57:56 brx>
 
 ;;; This program is free software; you can redistribute it and/or
 ;;; modify it under the terms of the GNU General Public License


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list