DEVICE ZXSPECTRUM1024
 
;VERA
 
;INTRO and SETUP
 
;
 
;15.12.07
 
;18.04.08
 
;29.04.08
 
;17.05.08
 
;18.05.08
 
;19.05.08
 
;23.05.08
 
;6.07.08
 
;7.08.08
 
;23.08.08
 
;24.08.08 - мой д/р :)
 
;25.08.08
 
;26.08.08
 
 
 
GAME=#7286 ;старт игры
 
KDEL=15    ;задержка автоповтора нажатия клавиши
 
QLINE=9    ;кол-во пунктов меню
 
QVALUE=7   ;кол-во изменяемых пунктов сетапа
 
LEN=17     ;Длина линейки выделения пункта
 
SET=23881  ;Адрес, где хранятся данные установок
 
 
 
;Корректируемые ячейки (установки) в игре
 
MOUSE   EQU #68C8 ;мышь
 
ROLL    EQU #692D ;колесо
 
SCANTYP EQU #69CF ;Джойстик/клава
 
MSPEED  EQU #68C0 ;ускорение курсора
 
MUSON   EQU #67FD ;музыка on/off
 
SOUND   EQU #F8FD ;звуки on/off, PG_MAP
 
 
 
;Страницы
 
PG_MAP  EQU 1
 
PG_MUZ  EQU 6
 
PG_VIEW EQU 7
 
 
 
MUSIC   EQU #D35E-100 ;адрес мелодии (-100 т.к. заголовок отруб)
 
MUSINI  EQU #D696     ;плеер инициализация
 
PLAY    EQU MUSINI+2  ;проигрывание одного кванта мелодии
 
MUTE    EQU MUSINI+5  ;заглушить музыку
 
 
 
;Токены в тексте
 
NCRD=1
 
BOLD=2
 
NORM=3
 
LINE=4
 
PAUS=5
 
CLS=6
 
BORDER=7
 
LINK=8  ;ссылка на строку текста, токены в ссылках не работают!
 
FATR=9  ;заполнить атрибуты экрана белым
 
;ENDL=9 ;конец линка
 
 
 
;По токенам смотри метку TITRES
 
 
 
;---
 
;       ORG GAME
 
;       RET
 
 
 
        ORG #6000
 
begin
 
        DISP #4040
 
 
 
IM2
 
        PUSH IX,IY,HL,DE,BC,AF
 
        EX AF,AF' ;'
 
        EXX 
 
        PUSH HL,DE,BC,AF
 
        LD A,(NUMPAGE)  ;Запоминаем номер текущ. стр.
 
        LD (RST_PG+1),A
 
 
 
        LD A,PG_MUZ
 
        CALL PAGE
 
        CALL PLAY   ;проигрываем мелодию
 
 
 
RST_PG  LD A,0
 
        CALL PAGE
 
;Выход из вторых прерываний
 
        POP AF,BC,DE,HL
 
        EX AF,AF' ;'
 
        EXX 
 
        POP AF,BC,DE,HL,IY,IX
 
        EI 
 
        RET 
 
 
 
;Начало работы интро
 
INTRO
 
 
 
;       CALL SETIM2
 
;       EI
 
;       LD A,PG_VIEW
 
;       CALL PAGE
 
;       LD HL,SCR
 
;       LD DE,#C000
 
;       LD BC,6912
 
;       LDIR
 
 
 
        DI 
 
        LD A,PG_MUZ
 
        CALL PAGE
 
        LD HL,MUSIC
 
        CALL MUSINI
 
 
 
        LD A,PG_VIEW
 
        CALL PAGE
 
 
 
        CALL SETIM2
 
 
 
        CALL FROMGAM
 
 
 
        LD HL,TITRES
 
        CALL PRINTFX
 
        JP TOGAME
 
 
 
;Установка вектора IM2
 
SETIM2
 
        DI 
 
        LD HL,IMVEC ;адрес вектора прерываний
 
        LD BC,256
 
        LD D,H
 
        LD E,B
 
        LD (HL),IM2/256
 
        LD A,H
 
        LDIR 
 
        LD I,A
 
        IM 2
 
        EI 
 
        RET 
 
 
 
;Установка вектора IM1
 
SETIM1
 
        DI 
 
        LD IY,23610
 
        LD A,63
 
        LD I,A
 
        IM 1
 
        EI 
 
        RET 
 
 
 
;Печать текста с обработкой токенов
 
PRINTFX
 
        CALL PRTEXT
 
        LD B,A
 
        AND A
 
        RET Z
 
        DJNZ NFX2
 
 
 
        LD E,(HL)     ;новые координаты
 
        INC HL
 
        LD D,(HL)
 
NFX1    INC HL
 
        JR PRINTFX
 
 
 
NFX2    DJNZ NFX3
 
        LD A,#0F      ;утолщенный
 
NFX2_   LD (PRNMOD),A
 
        JR PRINTFX
 
 
 
NFX3    DJNZ NFX4     ;нормальный
 
        XOR A
 
        JR NFX2_
 
 
 
NFX4    DJNZ NFX5
 
        PUSH DE
 
        LD E,(HL)     ;цветная линия
 
                      ;E-атрибут
 
        INC HL
 
        LD D,(HL)     ;D-Y коорд.
 
        PUSH HL
 
        CALL LINE3
 
        POP HL,DE
 
        JR NFX1
 
 
 
NFX5    DJNZ NFX6    ;пауза
 
        LD A,(HL)
 
        CALL PAUSE
 
        JR NFX1
 
 
 
NFX6    DJNZ NFX7    ;стирание экрана
 
        LD A,(HL)    ;Y размер
 
        LD (YSZ+1),A
 
        LD C,A
 
        INC HL
 
        LD A,(HL)    ;X размер
 
        LD (XSZ+1),A
 
        LD B,A
 
        INC HL
 
        LD A,(HL)
 
        LD (CSZ+1),A
 
        INC HL
 
        LD A,(HL)
 
        LD (CSZ+2),A
 
        PUSH DE,HL
 
        CALL CHANX
 
        CALL FILLATR
 
        POP HL,DE
 
        JR NFX1
 
 
 
NFX7    DJNZ NFX8    ;бордюр
 
        LD A,(HL)
 
        OUT (254),A
 
        JR NFX1
 
 
 
NFX8    DJNZ NFX9
 
        PUSH DE      ;ссылка на текст
 
        LD E,(HL)    ;нужна для печати одинаковых строк
 
        INC HL
 
        LD D,(HL)
 
        INC HL
 
        EX DE,HL
 
        LD B,D
 
        LD C,E
 
        POP DE
 
        PUSH BC
 
        CALL PRTEXT
 
        POP HL
 
        JR PRINTFX
 
 
 
NFX9    DJNZ NFX10   ;заполнение экрана атрибутом
 
        CALL FILLATR
 
NFX10   JR NFX1
 
 
 
;Начало работы установок
 
SETUPI
 
        XOR A
 
        LD (PRNMOD),A
 
 
 
        ;LD A,PG_VIEW
 
        ;CALL PAGE
 
 
 
        CALL CHANX
 
        CALL FILLATR
 
 
 
        LD DE,#0046
 
        CALL LINE3
 
 
 
        LD DE,#0B43
 
        CALL LINE3
 
 
 
        CALL LINE2
 
 
 
        LD DE,#0000
 
        LD HL,TEXT3
 
        CALL PRTEXT
 
 
 
        LD DE,#100B   ;D-X pix, E-Y znak
 
        LD HL,TEXT0
 
        CALL PRTEXT
 
 
 
        LD DE,#3C00
 
        LD HL,TEXT1
 
        CALL PRTEXT
 
 
 
REPRINT
 
        CALL SET_TXT
 
        LD DE,#B301
 
        LD HL,TEXT2
 
        CALL PRTEXT
 
 
 
;Опрос клавиш
 
KEYLP   HALT 
 
        LD BC,#BFFE
 
        IN A,(C)
 
        BIT 0,A
 
        JR Z,ENTER
 
 
 
        LD B,#FE    ;CS
 
        IN A,(C)
 
        BIT 0,A
 
        JR NZ,KEYLP2
 
 
 
        LD B,#EF
 
        IN A,(C)
 
        BIT 4,A
 
        JP Z,DOWN
 
 
 
        BIT 3,A
 
        JP Z,UP
 
 
 
        BIT 2,A
 
        JP Z,RIGHT
 
 
 
        LD B,#F7
 
        IN A,(C)
 
        BIT 4,A
 
        JR Z,LEFT
 
 
 
KEYLP2  LD A,KDEL
 
        LD (PRKEY+1),A
 
        JR KEYLP
 
 
 
;Проверка на автоповтор
 
PRKEY   LD A,KDEL
 
        DEC A
 
        RET Z        ;задержка кончилась
 
        LD (PRKEY+1),A
 
        CP KDEL-1
 
        RET Z        ;нажали первый раз
 
        POP BC       ;для корректировки SP
 
        JR KEYLP
 
 
 
ENTER   LD A,(NUMLINE)
 
        CP QVALUE
 
        JP Z,SAVE_SETUP
 
ENT_MOD JR C,RIGHT
 
 
 
        CALL FROMGAM ;Чтобы установки
 
                     ;остались прежними
 
 
 
TOGAME
 
        HALT 
 
        LD BC,#BFFE
 
        IN A,(C)
 
        BIT 0,A
 
        JR Z,TOGAME
 
 
 
        LD A,PG_VIEW
 
        CALL PAGE
 
        CALL CHANX
 
 
 
        CALL SETIM1
 
 
 
        LD A,PG_MUZ
 
        CALL PAGE
 
        CALL MUTE
 
 
 
;Корректируем игру
 
;в соответствии с установками
 
        LD HL,SETUP+1
 
        LD DE,4
 
        LD A,(HL)
 
        DEC A
 
        CPL 
 
        LD (MOUSE),A ;255 - мышь есть, 0 - нет
 
 
 
        ADD HL,DE
 
        LD A,(HL)
 
        DEC A
 
        JR Z,$+4
 
        LD A,201  ;RET  нет колеса
 
        LD (ROLL),A
 
 
 
        ADD HL,DE
 
        LD A,(HL)
 
        LD (SCANTYP),A
 
        ADD HL,DE
 
        ADD HL,DE
 
 
 
        LD A,(HL)
 
        LD (MSPEED),A
 
        ADD HL,DE
 
 
 
        LD A,(HL)
 
        XOR 1
 
        LD (MUSON),A
 
 
 
        LD A,PG_MAP
 
        CALL PAGE
 
        ADD HL,DE
 
        LD A,(HL)
 
        DEC A
 
        JR Z,$+4
 
        LD A,201  ;RET  нет звуков
 
        LD (SOUND),A
 
 
 
        JP GAME   ;Стартуем игру!
 
 
 
LEFT
 
        CALL PRKEY
 
        LD C,-1
 
        CALL CH_VALUE
 
;       CALL LINE
 
        JP REPRINT
 
 
 
RIGHT
 
        CALL PRKEY
 
        LD C,1
 
        CALL CH_VALUE
 
;       CALL LINE
 
        JP REPRINT
 
 
 
UP
 
        LD BC,#0101
 
        JR DOWN+3
 
 
 
DOWN
 
        LD BC,#FFFF
 
        LD DE,(COORD)
 
        CALL PRKEY
 
        LD HL,(NUMLINE)
 
        LD A,H
 
        SUB B
 
        LD H,A
 
        LD A,L
 
        SUB C
 
        LD L,A
 
        CP #FF
 
        JP Z,KEYLP
 
        CP QLINE
 
        JP Z,KEYLP
 
        LD (NUMLINE),HL
 
;       CALL SCR_ADR2
 
        EX DE,HL
 
        CALL LINE2+3
 
        CALL LINE2
 
        JP KEYLP
 
 
 
CH_VALUE
 
        LD A,(NUMLINE)
 
        LD B,A
 
        ADD A,A
 
        ADD A,A
 
        LD HL,SETUP
 
        LD E,A
 
        LD D,0
 
        ADD HL,DE
 
        LD A,(HL)
 
        INC HL
 
        CP #FF
 
        RET Z     ;не меняем значения
 
        AND A
 
        JR Z,VAL_01  ;меняем значение тригерно
 
        DEC A
 
        JR NZ,VAL_02
 
 
 
;Меняем значение в диапазоне (MIN-MAX)
 
        PUSH HL
 
        LD A,(HL)
 
        INC HL
 
        LD E,(HL) ;MIN
 
        INC HL
 
        LD D,(HL) ;MAX
 
        INC D
 
        POP HL
 
        ADD A,C
 
        BIT 7,A
 
        JR Z,POL
 
        CP E
 
        JR NC,POL1
 
        LD A,RIGHT-2-ENT_MOD
 
        LD (ENT_MOD+1),A
 
        RET 
 
 
 
POL     CP D
 
        JR C,POL1
 
        LD A,LEFT-2-ENT_MOD
 
        LD (ENT_MOD+1),A
 
        RET 
 
POL1    LD (HL),A
 
        RET 
 
 
 
;Простой тригер
 
VAL_01  LD A,(HL)
 
        XOR 1
 
        LD (HL),A
 
        RET 
 
 
 
;Тригер меняется с кем-то
 
VAL_02  LD A,(HL)
 
        XOR 1
 
        LD (HL),A
 
        INC HL
 
        LD E,(HL)
 
        INC HL
 
        LD D,(HL)
 
        EX DE,HL
 
        LD A,(HL)
 
        XOR 1
 
        LD (HL),A
 
        RET 
 
 
 
;Переносим настройки из сетапа в текст
 
SET_TXT
 
        LD HL,TEXT2
 
        LD DE,3
 
        LD BC,SETUP
 
        LD A,QVALUE
 
 
 
CHV_LP  EX AF,AF'
 
        LD A,(BC)
 
        CP 255
 
        JR Z,CHV_LP2
 
        DEC A
 
        JR Z,NZBIT
 
 
 
;Обычный тригер
 
 
 
        INC BC
 
        LD A,(BC)
 
        DEC BC
 
        PUSH HL
 
        INC HL
 
        ADD A,192   ;Галочка/крестик
 
        LD (HL),A
 
        POP HL
 
CHV_LP2 ADD HL,DE
 
        INC BC,BC,BC,BC
 
        EX AF,AF'
 
        DEC A
 
        JR NZ,CHV_LP
 
        RET 
 
 
 
;Переменная в диапазоне
 
NZBIT   PUSH HL
 
;       INC HL
 
        INC BC
 
        LD A,(BC)
 
        DEC BC
 
        AND A
 
        JR Z,ZERO
 
        BIT 7,A
 
        JR Z,POLOJIT
 
        NEG 
 
        LD (HL),"-"
 
        JR POLOJIT+2
 
 
 
POLOJIT LD (HL),"+"
 
        INC HL
 
        ADD A,48
 
        LD (HL),A
 
        JR CHV_LP2-1
 
 
 
ZERO    LD (HL),32
 
        INC HL
 
        LD (HL),"0"
 
        JR CHV_LP2-1
 
 
 
FILLATR
 
        LD HL,#D800
 
        LD DE,#D801
 
        LD BC,767
 
        LD (HL),7
 
        LDIR 
 
        RET 
 
 
 
;Пауза
 
PAUSE
 
        LD B,A
 
ANY_KEY HALT 
 
        XOR A
 
        IN A,(#FE)
 
        CPL 
 
        AND 31
 
        JR NZ,KEY_PRS ;что-то нажали
 
        DJNZ ANY_KEY
 
        RET 
 
 
 
PAUSE2
 
        LD B,0
 
ANYK    HALT 
 
        XOR A
 
        IN A,(#FE)
 
        CPL 
 
        AND 31
 
        RET NZ    ;что-то нажали
 
        DJNZ ANYK
 
        RET 
 
 
 
KEY_PRS POP BC
 
        LD A,#BF
 
        IN A,(#FE)
 
        BIT 0,A
 
        JP Z,SETUPI ;Enter
 
        LD A,#7F
 
        IN A,(#FE)
 
        BIT 0,A
 
        JP Z,TOGAME ;Пробел
 
        PUSH BC
 
        RET 
 
        
 
;E-атрибут
 
;D-Y
 
LINE3
 
        LD B,32
 
        LD H,0
 
        LD L,D
 
LN3     CALL ATR_ADR
 
        LD (HL),E
 
        INC L
 
        DJNZ $-2
 
        RET 
 
 
 
;Инвертированная линия атрибутами
 
LINE2
 
        LD HL,(COORD) ;H-X,L-Y
 
        CALL ATR_ADR
 
        LD A,(HL)
 
        LD C,A
 
        AND 7
 
        ADD A,A
 
        ADD A,A
 
        ADD A,A
 
        LD E,A
 
        LD A,C
 
        AND 56
 
        RRA 
 
        RRA 
 
        RRA 
 
        OR E
 
        LD B,LEN
 
        LD (HL),A
 
        INC L
 
        DJNZ $-2
 
        RET 
 
 
 
;Печать текста пропорциональным шрифтом
 
;by SAM style, модификация для маски by axor
 
;IN DE-координаты (D-X пикс., E-Y знакоместа)
 
;   HL-текст
 
;1-12-токены (они не обязательны!)
 
PRTEXT
 
        PUSH DE
 
        LD A,(HL)
 
        AND A
 
        JR NZ,PRT0
 
PREX    POP DE
 
        RET 
 
PRT0    INC HL
 
        CP 13
 
        JR C,PREX
 
        JR NZ,PRT
 
        POP DE
 
        INC E
 
        JR PRTEXT
 
PRT     CALL print_symbol
 
        JR PRTEXT+1
 
 
 
print_symbol
 
        PUSH HL
 
        PUSH DE
 
        LD L,A
 
        LD H,0
 
        ADD HL,HL
 
        ADD HL,HL
 
        ADD HL,HL
 
        LD BC,font-256  ; font.addr
 
        ADD HL,BC
 
 
 
        LD B,(HL)       ;ширина буковки
 
        LD C,B
 
        LD A,255
 
        SRL A
 
        DJNZ $-2
 
        LD B,C
 
        LD (MASK+2),A   ;Маска буковки
 
 
 
        PUSH BC
 
 
 
        LD A,D          ;величина сдвига
 
        AND 7
 
        LD (sdwig+1),A
 
 
 
        XOR D           ;вычисление адреса на экране (de)
 
        RRA 
 
        RRA 
 
        RRA 
 
        AND #1F
 
        LD B,A
 
        LD C,E
 
        LD A,C
 
        RRCA 
 
        RRCA 
 
        RRCA 
 
        AND #E0
 
        OR B
 
        LD E,A
 
        LD A,C
 
        AND #18
 
        OR #C0
 
        LD D,A
 
;---
 
        INC D
 
        INC HL
 
 
 
        LD A,7   ;высота буковки
 
prn_1   EXA 
 
 
 
        LD A,(HL)
 
PRNMOD  RRCA    ;#0F/00 утолщение
 
        OR (HL)
 
        LD B,A
 
 
 
        PUSH HL
 
MASK    LD HL,#00FF
 
        LD C,0
 
sdwig   LD A,0
 
        AND A
 
        JR Z,prn_3
 
prn_2   SRL B
 
        RR C
 
        SCF 
 
        RR H
 
        RR L
 
        DEC A
 
        JR NZ,prn_2
 
prn_3   LD A,(DE)
 
        AND H
 
        OR B
 
        LD (DE),A
 
        INC E
 
        LD A,(DE)
 
        AND L
 
        OR C
 
        LD (DE),A
 
        POP HL
 
        DEC E
 
        INC D
 
        INC HL
 
        EXA 
 
        DEC A
 
        JR NZ,prn_1
 
        POP BC
 
        POP DE
 
        POP HL
 
        LD A,B    ;изменяем X (D) на ширину печати (B)
 
        ADD A,D
 
        LD D,A
 
        RET 
 
 
 
;Координаты в знакоместах преобразует
 
;в реальный адрес экрана
 
;IN D-X, E-Y
 
;
 
SCR_ADR LD A,E
 
        AND 7
 
        RRCA 
 
        RRCA 
 
        RRCA 
 
        ADD A,D
 
        LD D,E
 
        LD E,A
 
        LD A,D
 
        AND #18
 
        OR #C0 ;#C0/#40
 
        LD D,A
 
        RET 
 
 
 
SCR_ADR2
 
        LD A,E
 
        AND #18
 
        ADD A,#C0
 
        LD H,A
 
        LD A,E
 
        AND 7
 
        RRCA 
 
        RRCA 
 
        RRCA 
 
        ADD A,D
 
        LD L,A
 
        RET 
 
 
 
;Из координат адрес в атрибутах
 
;H-X, L-Y
 
ATR_ADR
 
        LD A,H
 
        ADD HL,HL
 
        ADD HL,HL
 
        ADD HL,HL
 
        LD H,#36 ;#36, если экран с #C000
 
                 ;#16, если с #4000
 
        ADD HL,HL
 
        ADD HL,HL
 
        ADD A,L
 
        LD L,A
 
        RET 
 
 
 
;Чанковый метод стирания окна. 17 фаз
 
;DE - координаты, D-X, E-Y
 
;HL- адрес чанки 8*8 пикселей
 
;BC - размер окна, B - по Y, C - по X
 
CHANX
 
        LD A,17   ;кол-во фаз
 
        LD HL,CHANKS
 
LOOPch
 
        PUSH AF
 
 
 
YSZ     LD B,24  ;Y-размер
 
CSZ     LD DE,#0 ;координаты
 
CHNK1
 
        PUSH BC
 
        PUSH DE
 
        PUSH HL
 
        CALL SCR_ADR
 
 
 
        LD B,(HL)
 
        INC HL
 
        LD C,(HL)
 
        INC HL
 
        LD A,(HL)
 
        INC HL
 
        LD L,(HL)
 
        LD H,A
 
 
 
XSZ     LD A,32    ;X-размер
 
CHN1
 
        EX AF,AF' ;'
 
        PUSH DE
 
 
 
        LD A,(DE)
 
        AND B
 
        LD (DE),A
 
        INC D
 
 
 
        LD A,(DE)
 
        AND C
 
        LD (DE),A
 
        INC D
 
 
 
        LD A,(DE)
 
        AND H
 
        LD (DE),A
 
        INC D
 
 
 
        LD A,(DE)
 
        AND L
 
        LD (DE),A
 
        INC D
 
;
 
        LD A,(DE)
 
        AND B
 
        LD (DE),A
 
        INC D
 
 
 
        LD A,(DE)
 
        AND C
 
        LD (DE),A
 
        INC D
 
 
 
        LD A,(DE)
 
        AND H
 
        LD (DE),A
 
        INC D
 
 
 
        LD A,(DE)
 
        AND L
 
        LD (DE),A
 
;
 
        POP DE
 
        EX AF,AF' ;'
 
        INC E
 
        DEC A
 
        JR NZ,CHN1
 
 
 
        POP HL
 
        POP DE
 
        POP BC
 
        INC E
 
        DJNZ CHNK1
 
 
 
        INC HL,HL,HL,HL
 
        POP AF
 
        DEC A
 
 
 
        PUSH AF,HL
 
 
 
        BIT 2,A
 
        CALL Z,FADE_OUT
 
 
 
        POP HL,AF
 
 
 
        HALT 
 
        HALT 
 
 
 
        JR NZ,LOOPch
 
 
 
FADE_OUT
 
        LD H,#5B+#80
 
        LD L,0
 
FOUT1   LD A,(HL)
 
        AND %00111111
 
        SRL A
 
        LD (HL),A
 
        DEC HL
 
        BIT 3,H
 
        JR NZ,FOUT1
 
        RET 
 
 
 
;Копирование установок из игры
 
;для работы с ними
 
;HL - откуда копировать
 
FROMGAM
 
        LD HL,SET
 
        LD A,QVALUE   ;кол-во переменных
 
        LD DE,SETUP+1
 
FRG1    LDI 
 
        INC DE
 
        INC DE
 
        INC DE
 
        DEC A
 
        JR NZ,FRG1
 
        RET 
 
 
 
;Копирование установок в игру
 
;DE - куда копировать
 
TOGAM
 
        LD A,QVALUE   ;кол-во переменных
 
        LD HL,SETUP+1
 
TOG1    LDI 
 
        INC HL
 
        INC HL
 
        INC HL
 
        DEC A
 
        JR NZ,TOG1
 
        RET 
 
 
 
;Работа с диском
 
TRDOS
 
        EX AF,AF' ;'
 
        XOR A
 
        LD (23823),A  ;Обнуляем код
 
        LD (23824),A  ;ошибки TR-DOS
 
        LD (23570),A  ;Блокируем поток
 
        EX AF,AF' ;'
 
        PUSH HL
 
        LD HL,(23613)
 
        LD (DOS_ERR+1),HL
 
        LD HL,DOS_ERR ;Устанавливаем
 
        EX (SP),HL    ;свой обработчик
 
        LD (23613),SP
 
        JP #3D13
 
DOS_ERR LD HL,0
 
        LD (23613),HL
 
        LD A,6        ;Восстанавливаем
 
        LD (23570),A  ;поток
 
        LD A,(23838)
 
        LD B,A
 
        LD A,(23823)  ;Проверяем
 
        AND A         ;была ли ошибка
 
        RET Z
 
        CP B
 
        RET Z
 
        INC A
 
        RET Z
 
ERR     LD B,10
 
        LD A,2
 
        OUT (254),A
 
        HALT 
 
        DJNZ $-1
 
        XOR A
 
        OUT (254),A
 
        RET 
 
 
 
ERROR
 
        CALL ERR
 
        JP TOGAME
 
 
 
;Сохранение установок
 
SAVE_SETUP
 
 
 
        CALL SETIM1
 
        LD A,PG_MUZ
 
        CALL PAGE
 
        CALL MUTE    ;выключаем музыку
 
 
 
;Ищем файл
 
;       CALL FILE
 
 
 
        LD A,9
 
        LD (23814),A
 
 
 
        LD C,#18
 
        CALL TRDOS
 
        JR NZ,ERROR
 
        LD C,10
 
        CALL TRDOS
 
        LD A,C
 
        INC C
 
        JR Z,ERROR ;нет файла!
 
;Высчитываем адрес файла (сектор,дорожка)
 
        LD C,8
 
        CALL TRDOS
 
 
 
;Читаем сектор
 
        LD DE,(#5CDD+14)
 
        LD BC,#0105
 
        LD HL,BUFER
 
        PUSH DE,HL
 
        CALL TRDOS
 
 
 
;Переносим установки
 
        LD DE,BUFER+14
 
        CALL TOGAM
 
 
 
;Сохраняем сектор
 
        POP HL,DE
 
        LD BC,#0106
 
        CALL TRDOS
 
        JP TOGAME
 
 
 
;FILE   LD HL,FILENAM
 
;       LD DE,#5CDD
 
;       LD BC,9
 
;       LD A,C
 
;       LD (23814),A
 
;       LDIR
 
;       RET
 
 
 
;FILENAM DB "VERA   B" ;Имя файла для сохранения
 
           ;123456789
 
;Драйвер переключения страниц для 128-го
 
;A-номер нужной страницы
 
PAGE
 
        PUSH BC
 
        LD (NUMPAGE),A
 
PG_     OR 16+8
 
        LD BC,#7FFD
 
        OUT (C),A
 
        POP BC
 
        RET 
 
NUMPAGE DB 0
 
 
 
CHANKS  DW #FF77,#FFFF
 
        DW #FF77,#FFDD
 
        DW #FF77,#FF55
 
        DW #FF55,#FF55
 
        DW #FF55,#EE55
 
        DW #BB55,#EE55
 
        DW #BB55,#AA55
 
        DW #AA55,#AA55
 
        DW #AA55,#8855
 
        DW #2255,#0055
 
        DW #0055,#0055
 
        DW #0055,#0044
 
        DW #0011,#0044
 
        DW #0011,#0000
 
        DW #0010,#0000
 
        DW #0000,#0000
 
        DW #0000,#0000
 
 
 
TR0     DB "В е р а",0
 
 
 
TR1     DB "    Perspective",0
 
 
 
TR1_    DB "представляет игру",0
 
 
 
TR2     DB "    .pO,",0
 
 
 
TR3     DB "   iP  7p",0
 
 
 
TR4     DB "  .P    9;",0
 
 
 
TR5     DB "  d'   ,p",0
 
 
 
TR6     DB " i;  d6",0
 
 
 
TR7     DB ".D  89pPo",0
 
 
 
TR8     DB "iP 6'   7P",0
 
 
 
TR9     DB "d:      d'",0
 
 
 
TR10    DB "8;     8'",0
 
 
 
TR11    DB "Qp   oP",0
 
 
 
TR12    DB "  O:q6",0
 
 
 
TR14    DB "Художник",0
 
 
 
TR15    DB "Композиторы:",0
 
 
 
TR16    DB "Программисты:",0
 
 
 
TR17    DB "Авторы сценария:",0
 
 
 
TITRES
 
;       DB BORDER,1
 
        DB PAUS,0
 
        DB PAUS,0
 
        DB PAUS,0
 
 
 
        DB CLS,24,32,0,0 ;код,Yразмер,Xразмер,Y,X
 
 
 
        DB PAUS,100
 
        DB BOLD
 
        DB NCRD,10,83
 
        DB LINK
 
        DW TR1
 
        DB NORM
 
        DB PAUS,4
 
        DB NCRD,10,83
 
        DB LINK
 
        DW TR1
 
 
 
        DB PAUS,200
 
 
 
        DB BOLD
 
        DB NCRD,11,83
 
        DB LINK
 
        DW TR1_
 
        DB NORM
 
        DB PAUS,4
 
        DB NCRD,11,83
 
        DB LINK
 
        DW TR1_
 
 
 
        DB PAUS,150
 
        DB CLS,24,32,0,0 ;код,Yразмер,Xразмер,Y,X
 
 
 
        DB BOLD
 
        DB NCRD,5,105
 
        DB LINK
 
        DW TR2
 
 
 
        DB NORM
 
        DB PAUS,4
 
        DB LINK
 
        DW TR2
 
 
 
        DB BOLD,PAUS,4
 
        DB NCRD,6,105
 
        DB LINK
 
        DW TR3
 
 
 
        DB NORM
 
        DB PAUS,4
 
        DB LINK
 
        DW TR3
 
 
 
        DB BOLD,PAUS,4
 
        DB NCRD,7,105
 
        DB LINK
 
        DW TR4
 
 
 
        DB NORM
 
        DB PAUS,4
 
        DB LINK
 
        DW TR4
 
 
 
        DB BOLD,PAUS,4
 
        DB NCRD,8,105
 
        DB LINK
 
        DW TR5
 
 
 
        DB NORM
 
        DB PAUS,4
 
        DB LINK
 
        DW TR5
 
 
 
        DB BOLD,PAUS,4
 
        DB NCRD,9,105
 
        DB LINK
 
        DW TR6
 
 
 
        DB NORM
 
        DB PAUS,4
 
        DB LINK
 
        DW TR6
 
 
 
        DB BOLD,PAUS,4
 
        DB NCRD,10,105
 
        DB LINK
 
        DW TR7
 
 
 
        DB NORM
 
        DB PAUS,4
 
        DB LINK
 
        DW TR7
 
 
 
        DB BOLD,PAUS,4
 
        DB NCRD,11,105
 
        DB LINK
 
        DW TR8
 
 
 
        DB NORM
 
        DB PAUS,4
 
        DB LINK
 
        DW TR8
 
 
 
        DB BOLD,PAUS,4
 
        DB NCRD,12,105
 
        DB LINK
 
        DW TR9
 
 
 
        DB NORM
 
        DB PAUS,4
 
        DB LINK
 
        DW TR9
 
 
 
        DB BOLD,PAUS,4
 
        DB NCRD,13,105
 
        DB LINK
 
        DW TR10
 
 
 
        DB NORM
 
        DB PAUS,4
 
        DB LINK
 
        DW TR10
 
 
 
        DB BOLD,PAUS,4
 
        DB NCRD,14,105
 
        DB LINK
 
        DW TR11
 
 
 
        DB NORM
 
        DB PAUS,4
 
        DB LINK
 
        DW TR11
 
 
 
        DB BOLD,PAUS,4
 
        DB NCRD,15,105
 
        DB LINK
 
        DW TR12
 
 
 
        DB NORM
 
        DB PAUS,4
 
        DB LINK
 
        DW TR12
 
 
 
        DB LINE,64+7,16
 
        DB BOLD
 
        DB NCRD,16,107
 
        DB LINK
 
        DW TR0
 
 
 
        DB NORM
 
        DB PAUS,4
 
        DB LINK
 
        DW TR0
 
 
 
        DB PAUS,0
 
        DB PAUS,0
 
        DB CLS,24,32,0,0
 
 
 
        DB NCRD,5,68
 
        DB "Enter - игровые настройки",13
 
        DB "  Space - перейти в игру"
 
 
 
        DB PAUS,100
 
 
 
        DB LINE,68,23 ;атрибутная полоса
 
        DB NCRD,23,83
 
        DB "www.vera.retropc.ru"
 
 
 
        DB PAUS,0
 
        DB CLS,24,32,0,0
 
 
 
        DB PAUS,50
 
 
 
        DB LINE,64+6,2
 
        DB LINE,64+6,5
 
        DB LINE,64+6,10
 
        DB LINE,64+6,16
 
        DB LINE,64+7,22
 
 
 
        DB BOLD
 
        DB NCRD,2,48
 
        DB LINK
 
        DW TR14
 
        DB PAUS,4
 
        DB NORM
 
        DB NCRD,2,48
 
        DB LINK
 
        DW TR14
 
 
 
        DB NCRD,3,72
 
        DB PAUS,30
 
        DB "Кирилл Каган (Surfin Bird)"
 
 
 
        DB PAUS,40
 
        DB BOLD
 
        DB NCRD,5,48
 
        DB LINK
 
        DW TR15
 
        DB NORM
 
        DB PAUS,4
 
        DB NCRD,5,48
 
        DB LINK
 
        DW TR15
 
 
 
        DB NCRD,6,72
 
        DB PAUS,30
 
        DB "Дмитрий Жемков (C-jeff)",13
 
        DB PAUS,30
 
        DB "Андрей Пеунов (Bedjamen)",13
 
        DB PAUS,30
 
        DB "n1k-o"
 
 
 
        DB PAUS,40
 
        DB BOLD
 
        DB NCRD,10,48
 
        DB LINK
 
        DW TR16
 
        DB NORM
 
        DB PAUS,4
 
        DB NCRD,10,48
 
        DB LINK
 
        DW TR16
 
 
 
        DB NCRD,11,72
 
        DB PAUS,30
 
        DB "Александр Шушков (Axor)",13
 
        DB PAUS,30
 
        DB "Александр Синяков (SAM style)",13
 
        DB PAUS,30
 
        DB "Сергей Бульба",13
 
        DB PAUS,30
 
        DB "Дмитрий Быстров (Alone Coder)"
 
 
 
        DB PAUS,40
 
        DB BOLD
 
        DB NCRD,16,48
 
        DB LINK
 
        DW TR17
 
        DB NORM
 
        DB PAUS,4
 
        DB NCRD,16,48
 
        DB LINK
 
        DW TR17
 
 
 
        DB NCRD,17,72
 
        DB PAUS,30
 
        DB "Владимир Сивов",13
 
        DB PAUS,30
 
        DB "Александр Разумов"
 
 
 
        DB PAUS,40
 
        DB BOLD
 
        DB NCRD,22,70
 
        DB LINK
 
        DW TR18
 
        DB NORM
 
        DB PAUS,4
 
        DB NCRD,22,70
 
        DB LINK
 
        DW TR18
 
 
 
        DB PAUS,0
 
        DB PAUS,0
 
        DB PAUS,0
 
 
 
        DB CLS,24,32,0,0
 
 
 
        DB PAUS,100
 
        DB NCRD,10,97
 
        DB LINE,64+7,10
 
        DB "Верьте в добро"
 
        DB PAUS,0
 
        DB PAUS,0
 
        DB CLS,24,32,0,0
 
        DB PAUS,0
 
        DB 0
 
 
 
TEXT0   DB "                  Клавиши в игре:",13
 
        DB "1 - вкл/выкл музыки",13
 
        DB "2 - вкл/выкл звуков",13
 
        DB "3 - вкл/выкл мыши",13
 
        DB "CS/SS/правая клавиша мыши - выкладывание вещи",13
 
        DB "C - центровка героя на экране",13
 
        DB "CS+3, CS+4 - листание вещей в мешке",13
 
        DB "Колесо мыши (ZXMC) - листание вещей в мешке",13
 
;       DB "Клавиши управления курсором + М - скролл карты",13
 
        DB "Удержание \"Fire\" + направление - скролл карты"
 
        DB 13
 
;       DB "Enter/клик в окне диалога - продолжение общения",13
 
        DB "Enter/клик во время диалога - следующая реплика",13
 
        DB "CS+1 - пропустить диалог",13
 
        DB 13
 
        DB "             "
 
TR18    DB "(c) 2003-2008, Perspective",0
 
 
 
TEXT1   DB "      Игровые настройки",13
 
        DB "Кемпстон мышь",13
 
        DB "Колесо мыши",13
 
        DB "Sinclair-джойстик",13
 
        DB "Клавиатура (Q,A,O,P,Sp)",13
 
        DB "Ускорение курсора",13
 
        DB "Музыка",13
 
        DB "Звуки",13
 
        DB "Сохранить и выйти",13
 
        DB "Выйти без изменений",0
 
 
 
TEXT2   DB "  ",13
 
        DB "  ",13
 
        DB "  ",13
 
        DB "  ",13
 
        DB "  ",13
 
        DB "  ",13
 
        DB "  ",0
 
 
 
TEXT3   DB "v.1.02",0 ;Версия сборки игры
 
        
 
;Установки
 
;Формат: 1-й байт 0 - значит меняется значение только 0/1
 
;                 1 - значит меняется в диапазоне
 
;                    второй байт - мин. значение
 
;                    третий байт - макс. значен.
 
;                 2 - значит меняется местами с
 
;                     тригером по адресу 3,4 байтов
 
; если байт=255 - значений нет
 
; Само значение во 2-м байте
 
 
 
SETUP
 
        DB 0,0,0,0    ;мышь
 
        DB 0,0,0,0    ;колесо
 
STJ     DB 2,0        ;синклер
 
        DW STK+1
 
STK     DB 2,0        ;клавиатура
 
        DW STJ+1
 
        DB 1,0,-4,4   ;ускорение курсора
 
        DB 0,0,0,0    ;музыка
 
        DB 0,0,0,0    ;звуки
 
        DB #FF,0,0,0
 
        DB #FF,0,0,0
 
 
 
NUMLINE DB 0     ;Номер пункта
 
COORD   DW #0701 ;Координаты вывода пункта
 
 
 
font    INCBIN "Fontix4.C"
 
 
 
;SCR    INCBIN "C:VeraTitl.C"
 
 
 
IMVEC   EQU ($/256+1)*256;вектор вторых прерываний
 
 
 
BUFER   EQU IMVEC+257
 
 
 
        ENT 
 
end
 
 
 
        ORG INTRO
 
 
 
        DISPLAY "LEN=",(font+1664)-IM2
 
        DISPLAY "Старт интро ",INTRO
 
        ;ORG BUFER
 
        savebin "intro.c",begin,end-begin