ZX Review #7-8-9-10
08 ноября 1997

Этюды - Драйвер экрана для печати по 64 символа в строке.

(c) Байтуллин Тимур, г.Рязань

   Предлагаю   вашим   читателям
драйвер экрана для печати по  64
символа в строке. Вкратце о нем.
Чтобы вывести символ или  управ-
ляющий  код, вызываете  подпрог-
рамму PR64 с кодом символа в ре-
гистре A. Управляющие коды:

13 - ENTER
3 - HOME (AT 0,0)
22, строка, столбец - установка
    позиции печати (строка =
    0..23, столбец = 0..63)
4 - INVERSE 1
5 - INVERSE 0
8 - сохранить позицию курсора
9 - восстановить позицию курсора

   Коды 8  и  9  используют вну-
тренний стек драйвера (на 32 со-
хранения).

   Символы для драйвера  хранят-
ся в памяти в обычном формате, в
левой половине знакоместа. Драй-
вер использует регистры  AF, BC,
DE и HL.  Переменные, помеченные
звездочкой, должны располагаться
в памяти так, как они  заданы  в
программе, т.к. используется  их
косвенная адресация. Адрес шриф-
та задается обычным  способом  в
ячейке 23606.

   Дорогая редакция!  Напечатай-
те, пожалуйста, мой адрес.  Буду
рад переписываться  насчет  сис-
темных программ, MULTICOLOR'а, а
также о теории и  практике  ком-
прессии данных (особенно интере-
суюсь методом LZSS/PACK).

   Мой адрес:  390029  г.Рязань,
ул.Весенняя, д.9/1, кв.29.
140.
3;64x24 DRIVER
3;(C) 1996 TIM BYTE

PR64    LD   HL,STATE
        LD   C,(HL)
        BIT  0,C
        JR   NZ,DOAT
        CP   32
        JP   NC,PRSYM
        CP   22
        JR   NZ,PR0
        LD   (HL),3
        RET
DOAT    BIT  1,C
        JR   Z,DO2
        CP   24
        JR   NC,FAIL
        LD   (DCOR),A
        LD   (HL),1
        RET
DO2     CP   64
        JR   NC,FAIL
        LD   (STLB),A
        LD   A,(DCOR)
        LD   (STRK),A
        LD   (HL),0
        JP   GETADR
FAIL    LD   (HL),0
        RET
PR0     CP   13
        LD   HL,STLB
        JR   Z,CR
        CP   3
        JR   Z,HOME
        CP   4
        JR   Z,ION
        CP   5
        JP   Z,IOFF
        CP   8
        JP   Z,SAVCO
        CP   9
        JP   Z,RESCO
        RET
CR      LD   (HL),0
        DEC  HL
        INC  (HL)
        LD   A,(HL)
        CP   24
        JR   NZ,GETADR
        LD   (HL),0
;или LD (HL),23
        CALL SCROLL
;SCROLL - процедура скроллинга
;экрана вверх
GETADR  LD   DE,(STRK)
        LD   A,E
        SRL  D
        AND  #18
        OR   #40
        LD   H,A
        LD   A,E
        AND  7
        OR   A
        DEFW #1F1F,#1F1F
        ADD  A,D
        LD   L,A
        LD   (SCADR),HL
        RET
HOME    LD   HL,0
        LD   (STRK),HL
        LD   H,#40
        LD   (SCADR),HL
        RET
IOFF    XOR  A
        LD   (INV1+1),A
        LD   (INV2+1),A
        RET
ION     LD   A,#F0
        LD   (INV1+1),A
        CPL
        LD   (INV2+1),A
        RET
PRSYM   LD   H,0
        LD   L,A
        LD   BC,(23606)
        DEFB 41,41,41,9
        EX   DE,HL
        LD   HL,(SCADR)
        LD   A,(STLB)
        AND  1
        JR   NZ,PR1
        LD   B,8
L1      LD   A,(HL)
        AND  #0F
        LD   C,A
        LD   A,(DE)
        OR   C
INV1    XOR  0
        LD   (HL),A
        INC  H
        INC  DE
        DJNZ L1
        LD   HL,STLB
        INC  (HL)
        RET
PR1     LD   B,8
L2      LD   A,(HL)
        AND  #F0
        LD   C,A
        LD   A,(DE)
        RLCA
        RLCA
        RLCA
        RLCA
        OR   C
INV2    XOR  0
        LD   (HL),A
        INC  H
        INC  DE
        DJNZ L2
        LD   HL,SCADR
        INC  (HL)
        DEC  HL
        INC  (HL)
        LD   A,(HL)
        CP   64
        RET  NZ
        JP   CR

SAVCO   LD   (ASP),SP
        DI
        LD   SP,(PBU)
        LD   HL,(STRK)
        PUSH HL
        LD   (PBU),SP
        LD   SP,(ASP)
        EI
        RET

RESCO   LD   (ASP),SP
        DI
        LD   SP,(PBU)
        POP  HL
        LD   (PBU),SP
        LD   SP,(ASP)
        EI
        LD   (STRK),HL
        JP   GETADR

STRK    NOP             ;*
STLB    NOP             ;*
SCADR   DEFW #4000      ;*
        DEFS 64
BUF     EQU  $
PBU     DEFW BUF
ASP     DEFW 0
STATE   NOP
DCOR    NOP
2
   Прим. ред.: Довольно интересная  проце-
дура. Только  хотим  заметить  один  факт.
Обратите  внимание,  что  в  подпрограммах
SAVCO и RESCO на время перестановки  стека
запрещаются прерывания. В оригинале  прог-
раммы этого не делалось, что могло привес-
ти  к  ошибке, если  в  момент, когда стек
переставлен, произойдет  прерывание.  Ведь
стек рассчитан всего лишь на  32  слова, и
если он будет заполнен хотя бы наполовину,
то выгруженные туда  программой  обработки
прерывания регистры затрут саму программу.
Для этого мы и вставили команды запрещения
прерывания.

           *   *   *





Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Железячки - Кое-что о CMOS-часах: доработанная схема от Alone Coder'a.
Пожелания - Пара слов вместо эпилога.
Реклама - Cамые новые игры, системные программы музыкальные демонстрации, электронные газеты и журналы для спектрума.

В этот день...   20 сентября