; ;************************************************************* ; ; EXPANSION VER 3.00 (C) Peters Plus Ltd. ; EXPANSION VER 3.1 (C) Sprinter Team ; ;************************************************************* ;*************************************** ;*********** BEGIN EXPANSION *********** ;*************************************** ; Вход по RESET EXP_START: JP GLOBAL_RESET ;--------------------------------------- ;ROM_NUMBER: ;.part1: DW MotherBoardID ;.part2: DB 0 BOARD_INFO: .number: DW MotherBoardID .type: DB MotherBoardType ;--------------------------------------- ;--------------------------------------- ; 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.BIOS OUT (SYS_PORT.RAM),A POP AF JR RST_18_1 ;======================================= ;======================================= BLOCK #10-$,0 RST_10: ; JR RST10 ;======================================= ;======================================= BLOCK #18-$,0 ; RST18h - MAIN BIOS functions JP EXP_FNS_RST18 RST_18_1: CALL EXP_FNS_RST18 .exit: 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: IF TEST_INT ;INT: PUSH BC PUSH AF LD C,SLOT3 IN B,(C) LD A,SYS_PAGE OUT (C),A LD A,(SYS_PAGE.INT_ID) CP #AA JR Z,YESINT OUT (C),B JP NOINT YESINT: PUSH HL LD HL,(SYS_PAGE.INT_ADRESS) LD A,H OR L LD A,(SYS_PAGE.INT_PAGE) OUT (C),B PUSH DE CALL NZ,EXTINT POP DE POP HL NOINT: POP AF POP BC EI RETI ELSE ; PUSH AF ; 1: DEC A ; JR NZ,1B ; POP AF EI RETI ENDIF ;RST10: ; CALL_48 10h ; RET ;======================================= ;======================================= IFN TEST_INT _mInfoALIGN #10,0 ; any adress < #C0 with mask %xxxx0000 ; таблица для Sprinter POST-Tester-a TABLE_X: .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" ENDIF ;======================================= ; ; ;======================================= IFN TEST_INT RESTARTS EQU #FFE0 GLOBAL_RESET: DI IM 1 LD HL,RESTARTS LD DE,RESTARTS_PROG LD B,RESTARTS_PROG.Size .compare: LD A,(DE) CP (HL) JR NZ,NO_RESTART INC HL INC DE DJNZ .compare JP RESTARTS ENDIF ;======================================= _mInfoBLOCK #66-$,0 NMI_Point: ; резерв 3 байта для команды JP ;NOP ;NOP ;NOP RETN ;======================================= ;SET_BIOS_TO_RAM: ; программа работает на адресе 0C000h ; ; LD SP,#C0C0 ; LD A,#E0 ; LD C,PAGE3 ; IN B,(C) ; CALL SET_ROM_PAGES+#C000 ; 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 ;======================================= ; BLOCK MEM_MAP.ID_Version-$,0 ;#C0-$,0 ID_Version: DW BIOS_ver_hex ; ID_SPRINTER_FullSize: ; DB ID_SPRINTER.Size ; запись 1 ID_SPRINTER: DB 'Firmware v' .BIOS_ver: DB BIOS_ver_string,' ' IF BETA_BUILD > 0 DB BETA_str_ver ELSE DB '[',BUILD_DATE,']' ENDIF DB 0 .Record1_Size EQU $-ID_SPRINTER ; запись 2 DB 'Sprinter',0 ; запись 3 ; [x] 24/02/2024 .bitstream_ver: DB bitstream_ver_string,0 DB 0 ; .Size EQU $-ID_SPRINTER .Records_Num EQU 3 ; Check for max length of string ASSERT ID_SPRINTER.Record1_Size < SYS_PAGE.ID_FLAG.Size, '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 ;======================================= IF TEST_INT _mInfoALIGN #10,0 ; any adress < #C0 with mask %xxxx0000 ; таблица для Sprinter POST-Tester-a TABLE_X: ; таблица для Sprinter POST-Tester-a .v0: DB %00101000 ; "0" a .v1: DB %10111101 ; "1" ___ .v2: DB %00110010 ; "2" f | g | b .v3: DB %00110100 ; "3" |___| .v4: DB %10100101 ; "4" e | | c .v5: DB %01100100 ; "5" |___| .v6: DB %01100000 ; "6" d .v7: DB %00111101 ; "7" .v8: DB %00100000 ; "8" a - 7 .v9: DB %00100100 ; "9" b - 6 .vA: DB %00100001 ; "A" f - 4 .vB: DB %11100000 ; "B" g - 3 .vC: DB %01101010 ; "C" e - 2 .vD: DB %10110000 ; "D" c - 1 .vE: DB %01100010 ; "E" d - 0 .vF: DB %01100011 ; "F" ENDIF ;======================================= ; ; ;======================================= IF TEST_INT RESTARTS EQU #FFE0 ; полный перехват ресета сразу после проливки конфы и CAD. ; закидывается в карту портов, поэтому использовать надо хитро. GLOBAL_RESET: DI IM 1 LD HL,RESTARTS LD DE,RESTARTS_PROG LD B,RESTARTS_PROG.Size .compare: LD A,(DE) CP (HL) JR NZ,NO_RESTART INC HL INC DE DJNZ .compare JP RESTARTS ENDIF ;======================================= ; ; ;-----[перехват 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 ; Z84.REG.WaitState_Ctrl OUT (C),A ; Z84.SYS.Control INC C ; Z84.REG.WaitState_MemBound OUT (C),A ; Z84.SYS.Data ; set 0 Waits ; DEC C LD A,3 ; Z84.REG.Misc_Ctrl OUT (C),A ; Z84.SYS.Control INC C ; no boundary set! ;XOR A ; disable CS0, disable CS1 LD A,1 ; enable CS0, disable CS1 OUT (C),A ; Z84.SYS.Data JP POST_TEST.START ;--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--== IF TEST_INT ;----------------[int]------------------ EXTINT: OR A RET Z BIT 7,H JR Z,.L2 LD C,SLOT2 BIT 6,H JR Z,.L1 LD C,SLOT3 .L1: IN B,(C) PUSH BC OUT (C),A CALL .JPHL POP BC OUT (C),B RET ; проверка на нулевой слот .L2: BIT 6,H LD C,SLOT1 JR NZ,.L1 ; продолжаем если ненулевой слот PUSH HL LD HL,-.stackDepth - .switchProcedure.size + .patch-2 ADD HL,SP PUSH HL LD HL,-.stackDepth - .switchProcedure.size ; memory stack use! ADD HL,SP ; stack PUSH HL ; адрес программы .readProcedure LD DE,.switchProcedure ; перенести программу на стек EX DE,HL LD BC,.switchProcedure.size LDIR RET ; процедура, переносимая на стек для вызова прерывания пользователя из SLOT0 ; осторожнее с PUSH, если надо много, то увеличивай .stackDepth .switchProcedure: DEC DE POP HL LD (HL),E INC HL LD (HL),D LD C,SLOT0 IN B,(C) POP HL PUSH BC OUT (C),A XOR A OUT (SYS_PORT.RAM),A .patch EQU $+1-.switchProcedure CALL .JPHL DI XOR A OUT (SYS_PORT.ROM),A POP BC OUT (C),B RET .JPHL: JP (HL) .stackDepth EQU 64 ; расстояние от конца процедуры до вершины стека. .switchProcedure.size EQU $-.switchProcedure ENDIF ;--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--== ; ==== POST PROCs ================= MODULE POST_TEST START: ; ********************************* ; ===== 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 %1101'1111 ; с запятыми 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 #BF 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,#FF 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,%1101'1111 JP OUT_C_BYTE .erbr1: LD A,%1101'1111 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!!! LD IX,0 XOR A ADD IX,SP ; восстановить значение переданное загрузчиком конфы (если старт после ресета) ; В этом месте у нас IX:IY из Loader.asm ; Дотащили до сюда метку от лоадера ;[x] 31/12/2023 подстраховка от недоутечки памяти LD D,YH LD E,YL EX DE,HL LD DE,SP2000_Loader_Flag SBC HL,DE JR NZ,.no_conf_reload ; LD D,XH LD E,XL EX DE,HL LD DE,ACEX.Config_ID.Sp2000 SBC HL,DE JR NZ,.no_conf_reload ; LD A,#80 .no_conf_reload: LD R,A ; ; !TODO number from loader ; LD A,YL ; LD L,A ; LD A,YH ; LD H,A ; LD BC,#0107 ; !!!!! сравнить с 0107h вынести референсом тут и в loader.asm ; AND A ; если равно - прошла перезагрузка ; SBC HL,BC ;JR Z,set_config ;!TODO активация метки IX:IY из лоадера ;LD IX,ACEX.Config_ID.Sp97_2 LD HL,ACEX.Config_ID.Sp2000 set_config: LD (SYS_PAGE.CONFIG_BYTE),HL ; сохранить номер прошивки ;LD (SYS_PAGE.CONFIG_BYTE),IX ; сохранить номер прошивки ;LD HL,(SYS_PAGE.CONFIG_BYTE) ; взять номер прошивки в HL ; LD A,CNF_PORT.CNF_0 + CNF_PORT.TURBO.ON LD (SYS_PAGE.CONFIG_DE),A 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 ; !HARDCODE page 5 OUT (SLOT1),A LD A,2 ; !HARDCODE page 2 OUT (SLOT2),A ;********************************* ; Don't use stack (SP) before this point if it`s normal booting!!! LD SP,#C000 ; Начало использования стека!!! PUSH HL ; сохранить номер прошивки CALL PORTS_INIT ; инициализировать порты XOR A OUT (BorderColor),A CALL EMM.CheckColdInit ; инициализация памяти POP HL ; конфигурация ; JR Reset_Handler.start MODULE Reset_Handler start: DI IN A,(SLOT3) PUSH AF ;----[перехват soft reset #EE port]----- Check_EE_Port: LD A,ACEX.RET_PORT LD B,0 ;[x] SET_PORTS: no need to call from #3D13 and DI. 31/12/23 ;LD C,BIOS.SET_PORTS ;CALL @ToBIOS_3D13 ; переустановить внутр. порт #EE CALL SET_PORTS ; LD A,B AND A JR Z,Check_Spec_Page ; OUT (SLOT3),A ; Set restart page .After_Hard_Rst: LD HL,(Spec_Page.RET_addr) ; prog address LD A,(Spec_Page.page_0) ; PAGE0 OUT (SLOT0),A LD A,(Spec_Page.page_1) ; PAGE1 OUT (SLOT1),A LD A,(Spec_Page.page_2) ; PAGE2 OUT (SLOT2),A LD A,(Spec_Page.Reload_Version) CP #FF JR Z,.JPHL ; olg logic ; new logic .ver_2: EXX LD HL,(Spec_Page.Stack_Point) LD SP,HL EXX AND A LD A,#FF LD (Spec_Page.Reload_Version),A LD A,(Spec_Page.page_3) ; PAGE3 OUT (SLOT3),A JR Z,.JPHL PUSH HL JP EXP_FNS_2_RET .JPHL: JP (HL) ; ;--[перехват soft/hard reset #41 page]-- Check_Spec_Page: LD A,Spec_Page OUT (SLOT3),A ; Check for hardreset flag LD A,(Spec_Page.flag_R) CP 'R' JR NZ,No_Reset_handlers LD A,(Spec_Page.flag_S) CP 'S' JR NZ,No_Reset_handlers LD A,(Spec_Page.flag_T) CP 'T' JR NZ,No_Reset_handlers ; XOR A LD (Spec_Page.flag_R),A JR Check_EE_Port.After_Hard_Rst ; ;--------------------------------------- No_Reset_handlers:/* ; Check ZX ROMS Loaded LD A,(Spec_Page.flag_Z) CP 'Z' JR NZ,.Load_ZXROMS LD A,(Spec_Page.flag_X) CP 'X' JR NZ,.Load_ZXROMS ; [x] 31/12/23 подстраховка от недоутечки памяти LD A,R AND #80 JR Z,No_Need_To_Load_ZXROMS .Load_ZXROMS: XOR A LD R,A ; ; Load ZX ROM's 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-ами ; ставим метку если прогрузили ПЗУ спектрума DEC DE ; Spec_Page.flag_X LD A,'X' LD (DE),A DEC DE ; Spec_Page.flag_Z LD A,'Z' LD (DE),A ; Заглушка для страницы #41 на всякий пожарный LD HL,PROG_NO_ROM LD DE,#C000+Spec_Page.no_zx_rom LD BC,PROG_NO_ROM.size LDIR ; LD HL,RAM_BIOS_PROG LD DE,#C000+Spec_Page.to_bios LD BC,RAM_BIOS_PROG.Length LDIR */ ;No_Need_To_Load_ZXROMS: POP AF OUT (SLOT3),A ;-------------------------------------------------------------------------------------------------------------------; ;!TODO сделать выбор в Setup, что грузить в vПЗУ при старте. Варианты: ;[ ] 0 - Не грузить ПЗУ спектрума, инитить страницу #41 как в 3.04 ;[ ] 1 - Грузит ПЗУ спектрума из ROM при старте если нет флага ZX ;[ ] 2 - Грузит ПЗУ спектрума из ROM при каждом перезапуске (может быть опасно) ;[ ] 3 - Не грузить ПЗУ спектрума, инитить страницу #41 так, чтоб код в ней подгружал ПЗУ спектрума при обращении ;-------------------------------------------------------------------------------------------------------------------; ENDMODULE ; ;************************************** ; MODULE Prepare_For_Setup Set_ALL_Mode: LD A,#FF LD BC,Port_All_Mode OUT (C),A Set_Default_Screen: CALL FN_SYNC.INT_DEF ; set default int ld a,128+4 ; !HARDCODE ;ld c,BIOS.FN_SYNC ;RST_to_BIOS_18 ; set default vsync CALL FN_SYNC ; 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 PrepareToZX ENDMODULE ; PrepareToZX: ;CALL init_zx_roms ; Setup HDD drives for ZX Spectrum mode DI LD D,CMOS_CELL.TRDOSmount CALL CMOS_RD AND %1010'1010 ; маска для 4-х HDD JR Z,.start_zx ; find first good partition ; IN A,(SLOT3) EX AF,AF LD A,SYS_PAGE OUT (SLOT3),A ; XOR A LD H,A LD L,A LD (SYS_PAGE.CURRENT_DIR_SEC_L),HL LD (SYS_PAGE.CURRENT_DIR_SEC_H),HL EX AF,AF OUT (SLOT3),A EX AF,AF .loop: CALL FN_HDD_PART JR NC,.start_zx POP AF INC A CP #10 JR C,.loop ; выход в режим zx spectrum .start_zx: JP GOTO_SPEC.ZX_MODE ;*********************************** ; Инициализация портов PORTS_INIT: ; включить TURBO LD A,CNF_PORT.CNF_0 + CNF_PORT.TURBO.ON OUT (SYS_PORT.ROM),A ; ; RESET to ISA ; LD BC,PORT_ISA ; LD A,#FF ; OUT (C),A ; .isa_reset: ; DEC A ;!FIXIT может убрать цикл ожидания и запулить 0 в ису после инита клавы? ; JR NZ,.isa_reset ; OUT (C),A ; ; Инициализация последовательного порта клавиатуры ; reg 0 XOR A ;LD A,0 OUT (Z84.SIO.Ch_A.Ctrl),A ; reg 4 LD A,4 OUT (Z84.SIO.Ch_A.Ctrl),A ;INC A ;LD A,5 OUT (Z84.SIO.Ch_A.Ctrl),A ; reg 3 LD A,3 OUT (Z84.SIO.Ch_A.Ctrl),A LD A,#C1 OUT (Z84.SIO.Ch_A.Ctrl),A ; reg 5 LD A,5 OUT (Z84.SIO.Ch_A.Ctrl),A LD A,#62 ;60, 61 OUT (Z84.SIO.Ch_A.Ctrl),A ; reg 1 LD A,1 OUT (Z84.SIO.Ch_A.Ctrl),A DEC A ;LD A,0 ; #18 включение прерываний OUT (Z84.SIO.Ch_A.Ctrl),A .mouse: ; Инициализация мыши ; Инициализация таймера мыши LD A,#55 OUT (Z84.CTC.Ch_0),A LD A,#2D OUT (Z84.CTC.Ch_0),A ; reg 0 XOR A ;LD A,0 OUT (Z84.SIO.Ch_B.Ctrl),A ; reg 4 LD A,4 OUT (Z84.SIO.Ch_B.Ctrl),A ;LD A,#45 LD A,#40 OUT (Z84.SIO.Ch_B.Ctrl),A ; reg 3 LD A,3 OUT (Z84.SIO.Ch_B.Ctrl),A LD A,#41 OUT (Z84.SIO.Ch_B.Ctrl),A ; reg 5 LD A,5 OUT (Z84.SIO.Ch_B.Ctrl),A LD A,#E0 OUT (Z84.SIO.Ch_B.Ctrl),A ; reg 1 LD A,1 OUT (Z84.SIO.Ch_B.Ctrl),A DEC A ;LD A,0 OUT (Z84.SIO.Ch_B.Ctrl),A ; Инициализация параллельного порта 1 (принтер) ; для POST-Tester-а LD A,#CF ; 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 ;только через регистр BC, иначе Альтера перехватит 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 ; "Заглушение" ковокса и ресет ISA ; ресет ISA часть 1 LD BC,PORT_ISA LD A,#FF OUT (C),A ; глушим ковокс XOR A OUT (CBL.SYS_PORT),A LD BC,CBL.OUT LD A,#80 .CBL_MUTE: OUT (C),A DJNZ .CBL_MUTE ; ресет ISA часть 2 после небольшой паузы LD BC,PORT_ISA XOR A OUT (C),A ; Сброс контроллера дисковода ; Включить доступ к контроллеру диска (третья конфа) LD A,CNF_PORT.CNF_3 + ROM.BIOS OUT (SYS_PORT.ROM),A OUT (FDC_93.DrvCTRL),A push hl pop hl LD A,#3C ;!HARDCODE команда для ВГ93 OUT (FDC_93.DrvCTRL),A push hl pop hl XOR A OUT (FDC_93.Command),A ; Выключить доступ к контроллеру диска LD A,CNF_PORT.CNF_0 + ROM.BIOS OUT (SYS_PORT.ROM),A ; set HDD1/not-HDD2 LD A,IDE.Chanel.Primary OUT (IDE.Chanel.Set),A LD BC,#7FFD LD A,#10 OUT (C),A ; BASIC_48 mode LD B,#1F LD A,01 OUT (C),A ; RAM-0 mode !!! ; очистка буферов клавиатуры и мыши в SIO CALL .clean_kbd_buf JR .clean_mouse_buf .clean_kbd_buf: ; Clearing the keyboard buffer IN A,(Z84.SIO.Ch_A.Ctrl) RRCA RET NC IN A,(Z84.SIO.Ch_A.Data) JR .clean_kbd_buf .clean_mouse_buf:; Clearing the mouse buffer IN A,(Z84.SIO.Ch_B.Ctrl) RRCA RET NC IN A,(Z84.SIO.Ch_B.Data) JR .clean_mouse_buf ;--------------------------------------- ;-----------------------------------------------------------------------; ;-----------------------------------------------------------------------; ; paths from project DIR INCLUDE 'FUNC_4x.ASM' INCLUDE 'FUNC_CMOS.ASM' INCLUDE 'BIOS_FUNC.ASM' INCLUDE 'FUNC_SERVICE.asm' ; INCLUDE 'EXP_SCR.ASZ' LP_SCR_MNU INCLUDE 'FUNC_SCREEN.ASM' INCLUDE 'FUNC_RAM_ROM_DRV.ASM' INCLUDE 'FUNC_SYS.ASM' INCLUDE 'FUNC_FOR_TRDOS.ASM' INCLUDE 'FUNC_5x.asm' INCLUDE 'FUNC_LOW_PRINT.ASM' INCLUDE 'FUNC_ZX.ASM' ;-----------------------------------------------------------------------; ;-----------------------------------------------------------------------; ; #################################### ; #::::::::::::::::::::::::::::::::::#\ ; #::::: Место данных для DCP :::::::#\ ; #::::::::::::::::::::::::::::::::::#\ ; ####################################\ ; \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ DCP_DATA: INCLUDE 'DCP.ASM' ;-----------------------------------------------------------------------; ;-----------------------------------------------------------------------; ; ; #-2kb-############################## ; #::::::::::::::::::::::::::::::::::#\ ; #:::: Здесь место для IBM-ZG ::::::#\ ; #::::::::::::::::::::::::::::::::::#\ ; ####################################\ ; \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ ZG_ADDRESS: INCLUDE 'FONT.ASM' ;-----------------------------------------------------------------------; ; ;>$< >$< >$< >$< >$< >$< [ ПЕРЕМЕЩАЕМЫЕ В ОЗУ ] >$< >$< >$< >$< >$< >$< ; ;-------------------------------[ #FFE0 ]-------------------------------; ; программа, которая будучи размещенной в #40 странице, ; с адреса RESTARTS, перехватывает RESET RESTARTS_PROG: ; !TODO LDConf перехват ресета на любой конфе после hardreset LD HL,RESTARTS LD B,16 .loop: LD (HL),0 INC HL DJNZ .loop NOP NOP .Size EQU $-RESTARTS_PROG ; LD A,1 ; OUT (SLOT3),A ;-----------------------------------------------------------------------; ;----------------------------[Setup Starter]----------------------------; MODULE Setup_Starter ; программа, размещаемая по адресу 0C000h ; для запуска Setup Start: DISP COMPILE_ADDR.SETUP_STARTER Exec: LD A,CNF_PORT.CNF_0 + ROM.EXTENSION OUT (SYS_PORT.ROM),A LD HL,ROM_MAP.SETUP LD DE,MEM_MAP.SETUP LD BC,BLOCK_Setup.Length LDIR LD A,CNF_PORT.CNF_0 + ROM.BIOS OUT (SYS_PORT.ROM),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 ;-----------------------------------------------------------------------; ;-----------------------------------------------------------------------; ;>$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$<; ; ; ; !FIXIT сделать эти фиксированные адреса отдельным файлом и с IF/ELSE и подключать их потом куда надо. ; ;????? посмотреть ;----------------------------------------------------------------------; ; 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 ;************************* _mInfoBLOCK #3CE0-$,0 SW_ROM_1: LD HL,#259F ;!HARDCODE Show Main Menu in BASIC-128 PUSH HL LD HL,#5B00 ;!HARDCODE LD A,(HL) CP #F5 ; #F5 - опкод 'PUSH AF'. Проверяется то ли в #5B00 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 ;*************************************** _mInfoBLOCK #3CF8-$,0 ; no basic-48! JP_HL_48: ;!FIXIT assert with ROM PUSH HL SW_ROM: ;!FIXIT assert with ROM PUSH AF LD A,ROM.BIOS ;!FIXIT неправильное название константы OUT (SYS_PORT.RAM),A POP AF RET ;*************************************** ;----------------------------------------------------------------------; ; ;!TODO спектрумовские утилиты ;----------------------------------------------------------------------; ; _mInfoBLOCK #3CFA-$,#FF ; LD A,0 ;!HARDCODE ; OUT (SYS_PORT.OFF),A ; POP AF ;----------------------------------------------------------------------; ; ; ;----------------------------------------------------------------------; _mInfoBLOCK #3D00-$,#FF DOS_ON: NOP RET ;*************************************** ;*************************************** ; BLOCK #3D02-$,FF ; !TODO можно оприходовать тут 17 байтов ; ;*************************************** ;*************************************** _mInfoBLOCK #3D13-$,#FF NOP JP ToBIOS_18 ;*************************************** ;*************************************** ; BLOCK #3D17-$,FF ; !TODO можно оприходовать тут 233 байта ; ;*************************************** ;*************************************** _mInfoBLOCK #3E00-$,#FF DOS_OFF: PUSH AF LD A,R DI PUSH AF PUSH BC ; LD BC,(#5BFF) ; !HARDCODE LD A,#C9 ; Opcode RET LD (#5BFF),A ; !HARDCODE CALL #5BFF ; !HARDCODE LD (#5BFF),BC ; !HARDCODE ; POP BC POP AF JP PO,.no_EI EI .no_EI: POP AF RET ;*************************************** ;*************************************** ; BLOCK #3E16-$,FF ; !TODO можно оприходовать тут 10 байтов ; ;*************************************** //////////////////////////////////////////////////////////////////////// ;------[ ; !TODO что- то связанное с переменными LIB_TABLE ; ]------ ; _mInfoBLOCK #3E20-$,#FF ; [x] 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 //////////////////////////////////////////////////////////////////////// ;----------------------------------------------------------------------; ; ;!TODO скомпоновать и допаять ;----------------------------------------------------------------------; ; вход A - byte ; B - speed_parameter FN_KBD_OUT: 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 pages ; [x] активирован ROM-DISK _mInfoALIGN 256,#FF ; BLOCK #3F00-$,#FF ROM_DISK.Pages.Number: BYTE ROM_DISK.Pages.Size ; число страниц ; у страниц выставлен bit4 для корректной подстановки ;(подробнее в sp2000.inc - Порт управления страницами ПЗУ) ROM_DISK.Pages: ; страницы ROM-Disk ABYTE #10 #05,#06,#07,#09,#0A,#0B ; 98304 bytes .Size EQU $-ROM_DISK.Pages ;-----------------------------------------------------------------------; ;#######################################################################; ; ;---------[Return to EXTENSION]--------- _mInfoBLOCK #3FD0-$,#FF ; ToBIOS_FromEXT ; #3FD0 ; Для вызова функций биоса из страницы 0 ПЗУ (Extension) RET_to_EXTENSION: PUSH AF LD A,ROM.EXTENSION OUT (SYS_PORT.ROM),A POP AF RST ToBIOS_18 JP RET_to_EXTENSION ; !TODO Free 6 bytes ;--------------------------------------- ; ;---------------[ Free ]---------------- ; _mInfoBLOCK #3FE0-$,#FF ; !TODO Free 8 bytes and entry point ;SOUND_TEST: ; LD A,ROM.EXPANSION ; OUT (SYS_PORT.ON),A ; JP SND_TEST_RET ;--------------------------------------- ; ; [x] new portal ;------------[HDD_5x portal]------------ ; точка входа/выхода для функций 5х из EXP _mInfoBLOCK #3FE8-$,#FF EXP_HDD: PUSH AF LD A,ROM.EXTENSION OUT (SYS_PORT.ROM),A POP AF RET ;--------------------------------------- ; ; ;---------------[ Free ]---------------- _mInfoBLOCK #3FF0-$,#FF ; !TODO Free 8 bytes and entry point ;--------------------------------------- ; ; ;----[ From TR-DOS to API #80..#FF ]----- _mInfoBLOCK #3FF8-$,#FF ; Точка входа/выхода для TR-DOS EXP_FNS_RET: PUSH AF LD A,ROM.BIOS OUT (SYS_PORT.RAM),A ; Точка входа/выхода из/в TR-DOS при вызове функций BIOS #80..#FF JP EXP_FNS ;--------------------------------------- ; ; _mInfoBLOCK #4000-$,#FF ;=======================================================================