Zápisky pro předmět IKT na GJS.

Hra na počítač

Programy zapsala Lucie O., pojmy Katka K.
Pravidla hry (PDF, 70 kB)

Základní pojmy

Program, co vypíše AHOJ

Používáme instrukci K (kopíruj konstantu), abychom si do registru A připravili písmeno. Potom instrukcí V (výstup) vypíšeme obsah registru A. Tohle je v programu napsané čtyřikrát za sebou pro všechna čtyři písmena A, H, O, J.

K A A
V A
K A H
V A
K A O
V A
K A J
V A
Z

Program, co vypíše ABCDEF

Do registru A si uložíme písmeno A. Použijeme instrukci podmíněného skoku M (skoč, pokud je menší), aby se program opakoval skoro od začátku, dokud v registru A nebude písmeno G. Porovnání zařídí instrukce H (porovnej registr s hodnotou). Pomocí instrukce J (přičti jedničku) budeme posouvat obsah registru A o jedno písmeno v abecedě.

K A A
V A
J A
H A G
M D
Z

Assembler

Autory zápisků jsou Ondra K. a David S.

Nejprv shrňme, co nás obtěžuje ve hře na počítač:

Výrazné rysy Assembleru

Překladač do jazyka Assembler

Pro pochopení jazyka Assembler používáme simulátor počítače. Naší hře se hodně podobá, takže není těžké programy přeložit z jednoho jazyka do druhého.

V simulátoru počítače je trochu jinak zařízený výstup než v naší hře. Překladač se snaží tuhle nesrovnalost vyřešit s použitím registru D. Programy, které používají registr D, se nepřeloží správně.

Kód hry na počítač

Kód v Assembleru

Ukázka: řešení sudoku

Program se pokouší řešit sudoku 4×4 doplňováním číslice, která v některé buňce zbývá jako poslední možnost. Vstup je zapsaný přímo na začátku programu. Aby program byl kratší, používáme číslice 1, 2, 4, 8 a nevyplněná místa označujeme mezerou nebo nulou.

Sudoku na vyzkoušení si můžete nechat vygenerovat třeba na webu 1sudoku.com.

jmp main_loop
touched: DB 0
i_cell: DB 0
data:
DB " 4  "
DB "1  4"
DB "   8"
DB "  2 "

main_loop:
    mov [touched], 0
    mov [i_cell], 0
    cell_loop:
        ; c: taken (bits)
        mov a, [i_cell]
        add a, data
        mov c, [a]
        and c, 15
        cmp c, 0
        jnz is_taken
        ; d: index of a neighbor
        mov d, 0
        neighbor_loop:; a, b used for computation
            ; row neighbor
            ;index = (i_cell & 12) + j_cell
            mov a, [i_cell]
            and a, 12
            or a, d
            add a, data
            or c, [a]
            ; column neighbor
            ;index = (j_cell * 4) + (i_cell & 3)
            mov a, d
            shl a, 2
            mov b, [i_cell]
            and b, 3
            or a, b
            add a, data
            or c, [a]
            ; block neighbor
            ;index = (j_cell & 1) | ((j_cell & 2) * 2) | (i_cell & 10)
            mov a, d
            and a, 1
            mov b, d
            and b, 2
            shl b, 1
            or a, b
            mov b, [i_cell]
            and b, 10
            or a, b
            add a, data
            or c, [a]
            inc d
            cmp d, 4
            jb neighbor_loop
        not c
        and c, 15
        cmp c, 1
        je not_taken
        cmp c, 2
        je not_taken
        cmp c, 4
        je not_taken
        cmp c, 8
        je not_taken
        jmp is_taken
        not_taken:
            or c, '0'
            mov a, [i_cell]
            add a, data
            mov [a], c
            mov a, [touched]
            inc a
            mov [touched], a
        is_taken:
        mov a, [i_cell]
        inc a
        mov [i_cell], a
        cmp a, 16
        jb cell_loop
mov a, [touched]
cmp a, 0
jnz main_loop
mov a, data
mov b, 232
print_loop:
    mov c, [a]
    mov [b], c
    inc a
    inc b
    cmp a, main_loop
    jb print_loop
hlt