Subversion Repositories pentevo

Rev

Rev 537 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
538 lvd 1
; Пример чтения фонтрома в пентеве
;
; (c) lvd^nedopc 2012
;
; сорец для аласма

START   EQU     #6000
        ORG     START

        DI 

        LD      A,1
        OUT     (#FE),A

        XOR     A
        OUT     (#BF),A

        LD      BC,#EFF7
        OUT     (C),A   ;ставим ефф7, который доступен только в нешедоу-режиме

        INC     A
        OUT     (#BF),A

        LD      A,#07
        LD      BC,#FF77
        OUT     (C),A     ;включаем новый пентевный текстмод - 1-страничный
                          ; заодно ефф7 и фф77 ставят нам 7 МГц частоту

        CALL    OUTPAGE   ;выводим все символы на экран

LOOP
        CALL    SYNCREAD   ;считываем фонтром методом чтения байтиков, которые на экране
        CALL    DECODEFONT ; перекодируем в обычный формат фонтрома
        CALL    INVERTFONT ; инвертируем все байты фонта
        CALL    WRITEFONT  ; пишем взад

        LD      A,#7F
        IN      A,(#FE)
        RRA 
        JR      C,LOOP     ;итого всё мигает пока не нажмём any key


        LD      A,#FF
        LD      BC,#FFF7
        OUT     (C),A

        LD      A,#03
        LD      C,#77
        OUT     (C),A ; восстанавливаем 6912-режим



        XOR     A
        OUT     (#BF),A ;закрываем шедоу

        RET 



OUTPAGE
        LD      A,#7F-8    ;где находится 1страничный текстмод (см доку)
        LD      BC,#FFF7
        OUT     (C),A

        LD      HL,#C000   ; ставим атрибуты. Не обязательно, чтоб символы были видимы,
        LD      DE,#C001   ; можно нафигачить нулей
        LD      (HL),#05
        LD      BC,#3FFF
        LDIR 

        XOR     A         ; код печатаемого символа
        LD      HL,#C1C0  ; откуда начинаем печатать
        LD      DE,64-40
        LD      C,25      ; сколько строк печатаем. Достаточно напечатать 16 строк сверху.
STRLOOP
        LD      B,80/5
SYMLOOP
        CALL    PRINC  ; повторяем каждый символ 5 раз
        CALL    PRINC 
        CALL    PRINC
        CALL    PRINC
        CALL    PRINC

        INC     A 

        DJNZ    SYMLOOP

        ADD     HL,DE ; смещение на следующую строку

        DEC     C
        JR      NZ,STRLOOP

        RET 

PRINC   ; печатаем символ и апдейтим указатель в HL на следующий символ
        LD      (HL),A
        BIT     4,H
        SET     4,H
        RET     Z
        RES     4,H
        INC     HL
        RET 





SYNCREAD

        ; эта процедура должна выполняться при частоте процессора 7 МГц!!!!!!!


        ; сначала включаем IM 2 и делаем таблички для него
        DI 
        IM      2   

        ; setup IM2 tables

        LD      HL,INTTAB
        LD      A,H
        LD      I,A
        INC     A

        LD      (HL),A
        INC     L
        JR      NZ,$-2

        INC     H
        LD      (HL),A

        LD      L,H
        LD      (HL),#C3 ; JP
        INC     HL
        LD      (HL),.INTPROC
        INC     HL
        LD      (HL),'INTPROC


        LD      HL,FREAD ; заранее ставим куда будем читать фонт

        EI   
        HALT 
        EI 
        HALT ; делаем халт чтоб после инта и задержки попасть чтением спецпорта прямо
             ; в момент начала отображения символов. делаем халт 2 раза, чтоб убедиццо,
             ; что инт будет схвачен в своем начале, а не в середине.
             ; обработчик инта - сначала JP, потом RET.




        ; делаем задержку до момента отображения первого символа. Он повторяется 5 раз,
        ; а первая команда INI попадает циклом ввода примерно в середину этих
        ; 5 символов
        LD      BC,0
        LD      B,2
        DJNZ    $
        LD      D,76
LINWAIT
        LD      BC,256*33
        DJNZ    $
        DEC     D
        JP      NZ,LINWAIT
        LD      BC,#0EBE  ; заодно в процессе задержки грузим адрес порта
        LD      D,128     ; и счётчик для 128 строк


READLOOP
        ; читаем 16 байт. Как раз INI:INC B выполняется за 20 тактов, и 5 символов
        ; длятся тоже 20 тактов (@7MHz nowait)
       DUP     16
        INI 
        INC     B
       EDUP 

        LD      E,7    ; просираем оставшееся время строки
        DEC     E
        JR      NZ,$-1

        DEC     D
        JP      NZ,READLOOP ; итого весь этот луп занимает 448 тактов


        ; всё считали, идём на йух...
        DI 
        IM      1
        RET 

INTPROC ; обработчег инта :)
        RET 




DECODEFONT
        
        ; перекодируем считанный фонт в обычный формат

        LD      HL,FREAD
        LD      DE,FONT


        LD      HX,16
DF256L
        LD      LX,16
DF16L
        LD      BC,16
       DUP     8
        LD      A,(HL)
        ADD     HL,BC
        LD      (DE),A
        INC     DE
       EDUP 

        LD      BC,1-128
        ADD     HL,BC

        DEC     LX
        JR      NZ,DF16L

        LD      BC,128-16
        ADD     HL,BC

        DEC     HX
        JR      NZ,DF256L

        RET 



INVERTFONT

        ; инвертируем фонт

        LD      HL,FONT
        LD      BC,2048
IFLOOP
        LD      A,(HL)
        CPL 
        LD      (HL),A
        CPI 
        JP      PE,IFLOOP

        RET 



WRITEFONT

        ; пишем фонт обратно в фонтром

        LD      A,#05
        OUT     (#BF),A

        LD      HL,FONT
        LD      DE,FLDIR ; лдирим из озу в озу -- всё работает
        LD      BC,2048
        LDIR 

        LD      A,1
        OUT     (#BF),A
        RET 



        ORG     ($+255)&#FF00
INTTAB
        DS      512


FREAD   DS      2048
FONT    DS      2048

FLDIR   EQU     FONT & #F800

ENDD
        ORG     START