Terminal control/Cursor movement: Difference between revisions

From Rosetta Code
Content added Content deleted
(added gw-basic/qbasic)
Line 14: Line 14:
For the purpose of this task, it is not permitted to overwrite any characters or attributes on any part of the screen (so outputting a space is not a suitable solution to achieve a movement to the right).
For the purpose of this task, it is not permitted to overwrite any characters or attributes on any part of the screen (so outputting a space is not a suitable solution to achieve a movement to the right).


=={{header|BASIC}}==
{{works with|GW-BASIC}}
{{works with|QBasic}}


<lang qbasic>10 'move left
=={{header|ZX Spectrum Basic}}==
20 LOCATE , POS(0) - 1

30 'move right
<lang zxbasic>10 PRINT CHR$(8);:REM cursor one position left
40 LOCATE , POS(0) + 1
20 PRINT CHR$(9);:REM cursor one position right
50 'move up
30 GO SUB 500: REM get cursor position
60 LOCATE CSRLIN - 1
40 IF cr>0 THEN LET cr=cr-1: GO SUB 550: REM cursor up one line
70 'move down
50 IF cr<22 THEN LET cr=cr+1: GO SUB 550: REM cursor down one line
80 LOCATE CSRLIN + 1
60 POKE 23688,33: REM cursor to beginning of the line
70 POKE 23688,0: REM cursor to end of line
900 'beginning of line
100 LOCATE , 1
80 POKE 23688,33:POKE 23689,24: REM cursor to top left
110 'end of line; requires previous knowledge of screen width -- typically 80
90 REM bottom two rows are reserved for input and errors
120 LOCATE , 80
100 REM so we reserve those lines here
130 'top left corner
110 POKE 23688,0: POKE 23689,2: REM bottom right
140 LOCATE 1, 1

150 'bottom right corner; requires knowledge of screen dimensions (80x25 here)
499 STOP: REM do not overrun into subroutines
160 LOCATE 25, 80</lang>

500 REM get cursor position
510 LET cc=33-PEEK 23688:REM current column
520 LET cr=24-PEEK 23689:REM current row
530 RETURN

550 REM set cursor position
560 PRINT AT cr,cc;
570 RETURN

600 REM alternative set cursor position
610 POKE 23688,33-cc
620 POKE 23689,24-cr
630 RETURN</lang>


=={{header|Mathematica}}==
=={{header|Mathematica}}==
Line 87: Line 77:
tput hpa $WIDTH # end of line
tput hpa $WIDTH # end of line
tput cup $HEIGHT $WIDTH # bottom right corner</lang>
tput cup $HEIGHT $WIDTH # bottom right corner</lang>

=={{header|ZX Spectrum Basic}}==

<lang zxbasic>10 PRINT CHR$(8);:REM cursor one position left
20 PRINT CHR$(9);:REM cursor one position right
30 GO SUB 500: REM get cursor position
40 IF cr>0 THEN LET cr=cr-1: GO SUB 550: REM cursor up one line
50 IF cr<22 THEN LET cr=cr+1: GO SUB 550: REM cursor down one line
60 POKE 23688,33: REM cursor to beginning of the line
70 POKE 23688,0: REM cursor to end of line
80 POKE 23688,33:POKE 23689,24: REM cursor to top left
90 REM bottom two rows are reserved for input and errors
100 REM so we reserve those lines here
110 POKE 23688,0: POKE 23689,2: REM bottom right

499 STOP: REM do not overrun into subroutines

500 REM get cursor position
510 LET cc=33-PEEK 23688:REM current column
520 LET cr=24-PEEK 23689:REM current row
530 RETURN

550 REM set cursor position
560 PRINT AT cr,cc;
570 RETURN

600 REM alternative set cursor position
610 POKE 23688,33-cc
620 POKE 23689,24-cr
630 RETURN</lang>


[[Category:Terminal control]]
[[Category:Terminal control]]

Revision as of 21:58, 1 July 2012

Terminal control/Cursor movement is a draft programming task. It is not yet considered ready to be promoted as a complete task, for reasons that should be found in its talk page.

The task is to demonstrate how to achieve movement of the terminal cursor:

  • Demonstrate how to move the cursor one position to the left
  • Demonstrate how to move the cursor one position to the right
  • Demonstrate how to move the cursor up one line (without affecting its horizontal position)
  • Demonstrate how to move the cursor down one line (without affecting its horizontal position)
  • Demonstrate how to move the cursor to the beginning of the line
  • Demonstrate how to move the cursor to the end of the line
  • Demonstrate how to move the cursor to the top left corner of the screen
  • Demonstrate how to move the cursor to the bottom right corner of the screen

For the purpose of this task, it is not permitted to overwrite any characters or attributes on any part of the screen (so outputting a space is not a suitable solution to achieve a movement to the right).

BASIC

Works with: GW-BASIC
Works with: QBasic

<lang qbasic>10 'move left 20 LOCATE , POS(0) - 1 30 'move right 40 LOCATE , POS(0) + 1 50 'move up 60 LOCATE CSRLIN - 1 70 'move down 80 LOCATE CSRLIN + 1 900 'beginning of line 100 LOCATE , 1 110 'end of line; requires previous knowledge of screen width -- typically 80 120 LOCATE , 80 130 'top left corner 140 LOCATE 1, 1 150 'bottom right corner; requires knowledge of screen dimensions (80x25 here) 160 LOCATE 25, 80</lang>

Mathematica

<lang Mathematica>Run["tput cub1"] (* one position to the left *) Run["tput cuf1" ] (* one position to the right *) Run["tput cuu1" ] (* up one line *) Run["tput cud1"] (* down one line *) Run["tput cr"] (* beginning of line *) Run["tput home"] (* top left corner *)


WIDTH=RunThrough["tput cols", ""]; HEIGHT=RunThrough["tput lines", ""];

Run["tput hpa "<>WIDTH] (* end of line *) Run["tput cup "<>HEIGHT<>" "<> WIDTH] (* bottom right corner *)</lang>


PicoLisp

<lang PicoLisp>(call 'tput "cub1") # one position to the left (call 'tput "cuf1") # one position to the right (call 'tput "cuu1") # up one line (call 'tput "cud1") # down one line (call 'tput "cr") # beginning of the line (call 'tput "hpa" (sys "COLUMNS")) # end of the line (call 'tput "home") # top left corner (call 'tput "cup" (sys "LINES") (sys "COLUMNS")) # bottom right corner</lang>

UNIX Shell

<lang sh>tput cub1 # one position to the left tput cuf1 # one position to the right tput cuu1 # up one line tput cud1 # down one line tput cr # beginning of line tput home # top left corner

  1. For line ends and bottom, we need to determine size
  2. of terminal

WIDTH=`tput cols` HEIGHT=`tput lines`

tput hpa $WIDTH # end of line tput cup $HEIGHT $WIDTH # bottom right corner</lang>

ZX Spectrum Basic

<lang zxbasic>10 PRINT CHR$(8);:REM cursor one position left 20 PRINT CHR$(9);:REM cursor one position right 30 GO SUB 500: REM get cursor position 40 IF cr>0 THEN LET cr=cr-1: GO SUB 550: REM cursor up one line 50 IF cr<22 THEN LET cr=cr+1: GO SUB 550: REM cursor down one line 60 POKE 23688,33: REM cursor to beginning of the line 70 POKE 23688,0: REM cursor to end of line 80 POKE 23688,33:POKE 23689,24: REM cursor to top left 90 REM bottom two rows are reserved for input and errors 100 REM so we reserve those lines here 110 POKE 23688,0: POKE 23689,2: REM bottom right

499 STOP: REM do not overrun into subroutines

500 REM get cursor position 510 LET cc=33-PEEK 23688:REM current column 520 LET cr=24-PEEK 23689:REM current row 530 RETURN

550 REM set cursor position 560 PRINT AT cr,cc; 570 RETURN

600 REM alternative set cursor position 610 POKE 23688,33-cc 620 POKE 23689,24-cr 630 RETURN</lang>