*D- *C+ ORG 0000 ENTRY_POINT DI ;clear memory PROG_START LD d,#55 START ;установка ROM в первую страницу ;менеджер памяти (D75,D22) ;rom to #0000-4fff LD bc,#3FF7 LD a,#3C OUT (c),a ;меняем бордер ;BORDER ; LD b,7 ; LD a,8 ; SUB b ; OUT (#FE),a ; DJNZ BORDER ;write to SYS (D50) ;установка режима: ; D0 - (RG0) 0 текстовый ; D1 - (RG1) 1 : режим ; D2 - (RG2) 1 ; D6 - (VE1) 0 : разрешить работу контроллера клавиатуры ; A14 - (PEN2) 0 : разрешить изменение палитры XOR a LD h,a LD l,a LOOP_SYS INC hl LD bc,#BF77 LD a,#A6 OUT (c),a LD a,h OR l JP NZ,LOOP_SYS ;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 ; ;зачистка страницы аттрибутов ; LD hl,PREP000 ; LD a,#11 ; JP F_CLEAR_PAGE3 ;PREP000 ; LD a,2 ; OUT (#FE),a ; ;ожидания нажатия клавиши ; LD hl,PREP004 ; результата ; JP F_KEYB_WAIT ; тестирования ;PREP004 ;установка палитры 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,PREP003 ; результата JP F_KEYB_WAIT ; тестирования PREP003 ;ожидания нажатия клавиши LD hl,PREP04 JP F_111 PREP04 ; HALT ;код для тестирования (в регистре стека) LD sp,0 ;заполнение атрибутами памяти в 1 странице ;очистка #C000-#FFFF LD a,#07 LD hl,TEST10 JP F_CLEAR_PAGE3 ; LD hl,#C000 ;LOOP_ATTR ; LD a,#F9 ;атрибуты ; LD (hl),a ; INC hl ; LD a,h ; OR a ; JR nz,LOOP_ATTR TEST10 ;очистка памяти в 5 странице ;очистка #8000-#BFFF LD hl,LOOP_CLEAR JP F_CLEAR_PAGE2 ; LD hl,#8000 ;LOOP_CLEAR ; LD a,#20 ;пробел ; XOR a ; LD (hl),a ; INC hl ; LD a,h ; SUB #C0 ; JR nz,LOOP_CLEAR LOOP_CLEAR ;вывод текста LD hl,#81C0 LD de,STR1_01 LD b,STR1_02-STR1_01 STR1_01_OUT LD a,(de) LD (hl),a INC hl INC de DJNZ STR1_01_OUT LD hl,#A1C0 LD b,STR1_02-STR1_01 STR1_02_OUT LD a,(de) LD (hl),a INC hl INC de DJNZ STR1_02_OUT ;перебор всех страниц от 0 до 64 ;страницы 1 и 5 не проверяются XOR a LD b,a EX a,a' TEST00 LD a,b LD hl,TEST01 ;вывод номера JP SUB_OUT_NUM ; страницы TEST01 EX a,a' LD b,a EX a,a' LD a,b ;игнорируем SUB 1 ; страницы 1 и 5 JP z,NOT_TESTED ; как LD a,b ; область SUB 5 ; экрана JP z,NOT_TESTED ; LD a,b LD bc,#7FF7 ;подготовка установки страницы в #4000-7FFF XOR #7F ;инвертируем биты 0-6 OUT (c),a ;устанавливаем страницу XOR a ;проверка LD (#4000),a ; что есть LD a,(#4000) ; память INC a ; по этой 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 a,a' INC a LD b,a EX a,a' LD a,b SUB 64 JR 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 hl,#8741 LD b,STR4_END-STR4 ;длина строки LD de,STR4 ;начало строки TEST06 LD a,(de) ;пересылка символа LD (hl),a ; на экран INC de ;de - адрес следующего символа LD a,b ; AND 1 ; JR z,TEST07 ; LD a,h ; SUB #20 ;hl LD h,a ; - INC l ; адрес JR TEST08 ; следующего TEST07 ; знакоместа LD a,h ; ADD a,#20 ; LD h,a ; TEST08 DJNZ TEST06 END XOR a IN a,(#FE) AND #1F SUB #1F JR z,END ADD a,#1F BIT 0,a JR nz,TEST11 DEC sp JP TEST10 TEST11 INC sp JP TEST10 ;вывод надписи "не тестируется" ; параметры: ; de - адрес знакоместа (четное знакоместо) NOT_TESTED LD b,STR2_END-STR2 ;длина строки LD hl,STR2 ;начало строки NOT_TESTED02 LD a,(hl) ;пересылка символа LD (de),a ; на экран INC hl ;hl - адрес следующего символа LD a,b ; AND 1 ; JR z,NOT_TESTED00 ; LD a,d ; SUB #20 ;de LD d,a ; - INC e ; адрес JR NOT_TESTED01 ; следующего NOT_TESTED00 ; знакоместа LD a,d ; ADD a,#20 ; LD d,a ; NOT_TESTED01 DJNZ NOT_TESTED02 JP TEST02 ;вывод надписи "не тестируется" ; параметры: ; de - адрес знакоместа (четное знакоместо) NOT_MEMORY LD b,STR3_END-STR3 ;длина строки LD hl,STR3 ;начало строки NOT_MEMORY02 LD a,(hl) ;пересылка символа LD (de),a ; на экран INC hl ;hl - адрес следующего символа LD a,b ; AND 1 ; JR z,NOT_MEMORY00 ; LD a,d ; SUB #20 ;de LD d,a ; - INC e ; адрес JR NOT_MEMORY01 ; следующего NOT_MEMORY00 ; знакоместа LD a,d ; ADD a,#20 ; LD d,a ; NOT_MEMORY01 DJNZ NOT_MEMORY02 JP TEST02 ;процедура вывода номера страницы с двоеточием ; параметры: ; 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 de,#8000 LOOP_FCP2 LD a,#20 ;пробел ; XOR a LD (de),a INC de LD a,d SUB #C0 JR nz,LOOP_FCP2 JP (hl) ;================================ ;заполнение атрибутами памяти в 1 странице ;атрибут в регистре a F_CLEAR_PAGE3 ;очистка #C000-#FFFF LD de,#C000 EX af,a'f' LOOP_FCP3 EX af,a'f' LD (de),a EX af,a'f' INC de LD a,d OR a JR nz,LOOP_FCP3 EX af,a'f' JP (hl) ;================================ ;вывод паралельных полос на экран F_FILL_LINES EX de,hl LD hl,#C1C0 LD a,#38 LOOP_FFLNS00 EX af,a'f' LD bc,#8020 LOOP_FFLNS01 LD a,c ADD a,h LD h,a EX af,a'f' LD (hl),a EX af,a'f' LD a,h SUB c LD h,a INC hl EX af,a'f' LD (hl),a EX af,a'f' DJNZ LOOP_FFLNS01 EX af,a'f' 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,a'f' ;первая строка LOOP_FFSMB00 EX af,a'f' LD (hl),a INC a EX af,a'f' LD a,h ADD a,c LD h,a EX af,a'f' LD (hl),a INC a EX af,a'f' LD a,h SUB c LD h,a INC hl DJNZ LOOP_FFSMB00 ;вторая строка LD b,#40 LD a,64 EX af,a'f' LOOP_FFSMB01 EX af,a'f' LD (hl),a INC a EX af,a'f' LD a,h ADD a,c LD h,a EX af,a'f' LD (hl),a INC a EX af,a'f' LD a,h SUB c LD h,a INC hl DJNZ LOOP_FFSMB01 ;третья строка LD b,#40 LD a,128 EX af,a'f' LOOP_FFSMB02 EX af,a'f' LD (hl),a INC a EX af,a'f' LD a,h ADD a,c LD h,a EX af,a'f' LD (hl),a INC a EX af,a'f' LD a,h SUB c LD h,a INC hl DJNZ LOOP_FFSMB02 ;четвертая строка LD b,#40 LD a,192 EX af,a'f' LOOP_FFSMB03 EX af,a'f' LD (hl),a INC a EX af,a'f' LD a,h ADD a,c LD h,a EX af,a'f' LD (hl),a INC a EX af,a'f' 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) ;текст MEMORY TEST FOR ATM Turbo 2+ ver7.10 (C) CHRV ; 010101010101010101010101010101010101010101010 STR1_01 DEFM "MMR ETFRAMTro2 e71 C 04CR ocw" STR1_02 DEFM "EOYTS O T ub +vr.0()20 HVMso." ;текст Not Tested STR2 DEFM "Screen area." STR2_END ;текст Not Memory STR3 DEFM "Not memory. " STR3_END ;текст STR4 DEFM " - code for test. Press any key for next code." STR4_END F_111 LD sp,hl XOR a LD h,#41 ;'A' LD l,a LOOP_111_1 LD a,l LD bc,#7FF7 ;подготовка установки страницы в #4000-7FFF XOR #7F ;инвертируем биты 0-6 OUT (c),a ;устанавливаем страницу LD de,#4000 LOOP_111_2 LD a,h LD (de),a INC de LD a,d AND #80 JR z,LOOP_111_2 INC h INC l LD a,l AND #20 JR z,LOOP_111_1 ;ожидания нажатия клавиши LD hl,F_111END JP F_KEYB_WAIT F_111END LD hl,0 ADD hl,sp JP (hl) PROG_END LENGTH EQU PROG_END-ENTRY_POINT DEFS 16384-LENGTH,#FF