;***************************************************************** ; ; Функции распределения памяти. ; ;***************************************************************** ; Определение объема памяти. ; Выход: BC - FREE MEM в блоках по 16k, HL - FULL MEM ;***************************************************************** EMM_FN0: IN A,(PAGE2) LD B,A LD A,SYS_PAGE OUT (PAGE2),A LD HL,RAMD_FAT-4000H LD C,0 EMM_FN0_L1: LD A,(HL) INC L JR Z,EMM_FN0_L2 AND A JR NZ,EMM_FN0_L1 INC C JR EMM_FN0_L1 EMM_FN0_L2: LD HL,100H LD A,B LD B,0 OUT (PAGE2),A RET ; ;***************************************************************** ; Инициализация распределения памяти. ;***************************************************************** EMM_FN1: PUSH BC PUSH HL PUSH DE IN A,(PAGE2) LD C,A LD A,SYS_PAGE OUT (PAGE2),A LD HL,RAMD_FAT-4000H ; Адрес FAT ОЗУ. EMM_F1_L1: ; Все страницы свободны. LD (HL),0 INC L JR NZ,EMM_F1_L1 ;************************* LD DE,TAB_PGS ; таблица занятых системных страниц EMM_F1_L2: LD A,(DE) CP 0FFH JR Z,EMM_F1_L3 INC DE LD L,A LD A,(DE) LD (HL),A JR EMM_F1_L2 EMM_F1_L3: LD L,A LD (HL),A EMM_F1_RAMD_INI: LD HL,RAMD_KEYS-4000H ; Инициализация ключей RAM-Disks LD B,RAMD_KEY_NUM EMM_F1_L5: LD (HL),0 INC L DJNZ EMM_F1_L5 LD A,C OUT (PAGE2),A POP DE POP HL POP BC RET ;************************************ TAB_PGS: DB 0,1,2,3,4,5,6,7 DB 08H,09H,0AH,0BH,0CH,0DH,0EH,0FH DB 40H DB 50H,51H,52H,53H,54H,55H,56H,57H DB 58H,59H,5AH,5BH,5CH,5DH,5EH,5FH DB 0FCH,0FDH,0FEH,0FFH ;***************************************************************** ; Получить блок памяти N bytes, ; Вход: B - число необходимых блоков ; Выход: L,A - КЛЮЧ RAM-Disk/код ошибки ; CF - признак ошибки ;***************************************************************** EMM_FN2M: PUSH DE PUSH BC IN A,(PAGE2) EX AF,AF' LD A,SYS_PAGE OUT (PAGE2),A LD C,B ; сохранить число нужных блоков LD HL,RAMD_FAT-4000H EMM_F2M_L1: ; Цикл проверки наличия нужных блоков. DEC L JR Z,EMM_F2M_NO_RAM LD A,(HL) AND A JR NZ,EMM_F2M_L1 DJNZ EMM_F2M_L1 ;************************** ; Место есть ! ;************************** LD B,C ; Восстановить нужный объем диска LD C,0FFH ; МЕТКА КОНЦА RAM-Disk LD HL,RAMD_FAT-4000H EMM_F2M_L2: ; Заполнить RAMD_FAT DEC L LD A,(HL) AND A JR NZ,EMM_F2M_L2 LD (HL),C LD C,L DJNZ EMM_F2M_L2 ;************************************ ; L - указатель цепочки. ;************************************ EX AF,AF' OUT (PAGE2),A LD A,L AND A POP BC POP DE RET EMM_F2M_NO_RAM: LD L,1 ; НЕТ ПАМЯТИ EX AF,AF' OUT (PAGE2),A LD A,L SCF POP BC POP DE RET ;***************************************************************** ; Получить блок памяти N bytes, для RAM-Disk A ; Вход: B - число необходимых блоков, A - RAM-Disk ; Выход: L,A - КЛЮЧ RAM-Disk/код ошибки ; CF - признак ошибки ;***************************************************************** EMM_FN2: PUSH AF CALL EMM_FN2M JR C,EMM_FN2_L1 LD B,A POP AF CALL BLK_TO_RAMD RET NC ; LD A,B ; CALL EMM_FN3M ; SCF LD L,2 ; RAM-Disk занят RET EMM_FN2_L1: POP AF ; нет памяти LD L,1 SCF RET ;;***************************************************************** ;; Освободить блок памяти ;; Вход: A - НАЧАЛО ЦЕПОЧКИ ;;***************************************************************** EMM_FN3M: AND A SCF RET Z LD L,A IN A,(PAGE2) EX AF,AF' LD A,SYS_PAGE OUT (PAGE2),A LD H,RAMD_FAT/256-40h LD A,L EMM_F3M_L1: LD L,A LD A,(HL) ; следующий блок AND A JR Z,EMM_FN3M_ERR LD (HL),0 ; Освободить CP 0FFH ; Если не конец JR NZ,EMM_F3M_L1 ; продолжать EX AF,AF' OUT (PAGE2),A LD A,0 AND A RET EMM_FN3M_ERR: EX AF,AF' OUT (PAGE2),A LD A,2 SCF RET ;***************************************************************** ; Освободить блок памяти ключа K ; Вход: A - КЛЮЧ RAM-Disk ;***************************************************************** EMM_FN3: CALL GET_RAMD_ST RET C SCF RET Z LD C,A IN A,(PAGE2) LD B,A LD A,SYS_PAGE OUT (PAGE2),A LD (HL),0 LD A,B OUT (PAGE2),A LD A,C JR EMM_FN3M ;***************************************************************** ; Получить страницу N блока K ; Вход: A - блок, B - номер страницы ; Выход: A - страница, IF CF - A=0 - нет блока, A=FF - END ;***************************************************************** EMM_FN4M: LD L,A IN A,(PAGE2) EX AF,AF' LD A,SYS_PAGE OUT (PAGE2),A INC B LD H,RAMD_FAT/256-40H EMM_F4M_L1: LD A,(HL) AND A JR Z,EMM_F4M_ERR DEC B JR Z,EMM_F4M_END LD L,A CP 0FFH JR NZ,EMM_F4M_L1 EMM_F4M_ERR: LD L,A EX AF,AF' OUT (PAGE2),A LD A,L SCF RET EMM_F4M_END: EX AF,AF' OUT (PAGE2),A LD A,L AND A RET ;***************************************************************** ; Получить страницу N ключа K ; Вход: A - КЛЮЧ RAM-Disk, B - номер страницы ; Выход: A - страница ;***************************************************************** EMM_FN4: CALL GET_RAMD_ST RET C SCF RET Z JR EMM_FN4M ;***************************************************************** ; Получить следующую страницу по FAT ; Вход: A - страница ОЗУ ; Выход: A - следующая страница ОЗУ ;***************************************************************** EMM_FN5: LD L,A AND A SCF RET Z IN A,(PAGE2) LD H,A LD A,SYS_PAGE OUT (PAGE2),A LD A,H LD H,RAMD_FAT/256-40H LD L,(HL) OUT (PAGE2),A LD A,L AND A SCF RET Z AND A RET ;***************************************************************** ; Получить список страниц блока в HL ; Вход: A - блок, HL - адрес буфера - 256 байт. ; Выход: HL - адрес блока, B - длина блока в страницах ОЗУ ;***************************************************************** EMM_FN5M: PUSH DE PUSH HL EX DE,HL LD B,0 LD L,A EMM_FN5M_L: LD A,L LD (DE),A INC DE AND A JR Z,EMM_FN5M_ERR CP 0FFH JR Z,EMM_FN5M_END IN A,(PAGE2) LD C,A LD A,SYS_PAGE OUT (PAGE2),A LD H,RAMD_FAT/256-40H LD L,(HL) LD A,C OUT (PAGE2),A INC B JR NZ,EMM_FN5M_L EMM_FN5M_ERR: SCF POP HL POP DE RET EMM_FN5M_END: POP HL POP DE AND A RET ;***************************************************************** ; Получение адресов портов и данных для восстановления ; Вход: A - номер окна проецирования ; Выход: B - данные, C - адрес порта окна ;***************************************************************** EMM_FN6: AND A LD C,PAGE0 IN B,(C) RET Z DEC A LD C,PAGE1 IN B,(C) RET Z DEC A LD C,PAGE2 IN B,(C) RET Z DEC A LD C,PAGE3 IN B,(C) RET Z SCF RET FN_RAMD_R_W EQU 9BH BLK_R_W: RAMD_R_W: ; ╔═══════════════════════════════════╗ ; ║ RD/WR SECTOR HL - BUFER ║\ ; ║ DE - ABS sector в 256b блоках ║\ ; ║ B - число данных в 256b блоках ║\ ; ║ A' - команда чтение/запись ║\ ; ║ A - block RAM ║\ ; ║ 0 - чтение, 255 - запись ║\ ; ║ ** NOT USED TR-DOS VARS ** ║\ ; ╚═══════════════════════════════════╝\ ; \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ AND A SCF RET C PUSH HL PUSH BC INC D LD C,PAGE2 IN B,(C) LD A,SYS_PAGE OUT (C),A LD H,82H LD L,A RAMD_LOOP_D: DEC D JR Z,NOT_FOUR_BLK LD L,(HL) LD L,(HL) LD L,(HL) LD L,(HL) JR RAMD_LOOP_D NOT_FOUR_BLK: LD A,E NOT_FOUR_BLK1: SUB 40H JR C,NOT_ONE_BLK LD L,(HL) JR NOT_FOUR_BLK1 NOT_ONE_BLK: AND 3FH ; ADD A,40H LD D,A ; DE - ADRESS in RAM-Disk LD E,0 LD A,L ; L - текущий банк RAM-Disk OUT (C),B ; восстановить страницу POP BC ; длина данных POP HL ; адрес буфера BIT 7,H JR NZ,BLK_PAGE1 BLK_PAGE3: LD C,PAGE3 IN C,(C) OUT (PAGE3),A SET 7,D SET 6,D JR BLK_CONT1 BLK_PAGE1: LD C,PAGE1 IN C,(C) OUT (PAGE1),A RES 7,D SET 6,D BLK_CONT1: EX AF,AF' AND A JR NZ,NO_EX_RW1 EX DE,HL NO_EX_RW1: EX AF,AF' LD A,16 BLK_LL1: DUP 16 LDI EDUP DEC A JR NZ,BLK_LL1 EX AF,AF' JR NZ,NO_EX_RW2 EX DE,HL NO_EX_RW2: EX AF,AF' INC B DEC B JP Z,BLK_EXIT_1 BIT 6,D JP NZ,BLK_CONT1 BIT 7,D JR Z,BLK_PAGE3_X IN A,(PAGE1) LD E,A LD D,42H LD A,SYS_PAGE OUT (PAGE1),A LD A,(DE) OUT (PAGE1),A LD DE,4000H JP BLK_CONT1 BLK_PAGE3_X: IN A,(PAGE3) LD E,A LD D,0C2H LD A,SYS_PAGE OUT (PAGE3),A LD A,(DE) OUT (PAGE3),A LD DE,0C000H BIT 7,H JP Z,BLK_CONT1 LD E,A LD A,C OUT (PAGE3),A IN A,(PAGE1) LD C,A LD A,E OUT (PAGE1),A LD DE,4000H JP BLK_CONT1 BLK_EXIT_1: LD A,D RLCA XOR D RLCA JR NC,BLK_EXIT_2 LD A,C OUT (PAGE1),A AND A RET BLK_EXIT_2: LD A,C OUT (PAGE3),A AND A RET DISK_REDIR: PUSH HL LD HL,DISK_TYPE-4000h IN A,(PAGE2) EX AF,AF' LD A,SYS_PAGE OUT (PAGE2),A LD A,(OPER_DISK) AND 3 ADD A,L LD L,A LD L,(HL) EX AF,AF' OUT (PAGE2),A LD A,L POP HL RET SET_DISK_TYPE: PUSH HL LD HL,DISK_TYPE-4000H IN A,(PAGE2) EX AF,AF' LD A,SYS_PAGE OUT (PAGE2),A LD A,(OPER_DISK) AND 3 ADD A,L LD L,A LD (HL),E LD L,(HL) EX AF,AF' OUT (PAGE2),A LD A,L POP HL RET RAMD_CALC_PAGE: ; вход: DE - ram_disk trk_sec, A - RAM-Disk ; выход: HL - адрес, A - page CP 16 CCF RET C ; НЕТ ТАКОГО RAM-Disk PUSH AF LD H,D LD L,E ADD HL,HL ADD HL,HL LD B,H LD A,E OR 0C0H LD C,A ; C - часть адреса, B - страница POP AF CALL EMM_FN4 ; ПОЛУЧИТЬ СТРАНИЦУ LD L,0 LD H,C ; RET C ; LD B,A ; LD A,B ; CP 0FFH ; CCF RET ;***************************************************** ; ; HL - буфер ; ;***************************************************** Version EQU 020DH ; Version BIOS ID_SPRINTER: DB 'Sprinter BIOS: ver 2.13',0,"Sprinter",0,0 L_ID EQU $-ID_SPRINTER ;***************************************************** FN_VERSION: PUSH HL EX DE,HL LD HL,ID_SPRINTER LD BC,L_ID LDIR POP HL LD DE,Version IN A,(PAGE2) EX AF,AF' LD A,SYS_PAGE OUT (PAGE2),A LD BC,(CONFIG_BYTE-4000h) ; Version PLD EX AF,AF' OUT (PAGE2),A LD A,2 ; Число полей AND A RET ;***************************************************** EMM_FN7: IN A,(PAGE2) EX AF,AF' LD A,SYS_PAGE OUT (PAGE2),A LD HL,08000H LD DE,ID_SPRINTER LD B,L_ID ID_LOOP: LD A,(DE) CP (HL) JR NZ,INIT_SYS_ALL INC HL INC DE DJNZ ID_LOOP EX AF,AF' OUT (PAGE2),A RET MSDOS_COLD_VARS: DI IN A,(PAGE2) EX AF,AF' LD A,SYS_PAGE OUT (PAGE2),A INIT_SYS_ALL: LD DE,08000H LD HL,ID_SPRINTER LD BC,L_ID LDIR LD HL,DISK_TYPE-4000h LD (HL),0 INC HL LD (HL),1 INC HL LD (HL),40H ; HDD INC HL LD (HL),3 INC HL LD (HL),0 ; PAGE0 INC HL LD (HL),5 ; PAGE1 INC HL LD (HL),2 ; PAGE2 INC HL LD (HL),0 ; PAGE3 LD A,9 LD (MSD_SECS-4000h),A LD A,0 LD (DS_1440-4000h),A LD HL,RAMD_KEYS-4000h LD DE,RAMD_KEYS+1-4000h LD BC,RAMD_KEY_NUM-1 LD (HL),0 LDIR LD DE,ZG_ADDRESS LD (WIN_ZG-4000h),DE LD HL,L_SCORPION LD (CONFIG_ALL-4000h),HL LD DE,CNF_0 LD (CONFIG_DE-4000h),DE LD HL,TASK_DATA-4000h ; убить все задачи ;SYS_PAGE.CURRENT_TASK LD DE,TASK_DATA+1-4000h LD BC,0FFH LD (HL),0 LDIR EX AF,AF' OUT (PAGE2),A CALL EMM_FN1 RET