; 樠 ⥬ ⮢ Z84C15 ; DI 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,INIT_SLOTS 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) ; 樠 ࠭ ; INIT_SLOTS: XOR A OUT (SLOT0),A OUT (SLOT1),A DEC A OUT (SLOT2),A LD A,SYS_PAGE OUT (SLOT3),A ; 樠 ⮢ ; LD A,CNF_PORT.CNF_0 + CNF_PORT.TURBO.ON OUT (SYS_PORT.ROM),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 ;; ; 稩 ; ;; ; 楤 訡 LD HL,ERROR PUSH HL ; 樠 HDD ; CALL HDD_INIT RET C ; ⠭ ࠭ 㧪 ; CALL Init_Mem ; 㧪 ; ; ⥫ 㭪樨 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 ;; ;; ; 楤 ; ;; ; 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: ; 窮 ; LD A,SYS_PORT.TURBO.OFF .big_loop: LD BC,0 OUT (SYS_PORT.ROM),A .loop: DEC BC INC B DJNZ .loop XOR 1 JR .big_loop ;; END_CB EQU $ ;; ;; ; DCP ; DCP_DATA: DW %00'000'0'0100'0000 DW %11'000'0'0110'1111 DB ACEX.IDE_DATA_1F0 DW %01'000'0'0100'0000 DW %11'010'0'0110'1111 DB ACEX.IDE_DATA_1F0 DW %10'000'0'0100'0000 DW %11'010'0'0110'1111 DB ACEX.IDE_DATA_1F0 DW %11'000'0'0100'0000 DW %11'000'0'0110'1111 DB ACEX.IDE_DATA_1F0 ; DW %00'000'0'0100'0001 DW %00'010'1'1110'1111 DB ACEX.IDE_ERROR_1F1 DW %00'010'0'0100'0001 DW %11'010'1'1110'1111 DB ACEX.IDE_ERROR_1F1 DW %11'010'0'0100'0001 DW %11'010'1'1110'1111 DB ACEX.IDE_ERROR_1F1 ; DW %00'000'0'0100'0010 DW %00'010'1'1110'1111 DB ACEX.IDE_COUNTER_1F2 DW %00'010'0'0100'0010 DW %11'010'1'1110'1111 DB ACEX.IDE_COUNTER_1F2 DW %11'010'0'0100'0010 DW %11'010'1'1110'1111 DB ACEX.IDE_COUNTER_1F2 ; DW %00'000'0'0100'0011 DW %00'010'1'1110'1111 DB ACEX.IDE_SECTOR_1F3 DW %00'010'0'0100'0011 DW %11'010'1'1110'1111 DB ACEX.IDE_SECTOR_1F3 DW %11'010'0'0100'0011 DW %11'010'1'1110'1111 DB ACEX.IDE_SECTOR_1F3 ; DW %00'000'0'0100'0100 DW %00'010'1'1110'1111 DB ACEX.IDE_CYLINDER_L_1F4 DW %00'010'0'0100'0100 DW %11'010'1'1110'1111 DB ACEX.IDE_CYLINDER_L_1F4 DW %11'010'0'0100'0100 DW %11'010'1'1110'1111 DB ACEX.IDE_CYLINDER_L_1F4 ; DW %00'000'0'0100'0101 DW %00'010'1'1110'1111 DB ACEX.IDE_CYLINDER_H_1F5 DW %00'010'0'0100'0101 DW %11'010'1'1110'1111 DB ACEX.IDE_CYLINDER_H_1F5 DW %11'010'0'0100'0101 DW %11'010'1'1110'1111 DB ACEX.IDE_CYLINDER_H_1F5 ; DW %00'000'0'1100'0010 DW %00'010'1'1110'1111 DB ACEX.IDE_DEVICE_HEAD_1F6 DW %00'010'0'1100'0010 DW %11'010'1'1110'1111 DB ACEX.IDE_DEVICE_HEAD_1F6 DW %11'010'0'1100'0010 DW %11'010'1'1110'1111 DB ACEX.IDE_DEVICE_HEAD_1F6 ; DW %00'000'0'1100'0011 DW %00'010'1'1110'1111 DB ACEX.IDE_STATUS_CMD_1F7 DW %00'010'0'1100'0011 DW %11'010'1'1110'1111 DB ACEX.IDE_STATUS_CMD_1F7 DW %11'010'0'1100'0011 DW %11'010'1'1110'1111 DB ACEX.IDE_STATUS_CMD_1F7 ; DW %00'000'0'1100'0100 DW %00'010'1'1110'1111 DB ACEX.IDE_CONTROL_3F6 DW %00'010'0'1100'0100 DW %11'010'1'1110'1111 DB ACEX.IDE_CONTROL_3F6 DW %11'010'0'1100'0100 DW %11'010'1'1110'1111 DB ACEX.IDE_CONTROL_3F6 ; DW %00'000'0'1100'0101 DW %00'010'1'1110'1111 DB ACEX.IDE_STATUS_3F7 DW %00'010'0'1100'0101 DW %11'010'1'1110'1111 DB ACEX.IDE_STATUS_3F7 DW %11'010'0'1100'0101 DW %11'010'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 %11'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 %11'000'0'0011'1100 DW %11'001'1'1111'1111 DB ACEX.IDE_CHANEL_2 ; DW %00'000'0'1010'1100 DW %11'001'1'1111'1111 DB ACEX.RESET DW %11'000'0'1010'1100 DW %11'001'1'1111'1111 DB ACEX.RESET ; DW %00'000'0'0110'1101 DW %10'000'1'1111'1111 DB ACEX.Scorp_1FFD DW %11'000'0'0110'1101 DW %11'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 %11'100'0'1110'1101 DW %11'100'1'1110'1111 DB ACEX.Pent_7FFD DW %10'000'0'0110'1101 DW %11'100'1'1110'1111 DB ACEX.Pent_7FFD ; DW %00'000'0'0101'0110 DW %11'001'1'1111'1111 DB ACEX.ALL_MODE DW %11'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'010'0'0110'1111 DB ACEX.SLOT0 DW %00'010'0'0000'1010 DW %11'010'0'0110'1111 DB ACEX.SLOT0 DW %11'010'0'0000'1010 DW %11'010'0'0110'1111 DB ACEX.SLOT0 ; DW %00'000'0'0010'1010 DW %00'010'0'0110'1111 DB ACEX.SLOT1 DW %00'010'0'0010'1010 DW %11'010'0'0110'1111 DB ACEX.SLOT1 DW %11'010'0'0010'1010 DW %11'010'0'0110'1111 DB ACEX.SLOT1 ; DW %00'000'0'0100'1010 DW %00'010'0'0110'1111 DB ACEX.SLOT2 DW %00'010'0'0100'1010 DW %11'010'0'0110'1111 DB ACEX.SLOT2 DW %11'010'0'0100'1010 DW %11'010'0'0110'1111 DB ACEX.SLOT2 ; DW %00'000'0'0110'1010 DW %00'010'0'0110'1111 DB ACEX.SLOT3 DW %00'010'0'0110'1010 DW %11'010'0'0110'1111 DB ACEX.SLOT3 DW %11'010'0'0110'1010 DW %11'010'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 ;-----------------------------------------------------------------------;