Crazy-Blaster/Crazy/ACEX_RAM.ASM
2024-08-02 02:52:29 +10:00

744 lines
15 KiB
NASM
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

;ÛÛÛÛÛÛÛ ¨­¨æ¨ «¨§ æ¨ï á¨á⥬­ëå ¯®à⮢ 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: ; ¢­ãâ७­¨¥ ¯®àâë í¬ã«ïâ®à  <20>‡“ ¬ ¯ïâáï ­  ¢­¥è­¨¥
.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
;ÛÛÛÛÛÛÛ <20>¥à¥¡à®á ®á⠢襣®áï ª®¤  ¢ 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)
; ’“’ Œ› “†… އ“ ’ŽŒ †… ŠŽ„… ˆ €„<E282AC>
; áâà ­¨æë 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
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ;
;ÛÛÛÛÛÛÛ <20> ¡®ç¨© ª®¤ ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ;
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ;
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
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ;
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
;°°°°°° <09>à®æ¥¤ãàë °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
; 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 - áâ à®¥ §­ ç¥­¨¥ ¢­ãâ७­¥£® ¯®àâ ; <20>¥à¥¤ ¢ë室®¬ ¢®ááâ ­ ¢«¨¢ ¥âáï ª®­ä  ¯à®¯¨á ­­ ï ¢ 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: ; Ž¡à § <20>ˆŽ  ¤«ï à¥áâ àâ 
.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
; ; Ž¡à § <20>ˆŽ  ¤«ï ¯à®è¨¢ª¨
; .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
;-----------------------------------------------------------------------;