Crazy-Blaster/Crazy BIOS/rom/_not_used/CrazyBlaster.asm
Anatoliy Belyanskiy ace6b0904b First init
2024-07-29 01:59:31 +10:00

1518 lines
30 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.

INCLUDE 'Shared_Includes/constants/SP2000.inc'
INCLUDE 'Build/updater.inc'
;INCLUDE 'Shared_Includes/structures/FileSystem.inc'
;INCLUDE 'Shared_Includes/macroses/macros.z80'
;INCLUDE 'Shared_Includes/constants/BIOS_EQU.inc'
DEFINE sec_high 0
DEFINE sec_low 1
DEFINE SYS_FN_PAGE 1
;DEFINE ACEX_ROM_COPY_PAGE 0
DEFINE bufer_adr #C000
DEFINE sys_fn_in_sectors #4000 / #200
DEFINE bios_size_in_sectors 512
DEFINE flasher_size_in_sectors 1
DEFINE image_size_in_sectors flasher_size_in_sectors + bios_size_in_sectros
DEFINE TYPE_OF_ACEX 3 ; 3 - 1K30, 5 - 1K50
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ[ FIRST SECTION - CONF ROM ]ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ;
OUTPUT './Build/CrazyBlaster.raw'
ORG #0000
;
;ÛÛÛÛÛÛÛ ¨­¨æ¨ «¨§ æ¨ï á¨á⥬­ëå ¯®à⮢ Z84C15 ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ;
BEGIN_CB: 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
;ÛÛÛÛÛÛÛ <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
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ;
;ÛÛÛÛÛÛÛ <20> ¡®ç¨© ª®¤ ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ;
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ;
;  ¤à¥á ¯à®æ¥¤ãàë ®è¨¡ª¨
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
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ;
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
;°°°°°° <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: ;°°°°°°° Œ¨£ ­¨¥ « ¬¯®çª®© âãà¡ë °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
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
; Ž¡à § <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
;-----------------------------------------------------------------------;
END_FIRST_SECTION EQU $
;
DISPLAY "ROM size = ",/A,END_FIRST_SECTION - BEGIN_CB
OUTEND
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ;
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ;
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ;
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ[ SECOND SECTION - IMAGE ON DRIVE ]ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ;
OUTPUT './Build/CrazyBlasterIMG.raw'
ORG 0
BEGIN_CB_IMG: LD HL,RESERVED_PAGES
LD DE,#4000 + RESERVED_PAGES_COPY
LD BC,RESERVED_PAGES.Size
LDIR
LD SP,#4000
LD A,SYS_FN_PAGE
OUT (SLOT0),A
JP INIT_SCREEN - #4000
;
.start_code EQU $
;ÛÛÛÛÛÛÛ ¨­¨æ¨ «¨§ æ¨ï íªà ­  ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ;
INIT_SCREEN: CALL FN_SYNC
;
LD IX,VideoModes.graf_mode320x256
LD E,%00010001
CALL WIN_OPEN
;ÛÛÛÛÛÛÛ ¨­¨æ¨ «¨§ æ¨ï ¯ «¨âàë ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ;
INIT_PALETTE: ;IN A,(SLOT1)
;PUSH AF
LD B,#FF
LD HL,PICTURE.bdPallete ;#8FBC ;!HARDCODE PICTURE.bdPallete
LD DE,0
LD A,1
CALL SET_PALETTE
CALL SET_PICTURE
CALL SET_BOARD_NUMBER
; Ž¯à¥¤¥«¥­¨¥ 稯  <20>‡“
CALL DETECT_ROM
;
; ãáâ ­®¢ª  ॣ¨áâ஢
; ¯à릮ª ­  â®çªã ¢å®¤  ¢® ä«¥è¥à¥
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
SET_BOARD_NUMBER:
IN A,(SLOT3)
EX AF,AF'
LD A,#18 ;!HARDCODE
OUT (SLOT3),A
;
LD HL,(BOARD_ID_DATA.Start)
LD (BoardNumOffsets.Start),HL
LD HL,(BOARD_ID_DATA.Number)
LD (BoardNumOffsets.Number),HL
LD HL,(BOARD_ID_DATA.End)
LD (BoardNumOffsets.End),HL
LD A,(BOARD_ID_DATA.Type)
LD (BoardNumOffsets.Type),A
;
LD A,#10 ;!HARDCODE
OUT (SLOT3),A
LD A,(FOR_ACEX)
LD (#C000 + expBIOS_Vars.msgStrings.str_ACEX_MODEL),A
LD (#C000 + expBIOS_Vars.msgRusStrings.str_ACEX_MODEL),A
;
EX AF,AF'
OUT (SLOT3),A
RET
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
DISP_WINDOW EQU $
DISP #4000 + DISP_WINDOW
DETECT_ROM: LD HL,0
ADD HL,SP
LD SP,#4000
LD (.sp_save),HL
;
CALL TEST_ROM_CHIP ;!HARDCODE TEST_ROM_CHIP #8E59
LD (TST_R.jp),BC ;!HARDCODE TST_R.jp #81D5
;
.sp_save+1: LD SP,0000
XOR A
OUT (SYS_PORT.RAM),A
RET
ENT
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
SET_PICTURE: LD A,#FF - MAIN_PICTURE.PIC_Y
.loop_pic: PUSH AF
LD A,#50
OUT (SLOT1),A
POP AF
OUT (PORT_Y),A
LD HL,.pic_buffer
LD DE,#4000 + Screen_Offset + MAIN_PICTURE.PIC_X
;
LD BC,MAIN_PICTURE.PIC_WIDTH
LDIR
;
LD H,A
POP AF
OUT (SLOT1),A
PUSH AF
LD A,H
DEC A
CP MAIN_PICTURE.PIC_Y-1
JR NZ,.loop_pic
POP AF
OUT (SLOT1),A
IM 1
EI
RET
.pic_buffer: BLOCK MAIN_PICTURE.PIC_WIDTH,0
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
; “áâ ­®¢ª  ०¨¬  ­  «¨­¨¨
LP_MODE_LINE: BIT 0,(IX+Window_Variables.USER.MODE_S)
JP NZ,LP_MODE_LINE2 ; ¨¤â¨ ­  ᯥªâàã¬
BIT 4,A
JP Z,LP_MODE_LINE3 ; ¨¤â¨ ­  £à ä¨ªã!
DEC D
; ⥪áâ®¢ë© à¥¦¨¬.
EX AF,AF'
LD A,#50
OUT (SLOT3),A
LD A,L ; ¢¥à⨪ «ì­®¥ ¯®«®¦¥­¨¥
CP #80
JR NC,LP_EXIT_MODE
;
LP_MODE_RECURSE:
LD A,D ; £®à¨§®­â «ì­®¥ ¯®«®¦¥­¨¥
AND 7FH
SUB 80
JR C,LP_MODE_LL
SUB 48
NEG
;
LD E,A ; § ¯®¬­¨âì
ADD A,D
LD D,A ; ­®¢®¥ ¯®«®¦¥­¨¥
;
LD A,E ; ¢®ááâ ­®¢¨âì
RRA
AND 3FH
SUB C
JR NC,LP_EXIT_MODE
NEG
LD C,A ; ­®¢®¥ §­ ç¥­¨¥ C
JR LP_MODE_RECURSE
;
LP_MODE_LL: NEG
RRA
AND 3FH
CP C
JR NC,LP_MODE_LR
LD C,A
LP_MODE_LR: EX AF,AF'
INC D
LP_MD_LL1: EX AF,AF'
LD A,D
OUT (PORT_Y),A
EX AF,AF'
LD (HL),A ; ०¨¬
INC D
EX AF,AF'
LD A,D
OUT (PORT_Y),A
EX AF,AF'
LD (HL),A ; ०¨¬
INC D
DEC C
JR NZ,LP_MD_LL1
EX AF,AF'
LP_EXIT_MODE: LD A,SYS_PAGE
OUT (SLOT3),A
EX AF,AF'
RET
;
; “áâ ­®¢ª  ०¨¬  ­  «¨­¨¨
; Spectrum mode
LP_MODE_LINE2: LD A,(IX+Window_Variables.WORK_2)
LD B,(IX+Window_Variables.WORK_1)
;
DEC D
;
EX AF,AF'
LD A,#50
OUT (SLOT3),A
LD A,L ; ¢¥à⨪ «ì­®¥ ¯®«®¦¥­¨¥
CP #80
JR NC,LP_EXIT_MODE2
;
LP_MODE_RECURSE2:
LD A,D ; £®à¨§®­â «ì­®¥ ¯®«®¦¥­¨¥
AND #7F
SUB 80
JR C,LP_MODE_LL2
SUB 48
NEG
;
LD E,A ; § ¯®¬­¨âì
ADD A,D
LD D,A ; ­®¢®¥ ¯®«®¦¥­¨¥
;
LD A,E ; ¢®ááâ ­®¢¨âì
RRA
AND #3F
SUB C
JR NC,LP_EXIT_MODE2
NEG
LD C,A ; ­®¢®¥ §­ ç¥­¨¥ C
JR LP_MODE_RECURSE2
;
LP_MODE_LL2: NEG
RRA
AND #3F
CP C
JR NC,LP_MODE_LR2
LD C,A
LP_MODE_LR2: EX AF,AF'
INC D
LP_MD_LL2: EX AF,AF'
LD A,D
OUT (PORT_Y),A
EX AF,AF'
LD (HL),A ; ०¨¬
INC L
LD (HL),B
INC L
LD (HL),B
DEC L
DEC L
INC D
BIT 4,A
JR NZ,lp_md_ll3x
INC B
lp_md_ll3x: EX AF,AF'
LD A,D
OUT (PORT_Y),A
EX AF,AF'
LD (HL),A ; ०¨¬
INC L
LD (HL),B
INC L
LD (HL),B
DEC L
DEC L
INC D
INC B
JR NZ,LP_NO_ADD_40
ADD A,#40
LP_NO_ADD_40: DEC C
JR NZ,LP_MD_LL2
EX AF,AF'
LP_EXIT_MODE2: LD A,SYS_PAGE
OUT (SLOT3),A
EX AF,AF'
LD (IX+Window_Variables.WORK_1),B
LD (IX+Window_Variables.WORK_2),A
RET
;
; “áâ ­®¢ª  ०¨¬  ­  «¨­¨¨
LP_MODE_LINE3: ; Grafic Mode
LD A,(IX+Window_Variables.WORK_1)
LD B,(IX+Window_Variables.WORK_2)
DEC D
EX AF,AF'
LD A,#50
OUT (SLOT3),A
LD A,L ; ¢¥à⨪ «ì­®¥ ¯®«®¦¥­¨¥
CP #80
JR NC,LP_EXIT_MODE3
;
LP_MODE_RECURSE3:
LD A,D ; £®à¨§®­â «ì­®¥ ¯®«®¦¥­¨¥
AND #7F
SUB 80
JR C,LP_MODE_LL3
SUB 48
NEG
LD E,A ; § ¯®¬­¨âì
ADD A,D
LD D,A ; ­®¢®¥ ¯®«®¦¥­¨¥
LD A,E ; ¢®ááâ ­®¢¨âì
RRA
AND #3F
SUB C
JR NC,LP_EXIT_MODE3
NEG
LD C,A ; ­®¢®¥ §­ ç¥­¨¥ C
JR LP_MODE_RECURSE3
;
LP_MODE_LL3: NEG
RRA
AND #3F
CP C
JR NC,LP_MODE_LR3
LD C,A
LP_MODE_LR3: EX AF,AF'
INC D
BIT 5,B
JR Z,LP_GR_640
;
LP_MD_LL3: EX AF,AF'
LD A,D
OUT (PORT_Y),A
EX AF,AF'
LD (HL),B ; ०¨¬
INC L
LD (HL),A ; ०¨¬ 2
INC L
LD (HL),0 ; ०¨¬ 2
DEC L
DEC L
INC D
INC D
INC A
LD E,A
AND 7
JR NZ,LP_NO_INC_B
LD A,E
SUB 8
LD E,A
INC B
LP_NO_INC_B: LD A,E
DEC C
JR NZ,LP_MD_LL3
;
LP_640_RET: EX AF,AF'
LP_EXIT_MODE3: LD A,SYS_PAGE
OUT (SLOT3),A
EX AF,AF'
LD A,(IX+Window_Variables.WORK_1)
ADD A,8
LD (IX+Window_Variables.WORK_1),A
RET
;
LP_GR_640: EX AF,AF'
LD A,D
OUT (PORT_Y),A
EX AF,AF'
LD (HL),B ; ०¨¬ 1
INC L
LD (HL),A ; ०¨¬ 2
INC L
LD (HL),0 ; ०¨¬ 3
INC D
EX AF,AF'
LD A,D
OUT (PORT_Y),A
EX AF,AF'
LD (HL),0 ; ०¨¬ 3
DEC L
LD (HL),A ; ०¨¬ 2
DEC L
LD (HL),B ; ०¨¬ 1
INC D
INC A
LD E,A
AND 7
JR NZ,LP_NO_INC_B6
LD A,E
SUB 8
LD E,A
INC B
LP_NO_INC_B6: LD A,E
DEC C
JR NZ,LP_GR_640
JP LP_640_RET
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
; ¢å®¤: HL - ¤ ­­ë¥ ¯ «¨âàë RGB, E - ­ ç «ì­ë© 梥â
; D - ç¨á«® 梥⮢, B - PAL-mask, A - page PAL
SET_PALETTE: PUSH IX
;
EX AF,AF'
IN A,(RGADR)
PUSH AF ; á®åà ­¨âì ¯®«®¦¥­¨¥ RGADR
LD A,E
OUT (RGADR),A ; ­ ç «ì­ë© 梥⠢ ¯®àâ
LD A,D ; á®åà ­¨âì ç¨á«® 梥⮢
EX AF,AF' ; ¢¥à­ãâì áâà ­¨æã PAL
;
BIT 7,H ; ¯à®¢¥à¨âì  ¤à¥á ¤ ­­ëå
LD C,SLOT3 ; ¥á«¨ ­¨¦¥ 8000h
LD D,#C3 ; â® £à ä.íªà ­ ­  áâà ­¨æ¥ 3
JR Z,.NO_PAGE1
LD D,#43 ; ¨­ ç¥
LD C,SLOT1 ; ­  áâà ­¨æ¥ 1
.NO_PAGE1: ADD A,A
ADD A,A
AND #1C
XOR #E0 ; ¬« ¤è¨© ¡ ©â  ¤à¥á  PAL
LD E,A ; DE -  ¤à¥á ¢ ¢¨¤¥®-އ“
PUSH DE
POP IX ;  ¤à¥á ¯ «¨âàë
;
LD D,B ; ¬ áª  PAL
EX AF,AF' ; ¢¥à­ãâì ç¨á«® 梥⮢
LD B,A ; ç¨á«® 梥⮢
;
IN E,(C) ; á®åà ­¨âì áâà ­¨æã 3
LD A,#50 ; áâà ­¨æ  £à ä¨ç¥áª®£® RAM
OUT (C),A
.loopPal: ; 横« ãáâ ­®¢ª¨ 梥⮢ ¯ «¨âàë
LD A,(HL) ; B
AND D
LD (IX+2),A
INC HL
;
LD A,(HL) ; G
AND D
LD (IX+1),A
INC HL
;
LD A,(HL) ; R
AND D
LD (IX+0),A
INC HL
;
LD A,(HL) ; Y
AND D
LD (IX+3),A
INC HL
;
IN A,(RGADR)
INC A
OUT (RGADR),A
DJNZ .loopPal ; ¢ë¯®«­ïâì, ¯®ª  ­¥ 0
;
.exit: OUT (C),E ; ¢®ááâ ­®¢¨âì áâà ­¨æã 3
POP AF
OUT (RGADR),A ; ¢®ááâ ­®¢¨âì Y_PORT
POP IX
AND A
RET
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
LP_OPEN_PG: IN A,(SLOT3)
LD C,A
LD A,SYS_PAGE
OUT (SLOT3),A
;
LD A,C
LD (SYS_PAGE.COPY_SLOT3),A
IN A,(PORT_Y)
LD (SYS_PAGE.COPY_RGADR),A
RET
LP_CLOSE_PG: LD A,(SYS_PAGE.COPY_RGADR)
OUT (PORT_Y),A
LD A,(SYS_PAGE.COPY_SLOT3)
OUT (SLOT3),A
RET
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
WIN_OPEN: CALL LP_OPEN_PG
LD (SYS_PAGE.WIN_MAP_SC),IX ; ª àâ  ®ª­ 
PUSH DE
LD HL,(SYS_PAGE.WIN_MAP_SC)
LD DE,WIN_ID_0
LD BC,Window_UserVars
LDIR
LD IX,WIN_ID_0
POP DE
LD L,(IX+Window_Variables.USER.PLACE_H)
LD H,(IX+Window_Variables.USER.PLACE_V)
LD (IX+Window_Variables.MODE_E),E
;
LD A,L
ADD A,A
INC A ; ¢ëç¨á«¥­¨¥ PORT_Y
BIT 4,E
JR NZ,.LP_SET_NO_OR
OR #80 ; ¥á«¨ ¢ë¢®¤ ­  ¢â®à®© íªà ­
.LP_SET_NO_OR: LD (IX+Window_Variables.H_BEG),A
LD D,A
LD A,(IX+Window_Variables.USER.SIZE_H)
ADD A,A
ADD A,D
LD (IX+Window_Variables.H_END),A
LD (SYS_PAGE.WIN_MODE_SC),DE ; ¬¥áâ® ¯® £®à¨§®­â «¨ ¨ áâà ­¨æ  ¬®¤ë
LD A,H
AND #3F
ADD A,A
ADD A,A
LD L,A
LD H,#C3
LD (SYS_PAGE.WIN_MODE_SH),HL ; ¬¥áâ® ¯® ¢¥à⨪ «¨ á  ¤à¥á®¬
LD (IX+Window_Variables.V_BEG),A
LD A,(IX+Window_Variables.USER.SIZE_V)
ADD A,A
ADD A,A
ADD A,L
LD (IX+Window_Variables.V_END),A
;
LD L,(IX+Window_Variables.V_BEG)
LD H,#C3
LD B,(IX+Window_Variables.USER.SIZE_V) ; à §¬¥à ¯® ¢¥à⨪ «¨
;
LD (IX+Window_Variables.WORK_1),0
LD A,(IX+Window_Variables.USER.MODE) ; §­ ª®£¥­¥à â®à ¯«îá ०¨¬
LD (IX+Window_Variables.WORK_2),A
BIT 4,A
JR NZ,.LOOP ; ¯¥à¥å®¤, ¥á«¨ ⥪áâ®¢ë© à¥¦¨¬
;
AND #F0
LD C,A
LD A,(IX+Window_Variables.USER.GR_X)
RRCA
RRCA
RRCA
LD D,A
AND #0F
OR C
LD (IX+Window_Variables.WORK_2),A
;
LD A,D
AND #E0
LD C,A
LD A,(IX+Window_Variables.USER.GR_Y)
AND #1F
OR C
RLCA
RLCA
RLCA
LD (IX+Window_Variables.WORK_1),A
;
.LOOP: LD D,(IX+Window_Variables.H_BEG) ; D - ­ ç «® áâப¨ (PORT_Y)
LD C,(IX+Window_Variables.USER.SIZE_H) ; à §¬¥à ¯® £®à¨§®­â «¨
LD A,(IX+Window_Variables.USER.MODE) ; §­ ª®£¥­¥à â®à ¯«îá ०¨¬
;
PUSH BC
CALL LP_MODE_LINE
POP BC
INC L
INC L
INC L
INC L
DJNZ .LOOP
;
LD A,(IX+Window_Variables.MODE_E)
AND 1
OUT (RGMOD),A
CALL LP_CLOSE_PG
CALL LP_INI_P
CALL LP_SIZE
XOR A
RET
;
LP_INI_P: EX AF,AF'
EXX
CALL LP_OPEN_PG
; ®âªàë⨥ £à ä¨ç¥áª®£® íªà ­ 
; LP_INI_NO_ZG:
LD A,(WIN_ID_0.H_BEG)
LD D,A
LD A,(WIN_ID_0.V_BEG)
LD L,A
INC L
LD H,#C3
AND A
LD A,(WIN_ID_0.USER.MODE)
BIT 5,A
LD A,(WIN_ID_0.USER.SIZE_H)
JR NZ,LP_INI_40
ADD A,A
SCF
;!TODO çâ®-â® âãâ ¯®¤¢ë¯¨«¥­­®
LP_INI_40: LD B,A
LD (WIN_ID_0.SIZE_REL),A
EX AF,AF'
EXX
JP LP_END_P
;
; WIN_MAP_SC - ª àâ  íªà ­ 
; 0 - hor size
; 1 - ver size
; 2 - hor place
; 3 - ver place
LP_SIZE: ; ®¯à¥¤¥«¥­¨¥ size
CALL LP_OPEN_PG
LD DE,(WIN_ID_0.USER.SIZE_H)
LD A,(WIN_ID_0.USER.MODE)
BIT 5,A
CALL LP_CLOSE_PG
RET NZ
LD A,E
ADD A,A
LD E,A
RET
;
LP_END_P: LD A,SYS_PAGE
OUT (SLOT3),A
.SYS_PAGE: EX AF,AF'
EXX
RLA
LD E,A
LD (WIN_ID_0.reg_HL),HL ; ¬¥áâ® ¯¥ç â¨
LD (WIN_ID_0.reg_DE),DE
LD (WIN_ID_0.reg_BC),BC
CALL LP_CLOSE_PG
EXX
EX AF,AF'
AND A
RET
.short: EX AF,AF'
EXX
CALL LP_CLOSE_PG
EXX
EX AF,AF'
AND A
RET
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
FN_SYNC: LD A,Port_VSYNC.SET_320L
OUT (Port_VSYNC),A
LD C,SLOT3
IN B,(C)
LD A,SYS_PAGE
OUT (C),A
LD A,(SYS_PAGE.VSyncAndWaits)
OR 1
LD (SYS_PAGE.VSyncAndWaits),A
;
.INT_DEF: LD DE,(SYS_PAGE.CONFIG_ALL)
OUT (C),B
LD IX,SCREEN_TABLES.PENTAGON
IN A,(SLOT3)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT3),A
EX AF,AF'
LD (SYS_PAGE.COPY_SLOT3),A
IN A,(PORT_Y)
LD (SYS_PAGE.COPY_RGADR),A
LD (SYS_PAGE.CONFIG_ALL),IX
XOR A
;----[START]-----------------------[? 1]
.loop_1: OUT (PORT_Y),A
EX AF,AF'
LD A,#50
OUT (SLOT3),A
LD HL,#C300
;----[START]------------------[v 2]-----
.loop_2: LD C,(IX)
;----[START]-------------[v 3]----------
.loop_3: ; ¢§ïâì  ¤à¥á ¤ ­­ëå ¤«ï § ¯¨á¨ ¢ á«ã¦¥¡­ãî ®¡« áâì íªà ­ 
LD E,(IX+1) ; take adress of line X
LD D,(IX+2)
;----[START]--------[v 4]---------------
.loop_4:
LD A,(DE) ; take counter in table 1, line X, column Y
INC DE
AND A
JR Z,.loop_4_exit ; exit if zero-counter
LD B,A
LD A,(DE)
INC DE
;----[START]---[v 5]--------------------
.loop_5:
LD (HL),A
INC L
LD (HL),0
INC L
LD (HL),0
;
EX AF,AF'
INC A
OUT (PORT_Y),A
EX AF,AF'
;
LD (HL),0
DEC L
LD (HL),0
DEC L
LD (HL),A
;
EX AF,AF'
INC A
OUT (PORT_Y),A
EX AF,AF'
DJNZ .loop_5
;--------------[^ 5]--------------------
JR .loop_4
;-------------------[^ 4]---------------
.loop_4_exit: INC HL ; next line
INC HL
INC HL
INC HL
IN A,(PORT_Y)
AND #80
OUT (PORT_Y),A
DEC C
JR NZ,.loop_3
;------------------------[^ 3]----------
INC IX ; next counter
INC IX
INC IX
LD A,(IX)
AND A
JR NZ,.loop_2
;-----------------------------[^ 2]-----
LD A,SYS_PAGE
OUT (SLOT3),A
LD IX,(SYS_PAGE.CONFIG_ALL)
EX AF,AF'
ADD A,#80
JR NC,.loop_1
;----------------------------------[^ 1]
; Exit
LD A,(SYS_PAGE.COPY_RGADR)
OUT (PORT_Y),A
LD A,(SYS_PAGE.COPY_SLOT3)
OUT (SLOT3),A
.exit: OR A
RET
;--- Screen data table 1: counter1, data1 .. counterX, dataX
SCREEN_TABLES:; | ç¨á«® | §­ ç¥­¨ï |
; | áâப | ¢ |
; | /2 | áâப å |
.SCR: DB 41 , #F8
DB 3 , #FC
DB 4 , #FC
DB 7 , #FC
DB 9 , #F8
DB 0
.INT: DB 40,#FC, 2,#FD, 6,#FC, 7,#FC, 9,#FC, 0
.BLN: DB 41,#FC, 3,#FC, 4,#FC, 7,#FC, 9,#FC, 0
.SNC: DB 41,#FC, 3,#FC, 4,#FC, 7,#FC, 9,#FC, 0
.RES: DB 41,#F8, 3,#FE, 4,#FE, 7,#FE, 9,#F8, 0
;--- Screen data tables 2: counter1, data address1 .. counterX, data addressX
;
; | ª®«-¢® | §­ ç¥­¨ï |
; | áâப | ¢ |
; | | áâப¥ |
.PENTAGON: DB 33 : DW .SCR
DB 1 : DW .INT ; DW .BLN
DB 3 : DW .SNC
DB 1 : DW .BLN
DB 1 : DW .SCR
DB 1 : DW .RES
DB 0 ; end
;---
VideoModes:
.text_mode80x32:
DB 40
DB 32
DB 0
DB 0
DB %00011011
DB 0
DB 0
DB 0
.graf_mode320x256:
DB 80
DB 32
DB 0
DB 0
DB %01100000
DB 0
DB 0
DB 0
;---------------------------------------------------------------------;
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
RESERVED_PAGES_COPY: BLOCK RESERVED_PAGES.Size,#FF
.SYS_FN EQU RESERVED_PAGES.SYS_FN - RESERVED_PAGES
.BIOS EQU RESERVED_PAGES.BIOS - RESERVED_PAGES
.PICTURE EQU RESERVED_PAGES.PICTURE - RESERVED_PAGES
.FLASHER_RAM EQU RESERVED_PAGES.FLASHER_RAM - RESERVED_PAGES
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
;-----------------------------------------------------------------------;
BYTE "ACEX 1K"
FOR_ACEX: DB "0" + TYPE_OF_ACEX
BYTE "0"
BYTE "FULL BOARD ID:"
BOARD_ID_DATA:
.Start: DW #5283
.Number: DW 0 ; ¢ë¢®¤¨âáï ª ª 5 ¤¥áïâ¨ç­ëå æ¨äà: 0..99999 ¨«¨ #0000..#270F
.End: DW #47E8
.Type: DB 0
BYTE "--<=END=>--"
END_SECOND_SECTION EQU $
;
DISPLAY "IMG size = ",/A,END_SECOND_SECTION - BEGIN_CB_IMG
OUTEND
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ;