mirror of
https://github.com/Tolik-Trek/Crazy-Blaster.git
synced 2026-06-15 09:31:37 +03:00
1518 lines
30 KiB
NASM
1518 lines
30 KiB
NASM
|
||
|
||
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
|
||
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ; |