🛠️ Демка "Piton"

     Вау! Случайно нашёл свою старую программу! Как давно это было!

Alexey Kryukov: фотография профиля
Alexey Kryukov
не прочитано,
6 окт. 2000 г., 12:00:00

Hi, All!
Вот для одного парня "наваял" для лабораторной работы. Может кому ещё
пригодится.

=== Cut ===

; *** PITON - DEMO ***
; Format : MS-DOS COM-file
; Created by Kryukov Alexey aka Dread Lexx. CopyRight (c) 2000
; NetMail: 2:5050/55.6 e-mail: kru...@general.udm.ru

Freq EQU 1000 ; Эти параметры подбирайте на свой вкус.
Delay EQU 20 ; От них зависят скорость и стиль движения
; питона.


.286
sgCODE SEGMENT BYTE PUBLIC 'CODE' USE16
ASSUME cs:sgCODE, ds:sgCODE, ds:sgCODE, ss:sgCODE
ORG 100h
PUBLIC Start
Start PROC FAR

; -------------- Установить int 8 и таймер ------------------------------------

cli ; Clear Interrupt Flag
mov ax,3508h ; Запоминаем старый
int 21h ; адрес
mov ds:IntOld8o,bx ; прерывания
mov ds:IntOld8s,es ; int 08h
mov dx,offset NewInt8proc ; Перехватываем прерывание
mov ax,2508h ; int 08h
int 21h ; для своих целей

mov bx, Freq
mov al, 36h
out 43h, al ; Программируем таймер
mov al, bl
out 40h, al ; Младший байт частоты
mov al, bh
out 40h, al ; Старший байт частоты
sti ; Set Interrupt Flag

mov ax, 3 ; Видеорежим 80х25
int 10h ; 16 цветов

; --------- Рисуем горизонтальные линии рамки ---------------------------------
mov ax,0b800h
mov es,ax
mov bx,160
mov al,0b2h
drwH: dec bx
dec bx
mov es:[bx],al
mov es:[bx+160*24],al
ja drwH

; --------- Рисуем вертикальные линии рамки -----------------------------------
mov bx,160
mov al,0b2h
drwV: mov es:[bx],al
mov es:[bx+158],al
add bx,160
cmp bx,160*24
jb drwV

; ----------- А тут начинается основная программа -----------------------------

Next:
mov ah, 1 ; Press
int 16h ; any key ?
jnz Quit ; if Yes then Quit

mov al, ds:[Count] ; Преобразуем Count
and al, 00001100b ; в одну из команд:
or al, 11000000b ; inc al, inc ah, dec al, dec ah
mov cs:[mutbyte], al ; и ставим её код в программу
Vtr:

mov ax, ds:[Piton+18] ; Стираем
call Locate ; с экрана
mov ax,0720h ; хвост
mov es:[bx],ax ; питона

mov ax, ds:[Piton] ; Берём координаты головы
db 0feh ; и изменяем их заранее
mutbyte db ? ; определённой инструкцией

call Locate
mov cx, es:[bx] ; Если
cmp cl, 20h ; клетка занята
jnz Next ; искать другой путь

push ds ;
pop es ;
std ;
mov cx,10 ; Переместить
mov si,offset Piton+16 ; тело
mov di,offset Piton+18 ; питона
rep movsw ;

mov ds:[Piton],ax ; Записать координаты головы


mov ax,0b800h ; Hачало экранной
mov es,ax ; памяти

mov ax,ds:[Piton] ; Рисует
call Locate ; голову
mov ax,0F4Fh ;
mov es:[bx],ax ; питона

mov cx, Delay ; Пауза
p1: push cx ;
mov cx, 0FFFFh ;
p2: loop p2 ;
pop cx ;
loop p1 ;

mov al,ds:[Count] ; Если
and al,07h ; в Count три
xor al,07h ; млад. бита установлены в 1
jz Next ; то меняем направление движения
jmp Vtr ; иначе двигаемся прямо

Quit:

; -------------- Ресет таймера в исходное состояние ---------------------------

cli ; Clear Interrupt Flag
mov dx, ds:IntOld8o ; Восстанавливаем
mov ax, ds:IntOld8s ; старое
mov ds, ax ; значение
mov ax, 2508h ; прерывания
int 21h ; INT 08h
push cs
pop ds
mov al, 36h
out 43h, al ; Timer 8253-5 (AT: 8254.2).
xor al, al ; al=0
out 40h, al ; Timer 8253-5 (AT: 8254.2).
out 40h, al ; Timer 8253-5 (AT: 8254.2).
sti ; Set Interrupt Flag

mov ax, 3 ; Видео режим
int 10h ; 80Х25 16 color

mov dx, offset aCopyRight
mov ah, 9
int 21h ; Выводим на экран CopyRight

int 20h ; Завершить программу
Start ENDP

; =============== Вычисление адреса экранной памяти для координаты YX =========

; Формула для вычисления Addr = Y*160+x*2
Locate proc near ; Вход: AX - координаты YX
xor bx,bx ; bx=0
xor cx,cx ; cx=0
mov bl,ah
shl bx,7 ; Y*128
mov cl,ah
shl cx,5 ; Y*32
add bx,cx ; Y*128+Y*32
xor cx,cx ; cx=0
mov cl,al
shl cx,1 ; X*2
add bx,cx ; Addr=y
ret ; Выход: в BX - Адрес экрана
Locate endp

; ============ Процедура которая вешается на 8-ое прерывание ==================
NewInt8proc: pushf
pusha
inc ds:[Count] ; count=count+1;
mov al,20h
out 20h,al
popa
popf
iret

; ---------------------------------------------------------------------------
IntOld8s dw ?
IntOld8o dw ?
aCopyRight db 'CopyRight (C) 2000 by Dread Lexx',0Dh,0Ah,'$'
Count db ?
Piton dw 1010h,1011h,1012h,1013h,1014h,1015h,1016h,1017h,1018h,1019h

sgCODE ENDS
END Start

Отзывы и комментарии (0)

ℹ️
К этой публикации еще никто не оставил отзыв. Будьте первым!

Оставить свой отзыв

ℹ️
Только зарегистрированные пользователи могут оставлять комментарии.
Войти на сайт