Implement the RNG for word selection
This commit is contained in:
parent
b7e010e5ac
commit
b000857bb4
281
dosdl.asm
281
dosdl.asm
|
@ -5,11 +5,36 @@ org 0x100
|
||||||
|
|
||||||
section .code
|
section .code
|
||||||
|
|
||||||
select_target:
|
seed equ 20220224
|
||||||
; TODO: Implement target word selection
|
|
||||||
; https://github.com/lynn/hello-wordl/blob/7da40c1f067eb1ec157d4c5b7a9bd8257ed39342/src/util.ts#L14
|
|
||||||
mov si, 1397
|
|
||||||
|
|
||||||
|
; Seed the rng
|
||||||
|
mov ax, seed & 0xffff
|
||||||
|
mov dx, seed >> 16
|
||||||
|
mov bp, rng_seed
|
||||||
|
call store32
|
||||||
|
|
||||||
|
select_target:
|
||||||
|
; Call rng to get a number
|
||||||
|
call rng
|
||||||
|
mov bp, rng_output
|
||||||
|
call store32
|
||||||
|
|
||||||
|
; Multiply rng output by number of targer words
|
||||||
|
xor si, si
|
||||||
|
xor dx, dx
|
||||||
|
xor ax, ax
|
||||||
|
mov cx, targets_len
|
||||||
|
.multiply_loop:
|
||||||
|
add ax, [rng_output + 0]
|
||||||
|
adc dx, [rng_output + 2]
|
||||||
|
adc si, 0
|
||||||
|
loop .multiply_loop
|
||||||
|
|
||||||
|
mov ax, si
|
||||||
|
call hexprint16
|
||||||
|
call newline
|
||||||
|
|
||||||
|
load_target:
|
||||||
shl si, 1
|
shl si, 1
|
||||||
shl si, 1
|
shl si, 1
|
||||||
add si, targets
|
add si, targets
|
||||||
|
@ -18,6 +43,11 @@ select_target:
|
||||||
|
|
||||||
call unpack_target
|
call unpack_target
|
||||||
|
|
||||||
|
; Figure out whether this is a removed word
|
||||||
|
; If so, reroll target word
|
||||||
|
cmp byte [target], '{'
|
||||||
|
je select_target
|
||||||
|
|
||||||
read_guess:
|
read_guess:
|
||||||
; Number of thus far guessed letters stored in bx
|
; Number of thus far guessed letters stored in bx
|
||||||
xor bx, bx
|
xor bx, bx
|
||||||
|
@ -428,6 +458,237 @@ unpack_target:
|
||||||
|
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
; out:
|
||||||
|
; dx:ax = result
|
||||||
|
rng:
|
||||||
|
; https://github.com/lynn/hello-wordl/blob/7da40c1f067eb1ec157d4c5b7a9bd8257ed39342/src/util.ts#L14
|
||||||
|
|
||||||
|
; rng_t = rng_seed += rng_seed + 0x6d2b79f5
|
||||||
|
mov bp, rng_seed
|
||||||
|
call load32
|
||||||
|
add ax, 0x79f5
|
||||||
|
adc dx, 0x6d2b
|
||||||
|
call store32
|
||||||
|
mov bp, rng_t
|
||||||
|
call store32
|
||||||
|
|
||||||
|
; xorl32 = rng_t
|
||||||
|
mov bp, xorl32
|
||||||
|
call store32
|
||||||
|
|
||||||
|
; xorr32 = rng_t >> 15
|
||||||
|
mov cx, 15
|
||||||
|
call rshift32
|
||||||
|
mov bp, xorr32
|
||||||
|
call store32
|
||||||
|
|
||||||
|
; mull32 = xorl32 ^ xorr32 = rng_t ^ (rng_t >> 15)
|
||||||
|
call xor32
|
||||||
|
mov bp, mull32
|
||||||
|
call store32
|
||||||
|
|
||||||
|
; mulr32 = rng_t | 1
|
||||||
|
mov bp, rng_t
|
||||||
|
call load32
|
||||||
|
or ax, 1
|
||||||
|
mov bp, mulr32
|
||||||
|
call store32
|
||||||
|
|
||||||
|
; rng_t = mull32 * mulr32 = (rng_t ^ (rng_t >> 15)) * (rng_t | 1)
|
||||||
|
call mul32
|
||||||
|
mov bp, rng_t
|
||||||
|
call store32
|
||||||
|
|
||||||
|
; xorl32 = rng_t
|
||||||
|
mov bp, xorl32
|
||||||
|
call store32
|
||||||
|
|
||||||
|
; xorr32 = rng_t >> 7
|
||||||
|
mov cx, 7
|
||||||
|
call rshift32
|
||||||
|
mov bp, xorr32
|
||||||
|
call store32
|
||||||
|
|
||||||
|
; mull32 = xorl32 ^ xorr32 = rng_t ^ (rng_t >> 7)
|
||||||
|
call xor32
|
||||||
|
mov bp, mull32
|
||||||
|
call store32
|
||||||
|
|
||||||
|
; mulr32 = rng_t | 61
|
||||||
|
mov bp, rng_t
|
||||||
|
call load32
|
||||||
|
or ax, 61
|
||||||
|
mov bp, mulr32
|
||||||
|
call store32
|
||||||
|
|
||||||
|
; addl32 = rng_t
|
||||||
|
mov bp, rng_t
|
||||||
|
call load32
|
||||||
|
mov bp, addl32
|
||||||
|
call store32
|
||||||
|
|
||||||
|
; addr32 = mull32 * mulr32 = (rng_t ^ (rng_t >> 7)) * (rng_t | 61)
|
||||||
|
call mul32
|
||||||
|
mov bp, addr32
|
||||||
|
call store32
|
||||||
|
|
||||||
|
; xorl32 = rng_t
|
||||||
|
mov bp, rng_t
|
||||||
|
call load32
|
||||||
|
mov bp, xorl32
|
||||||
|
call store32
|
||||||
|
|
||||||
|
; xorr32 = addl32 + addr32 = rng_t + (rng_t ^ (rng_t >> 7)) * (rng_t | 61)
|
||||||
|
call add32
|
||||||
|
mov bp, xorr32
|
||||||
|
call store32
|
||||||
|
|
||||||
|
; rng_t = xorl32 ^ xorr32 = rng_t ^ (rng_t + (rng_t ^ (rng_t >> 7)) * (rng_t | 61))
|
||||||
|
call xor32
|
||||||
|
mov bp, rng_t
|
||||||
|
call store32
|
||||||
|
|
||||||
|
; xorl32 = rng_t
|
||||||
|
mov bp, xorl32
|
||||||
|
call store32
|
||||||
|
|
||||||
|
; xorr32 = rng_t >> 14
|
||||||
|
mov cx, 14
|
||||||
|
call rshift32
|
||||||
|
mov bp, xorr32
|
||||||
|
call store32
|
||||||
|
|
||||||
|
; result = xorl32 ^ xorr32 = rng_t ^ (rng_t >> 14)
|
||||||
|
call xor32
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
; in:
|
||||||
|
; bp = address of uint32
|
||||||
|
; out:
|
||||||
|
; dx = high 16 bits
|
||||||
|
; ax = low 16 bits
|
||||||
|
load32:
|
||||||
|
mov ax, [bp + 0]
|
||||||
|
mov dx, [bp + 2]
|
||||||
|
ret
|
||||||
|
|
||||||
|
; in:
|
||||||
|
; bp = address of uint32
|
||||||
|
; dx = high 16 bits
|
||||||
|
; ax = low 16 bits
|
||||||
|
store32:
|
||||||
|
mov [bp + 0], ax
|
||||||
|
mov [bp + 2], dx
|
||||||
|
ret
|
||||||
|
|
||||||
|
; in:
|
||||||
|
; dx:ax = uint32 to be shifted
|
||||||
|
; cx = shift amount (must not be 0)
|
||||||
|
; out:
|
||||||
|
; dx:ax = result
|
||||||
|
rshift32:
|
||||||
|
push cx
|
||||||
|
.loop:
|
||||||
|
shr dx, 1
|
||||||
|
rcr ax, 1
|
||||||
|
loop .loop
|
||||||
|
pop cx
|
||||||
|
ret
|
||||||
|
|
||||||
|
; in:
|
||||||
|
; [xorl32], [xorr32] = operands
|
||||||
|
; out:
|
||||||
|
; dx:ax = result
|
||||||
|
xor32:
|
||||||
|
mov ax, [xorl32 + 0]
|
||||||
|
xor ax, [xorr32 + 0]
|
||||||
|
mov dx, [xorl32 + 2]
|
||||||
|
xor dx, [xorr32 + 2]
|
||||||
|
ret
|
||||||
|
|
||||||
|
; in:
|
||||||
|
; [mull32], [mulr32] = operands
|
||||||
|
; out:
|
||||||
|
; dx:ax = result
|
||||||
|
mul32:
|
||||||
|
push bx
|
||||||
|
push cx
|
||||||
|
; c = 1<<16
|
||||||
|
; l = l₁<<16 + l₀
|
||||||
|
; r = r₁<<16 + r₀
|
||||||
|
; l·r = (l₁<<16 + l₀)·(r₁<<16 + r₀)
|
||||||
|
; = l₁<<16·r₁<<16 + l₁<<16·r₀ + l₀·r₁<<16 + l₀·r₀
|
||||||
|
; = l₁·r₁<<32 + l₁·r₀<<16 + l₀·r₁<<16 + l₀·r₀ ||1<<32 = 0 (mod 1<<32)
|
||||||
|
; = l₁·r₀<<16 + l₀·r₁<<16 + l₀·r₀
|
||||||
|
|
||||||
|
; l₀·r₀
|
||||||
|
mov ax, [mull32 + 0]
|
||||||
|
mul word [mulr32 + 0]
|
||||||
|
mov bx, ax
|
||||||
|
mov cx, dx
|
||||||
|
|
||||||
|
; l₀·r₁<<16
|
||||||
|
mov ax, [mull32 + 0]
|
||||||
|
mul word [mulr32 + 2]
|
||||||
|
add cx, ax
|
||||||
|
|
||||||
|
; l₁·r₀<<16
|
||||||
|
mov ax, [mull32 + 2]
|
||||||
|
mul word [mulr32 + 0]
|
||||||
|
add cx, ax
|
||||||
|
|
||||||
|
mov dx, cx
|
||||||
|
mov ax, bx
|
||||||
|
|
||||||
|
pop cx
|
||||||
|
pop bx
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
; in:
|
||||||
|
; [addl32], [addr32] = operands
|
||||||
|
; out:
|
||||||
|
; dx:ax = result
|
||||||
|
add32:
|
||||||
|
mov ax, [addl32 + 0]
|
||||||
|
mov dx, [addl32 + 2]
|
||||||
|
add ax, [addr32 + 0]
|
||||||
|
adc dx, [addr32 + 2]
|
||||||
|
ret
|
||||||
|
|
||||||
|
hexprint32:
|
||||||
|
xchg ax, dx
|
||||||
|
call hexprint16
|
||||||
|
xchg ax, dx
|
||||||
|
hexprint16:
|
||||||
|
xchg ah, al
|
||||||
|
call hexprint8
|
||||||
|
xchg ah, al
|
||||||
|
hexprint8:
|
||||||
|
%rep 4
|
||||||
|
rol al, 1
|
||||||
|
%endrep
|
||||||
|
call hexprint4
|
||||||
|
%rep 4
|
||||||
|
rol al, 1
|
||||||
|
%endrep
|
||||||
|
hexprint4:
|
||||||
|
push ax
|
||||||
|
and al, 0xf
|
||||||
|
cmp al, 10
|
||||||
|
jb .digit09
|
||||||
|
|
||||||
|
add al, 'a' - 10 - '0'
|
||||||
|
|
||||||
|
.digit09:
|
||||||
|
add al, '0'
|
||||||
|
mov ah, 0xe
|
||||||
|
int 0x10
|
||||||
|
|
||||||
|
pop ax
|
||||||
|
ret
|
||||||
|
|
||||||
section .data
|
section .data
|
||||||
target times 5 db 0
|
target times 5 db 0
|
||||||
guess times 5 db 0
|
guess times 5 db 0
|
||||||
|
@ -439,6 +700,18 @@ guesses db 0
|
||||||
|
|
||||||
dictionary_entry times 5 db 0
|
dictionary_entry times 5 db 0
|
||||||
|
|
||||||
|
rng_seed dd 0
|
||||||
|
rng_t dd 0
|
||||||
|
|
||||||
|
rng_output dd 0
|
||||||
|
|
||||||
|
xorl32 dd 0
|
||||||
|
xorr32 dd 0
|
||||||
|
mull32 dd 0
|
||||||
|
mulr32 dd 0
|
||||||
|
addl32 dd 0
|
||||||
|
addr32 dd 0
|
||||||
|
|
||||||
section .rodata
|
section .rodata
|
||||||
|
|
||||||
not_found_str db ' - word not found$'
|
not_found_str db ' - word not found$'
|
||||||
|
|
|
@ -0,0 +1,28 @@
|
||||||
|
import json
|
||||||
|
import sys
|
||||||
|
|
||||||
|
# https://github.com/lynn/hello-wordl/blob/7da40c1f067eb1ec157d4c5b7a9bd8257ed39342/src/util.ts#L14
|
||||||
|
def rshift(n, a): return (n & 0xffff_ffff) >> a
|
||||||
|
|
||||||
|
def mulberry32(rng_state):
|
||||||
|
def worker():
|
||||||
|
nonlocal rng_state
|
||||||
|
rng_state += 0x6d2b79f5;
|
||||||
|
t = rng_state
|
||||||
|
t = (t ^ rshift(t, 15)) * (t | 1) & 0xffff_ffff
|
||||||
|
t ^= t + (t ^ rshift(t, 7)) * (t | 61) & 0xffff_ffff
|
||||||
|
return (t ^ (t >> 14))
|
||||||
|
return worker
|
||||||
|
|
||||||
|
with open('targets.json', 'r') as f:
|
||||||
|
targets = json.load(f)
|
||||||
|
|
||||||
|
targets = targets[:targets.index('murky') + 1]
|
||||||
|
targets = [i for i in targets if len(i) == 5]
|
||||||
|
|
||||||
|
rng = mulberry32(int(sys.argv[1]))
|
||||||
|
while True:
|
||||||
|
num = rng()
|
||||||
|
index = num * len(targets) >> 32
|
||||||
|
print(f'{num:08x}', index, targets[index])
|
||||||
|
if targets[index] != '*****': break
|
Loading…
Reference in New Issue