Blame | Last modification | View Log | Download | RSS feed | ?url?
ORG 0000
ENTRY_POINT
DI
;clear memory
PROG_START
LD d,#30+CURPAGE
START
;установка ROM в первую страницу
;менеджер памяти (D75,D22)
;rom to #0000-4fff
LD bc,#3FF7
LD a,#3C
OUT (c),a
;write to SYS (D50)
;установка режима:
; D0 - (RG0) 0 текстовый
; D1 - (RG1) 1 : режим
; D2 - (RG2) 1
; D6 - (VE1) 0 : разрешить работу контроллера клавиатуры
; A14 - (PEN2) 0 : разрешить изменение палитры
LD bc,#BF77
LD a,#A6
OUT (c),a
;5 страница to #8000-Bfff
LD bc,#BFF7
LD a,#7A
; LD a,#7E
OUT (c),a
;1 страница в #C000-#FFFF
LD bc,#FFF7
LD a,#7E
OUT (c),a
;сброс клавиатуры
LD a,#55 ;подать команду контроллеру клавиатуры
IN a,(#FE)
LD a,#07 ;команда - установить режим
IN a,(#FE)
;установка спектрум-режима клавиатуры
LD a,#55 ;подать комнаду контроллеру клавиатуры
IN a,(#FE)
LD a,#08 ;команда - установить режим
IN a,(#FE)
XOR a ;0 - спектрум режим
IN a,(#FE)
;зачистка страницы символов (вывод пробелов)
LD hl,PREP01
JP F_CLEAR_PAGE2
PREP01
;вывод номер страницы ПЗУ откуда стартовали (хранится в регистре d при старте теста)
LD a,d ;номер страницы откуда стартовали
LD b,1 ;длина один символ
LD de,#85C0+(STR5_END-STR5)/2
LD HL,PREP06
JP SUB_OUT_STR_1
PREP06
LD de,#85C0
LD b,STR5_END-STR5 ;длина строки
LD ix,STR5 ;начало строки
LD hl,PREP05 ;адрес возврата
JP SUB_OUT_STR
PREP05
;установка палитры
LD hl,PREP00
JP F_SET_PALETTE
PREP00
;зачистка страницы аттрибутов
LD hl,PREP000
LD a,#07
JP F_CLEAR_PAGE3
PREP000
;вывод цветных полос
LD hl,PREP02 ; результата
JP F_FILL_LINES ; тестирования
PREP02
;вывод таблицы символов
LD hl,PREP03 ; результата
JP F_FILL_SYMBOL ; тестирования
PREP03
;ожидания нажатия клавиши
LD hl,PREP04 ; результата
JP F_KEYB_WAIT ; тестирования
PREP04
;код для тестирования (в регистре стека)
LD sp,0
;заполнение атрибутами памяти в 1 странице
;очистка #C000-#FFFF
LD a,#07
LD hl,TEST10
JP F_CLEAR_PAGE3
TEST10
;очистка памяти в 5 странице
;очистка #8000-#BFFF
LD hl,LOOP_CLEAR
JP F_CLEAR_PAGE2
LOOP_CLEAR
;вывод текста
LD de,#81C0
LD b,STR1_END-STR1 ;длина строки
LD ix,STR1 ;начало строки
LD hl,START_TEST ;адрес возврата
JP SUB_OUT_STR
START_TEST
;перебор всех страниц от 0 до 64
;страницы 1 и 5 не проверяются
XOR a
LD b,a
EX af,af'
TEST00
LD a,b
LD hl,TEST01 ;вывод номера
JP SUB_OUT_NUM ; страницы
TEST01
EX af,af'
LD b,a
LD h,a
EX af,af'
;проверка что находимся в области экрана
LD a,b ;игнорируем
CP 1 ; страницы 1 и 5
JP z,NOT_TESTED ; как область
CP 5 ; экрана
JP z,NOT_TESTED ;
;включение страницы в память
LD bc,#7FF7 ;подготовка установки страницы в #4000-7FFF
XOR #7F ;инвертируем биты 0-6
OUT (c),a ;устанавливаем страницу
;проверка что младшие страницы не подключаются вместо старших
LD a,h ;проверяем что страница
AND #E0 ; из старших 512кб (номер страницы >= 32)
JR z, TEST06
LD a,h
AND #1F ;получаем номер соответсвующий
INC a ; младшей страницы
CPL ;
LD hl,#7FFF
CP (hl) ;проверяем что подключена младшая страница (скорей всего мы в эмуляторе)
JP z,NOT_MEMORY
TEST06
;если попали в видеопамять
;то считаем что нет памяти
LD ix,#4000
LD a,(#8000) ;сохраняем значение из видеопамяти
LD b,a
LD a,(#C000) ;сохраняем значение из видеопамяти
LD c,a
LD a,#5A
LD (ix),a ;записываем константу в страницу
LD a,(#8000) ;считываем из видеопамяти
CP (ix) ;сравниваем
LD a,b
LD (#8000),a ;восстановление значения видеопамяти
JP z,NOT_MEMORY
LD a,(#C000)
CP (ix)
LD a,c
LD (#C000),a ;восстановление значения видеопамяти
JP z,NOT_MEMORY
XOR a ;проверка (что из памяти читается FF)
LD (ix),a ; что есть
ADD a,(ix) ; память
INC a ; по этой
JP z,NOT_MEMORY ; странице
LD a,#5A
LD (ix),a
LD a,(#8000) ;если попали в видеопамять
CP (ix)
JP z,NOT_MEMORY
LD a,(#C000) ;то тоже считаем что нет памяти
CP (ix)
JP z,NOT_MEMORY
LD hl,0 ;загрузка
ADD hl,sp ; кода
LD a,l ; из sp
LD b,a ;подготовка
LD hl,#4000 ; к тесту
LD c,0 ; памяти
TEST03
LD a,b ;
LD (hl),a ;
LD a,(hl) ;собственно
XOR b ; тест
OR c ;
LD c,a ;
INC hl ;
LD a,h ;
AND #80 ;
JR z,TEST03
LD a,c ;вывод
LD hl,TEST02 ; результата
JP SUB_OUT_REZ ; тестирования
TEST02
EX af,af'
INC a
LD b,a
EX af,af'
LD a,b
CPL ; сохраняем инвертированый номер текущей страницы+1
LD (#7FFF),a ; в последний байт страницы
LD a,b
SUB 64
JP nz,TEST00
;вывод кода теста
LD hl,0 ;загрузка
ADD hl,sp ; кода
LD a,l ; из
LD c,l ; SP
LD hl,#8740
LD d,#30
LD e,#37
RLCA ;
RLCA ;
RLCA ;вывод
RLCA ; старшего
AND #0F ; знака
LD b,a ; кода
SUB 10 ;
LD a,d ;
JR c,TEST04 ;
LD a,e ;
TEST04 ;
ADD a,b ;
LD (hl),a ;
LD a,h ;следующее
ADD a,#20 ; знакоместо
LD h,a ;
LD a,c ;
AND #0F ;
LD b,a ;
SUB 10 ;вывод
LD a,d ; младшего
JR c,TEST05 ; знака
LD a,e ; кода
TEST05 ;
ADD a,b ;
LD (hl),a ;
;вывод строки "нажмите клавишу"
LD de,#8741
LD b,STR4_END-STR4 ;длина строки
LD ix,STR4 ;начало строки
LD hl,END ;адрес возврата
JP SUB_OUT_STR
END
XOR a
IN a,(#FE)
AND #1F
SUB #1F
JR z,END
ADD a,#1F
LD sp,#00FF
BIT 1,a
JP z,TEST10
LD sp,#0055
BIT 2,a
JP z,TEST10
LD SP,#00AA
BIT 3,a
JP z,TEST10
LD sp,#0000
; BIT 0,a
JP TEST10
;вывод надписи "не тестируется"
; параметры:
; de - адрес знакоместа (четное знакоместо)
NOT_TESTED
LD b,STR2_END-STR2 ;длина строки
LD ix,STR2 ;начало строки
LD hl,TEST02 ;возврат на TEST02
JP SUB_OUT_STR
;вывод надписи "не тестируется"
; параметры:
; de - адрес знакоместа (четное знакоместо)
NOT_MEMORY
LD b,STR3_END-STR3 ;длина строки
LD ix,STR3 ;начало строки
LD hl,TEST02 ;возврат на TEST02
JP SUB_OUT_STR
;процедура вывода строки
; параметры:
; b - длина строки (четная или 1)
; hl- адрес возврата
; de- адрес знакоместа (четное знакоместо)
; ix- адрес начала строки
; при выходе в de адрес знакоместа куда можно писать данные
SUB_OUT_STR
LD a,(ix) ;пересылка символа
SUB_OUT_STR_1
LD (de),a ; на экран
INC ix ;ix - адрес следующего символа
LD a,b ;
AND 1 ;
JR z,SUB_OUT_STR00 ;
LD a,d ;
SUB #20 ;de
LD d,a ; -
INC e ; адрес
JR SUB_OUT_STR01 ; следующего
SUB_OUT_STR00 ; знакоместа
LD a,d ;
ADD a,#20 ;
LD d,a ;
SUB_OUT_STR01
DJNZ SUB_OUT_STR
JP (hl) ;выход по адресу HL
;процедура вывода номера страницы с двоеточием
; параметры:
; a - номер страницы
; hl- адрес возврата
; при выходе в de адрес знакоместа куда можно писать данные
SUB_OUT_NUM
AND 63
LD c,a
SRL a ;a -
SRL a ; номер
INC a ; строки
LD b,a ;
SRL a ;
SRL a ;
; LD de,#81C0 ; de
LD de,#8200 ; de
ADD a,d ; =
LD d,a ; #81C0
LD a,b ; +
AND 3 ; (a * 64)
RRCA ;
RRCA ;
ADD a,e ;
LD e,a ;
JR nc,OUT_NUM04 ;
INC d ;
OUT_NUM04 ;
LD a,c ;
AND 3 ;
JR z,OUT_NUM03 ;
LD b,a ;
OUT_NUM00 ; de
LD a,10 ; =
ADD a,e ; de
LD e,a ; +
JR nc,OUT_NUM01 ; (a*8)
INC d ;
OUT_NUM01 ;
DJNZ OUT_NUM00 ;
OUT_NUM03
LD b,#FF ;
LD a,c ;
OUT_NUM02 ;
INC b ;вывод
SUB 10 ; старшего
JR nc,OUT_NUM02 ; знака
ADD a,10 ;
LD c,a ;
LD a,b ;
ADD a,#30 ;
LD (de),a ;
LD a,#20 ;
ADD a,d ;de - адрес следующего знакоместа
LD d,a ;
LD a,#30 ;вывод
ADD a,c ; младшего
LD (de),a ; знака
LD a,d
SUB #20 ;
LD d,a ;de - адрес следующего знакоместа
INC e ;
LD a,#3A ;вывод
LD (de),a ; двоеточия
INC e ;следующее четное знакоместо
JP (hl) ;выход по адресу HL
;процедура вывода результата тестирования
; параметры:
; a - результат проверки
; hl- адрес возврата
; de- адрес вывода (обязательно четный символ)
; использует: bc
SUB_OUT_REZ
LD b,8
LD c,a
OUT_REZ
LD a,#2B ;вывод символа '+'
LD (de),a ; ('+' - проверка успешна)
LD a,c
RLCA
LD c,a
JR nc,OUT_REZ00
LD a,#2D ;вывод символа '-'
LD (de),a ; ('-' - бит запорот)
OUT_REZ00
DEC b
JR z,OUT_REZ_END
LD a,b
AND 1
JR z,OUT_REZ01
;нечетный адрес
LD a,d
ADD a,#20
LD d,a
JR OUT_REZ
OUT_REZ01
;четный адрес
LD a,d
SUB #20
LD d,a
INC e
JR OUT_REZ
OUT_REZ_END
JP (hl) ;выход по адресу в HL
;================================
;заполнение экрана символом пробел
F_CLEAR_PAGE2
;очистка памяти в 5 странице
;очистка #8000-#BFFF
LD bc,#8000
LOOP_FCP2
LD a,#20 ;пробел
; XOR a
LD (bc),a
INC bc
LD a,b
SUB #C0
JR nz,LOOP_FCP2
JP (hl)
;================================
;заполнение атрибутами памяти в 1 странице
;атрибут в регистре a
F_CLEAR_PAGE3
;очистка #C000-#FFFF
LD de,#C000
EX af,af'
LOOP_FCP3
EX af,af'
LD (de),a
EX af,af'
INC de
LD a,d
OR a
JR nz,LOOP_FCP3
EX af,af'
JP (hl)
;================================
;вывод паралельных полос на экран
F_FILL_LINES
EX de,hl
LD hl,#C1C0
LD a,#38
LOOP_FFLNS00
EX af,af'
LD bc,#8020
LOOP_FFLNS01
LD a,c
ADD a,h
LD h,a
EX af,af'
LD (hl),a
EX af,af'
LD a,h
SUB c
LD h,a
INC hl
EX af,af'
LD (hl),a
EX af,af'
DJNZ LOOP_FFLNS01
EX af,af'
SUB #08
JR nc,LOOP_FFLNS00
EX de,hl
JP (hl)
;================================
;вывод четырех строк символов
F_FILL_SYMBOL
EX de,hl
LD hl,#86C0
LD bc,#4020
XOR a
EX af,af'
;первая строка
LOOP_FFSMB00
EX af,af'
LD (hl),a
INC a
EX af,af'
LD a,h
ADD a,c
LD h,a
EX af,af'
LD (hl),a
INC a
EX af,af'
LD a,h
SUB c
LD h,a
INC hl
DJNZ LOOP_FFSMB00
;вторая строка
LD b,#40
LD a,64
EX af,af'
LOOP_FFSMB01
EX af,af'
LD (hl),a
INC a
EX af,af'
LD a,h
ADD a,c
LD h,a
EX af,af'
LD (hl),a
INC a
EX af,af'
LD a,h
SUB c
LD h,a
INC hl
DJNZ LOOP_FFSMB01
;третья строка
LD b,#40
LD a,128
EX af,af'
LOOP_FFSMB02
EX af,af'
LD (hl),a
INC a
EX af,af'
LD a,h
ADD a,c
LD h,a
EX af,af'
LD (hl),a
INC a
EX af,af'
LD a,h
SUB c
LD h,a
INC hl
DJNZ LOOP_FFSMB02
;четвертая строка
LD b,#40
LD a,192
EX af,af'
LOOP_FFSMB03
EX af,af'
LD (hl),a
INC a
EX af,af'
LD a,h
ADD a,c
LD h,a
EX af,af'
LD (hl),a
INC a
EX af,af'
LD a,h
SUB c
LD h,a
INC hl
DJNZ LOOP_FFSMB03
EX de,hl
JP (hl)
;================================
;ожидание нажатие клавиши
F_KEYB_WAIT
XOR a
IN a,(#FE)
AND #1F
SUB #1F
JR z,F_KEYB_WAIT
JP (hl)
;================================
;установка палитры
F_SET_PALETTE
LD sp,hl ;сохранение регистра hl
LD b,8
LOOP_FSPLT00
;бордер
LD a,b ;установка
DEC a ; цвета
LD c,a ;
OUT (#FE),a ; бордера
;заполнение атрибутом цвета
LD a,c ;получение
RLCA ; атрибута
RLCA ; цвета
RLCA ;
RLCA ;
ADD a,c ;
LD hl,LOOP_FSPLT01 ;вызов процедуры
JP F_CLEAR_PAGE3 ; заполнения
LOOP_FSPLT01
;цвет палитры
LD a,c
RLCA
RLCA
RLCA
ADD a,c
RLCA
RLCA
AND #F0
ADD a,c
OUT (#FF),a
DJNZ LOOP_FSPLT00
LD h,b ;восстановление регистра HL
LD l,b ;
ADD hl,sp ;
JP (hl)
;текст
STR1 DEFM "MEMORY TEST FOR ATM Turbo 2+ ver7.10 (C)2023 CHRV/NedoPC"
STR1_END
;текст Not Tested
STR2 DEFM "Screen area."
STR2_END
;текст Not Memory
STR3 DEFM "Not memory. "
STR3_END
;текст
STR4 DEFM " test byte. Press key for next codes: 1-00 2-FF 3-55 4-AA."
STR4_END
;текст страница
STR5 DEFM "Started from ROM page "
STR5_END
PROG_END
LENGTH EQU PROG_END-ENTRY_POINT
DEFS 16384-LENGTH,#FF