; 樠 ⥬ ⮢ Z84C15 ; DI IM 1 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 ; boundary set! LD A,1 ; enable CS0, disable CS1 OUT (C),A ; Z84.SYS.Data ; 樠 DCP ; ;LD HL,ADD_PORTS.Code LD HL,INIT_PORTS DCP_INIT: LD C,XL LD B,XH LD E,YL LD D,YH EXX ; LD HL,#C000 LD DE,#C001 LD BC,#3FFF LD (HL),L LDIR ; LD IY,DCP_DATA LD IX,.ret ; .loop: LD L,(IY) LD H,(IY+1) LD E,(IY+2) LD D,(IY+3) LD B,(IY+4) JP .PARSE_TABLE ; .ret: LD BC,5 ADD IY,BC LD A,(IY+2) OR (IY+3) JR NZ,.loop ; EXX LD XL,C LD XH,B LD YL,E LD YH,D ; First IN command - OPEN DCP IN A,(SLOT3) JP (HL) ; .PARSE_TABLE: LD A,L AND E LD L,A ; LD A,H AND D OR #C0 LD H,A ; LD A,D OR #C0 LD D,A ; .loop_parse: LD (HL),B ; LD A,L ; ᪨஢ 塞 1- OR E ; 宦 ७ INC A ; 㢥 JR Z,.carry ; ७ ; OR E XOR E ; 㫨 塞 LD C,A ; 塞 ; LD A,L AND E ; 뤥 塞 OR C LD L,A ; 塞 ; JR .loop_parse ; 横 ; A = 0 .carry: LD A,L ; 塞 ﬨ AND E LD L,A ; LD A,H ; ᪨஢ 塞 1- OR D ; 宦 ७ INC A ; 㢥 JR Z,.return ; OR D XOR D LD C,A ; 塞 ; LD A,H AND D ; 뤥 塞 OR C LD H,A ; 塞 JR .loop_parse .return: JP (IX) ; ⮢ #4000..#4004 ; ADD_PORTS: ; ७ 譨 .Data: DB #EB ; 譨 #4000 DB #EF ; 譨 #4001 DB #E6 ; 譨 #4002 DB #E7 ; 譨 #4003 DB #E4 ; 譨 #4004 .Data.Size EQU $ - .Data ; .Code: ;LD DE,#C480 ; LD HL,ADD_PORTS.Data ; LD BC,ADD_PORTS.Data.Size ; LDIR ; ; 樠 ⮢ ; ;LD A,CNF_PORT.CNF_0 + CNF_PORT.TURBO.ON + CNF_PORT.PENT_RESET + CNF_PORT.SCORP_RESET + CNF_PORT.CNF_512 ;OUT (SYS_PORT.ROM),A INIT_PORTS: LD A,CNF_PORT.CNF_0 + CNF_PORT.TURBO.ON OUT (SYS_PORT.ROM),A ; 樠 ࠭ ; INIT_SLOTS: LD BC,#1FFD LD A,1 OUT (C),A LD B,#7F ; LD A,#11 OUT (C),A ; XOR A OUT (SLOT0),A OUT (SLOT1),A LD A,2 OUT (SLOT2),A LD A,DCP_PAGE OUT (SLOT3),A ; 樠 ⥪ ; LD SP,#4000 ; ॡ ⠢襣 RAM ; LD HL,0 LD DE,#4000 LD BC,END_CB LDIR XOR A OUT (FastRAM.SLOT0),A OUT (SYS_PORT.RAM),A INC A OUT (SLOT1),A ; IN A,(FastRAM.OFF) ; ; ࠭ 0,1,2,#FE ; 樠 ࠭ vROM ; LD HL,#C900 ; Opcodes RET : NOP LD A,H LD (DOS_OFF),A LD (DOS_ON),HL vROM_MAP: LD HL,RESERVED_PAGES.BIOS LD DE,ADD_PORTS.Data LD A,RESERVED_PAGES.Size .loop: EX AF,AF' LD A,(HL) LD B,A LD A,(DE) CALL SET_PORTS INC HL INC DE EX AF,AF' DEC A JR NZ,.loop ; LD A,SYS_PAGE OUT (SLOT3),A ; ; 樠 ࠭ vROM ; ; vROM_MAP: LD BC,#4000 ; LD HL,RESERVED_PAGES.BIOS ; LD A,RESERVED_PAGES.Size ; .loop: LD E,(HL) ; OUT (C),E ; INC C ; INC HL ; DEC A ; JR NZ,.loop ;; ; 稩 ; ;; LD A,SYS_PAGE OUT (SLOT3),A ; 楤 訡 LD HL,ERROR PUSH HL ; 樠 HDD ; CALL HDD_INIT RET C ; ⠭ ࠭ 㧪 ; CALL Init_Mem ; 㧪 ; ; ஢ઠ ID ᪠ BIOS (⥫ 㭪樨) CHECK_IMG: LD B,1 ; ᫮ ⠥ ᥪ஢ LD HL,#8000 ; LD IX,0 ; ᮫ ᥪ LD DE,0 ; ᮫ ᥪ PUSH HL CALL FN_HDD_READ POP HL ; ࠢ ⪨ LD DE,CHECKING_LABEL LD B,CHECKING_LABEL.Size .loop: LD A,(DE) CP (HL) RET NZ ; error INC DE INC HL DJNZ .loop ; ࠧ BIOS LOAD_DATA: LD A,(RESERVED_PAGES.BIOS) LD HL,#C000 LD B,RESERVED_PAGES.Size * #4000 / 512 LD DE,1 CALL FN_HDD_READ_NEXT RET C ; IF DEBUG LD A,#41 LD HL,#C000 LD B,1 LD D,L LD E,B CALL FN_HDD_READ_NEXT RET C ENDIF XOR A OUT (SLOT1),A JP .IN_RAM + #4000 ; ᮪ 1 ᫮ .IN_RAM: LD BC,#1FFD XOR A OUT (C),A ; ; A = CNF_PORT.BIOS OUT (CNF_PORT.vBIOS),A LD A,DCP_PAGE OUT (SLOT3),A ; LD IX,ACEX.Config_ID.Sp2000 LD IY,SP2000_Loader_Flag RST 0 ;JP BEGIN_CB_IMG ;; ;; ; 楤 ; ;; ; FOR LBA ONLY - NEXT_READ ; HL - bufer, A - page ; B - numer of sectors ; DE - add_par (next+DE) (d.b. 1 for NEXT) FN_HDD_READ_NEXT: AND A INC B DEC B RET Z ; ret if 0 sectors CALL HD_WAIT RET C CALL NEXT_ADD_SEC JR FN_HDD_READ.L1 ; ; HL - BUFER, A - PAGE, FN_HDD_READ: AND A INC B DEC B RET Z CALL HD_WAIT CALL NC,HD_PREPARE RET C .L1: EXX LD C,SLOT3 IN B,(C) EXX OUT (SLOT3),A EX AF,AF' ; LD BC,IDE.Write.Command LD A,IDE.ATA.ReadSectorsWithRetry OUT (C),A .L2: CALL WAIT_HDD AND IDE.ControlByte.DataRequest JR Z,.HD_RET ; LD BC,IDE.Read.Data INIR INIR ; LD A,H OR L JR NZ,.L2 ; LD A,SYS_PAGE OUT (SLOT3),A EX AF,AF' LD H,high SYS_PAGE.RAMD_FAT ;!FIXIT ⠡ LD L,A LD A,(HL) OUT (SLOT3),A EX AF,AF' LD HL,#C000 JR .L2 ; .HD_RET: EXX OUT (C),B EXX LD BC,IDE.Read.Error IN A,(C) AND A SCF RET NZ ; EX AF,AF' AND A RET ;; ;; NEXT_ADD_SEC: PUSH AF ; LD A,B LD BC,IDE.Write.Counter ; ⠭ ᫮ ᥪ஢ OUT (C),A ; DEC B INC C IN A,(C) ; IDE.Read.Sector ADC A,E INC B OUT (C),A ; IDE.Write.Sector ; DEC B INC C IN A,(C) ; IDE.Read.CylinderLow ADC A,D INC B OUT (C),A ; IDE.Write.CylinderLow ; DEC B INC C IN A,(C) ; IDE.Read.CylinderHigh ADC A,0 INC B OUT (C),A ; IDE.Write.CylinderHigh ; LD BC,IDE.Read.Control IN A,(C) LD D,A ADC A,0 AND #0F LD E,A LD A,D AND #F0 OR E INC B OUT (C),A ; IDE.Write.DeviceHead ; POP AF RET ;; ;; HD_PREPARE: PUSH AF PUSH HL ; HD_CALC_SECS LD L,E LD E,D LD D,XL LD A,XH AND #0F ; LBA 28 LD H,A ; LD A,B LD BC,IDE.Write.Counter ; ⠭ ᫮ ᥪ஢ OUT (C),A ; INC C OUT (C),L INC C OUT (C),E INC C OUT (C),D ; LD BC,IDE.Read.Control IN A,(C) AND #F0 ; !!!!! ᬮ OR H INC B ; IDE.Write.DeviceHead OUT (C),A POP HL ; BUFER & PAGE POP AF AND A RET ;; ;; HDD_INIT: LD A,IDE.Chanel.Primary OUT (IDE.Chanel.Set),A CALL TEST_HDD_DRV SCF RET NZ ; CALL WAIT_HDD LD BC,IDE.Write.Command LD A,IDE.ATA.IdentifyDevice ;!FIXIT । OUT (C),A CALL WAIT_HDD AND IDE.ControlByte.DataRequest SCF RET Z ; LD BC,IDE.Read.Data LD HL,SYS_PAGE.HD_IDF_ADR INIR INIR ; B = 0 LD H,B LD L,B LD A,(SYS_PAGE.HD_IDF_ADR.sectors) ; ᫮ ᥪ஢ LD C,A LD A,(SYS_PAGE.HD_IDF_ADR.heads) ; ᫮ .loop: ADD HL,BC DEC A JR NZ,.loop LD (SYS_PAGE.HD_IDF_ADR.sec_cyl),HL CALL WAIT_HDD LD BC,IDE.Read.Control IN A,(C) AND #10 LD B,A LD A,(SYS_PAGE.HD_IDF_ADR.heads) ; ᫮ DEC A AND #0F OR IDE.Drive.Master OR B ; LD H,A LD A,(SYS_PAGE.HD_IDF_ADR.LBA_CHS) AND %0000'0010 SCF RET Z ; NO_LBA ; SET 6,H LD BC,IDE.Write.DeviceHead OUT (C),H LD A,(SYS_PAGE.HD_IDF_ADR.sectors) ; ᫮ ᥪ஢ .HDD_CONFIGURED: LD BC,IDE.Write.Counter OUT (C),A LD A,IDE.ATA.InitializeDeviceParameters ; SET HDD PARAMETERS HD_CMD_EXE: CALL HD_WAIT RET C LD BC,IDE.Write.Command OUT (C),A HD_WAIT: PUSH DE PUSH BC PUSH AF LD DE,0 .loop: LD BC,IDE.Read.Status IN A,(C) AND IDE.ControlByte.Busy JR Z,.EXIT DEC DE LD A,D OR E JR NZ,.loop POP AF POP BC POP DE SCF RET ; error ; .EXIT: POP AF POP BC POP DE AND A RET ;; ;; WAIT_HDD: LD BC,IDE.Read.Status .loop: IN A,(C) BIT IDE.ControlBit.Busy,A JR NZ,.loop RET ;; ;; Init_Mem: LD HL,SYS_PAGE.RAMD_FAT; ; RAM FAT . ; 塞 ⠡ XOR A .loopFree: LD (HL),A INC L JR NZ,.loopFree ; १ࢨ㥬 ᯥ.࠭ ࠭ ZX LD B,RESERVED_PAGES.Blocks LD DE,RESERVED_PAGES ; ⠡ ⥬ ࠭ .loop: LD A,(DE) CP #FF JR Z,.exitLoop .loopBlk: INC DE LD L,A LD A,(DE) LD (HL),A CP #FF JR NZ,.loopBlk .exitLoop: INC DE DJNZ .loop LD L,A LD (HL),A RET ;; ;; TEST_HDD_DRV: ;LD HL,#01FE LD BC,IDE.Write.Counter OUT (C),L INC C OUT (C),H ; IDE.Write.Sector ; DEC C DEC B IN A,(C) ; IDE.Read.Counter CP L RET NZ INC C IN A,(C) ; IDE.Read.Sector CP H RET ;; ERROR: ; 窮 ; .loop: CALL FLASH_LIGHT JR .loop ;; ;; FLASH_LIGHT: PUSH AF PUSH DE PUSH BC LD E,6 LD A,SYS_PORT.TURBO.OFF .big_loop: LD BC,0 OUT (SYS_PORT.RAM),A .loop: DEC BC INC B DJNZ .loop XOR 1 DEC E JR NZ,.big_loop ; POP AF POP DE POP BC RET ;; ;; ; in: A - ७ , B - 祭 ७ ; out: B - ஥ 祭 ७ ; । 室 ⠭ யᠭ CONFIG_DE. SET_PORTS: CALL DOS_ON ; LD (#C400),A ; ⠭ ७ LD A,B LD BC,0 ; OUT (C),A ; ⠭ 祭 ; .End: XOR A LD (#C400),A ; JP DOS_OFF ;; ;; RESERVED_PAGES: ; ࠧ .BIOS: DB #46 ; BIOS Acex port: #EB DB #47 ; EXTENSION Acex port: #EF DB #48 ; Recovery_1 Acex port: #E6 DB #49 ; Recovery_2 Acex port: #E7 DB #4B ; LOGO Acex port: #E4 .Size EQU $-RESERVED_PAGES.BIOS IF DEBUG DB #41 ENDIF DB #FF ; End of the block .Blocks EQU 1 CHECKING_LABEL: SET_IMG_LABEL .Size EQU $ - CHECKING_LABEL ;; END_CB EQU $ ;; ;; ; DCP ; DCP_DATA: DW %00'000'0'0100'0000 DW %11'000'0'0110'1111 DB ACEX.IDE_DATA_1F0 ; DW %00'000'0'0100'0001 DW %00'000'1'1110'1111 DB ACEX.IDE_ERROR_1F1 ; DW %00'000'0'0100'0010 DW %00'000'1'1110'1111 DB ACEX.IDE_COUNTER_1F2 ; DW %00'000'0'0100'0011 DW %00'000'1'1110'1111 DB ACEX.IDE_SECTOR_1F3 ; DW %00'000'0'0100'0100 DW %00'000'1'1110'1111 DB ACEX.IDE_CYLINDER_L_1F4 ; DW %00'000'0'0100'0101 DW %00'000'1'1110'1111 DB ACEX.IDE_CYLINDER_H_1F5 ; DW %00'000'0'1100'0010 DW %00'000'1'1110'1111 DB ACEX.IDE_DEVICE_HEAD_1F6 ; DW %00'000'0'1100'0011 DW %00'000'1'1110'1111 DB ACEX.IDE_STATUS_CMD_1F7 ; DW %00'000'0'1100'0100 DW %00'000'1'1110'1111 DB ACEX.IDE_CONTROL_3F6 ; DW %00'000'0'1100'0101 DW %00'000'1'1110'1111 DB ACEX.IDE_STATUS_3F7 ; DW %00'000'0'0010'1100 DW %11'001'1'1111'1111 DB ACEX.IDE_CHANEL_1 ; DW %00'000'0'0011'1100 DW %11'001'1'1111'1111 DB ACEX.IDE_CHANEL_2 ; DW %00'000'0'0110'1101 DW %10'000'1'1111'1111 DB ACEX.Scorp_1FFD ; DW %00'000'0'1110'1101 DW %00'100'1'1110'1111 DB ACEX.Pent_7FFD DW %00'100'0'1110'1101 DW %11'110'1'1110'1111 DB ACEX.Pent_7FFD ; DW %00'000'0'0101'0110 DW %11'001'1'1111'1111 DB ACEX.ALL_MODE ; DW %00'000'0'0010'0100 DW %00'000'0'0010'1111 DB ACEX.CNF_PORT ; DW %00'000'0'0000'1010 DW %00'000'0'0110'1111 DB ACEX.SLOT0 ; DW %00'000'0'0010'1010 DW %00'000'0'0110'1111 DB ACEX.SLOT1 ; DW %00'000'0'0100'1010 DW %00'000'0'0110'1111 DB ACEX.SLOT2 ; DW %00'000'0'0110'1010 DW %00'000'0'0110'1111 DB ACEX.SLOT3 ; DCP END MARKER DW 0,0,0 ;-----------------------------------------------------------------------; ; RESERVED_PAGES:; [x] Block #1 - ᢮ ID 1 ; ; ⥫ 楤 ; .SYS_FN: DB SYS_FN_PAGE ; ; ࠧ 訢 ; .BIOS: DB #10,#11,#12,#13 ; DB #14,#15,#16,#17 ; DB #18,#19,#1A,#1B ; DB #1C,#1D,#1E,#1F ; ; ⨭ ; .PICTURE: DB 2,3,4,5,6 ; ; ࠧ 訢騪 ; .FLASHER_RAM: DB 7,8 ; DB #FF ; End of the block ; .Blocks EQU 1 ; .Size EQU $-RESERVED_PAGES ;-----------------------------------------------------------------------; ; ; 㧪 ; ; ; ⥫ 㭪樨 ; LOAD_FNs: LD A,(RESERVED_PAGES.SYS_FN) ; ࠭ , ᫨ #C000 (BLOCK_ID) ; LD B,sys_fn_in_sectors ; ᫮ ⠥ ᥪ஢ ; LD HL,bufer_adr ; ; LD IX,sec_high ; ᮫ ᥪ ; LD DE,sec_low ; ᮫ ᥪ ; PUSH HL ; CALL FN_HDD_READ ; ; ࠧ BIOS ; LOAD_DATA: LD B,4 ; LD IY,RESERVED_PAGES.BIOS ; POP HL ; CALL .LOADER ; ; ⨭ ; LD B,2 ; CALL .LOADER ; JP BEGIN_CB_IMG ; .LOADER: ; 㧪 128 ᥪ஢ ; .loop: PUSH HL ; PUSH BC ; LD A,(IY) ; LD B,128 ; LD DE,1 ; CALL FN_HDD_READ_NEXT ; LD BC,4 ; ADD IY,BC ; POP BC ; POP HL ; DJNZ .loop ; RET ;-----------------------------------------------------------------------;