; ;************************************************************* ; ; EXPANSION VER 3.00 (C) Peters Plus Ltd. ; EXPANSION VER 3.1 (C) Sprinter Team ; ;************************************************************* DISPLAY "\r\n/=====================[EXP part]=====================\\" ;*************************************** ;*********** 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 ;#######################################################################; ;#######################################################################; ;-----------------------------------------------------------------------; ; ROM-Disk pages ; [x] активирован ROM-DISK 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 ;-----------------------------------------------------------------------; ;#######################################################################; ;======================================= 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 ; процедура инициализации с возвратом на POST_3_OK ; ошибок нет ; *********************************** ; ===== 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 XOR A 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 ;!!!!! посмотреть JR NZ,POST_5_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_5_ERROR: ; ********************************** ; POST завершен ENDMODULE ; ********************************** ;-----------------------------------------------------------------------; ; первая инициализация страниц: XOR A OUT (RGADR),A OUT (RGMOD),A OUT (SLOT0),A ;free zx pages! ;LD A,ZX_PAGE.SLOT1 ;OUT (SLOT1),A ;LD A,ZX_PAGE.SLOT2 ;OUT (SLOT2),A OUT (SLOT2),A ; ZERO_PAGE DEC A ; SHARED_PAGE OUT (SLOT1),A ; LD A,SYS_PAGE OUT (SLOT3),A ;-----------------------------------------------------------------------; MODULE SET_CONFIG_ID ;-------------[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 подстраховка от недоутечки памяти ; IY - number from loader LD D,YH LD E,YL EX DE,HL LD DE,SP2000_Loader_Flag SBC HL,DE JR NZ,.no_conf_reload ; IX - number from loader LD D,XH LD E,XL EX DE,HL LD DE,ACEX.Config_ID.Sp2000 SBC HL,DE ; A = 0 JR NZ,.no_conf_reload LD A,#80 .no_conf_reload: LD R,A ; reg R bit7 - признак работы лоадера ; ; на всякий случай LD HL,ACEX.Config_ID.Sp2000 LD (SYS_PAGE.CONFIG_BYTE),HL ; сохранить номер прошивки ; LD A,CNF_PORT.CNF_0 + CNF_PORT.TURBO.ON LD (SYS_PAGE.CONFIG_DE),A ; ENDMODULE ;-----------------------------------------------------------------------; ; Don't use stack (SP) before this point if it`s normal booting!!! LD SP,ROM_MAP.EXP.STACK ; Начало использования стека!!! PUSH HL ; сохранить номер прошивки CALL PORTS_INIT ; инициализировать порты XOR A OUT (BorderColor),A CALL EMM.CheckColdInit ; инициализация памяти POP HL ; конфигурация ; JR Reset_Handler.start ;-----------------------------------------------------------------------; MODULE Reset_Handler start: DI ;----[перехват 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 ; ; [x] 20/10/2024 игнор перехватчика по клавише 0 LD A,high ZXKeys.Line_4 IN A,(ZXKeys) RRCA JR NC,No_Reset_handlers ; 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: LD SP,(Spec_Page.Stack_Point) 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: XOR A ;!HARDCODE zx page number OUT (SLOT3),A ENDMODULE ;-----------------------------------------------------------------------; MODULE Prepare_For_Setup Set_ALL_Mode: LD A,Port_All_Mode.DEFAULT LD BC,Port_All_Mode OUT (C),A Set_Default_Screen: CALL FN_SYNC.INT_DEF ; set default int ld a,128+4 ; !HARDCODE CALL FN_SYNC ; set default vsync Setup_to_RAM: LD HL,Setup_Starter.Start LD DE,COMPILE_ADDR.SETUP_STARTER LD BC,Setup_Starter.Size LDIR ; на стек кладётся адрес возврата и дальше тащится всякими костылями, чтоб вернуться назад CALL Setup_Starter.Exec ; #C000 ;JP PrepareToZX ENDMODULE PrepareToZX: ; 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 ; ; ; ; чистка переменных ZX HDD ; 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 ; DEC A ; LD (SYS_PAGE.CURRENT_HDD),A ; LD (SYS_PAGE.CURRENT_DIR_DRIVE),A ; LD (SYS_PAGE.CURRENT_DIR_DRIVE_COPY),A ; ; ; EX AF,AF ; OUT (SLOT3),A ; EX AF,AF ; ; ; XOR A ; .loop: PUSH AF ; CALL FN_HDD_PART ; POP BC ; JR NC,.start_zx ; LD A,B ; INC A ; CP #10 ; JR C,.loop ; выход в режим zx spectrum .start_zx: ; IF FREE_ZX_PAGES ; не должно сюда попасть LD B,high BIOS.REINIT.HARD_RESET JP REINIT ; ELSE ; [x] free zx pages! ; XOR A ; OUT (SLOT2),A ; ZERO_PAGE ; DEC A ; OUT (SLOT1),A ; SHARED_PAGE ; ;LD A,5 ; ;OUT (SLOT1),A ; ;LD A,2 ; ;OUT (SLOT2),A ; ; ; JP GOTO_SPEC.ZX_MODE ; ENDIF ;*********************************** ; Инициализация портов 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 ;!TODO вспомнить ;LD A,#45 ;LD A,#44 ; LD A,#40 ; скорость порта - первый множитель = 16 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 ; для принтера 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,1 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 'BIOS_FUNC.ASM' INCLUDE 'FUNC_4x.ASM' INCLUDE 'FUNC_CMOS.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' ;-----------------------------------------------------------------------; ;-----------------------------------------------------------------------; ; #################################### ; #::::::::::::::::::::::::::::::::::#\ ; #::::: Место данных для DCP :::::::#\ ; #::::::::::::::::::::::::::::::::::#\ ; ####################################\ ; \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ DCP_DATA: INCLUDE 'DCP.ASM' ;-----------------------------------------------------------------------; ;-----------------------------------------------------------------------; ; ; #-2kb-############################## ; #::::::::::::::::::::::::::::::::::#\ ; #:::: Здесь место для IBM-ZG ::::::#\ ; #::::::::::::::::::::::::::::::::::#\ ; ####################################\ ; \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ ZG_ADDRESS: INCLUDE 'FONT.ASM' ZG_SIZE EQU $-ZG_ADDRESS ASSERT (ZG_SIZE <= #800), "The font size is too big!" ;-----------------------------------------------------------------------; ; ; !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 BASIC_FN.x128.show_main_menu PUSH HL LD HL,#5B00 ;!HARDCODE BASIC_FN.x128.ROM_SWAP 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 ;!TODO работает при #7FFD[4] = 1. Как-то узнавать значение 7FFD и менять? RET ;*************************************** ;*************************************** ; BLOCK #3D02-$,FF ; !TODO можно оприходовать тут 17 байтов ;*************************************** ;*************************************** _mInfoBLOCK #3D13-$,#FF NOP JP ToBIOS_18 ;*************************************** ;*************************************** ; BLOCK #3D17-$,FF ;*************************************** ; ; IF FREE_ZX_PAGES ;-----------------------------------------------------------------------; GOTO_SPEC: PUSH HL LD HL,RET_TO_BIOS EX (SP),HL PUSH HL LD HL,GOTO_SPECTRUM EX (SP),HL JP EXTENSION_FNs ZX_MEMORY_MANAGER: PUSH HL LD HL,RET_TO_BIOS EX (SP),HL PUSH HL LD HL,MANAGE_ZX_PAGES.FN_ENTRANCE EX (SP),HL JP EXTENSION_FNs ;-----------------------------------------------------------------------; ;>$< >$< >$< >$< >$< >$< [ ПЕРЕМЕЩАЕМЫЕ В ОЗУ ] >$< >$< >$< >$< >$< >$< ; ; ;---------------------[ ЗАГЛУШКИ ДЛЯ #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,CNF_PORT.CNF_0 OUT (SYS_PORT.RAM),A ; LD A,SHARED_PAGE 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 ;-------------------[] ;-----------------------------------------------------------------------; ;>$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$<; ;-------------------------------[ #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 ; программа, размещаемая по адресу #C000 для запуска 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] ; в CF передаётся нажата ли клавиша SPACE. CF=0: клавиша нажата ; потом проверяется в main.asm [space_check] и если нажата, ; то происходит игнор параметра "Быстрый старт ПЗУ" ; во время перезагрузки в [Check Quick Start ROM] LD BC,Port_All_Mode IN H,(C) ; или LD H,#FF LD A,Port_All_Mode.DEFAULT - Port_All_Mode.SPECTRUM_MODE_OFF OUT (C),A ; keyboard int & acc off LD A,high ZXKeys.Line_7 IN A,(ZXKeys) RRA ; CF=0 клавиша нажата ;----------------------[] OUT (C),H DI POP HL ; адрес возврата в EXP из SETUP JP SETUP_MAIN ENT Size EQU $-Setup_Starter.Start ENDMODULE ;-----------------------------------------------------------------------; ;-----------------------------------------------------------------------; ;>$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$<; ; ;*************************************** _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 ;----------------------------------------------------------------------; ;----------------------------------------------------------------------; ; DE - частота ; HL - продолжительность BEEP: LD A,#10 CALL .beep_loop ; ;XOR A CALL .beep_loop ; DEC HL LD A,H OR L JR NZ,BEEP RET ; .beep_loop: OUT (ZX_Beeper),A LD B,D LD C,E ; .loop: DEC BC LD A,B OR C JR NZ,.loop RET ;----------------------------------------------------------------------; ;#######################################################################; ;---------[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 ;------------[Portal to EXT]------------ ; точка входа/выхода для функций в ROM.EXTENSION _mInfoBLOCK #3FE8-$,#FF EXTENSION_FNs: ;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 ;=======================================================================