2016-07-29 1 views
-2

Мне нужно выяснить, как сделать процедуру для LR35902 (Z60-подобный процессор Game Boy), который возьмет содержимое HL (не там, где он указывает, фактическое число, хранящееся в нем), и преобразует его в 1-5 (фактические значения будут варьироваться от 0 до 65535, поскольку HL - 16-разрядные) символы, отличные от ASCII *, используя десятичная система. У меня есть подпрограммы для печати и вы можете легко найти способ обрезать ведущие нули.Преобразование 16-разрядного целого числа без знака из HL в текст с использованием моего собственного не-ASCII-charmap в виде десятичного числа, с сборкой LR35902

Все что мне нужно - это хотя бы некоторый псевдокод для этой функции и не более, чем реальная RGBDS LR35902 ASM.

* Вместо ASCII я использую свой собственный 1-байтовый символ для символа, в котором символ 0 является шестнадцатеричным байтом $ 17, увеличиваясь до 9, что составляет $ 20.

+0

Вы можете предоставить несколько простых примеров, чтобы продемонстрировать, что вы ищете, некоторые из этого битового шаблона для этого шаблона вывода. –

+0

Точно так же вы можете преобразовать его в ASCII, который имеет свои цифры в диапазоне от 30 до 39 долларов. –

+0

@ dwelch:% 0000000110111010 (442) = $ 1B, (4) $ 1B, (4) $ 19 (2) – wolfboyft

ответ

3

Как я могу скрыть секунды до базы 60 (часы в минутах)? 1234 секунд для examaple

делит 1234 по 3600 (60^2), чтобы получить часы, которые равны нуль Остаток 1234

Остаток деления 1234 на 60 (60^1), чтобы получить минуты, которая составляет 20 минут оставшихся 34

Остаток деления 34 на 1 (60^0), чтобы получить секунд, который является 34

Так 1234 секунд основание 10 преобразуется в базу 60 (НН: ММ: СС) является 00:20:34

не имеет значение то, что основы преобразования, то же самое, если одна база не является степенью r другой базы (от двоичного до шестнадцатеричного, от шестнадцатеричного до двоичного, от двоичного до восьмеричного, от восьмеричного до двоичного), тогда вы можете использовать ярлыки.

Вы переходите от основания 2 к основанию 10, а затем после этого вы можете использовать ASCII или любое другое представление для базовых 10 цифр.

Этот вопрос задан здесь сотни раз. Следующий вопрос о том, как я делю на 10, если у вашего процессора нет разрыва. Также спросил и ответил много раз.

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

+2

+1! :) ... и что-то добавить. Если это, например, оценка или другое часто отображаемое значение (но часто не используется в вычислениях), вы можете рассмотреть возможность использования либо BCD (специальное кодирование, две цифры на каждый байт, поддерживаемый Z80 (инструкции типа DAA))) или цифра за байт (0..9 номеров, в конечном счете непосредственно в специальном кодировании), вместо двоичного числа =>, чтобы ускорить преобразование в строку (исключая истинное программное обеспечение div на 10^n). – Ped7g

-1

Бонусные предпрограммы для преобразования числа точек HL или номера в A включены.

Это работает, это всего лишь вопрос обрезания ведущих нулей.

ConvertNumberHLPoint:: 
    ld a, [hl] 
ConvertNumberA:: 
    ld h, 0 
    ld l, a 
ConvertNumberHL:: 
    ; Get the number in hl as text in de 
    ld bc, -10000 
    call .one 
    ld bc, -1000 
    call .one 
    ld bc, -100 
    call .one 
    ld bc, -10 
    call .one 
    ld c, -1 
.one 
    ld a, "0"-1 
.two 
    inc a 
    add hl, bc 
    jr c, .two 
    push bc; 
    push af; 
    ld a, b; 
    cpl; 
    ld b, a; 
    ld a, c; 
    cpl; 
    ld c, a; 
    inc bc; 
    call c, .carry; 
    pop af; 
    add hl, bc; 
    pop bc; 
    ld [de], a 
    inc de 
    ret 

.carry; 
    dec bc; 
    ret; 

Если есть такой опкод, как SBC HL, Ьс на LR35902, как есть на Z80, можно было бы заменить строки, которые заканчиваются пустым comments-- ; - с ним. Вместо этого мы создаем резервную копию bc и af, инвертируем bc и увеличиваем его (дополнение двух), затем, ради функции переноса в инструкции SBC, увеличивайте ее снова, если перенос установлен, затем не резервное копирование af, добавление hl в два дополненных bc и, наконец, un-backup bc.

+0

Почему бы вам просто не оставить «старый hl» вокруг, например ld ix, hl перед добавлением hl, bc, затем ld hl, ix, чтобы восстановить его (извините, если у этого CPU нет ix, как Z80, тогда вы закончились regs, я думаю ... не сделали Z80 asm на 10+ лет;)) – Ped7g

+0

Кстати, это внезапно использует ASCII? 'ld a," 0 "-1' ... Я бы ожидал' ld a, 0x17-1' в соответствии с вашим описанием вопроса. :) (не нужно отвечать мне, просто любопытство) – Ped7g

+0

Но я думаю, что в прологе 'ConvertNumberA ::' действительно есть реальная ошибка. Вероятно, вы хотите загрузить «a» в hl, поэтому 'ld h, 0 ld l, a'. 'de' указывает на строковый буфер и не следует изменять? – Ped7g

Смежные вопросы