Тест-генератор VGA. Исходник программы микрокода.


;----------------------------------------------------------------------------
; Tester VGA.
; Микропроцессор PIC16F84A, кварцевый резонатор на 4.0 MHz
; выводит 8 тестов в стандартном режиме 640x480 
; (синхроимпульсы отрицательной полярности):
;   1 - цветные полосы;
;   2 - белое поле;
;   3 - красное поле;
;   4 - зеленое поле;
;   5 - синее поле;
;   6 - "зебра"
;   7 - шахматное поле;
;   8 - сетка;
;
; За основу взята схема и программа с:
;   (c) 2001 Yuri Lysenkov aka YUSoft yl2@mail.ru http://yl.da.ru
;   based on the Eric Schlaepfer's MDA/CGA Tester schlae@myrealbox.com 
;
; Copyright by Vadim Churkin (C) 2003.
; URL:      http://v-ch.h1.ru
; E-MAIL:   vadim_churkin@mail.ru
;
; Опубликование и перепечатка только с согласия автора.
; При перепечатке ссылка обязательна.
;
; Standart VGA 640x480, H = 31,5 kHz, V = 60 Hz:
;
;            2mks                       1mks
;           ->  <-                     -> <-
; H: ---|    |--|||||||||||||||||||||||||-|    |--
;       |    |  <-------  25mks  -------> |    |
;       ------                            ------
;     -> 4mks <-
;       <------------  32mks  ----------->
;
;             1020mks                350mks
;            ->     <-              ->   <-
; V: ---|     |-----||||||||||||||||||---|     |--
;       |     |     <--- 15246mks --->   |     |
;       -------                          -------
;     -> 64mks <-
;       <---------- 16680mks ----------->
;
; Мы немного модифицируем кадр:
;
;              928mks                320mks
;            ->     <-              ->   <-
; V: ---|     |-----||||||||||||||||||---|     |--
;       |     |     <--- 15360mks --->   |     |
;       -------                          -------
;     -> 64mks <-
;       <---------- 16672mks ----------->
;----------------------------------------------------------------------------

;----------------------------------------------------------------------------
    list    p=16f84a, f=inhx8m
;----------------------------------------------------------------------------

;----------------------------------------------------------------------------
    #include 
;----------------------------------------------------------------------------

;----------------------------------------------------------------------------
; конфигурация МК:
;   обычный кварцевый резонатор
;   сторожевой таймер выключен
;   таймер задержки включения включен
;----------------------------------------------------------------------------
    __config _XT_OSC & _WDT_OFF & _PWRTE_ON
;----------------------------------------------------------------------------

;----------------------------------------------------------------------------
; переменные
;----------------------------------------------------------------------------
RoutineID   equ 0x0C    ; индекс п.п. для выполнения
Flags       equ 0x0D    ; вспомогательные флаги
CountLinesT equ 0x10    ; переменные-счетчики
CountLinesB equ 0x11
CountTop    equ 0x12
CountBottom equ 0x13
CountLines1 equ 0x14
CountLines2 equ 0x15
CountLines3 equ 0x16
;----------------------------------------------------------------------------

;----------------------------------------------------------------------------
; константы
;----------------------------------------------------------------------------
HBit            equ 1
VBit            equ 2
ModeBit         equ 0
BtnPressModeBit equ 0
Color_Black     equ B'00000110'
Color_RGB       equ B'11111111'
Color_R         equ B'10000111'
Color_G         equ B'01001110'
Color_B         equ B'00110110'
Color_RG        equ B'11001111'
Color_RB        equ B'10110111'
Color_GB        equ B'01111110'
Line_RGB        equ B'11100110'
Line_R          equ B'10000110'
Line_G          equ B'01000110'
Line_B          equ B'00100110'
Line_RG         equ B'11000110'
Line_RB         equ B'10100110'
Line_GB         equ B'01100110'
;----------------------------------------------------------------------------

;----------------------------------------------------------------------------
; макросы задержки
;----------------------------------------------------------------------------
Sleep1mks   macro
    nop                 ;
    endm
;----------------------------------------------------------------------------
Sleep2mks   macro
    local   ln
    goto    ln          ;
ln:
    endm
;----------------------------------------------------------------------------
Sleep3mks   macro
    Sleep2mks           ;
    Sleep1mks           ;
    endm
;----------------------------------------------------------------------------
Sleep4mks   macro
    call    Delay4mks   ;
    endm
;----------------------------------------------------------------------------
Sleep5mks   macro
    call    Delay5mks   ;
    endm
;----------------------------------------------------------------------------
Sleep6mks   macro
    call    Delay6mks   ;
    endm                ;
;----------------------------------------------------------------------------
Sleep7mks   macro
    call    Delay7mks   ;
    endm
;----------------------------------------------------------------------------
Sleep8mks   macro
    call    Delay8mks   ;
    endm
;----------------------------------------------------------------------------
Sleep9mks   macro
    call    Delay9mks   ;
    endm
;----------------------------------------------------------------------------
Sleep10mks  macro
    call    Delay10mks  ;
    endm
;----------------------------------------------------------------------------

;----------------------------------------------------------------------------
; горизонтальный синхроимпульс длительностью 4 мкс; +5
;----------------------------------------------------------------------------
HSync   macro
    bcf PORTB, HBit     ; ---|   |--------
    Sleep3mks           ;    |   |
                        ;    -----
    bsf PORTB, HBit     ; -> 4 mks <-
    endm
;----------------------------------------------------------------------------

;----------------------------------------------------------------------------
; Вертикальный синхроимпульс длительностью 64 мкс
; V: --|                                |-----
;      |                                |
;      ----------------------------------
;
; H: ---|  |-------------|  |------------|  |---
;       |  |             |  |            |  |
;       ----             ----            ----
;----------------------------------------------------------------------------

;----------------------------------------------------------------------------
; вывод некоторого количества строк, заданого как С; выходной цвет задается в P
;    |                                  |
; H: | |--|||||||||||||||||||||||||-|   |
;    | |                            |   |
;    |--                            ----|
;    |                                  |
;----------------------------------------------------------------------------
Blank   macro   P, C
    local   lp_1
lp_1:
    bsf     PORTB, HBit ; +1
    movlw   P           ; +1
    movwf   PORTB       ; +1
    Sleep10mks          ; +10
    Sleep7mks           ; +7
    Sleep6mks           ; +6
    movlw   Color_Black ; +1
    movwf   PORTB       ; +1
    bcf     PORTB, HBit ; +1
    decfsz  C, F        ; +1(2)
    goto    lp_1        ; +2
    nop                 ; +1 = 1 + 1 + 1 + 10 + 7 + 6 + 1 + 1 + 1 + 1 + 2 = 32
    endm
;----------------------------------------------------------------------------


;----------------------------------------------------------------------------
;                                   C O D E
;----------------------------------------------------------------------------
    org 0x0                 ;
    goto    Start           ;

    org 0x10                ;
Start:
    call    Init            ; инициализируем МК
    
Select:
    ;------------------------------------------------------;
    ; Вертикальный синхроимпульс длительностью 64 мкс      ;
    ;                                             |        ;
    ; V: ----|                                |---|        ;
    ;        |                                |   |        ;
    ;        ----------------------------------   |        ;
    ;                                             |        ;
    ; H: -----|  |-------------|  |------------|  |        ;
    ;         |  |             |  |            |  |        ;
    ;         ----             ----            ---|        ;
    ;                                             |        ;
    ;------------------------------------------------------;
    Sleep10mks              ;
    Sleep8mks               ;

    bcf     PORTB, HBit     ;
    Sleep3mks               ;
    bsf     PORTB, HBit     ;

    Sleep10mks              ;
    Sleep10mks              ;

    movlw   D'29'           ;
    movwf   CountTop        ;
    movlw   D'9'            ;
    movwf   CountBottom     ; 
    Sleep3mks               ;

    bsf     PORTB, VBit     ;
    bcf     PORTB, HBit     ;
    Sleep3mks               ;

    ; выводим верхнюю часть экрана
    ;    |                                  |
    ; H: | |--|||||||||||||||||||||||||-|   |
    ;    | |                            |   |
    ;    |--                            ----|
    ;    |                                  |
    Blank   Color_Black, CountTop   ; = 32 * CountTop[19]

    ; выведем горизонтальную линию
    ;    |                                  |
    ; H: | |--\/\/\/\/\/\/\/\/\/\/\/\/\-|   |
    ;    | |                            |   |
    ;    |--                            ----|
    ;    |                                  |
    bsf     PORTB, HBit     ;
    movlw   Color_RGB       ;
    movwf   PORTB           ;

    movf    RoutineID, W    ;
    andlw   B'00000111'     ;
    addwf   PCL, F          ;
    goto    ColorBands      ; 0 - цветные полосы
    goto    WhiteField      ; 1 - белое поле
    goto    RedField        ; 2 - красное поле
    goto    GreenField      ; 3 - зеленое поле
    goto    BlueField       ; 4 - синее поле
    goto    Zebra           ; 5 - зебра
    goto    Chess           ; 6 - шахматное поле
    goto    Grid            ; 7 - сетка
    ; всего 5 (?6) микросекунд
;----------------------------------------------------------------------------

;----------------------------------------------------------------------------
; цветные полосы
;----------------------------------------------------------------------------
ColorBands:
    Sleep10mks              ;
    Sleep4mks               ;
    movlw   D'239'          ; разделим экран на 2 части
    movwf   CountLinesT     ; 
    movwf   CountLinesB     ; 
    movlw   Color_Black     ;
    movwf   PORTB           ;
    bcf     PORTB, HBit     ;
    Sleep3mks               ;

    ; выводим верхнюю половину экрана
    ;    |                                  |
    ; H: | |---RRRRRRRRRRRR         ----|   |
    ;    | |   GGGGGG      GGGGGG       |   |
    ;    |--   BBB   BBB   BBB   BBB    ----|
    ;    |                                  |
ColorBands_Loop_HT:
    bsf     PORTB, HBit     ;
    Sleep1mks               ;

    ; выводим цветные полосы 
    movlw   Color_RGB       ; R G B
    movwf   PORTB           ;
    Sleep1mks               ; 

    movlw   Color_RG        ; R G
    movwf   PORTB           ;
    Sleep1mks               ;

    movlw   Color_RB        ; R B
    movwf   PORTB           ;
    Sleep1mks               ;

    movlw   Color_R         ; R
    movwf   PORTB           ;
    Sleep1mks               ;

    movlw   Color_GB        ; G B
    movwf   PORTB           ;
    Sleep1mks               ;

    movlw   Color_G         ; G
    movwf   PORTB           ;
    Sleep1mks               ;

    movlw   Color_B         ; B
    movwf   PORTB           ;
    Sleep1mks               ;

    movlw   Color_Black     ; Black
    movwf   PORTB           ;
    Sleep3mks               ;

    bcf     PORTB, HBit     ;
    decfsz  CountLinesT, F  ;
    goto    ColorBands_Loop_HT  ;
    nop                     ; 

    ; выводим нижнюю половину экрана
ColorBands_Loop_HB:
    bsf     PORTB, HBit     ;
    Sleep1mks               ; +1

    ; выводим цветные полосы
    movlw   Color_RGB       ; R G B
    movwf   PORTB           ;
    Sleep1mks               ; 

    movlw   Color_RG        ; R G
    movwf   PORTB           ;
    Sleep1mks               ;

    movlw   Color_RB        ; R B
    movwf   PORTB           ;
    Sleep1mks               ;

    movlw   Color_R         ; R
    movwf   PORTB           ;
    Sleep1mks               ;

    movlw   Color_GB        ; G B
    movwf   PORTB           ;
    Sleep1mks               ;

    movlw   Color_G         ; G
    movwf   PORTB           ;
    Sleep1mks               ;

    movlw   Color_B         ; B
    movwf   PORTB           ;
    Sleep1mks               ;

    movlw   Color_Black     ;
    movwf   PORTB           ;
    Sleep3mks               ;

    bcf     PORTB, HBit     ;
    decfsz  CountLinesB, F  ;
    goto    ColorBands_Loop_HB      ;
    nop                     ; 

    ; выведем горизонтальную строку
    ;    |                                  |
    ; H: | |--\/\/\/\/\/\/\/\/\/\/\/\/\-|   |
    ;    | |                            |   |
    ;    |--                            ----|
    ;    |                                  |
    bsf     PORTB, HBit     ;
    movlw   Color_RGB       ;
    movwf   PORTB           ;
    goto    EndOfRoutine    ; +2
;----------------------------------------------------------------------------

;----------------------------------------------------------------------------
; белое поле
;----------------------------------------------------------------------------
WhiteField:
    Sleep10mks              ;
    Sleep4mks               ;
    movlw   D'239'          ; 
    movwf   CountLinesT     ; делим экран на 2 части
    movwf   CountLinesB     ; 
    movlw   Color_Black     ;
    movwf   PORTB           ;
    bcf     PORTB, HBit     ;
    Sleep3mks               ;

    ; выводим верхнюю половину экрана
    ;    |                                  |
    ; H: | |---WWWWWWWWWWWWWWWWWWWWW----|   |
    ;    | |                            |   |
    ;    |--                            ----|
    ;    |                                  |
White_Loop_HT:
    bsf     PORTB, HBit     ;
    Sleep1mks               ;

    ; выводим белый фон
    movlw   Color_RGB       ; R G B
    movwf   PORTB           ;
    Sleep10mks              ;
    Sleep9mks               ;

    movlw   Color_Black     ; Black
    movwf   PORTB           ;
    Sleep3mks               ;

    bcf     PORTB, HBit     ;
    decfsz  CountLinesT, F  ;
    goto    White_Loop_HT   ;
    nop                     ; 

    ; выводим нижнюю половину экрана
White_Loop_HB:
    bsf     PORTB, HBit     ;
    Sleep1mks               ; 

    ; выводим цветные полосы 
    movlw   Color_RGB       ; R G B
    movwf   PORTB           ;
    Sleep1mks               ; 

    movlw   Color_RG        ; R G
    movwf   PORTB           ;
    Sleep1mks               ;

    movlw   Color_RB        ; R B
    movwf   PORTB           ;
    Sleep1mks               ;

    movlw   Color_R         ; R
    movwf   PORTB           ;
    Sleep1mks               ;

    movlw   Color_GB        ; G B
    movwf   PORTB           ;
    Sleep1mks               ;

    movlw   Color_G         ; G
    movwf   PORTB           ;
    Sleep1mks               ;

    movlw   Color_B         ; B
    movwf   PORTB           ;
    Sleep1mks               ;

    movlw   Color_Black     ;
    movwf   PORTB           ;
    Sleep3mks               ;

    bcf     PORTB, HBit     ;
    decfsz  CountLinesB, F  ;
    goto    White_Loop_HB   ;
    nop                     ; 

    ; выведем горизонтальную строку
    ;    |                                  |
    ; H: | |--\/\/\/\/\/\/\/\/\/\/\/\/\-|   |
    ;    | |                            |   |
    ;    |--                            ----|
    ;    |                                  |
    bsf     PORTB, HBit     ;
    movlw   Color_RGB       ;
    movwf   PORTB           ;
    goto    EndOfRoutine    ;
;----------------------------------------------------------------------------

;----------------------------------------------------------------------------
; красное поле
;----------------------------------------------------------------------------
RedField:
    Sleep10mks              ;
    Sleep4mks               ;
    movlw   D'239'          ; 
    movwf   CountLinesT     ; делим экран на 2 части
    movwf   CountLinesB     ; 
    movlw   Color_Black     ;
    movwf   PORTB           ;
    bcf     PORTB, HBit     ;
    Sleep3mks               ;

    ; выводим верхнюю половину экрана
    ;    |                                  |
    ; H: | |---RRRRRRRRRRRRRRRRRRRRR----|   |
    ;    | |                            |   |
    ;    |--                            ----|
    ;    |                                  |
Red_Loop_HT:
    bsf     PORTB, HBit     ;
    Sleep1mks               ;

    ; выводим красный фон
    movlw   Color_R         ; R
    movwf   PORTB           ;
    Sleep10mks              ; 
    Sleep9mks               ;

    movlw   Color_Black     ; Black
    movwf   PORTB           ;
    Sleep3mks               ;

    bcf     PORTB, HBit     ;
    decfsz  CountLinesT, F  ;
    goto    Red_Loop_HT     ;
    nop                     ; 

    ; выводим нижнюю половину экрана
Red_Loop_HB:
    bsf     PORTB, HBit     ;
    Sleep1mks               ; 

    ; выводим цветные полосы    
    movlw   Color_RGB       ; R G B
    movwf   PORTB           ;
    Sleep1mks               ; 

    movlw   Color_RG        ; R G
    movwf   PORTB           ;
    Sleep1mks               ;

    movlw   Color_RB        ; R B
    movwf   PORTB           ;
    Sleep1mks               ;

    movlw   Color_R         ; R
    movwf   PORTB           ;
    Sleep1mks               ;

    movlw   Color_GB        ; G B
    movwf   PORTB           ;
    Sleep1mks               ;

    movlw   Color_G         ; G
    movwf   PORTB           ;
    Sleep1mks               ;

    movlw   Color_B         ; B
    movwf   PORTB           ;
    Sleep1mks               ;

    movlw   Color_Black     ;
    movwf   PORTB           ;
    Sleep3mks               ;

    bcf     PORTB, HBit     ;
    decfsz  CountLinesB, F  ;
    goto    Red_Loop_HB     ;
    nop                     ; 

    ; выведем горизонтальную строку
    ;    |                                  |
    ; H: | |--\/\/\/\/\/\/\/\/\/\/\/\/\-|   |
    ;    | |                            |   |
    ;    |--                            ----|
    ;    |                                  |
    bsf     PORTB, HBit     ;
    movlw   Color_RGB       ;
    movwf   PORTB           ;
    goto    EndOfRoutine    ;
;----------------------------------------------------------------------------

;----------------------------------------------------------------------------
; зеленое поле
;----------------------------------------------------------------------------
GreenField:
    Sleep10mks              ;
    Sleep4mks               ;
    movlw   D'239'          ; 
    movwf   CountLinesT     ; делим экран на 2 части
    movwf   CountLinesB     ; 
    movlw   Color_Black     ;
    movwf   PORTB           ;
    bcf     PORTB, HBit     ;
    Sleep3mks               ;

    ; выводим верхнюю половину экрана
    ;    |                                  |
    ; H: | |---GGGGGGGGGGGGGGGGGGGGG----|   |
    ;    | |                            |   |
    ;    |--                            ----|
    ;    |                                  |
Green_Loop_HT:
    bsf     PORTB, HBit     ;
    Sleep1mks               ;

    ; выводим зеленый фон
    movlw   Color_G         ; G
    movwf   PORTB           ;
    Sleep10mks              ; 
    Sleep9mks               ;

    movlw   Color_Black     ; Black
    movwf   PORTB           ;
    Sleep3mks               ;

    bcf     PORTB, HBit     ;
    decfsz  CountLinesT, F  ;
    goto    Green_Loop_HT   ;
    nop                     ; 

    ; выводим нижнюю половину экрана
Green_Loop_HB:
    bsf     PORTB, HBit     ;
    Sleep1mks               ; 

    ; выводим цветные полосы 
    movlw   Color_RGB       ; R G B
    movwf   PORTB           ;
    Sleep1mks               ; 

    movlw   Color_RG        ; R G
    movwf   PORTB           ;
    Sleep1mks               ;

    movlw   Color_RB        ; R B
    movwf   PORTB           ;
    Sleep1mks               ;

    movlw   Color_R         ; R
    movwf   PORTB           ;
    Sleep1mks               ;

    movlw   Color_GB        ; G B
    movwf   PORTB           ;
    Sleep1mks               ;

    movlw   Color_G         ; G
    movwf   PORTB           ;
    Sleep1mks               ;

    movlw   Color_B         ; B
    movwf   PORTB           ;
    Sleep1mks               ;

    movlw   Color_Black     ;
    movwf   PORTB           ;
    Sleep3mks               ;

    bcf     PORTB, HBit     ;
    decfsz  CountLinesB, F  ;
    goto    Green_Loop_HB   ;
    nop                     ; 

    ; выведем горизонтальную строку
    ;    |                                  |
    ; H: | |--\/\/\/\/\/\/\/\/\/\/\/\/\-|   |
    ;    | |                            |   |
    ;    |--                            ----|
    ;    |                                  |
    bsf     PORTB, HBit     ;
    movlw   Color_RGB       ;
    movwf   PORTB           ;
    goto    EndOfRoutine    ;
;----------------------------------------------------------------------------

;----------------------------------------------------------------------------
; синее поле
;----------------------------------------------------------------------------
BlueField:
    Sleep10mks              ;
    Sleep4mks               ;
    movlw   D'239'          ; 
    movwf   CountLinesT     ; делим экран пополам
    movwf   CountLinesB     ; 
    movlw   Color_Black     ;
    movwf   PORTB           ;
    bcf     PORTB, HBit     ;
    Sleep3mks               ;

    ; выводим верхнюю половину экрана
    ;    |                                  |
    ; H: | |---BBBBBBBBBBBBBBBBBBBBB----|   |
    ;    | |                            |   |
    ;    |--                            ----|
    ;    |                                  |
Blue_Loop_HT:
    bsf     PORTB, HBit     ;
    Sleep1mks               ;

    ; выводим синий фон
    movlw   Color_B         ; B
    movwf   PORTB           ;
    Sleep10mks              ; 
    Sleep9mks               ;

    movlw   Color_Black     ; Black
    movwf   PORTB           ;
    Sleep3mks               ;

    bcf     PORTB, HBit     ;
    decfsz  CountLinesT, F  ;
    goto    Blue_Loop_HT    ;
    nop                     ; 

    ; выводим нижнюю половину экрана
Blue_Loop_HB:
    bsf     PORTB, HBit     ;
    Sleep1mks               ; 

    ; выводим цветные полосы    
    movlw   Color_RGB       ; R G B
    movwf   PORTB           ;
    Sleep1mks               ; 

    movlw   Color_RG        ; R G
    movwf   PORTB           ;
    Sleep1mks               ;

    movlw   Color_RB        ; R B
    movwf   PORTB           ;
    Sleep1mks               ;

    movlw   Color_R         ; R
    movwf   PORTB           ;
    Sleep1mks               ;

    movlw   Color_GB        ; G B
    movwf   PORTB           ;
    Sleep1mks               ;

    movlw   Color_G         ; G
    movwf   PORTB           ;
    Sleep1mks               ;

    movlw   Color_B         ; B
    movwf   PORTB           ;
    Sleep1mks               ;

    movlw   Color_Black     ;
    movwf   PORTB           ;
    Sleep3mks               ;

    bcf     PORTB, HBit     ;
    decfsz  CountLinesB, F  ;
    goto    Blue_Loop_HB    ;
    nop                     ; 

    ; выведем горизонтальную строку
    ;    |                                  |
    ; H: | |--\/\/\/\/\/\/\/\/\/\/\/\/\-|   |
    ;    | |                            |   |
    ;    |--                            ----|
    ;    |                                  |
    bsf     PORTB, HBit     ;
    movlw   Color_RGB       ;
    movwf   PORTB           ;
    goto    EndOfRoutine    ;
;----------------------------------------------------------------------------

;----------------------------------------------------------------------------
; "зебра"
;----------------------------------------------------------------------------
Zebra:
    Sleep10mks              ;
    Sleep4mks               ;
    movlw   D'239'          ; 
    movwf   CountLinesT     ; делим экран на 2 части
    movwf   CountLinesB     ; +3
    movlw   Color_Black     ;
    movwf   PORTB           ;
    bcf     PORTB, HBit     ;
    Sleep3mks               ;

    ; выводим верхнюю половину экрана
    ;    |                                  |
    ; H: | |---WWW---WWW---WWW---WWW----|   |
    ;    | |                            |   |
    ;    |--                            ----|
    ;    |                                  |
Zebra_Loop_HT:
    bsf     PORTB, HBit     ;
    Sleep1mks               ;

    ; выводим чередующиеся белые и черные полосы
    movlw   Color_RGB       ; R G B
    movwf   PORTB           ;
    Sleep1mks               ; 

    movlw   Color_Black     ; 
    movwf   PORTB           ;
    Sleep1mks               ;

    movlw   Color_RGB       ; R G B 
    movwf   PORTB           ;
    Sleep1mks               ;

    movlw   Color_Black     ; 
    movwf   PORTB           ;
    Sleep1mks               ;

    movlw   Color_RGB       ; R G B
    movwf   PORTB           ;
    Sleep1mks               ;

    movlw   Color_Black     ; 
    movwf   PORTB           ;
    Sleep1mks               ;

    movlw   Color_RGB       ; 
    movwf   PORTB           ;
    Sleep1mks               ;

    movlw   Color_Black     ;
    movwf   PORTB           ;
    Sleep3mks               ;

    bcf     PORTB, HBit     ;
    decfsz  CountLinesT, F  ;
    goto    Zebra_Loop_HT   ;
    nop                     ; 

    ; выводим нижнюю половину экрана
Zebra_Loop_HB:
    bsf     PORTB, HBit     ;
    Sleep1mks               ; 

    ; выводим цветные полосы    
    movlw   Color_RGB       ; R G B
    movwf   PORTB           ;
    Sleep1mks               ; 

    movlw   Color_RG        ; R G
    movwf   PORTB           ;
    Sleep1mks               ;

    movlw   Color_RB        ; R B
    movwf   PORTB           ;
    Sleep1mks               ;

    movlw   Color_R         ; R
    movwf   PORTB           ;
    Sleep1mks               ;

    movlw   Color_GB        ; G B
    movwf   PORTB           ;
    Sleep1mks               ;

    movlw   Color_G         ; G
    movwf   PORTB           ;
    Sleep1mks               ;

    movlw   Color_B         ; B
    movwf   PORTB           ;
    Sleep1mks               ;

    movlw   Color_Black     ;
    movwf   PORTB           ;
    Sleep3mks               ;

    bcf     PORTB, HBit     ;
    decfsz  CountLinesB, F  ;
    goto    Zebra_Loop_HB   ;
    nop                     ; 

    ; выведем горизонтальную строку
    ;    |                                  |
    ; H: | |--\/\/\/\/\/\/\/\/\/\/\/\/\-|   |
    ;    | |                            |   |
    ;    |--                            ----|
    ;    |                                  |
    bsf     PORTB, HBit     ;
    movlw   Color_RGB       ;
    movwf   PORTB           ;
    goto    EndOfRoutine    ;
;----------------------------------------------------------------------------

;----------------------------------------------------------------------------
; шахматное поле
;----------------------------------------------------------------------------
Chess:                      
    Sleep10mks              ;
    movlw   D'238'          ; 
    movwf   CountLinesT     ; делим экран пополам
    movwf   CountLinesB     ; 
    movlw   D'80'           ; высота одной линии шахматного поля
    movwf   CountLines1     ;
    movwf   CountLines2     ;
    movwf   CountLines3     ;
    movlw   Color_Black     ;
    movwf   PORTB           ;
    bcf     PORTB, HBit     ;
    Sleep3mks               ;

    ; выводим верхнюю половину экрана
    ;    |                                  |
    ; H: | |---WWW---WWW---WWW---WWW----|   |
    ;    | |   ---WWW---WWW---WWW---    |   |
    ;    |--   WWW---WWW---WWW---WWW    ----|
    ;    |                                  |
Chess_Loop_H1:
    bsf     PORTB, HBit     ;
    Sleep1mks               ;

    ; выводим чередующиеся черные и белые полосы
    movlw   Color_RGB       ; R G B
    movwf   PORTB           ;
    Sleep1mks               ; 

    movlw   Color_Black     ; 
    movwf   PORTB           ;
    Sleep1mks               ;

    movlw   Color_RGB       ; R G B 
    movwf   PORTB           ;
    Sleep1mks               ;

    movlw   Color_Black     ; 
    movwf   PORTB           ;
    Sleep1mks               ;

    movlw   Color_RGB       ; R G B
    movwf   PORTB           ;
    Sleep1mks               ;

    movlw   Color_Black     ; 
    movwf   PORTB           ;
    Sleep1mks               ;

    movlw   Color_RGB       ; 
    movwf   PORTB           ;
    Sleep1mks               ;

    movlw   Color_Black     ;
    movwf   PORTB           ;
    Sleep3mks               ;

    bcf     PORTB, HBit     ;
    decfsz  CountLines1, F  ;
    goto    Chess_Loop_H1   ;
    nop                     ; 

Chess_Loop_H2:
    bsf     PORTB, HBit     ;
    Sleep1mks               ;

    ; выводим чередующиеся черные и белые полосы
    movlw   Color_Black     ; 
    movwf   PORTB           ;
    Sleep1mks               ; 

    movlw   Color_RGB       ; R G B
    movwf   PORTB           ;
    Sleep1mks               ;

    movlw   Color_Black     ; 
    movwf   PORTB           ;
    Sleep1mks               ;

    movlw   Color_RGB       ; R G B 
    movwf   PORTB           ;
    Sleep1mks               ;

    movlw   Color_Black     ; 
    movwf   PORTB           ;
    Sleep1mks               ;

    movlw   Color_RGB       ; R G B
    movwf   PORTB           ;
    Sleep1mks               ;

    movlw   Color_Black     ;
    movwf   PORTB           ;
    Sleep6mks               ;

    bcf     PORTB, HBit     ;
    decfsz  CountLines2, F  ;
    goto    Chess_Loop_H2   ;
    nop                     ; 

Chess_Loop_H3:
    bsf     PORTB, HBit     ;
    Sleep1mks               ;

    ; выводим чередующиеся черные и белые полосы
    movlw   Color_RGB       ; R G B
    movwf   PORTB           ;
    Sleep1mks               ; 

    movlw   Color_Black     ; 
    movwf   PORTB           ;
    Sleep1mks               ;

    movlw   Color_RGB       ; R G B 
    movwf   PORTB           ;
    Sleep1mks               ;

    movlw   Color_Black     ; 
    movwf   PORTB           ;
    Sleep1mks               ;

    movlw   Color_RGB       ; R G B
    movwf   PORTB           ;
    Sleep1mks               ;

    movlw   Color_Black     ; 
    movwf   PORTB           ;
    Sleep1mks               ;

    movlw   Color_RGB       ; 
    movwf   PORTB           ;
    Sleep1mks               ;

    movlw   Color_Black     ;
    movwf   PORTB           ;
    Sleep3mks               ;

    bcf     PORTB, HBit     ;
    decfsz  CountLines3, F  ;
    goto    Chess_Loop_H3   ;
    nop                     ; 

    ; выводим нижнюю половину экрана
Chess_Loop_HB:
    bsf     PORTB, HBit     ;
    Sleep1mks               ; 

    ; выводим цветные полосы 
    movlw   Color_RGB       ; R G B
    movwf   PORTB           ;
    Sleep1mks               ; 

    movlw   Color_RG        ; R G
    movwf   PORTB           ;
    Sleep1mks               ;

    movlw   Color_RB        ; R B
    movwf   PORTB           ;
    Sleep1mks               ;

    movlw   Color_R         ; R
    movwf   PORTB           ;
    Sleep1mks               ;

    movlw   Color_GB        ; G B
    movwf   PORTB           ;
    Sleep1mks               ;

    movlw   Color_G         ; G
    movwf   PORTB           ;
    Sleep1mks               ;

    movlw   Color_B         ; B
    movwf   PORTB           ;
    Sleep1mks               ;

    movlw   Color_Black     ;
    movwf   PORTB           ;
    Sleep3mks               ;

    bcf     PORTB, HBit     ;
    decfsz  CountLinesB, F  ;
    goto    Chess_Loop_HB   ;
    nop                     ; 

    ; выведем горизонтальную строку
    ;    |                                  |
    ; H: | |--\/\/\/\/\/\/\/\/\/\/\/\/\-|   |
    ;    | |                            |   |
    ;    |--                            ----|
    ;    |                                  |
    bsf     PORTB, HBit     ;
    movlw   Color_RGB       ;
    movwf   PORTB           ;
    goto    EndOfRoutine    ; 
;----------------------------------------------------------------------------

;----------------------------------------------------------------------------
; сетка
;----------------------------------------------------------------------------
Grid:
    Sleep10mks              ;
    movlw   D'5'            ; 
    movwf   CountLinesT     ; 
    movwf   CountLinesB     ; число горизонтальных линий - 1
    movlw   D'36'           ; расстояние от верха экрана до первой линии
    movwf   CountLinesT     ;
    movlw   D'37'           ; расстояние от нижней линии до низа экрана
    movwf   CountLines1     ;
    movlw   Color_Black     ;
    movwf   PORTB           ;
    bcf     PORTB, HBit     ;
    Sleep3mks               ;

    ; выводим верхнюю половину экрана
    ;    |                                  |
    ; H: | |---|---|---|---|---|---|----|   |
    ;    | |   |   |   |   |   |   |    |   |
    ;    |--   |   |   |   |   |   |    ----|
    ;    |                                  |
Grid_Loop_HT:
    bsf     PORTB, HBit     ;

    ; выводим вертикальные линии
    movlw   Color_Black     ;
    movwf   PORTB           ;
    movlw   Line_RGB        ; R G B
    movwf   PORTB           ;

    movlw   Color_Black     ;
    movwf   PORTB           ;
    movlw   Line_RGB        ; R G B
    movwf   PORTB           ;

    movlw   Color_Black     ;
    movwf   PORTB           ;
    movlw   Line_RGB        ; R G B
    movwf   PORTB           ;

    movlw   Color_Black     ;
    movwf   PORTB           ;
    movlw   Line_RGB        ; R G B
    movwf   PORTB           ;

    movlw   Color_Black     ;
    movwf   PORTB           ;
    movlw   Line_RGB        ; R G B
    movwf   PORTB           ;

    movlw   Color_Black     ;
    movwf   PORTB           ;
    movlw   Line_RGB        ; R G B
    movwf   PORTB           ;

    movlw   Color_Black     ;
    movwf   PORTB           ;
    Sleep1mks               ;

    bcf     PORTB, HBit     ;
    decfsz  CountLinesT, F  ;
    goto    Grid_Loop_HT    ;
    nop                     ; 

    ; выведем горизонтальную линию
    ;    |                                  |
    ; H: | |--\/\/\/\/\/\/\/\/\/\/\/\/\-|   |
    ;    | |                            |   |
    ;    |--                            ----|
    ;    |                                  |
    bsf     PORTB, HBit     ;
    movlw   Color_RGB       ;
    movwf   PORTB           ;
    Sleep10mks              ;
    Sleep6mks               ;
    Sleep5mks               ;
    movlw   D'100'          ; расстояние между горизонтальными линиями сетки
    movwf   CountLinesT     ;
    movlw   Color_Black     ;
    movwf   PORTB           ;
    bcf     PORTB, HBit     ;
    decfsz  CountLinesB, F  ;
    goto    Grid_Loop_HT    ;
    nop                     ;

    ; выводим нижнюю половину экрана
    ;    |                                  |
    ; H: | |---|---|---|---|---|---|----|   |
    ;    | |   |   |   |   |   |   |    |   |
    ;    |--   |   |   |   |   |   |    ----|
    ;    |                                  |
Grid_Loop_HB:
    bsf     PORTB, HBit     ;

    ; выводим вертикальные линии
    movlw   Color_Black     ;
    movwf   PORTB           ;
    movlw   Line_RGB        ; R G B
    movwf   PORTB           ;

    movlw   Color_Black     ;
    movwf   PORTB           ;
    movlw   Line_RGB        ; R G B
    movwf   PORTB           ;

    movlw   Color_Black     ;
    movwf   PORTB           ;
    movlw   Line_RGB        ; R G B
    movwf   PORTB           ;

    movlw   Color_Black     ;
    movwf   PORTB           ;
    movlw   Line_RGB        ; R G B
    movwf   PORTB           ;

    movlw   Color_Black     ;
    movwf   PORTB           ;
    movlw   Line_RGB        ; R G B
    movwf   PORTB           ;

    movlw   Color_Black     ;
    movwf   PORTB           ;
    movlw   Line_RGB        ; R G B
    movwf   PORTB           ;

    movlw   Color_Black     ;
    movwf   PORTB           ;
    Sleep1mks               ;

    bcf     PORTB, HBit     ;
    decfsz  CountLines1, F  ;
    goto    Grid_Loop_HB    ;
    nop                     ; 

    ; выведем горизонтальную строку
    ;    |                                  |
    ; H: | |--\/\/\/\/\/\/\/\/\/\/\/\/\-|   |
    ;    | |                            |   |
    ;    |--                            ----|
    ;    |                                  |
    bsf     PORTB, HBit     ;
    movlw   Color_RGB       ;
    movwf   PORTB           ;
    goto    EndOfRoutine    ;
;----------------------------------------------------------------------------

;----------------------------------------------------------------------------
; концовка всех п.п.
;----------------------------------------------------------------------------
EndOfRoutine:
    Sleep10mks              ;
    Sleep5mks               ;
    Sleep6mks               ;
    movlw   Color_Black     ;
    movwf   PORTB           ;
    bcf     PORTB, HBit     ;
    Sleep3mks               ;

    ; выведем нижнюю часть экрана
    ;    |                                  |
    ; H: | |--|||||||||||||||||||||||||-|   |
    ;    | |                            |   |
    ;    |--                            ----|
    ;    |                                  |
    Blank   Color_Black, CountBottom    ; 

    bsf     PORTB, HBit     ;
    Sleep10mks              ;
    Sleep10mks              ;
    Sleep6mks               ;

    ; переходим к следующему кадру
    bcf     PORTB, VBit     ; VSync
    bcf     PORTB, HBit     ; HSync
    Sleep3mks               ;
    bsf     PORTB, HBit     ;

    ; проверим на нажатие кнопки переключения номера теста
Check_Select:               
    btfsc   PORTA, ModeBit          ; +1(2)
    goto    ReleaseBtn              ; +2
    btfss   Flags, BtnPressModeBit  ; +1(2)
    incf    RoutineID, F            ; +1
    bsf     Flags, BtnPressModeBit  ; +1
    Sleep2mks                       ; +2
    goto    Select                  ; +2 = 2 + 2 + 1 + 2 = 7 + 2 = 9

ReleaseBtn:
    bcf     Flags, 0                ; +1
    Sleep3mks                       ;
    goto    Select                  ; +2 = 1 + 2 + 1 + 2 = 6 + 3 = 9
;----------------------------------------------------------------------------

;----------------------------------------------------------------------------
; п.п. задержки
;----------------------------------------------------------------------------
Delay10mks:                 ; +2
    nop                     ;
Delay9mks:
    nop                     ;
Delay8mks:
    nop                     ;
Delay7mks:
    nop                     ;
Delay6mks:
    nop                     ;
Delay5mks:
    nop                     ;
Delay4mks:
    return                  ; +2
;----------------------------------------------------------------------------

;----------------------------------------------------------------------------
; п.п. инициализации МК
;----------------------------------------------------------------------------
Init:
    clrf    PORTB           ; PORTB = 00000000
    bsf     STATUS, RP0     ; установить бит RP0 регистра STATUS, - выберем банк 1
    clrf    TRISB           ; переключим выводы порта B на вывод
    bsf     TRISA, 0        ; установим вывод 0 порта A на ввод
    bcf     STATUS, RP0     ; сбросить бит RP0 регистра STATUS, - выберем банк 0
    clrf    Flags           ; очистим флаги
    clrf    RoutineID       ; начнем с первого теста
    bsf     PORTA, ModeBit  ; пусть кнопка выбора номера теста отжата
    movlw   Color_Black     ; установим черный цвет
    movwf   PORTB           ;
    return                  ;
;----------------------------------------------------------------------------

;----------------------------------------------------------------------------
    end
;------------------------------- E N D  O F  F I L E ------------------------

Vadim Churkin (C) 2003.


Hosted by uCoz