; ;************************************************************* ; ; EXPANSION VER 3.00 (C) Peters Plus Ltd. ; ;************************************************************* ;*************************************** ; DEVICE ZXSPECTRUM4096 ; модель с 4 метрами памяти ; MMU 0 e, 0 ; нулевая страница в банку 0 и проверка на границы ; OUTPUT './Build/EXP.BIN' ;*************************************** ; ORG 0 ; DISP 0 ;SPRIN2 EQU 2 ; 1 - включение Sprinter-1 первой прошивкой ; 2 - включение Sprinter-2 первой прошивкой ; INCLUDE '../shared/SPRINT00.asm' ; константы, макросы.. ; INCLUDE 'EXP_VERSION.inc' ;KEMPSTON.JOY_DOS EQU 0FFh ;*************************************** ;*********** BEGIN EXPANSION *********** ;*************************************** ;A_0000: ; Вход по RESET EXP_START: JP GLOBAL_RESET ; DB 0,0 ;--------------------------------------- ROM_NUMBER: .part1: DW MotherBoardID ; MotherBoardID .part2: DB 0 ;--------------------------------------- ;--------------------------------------- ; BoardID: ; .start: WORD BoardID_start ; BoardID_start ; .end: WORD BoardID_end ; BoardID_end ;--------------------------------------- ;======================================= BLOCK 8-$,0 ; first on/off EXPANSION ;программа для вызова BIOS через RST8 из RAM0 ; EXP_FNS_2_RET: PUSH AF LD A,ROM.EXT OUT (SYS_PORT.OFF),A POP AF JR RST_18_1 ;======================================= ;======================================= BLOCK #10-$,0 ; DSS ??? RST_10: ; JR RST10 ;======================================= ;======================================= BLOCK #18-$,0 ; RST18h - MAIN BIOS functions ; JP EXP_FNS_RST18 ; !TEST new_api RST_18_1: CALL EXP_FNS_RST18 ; !TEST new_api JR EXP_FNS_2_RET ;======================================= ;======================================= BLOCK #20-$,0 RST_20: ;======================================= ;======================================= BLOCK #28-$,0 RST_28: ;======================================= ;======================================= BLOCK #30-$,0 RST_30: ;======================================= ;======================================= BLOCK #38-$,0 ; INTERUPT Point ; RST38: EI RETI ;RST10: ; CALL_48 10h ; RET ;======================================= ;======================================= _mInfoBLOCK #66-$,0 NMI_Point: RETN ; резерв 3 байта для команды JP NOP ;======================================= ;SET_BIOS_TO_RAM: ; программа работает на адресе 0C000h ; ; LD SP,0C0C0H ; LD A,0E0H ; LD C,PAGE3 ; IN B,(C) ; CALL SET_ROM_PAGES+0C000H ; JP NO_SUMX_EQ ;********************************** ;BEEP: ; PUSH HL ; PUSH DE ; PUSH BC ; PUSH AF ; PUSH IX ; ; LD HL,BEEP_RET ; PUSH HL ; LD HL,SW_ROM ; PUSH HL ; LD HL,03B5h ; PUSH HL ; LD HL,200 ; LD D,H ; LD E,5 ; JP SW_ROM ;BEEP_RET: ; ; POP IX ; POP AF ; POP BC ; POP DE ; POP HL ; RET ;======================================= _mInfoALIGN #10,0 ;TABLE_X EQU #A0 ; any adress < #C0 with mask %xxxx0000 ; BLOCK TABLE_X-$ TABLE_X: ; таблица для Sprinter POST-Tester-a .v0: DB 00101000b ; "0" .v1: DB 10111101b ; "1" .v2: DB 00110010b ; "2" .v3: DB 00110100b ; "3" .v4: DB 10100101b ; "4" .v5: DB 01100100b ; "5" .v6: DB 01100000b ; "6" .v7: DB 00111101b ; "7" .v8: DB 00100000b ; "8" .v9: DB 00100100b ; "9" .vA: DB 00100001b ; "A" .vB: DB 11100000b ; "B" .vC: DB 01101010b ; "C" .vD: DB 10110000b ; "D" .vE: DB 01100010b ; "E" .vF: DB 01100011b ; "F" ;======================================= ;======================================= ; BLOCK MEM_MAP.ID_Version-$,0 ;#C0-$,0 ID_Version: dw bitstream_ver_hex ; Version of bitstream hex ID_SPRINTER_length: DB ID_SPRINTER.LENGTH ID_SPRINTER: DB 'Hardware v' .bitstream_ver: DB bitstream_ver_string,0 DB 'Sprinter',0 DB 0 .LENGTH EQU $-ID_SPRINTER ; Check for max length of string ASSERT ID_SPRINTER.LENGTH < #20, 'ERROR! ID String is to long!' ;======================================= ; BLOCK #FC-$,0 BoardID: .start: WORD BoardID_start ; BoardID_start .end: WORD BoardID_end ; BoardID_end ; ;======================================= ; BLOCK #100-$,0 RESTARTS EQU #FFE0 ; !FIXIT вынести в SP2000.inc GLOBAL_RESET: DI IM 1 LD HL,RESTARTS LD DE,RESTARTS_PROG LD B,RESTARTS_PROG.length .compare: LD A,(DE) CP (HL) JR NZ,NO_RESTART INC HL INC DE DJNZ .compare JP RESTARTS ;********************************** ; программа, которая будучи размещенной в #40 странице, ; с адреса RESTARTS, перехватывает RESET ; ; Сделать заготовку с DISP-ENT на будущее !!!!! RESTARTS_PROG: ; !TODO LDConf перехват ресета на любой конфе после hardreset LD HL,RESTARTS ; 3 LD B,16 ; 2 .loop: LD (HL),0 ; 2 INC HL ; 1 DJNZ .loop ; 2 NOP ; 1 NOP ; 1 ; LD A,1 ; 2 ; OUT (SLOT3),A ; 2 ; ; = 16 bytes .length EQU $-RESTARTS_PROG ;********************************** ;------------[Setup Starter]------------ MODULE Setup_Starter ; программа, размещаемая по адресу 0C000h ; для запуска Setup Start: DISP COMPILE_ADDR.SETUP_STARTER Exec: LD A,CNF_0 + ROM.EXPANSION OUT (SYS_PORT.ON),A LD HL,ROM_MAP.SETUP LD DE,MEM_MAP.SETUP LD BC,BLOCK_Setup.Length LDIR LD A,CNF_0+ROM.EXT OUT (SYS_PORT.ON),A ;-----------[Check SPACE] LD A,#FE ; !HARDCODE LD BC,Port_All_Mode ; keyboard int & acc off OUT (C),A LD A,high ZXKeys.Line_7 IN A,(ZXKeys) CPL AND 1 ; в регистре A передаётся нажата ли клавиша SPACE. ; потом проверяется в main.asm [space_check] ; и если нажата, то происходит игнор параметра ; "Быстрый старт ПЗУ" во время перезагрузки EX AF,AF' LD A,#FF ; !HARDCODE OUT (C),A ; keyboard int & acc on, zx_screen & original waits off (for conf >= 3.05) EX AF,AF' ;----------------------[] DI POP HL ; адрес возврата в EXP из SETUP LD SP,#8000 ;!HARDCODE PUSH HL PUSH AF JP SETUP_MAIN ENT Length EQU $-Setup_Starter.Start ENDMODULE ;--------------------------------------- ;SYSTEM_ID_TXT: ; DB "NEW_BIOS" ;-----[перехват RESET не состоялся]----- ; NO_RESTART: ; стек ещё не используем!!! LD SP,IX ; сохранить значение переданное загрузчиком конфы (если старт после ресета) ;*************************************** ; инициализация внутренних ; портов Z84C15 для POST-Tester-а ; LD A,5 ; COM port for Printer OUT OUT (Z84.SIO.Ch_A.Ctrl),A LD A,#62 OUT (Z84.SIO.Ch_A.Ctrl),A LD A,#CF ; BITS I/O OUT (Z84.PIO.Port_A.Command),A XOR A OUT (Z84.PIO.Port_A.Command),A OUT (Z84.PIO.Port_A.Data),A ; PRINTER - PORT - all zeros ;*************************************** ;-инициализация системных портов Z84C15- ; LD BC,#FF*256 + Z84.SYS.Control XOR A OUT (C),A ; 0 register - waits INC C OUT (C),A ; set 0 Waits DEC C LD A,3 ; 3-rd register - Misc.Control Register OUT (C),A INC C XOR A ; !FIXIT читать доку на Z84, выбрать занчение для A LD A,1 ; !FIXIT читать доку на Z84, выбрать занчение для A OUT (C),A ; enable CS0, disable CS1 ; no boundary set! ;********************************** ; ; xor a out (BorderColor),a ; ; ;********************************** ; ==== POST PROCs ================= MODULE POST_TEST ; ********************************* ; ===== Point 0 ======= ; ********************************* LD A,(TABLE_X.v0) ; высветить "0" ;rdlow-ok OUT (Z84.PIO.Port_A.Data),A ; ==== TEST RAM BUS ======== POST_1_RAM_BUS: LD BC,0 LD HL,#C000 LD DE,#0055 .loop: LD (HL),E INC L LD (HL),D DEC L LD A,(HL) XOR E OR C LD C,A INC L LD A,(HL) XOR D OR B LD B,A DEC L DEC E INC D JR NZ,.loop LD A,E CPL LD E,A INC L INC L BIT 4,L JR Z,.loop LD A,B OR C JR Z,POST_1_OK ; no errors ; ERROR RAM BUS CODE 'X'X'X'X... .error: LD HL,TABLE_X .ERB_2: BIT 0,C JR Z,.ERB_1 ; высветить номер ошибочного бита LD A,(HL) AND %11011111 ; с запятыми OUT (Z84.PIO.Port_A.Data),A ; пауза LD DE,0 .pause: DEC DE LD A,D OR E JR NZ,.pause ; RRC BC .ERB_1: LD A,C RRA RR B RR C ; бесконечный цикл INC L LD A,L AND #AF LD L,A JR .ERB_2 ; ************************************************ ; ===== Point 1 ============== ; ************************************************ POST_1_OK: LD A,(TABLE_X.v1) ; высветить "1" ;rdlow-ok OUT (Z84.PIO.Port_A.Data),A ; ===== TEST ADRESS BUS ====== POST_2_ADRESS_BUS: LD HL,#C000 LD DE,#0000 .fill_mem: ; заполнить память адресами LD (HL),E INC L LD (HL),D INC HL INC DE INC DE BIT 7,H JR NZ,.fill_mem DEC HL DEC DE DEC DE .check_mem: ; проверить совпадение LD A,(HL) CP D JR NZ,.error DEC HL LD A,(HL) CP E JR NZ,.error DEC HL DEC DE DEC DE LD A,H CP 0BFh JR NZ,.check_mem JR POST_2_OK ; ошибка адреса CODE: 'XXXX .error: .TSAB_4: LD C,D LD B,11011111b LD IX,.TSAB_3 JR OUT_C_BYTE ; вывести старший байт с запятой .TSAB_3: LD C,E LD B,0FFh LD IX,.TSAB_4 JR OUT_C_BYTE ; вывести младший без запятой ; ===== OUT BYTE PROGRAM ======= OUT_C_BYTE: LD A,C RRCA RRCA RRCA RRCA AND #0F OR TABLE_X LD L,A LD H,0 LD A,(HL) AND B OUT (Z84.PIO.Port_A.Data),A EXX LD DE,0 .LOOP_WTT2: DEC DE LD A,D OR E JR NZ,.LOOP_WTT2 LD A,#FF OUT (Z84.PIO.Port_A.Data),A .LOOP_WTT21: DEC DE LD A,D OR E JR NZ,.LOOP_WTT21 EXX LD A,C AND #0F OR TABLE_X LD L,A LD A,(HL) OUT (Z84.PIO.Port_A.Data),A EXX LD DE,0 .LOOP_WTT3: DEC DE LD A,D OR E JR NZ,.LOOP_WTT3 LD A,#FF OUT (Z84.PIO.Port_A.Data),A .LOOP_WTT31: DEC DE LD A,D OR E JR NZ,.LOOP_WTT31 EXX JP (IX) ; ************************************************ ; ===== Point 2 ========= ; ************************************************ POST_2_OK: LD A,(TABLE_X.v2) ;rdlow-ok OUT (Z84.PIO.Port_A.Data),A ; вывести "2" ; ===== INIT DCP ======== POST_3_INIT_DCP: LD HL,POST_3_OK ; INIT PORTS JP DCP_INIT ; процедура инициализации с возвратом в (HL) ; ошибок нет ; *********************************** ; ===== Point 3 ========= ; *********************************** POST_3_OK: LD A,(TABLE_X.v3) ; вывести "3" ;rdlow-ok OUT (Z84.PIO.Port_A.Data),A ; ===== TEST RAM PAGES == IN A,(SLOT3) EX AF,AF' ; запомнить POST_4_PAGES: LD B,0 .loop: LD A,#FF LD I,A LD A,B OUT (SLOT3),A LD A,0 LD I,A IN A,(SLOT3) CP B JR NZ,.error ; если ошибка переключения Port-а DJNZ .loop EX AF,AF' OUT (SLOT3),A ; восстановить JR POST_4_OK ; *********************************** ; ERROR Port CODE 'XX .error: LD C,B LD IX,.error_out_ret .error_out_ret: LD B,11011111b JP OUT_C_BYTE ; *********************************** ; ===== Point 4 ========= ; *********************************** POST_4_OK: LD A,(TABLE_X.v4) ;rdlow-ok OUT (Z84.PIO.Port_A.Data),A ; высветить "4" ;= проверка чистоты шины данных Z84C15 = POST_5_DATA_BUS: LD B,0 .loop: IN A,(0) CP #FF ; JR NZ,.error ;!!!!! посмотреть DJNZ .loop JR POST_5_OK ; ERROR CODE '_'XX .error: LD C,A .erb1: LD IX,.erbr1 LD B,%11011111 JP OUT_C_BYTE .erbr1: LD A,%11011111 OUT (Z84.PIO.Port_A.Data),A LD DE,0 .LOOP_WTT4: DEC DE LD A,D OR E JR NZ,.LOOP_WTT4 JR .erb1 ; ********************************** ; ===== Point 5 ========= ; ********************************** POST_5_OK: LD A,(TABLE_X.v5) ;rdlow-ok OUT (Z84.PIO.Port_A.Data),A ; вывести "5" ; ********************************** ; POST завершен ; ********************************** ENDMODULE MODULE SET_CONFIG_ID IN A,(SLOT3) EX AF,AF' ; SAVE PAGE3 ;NO_SUMX_EQ: LD A,SYS_PAGE OUT (SLOT3),A ;-------------[Save IX:IY]-------------- ; Don't use IY before this point if it`s normal booting!!! ;NO_NEW_BIOS: LD IX,0 AND A ADD IX,SP ; восстановить значение переданное загрузчиком конфы (если старт после ресета) ; ; В этом месте у нас IX:IY из Loader.asm ; /* ; Дотащили до сюда метку от лоадера ; пока никак не используется LD A,IYL LD L,A LD A,IYH LD H,A LD BC,#0107 ; !!!!! сравнить с 0107h вынести референсом тут и в loader.asm AND A ; если равно - прошла перезагрузка SBC HL,BC JR Z,set_config */ ;--------------------------------------- LD HL,#FFFD ; !!!!! Sprinter-2 вынести референсом тут и в loader.asm set_config: LD (SYS_PAGE.CONFIG_BYTE),HL ; сохранить номер прошивки ; LD HL,(SYS_PAGE.CONFIG_BYTE) ; взять номер прошивки в HL EX AF,AF' OUT (SLOT3),A ; Restore SLOT3 ENDMODULE ;********************************* ; первая инициализация страниц: ; SLOT3=0, SLOT2=2, SLOT1=5, SLOT0=0 XOR A OUT (RGADR),A OUT (RGMOD),A OUT (SLOT3),A OUT (SLOT0),A LD A,5 OUT (SLOT1),A LD A,2 OUT (SLOT2),A ;********************************* ; Don't use stack (SP) before this point if it`s normal booting!!! LD SP,#BFFE ; Начало использования стека!!! PUSH HL ; сохранить номер прошивки CALL PORTS_INIT ; инициализировать порты CALL EMM.CheckColdInit ; инициализация памяти POP HL ; конфигурация JR Reset_Handler.start ; ************************************* ; Считаем, что вход в SETUP всегда !!! ; ************************************* ; LD A,H ; CP 0FFH ; JR NZ,NO_SETUP_1 ; LD A,L ;-----[IF]----- ; IF SPRIN2 = 2 ; CP 0FDH ; Конфигурация Sprinter-2 PG_SP1 equ #EC PG_SP2 equ #EE PG_AY equ #EA ; ELSE ; ; CP #FE ; Конфигурация Sprinter-1 ; PG_SP1 equ #EE ; PG_SP2 equ #EC ; PG_AY equ #EA ; ENDIF ;-------------- ; JR NZ,NO_SETUP_2 MODULE Reset_Handler start: IN A,(SLOT3) push af ;----[перехват soft reset #EE port]----- Check_EE_Port: LD A,Conf_port.RET_PORT LD B,0 LD C,BIOS.SET_PORTS CALL @ToBIOS_3D13 ; переустановить внутр. порт #EE LD A,B AND A jr z,Check_Spec_Page DI OUT (SLOT3),A ; Set restart page .After_Hard_Rst: LD HL,(#FFF4) ; prog address ld a,(#FFF0) ; PAGE0 OUT (SLOT0),A LD A,(#FFF1) ; PAGE1 OUT (SLOT1),A LD A,(#FFF2) ; PAGE2 OUT (SLOT2),A LD A,(#FFF3) ; PAGE3 OUT (SLOT3),A jp (HL) ; ;--[перехват soft/hard reset #41 page]-- Check_Spec_Page: LD A,Spec_Page OUT (SLOT3),A LD A,(#FFFE) CP 'Z' JR NZ,No_Reset_handlers LD A,(#FFFF) CP 'X' JR NZ,No_Reset_handlers LD A,(#FFF7) CP 'R' JR NZ,Spec_Page_handler_OK LD A,(#FFF8) CP 'S' JR NZ,Spec_Page_handler_OK LD A,(#FFF9) CP 'T' JR NZ,Spec_Page_handler_OK XOR A LD (#FFF7),A JR Check_EE_Port.After_Hard_Rst ;--------------------------------------- No_Reset_handlers: init_rom_address EQU #8200 ;!HARDCODE ld hl,init_zx_roms ld de,init_rom_address ld bc,init_zx_roms.length ldir call init_rom_address LD HL,#C000 LD DE,#C001 LD BC,#3FFF LD (HL),C LDIR ; забить FF-ами LD HL,PROG_NO_ROM LD DE,#C000 + #38 LD BC,PROG_NO_ROM.size LDIR LD HL,RAM_BIOS_PROG LD DE,#C000 + #08 LD BC,RAM_BIOS_PROG.Length LDIR Spec_Page_handler_OK: pop af OUT (SLOT3),A ENDMODULE ;************************************** ; COPY BIOS ТО RAM ???? ;************************************** ; ;************************************** ; MODULE Prepare_For_Setup Set_ALL_Mode: LD A,#FF LD BC,Port_All_Mode OUT (C),A Set_Default_Screen: CALL INT_DEF ; set default int ld a,128+4 ; !HARDCODE ld c,#F2 ; !HARDCODE FN_SYNC RST #18 ; set default vsync Setup_to_RAM: LD HL,Setup_Starter.Start LD DE,COMPILE_ADDR.SETUP_STARTER LD BC,Setup_Starter.Length LDIR ; на стек кладётся адрес возврата и дальше тащится всякими костылями, чтоб вернуться назад CALL Setup_Starter.Exec ; #C000 JP ZX_SPECTRUM_MODE ; выход в режим zx spectrum ENDMODULE ;*********************************** ; Инициализация портов PORTS_INIT: ; включить TURBO LD A,D_TBON+CNF_0 OUT (SYS_PORT.ON),A ; RESET to ISA LD BC,ISA_PORT LD A,#FF OUT (C),A .isa_reset: DEC A JR NZ,.isa_reset OUT (C),A ; Инициализация последовательного порта клавиатуры LD A,0 OUT (Z84.SIO.Ch_A.Ctrl),A LD A,1 OUT (Z84.SIO.Ch_A.Ctrl),A LD A,0 ; 18H включение прерываний OUT (Z84.SIO.Ch_A.Ctrl),A LD A,3 OUT (Z84.SIO.Ch_A.Ctrl),A LD A,#C1 OUT (Z84.SIO.Ch_A.Ctrl),A LD A,4 OUT (Z84.SIO.Ch_A.Ctrl),A ;------------------------------ ;!!!!! посмотреть ; ld a,5 LD A,7 ; ????? 5/7 паритет? ;------------------------------ ;!!!!! посмотреть OUT (Z84.SIO.Ch_A.Ctrl),A LD A,5 OUT (Z84.SIO.Ch_A.Ctrl),A LD A,#62 OUT (Z84.SIO.Ch_A.Ctrl),A ;--------[Clean keyboard buffer]-------- .clean_kbd_buf: IN A,(Z84.SIO.Ch_A.Ctrl) BIT 0,A jr z,.mouse IN A,(Z84.SIO.Ch_A.Data) jr .clean_kbd_buf ;--------------------------------------- .mouse: ; Инициализация мыши LD A,0 ; for MOUSE OUT (Z84.SIO.Ch_B.Ctrl),A LD A,1 OUT (Z84.SIO.Ch_B.Ctrl),A LD A,0 OUT (Z84.SIO.Ch_B.Ctrl),A LD A,3 OUT (Z84.SIO.Ch_B.Ctrl),A LD A,#41 OUT (Z84.SIO.Ch_B.Ctrl),A LD A,4 OUT (Z84.SIO.Ch_B.Ctrl),A LD A,#44 OUT (Z84.SIO.Ch_B.Ctrl),A LD A,5 OUT (Z84.SIO.Ch_B.Ctrl),A LD A,#E0 OUT (Z84.SIO.Ch_B.Ctrl),A ; Инициализация таймера мыши LD A,85 ; for MOUSE OUT (Z84.CTC.Ch_0),A LD A,45 OUT (Z84.CTC.Ch_0),A ; Инициализация параллельного порта 1 (принтер) ; для POST-Tester-а ; LD A,0CFH ; BITS I/O ; OUT (Z84.PIO.Port_A.Command),A ; XOR A ; OUT (Z84.PIO.Port_A.Command),A ; ALL - out ; OUT (Z84.PIO.Port_A.Data),A ; DATA - all zeros ; для printer-a LD A,#0F ; OUT OUT (Z84.PIO.Port_A.Command),A OUT (Z84.PIO.Port_A.Command),A ; Инициализация параллельного порта 2 (INT/DMA ISA) LD BC,Z84.PIO.Port_B.Command LD A,#CF ; BITS I/O OUT (C),A LD A,#3F OUT (C),A LD A,#C0 OUT (Z84.PIO.Port_B.Data),A ; "Заглушение" ковокса XOR A OUT (CBL.SYS_PORT),A LD BC,CBL.OUT LD A,#80 .CBL_MUTE: OUT (C),A DJNZ .CBL_MUTE ; Сброс контроллера дисковода ; Включить доступ к контроллеру диска LD A,CNF_3 OUT (SYS_PORT.ON),A OUT (FDC_93.DrvCTRL),A ; !!!!! глянуть push hl pop hl LD A,#3C ; !!!!! глянуть OUT (FDC_93.DrvCTRL),A ; !!!!! глянуть push hl pop hl XOR A OUT (FDC_93.Command),A ; Выключить доступ к контроллеру диска LD A,CNF_0 OUT (SYS_PORT.ON),A ; set HDD1/not-HDD2 LD A,#21 ;!HARDCODE сделать через метку OUT (#BC),A ;!HARDCODE ; CALL DOS_OFF LD BC,#7FFD LD A,#10 OUT (C),A ; BASIC_48 mode LD B,#1F LD A,01 OUT (C),A ; RAM-0 mode !!! RET ;************************************** ; ;------------------------[copy zx-roms to zx-pages]---------------------; ; SLOT0 - ROM 8, sys_port - on. ; RAM SLOT0 - page 0 ; для режима zx spectrum ; ВЫПОЛНЯЕТСЯ ИЗ ОЗУ init_zx_roms: DISP Reset_Handler.init_rom_address in a,(SLOT3) push af DI LD A,1 OUT (SYS_PORT.ON),A ld a,2 IF SetFullZXromLoader ld b,6 ; zx-rom number of pages ELSE ld b,4 ENDIF .loop: push bc out (ROM.SLOT0),a or %01000000 out (SLOT3),a and %10111111 LD HL,0 LD DE,#C000 LD BC,#4000 LDIR inc a pop bc DJNZ .loop xor a out (ROM.SLOT0),a OUT (SYS_PORT.ON),A POP AF out (SLOT3),a LD A,#E2 ; ROM-ID - BASIC 128 LD B,#42 ; page CALL .SET_ROM LD A,#E3 ; ROM-ID - BASIC 48 LD B,#43 ; page CALL .SET_ROM LD A,#E1 ; ROM-ID - TR-DOS LD B,#44 ; page CALL .SET_ROM LD A,#E0 ; ROM-ID - EXPANSION LD B,#45 ; page CALL .SET_ROM LD A,#EB ; ROM-ID - BIOS-1 IF SetFullZXromLoader LD B,#46 ; page ELSE LD B,#45 ; page ENDIF CALL .SET_ROM IF SetFullZXromLoader LD A,#EF ; ROM-ID - BIOS-2 LD B,#47 ; page CALL .SET_ROM ENDIF RET .SET_ROM: LD C,BIOS.SET_PORTS JP ToBIOS_3D13 ENT .length EQU $-init_zx_roms ;-----------------------------------------------------------------------; ; ;************************************** ;************************************** 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: ZX_SPECTRUM_MODE: ; LD A,(#A8) ; OUT (Z84.PIO.Port_A.Data),A LD A,#FE ; !HARDCODE сделать через метку ACC-off Spectrum-MODE LD BC,Port_All_Mode OUT (C),A ;SND_TEST_RET: LD SP,#BFFF CALL INT_PENT CALL SET_PAL_ZX LD HL,#4104 LD E,0 LD B,4 CALL LP_OPEN_S LD HL,#5104 LD E,0 LD B,4 CALL LP_OPEN_S ;************************************* /* LD D,#35 CALL CMOS_RD BIT 0,A ; !!!!! */ ; PUSH AF ; CALL Z,SPRINTER_1 ; POP AF ; PUSH AF ; CALL NZ,AY8910 ; POP AF ;************************************* SPECTRUM_0: XOR A ; задача 0, режим 256 килобайт SPECTRUM_TASK: LD IX,BASIC_128 JP INIT_PAGES ; инициализация номеров страниц режима спектрума BASIC_128: ;start_basic: LD SP,#BFFF LD HL,RES128_PROG LD DE,#5B00 ; запуск программы на BASIC-е. LD BC,LEN_RES128 LDIR DI JP #5B00 ;******************************** ; Программа, размещаемая на 5B00h для запуска Spectrum-а RES128_PROG: LD A,ROM.EXT OUT (SYS_PORT.OFF),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.OFF),A ; CONFIG_SET INC D DEC D JP Z,0 ; 0 ВХОД В BASIC-128 LD A,#10 OUT (C),A DEC D JP Z,0 ; 1 ВХОД В BASIC-48 LD HL,0 PUSH HL DEC D JP Z,#3D29 ; 2 ВХОД В TR-DOS XOR A OUT (C),A LD A,#02 LD B,#1F OUT (C),A DEC D JP Z,0 ; 3 ВХОД В EXPANSION ??? LD A,0 OUT (C),A LD A,#30 LD B,#7F OUT (C),A DEC D JP Z,#3D29 ; 4 ВХОД В TR-DOS с закрытыми 128-ми портами JP 0 ; 5 ВХОД В BASIC-48 с закрытыми 128-ми портами LEN_RES128 EQU $-RES128_PROG ;***************************************************** TURBO_OFF: LD A,D_TBOFF OUT (SYS_PORT.ON),A RET TURBO_ON: LD A,D_TBON OUT (SYS_PORT.ON),A RET JP_HL: JP (HL) ;*************************************** RAM_BIOS_PROG: ; for CALL BIOS in 41h page PUSH AF LD A,ROM.EXT OUT (SYS_PORT.ON),A POP AF RET NOP .Length EQU $-RAM_BIOS_PROG ; JR RST_18_1 ; ; PROG_NO_ROM: DISP #38 DI LD A,#FF OUT (SLOT3),A OUT (SLOT2),A OUT (SLOT1),A LD SP,#BF00 LD C,BIOS.LP_OPEN_S LD B,3 LD E,0 RST ToBIOS LD C,BIOS.LP_CLS_WIN LD DE,0 LD HL,#2050 RST ToBIOS LD A,1 OUT (RGMOD),A ; set scr-2 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.FLASH + COLORS.PAPER.RED + COLORS.INC.CYAN LD B,A LD C,BIOS.LP_PRINT_LN3 RST ToBIOS 1: DI : HALT JR 1B 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 ;-------------[new code end]------------ ;***************************************************** ;CH_2: ; LD A,2 ;C_1601: ; OPEN CHANEL ; CALL_48 1601h ; RET ;PRINT_LINE: ; LD A,(HL) ; INC HL ; CP 0FFh ; RET Z ; RST 10H ; JR PRINT_LINE ; JP RESET_128 ;******************************** ; *** UTILITES *** ;******************************** ;C_0030: ; получить раб обл ; CALL_48X 0030h ; RET ;C_19E8: ; очистить раб обл ; CALL_48X 19E8h ; RET ;C_1655: ; получить пространство ; CALL_48X 1655h ; RET ;**************************************** ; ******* SERVICE ******* ;**************************************** ;******************************************************* ; ДЕШИФРАЦИЯ КОМАНДНОЙ СТРОКИ,ПЕРЕДАННОЙ ДЛЯ "EXPANSION" ;******************************************************* ;COMAND_LINE: ; LD HL,(CH_ADR) ;COMAND_LOOP: ; LD A,(HL) ; INC HL ; CP ":" ; JR Z,COMAND_L1 ; CP 0Dh ; JR NZ,COMAND_LOOP ; RET ;COMAND_L1: ; LD A,(HL) ; CP 0EAh ; REM !!! ; RET NZ ; INC HL ;COMAND_OK: ; ОБНАРУЖЕНА КОМАНДА ДЛЯ 'expansion' ; LD A,(HL) ; INC HL ; CP ':' ; JP Z,MENU_S1 ; CP 0Dh ; JP Z,MENU_S1 ; CP 'I' ; JR Z,COMAND_ISD ; CP 'i' ; JR Z,COMAND_ISD ; CP 'T' ; JR Z,TASK_SWITCH ; CP 't' ; JR Z,TASK_SWITCH ; DEC HL ; POP BC ; JP BASIC_MENU ;MENU_S1: ; POP BC ; CALL SERVICE ; JP SW_ROM_1 ; ;COMAND_ISD: ; LD A,(HL) ; INC HL ; CP 'S' ; JP Z,COMAND_ISD2 ; CP 's' ; JP Z,COMAND_ISD2 ; RET ;COMAND_ISD2: ; POP BC ; CALL ISDOS ; JP SW_ROM_1 ;TASK_SWITCH: ; ;; *** Сохранить задачу *** ; PUSH IY ; PUSH IX ; PUSH AF ; PUSH BC ; PUSH DE ; PUSH HL ; EXX ; EX AF,AF' ; PUSH AF ; PUSH BC ; PUSH DE ; PUSH HL ; ; LD A,R ; PUSH AF ; LD A,I ; PUSH AF ; ; LD A,(HL) ; RLCA ; RLCA ; RLCA ; RLCA ; AND 30H ; новая задача 0..3 ; LD C,A ; IN A,(SLOT3) ; LD B,A ; 3-я страница текущей задачи ; LD A,SYS_PAGE ; OUT (SLOT3),A ; ; LD IX,TASK_DATA ; данные задач ; LD E,(IX) ; старая задача ; LD D,0 ; ADD IX,DE ; данные текущей задачи ; LD E,16 ; ADD IX,DE ; смещение данных в таблице задач ; ; LD (IX+1),B ; сохранить страницу 3 ; LD HL,0 ; ADD HL,SP ; LD (IX+2),L ; сохранить стек задачи ; LD (IX+3),H ; SET 0,(IX) ; установить флаг сохраненности текущей задачи ; RES 1,(IX) ; установить флаг, что задача покинута ; LD IX,TASK_DATA ; LD E,C ; LD D,0 ; ADD IX,DE ; новая задача ; LD E,16 ; ADD IX,DE ; смещение данных в таблице задач ; BIT 1,(IX) ;; JR NZ,TASK_IN_WORK ; задача в работе ??? неверное завершение ; ; сбрасывать или просто возвращаться ; ; BIT 0,(IX) ; была сохранена/нет ; JR NZ,TASK_SET ; задача существует ; ;; задачи не было! ; LD IX,TASK_DATA ; LD A,C ; задача ; LD (IX),A ; установить новую задачу текущей ; ; JP SPECTRUM_TASK ; запустить новую задачу! ; и пока пофиг распределение памяти! ;TASK_SET: ; ; LD IX,TASK_RESTORE ; LD A,C ; EXX ; JP INIT_PAGES ; переключить все страницы! ;TASK_RESTORE: ; EXX ; LD A,SYS_PAGE ; OUT (SLOT3),A ; LD A,C ; LD IX,TASK_DATA ; LD (IX),A ; установить новую задачу текущей ; LD E,A ; LD D,0 ; ADD IX,DE ; новая задача ; LD E,16 ; ADD IX,DE ; LD L,(IX+2) ; вспомнить стек ; LD H,(IX+3) ; LD SP,HL ; LD A,(IX+1) ; вспомнить третью страницу ; OUT (SLOT3),A ; POP AF ; восстановить ; LD I,A ; POP AF ; LD R,A ; POP HL ; POP DE ; POP BC ; POP AF ; EX AF,AF' ; EXX ; POP HL ; POP DE ; POP BC ; POP AF ; POP IX ; POP IY ; ; вернуться в задачу ; ;NO_TASK: ; POP BC ; JP SW_ROM_1 ; ;; 259F - ADRESS BASIC128 - MAIN_MENU ;********************************************** ; paths from project DIR INCLUDE 'EXP_HDD.asm' INCLUDE 'SERVICE.asm' ; INCLUDE 'TEST.ASZ' INCLUDE 'FLEX.asm' IFN SET_NEWdcp INCLUDE './src/bios/old_files/EXP_DCP_UNPACKER.asm' ENDIF ; INCLUDE 'EXP_SCR.ASZ' INCLUDE 'EXP_PIC2.asm' IFN SET_NEWdcp INCLUDE 'EXP_FN2.asm' ELSE INCLUDE 'EXP_FN.ASM' INCLUDE 'EXP_FN2.asm' ENDIF ;********************************************** ; BLOCK DCP_DATA-$,#FF ; ; #-5kb-############################## ; #::::::::::::::::::::::::::::::::::#\ ; #::::: Место данных для DCP :::::::#\ ; #::::::::::::::::::::::::::::::::::#\ ; ####################################\ ; \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ DCP_DATA: IFN SET_NEWdcp INCBIN './src/bios/old_files/EXP_DCP.LZ' ELSE INCLUDE 'EXP_DCP_2.ASM' ENDIF ;********************************************** ;********************************************** ;BLOCK #2800-$,#FF ; ; #-2kb-############################## ; #::::::::::::::::::::::::::::::::::#\ ; #:::: Здесь место для IBM-ZG ::::::#\ ; #::::::::::::::::::::::::::::::::::#\ ; ####################################\ ; \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ ZG_ADRESS: INCBIN 'EXP_FONT.FNT' ;********************************************** ; BLOCK #3000-$,#FF IFN SET_NEWdcp INCLUDE 'EXP_FN.asm' ENDIF INCLUDE 'EXP_LP2.asm' ;********************************************** FN_SEND_BYTE: LD E,A ; сохранить байт CALL SEND_HALF_BYTE ; передать полубайт из Е RET C ; возврат по ошибке LD A,E ; сдвинуть байт на 4 бита RRCA RRCA RRCA RRCA LD E,A SEND_HALF_BYTE: ; передать половину байта _E_!! LD A,E OR #F0 ; установить старшие биты LPT дата OUT (Z84.PIO.Port_A.Data),A LD BC,0 ; счетчик тайм-аута WAIT_SENT_1: IN A,(KEMPSTON.JOY_DOS) ; проверить бит 4 на 1 при готовности PC BIT 4,A JR NZ,CONTINUE_SENT DEC BC LD A,B OR C JR NZ,WAIT_SENT_1 XOR A SCF ; тайм-аут RET CONTINUE_SENT: ; PC - готов LD A,E AND #0F ; сбросить старшие биты LPT - OUT (Z84.PIO.Port_A.Data),A LD BC,0 ; счетчик тайм-аута WAIT_SENT_2: IN A,(KEMPSTON.JOY_DOS) ; проверить бит 4 на 0 - сообщение от PC BIT 4,A JR Z,CONTINUE_SENT2 DEC BC LD A,B OR C JR NZ,WAIT_SENT_2 LD A,E OR #F0 ; установить старшие биты LPT дата OUT (Z84.PIO.Port_A.Data),A XOR A SCF ; тайм-аут RET CONTINUE_SENT2: ; полубайт передан LD A,E OR #F0 ; установить старшие биты LPT дата OUT (Z84.PIO.Port_A.Data),A XOR A RET ;********************************************** FN_RESEIVE_B: ; принять байт в A CALL RESEIVE_POLU_BYTE ; принять полубайт RET C ; возврат по ошибке RLCA RLCA RLCA RLCA AND #F0 LD E,A CALL RESEIVE_POLU_BYTE ; второй RET C AND 0Fh OR E RET ; байт принят RESEIVE_POLU_BYTE: ; принять половину байта в Е LD A,#F0 ; установить старшие биты LPT дата OUT (Z84.PIO.Port_A.Data),A LD BC,0 ; счетчик тайм-аута WAIT_RES_1: IN A,(KEMPSTON.JOY_DOS) ; проверить бит 4 на 1 при готовности PC BIT 4,A JR NZ,CONTINUE_RES DEC BC LD A,B OR C JR NZ,WAIT_RES_1 XOR A SCF ; тайм-аут RET CONTINUE_RES: ; PC - готов, ждать 0 XOR A ; сбросить старшие биты LPT - ждем полубайт OUT (Z84.PIO.Port_A.Data),A LD BC,0 ; счетчик тайм-аута WAIT_RES_2: IN A,(KEMPSTON.JOY_DOS) ; проверить бит 4 на 0 - сообщение от PC BIT 4,A JR Z,CONTINUE_RES2 DEC BC LD A,B OR C JR NZ,WAIT_RES_2 LD A,#F0 ; установить старшие биты LPT дата OUT (Z84.PIO.Port_A.Data),A SCF RET ; ошибка CONTINUE_RES2: ; полубайт выставлен LOOP_EQ: ; прочитать еще раз, что бы совпало AND #0F LD B,A IN A,(KEMPSTON.JOY_DOS) AND #0F CP B JR NZ,LOOP_EQ OR #F0 ; установить старшие биты LPT дата в 1 - принято OUT (Z84.PIO.Port_A.Data),A RET ;*************************************** ;!!!!! посмотреть ; BLOCK #3CC0-$,255 ; no-magics! ;MAGIC_1: ; ЗАГЛУШКА ДЛЯ MAGIC ; PUSH AF ; LD A,ROM.EXT ; OUT (SYS_PORT.OFF),A ; POP AF ; JP MAGIC_1 ;MAGIC_3: ; PUSH AF ; LD A,ROM.EXT ; OUT (SYS_PORT.OFF),A ; POP AF ; RETN ;MAGIC_2: ;; CALL MG_BEGIN ; JR MAGIC_3 ;************************* ; BLOCK #3CE0-$,0 ;SW_ROM_1: ; LD HL,259Fh ; PUSH HL ; LD HL,5B00h ; LD A,(HL) ; CP #F5 ; JR Z,JP_HL_48 ; ВОЗВРАТ К МЕНЮ BASIC128 ; POP HL ; JR SW_ROM ; ПРОСТОЙ ВОЗВРАТ ;************************* ; BLOCK #3CF0-$,0 ;JMP_48: ; LD HL,00h ; JR JP_HL_48 ; ; NOP ; NOP ; NOP ;*************************************** ; BLOCK #3CF8-$,0 ; no basic-48! ;JP_HL_48: ; PUSH HL ;SW_ROM: ; PUSH AF ; LD A,ROM.EXT ; OUT (SYS_PORT.OFF),A ; POP AF ; RET ;*************************************** _mInfoBLOCK #3D00-$,#FF DOS_ON: NOP RET ;*************************************** ;*************************************** ; BLOCK #3D02-$,FF ; !TODO можно оприходовать тут 17 байтов ; ;*************************************** ;*************************************** _mInfoBLOCK #3D13-$,#FF NOP JP #18 ;*************************************** ;*************************************** ; BLOCK #3D17-$,FF ; !TODO можно оприходовать тут 233 байта ; ;*************************************** ;*************************************** _mInfoBLOCK #3E00-$,#FF DOS_OFF: DI PUSH AF PUSH BC LD BC,(#5BFF) ; !HARDCODE LD A,#C9 LD (#5BFF),A ; !HARDCODE CALL #5BFF ; !HARDCODE LD (#5BFF),BC ; !HARDCODE POP BC POP AF RET ;*************************************** ;*************************************** ;START_HDD: ; ; LD C,2 ; CALL EXP_HDD ; RET C ; ; LD A,0 ; OUT (0FEH),A ; ; LD HL,4000H ; LD DE,4001H ; LD BC,1AFFH ; LD (HL),0 ; LDIR ; ; LD HL,0 ; LD IX,LP_SCR_80 ; CALL WIN_OPEN_WIN ; ; LD HL,#2050 ; LD DE,0 ; LD B,07H ; CALL LP_CLS_WIN ; ; LD DE,0 ; CALL LP_SET_PLACE ; ; LD HL,ID_SPRINTER ; LD E,47H ; LD B,L_ID ; CALL LP_PRINT_LINE ; ; LD C,0 ; CALL EXP_HDD ; RET C ; ; LD DE,1 ; LD IX,0 ; LD B,16 ; LD HL,8000H ; LD C,5 ; CALL EXP_HDD ; RET C ; LD HL,8000H ; LD DE,HDD_MSG ; LD B,HDD_MSG_LEN ;START_HDD_L: ; LD A,(DE) ; CP (HL) ; JR NZ,NO_BOOT ; INC HL ; INC DE ; DJNZ START_HDD_L ; JP (HL) ;NO_BOOT: ; RET ; ;HDD_MSG: DB "Starting...",0 ; ;HDD_MSG_LEN EQU $-HDD_MSG ; ;HDD_MSG_NO: DB "Boot record not found" ;HDD_NO_LEN EQU $-HDD_MSG_NO ;SAVE_AUTOSTART: ; LD HL,8000H ; LD DE,HDD_MSG ; LD B,HDD_MSG_LEN ;SAVE_AUTO_L1: ; LD A,(DE) ; CP (HL) ; RET NZ ; INC HL ; INC DE ; DJNZ SAVE_AUTO_L1 ; ; LD C,0 ; CALL EXP_HDD ; RET C ; ; LD HL,8000H ; LD A,0 ; LD DE,1 ; LD IX,0 ; LD B,16 ; LD C,6 ; CALL EXP_HDD ; RET ;*************************************** ;*************************************** ; BLOCK #3E16-$,FF ; !TODO можно оприходовать тут 10 байтов ; ;*************************************** ;*************************************** ;------[ ; !TODO что- то связанное с переменными LIB_TABLE ; ]------ ; _mInfoBLOCK #3E20-$,#FF FN_LIB: SCF RET /* IN A,(SLOT3) LD B,A LD A,SYS_PAGE OUT (SLOT3),A PUSH HL LD L,C - дешефратор API изменился и теперь в C не то, что тут ожидается. Ожидается #A0..AF LD H,#C1 LD A,(HL) POP HL AND A SCF JR Z,FN_LIB_RET OUT (SLOT3),A LD (#C0FE),SP LD SP,#C0F0 PUSH BC CALL #C100 ; !HARDCODE POP BC LD SP,(#C0FE) ; LD A,B ; OUT (SLOT3),A ; RET FN_LIB_RET: LD A,B OUT (SLOT3),A ; SCF RET */ ;---------------------------------------------------------------[]------ FN_KBD_OUT: ; вход A - byte ; B - speed_parameter AND A LD E,A LD D,#FF JP PE,kbd_parity ; установка паритета PE/PO ??? LD D,#FE kbd_parity: AND A ; первый бит - start-bit - 0 RL E RL D ; в DE - 11 бит для передачи LD C,11 kbd_loop: LD A,5 OUT (Z84.SIO.Ch_A.Ctrl),A LD A,#60 BIT 0,E JR NZ,no_inv XOR 2 ; данные no_inv: LD L,A OUT (Z84.SIO.Ch_A.Ctrl),A ; выставить данные LD A,5 OUT (Z84.SIO.Ch_A.Ctrl),A LD A,L OR #80 ; синхроимпульс OUT (Z84.SIO.Ch_A.Ctrl),A ; импульс синхро LD A,B ; speed_par kbd_loop1: PUSH HL POP HL DEC A JR NZ,kbd_loop1 LD A,5 OUT (Z84.SIO.Ch_A.Ctrl),A LD A,L OUT (Z84.SIO.Ch_A.Ctrl),A ; снять импульс синхро LD A,B ; speed_par kbd_loop2: PUSH HL POP HL DEC A JR NZ,kbd_loop2 RR D RR E DEC C JR NZ,kbd_loop LD A,5 OUT (Z84.SIO.Ch_A.Ctrl),A LD A,#60 OUT (Z84.SIO.Ch_A.Ctrl),A ; закончить передачу AND A RET ;**************************************** ; Чтение с ROM-Disk ; HL - адрес, куда читать ; DE - номер сектора (считать по 256b сектор) ; B - число секторов ; A' - размер сектора (1 - 256b, 2 - 512 b) ROM_DISK: LD C,0 ; счетчик EX AF,AF' DEC A JR Z,.loop DEC A SCF RET NZ EX DE,HL ADD HL,HL EX DE,HL LD A,B ADD A,A LD B,A RET C CALL .loop RET C AND A RR D RR E XOR A RET /* ; ????? какой-то глюк недоделанный READ_ROM_PAGE_X: LD DE,0 LD BC,#100 ; один сектор PUSH DE PUSH BC LD HL,ROM_DISK_PGS LD DE,#FF00 ; !HARDCODE LD A,#1F ; last page ROM JR LOOP_NEXT */ .loop: PUSH DE ; номер сектора PUSH BC LD A,E AND 63 ; ADRESS in ROM-Page PUSH AF ; сохранить адрес EX DE,HL ; DE - адрес буфера ADD HL,HL ADD HL,HL ; H - номер банки LD A,(ROM_DISK.Pages.Number) INC H CP H LD L,H LD H, high ROM_DISK.Pages.Number ; ROM-Disk pages! LD A,(HL) ; PAGE-ROM POP HL ; восстановить адрес в ROM-Page LD L,0 ; если далеко захотели - выход с ошибкой JR C,.errorExit ; ROM-Disk-end ; DE - буфер ; HL - адрес в ROM ; B - число секторов ; A - ROM-Page .loopRead: DI PUSH HL ; откуда PUSH DE ; куда LD HL,-.stackDepth - .readProcedure.size ; memory stack use! ADD HL,SP ; stack PUSH HL ; адрес программы .readProcedure LD DE,.readProcedure ; перенести программу на стек EX DE,HL LD BC,.readProcedure.size LDIR ; программа на стеке LD BC,#100 ; длина сектора RET ; исполнить программу .readProcedure, на стеке адреса буфера и ROM ; DE - next address ; HL - ROM address .readNext: POP BC ; число секторое INC C ; счетчик считанных секторов DEC B ; сектора кончились? JR Z,.normExit BIT 6,H ; чтение не закончено PUSH BC ; сохранить счетчики JR Z,.loopRead ; читать дальше POP BC POP HL ; номер сектора LD A,B LD B,0 ADD HL,BC LD B,A ; вычислить след.сектор EX DE,HL ; теперь HL - адрес, DE сектор, B - сколько еще читать JP .loop ; начать все снова! ; чтение закончено .normExit: POP HL ; сектор, откуда велось чтение ADD HL,BC ; по возврату: HL - след.адрес EX DE,HL ; DE - след.сектор AND A RET ; ошибка .errorExit: ; !TODO сделать, чтоб на выходе показывалось количество прочитанных секторов POP BC POP DE SCF RET ; процедура, переносимая на стек для чтения из ROM-Disk ; осторожнее с PUSH, если надо много, то увеличивай .stackDepth .readProcedure: POP DE ; куда POP HL ; откуда OUT (ROM.SLOT0),A ; ROM_PAGE LDIR ; здесь читается из ROM-Disk LD B,A XOR A OUT (ROM.SLOT0),A OUT (SYS_PORT.ON),A LD A,B JP .readNext .stackDepth EQU 8 ; расстояние от конца процедуры до вершины стека. .readProcedure.size EQU $-.readProcedure ;-----------------------------------------------------------------------; ; ;-----------------------------------------------------------------------; ; ROM-Disk pages ; [ ] активировать ROM-DISK _mInfoALIGN 256,#FF ; BLOCK #3F00-$,#FF ROM_DISK.Pages.Number: DB ROM_DISK.Pages.Size ; число страниц ; у страниц выставлен bit4 для корректной подстановки ;(подробнее в sp2000.inc - Порт управления страницами ПЗУ) ROM_DISK.Pages: ; страницы ROM-Disk ; ABYTE #10 #01,#02,#03,#04,#05,#06,#07,#09,#0A,#0B ; 163840 bytes - without ZX-ROMS IFN SetFullZXromLoader ABYTE #10 #06,#07,#09,#0A,#0B ; 81920 bytes ELSE ABYTE #10 #09,#0A,#0B ; 49152 bytes ENDIF .Size EQU $-ROM_DISK.Pages ; конец - FF ; DB #FF ;-----------------------------------------------------------------------; ; _mInfoBLOCK ToBIOS_FromEXT-$,#FF ;------------[Return to ROM]------------ ; #3FD0 ; Для вызова функций биоса из страницы 0 ПЗУ (ROM Extension) FN1_RET: PUSH AF LD A,ROM.EXPANSION OUT (SYS_PORT.ON),A POP AF RST #18 JR FN1_RET ; !TODO Free 7 bytes ;--------------------------------------- ; ; _mInfoBLOCK #3FE0-$,#FF ;---------------[ Free ]---------------- ; !TODO Free 8 bytes and entry point ;SOUND_TEST: ; LD A,ROM.EXPANSION ; OUT (SYS_PORT.ON),A ; JP SND_TEST_RET ;--------------------------------------- ; ;!TEST не нужно если new_api_table ;------------[HDD_5x portal]------------ ; точка входа/выхода для функций 5х из EXP _mInfoBLOCK #3FE8-$,#FF EXP_HDD: ;HDD_EXE: PUSH AF LD A,ROM.EXPANSION OUT (SYS_PORT.ON),A POP AF RET ;--------------------------------------- ; ; _mInfoBLOCK #3FF0-$,#FF ;---------------[ Free ]---------------- ; !TODO Free 8 bytes and entry point ;--------------------------------------- ; ; _mInfoBLOCK #3FF8-$,#FF ;-----[ From TR-DOS to API #80..#FF]----- ; Точка входа/выхода для TR-DOS EXP_FNS_RET: PUSH AF LD A,ROM.EXT OUT (SYS_PORT.OFF),A ; Точка входа/выхода из/в TR-DOS при вызове функций BIOS #80..#FF JP EXP_FNS ; !TEST new_api ;--------------------------------------- ; ; _mInfoBLOCK #4000-$,#FF ;=======================================================================