; ; _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ [___FOR ZX-MODE___] _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ ; ; [ ] free zx pages! ; ????? SYS_PAGE.SHARED_BUFFER_256b IF FREE_ZX_PAGES ;----------------[Выделение/освобождение страниц спектрума]-------------; ;вход: рег B: 0 - инит памяти Spectrum 48k ; 1 - инит памяти Pentagon 128k ; 2 - инит памяти Pentagon 512k ; 3 - инит памяти Scorpion 256k ; рег A: требуемое кол-во страниц для vROM ; ;выход: CF = 0: A - номер рамблока ; CF = 1: A - номер ошибки MANAGE_ZX_PAGES: .GET_SCORP: IN A,(SLOT3) LD E,A LD A,SYS_PAGE OUT (SLOT3),A ; проверить наличие свободных страниц скорпа ; B = количество страниц LD B,8 XOR A .check_loop: DEC L JR Z,.error_no_mem CP (HL) JR NZ,.check_loop ; CALL .check_barred_pages LD A,0 JR Z,.check_loop DJNZ .check_loop ; A = 0 ; выделить страницы скорпа LD B,8 .allocate_loop: DEC L CP (HL) JR NZ,.allocate_loop ; CALL .check_barred_pages LD A,0 JR Z,.allocate_loop ; LD (HL),C LD C,L DJNZ .allocate_loop ; L = указатель цепочки. AND A .exit: LD A,E OUT (SLOT3),A LD A,L RET ; фильтр для страниц скорпа ;выход: ZF=1 - страница не подходит .check_barred_pages: ; check reset page LD A,L CP RESET_PAGE RET C RET Z ; check isa page AND #F0 XOR #D0 ; страницы ISA #D0..#DF RET NZ LD L,#D0 RET ; .error_no_mem: LD L,BIOS.Error.EMM.NoMemory SCF JR .exit ;-----------------------------------------------------------------------; ENDIF ;-----------------------------------------------------------------------; ;!TODO задействовать GOTO_SPEC: IN A,(SLOT3) EX AF,AF' LD A,SYS_PAGE OUT (SLOT3),A LD A,B LD (SYS_PAGE.CONFIG_DE+1),A EX AF,AF' OUT (SLOT3),A ;NO_SETUP_2: CP #FC ; JR Z,SPECTRUM_0 ; Конфигурация AY ;NO_SETUP_1: ;!TODO сделать активацию винта для параметра из Setup .ZX_MODE: LD A,#FE ; !HARDCODE сделать через метку ACC-off Spectrum-MODE LD BC,Port_All_Mode OUT (C),A LD SP,#C000 ; CALL FN_SYNC.INT_PENT CALL SET_TXT_PALETTE.ZX ; LD E,0 CALL LP_SET_32 ; LD E,0 LD HL,#5104 CALL LP_SET_32.X ; ????? можно использовать когда-нибудь как-нибудь ; LD D,#35 ; CALL CMOS_RD ; BIT 0,A ; PUSH AF ; CALL Z,SPRINTER_1 ; POP AF ; PUSH AF ; CALL NZ,AY8910 ; POP AF .TASK_0: XOR A ; задача 0, режим 256 килобайт .START_TASK: LD IX,.BASIC_128 JP INIT_PAGES ; инициализация номеров страниц режима спектрума ; ;start_basic: .BASIC_128: LD SP,#C000 LD HL,RES128_PROG LD DE,ZX_VARS.PRINTER_BUFFER ; запуск программы на BASIC-е. LD BC,RES128_PROG.Size LDIR DI JP ZX_VARS.PRINTER_BUFFER ;-----------------------------------------------------------------------; ; ;>$< >$< >$< >$< >$< >$< [ ПЕРЕМЕЩАЕМАЯ В ОЗУ ] >$< >$< >$< >$< >$< >$< ; ;--------[ Программа, размещаемая с #5B00 для запуска Spectrum ]--------; RES128_PROG: DISP ZX_VARS.PRINTER_BUFFER ;#5B00 LD A,ROM.BIOS OUT (SYS_PORT.RAM),A ; Возврат в 128k ROM LD C,SLOT3 IN B,(C) LD A,SYS_PAGE OUT (SLOT3),A LD DE,(SYS_PAGE.CONFIG_DE) XOR A LD (SYS_PAGE.CONFIG_DE+1),A OUT (C),B LD BC,#1FFD OUT (C),A ; Scorp порт LD B,#7F OUT (C),A ; 128 порт LD A,E ; установка конфигурации и режима TURBO OUT (SYS_PORT.RAM),A ; CONFIG_SET INC D DEC D ; 0 ВХОД В BASIC-128 JP Z,0 ; 1 ВХОД В BASIC-48 LD A,#10 OUT (C),A DEC D JP Z,0 ; 2 ВХОД В TR-DOS LD HL,0 PUSH HL DEC D JP Z,#3D29 ; 3 ВХОД В EXPANSION ;!TODO пока не работает. Page #45, BIOS (ZX_EXP) #E0 XOR A OUT (C),A LD A,#02 LD B,#1F OUT (C),A DEC D JP Z,0 ; XOR A OUT (C),A LD A,#30 LD B,#7F OUT (C),A ;!TEST LD A,CNF_PORT.PENT_RESET + CNF_PORT.SCORP_RESET OUT (CNF_PORT.OFF),A ; DEC D ; 4 ВХОД В TR-DOS с закрытыми 128-ми портами JP Z,#3D29 ; 5 ВХОД В BASIC-48 с закрытыми 128-ми портами JP 0 ENT .Size EQU $-RES128_PROG ;-----------------------------------------------------------------------; ;-----------------------------------------------------------------------; ;***************************************** ; ; Инициализация страниц для ; спектрумовского режима и ; восстановление спектрумовского ; экрана ; ; Возврат по IX ; ; !!! NO USE STACK !!! ; ;***************************************** ;!TODO ; инициализация страниц zx spectrum INIT_PAGES: AND A LD E,A EX AF,AF' LD A,E ; BIT 7,A ; JR Z,SCORPION_256_MODE ; BIT 6,A ; JR Z,PENTAGON_128_MODE ; ;PENTAGON_48_MODE: ; AND #3C ; OUT (SLOT0),A ; INC A ; OUT (SLOT1),A ; INC A ; OUT (SLOT2),A ; INC A ; LD D,A ; LD BC,#1FFD ; XOR A ; OUT (C),A ; LD B,#7F ; OUT (C),A ; LD A,D ; OUT (SLOT3),A ; JR INIT_VIDEO_REG ; ; ; PENTAGON_128_MODE: ; LD D,8 ; AND #38 ; JR ALL_MODE SCORPION_256_MODE: LD D,16 AND #30 ; до 4-х спектрумов ALL_MODE: OUT (SLOT0),A XOR 5 OUT (SLOT1),A XOR 7 OUT (SLOT2),A OR #0F LD E,A .loop: DEC D LD A,D RLCA AND #10 LD BC,#1FFD OUT (C),A LD A,D AND 7 OR #40 LD B,#7F OUT (C),A LD A,E OUT (SLOT3),A DEC E DEC D INC D JR NZ,.loop INIT_VIDEO_REG: XOR A OUT (RGADR),A ; регистр видео адреса ; OUT (RGSCR),A ; регистр экрана OUT (RGMOD),A ; регистр моды ;!TEST ; Restore old Spectrum Screen ;; LD HL,#4000 ;; LD DE,#4000 ;; LD BC,#1B00 ;; LDIR ; EX AF,AF' ; BIT 6,A ; JR NZ,NO_SCREEN_ALT ; EX AF,AF' ; LD A,7 ; седьмая экранная страница ; LD BC,#7FFD ; OUT (C),A ; Restore old Spectrum Screen 2 ;; LD HL,#C000 ;; LD DE,#C000 ;; LD BC,#1B00 ;; LDIR ; XOR A ; LD BC,#7FFD ; OUT (C),A ; EX AF,AF' NO_SCREEN_ALT: AND A JP (IX) ;-----------------------------------------------------------------------; ;---------------------[ ЗАГЛУШКИ ДЛЯ #41 СТРАНИЦЫ]----------------------; ;-------------[RST 08] RAM_BIOS_PROG: ; for CALL BIOS in #41 page DISP Spec_Page.to_bios PUSH AF LD A,ROM.BIOS OUT (SYS_PORT.ROM),A POP AF RET ENT .Length EQU $-RAM_BIOS_PROG ;-------------------[] ; ;-------------[RST 38] PROG_NO_ROM: DISP Spec_Page.no_zx_rom DI ; LD A,#FF OUT (SLOT3),A OUT (SLOT2),A OUT (SLOT1),A ; LD SP,#BF00 ; LD E,0 LD BC,BIOS.LP_OPEN_S.TXT_80x32_Default RST ToBIOS ; LD DE,0 LD HL,#2050 LD C,BIOS.LP_CLS_WIN RST ToBIOS ; set scr-2 LD A,1 OUT (SCREEN_SWITCH),A ; LD HL,MESSAGE_NR LD DE,#A000 LD BC,MESSAGE_NR.size LD A,C LDIR ; LD HL,#A000 LD D,0 ; delimiter LD E,COLORS.CGA.FLASH + COLORS.CGA.INK.RED LD B,A LD C,BIOS.LP_PRINT_LINE3 RST ToBIOS ; .loop: DI HALT JR .loop ; MESSAGE_NR: DZ " Spectrum ROM not installed. Use spectrum.exe Press Ctrl+Alt+Del or RESET" .size EQU $-MESSAGE_NR ENT PROG_NO_ROM.size EQU $-PROG_NO_ROM ;-------------------[] ;-----------------------------------------------------------------------; ;>$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$<; ; ; _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ ; ;