| Routines

03157: THE 'TEST FOR SCROLL' SUBROUTINE

Used by the routines at PO_ENTER, PO_TV_2 and PO_ANY. This subroutine is called whenever there might be the need to scroll the display. This occurs on three occasions: when handling a 'carriage return' character when using AT in an INPUT line when the current line is full and the next line has to be used
Input
B | Current line number
PO_SCR | 03157 | BIT 1,(IY+1) | Return immediately if the printer is being used (bit 1 of FLAGS set).
| 03161 | RET NZ
| 03162 | LD DE,3545 | Pre-load the machine stack with the address of CL_SET.
| 03165 | PUSH DE
| 03166 | LD A,B | Transfer the line number.
| 03167 | BIT 0,(IY+2) | Jump forward if considering 'INPUT ... AT ...' (bit 0 of TV-FLAG set).
| 03171 | JP NZ,PO_SCR_4
| 03174 | CP (IY+49) | Return, via CL_SET, if the line number is greater than the value of DF-SZ; give report 5 if it is less; otherwise continue.
| 03177 | JR C,REPORT_5
| 03179 | RET NZ
| 03180 | BIT 4,(IY+2) | Jump forward unless dealing with an 'automatic listing' (bit 4 of TV-FLAG set).
| 03184 | JR Z,PO_SCR_2
| 03186 | LD E,(IY+45) | Fetch the line counter from BREG.
| 03189 | DEC E | Decrease this counter.
| 03190 | JR Z,PO_SCR_3 | Jump forward if the listing is to be scrolled.
| 03192 | LD A,0 | Otherwise open channel 'K', restore the stack pointer, flag that the automatic listing has finished (reset bit 4 of TV-FLAG) and return via CL_SET.
| 03194 | CALL CHAN_OPEN
| 03197 | LD SP,(23615)
| 03201 | RES 4,(IY+2)
| 03205 | RET
This entry point is used by the routine at PO_TV_2. Report 5 - Out of screen.
REPORT_5 | 03206 | RST 8 | Call the error handling routine.
| 03207 | DEFB 4
Now consider if the prompt 'scroll?' is required.
PO_SCR_2 | 03208 | DEC (IY+82) | Decrease the scroll counter (SCR-CT) and proceed to give the prompt only if it becomes zero.
| 03211 | JR NZ,PO_SCR_3
Proceed to give the prompt message.
| 03213 | LD A,24 | The scroll counter (SCR-CT) is reset.
| 03215 | SUB B
| 03216 | LD (23692),A
| 03219 | LD HL,(23695) | The current values of ATTR-T and MASK-T are saved.
| 03222 | PUSH HL
| 03223 | LD A,(23697) | The current value of P-FLAG is saved.
| 03226 | PUSH AF
| 03227 | LD A,253 | Channel 'K' is opened.
| 03229 | CALL CHAN_OPEN
| 03232 | XOR A | The message 'scroll?' is message '0'. This message is now printed.
| 03233 | LD DE,3320
| 03236 | CALL PO_MSG
| 03239 | SET 5,(IY+2) | Signal 'clear the lower screen after a keystroke' (set bit 5 of TV-FLAG).
| 03243 | LD HL,23611 | This is FLAGS.
| 03246 | SET 3,(HL) | Signal 'L mode'.
| 03248 | RES 5,(HL) | Signal 'no key yet'.
| 03250 | EXX | Note: DE should be pushed also.
| 03251 | CALL WAIT_KEY | Fetch a single key code.
| 03254 | EXX | Restore the registers.
| 03255 | CP " " | There is a jump forward to REPORT_D - 'BREAK - CONT repeats' - if the keystroke was 'BREAK', 'STOP', 'N' or 'n'; otherwise accept the keystroke as indicating the need to scroll the display.
| 03257 | JR Z,REPORT_D
| 03259 | CP 226
| 03261 | JR Z,REPORT_D
| 03263 | OR 32
| 03265 | CP "n"
| 03267 | JR Z,REPORT_D
| 03269 | LD A,254 | Open channel 'S'.
| 03271 | CALL CHAN_OPEN
| 03274 | POP AF | Restore the value of P-FLAG.
| 03275 | LD (23697),A
| 03278 | POP HL | Restore the values of ATTR-T and MASK-T.
| 03279 | LD (23695),HL
The display is now scrolled.
PO_SCR_3 | 03282 | CALL CL_SC_ALL | The whole display is scrolled.
| 03285 | LD B,(IY+49) | The line (DF-SZ) and column numbers for the start of the line above the lower part of the display are found and saved.
| 03288 | INC B
| 03289 | LD C,33
| 03291 | PUSH BC
| 03292 | CALL CL_ADDR | The corresponding attribute byte for this character area is then found. The HL register pair holds the address of the byte.
| 03295 | LD A,H
| 03296 | RRCA
| 03297 | RRCA
| 03298 | RRCA
| 03299 | AND 3
| 03301 | OR 88
| 03303 | LD H,A
The line in question will have 'lower part' attribute values and the new line at the bottom of the display may have 'ATTR-P' values so the attribute values are exchanged.
| 03304 | LD DE,23264 | DE points to the first attribute byte of the bottom line.
| 03307 | LD A,(DE) | The value is fetched.
| 03308 | LD C,(HL) | The 'lower part' value.
| 03309 | LD B,32 | There are thirty two bytes.
| 03311 | EX DE,HL | Exchange the pointers.
PO_SCR_3A | 03312 | LD (DE),A | Make the first exchange and then proceed to use the same values for the thirty two attribute bytes of the two lines being handled.
| 03313 | LD (HL),C
| 03314 | INC DE
| 03315 | INC HL
| 03316 | DJNZ PO_SCR_3A
| 03318 | POP BC | The line and column numbers of the bottom line of the 'upper part' are fetched before returning.
| 03319 | RET
The 'scroll?' message.
SCROLL | 03320 | DEFB 128 | Initial marker - stepped over.
| 03321 | DEFM "scroll" |
| 03327 | DEFM "?"+128 | The '?' is inverted.
Report D - BREAK - CONT repeats.
REPORT_D | 03328 | RST 8 | Call the error handling routine.
| 03329 | DEFB 12
The lower part of the display is handled as follows:
PO_SCR_4 | 03330 | CP 2 | The 'out of screen' error is given if the lower part is going to be 'too large' (see DF-SZ) and a return made if scrolling is unnecessary.
| 03332 | JR C,REPORT_5
| 03334 | ADD A,(IY+49)
| 03337 | SUB 25
| 03339 | RET NC
| 03340 | NEG | The A register will now hold 'the number of scrolls to be made'.
| 03342 | PUSH BC | The line and column numbers are now saved.
| 03343 | LD B,A | The 'scroll number', ATTR-T, MASK-T and P-FLAG are all saved.
| 03344 | LD HL,(23695)
| 03347 | PUSH HL
| 03348 | LD HL,(23697)
| 03351 | PUSH HL
| 03352 | CALL TEMPS | The 'permanent' colour items are to be used.
| 03355 | LD A,B | The 'scroll number' is fetched.
The lower part of the screen is now scrolled A number of times.
PO_SCR_4A | 03356 | PUSH AF | Save the 'number'.
| 03357 | LD HL,23659 | This is DF-SZ.
| 03360 | LD B,(HL) | The value in DF-SZ is incremented; the B register set to hold the former value and the A register the new value.
| 03361 | LD A,B
| 03362 | INC A
| 03363 | LD (HL),A
| 03364 | LD HL,23689 | This is S-POSN-hi.
| 03367 | CP (HL) | The jump is taken if only the lower part of the display is to be scrolled (B=old DF-SZ).
| 03368 | JR C,PO_SCR_4B
| 03370 | INC (HL) | Otherwise S-POSN-hi is incremented and the whole display scrolled (B=24).
| 03371 | LD B,24
PO_SCR_4B | 03373 | CALL CL_SCROLL | Scroll B lines.
| 03376 | POP AF | Fetch and decrement the 'scroll number'.
| 03377 | DEC A
| 03378 | JR NZ,PO_SCR_4A | Jump back until finished.
| 03380 | POP HL | Restore the value of P-FLAG.
| 03381 | LD (IY+87),L
| 03384 | POP HL | Restore the values of ATTR-T and MASK-T.
| 03385 | LD (23695),HL
| 03388 | LD BC,(23688) | In case S-POSN has been changed CL_SET is called to give a matching value to DF-CC (after resetting bit 0 of TV-FLAG).
| 03392 | RES 0,(IY+2)
| 03396 | CALL CL_SET
| 03399 | SET 0,(IY+2) | Set bit 0 of TV-FLAG to indicate that the lower screen is being handled, fetch the line and column numbers, and then return.
| 03403 | POP BC
| 03404 | RET