Blame | Last modification | View Log | Download | RSS feed
ORG 0000ENTRY_POINTDI;clear memoryPROG_STARTLD d,#30+CURPAGESTART;установка ROM в первую страницу;менеджер памяти (D75,D22);rom to #0000-4fffLD bc,#3FF7LD a,#3COUT (c),a;write to SYS (D50);установка режима:; D0 - (RG0) 0 текстовый; D1 - (RG1) 1 : режим; D2 - (RG2) 1; D6 - (VE1) 0 : разрешить работу контроллера клавиатуры; A14 - (PEN2) 0 : разрешить изменение палитрыLD bc,#BF77LD a,#A6OUT (c),a;5 страница to #8000-BfffLD bc,#BFF7LD a,#7A; LD a,#7EOUT (c),a;1 страница в #C000-#FFFFLD bc,#FFF7LD a,#7EOUT (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,PREP01JP F_CLEAR_PAGE2PREP01;вывод номер страницы ПЗУ откуда стартовали (хранится в регистре d при старте теста)LD a,d ;номер страницы откуда стартовалиLD b,1 ;длина один символLD de,#85C0+(STR5_END-STR5)/2LD HL,PREP06JP SUB_OUT_STR_1PREP06LD de,#85C0LD b,STR5_END-STR5 ;длина строкиLD ix,STR5 ;начало строкиLD hl,PREP05 ;адрес возвратаJP SUB_OUT_STRPREP05;установка палитрыLD hl,PREP00JP F_SET_PALETTEPREP00;зачистка страницы аттрибутовLD hl,PREP000LD a,#07JP F_CLEAR_PAGE3PREP000;вывод цветных полос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-#FFFFLD a,#07LD hl,TEST10JP F_CLEAR_PAGE3TEST10;очистка памяти в 5 странице;очистка #8000-#BFFFLD hl,LOOP_CLEARJP F_CLEAR_PAGE2LOOP_CLEAR;вывод текстаLD de,#81C0LD b,STR1_END-STR1 ;длина строкиLD ix,STR1 ;начало строкиLD hl,START_TEST ;адрес возвратаJP SUB_OUT_STRSTART_TEST;перебор всех страниц от 0 до 64;страницы 1 и 5 не проверяютсяXOR aLD b,aEX af,af'TEST00LD a,bLD hl,TEST01 ;вывод номераJP SUB_OUT_NUM ; страницыTEST01EX af,af'LD b,aLD h,aEX af,af';проверка что находимся в области экранаLD a,b ;игнорируемCP 1 ; страницы 1 и 5JP z,NOT_TESTED ; как областьCP 5 ; экранаJP z,NOT_TESTED ;;включение страницы в памятьLD bc,#7FF7 ;подготовка установки страницы в #4000-7FFFXOR #7F ;инвертируем биты 0-6OUT (c),a ;устанавливаем страницу;проверка что младшие страницы не подключаются вместо старшихLD a,h ;проверяем что страницаAND #E0 ; из старших 512кб (номер страницы >= 32)JR z, TEST06LD a,hAND #1F ;получаем номер соответсвующийINC a ; младшей страницыCPL ;LD hl,#7FFFCP (hl) ;проверяем что подключена младшая страница (скорей всего мы в эмуляторе)JP z,NOT_MEMORYTEST06;если попали в видеопамять;то считаем что нет памятиLD ix,#4000LD a,(#8000) ;сохраняем значение из видеопамятиLD b,aLD a,(#C000) ;сохраняем значение из видеопамятиLD c,aLD a,#5ALD (ix),a ;записываем константу в страницуLD a,(#8000) ;считываем из видеопамятиCP (ix) ;сравниваемLD a,bLD (#8000),a ;восстановление значения видеопамятиJP z,NOT_MEMORYLD a,(#C000)CP (ix)LD a,cLD (#C000),a ;восстановление значения видеопамятиJP z,NOT_MEMORYXOR a ;проверка (что из памяти читается FF)LD (ix),a ; что естьADD a,(ix) ; памятьINC a ; по этойJP z,NOT_MEMORY ; страницеLD a,#5ALD (ix),aLD a,(#8000) ;если попали в видеопамятьCP (ix)JP z,NOT_MEMORYLD a,(#C000) ;то тоже считаем что нет памятиCP (ix)JP z,NOT_MEMORYLD hl,0 ;загрузкаADD hl,sp ; кодаLD a,l ; из spLD b,a ;подготовкаLD hl,#4000 ; к тестуLD c,0 ; памятиTEST03LD a,b ;LD (hl),a ;LD a,(hl) ;собственноXOR b ; тестOR c ;LD c,a ;INC hl ;LD a,h ;AND #80 ;JR z,TEST03LD a,c ;выводLD hl,TEST02 ; результатаJP SUB_OUT_REZ ; тестированияTEST02EX af,af'INC aLD b,aEX af,af'LD a,bCPL ; сохраняем инвертированый номер текущей страницы+1LD (#7FFF),a ; в последний байт страницыLD a,bSUB 64JP nz,TEST00;вывод кода тестаLD hl,0 ;загрузкаADD hl,sp ; кодаLD a,l ; изLD c,l ; SPLD hl,#8740LD d,#30LD e,#37RLCA ;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,#8741LD b,STR4_END-STR4 ;длина строкиLD ix,STR4 ;начало строкиLD hl,END ;адрес возвратаJP SUB_OUT_STRENDXOR aIN a,(#FE)AND #1FSUB #1FJR z,ENDADD a,#1FLD sp,#00FFBIT 1,aJP z,TEST10LD sp,#0055BIT 2,aJP z,TEST10LD SP,#00AABIT 3,aJP z,TEST10LD sp,#0000; BIT 0,aJP TEST10;вывод надписи "не тестируется"; параметры:; de - адрес знакоместа (четное знакоместо)NOT_TESTEDLD b,STR2_END-STR2 ;длина строкиLD ix,STR2 ;начало строкиLD hl,TEST02 ;возврат на TEST02JP SUB_OUT_STR;вывод надписи "не тестируется"; параметры:; de - адрес знакоместа (четное знакоместо)NOT_MEMORYLD b,STR3_END-STR3 ;длина строкиLD ix,STR3 ;начало строкиLD hl,TEST02 ;возврат на TEST02JP SUB_OUT_STR;процедура вывода строки; параметры:; b - длина строки (четная или 1); hl- адрес возврата; de- адрес знакоместа (четное знакоместо); ix- адрес начала строки; при выходе в de адрес знакоместа куда можно писать данныеSUB_OUT_STRLD a,(ix) ;пересылка символаSUB_OUT_STR_1LD (de),a ; на экранINC ix ;ix - адрес следующего символаLD a,b ;AND 1 ;JR z,SUB_OUT_STR00 ;LD a,d ;SUB #20 ;deLD d,a ; -INC e ; адресJR SUB_OUT_STR01 ; следующегоSUB_OUT_STR00 ; знакоместаLD a,d ;ADD a,#20 ;LD d,a ;SUB_OUT_STR01DJNZ SUB_OUT_STRJP (hl) ;выход по адресу HL;процедура вывода номера страницы с двоеточием; параметры:; a - номер страницы; hl- адрес возврата; при выходе в de адрес знакоместа куда можно писать данныеSUB_OUT_NUMAND 63LD c,aSRL a ;a -SRL a ; номерINC a ; строкиLD b,a ;SRL a ;SRL a ;; LD de,#81C0 ; deLD de,#8200 ; deADD a,d ; =LD d,a ; #81C0LD 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 ; deLD a,10 ; =ADD a,e ; deLD e,a ; +JR nc,OUT_NUM01 ; (a*8)INC d ;OUT_NUM01 ;DJNZ OUT_NUM00 ;OUT_NUM03LD 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,dSUB #20 ;LD d,a ;de - адрес следующего знакоместаINC e ;LD a,#3A ;выводLD (de),a ; двоеточияINC e ;следующее четное знакоместоJP (hl) ;выход по адресу HL;процедура вывода результата тестирования; параметры:; a - результат проверки; hl- адрес возврата; de- адрес вывода (обязательно четный символ); использует: bcSUB_OUT_REZLD b,8LD c,aOUT_REZLD a,#2B ;вывод символа '+'LD (de),a ; ('+' - проверка успешна)LD a,cRLCALD c,aJR nc,OUT_REZ00LD a,#2D ;вывод символа '-'LD (de),a ; ('-' - бит запорот)OUT_REZ00DEC bJR z,OUT_REZ_ENDLD a,bAND 1JR z,OUT_REZ01;нечетный адресLD a,dADD a,#20LD d,aJR OUT_REZOUT_REZ01;четный адресLD a,dSUB #20LD d,aINC eJR OUT_REZOUT_REZ_ENDJP (hl) ;выход по адресу в HL;================================;заполнение экрана символом пробелF_CLEAR_PAGE2;очистка памяти в 5 странице;очистка #8000-#BFFFLD bc,#8000LOOP_FCP2LD a,#20 ;пробел; XOR aLD (bc),aINC bcLD a,bSUB #C0JR nz,LOOP_FCP2JP (hl);================================;заполнение атрибутами памяти в 1 странице;атрибут в регистре aF_CLEAR_PAGE3;очистка #C000-#FFFFLD de,#C000EX af,af'LOOP_FCP3EX af,af'LD (de),aEX af,af'INC deLD a,dOR aJR nz,LOOP_FCP3EX af,af'JP (hl);================================;вывод паралельных полос на экранF_FILL_LINESEX de,hlLD hl,#C1C0LD a,#38LOOP_FFLNS00EX af,af'LD bc,#8020LOOP_FFLNS01LD a,cADD a,hLD h,aEX af,af'LD (hl),aEX af,af'LD a,hSUB cLD h,aINC hlEX af,af'LD (hl),aEX af,af'DJNZ LOOP_FFLNS01EX af,af'SUB #08JR nc,LOOP_FFLNS00EX de,hlJP (hl);================================;вывод четырех строк символовF_FILL_SYMBOLEX de,hlLD hl,#86C0LD bc,#4020XOR aEX af,af';первая строкаLOOP_FFSMB00EX af,af'LD (hl),aINC aEX af,af'LD a,hADD a,cLD h,aEX af,af'LD (hl),aINC aEX af,af'LD a,hSUB cLD h,aINC hlDJNZ LOOP_FFSMB00;вторая строкаLD b,#40LD a,64EX af,af'LOOP_FFSMB01EX af,af'LD (hl),aINC aEX af,af'LD a,hADD a,cLD h,aEX af,af'LD (hl),aINC aEX af,af'LD a,hSUB cLD h,aINC hlDJNZ LOOP_FFSMB01;третья строкаLD b,#40LD a,128EX af,af'LOOP_FFSMB02EX af,af'LD (hl),aINC aEX af,af'LD a,hADD a,cLD h,aEX af,af'LD (hl),aINC aEX af,af'LD a,hSUB cLD h,aINC hlDJNZ LOOP_FFSMB02;четвертая строкаLD b,#40LD a,192EX af,af'LOOP_FFSMB03EX af,af'LD (hl),aINC aEX af,af'LD a,hADD a,cLD h,aEX af,af'LD (hl),aINC aEX af,af'LD a,hSUB cLD h,aINC hlDJNZ LOOP_FFSMB03EX de,hlJP (hl);================================;ожидание нажатие клавишиF_KEYB_WAITXOR aIN a,(#FE)AND #1FSUB #1FJR z,F_KEYB_WAITJP (hl);================================;установка палитрыF_SET_PALETTELD sp,hl ;сохранение регистра hlLD b,8LOOP_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,cRLCARLCARLCAADD a,cRLCARLCAAND #F0ADD a,cOUT (#FF),aDJNZ LOOP_FSPLT00LD h,b ;восстановление регистра HLLD l,b ;ADD hl,sp ;JP (hl);текстSTR1 DEFM "MEMORY TEST FOR ATM Turbo 2+ ver7.10 (C)2023 CHRV/NedoPC"STR1_END;текст Not TestedSTR2 DEFM "Screen area."STR2_END;текст Not MemorySTR3 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_ENDPROG_ENDLENGTH EQU PROG_END-ENTRY_POINTDEFS 16384-LENGTH,#FF