Search
Write a publication
Pull to refresh

Comments 16

Заголовок вообще жжёт, я как питонист очень оценил ;)
Да лучше было бы Змейка на assembler, хотя так будет больше читателей.
Я, заходя, надеялся увидеть, как мега крутой чувак пишет интерпретатор питона на асме)
Курсор можно прятать, позиционируя за пределами окна вывода.

А delay можно было через BIOS tick counter сделать, без дергания прерываний. Счетчик лежит в слове 0:46Ch вроде.
Позабыл уже какое именно, но есть какая-то функция у какого-то прерывания чтоб просто тупо спрятать курсор.
Это чтобы спрятать при начале игры, а не при каждой отрисовке. Можно сэкономить несколько тактов, да ;-)
Ну и восстановить при выходе не забыть.
Я уже мало что помню. Больше 10 лет прошло со времен bios и т.п. кодинга. Может и была такая функция…

p.s. Да и если уж гнаться за тактами, то вообще лучше сразу в память писать.
Ниже ответил. Нашел в бекапах школьных проектов уже 13ти летней давности вставки на асме в паскалевских проектах)))
Нашел =)
Для включения:
mov ax,0100h
mov cx,0506h
int 33

Для выключения:
mov ax,0100h
mov cx,2607h
int 10

33h 01h — GRTMOUSE. это какая-то прям специфика.
Вообще курсор вырубается 10h прерыванием, в регистре CX принимает размеры. Прочитал комменты ниже, да, от Godless правильное решение.
Черт у самого уже черти сколько валяется недописанная змейка на NASM (Win32), спасибо что напомнили — допишу.
10 лет назад мы с братом соревновались, кто напишет меньшую по размерам змейку, ползущую по диагонали и отражающуюся от краёв экрана. Я победил. :)

Код
.286
CSEG Segment
ASSUME CS:CSEG, DS:CSEG, ES:CSEG, SS:CSEG
ORG 100h
Program:
    mov  ax,0500h    ; Set video
    int  10h
    mov  ah,02h
    mov  dl,' '
    mov  cx,80*50
Clean:
    int  21h
    loop Clean

    mov  ax,351Ch    ; Set timer
    int  21h
    push es
    push bx
    mov  bh,0
    xor  bp,bp
    mov  ah,25h
    mov  dx,offset Timer
    int  21h

    mov  ah,0        ; Waiting for a key
    int  16h

    mov  ax,251Ch    ; Kill timer
    pop  dx
    pop  ds
    int  21h
    ret


;    --==< Drawing Interrupting Function >==--

Timer:
    cli
    push cs
    pop  ds
    push cs
    pop  es
    mov  cx,5
    mov  si,offset Coord5
    mov  di,offset Line

DrawSnake:
    mov  ah,2        ; Set coordinates
    mov  dx,cs:[si]
    int  10h
    dec  si
    dec  si
    mov  ah,0Ah      ; Draw character
    mov  al,cs:[di]
    push cx
    mov  cl,1
    int  10h
    pop  cx
    inc  di
    loop DrawSnake

    mov  cx,4        ; Trail tail
    mov  si,offset Coord4
    mov  di,offset Coord5
    std
    rep  movsw

    cmp  byte ptr Coord1,0  ; Horizontal/vertical rebounce
    je   HorFlip
    cmp  byte ptr Coord1,79
    je   HorFlip
    jmp  NoHorFlip
HorFlip:
    xor  bp,01h
NoHorFlip:
    cmp  byte ptr Coord1+1,0
    je   VerFlip
    cmp  byte ptr Coord1+1,24
    je   VerFlip
    jmp  NoVerFlip
VerFlip:
    xor  bp,10h
NoVerFlip:
    test bp,01h      ; Move head
    jz   HorInc
    dec  byte ptr Coord1
    jmp  HorMoved
HorInc:
    inc  byte ptr Coord1
HorMoved:
    test bp,10h
    jz   VerInc
    dec  byte ptr Coord1+1
    jmp  VerMoved
VerInc:
    inc  byte ptr Coord1+1
VerMoved:
    mov  ah,0
    iret

    Line   db ' ░▒▓█'
    Coord1 dw 0108h
    Coord2 dw 0007h
    Coord3 dw 0007h
    Coord4 dw 0007h
    Coord5 dw 0007h
CSEG ends
END  Program
Sign up to leave a comment.

Articles