| Routines

0DFE: THE 'SCROLLING' SUBROUTINE

Used by the routine at PO_SCR. The number of lines of the display that are to be scrolled has to be held on entry to the main subroutine in the B register.
CL_SC_ALL | 0DFE | LD B,$17 | The entry point after 'scroll?'
This entry point is used by the routine at PO_SCR. The main entry point - from above and when scrolling for INPUT...AT.
CL_SCROLL | 0E00 | CALL CL_ADDR | Find the starting address of the line.
| 0E03 | LD C,$08 | There are eight pixel lines to a complete line.
Now enter the main scrolling loop. The B register holds the number of the top line to be scrolled, the HL register pair the starting address in the display area of this line and the C register the pixel line counter.
CL_SCR_1 | 0E05 | PUSH BC | Save both counters.
| 0E06 | PUSH HL | Save the starting address.
| 0E07 | LD A,B | Jump forward unless dealing at the present moment with a 'third' of the display.
| 0E08 | AND $07
| 0E0A | LD A,B
| 0E0B | JR NZ,CL_SCR_3
The pixel lines of the top lines of the 'thirds' of the display have to be moved across the 2K boundaries. (Each 'third' is 2K.)
CL_SCR_2 | 0E0D | EX DE,HL | The result of this manipulation is to leave HL unchanged and DE pointing to the required destination.
| 0E0E | LD HL,$F8E0
| 0E11 | ADD HL,DE
| 0E12 | EX DE,HL
| 0E13 | LD BC,$0020 | There are +20 characters.
| 0E16 | DEC A | Decrease the counter as one line is being dealt with.
| 0E17 | LDIR | Now move the thirty two bytes.
The pixel lines within the 'thirds' can now be scrolled. The A register holds, on the first pass, +01 to +07, +09 to +0F, or +11 to +17.
CL_SCR_3 | 0E19 | EX DE,HL | Again DE is made to point to the required destination, this time only thirty two locations away.
| 0E1A | LD HL,$FFE0
| 0E1D | ADD HL,DE
| 0E1E | EX DE,HL
| 0E1F | LD B,A | Save the line number in B.
| 0E20 | AND $07 | Now find how many characters there are remaining in the 'third'.
| 0E22 | RRCA
| 0E23 | RRCA
| 0E24 | RRCA
| 0E25 | LD C,A | Pass the 'character total' to the C register.
| 0E26 | LD A,B | Fetch the line number.
| 0E27 | LD B,$00 | BC holds the 'character total' and a pixel line from each of the characters is 'scrolled'.
| 0E29 | LDIR
| 0E2B | LD B,$07 | Now prepare to increment the address to jump across a 'third' boundary.
| 0E2D | ADD HL,BC | Increase HL by +0700.
| 0E2E | AND $F8 | Jump back if there are any 'thirds' left to consider.
| 0E30 | JR NZ,CL_SCR_2
Now find if the loop has been used eight times - once for each pixel line.
| 0E32 | POP HL | Fetch the original address.
| 0E33 | INC H | Address the next pixel line.
| 0E34 | POP BC | Fetch the counters.
| 0E35 | DEC C | Decrease the pixel line counter and jump back unless eight lines have been moved.
| 0E36 | JR NZ,CL_SCR_1
Next the attribute bytes are scrolled. Note that the B register still holds the number of lines to be scrolled and the C register holds zero.
| 0E38 | CALL CL_ATTR | The required address in the attribute area and the number of characters in B lines are found.
| 0E3B | LD HL,$FFE0 | The displacement for all the attribute bytes is thirty two locations away.
| 0E3E | ADD HL,DE
| 0E3F | EX DE,HL
| 0E40 | LDIR | The attribute bytes are 'scrolled'.
It remains now to clear the bottom line of the display.
| 0E42 | LD B,$01 | The B register is loaded with +01 and CL_LINE is entered.