Создание простой программы ввода/вывода для назначения

Создайте программу, которая печатает Вы ввели единицу, если пользователь вводит 1,
Вы ввели двойку, если пользователь вводит 2,
Вы ввели три, если пользователь вводит 3.
Программа должна зацикливаться до тех пор, пока пользователь не введет цифру 4, после чего она должна выйти.

Если введено число, отличное от 1, 2, 3 или 4, программа должна напечатать Вы ввели неверный номер.


    org 0200h
    
Main:

    ldx #InMess1<
    ldy #InMess1>
    jsr 0E00Ch
    
    jsr 0E009h
    jsr 0E015h
    
CheckOne:

    cmp #1d
    bne CheckTwo
    
    ldx #OneMess<
    ldy #OneMess>
    jsr 0E00Ch
    jmp Main
    
CheckTwo:

    cmp #2d
    bne CheckThree
    
    ldx #TwoMess<
    ldy #TwoMess>
    jsr 0E00Ch
    jmp Main
    
CheckThree:

    cmp #3d
    bne CheckFour
    
    ldx #ThreeMess<
    ldy #ThreeMess>
    jsr 0E00Ch
    jmp Main
    
CheckFour:

    cmp #4d
    bne Main
    
CheckError:

    cmp #1d>
    cmp #4d<
    ldx #ErrorMess<
    ldy #ErrorMess>
    bne Main
    
    brk
    
InMess1:

    dbt 0ah,0dh
    dbt "Enter 1-4: "
    dbt 0d
    
OneMess:

    dbt 0ah,0dh
    dbt "You entered a one. "
    dbt 0d
    
TwoMess:

    dbt 0ah,0dh
    dbt "You entered a two. "
    dbt 0d
    
ThreeMess:

    dbt 0ah,0dh
    dbt "You entered a three. "
    dbt 0d
    
ErrorMess:

    dbt 0ah,0dh
    dbt "You entered an invalid number. "
    dbt 0d
    
    end

Это мой полный код для справки, но моя основная проблема заключается в недопустимом разделе ввода (ошибка)

CheckError:

    cmp #1d>
    cmp #4d<
    ldx #ErrorMess<
    ldy #ErrorMess>
    bne Main
    
    brk

ErrorMess:

    dbt 0ah,0dh
    dbt "You entered an invalid number. "
    dbt 0d
    
    end

Логически я знаю, как это сделать, но я не знаю, как это сделать с языком ассемблера 6502, и мой общий вопрос заключается в том, как именно я могу включить все числа, кроме 4, для проверки ошибок.


person RoboGemp    schedule 28.06.2020    source источник
comment
jsr 0E00Ch отсутствует в CheckError.   -  person Ruud Helderman    schedule 28.06.2020


Ответы (1)


Вам вообще не нужно CheckError. Если вы дойдете до CheckFour, значит, введено что-то отличное от 1, 2 или 3. Итак, все, что вам нужно сделать, это:

  • если ввод был 4, выйти без ошибки;
  • если ввод не был 4, то, учитывая, что вы вообще достигли CheckFour, вы уже знаете, что он также не был 1, 2 или 3. Следовательно, вы знаете, что ввод не был 1, 2, 3 или 4. Итак, напечатайте ошибку и выйдите.

то есть что-то вроде:

CheckFour:

    cmp #4d
    beq ValidExit

    # If here, then input wasn't 1, 2, 3 or 4.
    ldx #ErrorMess<
    ldy #ErrorMess>
    jsr 0E00Ch

ValidExit:

    end

Тем не менее, предположим, что вы хотите выполнить проверку диапазона по абсолютно любой другой причине, cmp устанавливает отрицательный флаг, если результат вычитания операнда из a отрицательный. Так что отрицательное значение устанавливается, если a было строго меньше операнда.

So e.g.:

lda #4d
cmp SomeValue
bmi SomeValueWasGreaterThanFour

Or:

lda #1d
cmp SomeValue
bpl SomeValueWasLessThanOrEqualToOne

... и рассмотрите возможность использования переноса, а не знака или SBC, если вам нужно исследовать больший диапазон (см. комментарии ниже и вклад Питера Кордеса).

person Tommy    schedule 29.06.2020
comment
-128 - 1 преобразуется в положительное число, но -128 меньше знака, чем 1. Просмотр только знакового бита вывода не работает, если вычитание переносится. В ISA, которые напрямую предоставляют условие подписания меньше чем, например x86, условие SF != OF, где OF — флаг переполнения со знаком. Полезным трюком здесь может быть проверка диапазона с использованием x-=1, а затем беззнаковое сравнение x<=3. Или, если известно, что ввод представляет собой печатный символ ASCII (с очищенным битом знака), то да, бит знака работает как перенос из младшей 7. - person Peter Cordes; 29.06.2020
comment
Аналогично действует и 68000 — тест строго меньше negative != overflow; к сожалению, на 6502 CMP не влияет на переполнение, поэтому, если этого требует ваш диапазон, вам, возможно, придется вместо этого рассмотреть реальный SBC. Тем не менее, я внесу краткое изменение в свой ответ, потому что ваш комментарий явно является подходящей критикой текущей версии. - person Tommy; 29.06.2020