; DISPLAY "Service" ; !FIXIT тут можно, походу, дохрена убрать ; страницы с конфой для Sp97, для совместимости с древними прогами PG_SP1 equ #EC PG_SP2 equ #EE PG_AY equ #EA ; ;!TODO замутить заливку конфы, рестарт, перехват ресета силами BIOS PG_Sp2000 EQU #FE ; RST_CONF: ;--[] ZX Spectrum .AY8910: LD D,#35 ;!HARDCODE выяснить за что раньше эта ячейка в кмос отвечала. похоже на хранение значения Port_All_Mode или CONFIG_DE+1 CALL CMOS_RD OR 1 CALL CMOS_WR LD BC,Port_All_Mode IN A,(C) AND #FE ;!HARDCODE OUT (C),A ; ACC_OFF ;LD A,PG_AY LD DE,#FFFC JR .INT_PLD ;--[] ;--[] Sprinter ZX .SP97_1: LD D,#35 ;!HARDCODE выяснить за что раньше эта ячейка в кмос отвечала. похоже на хранение значения Port_All_Mode или CONFIG_DE+1 CALL CMOS_RD AND #FE CALL CMOS_WR LD BC,Port_All_Mode IN A,(C) AND #FE ;!HARDCODE OUT (C),A ; ACC_OFF ;LD A,PG_SP1 LD DE,#FFFE ;!HARDCODE JR .INT_PLD ;--[] ;--[] .SP97_2: LD BC,Port_All_Mode IN A,(C) OR 1 ; ACC_ON OUT (C),A ;LD A,PG_SP2 LD DE,#FFFD ;!HARDCODE JR .INT_PLD ;--[] ;--[] .CUSTOM: CP #80 JR NC,.CHOOSE_CNF ; only for old FLEX10K soft compatible LD C,SLOT3 IN B,(C) OUT (C),A ; PAGE с прошивкой LD DE,(#C090) ; PLD-ID OUT (C),B ; RET page ;--[] ;JR INT_PLD .INT_PLD: ; only for old FLEX10K soft compatible LD C,SLOT3 IN B,(C) LD A,SYS_PAGE OUT (C),A LD (SYS_PAGE.CONFIG_BYTE),DE OUT (C),B LD A,E ; config-byte CP #FF LD A,#80 JR Z,.YES_CBL XOR A .YES_CBL: LD BC,CBL.SYS_PORT OUT (C),A LD A,E ; config-byte OR #FE ;!HARDCODE LD BC,Port_All_Mode ; SYSTEM Spectrum/Sprinter OUT (C),A LD A,#3C OUT (FDC_93.DrvCTRL),A XOR A RET .CHOOSE_CNF: ;!TEST CP PG_Sp2000 ;LD DE,SP2000_ConfID JR Z,.INIT_ACEX ; ; only for old FLEX10K soft compatible CP PG_SP1 LD DE,#FFFE ;!HARDCODE JR Z,.INT_PLD CP PG_SP2 LD DE,#FFFD JR Z,.INT_PLD CP PG_AY LD DE,#FFFC JR Z,.INT_PLD SCF RET .INIT_ACEX: ;!FIXIT ;!TODO НЕДОДЕЛАНО!!!! DI ; устанавливаем нулевую карту портов LD A,CNF_PORT.CNF_0 OUT (SYS_PORT.ON),A ; сохраняем воткнутые страницы в Spec_Page IN A,(SLOT0) LD E,A IN A,(SLOT1) LD D,A IN A,(SLOT2) LD L,A IN A,(SLOT3) LD H,A LD A,Spec_Page OUT (SLOT3),A LD (Spec_Page.page_0),DE LD (Spec_Page.page_2),HL ; достаём адрес возврата в вызывающую функцию и сохраняем в Spec_Page POP DE LD HL,RST_18_1.exit AND A SBC HL,DE JR NZ,1F ; NZ - если вызов был по RST #18 POP DE ; если вызов был в ОЗУ по RST 8 1: LD (Spec_Page.RET_addr),DE ; проверяем размер блока с конфой и получаем страницы конфы PUSH BC LD HL,Spec_Page.bitstream_pages LD A,B CALL EMM.GetMemBlkPages LD A,B POP BC LD B,A JR C,.INIT_ACEX.ERROR CP 4+1 ;!HARDCODE количество страниц в кэш для бистрима плюс одна JR NC,.INIT_ACEX.ERROR PUSH BC ; закидываем в Spec_Page прогу для заливки конфы LD HL,.INIT_ACEX.PROGRAM LD DE,Spec_Page.init_acex LD BC,.INIT_ACEX.PROGRAM.Size LDIR ; POP BC ; B = size of ram block in pages CALL Spec_Page.init_acex ; ; .. ... ... .. ;!TODO сделать функцию по заливке своей конфы, перехвату ресета. ; *. Вход в подфункцию только через RST 08 или #18 ; *. Сохранить все страницы пользователя в SYS_PAGE для перехвата ресета ; *. Достать со стека адрес возврата и сохранить в SYS_PAGE для перехвата ресета ; *. Сохранить куда-нибудь значение стека ; * ; .. ... ... .. LD BC,256*BIOS.REINIT.HARD_RESET + BIOS.REINIT JP_to_BIOS .INIT_ACEX.ERROR: POP BC LD A,(Spec_Page.page_2) OUT (SLOT2),A LD A,(Spec_Page.page_3) OUT (SLOT3),A SCF RET ; .INIT_ACEX.PROGRAM: DISP Spec_Page.init_acex ; B = size of ram block in pages ; IN A,(FastRAM.ON) XOR A EXX LD HL,Spec_Page.bitstream_pages LD BC,SLOT2 EXX .load_loop: EXX OUTI EXX PUSH BC OUT (FastRAM.SLOT0),A LD HL,0 LD DE,#8000 LD BC,#4000 LDIR ; INC A POP BC DJNZ .load_loop ; ... .... ; acex loading and flags ; ... .... XOR A OUT (FastRAM.SLOT0),A IN A,(FastRAM.OFF) RET ENT .INIT_ACEX.PROGRAM.Size EQU $-.INIT_ACEX.PROGRAM ; ;*************************************** ;!TEST ;--------------------------[;!TODO потестить]--------------------------; ; B - параметр сброса ; B = 1 - RESTART. ; B = 2 - Soft reset ; B = 3 - Hard reset ; B = 4 - Reinit spectrum pages REINIT: DEC B JR Z,.Restart ;1 DEC B JR Z,.SoftReset ;2 DEC B JR Z,.HardReset ;3 DEC B SCF RET NZ .ReinitZXpages: ;4 LD DE,RESERVED_PAGES ; таблица занятых системных страниц LD HL,SYS_PAGE.RAMD_FAT ; Адрес FAT ОЗУ. LD C,SLOT3 IN B,(C) LD A,SYS_PAGE OUT (SLOT3),A LD A,(DE) .zxloop: CP #FF JR Z,.endzxloop INC DE LD L,A LD A,(HL) AND A JR NZ,.errorzxloop LD A,(DE) LD (HL),A JR .zxloop .errorzxloop: DEC DE LD HL,-RESERVED_PAGES-1 ADD HL,DE JR NC,.errorzxloop_noChanges DEC DE LD H,high SYS_PAGE.RAMD_FAT LD A,(DE) LD L,A LD A,#FF LD (HL),A .errorzxloop_noChanges: SCF .endzxloop: OUT (C),B RET ; ;!TEST .HardReset: DI LD A,DCP_PAGE OUT (SLOT1),A ; set DCP page LD A,ACEX.RESET LD (#4400),A ; open for WR .loop: LD BC,#0100 ; цикл сброса OUT (C),C LD B,0 OUT (C),C JR .loop ; полностью зациклить! ; ;!TEST .Restart: DI LD A,0 LD BC,#1FFD OUT (C),A LD B,#7F OUT (C),A LD A,#40 OUT (SLOT3),A LD A,5 OUT (SLOT1),A LD A,2 OUT (SLOT3),A LD A,0 OUT (SLOT0),A OUT (RGADR),A OUT (RGMOD),A JP 0 ;Restart ; ; .SoftReset: DI LD A,#10 LD BC,#1FFD OUT (C),A ; 8-я страница !! LD A,RESET_PAGE OUT (SLOT3),A LD A,CNF_PORT.TURBO.OFF OUT (SYS_PORT.ROM),A .loop2: LD (#C000),A ; Soft RESET !!! JR .loop2 ; ;----------------------------------------------------------------------; ; ; ;----------------------------------------------------------------------; SET_ROM_FLAG_ZX: LD C,A IN A,(SLOT3) PUSH AF LD A,Spec_Page OUT (SLOT3),A XOR A LD (Spec_Page.flag_Z),A LD (Spec_Page.flag_X),A POP AF OUT (SLOT3),A LD A,C RET ;----------------------------------------------------------------------; ;