.TITLE ZEMU .IDENT /V1.3/ ; ++ ; This is a Z-machine emulator. ; (c) 2000, 2004 by Johnny Billquist ; ; History: ; ; 00-07-19 BQT Initial coding started. ; Y1.0 00-08-26 21:00 BQT First release. ; V1.1 00-09-16 12:00 BQT Made official. ; V1.2 00-09-24 01:30 BQT Added code for non-EIS machines. ; V1.3 04-08-31 11:30 BQT Added call to GAMINI ; -- .INCLUDE /ZMAC/ ; .PSECT CODE,I,RO ; .ENABL LSB ; START:: CALL ZINIT CALL MEMINI CALL SCRINI CALL VARINI .GETBB #0 .DBG #D.INFO,<"We have a game. Version is %D.">,R0 .GETBB #1 .DBG #D.INFO,<"Flags are %P.">,R0 .GETWB #4 .DBG #D.INFO,<"High memory base is %M.">,R0 .GETWB #6 .DBG #D.INFO,<"Start address is %M.">,R0 .GETWB #10 .DBG #D.INFO,<"Dictionary is at %M.">,R0 .GETWB #12 .DBG #D.INFO,<"Object table is at %M.">,R0 .GETWB #14 .DBG #D.INFO,<"Global variables table is at %M.">,R0 .GETWB #16 .DBG #D.INFO,<"Static memory starts at %M.">,R0 .GETWB #30 .DBG #D.INFO,<"Abbreviations table is at %M.">,R0 .GETWB #32 .DBG #D.INFO,<"Length of file is %M.">,R0 CALL GAMINI CALL ZRUN ZEND:: CALL SCRRES CALL PRSTOP JMP ZEXIT .DSABL LSB ; .IF GT EIS ; ; Emulate PDP-11 MUL instruction. ; ; In: 4(SP) SRC ; 2(SP) DST ; ; Out: 4(SP) Low part ; 2(SP) High part. ; ZEMUL:: MOV R0,-(SP) ; Save registers. MOV R1,-(SP) MOV 6(SP),R0 ; The lower value is used as loop count CMP R0,10(SP) BLOS 10$ MOV 10(SP),6(SP) ; Other is lower. Exchange them. MOV R0,10(SP) 10$: CLR R0 ; Clear result. CLR R1 INC 6(SP) ; Setup loop counter +1. 20$: DEC 6(SP) ; Finished? BEQ 30$ ; Yes. ADD 10(SP),R0 ; Add one time. BCC 20$ ; No carry, do again. INC R1 ; When we have carry set, we bump high. BR 20$ ; Repeat. 30$: MOV R1,6(SP) ; Done. Save high part. MOV R0,10(SP) ; Save low part. MOV (SP)+,R1 ; Restore registers. MOV (SP)+,R0 RETURN ; Done. ; ; Emulate PDP-11 DIV instruction. ; ; In: 6(SP) High part ; 4(SP) Low part ; 2(SP) Dividend ; ; Out: 6(SP) Quotient ; 4(SP) Remainder ; 2(SP) Junk ; ZEDIV:: MOV R0,-(SP) ; Save registers. MOV R1,-(SP) MOV 12(SP),R0 ; Get low. MOV 10(SP),R1 ; Get high. MOV #-1,12(SP) ; Setup quotient. 10$: INC 12(SP) ; Count quotient. SUB 6(SP),R0 ; Count on. BCC 10$ ; Not done yet. SBC R1 ; High part changed. BCC 10$ ; Not done yet... ADD 6(SP),R0 ; Done. Restore remainder. MOV R0,10(SP) ; Save remainder. MOV (SP)+,R1 ; Restore registers. MOV (SP)+,R0 RETURN ; Done. ; .ENDC ; .END START