Prev: 03137 Up: Map Next: 03405
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
Prev: 03137 Up: Map Next: 03405