1
0
mirror of https://github.com/Tolik-Trek/DOOM2.git synced 2026-06-15 09:01:34 +03:00
DOOM2/D2_FRAM.asm
2026-05-15 04:35:58 +10:00

2125 lines
29 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.

DEVICE ZXSPECTRUM4096 ; ¬®¤¥«ì á 4 ¬¥âà ¬¨ ¯ ¬ïâ¨
MMU 0 e, 1 ; ¯¥à¢ ï áâà ­¨æ  ¢ ¡ ­ªã 0 ¨ ¯à®¢¥àª  ­  £à ­¨æë
OUTPUT './Build/DOOM2/d2_fram.bin'
;
SND_READ_SECTORS EQU 4
/*
;------------[<5B><EFBFBD>…„…œ!!!]------------
;---------------------------------------
*/
ORG #1000
Module__D2_FRAM__Start EQU $
;
TRACE: IN A,(SLOT1)
LD (TRACE_RET_SLOT1),A
IN A,(SLOT3)
LD (TRACE_RET_SLOT3),A
LD A,#50
OUT (SLOT3),A
LD BC,#100
OUT (C),C ; Œ€˜<E28099> 1:1
LD DE,(SCREEN_1)
LD HL,(ANGLE_M)
ADD HL,HL
; ADD HL,HL
LD A,H
AND #3F
OR #40
BIT 6,H
LD H,A
RES 6,L
LD A,(SKY_1)
JR Z,NO_SKY_2
LD A,(SKY_2)
NO_SKY_2:
OUT (SLOT1),A
;LD A,0 ;????????? ­¥ ­ã¦­®?
LD C,80
SKY_LOOP_1:
ACC_SetBlockSize
LD A,0
ACC_CopyBlock
LD B,(HL)
ACC_SetBlockSize
LD B,#80
ACC_Off
;XOR A
OUT (PORT_Y),A
ACC_CopyScreenBlock
LD (DE),A
ACC_Off
INC DE
INC DE
OUT (PORT_Y),A
ACC_CopyScreenBlock
LD (DE),A
ACC_Off
DEC DE
OUT (PORT_Y),A
ACC_CopyScreenBlock
LD (DE),A
ACC_Off
INC DE
INC DE
OUT (PORT_Y),A
ACC_CopyScreenBlock
LD (DE),A
ACC_Off
INC DE
INC H
BIT 7,H
JR Z,NO_NEXT_SKY
RES 7,H
SET 6,H
CALL SOUND
LD A,(SKY_1)
LD B,A
IN A,(SLOT1)
CP B
LD A,B
JR NZ,NO_SKY_2X
LD A,(SKY_2)
NO_SKY_2X:
OUT (SLOT1),A
NO_NEXT_SKY:
DEC C
JR NZ,SKY_LOOP_1
CALL SOUND
EXX
SCREEN_1+1:
LD DE,ScreenStartAddress ; ­ ç «® íªà ­ 
LD C,0 ;!!!!!!!!!!!!!!!!!!!!!!!!!!
EXX
;
ANGLE_M+1:
LD HL,0 ; ­ ç «ì­ë© 㣮« * 32
;
LD A,H
RLCA
RLCA
AND 3
ADD A,TABLE_W/256
LD D,A ; ⥪ã騩 ª¢ ¤à ­â
SET 6,H
RES 7,H ; HL - ­  â ¡«¨æ¥!!!
LD B,40 ; ç¨á«® «ã祩 âà áá¨à®¢ª¨ ¤¥«¥­­®¥ ­  8
TRACE_NEXT_:
;
EXX
LD HL,(PLACE_L) ; ⥪ã饥 ¯®«®¦¥­¨¥ ¢ â ¡«¨æ¥
INC HL
LD A,(HL)
LD (PLACE_L1),A
LD (PLACE_L2),A
EXX
;
PLACE_L+1:
LD A,(TABLE_TRACE+10) ; â®­ª®¥ ¯®«®¦¥­¨¥ - ¯®«®¦¥­¨¥ ¢ ª¢ ¤à â¥
;
OUT (SLOT1),A
LD (CONT_PAGE),A
; JR TRACE_LOOP
TRACE_LOOP:
LD A,#50
OUT (SLOT3),A
XOR A
OUT (PORT_Y),A
REPT 16
LD E,(HL) ; ¯¥à¢ë© ¨ ¤ «¥¥ á«¥¤ãî騩 ªã¡¨ª
LD A,(DE) ; ¥áâì ¨«¨ ­¥â?
AND A
JR NZ,TRACE_CONT ; ¥á«¨ ¥áâì, à¨á®¢ âì!!
INC L
ENDR
PURE_LINE:
EXX
ACC_SetBlockSize
LD A,#80 ; ¯ãáâ ï á⥭ª 
ACC_Off
;LD (DE),A ; LINE-Z-Buffer
OUT (PORT_Y),A
;
LD A,(COLOR_LO)
;
ACC_FillScreenOneByte
LD (DE),A
ACC_Off
LD A,#70 ; Z-Buffer
LD (DE),A
EXX
;
JR NEXT_ANGLE
; âà áá¨à®¢ª  § ª®­ç¥­ , áâ¥­ë ­¥â.
TRACE_CONT:
; HL - â ¡«¨æ 
; A - ­®¬¥à á⥭ª¨
;
EXX
EX AF,AF' ;­®¬¥à á⥭ª¨
PLACE_L1+1: LD A,5
OUT (SLOT1),A ; á«¥¤ãî饥 ¯®«®¦¥­¨¥ ¢ â ¡«¨æ¥
; LD C,0
LD B,1
OUT (C),C ; Œ€˜<E28099> 1:1
EXX
;
SET 4,L
LD A,(HL) ; ­®¬¥à «¨­¨¨
;
EXX
LD H,A
; LD L,0
LD L,C
SET 6,H
RES 7,H
EX AF,AF'
OUT (SLOT1),A ; á⥭ª . á⥭ª  à áª¨¤ ­  ­  16 ª¨«®¡ ©â
ACC_SetBlockSize
LD A,#40 ; ¢§ïâì 64 ¡ ©â 
ACC_CopyBlock
LD A,(HL) ; ¢§ïâì ­¥¬ áèâ ¡¨à®¢ ­­®!
ACC_Off ; á⥭ª  ¢ އ“  ªá¥«¥à â®à !
PLACE_L2+1: LD A,5
OUT (SLOT1),A ; á«¥¤ãî饥 ¯®«®¦¥­¨¥
EXX
;
RES 4,L
LD A,(HL) ; A - ¢ëá®â 
; LD A,80H
;
EXX
LD H,TABLE_X/256
LD L,A ; ¢ëá®â  TABLE_X - â ¡«¨æ  ¢ëá®â
LD B,(HL) ; áâ àè ï ç áâì ª®í䍿¨¥­â 
; ld b,0
INC H
LD L,(HL) ; ¬« ¤è ï ç áâì ª®í䍿¨¥­â /ᬥ饭¨¥ ¢ á⥭ª¥
; LD C,0
OUT (C),L ; ¬ áèâ ¡¨à®¢ ­¨¥
; OUTI ; B 㬥­ìè ¥âáï á­ ç « !
BIT 7,A
JR Z,HIGH_1 ; 64 â®çª¨, ­¥ ­  ¢¥áì íªà ­
; <64 â®çª¨, ­  ¢¥áì íªà ­
XOR A
OUT (PORT_Y),A ; á á ¬®£® ­ ç « 
ACC_SetBlockSize
LD (DE),A ; 256 ¡ ©â ˆ LINE-Z-Buffer!!!!
ACC_Off
LD A,#58
OUT (SLOT3),A
ACC_CopyScreenBlock
LD (DE),A ; ”ˆƒ€Š‘ ¢áî «¨­¨î!!!
ACC_Off
XOR A
LD (DE),A ; LINE-Z-Buffer!!!!
EXX
;
JR NEXT_ANGLE
HIGH_1:
; A - ¢ëá®â , á ª®â®à®© à¨áã¥âáï á⥭ª 
ACC_SetBlockSize
LD (DE),A ; ç¨á«® â®ç¥ª ¯®â®«ª  ¨ ¯®« ! & LINE-Z-Buffer
ACC_Off
NEG ; ¯®«ãç¨âì ¯®«®¦¥­¨¥ ­ ç «  ¯®« 
OUT (PORT_Y),A
LD L,A
LD A,#58
OUT (SLOT3),A
; LD A,#06 ; 梥⠯®« 
; LD A,#5F ; 梥⠯®«  á¥àë©
; LD A,#CF ; 梥⠯®«  ᨭ¨©
COLOR_LO+1: LD A,#2F ; 梥⠯®«  ⥬­®ªà á­ë©
;
ACC_FillScreenOneByte
LD (DE),A ; à¨á®¢ âì ¯®«
ACC_Off
; LD A,11 ; 梥⠯®â®«ª 
;COLOR_HI EQU $-1
; ACC_FillScreenOneByte
; LD (DE),A ; à¨á®¢ âì ¯®â®«®ª
; ACC_Off
LD A,L
NEG
OUT (PORT_Y),A
LD A,L
; IN A,(PORT_Y)
ADD A,A
; NEG ; ¢ë¢®¤¨¬ë© à §¬¥à á⥭ª¨
; á⥭ª  ¢  ªá¥«¥à â®à¥!
ACC_SetBlockSize
LD (DE),A ;!!!!! ¯à¨ª®«ì­®
ACC_CopyScreenBlock
LD (DE),A ; ¯®«®¦¨âì á⥭ªã!
ACC_Off
EXX ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
NEXT_ANGLE:
EXX
INC DE
LD A,E
AND 7
EXX
JR NZ,NO_TEST
DEC B
JR Z,TRACE_END
NO_TEST:
;
CONT_PAGE+1: LD A,0
;
OUT (SLOT1),A
LD A,L
AND #E0
ADD A,32
LD L,A
JP NZ,TRACE_LOOP
CALL SOUND ; ¨£à âì ¬ã§ëªã ­  ª®¢®ªá¡« áâ¥à¥!!!
INC H
BIT 7,H
JP Z,TRACE_LOOP
PUSH HL
PUSH BC
;
CORNER_1+1: LD A,#0F
;
AND #0F
RRCA
RRCA
LD C,A
RRCA
RRCA
RRCA
RRCA
OR C
AND #0F
; XOR 03H
XOR KWADR_CONST
LD C,A
LD B,0
LD HL,TABLE_TRACE
ADD HL,BC
ADD HL,BC
LD (PLACE_L),HL ; <20>ŽŽ… â®­ª®¥ ¯®«®¦¥­¨¥
POP BC
POP HL
INC D
RES 2,D
LD HL,#4000
JP TRACE_NEXT_
TRACE_END:
;
TRACE_RET_SLOT3+1: LD A,0
;
OUT (SLOT3),A
;
TRACE_RET_SLOT1+1: LD A,5
;
OUT (SLOT1),A
LD A,0
OUT (PORT_Y),A
RET
;
;***************************************
;
PRECALC_PLACE:
LD HL,(ANGLE_A)
LD A,L
AND 0E0H
LD L,A
LD (ANGLE_M),HL
LD A,(Y_COORD+1)
AND 3
; XOR 3
; XOR C
LD C,A
LD A,(X_COORD+1)
RLCA
RLCA
AND 0CH
; XOR 0CH
XOR C
XOR 0FH
LD C,A
BIT 7,H
JR Z,NO_NEG
XOR 0FH
LD C,A
NO_NEG:
BIT 6,H
JR Z,NO_CORN1
RRCA
RRCA
LD C,A
RRCA
RRCA
RRCA
RRCA
OR C
AND #0F
KWADR_CONST EQU #03 ; #03/#0C
XOR KWADR_CONST
LD C,A
NO_CORN1:
LD (CORNER_1),A
LD B,0
LD HL,TABLE_TRACE
ADD HL,BC
ADD HL,BC
LD (PLACE_L),HL ; â®­ª®¥ ¯®«®¦¥­¨¥
RET
;
;***************************************
;
; A - ®â­®á¨â¥«ì­ë© ­®¬¥à áâà ­¨æë
SET_PICTURE:
LD C,SLOT1
IN B,(C)
PUSH BC
LD C,SLOT3
IN B,(C)
PUSH BC
PUSH AF
LD A,#50
OUT (C),A
CALL SOUND
;
ld bc,#0100 ; ¬ áèâ ¡¨à®¢ ­¨¥ - 1
OUT (C),C
LD DE,(SCREEN_1)
LD B,5 ; 5 <E28098><EFBFBD>ˆ
ACC_SetBlockSize
LD A,0 ; ¯® 256 ¡ ©â
ACC_Off
OUT (PORT_Y),A
POP AF
PIC_LOOP:
PUSH BC
PUSH AF
LD HL,TABLE_MAIN
ADD A,L
LD L,A
LD A,(HL)
OUT (SLOT1),A
LD HL,#4000
LD B,64
LOOP_PG:
ACC_CopyBlock
LD A,(HL)
ACC_CopyScreenBlock
LD (DE),A
ACC_Off
INC DE
INC H
DJNZ LOOP_PG
POP AF
INC A
POP BC
CALL SOUND
DJNZ PIC_LOOP
POP BC
OUT (C),B
POP BC
OUT (C),B
RET
NN_X: DB 0
;
;***************************************
;
CALC_NEW_PLACE:
LD HL,(ANGLE_A)
LD BC,(A_SPEED)
ADD HL,BC
LD BC,(LF_)
LD A,B
LD B,C
LD C,A
INC BC
LD C,0
ADD HL,BC
ADD HL,BC
ADD HL,BC
ADD HL,BC
LD (ANGLE_A),HL
LD A,H
ADD A,20+8
RRCA
RRCA
RRCA
AND 1EH
LD C,A
LD B,0
LD HL,TAB_ANGLE2
;TAB_SPEED EQU $-2
ADD HL,BC
LD E,(HL) ; step to Y
INC L
LD D,(HL) ; step to X
LD HL,(Y_COORD)
PUSH HL
LD BC,(Y_SPEED)
ADD HL,BC
LD BC,(UP_)
INC BC
LD C,0
LD A,B
AND A
JR Z,ZERO1
LD B,E
DEC A
; BIT 7,E ; ¯à®¢¥àª  ­  ®âà¨æ â¥«ì­®áâì è £ 
JR Z,ZERO1
LD A,B
NEG
LD B,A
ZERO1:
ADD HL,BC
LD (Y_COORD),HL
ADD HL,BC
LD BC,(Y_SPEED)
ADD HL,BC
PUSH DE
CALL MAP_PLACE
POP DE
POP HL
JR NC,CONT_MOVE1
LD (Y_COORD),HL
LD HL,(Y_SPEED)
LD A,H
CPL
LD H,A
LD A,L
CPL
LD L,A
INC HL
LD (Y_SPEED),HL
CONT_MOVE1:
LD HL,(X_COORD)
PUSH HL
LD BC,(X_SPEED)
ADD HL,BC
LD BC,(UP_)
INC BC
LD C,0
LD A,B
AND A
JR Z,ZERO2
LD B,D
DEC A
; BIT 7,D
JR Z,ZERO2
LD A,B
NEG
LD B,A
ZERO2:
ADD HL,BC
LD (X_COORD),HL
ADD HL,BC
LD BC,(X_SPEED)
ADD HL,BC
CALL MAP_PLACE
POP HL
JR NC,CONT_MOVE2
LD (X_COORD),HL
LD HL,(X_SPEED)
LD A,H
CPL
LD H,A
LD A,L
CPL
LD L,A
INC HL
LD (X_SPEED),HL
CONT_MOVE2:
RET
;
;***************************************
;
WEAPON_OUT:
IN A,(SLOT1)
PUSH AF
IN A,(SLOT3)
PUSH AF
;-------------[­ã¦­® «¨???]-
ld bc,#0100
OUT (C),C ; Œ€˜<E28099> 1:1
;---------------------------
LD A,(PAGE_WEAPON)
OUT (SLOT1),A
LD A,#58
OUT (SLOT3),A
WEAPON_SWITCH+1:
LD HL,#4500 ; ¯®«®¦¥­¨¥ á¯à ©â  ®àã¦¨ï ¢ áâà ­¨æ¥
;
LD DE,(SCREEN_1)
LD A,E
ADD A,100 ; ᬥ襭¨¥ á¯à ©â  ®àã¦¨ï ¯® £®à¨§®­â «¨
LD E,A
ACC_SetBlockSize
LD C,119 ; ¤«¨­  á¯à ©â  ®à㦨ï
ACC_Off
;-------------[­ã¦­® «¨???]-
LD A,#FF ; ­¨¦­ïï «¨­¨ï
;---------------------------
LD BC,#100
W_OUT_L:
LD A,#44
SUB H
OUT (PORT_Y),A
;
;------[®¯â¨¬¨§¨à®¢ âì?]----------------
OUT (C),C ; Œ€˜<E28099> 1:1, ­ ç¨­ âì á 0
ACC_CopyBlock
LD A,(HL)
ACC_Off
OUT (C),C ; Œ€˜<E28099> 1:1, ­ ç¨­ âì á 0
ACC_CopyBlock
LD (DE),A
ACC_Off
;---------------------------------------
;
INC H
BIT 7,H
JR Z,W_OUT_L
LD A,(WEAPON_SWITCH)
XOR #80
LD (WEAPON_SWITCH),A
POP AF
OUT (SLOT3),A
POP AF
OUT (SLOT1),A
RET
;
;***************************************
;
MAP_OUT:
CALL MAP_PLACE
IN A,(SLOT1)
PUSH AF
IN A,(SLOT3)
PUSH AF
LD A,(TABLE_WALL)
OUT (SLOT1),A
RES 4,H
; SET 5,H
PUSH HL
LD A,(HL)
PUSH AF
LD (HL),#F7
LD HL,#4000
LD DE,(SCREEN_1)
LD A,E
ADD A,8
LD E,A
MAP_LOOP_2:
LD A,#58
OUT (SLOT3),A
LD BC,#0100
OUT (C),C ; Œ€˜<E28099> 1:1
; IF NORM_ACC
LD B,16
LD A,184
MAP_LOOP_1:
ACC_SetBlockSize
LD C,0
ACC_CopyBlock
LD C,(HL)
ACC_SetBlockSize
LD C,#40
ACC_Off
INC H
REPT 4
OUT (PORT_Y),A
ACC_CopyBlock
LD (DE),A
ACC_Off
INC A
ENDR
DJNZ MAP_LOOP_1
; ELSE
; LD B,16
; LD A,184
; MAP_LOOP_1:
; ACC_SetBlockSize
; LD C,#40
; ACC_CopyBlock
; LD C,(HL)
; ACC_Off
; OUT (PORT_Y),A
; ACC_CopyBlock
; LD (DE),A
; ACC_Off
; INC A
; LD L,64
; ACC_CopyBlock
; LD C,(HL)
; ACC_Off
; OUT (PORT_Y),A
; ACC_CopyBlock
; LD (DE),A
; ACC_Off
; INC A
; LD L,64*2
; ACC_CopyBlock
; LD C,(HL)
; ACC_Off
; OUT (PORT_Y),A
; ACC_CopyBlock
; LD (DE),A
; ACC_Off
; INC A
; LD L,64*3
; ACC_CopyBlock
; LD C,(HL)
; ACC_Off
; OUT (PORT_Y),A
; ACC_CopyBlock
; LD (DE),A
; ACC_Off
; INC A
; INC H
; LD L,0
; DJNZ MAP_LOOP_1
; ENDIF
LD BC,240
EX DE,HL
ADD HL,BC
EX DE,HL
LD A,H
LD H,#60
CP #50
JR Z,MAP_LOOP_2
XOR A
OUT (PORT_Y),A
POP AF
POP HL
LD (HL),A
POP AF
OUT (SLOT3),A
POP AF
OUT (SLOT1),A
RET
;***************************************
;
; IX+0 - áâà ­¨æ  á⥭ª¨
; IX+1,2 -  ¤à¥á á⥭ª¨ ¢ áâà ­¨æ¥
; IX+3 - ¯®«®¦¥­¨¥ ¯® ¢¥à⨪ «¨ - § ¤ ¥â ¬ áèâ ¡
; IX+4,5 - ¯®«®¦¥­¨¥ ¯® £®à¨§®­â «¨
; IX+6,7 - reserved
; IX+8,9 - X-add-parameter (ª®í䍿¨¥­â ¬ áèâ ¡¨à®¢ ­¨ï ¯® Y)
; IX+10 - ॠ«ì­ ï è¨à¨­  á⥭ª¨ ???
; IX+11 - ॠ«ì­ ï ¢ëá®â  á⥭ª¨ ???
WALL: IN A,(SLOT3)
LD (WALL_SLOT3_RET),A
IN A,(SLOT1)
LD (WALL_SLOT1_RET),A
IN A,(PORT_Y)
LD (WALL_PORT_Y_RET),A
LD A,#5C
OUT (SLOT3),A
LD A,(IX+0) ; áâà ­¨æ  á⥭ª¨
OUT (SLOT1),A
EXX
LD C,0 ; ¯®àâ ¬ áèâ ¡ 
;
LD H,TABLE_X/256 ; â ¡«¨æ  ¢ëá®â ¨ ª®í䍿¨¥­â®¢ ¬ áèâ ¡¨à®¢ ­¨ï
LD L,(IX+3) ; ¯®«®¦¥­¨¥ ¯® Y / ®¯à¥¤¥«ï¥â ¢ëá®âã
LD A,(HL) ; ¬ áèâ ¡ - LOW
AND 3
LD (X_ADD),A
INC H
LD A,(HL) ; ¬ áèâ ¡ - HIGH
LD (X_ADD2),A
DEC H
;
LD A,L
ADD A,A
NEG ; è¨à¨­  ¯® £®à¨§®­â «¨
;
BIT 0,(IX+M_VAR3)
JR Z,NO_DEL2
RRA
AND #7F
NO_DEL2: BIT 1,(IX+M_VAR3)
JR Z,NO_DEL4
AND A
RRA
RRA
AND #3F
NO_DEL4:
EXX
LD B,A ; ॠ«ì­ ï è¨à¨­  á⥭ª¨???
; LD B,(IX+10) ; è¨à¨­  á⥭ª¨
LD C,0 ; X-start-LOW
; LD HL,(SCREEN_1)
LD E,(IX+4) ; -  ¤à¥á ¯® £®à¨§®­â «¨
LD D,(IX+5)
; ADD HL,DE
; LD A,E
; AND A
; BIT 7,D
; JR Z,WALL_NO_SCF
; SCF
; EX AF,AF' ; á¯àïâ âì ¢ AF - ¯ à ¬¥âà áç¥â稪  ¨ ä« £
; ; CF - á⥭ª  ­¥ ¤®è«  ¤® ªà ï
; ; ¢ A ᪮«ìª® «¨­¨© ¤® ­ ç «  íªà ­ 
;WALL_NO_SCF:
;
; LD HL,#0140
; AND A
; SBC HL,DE
; LD A,L ; ¢ A - ᪮«ìª® «¨­¨© ®áâ «®áì ¤® ª®­æ  íªà ­ ??
LD HL,(SCREEN_1)
ADD HL,DE
; LD A,(IX+3)
LD A,B
RRA
AND #7F ; à §¤¥«¨«¨ ­  2
LD E,A
; SUB 128
; LD E,A
LD D,0
SBC HL,DE
;!FIXIT ¯®á«¥ ¢ëç¨â ­¨ï ¢ HL  ¤à¥á ¯® ª®â®à®¬ã ¡ã¤¥â § ¯¨áì ¡«®ª , ¬®¦¥â § «¥§ âì ­  èà¨äâë
EX DE,HL
LD H,(IX+2) ; áâ à訩  ¤à¥á á⥭ª¨
LD L,(IX+1)
LD A,#58
OUT (SLOT3),A
WOLL_LOOP:
XOR A
OUT (PORT_Y),A
LD A,D
;!FIXIT âã⠯஢¥àª  ­  áâ à訩  ¤à¥á, ­® èà¨äâ ¬ íâ® ­¥ ¯®¬®¦¥â
CP #C3
JR NC,NO_WRITE_ALL ; ­¥ ¢ë¢®¤¨âì §  íªà ­ ¨ § ª®­ç¨âì
CP #C0
JR C,NO_WRITE_LINE ; ­¥ ¢ë¢®¤¨âì §  íªà ­
;!FIXIT âãâ ¬®¦¥â ç¨â âìáï ¨§ ®¡« á⨠èà¨ä⮢
LD A,(DE) ; ç⥭¨¥ ¨§ Z-Buffer
EXX
CP L
EXX
JR C,NO_WRITE_LINE
EXX
LD B,1
OUT (C),C ; ¬ áèâ ¡ - 1
ACC_SetBlockSize
LD B,#40 ; § ¤ âì ¤«¨­ã «¨­¨¨
ACC_Off
EXX
ACC_CopyBlock
LD A,(HL) ; ¢§ïâì «¨­¨î á⥭ª¨
ACC_Off
EXX
; L - ¢ëá®â  -128..0..127 !!!
LD B,(HL)
INC H
LD A,(HL) ; ¬ áèâ ¡ - HIGH
OUT (C),A
INC H
LD A,L
ADD A,A
JR NC,NO_Z_A1
XOR A
NO_Z_A1:
NEG
ACC_SetBlockSize
LD (HL),A ; § ¤ âì ¤«¨­ã «¨­¨¨
ACC_Off
DEC H
DEC H
LD A,L
EXX
BIT 7,A
JR Z,NO_Z_A
XOR A
NO_Z_A:
OUT (PORT_Y),A ; § ¤ âì ¯®àâ Y
;!FIXIT âãâ ¬®¦¥â ¯¨á âìáï ¢ ®¡« áâì èà¨ä⮢
ACC_CopyScreenBlock
LD (DE),A ; ¢ë¢¥á⨠«¨­¨î
ACC_Off
LD A,E
AND #0F
CALL Z,SOUND
;
NO_WRITE_LINE:
INC DE ; ­®¢®¥ §­ ç¥­¨¥ X
LD A,C
X_ADD2+1:
ADD A,0 ; X-add-parameter 2
LD C,A
X_ADD+1:
LD A,0 ; X-add-parameter
ADC A,H
LD H,A ; á«¥¤ãîé ï «¨­¨ï WOLL
DJNZ WOLL_LOOP
NO_WRITE_ALL:
;
WALL_PORT_Y_RET+1:
LD A,0
OUT (PORT_Y),A
WALL_SLOT3_RET+1:
LD A,0
OUT (SLOT3),A
WALL_SLOT1_RET+1:
LD A,5
OUT (SLOT3),A
RET
;
;
;***************************************
MAKE_MAP:
; HL - ¯®«®¦¥­¨¥ ¢ ⥪ã饩 ª àâ¥.
; ¤¥« âì ¢á¥ 4 ª¢ ¤à ­â 
PUSH HL
LD DE,(LAST_HL)
AND A
SBC HL,DE
LD A,H
OR L
JR NZ,CONT_MAKE
POP HL
LD (LAST_HL),HL
RET
LAST_HL: DW 0000
CONT_MAKE:
POP HL
LD (LAST_HL),HL
IN A,(SLOT1)
PUSH AF
LD A,(TABLE_WALL) ; ª àâ 
OUT (SLOT1),A
LD DE,TABLE_W ; ⥪ã騥 ª àâë
PUSH HL
LD C,16
MAP_L1:
LD B,16
MAP_L2:
LD A,(HL)
LD (DE),A
INC HL
INC E
DJNZ MAP_L2
LD A,#30
ADD A,L
LD L,A
LD A,H
ADC A,0
LD H,A
DEC C
JR NZ,MAP_L1
INC D
POP HL
PUSH HL
CALL SOUND
LD C,16
MAP_L3:
LD B,16
PUSH HL
MAP_L4:
LD A,(HL)
LD (DE),A
LD A,L
ADD A,#40
LD L,A
LD A,H
ADC A,0
LD H,A
INC E
DJNZ MAP_L4
POP HL
DEC HL
DEC C
JR NZ,MAP_L3
INC D
POP HL
PUSH HL
CALL SOUND
LD C,16
MAP_L5:
LD B,16
MAP_L6:
LD A,(HL)
LD (DE),A
DEC HL
INC E
DJNZ MAP_L6
LD A,L
SUB 30H
LD L,A
LD A,H
SBC A,0
LD H,A
DEC C
JR NZ,MAP_L5
INC D
POP HL
PUSH HL
CALL SOUND
LD C,16
MAP_L7:
LD B,16
PUSH HL
MAP_L8:
LD A,(HL)
LD (DE),A
LD A,L
SUB #40
LD L,A
LD A,H
SBC A,0
LD H,A
INC E
DJNZ MAP_L8
POP HL
INC HL
DEC C
JR NZ,MAP_L7
POP HL
POP AF
OUT (SLOT1),A
RET
MAP_PLACE:
; ¢ëç¨á«¥­¨¥ ¯®«®¦¥­¨ï ¨ ¯à®¢¥àª  ­ 
; ­ «¨ç¨¥ ¯à¥¯ïâá⢨©
PUSH DE
LD A,(X_COORD+1)
LD E,A
LD A,(Y_COORD+1)
LD D,A
CALL MAP_PLACE_X
RES 5,H ; ¯¥à¥ª«îç¨âì ª àâã ­  â ¡«¨æã á⥭®ª
POP DE
RET
MAP_PLACE_X:
; DE - Y:X -> HL ª àâ , E - ¯à¥¯ïâá⢨¥
LD A,E
RRCA
RRCA
AND #3F
LD L,A
LD A,D
RRCA
RRCA
AND #3F
RRCA
RRCA
LD H,A
AND #C0
OR L
LD L,A
LD A,H
AND #0F
; OR 50H
OR #70 ; ª àâ  á ¯à¥¯ïâá⢨ﬨ
LD H,A ; HL - Ѐ<C5A0>
IN A,(SLOT1)
PUSH AF
LD A,(TABLE_WALL)
OUT (SLOT1),A
LD A,(HL)
LD E,A
; RES 5,H ; ¯¥à¥ª«îç¨âì ª àâã ­  â ¡«¨æã á⥭®ª
AND A
JR Z,CONT_MOVE
POP AF
OUT (SLOT1),A
SCF
RET
CONT_MOVE:
POP AF
OUT (SLOT1),A
AND A
RET
;***************************************
;SOUND_PG: DB #FF
;COV_ADR: DB 0
;SND_P: DB #FF
SND_A: DW #C000
SND_STOP:
; ®áâ ­®¢¨âì ¬ã§ëªã
PUSH AF
PUSH BC
LD BC,SP_SND.CBL.COVOX_OUT
LD A,#80
SND_OUT_S:
OUT (C),A ; § ¡¨âì ª®¢®ªá-¡« áâ¥à ®¤­¨¬ §­ ç¥­¨¥¬
DJNZ SND_OUT_S
LD A,#C9 ; § ¡¨âì ¢®§¢à â ¢ ¯à®£à ¬¬ã ¨£à ­¨ï ¬ã§ëª¨
LD (SoundOnOff),A
POP BC
POP AF
RET
SND_CONTINUE: ; ¯à®¤®«¦¨âì ¬ã§ëªã
PUSH AF
PUSH BC
LD A,0 ; § ¡¨âì NOP ¢ ¯à®£à ¬¬ã ¨£à ­¨ï ¬ã§ëª¨
LD (SoundOnOff),A
POP BC
POP AF
RET
INIT_SOUND:
; ¨­¨æ¨ «¨§¨à®¢ âì ¬ã§ëªã
SND_INIT:
PUSH AF
PUSH HL
PUSH DE
PUSH BC
LD HL,0
LD (SND_C1),HL
LD (SND_C2),HL
; LD A,0
; LD (SND_P),A
LD A,0
LD (SoundOnOff),A
LD B,0
IN A,(SLOT3)
LD E,A
JR SND_INIT1
SOUND:
SoundOnOff:
NOP ; á ¢áâ ¢«ï¥âáï ª®¬ ­¤  RET ¤«ï ®âª«î祭¨ï §¢ãª  ¨ NOP ¤«ï ¢ª«î祭¨ï
SoundOnOff2:
NOP
PUSH AF
PUSH HL
SND_MORE:
CALL KBD_INT
IN A,(#FE)
;
COV_ADR+1:
XOR 0 ; covox  ¤à¥á
;
AND #80
JP NZ,NO_LD_SND
PUSH DE
PUSH BC
LD A,(COV_ADR)
CPL
LD B,A
LD HL,(SND_A)
LD C,SP_SND.CBL.COVOX_OUT
LD D,16
IN A,(SLOT3)
LD E,A
;!FIXIT DEBUG
; LD A,COLORS.CGA.BORDER.CYAN
; OUT (BorderColor),A
;
LD A,SP_SND.CBL.BUFFER_PAGE
OUT (SLOT3),A
L_DDX:
OUTI
OUTI
OUTI
OUTI
OUTI
OUTI
OUTI
OUTI
DEC D
JR NZ,L_DDX
;!FIXIT DEBUG
; LD A,COLORS.CGA.BORDER.BLACK
; OUT (BorderColor),A
;
LD (SND_A),HL
LD A,H
AND A
JP NZ,NO_SNDP
SND_INIT1:
PUSH IX
PUSH AF
EX AF,AF'
PUSH AF
PUSH HL
PUSH DE
PUSH BC
EXX
PUSH HL
PUSH DE
PUSH BC
AND A
LD HL,(SND_C1)
LD BC,SND_READ_SECTORS
SBC HL,BC
LD (SND_C1),HL
LD HL,(SND_C2)
LD C,B
SBC HL,BC
LD (SND_C2),HL
JR NC,NO_NEW_COUNT
; CALL SWITCH_SND
CALL CLEAR_COVOX
LD HL,SND_SEC1
LD DE,SND_S1
LD BC,8
LDIR
AND A
LD HL,(SND_C1)
LD BC,SND_READ_SECTORS
SBC HL,BC
LD (SND_C1),HL
LD HL,(SND_C2)
LD BC,0
SBC HL,BC
LD (SND_C2),HL
;_------[—⥭¨¥ ᥪâ®à®¢ á ¤¨áª ]-------
NO_NEW_COUNT:
LD HL,-SND_READ_SECTORS*512 ; ¡ãä¥à ¤«ï ¤ ­­ëå
LD A,SP_SND.CBL.BUFFER_PAGE ; áâà ­¨æ  ¡ãä¥à , ¥á«¨  ¤à¥á ¢ ®ª­¥ #C000
LD DE,(SND_S1) ;  ¡á®«îâ­ë© ­®¬¥à ᥪâ®à  Œ« ¤è ï ç áâì
LD IX,(SND_S2) ;  ¡á®«îâ­ë© ­®¬¥à ᥪâ®à  ‘â àè ï ç áâì
LD B,SND_READ_SECTORS ; ç¨á«® ç¨â ¥¬ëå ᥪâ®à®¢
LD C,BIOS.HDD_READ ; äã­ªæ¨ï ç⥭¨ï
CALL HDD_FN
;---------------------------------------
LD HL,(SND_S1)
LD BC,SND_READ_SECTORS
ADD HL,BC
LD (SND_S1),HL
LD HL,(SND_S2)
LD C,B
ADC HL,BC
LD (SND_S2),HL
LD HL,-SND_READ_SECTORS*512
CALL EFFECTS
POP BC
POP DE
POP HL
EXX
POP BC
POP DE
POP HL
POP AF
EX AF,AF'
POP AF
POP IX
LD HL,-SND_READ_SECTORS*512
LD (SND_A),HL
NO_SNDP:
LD A,B
CPL
LD (COV_ADR),A
LD A,E
OUT (SLOT3),A
; CALL INTERUPT
POP BC
POP DE
JP SND_MORE
NO_LD_SND:
POP HL
POP AF
RET
; YesSoundZero:
; PUSH AF
; PUSH HL
; CALL KBD_INT
; POP HL
; POP AF
; RET
EFFECTS:
LD DE,(EFF_)
LD A,D
CP #C0
RET NC
IN A,(SLOT2)
EX AF,AF'
LD A,(EFF_PAGE)
OUT (SLOT2),A
LD BC,SND_READ_SECTORS*512
EFF_LOOP:
LD A,(DE)
ADD A,(HL)
RRA
LD (HL),A
INC HL
INC DE
DEC C
JR NZ,EFF_LOOP
DJNZ EFF_LOOP
LD (EFF_),DE
EX AF,AF'
OUT (SLOT2),A
RET
;***************************************
CLEAR_Z_BUFER:
IN A,(SLOT3)
PUSH AF
LD A,#50
OUT (SLOT3),A
LD A,0
OUT (PORT_Y),A
LD DE,(SCREEN_1)
ACC_SetBlockSize
LD A,0
ACC_FillOneByte
LD (DE),A
INC D
ACC_SetBlockSize
LD B,#40
ACC_FillOneByte
LD (DE),A
ACC_Off
POP AF
OUT (SLOT3),A
RET
;***************************************
FIRE_S:
LD A,(FIRE_B)
AND A
JR NZ,FIRE_X
LD A,1
LD (FIRE_CT),A
RET
;
FIRE_CT: DB 1
FIRE_B: DB 0
EFF_: DW #C000
;
FIRE_X:
LD A, #80
LD (EFF_+1),A ; ¢ª«îç¨âì íä䥪â
CALL MONSTR_BFG_INS ; ¢áâ ¢¨âì ¬®­áâà  ®£­ï!
LD A,4
LD (FIRE_CT),A
XOR A
LD (FIRE_B),A
RET
;***************************************
KBD_INT:
IN A,(Z84.SIO.Ch_A.Ctrl)
BIT 0,A
RET Z
IN A,(Z84.SIO.Ch_A.Data)
CP #E0
JR Z,KBD_INT
CP #E1
JR Z,KBD_INT
CP #F0
JR Z,.KBD_OFF
CP 3
CALL Z,SAVE_PIC_PR
PUSH AF
LD A,(OFF_BYTE)
AND A
JR Z,.NO_LAST_KEY
POP AF
LD (LAST_KEY),A
PUSH AF
.NO_LAST_KEY:
POP AF
CP 20 ; CTRL
JR Z,.EFF_ON
CP 117 ; KEY_UP
JR Z,.DIR_UP
CP 114 ; KEY_DN
JR Z,.DIR_DN
CP 107 ; KEY_LF
JR Z,.DIR_LF
CP 116 ; KEY_RT
JR Z,.DIR_RT
JR .KBD_INT2
.KBD_OFF:
XOR A
LD (OFF_BYTE),A ; 0, ¥á«¨ ¯®ï¢¨«®áì ®â¦¨¬ ­¨¥
JR KBD_INT
.KBD_INT1:
PUSH HL
LD HL,0
LD (A_SPEED),HL
LD (X_SPEED),HL
LD (Y_SPEED),HL
POP HL
.KBD_INT2:
LD A,#FF
LD (OFF_BYTE),A
JR KBD_INT
.EFF_ON:
LD A,(OFF_BYTE)
LD (FIRE_B),A
CALL FIRE_S
JR .KBD_INT2
.DIR_UP:
LD A,(OFF_BYTE)
LD (UP_),A
JR .KBD_INT1
.DIR_DN:
LD A,(OFF_BYTE)
LD (DN_),A
JR .KBD_INT1
.DIR_LF:
LD A,(OFF_BYTE)
LD (LF_),A
JR .KBD_INT1
.DIR_RT:
LD A,(OFF_BYTE)
LD (RT_),A
JR .KBD_INT1
UP_: DB #00
DN_: DB #00
LF_: DB #00
RT_: DB #00
OFF_BYTE: DB #FF
;
;INCLUDE INTMOUSE.ASZ
;
TAB_ANGLE:
DB 0 , 1 ; 0
DB 1 , 1 ; 45
DB 1 , 1 ; 45
DB 1 , 0 ; 90
DB 1 , 0 ; 90
DB 1 , -1 ; 135
DB 1 , -1 ; 135
DB 0 , -1 ; 180
DB 0 , -1 ; 180
DB -1 , -1
DB -1 , -1
DB -1 , 0
DB -1 , 0
DB -1 , 1
DB -1 , 1
DB 0 , 1 ; 0
TAB_ANGLE2:
DB 0 , 2 ; 0
DB 1 , 2 ; 22
DB 2 , 2 ; 45
DB 2 , 1 ; 67
DB 2 , 0 ; 90
DB 2 , -1 ; 112
DB 2 , -2 ; 135
DB 1 , -2 ; 157
DB 0 , -2 ; 180
DB -1 , -2
DB -2 , -2
DB -2 , -1
DB -2 , 0
DB -2 , 1
DB -2 , 2
DB -1 , 2 ; 0
TAB_ANGLE3:
DB 4 , 2 ; 67
DB 4 , 1 ; 67
DB 4 , 0 ; 90
DB 4 , -1 ; 112
DB 4 , -2 ; 135
DB 4 , -3 ; 135
DB 4 , -4 ; 135
DB 3 , -4 ; 157
DB 2 , -4 ; 157
DB 1 , -4 ; 157
DB 0 , -4 ; 180
DB -1 , -4
DB -2 , -4
DB -3 , -4
DB -4 , -4
DB -4 , -3
DB -4 , -2
DB -4 , -1
DB -4 , 0
DB -4 , 1
DB -4 , 2
DB -4 , 3
DB -4 , 4 ; 0
DB -3 , 4 ; 0
DB -2 , 4 ; 0
DB -1 , 4 ; 0
DB 0 , 4 ; 0
DB 1 , 4 ; 0
DB 2 , 4 ; 22
DB 3 , 4 ; 45
DB 4 , 4 ; 45
DB 4 , 3 ; 45
MONSTR_ALL:
LD HL,(ANGLE_M)
RL L
RL H
RLA
RL L
RL H
RLA
RL L
RL H
RLA
LD L,H
AND 7
LD H,A
LD (ANGLE_R),HL
LD IX,MONSTR_TABLE
MONSTR_LOOP:
LD A,(IX+M_PAGE)
AND A
RET Z
; JP MONSTR_ALL1
LD A,(X_COORD+1) ; ¯®«®¦¥­¨¥ ¨£à®ª 
SUB (IX+M_X+1) ; ¯®«®¦¥­¨¥ ¬®­áâà 
ADD A,64
JR Z,NO_M_OUT
BIT 7,A ; ¯à®¢¥àª  ­  ¤ «ì­®áâì
JR NZ,NO_M_OUT ; ­¥ ¢ë¢®¤¨âì
SUB 64
NEG
LD L,A
LD A,(Y_COORD+1) ; ¯®«®¦¥­¨¥ ¨£à®ª 
SUB (IX+M_Y+1) ; ¯®«®¦¥­¨¥ ¬®­áâà 
ADD A,64
JR Z,NO_M_OUT
BIT 7,A
JR NZ,NO_M_OUT ; ¯à®¢¥àª  ­  ¤ «ì­®áâì
SUB 64
NEG
LD H,A ; H - Y, L - X
OR L
JR Z,NO_M_OUT ; ¯à®¢¥àª  ­  0
LD B,0
BIT 7,H
JR Z,A_NO_ADD4
LD A,H ; ¯®¢®à®â ­  180 -X->X; -Y->Y
NEG
LD H,A
LD A,L
NEG
LD L,A
LD B,4
A_NO_ADD4:
BIT 7,L
JR Z,A_NO_ADD2
LD A,L ; ¯®¢®à®â ­  90 Y->X; -X->Y
NEG
LD L,H
LD H,A
INC B
INC B
A_NO_ADD2:
; B - ¨­ä®à¬ æ¨ï ® ª¢ ¤à ­â¥ 0,2,4,6
; L - X-ª®®à¤¨­ â 
; H - Y-ª®®à¤¨­ â 
MONSTR_ALL1:
LD A,L
ADD A,A
ADD A,A
LD L,A
; HL - 㪠§ â¥«ì ­  â ¡«¨æã (4096 ¯® 4b)
; HL - PAGE:(HL) ¤ ­­ë¥
; ¤«ï ¢ë¢®¤  ­  íªà ­ -> 㣮« -> x-ª®®à¤¨­ â ,
; ¢ëá®â /è¨à¨­ 
SET 6,H
IN A,(SLOT1)
PUSH AF
LD A,(PAGE_M_PLACE)
OUT (SLOT1),A
LD E,(HL) ; 㣮« ¬« ¤è¨©
INC L
LD D,(HL) ; 㣮« áâ à訩
INC L
LD C,(HL) ; ¢ëá®â 
POP AF
OUT (SLOT1),A
LD A,D
ADD A,B
LD D,A ; ¤®¡ ¢¨âì ª¢ ¤à ­â
DEC C
BIT 7,C
JR Z,MONST_H1
LD C,0 ; ¬®­áâà à冷¬
MONST_H1:
INC C
LD (IX+M_HIGH),C ; ¯®«®¦¥­¨¥ ¯® ¢¥à⨪ «¨
LD HL,(ANGLE_R)
AND A
EX DE,HL
SBC HL,DE
; ADD HL,DE
; LD DE,512+160-512
; LD D,2
; LD E,160
; ADD HL,DE
LD A,H
AND 7
LD H,A
LD (IX+M_HOR),L ; 㣮«
LD (IX+M_HOR+1),H
; LD DE,128 ; € çñ¡ ­¥ ã¯à®áâ¨âì â ª:
; ADD HL,DE ; LD DE,256+320-128
; LD DE,256+320 ; SBC HL,DE
; AND A ; ¨ ¢áñ... HL ¬®¦¥â ¯¥à¥¯®«­ïâìáï ¯à¨ ADD 128? - ­¥â
; SBC HL,DE ; ; ¯à®¢¥àª  ¯®¯ ¤ ­¨ï ¬®­áâà  ¢ 㣮« §à¥­¨ï
LD DE,256+320-128
SBC HL,DE ; ¯à®¢¥àª  ¯®¯ ¤ ­¨ï ¬®­áâà  ¢ 㣮« §à¥­¨ï
CALL C,WALL
CALL SOUND
NO_M_OUT:
call MONSTR_NEXT_P
LD DE,MONSTR_D_LEN
ADD IX,DE
JP MONSTR_LOOP
MONSTR_NEXT_P:
BIT 7,(IX+M_VAR3) ; ­¥ ¬¥­ïáï ¬®­áâà (㡨âë©)
RET NZ
LD A,(IX+M_VAR2) ; áç¥â稪 横« 
AND #0F
RLCA
RLCA
RLCA
RLCA
ADD A,(IX+M_VAR2) ; ¤®¡ ¢¨âì ¬« ¤è¨© ¡ ©â ª áâ à襬ã
LD (IX+M_VAR2),A
AND #F0
RET NZ ; ¢¥à­ãâìáï, ¥á«¨ ­¥ 0
; JR NC,NO_ADD_MX
BIT 6,(IX+M_VAR3) ; ¡¨â ¥¤¨­¨ç­®£® ¯®ª §  横« 
JP Z,SW_MONS_X
CALL SW_MONS_X
RET Z
SET 7,(IX+M_VAR3) ; ®áâ ­®¢¨âì ¯¥à¥ª«î祭¨¥
RET
SW_MONS_X:
LD A,(IX+M_X)
ADD A,(IX+M_VX)
LD (IX+M_X),A
LD A,(IX+M_X+1)
ADC A,(IX+M_VX+1)
LD (IX+M_X+1),A
LD A,(IX+M_Y)
ADD A,(IX+M_VY)
LD (IX+M_Y),A
LD A,(IX+M_Y+1)
ADC A,(IX+M_VY+1)
LD (IX+M_Y+1),A
LD A,(IX+M_X+1)
LD E,A
LD A,(IX+M_Y+1)
LD D,A
CALL MAP_PLACE_X ; ¯à®¢¥à¨âì, ­¥â «¨ ¯à¥¯ïâá⢨ï
; ¥á«¨ - ¯à¥¯ïâá⢨¥ ¥áâì
JR NC,CONT_MONS
; ¯à¨ ¢áâà¥ç¥ á ¯à¥¯ïâá⢨¥¬
BIT 3,(IX+M_VAR3)
JR Z,CONT_MONS ; ¥á«¨ 0, ­¨ç¥£® ­¥ ¤¥« âì
; ¨­ ç¥ - ¨á祧­®¢¥­¨¥ ¬®­áâà  á
; ¢ëª¨¤ë¢ ­¨¥¬ ¨§ â ¡«¨æë
CALL MONSTR_DELET ; 㤠«¨âì ¬®­áâà 
LD DE,-MONSTR_D_LEN
ADD IX,DE ; ¯¥à¥ª«îç¨âìáï ­  ¯à¥¤ë¤ã饣®
XOR A ; ¨ ¢¥à­ãâìáï
RET
CONT_MONS:
BIT 2,(IX+M_VAR3) ; ¯¥à¥ª«î祭¨¥ ¯® áâ àè¥¬ã  ¤à¥áã
JR Z,SW_MONS
LD A,(IX+M_ADR+1) ; ¯¥à¥ª«îç â¥«ì  ¤à¥á 
ADD A,(IX+M_VAR4) ; ᪮«ìª® ¤®¡ ¢«ïâì
AND #3F
OR #40
LD (IX+M_ADR+1),A
CP #40 ; ¯à¨§­ ª § ¢¥à襭¨ï 横« 
RET
SW_MONS:
LD A,(IX+M_ADR) ; ¯¥à¥ª«îç â¥«ì  ¤à¥á 
ADD A,#40
LD (IX+M_ADR),A
AND A ; ¯à¨§­ ª § ¢¥à襭¨ï 横« 
;NO_ADD_MX:
RET
SAVE_PIC_PR:
PUSH AF
PUSH IX
PUSH HL
PUSH DE
PUSH BC
.flag+1: LD A,0
AND A
JR NZ,NO_SAVE
; A=0
DEC A
LD (.flag),A
CALL SAVE_PIC
XOR A
LD (.flag),A
NO_SAVE: POP BC
POP DE
POP HL
POP IX
POP AF
RET
SAVE_HL: DW 0
SAVE_P1: DW 0
SAVE_P2: DW 0
; SAVE_RGA2: DB 0
SAVE_PIC:
IN A,(SCREEN_SWITCH)
AND 1
LD HL,ScreenStartAddress
JR NZ,SET_1X
LD HL,ScreenStartAddress + #0140
SET_1X:
LD IX,TABLE_PIC
LD A,(IX)
AND A
RET Z
LD DE,#8436
SAVE_PIC_X:
LD (SAVE_HL),HL ; Pic line
IN A,(PORT_Y)
LD (SAVE_RGA2),A
LD C,SLOT2
IN B,(C)
LD (SAVE_P1),BC
LD C,SLOT3
IN B,(C)
LD (SAVE_P2),BC
LD A,#50
OUT (C),A ; Screen
LD A,#FF
OUT (PORT_Y),A ; Line 1
LD A,(IX)
OUT (SLOT2),A
NEXT_SV_LN:
LD HL,(SAVE_HL) ; ¢á¯®¬­¨âì «¨­¨î
LD B,160
LOOP_SV_PIC:
LD A,(HL)
LD (DE),A
INC HL
INC DE
LD A,(HL)
LD (DE),A
INC HL
INC DE
bit 6,d
JR Z,NO_NEXT_PAGE
LD A,B
LD BC,(SAVE_P1)
OUT (C),B
LD B,A
INC IX
LD A,(IX)
OUT (SLOT2),A ; next page
LD DE,#8000
NO_NEXT_PAGE:
DJNZ LOOP_SV_PIC
; CALL SOUND
IN A,(PORT_Y)
DEC A
OUT (PORT_Y),A
CP #FF
JR NZ,NEXT_SV_LN
LD BC,(SAVE_P2)
OUT (C),B
LD BC,(SAVE_P1)
OUT (C),B
SAVE_RGA2+1:
LD A,0
OUT (PORT_Y),A
RET
;WALL_SET:
;***************************************
; ¬®­áâ஢ ï áâàãªâãà 
; IX+0 - áâà ­¨æ  á⥭ª¨
; IX+1,2 -  ¤à¥á á⥭ª¨ ¢ áâà ­¨æ¥
; IX+3 - ¯®«®¦¥­¨¥ ¯® ¢¥à⨪ «¨ - § ¤ ¥â ¬ áèâ ¡
; IX+4,5 - ¯®«®¦¥­¨¥ ¯® £®à¨§®­â «¨
; IX+6,7 - reserved
; IX+8,9 - X-add-parameter (ª®í䍿¨¥­â ¬ áèâ ¡¨à®¢ ­¨ï ¯® Y)
; IX+10 - ॠ«ì­ ï è¨à¨­  á⥭ª¨ ???
; IX+11 - ॠ«ì­ ï ¢ëá®â  á⥭ª¨ ???
; IX+12 - ª®®à¤¨­ â  X
; IX+14 - ª®®à¤¨­ â  Y
; IX+16 - ᪮à®áâì X
; IX+18 - ᪮à®áâì Y
; IX+20 - ⨯ ¬®­áâà 
; IX+22 - ¯¥à¥¬¥­­ë¥ ¬®­áâà 
/*
SSS2:
ENT ;.DEPHASE
;***************************************
; DS 86F0H-$
; DS 7F0H-$
; db 'flc C',0,80h,0,80H,80H,2,1
DS #A000-$
incbin "table.bin"
*/
; ENT
ASSERT $ < #1FFF, Relocate table "TABLE_W"!!!
D2_fram_END EQU $
;
OUTEND
;
DISPLAY "d2_fram.bin starts - ",/H,TRACE
DISPLAY "d2_fram.bin ends - ",/H,D2_fram_END
DISPLAY "Dd2_fram.bin size - ",/H,D2_fram_END-TRACE
;