Terminal control/Preserve screen: Difference between revisions
m ({{omit from|GUISS}}) |
|||
Line 71: | Line 71: | ||
sleep 5 # Wait five seconds |
sleep 5 # Wait five seconds |
||
tput rmcup # Restore the display</lang> |
tput rmcup # Restore the display</lang> |
||
=={{header|Z80 Assembly}}== |
|||
Using the Amstrad CPC firmware: |
|||
<lang z80> org $3000 |
|||
txt_output: equ $bb5a |
|||
scr_clear: equ $bc14 |
|||
wait_char: equ $bb06 |
|||
scr_get_loc: equ $bc0b |
|||
scr_set_off: equ $bc05 |
|||
push bc |
|||
push de |
|||
push hl |
|||
push af |
|||
call scr_get_loc ; save this value just in case the |
|||
push hl ; original screen has been scrolled vertically |
|||
ld hl,$c000 ; copy screen to block 1 |
|||
ld de,$4000 |
|||
ld bc,$4000 |
|||
ldir |
|||
call scr_clear |
|||
ld hl,text |
|||
print: ld a,(hl) |
|||
cp 0 |
|||
jr z,key |
|||
call txt_output |
|||
inc hl |
|||
jr print |
|||
key: call wait_char |
|||
pop hl |
|||
call scr_set_off |
|||
ld hl,$4000 ; restore screen |
|||
ld de,$c000 |
|||
ld bc,$4000 |
|||
ldir |
|||
pop af |
|||
pop hl |
|||
pop de |
|||
pop bc |
|||
ret |
|||
text: defm "This is some text. Please press a key.\0"</lang> |
|||
{{omit from|GUISS}} |
{{omit from|GUISS}} |
Revision as of 00:39, 28 November 2011
You are encouraged to solve this task according to the task description, using any language you may know.
The task is to clear the screen, output something on the display, and then restore the screen to the preserved state that it was in before the task was carried out. There is no requirement to change the font or kerning in this task, however character decorations and attributes are expected to be preserved. If the implementer decides to change the font or kerning during the display of the temporary screen, then these settings need to be restored prior to exit.
C
For Xterm. "Allow alternate screen buffer" must be enabled by the popup menu.<lang C>#include <stdio.h>
- include <unistd.h>
int main() { int i; printf("\033[?1049h\033[H"); printf("Alternate screen buffer\n"); for (i = 5; i; i--) { printf("\rgoing back in %d...", i); fflush(stdout); sleep(1); } printf("\033[?1049l");
return 0; }</lang>
JavaScript
<lang javascript>(function() { var orig= document.body.innerHTML document.body.innerHTML= ; setTimeout(function() { document.body.innerHTML= 'something'; setTimeout(function() { document.body.innerHTML= orig; }, 1000); }, 1000); })();</lang>
This implementation assumes that Javascript is running in the browser.
This task does not admit sample output, but you can demonstrate this solution for yourself using the chrome browser: control-shift-J then copy and paste the above into the command line, and hit enter.
PicoLisp
<lang PicoLisp>#!/usr/bin/picolisp /usr/lib/picolisp/lib.l
(call 'tput "smcup") (prinl "something") (wait 3000) (call 'tput "rmcup")
(bye)</lang>
Tcl
On Unix terminals only, with the help of tput: <lang tcl># A helper to make code more readable proc terminal {args} {
exec /usr/bin/tput {*}$args >/dev/tty
}
- Save the screen with the "enter_ca_mode" capability, a.k.a. 'smcup'
terminal smcup
- Some indication to users what is happening...
puts "This is the top of a blank screen. Press Return/Enter to continue..." gets stdin
- Restore the screen with the "exit_ca_mode" capability, a.k.a. 'rmcup'
terminal rmcup</lang>
UNIX Shell
<lang sh>#!/bin/sh tput smcup # Save the display echo 'Hello' sleep 5 # Wait five seconds tput rmcup # Restore the display</lang>
Z80 Assembly
Using the Amstrad CPC firmware:
<lang z80> org $3000
txt_output: equ $bb5a scr_clear: equ $bc14 wait_char: equ $bb06 scr_get_loc: equ $bc0b scr_set_off: equ $bc05
push bc push de push hl push af
call scr_get_loc ; save this value just in case the push hl ; original screen has been scrolled vertically
ld hl,$c000 ; copy screen to block 1 ld de,$4000 ld bc,$4000 ldir
call scr_clear ld hl,text
print: ld a,(hl) cp 0 jr z,key call txt_output inc hl jr print
key: call wait_char pop hl call scr_set_off ld hl,$4000 ; restore screen ld de,$c000 ld bc,$4000 ldir pop af pop hl pop de pop bc ret
text: defm "This is some text. Please press a key.\0"</lang>