сборка 8086 - счет не работает должным образом

Я пытаюсь распечатать этот счет, чтобы создать игру, и счет печатается только с одной стороны (когда я увеличиваю счет, он печатает счет только с одной стороны, а другой остается нулевым. Это код, спасибо.

proc print_score
    ; prints the points in the middle of the screen:

    ; set cursor to the middle:
    mov  dl, 170  
    mov  dh, 45   
    mov  bh, 0
    mov  ah, 02h  
    int  10h
    ; print scores, knowing it can be 0-9 (aka one char):
    mov al, [Score1]
    mov bl, 0Fh
    mov bh, 0
    mov ah, 0eh
    add al, '0'
    int 10h

    ; score1:score2
    mov al, ':'
    mov bl, 0Fh
    mov bh, 0
    mov ah, 0Eh
    int 10h

    mov al, [Score2]
    mov bl, 0Fh
    mov bh, 0
    mov ah, 0eh
    add al, '0'
    int 10h

    ret
endp print_score

    proc check_goal
    pusha
;if player 1 scores to player2 inc his score
check_goal_player1:
    cmp [ballX],315d
    ja  goal_1

    jmp check_goal_player2

goal_1:
    inc [score1]

    call refrash
    ;call player_2_scored

    jmp new_round

check_goal_player2:
    cmp [ballX],0d
    jb goal_2

    jmp no_update

goal_2:

    inc [score2]
    call refrash

    ;call player_1_scored
new_round:


    call restore_ball_possition
    jmp no_update

no_update:


    popa
    ret
endp check_goal

person Talos    schedule 02.04.2020    source источник
comment
Код печати выглядит одинаково для обеих половин (за исключением Score1 и Score2), поэтому, скорее всего, проблема в другом. Используйте отладчик для просмотра значений в памяти (и регистрах). Если Score2 не увеличивается, то этот код, который правильно (?) Выводит то, что не является минимальным воспроизводимым примером о твоей проблеме.   -  person Peter Cordes    schedule 03.04.2020
comment
Печатается ли двоеточие? Или просто значение Score1?   -  person Jim Mischel    schedule 03.04.2020
comment
Он должен распечатать значение для Score1 и 2 для обоих. Он должен распечатать его в двух местах (score1: score2), когда я увеличиваю счет на один или два, он печатает счет только с одной стороны   -  person Talos    schedule 03.04.2020
comment
Но вы не ответили на мой вопрос. Печатает ли он разделитель между двумя оценками? Всегда ли он печатает Score1? Или он всегда печатает Score2? Как определяются Score1 и Score2? Вы уверены, что правильно сохраняете очки? Вы запускали код в отладчике, чтобы узнать, что находится в [Score1] и [Score2]. Маловероятно, что отображаемый вами код печати является проблемой, поэтому вам трудно помочь, если вы не ответите на наши вопросы или не предоставите нам дополнительный код для просмотра.   -  person Jim Mischel    schedule 04.04.2020
comment
Спасибо, попробую отладить процесс. Он просто выводит разделитель между двумя оценками. Оценки определяются как байты (дб)   -  person Talos    schedule 04.04.2020
comment
Сталь не работает ... Помогите пожалуйста с этой проблемой. Я отправил второй процесс, который увеличивает счет, но я все равно думаю, что проблема в первом процессе, который выводит счет, а не в увеличении счета.   -  person Talos    schedule 04.04.2020
comment
Всем спасибо, проблема с процедурой check_goal.   -  person Talos    schedule 04.04.2020


Ответы (1)


То, что беспокоит больше всего.

; prints the points in the middle of the screen:
; set cursor to the middle:
mov  dl, 170  
mov  dh, 45   
mov  bh, 0
mov  ah, 02h  
int  10h

Функция BIOS.SetCursor 02h ожидает, что вы передадите координаты символьной ячейки для желаемой позиции курсора. Количество символьных ячеек в строке никогда не может превышать 255, и такое же ограничение применяется к координате строки. Если вы скажете, что нацеливаетесь на середину экрана и передаете значение 170 для координаты столбца, ваш экран будет иметь около 340 столбцов! Это невозможно с этим вызовом BIOS. Вы не понимаете координаты персонажа и координаты пикселей?

например Середина цветного экрана 320x200 256 имеет координаты курсора (20,12), потому что здесь всего 40 столбцов и 25 строк.

Причина, по которой второй результат остается нулевым

check_goal_player2:
    cmp [ballX],0d
    jb goal_2
    jmp no_update
goal_2:
    inc [score2]

Когда вы сравниваете какое-то значение с 0, вы можете никогда не получить код условия ниже. Поэтому инструкция jb goal_2 никогда не перескочит туда, где вы хотите увеличить score2.

Учитывая cmp [ballX], 315 ja goal_1 и имея в виду симметрию, я предполагаю, что вы используете экран шириной 320 пикселей. Может, выход в том, чтобы написать cmp [ballX], 4 jb goal_2?

person Sep Roland    schedule 04.04.2020