; ============================================== ; " O r i o n - P R O " ; ============================================== ; ROM1-BIOS ; ; 0.36 03 июня 1994 ; 0.90 14 февраля 1996 ; 3.10 14 мая 1996 ; 1.00 05 июня 1996 ; 2.00 24 декабря 1997 ; 2.10 17 апреля 2000 ; 3.20 ??? ; ---------------------------------------------- ; Дизассемблировано и адаптировно для SjasmpPlus ; Romych-ем в апреле 2021 ; ============================================== DEVICE NOSLOT64K include "ports.inc" ; Порты Ориона include "base.inc" ; Базовые константы ORG 0x0000 CLD_START JP PSK1 PRO JP INIT_PRO CTLKBD JP CTRLKB KBPRO JP KBRD STPRO JP STTS INPRO JP INKEY2 NUMKEY JP NUMINK SYSCTR JP SYSCTL MSCTR JP MSCTL BLOCK 3,0x00 ; filler IF RAMSEG = 1FH ; Cимволы номера сегмента db '1F' ELSE db '03' ENDIF ROM_ID DB 'ROM1-BIOS V',VERS1,'.',VERS2,VERS3,' (C) "ORIONSOFT" ' ; ============================================== ; Описание рабочих ячеек ; ============================================== ; ; Ячейки с заранее заданными значениями ; При холодном старте, эти ячейки переносятся в ОЗУ ; JOBORG EQU CELLS ; Адрес размещения ячеек в ОЗУ BEGJOB EQU $ ; Адрес размещения ячеек в ПЗУ ; DISP JOBORG ; ---------------------------------------------- ; Постоянно используемые ячейки ; ---------------------------------------------- ; ---------------------------------------------- ; Ячейки MOUSE ; ---------------------------------------------- MSMODE DB 03H ; 09H - режим отображения мыши MSPADR DW ARROW ; адрес шаблона мыши MSPSEG DB RAMSEG ; номер сегмента с шаблоном мыши MSPH DB 8 ; высота шаблона мыши MSPL DB 5 ; ширина шаблона мыши MSPD DB 0 ; смещение шаблона мыши MSSTY DB 2 ; шаг мыши по Y MSSTX DB 2 ; шаг мыши по X MSBSEG DB 1BH,1CH,1DH,1EH ; Номера сегментов буфера для мыши MSBADR DB low(0x4000-0x50) ; Адрес начала буфера в сегментах ; Шаблон стрелки мыши ARROW DB 80H,0C0H,0E0H,0F0H,0F8H,0F0H,0B0H,30H ; ---------------------------------------------- ; Ячейки драйвера клавиатуры ; ---------------------------------------------- KBMODE DB 00H ;бит 7 - признак старого режима MC7007 ;биты 0,1 - кодировка (00-ALT) KBFLAG DB 0 ; Флаг клавиатуры (CAPS LOCK = ON) ; KBSYM DB 0 ; Последний символ KBRD BAZA DW BFNUM ; Адрес буфера NUMINK CURTM DW 200H ; Константа мигания курсора IKEYTM DB 40H ; Константа антидребезга KBAUTO DW 150H ; Константа автоповтора STAUTO DW 1 ; Счетчик автоповтора OLDALF DB 0FH ; Включение АЛФ режима (^O) OLDGRF DB 0EH ; Включение графики (^N) ; CURCOD DB 08H,18H ; Коды клавиш курсора DB 19H,1AH CURCTR DB 08H,18H ; Коды клавиш курсора + CTRL DB 19H,1AH CURSFT DB 08H,18H ; Коды клавиш курсора + SHIFT DB 19H,1AH ; KBHEAD DW KBDBUF ; Указабель головы буфера KBRD KBTAIL DW KBDBUF ; Указатель хвоста буфера KBRD ; FUNTAB DW DUMMY ; Адрес таблицы функциональных клавиш FUNSEG DB RAMSEG ; Номер сегмента ОЗУ (блок "EXT") ; CTRTAB DW DUMMY ;-"- при надатии УПР CTRSEG DB RAMSEG ; SFTTAB DW DUMMY ;-"- при нажатии SHIFT SFTSEG DB RAMSEG ; ENT ENDJOB ; ---------------------------------------------- ; Буфер для NUM_INKEY (10 байт) ; ---------------------------------------------- NUMLEN EQU 10 ; длина буфера NUMKEY BFNUM EQU SFTSEG+1 ; начало буфера NUMKEY BFNUME EQU BFNUM+NUMLEN-1 ; конец буфера NUMKEY ; ---------------------------------------------- ; Буфер KBRD ; ---------------------------------------------- BUFLEN EQU 16 ; длина буфера KBRD KBDBUF EQU BFNUME+1 ; начало буфера KBRD KBDBFE EQU KBDBUF+BUFLEN-1 ; конец буфера KBRD ; ---------------------------------------------- ; Временные ячейки монитора ; (нужны только при вводе команды монитора) ; ---------------------------------------------- INBF EQU KBDBFE+1 ; буфер ввода команд INBF1 EQU INBF+1 INBFE EQU INBF+0x10 ; адрес конца буфера команд + 1 OPER1 EQU INBFE ; 1-операнд OPER2 EQU OPER1+2 ; 2-операнд PORTFA EQU OPER2+2 ; дубль порта 0xFA (Номер экрана и ширина) ; ---------------------------------------------- ; Временные ячейки драйвера мыши ; ---------------------------------------------- MSX EQU KBDBFE+1 MSY EQU MSX+2 DMX EQU MSY+2 NDMX EQU DMX+2 DMY EQU NDMX+2 NDMY EQU DMY+2 MSJ1 EQU NDMY+2 MSJ2 EQU MSJ1+2 MSJ3 EQU MSJ2+2 MSJ4 EQU MSJ3+2 MSJ5 EQU MSJ4+2 MSJ6 EQU MSJ5+2 MSJ7 EQU MSJ6+2 MSJ8 EQU MSJ7+2 ENDMS EQU MSJ8+2 ; ; TMPEND EQU ENDMS ; конец временных ячеек ; ASSERT (TMPEND>100H) && (TMPEND<=RAMTOP), Переплнение памяти рабочих ячеек ; ---------------------------------------------- ; Конец описания рабочих ячеек ; ---------------------------------------------- ; ---------------------------------------------- ;Таблица адресов подпрограмм обработки прерываний ; ---------------------------------------------- ISRTAB DW DEFESR, DEFESR, DEFESR, DEFESR, DEFESR, DEFESR, DEFESR, DEFESR ; ---------------------------------------------- ; Проверка наличия сегмента в ROM2 ; Вход: ; С - номер сегмента ; HL - адрес ; Выход: ; "Z" - сегмента нет, "NZ" - сегмент есть ; (для сегмента № 2: HL >= 2040H) ; ---------------------------------------------- TSTR2 LD B,C TSTR21 DEC B RET M IN A,(PORT_0A_MEM_CFG) SET 3,A OUT (PORT_0A_MEM_CFG),A LD A,B OUT (PORT_09_ROM2_SEG),A LD E,(HL) INC HL LD D,(HL) LD A,C OUT (PORT_09_ROM2_SEG),A LD A,(HL) DEC HL PUSH HL LD L,(HL) LD H,A EX DE,HL OR A SBC HL,DE POP HL RET Z LD A,D AND E INC A RET Z JR TSTR21 ; ---------------------------------------------- ; Процедура инициализации ПРО ; ---------------------------------------------- INIT0 DI LD A,0x50 ; 0101_0000 вкл окно ROM1 и откл переклю ОЗУ F000-FFFF OUT (PORT_0A_MEM_CFG),A INIT1 IN A,(PORT_00_DIPSW) BIT SW_KBD_RK86,A LD A,0x8A ; РК-86 JR NZ,MNT1 LD A,0x98 ; МС7007 MNT1 OUT (PORT_1B_CTL),A ; Инициализация ВВ55 клавиатуры CALL RES0 ; Инициализация рабочих ячеек LD HL,MMMPB ; Инициализация модуля EXT (Перенос его в ОЗУ) LD DE,0xF800 LD BC,MMMPE-MMMPB LDIR RET ; ---------------------------------------------- ; Инициализация режима ПРО (0003H) ; На входе: ; A=0 - с гашением видео, A=1 - без гашения ; На выходе: ; "Z" - нет "TV-PRO" ; A - номер версии "TV-PRO" ; ---------------------------------------------- INIT_PRO PUSH AF CALL INIT0 POP AF ; ---------------------------------------------- ; Программная инициализация TV-PRO ; На входе: ; A=0 - с гашением видео, A=1 - без гашения ; На выходе: ; "Z" - net ROM2 s "TV-PRO" ; A-nomer wersii "TV-PRO" ; ---------------------------------------------- INITV LD E,A IN A,(PORT_0A_MEM_CFG) ; Чтение и сохранение конфигурации памяти PUSH AF XOR A LD (VERSTV),A ; Обнуление версии LD HL,0x2008 ; Адрес в ROM2 LD C,R2SEG PUSH DE CALL TSTR2 ; Проверка наличия сегмента TVPRO POP DE JR Z,TVNO ; Переход, если нет драйвера LD A,E CALL 0x2000 ; Выполнение холодной инициализации ; LD (VERSTV),A ; Сохранить номер версии ; Подмена адресов векторов LD HL,TVSCR+1 CALL DTOH ; Вектор управления экранами LD HL,TVOUT+1 CALL DTOH ; Вектор вывода символа/курсора LD HL,TVGRF+1 CALL DTOH ; Вектор графических функций LD HL,TVSERV+1 CALL DTOH ; Вектор сервисных функций TVNO POP AF OUT (PORT_0A_MEM_CFG),A ; Восстановление конфигурации памяти LD A,(VERSTV) OR A RET ; ---------------------------------------------- ; Подпрограмма записи (DE),(DE+1) -> (HL),(HL+1) ; ---------------------------------------------- DTOH LD A,(DE) LD (HL),A INC DE INC HL LD A,(DE) LD (HL),A INC DE RET ; ---------------------------------------------- ;Настройка схемы управления палитрами ; ---------------------------------------------- INITPAL LD HL,PALTAB LD BC,0x10e0 ; e0-e2 - порты палитры OTIR LD BC,0x10e1 OTIR LD BC,0x10e2 OTIR RET ; ---------------------------------------------- ;Палитра, по 16 байт на канал цвета ; ---------------------------------------------- PALTAB ; канал красного db 0h,14h,20h,30h,4Ch,5Fh,6Ch,7Fh db 80h,90h,0A0h,0B0h,0CCh,0DFh,0ECh,0FFh ; канал зеленого db 0h,14h,20h,30h,40h,50h,60h,70h db 8Ch,9Fh,0ACh,0BFh,0CCh,0DFh,0ECh,0FFh ; канал синего db 0h,14h,2Ch,3Fh,40h,50h,6Ch,7Fh db 80h,90h,0ACh,0BFh,0C0h,0D0h,0ECh,0FFh ; ---------------------------------------------- ; Процедура холодного старта системы ; ---------------------------------------------- PSK1 LD HL,0xA000 ; Задержка, можно заменить тестом CPU PSK10 DEC HL LD A,H OR L JR NZ,PSK10 ; Программирование портов ВВ55 LD A,0x98 OUT (PORT_03_CTL),A ; DIP SW, PRINTER LD A,0x92 OUT (PORT_1D_MCARD_CTL),A ; Мультикарта, мышь LD A,0x16 OUT (PORT_3B_VI53_CTL),A ; Таймеры ВИ53 LD A,0x56 OUT (PORT_3B_VI53_CTL),A LD A,0x96 OUT (PORT_3B_VI53_CTL),A LD A,0x80 OUT (PORT_07_CTL),A ; Банки RAM OUT (PORT_0B_CTL),A ; Страницы RAM ; Подготовка диспетчера памяти PSK11 LD A,0x50 ;D7=0 - MEM-PORT - откл. ;D6=1 - F/ОЗУ RD/WR ;если D7=1, то D6=X ;D5=0 - F 5/10 MHz ;D4=1 - ROM1=вкл. ;D3=0 - ROM2=выкл. ;D0,1,2 = 0 - все окна закрыты OUT (PORT_0A_MEM_CFG),A CALL ENABLE_ROM1_OFF ; Снять запрет на отключение ROM1 OUT (PORT_08_RAM_PG),A OUT (REG_F9_RAM_PG),A OUT (REG_FA_SCRN_CFG),A LD (MSJ5),A LD A,0x1f OUT (REG_FC_COLOR),A LD A,0xf OUT (PORT_F8_VMODE),A LD HL,COLDST LD A,(HL) CP 0x5A ; Уже было включено питание? JR Z,MONIT ; да, в монитор LD (HL),0x5A ; нет, пометим, что уже было DEC HL LD (HL),0x0 DEC HL LD (HL),0x0 ; ---------------------------------------------- ; Теплый старт ROM1 ; ---------------------------------------------- MONIT LD SP,STACK CALL INIT1 CALL INITPAL IN A,(0x0) BIT 0x5,A JP Z,SYSMON CALL NUMINK AND A JR Z,MNT2 DEC A JP NZ,SYSMON MNT2 IN A,(0x0) BIT 0x7,A JR NZ,MON2 MNT3 LD A,1 ; без гашения видео CALL INITV JP Z,HALT_ ; нет TV-PRO JP MON_128_F800 ; ---------------------------------------------- ; Загрузка монитора из ROM2 в режиме O-128 ; ---------------------------------------------- MON128 LD BC,500 LD DE,0x0 CALL SOUND ; пауза 500мс MON2 IN A,(PORT_0A_MEM_CFG) SET 3,A ; вкл ROM2 OUT (PORT_0A_MEM_CFG),A XOR A OUT (PORT_09_ROM2_SEG),A LD HL,(0x2000) ; Начальная ячейка ROM2 LD A,L CP H JP NZ,0x2000 ; ------------- ; Нет ROM-2 ; ------------- HALT_ CALL CLRSCR LD A,0xe0 OUT (REG_FC_COLOR),A ; Светлый экран LD A,0xf OUT (PORT_F8_VMODE),A ; Певдоцветной CALL SNDP CALL SNDP CALL SNDP HALT ; ---------------------------------------------- ; Очистка экрана ; ---------------------------------------------- CLRSCR LD BC,0x3000 LD HL,SCR_C000 LD DE,SCR_C000+1 LD (HL),0 LDIR RET ; ---------------------------------------------- ; Звук с паузой ; ---------------------------------------------- SNDP LD BC,0xc8 LD DE,0x400 CALL SOUND LD DE,0x0 JP SOUND ; ---------------------------------------------- ; Внутренний системный монитор ; ---------------------------------------------- SYSMON LD SP,STACK XOR A CALL INITV JP Z,HALT_ XOR A OUT (PORT_08_RAM_PG),A OUT (REG_FA_SCRN_CFG),A LD A,0x4f OUT (REG_FC_COLOR),A LD A,0xf OUT (PORT_F8_VMODE),A CALL RES0 MAIN LD SP,STACK CALL BIGFRM LD HL,TIT1 CALL MSGXX LD A,0x5 LD BC,0x63 LD DE,0x92 CALL TVGRF LD A,0xd LD BC,0x9f LD DE,0xf3 CALL TVGRF LD IX,MENU1 LD HL,POS1 CALL MENU JP C,MONIT JR MAIN ;-------------- ; Монитор ;-------------- MON_UR LD A,0x1f OUT (REG_FC_COLOR),A LD A,0xf OUT (PORT_F8_VMODE),A LD HL,TBTYT CALL MSGXX CALL LINE LD HL,TBCOM CALL MSGXX CALL LINE UR LD SP,STACK LD HL,TAB3 CALL MSGXX LD HL,UR PUSH HL CALL CDIN CALL CVRT LD A,(MSX) OR A JP M,ERR CP BEGJOB JR C,UR1 AND 0xdf UR1 CP 'M' JP Z,MEMR CP 'D' JP Z,DUMP CP 'F' JP Z,FILL CP 'T' JP Z,TRANS CP 'C' JP Z,COMP CP 'I' JP Z,INPUT CP 'O' JP Z,OUTPUT CP 'V' JP Z,VIDEO CP 'W' JP Z,WIN CP 'X' JP Z,XWIN CP '2' JP Z,SPEED2 CP '8' JP Z,SPEED5 CP 'G' JP NZ,ERR JP HL CDIN LD DE,INBF LD B,0x0 CD1 CALL KBRD CP 0x3 JP Z,MONIT CP 0x1b JP Z,MON_UR CP 0x7f JR Z,CD02 CP 0x8 JR NZ,CD2 CD02 INC B DEC B JR Z,CD1 CD5 DEC DE DEC B LD A,0x8 CALL TVA CALL SPC LD A,0x8 CALL TVA JR CD1 CD2 CP 0xd JR Z,CD6 CP 0x20 JR C,CD1 CD6 LD (DE),A INC B CP 0xd RET Z CALL TVA INC DE LD A,INBFE-INBF-1 CP B JR NC,CD1 JR CD5 CVRT LD DE,INBF1 LD HL,0x0 LD (OPER2),HL CALL CVRT2 LD (OPER1),HL RET C CALL CVRT2 LD (OPER2),HL JR C,CVRT1 CALL CVRT2 LD B,H LD C,L LD HL,(OPER2) CVRT1 EX DE,HL LD HL,(OPER1) RET CVRT2 LD HL,0x0 LD B,L LD C,L CVR ADD HL,BC CVR1 LD A,(DE) INC DE CP 0x20 JR Z,CVR1 CP 0xd JR Z,CVR3 CP 0x2c RET Z CP BEGJOB JR C,CVR4 AND 0xdf CVR4 SUB 0x30 JP M,ERR CP 0xa JP M,CVR2 CP 0x11 JP M,ERR CP 0x17 JP P,ERR SUB 0x7 CVR2 LD C,A ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,HL JR NC,CVR ERR LD A,'?' CALL TVA JP UR CVR3 SCF RET AS LD A,(HL) ASC PUSH AF RRCA RRCA RRCA RRCA CALL AS1 POP AF AS1 AND 0xf CP 0xa JP M,AS2 ADD A,0x7 AS2 ADD A,0x30 JP TVA MCT CALL HDLN ADR LD A,H CALL ASC ADR1 LD A,L ADR2 CALL ASC SPC LD A,0x20 JP TVA HDLN LD A,0x0D CALL TVA LD A,0x0A JP TVA DPCMP LD A,H CP D RET NZ LD A,L CP E RET LINE LD BC,0x3EC4 CALL SPC LINE1 CALL TVSYM DJNZ LINE1 RET M1 INC HL MEMR CALL MCT CALL AS CALL SPC CALL CDIN LD DE,INBF LD A,(DE) CP 0x0D JR Z,M1 PUSH HL CALL CVRT2 EX DE,HL POP HL LD (HL),E JR M1 DUMP LD HL,(OPER1) LD L,0x0 DP1 LD B,0xff CALL ABC D3 CALL MCT CALL SPC PUSH HL LD B,0x2 D1 LD A,(OPER2) CALL DISK CALL ASC INC HL DJNZ D5 CALL SPC LD B,0x2 D5 LD A,L AND 0xf JR NZ,D1 POP HL CALL SPC L1 LD A,(OPER2) CALL DISK CP 0x20 JR C,L13 CP 0xb0 JR C,L12 CP 0xe0 JR C,L13 CP 0xf2 JR C,L12 L13 LD A,'.' L12 CALL TVA INC HL LD A,L AND 0xf JR NZ,L1 LD A,L AND A JR NZ,D3 CALL HDLN CALL ABC0 L9 CALL KBRD CP 0x1b JP Z,MON_UR CP 0xc JR Z,DUMP CP 0x42 JR Z,DUMP CP 0x62 JR Z,DUMP CP 0x19 JR Z,L7 OR A JR NZ,L8 L7 DEC H DEC H JR DP1 L8 CP 0x1A JR Z,DP1 CP 0x2 JR Z,DP1 JR L9 ; ABCC0 DB -1BH,-'6',-' ',-' ',-' ',-' ',-' ',-' ',-'E',-'S' DB -'C',-' ',-'-',-' ',-'Q',-'u',-'i',-'t',-' ' DB -' ',-' ',-' ',-' ',-' ',-' ',-' ',-' ',-' ' DB -' ',-' ',-' ',-' ',-' ',-' ',-' ',-' ',-' ',-' ' DB -'(',-'B',-')',-'e',-'g',-'i',-'n',-' ',-' ' DB -' ',-' ',-'P',-'g',-'-',-0F8H,-' ',-' ',-' ' DB -' ',-'P',-'g',-'-',-0F9H,-' ',-' ',-' ' DB -' ',-1BH,-'7',0 ; ABC0 PUSH HL LD HL,ABCC0 CALL MSGXX POP HL RET ; ABCC DB -1BH,-59H,-27H,-20H,-1BH,-'6',-20H,-'P',-'=',0 ; ABC PUSH HL LD HL,ABCC CALL MSGXX POP HL LD A,(OPER2) LD C,A AND 0xf0 LD A,C JR NZ,AB6 OR 0x30 AB6 CALL TVA CALL SPC CALL SPC CALL SPC LD C,0x0 AB4 LD B,0x2 AB2 LD A,C CALL AS1 CALL SPC INC C DJNZ AB2 CALL SPC LD A,C CP 0x10 JR NZ,AB4 AB3 LD A,C CP ' ' JR Z,AB8 CALL AS1 INC C JR AB3 AB7 CALL SPC AB8 PUSH HL LD HL,INVOF CALL MSGXX POP HL RET DISK AND 0xf CALL RRAM LD A,C RET INPUT CALL SPC LD C,L IN A,(C) HEXBIN LD C,A CALL ASC LD A,ENDJOB-BEGJOB CALL TVA LD A,C LD B,0x8 BIN0 LD C,A AND 0x80 LD A,0x30 JR Z,BIN1 LD A,0x31 BIN1 CALL TVA LD A,B CP 0x5 JR NZ,BIN2 LD A,0x5f CALL TVA BIN2 LD A,C RLCA DJNZ BIN0 RET OUTPUT LD C,L OUT (C),E RET WIN LD A,L AND 0x3 LD L,A LD C,A LD A,0x1 INC L WN1 DEC L JR Z,WN2 RLCA JR WN1 WN2 LD L,A LD A,E CP 0xff JR NZ,WN20 LD A,L CPL LD L,A IN A,(PORT_0A_MEM_CFG) AND L JR WN7 WN20 INC C DEC C JR NZ,WN3 OUT (PORT_04_RAM0P),A JR WN6 WN3 DEC C JR NZ,WN4 OUT (PORT_05_RAM1P),A JR WN6 WN4 DEC C JR NZ,WN5 OUT (PORT_06_RAM2P),A JR WN6 WN5 OUT (PORT_09_ROM2_SEG),A WN6 IN A,(PORT_0A_MEM_CFG) OR L WN7 OUT (PORT_0A_MEM_CFG),A RET XWIN CALL HDLN LD E,0xff LD C,0x4 SG2 LD B,0x8 LD A,E SG1 ADD A,0x4 PUSH AF CALL ADR2 POP AF DJNZ SG1 CALL HDLN DEC E DEC C JR NZ,SG2 CALL HDLN LD A,0x30 CALL TVA LD A,0x33 CALL TVA CALL SPC IN A,(PORT_09_ROM2_SEG) CALL XW5 LD L,0x2 CALL ADR1 IN A,(PORT_06_RAM2P) CALL XW5 DEC L CALL ADR1 IN A,(PORT_05_RAM1P) CALL XW5 DEC L CALL ADR1 IN A,(PORT_04_RAM0P) CALL XW5 LD A,0x44 CALL TVA LD A,0x50 CALL TVA CALL SPC IN A,(PORT_0A_MEM_CFG) XW5 CALL HEXBIN JP HDLN FILL LD (HL),C CALL DPCMP RET Z INC HL JR FILL VIDEO LD A,0x80 LD HL,PORTFA XOR (HL) LD (HL),A OUT (REG_FA_SCRN_CFG),A RET COMP CALL DPCMP RET Z LD A,(BC) CP (HL) JR NZ,COMP2 COMP1 INC HL INC BC JR COMP COMP2 CALL HDLN CALL ADR CALL SPC CALL AS CALL SPC LD A,(BC) CALL ASC COMP3 CALL INKEY CP 0x1b RET Z INC A JR NZ,COMP3 JR COMP1 TRANS LD A,(HL) LD (BC),A LD A,H CP D JR NZ,TRS1 LD A,L CP E RET Z TRS1 INC HL INC BC JR TRANS SPEED2 IN A,(PORT_0A_MEM_CFG) OR 0x20 OUT (PORT_0A_MEM_CFG),A RET SPEED5 IN A,(PORT_0A_MEM_CFG) AND 0xdf OUT (PORT_0A_MEM_CFG),A RET ; --------------------------------------------- ; Управление системой ; A=0 - инициализация рабочих ячеек "ROM1-BIOS"; ; A=1 - инициализация портов диспетчера памяти (отключение всех окон); ; A=2 - освобождение оверлейной области ОЗУ, используемой драйвером "TV-PRO"; ; A=З - проверка занятости оверлейной области ОЗУ, используемой драйвером "TV-PRO" ; --------------------------------------------- SYSCTL LD A,IXL ; db 0DDh LD A,L OR A JR NZ,SYS1 ; Процедура переноса блока исходного состояния в ОЗУ RES0 DI LD HL,BEGJOB LD DE,JOBORG LD BC,ENDJOB-BEGJOB LDIR LD HL,ISRTAB LD A,0xf7 LD I,A LD D,A LD E,0x0 LD BC,0x10 LDIR IM 2 RET SYS1 DEC A JR NZ,SYS2 ;Отключение всех окон RES1 XOR A OUT (PORT_04_RAM0P),A OUT (PORT_05_RAM1P),A OUT (PORT_06_RAM2P),A OUT (PORT_09_ROM2_SEG),A IN A,(PORT_0A_MEM_CFG) AND 0xF0 OUT (PORT_0A_MEM_CFG),A RET SYS2 DEC A JR NZ,SYS3 ; Освобождение оверлейной части драйвера TV-PRO FREOVR LD IX,0x2003 JR SUBR2 SYS3 DEC A RET NZ ; Проверка оверлейой области драйвера TV-PRO TSTOVR LD IX,0x2006 ; Вызов подпрограммы из ROM2 ; IX - Адрес в ROM2 SUBR2 PUSH IY IN A,(PORT_09_ROM2_SEG) LD IYL,A ; db 0FDh, LD L,A LD A,R2SEG OUT (PORT_09_ROM2_SEG),A IN A,(PORT_0A_MEM_CFG) SET ROM2_WND,A OUT (PORT_0A_MEM_CFG),A CALL PCIX PUSH AF LD A,IYL ; db 0FDh, LD A,L OUT (PORT_09_ROM2_SEG),A POP AF POP IY RET PCIX JP IX ; --------------------------------------------- ; Подключение модуля тестирования ; --------------------------------------------- include "tst.asm" ; ; TYTBS1 DB -1FH,-1BH,-59H,-21H,-22H DB -'(',-'C',-')',-' ',-'1',-'9',-'9',-'3',-'-',-'1' DB -'9',-'9',-'7',-' ',-'O',-'r',-'i',-'o',-'n' DB -'s',-'o',-'f',-'t',-' ',-'C',-'o',-'.' DB -1BH,-59H,-21H,-4FH DB -'O',-'r',-'i',-'o',-'n',-'-',-'P',-'r',-'o' DB -' ',-'V',-'3',-'.',-'1',-'0' DB -0DH,-0AH,0 ; TBTYT DB -1FH,-0AH,-0AH DB -' ',-'S',-'y',-'s',-'t',-'e',-'m',-' ',-'M' DB -'O',-'N',-'I',-'T',-'O',-'R' DB -' ',-' ',-'V' DB -VERS1,-'.',-VERS2,-VERS3,-0DH,-0AH,0 ; TBCOM DB -0DH,-0AH DB -' ',-'-',-' ',-'M',-' ',-'D',-' ',-'F' DB -' ',-'T',-' ',-'C',-' ',-'-',-' ',-'I',-' ' DB -'O',-' ',-'V',-' ',-'W',-' ',-'X',-' ',-'2' DB -' ',-'8',-' ',-'-',-' ',-'G',-' ',-'-' DB -0DH,-0AH,0 ; TAB3 DB -0DH,-0AH,-0AH DB -'=',-'>',-7,0 ; --------------------------------------------- ; Управление клавиатурой ; LX - Номер функции ; --------------------------------------------- CTRLKB LD A,IXL ; DB 0DDh, LD A,LX SUB 19 JP NC,KBC19 ADD A,19 JR NZ,KBC1 ; --------------------------------------------- ; Установка режима клавиатуры ; E - режим, D - байт флагов ; --------------------------------------------- SETKBM PUSH HL LD HL,(BAZA) XOR A LD (HL),A POP HL LD (KBMODE),DE RET KBC1 DEC A JR NZ,KBC2 ; Получение режима клавиатуры ; A keys_pressed ; C last_key ; HL buff_numkey ; E режим ; D флаги GETKBM LD HL,(BAZA) LD A,(HL) ; Число нажатых клавиш LD E,A OR A LD D,0x0 PUSH HL ADD HL,DE LD C,0xff JR Z,GKBM1 LD C,(HL) GKBM1 POP HL INC HL LD DE,(KBMODE) RET KBC2 DEC A JR NZ,KBC3 ; Установка констант задержки ; HL - автоповтора, DE - мигания курсора LD (KBAUTO),HL LD (CURTM),DE RET KBC3 DEC A JR NZ,KBC4 ; Получение констант задержки ; HL - автоповтора, DE - мигания курсора LD HL,(KBAUTO) LD DE,(CURTM) RET KBC4 DEC A JR NZ,KBC5 ; Установить коды клавиш управления курсором ; C,B,E,D - коды клавиш ; LD (CURCOD),BC LD (CURCOD+2),DE RET KBC5 DEC A JR NZ,KBC6 ; Получить коды клавиш управления курсором ; C,B,E,D - коды клавиш ; LD BC,(CURCOD) LD DE,(CURCOD+2) RET KBC6 DEC A JR NZ,KBC7 ; Установить коды клавиш + CTRL ; C,B,E,D - коды клавиш ; LD (CURCTR),BC LD (CURCTR+2),DE RET KBC7 DEC A JR NZ,KBC8 ; Получить коды клавиш + CTRL ; C,B,E,D - коды клавиш LD BC,(CURCTR) LD DE,(CURCTR+2) RET KBC8 DEC A JR NZ,KBC9 ; Установить коды клавиш + SHIFT ; C,B,E,D - коды клавиш LD (CURSFT),BC LD (CURSFT+2),DE RET KBC9 DEC A JR NZ,KBC10 ; Получить коды клавиш + CTRL ; C,B,E,D - коды клавиш LD BC,(CURSFT) LD DE,(CURSFT+2) RET KBC10 DEC A JR NZ,KBC11 ; Установка адреса таблицы функциональных клавиш ; HL - адрес, C - номер сегмента ОЗУ ; LD (FUNTAB),HL LD A,C LD (FUNSEG),A RET KBC11 DEC A JR NZ,KBC12 ; Получение адреса таблицы функциональных клавиш ; HL - адрес, C - номер сегмента ОЗУ ; LD HL,(FUNTAB) LD A,(FUNSEG) LD C,A RET KBC12 DEC A JR NZ,KBC13 ; Установка адреса таблицы клавиш + упр -- ; HL - адрес, C - номер сегмента ОЗУ ; LD (CTRTAB),HL LD A,C LD (CTRSEG),A RET KBC13 DEC A JR NZ,KBC14 ; Получение адреса таблицы клавиш + упр -- ; HL - адрес, C - номер сегмента ОЗУ LD HL,(CTRTAB) LD A,(CTRSEG) LD C,A RET KBC14 DEC A JR NZ,KBC15 ; Установка адреса таблицы клавиш + SHIFT ; HL - адрес, C - номер сегмента ОЗУ ; LD (SFTTAB),HL LD A,C LD (SFTSEG),A RET KBC15 DEC A JR NZ,KBC16 ; Получение адреса таблицы клавиш + SHIFT ; HL - адрес, C - номер сегмента ОЗУ LD HL,(SFTTAB) LD A,(SFTSEG) LD C,A RET KBC16 DEC A JR NZ,KBC17 ; Занесение символа в буфер клавиатуры KBRD ; C - код символа ; "CY" - буфер заполнен ; WRBUF PUSH DE PUSH HL LD HL,(KBTAIL) LD DE,KBDBFE LD (HL),C CALL CPHLDE INC HL JR C,WB1 LD HL,KBDBUF WB1 LD DE,(KBHEAD) CALL CPHLDE SCF JR Z,WB3 LD (KBTAIL),HL WB2 OR A WB3 POP HL POP DE RET ; --------------------------------------------- ; Процедура сравнения HL и DE ; --------------------------------------------- CPHLDE PUSH HL OR A SBC HL,DE POP HL RET KBC17 DEC A JR NZ,CLRBUF ; Получение символа из буфера клавиатуры ; C - код символа ; "CY" - буфер пуст RDBUF PUSH DE PUSH HL CALL TSB JR C,WB3 LD C,(HL) LD DE,KBDBFE CALL CPHLDE INC HL JR C,RB1 LD HL,KBDBUF RB1 LD (KBHEAD),HL JR WB2 ; --------------------------------------------- ; Обнуление буфера клавиатуры ; --------------------------------------------- CLRBUF PUSH HL LD HL,(KBTAIL) LD (KBHEAD),HL POP HL RET KBC19 JR NZ,KBC20 ; --------------------------------------------- ; Проверка буфера клавиатуры ; --------------------------------------------- TSTBUF PUSH DE PUSH HL CALL TSB POP HL POP DE RET TSB LD HL,(KBHEAD) LD DE,(KBTAIL) CALL CPHLDE SCF RET Z OR A RET KBC20 DEC A JR NZ,KBC21 ; --------------------------------------------- ; Установка кода АЛФ ГРАФ ; L - для включения алфавитного режима ; H - для включения псевдографического режима; ; --------------------------------------------- LD (OLDALF),HL RET KBC21 DEC A RET NZ LD HL,(OLDALF) RET ; --------------------------------------------- ; Подключение модуля клавиатуры ; --------------------------------------------- include "kbd.asm" ; --------------------------------------------- ; Подключение модуля мыши ; --------------------------------------------- include "mou.asm" ; ============================================= ; Текстовые сообщения для режима "PRO" ; ============================================= FLTYT DB -09H,-'f',-'r',-'o',-'m',-' ',-'f',-'l',-'o',-'p',-'p',-'y',-' ' DB -'d',-'i',-'s',-'k',-0DH,-0AH,0 ; HDTYT DB -09H,-' ',-'f',-'r',-'o',-'m',-' ',-'h',-'a',-'r',-'d',-' ' DB -'d',-'i',-'s',-'k',-0DH,-0AH,0 ; TBER4 DB -'N',-'o',-'n',-'-',-'s',-'y',-'s',-'t',-'e',-'m',-' ',-'d',-'i',-'s',-'k',-'!',0 ; TBERR DB -'D',-'i',-'s',-'k',-' ',-'b',-'o',-'o',-'t',-' ',-'f',-'a',-'i',-'l',-'u',-'r',-'e',-'!',0 TBER0 DB -0DH,-0AH,-0AH,-' ',-'E',-'R',-'R',-'O',-'R',-3AH,-' ',0 TBQT DB -' ',-'[',-'A',-'P',-'2',-'-',-'Q',-'u',-'i',-'t',-']',0 ; STTYT DB -1FH,-0DH,-0AH DB -' ',-'O',-'r',-'i',-'o',-'n',-'-',-'P',-'r',-'o' DB -' ',-'s',-'y',-'s',-'t',-'e',-'m',-09H,-09H,-09H DB -'(',-'C',-')',-' ' DB -'1',-'9',-'9',-'3',-'-',-'2',-'0',-'0',-'0' DB -' ',-'O',-'r',-'i',-'o',-'n',-'s',-'o',-'f',-'t',-0DH,-0AH,0 ; XTYT DB -0DH,-0AH DB -' ',-'L',-'o',-'a',-'d',-'i',-'n',-'g',-' ' DB -'D',-'i',-'s',-'k',-' ',-'O',-'p',-'e',-'r' DB -'a',-'t',-'i',-'n',-'g',-' ',-'S',-'y',-'s' DB -'t',-'e',-'m',-0DH,-0AH,0 ; ---------------------------------------------- ; Подключение блока расширенных функций ; ---------------------------------------------- include "ext.asm" ; ---------------------------------------------- ; Filler ; ---------------------------------------------- BLOCK 9,0xFF ENABLE_ROM1_OFF LD A,0x80 OUT (PORT_FB_TMR_INT),A XOR A RET BYTE 0xff ; filler up to 8192 CODE_SIZE EQU $ ASSERT CODE_SIZE<2001H, Переполение ROM1 (EXT) DISPLAY "Code size is:",/A,CODE_SIZE END