Prev: 57266 Up: Map Next: 57570
57348: Generate Picture
Used by the routine at Game_Initialisation.
Input
IX Pointer to level graphics data
IX will point to one of:
Address Level
GraphicsData_Level_01 Level 01
GraphicsData_Level_02 Level 02
GraphicsData_Level_03 Level 03
GraphicsData_Level_04 Level 04
GraphicsData_Level_05 Level 05
GraphicsData_Level_06 Level 06
GraphicsData_Level_07 Level 07
GraphicsData_Level_08 Level 08
GraphicsData_Level_09 Level 09
GraphicsData_Level_10 Level 10
GeneratePicture 57348 LD HL,41187 HL=Buffer_Image.
Clear down the buffer ready for the new image to be generated.
57351 LD BC,2880 BC=2880.
57354 LD (HL),0 Write 0 to *HL.
57356 PUSH HL DE=Buffer_Image+1 (using the stack).
57357 POP DE
57358 INC DE
57359 LDIR Clear 2880 bytes of data in Buffer_Image.
57361 LD A,128 Write 128 to *Line_Counter.
57363 LD (57566),A
GeneratePicture_Loop 57366 LD A,128 A=128-*Line_Counter.
57368 LD HL,57566
57371 SUB (HL)
57372 LD B,20 B=20.
57374 LD D,0 Load A into DE.
57376 LD E,A
57377 LD HL,41187 Starting from the first address at Buffer_Image, stored in HL...
GeneratePicture_CurrentLine_Loop 57380 ADD HL,DE Keep adding DE to HL.
57381 DJNZ GeneratePicture_CurrentLine_Loop Decrease counter by one and loop back to GeneratePicture_CurrentLine_Loop until counter is zero.
57383 LD (57568),HL Write HL to *Buffer_Position.
57386 LD A,(IX+0) Fetch a byte from the level graphics data pointer.
57389 INC IX Increment the level graphics data pointer by one.
57391 CP 201 Jump to ProcessCompressedImageData if A is equal to 201.
57393 JR Z,ProcessCompressedImageData
57395 CP 202 Jump to GeneratePicture_RLE_Decoding if A is equal to 202.
57397 JR Z,GeneratePicture_RLE_Decoding
57399 PUSH IX Copy the level graphics data pointer into DE (using the stack).
57401 POP DE
57402 EX DE,HL Exchange the DE and HL registers.
57403 LD BC,20 Copy 0020 bytes of data from HL to DE.
57406 LDIR
57408 PUSH HL Update the level graphics data pointer in IX with the progress made from HL (using the stack).
57409 POP IX
57411 JR GeneratePicture_Next Jump to GeneratePicture_Next.
Run-length decoding.
GeneratePicture_RLE_Decoding 57413 PUSH IX Copy the level graphics data pointer into DE (using the stack).
57415 POP DE
GeneratePicture_RLE_NormalData 57416 LD A,(DE) Fetch a byte from the level graphics data pointer in DE.
57417 CP 0 Jump to GeneratePicture_RLE_RepeatZero if the byte is 0.
57419 JR Z,GeneratePicture_RLE_RepeatZero
57421 LD (HL),A Else, write the byte to the image buffer.
57422 INC HL Increment the image buffer pointer by one.
57423 INC DE Increment the level graphics data pointer (in DE) by one.
57424 JR GeneratePicture_RLE_NormalData Jump to GeneratePicture_RLE_NormalData.
GeneratePicture_RLE_RepeatZero 57426 INC DE Increment the level graphics data pointer (in DE) by one.
57427 LD A,(DE) Fetch a byte from the level graphics data pointer in DE.
57428 CP 0 Jump to GeneratePicture_RLE_Next if the byte is 0.
57430 JR Z,GeneratePicture_RLE_Next
57432 LD B,A Copy the fetched byte into B as a repeat counter
57433 XOR A Write 0 to the image buffer.
GeneratePicture_RLE_RepeatZero_Loop 57434 LD (HL),A
57435 INC HL Increment the image buffer pointer by one.
57436 DJNZ GeneratePicture_RLE_RepeatZero_Loop Decrease the byte repeat counter by one and loop back to GeneratePicture_RLE_RepeatZero_Loop until the counter is zero.
57438 INC DE Increment the level graphics data pointer (in DE) by one.
57439 JR GeneratePicture_RLE_NormalData Jump to GeneratePicture_RLE_NormalData.
GeneratePicture_RLE_Next 57441 INC DE Increment the level graphics data pointer (in DE) by one.
57442 PUSH DE Update the level graphics data pointer in IX with the progress made from DE (using the stack).
57443 POP IX
57445 JR GeneratePicture_Next Jump to GeneratePicture_Next.
Second
ProcessCompressedImageData 57447 LD B,(IX+1) Load the repeat count into B.
57450 LD A,(IX+0) Write the operation code to *Operation_Code.
57453 LD (57567),A
ProcessOperationBlock_Loop 57456 PUSH BC Stash the repeat count on the stack.
57457 LD A,(57567) Load the operation code into A.
57460 CP 201 Jump to ProcessCompressedImageData_Next if the operation code is 201.
57462 JR Z,ProcessCompressedImageData_Next
57464 CP 202 Jump to ProcessCompressedImageData_Next if the operation code is 202.
57466 JR Z,ProcessCompressedImageData_Next
57468 CP 203 Jump to ProcessBitOperation if the operation code is not 203.
57470 JR NZ,ProcessBitOperation
ProcessCompressedImageData_Next 57472 POP BC Restore the repeat count from the stack.
57473 JR GeneratePicture_Next Jump to GeneratePicture_Next.
ProcessBitOperation 57475 AND %11111000 Mask to get the byte offset within the current line, store this in D.
57477 LD D,A
57478 RRCA Divide the byte offset by 8 to get the pixel offset, store this in E.
57479 RRCA
57480 RRCA
57481 LD E,A
57482 LD A,(57567) Reload the operation code into A.
57485 SUB D Subtract to calculate the number of bits to modify.
57486 LD D,0 D=0.
57488 ADD HL,DE HL+=DE.
57489 LD B,A Set the bit count in B.
57490 INC B Adjust B for the loop.
57491 LD A,(HL) A=*HL.
57492 AND A Clear the carry flag.
57493 PUSH BC Stash the bit count on the stack.
RotateBitsLeft_Loop 57494 RLA Rotate left, moving bits one position to the left.
57495 DJNZ RotateBitsLeft_Loop Decrease counter by one and loop back to RotateBitsLeft_Loop until counter is zero.
57497 SCF Set the carry flag.
57498 POP BC Restore the bit count from the stack.
RotateBitsRight_Loop 57499 RRA Rotate right, moving bits back and inserting 1.
57500 DJNZ RotateBitsRight_Loop Decrease the bit count by one and loop back to RotateBitsRight_Loop until all bits have been processed.
57502 LD (HL),A Write A to *HL.
57503 LD HL,57567 Increment *Operation_Code by one.
57506 INC (HL)
57507 LD HL,(57568) HL=*Buffer_Position.
57510 POP BC Restore the repeat count from the stack.
57511 DJNZ ProcessOperationBlock_Loop Decrease the repeat count by one and loop back to ProcessOperationBlock_Loop until all operations are done.
57513 INC IX Increment IX by two.
57515 INC IX
57517 JP ProcessCompressedImageData Jump to ProcessCompressedImageData.
Has all the image been decompressed now? If not, loop back again.
GeneratePicture_Next 57520 LD HL,57566 HL=Line_Counter.
57523 DEC (HL) Decrease *HL by one.
57524 JP NZ,GeneratePicture_Loop Jump to GeneratePicture_Loop until *HL is zero.
57527 INC IX Move IX to the start of the attribute data.
57529 LD B,16 Set a counter in B to process 16 rows of attribute data.
57531 LD HL,43747 Store the start of Buffer_Image_Attributes in HL.
GeneratePicture_Attributes_Loop 57534 PUSH BC Stash the attribute row counter and the image attributes buffer pointer on the stack.
57535 PUSH HL
57536 LD A,0 Initialise the column counter in A.
GeneratePicture_Attribute_Row 57538 LD C,(IX+0) Load the attribute value into C.
57541 INC IX Load the repeat length into B.
57543 LD B,(IX+0)
57546 INC IX Move IX to the next attribute/ repeat length pair.
57548 ADD A,B Add the repeat length to the column counter.
GeneratePicture_Attribute_Run 57549 LD (HL),C Write the attribute to the image attributes buffer.
57550 INC HL Increment the image attributes buffer pointer by one.
57551 DJNZ GeneratePicture_Attribute_Run Decrease the repeat counter by one and loop back to GeneratePicture_Attribute_Run until counter is zero.
57553 CP 20 Jump to GeneratePicture_Attribute_Row if 20 columns have been processed.
57555 JR NZ,GeneratePicture_Attribute_Row
57557 POP HL Restore the start of the current attribute row from the stack.
57558 LD BC,20 Move HL to the next row in the attribute buffer.
57561 ADD HL,BC
57562 POP BC Restore the attribute row counter from the stack.
57563 DJNZ GeneratePicture_Attributes_Loop Decrease the attribute row counter by one and loop back to GeneratePicture_Attributes_Loop until counter is zero.
57565 RET Return.
Variables specifically for this routine.
Line_Counter 57566 DEFB 0
Operation_Code 57567 DEFB 0
Buffer_Position 57568 DEFW 0
Prev: 57266 Up: Map Next: 57570