Xorshift 16bit


参考:Retro Programming: 16-Bit Xorshift Pseudorandom Numbers in Z80 Assembly

xors16.asm
; z88dk / WebMSX
; z80asm -b -l xors16.asm
; appmake +msx -b xors16.bin --org 0xd000 --fmsx

CHPUT   equ     $00a2

        org     $d000
start:
        ld      b, 10
.loop
        call    xrnd
        ld      de, buf
        ld      a, (xrnd+2)
        call    tohex2
        ld      a, (xrnd+1)
        call    tohex2
        ld      hl, buf
        call    puts
        djnz    loop
        ret

xrnd:
        ld      hl, 1

        ld      a, h
        rra
        ld      a, l
        rra
        xor     h
        ld      h, a
        ld      a, l
        rra
        ld      a, h
        rra
        xor     l
        ld      l, a
        xor     h
        ld      h, a

        ld      (xrnd+1), hl

        ret

puts:
        ld      a, (hl)
        or      a
        ret     z
        call    CHPUT
        inc     hl
        jr      puts

tohex2:
        push    af
        rlca
        rlca
        rlca
        rlca
        call    tohex
        pop     af
.tohex
        and     $0f
        cp      $0a
        sbc     $69
        daa
        ld      (de), a
        inc     de
        ret

buf:    defm    "xxxx", $0d, $0a, 0
xors16.asm
comment *
MASM32 SDK / MS-DOS
ml /c /AT /Fl xors16.asm
link16 /t xors16;
*
                .model  tiny
                .186

                .code
                org     0100h

main            proc
                mov     bx, 10
        @@loop:
                call    xrnd
                mov     di, offset buf
                call    tohex4
                mov     ah, 09h
                mov     dx, offset buf
                int     21h
                dec     bx
                jnz     @@loop

                mov     ax, 4c00h
                int     21h
main            endp

xrnd            proc
                mov     ax, seed
                mov     dx, ax                  ; ax ^= ax << 7
                shl     dx, 7
                xor     ax, dx
                mov     dx, ax                  ; ax ^= ax >> 9
                shr     dx, 9
                xor     ax, dx
                mov     dx, ax                  ; ax ^= ax << 8
                shl     dx, 8
                xor     ax, dx
                mov     seed, ax
                ret
xrnd            endp

tohex4          proc
                cld
                mov     cx, 4
        @@loop:
                rol     ax, 4
                push    ax
                and     al, 0fh
                cmp     al, 0ah
                sbb     al, 69h
                das
                stosb
                pop     ax
                loop    @@loop
                ret
tohex4          endp

seed            dw      1
buf             db      'xxxx', 0dh, 0ah, '$'

                end     main