Subversion Repositories zxusbnet

Rev

Blame | Last modification | View Log | Download | RSS feed | ?url?

;***************************************************************
;*
;* EXTERN.H
;*
;* Взаимодействие с внешними устройствами.Процедуры,переменные
;* Memory,FDD,Kbd,Mice
;*
;* (C) Vitamin/CAIG/2001  2001-2006
;*
;* Обозначения в файле MACROS.H
;*
;* Revision 9.01.2006
;*
;***************************************************************

#if 0
Mem:  DISKBUF
Desc: Адрес буфера диска (#900 байт)
Note: Нужен если !NOFILER или RDCAT
---
Mem:  LIST
Desc: Адрес символьного списка файлов (12*число максимально ви-
      димых файлов в файлере)
Note: Нужен если !NOFILER. Длина задается в LISTLEN
---
Mem:  NUMLIST
Desc: Адрес таблицы выбора файлов (число максимально видимых
      файлов в файлере
Note: Нужен если !NOFILER
---
Mem:  FREERAM
Desc: Адрес свободной области памяти для свопинга окон
===
Var:  SPEED
Desc: BYTE - скорость движения стрелки от клавиатуры
---
Var:  SHOWDEL
Desc: BYTE 0/255 - показывать ли удаленные файлы в файлере
Note: Нужен если !NOFILER
===
Func: FSTPAGE
Desc: Включение страницы 0
Uses: A
Note: NOMEMDRV запрещает генерацию
---
Func: PAGA
Desc: Включение выбранной страницы
In:   A- page
Note: В PAGES задается число страниц. Номер порядковый,
      страницы 2 и 5 пропускаются автоматически.
      NOMEMDRV запрещает генерацию.
---
Func: SETDRIVER
Desc: Устанавливает драйвер памяти
In:   HL= {PENT128,PENT512,SCORP256,PROFI,ATM}
      A- число страниц (6,30,14,62,30 соответственно)
      Доступно только при HIMEMDRV
===
Func: TDOS
Desc: Реализация #3D13 (с перехватом ошибок).
Out:  Z- OK, NZ- ошибка, IY=23610, HL'=10072
Note: Если используются IM2, то при ключе IM2MOD должны быть
      объявлены SUSPENDIM2,RESUMEIM2, сохраняющие используемые
      регистры
---
Func: READ_CAT
Desc: Чтение каталога
Note: Включается при !NOFILER||RDCAT
---
Func: FILER
Desc: Диалог выбора файла
In:   HL- адрес таблицы сортировки (набор расширений, завер-
      шающийся 255). '?' означает любой символ.
      REREAD= 0/255 -надо ли перечитывать каталог.
Out:  FILNAME- данные по файлу (16 байт)
Note: Используется значение SHOWDEL.
---
Func: LOADFILE
Desc: Загрузка файла в память
In:   HL- имя файла (11 символов, '?'- любой символ)
      DE- адрес загрузки
Out:  (23796)- валиден, Z- OK, NZ- ошибка
Note: запрещен при NOLOADFIL
---
Func: FIND_FILE
Desc: Поиск файла в каталоге
In:   HL- имя файла (как в LOADFILE)
Out:  FILNAME- 16 байт данных, C- номер файла в каталоге
Note: Запрещен при NOLOADFIL&&NOSAVEFIL&&!RDCAT
      DE- сохраняется
---
Func: GET_FILE
Desc: Получение данных файла по его номеру
In:   C- номер файла
Out:  HL- указатель в буфере на данные
Uses: DE
Note: Запрещен при NOFILER&&NOSAVEFIL&&!RDCAT
---
Func: SAVEFILE
Desc: Запись файла на диск
In:   FILENAME- имя файла (11 символов), HL- адрес, DE- длина
Out:  (23796)-валиден, Z- OK, NZ- ошибка
Note: Если файл существует, он перезаписывается, если это
      подтверждено.
      NOSAVEFIL запрещает генерацию
===
Func: NOKEY
Desc: Ожидание нажатия клавиши на клавиатуре (или FIRE на мыше)
Uses: A
---
Func: WAITKEY
Desc: Ожидание отпускания клавиши на клавиатуре или FIRE на мыш
Uses: A
---
Func: READKEY
Desc: Определение текущей нажатой клавиши
Out:  A- код (CAPS регистр), 0- если не нажато
---
Func: POINT
Desc: Один цикл стрелки с опросом клавиатуры
Note: IX- сохраняется
---
Func: FIRA
Desc: Опрос контролов на FIRE
Out:  CARRY- нажат
---
Func: PRINTS
Desc: Вывод стрелки с запоминанием фона
In:   X_C=(XP,YP)
Uses: IX+
---
Func: RESTS
Desc: Восстановление фона под стрелкой
Note: PRINTS настраивает процедуру
---
Func: KEYS
Desc: Опрос устройств ввода изменение координат X_C
Note: Использутся парамер SPEED
===
Func: D_HL
Desc: Пересчет HL на линию вниз в экране
Uses: A
---
Func: D_DE
Note: аналогично D_HL
---
Func: U_HL
Desc: Пересчет HL на одну линю вверх в экране
Uses: A
---
Func: COOR_Z
Desc: Расчет адреса в экране
In:   HL=(XZ,YZ)
Out:  HL- адрес
Uses: A
---
Func: ATR_CONVERT
Desc: Пересчет адреса в знакоместе в адрес атрибутов
In:   HL
Out:  HL
Uses: A
---
Func: COOR_ATR
Desc: Расчет адреса атрибутов
In:   HL=(XZ,YZ)
Out:  HL- адрес
Uses: A
---
Func: MULS
Desc: HL=H*E
Uses: DE
---
Func: MULT
Desc: HL=DE*A
Uses: DE
---
Func: DIV
Desc: BC=BC/DE HL=BC%DE
Uses: A
---
Func: DIVI
Desc: C=C/B A=C%B
---
Func: STR
Desc: Перевод числа в десятиричный стринг с лидирующими нулями
In:   DE- куда, C-режим (=0:A-число,3цифры; =1:HL-число,5цифр)
Uses: B
---
Func: VAL
Desc: Преобразование десятиричного стринга в число
In:   DE- строка
Out:  HL- число
Uses: A,BC
Note: Преобразование идет пока встречаются символы 0..9,
      переполнение не учитывается.
---
Func: RECALC
Desc: X_C(XP,YP)->Y_ZN(YZ,XZ)
Uses: A,HL,DE
---
Func: CAL_COR
Desc: Получение оконных координат активой зоны
In:   A- номер зоны
Out:  DE(XZ,YZ)- относительные координаты
---
Func: CAL_ABS
Desc: Пересчет оконных координат в экранные
In:   DE(XZ,YZ)
Out:  DE(XZ,YZ)
Uses: A
---
Func: ADDRZ
Desc: Получение экранного адреса по оконным координатам
In:   DE(XZ,YZ)
Out:  HL- адрес
Uses: A
---
Func: HITTEST
Desc: Проверка попадания координат в область
In:   HL- точка, DE- координаты области, BC- размер
Out:  CARRY- если не попадает

#endif
SCROLUP
        push bc
        push hl
        ld              hl,0x4020
        ld              de,0x4000
suploop
        push de
        push hl
        ld              bc,32
        ldir
        pop             hl
        pop             de
        call    D_DE
        call    D_HL
        ld a,h
        cp 0x58
        jr c,suploop
        ex de,hl
        ld b,8
suploop1
        push    hl
        ld              bc,31
        ld (hl),0
        ld d,h
        ld e,l
        inc e
        ldir
        pop             hl
        call    D_HL
        ld a,h
        cp 0x58
        jr c,suploop1
        ld de,0x0017
        pop hl
        pop bc
        jp PRINTXY

myint:
                push af
                push bc
                push iy
                push ix
                ld bc,0x82ab
                in a,(c)
                ld (int_a+1),a
                and 0xfb
                out (c),a
                ld iy,0x5c3a
                call 0x0038
                di
                ld bc,0x82ab
int_a:
                ld a,0x0c
                out (c),a
                pop ix
                pop iy
                pop bc
                pop af
                ei
                ret

;---- MEMORY ---------
        #ifndef NOMEMDRV
FSTPAGE
        XOR A

PAGA    PUSH BC     ;переключатель страниц
PAGES   EQU $+1
        CP 6
        JP NC,ERRORT
        LD (CURPAG),A
        CP 2
        JR C,PP1
        CP 4
        JR C,PP2
        INC A
PP2     INC A
PP1
        #ifdef HIMEMDRV
        JP PENT128
        #endif 

PENT128 AND 7
        OR 16
OUTR    LD      BC,32765
        OUT     (C),A
ERRORT  POP     BC
        RET 

        #ifdef HIMEMDRV
SETDRIVER
        LD (PP1+1),HL
        LD (PAGES),A
        RET 

PENT512 LD C,A
        AND 24
        RLA 
        RLA 
        RLA 
        LD B,A
        LD A,C
        AND 7
        OR B
        JR PENT128+2

SCORP256
        LD (S1+1),A
        AND 8
        RLA 
        LD BC,#1FFD
S2      OUT (C),A
S1      LD A,0
        AND 7
        OR 16
        LD B,#7F
        JR OUTR+3

PROFI
        LD (S1+1),A
        AND 56
        RRCA 
        RRCA 
        RRCA 
        LD BC,#DFFD
        JR S2

ATM     LD (S1+1),A
        AND 24
        RRCA 
        RRCA 
        RRCA 
        LD BC,#FDFD
        JR S2
        #endif 
        #endif 

;---- FDD --------
;  TR-DOS VARIABLES
DRIVE   EQU     23798
DRIVE1  EQU     23800
DRIVE2  EQU     23801
TIMES   EQU     23802
CUR_TRK EQU     23797
CUR_SEC EQU     23796
FILNAME EQU     23773
FILEXT  EQU     23781
FILLENG EQU     23784
FILVOL  EQU     23786
FILSEC  EQU     23787
FILTRK  EQU     23788

TDOS
        #ifdef IM2MOD
        CALL SUSPENDIM2
        #endif 
        LD IY,23610
        EXX 
        LD HL,10072
        EXX 
        LD (ERR_ST+1),SP
        PUSH HL
                PUSH AF
        XOR A
        LD (HOWER+1),A
        LD L,A
                LD H,A
        LD (0x5D0F),HL
        LD A,195
        LD (23746),A
        LD HL,DRIVER
        LD (23747),HL
        POP AF
                POP HL
        LD (0x5C3D),SP
        CALL 0x3D13

RETER   
                #ifdef IM2MOD
        CALL RESUMEIM2
        #endif 
        LD A,195
        LD (23746),A
        LD HL,(0x5CB2)
        DEC HL
                DEC HL
        LD (HL),0x13
        DEC HL
        LD (HL),3
        LD (0x5C3D),HL
        LD (IY+0),-1
HOWER   LD A,0
        AND A
        RET 

DRIVER  LD (ERHL+1),HL
        LD (ERDE+1),DE
        LD E,A
        LD A,(23823)
        AND A
        JR NZ,ERR_ST
        LD A,E
        POP HL
        AND A
        LD DE,16
        SBC HL,DE
        JR Z,ERR_ST
ZATYK
ERHL    LD HL,0
ERDE    LD DE,0
        RET 

ERR_ST  LD SP,0
        LD A,(23823)
        LD HL,(YWIN)
        PUSH HL
        CALL D_ERROR
        XOR A
        LD L,A
                LD H,A
        LD (23823),HL
        POP HL
        LD (YWIN),HL
        CPL 
        LD (HOWER+1),A
        JP RETER
                
                #ifndef NOFILER
                        #define TEMPDEF 
                #endif 
                #ifdef RDCAT
                        #ifndef TEMPDEF
                                #define TEMPDEF 
                        #endif
                #endif 
        #ifdef TEMPDEF
                #undef TEMPDEF
        ;#ifndef NOFILER|(?RDCAT+1) ;NOFILER|(?RDCAT+1)
READ_CAT
        PUSH HL
        LD HL,DISKBUF
        LD DE,0
        LD BC,0x0905
        CALL TDOS
        #ifndef NOFILER
        LD A,-1
        LD (HOW_READ+1),A
        #endif 
        POP HL
        RET Z

        LD HL,DISKBUF
        LD DE,DISKBUF+1
        LD BC,0x8FF
        LD (HL),L
        LDIR 
        RET 
        #endif 

        #ifndef NOFILER
FILER                   ;файлер   HL-адрес таблицы сортировки
        LD (STAKA+1),SP
        CALL WAITKEY
        LD (MSKADR+1),HL
HOW_READ                ;на выходе: в FILNAME-данные по файлу
        LD A,0
REREAD=$+1
        AND 0
        CALL Z,READ_CAT
        LD A,(HOWER+1)
        AND A
        JR NZ,STAKA1
        CALL CL_LIST
        LD A,8
        LD (LISA+3),A
MSKADR  LD HL,0
        CALL SEL_SOR
        LD A,C
        LD (FILS),A
        CALL PARAMS

        LD IX,FIL_WIN
        CALL WINDOW
        CP 255
        JR Z,STAKA
        CP 254
        JP NZ,SELD
        LD L,C
        LD H,high(NUMLIST)
        LD C,(HL)
        CALL GET_FILE
        LD DE,FILNAME
        LD BC,16
        LDIR 
STAKA   LD SP,0
        PUSH AF
        CALL CLOSE
        POP AF
        RET 

STAKA1
        LD A,0
        JP SELD
        LD (HOW_READ+1),A
        LD SP,(STAKA+1)
        RET 


FIL_WIN DEFB 8,8,16,14,15
        DEFB 0
        DEFW FIL_TXT
        DEFW FIL_LGT
        DEFW 0
        DEFW FIL_SPT
        DEFW 0
        DEFW 0
        #ifndef NOSLB
        DEFW 0
        #endif 
        DEFW 0
        DEFW FIL_LST
        DEFW SEL_DRV
        DEFW -1

FIL_TXT DEFB 'Открыть файл:',13
        DEFB 'Диск:'
DISKNAME
        DEFB '        '
        DEFB 13
        DEFB 'Файлов:'
FILES   DEFB '000',13
        DEFB 'Свободно:'
DISKFRE DEFB '00000',0

FIL_LGT
        DEFB 13, 3, 2, 1, 5
        DEFB 13, 4, 2, 1, 5
        DEFB 13, 5, 2, 1, 5
        DEFB 13, 6, 2, 1, 5
LISA    DEFB 1, 5,11, 8, 1
        DEFB 255

FIL_SPT
        DEFB 13,3,2,1,1
        DEFW DI_A
        DEFB 13,4,2,1,1
        DEFW DI_B
        DEFB 13,5,2,1,1
        DEFW DI_C
        DEFB 13,6,2,1,1
        DEFW DI_D
        DEFB -1

DI_A    DEFB 255,254,160,2,199,244,168,2
        DEFB 207,244,168,18,200,20,0,0
DI_B    DEFB 255,254,160,10,207,228,160,18
        DEFB 207,228,168,18,207,228,0,0
DI_C    DEFB 255,254,160,2,207,244,160,2
        DEFB 200,4,168,2,199,244,0,0
DI_D    DEFB 255,254,160,2,207,228,160,18
        DEFB 200,20,168,18,207,244,0,0


FIL_LST DEFB 4,8
FILS    DEFB 0
        DEFW 0
FIL_DLT DEFB 0
        DEFW LIST
        DEFB 12
        DEFB -1

SEL_DRV LD HL,(YWIN)
        LD DE,0x0D03
        ADD HL,DE
        LD A,(DRIVE)
        AND 3
        LD (STAKA1+1),A
        ADD A,L
        LD L,A
        CALL COOR_ATR
        LD (HL),2
        INC L
        LD (HL),2
        RET 

PARAMS  LD HL,DISKBUF+0x800+0xE4
        LD A,(HL)
        LD DE,FILES
        LD C,0
        CALL STR
        INC HL
        LD E,(HL)
        INC HL
        LD D,(HL)
        PUSH HL
        LD HL,DISKFRE
        EX DE,HL
        LD C,1
        CALL STR
        POP HL
        LD DE,0xF5-0xE6
        ADD HL,DE
        LD DE,DISKNAME
        LD BC,8
        LDIR 
        RET 

SELD    AND 3
        LD C,1
        CALL TDOS
        PUSH AF
        XOR A
        LD (HOW_READ+1),A
        LD (FIL_DLT),A
        CALL CLOSE
        POP AF
        JP Z,HOW_READ

        LD IX,NODEFWIN
        CALL WINDOW
        PUSH AF
        CALL WAITKEY
        CALL CLOSE
        POP AF
        JR SELD

NODEFWIN  DEFB 9,10,14,4,7
        DEFB 0
        DEFW NODTXT
        DEFW NODLGT
        DEFW -1

NODTXT  DEFB 'Выберите диск:',13,13
        DEFB '  A   B   C   D',0

NODLGT  DEFB 1,2,3,1,3
        DEFB 4,2,3,1,3
        DEFB 7,2,3,1,3
        DEFB 10,2,3,1,3
        DEFB -1


CL_LIST
        PUSH HL
        LD HL,LIST
        LD DE,LIST+1
        LD BC,LISTLEN-1
        LD (HL),L
        LDIR 
        POP HL
        RET 


SEL_SOR EXX 
        LD HL,NUMLIST
        LD C,0
        EXX 

SORT_NAME
        LD DE,LIST
SORTIR  LD A,(HL)
        INC A
        JR NZ,NOLA
        EXX 
        LD C,L
        RET 
NOLA
        LD IX,DISKBUF

SEARFL  LD A,(IX+0)
        AND A
        JR Z,NEXMASK
        CP 32
        JR NC,SHOFIL
        LD A,(SHOWDEL)
        AND A
        LD BC,16
        JR Z,NODELF
        LD (IX+0),'?'
SHOFIL  LD BC,0x301
        PUSH HL
FINEX   LD A,(HL)
        CP '?'
        JR Z,YAE1
        CP (IX+8)
        JR Z,YAE1
        LD C,0
YAE1    INC HL
        INC IX
        DJNZ FINEX
        POP HL
        BIT 0,C
        JR Z,NETOE
        EXX 
        LD (HL),C
        INC HL
        LD (HL),0
        EXX 
        LD B,8
COPNMA  LD A,(IX-3)
        LD (DE),A
        INC IX
        INC DE
        DJNZ COPNMA
        LD A,32
        LD (DE),A
        INC DE
        CALL CORREC
        CALL CORREC
        CALL CORREC
        INC IX
        INC IX
SEARFL_ EXX 
        INC C
        EXX 
        JR SEARFL
NETOE   LD BC,13
NODELF  ADD IX,BC
        JR SEARFL_
NEXMASK INC HL
        INC HL
        INC HL
        EXX 
        LD C,0
        EXX 
        JR SORTIR


CORREC  LD A,(IX-3)
        CP 48
        JR NC,OK_L
        LD A,32
OK_L    CP 123
        JR C,OK_S
        LD A,32
OK_S    LD (DE),A
        INC DE
        INC IX
        RET 

        #endif   ;NOFILER

        #ifndef NOLOADFIL
LOADFILE                        ;HL-NAME DE-ADRESS
        CALL FIND_FILE
        AND A
        RET NZ
        LD HL,(FILSEC)
        LD A,(FILVOL)
        LD B,A
        LD C,5
        EX DE,HL
        JP TDOS
        #endif 


        ;IFN ?NOLOADFIL|?NOSAVEFIL|(?RDCAT+1)
                #ifndef NOLOADFIL
                        #define TEMPDEF 
                #endif 
                #ifdef RDCAT
                        #ifndef TEMPDEF
                                #define TEMPDEF 
                        #endif
                #endif 
                #ifndef NOSAVEFIL
                        #ifndef TEMPDEF
                                #define TEMPDEF 
                        #endif
                #endif 
        #ifdef TEMPDEF
                #undef TEMPDEF
FIND_FILE
        PUSH DE
                PUSH HL
        CALL READ_CAT
        POP HL
        LD DE,FILNAME
        LD BC,11
        LDIR 

        LD HL,DISKBUF
        LD C,128
SEAR    LD DE,FILNAME
        PUSH HL
        LD A,(HL)
        AND A
        JR Z,ENCAT
        LD B,11
CHECKS
        LD A,(DE)
        CP '?'
        JR Z,ANYSYM
        CP (HL)
        JR NZ,NETOTS
ANYSYM  INC HL
        INC DE
        DJNZ CHECKS
        POP HL
        PUSH BC
        LD DE,FILNAME
        LD BC,16
        LDIR 
        POP BC
        POP DE
        LD A,128
        SUB C
        LD C,A
        XOR A
        RET 

NETOTS  POP HL
        LD A,16
        ADDHLA
        DEC C
        JR NZ,SEAR
NOFF    POP DE
        LD A,-1
        RET 
ENCAT   POP HL
        JR NOFF
        #endif 

        ;IFN ?NOFILER|?NOSAVEFIL|(?RDCAT+1)
                #ifndef NOFILER
                        #define TEMPDEF 
                #endif 
                #ifdef RDCAT
                        #ifndef TEMPDEF
                                #define TEMPDEF 
                        #endif
                #endif 
                #ifndef NOSAVEFIL
                        #ifndef TEMPDEF
                                #define TEMPDEF 
                        #endif
                #endif 
        #ifdef TEMPDEF
                #undef TEMPDEF
GET_FILE
        LD L,C
        LD H,0
        ADD HL,HL
        ADD HL,HL
        ADD HL,HL
        ADD HL,HL
        LD DE,DISKBUF
        ADD HL,DE
        RET 
        #endif 


        #ifndef NOSAVEFIL
REWRDIAL DEFB 9,12,14,5,7
        DEFB 0
        DEFW REWTXT
        DEFW REWLGT
        DEFW REWHOT
        DEFW -1

REWTXT  DEFB 'Файл существует!',13,13
        DEFB 'Переписать',13
        DEFB 'Отмена',0

REWLGT  DEFB 0,2,14,1,3
        DEFB 0,3,14,1,3
        DEFB -1

REWHOT  DEFB 13
        DEFW 0
        DEFB 14
        DEFW 1
        DEFB -1

SAVEFILE
        PUSH HL
                PUSH DE
        LD DE,FILNAME
        EX DE,HL
        CALL FIND_FILE
        AND A
        JR NZ,FYOK

        PUSH BC
        PUSH IX
        LD IX,REWRDIAL
        CALL WINDOW
        PUSH AF
        CALL CLOSE
        POP AF
        POP IX

        AND A
        JR Z,PAAGE

        POP HL
                POP HL
                POP HL
        LD A,-1
        RET 

PAAGE
        POP BC

FYOK    POP DE
                POP HL
        AND A
        JR NZ,NETFAI
        LD (STHL+1),HL
        LD (STDE+1),DE
        LD (FILLENG),DE
        DEC DE
        LD B,D
        INC DE
        INC B
        LD A,(FILVOL)
        CP B
        JR NZ,DELREW
        PUSH HL
        CALL GET_FILE
        LD DE,FILNAME
        EX DE,HL
        LD BC,11
        LDIR 
        POP HL
        LD A,(FILVOL)
        LD DE,(FILSEC)
        JP SAFILA
DELREW  PUSH HL
        CALL GET_FILE
        LD (HL),1
        LD A,(DISKBUF+0x800+0xF4)
        INC A
        LD (DISKBUF+0x800+0xF4),A
        LD HL,DISKBUF
        LD DE,0
        LD BC,0x0906
        CALL TDOS
        POP HL
STHL    LD HL,0
STDE    LD DE,0
        JP SAVEFILE

NETFAI

        PUSH HL         ;запись файла
        LD (FILEM+1),DE         ;DE-LENGHT IN BYTES
        DEC DE                  ;FILNAME-DATA FOR FILE
        INC D                   ;HL-START
        LD A,D
        LD (FLEN+1),A
        LD (SECLEN+1),A
        LD A,(HOWER+1)
        AND A
        JP NZ,NEST
FLEN    LD DE,0
        LD HL,(DISKBUF+0x800+0xE5)
        SBC HL,DE
        JR C,NOROMZ
        JR Z,NOROMZ
        LD A,(DISKBUF+0x800+0xE4)
        CP 128
        JR NC,NOROMZ
        LD HL,DISKBUF
        LD DE,16
FFREE   LD A,(HL)
        AND A
        JR Z,ECAT
        ADD HL,DE
        JR FFREE

ECAT    LD DE,FILNAME
        EX DE,HL
        LD BC,11
        LDIR 

FILEM   LD HL,0
        EX DE,HL
        LD (HL),E
        INC HL
        LD (HL),D
        LD DE,(DISKBUF+0x800+0xE1)
        INC HL
SECLEN  LD (HL),0
        INC HL
        LD (HL),E
        INC HL
        LD (HL),D
        LD HL,(DISKBUF+0x800+0xE5)
        LD DE,(FLEN+1)
        AND A
        SBC HL,DE
        LD (DISKBUF+0x800+0xE5),HL
        LD HL,(DISKBUF+0x800+0xE1)
        LD (POSITZ+1),HL
        ADD HL,DE
        LD A,L
        AND 15
        LD E,A
        XOR L
        RRA 
        RRA 
        RRA 
        RRA 
        ADD A,H
        LD D,A
        LD (DISKBUF+0x800+0xE1),DE
        LD A,(DISKBUF+0x800+0xE4)
        INC A
        LD (DISKBUF+0x800+0xE4),A

        POP HL
POSITZ  LD DE,0
        LD A,(FLEN+1)
SAFILA  LD B,A
        LD C,6
        CALL TDOS
        LD HL,DISKBUF
        LD DE,0
        LD BC,0x0906
        JP TDOS

NEST    POP HL
        RET 

NOROMZ  POP HL
        LD A,3
        #endif 


D_ERROR PUSH AF
        LD IX,NORWIN
        CALL MAKEWIND
        POP AF
        ADD A,A
        LD HL,MESSTAB
        ADDHLA
        LD E,(HL)
        INC HL
        LD D,(HL)
        LD HL,0x0102
        EX DE,HL
        CALL PRINTXY
        CALL WAITKEY
        CALL NOKEY
        CALL WAITKEY
        JP CLOSE

MESSTAB DEFW WPROT
        DEFW DIRROR
        DEFW DIRROR
        DEFW NOROM
        DEFW NOROM
        DEFW NOROM
        DEFW NODISK
        DEFW DIRROR
        DEFW DIRROR
        DEFW DIRROR

NORWIN  DEFB 8,10,16,4,15
        DEFB 0
        DEFW ERTEX
        DEFW 65535

ERTEX   DEFB 'Ошибка:',0
NOROM   DEFB '   Нет места!',0
DIRROR  DEFB 'Проблема с диском!',0
NODISK  DEFB '    Нет диска!',0
WPROT   DEFB ' Диск защищен!',0

;------- KBD&MICE ---------

NOKEY   XOR A       ;процедура ожидания нажатия клавиши
        IN A,(254)
        XOR 31
        AND 31
        RET NZ
        LD A,(SYSFLG)
        AND 4
        JR Z,NOKEY
        CALL REFFIR
        LD A,(FIRE)
        RLA 
        JR NC,NOKEY
        RET 

WAITKEY XOR A       ;процедура ожидания отпускания клавиши
        IN A,(254)
        XOR 31
        AND 31
        JR NZ,WAITKEY
        LD (23560),A
        LD A,(SYSFLG)
        AND 4
        RET Z
        CALL REFFIR
        LD A,(FIRE)
        RLA 
        JR C,WAITKEY
        RET 

REFFIR  PUSH HL
                PUSH DE
                PUSH BC
        LD HL,(X_C)
        LD DE,(X_M)
        LD C,0xDF
        CALL FIRM
        POP BC
                POP DE
                POP HL
        RET 
getkey:
READKEY LD A,(23560);процедура определения текущей клавиши
        PUSH AF
        XOR A
        LD (23560),A
        POP AF
        CP 97
        RET C
        AND 223
        RET 

POINT   PUSH IX
        CALL PRINTS
                halt
        CALL RESTS
        POP IX
        JP KEYS

FIRA    CALL KEYS
FIR     LD A,(FIRE)
        AND 128
        RLCA 
        LD (FIRE),A
        RRCA 
        RET 

PRINTS:
        LD BC,(X_C)
        LD A,B
                ;CALL 0x22B0
                ld   b,a
         and  a
         rra
         scf
         rra
         and  a
         rra
         xor  b
                 and  0xF8
         xor  b
         ld   h,a
         ld   a,c
         rlca
         rlca
         rlca
         xor  b
         and  0xC7
         xor  b
         rlca
         rlca
         ld   l,a
         ld   a,c
         and  0x07
                
        LD (PRINTA+1),HL
        LD (RESTS+1),HL
        LD (PRINTS1+1),A
        LD IX,BUFFER
CCUR_   LD HL,KURS1
        LD A,8
ALRD    EX AF,AF' 
        LD C,(HL)
                LD B,-1
        INC HL
        LD E,(HL)
                LD D,0
        INC HL
PRINTS1 LD A,0
        AND A
        JR Z,OUK1
        LD D,A
SCMSK   SCF 
        RR C
        RR B
        DEC A
        JR NZ,SCMSK
        LD A,D
        LD D,0
SCSPR   AND A
        RR E
        RR D
        DEC A
        JR NZ,SCSPR
OUK1
        PUSH HL
PRINTA  LD HL,0
        LD A,(HL)
        LD (IX+0),A
        AND C
        OR E
        LD (HL),A
        INC HL
        LD A,(HL)
        LD (IX+1),A
        LD A,L
        AND 31
        JR Z,SKILIN
        LD A,(HL)
        AND B
        OR D
        LD (HL),A
SKILIN  DEC HL
        INC IX
        INC IX
        CALL D_HL
        LD (PRINTA+1),HL
        LD A,H
        POP HL
        CP 0x58
        RET NC
        EX AF,AF' 
        DEC A
        JR NZ,ALRD
        RET 

RESTS:  LD DE,0
        LD HL,BUFFER
        LD B,8
RESTS1: LD A,(HL)
        LD (DE),A
        INC E
        INC HL
        LD A,E
        AND 31
        JR Z,NEXTL1
        LD A,(HL)
        LD (DE),A
NEXTL1: DEC E
        INC HL
        CALL D_DE
        LD A,D
        CP 0x58
        RET NC
        DJNZ RESTS1
        RET 

KEYS
        XOR A
        LD (FIRE),A
        CALL MOUSE
        CALL KEYSCAN
        LD HL,(ACSELL)
        LD A,H
        AND A
        JR NZ,KEYS1
        LD (ACSELL),A
        RET 
KEYS1   LD DE,(X_C)
        RRA 
        CALL C,RIGHT
        RRA 
        CALL C,LEFT
        RRA 
        CALL C,DOWN
        RRA 
        CALL C,UP
        LD (X_C),DE
        RRA 
        JR C,SETFIR
RESFIR
        LD A,(SPEED)
        CP L
        RET C
        INC L
        LD (ACSELL),HL
        RET 

SETFIR  LD A,128
        LD (FIRE),A
        RLCA 
        LD (ACSELL),A
        RET 


RIGHT   EX AF,AF' 
        LD A,E
        ADD A,L
        CP E
        JR NC,RIG1
        LD A,-1
RIG1    LD E,A
        EX AF,AF' 
        RET 

LEFT    EX AF,AF' 
        LD A,E
        SUB L
        CP E
        JR Z,RIG1
        JR C,RIG1
        XOR A
        JR RIG1

UP      EX AF,AF' 
        LD A,D
        SUB L
        BIT 7,A
        JR Z,UP1
        BIT 6,A
        JR Z,UP1
        XOR A
UP1     LD D,A
        EX AF,AF' 
        RET 

DOWN    EX AF,AF' 
        LD A,D
        ADD A,L
        CP 191
        JR C,UP1
        LD A,191
        JR UP1

KEYSCAN
        CALL KEYscan1
        LD B,A
        CALL KEMPSTON
        OR B
        LD (CONTROL),A
        RET 

KEYscan1
        LD A,0x7F        ;FIRE
        IN A,(0xFE)
        RRA 
        CCF 
        RL C

        LD A,0xFB        ;UP
        IN A,(0xFE)
        RRA 
        CCF 
        RL C

        LD A,0xFD        ;DOWN
        IN A,(0xFE)
        RRA 
        CCF 
        RL C

        LD A,0xDF        ;LEFT
        IN A,(0xFE)
        CPL 
        RRCA 
        RRCA 
        RL C
        RLCA 
        RLCA            ;RIGHT
        RL C

        LD A,C
        AND 31
        RET 


KEMPSTON
        LD A,(SYSFLG)
        AND 8
        RET Z
        IN A,(0x1F)
        INC A
        RET Z
        DEC A
        AND 0x1F
        RET 

MOUSE   LD A,(SYSFLG)
        AND 4
        RET Z

        LD HL,(X_C)
        LD DE,(X_M)
        LD BC,0xFBDF

        IN A,(C)
        LD B,A
        SUB E
        CP 128
        JR NC,TOLEFT
        ADD A,L
        JR C,ERX
OI1     LD L,A
                LD E,B
        JR PO_Y
ERX     LD A,255
        JR OI1
TOLEFT  NEG 
        LD C,A
                LD A,L
                LD L,C
        LD C,0xDF
        SUB L
        JR NC,OI1
        XOR A
        JR OI1

PO_Y    LD B,0xFF
        IN A,(C)
        CPL 
        LD B,A
        SUB D
        CP 128
        JR NC,TOUP
        ADD A,H
        CP 192
        JR NC,ERY
OI2     LD H,A
                LD D,B
        JR FIRM
ERY     LD A,191
        JR OI2
TOUP    NEG 
        LD C,A
                LD A,H
                LD H,C
        LD C,0xDF
        SUB H
        JR NC,OI2
        XOR A
        JR OI2

FIRM    LD B,0xFA
        IN A,(C)
        OR 248
        CPL 
        LD B,A
        AND A
        JR Z,NO_KLICK
        LD A,(KEYMSK)
        AND A
        JR NZ,NOT_FIRST
        LD A,B
        LD (KEYMSK),A
NOT_FIRST
        AND B
        JR Z,NO_KLICK
        LD A,128
NO_KLICK
        LD (FIRE),A

COORDS  LD (X_C),HL
        LD (X_M),DE
        RET 

KURS1   DEFB 0xBF,0x00,0x0F,0x40,0x83,0x30,0x81,0x3C,0xC3,0x18,0xC1,0x14
        DEFB 0xE8,0x02,0xFD,0x00

X_M     DEFW 0
KEYMSK  DEFB 0
BUFFER  DEFS 16

;----- UTILS --------
D_HL    INC H
        LD A,H
        AND 7
        RET NZ
        LD A,L
        ADD A,32
        LD L,A
        RET C
        LD A,H
        SUB 8
        LD H,A
        RET 

D_DE    INC D
        LD A,D
        AND 7
        RET NZ
        LD A,E
        ADD A,32
        LD E,A
        RET C
        LD A,D
        SUB 8
        LD D,A
        RET 

U_HL:   LD A,H
        DEC H
        AND 7
        RET NZ
        LD A,L
        SUB 32
        LD L,A
        RET C
        LD A,H
        ADD A,8
        LD H,A
        RET 

COOR_Z  LD A,L     ;расчет адреса по знакоместам
        AND 7       ;L-Y  H-X
        RRCA 
        RRCA 
        RRCA 
        ADD A,H
        LD H,L
        LD L,A
        LD A,H
        AND 0x18
        OR 64
        LD H,A
        RET 

ATR_CONVERT
        LD A,H
        AND 0x18
        RRCA 
        RRCA 
        RRCA 
        ADD A,0x58
        LD H,A
        RET 

COOR_ATR                ;расчет адреса атрибутов
        LD A,H     ;L-Y  H-X
        LD H,L
        LD L,0
        AND A
        REPT 3
        RR H
        RR L
        ENDR 
        ADD A,L
        LD L,A
        LD A,H
        OR 0x58
        LD H,A
        RET 

MULS                    ;HL=H*E
        LD L,0
        LD D,L
CWERT   REPT 8
        ADD HL,HL
        JR NC,$+3
        ADD HL,DE
        ENDR 
        RET 

MULT    LD HL,0    ;HL=DE*A
        EX DE,HL
        REPT 8
        RRA 
        JR NC,$+5
        EX DE,HL
        ADD HL,DE
        EX DE,HL
        ADD HL,HL
        ENDR 
        EX DE,HL
        RET 

DIV                     ;BC=BC/DE
        LD HL,0
        LD A,16
        SLA C
        RL B
DIVL    ADC HL,HL
        SBC HL,DE
        JR NC,$+3
        ADD HL,DE
        RL C
        RL B
        DEC A
        JR NZ,DIVL
        LD A,B
        CPL 
        LD B,A
        LD A,C
        CPL 
        LD C,A
        RET 

DIVI
                        ;C=C/B A-REMAINDER
        XOR A
        RL C
        REPT 8
        ADC A,A
        SUB B
        JR NC,$+3
        ADD A,B
        CCF 
        RL C
        ENDR 
        RET 

TWA     LD A,47
        AND A
TW1     INC A
        SBC HL,BC
        JR NC,TW1
        ADD HL,BC
        LD (DE),A
        INC DE
        RET 

STR                     ;перевод числа в десятиричный стринг
                        ;C=0  A-число  DE- куда
        DEC C           ;C=1  HL-число DE- куда
        JR NZ,ONEB

        LD BC,10000
        CALL TWA

        LD BC,1000
        CALL TWA

        LD BC,100
        CALL TWA
        LD A,L
        EX DE,HL
        JR ONB2-2

ONEB    EX DE,HL
        LD C,47
ONB1    INC C
        SUB 100
        JR NC,ONB1
        LD (HL),C
        INC HL
        ADD A,100
        LD C,47
ONB2    INC C
        SUB 10
        JR NC,ONB2
        LD (HL),C
        INC HL
        ADD A,58
        LD (HL),A
        INC HL
        EX DE,HL
        RET 

VAL     LD HL,0
VALLOOP LD A,(DE)
        SUB '0'
        RET C
        CP 10
        RET NC
        ADD HL,HL
        LD B,H
                LD C,L
        ADD HL,HL
        ADD HL,HL
        ADD HL,BC
        ADDHLA
        INC DE
        JR VALLOOP

RECALC  LD HL,(X_C)
        LD A,H
        AND 248
        RRA 
        RRA 
        RRA 
        LD E,A
        LD A,L
        AND 248
        RRA 
        RRA 
        RRA 
        LD D,A
        LD (Y_ZN),DE
        RET 

CAL_COR
        PUSH HL
        LD L,A
                LD E,A
        XOR A
        LD H,A
                LD D,H
        ADD HL,HL
        ADD HL,HL
        ADD HL,DE
        MOV E,D,WIN_ACT
        ADD HL,DE
        LD D,(HL)
        INC HL
        LD E,(HL)
        POP HL
        RET 

CAL_ABS
                LD A,(IX+WIN_YPOS)
        ADD A,E
        LD E,A

                LD A,(IX+WIN_XPOS)
        ADD A,D
        LD D,A
        RET 

ADDRZ   LD A,(YWIN)
        ADD A,E
        AND 0x18
        ADD A,64
        LD H,A
        LD A,(YWIN)
        ADD A,E
        AND 7
        RRCA 
        RRCA 
        RRCA 
        ADD A,D
        LD L,A
        LD A,(XWIN)
        ADD A,L
        LD L,A
        RET 

HITTEST
        LD A,H
        CP D
        RET C
        LD A,D
        ADD A,B
        DEC A
        CP H
        RET C
        LD A,L
        CP E
        RET C
        LD A,E
        ADD A,C
        DEC A
        CP L
        RET 

;---- VARIABLES ---

;SYSTEM AREAS
YWIN    DEFB 0          ;координаты окна
XWIN    DEFB 0
YSIZ    DEFB 0          ;размеры окна
XSIZ    DEFB 0
YTXT    DEFB 0          ;относительные координаты печати
XTXT    DEFB 0
X_C     DEFB 0          ;координаты стрелки в пикселах
Y_C     DEFB 0
Y_ZN    DEFB 0          ;координаты стрелки в знакоместах
X_ZN    DEFB 0
FREE    DEFW .SFB.(FREESEG)    ;адрес свободной ячейки памяти
WINS    DEFB 0          ;количество открытых окон
FIRE    DEFB 0
ACSELL  DEFB 0
CONTROL DEFB 0
STAK    DEFW 0

        #ifndef PRODUCE
SYSFLG  DEFB    12      ;0
        #else            ;1
SYSFLG  DEFB    8       ;2-MOUSE
        #endif           ;3-JOYSTIC

;-----------VARIABLES-------------------------------------------

CORR_TAB
        DEFB    124,255,93,91,255,255,255,255,125,123,92
REESTR  DEFS    20
        DEFB    126

RUS_KBD DEFB    ' !"#$%&''()*+,-./0123456789:;<=>?Ю' ;33
        DEFB    'АБЦДЕФГХИЙКЛМНОПЯРСТУЖВЬЫЗШЭЩЧъю'      ;32
        DEFB    'абцдефгхийклмнопярстужвьызшэщчч'      ;32 E=97
        DEFS    0x9F

RK_SPRT DEFB    240,144,144,96 ,144,144,240

        #ifndef NOMEMDRV
CURPAG  DEFB 0
        #endif 
STAKP   DEFW 0

CURNAME DEFS 11
                ;#if low($)>0
                ;DEFS 255-low($)
                ;#endif
        ;_PARA
        ;FONT    INCBIN  "FONT6X8
ENDCOVER