TAB_FNS: ;FN_80h DW LP_OPEN_S ; открытие окна DW LP_PRINT_ALL ; печать символа в окно DW LP_PRINT_SYM ; печать символа без атр DW LP_PRINT_ATR ; печать только атрибута DW LP_SET_PLACE ; установка позиции печати DW LP_PRINT_LINE ; печать строки длиной B DW LP_PRINT_LINE2 ; печать строки -//- без атрибутов DW LP_PRINT_LINE3 ; печать строки длиной B до D ;FN_88h DW LP_PRINT_LINE4 ; печать строки -//- без атрибутов DW LP_CLS_WIN DW LP_SCROLL_UD DW LP_PRINT_LINE5 DW LP_PRINT_LINE6 DW LP_CLS_WIN_2 DW LP_GET_PLACE DW FN_TURBO ;FN_90h DW EMM_FN0 ; неразрушающее определение объема ОЗУ. DW EMM_FN1 ; инициализация распределения памяти DW EMM_FN2 ; получить блок памяти DW EMM_FN3 ; освободить блок памяти DW EMM_FN4 ; получить номерa страниц RAM-Disk DW EMM_FN5 ; получить следующую страницу DW EMM_FN6 ; получить адреса портов DW EMM_FN7 ; инициализация *** ;FN_98h DW RAMD_CALC_PAGE ; Fn 98h DW SET_DISK_TYPE DW DISK_REDIR DW FN_NO DW FN_NO DW EMM_DIV ; разделения блока на два. DW EMM_ADD ; слияние двух блоков DW MSDOS_COLD_VARS ; инициализация всей памяти ;FN_A0h DW PIC_FN0 ; ОТКРЫТИЕ ОКНА - Fn 0A0h DW PIC_FN1 ; ВЫВЕСТИ ТОЧКУ DW PIC_FN2 ; ВЫВОД ЛИНИИ COPY DW PIC_FN3 ; ВЫВОД ЛИНИИ FILL DW PIC_FN4 ; ВЫВОД ПАЛИТРЫ DW PIC_FN5 ; УСТАНОВКА RGMOD DW PIC_FN6 ; A - page_pal, E - номер палитры, B - тип палитры DW PIC_FN7 ;FN_A8h DW PIC_FN8 DW PIC_FN9 DW PIC_FN10 DW PIC_FN11 DW PIC_FN12 DW PIC_FN14 DW PIC_FN14 DW PIC_FN15 ;FN_B0h DW WIN_OPEN_WIN ; открытие окна по описателю DW WIN_CLOSE_WIN ; закрытие окна DW WIN_COPY_WIN ; сохранение текстового окна в памяти DW WIN_REST_WIN ; восстановление текстового окна из памяти DW WIN_GET_SYM ; взять символ DW WIN_PUT_SYM ; положить символ DW WIN_SET_ZG ; загрузка знакогенератора DW WIN_MOVE_WIN ; переместить окно ;FN_B8h DW WIN_GET_ZG ; получить знакогенератор DW FN_NO DW FN_NO DW FN_NO DW FN_NO DW FN_NO DW FN_NO DW FN_NO ;FN_C0h DW EMM_FN0 ; получить данные об объеме памяти и кол-во своб. стр. DW EMM_FN1 ; инициализация распределения памяти DW EMM_FN2M ; получить блок памяти DW EMM_FN3M ; освободить блок памяти DW EMM_FN4M ; получить номер страницы в блоке памяти DW EMM_FN5M ; получить список страниц блока памяти DW EMM_FN6 ; получить адреса портов окон DW EMM_FN5 ; получить следующую страницу блока ;FN_C8h DW BLK_R_W ; функция чтения/записи в блок памяти DW BLK_TO_RAMD ; назначить блок RAM-Disk-у DW RAMD_CLEAR ; освободить RAM-Disk DW RAMD_TO_DRV ; назначить RAM-Disk на дисковод DW FDD_TO_DRV ; назначить REAL_DRIVE на дисковод DW HDD_TO_DRV ; назначить HDD на дисковод DW GET_RAMD_ST ; получить тип назначения на RAM-Disk DW GET_DRV_ST ; получить тип назначения на дисковод ;FN_D0h DW FN_LIB DW FN_LIB DW FN_LIB DW FN_LIB DW FN_LIB DW FN_LIB DW FN_LIB DW FN_LIB ;FN_D8h DW FN_LIB DW FN_LIB DW FN_LIB DW FN_LIB DW FN_LIB DW FN_LIB DW FN_LIB DW FN_LIB ;FN_E0h DW LP_PRINT_LINE_DIR DW FN_NO DW FN_NO DW FN_NO DW FN_NO DW FN_NO DW FN_NO DW FN_NO ;FN_E8h DW FN_SENT_BYTE ; послать байт через PC_link DW FN_RESEIVE_B ; принять байт через PC_link DW FN_KBD_OUT ; послать байт в клавиатуру DW FN_NO DW FN_NO DW FN_CRIPT DW AY8910 DW FN_VERSION ;FN_F0h DW SPRINTER_1 DW SPRINTER_2 DW FN_SINC DW SPRINTER_ALL DW DCP_FN0 DW CMOS_TEST DW CMOS_RD DW CMOS_WR ;FN_F8h DW SET_ROM_PAGES DW READ_PORTS ; DW WRITE_PORTS ; DW GOTO_SPEC ; Goto Spectrum! DW FN_NO DW FN_RESET DW FN_NO ; SAVE_AUTOSTART DW FN_VERSION EXP_FNS: ; Вход в функцию из DOS POP AF CALL EXP_FNS1 CALL DOS_ON JP EXP_FNS_RET ;************************************ EXP_FNS_RST18: ; Вход в функцию по RST18 и RST8 bit 7,c JR Z,ower2_fn CALL EXP_FNS1 RET ower2_fn: BIT 6,C RES 6,C JR NZ,EXP_HDD_X SCF RET EXP_HDD_X: CALL EXP_HDD RET ;********************************** FN_CRIPT: DEC B SCF RET NZ LD HL,(ROM_NUMBER) LD A,(ROM_NUMBER+2) LD BC,5281h LD DE,47E8h AND A RET ;********************************** START_DI: PUSH AF LD A,R JP PE,XX_DI LD A,R XX_DI: LD A,80h JP PE,XX_DI2 XOR A XX_DI2: LD R,A DI POP AF RET END_DI: PUSH AF LD A,R BIT 7,A JR Z,XX_DI3 EI POP AF ; PE RET XX_DI3: DI POP AF ; PO RET ;********************************** EXP_FNS1: PUSH HL PUSH AF LD L,C SLA L LD H,TAB_FNS/256 LD A,(HL) INC L LD H,(HL) LD L,A POP AF EX (SP),HL RET READ_PORTS: WRITE_PORTS: FN_NO: SCF RET SET_ROM_PAGES: ; in A - page, B - new ROM-page ; out B - old ROM-page EX AF,AF' LD A,CNF_0 OUT (CNF_PORT),A LD C,PAGE2 ; получить страницу IN D,(C) LD A,40H ; установить новую OUT (C),A LD A,(08000H) ; сохранить то что было LD L,A LD A,(08200H) LD H,A EX AF,AF' ; страница LD (08000H),A ; установить порт ROM TR-DOS LD (08200H),A EX AF,AF' LD A,B LD BC,0 EX AF,AF' IN A,(C) EX AF,AF' OUT (C),A ; установить новый TR-DOS EX AF,AF' LD B,A LD A,L LD (08000H),A ; вернуть порт LD A,H LD (08200H),A ; вернуть порт LD C,PAGE2 LD A,SYS_PAGE OUT (C),A LD A,(CONFIG_DE-4000H) OUT (C),D ; вернуть страницу OUT (CNF_PORT),A AND A RET ;TAB_SIZE EQU $-TAB_FNS ;****************************************** ;********************************************* ;***************************************** ; ; Функция дешифратора портов. ; HL - адрес ; DE - маска - 0 изменяемые биты, 1 неизменяемые ; B - порт ; ; ALL STACKS, DI ; ;***************************************** DCP_FN0: AND A JP Z,PORTS_INIT PUSH IX LD IX,RET_DCP_FN0 IN A,(PAGE3) EX AF,AF' LD A,DCP_PAGE OUT (PAGE3),A JP DCP_FN0M RET_DCP_FN0: EX AF,AF' OUT (PAGE3),A AND A POP IX RET BLK_TO_RAMD: ; RAM-Disk A, BLK - B CP RAMD_KEY_NUM CCF RET C PUSH HL PUSH BC LD L,A IN A,(PAGE2) LD C,A LD A,SYS_PAGE OUT (PAGE2),A LD A,L LD HL,RAMD_KEYS-4000H ADD A,L LD L,A LD A,(HL) ; ключ блока AND A JR NZ,BLK_BUSY ; RAM-Disk занят - ошибка LD (HL),B LD A,C OUT (PAGE2),A LD A,B AND A POP BC POP HL RET BLK_BUSY: LD A,C OUT (PAGE2),A SCF POP HL RET RAMD_CLEAR: ; RAM-Disk A CP RAMD_KEY_NUM CCF RET C PUSH HL LD L,A IN A,(PAGE2) LD C,A LD A,SYS_PAGE OUT (PAGE2),A LD A,L LD HL,RAMD_KEYS-4000H ; RAM-Disk свободем ADD A,L LD L,A LD B,A ; запомнить удаляемый рамдиск LD A,(HL) AND A JR Z,BLK_BUSY ; возврат с ошибкой LD (HL),0 LD A,C OUT (PAGE2),A AND A POP HL RET RAMD_TO_DRV: ; RAM-Disk A, DRV - B CP RAMD_KEY_NUM CCF RET C LD C,A LD A,B CP 4 CCF RET C LD HL,DISK_TYPE-4000H LD L,B IN A,(PAGE2) LD B,A LD A,SYS_PAGE OUT (PAGE2),A LD A,C ADD A,4 LD (HL),A LD A,B OUT (PAGE2),A AND A RET FDD_TO_DRV: ; Disk A, DRV - B CP 4 CCF RET C LD C,A LD A,B CP 4 CCF RET C LD HL,DISK_TYPE-4000H LD L,B IN A,(PAGE2) LD B,A LD A,SYS_PAGE OUT (PAGE2),A LD (HL),C LD A,B OUT (PAGE2),A AND A RET HDD_TO_DRV: ; HDD A, DRV - B AND 0FH LD C,A LD A,B CP 4 CCF RET C LD HL,DISK_TYPE-4000H LD L,B IN A,(PAGE2) LD B,A LD A,SYS_PAGE OUT (PAGE2),A LD A,C ADD A,40H LD (HL),A LD A,B OUT (PAGE2),A AND A RET GET_RAMD_ST: CP RAMD_KEY_NUM CCF RET C PUSH BC LD HL,RAMD_KEYS-4000H ADD A,L LD L,A IN A,(PAGE2) LD B,A LD A,SYS_PAGE OUT (PAGE2),A LD C,(HL) LD A,B OUT (PAGE2),A LD A,C POP BC AND A RET GET_DRV_ST: CP 4 CCF RET C PUSH BC LD HL,DISK_TYPE-4000H ADD A,L LD L,A IN A,(PAGE2) LD B,A LD A,SYS_PAGE OUT (PAGE2),A LD C,(HL) LD A,B OUT (PAGE2),A LD A,C POP BC AND A RET CMOS_EMU_WR: PUSH DE LD C,PAGE3 IN B,(C) LD E,SYS_PAGE OUT (C),E LD E,D LD D,0FFH LD (DE),A OUT (C),B POP DE RET ;*********************************************** ; ; CMOS - 35h,36h - установки бейсика ; ;*********************************************** CMOS_WR: WR_CMOS: ; запись с CMOS CALL CMOS_TEST JR C,CMOS_EMU_WR XWR_CMOS: ; запись с CMOS LD BC,CMOS_AWR OUT (C),D LD BC,CMOS_DWR OUT (C),A RET CMOS_EMU_RD: PUSH DE LD C,PAGE3 IN B,(C) LD E,SYS_PAGE OUT (C),E LD E,D LD D,0FFH LD A,(DE) OUT (C),B POP DE RET CMOS_RD: RD_CMOS: ; чтение из CMOS CALL CMOS_TEST JR C,CMOS_EMU_RD XRD_CMOS: ; чтение из CMOS LD BC,CMOS_AWR OUT (C),D LD BC,CMOS_DRD IN A,(C) RET CMOS_TEST: PUSH DE PUSH BC PUSH AF LD D,3FH CALL XRD_CMOS LD E,A CPL CALL XWR_CMOS CALL XRD_CMOS CPL CP E JR NZ,CMOS_ERR LD A,E CALL XWR_CMOS POP AF POP BC POP DE AND A RET CMOS_ERR: LD A,E CALL XWR_CMOS POP AF POP BC POP DE SCF RET ; ;DE - куда - страница открыта! ;BC - сколько ;HL - буфер ; ; PUSH BC ; LD H,D ; LD L,E ; ADD HL,BC ; JR C,CUT ; LD HL,BUFER ; LDIR ; POP BC ; RET ;CUT: ; PUSH HL ; LD A,L ; LD L,C ; LD C,A ; LD A,H ; LD H,B ; LD B,A ; ; AND A ; SBC HL,BC ; LD B,H ; LD C,L ; LD HL,BUFER ; LDIR ; CALL NEXT_BANK ; POP BC ; LD A,B ; OR C ; JR Z,LAB ; LDIR ;LAB: POP BC ; RET ; FN_TURBO: CP 2 JR Z,FN_TB_ONOFF CP 3 JR Z,FN_TB_ONOFF SCF RET FN_TB_ONOFF: LD C,A IN A,(PAGE3) LD B,A LD A,SYS_PAGE OUT (PAGE3),A LD DE,(CONFIG_DE) LD A,E AND 0FCh OR C LD E,A OUT (CNF_PORT),A LD (CONFIG_DE),DE LD A,B OUT (PAGE3),A AND A RET EMM_FN9: EMM_DIV: ; разделить блок памяти на два блока ; A - блок, B - длина первого блока после разделения ; выход: A - блок 1, B - блок 2 INC B DEC B SCF RET Z DEC B LD E,A CALL EMM_FN4M ; получить номер страницы блока RET C LD D,A IN A,(PAGE2) EX AF,AF' LD A,SYS_PAGE OUT (PAGE2),A LD H,RAMD_FAT/256-40H LD L,D LD A,(HL) LD (HL),0FFH LD B,A EX AF,AF' OUT (PAGE2),A LD A,E AND A RET EMM_FN8: EMM_ADD: ; слить два блока памяти в один ; А - блок 1, B - блок 2 ; выход: А - блок LD E,A IN A,(PAGE2) EX AF,AF' LD A,SYS_PAGE OUT (PAGE2),A LD H,RAMD_FAT/256-40H LD L,E LD C,B LD B,0 EMM_ADD_L: LD A,(HL) AND A JR Z,EMM_ADD_ERR CP 0FFH JR Z,EMM_ADD_NEXT LD L,A DJNZ EMM_ADD_L EMM_ADD_ERR: EX AF,AF' OUT (PAGE2),A SCF RET EMM_ADD_NEXT: LD A,C AND A JR Z,EMM_ADD_ERR LD (HL),A EX AF,AF' OUT (PAGE2),A AND A LD A,E RET FN_RESET: ; B - параметр сброса DEC B ; B = 1 - сброс без перезагрузки схемы. ; B = 2 - сброс с перезагрузкой схемы ; ?? B = 3 - сброс с перезагрузкой EP1K30 JR Z,RESET_1 ; DEC B ; JR Z,RESET_2 DEC B RET NZ INC B RESET_1: DI LD A,0 LD BC,1FFDH OUT (C),A LD B,7FH OUT (C),A LD A,40H ;DCP_PAGE OUT (PAGE3),A LD A,5 OUT (PAGE1),A LD A,2 OUT (PAGE3),A LD A,0 OUT (PAGE0),A OUT (RGADR),A OUT (RGMOD),A ;OUT (#E9),A ; #E9 = RGSCR не реализовано в схеме ; JP Z,0 JP RESET_ALL