Я пытаюсь переместить объект 6x6 пикселей в сборке 8086, но безуспешно.
Я бы хотел, чтобы он перемещался на 4 пикселя в секунду, но в настоящее время он вообще не движется.
Я был бы очень рад, если бы кто-нибудь мог мне помочь, потому что это серьезный проект для моих выпускных экзаменов по информатике в средней школе, и я получил до конца выходных
Вот сам код
IDEAL
MODEL medium
DATASEG
STACK 100h
segment extra para public use16 ;Create Extra Segment that is 16 bits;
;(Removed the data segment for your sake, its very long pixel lists)
CODESEG
; -------------------------------
; change screen mode to text mode
; -------------------------------
proc DrawPix
ContLines:
mov cx, [LineLength] ; How many times should the "rep movsb" should iterate
push di ; Save in stack the calculated position indicating the begining of the current line
rep movsb ; copies bytes from si(image) to di (screen)
pop di ; di was changed during the movesb. I change it back to pint to the begin of the line
add di, ScreenWidth ; by adding ScreenWidth (320)' I am moving the di to point to the next line
dec [NumOfLines] ; Check if I wrote all the lines of the image
jnz ContLines ; IF there are still pixcells to print on the screen(image not ended), loop to next line
ret
endp
proc keycontrol
;check for arrow keys, and go to check arrow removed;
jmp Shoot
checkarrow:
removed, irrelevant (supposed to change direction of turret)
Exit:
ret
endp
proc Shoot
cmp [turretstate],1 ;turret facing up
je bulletup
cmp [turretstate],2;turret facing down
je bulletdown
cmp [turretstate],3;turret facing left
je bulletleft
cmp [turretstate],4;turret facing right
je bulletright
ret
bulletup:
not relevant for testing left movement
bulletdown:
not relevant for testing left movement
bulletright:
not relevant for testing left movement
bulletleft:
mov di,320*87+133
lea si, [bullet]
mov [LineLength],6
mov [numOFLines],6
call DrawPix
ret
endp
proc leftbull
pop dx
dec dx
mov di,320*84
add di,dx
lea si, [bullet]
mov [LineLength],6
mov [NumOfLines],6
call DrawPix
ret
endp
proc progbullets
mov dx,0
checkleft:
inc dx
cmp dx,136
je exit1
mov cx,87
mov ah,0Dh
int 10h
cmp al,4
jne checkleft
push dx
call leftbull
exit1:
ret
endp
;---------------------------------------------;
;---------------------------------------------;
start:
Main_Loop:
mov [sectimer], 0
mov ah,00H
int 1Ah
mov [sectimer],dx
call keycontrol
func_Loop:
call progbullets
mov ah,00H
int 1Ah
sub dx,18
cmp dx,[sectimer]
jge Main_Loop
;call moveGame
jmp func_Loop
; call the operating system to terminate this program
mov ah,1
int 21h
mov ax, 4C00H
int 21h
ends
end start
Программа имеет стартовый экран, может перемещать турель и размещать «пули», но я не смог заставить их двигаться, и там и там есть несколько странных пикселей.
Процесс съемки является главной задачей, он должен идти один за другим по значению x (пуля остается на том же значении y), и проверять, является ли пиксель красным (цвет маркера), и, если это так, перемещаться это один слева.
РЕДАКТИРОВАТЬ: Большое спасибо за помощь, я новичок здесь, и мне это действительно нужно. У меня нет подходящего отладчика для GUI TASM, который я использую, поэтому я не могу это сделать
Я удалил большинство ненужных вещей, но не был уверен, что еще не нужно, так как я не уверен, что не работает. Я думаю, что "стрелять" Proc является наиболее актуальным. Стрельба работает только для левой пули, потому что я сначала хотел ее проверить, но для этого она тоже не работала