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

Срочный ремонт компьютеров фрязино отличается быстротой и качеством.

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


mov dx,20000 ; пауза - 20 000 микросекунд mov ah,86h ; (СХ = 0 после REP STOSB ; и больше не меняется) int 15h ; задержка mov ah,1 ; проверка состояния клавиатуры int 16h jz short no_keypress ; если клавиша не нажата - xor ah,ah ; АН = 0 - считать скан-код int 16h ; нажатой клавиши в АН, cmp ah,48h ; если это стрелка вверх, jne short not_up mov word ptr cs:move_direction,-320 ; изменить ; направление движения на "вверх", not_up: cmp ah,50h ; если это стрелка вниз, jne short not_down mov word ptr cs:move_direction,320 ; изменить ; направление движения на "вниз", not_down: cmp ah,4Bh ; если это стрелка влево, jne short not_left mov word ptr cs:move_direction,-1 ; изменить ; направление движения на "влево", not_left: cmp ah,4Dh ; если это стрелка вправо, jne short no_keypress mov word ptr cs:move_direction,1 ; изменить ; направление движения на "вправо", no_keypress: and bp,bp ; если питон растет (ВР > 0), jnz short advance_head ; пропустить стирание хвоста, lodsw ; иначе: считать адрес хвоста из ; DS:SI в АХ и увеличить SI на 2 xchg bx,ax mov byte ptr es:[bx],0 ; стереть хвост на экране, mov bx,ax inc bp ; увеличить ВР, чтобы следующая ; команда вернула его в 0, advance_head: dec bp ; уменьшить ВР, так как питон ; вырос на 1, если стирание хвоста было пропущено, ; или чтобы вернуть его в 0 - в другом случае add bx,word ptr cs:move_direction ; bx = следующая координата головы mov al,es:[bx] ; проверить содержимое экрана в точке ; с этой координатой, and al,al ; если там ничего нет, jz short move_worm ; передвинуть голову, cmp al,0Dh ; если там еда, je short grow_worm ; увеличить длину питона, mov ax,3 ; иначе - питон умер, int 10h ; перейти в текстовый режим retn ; и завершить программу

move_worm: mov [di],bx ; поместить адрес головы в DS:DI inc di inc di ; и увеличить DI на 2, mov byte ptr es:[bx],09 ; вывести точку на экран, cmp byte ptr cs:eaten_food,1 ; если предыдущим ; ходом была съедена еда, je if_eaten_food ; создать новую еду, jmp short main_cycle ; иначе - продолжить основной цикл




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