Prev: DF46 Up: Map Next: E0AD
DF90: Find Scene
Used by the routines at GameEntryPoint and SelectionScreen.
Input
A Level
In order to find the scene data for the requested level, the code "counts" the number of terminator bytes found.
FindScene DF90 LD E,A E=level.
DF91 LD HL,$CDE2 HL=Scene_Data.
FindScene_Loop DF94 LD A,(HL) A=byte of scene data.
DF95 INC HL Increment scene data pointer by one.
Check for a terminator byte.
DF96 CP $FF Loop back to FindScene_Loop until A is equal to FF.
DF98 JR NZ,FindScene_Loop
Only continue when the "level" has been decreased to zero. This is when the appropriate scene data has been found.
DF9A DEC E Decrease level by one.
DF9B JR NZ,FindScene_Loop Jump to FindScene_Loop until E is zero.
Process the scene data.
DF9D LD A,(HL) A=byte of scene data.
DF9E PUSH HL Stash the scene data pointer on the stack temporarily.
DF9F CALL $D50C Call D50C.
DFA2 POP HL Restore the scene data pointer from the stack.
DFA3 INC HL Increment the scene data pointer by one.
DFA4 LD A,(HL) A=byte of scene data.
DFA5 PUSH HL Stash the scene data pointer on the stack temporarily.
DFA6 CALL $D55B Call D55B.
DFA9 POP HL Restore the scene data pointer from the stack.
DFAA INC HL Increment the scene data pointer by one.
DFAB LD A,(HL) A=byte of scene data.
DFAC AND %01111000 Keep only bits 3-6.
DFAE RRCA Rotate A right three positions (bits 3 to 6 are now in positions 0 to 3).
DFAF RRCA
DFB0 RRCA
DFB1 PUSH HL Stash the scene data pointer on the stack temporarily.
DFB2 LD ($D400),A Write A to *Scene_Type.
DFB5 CALL $D593 Call D593.
DFB8 POP HL Restore the scene data pointer from the stack.
DFB9 XOR A Write 00 to:
DFBA LD ($D220),A
DFBD LD ($D222),A
Set the number of buildings for this level.
DFC0 LD A,(HL) A=*HL.
DFC1 AND %00000111 Keep only bits 0-2.
DFC3 LD ($D3F3),A Write A to *BuildingsRemainingCount.
DFC6 INC HL Increment the scene data pointer by one.
FindScene_0 DFC7 PUSH AF Stash AF and HL on the stack.
DFC8 PUSH HL
DFC9 LD HL,$D39F HL=Table_Buildings.
DFCC LD A,($D220) A=*D220.
DFCF LD D,$00 D=00.
DFD1 LD E,A E=A.
DFD2 ADD HL,DE HL+=DE.
DFD3 PUSH HL IX=HL using the stack.
DFD4 POP IX
DFD6 ADD A,$0E A+=0E.
DFD8 LD ($D220),A Write A to *D220.
DFDB LD A,($D222) A=*D222.
DFDE INC A Increment A by one.
DFDF LD ($D222),A Write A to *D222.
DFE2 POP HL Restore HL from the stack.
DFE3 LD A,(HL) A=*HL.
DFE4 AND %01111111 Keep only bits 0-6.
DFE6 LD E,A E=A.
DFE7 LD A,(HL) A=*HL.
DFE8 AND %10000000 Keep only bit 7.
DFEA RLCA Move bit 7 to bit 0, and also set/ unset the carry flag.
DFEB INC A Increment A by one.
DFEC EX AF,AF' Exchange the AF register with the shadow AF register.
DFED INC HL Increment HL by one.
DFEE LD A,(HL) A=*HL.
DFEF AND %11100000 Keep only bits 5-7.
DFF1 RLCA Rotate A left three positions (bits 5 to 7 are now in positions 0 to 2).
DFF2 RLCA
DFF3 RLCA
DFF4 LD B,$00 B=00.
DFF6 LD C,A C=A.
DFF7 PUSH HL Stash HL on the stack.
DFF8 LD HL,$E0A5 HL=E0A5.
DFFB ADD HL,BC HL+=BC.
DFFC LD D,(HL) D=*HL.
DFFD POP HL Restore HL from the stack.
DFFE LD A,(HL) A=*HL.
DFFF AND %00011111 Keep only bits 0-4.
E001 LD C,A C=A.
E002 INC HL Increment HL by one.
E003 PUSH HL Stash HL on the stack.
E004 LD HL,$0080 HL=0080.
E007 ADD HL,BC HL+=BC.
E008 LD C,$08 C=08.
E00A LD A,E A=E.
E00B DEC A Decrease A by one.
FindScene_1 E00C DEC C Decrease C by one.
E00D SUB $06 A-=06.
E00F JR NC,FindScene_1 Jump to FindScene_1 if there's no carry (i.e. A was higher than 06).
E011 RRC C Rotate C right three positions.
E013 RRC C
E015 RRC C
E017 ADD HL,BC HL+=BC.
E018 LD B,H B=H.
E019 LD C,L C=L.
E01A EX AF,AF' Exchange the AF register with the shadow AF register.
E01B CALL $DA71 Call DA71.
E01E LD HL,$D31F HL=D31F.
E021 LD A,(IX+$07) A=*IX+07.
E024 RRCA Rotate A left one position, setting the carry flag if bit 0 was set.
E025 JR C,FindScene_2 Jump to FindScene_2 if the carry flag was set.
E027 LD HL,$D35F HL=D35F.
FindScene_2 E02A LD D,$00 D=00.
E02C LD E,(IX+$01) E=*IX+01.
E02F ADD HL,DE HL+=DE.
E030 LD A,(IX+$02) A=*IX+02.
E033 SUB E A-=E.
E034 INC A Increment A by one.
E035 LD B,A B=A.
FindScene_3 E036 LD A,($D222) A=*D222.
E039 LD (HL),A Write A to *HL.
E03A PUSH HL Stash HL on the stack.
E03B LD E,$20 E=20.
E03D ADD HL,DE HL+=DE.
E03E LD A,(IX+$08) A=*IX+08.
E041 LD (HL),A Write A to *HL.
E042 POP HL Restore HL from the stack.
E043 INC HL Increment HL by one.
E044 DJNZ FindScene_3 Decrease counter by one and loop back to FindScene_3 until counter is zero.
E046 POP HL Restore HL and AF from the stack.
E047 POP AF
E048 DEC A Decrease A by one.
E049 JP NZ,FindScene_0 Jump to FindScene_0 until A is zero.
E04C LD HL,$D31F HL=D31F.
E04F LD DE,$D35F DE=D35F.
E052 LD B,$20 B=20 (counter).
FindScene_4 E054 LD A,(DE) A=*DE.
E055 RLCA Rotate A left three positions.
E056 RLCA
E057 RLCA
E058 OR (HL) Set the bits from *HL.
E059 LD (HL),A Write A to *HL.
E05A INC HL Increment HL by one.
E05B INC DE Increment DE by one.
E05C DJNZ FindScene_4 Decrease counter by one and loop back to FindScene_4 until counter is zero.
Default to not using the train.
E05E LD A,$FE Write FE (spawning "off") to *TrainState.
E060 LD ($D405),A
E063 LD A,($D400) Jump to Train_Enable if *Scene_Type is equal to 02.
E066 CP $02
E068 JR Z,Train_Enable
E06A CP $05 Jump to Vehicle_Disable if A is equal to 05.
E06C JR Z,Vehicle_Disable
Anything else uses vehicles.
E06E LD A,$18 Write 18 to *VehicleCounter.
E070 LD ($D401),A
Helicopters_CalculateCount E073 LD A,($DF44) A=*CurrentLevel.
Divide the level number by 08 but ensure the result is no higher than 07.
E076 RRCA Rotate A right three positions (bits 3 to 5 are now in positions 0 to 2).
E077 RRCA
E078 RRCA
E079 AND %00000111 Keep only bits 0-2.
Always ensure there are at least two helicopters.
E07B ADD A,$02 A+=02.
Don't allow any more than six helicopters.
E07D CP $07 Jump to Helicopter_SetCount if A is lower than 07.
E07F JR C,Helicopter_SetCount
Else, set the limit of six which is the maximum the game can support.
E081 LD A,$06 A=06.
Helicopter_SetCount E083 LD ($D212),A Write A to *MaxHelicopterCount.
E086 LD A,($DF44) A=*CurrentLevel.
Divide the level number by 04 but ensure the result is no higher than 0F.
E089 RRCA Rotate A right two positions (bits 2 to 5 are now in positions 0 to 3).
E08A RRCA
E08B AND %00001111 Keep only bits 0-3.
E08D ADD A,$06 A+=06.
E08F CP $11 Jump to FindScene_5 if A is lower than 11.
E091 JR C,FindScene_5
E093 LD A,$10 Write 10 to *MaxHumansCount.
FindScene_5 E095 LD ($D211),A
E098 RET Return.
Sets the train countdown and turns off vehicles as they can't co-exist.
Train_Enable E099 LD A,$20 Write 20 to *TrainState.
E09B LD ($D405),A
Vehicle_Disable E09E LD A,$FE Write FE (spawning "off") to *VehicleCounter.
E0A0 LD ($D401),A
E0A3 JR Helicopters_CalculateCount Jump to Helicopters_CalculateCount.
E0A5 DEFB $50,$58,$60,$20,$70,$30,$78,$38
Prev: DF46 Up: Map Next: E0AD