;z80 ;zx-spectrum ;assembler ;Text files for FWORD FOR GENS: ;GB2DA_TG ;GB2DB_TG ;GB2DC_TG ;GB2D_R - ресурсный файл ; ;Command of compilation: A16,3111,1:GB2D_O ; ; ;GRAND'S BOOT V2.2DS demo ;(C) 1997 - 2005 Grand ;(C) 2006, 2007 Grand (подготовка к публикации) ; ; ;АДРЕС ЗАПУСКА - по метке RUN! ; ;Регистр IY должен содерж.зн. 23610! ;Флаговый байт по адресу 23664 (IY+54): ;b0...b4 - не исп. ;b5=1 - конф.памяти 48K ;b6=1 - есть DirSys ;b7=1 - работает вход в подкаталог ; ;Описание байтов вектора окна ;в конце файла! ; ; DIRSYS EQU 1 ;Directory System: 0 -нет,1 -есть ;Со значением DIRSYS EQU 0 не тестиривалось! :-) ; ; ;Адреса рабочих областей: SCRN EQU 25013 ;Фоновая картинка (длина 6912 байтов) T_CAT EQU 31925+1 ;Таблица номеров каталогов ;и файлов, отображаемых на файловой панели (261 б.), ;далее - таблица номеров каталогов пути панели (128 б.) CatTrk EQU T_CAT+261+128;0-я дорожка текущего ;диска - 16 сект. (4096 б.) ; ;Адреса в файле GB2D_R: F64 EQU 36411 ;64-х симв-й шрифт ;специального формата (392 б.) M_ICN EQU F64+392 ;Оконные пиктограммы (304 б.) ; ; SU_IDN EQU #3FD ;Идентификатор Setup-сектора ; ; ORG 37107 ; ;Графика ;Логотип (72 б.) LOGO DEFB 0,#1C,1,#C0,0,#1F,#8F,#C0,0,3 DEFB #FE,#C0,0,#1C,"q",#C0,0,#FF,#8F,#C0 DEFB 7,#E3,#FE,0,7,#1C,"p",0,6,#FF,#80 DEFB 0,7,#E3,#F0,0,7,0,"p",0,0 DEFB 0,0,0,0,0,0,0,0,0,0,0 DEFB 8,0,9,#12,"C",#19,#A,#AA,"*",#A3 DEFB #89,#9A,"*",#9A,8,#8A,#C0,1,3,"0" ; ;Переключатели (16 б.) WK_ICN DEFB 0,#FE,#82,#82,#82,#82,#82,#FE;[ ] DEFB 0,#FE,#C6,#AA,#92,#AA,#C6,#FE;[*] DEFB 0,#38,#44,#82,#82,#82,#44,#38;( ) DEFB 0,#38,#44,#BA,#BA,#BA,#44,#38;(*) ; ; *L+ RUN DI ;RUN Адрес ЗАПУСКА программы! *L- LD A,128 LD (T_CAT-1),A LD HL,201 LD (23746),HL ; LD A,9 ; LD (23814),A LD HL,(23613) LD (_SP+1),HL LD SP,65368 LD HL,ERROR PUSH HL LD (23613),SP ; ; ;Проверка 128-и Кб памяти ;(Эта и следующая процедуры в оригинальной ;версии находятся в загрузчике). RES 5,(IY+54) LD A,#10 LD HL,#C011 LD BC,#7FFD OUT (C),A LD (HL),B OUT (C),L LD (HL),A OUT (C),A CP (HL) LD (23388),A JR NZ,$+6 SET 5,(IY+54) ;Удаление BASIC-программы LD HL,(23635) LD (23627),HL LD DE,(23641) EX DE,HL DEC HL CALL 6629 LD HL,1 LD (23618),HL LD (IY+10),H RES 3,(IY+48) ; LD HL,SCRN LD DE,SCRN+1 LD BC,6143 LD (HL),0 LDIR LD BC,767 INC HL INC DE LD (HL),7 LDIR ; ; ;Проверка на налич.Kempston'а LD B,0 LD A,#FF IN A,(#1F) OR #FC INC A JR Z,$+9 ;Переход,если джойстика нет DJNZ $-9 LD A,#2F LD (Kempst+1),A ; ;Определение версии TR-DOS LD HL,19 LD C,L CALL 15635 LD A,(23779) CP #BD JR NZ,$+16 ;Z=1 V5.01 LD HL,12151 LD (STPDSK+2),HL LD HL,683 LD (TRDOS+1),HL JR $+11 CP 7 JR Z,$+7 ;Z=1 V5.03 LD A,#C9 LD (TRDOS+3),A EI ; ; LD IX,W1-2;Уст.курсора (^) на первую опцию LD A,7 ADD A,(IX+2) LD L,A LD A,2 ADD A,(IX+3) CALL LABCB ; ;Установка переключателей окна Setup ;в соответствии с конфигурацией памяти LD IX,W2 BIT 5,(IY+54);1-48K LD BC,#1101 JR NZ,conf0 BIT 4,(IY+1);1-128BASIC JR NZ,conf1 INC B LD A,(IX+29) CP B JR Z,HOLD CP #11 JR Z,conf0-2 LD A,(IX+30) CP 3 JR NZ,conf0 JR conf0-2 conf1 LD A,(IX+29) LD BC,#1303 CP B JR Z,HOLD CP #12 JR NZ,conf0 LD A,(IX+30) CP 1 JR NZ,conf0 LD C,2 conf0 LD (IX+29),B LD (IX+30),C JR HOLD ; ; CALL CL_W ;HOLD-3 HOLD LD HL,0 ;Полный рестарт LD (23823),HL XOR A LD (Nr_Pg+1),A LD (N_Pg+4),A DEC A LD (23610),A LD H,A ;L=0,H=255 LD (d_name+3),HL LD HL,END LD (op_w+1),HL;Уст-ет тек.адрес в ;области, где сохран-ся фрафмент экрана, ;который под открытым окном ; ; LD HL,ERROR2 LD SP,(23613) EX (SP),HL LD A,2 LD (23659),A LD HL,#1721 LD (23690),HL;SPONSL XOR A LD (CatTrk),A LD (CatTrk+2048+228),A IF DIRSYS LD (t_cat+1),A;Уст.тек.ном.кат-га LD HL,T_CAT+256+5 LD (ds4+1),HL RES 6,(IY+54) RES 7,(IY+54) END LD A,(23798) LD (L23833+1),A LD C,1 ;Настройки на: CALL 15635 ;-дисковод LD C,#18 ;-диск CALL 15635 LD HL,CatTrk LD DE,0 IF DIRSYS LD BC,#1005 ELSE LD BC,#0905 END CALL 15635 LD A,(CatTrk+2048+231) CP #10;Диск TRDOS? LD A,0 JR Z,$+5 LD (CatTrk),A LD (CatTrk+2048+0),A;Маркер ;конца каталога на случай,если в нем 128 ф. ; ; IF DIRSYS ;Пров.DirSys V1.00 LD HL,(CatTrk+2304+7) LD DE,#3173;"s1" SBC HL,DE JR NZ,cat_t5 LD HL,(CatTrk+2304+9) LD DE,#3030;"00" SBC HL,DE JR NZ,cat_t5 LD HL,CatTrk+2304+267 LD BC,1398 CPIR JR NZ,cat_t5 EX DE,HL DEC DE LD HL,CatTrk+2304+2 ;Подсчет контр.суммы ;Вход: HL -начальн.адр.блока ;DE -конеч..адр.блока ;Вых.: BC -контр.сумма блока LD BC,0 CRC1 PUSH DE LD A,C XOR (HL) LD E,A PUSH BC PUSH HL LD BC,0 LD D,8 CRC2 PUSH BC LD A,C RRA LD A,B RRA LD B,A LD A,C RRA LD C,A POP HL LD A,E XOR L AND 1 JR Z,CRC3 LD A,B XOR #A0 LD B,A LD A,C XOR 1 LD C,A CRC3 LD A,E RRCA AND #7F LD E,A DEC D JR NZ,CRC2 POP HL POP DE LD A,D XOR C LD C,A LD A,E XOR B LD B,A INC HL POP DE LD A,H CP D JR NZ,CRC1 LD A,L CP E JR NZ,CRC1 LD A,C LD C,B LD B,A LD HL,(CatTrk+2304) SBC HL,BC JR NZ,$+6 SET 6,(IY+54);Есть DS END ; ; cat_t5 JP $+3 LD HL,cat_t0 LD (cat_t5+1),HL ; LD HL,CatTrk;Загрузка фоновой LD BC,2048 ;картинки cat_t7 LD DE,SETUP+2;Адрес образца имени LD A,(DE) CPIR JR NZ,cat_t0 INC DE PUSH BC PUSH HL LD BC,8 cat_t6 LD A,(DE) CPI JR Z,$+6 POP HL POP BC JR cat_t7 INC DE JP PE,cat_t6 INC HL INC HL INC HL INC HL INC HL LD E,(HL) INC HL LD D,(HL) LD HL,SCRN LD BC,#1B05 CALL 15635 ; ; cat_t0 LD HL,W2-2+20;Рестарт с пересозданием LD A,(HL) ;каталога (по новой маске, INC HL ;или при входе в подкаталог) INC HL LD E,(HL) RR E RLA INC HL INC HL INC HL INC HL LD E,(HL) RR E RLA ;Установленные биты: ; b0-All files, ; b1-Capital leters, ; b2-Deleted files LD (IY+37),A ; ; ;Создание таблицы номеров отображаемых ;файлов на панели. Номера от 0 до 127, у ;номеров каталогов установлен старший бит ;*Обработка кат-гов LD DE,T_CAT;Адр.таблицы IF DIRSYS BIT 6,(IY+54);Z=1 - нет DS JR Z,ds0 LD A,(t_cat+1) OR A JR Z,$+6 LD A,128 LD (DE),A INC DE LD IX,CatTrk+2304+139;Адр.табл.ном.к-гов LD B,1 t_cat LD A,0;Храниться лог.номер текущего к-га CP (IX) JR NZ,ds1 LD L,B;Принятие номера кат-га PUSH DE CALL FIN_DN POP DE LD A,(HL) CP 1 ;Удален? JR Z,ds1 OR A ;Конец? JR Z,ds0 LD A,B OR 128 LD (DE),A INC DE ds1 INC IX INC B LD A,B CP 127;Предельное число кат-гов? ;ОШИБКА: должно быть: CP 128! JR NZ,t_cat END ;*Обработка файлов ds0 LD (cat_t4+1),DE;Текущий адрес в таблице XOR A;Начало с 0-го файла ds2 LD DE,(cat_t4+1);Занос в таблицу ;идентификаторов имен устройств на случай ;завершения обработки LD (dev_nm+1),DE;Адрес начала ;идентификаторов имен устройств в таблице PUSH AF LD A,#FB ;#FB - [boot], #FC..#FD - [A:]..[D:] LD (DE),A INC DE INC A JR NZ,$-3 POP AF LD HL,CatTrk+2048+228;Кол-во ф-в на диске CP (HL) JP Z,cat_tE IF DIRSYS BIT 6,(IY+54);Z=1 - нет DS JR Z,ds3 LD B,A LD HL,CatTrk+2304+11;Таб-ца ном-в ;кат-гов файлов CALL ADHL_A LD A,(t_cat+1);Тек.ном.кат-га CP (HL) LD A,B JP NZ,cat_nx+1 END ds3 PUSH AF CALL x16-3 PUSH HL POP IX LD A,(IX) BIT 2,(IY+37);Deleted? JR NZ,$+6 CP 1 JR Z,cat_nx LD A,(IX+8) CP "B" ;Тип файла ? JR NZ,cat_t3 BIT 1,(IY+37);Capital? JR Z,cat_in PUSH IX LD BC,#800 cat_t8 LD A,(IX) CP ":" JR NC,$+3 XOR A AND %10100000 OR C LD C,A INC IX DJNZ cat_t8 POP IX JR Z,cat_in JR cat_nx cat_t3 BIT 0,(IY+37);All files? JR Z,cat_nx cat_in POP AF ;A -ном.обрабатываемого ;файла cat_t4 LD DE,0 LD (DE),A INC DE LD (cat_t4+1),DE JR cat_nx+1 cat_nx POP AF INC A JP ds2 ; ; cat_tE XOR A LD (Nr_Pg+1),A;Лог.номер отображаемой ;страницы панели LD (N_Pg+4),A LD HL,T_CAT EX DE,HL SBC HL,DE LD C,L ;Всего пунктов LD B,H ;Расч.кол-ва стр. CALL 11563 ;BC стек кальк. LD A,16 ;Ф-лов на стр. CALL 11560 RST 40;Расчет с пом.калькулятора DEFB #32 DEFB #38 CALL 8967 XOR A CP C JR Z,$+3 INC B LD A,B LD HL,N_Pg+4 LD (HL),A DEC (HL) ;Макс.ном.страницы CALL 11560 ; ;Расчет длины "ползунка" LD A,88 ;Максимальная дли- ;на "ползунка" в пикс. CALL 11560 RST 40 DEFB 1,50,#38 CALL 11733 LD (SB_Len+1),A CALL 11733 LD (SB_Len+2),A ; ;Обработка параметров для отображения ;заголовка окна панели IF DIRSYS LD A,(t_cat+1) OR A JR NZ,ds7 LD DE,d_name LD A," " LD (DE),A INC DE LD (DE),A INC DE LD (DE),A INC DE LD A,(23798) ADD A,"A" LD (DE),A INC DE LD A,":" LD (DE),A INC DE ELSE LD A,(23798) ADD A,"A" LD (d_name),A LD A,":" LD DE,d_name+1 LD (DE),A INC DE END LD HL,CatTrk+2048+245 LD BC,8 LDIR IF DIRSYS ds7 LD DE,d_name+12 ELSE DEC DE END LD H,D LD L,E IF DIRSYS LD B,13 ELSE LD B,10 END LD A,(HL) CP " " JR NZ,$+5 DEC HL DJNZ $-6 IF DIRSYS LD A,13 ELSE LD A,10 END SUB B JR Z,rest LD C,A LD A,(HL) LD (DE),A DEC HL DEC DE DJNZ $-4 LD B,C LD A," " LD (DE),A DEC DE DJNZ $-2 ; rest IF DIRSYS LD IX,W1-2 LD HL,(op_w+1) LD DE,END OR A SBC HL,DE LD HL,T_MEN CALL NZ,PRINT;Если какое-то окно ;уже открыто,то печ.заголовка панели END ; ; WARM LD SP,(23613);"Теплый" рестарт LD HL,ERROR EX (SP),HL LD IX,W1-2 IF DIRSYS BIT 7,(IY+54);b7=1-работа- ;ет вход в подкаталог JR Z,$+7 CALL PR_PG JR mmenu END LD HL,SCRN LD DE,16384 LD BC,6912 LDIR LD HL,END LD (op_w+1),HL ; CALL op_w ;Открытие окна, ;в IX адрес вектора mmenu LD IX,W1-2 CALL SEL^ ;mmenu+4 JP NC,EXE JR NZ,opsel8;Если CY=1 и Z=1, ;то выбирается QUIT JP QUIT ; opsel8 CALL XYTAAT ;Проверка выбора пиктограмм LD DE,(OP_W+1) LD B,7 ;Кол-во пикт-мм LD A,32 CALL ADHL_A OR A SBC HL,DE JR Z,icn_ex ADD HL,DE DJNZ $-11 LD BC,354 ADD HL,BC CALL chkU_D JP Z,N_Pg LD BC,555-5 OR A SBC HL,BC CALL chkU_D JP Z,P_Pg JR mmenu+4 chkU_D LD B,6 OR A SBC HL,DE RET Z ADD HL,DE INC HL DJNZ $-6 RET icn_ex LD A,B CP 6 JP Z,SU CP 5 JP Z,INFO CP 3 JR Z,P_Pg CP 2 JP Z,N_Pg CP 4 JR Z,H_Pg CP 1 JR Z,E_Pg ; RES 7,(IX+17) CALL MOVE_W;Перемещ.окна SET 7,(IX+17) JP WARM ; ;Обработка перелистывания страниц панели E_Pg LD HL,Nr_Pg+1;End page LD A,(N_Pg+4) CP (HL) JP Z,mmenu+4 LD (HL),A JR Pg_Pr H_Pg LD HL,Nr_Pg+1;Home page XOR A CP (HL) JP Z,mmenu+4 LD (HL),A JR Pg_Pr P_Pg LD HL,Nr_Pg+1;Prev.page XOR A CP (HL) JP Z,mmenu+4 DEC (HL) JR Pg_Pr N_Pg LD HL,Nr_Pg+1;Next page LD A,3 ;N_Pg+4 ;Максим.лог.номер страницы CP (HL) JP Z,mmenu+4 INC (HL) Pg_Pr CALL PR_PG JP mmenu+4 ; ; EXE CP 128 JR C,Txt_Pg ; LD HL,(direct);Обработка выбора ;"горячих" клавиш RLC L JP NC,opsel8 LD A,(23610-50) CP 4 JP Z,P_Pg CP 5 JP Z,N_Pg CP "r" JP Z,HOLD-3 IF DIRSYS BIT 6,(IY+54);1-есть DS JR Z,$+6 CP 12 ;"Del"? JR Z,ds6-7 END CP "1" JP C,opsel8 CP "4"+1 JP NC,opsel8 DEC A JR ds10 ; Txt_Pg LD HL,0 ;Хранится адрес номера ;первого файла на отображаемой странице в таблице ;номеров файлов панели CALL ADHL_A LD DE,(dev_nm+1) OR A PUSH HL SBC HL,DE POP HL LD A,(HL) JR C,Tx_Pg6 CP #FB LD HL,run_b-start+23464;Старт boot JP Z,exe5 ds10 AND 3 LD (23798),A JP HOLD-3 Tx_Pg6 IF DIRSYS CP 128 JR C,exe0 ;вход в подкат-г AND %01111111 JR Z,ds6 PUSH AF LD A,(t_cat+1) ds4 LD HL,0 LD (HL),A INC HL LD (ds4+1),HL POP AF ds8 LD (t_cat+1),A LD L,A CALL FIN_DN LD DE,d_name LD A,"\" LD (DE),A INC DE LD BC,11 LDIR EX DE,HL LD A," " LD (HL),A DEC HL;$-2 CP (HL) JR Z,$-2 INC HL LD (HL),"\" SET 7,(IY+54);+11 JP cat_t0 LD A,(t_cat+1);ds6-7 OR A JP Z,mmenu+4 ;выход из подкат-га ds6 LD HL,(ds4+1) DEC HL LD (ds4+1),HL LD A,(HL) JR ds8 ;Нахождение имени подкат-га по его номеру FIN_DN LD H,0 LD DE,11 CALL 12457 LD DE,CatTrk+2304+267-11;Адрес ;списка имен к-гов ADD HL,DE RET END ; ;ЗАПУСК файла, в A его номер exe0 CALL x16-3 ;В HL адрес описателя файла LD A,(HL) ;в каталоге, который запускается DEC A;Стертый файл? JP Z,mmenu+4 LD DE,23773 LD BC,16 LDIR LD A,(W2+27) RRA EX AF,AF' ;CY=1-операция LOAD LD A,(23773+8);Тип файла LD BC,(23773+9) LD HL,#C900 CP "C";? JP NZ,exe1 EX AF,AF';Start JR C,$+4 LD L,#C5 LD (runC),HL LD HL,24843 SBC HL,BC JP NC,mmenu+4 CALL 11563 RST #28 DEFB #2E,#38 CALL #2BF1;Число со стека ;калькулятора в рег-ы AEDCB PUSH DE PUSH DE EX DE,HL LD DE,T_St LDIR POP HL LD DE,T_Run LD BC,5 LDIR POP HL LD DE,T_Ram LD BC,5 LDIR EX DE,HL LD A,"/" DEC HL ;$-7 DEC (HL) CP (HL) JR NZ,exe2 LD (HL),"9" JR $-7 exe2 CALL #16B0;Очистка рабочих областей BASIC LD IX,W5-2 CALL OP_W ;+7 CALL SEL^ ;+10 JP C,INFO+7 CP 3 JR Z,exe3 LD B,A EX AF,AF' INC B LD A,0-16 ADD A,16 DJNZ $-2 LD HL,T_Ram CALL ADHL_A EX AF,AF' ADD A,2 CALL EDITOR JP C,INFO+7 LD HL,t_run CALL PRINT JR exe2+10 exe3 CALL CL_W LD HL,T_St CALL STR_NR LD (a_strt+1),BC LD HL,T_Run CALL STR_NR LD (a_runC+1),BC LD HL,T_Ram CALL STR_NR LD (RAMTOP+1),BC LD HL,(23784);Дл. XOR A CP L ADC A,H LD (l_strt+2),A LD HL,a_strt-start+23464 exe5 LD (r_strt+1),HL LD IX,W1-2 JR exe4 ; exe1 CP "B";? JP NZ,mmenu+4 EX AF,AF';Start BASIC LD H,0 LD (runC),HL LD A,#C9 JR C,$+3 ;CY=1-операция LOAD LD A,H ;NOP LD (runB),A LD HL,(23782);Общая длина INC HL INC HL INC HL INC HL XOR A CP L ADC A,H LD (l_strt+2),A exe4 BIT 5,(IY+54);Z=1-128K JR NZ,QUIT-1 BIT 4,(IY+1);Z=1-Работает 48BASIC LD A,(W2+30) JR Z,$+9 CP 3 JR Z,exe48 RRCA JR C,QUIT-1 RRCA ;$+9 JR C,exe48+7 exe48 LD BC,#7FFD LD A,%110000 OUT (C),A RES 4,(IY+1);exe48+7 LD HL,(_SP+1) LD (HL),3 INC HL LD (HL),#13 AND A;Сброс CY ;Процедура выхода/запуска файла, если ;CY=1, то выход QUIT CALL CL_W LD HL,G64CP LD DE,G64CP+1 LD BC,SETUP-G64CP DI LDIR LD A,B LD (#5C44),A;NSPPC LD HL,#221 LD (23688),HL LD H,#17 LD (23690),HL;SPONSL LD A,H LD (23692),A ; LD HL,(23635);Эквивалент DEC HL ;BASIC-оператора LD (23639),HL;RESTORE ; RES 7,(IY+1) LD HL,start LD DE,23464;TSTACK LD BC,quit-start LDIR _SP LD HL,0 LD (23613),HL LD SP,HL;На (SP) адрес процеду- ;ры обработки ошибок LD HL,quit JR C,RAMTOP-1 LD A,(L23833+1) LD (23833),A r_strt LD HL,23464;TSTACK PUSH HL ;-1 RAMTOP LD HL,65367 PUSH HL EI JP 7878;Устанавливает RAMTop ;без очистки экрана и BASIC-переменных ; start LD HL,(23635);Эту процедуру ;НЕЛЬЗЯ УВИЛИЧИВАТЬ! LD BC,(23782);BC-длина BASIC-программы ;с переменными PUSH HL PUSH HL CALL 5717;MAKE_ROOM-выделение BASIC-области POP HL LD BC,(23784);BC-длина BASIC-прогр. ADD HL,BC ;Установка перемен- LD (23627),HL;ной VARS POP HL JR $+5 a_strt LD HL,#2121 LD DE,(23787) l_strt LD BC,#0505 CALL 15635 a_runC LD BC,#0101 runC PUSH BC RET LD HL,(23641);Установка DEC HL ;маркеров LD (HL),128 ;конца INC HL ;BASIC-программы LD (HL),#AA INC HL LD A,(HL) LD B,A INC HL OR (HL) JR NZ,$+3 runB RET ;|INC B LD H,(HL) LD L,B LD (23618),HL;NEWPPC SET 7,(IY+1);Флаг установлен при ;выполнении BASIC-программы JP 7030;Запуск BASIC-интерпретатора ; run_b LD HL,line-start+23464 LD (23645),HL JP 15619 line DEFB 234,":",247,13 ; ;Финишная процедура выхода; ячейка 23661 должна ;устанавливаться в загрузчике: если она равна 0, то ;GBOOT запускался из командной стоки BASIC, ;иначе - из среды TR-DOS quit LD A,(23661) OR A EI RET NZ LD HL,23746 PUSH HL JP 15616 ; STR_NR LD DE,(23645);CH_ADD PUSH DE LD (23645),HL LD A,(HL) CALL 11448;Конвертация строки числа ;в байтовое значение и занос на стек кальк-ра CALL 11682;Снятие числа со стека ;кальк-ра в BC, если CY=1, то значит число > 65535 POP HL LD (23645),HL JP C,7839 LD HL,24842 SBC HL,BC JP NC,7839 RET ; ; ;Определение адреса в дисплейной области ;из текстовых координат XYTADF LD H,(IX+3) ;Y LD L,(IX+2) ;X LD C,H ;XYTADF+6 LD A,C AND #18 OR #40 LD H,A LD A,C AND 7 RRCA RRCA RRCA ADD A,L LD L,A RET ; ;Определение адреса ячейки атрибута ;из текстовых координат XYTAAT LD H,(IX+2) LD L,(IX+3) LD A,H ADD HL,HL ADD HL,HL ADD HL,HL LD H,#16 ADD HL,HL ADD HL,HL ADD A,L LD L,A RET ; ;HL=HL+A ADHL_A ADD A,L LD L,A RET NC INC H RET ; ; ;Закрашивание дисплейной области ;Вх:HL -адр.на экране, ; B -ширина в зн-местах, C -высота в пикс. FILL PUSH HL LD HL,#FF3E;LD A,#FF JR GRAPH+4 ; ;Вывод спрайта в дисплейную область ;Вх: в дополн.к предыдущему: DE -адрес спрайта в памяти GRAPH PUSH HL LD HL,26 ;LD A,(DE)\NOP LD (LA7B1+2),HL POP HL LA7B1 PUSH HL PUSH BC LD A,(DE) NOP LD (HL),A INC DE INC HL DJNZ $-5 POP BC POP HL CALL ADF_I DEC C JR NZ,LA7B1 RET ; ;Нахождение адреса нижней линии из адреса ;текущей (в HL) ADF_I INC H LD A,H AND 7 RET NZ LD A,L ADD A,#20 LD L,A RET C LD A,H SUB 8 LD H,A RET ;Звук SOUND PUSH AF PUSH HL PUSH DE PUSH BC LD DE,2565 LD HL,1000 XOR A OUT (254),A ;$-13 XOR #10 EX AF,AF' LD A,(HL) INC HL ADD A,E LD B,A DJNZ $-0 EX AF,AF' DEC D JR NZ,$-13 POP BC POP DE POP HL POP AF RET ; ; ;Опред.сигнала от Kempston-дж. Kempst XOR A RET ;47 - CPL IN A,(31) AND %00011111 RET Z ;Z=1-не нажат LD HL,23610-50 LD (HL),H RET ;Задержка до отпускания клавиши PRES_K XOR A IN A,(#FE) CPL AND %00011111 CALL Z,Kempst JR NZ,PRES_K RET ; ;Инверсия строки атрибутов Inv_At LD B,(IX+13) LD A,(HL) ;+3 AND %00000111 ADD A,A ADD A,A ADD A,A LD C,A LD A,(HL) AND %00111000 RRCA RRCA RRCA OR C LD C,A LD A,(HL) AND %11000000 OR C LD (HL),A INC HL DJNZ Inv_At+3 RET ;Опред-ие адреса ячейки атрибута по ;адресу в дисплейной области L9D76 LD HL,(xplace) LD A,H AND #18 RRCA RRCA RRCA OR #58 LD B,A LD C,L RET ; ; LD HL,name+1;-5 INC (HL) DEC HL ;Печать строки в окне ;Вх.: HL - адрес строки (заканч.#FF) ;Возможен управляющий код 22-AT PRINT LD A,(HL) CP #FF RET Z CP 130 JR C,print-3 LD A,"?" CALL PRINTA print INC HL JR PRINT ; ;Печать полной спецификации файла PR_SPE LD A,(23798) ADD A,"A" CALL G64CP LD A,":" CALL G64CP LD HL,23773 ;Печать имени файла PR_F_N LD B,8 LD A,(HL) ;HL-адрес имени CALL PRINTS-4 INC HL DJNZ PR_F_N+2 LD A," " CALL PRINTA LD A,"<" CALL PRINTA LD A,(HL) CALL PRINTS-4 LD A,">" CP " ";PRINTS-4 ;Упр.коды в именах отсекаются JR C,PRINTA-2 PRINTS CP 20 JR C,$+6 CP 128 JR C,PRINTA LD A,"?";PRINTA-2 ;Печать символа из A PRINTA PUSH HL PUSH DE PUSH BC CALL G64CP POP BC POP DE POP HL RET ; ; CALL OP_W ;Процедура работы с курсором-стрелкой ; С.Колотов (из ZX-Ревю 9/1996) ;Модифицировал Grand ;Вх:IX-адрес вектора текущего окна ;Вых.: (окно не закрывает!) ;* если CY=0 и регистр A<128,то выбрана опция, ;ее номер в A (от 0 до n), если A=128,то нажата ;"горячая" клавиша; ;* если CY=1 и Z=0 -выбрана работа с переключателем, ;при Z=1 -выбрано закрытие окна. SEL^ CALL PRES_K LD HL,0 LD (ad_opc),HL CALL initmv LA7EA RES 5,(IY+1) CALL LA99C CALL L9D76 LD (OP_W+1),BC LD A,(IX+10) LD (LB125+1),A OR A JR Z,LA858 LD A,(IX+3) ADD A,(IX+12) LD L,A LD A,(IX+2) ADD A,(IX+11) LD H,A CALL XYTAAT+6 XOR A LA804 PUSH HL PUSH HL SCF SBC HL,BC JR C,LA823 POP HL POP HL LA80D XOR A LD (LB125+1),A LD HL,(ad_opc) LD A,H OR L JR Z,LA858 CALL Inv_At LD HL,0 LD (ad_opc),HL JR LA858 LA823 LD E,(IX+13) LD D,0 POP HL ADD HL,DE INC A SCF SBC HL,BC POP HL JR C,LA84B LD (LB125+1),A LD DE,(ad_opc) OR A SBC HL,DE ADD HL,DE JR Z,LA858 EX DE,HL CALL Inv_At EX DE,HL LD (ad_opc),HL CALL Inv_At JR LA858 LA84B LD E,(IX+14) LD D,0 ADD HL,DE CP (IX+10) JR NZ,LA804 JR LA80D LA858 CALL DIRSCN ;Сканирование клавиат. OR A CALL Z,initmv JR Z,LA858 CALL LA939 ;Перемещение ^ HALT CALL LAA18 ;Восстан.места под ^ LD A,(direct) AND %10010000 JP Z,LA7EA CALL SOUND AND %10000000 PUSH AF LD HL,(ad_opc) LD A,H OR L CALL NZ,Inv_At POP AF RET NZ CALL 8020;Проверка нажатия BREAK JR C,LB125;CY=1 -не нажато IF DIRSYS RES 7,(IY+54) END SCF RET LB125 LD A,2 SUB 1 RET NC ;Обработка "выбор" BIT 1,(IX+17) ;Нет пиктогр.в окне? JP Z,Sel^1 CALL XYTAAT ;Закрытие окна? LD BC,(OP_W+1) OR A SBC HL,BC SCF RET Z LA8A3 BIT 2,(IX+17);Z=1-нет выключателей JP Z,Sel^1 CALL XYTADF LD (LA710+1),HL PUSH IX LD DE,18 ADD IX,DE LD A,(IX) ;Есть выключатели? INC IX OR A JR Z,LA8F2 LD B,A;Обработка LA8C0 PUSH BC CALL LA711 PUSH AF PUSH HL CALL L9D76+3 LD HL,(OP_W+1) OR A SBC HL,BC JR NZ,LA8EB LD A,(IX) XOR 1 LD (IX),A POP HL POP AF CCF INC IX CALL LA728 POP AF DEC A ADD A,A LD C,A LD B,0 ADD IX,BC JR prwpr2 LA8EB POP HL POP HL POP BC INC IX DJNZ LA8C0 LA8F2 LD A,(IX) ;Есть переключатели? OR A JR Z,prwpr2 LD D,A LA8F9 CALL KrdPrk ;Выx.:E-кол-во сос- ;тавляющих переключателя PUSH HL ;HL-дисплейный ;адрес первого перек-ля CALL L9D76+3 ;IX-интерв./полож. LD H,B ;HL-атрибутный адрес перек-ля LD L,C LD BC,(OP_W+1);Атрибутные коорд-ты ^ XOR A SBC HL,BC JR NZ,LA91C LD (IX),E POP BC DEC IX DEC IX DEC IX CALL LA736 JR prwpr2 LA91C POP HL LD B,8 CALL op_su3;IntPrk DEC E JR NZ,LA8F9+3 DEC D JR NZ,LA8F9 prwpr2 POP IX Sel^1 BIT 4,(IX+17) RET NZ CALL XYTAAT LD DE,(OP_W+1);Проверка на выход ^ LD C,(IX+4) ;за границу окна Sel^2 LD B,(IX+5) OR A SBC HL,DE JP Z,SEL^ ADD HL,DE INC HL DJNZ $-8 LD A,32 SUB (IX+5) CALL ADHL_A DEC C JR NZ,Sel^2 SCF RET initmv LD HL,step LD DE,stpcnt LD BC,3 LDIR RET LA939 LD A,(direct) PUSH AF CALL LA962 POP AF LD C,A RRCA AND 5 XOR C LD B,A RRCA LD HL,LAA36 LD DE,LAA34 PUSH BC CALL C,LA981 POP BC RRC C RRC C LD A,B RRCA RRCA RRCA INC DE LD HL,LAA38 JR C,LA981 RET LA962 LD BC,(LAA40) LD (LAA40),A CP C JR NZ,initmv AND #0F JR Z,initmv LD HL,stpcnt DEC (HL) RET NZ LD A,(step) LD (HL),A INC HL LD A,(HL) DEC A RET Z LD (HL),A INC HL RLC (HL) RET LA981 LD A,C RRCA LD A,(spdcnt) LD C,A LD A,(DE) JR C,LA992 SUB C JR C,LA999 LD (DE),A CP (HL) JR C,LA999 RET LA992 ADD A,C INC HL JR C,LA999 LD (DE),A CP (HL) RET C LA999 LD A,(HL) LD (DE),A RET LA99C LD DE,(LAA34) LD A,D OR A JR Z,LA9A5 DEC D LA9A5 LD A,E OR A JR Z,LA9AA DEC E LA9AA LD C,E LD A,D CALL 8880 LD (xplace),HL LD A,H CP #58 RET NC PUSH HL LD DE,place LD BC,#0CFF;B-высота ^ LA9BD LDI LDI DEC HL DEC HL CALL ADF_I DJNZ LA9BD POP HL LD A,(LAA34) SUB 1 JR C,LA9D2 AND 7 LA9D2 SUB 8 NEG LD B,A LD DE,arwspr LD C,#C ;Высота ^ LD A,(LAA35) OR A JR NZ,LA9E5 INC DE INC DE DEC C LA9E5 EX DE,HL PUSH BC PUSH HL PUSH DE LD E,(HL) LD D,#FF INC HL LD L,(HL) LD H,0 LA9F0 DEFB #CB,51 ;SLI E RL D ADD HL,HL DJNZ LA9F0 LD B,H LD C,L POP HL LD A,(HL) AND D OR B LD (HL),A INC L LD A,L AND #1F JR Z,LAA08 LD A,(HL) AND E OR C LD (HL),A LAA08 DEC L CALL ADF_I POP DE POP BC INC DE INC DE LD A,H CP #58 RET NC DEC C JR NZ,LA9E5 RET LAA18 LD HL,(xplace) LD DE,place LD B,#C ;Высота ^ LAA20 LD A,H CP #58 RET NC LD A,(DE) LD (HL),A INC HL INC DE LD A,(DE) LD (HL),A INC DE DEC HL CALL ADF_I DJNZ LAA20 RET ad_opc DEFW 0 LAA34 DEFB 127 ;X ^ LAA35 DEFB 95 ;Y ^ LAA36 DEFB 0,255 ;Граничые коорд.^ по X LAA38 DEFB 0,191 ;и по Y step DEFB 24 ;Число шагов до увелич.скор. DEFB 4 ;Кол-во урвней увелич-я скор. DEFB 2 ;Нач.скорость в пикс. stpcnt DEFB 0,0 ;Счетч.шагов и ур-й spdcnt DEFB 0 ;Счетч.скор. LAA40 DEFB 0 ;Пред.фл.напр. xplace DEFW 22528 ;Адр.места под ^ arwspr DEFB #3F,0,#1F,#40,#F,#60,7,#70 DEFB 3,#78,1,#7C,3,#70,3,#48 DEFB #A3,8,#F1,4,#F1,4,#F9,0 place DEFS 24 ; ;Сканирование клавиатуры и джойстиков ; Grand ;Вых.:A,(direct) -значение в формате Kempston-дж. DIRSCN LD E,0 LD HL,Define CALL key CALL key LD A,#FE IN A,(#FE) RRCA JR NC,$+5;NC-наж.CS LD HL,SincR CALL key CALL Kempst OR E AND #1F LD (direct),A RET NZ ; BIT 7,(IX+17);1-окно ФП RET Z BIT 5,(IY+1) RET Z LD A,(23610-50) CP "r" JR Z,kl2 CP " " RET Z CP "4"+1 RET NC kl2 LD HL,direct SET 7,(HL) LD A,(HL) RET key LD B,5 LD A,(HL) INC HL IN A,(#FE) CPL AND #1F AND (HL) INC HL JR Z,$+3 SCF RL C DJNZ key+2 LD A,C OR E LD E,A RET ;Таблицы в виде: порт,маска ;(уст.бит -опрашиваемая клавиша). ;Для клавиш SXOPB-Space Define DEFB #7F,%00011111;Огонь DEFB #FD,%10 ;Вверх DEFB #FE,%100;Вниз DEFB #DF,%10 ;Влево DEFB #DF,1 ;Вправо ;То же для клавиш QAOPEnter DEFB #BF,1 DEFB #FB,1 DEFB #FD,1 DEFB #DF,%10 DEFB #DF,1 ;То же для cursor IF DIRSYS DEFB #EF,0 ;Cursor ELSE DEFB #EF,1 ;Cursor END DEFB #EF,%1000 DEFB #EF,%10000 DEFB #F7,%10000 DEFB #EF,%100 ;То же для Sinclair right SincR DEFB #EF,1 DEFB #EF,%10 DEFB #EF,%100 DEFB #EF,%10000 DEFB #EF,%1000 ; direct DEFB 0 ; ; ;Вывод имен на файловую панель PR_PG CALL XYTADF PUSH HL LD DE,M_ICN LD BC,#298 CALL GRAPH POP HL LD B,64;Проп.8*8 пикт. CALL ADF_I DJNZ $-3 ;Вывод "ползунка" LD BC,(SB_Len+2) LD A,(Nr_Pg+1) LD B,A OR A JR Z,SB_Len beg2 LD A,(SB_Len+1) LD E,A LD A,B CP C JR NC,$+3 INC E CALL ADF_I DEC E JR NZ,$-4 DJNZ beg2 SB_Len LD BC,0 LD A,B OR A JR Z,$+3 INC C LD B,C LD (HL),255 CALL ADF_I DEC B DEC B LD (HL),%10000000 CALL ADF_I DJNZ $-5 LD (HL),255 dsk14 LD DE,T_CAT Nr_Pg LD A,0 ;Лог.ном.отображ.стр-цы CALL x16;HL-Адр.в таблице номеров для стр-цы LD (Txt_Pg+1),HL LD C,16 ;Имен на странице LD DE,#402 w_dsk1 LD (name+1),DE PUSH HL ;Уст.коорд.печати PUSH BC ;|| LD HL,name ;|| CALL PRINT ;|| POP BC ;|| POP HL ;|| LD A,(HL) PUSH DE dev_nm LD DE,0;Адр.начала имен устройств ;в таблице номеров OR A PUSH HL SBC HL,DE POP HL POP DE JR C,w_dsk5 CP 251 JR NZ,w_dsk8 PUSH HL LD HL,boot CALL PRINT POP HL PUSH AF LD B,8-2 JR w_ds10 w_dsk8 ADD A,69 ;Печать имен уст-в PUSH AF PUSH AF LD A,"[" CALL PRINTA POP AF CALL PRINTA LD A,":" CALL PRINTA LD A,"]" CALL PRINTA LD B,10-2 w_ds10 LD A," " CALL PRINTA DJNZ w_ds10 POP AF CP "D" JR NZ,w_dsk6 DEC C PUSH BC CALL PRINT-5 POP BC JR w_dsk2 w_dsk5 IF DIRSYS BIT 7,A JR NZ,w_dsk9 END PUSH HL;Печать имен файлов PUSH DE CALL x16-3 CALL PR_F_N POP DE;-2 POP HL;-1 w_dsk6 INC HL INC E DEC C JR NZ,w_dsk1 w_dsk2 LD A,16 SUB C LD (W1-2+10),A;Кол-во файлов на стр-це CP 16 RET Z INC E JR w_dsk3 IF DIRSYS w_dsk9 PUSH HL PUSH DE AND %01111111;Печать имен каталогов JR NZ,w_dsk7 LD HL,(ds4+1) LD DE,T_CAT+256+5 SBC HL,DE LD A,L CP 13 JR C,$+4 LD A,12 LD B,A LD L,B LD A,"." CALL PRINTA DJNZ $-5 LD A,12 SUB L JR Z,w_dsk6-2 LD B,A LD A," " CALL PRINTA DJNZ $-5 JR w_dsk6-2 w_dsk7 LD DE,11 LD L,A LD H,0 CALL 12457 LD DE,CatTrk+2304+267-11;Имена кат-гов ADD HL,DE LD B,11 LD A,(HL) CALL PRINTS-4 INC HL DJNZ $-5 LD A," " CALL PRINTA JR w_dsk6-2 END w_dsk4 INC E LD (name+1),DE PUSH BC LD HL,name CALL PRINT POP BC w_dsk3 LD B,12 LD A," " CALL PRINTA DJNZ $-5 DEC C JR NZ,w_dsk4 RET name DEFB 22,2,4,255 boot DEFM "[boot]" DEFB 255 ; LD DE,CatTrk;x16-3 ;HL=A*16+DE x16 ADD A,A ;*2 LD L,A LD H,0 ADD HL,HL ;*4 ADD HL,HL ;*8 ADD HL,HL ;*16 ADD HL,DE RET ; ; ;Редактор числовых (пятизн-х) строк ;(в режиме замены) ; Grand ;Вх:A -Y-координата на экране в 64-х символьных зн-местах ; HL -адр.редактируемой строки ;Вых:HL -адр.курсора, ; DE-адр.редактир.строки, CY=1-нажато BREAK EDITOR LD (edit4+1),A CALL PRES_K LD D,H LD E,L ;HL -адр.курсора в строке edit4 LD A,0 ;Коорд.YX на экране PUSH HL CALL c64_Y ;Задание коорд.печати LD A,9 CALL c64_23-1 POP HL PUSH DE WwNF LD B,5 ;Кол-во символов ;редактируемой строки LD A,(DE) OR A SBC HL,DE ADD HL,DE JR NZ,$+9 EX AF,AF' LD A,#2F LD (c64p5),A;Инверсия EX AF,AF';$+8 CALL PRINTA XOR A LD (c64p5),A INC DE DJNZ WwNF+2 DEC DE LD B,D LD C,E POP DE ww4_1 EXX RES 4,(IY+48) ;Не [K] SET 3,(IY+1) ;Не [K] RES 5,(IY+1) CALL 8020 ;BREAK? BIT 5,(IY+1) JR Z,$-7 CALL SOUND EXX CCF RET C LD A,(23610-50) CP 13 RET Z CP 12 JR Z,ww_lft CP 8 JR Z,ww_lft CP 9 JP Z,ww_rgh CP "0" JR C,ww4_1 CP "9"+1 JR NC,ww4_1 LD (HL),A ww_rgh OR A;Обраб.курсор вправо SBC HL,BC ADD HL,BC JR NZ,$+6 LD H,D LD L,E JR $+3 INC HL JP edit4 ww_lft OR A;Обраб.курсор влево SBC HL,DE ADD HL,DE JR NZ,$+6 LD H,B LD L,C JR edit4 DEC HL JR edit4 ; ; ;Процедура обраб.ошибки ERROR DI DEC SP DEC SP IF DIRSYS RES 7,(IY+54);b7=1-работает вх.в.подкат. END LD A,(23610) CP 26 CALL Z,STPDSK ADD A,#31 CP #3A JR C,error2 ADD A,7 CP 84 JR C,error2 ADD A,13 error2 LD (er_bas),A LD A,(23823) LD (error+1),A CP 20 CALL Z,STPDSK LD L,"0"-1 INC L SUB 10 JR NC,$-3 ADD A,"0"+10 LD H,A LD A,"0" CP L JR NZ,$+4 LD L," " LD (er_tr),HL XOR A LD (23823),A LD (G64CP+2),A DEC A LD (23610),A EI LD HL,END LD (op_w+1),HL LD IX,W4-2 CALL op_w CALL SEL^ CALL CL_W error LD A,0 CP 6 ;6-No disk JR Z,error7 LD HL,23798 LD A,(L23833+1) CP (HL) LD C,1 CALL NZ,15635 JP WARM error7 XOR A LD (CatTrk),A LD (CatTrk+2048+228),A IF DIRSYS RES 6,(IY+54) END JP cat_t0 ;Вторая проц.обраб.ош. ERROR2 DI DEC SP DEC SP LD A,255 LD (23610),A CALL STPDSK EI JR error7 ; ;Снятие выбора дисковода, если в нем не ;оказалось диска STPDSK PUSH AF LD HL,12225;Для V5.01:12151 CALL TRDOS+3 LD A,(23830) XOR 1 CALL TRDOS LD A,(23830) CALL TRDOS POP AF RET TRDOS LD HL,697 ;Для V5.01:683 PUSH HL JP 15663 ; no_fil LD B,29 LD A,1 ;no_fil+2 LD (23823),A;$+12 LD A,B LD ($+5),A DI RST 8 DEFB 255 ;$+5 ; ; ;Перемещение окна MOVE_W CALL PRES_K CALL CL_W LAB95 CALL LAC2A HALT HALT HALT LAB9B CALL DIRSCN OR A JR Z,LAB9B CALL LAC2A LD A,(direct) LD D,A BIT 3,D CALL NZ,w_Up BIT 1,D CALL NZ,w_Lft BIT 2,D CALL NZ,w_Dwn BIT 0,D CALL NZ,w_Rgh BIT 4,D JR Z,LAB95 CALL SOUND LD L,(IX+2) LD A,(IX+3) INC A ;Перевод текст.коорд.в графич. LABCB LD H,A LD A,L ;L-x, A-y ADD A,A ADD A,A ADD A,A ADD A,5 LD L,A LD A,H ADD A,A ADD A,A ADD A,A ADD A,5 LD H,A LD (LAA34),HL IF DIRSYS RES 7,(IY+54);b7=1-работает вх.в.подкат. END RET ; w_Up XOR A CP (IX+3) RET Z DEC (IX+3) RET w_Lft XOR A CP (IX+2) RET Z DEC (IX+2) RET w_Dwn LD A,(IX+3) ADD A,(IX+4) CP 24;23 RET NC INC (IX+3) RET w_Rgh LD A,(IX+2) ADD A,(IX+5) CP #20 RET NC INC (IX+2) RET ; LAC2A CALL XYTADF PUSH HL CALL LAC50 POP HL CALL ADF_I LD B,(IX+7) DEC B DEC B LAC3A LD A,(HL) XOR #80 LD (HL),A LD A,(IX+5) DEC A PUSH HL CALL ADHL_A LD A,(HL) XOR #01 LD (HL),A POP HL CALL ADF_I DJNZ LAC3A LAC50 LD B,(IX+5) LAC53 LD A,(HL) XOR #FF LD (HL),A INC HL DJNZ LAC53 RET ; ; ;Setup SU LD IX,W2-2 CALL SEL^-3 CALL CL_W JP C,mmenu LD IX,W1-2 CALL CL_W OR A IF DIRSYS RES 7,(IY+54) END JP NZ,cat_t0 ;Save Setup LD HL,0 LD (23823),HL LD A,(23833) LD C,1 ;Настр.на дисковод CALL 15635 LD C,#18 ;Настр.на диск CALL 15635 *L+ SU_TS LD DE,#0110;TrkSec of Setup *L- ;Дор.и сектор,где расп.на диске Setup-сектор, ;должны заноситься сюда в загрузчике LD HL,END LD BC,#0105 CALL 15635 LD HL,(END) LD BC,SU_IDN XOR A SBC HL,BC LD B,1 JP NZ,no_fil+2 LD HL,SETUP LD DE,(SU_TS+1) LD BC,#0106 CALL 15635 LD HL,23798 L23833 LD A,0 CP (HL) LD C,1 CALL NZ,15635 JP cat_t0 ; ; ;Information INFO LD IX,W3-2 CALL SEL^-3 CALL CL_W ;INFO+7 JP mmenu ; ; ;Процедура печати 64 символа в ширину экрана ; Grand G64CP EX AF,AF' LD A,0 AND A JR Z,GC64P CP 3 ;inv? JR Z,c64_20 CP 2 ;tab? JR Z,c64_23 INC A ;at LD (G64CP+2),A EX AF,AF' ;Тут может быть проверка на выход за ;пределы окна (экрана) по Y c64_Y ADD A,(IX+3) LD L,A AND #18 OR #40 LD H,A LD A,L AND 7 RRCA RRCA RRCA LD L,A LD (c64p1+1),HL RET EX AF,AF' c64_23 LD A,(c64p1+1) AND %11100000 LD L,A LD A,(IX+2) ADD A,A LD H,A EX AF,AF' ;Тут может быть проверка на выход за ;пределы окна (экрана) по X ADD A,H SRL A LD H,%01010101 JR C,$+4 RRC H OR L LD (c64p1+1),A LD A,H LD (c64p2+1),A XOR A ;c64_20-5 LD (G64CP+2),A;c64_20-4 RET c64_20 EX AF,AF' OR A JR Z,$+4 LD A,#2F LD (c64p5),A JR c64_20-5 ; GC64P EX AF,AF' ;Тут может быть обработка кода 13 ;(перевод строки) LD B,1 CP 22 ;AT? JR Z,c64E INC B CP 23 ;TAB? JR Z,c64E INC B CP 20 ;INV? JR NZ,$+5 c64E LD A,B JR c64_20-4 CP 32;$+5 RET C ; C64P SRL A PUSH AF LD L,A LD H,0 ADD HL,HL ADD HL,HL ADD HL,HL LD BC,F64-128;Адрес шрифта минус 128 ADD HL,BC POP BC EX DE,HL c64p2 LD A,%01010101 XOR C LD C,%11110000 LD HL,c64p2+1 RRC (HL) JR NC,$+4 LD C,%00001111 RRA c64p1 LD HL,16384+32 LD B,8 PUSH AF c64p3 LD A,C CPL AND (HL) LD (HL),A POP AF PUSH AF LD A,(DE) JR NC,$+6 RLCA RLCA RLCA RLCA c64p5 NOP AND C OR (HL) LD (HL),A INC H INC DE DJNZ c64p3 POP AF RR C RET NC LD HL,c64p1+1 c64p4 INC (HL) RET NZ INC HL LD A,(HL) ADD A,8 LD (HL),A XOR %01011000 RET NZ ;Тут может быть скролирование окна (экрана) LD HL,16384 LD (c64p1+1),HL RET ; ; ;Процедура закрытия текущего окна ;Вх: IX -адр.вектора тек.окна (описание в конце) CL_W PUSH AF CALL XYTADF LD E,(IX+8) LD D,(IX+9) LD (op_w+1),DE LD C,(IX+7) LA5E7 LD B,(IX+5) PUSH HL LA5EB LD A,(DE) LD (HL),A INC HL INC DE DJNZ LA5EB POP HL CALL ADF_I DEC C JR NZ,LA5E7 CALL XYTAAT LD C,(IX+4) LA5FE LD B,(IX+5) PUSH HL LA602 LD A,(DE) LD (HL),A INC HL INC DE DJNZ LA602 POP HL PUSH DE LD DE,32 ADD HL,DE POP DE DEC C JR NZ,LA5FE POP AF RET ; ; LD HL,#402;OP_W-11 LD (IX+12),H ;OP_W-8 LD (IX+10),L JR op_w ;Открытие окна в нач.координатах,где находится ;курсор-стрелка OP_W LD HL,#593A;Расчет коорд. LD A,L ;окна,исходя AND #1F ;из адреса ^ в атрибутах ADD HL,HL ADD HL,HL ADD HL,HL LD L,A ADD A,(IX+5) SUB 32 JR C,$+6 NEG ADD A,L LD L,A LD (IX+2),L LD A,H AND #1F LD H,A ADD A,(IX+4) SUB 24 JR C,$+6 NEG ADD A,H LD H,A LD (IX+3),H ; ;Процедура открытия окна ;Вх: IX -адрес вектора окна (описание в конце) op_w LD DE,0;Содержит адрес текущей ;области,где сохраняется экранный фрагмент, ;попавший под окно LD (IX+8),E LD (IX+9),D CALL XYTADF LD A,(IX+4) ADD A,A ADD A,A ADD A,A LD (IX+7),A LD C,A LA62F LD B,(IX+5) PUSH HL LA633 LD A,(HL) LD (DE),A LD (HL),0 INC HL INC DE DJNZ LA633 POP HL CALL ADF_I DEC C JR NZ,LA62F CALL XYTAAT LD C,(IX+4) LA648 LD B,(IX+5) PUSH HL LA64C LD A,(HL) LD (DE),A LD A,(IX+6) LD (HL),A INC HL INC DE DJNZ LA64C POP HL LD A,#20 CALL ADHL_A DEC C JR NZ,LA648 LD (op_w+1),DE CALL LAC2A CALL XYTADF LD (LA710+1),HL LD B,(IX+5) LD C,9 CALL FILL BIT 5,(IX+17);Z=0 -окно Setup JR Z,op_w1 LD HL,(LA710+1) PUSH HL LD B,20 CALL op_su3 PUSH HL CALL op_su1 INC L CALL op_su2 POP HL CALL op_su2 DEC H CALL op_su1 POP HL LD B,76 CALL op_su3 PUSH HL CALL op_su1 LD BC,#701 INC L CALL ADF_I LD (HL),C DJNZ $-4 POP HL LD BC,#780 CALL ADF_I LD (HL),C DJNZ $-4 INC H CALL op_su1 op_w1 LD L,(IX+15) LD H,(IX+16) CALL PRINT BIT 1,(IX+17) JR Z,LA67A LA710 LD HL,0 ;Содержит адрес ;левого верхнего угла окна LD DE,M_ICN LD BC,#0209 CALL GRAPH LD (HL),C BIT 7,(IX+17) ;NZ -окно ФП JR Z,LA67A LD BC,#028F CALL GRAPH CALL PR_PG LA67A BIT 6,(IX+17) ;NZ -окно Info JR Z,LA6DE LD HL,(LA710+1) LD B,30 CALL op_su3 INC HL LD DE,LOGO LD BC,#412 JP GRAPH LA6DE BIT 2,(IX+17) RET Z ;Обраб.выключателей PUSH IX LD DE,18 ADD IX,DE LD A,(IX);[*] INC IX OR A JR Z,LA6FF LD B,A LA6F3 PUSH BC CALL LA711 CALL LA728 POP BC INC IX DJNZ LA6F3 ;Обраб.переключателей LA6FF LD A,(IX);(*) OR A JR Z,LA70D LD B,A LA706 PUSH BC CALL LA736 POP BC DJNZ LA706 LA70D POP IX RET LA711 LD HL,(LA710+1);Адр.в.л.угл.окна LD B,(IX) CALL op_su3 INC IX LD A,(IX+0) SRL A PUSH AF CALL ADHL_A POP AF RET LA728 LD DE,WK_ICN JR NC,$+5 LD DE,WK_ICN+8 LD BC,264 JP GRAPH LA736 CALL KrdPrk ;Рисование (*) LA739 LD A,(IX) ; AND #F ; CP E ; PUSH DE ; LD DE,WK_ICN+16; JR NZ,$+5 ; LD DE,WK_ICN+24; LD BC,264 ; CALL GRAPH ; POP DE ; DEC E ; JR NZ,LA739; RET ; KrdPrk INC IX ; LD HL,(LA710+1); LD B,(IX) ; CALL op_su3 ; INC IX ; LD A,(IX) ; AND 7 ; LD E,A ; LD A,(IX) ; AND #F8 ; RRCA ; RRCA ; RRCA ; INC IX ; JP ADHL_A ; ; op_su1 LD BC,13*256+255 INC L LD (HL),C DJNZ $-2 RET op_su2 LD BC,121*256+129 LD (HL),C CALL ADF_I DJNZ $-4 RET op_su3 CALL ADF_I DJNZ $-3 RET ; ; ;Текстовые сообщения IF DIRSYS T_MEN DEFB #16,0,5,20,1 d_name DEFB 1,1,1,1,1,1,1,1,1,1,1,1,1 ELSE T_MEN DEFB #16,0,8,#14,1 d_name DEFB 20,20,20,20,20,20,20,20,20,20 END DEFB #14,0,#FF ; T_ER DEFB 20,1,22,0,4 DEFM "System error" DEFB 20,0,22,2,3 DEFM "BASIC: " er_bas DEFB "0",22,3,3 DEFM "TR-DOS: " er_tr DEFB "0","0",22,5,7,"O","K",255 ; T_INFO DEFB 20,1,22,0,13 DEFM "Information" DEFB 20,0,22,2,2 DEFM "GRAND'S BOOT V2.2DS DEFB 22,3,18 DEFM "demo DEFB 22,4,12,127 DEFM " Grand," DEFB 22,5,12 DEFM "19.10.1997." DEFB 22,7,4 DEFM "Last edition on" DEFB 22,8,8 DEFM " 2006. DEFB 22,10,11,"O","K" t_info DEFB 255 ; T_SU DEFB 22,0,24,20,1 DEFM "Set Up" DEFB 20,0,22,2,3 DEFM " Mask " DEFB 22,3,7 DEFM "-files DEFB 22,4,7 DEFM "All files DEFB 22,6,7 DEFM "Deleted files DEFB 22,8,7 DEFM "Only capital letters DEFB 22,10,3 DEFM " Execution files " DEFB 22,11,7 DEFM "Run DEFB 22,12,7 DEFM "Load DEFB 22,14,7 DEFM "48K mode DEFB 22,15,4,128,129 DEFM " 128K mode & 48 BASIC DEFB 22,16,4,128,129 DEFM " 128K mode & 128 BASIC DEFB 22,18,13 DEFM "Save DEFB 22,19,14,"O","K",255 ; T_RUN DEFB 22,0,4,20,1 DEFM "Run -file DEFB 20,0 t_run DEFB 22,2,2 DEFM "RAMTop: T_Ram DEFM "00000 DEFB 13,22,3,2 DEFM "Start: " T_St DEFM "00000 DEFB 13,22,4,2 DEFM "Run: " T_Run DEFM "00000 DEFB 22,5,7,"O","K",255 ; ;Вектор окна Information (описание вконце) W3 DEFB 0,0,12,12,#32,0,0,0,1 DEFW #0A01 DEFW #400A,T_INFO DEFB %01001011 ; ;Начало Setup'а. В не демо-версии он должен ;быть записан на диск в отдельный сектор *L+ SETUP DEFW SU_IDN ;SETUP *L- DEFM "boot_$ C";Имя и тип файла для ;фоновой картинки ;Векторы остальных окон (описание в конце) ;Файловая панель (главное окно) W1 DEFB 16,2,19,9,79,0,0,0,1 DEFW #202 DEFW #2006,T_MEN DEFB %10011011 ;Setup W2 DEFB 0,0,21,15,41,0,0,0,2 DEFW #1201 DEFW #200D,T_SU DEFB %101111 DEFB 2,48,%100 ;[*] DEFB 64,%100 DEFB 3,24,%10010,%1 ;(*) DEFB 88,%10010,%10 DEFB 112,%10011,%01 ;Error W4 DEFB 12,7,7,8,23,0,0,0,1 DEFW #0501 DEFW #4006,T_ER DEFB %00001011 ;Run -file W5 DEFB 0,0,7,8,#60,0,0,0,4 DEFW #0201 DEFW #2006,T_RUN DEFB %00001011 ; *L+ END DEFB 0 *L- ; ;Назначение байтов вектора окна: ;+00,+01 -не используются и не пресутствуют; ;+02,+03 -соответственно X и Y текстовые координаты ; на экране левого верхнего угла окна; ;+04,+05 -размеры окна: соответстветственно ; высота и ширина; ;+06 -цветовой атрибут окна; ;+07 -служебный байт; ;+08,+09 -текущий адрес в области сохранения экранного ; фрагмента, поверх которого открыто данное окно; ;+10 - кол-во опций в окне, выделяемых курсором- ; стрелкой; ;+11,+12 -соотв-нно X и Y текст. коорд. в окне ; начала первой опции, выделяемой стрелкой; ;+13 -длина опции в знакоместах, выделяемой стрелкой; ;+14 -интервал следования опций в зн-местах (если ; опции следуют друг под другом, то равен 32); ;+15,+16 -адрес текстового сообщения, выводимого ; в данное окно (в сообщении могут быть ; упр.коды с оконными координатами); ;+17 -отдельные установленные биты этого ; байта имеют специальное ; назначение: b0 -не используется, b1 -есть пиктограммы ; в заколовке окна, b2 -есть выключатели и/или ; переключатели, b3 -не используется, b4 -должна ; быть дополнительная обработка нажатия ; "выбор" для данного окна, b5 -признак окна Setup, ; b6 -признак окна Information, b7 -признак окна ; файловой панели; ;+18 (этот и следующие байты могут отсутствовать) ко- ; личество выключателей (0 -если нет, тогда следую- ; щие относящиеся к нему байты отсутствуют); ;+n графическая Y-координата в окне первого выключателя; ;+n+1 b0 -положение выкл-я, b1...b7 -X-координата; ;+n+2 пары байтов для второго и остальных выкл-ей; ;+m кол-во переключателей (0 -если нет); ;+m+1 графическая Y-координата в окне первой сос- ; тавляющей первого переключателя; ;+m+2 b0...b2 -кол-во составляющих переключателя (1...7), ; b3...b7 -X-координата в окне первой сос- ; тавляющей первого переключателя; ;+m+3 b0...b3 -положение переключателя в обратном ; виде (7...1), b3...b7 -зарезервировано для задания ; интервала составляющих переключателя; ;+m+4 тройки байтов для второго и остальных ; переключателей. ;