Blame | Last modification | View Log | Download | RSS feed
;***************************************************************;*;* EXTERN.H;*;* Взаимодействие с внешними устройствами.Процедуры,переменные;* Memory,FDD,Kbd,Mice;*;* (C) Vitamin/CAIG/2001 2001-2006;*;* Обозначения в файле MACROS.H;*;* Revision 9.01.2006;*;***************************************************************#if 0Mem: DISKBUFDesc: Адрес буфера диска (#900 байт)Note: Нужен если !NOFILER или RDCAT---Mem: LISTDesc: Адрес символьного списка файлов (12*число максимально ви-димых файлов в файлере)Note: Нужен если !NOFILER. Длина задается в LISTLEN---Mem: NUMLISTDesc: Адрес таблицы выбора файлов (число максимально видимыхфайлов в файлереNote: Нужен если !NOFILER---Mem: FREERAMDesc: Адрес свободной области памяти для свопинга окон===Var: SPEEDDesc: BYTE - скорость движения стрелки от клавиатуры---Var: SHOWDELDesc: BYTE 0/255 - показывать ли удаленные файлы в файлереNote: Нужен если !NOFILER===Func: FSTPAGEDesc: Включение страницы 0Uses: ANote: NOMEMDRV запрещает генерацию---Func: PAGADesc: Включение выбранной страницыIn: A- pageNote: В PAGES задается число страниц. Номер порядковый,страницы 2 и 5 пропускаются автоматически.NOMEMDRV запрещает генерацию.---Func: SETDRIVERDesc: Устанавливает драйвер памятиIn: HL= {PENT128,PENT512,SCORP256,PROFI,ATM}A- число страниц (6,30,14,62,30 соответственно)Доступно только при HIMEMDRV===Func: TDOSDesc: Реализация #3D13 (с перехватом ошибок).Out: Z- OK, NZ- ошибка, IY=23610, HL'=10072Note: Если используются IM2, то при ключе IM2MOD должны бытьобъявлены SUSPENDIM2,RESUMEIM2, сохраняющие используемыерегистры---Func: READ_CATDesc: Чтение каталогаNote: Включается при !NOFILER||RDCAT---Func: FILERDesc: Диалог выбора файлаIn: HL- адрес таблицы сортировки (набор расширений, завер-шающийся 255). '?' означает любой символ.REREAD= 0/255 -надо ли перечитывать каталог.Out: FILNAME- данные по файлу (16 байт)Note: Используется значение SHOWDEL.---Func: LOADFILEDesc: Загрузка файла в памятьIn: HL- имя файла (11 символов, '?'- любой символ)DE- адрес загрузкиOut: (23796)- валиден, Z- OK, NZ- ошибкаNote: запрещен при NOLOADFIL---Func: FIND_FILEDesc: Поиск файла в каталогеIn: HL- имя файла (как в LOADFILE)Out: FILNAME- 16 байт данных, C- номер файла в каталогеNote: Запрещен при NOLOADFIL&&NOSAVEFIL&&!RDCATDE- сохраняется---Func: GET_FILEDesc: Получение данных файла по его номеруIn: C- номер файлаOut: HL- указатель в буфере на данныеUses: DENote: Запрещен при NOFILER&&NOSAVEFIL&&!RDCAT---Func: SAVEFILEDesc: Запись файла на дискIn: FILENAME- имя файла (11 символов), HL- адрес, DE- длинаOut: (23796)-валиден, Z- OK, NZ- ошибкаNote: Если файл существует, он перезаписывается, если этоподтверждено.NOSAVEFIL запрещает генерацию===Func: NOKEYDesc: Ожидание нажатия клавиши на клавиатуре (или FIRE на мыше)Uses: A---Func: WAITKEYDesc: Ожидание отпускания клавиши на клавиатуре или FIRE на мышUses: A---Func: READKEYDesc: Определение текущей нажатой клавишиOut: A- код (CAPS регистр), 0- если не нажато---Func: POINTDesc: Один цикл стрелки с опросом клавиатурыNote: IX- сохраняется---Func: FIRADesc: Опрос контролов на FIREOut: CARRY- нажат---Func: PRINTSDesc: Вывод стрелки с запоминанием фонаIn: X_C=(XP,YP)Uses: IX+---Func: RESTSDesc: Восстановление фона под стрелкойNote: PRINTS настраивает процедуру---Func: KEYSDesc: Опрос устройств ввода изменение координат X_CNote: Использутся парамер SPEED===Func: D_HLDesc: Пересчет HL на линию вниз в экранеUses: A---Func: D_DENote: аналогично D_HL---Func: U_HLDesc: Пересчет HL на одну линю вверх в экранеUses: A---Func: COOR_ZDesc: Расчет адреса в экранеIn: HL=(XZ,YZ)Out: HL- адресUses: A---Func: ATR_CONVERTDesc: Пересчет адреса в знакоместе в адрес атрибутовIn: HLOut: HLUses: A---Func: COOR_ATRDesc: Расчет адреса атрибутовIn: HL=(XZ,YZ)Out: HL- адресUses: A---Func: MULSDesc: HL=H*EUses: DE---Func: MULTDesc: HL=DE*AUses: DE---Func: DIVDesc: BC=BC/DE HL=BC%DEUses: A---Func: DIVIDesc: C=C/B A=C%B---Func: STRDesc: Перевод числа в десятиричный стринг с лидирующими нулямиIn: DE- куда, C-режим (=0:A-число,3цифры; =1:HL-число,5цифр)Uses: B---Func: VALDesc: Преобразование десятиричного стринга в числоIn: DE- строкаOut: HL- числоUses: A,BCNote: Преобразование идет пока встречаются символы 0..9,переполнение не учитывается.---Func: RECALCDesc: X_C(XP,YP)->Y_ZN(YZ,XZ)Uses: A,HL,DE---Func: CAL_CORDesc: Получение оконных координат активой зоныIn: A- номер зоныOut: DE(XZ,YZ)- относительные координаты---Func: CAL_ABSDesc: Пересчет оконных координат в экранныеIn: DE(XZ,YZ)Out: DE(XZ,YZ)Uses: A---Func: ADDRZDesc: Получение экранного адреса по оконным координатамIn: DE(XZ,YZ)Out: HL- адресUses: A---Func: HITTESTDesc: Проверка попадания координат в областьIn: HL- точка, DE- координаты области, BC- размерOut: CARRY- если не попадает#endifSCROLUPpush bcpush hlld hl,0x4020ld de,0x4000suplooppush depush hlld bc,32ldirpop hlpop decall D_DEcall D_HLld a,hcp 0x58jr c,suploopex de,hlld b,8suploop1push hlld bc,31ld (hl),0ld d,hld e,linc eldirpop hlcall D_HLld a,hcp 0x58jr c,suploop1ld de,0x0017pop hlpop bcjp PRINTXYmyint:push afpush bcpush iypush ixld bc,0x82abin a,(c)ld (int_a+1),aand 0xfbout (c),ald iy,0x5c3acall 0x0038dild bc,0x82abint_a:ld a,0x0cout (c),apop ixpop iypop bcpop afeiret;---- MEMORY ---------#ifndef NOMEMDRVFSTPAGEXOR APAGA PUSH BC ;переключатель страницPAGES EQU $+1CP 6JP NC,ERRORTLD (CURPAG),ACP 2JR C,PP1CP 4JR C,PP2INC APP2 INC APP1#ifdef HIMEMDRVJP PENT128#endifPENT128 AND 7OR 16OUTR LD BC,32765OUT (C),AERRORT POP BCRET#ifdef HIMEMDRVSETDRIVERLD (PP1+1),HLLD (PAGES),ARETPENT512 LD C,AAND 24RLARLARLALD B,ALD A,CAND 7OR BJR PENT128+2SCORP256LD (S1+1),AAND 8RLALD BC,#1FFDS2 OUT (C),AS1 LD A,0AND 7OR 16LD B,#7FJR OUTR+3PROFILD (S1+1),AAND 56RRCARRCARRCALD BC,#DFFDJR S2ATM LD (S1+1),AAND 24RRCARRCARRCALD BC,#FDFDJR S2#endif#endif;---- FDD --------; TR-DOS VARIABLESDRIVE EQU 23798DRIVE1 EQU 23800DRIVE2 EQU 23801TIMES EQU 23802CUR_TRK EQU 23797CUR_SEC EQU 23796FILNAME EQU 23773FILEXT EQU 23781FILLENG EQU 23784FILVOL EQU 23786FILSEC EQU 23787FILTRK EQU 23788TDOS#ifdef IM2MODCALL SUSPENDIM2#endifLD IY,23610EXXLD HL,10072EXXLD (ERR_ST+1),SPPUSH HLPUSH AFXOR ALD (HOWER+1),ALD L,ALD H,ALD (0x5D0F),HLLD A,195LD (23746),ALD HL,DRIVERLD (23747),HLPOP AFPOP HLLD (0x5C3D),SPCALL 0x3D13RETER#ifdef IM2MODCALL RESUMEIM2#endifLD A,195LD (23746),ALD HL,(0x5CB2)DEC HLDEC HLLD (HL),0x13DEC HLLD (HL),3LD (0x5C3D),HLLD (IY+0),-1HOWER LD A,0AND ARETDRIVER LD (ERHL+1),HLLD (ERDE+1),DELD E,ALD A,(23823)AND AJR NZ,ERR_STLD A,EPOP HLAND ALD DE,16SBC HL,DEJR Z,ERR_STZATYKERHL LD HL,0ERDE LD DE,0RETERR_ST LD SP,0LD A,(23823)LD HL,(YWIN)PUSH HLCALL D_ERRORXOR ALD L,ALD H,ALD (23823),HLPOP HLLD (YWIN),HLCPLLD (HOWER+1),AJP 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_CATPUSH HLLD HL,DISKBUFLD DE,0LD BC,0x0905CALL TDOS#ifndef NOFILERLD A,-1LD (HOW_READ+1),A#endifPOP HLRET ZLD HL,DISKBUFLD DE,DISKBUF+1LD BC,0x8FFLD (HL),LLDIRRET#endif#ifndef NOFILERFILER ;файлер HL-адрес таблицы сортировкиLD (STAKA+1),SPCALL WAITKEYLD (MSKADR+1),HLHOW_READ ;на выходе: в FILNAME-данные по файлуLD A,0REREAD=$+1AND 0CALL Z,READ_CATLD A,(HOWER+1)AND AJR NZ,STAKA1CALL CL_LISTLD A,8LD (LISA+3),AMSKADR LD HL,0CALL SEL_SORLD A,CLD (FILS),ACALL PARAMSLD IX,FIL_WINCALL WINDOWCP 255JR Z,STAKACP 254JP NZ,SELDLD L,CLD H,high(NUMLIST)LD C,(HL)CALL GET_FILELD DE,FILNAMELD BC,16LDIRSTAKA LD SP,0PUSH AFCALL CLOSEPOP AFRETSTAKA1LD A,0JP SELDLD (HOW_READ+1),ALD SP,(STAKA+1)RETFIL_WIN DEFB 8,8,16,14,15DEFB 0DEFW FIL_TXTDEFW FIL_LGTDEFW 0DEFW FIL_SPTDEFW 0DEFW 0#ifndef NOSLBDEFW 0#endifDEFW 0DEFW FIL_LSTDEFW SEL_DRVDEFW -1FIL_TXT DEFB 'Открыть файл:',13DEFB 'Диск:'DISKNAMEDEFB ' 'DEFB 13DEFB 'Файлов:'FILES DEFB '000',13DEFB 'Свободно:'DISKFRE DEFB '00000',0FIL_LGTDEFB 13, 3, 2, 1, 5DEFB 13, 4, 2, 1, 5DEFB 13, 5, 2, 1, 5DEFB 13, 6, 2, 1, 5LISA DEFB 1, 5,11, 8, 1DEFB 255FIL_SPTDEFB 13,3,2,1,1DEFW DI_ADEFB 13,4,2,1,1DEFW DI_BDEFB 13,5,2,1,1DEFW DI_CDEFB 13,6,2,1,1DEFW DI_DDEFB -1DI_A DEFB 255,254,160,2,199,244,168,2DEFB 207,244,168,18,200,20,0,0DI_B DEFB 255,254,160,10,207,228,160,18DEFB 207,228,168,18,207,228,0,0DI_C DEFB 255,254,160,2,207,244,160,2DEFB 200,4,168,2,199,244,0,0DI_D DEFB 255,254,160,2,207,228,160,18DEFB 200,20,168,18,207,244,0,0FIL_LST DEFB 4,8FILS DEFB 0DEFW 0FIL_DLT DEFB 0DEFW LISTDEFB 12DEFB -1SEL_DRV LD HL,(YWIN)LD DE,0x0D03ADD HL,DELD A,(DRIVE)AND 3LD (STAKA1+1),AADD A,LLD L,ACALL COOR_ATRLD (HL),2INC LLD (HL),2RETPARAMS LD HL,DISKBUF+0x800+0xE4LD A,(HL)LD DE,FILESLD C,0CALL STRINC HLLD E,(HL)INC HLLD D,(HL)PUSH HLLD HL,DISKFREEX DE,HLLD C,1CALL STRPOP HLLD DE,0xF5-0xE6ADD HL,DELD DE,DISKNAMELD BC,8LDIRRETSELD AND 3LD C,1CALL TDOSPUSH AFXOR ALD (HOW_READ+1),ALD (FIL_DLT),ACALL CLOSEPOP AFJP Z,HOW_READLD IX,NODEFWINCALL WINDOWPUSH AFCALL WAITKEYCALL CLOSEPOP AFJR SELDNODEFWIN DEFB 9,10,14,4,7DEFB 0DEFW NODTXTDEFW NODLGTDEFW -1NODTXT DEFB 'Выберите диск:',13,13DEFB ' A B C D',0NODLGT DEFB 1,2,3,1,3DEFB 4,2,3,1,3DEFB 7,2,3,1,3DEFB 10,2,3,1,3DEFB -1CL_LISTPUSH HLLD HL,LISTLD DE,LIST+1LD BC,LISTLEN-1LD (HL),LLDIRPOP HLRETSEL_SOR EXXLD HL,NUMLISTLD C,0EXXSORT_NAMELD DE,LISTSORTIR LD A,(HL)INC AJR NZ,NOLAEXXLD C,LRETNOLALD IX,DISKBUFSEARFL LD A,(IX+0)AND AJR Z,NEXMASKCP 32JR NC,SHOFILLD A,(SHOWDEL)AND ALD BC,16JR Z,NODELFLD (IX+0),'?'SHOFIL LD BC,0x301PUSH HLFINEX LD A,(HL)CP '?'JR Z,YAE1CP (IX+8)JR Z,YAE1LD C,0YAE1 INC HLINC IXDJNZ FINEXPOP HLBIT 0,CJR Z,NETOEEXXLD (HL),CINC HLLD (HL),0EXXLD B,8COPNMA LD A,(IX-3)LD (DE),AINC IXINC DEDJNZ COPNMALD A,32LD (DE),AINC DECALL CORRECCALL CORRECCALL CORRECINC IXINC IXSEARFL_ EXXINC CEXXJR SEARFLNETOE LD BC,13NODELF ADD IX,BCJR SEARFL_NEXMASK INC HLINC HLINC HLEXXLD C,0EXXJR SORTIRCORREC LD A,(IX-3)CP 48JR NC,OK_LLD A,32OK_L CP 123JR C,OK_SLD A,32OK_S LD (DE),AINC DEINC IXRET#endif ;NOFILER#ifndef NOLOADFILLOADFILE ;HL-NAME DE-ADRESSCALL FIND_FILEAND ARET NZLD HL,(FILSEC)LD A,(FILVOL)LD B,ALD C,5EX DE,HLJP 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 TEMPDEFFIND_FILEPUSH DEPUSH HLCALL READ_CATPOP HLLD DE,FILNAMELD BC,11LDIRLD HL,DISKBUFLD C,128SEAR LD DE,FILNAMEPUSH HLLD A,(HL)AND AJR Z,ENCATLD B,11CHECKSLD A,(DE)CP '?'JR Z,ANYSYMCP (HL)JR NZ,NETOTSANYSYM INC HLINC DEDJNZ CHECKSPOP HLPUSH BCLD DE,FILNAMELD BC,16LDIRPOP BCPOP DELD A,128SUB CLD C,AXOR ARETNETOTS POP HLLD A,16ADDHLADEC CJR NZ,SEARNOFF POP DELD A,-1RETENCAT POP HLJR 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 TEMPDEFGET_FILELD L,CLD H,0ADD HL,HLADD HL,HLADD HL,HLADD HL,HLLD DE,DISKBUFADD HL,DERET#endif#ifndef NOSAVEFILREWRDIAL DEFB 9,12,14,5,7DEFB 0DEFW REWTXTDEFW REWLGTDEFW REWHOTDEFW -1REWTXT DEFB 'Файл существует!',13,13DEFB 'Переписать',13DEFB 'Отмена',0REWLGT DEFB 0,2,14,1,3DEFB 0,3,14,1,3DEFB -1REWHOT DEFB 13DEFW 0DEFB 14DEFW 1DEFB -1SAVEFILEPUSH HLPUSH DELD DE,FILNAMEEX DE,HLCALL FIND_FILEAND AJR NZ,FYOKPUSH BCPUSH IXLD IX,REWRDIALCALL WINDOWPUSH AFCALL CLOSEPOP AFPOP IXAND AJR Z,PAAGEPOP HLPOP HLPOP HLLD A,-1RETPAAGEPOP BCFYOK POP DEPOP HLAND AJR NZ,NETFAILD (STHL+1),HLLD (STDE+1),DELD (FILLENG),DEDEC DELD B,DINC DEINC BLD A,(FILVOL)CP BJR NZ,DELREWPUSH HLCALL GET_FILELD DE,FILNAMEEX DE,HLLD BC,11LDIRPOP HLLD A,(FILVOL)LD DE,(FILSEC)JP SAFILADELREW PUSH HLCALL GET_FILELD (HL),1LD A,(DISKBUF+0x800+0xF4)INC ALD (DISKBUF+0x800+0xF4),ALD HL,DISKBUFLD DE,0LD BC,0x0906CALL TDOSPOP HLSTHL LD HL,0STDE LD DE,0JP SAVEFILENETFAIPUSH HL ;запись файлаLD (FILEM+1),DE ;DE-LENGHT IN BYTESDEC DE ;FILNAME-DATA FOR FILEINC D ;HL-STARTLD A,DLD (FLEN+1),ALD (SECLEN+1),ALD A,(HOWER+1)AND AJP NZ,NESTFLEN LD DE,0LD HL,(DISKBUF+0x800+0xE5)SBC HL,DEJR C,NOROMZJR Z,NOROMZLD A,(DISKBUF+0x800+0xE4)CP 128JR NC,NOROMZLD HL,DISKBUFLD DE,16FFREE LD A,(HL)AND AJR Z,ECATADD HL,DEJR FFREEECAT LD DE,FILNAMEEX DE,HLLD BC,11LDIRFILEM LD HL,0EX DE,HLLD (HL),EINC HLLD (HL),DLD DE,(DISKBUF+0x800+0xE1)INC HLSECLEN LD (HL),0INC HLLD (HL),EINC HLLD (HL),DLD HL,(DISKBUF+0x800+0xE5)LD DE,(FLEN+1)AND ASBC HL,DELD (DISKBUF+0x800+0xE5),HLLD HL,(DISKBUF+0x800+0xE1)LD (POSITZ+1),HLADD HL,DELD A,LAND 15LD E,AXOR LRRARRARRARRAADD A,HLD D,ALD (DISKBUF+0x800+0xE1),DELD A,(DISKBUF+0x800+0xE4)INC ALD (DISKBUF+0x800+0xE4),APOP HLPOSITZ LD DE,0LD A,(FLEN+1)SAFILA LD B,ALD C,6CALL TDOSLD HL,DISKBUFLD DE,0LD BC,0x0906JP TDOSNEST POP HLRETNOROMZ POP HLLD A,3#endifD_ERROR PUSH AFLD IX,NORWINCALL MAKEWINDPOP AFADD A,ALD HL,MESSTABADDHLALD E,(HL)INC HLLD D,(HL)LD HL,0x0102EX DE,HLCALL PRINTXYCALL WAITKEYCALL NOKEYCALL WAITKEYJP CLOSEMESSTAB DEFW WPROTDEFW DIRRORDEFW DIRRORDEFW NOROMDEFW NOROMDEFW NOROMDEFW NODISKDEFW DIRRORDEFW DIRRORDEFW DIRRORNORWIN DEFB 8,10,16,4,15DEFB 0DEFW ERTEXDEFW 65535ERTEX DEFB 'Ошибка:',0NOROM DEFB ' Нет места!',0DIRROR DEFB 'Проблема с диском!',0NODISK DEFB ' Нет диска!',0WPROT DEFB ' Диск защищен!',0;------- KBD&MICE ---------NOKEY XOR A ;процедура ожидания нажатия клавишиIN A,(254)XOR 31AND 31RET NZLD A,(SYSFLG)AND 4JR Z,NOKEYCALL REFFIRLD A,(FIRE)RLAJR NC,NOKEYRETWAITKEY XOR A ;процедура ожидания отпускания клавишиIN A,(254)XOR 31AND 31JR NZ,WAITKEYLD (23560),ALD A,(SYSFLG)AND 4RET ZCALL REFFIRLD A,(FIRE)RLAJR C,WAITKEYRETREFFIR PUSH HLPUSH DEPUSH BCLD HL,(X_C)LD DE,(X_M)LD C,0xDFCALL FIRMPOP BCPOP DEPOP HLRETgetkey:READKEY LD A,(23560);процедура определения текущей клавишиPUSH AFXOR ALD (23560),APOP AFCP 97RET CAND 223RETPOINT PUSH IXCALL PRINTShaltCALL RESTSPOP IXJP KEYSFIRA CALL KEYSFIR LD A,(FIRE)AND 128RLCALD (FIRE),ARRCARETPRINTS:LD BC,(X_C)LD A,B;CALL 0x22B0ld b,aand arrascfrraand arraxor band 0xF8xor bld h,ald a,crlcarlcarlcaxor band 0xC7xor brlcarlcald l,ald a,cand 0x07LD (PRINTA+1),HLLD (RESTS+1),HLLD (PRINTS1+1),ALD IX,BUFFERCCUR_ LD HL,KURS1LD A,8ALRD EX AF,AF'LD C,(HL)LD B,-1INC HLLD E,(HL)LD D,0INC HLPRINTS1 LD A,0AND AJR Z,OUK1LD D,ASCMSK SCFRR CRR BDEC AJR NZ,SCMSKLD A,DLD D,0SCSPR AND ARR ERR DDEC AJR NZ,SCSPROUK1PUSH HLPRINTA LD HL,0LD A,(HL)LD (IX+0),AAND COR ELD (HL),AINC HLLD A,(HL)LD (IX+1),ALD A,LAND 31JR Z,SKILINLD A,(HL)AND BOR DLD (HL),ASKILIN DEC HLINC IXINC IXCALL D_HLLD (PRINTA+1),HLLD A,HPOP HLCP 0x58RET NCEX AF,AF'DEC AJR NZ,ALRDRETRESTS: LD DE,0LD HL,BUFFERLD B,8RESTS1: LD A,(HL)LD (DE),AINC EINC HLLD A,EAND 31JR Z,NEXTL1LD A,(HL)LD (DE),ANEXTL1: DEC EINC HLCALL D_DELD A,DCP 0x58RET NCDJNZ RESTS1RETKEYSXOR ALD (FIRE),ACALL MOUSECALL KEYSCANLD HL,(ACSELL)LD A,HAND AJR NZ,KEYS1LD (ACSELL),ARETKEYS1 LD DE,(X_C)RRACALL C,RIGHTRRACALL C,LEFTRRACALL C,DOWNRRACALL C,UPLD (X_C),DERRAJR C,SETFIRRESFIRLD A,(SPEED)CP LRET CINC LLD (ACSELL),HLRETSETFIR LD A,128LD (FIRE),ARLCALD (ACSELL),ARETRIGHT EX AF,AF'LD A,EADD A,LCP EJR NC,RIG1LD A,-1RIG1 LD E,AEX AF,AF'RETLEFT EX AF,AF'LD A,ESUB LCP EJR Z,RIG1JR C,RIG1XOR AJR RIG1UP EX AF,AF'LD A,DSUB LBIT 7,AJR Z,UP1BIT 6,AJR Z,UP1XOR AUP1 LD D,AEX AF,AF'RETDOWN EX AF,AF'LD A,DADD A,LCP 191JR C,UP1LD A,191JR UP1KEYSCANCALL KEYscan1LD B,ACALL KEMPSTONOR BLD (CONTROL),ARETKEYscan1LD A,0x7F ;FIREIN A,(0xFE)RRACCFRL CLD A,0xFB ;UPIN A,(0xFE)RRACCFRL CLD A,0xFD ;DOWNIN A,(0xFE)RRACCFRL CLD A,0xDF ;LEFTIN A,(0xFE)CPLRRCARRCARL CRLCARLCA ;RIGHTRL CLD A,CAND 31RETKEMPSTONLD A,(SYSFLG)AND 8RET ZIN A,(0x1F)INC ARET ZDEC AAND 0x1FRETMOUSE LD A,(SYSFLG)AND 4RET ZLD HL,(X_C)LD DE,(X_M)LD BC,0xFBDFIN A,(C)LD B,ASUB ECP 128JR NC,TOLEFTADD A,LJR C,ERXOI1 LD L,ALD E,BJR PO_YERX LD A,255JR OI1TOLEFT NEGLD C,ALD A,LLD L,CLD C,0xDFSUB LJR NC,OI1XOR AJR OI1PO_Y LD B,0xFFIN A,(C)CPLLD B,ASUB DCP 128JR NC,TOUPADD A,HCP 192JR NC,ERYOI2 LD H,ALD D,BJR FIRMERY LD A,191JR OI2TOUP NEGLD C,ALD A,HLD H,CLD C,0xDFSUB HJR NC,OI2XOR AJR OI2FIRM LD B,0xFAIN A,(C)OR 248CPLLD B,AAND AJR Z,NO_KLICKLD A,(KEYMSK)AND AJR NZ,NOT_FIRSTLD A,BLD (KEYMSK),ANOT_FIRSTAND BJR Z,NO_KLICKLD A,128NO_KLICKLD (FIRE),ACOORDS LD (X_C),HLLD (X_M),DERETKURS1 DEFB 0xBF,0x00,0x0F,0x40,0x83,0x30,0x81,0x3C,0xC3,0x18,0xC1,0x14DEFB 0xE8,0x02,0xFD,0x00X_M DEFW 0KEYMSK DEFB 0BUFFER DEFS 16;----- UTILS --------D_HL INC HLD A,HAND 7RET NZLD A,LADD A,32LD L,ARET CLD A,HSUB 8LD H,ARETD_DE INC DLD A,DAND 7RET NZLD A,EADD A,32LD E,ARET CLD A,DSUB 8LD D,ARETU_HL: LD A,HDEC HAND 7RET NZLD A,LSUB 32LD L,ARET CLD A,HADD A,8LD H,ARETCOOR_Z LD A,L ;расчет адреса по знакоместамAND 7 ;L-Y H-XRRCARRCARRCAADD A,HLD H,LLD L,ALD A,HAND 0x18OR 64LD H,ARETATR_CONVERTLD A,HAND 0x18RRCARRCARRCAADD A,0x58LD H,ARETCOOR_ATR ;расчет адреса атрибутовLD A,H ;L-Y H-XLD H,LLD L,0AND AREPT 3RR HRR LENDRADD A,LLD L,ALD A,HOR 0x58LD H,ARETMULS ;HL=H*ELD L,0LD D,LCWERT REPT 8ADD HL,HLJR NC,$+3ADD HL,DEENDRRETMULT LD HL,0 ;HL=DE*AEX DE,HLREPT 8RRAJR NC,$+5EX DE,HLADD HL,DEEX DE,HLADD HL,HLENDREX DE,HLRETDIV ;BC=BC/DELD HL,0LD A,16SLA CRL BDIVL ADC HL,HLSBC HL,DEJR NC,$+3ADD HL,DERL CRL BDEC AJR NZ,DIVLLD A,BCPLLD B,ALD A,CCPLLD C,ARETDIVI;C=C/B A-REMAINDERXOR ARL CREPT 8ADC A,ASUB BJR NC,$+3ADD A,BCCFRL CENDRRETTWA LD A,47AND ATW1 INC ASBC HL,BCJR NC,TW1ADD HL,BCLD (DE),AINC DERETSTR ;перевод числа в десятиричный стринг;C=0 A-число DE- кудаDEC C ;C=1 HL-число DE- кудаJR NZ,ONEBLD BC,10000CALL TWALD BC,1000CALL TWALD BC,100CALL TWALD A,LEX DE,HLJR ONB2-2ONEB EX DE,HLLD C,47ONB1 INC CSUB 100JR NC,ONB1LD (HL),CINC HLADD A,100LD C,47ONB2 INC CSUB 10JR NC,ONB2LD (HL),CINC HLADD A,58LD (HL),AINC HLEX DE,HLRETVAL LD HL,0VALLOOP LD A,(DE)SUB '0'RET CCP 10RET NCADD HL,HLLD B,HLD C,LADD HL,HLADD HL,HLADD HL,BCADDHLAINC DEJR VALLOOPRECALC LD HL,(X_C)LD A,HAND 248RRARRARRALD E,ALD A,LAND 248RRARRARRALD D,ALD (Y_ZN),DERETCAL_CORPUSH HLLD L,ALD E,AXOR ALD H,ALD D,HADD HL,HLADD HL,HLADD HL,DEMOV E,D,WIN_ACTADD HL,DELD D,(HL)INC HLLD E,(HL)POP HLRETCAL_ABSLD A,(IX+WIN_YPOS)ADD A,ELD E,ALD A,(IX+WIN_XPOS)ADD A,DLD D,ARETADDRZ LD A,(YWIN)ADD A,EAND 0x18ADD A,64LD H,ALD A,(YWIN)ADD A,EAND 7RRCARRCARRCAADD A,DLD L,ALD A,(XWIN)ADD A,LLD L,ARETHITTESTLD A,HCP DRET CLD A,DADD A,BDEC ACP HRET CLD A,LCP ERET CLD A,EADD A,CDEC ACP LRET;---- VARIABLES ---;SYSTEM AREASYWIN DEFB 0 ;координаты окнаXWIN DEFB 0YSIZ DEFB 0 ;размеры окнаXSIZ DEFB 0YTXT DEFB 0 ;относительные координаты печатиXTXT DEFB 0X_C DEFB 0 ;координаты стрелки в пикселахY_C DEFB 0Y_ZN DEFB 0 ;координаты стрелки в знакоместахX_ZN DEFB 0FREE DEFW .SFB.(FREESEG) ;адрес свободной ячейки памятиWINS DEFB 0 ;количество открытых оконFIRE DEFB 0ACSELL DEFB 0CONTROL DEFB 0STAK DEFW 0#ifndef PRODUCESYSFLG DEFB 12 ;0#else ;1SYSFLG DEFB 8 ;2-MOUSE#endif ;3-JOYSTIC;-----------VARIABLES-------------------------------------------CORR_TABDEFB 124,255,93,91,255,255,255,255,125,123,92REESTR DEFS 20DEFB 126RUS_KBD DEFB ' !"#$%&''()*+,-./0123456789:;<=>?Ю' ;33DEFB 'АБЦДЕФГХИЙКЛМНОПЯРСТУЖВЬЫЗШЭЩЧъю' ;32DEFB 'абцдефгхийклмнопярстужвьызшэщчч' ;32 E=97DEFS 0x9FRK_SPRT DEFB 240,144,144,96 ,144,144,240#ifndef NOMEMDRVCURPAG DEFB 0#endifSTAKP DEFW 0CURNAME DEFS 11;#if low($)>0;DEFS 255-low($);#endif;_PARA;FONT INCBIN "FONT6X8ENDCOVER