Assembler - язык неограниченных возможностей


Системный таймер - часть 5


grow_worm: push bx ; сохранить адрес головы mov bx,word ptr cs:food_at ; bx - адрес еды xor ах,ах ; АХ = 0 call draw_food ; стереть еду call random ; AX - случайное число and ax,3Fh ; AX - случайное число от 0 до 63 mov bp,ax ; это число будет добавкой ; к длине питона mov byte ptr cs:eaten_food,1 ; установить флаг ; для генерации еды на следующем ходе pop bx ; восстановить адрес головы ВХ jmp short move_worm ; перейти к движению питона

if_eaten_food: ; переход сюда, если еда была съедена mov byte ptr cs:eaten_food,0 ; восстановить флаг init_food: ; переход сюда в самом начале push bx ; сохранить адрес головы make_food: call random ; AX - случайное число and ax,0FFFEh ; AX - случайное четное число mov bx,ax ; BX - новый адрес для еды xor ах,ах cmp word ptr es:[bx],ax ; если по этому адресу ; находится тело питона, jne make_food ; еще раз сгенерировать случайный адрес, cmp word ptr es:[bx+320],ax ; если на строку ниже ; находится тело питона - jne make_food ; то же самое, mov word ptr cs:food_at,bx ; поместить новый адрес ; еды в food_at, mov ax,0D0Dh ; цвет еды в АХ call draw_food ; нарисовать еду на экране pop bx jmp main_cycle

; процедура draw_food ; изображает четыре точки на экране - две по адресу ВХ и две на следующей ; строке. Цвет первой точки из пары - AL, второй - АН

draw_food: mov es:[bx],ax mov word ptr es:[bx+320],ax retn

; генерация случайного числа ; возвращает число в АХ, модифицирует DX

random: mov ах,word ptr cs:seed, mov dx,8E45h mul dx inc ax mov cs:word ptr seed,ax retn

; переменные

eaten_food db 0 move_direction dw 1 ; направление движения: 1 - вправо, ; -1 - влево, 320 - вниз, -320 - вверх seed: ; это число хранится за концом программы, food_at equ seed+2 ; а это - за предыдущим end start





Начало  Назад  Вперед