1
0
mirror of https://github.com/Tolik-Trek/DOOM2.git synced 2026-06-15 09:01:34 +03:00
DOOM2/DOOM2.asm
Anatoliy Belyanskiy 0516ac2266 Initial commit
2023-06-15 02:04:44 +10:00

1871 lines
31 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.

/*
;------------[<5B><EFBFBD>…„…œ!!!]------------
®¯â¨¬¨§¨à®¢ âì ¢ë¤¥«ï¥¬ë¥ ¡«®ª¨ ¯ ¬ïâ¨
¯à®¢¥àª  ­  ®è¨¡ª¨ ¯à¨ ¢ë§®¢¥ DSS ¨ BIOS
;---------------------------------------
*/
;
;---------------------------[Defines section]---------------------------
IFNDEF HARDWARE : IFNDEF ZXMAK2 : IFNDEF MAME : DEFINE HARDWARE 1 : ENDIF : ENDIF : ENDIF
IFDEF HARDWARE
DEFINE NORM_ACC 1
DEFINE NORM_syncPORT 1
DEFINE NORM_FastRAM 1
ENDIF
IFDEF ZXMAK2
DEFINE NORM_ACC 0
DEFINE NORM_syncPORT 0
DEFINE NORM_FastRAM 0
ENDIF
IFDEF MAME
DEFINE NORM_ACC 1
DEFINE NORM_syncPORT 0
DEFINE NORM_FastRAM 1
ENDIF
IFNDEF YesSound : DEFINE YesSound 0 : ENDIF
DEFINE EXE_HEADER 1
; DEFINE NEED_LOADER 1
IFDEF HARDWARE
DISPLAY "[]------[ Compilation target: Sprinter 2000 ]------[]"
ENDIF
IFDEF ZXMAK2
DISPLAY "[]------[ Compilation target: emulator ZXMAK2 ]------[]"
ENDIF
IFDEF MAME
DISPLAY "[]------[ Compilation target: emulator MAME ]------[]"
ENDIF
;-----------------------------------------------------------------------
;
;
;-----------------------[Compilation parameters]------------------------
DEVICE ZXSPECTRUM4096 ; ¬®¤¥«ì á 4 ¬¥âà ¬¨ ¯ ¬ïâ¨
MMU 2 e, 0 ; ­ã«¥¢ ï áâà ­¨æ  ¢ ¡ ­ªã 2 ¨ ¯à®¢¥àª  ­  £à ­¨æë
OUTPUT './Build/DOOM2/doom2.exe'
;-----------------------------------------------------------------------
;
;
;-------------------------------[Includes]------------------------------
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'
include 'Shared_includes/macroses/macros.z80'
;-----------------------------------------------------------------------
;
;
;-------------------------[Standart EQU section]------------------------
org_addr EQU #8000+CLP_Buffer
code_addr EQU BEGIN
stack_point EQU #BFFF
program_start EQU BEGIN
;-----------------------------------------------------------------------
;
TABLE_X EQU #A000 ; â ¡«¨æ  ª®í䍿¨¥­â®¢ ¢ëá®âë
TABLE_X_SIZE EQU #0800 ; ¥ñ à §¬¥à???
MONSTR_TABLE EQU #A800 ; â ¡«¨æ  ¬®­áâ஢
MONSTR_TABLE_SIZE EQU #1800 ; ¥ñ à §¬¥à???
TABLE_W EQU #2000 ; ⥪ã騥 ª àâë ¤«ï TRACE
; Code start section
;[]-------------------------------------------------------------------[]
IF EXE_HEADER
include 'Shared_Includes/constants/EXE_Header.z80'
ORG org_addr
ELSE
ORG org_addr - CLP_Buffer
ENDIF
BEGIN:
DI
LD (CMD_Line),IX ; á®åà ­¨âì 㪠§ â¥«ì ­  ¯ à ¬¥âàë § ¯ã᪠
LD HL,#8080
CMD_Line: EQU $-2
/*
; „®¤¥« âì???!!!!
LD C,(HL)
LD B,0
INC BC
INC BC
INC BC
ADD HL,BC ; 㪠§ â¥«ì ­  ¯®«­ë© ¯ãâì ¤® ä ©«  § ¯ã᪠
ld c,Dss.ChDir ; ¯¥à¥å®¤ ¢ ª â «®£ DOOM2 ­  ¢á直© á«ãç ©
rst ToDSS
DI
*/
; IN A,(SLOT3)
; LD C,BIOS.SPRINTER_ALL
; RST ToBIOS
;--------[§ £à㧪  à¥áãàᮢ ¨£àë]-------
; ¢ë¯®«­¥­® ¢ ¢¨¤¥ ª®áâë«ì­®© § £«ã誨
call Load_Resources
IFDEF NEED_LOADER
Loader_length EQU $-BEGIN
ELSE
Loader_length EQU 0
ENDIF
;---------------------------------------
;-----[ˆ­¨æ¨ «¨§ æ¨ï Covox-Blaster]-----
; IF YesSound
ld bc,CBL.SYS_PORT
ld a,#80
out (c),a
;
;-----------[§ £«ãè¨âì §¢ãª]------------
LD A,#FF ; !FIXIT à §¢¥ â ª ­ ¤® £«ãè¨âì? <20>¥ à㤨¬¥­âë Sp97?
1:
CALL CLEAR_COVOX_X
DEC A
CP #80
JR NZ,1B
;---------------------------------------
;
; ENDIF
;---------------------------------------
IN A,(SLOT3)
PUSH AF
ld a,(RAMBlkIDs)
ld bc,BIOS.GetMemPage
rst ToBIOS
di
ld (MemPatch_PalitrePage),a
ld a,(RAMBlkIDs+3)
ld bc,BIOS.GetMemPage
rst ToBIOS
di
ld (MemPatch_D2_FRAM_page),a
DI
CALL CLEAR_GRAF_SCR
; IN A,(SLOT3)
; PUSH AF
; LD A,3
; OUT (SLOT3),A
; LD HL,PALITRE
; LD DE,#C000
; LD BC,#0400
; LDIR
; POP AF
; OUT (SLOT3),A
CALL SET_PAL
IN A,(SLOT3)
EX AF,AF'
LD A,DCP_PAGE
OUT (SLOT3),A
LD A,SCALE_PORT
;----[®âªàëâì ¯®àâë ¬ áèâ ¡¨à®¢ ­¨ï]----
;
; ®¤¨­ ¢­ãâ७­¨© ¯®àâ ¬ áèâ ¡¨à®¢ ­¨ï
; ¬ ¯¯¨âáï ­  ­¥áª®«ìª® ¤¨ ¯¯ §®­®¢
; ¢­¥è­¨å ¯®à⮢
; Œ áª  1110 0000 1110 0111
LD (#C400),A ; ¯®àâ #0000 Dos off
LD (#C410),A ; ¯®àâ #2000 Dos off
LD (#C480),A ; ¯®àâ #4000 Dos off
LD (#C490),A ; ¯®àâ #6000 Dos off
LD (#C500),A ; ¯®àâ #8000 Dos off
LD (#C510),A ; ¯®àâ #A000 Dos off
LD (#C580),A ; ¯®àâ #C000 Dos off
LD (#C590),A ; ¯®àâ #E000 Dos off
;---------------------------------------
EX AF,AF'
OUT (SLOT3),A
EXX
LD BC,#100 ; ¬ áèâ ¡ 1:1
LD D,0
OUT (C),D
EXX
;
IFN NORM_syncPORT
DI
LD A, +(high im_handler_emulator)
LD I,A
; IM 2 - ¯®ª  ­¥ ¢ª«îç ¥¬, ¯à®æ¥¤ãà  ¯à¥à뢠­¨ï ¯à룠¥â ¢ ªíè,   ®­ ­¥ ¢áâ ¢«¥­ ¨ ­¥ ¯à®£à㦥­
ENDIF
CALL MAIN
;----[LP_OPEN_S]------------------------
; Žâªàë⨥ áâ ­¤ àâ­ëå ®ª®­
LD HL,5104H
LD E,0 ; win_flag - ä« £¨ ®ª­ :
; bit 0 ®¯à¥¤¥«ï¥â áâà ­¨æã ०¨¬ , ª®â®à ï ¡ã¤¥â
; ®âªàëâ  ¯®á«¥ ¨á¯®«­¥­¨ï ä㭪樨
LD B,4 ; 4 - ᯥªâà㬮¢áª®¥ ®ª­®, HL - ¯®«®¦¥­¨¥ ®ª­ 
LD C,BIOS.LP_OPEN_S
RST ToBIOS
;---------------------------------------
SP_SAVE1:
LD SP,0
EXX
POP HL
EXX
POP IX
POP IY
EI
RET
;=======================================
;
;
;-----------[EXIT Procedure]------------; ‘¤¥« âì!!!
RETURN_POINT: ; â®çª  ¢®§¢à â  - ¯®«­ë© á¡à®á
DI
LD A,10h
LD BC,1FFDh
OUT (C),A
LD A,0A0h ; Reset page. <20> ¡®â ¥â «¨?!!!!!!!!!
OUT (SLOT3),A
LD (0C000h),HL
HALT_L:
DI
HALT
JR HALT_L
;---------------------------------------
SET_PAL_x:
FRAM_OFF
CALL SET_PAL
FRAM_ON
RET
SET_PAL:
;----[PIC_SET_PAL “áâ ­®¢ª  ¯ «¨âàë]----
; ‡­ ç¥­¨¥ ॣ¨áâ஢ ­  ¢å®¤¥:
; C=0A4h
; HL - ¤ ­­ë¥ ¯ «¨âàë:
; ᯨ᮪ 梥⮢ ¯® ç¥âëॠ¡ ©â  B,G,R,Y
; E - ­®¬¥à ­ ç «ì­®£® 梥â 
; D - ª®«¨ç¥á⢮ ãáâ ­ ¢«¨¢ ¥¬ëå æ¢¥â®¢
; B - ¬ áª  ¯à¨ ãáâ ­®¢ª¥ ¯ «¨âàë.
; „«ï ­®à¬ «ì­®£® ०¨¬  ¤®«¦­a
; ¡ëâì 0FFh
; A - ­®¬¥à ¯ «¨âàë 0..15;
; ®â 8 ¤® 15 - १¥à¢­ë¥
IN A,(SLOT3)
PUSH AF
LD A,#FF
MemPatch_PalitrePage equ $-1
OUT (SLOT3),A
LD HL,#C000
LD DE,0
LD A,0
LD B,#FF
LD C,BIOS.PIC_SET_PAL ; ãáâ ­®¢ª  ¯ «¨âàë
RST ToBIOS
DI
LD HL,#C000
LD DE,0
LD A,1
LD B,#FF
LD C,BIOS.PIC_SET_PAL ; ãáâ ­®¢ª  ¯ «¨âàë
RST ToBIOS
DI
POP AF
OUT (SLOT3),A
RET
;
;---[®ç¨á⪠ íªà ­  á⥪®¬ ¨  ªá¥«¥¬]---
CLEAR_GRAF_SCR:
IN A,(SLOT3)
PUSH AF
LD (MemPatch_SPSave2),SP
LD A,#50
OUT (SLOT3),A
LD A,0
OUT (RGADR),A
LD SP,#C040+640
LD B,640/4
;!!!!!!!!!!![®¯â¨¬¨§¨à®¢ âì]!!!!!!!!!!!!
LOOP_CLS:
ACC_SetBlockSize
LD E,0
ACC_Off ; !FIXIT ã¡à âì?????
LD D,E
ACC_FillScreenOneByte
PUSH DE
PUSH DE
ACC_Off
DJNZ LOOP_CLS
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
MemPatch_SPSave2 EQU $+1
LD SP,0
POP AF
OUT (SLOT3),A
RET
;---------------------------------------
;
FLAG: DB 0
SAVE_RGA: DB 0
;
;
CLEAR_COVOX:
LD A,#80
CLEAR_COVOX_X:
LD BC,CBL.COVOX_OUT
; IF YesSound
CLEAR_CBL:
OUT (C),A
DJNZ CLEAR_CBL
; ENDIF
RET
;
;
CLEAR_SP_PAL:
IN A,(SLOT3)
PUSH AF
LD A,#50
OUT (SLOT3),A
LD B,61
LOOP_PAL_ALL:
PUSH BC
LD BC,RGADR
LOOP_PAL_C:
OUT (C),B
;
PAL_RESES_ADR+1: LD HL,#C3F0
;
LD D,16
LOOP_PAL_D:
LD A,(HL)
RRA
RRA
RRA
RRA
RRA
AND 7
INC A
LD E,A
LD A,(HL)
SUB E
JR NC,NO_Z
XOR A
NO_Z:
LD (HL),A
INC L
DEC D
JR NZ,LOOP_PAL_D
CALL SOUND1
DJNZ LOOP_PAL_C
CALL PAUSE_INT
POP BC
LD A,(LAST_KEY)
AND A
JR NZ,NO_PAL_EXE
DJNZ LOOP_PAL_ALL
NO_PAL_EXE:
POP AF
OUT (SLOT3),A
RET
;
;
;
MAIN:
CALL INIT_TABLE
RET C
IN A,(RGADR)
LD (SAVE_RGA),A
LD A,#C0
OUT (RGADR),A
CALL RECALC_MAP
;----!!!!!!!!!!!!!!!!!!!!!!!!!----------
;---------------------------------------
LD A,(SAVE_RGA)
OUT (RGADR),A
ret c ; ­ã¦­® «¨???!!!
XOR A
LD (LAST_KEY),A
OUT (BorderColor),A
CALL CLEAR_SP_PAL
; !FIXIT ¯¥à¥¤¥« âì «®£¨ªã ¯®¤ ­®¢ë© ¡¨®á?
;---[ãáâ ­®¢ª  ᨭåàë, ®ç¨á⪠ íªà ­ ]--
LD A,2 ; ०¨¬ Pentagon - 320 áâப ¢ íªà ­¥
LD C,BIOS.FN_SINC
RST ToBIOS
;---------------------------------------
;------[Žâªàë⨥ áâ ­¤ àâ­ëå ®ª®­]------
; ॣ¨áâà E - ä« £¨ ®ª­ 
; ¡¨â 0 - ª ªãî áâà ­¨æã ०¨¬  ¢ª«îç âì
; ¯®á«¥ ¨á¯®«­¥­¨ï ä㭪樨
; ¡¨â 4 - ­  ª ª®© áâà ­¨æ¥ ०¨¬ 
; ®âªà뢠âì ®ª­®
; HL - ¬¥áâ® ­  íªà ­¥ ¯® §­ ª®¬¥áâ ¬
; (ª®¯¨ï ¢ IX+2,3), ¢ ­®¢ëå ¢¥àá¨ïå
; ¡¨®á  §­ ç¥­¨¥ HL ­¥ áãé¥á⢥­­®
LD HL,#4000
LD E,1
LD B,8 ; £à ä¨ç¥áª®¥ ®ª­® 0, HL - ¯®«®¦¥­¨¥ ®ª­ 
LD C,BIOS.LP_OPEN_S
RST ToBIOS
LD HL,#5000
LD E,1
LD B,9 ; £à ä¨ç¥áª®¥ ®ª­® 1, HL - ¯®«®¦¥­¨¥ ®ª­ 
LD C,BIOS.LP_OPEN_S
RST ToBIOS
;---------------------------------------
LD A,1
OUT (RGMOD),A
;----[¯¥à¥¡à®á ç á⨠ª®¤  ¢ FastRAM]----
IN A,(SLOT3)
PUSH AF
LD A,#FF
MemPatch_D2_FRAM_page equ $-1
OUT (SLOT3),A
IF YesSound
;----[]
; ‡ ¯à è¨¢ ¥¬ áâà ­¨æë ¤«ï ¬ã§«  ¨
; ª â «®£ , á®å࠭塞 ¨å ü ¢ ª®¤¥
; 0 áâà ­¨æ  ¡«®ª  - CatPage
; 1 áâà ­¨æ  ¡«®ª  - SndPage
;
; „Ž„…‹€’œ!!!
; ­ ¤® ¯®â®¬ ­®à¬ «ì­® ¢ë¤¥«ïâì ¨
; ®á¢®¡®¦¤ âì ¯ ¬ïâì,   ­¥ ¢®â íâ® ¢áñ
;
ld b,1
ld c,Dss.GetMem
rst ToDSS
PUSH AF ; ID ¡«®ª  ­  á⥪
ld bc,BIOS.GetMemPage
rst ToBIOS
LD (MemPatch_CatPage),a
ld b,1
POP AF ; ID ¡«®ª  á® á⥪ 
ld c,BIOS.GetMemPage
rst ToBIOS
di
;----[]
ENDIF
FRAM_ON
LD HL,#C000
LD DE,#1000
LD BC,D2_fram_END-TRACE
LDIR
IF YesSound
ld (MemPatch_D2_FRAM_SndPage),a
ld (MemPatch_DOOM2_SndPage),a
ENDIF
IFN NORM_syncPORT
IM 2 ; ¢®â ⥯¥àì ¬®¦­® ¢ª«îç âì
ENDIF
POP AF
OUT (SLOT3),A
;---------------------------------------
;
LD HL,#C3E0
LD (PAL_RESES_ADR),HL
;
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
; ‘âà ­­®¥ ¬¥áâ®. Œ®¦­® ¦¥ áà §ã ¢ ª®¤¥
; ¡ë«® í⮠ᤥ« âì ¨ ­¥ ¯¥à¥ª¨¤ë¢ âì
LD HL,PAUSE_SNDC
LD DE,PAUSE_SND
LD BC,3
LDIR
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
CALL CLEAR_COVOX
FRAM_OFF
CALL INIT_HDD_WORK
FRAM_ON
SOUND_SWITCH:
IF YesSound
LD HL,NAMES+1
LD A,(HL)
INC A
LD (HL),A
DEC HL
CP (HL)
JR NZ,SOUND_S1
LD A,0
INC HL
LD (HL),A
SOUND_S1:
RLCA
RLCA
RLCA
RLCA
ADD A,#80
LD E,A
LD D,#80
CALL SET_SND_FILE
CALL INIT_SOUND
ENDIF
MORE_PIC:
LD HL,#0100
LD (X_SPEED),HL
LD HL,#0102
LD (Y_SPEED),HL
LD HL,#0200
LD (A_SPEED),HL
HELP_2:
CALL CLEAR_SP_PAL
LD A,6
CALL SET_PICTURE
CALL SCR_SWITCH
LD A,6
CALL PIC_ALL_MD
LD A,11
CALL PIC_ALL_MD
LD A,16
CALL PIC_ALL_MD
MORE_PIC_LK:
LD A,21
CALL SET_PICTURE
CALL SCR_SWITCH
CALL SET_PAL_x
LD B,240
PAUS_START:
DEC B
JR Z,DM_LOOP
CALL PAUSE_INT
LD A,(LAST_KEY)
AND A
JR Z,PAUS_START
LD B,0
LD C,A
XOR A
LD (LAST_KEY),A
LD A,C
CP 118
JR Z,MORE_PIC
CP 22
JR Z,DM_LOOP
CP 38
JR Z,SOUND_SWITCH
CP 9
JP Z,RETURN_POINT
CP 5
JP Z,HELP_
JR PAUS_START
HELP_:
CALL FIRE_X
LD HL,300H
LD (X_SPEED),HL
LD HL,382H
LD (Y_SPEED),HL
LD HL,500H
LD (A_SPEED),HL
JR DM_LOOP
;SWITCH_XX_W:
; LD HL,XX_W1
; LD DE,XX_W2
; LD B,3
;SWITCH_XX_W1:
; LD A,(DE)
; LD C,(HL)
; LD (HL),A
; LD A,C
; LD (DE),A
; DJNZ SWITCH_XX_W1
; RET
PIC_ALL_MD:
CALL SET_PICTURE
CALL SCR_SWITCH
CALL SET_PAL_x
CALL CLEAR_SP_PAL
RET
DM_LOOP:
LD A,(LAST_KEY)
CP 118
JP Z,MORE_PIC_LK
; CP 37
; CALL Z,SWITCH_XX_W
; CALL CRAZY_WALL
DI
; CALL SET_PAL_x
; CALL FIRE_S
IF YesSound
CALL SOUND
; ELSE
; CALL YesSoundZero
ENDIF
CALL CALC_NEW_PLACE
CALL MAP_PLACE
CALL MAKE_MAP ; á®®à㤨âì ®â­®á¨â¥«ì­ãî ª àâã
IF YesSound
CALL SOUND
; ELSE
; CALL YesSoundZero
ENDIF
CALL PRECALC_PLACE
IF YesSound
CALL SOUND
; ELSE
; CALL YesSoundZero
ENDIF
CALL TRACE ; ¯à®à¨á®¢ª !
IF YesSound
CALL SOUND
; ELSE
; CALL YesSoundZero
ENDIF
; CALL MONSTR_OUT
CALL MONSTR_ALL
IF YesSound
CALL SOUND
; ELSE
; CALL YesSoundZero
ENDIF
CALL WEAPON_OUT
IF YesSound
CALL SOUND
; ELSE
; CALL YesSoundZero
ENDIF
CALL MAP_OUT
CALL CLEAR_Z_BUFER
LOOP_SCR:
IF NORM_syncPORT
IN A,(SCR_SyncPort)
BIT 5,A
JR NZ,CONT_WORK
IF YesSound
CALL SOUND
; ELSE
; CALL YesSoundZero
ENDIF
JR LOOP_SCR
ELSE
EI
HALT
ENDIF
CONT_WORK:
CALL SCR_SWITCH
IF YesSound
CALL SOUND
; ELSE
; CALL YesSoundZero
ENDIF
JP DM_LOOP
SCR_SWITCH:
IN A,(RGMOD)
AND 1
XOR 1
OUT (RGMOD),A
LD DE,#C040
JR Z,SET_1
LD DE,#C180
SET_1:
LD (SCREEN_1),DE
RET
PAUSE_INT:
CALL SOUND1
IF NORM_syncPORT
IN A,(SCR_SyncPort)
BIT 5,A
JR NZ,PAUSE_INT
PAUSE_INT1:
CALL SOUND1
IN A,(SCR_SyncPort)
BIT 5,A
RET NZ
JR PAUSE_INT1
ELSE
EI
HALT
ret
ENDIF
PAUSE_SNDC:
JP SOUND
PAUSE_SND:
SOUND1:
RET
NOP
NOP
RET
;
MONSTR_DAT:
M_PAGE EQU $-MONSTR_DAT
DB 0 ; áâà ­¨æ  á ®¡é¨¬¨ ¤ ­­ë¬¨ ¬®­áâà  (ª à⨭ª¨)
; ¯à¨§­ ª ª®­æ  â ¡«¨æë ¬®­áâ஢
M_ADR EQU $-MONSTR_DAT
DW #4000 ;  ¤à¥á ¢ áâà ­¨æ¥
;
M_HIGH EQU $-MONSTR_DAT
DB #40 ; ¢¥à⨪ «ì­®¥ ¯®«®¦¥­¨¥
;
M_HOR EQU $-MONSTR_DAT
DW 160 ; £®à¨§®­â «ì­®¥ ¯®«®¦¥­¨¥
;
M_VAR2 EQU $-MONSTR_DAT
DW 0008 ; áç¥â稪 ¯¥à¥ª«î祭¨©
;
M_XADD EQU $-MONSTR_DAT
DW #0100 ; x-add ¯ à ¬¥âàë
DB #40,#40 ; è¨à¨­ -¢ëá®â  ???
;
M_X EQU $-MONSTR_DAT
DW #0700 ; ª®®à¤¨­ â  X
;
M_Y EQU $-MONSTR_DAT
DW #0700 ; ª®®à¤¨­ â  Y
;
M_VX EQU $-MONSTR_DAT
DW 0000 ; ᪮à®áâì ¤¢¨¦¥­¨ï ¯® X
;
M_VY EQU $-MONSTR_DAT
DW 0000 ; ᪮à®áâì ¤¢¨¦¥­¨ï ¯® Y
;
M_TYPE EQU $-MONSTR_DAT
DW 0000 ; ⨯ ¬®­áâà  ã­¨ç⮦ ¥¬ë©, ­¥ã­¨ç⮦ ¥¬ë©
; ¨á祧 î騩 ¯à¨ 㤠ॠ® á⥭ªã, ­¥ ¨á祧 î騩
; ¨á祧 î騩 ¯à¨ ᮯਪ®á­®¢¥­¨¨ á ¨£à®ª®¬,
; ­¥ ¨á祧 î騩....
M_VAR EQU $-MONSTR_DAT
DB 0 ; <20>¥à¥¬¥­­ë¥ ª®­ªà¥â­®£® ¬®­áâà 
;
M_VAR3 EQU $-MONSTR_DAT
DB 0
; <20>¥à¥¬¥­­ ï ¬®­áâà  ¡¨â 0,1 - ¤¥«¥­¨¥ ¯® è¨à¨­¥
; bit 2 - ¯¥à¥ª«îç âì ¯® áâ à襬ã
; bit 3 -
; bit 4
; bit 5
; bit 6 - ¯®ª §ë¢ âì ®¤¨­ 横«
; bit 7 - ­¥ ¢ë¢®¤¨âì
;
M_VAR4 EQU $-MONSTR_DAT
DB 0 ; <20>¥à¥ª«î祭¨¥ ¬®­áâà  ADD ¯ à ¬¥âà
MONSTR_D_LEN EQU $-MONSTR_DAT ;á«¥¤ãî騩 ¬®­áâà
DB 0 ; - ®âáãâáâ¢ã¥â
;
;****************************************
; 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_DATS:
DB 0
DW #4000
DB #40
DW #00A0 ; 160
DB 0,0
MONSTR_DATS:
DB 0,0,0,0,0,0,0,0
;
; **************************************
;
MSD_DATS:
DW 0,0,0,0
DW 0,0,0,0
;CAT_PAGE EQU 15
EFF_PAGE: DB #FF
PAGE_M_PLACE: DB #FF
FIRE_PAGE: DB #FF
BAR_PAGE: DB #FF
BFGF_PAGE: DB #FF
MONSTR_END_T: DW MONSTR_TABLE
;-------[¨­¨æ¨ «¨§ æ¨ï ¢¨­ç¥áâ¥à ]------; “<><E2809C>œ!!!
INIT_HDD_WORK:
IFN YesSound
RET
ENDIF
LD C,BIOS.HDD_INIT
RST ToBIOS
JR C,INIT_HDD_WORK
;---------------------------------------
IN A,(SLOT3)
PUSH AF
LD A,SYS_PAGE
OUT (SLOT3),A
LD HL,SYS_PAGE.MSD_FAT_SEC
LD DE,MSD_DATS
LD BC,16
LDIR
POP AF
OUT (SLOT3),A
;-----[ç¨â âì ᥪâ®àë á ¢¨­ç¥áâ¥à ]-----
LD HL,#C000 ;  ¤à¥á ¡ãä¥à  ¤ ­­ëå
LD DE,(MSD_DATS+4) ; CAT TABLE.  ¡á®«îâ­ë© ­®¬¥à ᥪâ®à  ¬« ¤è ï ç áâì
LD IX,(MSD_DATS+6) ;  ¡á®«îâ­ë© ­®¬¥à ᥪâ®à  áâ àè ï ç áâì
LD B,32 ; ç¨á«® ç¨â ¥¬ëå ᥪâ®à®¢
MemPatch_CatPage EQU $+1
LD A,15 ; áâà ­¨æ  ¡ãä¥à , ¥á«¨  ¤à¥á ¢ ®ª­¥ 0C000h
LD C,BIOS.HDD_READ
RST ToBIOS ; § £à㧨âì CAT
;---------------------------------------
RET
SND_SEC1: DW 12525 ; ­ ç «ì­ë© ᥪâ®à
SND_SEC2: DW 0
SND_L1: DW 1720H ; ¤«¨­ 
SND_L2: DW 0
SND_S1: DW 12525 ; ⥪ã訩 ᥪâ®à
SND_S2: DW 0
SND_C1: DW 1720H ; ®áâ â®ª ¤® ª®­æ 
SND_C2: DW 0
SET_SND_FILE:
IFN YesSound
ret
ENDIF
CALL OPEN_FILE
RET C
LD (SND_SEC1),IX ; ᥪâ®à ¬ã§ëª¨!!!
LD (SND_SEC2),HL
LD HL,(FILE_DATA+2)
LD DE,(FILE_DATA+4)
AND A
RR D
RR E
RR H
LD L,H
LD H,E
LD E,D
LD D,0
LD (SND_L1),HL ; ¤«¨­  ¢ ᥪâ®à å
LD (SND_L2),DE ; ¤«¨­  ¢ ᥪâ®à å
AND A
RET
SWITCH_SND:
;
LD DE,NAME1
NAME_S EQU $-2
;
CALL SET_SND_FILE
JR C,SWITCH_X
LD HL,(NAME_S)
LD BC,16
ADD HL,BC
LD (NAME_S),HL
RET
SWITCH_X:
LD HL,NAME1
LD (NAME_S),HL
JR SWITCH_SND
FILE_DATA:
DW 0 ; ­ ç «ì­ë© ª« áâ¥à
DW 0,0 ; ¤«¨­  ä ©« 
DW 0 ; ⥪ã騩 ª« áâ¥à
DW 0,0 ; ⥪ã饥 ¯®«®¦¥­¨¥ ¢ ä ©«¥
DW 0 ; ⥪ã騩 ­®¬¥à ᥪâ®à  ¢ ª« áâ¥à¥
;
OPEN_FILE: ; DE - name
;
CALL FIND_FILE
RET C
LD C,SLOT3
IN B,(C)
PUSH BC
LD A,(MemPatch_CatPage)
OUT (C),A
LD BC,26
ADD HL,BC
LD DE,FILE_DATA
LD BC,6
LDIR
POP BC
OUT (C),B
LD HL,(FILE_DATA)
LD (FILE_DATA+6),HL
LD HL,0
LD (FILE_DATA+8),HL
LD (FILE_DATA+10),HL
LD (FILE_DATA+12),HL
LD IX,(FILE_DATA) ; ­®¬¥à ¯¥à¢®£® ª« áâ¥à 
DEC IX
DEC IX ; -2 !!!
LD HL,0
SCF
LD DE,(MSD_DATS+13) ; ¤«¨­  ª« áâ¥à  ¢ ¡ ©â å
RR D
RR E
SEC_MUL:
RR D
RR E
JR C,SECT_X
ADD IX,IX
ADC HL,HL
JR SEC_MUL
SECT_X:
LD DE,(MSD_DATS+8)
ADD IX,DE
LD DE,(MSD_DATS+10)
ADC HL,DE ; HL:IX - ­®¬¥à ¯¥à¢®£® ᥪâ®à  ä ©« 
AND A
RET
;
FIND_FILE: ;DE - name - 11 ᨬ¢®«®¢
;
LD C,SLOT3
IN B,(C)
PUSH BC
LD A,(MemPatch_CatPage)
OUT (C),A
LD HL,#C000
NEXT_LOOP:
LD B,11
PUSH DE
NAME_LOOP:
LD A,(DE)
CP (HL)
JR NZ,NEXT_NAME
INC HL
INC DE
DJNZ NAME_LOOP
POP DE
LD A,L
AND 0E0H
LD L,A
POP BC
OUT (C),B
AND A
RET ; HL - ¤ ­­ë¥ ä ©«  ¢ áâà ­¨æ¥ 6
NEXT_NAME:
POP DE
LD A,L
AND 0E0H
LD L,A
LD BC,020H
ADD HL,BC
LD A,(HL)
AND A
JR Z,END_CAT
LD A,H
AND A
JR NZ,NEXT_LOOP
END_CAT:
POP BC
OUT (C),B
SCF
RET
HDD_FN:
EX AF,AF'
FRAM_OFF ; ®âª«îç ¥¬ ªíè
IN A,(SLOT1)
PUSH AF
IN A,(SLOT3)
PUSH AF
LD A,5 ; <20><EFBFBD>…„…œ!!!
OUT (SLOT1),A
MemPatch_DOOM2_SndPage EQU $+1
LD A,0
OUT (SLOT3),A
IN A,(RGADR)
PUSH AF
EX AF,AF'
RST ToBIOS ; ç¨â âì ᥪâ®à  á ¢¨­ç¥áâ¥à , äã­ªæ¨ï #45
DI
POP AF
OUT (RGADR),A
POP AF
OUT (SLOT3),A
POP AF
OUT (SLOT1),A
FRAM_ON ; ¢ª«îç ¥¬ ªíè
RET
;
; **************************************
;
SKY_1: DB #FF
SKY_2: DB #FF
PAGE_WEAPON: DB #FF
;***************************************
;***************************************
MADE_FFING:
LD C,SLOT3
IN B,(C)
OUT (C),A
LD HL,#C000
NEXT_BYTE_:
LD A,(HL)
CP 0F7H
JR NZ,NO_FFING
LD (HL),0FFH
NO_FFING:
INC HL
BIT 7,H ;!!!!!¯à®¢¥àª  ­  ª®­¥æ áâà ­¨æë #C000-FFFF!!!!!
JR NZ,NEXT_BYTE_
OUT (C),B
RET
;***************************************
INIT_TABLE:
;----[GET_RAMD_ST]----------------------
; ¯®«ã祭¨¥ ¨¤¥­â¨ä¨ª â®à  ¡«®ª ,
; ­ §­ ç¥­­®£® ­  RAM-Disk
;
;----[—¨â ¥¬ ¯¥à¢ë© ¡«®ª â ¡«¨æ E:]-----; Tables disk Doom.trd
;--------------------------------------- !!!!! ‡ ¬¥­¨âì ª ç¥àâï¬ ­  á¢®î ¯®¤£à㧪㠡«®ª ¬¨!
LD A,(RAMBlkIDs)
LD HL,TABLE_MAIN
ld c,BIOS.GetMemBlkPages ; ¯®«ãç¨âì ᯨ᮪ áâà ­¨æ ¡«®ª  A
rst ToBIOS
RET C
; LD HL,TABLE_MAIN
INC HL
INC HL
INC HL
LD A,(HL)
LD (PAGE_WEAPON),A
INC HL
LD A,(HL)
LD (SKY_1),A
INC HL
LD A,(HL)
LD (SKY_2),A
LD HL,TABLE_MAIN
LD A,26
ADD A,L
LD L,A
LD A,(HL)
LD (WALL_DATS),A
LD DE,MONSTR_DATS
LD B,7
NEXT_HL_FFING:
LD A,(HL)
LD (DE),A
PUSH HL
PUSH DE
PUSH BC
CALL MADE_FFING ; § ¬¥­  FF- ¬¨ ¯à®§à ç­ëå æ¢¥â®¢
POP BC
POP DE
POP HL
INC HL
INC DE
DJNZ NEXT_HL_FFING
LD A,(MONSTR_DATS)
LD (MONSTR_DAT+M_PAGE),A
LD A,(MONSTR_DATS+5)
LD (FIRE_PAGE),A
LD A,(MONSTR_DATS+6)
LD (BAR_PAGE),A
LD HL,TABLE_MAIN
LD A,35
ADD A,L
LD L,A
LD A,(HL)
LD (BFGF_PAGE),A
CALL MADE_FFING
LD A,(PAGE_WEAPON)
CALL MADE_FFING
LD HL,TABLE_MAIN
LD A,33
ADD A,L
LD L,A
LD A,(HL)
LD (EFF_PAGE),A ; §¢ãª ¢ëáâ५ 
LD HL,TABLE_MAIN
LD A,34
ADD A,L
LD L,A
LD A,(HL)
LD (PAGE_M_PLACE),A ; â ¡«¨æ  á 㣫 ¬¨ ¤«ï ¬®­áâ஢
;--_[—¨â ¥¬ ç¥â¢ñàâë© ¡«®ª â ¡«¨æ H:]---; Tables disk my_tab*.*
/*
LD A,3 ;2 ; ¯®å®¤ã, ª àâ  ã஢­ï ¨ ¥éñ çâ®-â®
LD C,0CEH ; ¯®«ãç¨âì ¨¤¥­â¨ä¨ª â®à ¡«®ª  ®â à ¬¤¨áª 
RST ToBIOS
ret c
;---------------------------------------
*/
ld a,(RAMBlkIDs+2)
LD HL,TABLE_TRACE
ld c,BIOS.GetMemBlkPages ; ¯®«ãç¨âì ᯨ᮪ áâà ­¨æ ¡«®ª  A
rst ToBIOS
RET C
LD A,B
CP 32
SCF
RET NZ
;
;----[—¨â ¥¬ âà¥â¨© ¡«®ª â ¡«¨æ G:]-----; Tables disk mapw*.d2
/*
LD A,2 ;1 ; à ¬¤¨áª á⥭®ª
LD C,0CEH ; ¯®«ãç¨âì ¨¤¥­â¨ä¨ª â®à ¡«®ª  ®â à ¬¤¨áª 
RST ToBIOS
ret c
;---------------------------------------
*/
ld a,(RAMBlkIDs+1)
LD HL,TABLE_WALL
ld c,BIOS.GetMemBlkPages ; ¯®«ãç¨âì ᯨ᮪ áâà ­¨æ ¡«®ª  A
rst ToBIOS
RET C
LD A,B
CP 33
CCF
RET C ; B - à §¬¥à à ¬¤¨áª 
DEC A
LD (MAP_ELS),A ; ç¨á«® á⥭®ª
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
/*
XOR A
LD (TABLE_PIC),A
RET
*/
;----[—¨â ¥¬ ¯¥à¢ë© ¡«®ª â ¡«¨æ F:]-----; Tables disk *.XXX - ä ©« áªà¨­è®â  81920 ¡ ©â
/*
LD A,4
LD C,BIOS.GET_RAMD_ST
RST ToBIOS
JR NC,1F
*/
XOR A
LD (TABLE_PIC),A
AND A
RET
/*
1:
LD HL,TABLE_PIC
LD C,BIOS.GetMemBlkPages ; ¯®«ãç¨âì ᯨ᮪ áâà ­¨æ ¡«®ª 
RST ToBIOS
AND A
RET
; ;!!!!!!!ᤥ« âì á®åà ­¥­¨¥ áªà¨­è®â®¢
; LD A,4
; LD C,BIOS.GET_RAMD_ST ; ¯®«ãç¨âì ¨¤¥­â¨ä¨ª â®à ¡«®ª  ®â à ¬¤¨áª 
; RST ToBIOS
; AND A
; JR NZ,PIC_FOR_SAVE
; XOR A
; LD (TABLE_PIC),A
; AND A
; RET
;
;PIC_FOR_SAVE:
; LD HL,TABLE_PIC
; LD C,BIOS.GetMemBlkPages ; ¯®«ãç¨âì ᯨ᮪ áâà ­¨æ ¡«®ª  A
; RST ToBIOS
; XOR A
; RET
*/
;***************************************
DS #8700-$ ;<E2809A><E282AC>ˆ<E2809A>ˆ
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
; âãâ ¢ëà ¢­¨¢ ­¨¥ ­  0 ¢ ¬« ¤è¥¬
; ¡¨â¥  ¤à¥á 
TABLE_MAIN: DS 37 ; ¡ãä¥à ¯®¤ áâ ­¨æë ä ©«  resurses.res +1
TABLE_PIC: DS 6
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
;-------[§ £à㧪  à¥áãàᮢ ¨£àë]--------
Load_Resources:
in a,(SLOT3)
ld (.MemPatch_SavePage),a
LD B,FilesTBL.END
LD DE,FilesTBL
LD HL,RAMBlkIDs
.LR_loop:
PUSH BC ;++áçñâ稪
PUSH HL ;++¡ãä¥à ¯®¤ BlockID
ex de,hl
ld b,(hl) ; FilesTBL
inc hl
ld (.MemPatch_FileName),hl
; B - à §¬¥à ¡«®ª  ¢ áâà ­¨æ å
ld c,Dss.GetMem
rst ToDSS
; A - ¨¤¥­â¨ä¨ª â®à ¡«®ª  ¯ ¬ïâ¨
pop hl ;--¡ãä¥à ¯®¤ BlockID
ld (hl),a
inc hl
push hl ;++¡ãä¥à ¯®¤ BlockID
; A - ¨¤¥­â¨ä¨ª â®à ¡«®ª 
ld hl,Temp_Buffer
ld c,BIOS.GetMemBlkPages
rst ToBIOS
; B - ç¨á«® áâà ­¨æ ¢ ¡«®ª¥
; HL -  ¤à¥á ¡ãä¥à , ¢ ¡ãä¥à¥ ᯨ᮪
; 䨧¨ç¥áª¨å áâà ­¨æ ¯® ¯®à浪ã,
; § ª ­ç¨¢ î騩áï ¡ ©â®¬ 0FFh
push hl ;++¡ãä¥à ᮠᯨ᪮¬ áâà ­¨æ
push bc ;++᪮«ìª® áâà ­¨æ £à㧨¬
.MemPatch_FileName EQU $+1
ld hl,.MemPatch_FileName
ld a,1
ld c,Dss.Open
rst ToDSS
ld (.MemPatch_TempFileID),a
pop bc ;--᪮«ìª® áâà ­¨æ £à㧨¬
pop hl ;--¡ãä¥à ᮠᯨ᪮¬ áâà ­¨æ
;---[ç¨â ¥¬]
.readloop:
ld a,(hl)
out (SLOT3),a
inc hl
push hl ;++¡ãä¥à ᮠᯨ᪮¬ áâà ­¨æ
push bc ;++᪮«ìª® áâà ­¨æ £à㧨¬
.MemPatch_TempFileID EQU $+1
ld a,#FF ; ä ©«®¢ë© ¬ ­¨¯ã«ïâ®à
LD HL,#C000 ;  ¤à¥á ¢ ¯ ¬ïâ¨
LD DE,#4000 ; ª®«¨ç¥á⢮ ç¨â ¥¬ëå ¡ ©â
LD C,Dss.Read
rst ToDSS
DI
pop bc ;--᪮«ìª® áâà ­¨æ £à㧨¬
pop hl ;--¡ãä¥à ᮠᯨ᪮¬ áâà ­¨æ
DJNZ .readloop
;---[]
;---[§ ªà뢠¥¬]
ld a,(.MemPatch_TempFileID)
ld c,Dss.Close
rst ToDSS
;---[]
ld de,(.MemPatch_FileName)
ld hl,13
add hl,de
ex de,hl
POP HL ;--¡ãä¥à ¯®¤ BlockID
POP BC ;--áçñâ稪
DJNZ .LR_loop
;-[à §®¡à âìáï á â ¡«¨æ ¬¨!!!]-
ld hl,TABLE_X_file
ld a,1
ld c,Dss.Open
rst ToDSS
push af
LD HL,TABLE_X ;  ¤à¥á ¢ ¯ ¬ïâ¨
LD DE,TABLE_X_SIZE ; ª®«¨ç¥á⢮ ç¨â ¥¬ëå ¡ ©â
LD C,Dss.Read
rst ToDSS
pop af
ld c,Dss.Close
rst ToDSS
/*
ld hl,MONSTR_TABLE_file
ld a,1
ld c,Dss.Open
rst ToDSS
push af
LD HL,MONSTR_TABLE ;  ¤à¥á ¢ ¯ ¬ïâ¨
LD DE,MONSTR_TABLE_SIZE ; ª®«¨ç¥á⢮ ç¨â ¥¬ëå ¡ ©â
LD C,Dss.Read
rst ToDSS
pop af
ld c,Dss.Close
rst ToDSS
*/
di
;------------------------------
.MemPatch_SavePage equ $+1
ld a,0
out (SLOT3),a
RET
Temp_Buffer: BLOCK 256,#FF
TABLE_X_file: db 'table_x.tbl',0
;MONSTR_TABLE_file: db 'monsters.tbl',0
;-------[’ ¡«¨æ  § £à㧪¨ ä ©«®¢]-------
; ¤«¨­  ¢ áâà ­¨æ å 01 ¡ ©â
; ¨¬ï ä ©«  13 ¡ ©â
; ¥á«¨ ¨¬ï ä ©«  < 12 ᨬ¢®«®¢,
; â® ¤®¡¨âì ­ã«ï¬¨ ¤® 12
FilesTBL:
DZ 36,'resource.res' ;0 Disk E:
DZ 16,'map_wall.res' ;1
DZ 32,'d2_table.tbl' ;2
DZ 01,'d2_fram.bin',0 ;3
.END EQU ($-FilesTBL)/14 ; ª®«¨ç¥á⢮ ä ©«®¢
RAMBlkIDs: BLOCK FilesTBL.END,0
;---------------------------------------
;
DS #8B00-$ ;<E2809A><E282AC>ˆ<E2809A>ˆ
RECALC_MAP:
; ¯¥à¥áç¥â ª àâë ­  ॠ«ì­ë¥ ­®¬¥à 
; áâà ­¨æ á⥭®ª
LD IX,MONSTR_TABLE
LD HL,#4000
IN A,(SLOT1)
PUSH AF
LD A,(TABLE_WALL)
OUT (SLOT1),A
LD A,(HL)
CP '1'
JR NZ,NO_PROCESS
RECALC_X:
LD IX,MONSTR_TABLE
RECALC_M2:
LD A,(HL) ; ª®¤ á⥭ª¨
BIT 4,H
JR Z,NO_PRP ; ¯à®¢¥à¨âì, ª ªãî â ¡«¨æã ¯¥à¥áç¨â뢠¥¬
BIT 5,H
JR Z,NO_PRP ; ¥á«¨ ­¥ 4-î, â® ¨¤â¨ ¤ «ìè¥, ¨­ ç¥
; - íâ® â ¡«¨æ  ¯à¥¯àïâá⢨©
RECALC_M2X:
LD A,(HL) ; ª®¤ á⥭ª¨
CP 'S' ; #53
JR Z,ZERO_PRP
SUB 20H ; ª®¤ ¯à®¡¥« 
JR Z,ZERO_PRP
LD A,05Fh ; ¯à¥¯ïâá⢨¥
JR ONE_PRP
ZERO_PRP:
XOR A
ONE_PRP:
LD (HL),A
INC L
JR NZ,RECALC_M2X
INC H
LD A,H
AND 0Fh
JR NZ,RECALC_M2X
JR NO_PROCESS ; § ª®­ç¨âì
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
; ‘¤¥« âì ãá«®¢¨¥ ­  ¬ ªá¨¬ «ì­®¥ ª®«-¢®
; "¬®­áâ஢" ¯à¨ § ¯®«­¥­¨¨ â ¡«¨æë ¯®
; LDIR ¢ ¯à®æ¥¤ãॠMONSTR_POS, ç⮡ ­¥
; § «¥§âì ­  á⥪ ¨«¨ ¤ «ìè¥ áâà ­¨æë.
; MAX_IX < (ST_Point-MaxStackSize-MONSTR_D_LEN)
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
NO_PRP:
LD A,(HL) ; ª®¤ á⥭ª¨
CP 'S' ; ¬¥áâ® áâ àâ ?
CALL Z,START_POS
CP 'M' ; ¬®­áâà
CALL Z,MONSTR_POS
CP 'N' ; ®£­¨
CALL Z,MONSTR_POS1
CP 'O' ; ¡®çª¨
CALL Z,MONSTR_POS2
CP 'P' ; ®£®­ì bfg
CALL Z,MONSTR_POS3
SUB 20H
JR Z,ZERO_WOLL
SUB 10H
JR C,ZERO_WOLL
;
CP 15
MAP_ELS EQU $-1
;
JR NC,ZERO_WOLL
PUSH HL
PUSH BC
LD HL,TABLE_WALL
INC A
LD C,A
LD B,0
ADD HL,BC
LD A,(HL)
; LD A,(TABLE_WALL+1)
POP BC
POP HL
JR NO_ZERO_W
ZERO_WOLL:
XOR A ; § ¡¨¢ âì ­ã«ï¬¨
BIT 4,H
JR NZ,NO_ZERO_W
DEC A ; § ¡¨¢ âì FF- ¬¨
NO_ZERO_W:
LD (HL),A
INC L
JR NZ,NO_PRP
INC H
LD A,H
AND 0Fh
JR NZ,NO_PRP
LD A,H
CP 50H
JR NZ,NO_ST
LD (MONSTR_END_T),IX ; ª®­¥æ â ¡«¨æë ¬®­áâ஢
NO_ST:
LD A,H
CP 80h
JR NZ,RECALC_X
NO_PROCESS:
POP AF
OUT (SLOT1),A
AND A
RET
START_POS:
PUSH HL
PUSH AF
ADD HL,HL
ADD HL,HL
LD A,L
; ADD A,A
; ADD A,A
ADD A,2
LD (X_COORD+1),A
; RL L
; RL H
; RL L
; RL H
LD A,H
ADD A,A
ADD A,A
ADD A,2
LD (Y_COORD+1),A
POP AF
POP HL
RET
MONSTR_POS1:
; ä ª¥«ë
CALL MONSTR_POS
PUSH AF
LD A,(FIRE_PAGE)
LD (IX-MONSTR_D_LEN+M_PAGE),A
LD A,6 ; ¤¥«¨âì è¨à¨­ã ­  4 ¨ ¯¥à¥ª«îç âì ¯®
; áâ àè¥¬ã  ¤à¥áã
LD (IX-MONSTR_D_LEN+M_VAR3),A
LD A,10h
LD (IX-MONSTR_D_LEN+M_VAR4),A
LD A,0
LD (IX-MONSTR_D_LEN+M_VAR2),A ; £®à¥âì ¡ëáâ॥ ¢á¥å
POP AF
RET
MONSTR_POS2:
; ¡®çª¨
CALL MONSTR_POS
PUSH AF
LD A,(BAR_PAGE)
LD (IX-MONSTR_D_LEN+M_PAGE),A
LD A,5 ; ¤¥«¨âì è¨à¨­ã ­  2, ¯¥à¥ª«îç âì
; ¯® áâ àè¥¬ã  ¤à¥áã
LD (IX-MONSTR_D_LEN+M_VAR3),A
LD A,20h
LD (IX-MONSTR_D_LEN+M_VAR4),A
LD A,4
LD (IX-MONSTR_D_LEN+M_VAR2),A ; £®à¥âì ¡ëáâ॥ ¢á¥å
POP AF
RET
MONSTR_DELET:
; 㤠«¥­¨¥ ¬®­áâà 
; IX - ­  㤠«ï¥¬®¬ ¬®­áâà¥
PUSH IX
PUSH HL
PUSH DE
PUSH BC
PUSH AF
PUSH IX ; ªã¤  ª¨¤ âì
POP DE
LD HL,MONSTR_D_LEN
ADD HL,DE ; ®âªã¤  ª¨¤ âì
LOOP_DEL:
LD A,(HL) ; ¯à¨§­ ª ­ «¨ç¨ï ¬®­áâà 
AND A
JR Z,NO_LDIR
LD BC,MONSTR_D_LEN
LDIR ; ¯¥à¥ª¨­ãâ ®¤¨­ ¬®­áâà
JR LOOP_DEL
NO_LDIR:
LD (MONSTR_END_T),DE
XOR A
LD (DE),A
POP AF
POP BC
POP DE
POP HL
POP IX
RET
MONSTR_BFG_INS:
; ¢áâ ¢¨âì ¢ â ¡«¨æã ¬®­áâ஢
; RET
PUSH IX
PUSH AF
PUSH HL
PUSH DE
; ®£­¥­­ë© è à FIRE
LD IX,(MONSTR_END_T) ; ¢§ïâì ª®­¥æ â ¡«¨æë ¬®­áâ஢
CALL MONSTR_POS ; ¨­¨æ¨ «¨§¨à®¢ âì ­®¢®£® ¬®­áâà 
CALL MONSTR_F_INI ; ¤«ï ®£­ï
LD A,(X_COORD+1) ; ª®®à¤¨­ âë ᮢ¯ ¤ îâ á ¨£à®ª®¬
LD (IX-MONSTR_D_LEN+M_X+1),A
LD A,(Y_COORD+1)
LD (IX-MONSTR_D_LEN+M_Y+1),A
LD HL,(ANGLE_R) ; 㣮« ¯®¢®à®â  ¨£à®ª 
ADD HL,HL
ADD HL,HL
ADD HL,HL ; x8
LD A,H
AND 3Eh
LD L,A
LD H,0
LD DE,TAB_ANGLE3+03Eh ; ¢§ïâì ¨§ â ¡«¨æë ¯® ­ ¯à ¢«¥­¨î
EX DE,HL
SBC HL,DE ; ᪮à®áâì ¤«ï FIRE
LD A,(HL)
LD (IX-MONSTR_D_LEN+M_VX+1),A
LD (IX-MONSTR_D_LEN+M_VX),0
INC HL
LD A,(HL)
LD (IX-MONSTR_D_LEN+M_VY+1),A
LD (IX-MONSTR_D_LEN+M_VY),0
LD (MONSTR_END_T),IX ; á®åà ­¨âì ­®¢ë© ª®­¥æ
POP DE
POP HL
POP AF
POP IX
RET
MONSTR_POS3:
CALL MONSTR_POS
MONSTR_F_INI:
PUSH AF
LD A,(BFGF_PAGE)
LD (IX-MONSTR_D_LEN+M_PAGE),A
LD A,8 ; è à ®£­ï, ¨á祧 î騩 ®â ¯à¥¯ïâá⢨ï
LD (IX-MONSTR_D_LEN+M_VAR3),A
LD A,10h
LD (IX-MONSTR_D_LEN+M_VAR4),A
LD A,0
LD (IX-MONSTR_D_LEN+M_VAR2),A ; £®à¥âì ¡ëáâ॥ ¢á¥å
LD A,-4
LD (IX-MONSTR_D_LEN+M_VX+1),A
POP AF
RET
MONSTR_POS:
; ¬®­áâàë
; ¯à ¢¨«ì­® «¨ ¯à®áâ ¢«ïîâáï ª®®à¤¨­ âë
; ¯®á«¥ LDIR,   ­¥ ¤® ­¥£®???
PUSH HL ; ª®¯¨à®¢ ­¨¥ â ¡«¨æë ¬®­áâà 
PUSH DE
PUSH BC
PUSH IX
POP DE
LD HL,MONSTR_DAT
LD BC,MONSTR_D_LEN
LDIR
POP BC
POP DE
POP HL
PUSH DE
PUSH HL
PUSH AF
ADD HL,HL
ADD HL,HL
LD A,L
ADD A,2
LD (IX+M_X+1),A
LD A,H
ADD A,A
ADD A,A
ADD A,2
LD (IX+M_Y+1),A
LD DE,MONSTR_D_LEN
ADD IX,DE
LD (IX),0 ; ®ç¥à¥¤­®© ª®­¥æ â ¡«¨æë
POP AF
POP HL
POP DE
RET
;
;***************************************
;---------------[Tables]----------------
ALIGN 2,0
;
TABLES_START:
X_COORD: DW 090*256
Y_COORD: DW 090*256
ANGLE_A: DW -160*32+0C000h
ANGLE_R: DW 0
X_SPEED: DW 300H
Y_SPEED: DW 302H
A_SPEED: DW 200H
TABLE_TRACE: DS 33 ; â ¡«¨æ  âà áá¨à®¢ª¨/¡ ­ª¨ â ¡«¨æë
TABLE_WALL: DS 33
DS TABLES_START+#74-$ ;<E2809A><E282AC>ˆ<E2809A>ˆ
NAMES: DB 6,1
LAST_KEY: DB 0
DS TABLES_START+#7C-$ ;<E2809A><E282AC>ˆ<E2809A>ˆ
NAME1: DB "_1X62 CBL "
NAME2: DB "2NDREAL3CBL "
NAME3: DB "_ICT2 CBL "
;NAME4: DB "MISS2 CBL "
;NAME5: DB "5EL CBL "
NAME6: DB "_UNNY2 CBL "
NAME8: DB "94956C CBL "
NAME9: DB "_ENI511CCBL "
;
IFN NORM_syncPORT
im_handler_emul_proc_address:
di
push af
call KBD_INT
pop af
reti
BLOCK +(#FF - low $)
im_handler_emulator:
dw im_handler_emul_proc_address
ENDIF
;
OUTEND ; ª®­¥æ ä ©«  doom2.exe
;
;
DISPLAY "DOOM2.EXE starts - ",/H,BEGIN
DISPLAY "DOOM2.EXE ends - ",/H,$
DISPLAY "DOOM2.EXE size - ",/H,$-BEGIN
FRAM_PROG_1000H:
include 'D2_FRAM.asm'
;
END
;