2
0
Fork 0
original-dome/src/dome/dome.asm

8426 lines
98 KiB
NASM
Raw Normal View History

2018-12-24 23:50:41 +00:00
;--------------------------------------
; DOME
;
; (c) 1997 / 98 / 99 Paragon Productions
;
;--------------------------------------
DOS .equ 0x5
ENASLT .equ 0x24
GET_INT .equ 0x0100
PUT_INT .equ 0x0103
COLOR_WHITE .equ 0x0106
COLOR_BLACK .equ 0x0109
SCREEN_ON .equ 0x010C
SCREEN_OFF .equ 0x010F
SET_SCREEN0 .equ 0x0112
SET_SCREEN5 .equ 0x0115
SPRITES_ON .equ 0x0118
SPRITES_OFF .equ 0x011B
;PUT_SPRITE .equ 0x011E
SET_PAGE .equ 0x0121
GET_TIME .equ 0x0124
PUT_TXT .equ 0x0127
PUT_TXT2 .equ 0x012A
INIT_BIOS .equ 0x012D
EXIT_ON_ERR .equ 0x0130
LOAD .equ 0x0133
INIT_LIB .equ 0x0136
SAVE .equ 0x0139
PUT_PAGE_FD .equ 0x013C
PUT_PAGE_FE .equ 0x013F
INIT_REP .equ 0x0142
LOAD_MUS .equ 0x0145
LOAD_SAM .equ 0x0148
;PLAY .equ 0x014B
;STOP .equ 0x014E
FADE .equ 0x0151
NEXT .equ 0x0154
MUS_NR .equ 0x0157
POP_UP_START .equ 0x015A
;PUTBLK .equ 0x015D
PUT_COLOR .equ 0x0160
DOME_MENU_CALL .equ 0x0163
RESTORE_MEM .equ 0x0166
INIT_BIOS_MEM .equ 0x0169
RUN_GAME .equ 0x016C
;INT_ROUTINE .equ 0x016F
HOOK_ON .equ 0x0172
HOOK_OFF .equ 0x0175
INIT_INT .equ 0x0178
; last modification date 5-04-99
JIFFY .equ 0xFC9E ; wordt nog gebruikt
TANK_DATA .equ 32 ; 32 bytes
BUILD_DATA .equ 13
VELD_ADRES .equ 0x4000
TANKTAB .equ 0x2000
TANK1 .equ 0x2000+32 ;adres tank tabel !!!!!!!!!!!!!!!!!
TANKRED .equ 0x2000+128*TANK_DATA
;------------- DOME ---------------- kick off !!
.area _CODE
; org 0x8000
ST:
LD (EXIT_STACK),SP
CALL INIT_DUNE2
XOR A
LD (EVENT),A
MAIN_LOOP:
LD A,(FIRE_BUTTONS)
BIT 4,A
JR NZ,RESET_BUTTON0
CALL Z,CHECK_COOR
MAIN_LOOP2:
LD A,(FIRE_BUTTONS)
BIT 5,A
JR NZ,RESET_BUTTON1
CALL Z,CANCELACTION
MAIN_LOOP3:
; CALL CHK_SPATIE
; CALL Z,TEST_ADD_TNK
; CALL NZ,SPICE_BOOM
LD A,(STOP)
OR A
JP NZ,EXIT_DUNE2
CALL UPDATE_EVENT
JR MAIN_LOOP
UPDATE_EVENT:
LD A,(EVENT)
INC A
CP #6
JR NZ,UPD2
XOR A
UPD2:
LD (EVENT),A
LD HL,#EVENTHANDLER
SLA A
LD C,A
LD B,#0
ADD HL,BC
LD E,(HL)
INC HL
LD D,(HL)
EX DE,HL
JP (HL)
RESET_BUTTON0:
LD HL,#BUT_PRESSED
RES 0,(HL)
JR MAIN_LOOP2
RESET_BUTTON1:
LD HL,#BUT_PRESSED
RES 1,(HL)
JR MAIN_LOOP3
;-----------------------------------------
INIT_DUNE2:
LD A,#0
LD (B_BALK_NR),A
LD A,#8
LD (T_BALK_NR),A
LD A,#0
LD (B_BALK_TYPE),A
CALL INIT_BBAR
CALL MMODULE_INIT
LD HL,#CPYTT
LD B,#79
XOR A
LOOP0: LD (HL),A
INC HL
DJNZ LOOP0
LD (STOP),A
LD HL,(ADR)
LD BC,#9*256+17*4
ADD HL,BC
LD (ADR),HL
LD A,#18
LD (OFFSET),A
LD A,#10
LD (OFFSET+1),A
LD IX,#SPRATR+4 ; radar sprite
LD 0(IX),#128+10
LD 1(IX),#193+18
; even roode cc yard erbij
CALL MAKE_RED_BASE
CALL FREE_BLW_BASE ; creer gezichtsveld 1e keer
;--------------------
CALL PUT_SPRITE ; radarsprite
CALL INIT_RADAR ; maak radar
CALL PUT_MONEY ; plaatsmoney
CALL CLEAR_ITEM ; maak itemscherm schoon
CALL INIT_MOUSE ; start mouse lookup
LD HL,#INT_GAME
CALL PUT_INT ; PUT ADR DOME-INT
HALT ; geef buttons een kans
RET
;-------------------------------------
INIT_MOUSE:
LD A,#15
OUT (0xA0),A
IN A,(0xA2)
AND #0x8F
OR #0x30
LD (MOUSE_PORT),A
XOR A
LD (MOUSE_USE),A
LD (MOUSE_OFF),A
LD HL,#0x002D
LD A,#0 ;(0xFCC1) ; SLOT ADR BIOS = 0
CALL 0x0C ; interslot call
CP #3
JR Z,INIT_MOUSE_TR
LD A,#31
LD (MOUSE_WAIT1),A
LD A,#10
LD (MOUSE_WAIT2),A
RET
INIT_MOUSE_TR:
LD A,#31*5
LD (MOUSE_WAIT1),A
LD A,#10*5
LD (MOUSE_WAIT2),A
RET
;-----------------------------------------
EXIT_DUNE2:
JP EXIT_ON_ERR
RET
;-------------------------------------------------
; check op scrollen randjes
;------------------------------------------------
CHKXY:
LD IX,#SPRATR+4
CALL PUT_SPRITE
LD D,#4
SCRL:
LD A,(MOUSEX)
CP #245
JP NC,SCRL_R
CP #4
JP C,SCRL_L
LD A,(MOUSEY)
CP #200
JP NC,SCRL_D
CP #4
JP C,SCRL_U
LD A,(CURSOR_TYPE)
LD (MOUSE_SHAPE),A
RET
SCRL_R:
LD A,#16
LD (MOUSE_SHAPE),A
LD HL,#MAXSET
LD A,(OFFSET)
CP (HL)
RET Z
INC A
LD (OFFSET),A
INC 1(IX)
LD HL,(ADR)
LD B,#0
LD C,D
ADD HL,BC
LD (ADR),HL
CALL BUILD
JP CHKXY
SCRL_L:
LD A,#24
LD (MOUSE_SHAPE),A
LD A,(OFFSET)
CP #1
RET Z
DEC A
LD (OFFSET),A
DEC 1(IX)
LD HL,(ADR)
LD B,#0
LD C,D
SBC HL,BC
LD (ADR),HL
CALL BUILD
JP CHKXY
SCRL_D:
LD A,#20
LD (MOUSE_SHAPE),A
LD HL,#MAXSET+1
LD A,(OFFSET+1)
CP (HL)
RET Z
INC A
LD (OFFSET+1),A
INC 0(IX)
XOR A
LD HL,(ADR)
INC H
LD (ADR),HL
CALL BUILD
JP CHKXY
SCRL_U:
LD A,#12
LD (MOUSE_SHAPE),A
LD A,(OFFSET+1)
CP #1
RET Z
DEC A
LD (OFFSET+1),A
DEC 0(IX)
XOR A
LD HL,(ADR)
DEC H
LD (ADR),HL
CALL BUILD
JP CHKXY
;---------------- Tabel update !!!----------
CX: .db 0
CY: .db 0
UPDATE:
LD IX,#TANK1
UPDATELOOP:
LD A,13(IX)
OR A
CALL NZ,TEST_WAT_NU
LD DE,#TANK_DATA
ADD IX,DE
LD HL,#TOTTANK
DEC (HL)
JP NZ,UPDATELOOP
LD A,#254
LD (TOTTANK),A
RET
TOTTANK: .db 254
TEST_WAT_NU:
BIT 4,11(IX)
JP NZ,DO_MOVE
CALL IMPACT_GFX
BIT 6,11(IX)
JP NZ,DO_ATTACK
JP CHECK_MOVE
RET
DO_MOVE:
LD A,6(IX)
OR A
JR Z,UPDATEXY
DEC 6(IX) ; verlaag de step byte
LD A,4(IX) ; x offset
SUB 7(IX) ; x speed eraf
LD 4(IX),A
LD A,5(IX)
SUB 8(IX) ; y speed eraf
LD 5(IX),A
RET
UPDATEXY:
LD 4(IX),#0
LD 5(IX),#0
LD 6(IX),#0
LD 7(IX),#0
LD 8(IX),#0
BIT 5,23(IX) ; DIT BIT JE IS GUARD
CALL NZ,TNK_CHK ; KIJK EEN RONDJE OM ZICH HEEN
CHECK_MOVE:
BIT 5,11(IX)
CALL NZ,ATT_MOVE ; geen jump ?? WEL DUS !!
LD A,15(IX)
AND #0b11110000
JP NZ,AFWK_MOVE
LD A,0(IX)
SUB 2(IX)
LD B,A
LD A,#0
RL A
LD (CX),A
LD A,1(IX)
SUB 3(IX)
LD C,A
LD A,#0
RL A
LD (CY),A
LD A,B
OR C
JP Z,TURN_ROUND
XOR A
LD A,0x00(IX)
SUB 0x02(IX)
JP Z,J82F1
LD A,0x01(IX)
SUB 0x03(IX)
JP Z,J82E6
LD A,(CX)
OR A
JR Z,SCHUIN
LD A,(CY)
OR A
JP Z,POSITIE_2
JP POSITIE_4
SCHUIN: LD A,(CY)
OR A
JP Z,POSITIE_8
JP POSITIE_6
J82E6: LD A,(CX)
OR A
JP Z,POSITIE_7
JP POSITIE_3
J82F1: LD A,(CY)
OR A
JP Z,POSITIE_1
JP POSITIE_5
POSITIE_1:
LD B,0(IX)
LD C,1(IX)
CALL CALC_ADR
LD D,H
LD E,L
CALL CHKUP
LD A,#1
JP NZ,POS1_KAN
CALL CHKUPLT
LD A,#1+(8*16)
JP NZ,POS8_KAN
CALL CHKUPRI
LD A,#1+(2*16)
JP NZ,POS2_KAN
CALL CHKLT
LD A,#1+(7*16)
JP NZ,POS7_KAN
CALL CHKRI
LD A,#1+(3*16)
JP NZ,POS3_KAN
JP TANK_VAST
POSITIE_2:
LD B,0(IX)
LD C,1(IX)
CALL CALC_ADR
LD D,H
LD E,L
CALL CHKUPRI
LD A,#2
JP NZ,POS2_KAN
CALL CHKUP
LD A,#2+(1*16)
JP NZ,POS1_KAN
CALL CHKRI
LD A,#2+(3*16)
JP NZ,POS3_KAN
CALL CHKUPLT
LD A,#2+(8*16)
JP NZ,POS8_KAN
CALL CHKDORI
LD A,#2+(4*16)
JP NZ,POS4_KAN
JP TANK_VAST
POSITIE_3:
LD B,0(IX)
LD C,1(IX)
CALL CALC_ADR
LD D,H
LD E,L
CALL CHKRI
LD A,#3
JP NZ,POS3_KAN
CALL CHKUPRI
LD A,#3+(2*16)
JP NZ,POS2_KAN
CALL CHKDORI
LD A,#3+(4*16)
JP NZ,POS4_KAN
CALL CHKUP
LD A,#3+(1*16)
JP NZ,POS1_KAN
CALL CHKDN
LD A,#3+(5*16)
JP NZ,POS5_KAN
JP TANK_VAST
POSITIE_4:
LD B,0(IX)
LD C,1(IX)
CALL CALC_ADR
LD D,H
LD E,L
CALL CHKDORI
LD A,#4
JP NZ,POS4_KAN
CALL CHKDN
LD A,#4+(5*16)
JP NZ,POS5_KAN
CALL CHKRI
LD A,#4+(3*16)
JP NZ,POS3_KAN
CALL CHKUPRI
LD A,#4+(2*16)
JP NZ,POS2_KAN
CALL CHKDOLT
LD A,#4+(6*16)
JP NZ,POS6_KAN
JP TANK_VAST
POSITIE_5:
LD B,0(IX)
LD C,1(IX)
CALL CALC_ADR
LD D,H
LD E,L
CALL CHKDN
LD A,#5
JP NZ,POS5_KAN
CALL CHKDOLT
LD A,#5+(6*16)
JP NZ,POS6_KAN
CALL CHKDORI
LD A,#5+(4*16)
JP NZ,POS4_KAN
CALL CHKLT
LD A,#5+(7*16)
JP NZ,POS7_KAN
CALL CHKRI
LD A,#5+(3*16)
JP NZ,POS3_KAN
JP TANK_VAST
POSITIE_6:
LD B,0(IX)
LD C,1(IX)
CALL CALC_ADR
LD D,H
LD E,L
CALL CHKDOLT
LD A,#6
JP NZ,POS6_KAN
CALL CHKLT
LD A,#6+(7*16)
JP NZ,POS7_KAN
CALL CHKDN
LD A,#6+(5*16)
JP NZ,POS5_KAN
CALL CHKUPLT
LD A,#6+(8*16)
JP NZ,POS8_KAN
CALL CHKDORI
LD A,#6+(4*16)
JP NZ,POS4_KAN
JP TANK_VAST
POSITIE_7:
LD B,0(IX)
LD C,1(IX)
CALL CALC_ADR
LD D,H
LD E,L
CALL CHKLT
LD A,#7
JP NZ,POS7_KAN
CALL CHKDOLT
LD A,#7+(6*16)
JP NZ,POS6_KAN
CALL CHKUPLT
LD A,#7+(8*16)
JP NZ,POS8_KAN
CALL CHKUP
LD A,#7+(1*16)
JP NZ,POS1_KAN
CALL CHKDN
LD A,#7+(5*16)
JP NZ,POS5_KAN
JP TANK_VAST
POSITIE_8:
LD B,0(IX)
LD C,1(IX)
CALL CALC_ADR
LD D,H
LD E,L
CALL CHKUPLT
LD A,#8
JP NZ,POS8_KAN
CALL CHKUP
LD A,#8+(1*16)
JP NZ,POS1_KAN
CALL CHKLT
LD A,#8+(7*16)
JP NZ,POS7_KAN
CALL CHKUPRI
LD A,#8+(2*16)
JP NZ,POS2_KAN
CALL CHKDOLT
LD A,#8+(6*16)
JP NZ,POS6_KAN
JP TANK_VAST
POS1_KAN: LD 15(IX),A
POS10KAN: SET 4,0x0B(IX)
CALL RES_TANK_LAY
DEC H
LD (HL),A
DEC HL
DEC HL
LD A,(HL)
OR A
JR Z,POS10KAN1
LD (HL),B
POS10KAN1:
LD 0x09(IX),#0
LD A,0x0A(IX)
LD 0x07(IX),#0
; NEG
LD 0x08(IX),A
; NEG
LD 4(IX),#0
LD 5(IX),#16
DEC 1(IX) ; Y=Y-1
JP SPEED_STEP
POS2_KAN: LD 15(IX),A
POS20KAN: SET 4,0x0B(IX)
CALL RES_TANK_LAY
DEC H ; - 256
INC HL
INC HL
INC HL
INC HL ; + 4
LD (HL),A
DEC HL
DEC HL
LD A,(HL)
OR A
JR Z,POS20KAN1
LD (HL),B
POS20KAN1:
LD 0x09(IX),#1
LD A,0x0A(IX)
NEG
LD 0x07(IX),A
NEG
; NEG
LD 0x08(IX),A
; NEG
LD 4(IX),#-16
LD 5(IX),#16
INC 0(IX) ; X=X-1
DEC 1(IX) ; Y = Y -1
JP SPEED_STEP
POS3_KAN: LD 15(IX),A
POS30KAN: SET 4,0x0B(IX)
CALL RES_TANK_LAY
INC HL
INC HL
INC HL
INC HL
LD (HL),A
DEC HL
DEC HL
LD A,(HL)
OR A
JR Z,POS30KAN1
LD (HL),B
POS30KAN1:
LD 0x09(IX),#2
LD A,0x0A(IX)
NEG
LD 0x07(IX),A
NEG
LD 0x08(IX),#0
LD 4(IX),#-16
LD 5(IX),#0
INC 0(IX) ; X=X+1
JP SPEED_STEP
POS4_KAN: LD 15(IX),A
POS40KAN: SET 4,0x0B(IX)
CALL RES_TANK_LAY
INC HL
INC HL
INC HL
INC HL
INC H
LD (HL),A
DEC HL
DEC HL
LD A,(HL)
OR A
JR Z,POS40KAN1
LD (HL),B
POS40KAN1:
LD 0x09(IX),#3
LD A,0x0A(IX)
NEG
LD 0x07(IX),A
LD 0x08(IX),A
NEG
LD 4(IX),#-16
LD 5(IX),#-16
INC 0(IX) ; X=X-1
INC 1(IX) ; Y = Y -1
JP SPEED_STEP
POS5_KAN: LD 15(IX),A
POS50KAN: SET 4,0x0B(IX)
CALL RES_TANK_LAY
INC H
LD (HL),A
DEC HL
DEC HL
LD A,(HL)
OR A
JR Z,POS50KAN1
LD (HL),B
POS50KAN1:
LD 0x09(IX),#4
LD A,0x0A(IX)
NEG
LD 0x08(IX),A
NEG
LD 0x07(IX),#0
LD 4(IX),#0
LD 5(IX),#-16
INC 1(IX) ; Y = Y + 1
JP SPEED_STEP
POS6_KAN: LD 15(IX),A
POS60KAN: SET 4,0x0B(IX)
CALL RES_TANK_LAY
INC H
DEC HL
DEC HL
DEC HL
DEC HL
LD (HL),A
DEC HL
DEC HL
LD A,(HL)
OR A
JR Z,POS60KAN1
LD (HL),B
POS60KAN1:
LD 0x09(IX),#5
LD A,0x0A(IX)
; NEG
LD 0x07(IX),A
; NEG
NEG
LD 0x08(IX),A
NEG
LD 4(IX),#16
LD 5(IX),#-16
DEC 0(IX) ; X=X-1
INC 1(IX) ; Y = Y -1
JP SPEED_STEP
POS7_KAN: LD 15(IX),A
POS70KAN: SET 4,0x0B(IX)
CALL RES_TANK_LAY
DEC HL
DEC HL
DEC HL
DEC HL
LD (HL),A
DEC HL
DEC HL
LD A,(HL)
OR A
JR Z,POS70KAN1
LD (HL),B
POS70KAN1:
LD 0x09(IX),#6
LD A,0x0A(IX)
LD 0x07(IX),A
LD 0x08(IX),#0
LD 4(IX),#16
LD 5(IX),#0
DEC 0(IX) ; X=X-1
JP SPEED_STEP
POS8_KAN: LD 15(IX),A
POS80KAN: SET 4,0x0B(IX)
CALL RES_TANK_LAY
DEC HL
DEC HL
DEC HL
DEC HL
DEC H
LD (HL),A
DEC HL
DEC HL
LD A,(HL)
OR A
JR Z,POS80KAN1
LD (HL),B
POS80KAN1:
LD 0x09(IX),#7
LD A,0x0A(IX)
; NEG
LD 0x07(IX),A
LD 0x08(IX),A
; NEG
LD 4(IX),#+16
LD 5(IX),#16
DEC 0(IX) ; X=X-1
DEC 1(IX) ; Y = Y -1
JP SPEED_STEP
TANK_VAST: LD A,0(IX) ; kan geen kant op !!
LD 2(IX),A
LD A,1(IX)
LD 3(IX),A
LD 15(IX),#0
LD 7(IX),#0
LD 8(IX),#0
RET
AFWK_MOVE: LD A,15(IX)
AND #0b00001111
LD HL,#CHK_TABEL
DEC A
SLA A
SLA A
LD C,A
LD B,#0
ADD HL,BC
PUSH HL
LD DE,#DYNACALL+1
LD A,(HL)
LD (DE),A
INC HL
INC DE
LD A,(HL)
LD (DE),A
LD B,0(IX)
LD C,1(IX)
CALL CALC_ADR
CALL DYNACALL
POP HL
JR Z,J84FB
LD 15(IX),#0
INC HL
INC HL
LD DE,#DYNAJUMP+1
LD A,(HL)
LD (DE),A
INC DE
INC HL
LD A,(HL)
LD (DE),A
JP DYNAJUMP
RET
J84FB: LD HL,#CHK_TABEL
LD A,15(IX)
AND #0b11110000
SRL A
SRL A
SUB #4
LD C,A
LD B,#0
ADC HL,BC
PUSH HL
LD DE,#DYNACALL+1
LD A,(HL)
LD (DE),A
INC HL
INC DE
LD A,(HL)
LD (DE),A
LD B,0(IX)
LD C,1(IX)
CALL CALC_ADR
CALL DYNACALL
POP HL
JR Z,REVERSE_MOVE
INC HL
INC HL
LD DE,#DYNAJUMP+1
LD A,(HL)
LD (DE),A
INC DE
INC HL
LD A,(HL)
LD (DE),A
JP DYNAJUMP
RET
REVERSE_MOVE:
LD 15(IX),#0
RET
DYNACALL: CALL 0x0
RET
DYNAJUMP: JP 0x0
CHK_TABEL:
.dw CHKUP+2
.dw POS10KAN
.dw CHKUPRI+2
.dw POS20KAN
.dw CHKRI+2
.dw POS30KAN
.dw CHKDORI+2
.dw POS40KAN
.dw CHKDN+2
.dw POS50KAN
.dw CHKDOLT+2
.dw POS60KAN
.dw CHKLT+2
.dw POS70KAN
.dw CHKUPLT+2
.dw POS80KAN
ATT_MOVE: ; ;attack en doel zoeken
BIT 3,11(IX)
JP NZ,ATT_MOVE_B ; op 1 is gebouw aanvallen
LD A,11(IX) ; type tank
AND #0b00000111
SLA A
LD HL,#RADARS
LD C,A
LD B,#0
ADD HL,BC
LD E,(HL)
INC HL
LD D,(HL)
EX DE,HL
LD A,14(IX)
PUSH IX
CALL A_TO_IX
LD B,0(IX) ; doel enemy
LD C,1(IX) ; doel enemy
POP IX
LD D,0(IX)
LD E,1(IX)
CHECK_AROUND: LD A,(HL)
CP #100
JR Z,END_CHK_RND
XOR A
LD A,B
ADC A,(HL)
CP D
INC HL
JR NZ,J85A0
XOR A
LD A,C
ADC A,(HL)
CP E
JR Z,FND_TARGET
J85A0:
INC HL
JP CHECK_AROUND
FND_TARGET:
LD A,B ; set geattacked coor in ix+20 & 21
LD 20(IX),A
LD A,C
LD 21(IX),A
LD E,(HL)
DEC HL
LD D,(HL)
CALL CALC_RICHT
LD A,0(IX) ; set x en y op einde
LD 2(IX),A
LD A,1(IX)
LD 3(IX),A
RES 4,11(IX) ; reset move bit
RES 5,11(IX) ; reset att move bit
SET 6,11(IX) ; set att bit
POP AF ; return adres van stack af einde
; ; update subroutine
RET
END_CHK_RND: ; eindcoordinaat
LD 2(IX),B
LD 3(IX),C
RET
;-------------------------------
; ATTACK GEBOUW
;-------------------------------
ATT_MOVE_B:
LD A,11(IX) ; type tank
AND #0b00000111
SLA A
LD HL,#RADARS
LD C,A
LD B,#0
ADD HL,BC
LD E,(HL)
INC HL
LD D,(HL)
EX DE,HL
LD B,2(IX) ; doel gebouw
LD C,3(IX) ; doel gebouw (loopt echt niet weg !)
LD D,0(IX) ; gebouw kan hooguit al kapot zijn!
LD E,1(IX) ; huidige coordinaten
CHECKAROUND2: LD A,(HL)
CP #100
RET Z ;nog niet in zicht dus rij maardoor
XOR A
LD A,B
ADC A,(HL)
CP D
INC HL
JR NZ,CONT_001
XOR A
LD A,C
ADC A,(HL)
CP E
JR Z,FND_TAR_BLD
CONT_001:
INC HL
JP CHECKAROUND2
FND_TAR_BLD:
CALL COLOR_WHITE
LD E,(HL)
DEC HL
LD D,(HL)
CALL CALC_RICHT
LD A,0(IX)
LD 2(IX),A
LD A,1(IX)
LD 3(IX),A
LD 4(IX),#0
LD 5(IX),#0
RES 5,11(IX)
SET 6,11(IX) ; set do_attack bitje
RET
;----------------------------------
; berekend de richting waarheen de tank moet staan !
;--------------------------------
CALC_RICHT:
LD C,#4
LD A,D
OR A
JR Z,TARGET_XNUL
RL A
JR C,TARGET_XNEG
LD A,E
OR A
JR Z,TARGET_YNUL
RL A
JR C,TARGET_YNEG
INC C
TARGET_YNUL:
INC C
TARGET_YNEG:
INC C
JP SET_RICHTING
TARGET_XNEG:
LD A,E
OR A
JR Z,TARGET_YNUL2
RL A
JR C,TARGET_YNEG2
DEC C
TARGET_YNUL2:
DEC C
TARGET_YNEG2:
DEC C
JP SET_RICHTING
TARGET_XNUL:
RL E
LD C,#0
JR NC,SET_RICHTING
LD C,#4
JP SET_RICHTING
SET_RICHTING:
LD 9(IX),C ; radar found bitje ook weer op 0
RET
;---------------------------------------
TURN_ROUND:
RES 4,11(IX) ; move uit !
LD A,13(IX)
CP #127
JR NC,CONT_TURNR
BIT 7,9(IX)
JR NZ,CONT_TURNR
SET 7,9(IX)
LD A,11(IX) ; type tank
AND #0b00000111
SLA A
LD HL,#RADARS
LD C,A
LD B,#0
ADD HL,BC
LD E,(HL)
INC HL
LD D,(HL)
TURN_LOOP:
LD A,(DE)
CP #100
JR Z,CONT_TURNR
ADD 1(IX)
LD C,A
INC DE
LD A,(DE)
ADD 0(IX)
LD B,A
LD (FOG_COOR),BC
CALL CALC_ADR
DEC HL
INC DE
LD A,(HL)
OR A
JR Z,TURN_LOOP
PUSH DE
LD (HL),#0 ; reveal fog of war
INC HL
CALL POINT
LD D,A ; inhoud adres
LD BC,(FOG_COOR)
LD A,C
LD C,B
LD B,A
SRL B
RR C
CALL D_TO_POINT
POP DE
JR TURN_LOOP
FOG_COOR: .dw 0
CONT_TURNR:
LD A,11(IX)
AND #0b00000111 ; GEEN DRAAI HARV/COUNTER ATT
JP Z,AI_HARVB ; DE AI VAN DE BLAUWE HARV
BIT 5,23(IX)
CALL NZ,TNK_CHK ; GUARD FUNCTIE VOOR ROOD ALLEEN
LD A,(TURN_WAIT)
DEC A
LD (TURN_WAIT),A
RET NZ
LD A,R
AND #0b00001111
LD (TURN_WAIT),A
LD A,9(IX)
LD B,A
LD A,R ;refresh is random ??
AND #0b00000011 ; yes!!! is coool
OR A
RET Z
CP #2
JP Z,T_ROUND_DEC
INC B
JP Z,UPDATE_TURN
T_ROUND_DEC:
DEC B
UPDATE_TURN:
LD A,9(IX)
AND #0b10000000
OR B ; fout correctie !
AND #0b10000111 ; radar update bitje meenemen
LD 9(IX),A
RET
TURN_WAIT: .db 10
;---------------------------------------------
DO_ATTACK: ; attack iets ??
CALL SHOOT_GFX
DEC 18(IX)
RET NZ
BIT 3,11(IX)
JP NZ,DO_ATT_BLD
LD L,13(IX) ; eigen nummer
LD A,19(IX) ; wait time before shot
LD 18(IX),A
LD A,14(IX) ; nummer van slachtoffer
LD (QUAKE),A ;
LD H,16(IX) ; power
LD E,20(IX)
LD D,21(IX)
PUSH IX
CALL A_TO_IX
LD A,4(IX) ; offset is niet 0 !!!
OR 5(IX)
JR NZ,STOP_ATTACK
LD A,0(IX)
CP E
JR NZ,STOP_ATTACK
LD A,1(IX)
CP D
JR NZ,STOP_ATTACK
; attack kan !
LD A,H
SUB 17(IX) ; -shield
LD B,A
LD A,12(IX) ; power van QUAKE
SUB B
LD 12(IX),A
JR NC,CONT_ATTACK
CALL REMOVE_TANK
POP IX
RET
CONT_ATTACK:
SET 4,22(IX) ; voor inslag ani 0e frame
; BIT 5,23(IX) ; schiet nooit terug
;JR NZ,CONTATTACK2 ; jajajaja dit werkt lekker
LD 14(IX),L ; nummer degene die schiet
LD A,11(IX) ; harvest filteren
AND #0b00000111
JR Z,CONTATTACK3
RES 3,11(IX) ; reset attack build !!!
RES 4,11(IX) ; move uit
SET 5,11(IX) ; attack move aan
CALL TNK_CHK_HELP
CONTATTACK2:
POP IX
SET 1,22(IX) ; voor schiet ani
RET
CONTATTACK3:
LD 14(IX),L
POP IX
SET 1,22(IX)
RET
STOP_ATTACK:
LD A,13(IX)
POP IX
LD 14(IX),A
RES 6,11(IX)
SET 5,11(IX)
RET
DO_ATT_BLD:
LD A,14(IX)
CALL A_TO_BLD
LD A,0(IY) ;geen gebouw
OR A
JR Z,STOP_ATT_B
SET 1,22(IX) ; schiet ani
LD A,19(IX) ; wait time before shot
LD 18(IX),A
LD A,16(IX) ;power TAnk
SUB 7(IY) ; -shield VAN GEBOUW
LD B,A
LD A,6(IY) ; power van GEBOUW
SUB B
LD 6(IY),A
JR Z,KILL_B
RET NC ; alles is goed schiet nog maar eens
KILL_B:
PUSH IX
CALL REMOVE_BUILD
POP IX
STOP_ATT_B:
RES 6,11(IX) ; kappe met schietn
RES 5,11(IX)
RET
;------------------------------------
SPEED_STEP: LD B,A
LD C,#0
LD A,#16
J8608: SUB B
JR Z,J860F
INC C
JP J8608
J860F: LD 6(IX),C
RET
;--------------------------------------
SHOOT_GFX:
LD A,22(IX)
AND #0b00000110
OR A
RET Z
LD IY,#IMPACT0
SLA A
SLA A
SLA A
LD B,A
LD A,#144
ADD B
LD 0(IY),A
CALL COPY_SHOOT
LD A,22(IX)
LD C,A
AND #0b11111001
LD B,A
LD A,C
AND #0b00000110
SRL A
INC A
AND #0b00000011
SLA A
OR B
LD 22(IX),A
RET
IMPACT_GFX:
LD A,22(IX)
AND #0b00110000
OR A
RET Z
LD IY,#IMPACT0
LD B,A
LD A,#192
ADD B
LD 0(IY),A
CALL COPY_SHOOT
LD A,22(IX)
LD C,A
AND #0b11001111
LD B,A
LD A,C
AND #0b00110000
SRL A
SRL A
SRL A
SRL A
INC A
AND #0b00000011
SLA A
SLA A
SLA A
SLA A
OR B
LD 22(IX),A
RET
COPY_SHOOT:
LD BC,(OFFSET) ; tank in veld ??
LD A,0(IX)
SUB C
RET C
CP #10
RET NC
LD A,1(IX)
SUB B
RET C
CP #10
RET NC
EXX
LD HL,(OFFSET)
LD A,0(IX)
SUB L
INC A
ADD A
ADD A
ADD A
ADD A
LD 4(IY),A
; CP 16
; RET C
; CP 161
; RET NC
LD A,1(IX)
SUB H
INC A
ADD A
ADD A
ADD A
ADD A
LD 6(IY),A
; CP 16
; RET C
; CP 161
; RET NC
LD A,(SWAP) ; ??? waarom
LD 7(IY),A
CALL PUTBLK
EXX
RET
;-------------------------------------
CHKUP:
LD H,D
LD L,E
DEC H
JP CHK_ALL
CHKDN:
LD H,D
LD L,E
INC H
JP CHK_ALL
CHKRI:
LD H,D
LD L,E
LD BC,#4
ADD HL,BC
JP CHK_ALL
CHKLT:
LD H,D
LD L,E
LD BC,#-4
ADC HL,BC
JP CHK_ALL
CHKUPRI:
LD H,D
LD L,E
DEC H
LD BC,#4
ADD HL,BC
JP CHK_ALL
CHKDORI:
LD H,D
LD L,E
INC H
LD BC,#4
ADD HL,BC
JP CHK_ALL
CHKDOLT:
LD H,D
LD L,E
INC H
LD BC,#-4
ADC HL,BC
JP CHK_ALL
CHKUPLT:
LD H,D
LD L,E
DEC H
LD BC,#-4
ADC HL,BC
CHK_ALL:
LD A,(HL)
CP #80
JP NC,RETURN_VAST
CHK_TANK_OBJ:
INC HL ; 2 byte van velddata
LD A,(HL) ; tank nummer
OR A
JP Z,RETURN_LOS
RETURN_VAST:
XOR A
OR A
RET
RETURN_LOS:
LD A,#1
OR A
RET
;------------------------------------------------
; update het radar scherm en je money
;------------------------------------------------
RADAR_UPDATE:
LD A,(RADAR)
INC A
AND #0b00000011
LD (RADAR),A
CP #2 ; eens in de 4 keer
JR Z,MAKE_RAD_MON
JP NZ,SHOW_POWER
RET
MAKE_RAD_MON:
; ; alle tanks even doorlopen
LD B,#254
LD IX,#TANK1
LD C,#TANK_DATA
MAKE_RAD_LP1:
LD A,13(IX)
OR A
JR Z,MAKE_RAD_END
PUSH BC
LD D,0(IX)
LD E,1(IX)
LD B,24(IX)
LD C,25(IX)
LD A,D
CP B
JR NZ,MAKE_RAD_LP2
LD A,E
CP C
JR Z,MAKE_RAD_END2
MAKE_RAD_LP2:
CALL CALC_ADR
DEC HL
LD A,(HL)
OR A
JR NZ,MAKE_RAD_END3
INC HL
PUSH DE ; ligt aan CALC_ADR
CALL POINT
; ; vlak in A
LD D,A
CALL PLACE_UNIT
POP BC ; nieuwe coor in BC
LD 24(IX),B
LD 25(IX),C
CALL CALC_ADR
DEC HL
LD A,(HL)
OR A
JR NZ,MAKE_RAD_END2
INC HL
CALL POINT2
LD D,A
CALL PLACE_UNIT
MAKE_RAD_END2:
POP BC
MAKE_RAD_END:
LD A,B
LD B,#0
ADD IX,BC
LD B,A
DJNZ MAKE_RAD_LP1
RET
MAKE_RAD_END3:
LD 24(IX),D
LD 25(IX),E
JR MAKE_RAD_END2
PLACE_UNIT:
LD C,24(IX)
LD B,25(IX)
SRL B
RR C
D_TO_POINT:
LD HL,#96
ADD HL,BC ; hahyahah hihihiih lache he
LD B,H
LD C,L
DI
LD A,#1
CALL SETVDP2
LD A,D
OUT (0x98),A ; oude positie weg
EI
LD H,B
LD L,C
DI
LD A,#3
CALL SETVDP2
LD A,D
OUT (0x98),A
EI
RET
POINT:
LD A,L
AND #0b00000111
CP #0b00000001
JR NZ,POINT_R
EX DE,HL
LD A,(DE)
LD HL,#RAD_COL_TAB_L
SRL A
SRL A
SRL A
SRL A ; / 16
LD C,A
LD B,#0
ADD HL,BC ; adres
LD A,(HL)
EX AF,AF
INC DE
INC DE
INC DE
LD A,(DE)
OR A
JR NZ,POINT_L_Z
INC DE
LD A,(DE)
LD HL,#RAD_COL_TAB_R
SRL A
SRL A
SRL A
SRL A
LD C,A
LD B,#0
ADD HL,BC
LD D,(HL)
EX AF,AF
OR D
RET
POINT_L_Z:
LD D,#0
EX AF,AF
OR D
RET
POINT_R:
EX DE,HL
LD A,(DE)
LD HL,#RAD_COL_TAB_R
SRL A
SRL A
SRL A
SRL A ; / 16
LD C,A
LD B,#0
ADD HL,BC ; adres
LD A,(HL)
EX AF,AF
DEC DE
DEC DE
DEC DE
DEC DE
DEC DE
LD A,(DE)
OR A
JR NZ,POINT_R_Z
INC DE
LD A,(DE)
LD HL,#RAD_COL_TAB_L
SRL A
SRL A
SRL A
SRL A
LD C,A
LD B,#0
ADD HL,BC
LD D,(HL)
EX AF,AF
OR D
RET
POINT_R_Z:
LD D,#0
EX AF,AF
OR D
RET
POINT2:
LD A,L
AND #0b00000111
CP #0b00000001
JR NZ,POINT2_R
EX DE,HL
LD A,13(IX)
CP #128
JR C,POINT2_1
LD A,#0b10100000
JR POINT2_2
POINT2_1:
LD A,#0b11010000
POINT2_2:
EX AF,AF
INC DE
INC DE
INC DE
LD A,(DE)
OR A
JR NZ,POINT2_L_Z
INC DE
INC DE
LD A,(DE)
OR A
JR Z,POINT2_23
CP #128
JR C,POINT2_22
LD D,#0b00001010
JR POINT2_24
POINT2_22:
LD D,#0b00001101
JR POINT2_24
POINT2_23:
DEC DE
LD A,(DE)
LD HL,#RAD_COL_TAB_R
SRL A
SRL A
SRL A
SRL A
LD C,A
LD B,#0
ADD HL,BC
LD D,(HL)
POINT2_24:
EX AF,AF
OR D
RET
POINT2_L_Z:
LD D,#0
EX AF,AF
OR D
RET
POINT2_R:
EX DE,HL
LD A,13(IX)
CP #128
JR C,POINT2_3
LD A,#0b00001010
JR POINT2_4
POINT2_3:
LD A,#0b00001101
POINT2_4:
EX AF,AF
DEC DE
DEC DE
DEC DE
DEC DE
DEC DE
LD A,(DE)
OR A
JR NZ,POINT2_R_Z
INC DE
INC DE
LD A,(DE)
OR A
JR Z,POINT2_43
CP #128
JR C,POINT2_42
LD D,#0b10100000
JR POINT2_44
POINT2_42:
LD D,#0b11010000
JR POINT2_44
POINT2_43:
DEC DE
LD A,(DE)
LD HL,#RAD_COL_TAB_L
SRL A
SRL A
SRL A
SRL A
LD C,A
LD B,#0
ADD HL,BC
LD D,(HL)
POINT2_44:
EX AF,AF
OR D
RET
POINT2_R_Z:
LD D,#0
EX AF,AF
OR D
RET
RAD_COL_TAB_R:
.db 0b00000001
.db 0b00000010
.db 0b00000011
.db 0b00000100
.db 0b00000100
.db 0b00000101
.db 0b00001101
.db 0b00001101
.db 0b00001010
.db 0b00001010
RAD_COL_TAB_L:
.db 0b00010000
.db 0b00100000
.db 0b00110000
.db 0b01000000
.db 0b01000000
.db 0b01010000
.db 0b11010000
.db 0b11010000
.db 0b10100000
.db 0b10100000
;------------------------------------
INIT_RADAR: LD DE,#VELD_ADRES
LD HL,#96
LD (VDPADR),HL
LD A,#1
CALL SETVDP
LD B,#64 ; hoogte v.d. radar ?
J89B7: PUSH BC
LD B,#32 ; lengte
J89BB:
LD A,(DE)
OR A
LD A,#0
JR NZ,INIT_RADAR2
PUSH BC
PUSH DE
INC DE
EX DE,HL
CALL POINT
POP DE
POP BC
INIT_RADAR2:
OUT (0x98),A
INC DE
INC DE
INC DE
INC DE
INC DE
INC DE
INC DE
INC DE
DJNZ J89BB
LD HL,(VDPADR)
LD BC,#128
ADD HL,BC
LD (VDPADR),HL
LD A,#1
CALL SETVDP
POP BC
DJNZ J89B7
LD HL,#0
XOR A
CALL SETVDP
LD IY,#RADCOP
CALL SPRITES_OFF
CALL PUTBLK
CALL SPRITES_ON
RET
SETVDP: DI
OUT (0x99),A
LD A,#14
SET 7,A
OUT (0x99),A
SET 6,H
RES 7,H
LD A,L
OUT (0x99),A
LD A,H
OUT (0x99),A
EI
RET
SETVDP2:
OUT (0x99),A
LD A,#14
SET 7,A
OUT (0x99),A
SET 6,H
RES 7,H
LD A,L
OUT (0x99),A
LD A,H
OUT (0x99),A
RET
;------------ BUILD -------------------
; main build event
;--------------------------------------
BUILD:
; XOR A
; LD (0xFC9E),A
LD A,(SWAP)
XOR #1
LD (SWAP),A
CALL VELD
CALL TANKS
CALL BUILD_SEL
LD A,(ISTEXT)
OR A
CALL NZ,PUT_TEXT
LD A,(SWAP)
ADD A ; dit schijnt sneller te zijn !
ADD A ; DAN SLA, SLA ,SLA EN SLA SLA
ADD A
ADD A
ADD A
ADD #31
DI ; nu altijd in int. dus ...
OUT (0x99),A
LD A,#2+128
OUT (0x99),A
EI
RET
BUILD_SEL:
LD A,(ITEMSELECTED)
CP #128
RET C
LD IX,(P_BUILD)
BUILD_SEL1:
LD DE,(OFFSET)
LD A,2(IX)
SUB E
SLA A
SLA A
SLA A
SLA A
ADD #16
LD H,A
LD A,3(IX)
SUB D
SLA A
SLA A
SLA A
SLA A
ADD #16
LD L,A
LD A,2(IX)
LD B,A
LD A,(OFFSET)
LD C,A
DEC A
CP B
JP NC,BUILD_SEL3
ADD A,#10
CP B
RET C
LD A,3(IX)
LD B,A
LD A,(OFFSET+1)
LD C,A
DEC A
CP B
JP NC,BUILD_SEL2
ADD A,#10
CP B
RET C
LD IY,#COP_BSEL_1
LD 4(IY),H
LD 6(IY),L
EXX
CALL PUTBLK
EXX
BUILD_SEL2:
LD A,3(IX)
ADD 5(IX)
DEC A
LD B,A
LD A,(OFFSET+1)
LD C,A
DEC A
CP B
RET NC
ADD A,#10
CP B
JP C,BUILD_SEL3
LD IY,#COP_BSEL_2
LD A,5(IX)
DEC A
SLA A
SLA A
SLA A
SLA A
ADD L
LD 4(IY),H
LD 6(IY),A
EXX
CALL PUTBLK
EXX
BUILD_SEL3:
LD A,2(IX)
ADD 4(IX)
DEC A
LD B,A
LD A,(OFFSET)
LD C,A
DEC A
CP B
RET NC
ADD A,#10
CP B
RET C
LD A,3(IX)
LD B,A
LD A,(OFFSET+1)
LD C,A
DEC A
CP B
JP NC,BUILD_SEL4
ADD A,#10
CP B
RET C
LD IY,#COP_BSEL_3
LD A,4(IX)
DEC A
SLA A
SLA A
SLA A
SLA A
ADD H
LD 4(IY),A
LD 6(IY),L
EXX
CALL PUTBLK
EXX
BUILD_SEL4:
LD A,3(IX)
ADD 5(IX)
DEC A
LD B,A
LD A,(OFFSET+1)
LD C,A
DEC A
CP B
RET NC
ADD A,#10
CP B
RET C
LD IY,#COP_BSEL_4
LD A,5(IX)
DEC A
SLA A
SLA A
SLA A
SLA A
ADD L
LD 6(IY),A
LD A,4(IX)
DEC A
SLA A
SLA A
SLA A
SLA A
ADD H
LD 4(IY),A
EXX
JP PUTBLK
RET
TANKS:
LD IY,#TNKCOP
LD 2(IY),#160
LD 10(IY),#16
LD 8(IY),#16
LD 0(IY),#0
LD A,(SWAP)
LD 7(IY),A
XOR A
LD (SELECTED),A
LD HL,#CPYTT
FIELD_LOOP: ; ; eerst alles binnen kader
LD A,(HL)
OR A
JR Z,REMOVE_SPR ; klaar !!!
PUSH HL
CALL HL_TO_IX ; elke unit 1 keer
FIELD:
JP PTANK
IN_SCREEN:
POP HL
LD (HL),#3 ; binnen scherm voor ontplof tabel
BIT 7,11(IX)
JR Z,J8C14
LD IX,#SPRATR+8
LD A,4(IY)
LD 1(IX),A
LD A,6(IY)
LD 0(IX),A
EXX
CALL PUT_SPRITE
EXX
LD A,#1
LD (SELECTED),A
JP J8C14
CONT2:
POP HL
J8C14:
INC HL
INC HL
JP FIELD_LOOP
REMOVE_SPR: LD A,(SELECTED)
OR A
JR NZ,RAND1
LD IX,#SPRATR+8
LD 0(IX),#212
CALL PUT_SPRITE
RAND1:
LD HL,#CPYTT
RAND1_LOOP:
LD A,(HL)
OR A
JR Z,RAND2
CP #2
JR NC,RAND1_4
LD BC,(OFFSET) ; c=x & b=y
CALL HL_TO_IX
LD A,C
SUB 0(IX)
JR Z,RAND1_6
DEC A
JR NZ,RAND1_4
LD A,4(IX) ; mogelijkheid 3 check
BIT 7,A
JR NZ,RAND1_4
RAND1_6:
DEC C
DEC B
LD A,0(IX)
SUB C
ADD A
ADD A
ADD A
ADD A ; x * 16
LD C,A ; 0 v 16
LD A,1(IX)
SUB B
ADD A
ADD A
ADD A
ADD A
ADD 5(IX)
LD B,A ; y* 16 + offset
LD A,4(IX)
OR A
JR Z,RAND1_4 ; positie 1 op 0 punt
CP #-16
JR Z,RAND1_4
LD A,C
ADD 4(IX)
LD C,A
LD A,B
CP #16
JR C,RAND1_4
CP #161
JR NC,RAND1_4
PUSH HL
CALL PTANK_RI
POP HL
LD (HL),#2
RAND1_4:
INC HL
INC HL
JP RAND1_LOOP
RAND2:
LD HL,#CPYTT
RAND2_LOOP:
LD A,(HL)
OR A
JR Z,RAND3
CP #2
JR NC,RAND2_4
LD BC,(OFFSET) ; c=x & b=y
CALL HL_TO_IX
LD A,B ; cp y offset
SUB 1(IX)
JR Z,RAND2_6 ; ligt ie binnen de randjes !
DEC A
JR NZ,RAND2_4
LD A,5(IX) ; mogelijkheid 3 check
BIT 7,A
JR NZ,RAND2_4
RAND2_6:
DEC C
DEC B
LD A,0(IX)
SUB C
ADD A
ADD A
ADD A
ADD A ; x * 16 + OFFSET
ADD 4(IX)
LD C,A
LD A,1(IX)
SUB B
ADD A
ADD A
ADD A
ADD A
LD B,A ; y* 16
LD A,5(IX)
OR A
JR Z,RAND2_4 ; positie 1 op 0 punt
CP #-16
JR Z,RAND2_4
LD A,B
ADD 5(IX)
LD B,A
LD A,C
CP #16
JR C,RAND2_4
CP #161
JR NC,RAND2_4
PUSH HL
CALL PTANK_DN
POP HL
LD (HL),#2
RAND2_4:
INC HL
INC HL
JP RAND2_LOOP
RAND3:
LD HL,#CPYTT
RAND3_LOOP:
LD A,(HL)
OR A
JR Z,RAND4
CP #2
JR NC,RAND3_4
LD BC,(OFFSET) ; c=x & b=y
LD A,C
ADD #10
LD C,A
CALL HL_TO_IX
LD A,C
SUB 0(IX)
JR Z,RAND3_6
DEC A
JR Z,RAND3_5
JP RAND3_4
RAND3_6:
LD A,4(IX) ; mogelijkheid 4 check
BIT 7,A
JR Z,RAND3_4
RAND3_5:
DEC C
DEC B
LD A,0(IX)
SUB C
ADD A
ADD A
ADD A
ADD A ; x * 16
ADD #160 ; einde rand erbij
LD C,A ; 160 v 176 eruit
LD A,1(IX)
SUB B
ADD A
ADD A
ADD A
ADD A
ADD 5(IX)
LD B,A ; y* 16 + offset
LD A,4(IX)
OR A
JR Z,RAND3_4 ; positie 1 op 0 punt
CP #16
JR Z,RAND3_4
LD A,C
ADD 4(IX)
LD C,A
LD A,B
CP #16
JR C,RAND3_4
CP #161
JR NC,RAND3_4
PUSH HL
CALL PTANK_LT
POP HL
LD (HL),#2
RAND3_4:
INC HL
INC HL
JP RAND3_LOOP
RAND4:
LD HL,#CPYTT
RAND4_LOOP:
LD A,(HL)
OR A
RET Z
CP #2
JR NC,RAND4_4
LD BC,(OFFSET) ; c=x & b=y
LD A,B
ADD #10
LD B,A
CALL HL_TO_IX
LD A,B
SUB 1(IX)
JR Z,RAND4_6
DEC A
JR Z,RAND4_5
JP RAND4_4
RAND4_6:
LD A,5(IX) ; mogelijkheid 4 check
BIT 7,A
JR Z,RAND4_4
RAND4_5:
DEC C
DEC B
LD A,0(IX)
SUB C
ADD A
ADD A
ADD A
ADD A ; x * 16 +offset
ADD 4(IX)
LD C,A
LD A,1(IX)
SUB B
ADD A
ADD A
ADD A
ADD A
ADD #160
LD B,A ; y* 16 + offset
LD A,5(IX)
OR A
JR Z,RAND4_4 ; positie 1 op 0 punt
CP #16
JR Z,RAND4_4
LD A,B
ADD 5(IX)
LD B,A
LD A,C
CP #16
JR C,RAND4_4
CP #161
JR NC,RAND4_4
PUSH HL
CALL PTANK_UP
POP HL
LD (HL),#2
RAND4_4:
INC HL
INC HL
JP RAND4_LOOP
;-------------------------------------
; .include the AI.ASM !
.include "ai_new.asm"
;-----------------------------------
; ALLERLEI ZOOI
;-----------------------------------
ALGEMEEN:
CALL RED_DEAD
; CALL PUT_MONEY
CALL PUT_FPS
CALL CHECK_BUILD
CALL UPDATE_STEPS
CALL MSELECTED
CALL REP_UPGR
CALL COMMANDO
ONTPLOFFEN:
LD A,(PLOF_COUNT)
OR A
RET Z ; helemaal nix
LD B,A
LD IX,#PLOF_TABEL-3
LABEL0003:
INC IX
INC IX
INC IX
LD A,2(IX)
OR A
JR Z,LABEL0003
EXX
CALL NZ,DOE_ONTPLOF
EXX
DJNZ LABEL0003
RET ; geen ontploffingen !
DOE_ONTPLOF:
CP #11
JR Z,ENDPLOF
LD IY,#PLOF_COP
ADD A
ADD A
ADD A
ADD A
LD 0(IY),A
CALL PLOF_IN_RAND
LD A,B
OR A
JP Z,DOE_ONTPLOF2
LD HL,(OFFSET)
LD A,0(IX)
SUB L
INC A
ADD A
ADD A
ADD A
ADD A
LD 4(IY),A
LD A,1(IX)
SUB H
INC A
ADD A
ADD A
ADD A
ADD A
LD 6(IY),A
LD A,(SWAP)
LD 7(IY),A
CALL PUTBLK
DOE_ONTPLOF2:
INC 2(IX)
RET
ENDPLOF:
XOR A
LD 0(IX),A
LD 1(IX),A
LD 2(IX),A
LD A,(PLOF_COUNT)
DEC A
LD (PLOF_COUNT),A
RET
PLOF_IN_RAND:
LD B,#0
LD HL,(OFFSET)
LD A,L
ADD A,#10
LD E,A
LD A,H
ADD A,#10
LD D,A
LD A,0(IX)
CP L
RET C
CP E
RET NC
LD A,1(IX)
CP H
RET C
CP D
RET NC
LD B,#1
RET
REP_UPGR:
LD IX,#BUILDING1
LD C,#BUILD_DATA
LD B,#50 ; max
REPAIR_LOOP:
BIT 0,8(IX)
CALL NZ,DO_REPAIR
BIT 1,8(IX)
CALL NZ,DO_UPGRADE
LD A,B
LD B,#0
ADD IX,BC
LD B,A
DJNZ REPAIR_LOOP
RET
DO_REPAIR:
INC 6(IX)
LD A,6(IX)
CP #255
RET NZ
RES 0,8(IX)
CALL RES_MENU
RET
DO_UPGRADE:
INC 11(IX)
LD A,11(IX)
OR A
RET NZ
RES 1,8(IX)
CALL RES_MENU
INC 9(IX) ; upgrade lev 1 up
LD A,1(IX)
CP #7 ; yard is +1 upgrade
JR Z,UPGR_BBAR
CP #4
JR Z,UPGR_TBAR
RET
RES_MENU:
XOR A
LD (ACTIVE_MENU),A
PUSH IX
POP DE
LD HL,(P_BUILD)
SBC HL,DE
RET NZ
PUSH BC
LD (P_BUILD),IX
CALL P_BLD_IMG ; reset build img
CALL COMMAND_B
LD IX,(P_BUILD)
POP BC ; terug in loop
RET
UPGR_BBAR:
LD A,(UPG_LEV_BLD)
CP #3
RET Z ; max upg lev bereikt
EXX
PUSH IX
INC A
LD (UPG_LEV_BLD),A
ADD #4 ; ????
ADD A ; *2
ADD A ; *4
LD C,A
LD B,#0
LD HL,#BBB_VALUE
ADD HL,BC
LD (HL),#1 ; maak beschikbaar
CALL INIT_BBAR
POP IX
EXX
XOR A
LD (IS_BLD_UPGRADING),A
RET ; terug in loop
UPGR_TBAR:
LD A,(UPG_LEV_UNT)
CP #4
RET Z
EXX
INC A
LD (UPG_LEV_UNT),A
ADD A
ADD A
LD C,A
LD B,#0
LD HL,#TBB_VALUE
ADD HL,BC
LD (HL),#1
PUSH IX
CALL INIT_BBAR
POP IX
EXX
XOR A
LD (IS_UNT_UPGRADING),A
RET
MSELECTED:
LD A,(HAS_SELECT)
OR A
RET Z
XOR A
LD (TOTAL_SELECT),A
LD HL,(OFFSET)
LD A,(SEL_X0)
SRL A
SRL A
SRL A
SRL A
ADD L
LD B,A ; X0
LD A,(SEL_X1)
SRL A
SRL A
SRL A
SRL A
ADD L
LD C,A ; X1
LD A,(SEL_Y0)
SRL A
SRL A
SRL A
SRL A
ADD H
LD D,A ; Y0
LD A,(SEL_Y2)
SRL A
SRL A
SRL A
SRL A
ADD H
LD E,A ; Y2
LD HL,#CPYTT
LOOP_MSEL:
LD A,(HL)
OR A
RET Z
CP #3
JR NZ,LOOP_MSEL2
INC HL
LD A,(HL)
PUSH HL
CALL IN_MSEL
POP HL
INC HL
JR LOOP_MSEL
LOOP_MSEL2:
INC HL
INC HL
JR LOOP_MSEL
IN_MSEL:
PUSH BC
CALL A_TO_IX
POP BC
BIT 7,13(IX) ;type tank
RET NZ
RES 0,22(IX)
LD A,0(IX)
LD H,A
CP B
RET C
CP C
RET NC
LD A,1(IX)
LD L,A
CP D
RET C
CP E
RET NC
LD A,(TOTAL_SELECT)
CP #25
RET Z ; niet meer erbij !
INC A
LD (TOTAL_SELECT),A
LD A,#1
LD (MSELECT_ON),A
SET 0,22(IX)
RET
RED_DEAD:
LD A,(BLD_CNT_RED)
LD A,(CHK_RED_DEAD)
INC A
AND #0b00111111
LD (CHK_RED_DEAD),A
RET NZ
CHK_RED:
LD HL,#TANKRED
LD BC,#13
ADD HL,BC
LD DE,#TANK_DATA
LD B,#128
LP_CHK_RED:
BIT 7,(HL)
RET NZ
ADD HL,DE
DJNZ LP_CHK_RED
LD A,#1
LD (STOP),A
RET
CHK_RED_DEAD:
.db 0
COMMANDO:
LD A,(MBUSY)
OR A
RET NZ
LD A,(ITEMSELECTED)
OR A
RET Z
CP #127
JR NC,COMM_BLD
DEC A
JP Z,COMM_TNK_RED
DEC A
JR Z,COMM_HRV_RED
RET
COMM_BLD:
CP #192
RET NC ; geen rood gebouw
LD HL,(P_BUILD)
LD BC,#8
ADD HL,BC
LD A,(ACTIVE_MENU)
BIT 0,(HL)
JR Z,COMM_BLD2
LD IY,#MENU_RED_REP
LD B,#8
CP B
JR NZ,COMM_BLD3
RET
COMM_BLD2:
BIT 1,(HL)
RET Z
LD IY,#MENU_RED_UPG
LD B,#9
CP B
RET Z
COMM_BLD3:
LD A,B
LD (ACTIVE_MENU),A
PUSH IY
CALL COMMAND_B
POP IY
JP PUTBLK
COMM_HRV_RED:
LD HL,(TNKADR)
LD BC,#11
ADD HL,BC
LD A,(ACTIVE_MENU)
BIT 4,(HL)
JR Z,COMM_HRV_RED2
EX AF,AF
LD BC,#15
ADD HL,BC
LD A,(HL)
OR A
JR Z,COMM_HRV_RED1
EX AF,AF
LD IY,#MENU_RED_RET
LD B,#11
CP B
RET Z
JR COMM_HRV_RED3
COMM_HRV_RED1:
EX AF,AF
LD IY,#MENU_RED_MOV
LD B,#4
CP B
RET Z
JR COMM_HRV_RED3
COMM_HRV_RED2:
LD BC,#11
ADD HL,BC ; ix+22
BIT 7,(HL)
JR Z,COMM_HRV_RED22
LD IY,#MENU_RED_HRV
LD B,#10 ; 10 is harvsten menu
CP B
RET Z
JR COMM_HRV_RED3
COMM_HRV_RED22:
LD IY,#MENU_RED_STP
LD B,#1
CP B
RET Z
COMM_HRV_RED3:
LD A,B
LD (ACTIVE_MENU),A
PUSH IY
CALL COMMAND_HARV
POP IY
JP PUTBLK
COMM_TNK_RED:
LD HL,(TNKADR)
LD BC,#11
ADD HL,BC
LD A,(ACTIVE_MENU)
BIT 4,(HL)
JR Z,COMM_TNK_RED2
LD IY,#MENU_RED_MOV
LD B,#4
CP B
JR NZ,COMM_TNK_RED4
RET
COMM_TNK_RED2:
BIT 6,(HL)
JR Z,COMM_TNK_RED3
LD IY,#MENU_RED_ATT
LD B,#6
CP B
JR NZ,COMM_TNK_RED4
RET
COMM_TNK_RED3:
LD IY,#MENU_RED_STP
LD B,#1
CP B
RET Z
COMM_TNK_RED4:
LD A,B
LD (ACTIVE_MENU),A
PUSH IY
CALL COMMAND_TANK
POP IY
JP PUTBLK
ACTIVE_MENU:
.db 0
;----------------------------------------------
; Check op bouwen gebouwen steps ??
;--------------------------------------------
CHECK_BUILD:
LD HL,#BBB_VALUE
LD B,#18 ; max 18 was 13
L_CHK_BUILD1:
PUSH BC
LD A,(HL)
CP #2
CALL Z,CHECK_BUILD2
CP #3
CALL Z,READY_BUILD2
POP BC
INC HL
INC HL
INC HL
INC HL
DJNZ L_CHK_BUILD1
RET
CHECK_BUILD2:
LD A,B
CP #6 ; lager/gelijk aan 5 is AI
RET C
; ; B-5 doen ?
LD A,B ; correctie voor lus 13
SUB #5
LD B,A
LD A,#14 ; max 13
SUB B
LD B,A
LD A,(B_BALK_TYPE)
OR A
LD A,(B_BALK_NR)
JR Z,CHECK_BUILD22
LD A,(T_BALK_NR) ; is het visible ???
CHECK_BUILD22:
CP B
RET NC
ADD A,#4
CP B
RET C
LD IY,#BB_STEPS_BAR
SUB #4
LD C,A
LD A,B
SUB C
ADD A
ADD A
ADD A
ADD A
ADD A
ADD #2
LD 4(IY),A
PUSH HL
INC HL
INC HL
LD A,(HL)
SRL A
SRL A
SRL A
INC A
LD 10(IY),A
CALL PUTBLK
LD A,7(IY)
XOR #1
LD 7(IY),A
CALL PUTBLK
POP HL
RET
READY_BUILD2:
LD A,B
CP #6
JP C,AI_CREATE_CAR
LD A,B ; hack correctie is weg te werken !
SUB #5
LD B,A
EX AF,AF
LD A,B
CP #6
LD A,(B_BALK_NR)
JR NC,READY_BUILD22
LD A,(T_BALK_NR)
READY_BUILD22:
LD E,A
LD (HL),#4 ; kan ook 3 zijn
LD A,#13 ; building + tanks
SUB B
LD B,A
LD D,A
INC B
EX AF,AF
CP #6
JR C,CREATE_CAR ; create car ook als niet vis
LD A,(B_BALK_TYPE)
OR A
RET NZ ; if tbar visible then NOT
LD A,E ; is het visible ???
CP B
RET NC
ADD A,#4
CP B
RET C
LD C,E
LD A,B
SUB C
DEC A
ADD A
ADD A
ADD A
ADD A
ADD A
ADD #32
LD E,A
LD A,D
ADD A
ADD A
ADD A
ADD A
ADD A
LD D,A
PUSH HL
LD IY,#BB_BLW_COP
CALL PUTBLK
CALL BB_PUT_BUILD
LD IY,#BB_READY_COP
CALL PUTBLK
CALL P_BB_PART
POP HL
RET
;-----------------------------------------
CREATE_CAR:
LD C,E
LD A,B
SUB C
DEC A
ADD A
ADD A
ADD A
ADD A
ADD A
ADD #32
LD E,A
EX AF,AF
LD A,D
LD (TYPE_OF_CAR),A
PUSH HL ; push bb_bar adres
LD HL,#BUILDING1
INC HL
LD C,#BUILD_DATA
LD B,#25 ; 25 gebouwen van jou
LOOP_CRT_CAR:
PUSH HL
PUSH BC
LD A,(HL)
CP #4 ; gevonden ? dan createcar
CALL Z,CREATE_CAR2
POP BC
POP HL
LD A,B
LD B,#0
ADD HL,BC
LD B,A
DJNZ LOOP_CRT_CAR
JR CANT_CREATE_TNK
RET ; mag eigenlijk niet hier komen
; komt hier als geen enkele factory kan plaatsen
CREATE_CAR2:
; ; if gevonden POP stack en cont
; ; else RET
INC HL
LD B,(HL) ; ?
DEC B
INC HL
LD C,(HL) ; hoekje factory
CALL CALC_ADR
LD DE,#FACTORY_DEPLOY
CREATE_CAR2_LP:
LD A,(DE)
CP #100
RET Z ; volgende factory
PUSH HL
LD A,(DE)
LD C,A
INC DE
LD A,(DE)
LD B,A
INC DE
ADD HL,BC
LD A,(HL)
CP #80
JR NC,CREATE_CAR2_LP2 ; kan niet op rots of huis
INC HL
LD A,(HL)
OR A
JR NZ,CREATE_CAR2_LP2 ; kan niet op tank
JR CREATE_CAR3
CREATE_CAR2_LP2:
POP HL
JR CREATE_CAR2_LP
RET ; probeer volgende factory
CREATE_CAR3:
POP AF ; adres
POP AF ; stack
POP AF ; BC from 1st loop
POP AF ; building data
LD BC,#VELD_ADRES
SBC HL,BC
SRL L
SRL L
LD A,L
LD L,H
LD H,A
LD A,(TYPE_OF_CAR)
LD D,A
LD A,#12
SUB D
LD C,A
LD B,#1 ;blauw
CALL ADD_TANK
; ; add tank kan ook fout gaan
OR A
JR Z,CANT_CREATE_TNK
POP HL ; adres bb_bar
LD (HL),#1 ; clear tank bar
INC HL ; dit pas NA dat
LD A,(HL) ; de tank gebouwd is
INC HL
DEC A
LD (HL),A
LD A,(B_BALK_TYPE)
OR A
RET Z
LD A,(TYPE_OF_CAR)
SUB #8
ADD A
ADD A
ADD A
ADD A
ADD A
LD D,A
EX AF,AF
OR A
RET Z
LD E,A
LD IY,#BB_BLW_COP
CALL PUTBLK
CALL BB_PUT_BUILD
JP P_BB_PART
RET
CANT_CREATE_TNK:
; ; bbar een stapje terug doen zodat ie
; ; weer in de queue stapt
POP HL
LD (HL),#2
INC HL
LD A,#255
SUB (HL)
INC HL
LD (HL),A
RET ; en even een message
TYPE_OF_CAR: .db 0
;----------------------------------
; check mouse na druk op knop
;----------------------------------
CHECK_COOR:
LD HL,#BUT_PRESSED
SET 0,(HL)
LD DE,(MOUSEY)
LD A,D
CP #16
JR C,AREA3
CP #176
JR NC,AREA3
LD A,E
CP #16
JR C,AREA3
CP #176
JR NC,AREA3
LD A,#1 ; VOOR MSEL
LD (PLAYFIELD),A
LD A,(MBUSY) ; doe commando
OR A
JP NZ,EXEC_COMMAND
JP WHICH_OBJECT ; pak een tank
AREA3:
XOR A
LD (PLAYFIELD),A
LD A,D
CP #193
JR C,AREA4
CP #255
JR NC,AREA4
LD A,E
CP #128
JR C,AREA4
CP #192
JR NC,AREA4
JP MOVE_RAD_SCR
AREA4: LD A,D
CP #200
JR C,AREA5
CP #248
JR NC,AREA5
LD A,E
CP #16
JR C,AREA5
CP #104
JR NC,AREA5
JP WHICH_ITEM
AREA5:
LD A,D
CP #32
JR C,AREA51
CP #160
JR NC,AREA51
LD A,E
CP #176
JR C,AREA51
JP SEL_FROM_BB
AREA51:
LD A,D
CP #16
JR C,AREA6
CP #32
JR NC,AREA6
LD A,E
CP #176
JR C,AREA6
CP #200
JR NC,AREA6
JP SCRL_BB_L
AREA6:
LD A,D
CP #160
JR C,AREA6A
CP #176
JR NC,AREA6A
LD A,E
CP #176
JR C,AREA6A
CP #200
JR NC,AREA6A
JP SCRL_BB_R
AREA6A:
LD A,D
CP #226
JR C,AREA6B
CP #246
JR NC,AREA6B
LD A,E
CP #192
JR C,AREA6B
CP #200
JR NC,AREA6B
JP SCRL_BB_UP
AREA6B:
LD A,D
CP #194
JR C,AREA7
CP #224
JR NC,AREA7
LD A,E
CP #192
JR C,AREA7
CP #200
JR NC,AREA7
JP SCRL_BB_DN
AREA7:
LD A,D ; option
CP #80
JR C,AREA8
CP #128
JR NC,AREA8
LD A,E
CP #0
JR C,AREA8
CP #12
JR NC,AREA8
JP OPTION_MENU
AREA8:
LD A,D
CP #16
JR C,AREA9
CP #64
JR NC,AREA9
LD A,E
CP #0
JR C,AREA9
CP #12
JR NC,AREA9
LD A,#1
LD (STOP),A
RET
AREA9:
RET
;--------------------------------------------
WHICH_OBJECT:
CALL XYTO16
LD B,D
LD C,E
CALL CALC_ADR
DEC HL
LD A,(HL)
OR A
RET NZ ; op onzichtbaar
INC HL
INC HL
LD A,(HL)
OR A
JP Z,WHICH_OBJCT2 ; geen tank !!!
CALL A_TO_IX
LD B,13(IX)
LD IY,(TNKADR)
LD A,13(IY)
CP B
RET Z ; dezelfde tank !
RES 7,11(IY)
LD (TNKADR),IX
CALL P_TNK_IMG
BIT 7,13(IX) ; soort bit
JR NZ,ENEMY_SELTD
LD A,#100
LD (ISTEXT),A
LD A,R
AND #0b00000011
CALL INIT_TEXT
XOR A
LD (ACTIVE_MENU),A
LD A,11(IX)
AND #0b00000111
JR Z,HARV_SELTD
LD A,#1
LD (ITEMSELECTED),A
; CALL COMMAND_TANK ;gebeurt al in COMMANDO
CALL SHOW_POWER
SET 7,11(IX)
RET
HARV_SELTD:
LD A,#2
LD (ITEMSELECTED),A
; CALL COMMAND_HARV
CALL SHOW_POWER
SET 7,11(IX)
RET
ENEMY_SELTD:
LD A,#32
LD (ITEMSELECTED),A
CALL COMMAND_ENM ; misschien cursor type reset
CALL SHOW_POWER
SET 7,11(IX)
RET ; klaar dus uit de loop
WHICH_OBJCT2:
DEC HL
LD A,(HL)
CP #96
RET C
CP #160
RET Z
LD C,#7 ; yard
CP #100
JR C,LOOP0_OBJCT2
LD C,#1 ; windtrap
CP #104
JR C,LOOP0_OBJCT2
LD C,#2 ; ref
CP #110
JR C,LOOP0_OBJCT2
LD C,#5 ; radar
CP #114
JR C,LOOP0_OBJCT2
LD C,#3 ; silo
CP #118
JR C,LOOP0_OBJCT2
LD C,#4
CP #124
JR C,LOOP0_OBJCT2
LD C,#7
CP #132
JR C,LOOP1_OBJCT2
LD C,#1
CP #136
JR C,LOOP1_OBJCT2
LD C,#4
CP #156
JR C,LOOP1_OBJCT2
RET
LOOP0_OBJCT2:
LD IX,#BUILDING1
LD B,#25 ; 25 blauwe
LD H,#128 ; voor itemselected
JP LOOP0_OBJ2
LOOP1_OBJCT2:
LD IX,#BUILDING1+24*BUILD_DATA
LD H,#192 ; itemsel
LD B,#25 ; 25 x rood
LOOP0_OBJ2:
PUSH BC
LD A,1(IX)
CP C
JR NZ,LOOP0_OBJ21
LD A,2(IX)
DEC A
CP D
JR NC,LOOP0_OBJ21
ADD 4(IX)
CP D
JR C,LOOP0_OBJ21
LD A,3(IX)
DEC A
CP E
JR NC,LOOP0_OBJ21
ADD 5(IX)
CP E
JR C,LOOP0_OBJ21
LD IY,(TNKADR)
RES 7,11(IY)
LD (P_BUILD),IX
LD A,H ; itemselected = 128 + c ???
ADD C ; YARD is 128
LD (ITEMSELECTED),A
CP #191
JR NC,ENEMY_BUILD
CALL COMMAND_B
JR LAB0023
ENEMY_BUILD:
CALL COMMAND_ENM ; misschien cursor type reset
LAB0023:
CALL P_BLD_IMG
CALL SHOW_POWER
POP BC
LD HL,#TANKTAB ; tnkadr resetten op 0
LD (TNKADR),HL
XOR A
LD (ACTIVE_MENU),A
RET ; building gevonden !!!
LOOP0_OBJ21:
LD BC,#BUILD_DATA
ADD IX,BC
POP BC
DJNZ LOOP0_OBJ2
RET
;-----------------------------------------
; PUT TANK IMAGE
;-------------------------------------------
P_TNK_IMG:
LD IY,#GRAY_ITEM
CALL PUTBLK
LD IY,#TANK_IMG
LD A,11(IX)
AND #0b00000111
LD B,A
LD A,#4
SUB B
ADD A
ADD A
ADD A
ADD A
ADD A
LD 0(IY),A
CALL PUTBLK
LD IY,#PUT_ITEM
LD 7(IY),#0
CALL PUTBLK
LD 7(IY),#1
CALL PUTBLK
RET
;-----------------------------------------
; PUT BUILDING IMAGE
;-------------------------------------------
P_BLD_IMG:
LD IY,#GRAY_ITEM
CALL PUTBLK
LD IY,#BUILD_IMG
LD A,1(IX)
ADD A
ADD A
ADD A
ADD A
ADD A
LD 0(IY),A
CALL PUTBLK
LD IY,#PUT_ITEM
LD 7(IY),#0
CALL PUTBLK
LD 7(IY),#1
CALL PUTBLK
RET
;-------------------------------------------------
MOVE_RAD_SCR: ;
LD IX,#SPRATR+4
LD HL,#VELD_ADRES+260 ;ADR+193 !!!
LD A,D
CP #246
JR C,MOV_RAD_SCR1
LD A,#245
MOV_RAD_SCR1: LD 1(IX),A
SUB #193
LD C,A
INC A
LD (OFFSET),A
SLA C
SLA C
LD B,#0
ADD HL,BC
LD A,E
CP #181
JR C,MOV_RAD_SCR2
LD A,#180
MOV_RAD_SCR2: LD 0(IX),A
SUB #128
LD C,A
INC A
LD (OFFSET+1),A
LD B,C
LD C,#0
ADD HL,BC
LD BC,(ADR)
LD (ADR),HL
XOR A
SBC HL,BC
RET Z
CALL PUT_SPRITE
JP BUILD ; om ontploffen niet buiten build om
;------------------------------------
WHICH_ITEM: LD A,(MBUSY)
OR A
JP NZ,CHK_CANCEL
LD A,(ITEMSELECTED)
OR A
RET Z
CP #191 ; enemy building
RET NC
CP #64 ; bb bar
JR NC,BUILDING_COM
CP #31 ; geen enemy of gebouw ??
RET NC
CP #2 ; eigen harv
JR Z,HARV_COMMAND
TANK_COMMAND:
LD A,E
CP #96
JR NC,TANK_CANCEL ; moet eigenlijk stop zijn !!
CP #88
JR NC,TANK_GUARD
CP #80
JP NC,TANK_MOVE
CP #72
JP NC,TANK_ATTACK
RET
HARV_COMMAND:
LD A,E
CP #96
JP NC,HARV_RETURN ; return !
CP #88
JR NC,TANK_GUARD ; stop !
CP #80
JP NC,TANK_MOVE ; gewoon een move
CP #72
JR NC,TANK_ATTACK ; wordt opgevat als harvest
RET
BUILDING_COM:
LD A,E
CP #96
JP NC,BUILD_CANCEL
CP #88
RET NC
CP #80
JP NC,BUILD_UPGR
CP #72
JP NC,BUILD_REP
RET
CHK_CANCEL:
LD A,E
CP #96
RET C
CHK_CANCEL2:
LD A,(ITEMSELECTED)
OR A
RET Z
CP #64
JR NC,CANCEL_BB
CP #31 ; enemy selected geen cancel
RET NC
CP #2
JR Z,CANCEL_HARV
CANCEL_TANK:
XOR A
LD (MBUSY),A
LD (CURSOR_TYPE),A
CALL COMMAND_TANK
RET
CANCEL_HARV:
XOR A
LD (MBUSY),A
LD (CURSOR_TYPE),A
CALL COMMAND_HARV ; command harv!!
RET
CANCEL_BB:
XOR A
LD (MBUSY),A
LD (CURSOR_TYPE),A
LD (ITEMSELECTED),A
CALL CLEAR_ITEM
JP BB_CANCEL
TANK_CANCEL:
CALL CLEAR_ITEM
LD IX,(TNKADR)
RES 7,11(IX)
LD HL,#TANKTAB
LD (TNKADR),HL
RET
TANK_GUARD: LD IX,(TNKADR)
LD A,0(IX)
LD 2(IX),A
LD A,1(IX)
LD 3(IX),A
RES 5,11(IX)
RES 6,11(IX)
RES 7,22(IX) ;eigenlijk alleen voor harvesters :)
RET
TANK_ATTACK:
CALL CANCEL_ITEM
LD A,#2
LD (MBUSY),A
LD A,#28
LD (CURSOR_TYPE),A
RET
TANK_MOVE:
CALL CANCEL_ITEM
LD A,#1
LD (MBUSY),A
LD A,#28
LD (CURSOR_TYPE),A
RET
EXEC_COMMAND:
XOR A
LD (ACTIVE_MENU),A
LD A,(ITEMSELECTED)
CP #1
JR Z,TNK_COMMAND
CP #2
JR Z,HRV_COMMAND
CP #128 ; gebouw geselecteerd ??
RET NC
CP #64 ; alles tussen 64 - 128
JP NC,BB_COMMAND
RET ; enemy
HRV_COMMAND:
LD A,(MBUSY)
CP #1
JR Z,TNK_COM_MOVE
CP #2
JP Z,HRV_COM_HRV
RET
TNK_COMMAND: LD A,(MBUSY)
CP #1
JR Z,TNK_COM_MOVE
CP #2
JR Z,TNK_COM_ATT
RET
TNK_COM_MOVE: CALL XYTO16
LD IX,(TNKADR)
LD 2(IX),D
LD 3(IX),E
RES 5,11(IX)
RES 6,11(IX)
RES 7,22(IX) ;harvest bitje uit
XOR A
LD 26(IX),A ; harvest wachttijd uit
LD A,(MSELECT_ON)
OR A
CALL NZ,MOVE_MSEL
LD A,(ITEMSELECTED)
CP #1
CALL Z,COMMAND_TANK
CP #2
CALL Z,COMMAND_HARV
XOR A
LD (MBUSY),A
LD (CURSOR_TYPE),A
RET
MOVE_MSEL:
BIT 0,22(IX)
RET Z
LD A,#127 ; tanksum
LD BC,#TANK_DATA
LD IX,#TANK1
LD IY,#DEST_OFFSET
LP_MOVE_MSEL:
BIT 0,22(IX)
CALL NZ,DO_SEL_MOVE
ADD IX,BC
DEC A
RET Z
JP LP_MOVE_MSEL
DO_SEL_MOVE:
EX AF,AF
LD A,0(IY)
ADD A,D
LD 2(IX),A
LD A,1(IY)
ADD A,E
LD 3(IX),A
INC IY
INC IY
EX AF,AF
RES 5,11(IX)
RES 6,11(IX)
RES 7,22(IX) ;harvest bitje uit
RET
TNK_COM_ATT:
LD IX,(TNKADR)
RES 6,11(IX)
CALL XYTO16
LD B,D
LD C,E
CALL CALC_ADR
LD A,(HL)
CP #80
JR C,TNK_COM_ATT2
CP #144
JR NC,TNK_COM_ATT2
JP TNK_ATT_BLD
TNK_COM_ATT2:
INC HL
LD A,(HL) ; geen rooie
CP #128
RET C
LD 14(IX),A ; nummer enemy tank
RES 3,11(IX) ; je valt een tank aan
SET 5,11(IX)
LD 2(IX),D ; x en y van enemy
LD 3(IX),E
LD A,(MSELECT_ON) ; multiple select attack
OR A
CALL NZ,ATT_MSEL
J8895: XOR A
LD (MBUSY),A
LD (CURSOR_TYPE),A
CALL COMMAND_TANK
RET
ATT_MSEL:
BIT 0,22(IX)
RET Z
LD B,#127 ; tnksum
LD C,#TANK_DATA
LD IX,#TANK1
LP_ATT_MSEL:
BIT 0,22(IX)
CALL NZ,DO_SEL_ATT
LD A,B
LD B,#0
ADD IX,BC
LD B,A
DJNZ LP_ATT_MSEL
RET
DO_SEL_ATT:
; zorg dat de harvesters niet in ATTSEL zitten !!!
LD A,11(IX)
AND #0b00000111
OR #0
RET Z
RES 3,11(IX)
SET 5,11(IX)
LD 2(IX),D
LD 3(IX),E
LD A,(HL)
LD 14(IX),A
RET
TNK_ATT_BLD:
SET 3,11(IX) ;ATT BUILDING
SET 5,11(IX)
LD 2(IX),D
LD 3(IX),E ; rij erheen
LD IY,#BUILDING1
LD B,#50 ; 50 blauwe
LOOP1_OBJ2:
PUSH BC
LD A,2(IY)
DEC A
CP D
JR NC,LOOP1_OBJ21
ADD 4(IY)
CP D
JR C,LOOP1_OBJ21
LD A,3(IY)
DEC A
CP E
JR NC,LOOP1_OBJ21
ADD 5(IY)
CP E
JR C,LOOP1_OBJ21
POP BC
LD H,0(IY) ;nummer gebouw
LD 14(IX),H
LD A,(MSELECT_ON) ; multiple select attack
OR A ; on building
CALL NZ,ATT_MSEL2
JP J8895 ; menu goed
LOOP1_OBJ21:
LD BC,#BUILD_DATA
ADD IY,BC
POP BC
DJNZ LOOP1_OBJ2
RET ; als het goed is komt ie hier nooit !
ATT_MSEL2:
BIT 0,22(IX)
RET Z
LD IX,#TANK1
LD B,#127 ; tnksum
LD C,#TANK_DATA
LP_ATT_MSEL2:
BIT 0,22(IX)
CALL NZ,DO_SEL_ATT2
LD A,B
LD B,#0
ADD IX,BC
LD B,A
DJNZ LP_ATT_MSEL2
RET
DO_SEL_ATT2:
;zorg dat de harvesters niet in ATTSEL zitten !!!
LD A,11(IX)
AND #0b00000111
OR #0
RET Z
SET 3,11(IX)
SET 5,11(IX)
LD 2(IX),D
LD 3(IX),E
LD 14(IX),H
RET
;----------------------------------
HRV_COM_HRV:
CALL XYTO16
PUSH DE
LD B,D
LD C,E
CALL CALC_ADR
POP DE
LD A,(HL)
CP #16
RET C
CP #48
RET NC
LD IX,(TNKADR)
LD 2(IX),D
LD 3(IX),E
SET 7,22(IX)
CALL COMMAND_HARV
XOR A
LD (MBUSY),A
LD (CURSOR_TYPE),A
RET
HARV_RETURN:
LD A,#50 ; timer wait bij refinery
LD 26(IX),A
LD IX,(TNKADR)
HARV_RETURN2:
LD HL,#BUILDING1
INC HL
LD DE,#BUILD_DATA
LD B,#25 ; max
HARV_R_LOOP:
LD A,(HL)
CP #2
JR Z,HARV_RET2
HARV_R_LOOP2:
ADD HL,DE
DJNZ HARV_R_LOOP
RET
HARV_RET2:
PUSH HL
POP IY
LD A,11(IY) ; eigenlijk ix+12 :) = bezet byte
OR A
JR NZ,HARV_R_LOOP2
LD 11(IY),#1
INC HL
LD A,(HL)
ADD #3
LD 2(IX),A
INC HL
LD A,(HL)
ADD #2
LD 3(IX),A
RET
BUILD_REP:
LD IX,(P_BUILD)
LD A,6(IX)
INC A
RET Z
BIT 1,8(IX)
RET NZ
SET 0,8(IX)
RET
BUILD_UPGR:
LD IX,(P_BUILD)
LD A,10(IX)
SUB 9(IX)
RET Z
BIT 0,8(IX) ; repair is busy
RET NZ
LD A,1(IX)
CP #7
JR Z,BUILD_UPGR2
LD A,(IS_UNT_UPGRADING)
OR A
RET NZ
SET 1,8(IX)
LD A,#1
LD (IS_UNT_UPGRADING),A
RET
BUILD_UPGR2:
LD A,(IS_BLD_UPGRADING)
OR A
RET NZ
SET 1,8(IX)
LD A,#1
LD (IS_BLD_UPGRADING),A
RET
BUILD_CANCEL:
LD HL,#BUT_PRESSED
BIT 0,(HL)
RET NZ
LD IX,(P_BUILD)
BIT 0,8(IX)
JR NZ,BUILD_CANCEL3
BIT 1,8(IX)
JR NZ,BUILD_CANCEL2
JP CLEAR_ITEM
BUILD_CANCEL2:
RES 1,8(IX)
LD 11(IX),#0 ; upgrade lev op 0
LD A,1(IX)
CP #7
JR Z,BUILD_CANCEL4
XOR A
LD (IS_UNT_UPGRADING),A
JR BUILD_CANCEL3
BUILD_CANCEL4:
XOR A
LD (IS_BLD_UPGRADING),A
BUILD_CANCEL3:
RES 0,8(IX)
SET 0,(HL)
XOR A
LD (ACTIVE_MENU),A
CALL COMMAND_B
RET
;---------------------------------------
BB_COMMAND:
LD A,(BB_BLOCKED)
OR A
RET NZ
LD A,(ITEMSELECTED)
CP #64
JR Z,P_BETON
CP #65
JP Z,P_WINDTRAP
CP #66
JP Z,P_REFINERY
CP #67
JP Z,P_SILO
CP #68
JP Z,P_FACTORY
CP #69
JP Z,P_RADAR
RET
P_BETON:
CALL XYTO16
LD B,D
LD C,E
CALL CALC_ADR
LD (HL),#64 ; danbeton erop
JP RESET_STATUS
P_CONST_Y:
; to be done
RET
P_REFINERY:
CALL XYTO16
PUSH DE
LD H,#2 ; refinery is 3
CALL ADD_BUILDING
POP DE
OR A
RET Z ; building vol
LD B,D
LD C,E
CALL CALC_ADR
CALL NO_BETON_CHK
LD (HL),#104 ; refinery erop
INC HL
INC HL
INC HL
INC HL
CALL NO_BETON_CHK
LD (HL),#105
INC HL
INC HL
INC HL
INC HL
CALL NO_BETON_CHK
LD (HL),#106
INC H
CALL NO_BETON_CHK
LD (HL),#109
DEC HL
DEC HL
DEC HL
DEC HL
CALL NO_BETON_CHK
LD (HL),#108
DEC HL
DEC HL
DEC HL
DEC HL
CALL NO_BETON_CHK
LD (HL),#107
LD L,E
INC L
LD H,D
INC H
INC H
LD B,#1
LD C,#0
CALL ADD_TANK
JP RESET_STATUS
P_FACTORY:
CALL XYTO16
PUSH DE
LD H,#4
CALL ADD_BUILDING
POP DE
OR A
RET Z ; max. bereikt
LD A,(UPG_LEV_UNT)
LD 9(IX),A
LD B,D
LD C,E
CALL CALC_ADR
CALL NO_BETON_CHK
LD (HL),#118 ; refinery erop
INC HL
INC HL
INC HL
INC HL
CALL NO_BETON_CHK
LD (HL),#119
INC HL
INC HL
INC HL
INC HL
CALL NO_BETON_CHK
LD (HL),#120
INC H
CALL NO_BETON_CHK
LD (HL),#123
DEC HL
DEC HL
DEC HL
DEC HL
CALL NO_BETON_CHK
LD (HL),#122
DEC HL
DEC HL
DEC HL
DEC HL
CALL NO_BETON_CHK
LD (HL),#121
; ; Maak de eerste unit beschikbaar
LD HL,#TBB_VALUE
LD (HL),#1
JP RESET_STATUS
P_RADAR:
CALL XYTO16
PUSH DE
LD H,#5 ; radar is 4
CALL ADD_BUILDING
POP DE
OR A
RET Z ; building vol
LD B,D
LD C,E
CALL CALC_ADR
CALL NO_BETON_CHK
LD (HL),#110 ; windtrap erop
INC HL
INC HL
INC HL
INC HL
CALL NO_BETON_CHK
LD (HL),#111
INC H
CALL NO_BETON_CHK
LD (HL),#113
DEC HL
DEC HL
DEC HL
DEC HL
CALL NO_BETON_CHK
LD (HL),#112
JP RESET_STATUS
P_SILO:
CALL XYTO16
PUSH DE
LD H,#3 ; silo is 5
CALL ADD_BUILDING
POP DE
OR A
RET Z ; building vol
LD B,D
LD C,E
CALL CALC_ADR
CALL NO_BETON_CHK
LD (HL),#114 ; windtrap erop
INC HL
INC HL
INC HL
INC HL
CALL NO_BETON_CHK
LD (HL),#115
INC H
CALL NO_BETON_CHK
LD (HL),#117
DEC HL
DEC HL
DEC HL
DEC HL
CALL NO_BETON_CHK
LD (HL),#116
JP RESET_STATUS
P_WINDTRAP:
CALL XYTO16
PUSH DE
LD H,#1 ; windtrap is 2
CALL ADD_BUILDING
POP DE
OR A
RET Z ; building vol
LD B,D
LD C,E
CALL CALC_ADR
CALL NO_BETON_CHK
LD (HL),#100 ; windtrap erop
INC HL
INC HL
INC HL
INC HL
CALL NO_BETON_CHK
LD (HL),#101
INC H
CALL NO_BETON_CHK
LD (HL),#103
DEC HL
DEC HL
DEC HL
DEC HL
CALL NO_BETON_CHK
LD (HL),#102
JP RESET_STATUS
ADD_BUILDING:
LD A,(BUILDINGS) ; jammer niet meer
CP #50 ; dan 10 stuks !!
LD A,#0
RET Z ; voor de veiligheid
LD IX,#BUILDING1
LD BC,#BUILD_DATA ; even loopen
LD A,#50 ; max 50 stuks
LD L,A
LOOP_ADD_B:
LD A,0(IX)
OR A
JR Z,ADD_BUILD2
LD (BUILD_NUM),A
ADD IX,BC
DEC L
JR NZ,LOOP_ADD_B
RET
BUILD_NUM: .db 0
ADD_BUILD2:
LD A,(BUILD_NUM)
INC A
LD 0(IX),A ; nummer vorige + 1
LD A,H ;type gebouw
LD 1(IX),A
LD 2(IX),D
LD 3(IX),E
EXX
; bewaar info per huisje
; anders
LD HL,#EXTR_B_DATA
LD B,#0
LD C,A
SLA C
SLA C
SLA C
ADD HL,BC
PUSH IX
POP DE ; DE is dest.
INC DE ; num
INC DE ; type
INC DE ; x
INC DE ; y
LD BC,#8
LDIR ; pompen of verzuipen !
EXX
LD HL,#BUILDINGS
INC (HL)
LD A,#1 ; gebouw is goed toegevoegd
RET
NO_BETON_CHK:
LD A,(HL)
CP #64
RET Z
LD A,6(IX)
SUB #32
LD 6(IX),A
RET
RESET_STATUS:
LD A,(ITEMSELECTED)
SUB #64
LD D,A
LD HL,#BBB_VALUE
SLA A
SLA A
LD C,A
LD B,#0
ADD HL,BC
LD (HL),#1 ; maak weer beschikbaar
INC HL
LD A,(HL)
INC HL
DEC A
LD (HL),A
INC D ; correctie voor berekening
LD A,(B_BALK_NR)
LD E,A
CP D
JR NC,RESETSTATUS2
ADD A,#4
CP D
JR C,RESETSTATUS2
SUB #4
DEC D
LD A,D
SUB E
ADD A
ADD A
ADD A
ADD A
ADD A
ADD #32
LD E,A
LD A,D
ADD A
ADD A
ADD A
ADD A
ADD A
LD D,A
LD IY,#BB_BLW_COP
CALL PUTBLK
CALL BB_PUT_BUILD
CALL P_BB_PART
RESETSTATUS2:
JP CANCEL_BB
;---------------------------------------
CANCELACTION:
LD HL,#BUT_PRESSED
BIT 1,(HL)
RET NZ
SET 1,(HL)
LD A,(MSELECT_ON)
OR A
CALL NZ,MSEL_OFF
LD A,(MBUSY)
OR A
JP NZ,CHK_CANCEL2
LD A,(ITEMSELECTED)
OR A
RET Z
CALL CLEAR_ITEM
LD IX,(TNKADR)
RES 7,11(IX)
LD HL,#TANKTAB
LD (TNKADR),HL ; ook voor gebouwen ?
LD HL,#0
LD (P_BUILD),HL ; ja dus
RET
MSEL_OFF:
LD HL,#TANK1
LD BC,#22 ;BYTE 22
ADD HL,BC
LD B,#127 ;tank sum
LD DE,#TANK_DATA
CANCEL_LOOP:
RES 0,(HL)
ADD HL,DE
DJNZ CANCEL_LOOP
RET
;-----------------------------------------
BB_CANCEL:
LD BC,#4
LD HL,#SPRATR+16
LD (HL),#212
ADD HL,BC
LD (HL),#212
ADD HL,BC
LD (HL),#212
ADD HL,BC
LD (HL),#212
ADD HL,BC
LD (HL),#212
ADD HL,BC
LD (HL),#212
DI
LD A,#1
OUT (0x99),A
LD A,#0x8E
OUT (0x99),A
LD A,#0x10
OUT (0x99),A
LD A,#0x76
OUT (0x99),A
LD HL,#SPRATR+16
LD BC,#0x1898
OTIR
EI
RET
;---------------------------------------
; Build Balk commando
;---------------------------------------
SCRL_BB_L:
LD A,(BB_WAIT)
OR A
RET NZ
LD A,(B_BALK_TYPE)
OR A
JR Z,SCRL_BBB_L
LD A,(T_BALK_NR)
CP #8
RET Z
DEC A
LD (T_BALK_NR),A
JP INIT_BBAR
SCRL_BBB_L:
LD A,(B_BALK_NR)
OR A
RET Z
DEC A
LD (B_BALK_NR),A
JP INIT_BBAR
SCRL_BB_R:
LD A,(BB_WAIT)
OR A
RET NZ
LD A,(B_BALK_TYPE)
OR A
JR Z,SCRL_BBB_R
LD A,(T_BALK_NR)
CP #9
RET Z
INC A
LD (T_BALK_NR),A
JP INIT_BBAR
SCRL_BBB_R:
LD A,(B_BALK_NR)
CP #4
RET Z
INC A
LD (B_BALK_NR),A
JP INIT_BBAR
SCRL_BB_UP:
LD A,(BB_WAIT)
OR A
RET NZ
LD A,(B_BALK_TYPE)
CP #0
RET Z
LD A,#0
LD (B_BALK_TYPE),A
JP INIT_BBAR
SCRL_BB_DN:
LD A,(BB_WAIT)
OR A
RET NZ
LD A,(B_BALK_TYPE)
CP #32
RET Z
LD A,#32
LD (B_BALK_TYPE),A
INIT_BBAR:
LD A,#6
LD (BB_WAIT),A
LD A,(B_BALK_TYPE)
OR A
JR Z,PLACE_BBAR
PLACE_TBAR:
CALL SPRITES_OFF
LD HL,#TBB_VALUE
LD A,(T_BALK_NR)
SUB #8 ; start op 9
ADD A
ADD A
LD C,A
LD B,#0
ADD HL,BC ; begin van tbb_valuelijst
ADD A
ADD A
ADD A
LD D,A
CALL INIT_LOOP_BB
RET
PLACE_BBAR:
CALL SPRITES_OFF
LD HL,#BBB_VALUE
LD A,(B_BALK_NR)
ADD A ; * 4
ADD A
LD C,A
LD B,#0
ADD HL,BC
ADD A
ADD A
ADD A
LD D,A
INIT_LOOP_BB:
LD B,#4 ; aantal plaatjes
LD E,#32 ; plaats op scherm
LOOP_P_BBAR0:
PUSH BC
PUSH HL
LD A,(HL)
CP #0
JP Z,P_BB_EMPTY
CP #1
JP Z,P_BB_OCC
CP #2
JP Z,P_BB_BUSY
JP P_BB_READY
END_LOOP_BB:
POP HL
POP BC
LD A,E
ADD #32
LD E,A
LD A,D
ADD #32
END_LOOPBB3:
LD D,A
INC HL
INC HL
INC HL
INC HL
DJNZ LOOP_P_BBAR0
CALL SPRITES_ON
RET
P_BB_EMPTY:
LD IY,#BB_X_COP
CALL PUTBLK
CALL P_BB_PART
JP END_LOOP_BB
P_BB_OCC:
LD IY,#BB_BLW_COP
CALL PUTBLK
CALL BB_PUT_BUILD
CALL P_BB_PART
JP END_LOOP_BB
P_BB_BUSY:
LD IY,#BB_BLW_COP
CALL PUTBLK
CALL BB_PUT_BUILD
LD IY,#BB_BUSY_COP
CALL PUTBLK
CALL P_BB_PART
JP END_LOOP_BB
P_BB_READY:
LD IY,#BB_BLW_COP
CALL PUTBLK
CALL BB_PUT_BUILD
LD IY,#BB_READY_COP
CALL PUTBLK
CALL P_BB_PART
JP END_LOOP_BB
BB_PUT_BUILD:
; ; check if tank bar
LD A,(B_BALK_TYPE)
OR A
JR Z,BB_PUT_BUILD2
BB_PUT_TANK2:
LD IY,#BB_TNK_COP
LD A,D
LD 0(IY),A
JP PUTBLK
BB_PUT_BUILD2:
LD IY,#BB_BLD_COP
LD A,D
; ADD 32
LD 0(IY),A
JP PUTBLK
P_BB_PART:
LD IY,#BB_MOVE_COP
LD 4(IY),E ; plek op scherm
LD 7(IY),#0
CALL PUTBLK
LD 7(IY),#1
CALL PUTBLK
RET
;-------------------------------------------
SEL_FROM_BB:
LD A,(MBUSY)
OR A
RET NZ
LD A,(B_BALK_TYPE)
OR A
JR Z,SEL_BUILDING
LD A,D
SUB #32
SRA A
SRA A
SRA A
SRA A
SRA A ; / 32
LD B,A
LD A,(T_BALK_NR)
SUB #8
ADD B
LD E,A
ADD A ; * 4
ADD A ;
LD C,A
LD B,#0
LD HL,#TBB_VALUE
ADD HL,BC
LD A,(HL)
OR A ; niet mogelijk
RET Z
CP #2 ; al bezig
RET Z
CP #1 ; ga beginnen
JP Z,START_BUILD
RET
RET
SEL_BUILDING:
LD A,D
SUB #32
SRA A
SRA A
SRA A
SRA A
SRA A ; / 32
LD B,A
LD A,(B_BALK_NR)
ADD B
LD E,A
ADD A ; * 4
ADD A ;
LD C,A
LD B,#0
LD HL,#BBB_VALUE
ADD HL,BC
LD A,(HL)
OR A ; niet mogelijk
RET Z
CP #2 ; al bezig
RET Z
CP #1 ; ga beginnen
JP Z,START_BUILD
; anders is ie ready !!!!!!
LD A,E
LD C,A
ADD #64 ; 64 + item
LD (ITEMSELECTED),A
LD A,#1
LD (MBUSY),A
LD HL,#BB_TYPES ; cursor
LD B,#0
ADD HL,BC
LD A,(HL)
LD (BB_SIZE),A
LD IX,(TNKADR)
RES 7,11(IX) ; geen tank
LD IX,#IX_FOR_B
; INC C
LD 1(IX),C
CALL P_BLD_IMG
CALL CANCEL_ITEM
RET
IX_FOR_B:
.db 0,0
START_BUILD:
PUSH HL
INC HL
INC HL
INC HL
LD A,(HL)
LD C,A
LD B,#0
CALL CALC_MONEY
POP HL
JR C,NO_START ; niet genoeg geld
LD (HL),#2
LD A,D ; cursor positie
AND #0b11100000
LD IY,#BB_BLD2_COP
LD 4(IY),A
CALL PUTBLK
LD A,7(IY)
XOR #1
LD 7(IY),A
CALL PUTBLK
RET
NO_START:
LD A,#50
LD (ISTEXT),A
LD A,#5
CALL INIT_TEXT
RET
;-----------------------------------------
; OPTION MENU Win 98 version ! cool
; doet even nix
;-----------------------------------------
OPTION_MENU:
LD A,#200
LD (ISTEXT),A
LD A,#4
CALL INIT_TEXT
RET
LD A,(MBUSY)
OR A
RET NZ
XOR A
LD (MSTOP),A
LD (MOUSE_SHAPE),A
LD (CURSOR_TYPE),A
CALL PULL_DOWN
MENU_MAIN:
XOR A
; CALL FIRE_BUTTON0
CALL Z,MENU_COOR
LD A,(MSTOP)
OR A
RET NZ
JP MENU_MAIN
MENU_COOR:
LD DE,(MOUSEY)
LD A,D
CP #96
JR C,MAREA2
CP #144
JR NC,MAREA2
LD A,E
CP #125
JR C,MAREA2
CP #140
JR NC,MAREA2
LD A,#1
LD (MSTOP),A
RET
MAREA2:
RET
PULL_DOWN:
LD A,(SWAP)
LD IY,#MENU_COP
LD 7(IY),A
CALL SPRITES_OFF
LD B,#110
DO_SCROLL:
XOR A
LD (JIFFY),A
CALL MENU_SCRL
MWAIT_LOOP:
LD A,(JIFFY)
CP #1
;JR C,MWAIT_LOOP
XOR A
LD (JIFFY),A
DEC B
DEC B
JR NZ,DO_SCROLL
CALL MENU_SCRL
CALL SPRITES_ON
RET
MENU_SCRL:
LD A,#112
SUB B
LD 2(IY),B
LD 10(IY),A
LD 8(IY),A
EXX
CALL PUTBLK
EXX
RET
;---------------------------------------------
; INTERRUPT ROUTINE !!!
;-----------------------------------------
INT_ROUTINE:
DI
PUSH AF
; XOR A
; OUT (0x99),A
; LD A,0x8F ; reg 15 op 0
; OUT (0x99),A
IN A,(0x99) ; CHK OF INT VAN VDP IS
AND A
JP P,INT_NOT_V9938
PUSH BC
PUSH DE
PUSH HL
PUSH IX
PUSH IY
EXX
PUSH BC
PUSH DE
PUSH HL
CALL INTERRUPT
POP HL
POP DE
POP BC
EXX
POP IY
POP IX
POP HL
POP DE
POP BC
INT_NOT_V9938:
POP AF
EI
RETI ; Z80 NORM....
;---------------------------------------
INTERRUPT:
LD A,(ISTEXT)
OR A
JR Z,INTT_1
DEC A
LD (ISTEXT),A
INTT_1:
LD A,(BB_WAIT)
OR A
JR Z,INTT_2
DEC A
LD (BB_WAIT),A
INTT_2:
CALL I_READ_BUTTONS ; buttons uitlezen
CALL READ_MOUSIE
LD A,(ITEMSELECTED)
CP #128
JP NC,INTT_3
CP #64
JP NC,PLACE_BB_SPR
INTT_3:
JP MULTIPLE_SEL
RET
READ_MOUSIE:
; Gebruik spratr om x en y op te slaan !
LD A,(MOUSE_PORT) ; Get mouse port in C
LD C,A
MOUSE1:
LD A,(MOUSE_WAIT1)
LD B,A ; Get Y move
CALL READ_MOUSE
RLCA
RLCA
RLCA
RLCA
LD H,A
CALL READ_MOUSE
OR H
LD H,A
CALL READ_MOUSE ; Get X move
RLCA
RLCA
RLCA
RLCA
LD L,A
CALL READ_MOUSE
OR L
LD C,H ; B = X-move / C = Y-move
LD B,A
LD A,B ; Move -1,-1 ?
INC A
LD H,A
LD A,C
INC A
OR H
JR NZ,MOUSE3
LD A,(MOUSE_USE) ; Check mouse use
OR A
JR NZ,MOUSE2
LD A,(MOUSE_PORT) ; Check other port
XOR #0b01000000
LD (MOUSE_PORT),A
JR KEYBOARD
MOUSE2:
LD A,(MOUSE_OFF) ; na 20 keer -1,-1 is uit
INC A
LD (MOUSE_OFF),A
CP #20
JR C,MOUSE4
XOR A ; Deactivate mouse
LD (MOUSE_USE),A
JR KEYBOARD
MOUSE3: ; Activate mouse / Keep mouse activat
XOR A ; counter op 0
LD (MOUSE_OFF),A
DEC A ; wordt weer gebruikt
LD (MOUSE_USE),A
MOUSE4:
LD A,B ; If mouse is moved then skip keyboar
OR C
JR NZ,CHK_PIJL_BORD ; niet 0,0 dan check
KEYBOARD:
; nog even geen keyboard
; RET
CHK_PIJL_BORD: ; In: B=y-coordinaat
LD HL,#SPRATR
LD A,(HL)
SUB B
BIT 7,B
JR NZ,CHK_PIJL_BORD_Y1
JR NC,CHK_PIJL_BORD_Y3
XOR A
JR CHK_PIJL_BORD_Y3
CHK_PIJL_BORD_Y1:
JR NC,CHK_PIJL_BORD_Y2
CP #204
JR C,CHK_PIJL_BORD_Y3
CHK_PIJL_BORD_Y2:
LD A,#203
CHK_PIJL_BORD_Y3:
LD (HL),A
INC HL
LD A,(HL)
SUB C
BIT 7,C
JR NZ,CHK_PIJL_BORD_X1
JR NC,CHK_PIJL_BORD_X3
XOR A
JR CHK_PIJL_BORD_X3
CHK_PIJL_BORD_X1:
JR NC,CHK_PIJL_BORD_X2
CP #249
JR C,CHK_PIJL_BORD_X3
CHK_PIJL_BORD_X2:
LD A,#248
CHK_PIJL_BORD_X3:
LD (HL),A
MOUSE_SPRITE:
DEC HL
; spratr in hl !!
LD A,#1
OUT (0x99),A
LD A,#0x8E
OUT (0x99),A
LD A,#0x00 ; ff
OUT (0x99),A
LD A,#0x76 ; 35
OUT (0x99),A
LD BC,#0x0498
OTIR
RET
READ_MOUSE:
LD A,#15
OUT (0xA0),A
LD A,C
OUT (0xA1),A
XOR #0b00110000
LD C,A
LD A,#14
OUT (0xA0),A
READ_MOUSE_L:
DJNZ READ_MOUSE_L
LD A,(MOUSE_WAIT2)
LD B,A
IN A,(0xA2)
AND #0x0F
RET
;-----------------------------------------
I_READ_BUTTONS:
XOR A
CALL I_FIR_P1
LD (FIRE_BUTTONS),A
RET
I_FIR_P1: LD B,A ; A=0 PORT 1 / A=1 PORT 2
LD A,#15
OUT (0xA0),A
NOP
IN A,(0xA2)
DJNZ I_FIR_S1
AND #0xDF
OR #0x4C
JR I_FIR_S2
I_FIR_S1: AND #0xAF
OR #3
I_FIR_S2: OUT (0xA1),A
LD A,#14
OUT (0xA0),A
NOP
IN A,(0xA2)
RET
CHK_SPATIE:
IN A,(0xAA) ; check op spatie...
AND #0xF0
OR #8
OUT (0xAA),A
IN A,(0xA9)
AND #1
RET
;--------------------------------------------
;- SUBS -
;--------------------------------------------
UPDATE_STEPS:
LD HL,#BBB_VALUE
LD B,#18
UPD_STEPS_L1:
LD A,(HL)
CP #2
JP Z,DO_STEP_UPD
INC HL
INC HL
INC HL
INC HL
UPD_STEPS_L2:
DJNZ UPD_STEPS_L1
RET
DO_STEP_UPD:
INC HL
LD A,(HL)
LD C,A
INC HL
LD A,(HL)
ADD C
CP #255
JP Z,STEP_READY
LD (HL),A
INC HL
INC HL
JP UPD_STEPS_L2
STEP_READY:
DEC HL
DEC HL
LD (HL),#3
JP UPD_STEPS_L1
;---------------------------------------
MULTIPLE_SEL:
LD A,(PLAYFIELD)
OR A
JR Z,LABEL0009
LD A,(FIRE_BUTTONS)
BIT 4,A
JR Z,MS_1
LABEL0009: ; ; ms uit
XOR A
LD (MS_COUNT),A
LD (HAS_SELECT),A
LD (TOTAL_SELECT),A
LD B,#4
LD IX,#SPRATR+40
LD DE,#4
LABEL0008:
LD 0(IX),#212
EXX
CALL PUT_SPRITE2
EXX
ADD IX,DE
DJNZ LABEL0008
RET
MS_1:
LD A,(MS_COUNT)
CP #10
JR Z,MS_2_2
INC A
LD (MS_COUNT),A
CP #9
RET NZ
MS_2:
INC A
LD (MS_COUNT),A
LD HL,#SPRATR
LD E,(HL)
INC HL
LD D,(HL)
LD (ORIGIN_Y),DE
LD A,#1
LD (HAS_SELECT),A
EXX
LD A,(MSELECT_ON)
OR A
CALL NZ,MSEL_OFF
EXX
MS_2_2:
LD HL,#SPRATR
LD E,(HL)
INC HL
LD D,(HL)
LD A,(ORIGIN_X)
CP D
JR NC,LABEL0005
LD (SEL_X0),A
LD A,D
LD (SEL_X1),A
JP LABEL0006
LABEL0005:
LD (SEL_X1),A
LD A,D
LD (SEL_X0),A
LABEL0006:
LD A,(ORIGIN_Y)
CP E
JR NC,LABEL0007
LD (SEL_Y0),A
LD A,E
LD (SEL_Y2),A
JP SEL_METH1
LABEL0007:
LD (SEL_Y2),A
LD A,E
LD (SEL_Y0),A
SEL_METH1:
LD BC,(SEL_Y0)
LD HL,(SEL_Y2)
LD DE,#4
LD IX,#SPRATR+40
LD 0(IX),C
LD 1(IX),B
EXX
CALL PUT_SPRITE2
EXX
ADD IX,DE
LD 0(IX),L
LD 1(IX),B
EXX
CALL PUT_SPRITE2
EXX
ADD IX,DE
LD 0(IX),C
LD 1(IX),H
EXX
CALL PUT_SPRITE2
EXX
ADD IX,DE
LD 0(IX),L
LD 1(IX),H
CALL PUT_SPRITE2
RET
ORIGIN_Y:
.db 0
ORIGIN_X:
.db 0
SEL_Y0: .db 0
SEL_X0: .db 0
SEL_Y2: .db 0
SEL_X1: .db 0
;------------------------------------------
A_TO_IY:
EXX ; schaduw BC,DE,HL !!!!
OR A
CALL Z,CRASH
LD IY,#TANK1-32
RRC A
RRC A
RRC A
LD B,A
AND #0b11100000
LD C,A
LD A,B
AND #0b00011111
LD B,A
ADD IY,BC
EXX
RET
HL_TO_IX: INC HL
LD A,(HL)
DEC HL
A_TO_IX:
EXX ; schaduw BC,DE,HL !!!!
OR A
CALL Z,CRASH
LD IX,#TANK1-32
RRC A
RRC A
RRC A
LD B,A
AND #0b11100000
LD C,A
LD A,B
AND #0b00011111
LD B,A
ADD IX,BC
EXX
RET
CRASH:
CALL COLOR_WHITE
; POP HL
; POP HL
; LD (CRASH_ADR),HL
;LD HL,#INT_DOS
;CALL PUT_INT
;CALL SET_SCREEN0
;LD SP,(EXIT_STACK)
RET ; einde prog
EXIT_STACK: .dw 0
CRASH_ADR:
.dw 0
A_TO_BLD:
LD IY,#BUILDING1-BUILD_DATA
EXX
LD C,A
LD B,#0
SLA C ; *2
RL B
SLA C ; *4
RL B
LD D,B ; DE met 4maal
LD E,C
ADD IY,DE
ADD IY,DE ; *8
ADD IY,DE ; *12
LD C,A
LD B,#0
ADD IY,BC
EXX
RET
;----------------------------------------------
VELD:
LD A,(SWAP)
LD (DOEL_PAGE),A
XOR A
LD (DOEL_Y),A
LD (DOEL_X),A
LD HL,(ADR)
DEC H
DEC HL
DEC HL
DEC HL
DEC HL
LD DE,#CPYTT
LD B,#12 ; 12 * 12 cpytt ; x in lengte
LD C,#12
J8CAF:
LD A,(HL)
EX AF,AF
LD A,C
CP #1
JR Z,MAKE_CPYTT
CP #12
JR Z,MAKE_CPYTT
LD A,B
CP #1
JR Z,MAKE_CPYTT
CP #12
JR Z,MAKE_CPYTT
LD A,(HL)
OR A
INC HL
JR Z,PUT_FIELD
LD A,#16
LD (BRON_X),A
XOR A
JR CONT_VELD
PUT_FIELD:
LD A,(HL)
ADD A
ADD A
ADD A
ADD A
LD (BRON_X),A
LD A,(HL)
AND #0b11110000
CONT_VELD:
LD (BRON_Y),A
LD A,(DOEL_X)
ADD #16
LD (DOEL_X),A
EXX
LD HL,#FASTCOP
DI ; vdp klaar ?
LD A,#32 ; reg 32 + GEEN auto inc.
OUT (0x99),A ; als control register
LD A,#0x91 ;in reg 17
OUT (0x99),A
LD A,#2 ; waarde 2 in reg 15
OUT (0x99),A
LD A,#0x8F ; execute
OUT (0x99),A
LUS3:
IN A,(0x99) ;lees status
RRA ; is CE nog 1 dan C is loop
JR C,LUS3
XOR A ; status reg. op 0
OUT (0x99),A
LD A,#0x8F
OUT (0x99),A
LD C,#0x9B
OUTI
OUTI
OUTI
OUTI
OUTI
OUTI
OUTI
OUTI
OUTI
OUTI
OUTI
OUTI
OUTI
OUTI
OUTI
EI
EXX
DEC HL
MAKE_CPYTT:
INC HL
INC HL
EX AF,AF
OR A
JR NZ,CONT_CPYTT
LD A,(HL)
OR A
JR Z,CONT_CPYTT
BLW_CPYTT:
LD A,#1
LD (DE),A
INC DE
LD A,(HL) ; nummer tank of zo ???
LD (DE),A
INC DE
CONT_CPYTT:
INC HL
INC HL
DEC B
JP NZ,J8CAF
DEC C
JR Z,END_VELD
LD A,(DOEL_Y)
ADD #16
LD (DOEL_Y),A
XOR A
LD (DOEL_X),A
LD A,C
LD BC,#208 ; 54+128 ; !!! 64-10 + 2*64
ADC HL,BC
LD C,A
LD B,#12
JP J8CAF
END_VELD:
XOR A
LD (DE),A
INC DE
LD (DE),A ; laatste entry leeg
RET
;----------------------------------------
MLBC16:
LD B,#0
LD C,A
SLA C
RL B
SLA C
RL B
SLA C
RL B
SLA C
RL B
RET
;-----------------------------------------
PTANK:
LD A,(OFFSET)
LD B,A
LD A,0(IX)
SUB B
INC A
ADD A,A
ADD A,A
ADD A,A
ADD A,A
ADD A,4(IX)
LD 4(IY),A
CP #16
JP C,CONT2
CP #161
JP NC,CONT2
LD A,(OFFSET+1)
LD B,A
LD A,1(IX)
SUB B
INC A
ADD A,A
ADD A,A
ADD A,A
ADD A,A
ADD A,5(IX)
LD 6(IY),A
CP #16
JP C,CONT2
CP #161
JP NC,CONT2
CALL RITANK
CALL PUTBLK
LD 0(IY),#0
LD 2(IY),#160
BIT 0,22(IX)
JP Z,IN_SCREEN
LD HL,#0 ; super multiple select update
LD A,4(IY)
SRL A
LD C,A
LD B,#0
ADD HL,BC
LD A,6(IY)
LD D,A
LD B,A
SRL B
RR C
LD C,#0
ADD HL,BC
LD A,D
AND #0b10000000
RLC A
LD E,A
CALL SETVDP
LD A,#0xFF
OUT (0x98),A
LD BC,#7
ADD HL,BC
LD A,E
CALL SETVDP
LD A,#0xFF
OUT (0x98),A
;----------------------------------
LD BC,#15*128-7
ADD HL,BC
LD A,D
ADD #15
AND #0b10000000
RLC A
LD E,A
CALL SETVDP
LD A,#0xFF
OUT (0x98),A
LD BC,#7
ADD HL,BC
LD A,E
CALL SETVDP
LD A,#0xFF
OUT (0x98),A
JP IN_SCREEN
PTANK_UP:
LD 4(IY),C
LD 6(IY),B
LD A,#176
SUB B
LD 10(IY),A
LD 8(IY),#16
CALL RITANK
CALL PUTBLK
LD 2(IY),#160
LD 10(IY),#16
LD 0(IY),#0
RET
PTANK_LT:
LD 6(IY),B
LD 4(IY),C
LD A,#176
SUB C
LD 8(IY),A
; LD 4(IY),A
LD 10(IY),#16
CALL RITANK
CALL PUTBLK
LD 0(IY),#0
LD 2(IY),#160
RET
PTANK_DN:
LD 4(IY),C
LD 10(IY),B
LD A,#16
SUB B
ADD #160
LD 2(IY),A
LD 6(IY),#16
LD 8(IY),#16
CALL RITANK
CALL PUTBLK
LD 0(IY),#0
LD 2(IY),#160
RET
PTANK_RI:
LD 6(IY),B
LD 8(IY),C ; offset copieren
LD A,#16
SUB C
LD 0(IY),A
LD 4(IY),#16
LD 10(IY),#16
CALL RITANK
CALL PUTBLK
LD 0(IY),#0
LD 2(IY),#160
RET
RITANK: LD A,9(IX) ; richting
AND #0b00000111 ; eventuele radar found bitje weg..
ADD A,A
ADD A,A
ADD A,A
ADD A,A
ADD A,0(IY)
LD 0(IY),A
LD A,11(IX)
AND #0b00000111 ; type tank
ADD A,A
ADD A,A
ADD A,A
ADD A,A
ADD A,2(IY)
LD 2(IY),A
LD A,13(IX)
AND #0b10000000 ;soort bit
ADD A,0(IY)
LD 0(IY),A
RET
;---------------------------------------------
XYTO16: LD A,D
SRL A
SRL A
SRL A
SRL A
LD B,A
LD A,(OFFSET)
ADD A,B
DEC A
LD D,A
LD A,E
SRL A
SRL A
SRL A
SRL A
LD B,A
LD A,(OFFSET+1)
ADD A,B
DEC A
LD E,A
RET
;------------------------------------
;--- sub routine blocked !!!
;-----------------------------------
BLCKED:
LD A,(HL)
CP #64
RET ; deze return waarde kan nog veranderen !
CALC_ADR:
LD HL,#VELD_ADRES
LD A,C ; Y MAAL 256
ADD H
LD H,A
SLA B ; X MAAL 4
SLA B
LD C,B
LD B,#0
ADD HL,BC ; plus x
INC HL
RET
;
; PUSH HL
; PUSH IX
; INC HL
; LD A,(HL)
; OR A
; JR Z,CALC_ADR2
; CALL A_TO_IX
; LD B,0(IX)
; LD C,1(IX)
; LD HL,VELD_ADRES
; LD A,C ; Y MAAL 256
; ADD H
; LD H,A
; SLA B ; X MAAL 4
; SLA B
; LD C,B
; LD B,0
; ADD HL,BC ; plus x
; INC HL
; POP IX
; POP BC
; SBC HL,BC
;JP NZ,CRASH
; PUSH BC
; POP HL
; RET
;
CALC_ADR2:
; POP IX
; POP HL
; RET
;--------------------------------------
; UPD_TANK_LAY
;--------------------------------------
RES_TANK_LAY:
LD B,0(IX)
LD C,1(IX)
CALL CALC_ADR
LD A,(HL)
CP #1
JR Z,RES_TANK_LAY2
CP #16
JR NC,RES_TANK_LAY2
LD A,9(IX)
AND #0b00000011
ADD #2
LD (HL),A
RES_TANK_LAY2:
LD B,#0
LD A,13(IX)
CP #127
JR NC,NO_RADREVEAL ; rood ontdekt niet !!
LD B,#255
NO_RADREVEAL:
INC B
INC HL
LD (HL),#0 ; RESET tank positie
RET
;-----------------------------------------------
CLEAR_ITEM:
XOR A
LD (ITEMSELECTED),A
LD (CURSOR_TYPE),A
LD (MBUSY),A
LD (ACTIVE_MENU),A ; commando balk reset
CALL SPRITES_OFF
LD IY,#MENU_COM_CLN
XOR A
LD 7(IY),A
LD A,#72
LD 6(IY),A
CALL PUTBLK
LD A,#80
LD 6(IY),A
CALL PUTBLK
LD A,#88
LD 6(IY),A
CALL PUTBLK
LD A,#96
LD 6(IY),A
CALL PUTBLK
LD A,#58
LD 6(IY),A
CALL PUTBLK
LD IY,#MENU_COM_SWP
CALL PUTBLK
LD IY,#EMPTY
LD 7(IY),#0
CALL PUTBLK
LD 7(IY),#1
CALL PUTBLK
JP SPRITES_ON
SHOW_POWER:
LD A,(ITEMSELECTED)
OR A
RET Z
CP #2
JP Z,HARV_INHOUD
CP #127
JR NC,BUILDING_POW
CP #64
RET NC
LD IX,(TNKADR)
LD A,12(IX) ; power berekenen
JP SHOW_POW2
BUILDING_POW:
LD IX,(P_BUILD)
LD A,6(IX)
SHOW_POW2:
EX AF,AF
LD A,(SWAP)
XOR #1
LD E,A
LD IY,#POWER_INFO ; volledige balk
LD 7(IY),E ; naar onzichtbare scherm
CALL PUTBLK
EX AF,AF
SRL A
SRL A
SRL A
LD B,A
LD A,#31
SUB B
RES 0,A ; even getal
OR A
JR Z,SHOW_POW3 ; full power
;
LD IY,#POWER_BALK
LD 8(IY),A
LD 7(IY),E
CALL PUTBLK
SHOW_POW3:
LD IY,#POWER_COP
LD 3(IY),E ; from onzichtbaar
LD A,E
XOR #1
LD 7(IY),A ; to zichtbaar
CALL PUTBLK
; nou nog het upgrade balkje
LD A,(ITEMSELECTED)
CP #127
RET C
BIT 1,8(IX)
RET Z ; geen upgrade bar
LD A,11(IX) ; upgrade status
OR A
RET Z
SRL A
SRL A
SRL A
RES 0,A
OR A
RET Z
LD B,A
LD IY,#HARV_BALK
LD A,#32
SUB B
LD 2(IY),A
ADD #24
LD 6(IY),A
LD 10(IY),B
LD A,(SWAP)
LD 7(IY),A
EX AF,AF
CALL PUTBLK
LD IY,#HARV_COP
EX AF,AF
LD 3(IY),A
XOR #1
LD 7(IY),A
JP PUTBLK
RET
HARV_INHOUD: ; ; harv inhoud displayen
LD IX,(TNKADR)
LD A,16(IX)
CP #7
RET C
SUB #6
SRL A
LD B,A
LD IY,#HARV_BALK
LD A,#32
SUB B
LD 2(IY),A
ADD #24
LD 6(IY),A
LD 10(IY),B
LD A,(SWAP)
LD 7(IY),A
EX AF,AF
CALL PUTBLK
LD IY,#HARV_COP
EX AF,AF
LD 3(IY),A
XOR #1
LD 7(IY),A
JP PUTBLK
COMMAND_TANK:
LD D,#0b10000111
JP EXTRACT_COM
COMMAND_HARV:
LD D,#0b00011110
JP EXTRACT_COM
COMMAND_B:
LD IY,(P_BUILD)
LD D,#0b01000000
BIT 0,8(IY)
JR NZ,COMMAND_B3
LD D,#0b00100000
BIT 1,8(IY)
JR NZ,COMMAND_B3
LD D,#0
LD A,6(IY)
CP #255 ; niet helemaal
JR Z,COMMAND_B2 ; ?huh
LD D,#0b01000000
COMMAND_B2:
LD A,10(IY)
SUB 9(IY)
JR Z,COMMAND_B4
LD A,#0b00100000
OR D
LD D,A
JP COMMAND_B4
COMMAND_B3:
LD A,#0b10000000
OR D
LD D,A
COMMAND_B4:
JP EXTRACT_COM
CANCEL_ITEM:
LD D,#0b10000000
JP EXTRACT_COM
COMMAND_ENM:
LD D,#0
EXTRACT_COM:
CALL SPRITES_OFF
LD IY,#MENU_COM_CLN
XOR A
LD 7(IY),A
LD A,#72
LD 6(IY),A
CALL PUTBLK
LD A,#80
LD 6(IY),A
CALL PUTBLK
LD A,#88
LD 6(IY),A
CALL PUTBLK
LD A,#96
LD 6(IY),A
CALL PUTBLK
BIT 0,D
LD IY,#MENU_COM_ATT
CALL NZ,PUTBLK
BIT 1,D
LD IY,#MENU_COM_MOV
CALL NZ,PUTBLK
BIT 2,D
LD IY,#MENU_COM_STP
CALL NZ,PUTBLK
BIT 3,D
LD IY,#MENU_COM_RET
CALL NZ,PUTBLK
BIT 4,D
LD IY,#MENU_COM_HRV
CALL NZ,PUTBLK
BIT 5,D
LD IY,#MENU_COM_UPG
CALL NZ,PUTBLK
BIT 6,D
LD IY,#MENU_COM_REP
CALL NZ,PUTBLK
BIT 7,D
LD IY,#MENU_COM_CAN
CALL NZ,PUTBLK
LD IY,#MENU_COM_SW2
CALL PUTBLK
JP SPRITES_ON
;-------------------------------------------
REMOVE_TANK:
; XOR A ; sample nummer 0
; CALL PLAY
LD D,0(IX)
LD E,1(IX)
LD B,D
LD C,E
PUSH IX
LD IX,#PLOF_BUF
LD 0(IX),D
LD 1(IX),E
CALL ADD_PLOFJE
POP IX
CALL CALC_ADR ; 2 byte veld layer op 0
LD A,(HL)
CP #16
JR NC,REMOVE_TANK2
LD A,R
AND #0b00000011
ADD #6
LD (HL),A
REMOVE_TANK2:
INC HL
LD (HL),#0
LD C,25(IX) ; Y
LD B,24(IX) ; X
CALL CALC_ADR
DEC HL
LD A,(HL)
OR A
JR NZ,REMOVE_TANK3
INC HL
CALL POINT
LD D,A
CALL PLACE_UNIT
REMOVE_TANK3:
BIT 7,11(IX)
CALL NZ,CLEAR_ITEM
LD A,23(IX)
AND #0x0F
CALL NZ,AI_UPDATE ; ALS TNK EEN MIS HEEFT UPD DAN
LD A,13(IX) ; nummer tank
LD H,A
LD B,#254 ; tank sum
LD DE,#TANK_DATA ;loop door de tabel om attack
LD IY,#TANK1 ; nummers te resetten !!
LABEL0010:
LD A,14(IY)
CP H
CALL Z,RES_ATTACK
ADD IY,DE
DJNZ LABEL0010
; remove tank uit tnk_totaal
; verschilt per tank
LD A,13(IX)
CP #128
JR C,REM_TNK_BLW
LD HL,(DED_CNT_RED)
INC HL
LD (DED_CNT_RED),HL
LD HL,#TNK_CNT_RED
JR LABEL0012
REM_TNK_BLW:
LD HL,(DED_CNT_BLW)
INC HL
LD (DED_CNT_BLW),HL
LD HL,#TNK_CNT_BLW
LABEL0012:
DEC (HL)
PUSH IX
POP HL
LD BC,#TANK_DATA
LABEL0011:
LD (HL),#0
INC HL
DEC BC
LD A,B
OR C
JP NZ,LABEL0011
RET
RES_ATTACK:
LD 14(IY),#0
RES 5,11(IY)
RES 6,11(IY)
SET 4,11(IY)
LD A,22(IY) ; reset inslag shoot en
AND #0b10000001 ; of er op je geschotenis
LD 22(IY),A
LD A,0(IY)
LD 2(IY),A
LD A,1(IY)
LD 3(IY),A
RET
REMOVE_BUILD:
LD IX,#PLOF_BUF
LD D,2(IY)
LD E,3(IY)
LD B,D
LD C,E
CALL CALC_ADR
LD B,5(IY) ;hoogte gebouw
REM_B_LOOPY:
PUSH HL
PUSH DE
PUSH BC
LD B,4(IY) ; lengte gebouw
REM_B_LOOPX:
LD 0(IX),D
LD 1(IX),E
CALL ADD_PLOFJE
LD A,R
AND #0b00000011
ADD #65
LD (HL),A ; random stukje
INC D
INC HL
INC HL
INC HL
INC HL
DJNZ REM_B_LOOPX
POP BC
POP DE
POP HL
INC E
INC H
DJNZ REM_B_LOOPY
LD HL,#BUILDINGS
DEC (HL) ; gebouw -1
LD A,0(IY)
LD 0(IY),#0 ; nummer op 0 is gebouw weg
LD A,(ITEMSELECTED)
BIT 7,A
RET Z
PUSH IY
POP BC
LD IX,(P_BUILD)
PUSH IX
POP HL
SBC HL,BC
JP Z,CLEAR_ITEM
RET
;-----------------------------------
; ADD_PLOFJE
;
; IN: PLOF_BUF GEVULD ! X EN Y
;
;-----------------------------------
PLOF_BUF: .db 0,0
ADD_PLOFJE:
EXX
LD A,(PLOF_BUF)
LD D,A
LD A,(PLOF_BUF+1)
LD E,A
LD HL,#PLOF_TABEL
INC HL
INC HL
LD A,#80 ; max ontplof stukjes
LD B,A
CHECK_PLOF:
LD A,(HL)
OR A
JR Z,LABEL0002
INC HL
INC HL
INC HL
DJNZ CHECK_PLOF ; even opletten
RET ; max. plof bereikt
LABEL0002:
LD A,(PLOF_COUNT)
INC A ; 1 plofke erbij
LD (PLOF_COUNT),A
LD (HL),#8 ; NUMMER
DEC HL
LD (HL),E ; EN Y
DEC HL
LD (HL),D ; EN X
EXX
RET
;----------------------------------
; SPICE PLOF
;----------------------------------
WAIT: .db 0
SPICE_BOOM:
LD A,(WAIT)
INC A
AND #0b00000111
LD (WAIT),A
RET NZ
LD IX,(TNKADR)
LD B,0(IX)
LD C,1(IX)
CALL CALC_ADR
PUSH HL
LD IX,#SPICE_RAD
LD B,#9
SPICE_BOOM_LP:
POP HL
PUSH HL
LD E,0(IX)
LD D,1(IX)
ADC HL,DE
LD D,#0
LD A,(HL)
CP #48
JR NC,END_BOOM_LP
CP #16
JR C,NORMAL_SPICE
CP #32
JR C,EXTRA_SPICE
LD (HL),#32
JR END_BOOM_LP
EXTRA_SPICE:
LD A,#16
LD D,A
NORMAL_SPICE:
LD A,2(IX)
ADD D
LD (HL),A
END_BOOM_LP:
LD DE,#3
ADD IX,DE
DJNZ SPICE_BOOM_LP
POP HL
RET
;-----------------------------------
; Music Module init
;-----------------------------------
MMODULE_INIT:
LD B,#12
LD HL,#PDATA_1
PLOOP1: LD A,(HL)
OUT (0xC0),A ; OUT REG
INC HL
LD A,(HL)
OUT (0xC1),A ; OUT INHOUD
INC HL
DJNZ PLOOP1 ; TILL B=0
RET
;------------------------------------
; Play a sample
; A register bevat nummer sample
;-----------------------------------
PLAY:
LD HL,#SAMPLES
SLA A
LD C,A
LD B,#0
ADD HL,BC
LD E,(HL)
INC HL
LD D,(HL)
EX DE,HL
LD B,#6
PLOOP2: LD A,(HL)
OUT (0xC0),A ; OUT REG
INC HL
LD A,(HL)
OUT (0xC1),A ; OUT INHOUD
INC HL
DJNZ PLOOP2 ; TILL B=0
RET
SAMPLES:
.dw SAM_PLOF1
.dw SAM_PLOF2
SAM_PLOF1:
.db 7,1 ; MOET!!!
.db 9,0
.db 10,0
.db 11,0xFF ; EI LOW
.db 12,0x07 ; EI HI
.db 7,0xA0 ; IETS (0xA0 IS PLAY)
SAM_PLOF2:
.db 7,1 ; MOET!!!
.db 9,0
.db 10,0
.db 11,0xFF ; EI LOW
.db 12,0x07 ; EI HI
.db 7,0xA0 ; IETS (0xA0 IS PLAY)
; --------- swap mode ----------------
CHANGE_INT:
DI ; is dit nodig ?
LD A,(0xF3DF)
RES 4,A
LD (0xF3DF),A
OUT (0x99),A
LD A,#128+0
OUT (0x99),A
LD A,#16
OUT (0x99),A
LD A,#128+19
OUT (0x99),A
EI
RET
;---------------------------------
; CALCULATE MONEY
; BC bevat bedrag * 10
; UIT Carry is te weinig !!!
;---------------------------------
CALC_MONEY:
LD HL,(MONEY)
SBC HL,BC
RET C
LD (MONEY),HL
RET
;---------------------------------
; PLAATS MONEY
;----------------------------------
PUT_MONEY:
LD HL,(DIS_MONEY)
LD BC,(MONEY)
SBC HL,BC
RET Z
LD HL,(DIS_MONEY)
JR C,INC_MONEY
DEC HL
DEC HL
DEC HL
DEC HL
INC_MONEY:
INC HL
INC HL
LD (DIS_MONEY),HL
LD IY,#DEEL2
LD IX,#MONEY_CHAR
LD B,#5 ; aantal cijfers te delen
CALL DLINI
LD IX,#MONEY_CHAR
LD HL,(MONEY_POS)
LD D,#5
JP PUT_CHARS
PUT_FPS:
RET
; LD HL,(DED_CNT_RED)
; LD IY,DEEL2
; LD IX,MONEY_CHAR
; LD B,5 ; aantal cijfers te delen
; CALL DLINI
;
; LD IX,MONEY_CHAR
; LD HL,(MONEY_POS)
; LD D,5
; JP PUT_CHARS
;----------------------------------
; DEEL - delen van getallen
;----------------------------------
DLINI:
LD D,1(IY)
LD E,0(IY)
XOR A
DEEL:
SBC HL,DE
JR C,ENDLP1
INC A
JR DEEL
ENDLP1:
ADD HL,DE
LD 0(IX),A
LD A,B
CP #1
RET Z
INC IX
INC IY
INC IY
DEC B
LD D,1(IY)
LD E,0(IY)
XOR A
JR DEEL
;----------------------------------------
; PUT KARAKTER
;-------------------------------------
PUT_CHARS:
LD IY,#LETCOP
LD 4(IY),L
LD 6(IY),H
PUT1LP:
LD A,0(IX)
SLA A
SLA A
SLA A ;3 KEER = 8 > 2^3
;LD B,A
; LD A,96
;ADD B
LD 0(IY),A
CALL PUTBLK
LD A,7(IY)
XOR #1
LD 7(IY),A
CALL PUTBLK
LD A,4(IY)
ADD #8
LD 4(IY),A
INC IX
DEC D
JR NZ,PUT1LP
RET
;--------------------------------------------
INIT_TEXT:
EXX
LD HL,#TEXTTAB
LD B,#0
LD C,A
SLA C
RL B
ADD HL,BC
LD E,(HL)
INC HL
LD D,(HL)
LD (TEXTADR),DE
EXX
RET
;--------------------------------------------
PUT_TEXT:
LD IY,#LETCOP2
LD DE,(TEXTADR)
LD 4(IY),#20
LD 6(IY),#20
PUT2LP:
LD A,(DE)
CP #255
RET Z
CP #32
JR Z,PUT2LP_CONT
DEBUG:
SUB #46
LD B,#0
SLA A
RL B
SLA A
RL B
SLA A ;3 KEER = 8 > 2^3
RL B
LD 0(IY),A
SLA B
SLA B
SLA B
LD A,B
ADD #136
LD 2(IY),A
LD A,(SWAP)
LD 7(IY),A
CALL PUTBLK
PUT2LP_CONT:
INC DE
LD A,4(IY)
ADD #6
LD 4(IY),A
CP #160
JR C,PUT2LP
LD A,6(IY)
ADD #8
LD 6(IY),A
LD A,#20
LD 4(IY),A
JR PUT2LP
;--------------------------------------
; routine voor kopieren van stukken scherm
; gewijzigd worden
; AF
; BC
; HL
PUTBLK:
DI ; vdp klaar ?
LD A,#2 ; waarde 2 in reg 15
OUT (0x99),A
LD A,#0x8F ; execute
OUT (0x99),A
NOP
NOP ; wacht op vdp
LUS2:
IN A,(0x99) ;lees status
RRA ; is CE nog 1 dan C is loop
JR C,LUS2
XOR A ; status reg. op 0
OUT (0x99),A
LD A,#0x8F ; reg 15 op 0 voor int!
OUT (0x99),A
PUSH IY ; hl moet iy bevatten !!
POP HL
LD A,#0x20 ; register 32
OUT (0x99),A ; als control register
LD A,#0x91 ;in reg 17
OUT (0x99),A
; LD BC,0x0F9B ; 15 bytes naar port 9b
LD C,#0x9B
OUTI
OUTI
OUTI
OUTI
OUTI
OUTI
OUTI
OUTI
OUTI
OUTI
OUTI
OUTI
OUTI
OUTI
OUTI
EI
RET
;--------------------------------------------
; put sprite
; in = IX met attribuut tabel bevat ook nummer sprite
;-----------------------------------------
PUT_SPRITE:
DI
LD A,#1
OUT (0x99),A
LD A,#0x8E
OUT (0x99),A
LD C,3(IX)
LD B,#0
LD HL,#0x7600 ; ipv 35FF
ADD HL,BC
LD A,L
OUT (0x99),A
LD A,H
OUT (0x99),A
PUSH IX
POP HL ; hl bevat attribuut tabel
LD BC,#0x0498
OTIR
EI
RET
PUT_SPRITE2:
LD A,#1
OUT (0x99),A
LD A,#0x8E
OUT (0x99),A
LD C,3(IX)
LD B,#0
LD HL,#0x7600 ; ipv 35FF
ADD HL,BC
LD A,L
OUT (0x99),A
LD A,H
OUT (0x99),A
PUSH IX
POP HL ; hl bevat attribuut tabel
LD BC,#0x0498
OTIR
RET
SPRITE_CLR:
LD A,#1 ; Zet sprite kleur
OUT (0x99),A
LD A,#0x8E
OUT (0x99),A
LD HL,#0x7400 ; 33FF
ADD HL,BC
LD A,L
OUT (0x99),A
LD A,H
OUT (0x99),A
EX DE,HL
LD BC,#0x1098
OTIR
RET
PLACE_BB_SPR:
XOR A
LD (BB_BLOCKED),A
LD A,#1
LD (BB_OUT_RANGE),A
LD IX,#SPRATR+16
LD IY,#BB_SERIE
LD HL,#SPRATR
LD A,(HL)
AND #0b11110000
LD E,A
INC HL
LD A,(HL)
AND #0b11110000
LD D,A
PUSH DE
CALL XYTO16 ; adres van eerste
LD B,D
LD C,E
CALL CALC_ADR
LD A,(BB_SIZE)
LD 0(IY),A ; size in serie
INC IY
LD B,A
SPR_LOOP0:
LD A,(BB_OUT_RANGE)
OR A
JR Z,SPR_LOOP0_CNT
CALL IS_OUT_RANGE
; LD A,(BB_OUT_RANGE)
; OR A
; JR NZ,ADD_RED
SPR_LOOP0_CNT:
DEC HL
LD A,(HL)
INC HL
LD D,(HL)
INC HL
LD E,(HL)
DEC HL
OR A
JR NZ,ADD_RED
LD A,E
OR A
JR NZ,ADD_RED
LD A,D
CP #64
JR C,ADD_RED
CP #80
JR NC,ADD_RED
ADD_WHT:
XOR A
LD 0(IY),A
JP END_LOOP0
ADD_RED:
LD A,#1
LD 0(IY),A
END_LOOP0:
INC IY
CALL CALC_NXT_ADR
DJNZ SPR_LOOP0
POP DE ;adres weer terug
LD IY,#BB_SERIE
LD B,0(IY)
LD C,#0
INC IY
SPR_LOOP1:
PUSH BC
PUSH DE
LD A,E
CP #16
JP C,OUT_RANGE
CP #176
JP NC,OUT_RANGE
LD A,D
CP #16
JP C,OUT_RANGE
CP #176
JP C,IN_RANGE
OUT_RANGE:
LD E,#212
IN_RANGE:
LD 0(IX),E
LD 1(IX),D
CALL KAN_BB_SPR
POP DE
LD BC,#4
ADD IX,BC
INC IY
POP BC
INC C
CALL NEXT_COOR
DJNZ SPR_LOOP1
RET
NEXT_COOR:
LD A,B
DEC A
RET Z
CP #1
JP Z,NEXT_COOR1
CP #2
JP Z,NEXT_COOR2
CP #3
JP Z,NEXT_COOR1
CP #4
JP Z,NEXT_COOR2
NEXT_COOR1:
LD A,E
ADD A,#16
LD E,A
RET
NEXT_COOR2:
LD A,D
ADD A,#16
LD D,A
LD A,E
SUB #16
LD E,A
RET
CALC_NXT_ADR:
LD A,B
DEC A
RET Z
CP #1
JP Z,NEXT_ADR1
CP #2
JP Z,NEXT_ADR2
CP #3
JP Z,NEXT_ADR1
CP #4
JP Z,NEXT_ADR2
NEXT_ADR1:
INC H
RET
NEXT_ADR2:
DEC H
INC HL
INC HL
INC HL
INC HL
RET
KAN_BB_SPR:
LD A,C
ADD #4
LD C,A
SLA C
SLA C
SLA C
SLA C
LD B,#0
LD A,0(IY)
CP #0
JP Z,BB_SPR_WHT
JP BB_SPR_RED
IS_OUT_RANGE:
PUSH HL
LD D,#1
DEC H
CALL BB_TEST_RANGE
INC HL
INC HL
INC HL
INC HL
CALL BB_TEST_RANGE
INC H
CALL BB_TEST_RANGE
INC H
CALL BB_TEST_RANGE
DEC HL
DEC HL
DEC HL
DEC HL
CALL BB_TEST_RANGE
DEC HL
DEC HL
DEC HL
DEC HL
CALL BB_TEST_RANGE
DEC H
CALL BB_TEST_RANGE
DEC H
CALL BB_TEST_RANGE
POP HL
LD A,D
LD (BB_OUT_RANGE),A
RET
BB_TEST_RANGE:
LD A,(HL)
CP #128
RET NC
LD (STORAGE1),A
LD A,(ITEMSELECTED)
CP #64
JR NZ,BB_TEST_RANGE2
LD A,(HL)
CP #64
JR Z,BB_TEST_RANGE3
BB_TEST_RANGE2:
LD A,(STORAGE1)
CP #96
RET C
BB_TEST_RANGE3:
LD D,#0
RET
STORAGE1: .db 0
BB_SPR_WHT:
LD A,(BB_OUT_RANGE)
OR A
JR NZ,BB_SPR_RED
LD DE,#SPRKLR_WHT
CALL SPRITE_CLR
JP PUT_SPRITE2
BB_SPR_RED:
LD A,#1
LD (BB_BLOCKED),A
LD DE,#SPRKLR_RD
CALL SPRITE_CLR
JP PUT_SPRITE2
;--------------------------------------------------
; ADD TANK !!
;
; routine die een tank toevoegd
;
; IN:
; HL = coordinaten H=Y L=X
; BC = soort tank & type B=soort C=type
;
; UIT:
; A = nummer tank > 0 is gelukt
;
;-----------------------------------------------
ADD_TANK:
LD A,B
OR A
JP Z,ADD_TNK_RED
LD A,(TNK_CNT_BLW)
CP #127 ; NIET MEER DAN 127 TANKS
LD A,#0
RET Z ;
LD A,(TNK_CNT_BLW)
INC A
LD (TNK_CNT_BLW),A
LD IX,#TEMPLATE_TNK
LD 11(IX),C
LD 0(IX),H ; X EN Y
LD 2(IX),H
LD 1(IX),L ;
LD 3(IX),L ; dest. = source
LD IY,#TANK1
LD DE,#TANK_DATA
LD B,#0 ; niet 0 MAAR 1 !!!!!
LP_CALC_BLW:
INC B
LD A,13(IY)
OR A
JR Z,ADD_TANK3
ADD IY,DE
JR LP_CALC_BLW
ADD_TANK3:
LD 13(IX),B ; nummer
LD 12(IX),#255 ; power
LD HL,#TEMP_HARV ; search template
LD B,#0
SLA C
SLA C
ADD HL,BC
LD A,(HL)
LD 10(IX),A ;speed byte
INC HL
LD A,(HL)
LD 16(IX),A ; attack
INC HL
LD A,(HL)
LD 17(IX),A ; shield
INC HL
LD A,(HL)
LD 18(IX),#1 ; wait time
LD 19(IX),A
PUSH IX
POP HL ;bron
LD BC,#TANK_DATA ; aantal
PUSH IY
POP DE ; dest
LDIR
LD B,0(IY)
LD C,1(IY)
CALL CALC_ADR
LD A,13(IX)
INC HL
LD (HL),A ; update veld layer
DEC HL
DEC HL
LD (HL),#0
RET
ADD_TNK_RED:
LD A,(TNK_CNT_RED)
CP #127 ; NIET MEER DAN 127 TANKS
LD A,#0
RET Z ;
LD A,(TNK_CNT_RED)
INC A
LD (TNK_CNT_RED),A
LD IX,#TEMPLATE_TNK
LD 11(IX),C
LD 0(IX),H ; X EN Y
LD 2(IX),H
LD 1(IX),L ;
LD 3(IX),L ; dest. = source
LD IY,#TANKRED
LD DE,#TANK_DATA
LD B,#127 ; dan is ie 128 bij de eerste loop
LP_CALC_RED:
INC B
LD A,13(IY)
OR A
JR Z,ADD_TANK4
ADD IY,DE
JR LP_CALC_RED
ADD_TANK4:
LD 13(IX),B ; nummer
LD 12(IX),#255 ; power
LD HL,#TEMP_HARV ; search template
LD B,#0
SLA C
SLA C
ADD HL,BC
LD A,(HL)
LD 10(IX),A ;speed byte
INC HL
LD A,(HL)
LD 16(IX),A ; attack
INC HL
LD A,(HL)
LD 17(IX),A ; shield
INC HL
LD A,(HL)
LD 18(IX),#1 ; wait time
LD 19(IX),A
PUSH IX
POP HL ;bron
LD BC,#TANK_DATA ; aantal
PUSH IY
POP DE ; dest
LDIR
LD B,0(IY)
LD C,1(IY)
CALL CALC_ADR
LD A,13(IX)
INC HL
LD (HL),A ; update veld layer
RET
TEST_ADD_TNK:
; LD HL,(MONEY) ; MAX 2TOTDE15
; LD BC,30
; XOR A
; SBC HL,BC
; RET C
LD A,R
AND #0b00000011
ADD #25
LD B,A
LD C,#18
PUSH BC
CALL CALC_ADR
INC HL
LD A,(HL)
OR A
POP HL
RET NZ
LD A,R
AND #0b00000001
LD B,#1 ; 1 = blauw / 0 = rood
LD A,#3 ; random tank !!
; AND 0b00000011 ; joepie werkt !!
INC A ; 0 = 1 / 3 = 4
LD C,A
CALL ADD_TANK
OR A
RET Z
LD HL,(MONEY) ; MAX 2TOTDE15
LD BC,#30
XOR A
SBC HL,BC
LD (MONEY),HL
RET
MAKE_RED_BASE:
LD B,#25 ; over de steentjes heen....
LD C,#13 ; dit moet ook weg !!
CALL CALC_ADR
LD (HL),#96
INC HL
INC HL
INC HL
INC HL
LD (HL),#97
INC H
LD (HL),#99
DEC HL
DEC HL
DEC HL
DEC HL
LD (HL),#98
LD B,#50 ; dit kan dus hierna weer weg !
LD C,#46
CALL CALC_ADR
LD (HL),#112+16
INC HL
INC HL
INC HL
INC HL
LD (HL),#113+16
INC H
LD (HL),#115+16
DEC HL
DEC HL
DEC HL
DEC HL
LD (HL),#114+16
LD B,#49 ; dit kan dus hierna weer weg !
LD C,#49
CALL CALC_ADR
LD (HL),#118+32 ; factory
INC HL
INC HL
INC HL
INC HL
LD (HL),#119+32
INC HL
INC HL
INC HL
INC HL
LD (HL),#120+32
INC H
LD (HL),#123+32
DEC HL
DEC HL
DEC HL
DEC HL
LD (HL),#122+32
DEC HL
DEC HL
DEC HL
DEC HL
LD (HL),#121+32
LD B,#53 ; EN DIT OOK
LD C,#46
CALL CALC_ADR
LD (HL),#132
INC HL
INC HL
INC HL
INC HL
LD (HL),#133
INC H
LD (HL),#135
DEC HL
DEC HL
DEC HL
DEC HL
LD (HL),#134
RET
FREE_BLW_BASE: ; ; maak wat radar schoon !
LD B,#25
LD C,#10
CALL FREE_PART
LD B,#29
LD C,#12
CALL FREE_PART
LD B,#28
LD C,#19
CALL FREE_PART
LD B,#50 ; stukie rode base
LD C,#46
CALL FREE_PART
LD B,#49
LD C,#52
CALL FREE_PART
LD B,#53
LD C,#49
CALL FREE_PART
RET
FREE_PART:
LD DE,#RAD_SIEGE
CALL FREE_PART_LOOP
CALL CALC_ADR
DEC HL
LD (HL),#0
RET
FREE_PART_LOOP:
LD A,(DE)
CP #100
RET Z
PUSH BC
ADD B
LD B,A
INC DE
LD A,(DE)
ADD C
LD C,A
INC DE
CALL CALC_ADR
POP BC
DEC HL
LD (HL),#0
JR FREE_PART_LOOP
RET
;------------------------------------------------
; Variabelen en data gebied
;------------------------------------------------
INT_DOS: .dw 0
INT_GAME: .dw INT_ROUTINE
ADR: .dw 0x4000+260 ; waar staat het veld ???? + de rand
LINE: .db 10
FASTCOP:
BRON_X: .db 0,0
BRON_Y: .db 0,2
DOEL_X: .db 0,0
DOEL_Y: .db 0
DOEL_PAGE: .db 0
NUM_X: .db 16,0
NUM_Y: .db 16,0
.db 0,0
VDP_LOG: .db 0xD0
ALGCOP: .db 0,0,0,2,0,0,0,0,16,0,16,0,0,0,0xD0
TNKCOP: .db 0,0,160,2,0,0,0,0,16,0,16,0,0,0,0x98
TNKCOP_RI: .db 0,0,160,2,0,0,0,0,16,0,16,0,0,0,0x98
TNKCOP_DN: .db 0,0,160,2,0,0,0,0,16,0,16,0,0,0,0x98
TNKCOP_LT: .db 0,0,160,2,0,0,0,0,16,0,16,0,0,0,0x98
TNKCOP_UP: .db 0,0,160,2,0,0,0,0,16,0,16,0,0,0,0x98
TANK_IMG: .db 0,0,96,3,224,0,0,3,32,0,32,0,0,0,0x98
BUILD_IMG: .db 0,0,64,3,224,0,0,3,32,0,32,0,0,0,0x98
EMPTY: .db 160,0,0,3,208,0,24,0,32,0,32,0,0,0,0xD0
RADCOP: .db 192,0,128,0,192,0,128,1,65,0,65,0,0,0,0xD0
POWER_BALK: .db 200,0,56,3,208,0,58,0,32,0,8,0,0,0,0xD0
POWER_INFO: .db 200,0,40,3,208,0,58,0,32,0,8,0,0,0,0xD0
POWER_COP: .db 208,0,58,0,208,0,58,0,32,0,8,0,0,0,0xD0
HARV_BALK: .db 192,0,0,3,232,0,24,0,8,0,32,0,0,0,0xD0
HARV_COP: .db 232,0,24,0,232,0,24,0,8,0,32,0,0,0,0xD0
ITEM_CANCEL: .db 208,0,120,3,200,0,96,0,48,0,8,0,0,0,0xD0
CANCEL_COP: .db 208,0,96,3,200,0,72,0,48,0,32,0,0,0,0xD0
LIJN_COP: .db 0,0,0,3
.db 64,0,31,0
.db 112,0,1,0
.db 0,0,0xD0
MENU_COP: .db 0,0,0,3
.db 64,0,32,0
.db 112,0,112,0
.db 0,0,0xD0
PLOF_COP: .db 0,0,64,2
.db 0,0,0,0
.db 16,0,16,0
.db 0,0,0x98
LETCOP: .db 0,0,128,3,0,0,0,0,8,0,8,0,0,0,0xD0
LETCOP2: .db 0,0,136,3,0,0,0,0,8,0,8,0,0,0,0x98
CONCRETE_COP: .db 0,0,80,2
.db 0,0,0,0
.db 16,0,16,0
.db 0,0,0xD0
SHOOT0:
.db 128,0,0,2
.db 0,0,0,0
.db 16,0,16,0
.db 0,0,0x98
SHOOT1:
.db 144,0,0,2
.db 0,0,0,0
.db 16,0,16,0
.db 0,0,0x98
IMPACT0:
.db 192,0,0,2
.db 0,0,0,0
.db 16,0,16,0
.db 0,0,0x98
COP_BSEL_1:
.db 192,0,64,2
.db 0,0,0,0
.db 16,0,16,0
.db 0,0,0x98
COP_BSEL_2:
.db 224,0,64,2
.db 0,0,0,0
.db 16,0,16,0
.db 0,0,0x98
COP_BSEL_3:
.db 208,0,64,2
.db 0,0,0,0
.db 16,0,16,0
.db 0,0,0x98
COP_BSEL_4:
.db 240,0,64,2
.db 0,0,0,0
.db 16,0,16,0
.db 0,0,0x98
BB_BUSY_COP:
.db 0,0,0,3
.db 224,0,0,3
.db 32,0,32,0
.db 0,0,0x98
BB_BLW_COP:
.db 32,0,0,3
.db 224,0,0,3
.db 32,0,32,0
.db 0,0,0xD0
BB_RED_COP:
.db 64,0,0,3
.db 224,0,0,3
.db 32,0,32,0
.db 0,0,0xD0
BB_X_COP:
.db 96,0,0,3
.db 224,0,0,3
.db 32,0,32,0
.db 0,0,0xD0
BB_READY_COP:
.db 128,0,0,3
.db 224,0,0,3
.db 32,0,32,0
.db 0,0,0x98
BB_BLD_COP:
.db 0,0,64,3
.db 224,0,0,3
.db 32,0,32,0
.db 0,0,0x98
BB_TNK_COP:
.db 0,0,96,3
.db 224,0,0,3
.db 32,0,32,0
.db 0,0,0x98
BB_BLD2_COP:
.db 0,0,0,3
.db 0,0,176,0
.db 32,0,32,0
.db 0,0,0x98
BB_MOVE_COP:
.db 224,0,0,3
.db 0,0,176,0
.db 32,0,32,0
.db 0,0,0xD0
BB_STEPS_BAR:
.db 194,0,0,3
.db 0,0,176,0
.db 4,0,16,0
.db 0,0,0xD0
GRAY_ITEM:
.db 160,0,0,3
.db 224,0,0,3
.db 32,0,32,0
.db 0,0,0xD0
PUT_ITEM:
.db 224,0,0,3
.db 208,0,24,0
.db 32,0,32,0
.db 0,0,0xD0
MENU_COM_ATT:
.db 0,0,32,3
.db 200,0,72,0
.db 48,0,8,0
.db 0,0,0xD0
MENU_RED_ATT:
.db 0,0,48,3
.db 200,0,72,0
.db 48,0,8,0
.db 0,0,0xD0
MENU_COM_MOV:
.db 48,0,32,3
.db 200,0,80,0
.db 48,0,8,0
.db 0,0,0xD0
MENU_RED_MOV:
.db 48,0,48,3
.db 200,0,80,0
.db 48,0,8,0
.db 0,0,0xD0
MENU_COM_HRV:
.db 144,0,32,3
.db 200,0,72,0
.db 48,0,8,0
.db 0,0,0xD0
MENU_RED_HRV:
.db 144,0,48,3
.db 200,0,72,0
.db 48,0,8,0
.db 0,0,0xD0
MENU_COM_RET:
.db 192,0,32,3
.db 200,0,96,0
.db 48,0,8,0
.db 0,0,0xD0
MENU_RED_RET:
.db 192,0,48,3
.db 200,0,96,0
.db 48,0,8,0
.db 0,0,0xD0
MENU_COM_STP:
.db 0,0,40,3
.db 200,0,88,0
.db 48,0,8,0
.db 0,0,0xD0
MENU_RED_STP:
.db 0,0,56,3
.db 200,0,88,0
.db 48,0,8,0
.db 0,0,0xD0
MENU_COM_REP:
.db 48,0,40,3
.db 200,0,72,0
.db 48,0,8,0
.db 0,0,0xD0
MENU_RED_REP:
.db 48,0,56,3
.db 200,0,72,0
.db 48,0,8,0
.db 0,0,0xD0
MENU_COM_UPG:
.db 96,0,40,3
.db 200,0,80,0
.db 48,0,8,0
.db 0,0,0xD0
MENU_RED_UPG:
.db 96,0,56,3
.db 200,0,80,0
.db 48,0,8,0
.db 0,0,0xD0
MENU_COM_CAN:
.db 144,0,40,3
.db 200,0,96,0
.db 48,0,8,0
.db 0,0,0xD0
MENU_COM_CLN:
.db 144,0,56,3
.db 200,0,72,0
.db 48,0,8,0
.db 0,0,0xD0
MENU_COM_SWP:
.db 200,0,58,0
.db 200,0,58,1
.db 48,0,46,0
.db 0,0,0xD0
MENU_COM_SW2:
.db 200,0,72,0
.db 200,0,72,1
.db 48,0,32,0
.db 0,0,0xD0
SWAP: .db 0
OFFSET: .db 1,1 ; zorg dat er altijd een rand #0xomeen is !
MAXSET: .db 53,53 ; vierkant veld !! is max offset + breedt
BALK: .db 0 ; xlengte
.db 0 ; ylengte
.dw 0 ; xbegin
.dw 0 ; ybegin
STOP: .db 0 ; anders dan 0 is stop
MSTOP: .db 0
MBUSY: .db 0
TNKADR: .dw 0
B_BALK_TYPE: .db 0
B_BALK_NR: .db 0
T_BALK_NR: .db 0
BB_WAIT: .db 0
BB_UP_DOWN: .db 0
RADAR: .db 0 ; niet elke keer updaten !!
VDPADR: .dw 0x0300+100
MS_COUNT:
.db 0 ; multiple select counter
TEMPLATE_TNK:
.ds TANK_DATA ; template voor toevoegen tank !
TEMP_HARV: ; ; templates per tank
.db 2 ; speed byte
.db 0,140 ; ATTACK / SHIELD
.db 60
TEMP_SIEGE:
.db 2
.db 190,150
.db 19
TEMP_TANK:
.db 2
.db 175,140
.db 15
TEMP_QUAD:
.db 4
.db 160,120
.db 10
TEMP_TRIKE:
.db 8
.db 155,80
.db 7
SPRATR:
MOUSEY: .db 96
MOUSEX: .db 128
MOUSE_SHAPE: .db 0
.db 4
.db 0,0,4,4
.db 0,0,8,8
.db 0,0,12,12
.db 0,0,32,16 ; build vlak sprite
.db 0,0,32,20
.db 0,0,32,24
.db 0,0,32,28
.db 0,0,32,32
.db 0,0,32,36
.db 0,0,36,40
.db 0,0,40,44
.db 0,0,44,48
.db 0,0,48,52
SPRKLR_WHT:
.db 15,15,15,15,15,15,15,15
.db 15,15,15,15,15,15,15,15
SPRKLR_RD:
.db 10,10,10,10,10,10,10,10
.db 10,10,10,10,10,10,10,10
BB_TYPES: .db 1,4,6,4,6,4,1,4,255 ; zie bb
BB_SIZE: .db 0 ; 1, 4(2) of 6(3)
BB_BLOCKED: .db 0 ; 1 is blocked 0 is vrij !
BB_OUT_RANGE: .db 0
BB_SERIE:
.db 0,0,0,0,0,0,0 ; Hoe groot en welke spritesvoor BB
BBB_VALUE:
; 1 = aanwezig , build step, current step
; 2 = busy with building
; 3 = ready building
; 0 = niet aanwezig
.db 1,64,63,2 ; status, steps, current, money neede
.db 1,8,7,24
.db 1,2,1,80
.db 1,16,15,10
.db 1,2,1,90
.db 0,4,3,14
.db 0,8,7,1
.db 0,2,1,2
TBB_VALUE:
.db 0,16,15,0 ; 5types units
.db 0,8,7,0
.db 0,4,3,0
.db 0,2,1,0
.db 0,2,1,0 ; BBB +13
ETB_VALUE:
.db 1,16,15,0
.db 1,8,7,0
.db 1,4,3,0
.db 1,2,1,0
.db 0,2,1,0 ; BBB + 18
UPG_LEV_BLD: .db 0 ; total upg level
UPG_LEV_UNT: .db 0 ; MAX 4 ?
IS_UNT_UPGRADING: .db 0 ; 1 per keer aub
IS_BLD_UPGRADING: .db 0
ITEMSELECTED:
.db 0 ; 0- 31 is enemy tanks of buildin
; ; 32-63 is eigen tanks of building
; ; 64-? item van build balk
SELECTED:
.db 0 ; is er een tank geselecteerd
HAS_SELECT:
.db 0 ;er is multiple select gedaan
MSELECT_ON:
.db 0 ; er zijn tanks geselecteerd
TOTAL_SELECT: .db 0 ; nax 25 in selectie !
CURSOR_TYPE:
.db 0 ; ??
FIRE_BUTTONS: .db 0
BUT_PRESSED: .db 0 ; bit 0 pressed but1
; ; bit 1 pressed but2
RADARS:
.dw RAD_DUMMY
.dw RAD_SIEGE
.dw RAD_TANK
.dw RAD_QUAD
.dw RAD_TRIKE
RAD_DUMMY: .db 100,100
RAD_SIEGE: ; altijd op 100,100 eindigen
.db -1,-3,0,-3,1,-3
.db -2,-2,-1,-2,0,-2,1,-2,2,-2
.db -3,-1,-2,-1,-1,-1,0,-1,1,-1,2,-1,3,-1
.db -3,0,-2,0,-1,0,1,0,2,0,3,0
.db -3,1,-2,1,-1,1,0,1,1,1,2,1,3,1
.db -2,2,-1,2,0,2,1,2,2,2
.db -1,3,0,3,1,3
.db 100,100
RAD_TANK: ; altijd op 100,100 eindigen
.db -1,-2,0,-2,1,-2
.db -2,-1,-1,-1,0,-1,1,-1,2,-1
.db -2,0,-1,0,1,0,2,0
.db -2,1,-1,1,0,1,1,1,2,1
.db -1,2,0,2,1,2
.db 100,100
RAD_QUAD: ; altijd op 100,100 eindigen
.db -1,-1,0,-1,1,-1,-1,0,1,0,-1,1,0,1,1,1,100,100
RAD_TRIKE: ; altijd op 100,100 eindigen
.db -1,-1,0,-1,1,-1,-1,0,1,0,-1,1,0,1,1,1,100,100
RAD_HARVB: ; altijd op 100,100 eindigen
.db -1,-1,0,-1,1,-1,-1,0,1,0,-1,1,0,1,1,1
.db 0,-2,2,0,0,2,-2,0,2,-2,2,2,-2,2,-2,-2,100,100
RAD_HARVR: ; altijd op 100,100 eindigen
.db -1,-1,0,-1,1,-1,-1,0,1,0,-1,1,0,1,1,1
.db 0,-2,2,0,0,2,-2,0,2,-2,2,2,-2,2,-2,-2
.db 0,-3,3,0,0,3,-3,0,3,-3,3,3,-3,3,-3,-3
.db 0,-4,4,0,0,4,-4,0,4,-4,4,4,-4,4,-4,-4
.db 0,-5,5,0,0,5,-5,0,5,-5,5,5,-5,5,-5,-5
.db 0,-6,6,0,0,6,-6,0,6,-6,6,6,-6,6,-6,-6
.db 0,-7,7,0,0,7,-7,0,7,-7,7,7,-7,7,-7,-7,100,100
SPICE_RAD:
.dw -1*4+-1*256
.db 17
.dw 0+-1*256
.db 18
.dw 1*4+-1*256
.db 19
.dw -1*4+0*256
.db 20
.dw 0+0
.db 16
.dw 1*4+0*256
.db 21
.dw -1*4+1*256
.db 22
.dw 0*4+1*256
.db 23
.dw 1*4+1*256
.db 24
FACTORY_DEPLOY:
.dw (0*4)+0*256,(1*4)-1*256
.dw (2*4)-1*256,(3*4)-1*256,(4*4)+0*256,(4*4)+1*256
.dw (3*4)+2*256,(2*4)+2*256,(1*4)+2*256,(0*4)+256
.dw (-1*4)+0,0-1*256,(1*4)-2*256,(2*4)-2*256
.dw (3*4)-2*256,(4*4)-1*256,5*4,(5*4)+1*256,(4*4)+2*256
.dw (3*4)+3*256,(2*4)+3*256,(1*4)+3*256,(0*4)+2*256
.dw (-1*4)+1*256,100,100
QUAKE: .db 0 ; nummer van slachtoffer
PLAYFIELD: .db 0 ; cursor binnen area 3 = 1
MOUSE_OFF: .db 0 ; AAN OF UIT
MOUSE_USE: .db 0 ; " """"""""
MOUSE_PORT: .db 0 ; PORT 1 OF 2
MOUSE_WAIT1: .db 0 ; WAIT CYCLE 1
MOUSE_WAIT2: .db 0 ; WAIT CYCLE 2
DIS_MONEY: .dw 200
MONEY: .dw 300 ; maal 10
MONEY_POS: .db 204,4
MONEY_CHAR: .db 0,0,0,0,0
FPS_OUT: .dw 0
DEEL2: .dw 10000
DEEL1: .dw 1000
.dw 100
DEEL0: .dw 10
.dw 1
ISTEXT: .db 0
TEXTADR: .dw 0
TEXTTAB:
.dw TEXT_TNK1
.dw TEXT_TNK2
.dw TEXT_TNK3
.dw TEXT_TNK4
.dw TEXT_MENU1
.dw TEXT_OUTOFMONEY
TEXT_TNK1: .str "YES SIR >>"
.db 255
TEXT_TNK2: .str "YO >>"
.db 255
TEXT_TNK3: .str "AFFIRMITIVE.."
.db 255
TEXT_TNK4: .str "ACKNOWLEDGED"
.db 255
TEXT_MENU1: .str "DOME ALPHA 3"
.db 255
TEXT_OUTOFMONEY: .str "NOT ENOUGH FUNDS..."
.db 255
PDATA_1:
.db 4,0x78 ; CONTREL/FLAG
.db 7,1 ; MOET!!!
.db 8,0 ; DIV INIT
.db 9,0 ; ST LOW
.db 10,0 ; ST HI
.db 11,0x0 ; EI LOW
.db 12,0x0 ; EI HI
.db 16,0xF0 ; 16 Khz PLAY
.db 17,0x51 ; 16 Khz PLAY
.db 18,255 ; VOL ADPCM
.db 24,8 ; ADPCM AAN
.db 7,0x60 ; IETS (0xA0 IS PLAY)
DEST_OFFSET:
.db 0,0,1,0,0,1,1,1
.db 2,0,2,1,0,2,1,2,2,2
.db 3,0,3,1,3,2,0,3,1,3,2,3,3,3
.db 4,0,4,1,4,2,4,3,0,4,1,4,2,4,3,4,4,4
PLOF_COUNT: .db 0
PLOF_TABEL:
.db 0,0,0 ; X Y nummer
.db 0,0,0 ; nummer = 0 > leeg einde rij
.db 0,0,0 ; nummer = 1 > plof aanwezig
.db 0,0,0
.ds 240 ; genoeg ruimte ?
EVENT: .db 0
EVENTHANDLER:
.dw BUILD
.dw UPDATE
.dw CHKXY
.dw RADAR_UPDATE
.dw AI
.dw ALGEMEEN
CPYTT: ; copy tank tabel
.ds 144*2 ; indeling is 0 1 of 2 en dan ix+
.db 0,0 ; voor de afronding z.w.m.z. en dus 40 un
P_BUILD: .dw 0 ; pointer naar huidig geslect building
EXTR_B_DATA:
.ds 8 ; steen
.db 2,2,255,154,0,0,0,0 ; windtrap
.db 3,2,255,154,0,0,0,0 ; ref
.db 2,2,255,154,0,0,0,0 ; silo
.db 3,2,255,154,0,0,2,0 ; factory
.db 2,2,255,154,0,0,0,0 ; radar
.db 1,1,255,154,0,0,0,0 ; tower
.db 2,2,255,154,0,0,3,0 ; const yard.
.ds 8
BUILDINGS:
.db 4
BUILDING1:
.db 1,7,25,13,2,2,200,150 ; yard coors
.db 0b00000000
; 0 ; repair bitje
; 0 ; is upgrading..
.db 0 ; cur. upgrade level
.db 3 ; max. upgrade level
.db 0 ; upgrade status
.db 0 ; refinery bezet ja/nee
.ds BUILD_DATA*24
;---------------------------------------------
BUILDING_RED:
.db 26,7,50,46,2,2,255,100,0,0,0,0,0
.db 27,1,53,46,2,2,255,100,0,0,0,0,0
.db 28,4,49,49,3,2,255,100,0,0,0,0,0
.ds BUILD_DATA*22 ; 50 stuks max.
; 25 blauw / 25 rood
TNK_CNT_BLW: .db 2
TNK_CNT_RED: .db 2
BLD_CNT_BLW: .db 1
BLD_CNT_RED: .db 0
DED_CNT_BLW: .dw 0
DED_CNT_RED: .dw 0
.area _DATA