MK.DEMO/MK_DEMO.ASM
Anatoliy Belyanskiy e8233e9c5a ...
2024-02-03 02:31:41 +10:00

1674 lines
25 KiB
NASM
Raw Permalink 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.

;
IFNDEF MODE_CBL
DEFINE MODE_CBL 1 ; 0 - OUTI ver, 1 - #FD page ver.
ENDIF
IFNDEF MUSIC_22khz
DEFINE MUSIC_22khz 1
ENDIF
IF MUSIC_22khz
; #5944x128 blocks for play
DEFINE _memPagesForMuz 179
DEFINE _ramDiskNumForMuz 3
DEFINE _lastPageMuzOffset #5E00
ELSE
DEFINE _memPagesForMuz 29
ENDIF
;
;-------------------------------[Includes]------------------------------
INCLUDE 'Shared_Includes/macroses/macros.z80'
INCLUDE 'Shared_Includes/constants/SP2000.inc'
INCLUDE 'Shared_includes/constants/dss_equ.inc'
INCLUDE 'Shared_Includes/constants/BIOS_equ.inc'
INCLUDE 'Shared_includes/macroses/accelerator.z80'
INCLUDELUA <Shared_Includes/LUA/Functions.LUA>
INCLUDE 'version.inc'
;-----------------------------------------------------------------------
;
STRUCT SPRITE_TBL
Slot BYTE #FF ; PAGE OF SPRITE
Address WORD #C000 ; ADDRESS OF SPRITE
Height BYTE #78 ; ¢ëá®â 
Width BYTE #80 ; è¨à¨­ 
X WORD 0000 ; ª®®à¤¨­ â  «¥¢®£® á⮫¡æ  á¯à ©â  ­  íªà ­¥ 0..(319-width)
Y BYTE #50 ; ª®®à¤¨­ â  ¢¥àå­¥© áâப¨ á¯à ©â  ­  íªà ­¥ 0..(255-Height)
Attribute BYTE #5C ; bit0 == 1 - ¬¥âª  ¯®á«¥¤­¥£® á¯à ©â  ¢ ᯨ᪥,   â ª íâ® £à ä¨ç¥áª ï áâà ­¨æ  á ¯®¤à¥¦¨¬ ¬¨ § ¯¨á¨
ENDS
;
;-------------------------[Standart EQU section]------------------------
org_addr EQU #8000+CLP_Buffer
code_addr EQU START
stack_point EQU #BFFF
program_start EQU START
Loader_length EQU 0
;-----------------------------------------------------------------------
;
;
;-----------------------------[EQU section]-----------------------------
ScreenSize:
.X EQU 320
.Y EQU 256
DEFINE BACKPLANE_BMP 0
IF BACKPLANE_BMP
BackPlane:
.Height EQU 223
.Width EQU 1102
.OffsetY EQU 0
.Scroll.Step EQU 1
.Scroll.Width EQU 2*(BackPlane.Width/2 - ScreenSize.X/2)
.PalSize EQU 64*4
.PalOffset EQU 0*4
.RGBoffset EQU 0 ; or #436 if with BMP header and palette
.FIllColorNum EQU 4 ; ­®¬¥à æ¢¥â  ¢ ¯ «¨âॠª à⨭ª¨ ¤«ï § «¨¢ª¨ ᢥàåã ¨ á­¨§ã
.SizeBytes EQU BackPlane.Height * BackPlane.Width
.SizePages EQU BackPlane.SizeBytes/#4000 + (((BackPlane.SizeBytes mod #4000) != 0) * -1)
ELSE
BackPlane:
.Height EQU 200
.Width EQU 520
.OffsetY EQU 23
.Scroll.Step EQU 1
.Scroll.Width EQU 2*(BackPlane.Width/2 - ScreenSize.X/2)
.PalSize EQU 64*4
.PalOffset EQU 0*4
.RGBoffset EQU 0 ; or #436 if with BMP header and palette
.FIllColorNum EQU 63 ; ­®¬¥à æ¢¥â  ¢ ¯ «¨âॠª à⨭ª¨ ¤«ï § «¨¢ª¨ ᢥàåã ¨ á­¨§ã
.SizeBytes EQU BackPlane.Height * BackPlane.Width
.SizePages EQU BackPlane.SizeBytes/#4000 + (((BackPlane.SizeBytes mod #4000) != 0) * -1)
ENDIF
DISPLAY "Backplane size = ",/H,BackPlane.SizeBytes, ", pages - ",BackPlane.SizePages," (",#4000 * BackPlane.SizePages," bytes)"
RaidenSprite:
.PalOffset EQU 128*4
.PalSize EQU 64*4
VARS EQU #9000
SPRITE_OLD2 EQU VARS
SPRITE_OLD1 EQU VARS+2
SPRITE_NEW EQU VARS+4
SPEED_Y EQU VARS+16
SPEED_X EQU VARS+17
RAMD_1 EQU VARS+18
DAT_SPR0 EQU VARS+#100
DAT_SPR1 EQU VARS+#200
DAT_SPR2 EQU VARS+#300
IM2_Handler EQU #88FF
;-----------------------------------------------------------------------
;
INCLUDE 'Shared_Includes/constants/EXE_Header.z80'
ORG org_addr
START: ld c,Dss.GetVMod
rst ToDSS
jr nc,1F
ld a,3 ; ¥á«¨ ®è¨¡ª , â® áâ ¢¨¬ ¤¥ä®«â­ë¥ §­ ç¥­¨ï ०¨¬  ¨ ­®¬¥à  íªà ­ 
ld b,1
1: ld (vid_mod_save),a
ld a,b
ld (scr_num_save),a
ld hl,START_MSG
ld c,Dss.PChars
RST ToDSS
ld hl,LOADING_MSG
ld c,Dss.PChars
RST ToDSS
LD BC,BIOS.SWAP_RAM_DRIVES.Info
RST ToBIOS
CP high BIOS.SWAP_RAM_DRIVES.ZX
JR Z,1F
;
LD (EXIT_ram_drv),A
LD BC,BIOS.SWAP_RAM_DRIVES.ZX
RST ToBIOS
1: ;
call Load_Resources
JR NC,NEXT_STEP
ld hl,NO_FREE_MEM
LD (set_msg),HL
JP EXIT_TO_DSS.no_mem
; jp start_load
; JP BEGIN
; start_load:
; ld sp,#BFFF
; LD HL,#9000
; LD A,#81
; CTL_10:
; LD (HL),#FF
; INC L
; CP L
; JR NZ,CTL_10
; LD A,#C0
; STL_11:
; LD (HL),L
; INC L
; CP L
; JR NZ,STL_11
; CTL_12:
; LD (HL),#FF
; INC L
; JR NZ,CTL_12
; IN A,(SLOT3)
; EX AF,AF'
; LD A,SYS_PAGE
; OUT (SLOT3),A
; LD A,(RAMD_KEYS.F)
; OUT (SLOT3),A
; AND A
; JR Z,NO_CODED
; LD HL,#C000
; LD D,#90
; CODED1:
; LD E,(HL)
; LD A,(DE)
; LD (HL),A
; INC L
; JR NZ,CODED1
; INC H
; JR NZ,CODED1
; IN A,(SLOT3)
; LD L,A
; LD A,SYS_PAGE
; OUT (SLOT3),A
; LD H, high RAMD_FAT
; LD A,(HL)
; OUT (SLOT3),A
; CP #FF
; LD HL,#C000
; JR NZ,CODED1
;NO_CODED:
; IN A,(SLOT3)
; EX AF,AF'
;-------TEST--------------------------[v]
NEXT_STEP:
ld hl,#9000
ld a,#FF
ACC_SetBlockSize
cp 0
ACC_FillOneByte
ld (hl),a
inc h
ld (hl),a
inc h
ld (hl),a
inc h
ld (hl),a
ACC_Off
ld hl,BackPlane.FileName
ld a,1
ld c,Dss.Open
rst ToDSS
di
push af
ld hl,#9000 + BackPlane.PalOffset
ld de,BackPlane.PalSize
LD C,Dss.Read
rst ToDSS
DI
pop af
ld c,Dss.Close
rst ToDSS
di
ld hl,RaidenSprite.FileName
ld a,1
ld c,Dss.Open
rst ToDSS
di
push af
ld hl,#9000 + RaidenSprite.PalOffset
ld de,RaidenSprite.PalSize
LD C,Dss.Read
rst ToDSS
DI
pop af
ld c,Dss.Close
rst ToDSS
di
;-------TEST--------------------------[^]
/*
LD A,SYS_PAGE
OUT (SLOT3),A
LD A,(RAMD_KEYS.G)
OUT (SLOT3),A
; LD HL,#C036 ; BACKGRN0.PAL
; LD BC,#0400
LD HL,#C000
LD DE,#9000 + BackPlane.PalOffset
LD BC,BackPlane.PalSize
LDIR
LD A,SYS_PAGE
OUT (SLOT3),A
LD A,(RAMD_KEYS.H) ; RAIDEN.PAL
OUT (SLOT3),A
; LD HL,#C236
; LD BC,#0100
LD HL,#C000
LD DE,#9000 + RaidenSprite.PalOffset
LD BC,RaidenSprite.PalSize
LDIR
EX AF,AF'
OUT (SLOT3),A
*/
LD HL,#9000
LD DE,0
LD B,#FF
LD A,0
LD C,BIOS.PIC_SET_PAL
RST ToBIOS
LD HL,#9000
LD DE,0
LD B,#FF
LD A,1
LD C,BIOS.PIC_SET_PAL
RST ToBIOS
LD A,2
LD C,BIOS.FN_SYNC
RST ToBIOS
LD C,BIOS.LP_OPEN_S
LD B,8
LD E,0
LD HL,#5000
RST ToBIOS
LD C,BIOS.LP_OPEN_S
LD B,9
LD E,1
LD HL,#4000
RST ToBIOS
; IN A,(SLOT3)
; EX AF,AF'
; LD A,#10
; OUT (SLOT3),A
; LD HL,#8000
; LD DE,#C000
; LD BC,#4000
; LDIR
; ld (#C000),bc
; ld (#C001),bc
; EX AF,AF'
; OUT (SLOT3),A
; LD HL,#C100
; LD DE,#0800
; LD BC,#4005
; RST ToBIOS
; LD HL,STRING
; LD DE,#C080
; LD BC,STRING_LEN
; LDIR
; DI
; IN A,(SLOT3)
; LD C,#F3
; RST ToBIOS
BEGIN: DI
LD SP,#BFFF
ld hl,IM2_Proc
ld (IM2_Handler),hl
ld a,high IM2_Handler
ld i,a
IM 2
IN A,(SLOT3)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT3),A
LD A,(SYS_PAGE.RAMD_KEYS.H)
LD (SND_P),A
EX AF,AF'
OUT (SLOT3),A
ei
halt
di
ld d,BackPlane.FIllColorNum
call FILL_SCR
ei
halt
di
in a,(RGMOD)
xor 1
; and 1
out (RGMOD),a
ld d,BackPlane.FIllColorNum
call FILL_SCR
LD HL,SPRITE_DATA
ld de,DAT_SPR0
ACC_SetBlockSize
ld a,SPRITES_L
ACC_CopyBlock
ld a,(hl)
ld (de),A
INC D
LD (DE),A
INC D
LD (DE),A
ACC_Off
LD (SPRITE_NEW),DE
DEC D
LD (SPRITE_OLD1),DE
DEC D
LD (SPRITE_OLD2),DE
EI
HALT
;-----[ˆ­¨æ¨ «¨§ æ¨ï Covox-Blaster]-----
ld bc,CBL.SYS_PORT
IF MODE_CBL ; [ 1 ] -----<
IF MUSIC_22khz
ld a,CBL.Blaster + CBL.Int_on + CBL.KHz_22
ELSE
ld a,CBL.Blaster + CBL.Int_on + CBL.KHz_16
ENDIF
ELSE ; [ 2 ] -----<
IF MUSIC_22khz
ld a,CBL.Blaster + CBL.Int_on + CBL.KHz_22
ELSE
ld a,CBL.Blaster + CBL.Int_on + CBL.KHz_16
ENDIF
ENDIF ; [ . ] -----<
out (c),a
CALL MUTE_CBL
;---------------------------------------
; IFN MODE_CBL : DI : ENDIF
;//////////////////////////////////////////////
LOOP_ALL:
LD A,3
LD (save_border),a
OUT (BorderColor),A
; LD IX,(SPRITE_OLD2)
; CALL SPRITE_RESTORE
; IFN MODE_CBL : CALL PlayMusic : ENDIF
CALL FON_LOAD
LD IX,(SPRITE_NEW)
CALL SPRITE_LOAD
; IFN MODE_CBL : CALL PlayMusic : ENDIF
LD DE,(SPRITE_OLD2)
LD HL,(SPRITE_OLD1)
LD (SPRITE_OLD2),HL
LD HL,(SPRITE_NEW)
LD (SPRITE_OLD1),HL
LD (SPRITE_NEW),DE
; IFN MODE_CBL : CALL PlayMusic : ENDIF
; IFN MODE_CBL : CALL PlayMusic : ENDIF
LD A,5
LD (save_border),a
OUT (BorderColor),A
; CALL FILL_SCR
;LOOP_WW:
; IN A,(0FEH)
; AND #20
; JR Z,LOOP_WW
; IFN MODE_CBL : EI : HALT : DI : ENDIF
; IF MODE_CBL
halt_loop_repeat: HALT
halt_JP_address+1: JR halt_loop_repeat
halt_loop_exit:
; ENDIF
in a,(RGMOD)
xor 1
; and 1
out (RGMOD),a
; IFN MODE_CBL : CALL PlayMusic : ENDIF
; IFN MODE_CBL : CALL PlayMusic : ENDIF
ld a,(IM2_Proc.exit_key)
and a
jr nz,LOOP_ALL
jp EXIT_TO_DSS
;//////////////////////////////////////////////
FILL_SCR:
ld a,#50
out (SLOT3),a
LD HL,#C040
in a,(RGMOD)
and a
jr nz,no_ld_hl1
ld HL,#C180
no_ld_hl1:
ACC_SetBlockSize
LD A,0
ACC_Off
OUT (PORT_Y),A
LD B,160
begin_loop:
ACC_FillScreenOneByte ; !FIXIT ®¯â¨¬¨§¨à®¢ âì
LD (HL),D
INC HL
LD (HL),D
INC HL
ACC_Off
DJNZ begin_loop
RET
SPRITE_DATA:
DB #FF ; PAGE_SPRITE
dw #C000 ; ADRESS SPRITE
DB #78,#80 ; SIZE
DW 0000 ; HOR_PLACE
DB #50 ; WER_PLACE
DB #5C ; ATRIBUTE
DB #FF
dw #C000
DB #78,#80
DW #0060
DB #50
DB #5C
DB #FF
dw #C000
DB #78,#80
DW #00C0
DB #50
DB #5D
SPRITES_L EQU $-SPRITE_DATA
;=======================================================================
/*
; !TODO ¯à®æ¥¤ãà  ­¥ ¨á¯®«ì§ã¥âáï!!!
; IX -  ¤à¥á ¤ ­­ëå á¯à ©â 
; DE - x-ª®®à¤¨­ â  ¯®«®¦¥­¨ï
; A - y-ª®®à¤¨­ â  ¯®«®¦¥­¨ï
; B -  âਡãâë á¯à ©â 
SPRITE_RESTORE:
push ix
IN A,(SLOT1)
PUSH AF
IN A,(SLOT3)
PUSH AF
IN A,(PORT_Y)
PUSH AF
loop_all_2:
; ld a,(ix+8) ; atributes
; AND #0C
; OR #50
LD A,#50
out (SLOT1),a
LD BC,#4040
IN A,(RGMOD)
AND A
JR NZ,NO_SCR2
LD BC,#4180
NO_SCR2:
LD E,(IX+5) ; X coordinate
LD D,(IX+6)
ex de,hl
add hl,bc
; ex de,hl
ld b,(IX+3) ; ¢ëá®â 
ld c,(IX+4) ; è¨à¨­ 
LD A,(IX+7) ; Y coordinate
out (PORT_Y),a
ACC_SetBlockSize
ld (HL),c
ACC_Off
ld c,PORT_Y
sprite_2load_loop2:
ACC_CopyBlock
inc (hl)
; LD D,(HL)
; LD (HL),D
ACC_Off
inc a ; ¤®¡ ¢¨âì ᬥ饭¨¥ ¯® Y
out (c),a
djnz sprite_2load_loop2
ld bc,9
add ix,bc
bit 0,(ix-1)
jr z,loop_all_2
POP AF
OUT (PORT_Y),A
POP AF
OUT (SLOT3),A
POP AF
OUT (SLOT1),A
pop ix
ret
*/
;=======================================================================
; ; PAGE_SPRITE
; ; ADRESS SPRITE
; ; SIZE_H,SIZE_V
; ; HOR_PLACE
; ; WER_PLACE
; ; ATRIBUTE
FON_LOAD:
IN A,(SLOT0)
PUSH AF
IN A,(SLOT1)
PUSH AF
IN A,(SLOT3)
PUSH AF
IN A,(PORT_Y)
PUSH AF
LD A,#50
OUT (SLOT1),A
LD A,SYS_PAGE
OUT (SLOT3),A
LD A,(SYS_PAGE.RAMD_KEYS.G)
LD H, high SYS_PAGE.RAMD_FAT
LD L,A
EX AF,AF'
LD A,(HL)
OUT (SLOT0),A
LD HL,#C000 + BackPlane.RGBoffset
LD DE,(FON_SHIFT)
ADD HL,DE
LD DE,#4040
IN A,(RGMOD)
AND 1
JR NZ,NO_SCR3
LD DE,#4180
NO_SCR3:
EX AF,AF'
OUT (SLOT3),A
LD A,BackPlane.Height + BackPlane.OffsetY
OUT (PORT_Y),A
LD A,BackPlane.Scroll.Width
FON_LOOP:
EX AF,AF'
DI
ACC_SetBlockSize
LD B,0
ACC_CopyBlock
LD A,(HL)
LD (DE),A
INC H
INC D
ACC_SetBlockSize
LD C,#40
ACC_CopyBlock
LD A,(HL)
LD (DE),A
DEC H
DEC D
ACC_Off
EI
LD BC,BackPlane.Width
ADD HL,BC
BIT 7,H
JR NZ,NO_PGN
EXX
; IFN MODE_CBL : CALL PlayMusic : ENDIF
LD B,SYS_PAGE
LD C,SLOT0
IN L,(C)
OUT (C),B
LD C,SLOT3
OUT (C),L ; SLOT3 <-- SLOT0 <-- SYS_PAGE
LD C,SLOT0
LD H,2
LD L,(HL)
/*
LD C,SLOT0
LD H,2
LD A,(HL)
CP #FF
JR NZ,.setNextPage
; LD A,(RAMD_KEYS.G - #C000)
ld a,l
.setNextPage:
OUT (C),A
*/
OUT (C),L
EXX
SET 7,H
SET 6,H
NO_PGN:
IN A,(PORT_Y)
DEC A
OUT (PORT_Y),A
EX AF,AF'
DEC A
JR NZ,FON_LOOP
;SetBackgroundScrollShift:
;
LD A,(FON_SHIFT)
ADD_A:
ADD A,BackPlane.Scroll.Step
LD (FON_SHIFT),A
JR Z,YES_EXX
CP BackPlane.Scroll.Width
JR NZ,NO_EXX
YES_EXX:
LD A,(ADD_A+1)
NEG
LD (ADD_A+1),A
NO_EXX:
;
POP AF
OUT (PORT_Y),A
POP AF
OUT (SLOT3),A
POP AF
OUT (SLOT1),A
POP AF
OUT (SLOT0),A
ret
FON_SHIFT: DW BackPlane.Scroll.Width/2
;
;
SPRITE_LOAD: ; IX -  ¤à¥á ¤ ­­ëå á¯à ©â®¢
push ix
IN A,(SLOT1)
PUSH AF
IN A,(SLOT3)
PUSH AF
IN A,(PORT_Y)
PUSH AF
CALL NEXT_SPR
loop_all_1:
; IFN MODE_CBL : CALL PlayMusic : ENDIF
LD A,(IX+SPRITE_TBL.Slot)
OUT (SLOT3),A
ld a,(ix+SPRITE_TBL.Attribute) ; atributes
AND #0C
OR #50
out (SLOT1),a
LD BC,#4040
IN A,(RGMOD)
AND 1
JR NZ,NO_SCR1
LD BC,#4180
NO_SCR1:
LD L,(IX+SPRITE_TBL.X) ; X coordinate
LD H,(IX+SPRITE_TBL.X+1)
add hl,bc
EX DE,HL
LD L,(IX+SPRITE_TBL.Address) ;  ¤à¥á ¤ ­­ëå
LD H,(IX+SPRITE_TBL.Address+1)
/*
; ld c,(IX+SPRITE_TBL.Width)
LD A,(IX+SPRITE_TBL.Y)
add a,(ix+SPRITE_TBL.Height)
dec a
out (PORT_Y),a
ld A,(IX+SPRITE_TBL.Height)
*/
LD A,(IX+SPRITE_TBL.Width)
LD (blk_size),A
LD A,(IX+SPRITE_TBL.Y)
LD C,(ix+SPRITE_TBL.Height)
add a,c
dec a
out (PORT_Y),a
ld a,c
DI
ACC_SetBlockSize
blk_size+*: ld c,0
; ld c,(IX+SPRITE_TBL.Width)
ACC_Off
LD B,0
EXX
LD C,PORT_Y
IN E,(C)
LD B,A
sprite_load_loop:
EXX
ACC_CopyBlock
LD A,(HL)
LD (DE),A
ACC_Off
ADD HL,BC
EXX
DEC E
OUT (C),E
DJNZ sprite_load_loop
EI
EXX
ld bc,SPRITE_TBL
add ix,bc
bit 0,(ix-1)
jr z,loop_all_1
POP AF
OUT (PORT_Y),A
POP AF
OUT (SLOT3),A
POP AF
OUT (SLOT1),A
pop ix
ret
NEXT_SPR:
/*
;SetBackgroundScrollShift:
LD A,(FON_SHIFT)
ADD_A:
ADD A,BackPlane.Scroll.Step
LD (FON_SHIFT),A
JR Z,YES_EXX
CP BackPlane.Scroll.Width
JR NZ,NO_EXX
YES_EXX:
LD A,(ADD_A+1)
NEG
LD (ADD_A+1),A
NO_EXX:
*/
LD A,SYS_PAGE
OUT (SLOT3),A
LD H, high SYS_PAGE.RAMD_FAT
LD A,(NEXT_SPRITE)
LD L,A
LD L,(HL)
LD (IX+SPRITE_TBL.Slot),L
LD (IX+SPRITE_TBL.Slot+SPRITE_TBL),L
LD (IX+SPRITE_TBL.Slot+SPRITE_TBL*2),L
LD A,L
LD (NEXT_SPRITE),A
INC A
RET NZ
LD A,(SYS_PAGE.RAMD_KEYS.F)
LD (IX+SPRITE_TBL.Slot),A
LD (IX+SPRITE_TBL.Slot+SPRITE_TBL),A
LD (IX+SPRITE_TBL.Slot+SPRITE_TBL*2),A
LD (NEXT_SPRITE),A
RET
NEXT_SPRITE: db #FF
;
;
; SOUND_PG: DB #FF
; SND_P: DB #FF
;===============================================[v]
IFN MODE_CBL
;===============================================
/* ¤®¤¥« âì ­  áâ àë© ¢ à¨ ­â ¡¥§ ¯à¥à뢠­¨©
; old
;SND_A: DW #C000
PlayMusic:
PUSH AF
PUSH HL
IN A,(#FE)
COV_ADR+*: XOR 0
AND #80
JP NZ,NO_LD_SND
PUSH DE
PUSH BC
LD A,(COV_ADR)
CPL
LD B,A
SND_A+*: LD HL,#C000
LD C,CBL.OUT
LD D,16
IN A,(SLOT3)
LD E,A
LD A,(SND_P)
OUT (SLOT3),A
L_DDX:
OUTI
OUTI
OUTI
OUTI
OUTI
OUTI
OUTI
OUTI
DEC D
JR NZ,L_DDX
LD (SND_A),HL
ld a,b
cpl
ld (COV_ADR),a
LD A,H
AND A
JR NZ,NO_SNDP
LD H, high RAMD_FAT
LD A,(SND_P)
LD L,A
LD A,SYS_PAGE
OUT (SLOT3),A
LD A,(HL)
LD (SND_P),A
INC A
LD HL,#C000
LD (SND_A),HL
JR NZ,NO_SNDP
LD A,(RAMD_KEYS.H)
LD (SND_P),A
NO_SNDP:
LD A,E
OUT (SLOT3),A
POP BC
POP DE
NO_LD_SND:
POP HL
POP AF
RET
; old end
*/
PlayMusic:
LD A,2
OUT (BorderColor),A
PUSH HL
PUSH DE
PUSH BC
ld a,halt_loop_repeat-halt_JP_address-1 ; repeat loop
ld (halt_JP_address),a
COV_ADR+*: LD A,0
CPL
LD B,A
SND_A+*: LD HL,#C000
LD C,CBL.OUT
LD D,16
IN A,(SLOT3)
LD E,A
SND_P+*: LD A,0
OUT (SLOT3),A
L_DDX:
OUTI
OUTI
OUTI
OUTI
OUTI
OUTI
OUTI
OUTI
DEC D
JR NZ,L_DDX
LD (SND_A),HL
ld a,b
cpl
ld (COV_ADR),a
LD A,H
AND A
JR NZ,NO_SNDP
LD H, high SYS_PAGE.RAMD_FAT
LD A,(SND_P)
LD L,A
LD A,SYS_PAGE
OUT (SLOT3),A
LD A,(HL)
LD (SND_P),A
INC A
LD HL,#C000
LD (SND_A),HL
JR NZ,NO_SNDP
LD A,(SYS_PAGE.RAMD_KEYS.H)
LD (SND_P),A
; ld hl,_lastPageMuzOffset
; LD (SND_A),HL
NO_SNDP:
LD A,E
OUT (SLOT3),A
POP BC
POP DE
POP HL
LD A,(save_border)
OUT (BorderColor),A
POP AF
EI
RETI
;===============================================
ELSE
;===============================================
;
;===============================================
; new
PlayMusic:
LD A,2
OUT (BorderColor),A
PUSH HL
push de
push bc ; !TODO ®¯â¨¬¨§¨à®¢ âì
ld a,halt_loop_repeat-halt_JP_address-1 ; repeat loop
ld (halt_JP_address),a
IN A,(SLOT1)
LD E,A
SND_P+1:
LD A,0
OUT (SLOT1),A
ld a,CBL.BUFFER_PAGE
ld bc,SLOT3
in b,(c)
out (c),a
SND_A+1:
ld hl,#4000
ld d,#C0
ACC_SetBlockSize
ld a,#80
ACC_CopyBlock
ld a,(hl)
ld (de),a
ACC_Off
out (c),b
xor a
ld hl,(SND_A)
ld bc,128
adc hl,bc
LD (SND_A),HL
LD A,H ; !TODO ®¯â¨¬¨§¨à®¢ âì
CP #80
JR C,NO_SNDP
LD H, high SYS_PAGE.RAMD_FAT - #80
LD A,(SND_P)
LD L,A
LD A,SYS_PAGE
OUT (SLOT1),A
LD A,(HL)
LD (SND_P),A
LD HL,#4000
checkLastPage+1:
;INC A
cp 0
jp nz,1F
LD A,(SYS_PAGE.RAMD_KEYS.H-#8000)
LD (SND_P),A
ld hl,_lastPageMuzOffset
1: LD (SND_A),HL
NO_SNDP:
LD A,E
OUT (SLOT1),A
POP BC
pop de
POP HL
LD A,(save_border)
OUT (BorderColor),A
POP AF
EI
RETI
; new end
;===============================================
ENDIF
;===============================================[^]
;
COVOX_OFF:
LD A,#80
LD BC,CBL.SYS_PORT
OUT (c),a
MUTE_CBL:
ld a,#80
LD BC,CBL.OUT
.loop:
OUT (C),A
DJNZ .loop
RET
;
;-----------[Ž¡à ¡®â稪 ¯à¥à뢠­¨ï]-----------
IM2_Proc:
DI
PUSH AF
; IF MODE_CBL
IN A,(CBL.INT_PORT)
RLCA
/*
JR NC,.set_nop
CALL PlayMusic
jp .keys_check
*/
JP C,PlayMusic
LD A,2
LD (save_border),a
OUT (BorderColor),A
.set_nop:
xor a ; exit from loop
ld (halt_JP_address),a
; ENDIF
.keys_check:
ld a,+(high ZXKeys.Line_7) & +(high ZXKeys.Line_0)
in a,(ZXKeys)
and 1
jp nz,.exit_int
ld (.exit_key),a
.exit_int:
pop af
EI
RETI
.exit_key:
BYTE #FF
;---------------------------------------------
;
;
;---------------------------------------------
; ”ã­ªæ¨ï ¢®§¢à é ¥â 䨧.­®¬¥à ¯®á«¥¤­¥© áâà ­¨æë ¡«®ª 
; A <-- ID ¡«®ª 
; NC --> A = 䨧.­®¬¥à ¯®á«¥¤­¥© áâà ­¨æë ¡«®ª 
; CF --> å¥à ¥£® §­ ¥â, ®è¨¡ª  ª ª ï-â®
GetLastPageNumber:
ld h, high SYS_PAGE.RAMD_FAT
inc a
ld l,a
ld a,SYS_PAGE
ld c,SLOT3
in b,(c)
push bc
out (c),a
ld a,#FF
ld bc,#100
cpir
scf
jp PE,.exit
dec hl
dec hl
ld a,(hl)
and a
.exit:
pop bc
out (c),b
ret
;---------------------------------------------
;
;
;----------------[EXIT to DSS]----------------
EXIT_TO_DSS:
DI
CALL COVOX_OFF
CALL RMD_UNMAP
LD A,1
LD HL,RAMBlkIDs
.loop_mem:
PUSH HL
PUSH AF
LD A,(HL)
LD C,Dss.FreeMem
RST ToDSS
DI
POP AF
POP HL
INC A
INC HL
CP FilesTBL.END+1
JR C,.loop_mem
.no_mem:
IF MODE_CBL && MUSIC_22khz
1: CALL MemHack.restore
; JR NC,1F
; LD A,R
; AND 7
; OUT (BorderColor),A
; JR 1B
1: ;
ENDIF
vid_mod_save+*: ld a,0
scr_num_save+*: ld b,0
ld c,Dss.SetVMod
rst ToDSS
ld de,0
ld hl,#2050
ld b,7
ld a,32
ld c,Dss.Clear
RST ToDSS
ld hl,START_MSG
ld c,Dss.PChars
RST ToDSS
;-----[Clean keyboard buffer]-----
clean_kbd_buf:
IN A,(Z84.SIO.Ch_A.Ctrl)
BIT 0,A
jr z,.exit
IN A,(Z84.SIO.Ch_A.Data)
jr clean_kbd_buf
.exit:
;---------------------------------
set_msg+1:
ld hl,EXIT_MSG
ld c,Dss.PChars
RST ToDSS
EXIT_ram_drv+2: ;¢®§¢à â ०¨¬  à ¬¤¨áª®¢
LD BC,BIOS.SWAP_RAM_DRIVES.ZX
RST ToBIOS
IM 1
.loop_exit:
LD B,0
LD C,Dss.Exit
RST ToDSS
JR .loop_exit
;---------------------------------------------
;
;-------[§ £à㧪  à¥áãàᮢ ¨£àë]--------
Load_Resources:
IF MODE_CBL && MUSIC_22khz
CALL MemHack.free
ENDIF
in a,(SLOT3)
ld (.SavePage),a
IF MODE_CBL && MUSIC_22khz
; LD B,SYS_PAGE.RAMD_KEYS.NUM+1
; .RMD_Loop:
; PUSH BC
; LD A,B
; DEC A
; LD C,BIOS.FreeMemRMD
; RST ToBIOS
; POP BC
; DJNZ .RMD_Loop
ENDIF
LD B,FilesTBL.END
LD DE,FilesTBL
LD HL,RAMBlkIDs
;---------[<5B> ç «® 横« ]
.LR_loop:
PUSH BC ;++áçñâ稪
PUSH HL ;++¡ãä¥à ¯®¤ BlockID
ex de,hl
ld b,(hl) ; FilesTBL
inc hl
ld (.FileName),hl
; B - à §¬¥à ¡«®ª  ¢ áâà ­¨æ å
ld c,Dss.GetMem
rst ToDSS
JR C,.error
di
; A - ¨¤¥­â¨ä¨ª â®à ¡«®ª  ¯ ¬ïâ¨
pop hl ;--¡ãä¥à ¯®¤ BlockID
ld (hl),a
inc hl
push hl ;++¡ãä¥à ¯®¤ BlockID
; A - ¨¤¥­â¨ä¨ª â®à ¡«®ª 
ld hl,Temp_Buffer
ld c,BIOS.GetMemBlkPages
rst ToBIOS
di
; B - ç¨á«® áâà ­¨æ ¢ ¡«®ª¥
; HL -  ¤à¥á ¡ãä¥à , ¢ ¡ãä¥à¥ ᯨ᮪
; 䨧¨ç¥áª¨å áâà ­¨æ ¯® ¯®à浪ã,
; § ª ­ç¨¢ î騩áï ¡ ©â®¬ 0FFh
push hl ;++¡ãä¥à ᮠᯨ᪮¬ áâà ­¨æ
push bc ;++᪮«ìª® áâà ­¨æ £à㧨¬
.FileName+*: ld hl,0
ld a,1
ld c,Dss.Open
rst ToDSS
di
ld (.TempFileID),a
pop bc ;--᪮«ìª® áâà ­¨æ £à㧨¬
pop hl ;--¡ãä¥à ᮠᯨ᪮¬ áâà ­¨æ
;---[ç¨â ¥¬]
.readloop:
ld a,(hl)
out (SLOT3),a
inc hl
push hl ;++¡ãä¥à ᮠᯨ᪮¬ áâà ­¨æ
push bc ;++᪮«ìª® áâà ­¨æ £à㧨¬
.TempFileID+*: ld a,#FF ; ä ©«®¢ë© ¬ ­¨¯ã«ïâ®à
LD HL,#C000 ;  ¤à¥á ¢ ¯ ¬ïâ¨
LD DE,#4000 ; ª®«¨ç¥á⢮ ç¨â ¥¬ëå ¡ ©â
LD C,Dss.Read
rst ToDSS
DI
pop bc ;--᪮«ìª® áâà ­¨æ £à㧨¬
pop hl ;--¡ãä¥à ᮠᯨ᪮¬ áâà ­¨æ
DJNZ .readloop
;---[]
;---[§ ªà뢠¥¬]
ld a,(.TempFileID)
ld c,Dss.Close
rst ToDSS
di
;---[]
ld de,(.FileName)
ld hl,13
add hl,de
ex de,hl
POP HL ;--¡ãä¥à ¯®¤ BlockID
POP BC ;--áçñâ稪
DJNZ .LR_loop
;---------[]
;-----------[Œ ¯¯¨­£ ­  <20>€Œ-„¨áª¨]
CALL RMD_UNMAP
;---[Œ ¯¯¨¬ ­  <20>€Œ-„¨áª¨]
LD A,1 ; <20>®¬¥à à ¬¤¨áª  F:
LD HL,RAMBlkIDs
.loop_map:
PUSH HL
PUSH AF
LD B,(HL)
LD C,BIOS.BLK_TO_RAMD
RST ToBIOS
DI
POP AF
POP HL
INC A
INC HL
CP FilesTBL.END+1
JR C,.loop_map
;---[]
;-----------[]
;-------------[‚®§¢à â]
.SavePage+1: ld a,0
out (SLOT3),a
IF MODE_CBL
IF MUSIC_22khz
ld a,(RAMBlkIDs + _ramDiskNumForMuz)
ld bc, +( _memPagesForMuz -1) * 256 + BIOS.GetMemPage
rst ToBIOS
;!FIXIT ᤥ« âì ¯à®¢¥àªã ­  ®è¨¡ªã
ld (checkLastPage),a
ENDIF
ENDIF
AND A
RET
.error:
POP HL
POP HL
LD A,(.SavePage)
out (SLOT3),a
RET
;-------------[]
;---[®á¢®¡®¦¤ ¥¬ à ¬¤¨áª¨ F..I]
RMD_UNMAP:
LD B,FilesTBL.END
.loop_unmap:
PUSH BC
LD A,B
LD C,BIOS.RAMD_CLEAR
RST ToBIOS
DI
POP BC
DJNZ .loop_unmap
RET
;---[]
;
;---[ MemHack ]
IF MODE_CBL && MUSIC_22khz
MemHack:
.free: LD A,ZX_RAM_ID
LD C,BIOS.FreeMem
JP ToBIOS
; IN A,(SLOT3)
; EX AF,AF'
; LD A,SYS_PAGE
; OUT (SLOT3),A
; LD HL,SYS_PAGE.RAMD_FAT
; LD DE,.Buff
; xor a
; ACC_SetBlockSize
; cp #10
; ACC_CopyBlock
; cp (hl)
; ld (de),a
; ACC_FillOneByte
; ld (hl),a
; ACC_Off
; LD DE,.Buff + #10
; LD L,DCP_PAGE ; #C240
; LD A,(HL)
; LD (DE),A
; INC DE
; LD (HL),#50 ; Video Page
; INC L ; #C241
; xor a
; ACC_SetBlockSize
; cp #07
; ACC_CopyBlock
; cp (hl)
; ld (de),a
; ACC_FillOneByte
; ld (hl),a
; ACC_Off
; EX AF,AF'
; OUT (SLOT3),A
; RET
.restore:
LD BC,4*256 + BIOS.REINIT
JP ToBIOS
; IN A,(SLOT3)
; EX AF,AF'
; LD A,SYS_PAGE
; OUT (SLOT3),A
; LD DE,SYS_PAGE.RAMD_FAT
; LD HL,.Buff
; ACC_SetBlockSize
; cp #10
; ACC_CopyBlock
; cp (hl)
; ld (de),a
; ACC_Off
; LD HL,.Buff + #10
; LD E,DCP_PAGE ; #C240
; LD A,(HL)
; LD (DE),A
; INC HL
; INC E
; ACC_SetBlockSize
; cp #7
; ACC_CopyBlock
; cp (hl)
; ld (de),a
; ACC_Off
; EX AF,AF'
; OUT (SLOT3),A
;RET
.Buff: BLOCK #10+1+7, #FF
ENDIF
;------------[]
;
save_border: BYTE 0
;---[’ ¡«¨æ  § £à㧪¨ ä ©«®¢]
; ¤«¨­  ¢ áâà ­¨æ å 01 ¡ ©â
; ¨¬ï ä ©«  13 ¡ ©â
; ¥á«¨ ¨¬ï ä ©«  < 12 ᨬ¢®«®¢,
; â® ¤®¡¨âì ­ã«ï¬¨ ¤® 12
; RAM DISKS OLD:
; E - TRD
; F - PIC.DAT = RAIDENXX.DAT
; G - ARMORS2.BMP = BACKGRND.BMP
; H - RAYSTO1.BMP = RAIDEN01.BMP
; I - MISS2.CBL = MUSIC_01.CBL
;
; RAM DISKS NEW:
; E - TRD
; F - PIC.DAT = RAIDENXX.DAT
; G - ARMORS2.BMP = BACKGRND.BMP
; H - MISS2.CBL = MUSIC_01.CBL
FilesTBL:
DZ 27, 'RAIDENXX.DAT' ; DISK F:
; DZ 07, 'BACKGRND.BMP' ; DISK G:
IF BACKPLANE_BMP
DZ BackPlane.SizePages, 'BACKGRN1.RGB' ; DISK G:
ELSE
DZ BackPlane.SizePages, 'BACKGRN0.RGB' ; DISK G:
ENDIF
; DZ 02, 'RAIDEN01.BMP' ; DISK H: ; RAIDEN.PAL
IF MODE_CBL && MUSIC_22khz
DZ _memPagesForMuz, 'MUSIC_02.CBL' ; DISK H:
ELSE
DZ _memPagesForMuz, 'MUSIC_01.CBL' ; DISK H:
ENDIF
.END EQU ($-FilesTBL)/14 ; ª®«¨ç¥á⢮ ä ©«®¢
IF BACKPLANE_BMP
BackPlane.FileName: DZ 'BACKGRN1.PAL'
ELSE
BackPlane.FileName: DZ 'BACKGRN0.PAL'
ENDIF
RaidenSprite.FileName: DZ 'RAIDEN.PAL '
RAMBlkIDs: BLOCK FilesTBL.END,0
Temp_Buffer: BLOCK _memPagesForMuz + 1,#FF ; „«¨­  ¢ ¡«®ª å á ¬®£® ¡®«ì讣® ¨§ ä ©«®¢ ¢ëè¥ + 1
START_MSG: DB 13,10,13,10
DB 'Mortal Kombat demo by Ivan Mak. 2002 year.',13,10
DZ 'EXE v.',MK_VERSION,' by Anatoliy Belyanskiy. ',BUILD_DATE,' (',#91,') Sprinter Team.',13,10,13,10
LOADING_MSG: DZ 'Loading resources, please wait...',13,10
NO_FREE_MEM: DZ 'ERROR: No free memory to load resources!',13,10
EXIT_MSG: DZ 'All done)))',13,10
;---[]
;
ASSERT IM2_Handler>$, "The code leaks into the IM2 byte address!"
;