Код:
;ПК8000
;Прекрасный ассемблер КР580ВМ80А
;http://asdasd.rpg.fi/~svo/i8080/
.binfile hex7led.bin
.org 4000h ;начальный адрес программы в ОЗУ
;--------------------------------------------------------------------------------
; Константы ;
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
; Переменные ;
;--------------------------------------------------------------------------------
;массив кодов символов семисегментного индикатора
;в случае индикатора с общим анодом, значения инвертировать
Led:
db 01100000b
db 11011010b
db 11110010b
db 01100110b
db 10110110b
db 10111110b
db 11100000b
db 11111110b
db 11110110b
db 11101110b
db 00111110b
db 10011100b
db 01111010b
db 10011110b
db 10001110b
HexData db 0 ;исходное шестнадцатиричное число
Led0 db 0 ;код символа для младшего полубайта
Led1 db 0 ;код символа для старшего полубайта
;--------------------------------------------------------------------------------
; Главный модуль ;
;--------------------------------------------------------------------------------
Start:
;фрагмент, формирующий значение, которое необходимо отобразить
lda HexData
;младший полубайт
ani 0fh ;обнуляем 4 старших бита
call HexToLed
sta Led0 ;сохраняем этот код в ОЗУ для дальнейшего использования
;старший полубайт
lda HexData
ani 0f0h ;обнуляем 4 младших бита
rrc ;и меняем полубайты местами
rrc
rrc
rrc
call HexToLed
sta Led1 ;сохраняем этот код в ОЗУ для дальнейшего использования
; out xx ;вывод в порт старшего полубайта
; lda Led0
; out xx ;вывод в порт младшего полубайта
ret ;выход из программы
;--------------------------------------------------------------------------------
; Процедуры ;
;--------------------------------------------------------------------------------
;процедура расчёта адреса байта для семисегментного кода
;на входе acc - число от 0 до 0fh, на выходе в acc - семисегментный код
HexToLed:
lxi h,Led ;адрес начала массива семисегментных кодов
add l ;находим адрес кода, соответствующий весу цифры
mov l,a ;не забывам, что результат сложения остаётся в acc
mov a,m ;загружаем в acc найденный код
rnc ;если не было переноса CF=0, то возврат
mov a,h ;если вылез CF, то это необходимо учесть
aci 0 ;прибавляем CF к старшему полубайту адреса искомого кода
mov h,a ;помним, что результат всегда в acc
mov a,m ;загружаем в acc найденный код
ret