Первая программка - инитит устройство, помещает в буфер строку с кодами диагностики, запускает вывод этой строки по DMA через DHV11 и печатает ее же на экран консоли программы.
Код:
.TITLE DHVT1 -- ТЕСТ DMA
.IDENT /V01.00/
LINE == 7 ;НОМЕР ЛИНИИ
DHCSR == 160500 ;РЕГИСТР СОСТОЯНИЯ/УПРАВЛЕНИЯ
DHRXB == DHCSR+2 ;РЕГИСТР БУФЕРА ПРИЕМНИКА
DHLPR == DHCSR+4 ;РЕГИСТР ПАРАМЕТРОВ ЛИНИИ
DHLBA == DHCSR+12 ;РЕГИСТР АДРЕСА БУФЕРА (МЛ)
DHHBA == DHCSR+14 ;РЕГИСТР АДРЕСА БУФЕРА (СТ)
DHCNT == DHCSR+16 ;РЕГИСТР СЧЕТЧИКА БАЙТОВ
MR == 40 ;БИТ СБРОСА
TXEN == 100000 ;БИТ РАЗРЕШЕНИЯ ПЕРЕДАТЧИКА
GO == 200 ;БИТ ЗАПУСКА ПЕРЕДАЧИ
.MCALL .EXIT,.PRINT ;СИСТЕМНЫЕ МАКРОСЫ
START:: MOV #MR,@#DHCSR ;СБРОС УСТРОЙСТВА
10$: BIT #MR,@#DHCSR ;СБРОС ЗАВЕРШЕН?
BNE 10$ ;ПОКА НЕТ
;В ЭТОМ МЕСТЕ:
; - СБРОС УСТРОЙСТВА ЗАВЕРШЕН
; - ЛИНИИ ВЫСТАВЛЕНЫ В 9600/8/N/1,
; - ВЫПОЛНЕНА ВНУТРЕННЯЯ ДИАГНОСТИКА
; - В FIFO ПРИЕМНИКА ПОМЕЩЕНЫ 8 БАЙТ КОДОВ ДИАГНОСТИКИ
; И НОМЕРА ВЕРСИИ ФИРМВАРЯ
;ВЫЧИТЫВАЕМ КОДЫ ДИАГНОСТИКИ, НОМЕР ВЕРСИИ ФИРМВАРЯ И
;ЗАПОЛНЯЕМ БЛОК АРГУМЕНТОВ ДЛЯ $EDMSG
MOV #ARGS,R0 ;БЛОК АРГУМЕНТОВ
MOV #DIAG,R1 ;БУФЕР КОДОВ
MOV #8.,R2 ;КОЛИЧЕСТВО БАЙТОВ
20$: MOV R1,(R0)+ ;АДРЕС БАЙТА -> БЛОК АРГУМЕНТОВ
MOVB @#DHRXB,(R1)+ ;ЧИТАЕМ БАЙТ
SOB R2,20$ ;...
MOV #BUFF,R0 ;АДРЕС ВЫХОДНОГО БУФЕРА
MOV #FMTS,R1 ;ФОРМАТНАЯ СТРОКА
MOV #ARGS,R2 ;БЛОК АРГУМЕНТОВ
CALL $EDMSG ;ФОРМАТИРУЕМ СТРОКУ
CLRB @R0 ;ДЕЛАЕМ ASCIZ
MOV #LINE,@#DHCSR ;ВЫБИРАЕМ НОМЕР ЛИНИИ
SUB #BUFF-2,R0 ;ВЫЧИСЛЯЕМ ДЛИНУ В БАЙТАХ
MOV R0,@#DHCNT ;УСТАНАВЛИВАЕМ ДЛИНУ
MOV #BUFF-2,@#DHLBA ;УСТАНАВЛИВАЕМ АДРЕС СТРОКИ
MOV #TXEN!GO,@#DHHBA ;ЗАПУСКАЕМ ПЕРЕДАЧУ
.PRINT #BUFF ;...И ЗДЕСЬ ЗАПУСКАЕМ
30$: TST @#DHCSR ;ПЕРЕДАЧА ЗАВЕРШЕНА?
BPL 30$ ;ПОКА НЕТ
.EXIT ;ВСЕ
ARGS:: .BLKW 8.
DIAG:: .BLKB 8.
.BYTE 15,12
BUFF:: .BLKB 80.
FMTS:: .ASCIZ /Diag codes: %8B/
.END START
Код:
.RU TEST
Diag codes: 201 201 201 201 201 201 013 011
.