Subversion Repositories atmturbo

Rev

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