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


Взаимодействие между процессами - часть 3


; изменить направление движения случайным образом push bx mov ebx,50 ; вероятность смены направления 2/50 call z_random ; получить случайное число от 0 до 49 mov ax,word ptr x_inc mov bx,word ptr y_inc test dx,dx ; если это число - 0, jz rot_right ; повернем направо, dec dx ; а если 1 - jnz exit_rot ; налево

; повороты neg ax ; налево на 90 градусов xchg ax,bx ; dY = -dX, dX = dY jmp short exit_rot rot_right: neg bx ; направо на 90 градусов xchg ax,bx ; dY = dX, dX = dY exit_rot: mov word ptr x_inc,ax ; записать новые значения инкрементов mov word ptr y_inc,bx pop bx ; восстановить цвет в ВХ

; перемещение змейки на одну позицию вперед mov di,word ptr coords_head ; DI - адрес головы mov cx,word ptr line_coords[di] ; СХ-строка mov dx,word ptr line_coords[di+2] ; DX-столбец add cx,word ptr y_inc ; добавить инкременты add dx,word ptr x_inc add di,4 ; DI - следующая точка в буфере, and di,127 ; если DI > 128, DI = DI - 128 mov word ptr coords_head,di ; теперь голова здесь mov word ptr line_coords[di],cx ; записать ее координаты mov word ptr line_coords[di+2],dx mov di,word ptr coords_tail ; прочитать адрес хвоста add di,4 ; переместить его на одну and di,127 ; позицию вперед mov word ptr coords_tail,di ; и записать на место

; пауза, ; из-за особенностей нашего диспетчера (см. ниже) мы не можем пользоваться ; прерыванием BIOS для паузы, поэтому сделаем просто пустой цикл. Длину цикла ; придется изменить в зависимости от скорости процессора mov cx,-1 loop $ ; 65 535 команд loop mov cx,-1 loop $ mov cx,-1 loop $ mov ah,1 int 16h ; если не было нажато никакой клавиши, jz main_loop ; продолжить основной цикл, mov ah,0 ; иначе - прочитать клавишу int 16h leave ; освободить стек от локальных переменных call shutdown_threads ; выключить многозадачность ; с этого момента у нас снова только один процесс mov ах,3 ; видеорежим 3 int 10h ; 80x24 int 20h ; конец программы

; процедура вывода точки на экран в режиме 13h ; СХ = строка, DX = столбец, BL = цвет, ES = A000h putpixel proc near push di lea ecx,[ecx*4+ecx] ; CX = строка * 5 shl cx,6 ; CX = строка * 5 * 64 = строка * 320 add dx,cx ; DX = строка * 320 + столбец = адрес mov di,dx mov al,bl stosb ; записать байт в видеопамять pop di ret putpixel endp




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