--- title: "SRAM Hi-Res Extended BASIC" id: 51391 type: "computer_media" slug: "sram-hi-res-extended-basic" url: "http://localhost/computer_media/sram-hi-res-extended-basic/" markdown_url: "http://localhost/computer_media/sram-hi-res-extended-basic.md" published_at: "2023-07-30T06:53:25+00:00" modified_at: "2026-04-03T13:52:13+00:00" author: "David Anderson" featured_image: url: "http://localhost/wp-content/uploads/2019/02/20230809-041332.jpg" excerpt: "A full machine code BASIC extension packed into REM statements adds high-resolution graphics commands, a 64-column display mode, and enhanced tape routines to your system." category: - name: "Archived Media" slug: "archived-media" taxonomy: "category" url: "http://localhost/category/archived-media/" post_tag: - name: "Downloadable" slug: "downloadable" taxonomy: "post_tag" url: "http://localhost/tag/downloadable/" - name: "TS 1000" slug: "ts1000" taxonomy: "post_tag" url: "http://localhost/tag/ts1000/" model: - name: "Timex/Sinclair 1000" slug: "ts-1000" taxonomy: "model" url: "http://localhost/model/ts-1000/" indiv: - name: "Fred Nachbaur" slug: "fred-nachbaur" taxonomy: "indiv" url: "http://localhost/indiv/fred-nachbaur/" - name: "Gregory Harder" slug: "gregory-harder" taxonomy: "indiv" url: "http://localhost/indiv/gregory-harder/" genre: - name: "Programming" slug: "programming" taxonomy: "genre" url: "http://localhost/type/programming/" media_type: "Cassette" programmers: - name: "Fred Nachbaur" slug: "fred-nachbaur" taxonomy: "indiv" url: "http://localhost/indiv/fred-nachbaur/" - name: "Gregory Harder" slug: "gregory-harder" taxonomy: "indiv" url: "http://localhost/indiv/gregory-harder/" download_url: "https://archive.org/download/timex-sinclair-software-archive/SRAM%20Hi-Res%20Extended%20Basic%20%281987%29%28Harder%2C%20Gregory%20and%20Nachbaur%2C%20Fred%29%28US%29%28TS1000%29%28Program%29.zip" mediadate: "1987" producer_company: - id: 11370 title: "SyncWare Co." type: "company" url: "http://localhost/company/syncware-co/" related_products: - id: 35767 title: "SRAM Hi*Res Extended BASIC" type: "product" url: "http://localhost/product/sram-hires-extended-basic/" media_type_tags: "Programming" --- # SRAM Hi-Res Extended BASIC SRAM Hi-Res Extended BASIC (SHREB) is a machine code extension package for the ZX81/TS1000, written by Fred Nachbaur and Greg Harder. Fred wrote the core routines (parser, tape routines, that sort of stuff) and Greg specialized in the cool graphics commands. It adds high-resolution graphics commands and other enhanced BASIC keywords. The package loads at address 20000 (decimal), activated via USR calls in lines 10–60, which initialize the extension and either clear the screen, RUN, pause, or return depending on the result. Lines 0–2 are REM statements that serve as containers for the machine code binary data, encoding the core parser, tape routines, and graphics command set directly in the program’s REM storage area. The REM at line 2 is labeled “64-COL” in its header, suggesting the graphics subsystem supports a 64-column display mode. *** ## Program Analysis ### Program Structure The program consists of five lines total: three REM lines (0, 1, 2) that carry machine code payloads, and four short BASIC lines (10, 30, 40, 50, 60) that install and activate the extension. The structure is typical of machine code extensions distributed as BASIC programs — the binary data is embedded in REM statements where the interpreter will never attempt to execute it as BASIC tokens, keeping it safe in memory. - `Line 0`: REM block labeled `CORE V3.00` — contains the main extension binary (parser, tape routines, core dispatcher) - `Line 1`: REM block — contains additional routines (likely tape and utility support, given the `FAST`/`SAVE`/`LOAD` tokens visible) - `Line 2`: REM block labeled `64-COL` — contains the high-resolution and 64-column graphics subsystem - `Line 10`: `LET HR=VAL "20000"` — stores the load address in variable `HR` - `Lines 30–60`: Four `IF USR HR THEN ...` calls that install the extension and branch based on return value ### Machine Code Loading and Activation The variable `HR` is set to `20000` (decimal) via `VAL "20000"`, a common memory-saving idiom that avoids storing the numeric value in the BASIC line itself. The four `USR HR` calls in lines 30–60 each invoke the machine code at address 20000. The extension’s entry point returns different values on successive calls (or on different conditions), allowing the BASIC shell to branch: `CLS`, `RUN`, `PAUSE 4E4` (a very long pause, effectively halting), or `RETURN`. This multi-call initialization pattern lets the machine code perform staged setup and then redirect control flow cleanly. ### REM-as-Binary Technique Storing machine code in REM statements is a well-established technique. The ZX81/TS1000 BASIC interpreter skips REM line content entirely, so arbitrary byte sequences — including bytes that correspond to BASIC keywords — are safe there. The disassembler/lister renders those bytes as whatever tokens they happen to match, producing the visually chaotic token soup seen in lines 0–2. The labeled headers (`CORE V3.00`, `64-COL`) at the start of each REM block are readable ASCII embedded at the beginning of each binary segment, acting as human-readable identifiers. ### Notable Techniques - **Staged USR calls:** Using four separate `IF USR HR THEN` lines rather than a single call allows the machine code to perform multi-step initialization and signal outcomes back to BASIC via its return value. - **VAL string for numeric literal:**`VAL "20000"` in line 10 is a standard memory optimization — storing a large number as a string literal rather than a floating-point constant reduces the size of the BASIC line in RAM. - **PAUSE 4E4:** Line 50 uses scientific notation `4E4` (= 40000) as the pause duration, which produces an extremely long pause — essentially a halt state if the USR call returns true, used as a fallback or error trap. - **Segmented binary payloads:** Splitting the machine code across three REM lines (core, support, graphics) mirrors a modular design in the underlying assembly, with the `64-COL` graphics module separated from the core parser. ### Key BASIC Idioms | Idiom | Location | Purpose | | --- | --- | --- | | `LET HR=VAL "20000"` | Line 10 | Memory-efficient storage of base address | | `IF USR HR THEN ...` | Lines 30–60 | Conditional dispatch based on machine code return value | | `PAUSE 4E4` | Line 50 | Long halt / error trap via scientific notation literal | | REM as binary container | Lines 0–2 | Safe storage of arbitrary machine code bytes | ### Bugs and Anomalies There are no apparent bugs in the BASIC shell. Line 60 uses `RETURN` without a corresponding `GOSUB`, which would normally cause an error — however, by the time line 60 is reached, the machine code extension has almost certainly already patched the interpreter or redirected execution, so this line may never be reached in normal operation, or the extension itself handles the `RETURN` context. This is consistent with the staged initialization pattern used by the USR calls. ## Source Code ``` 0 REM [C][O][R][E]█[V][3][.][0][0]## GOSUB # <> DIM LN F? CLEAR#OUORND[S]C IF TAN LN [M]RNDY2 GOSUB #<>5▟▝TAN CLEARACS #▚/▖ CLEARACS #LEN LN [M]RND<>5<>RNDTAN NEXT CLEARACS #: NEXT Y▘4▒ CLEARACS #LEN : PRINT Y▘# ( CLEAR▟W4 CLEAR▞"" CLEARACS ##C▝▞[K])4 5 4<>5:INKEY$ /▒)4 ▌ASN 1INKEY$ ;# GOSUB ###[:]"" GOSUB # E£RND) RUN ▙;Y2 GOSUB #Y PRINT ▘▛▝ CLEARACS ##CODE [P]▝LN [>]▝LN 4▝<>5<>RND#[8]▝ PRINT # RETURN,C▝INT / LET TAN SCROLLLN #? FASTLN LN + LPRINT TAN SCROLLLN #?#[B]:LN #INKEY$ PRINT LN #INKEY$ 7LN #INKEY$ # LET #TAN SCROLL RETURN#C▀ RETURN;""6-RNDTAN TO / PAUSE Y3[)]K▝INT (Y[Z][(]SQR INT 2LN #INKEY$ LN #INKEY$ / INPUT LN #INKEY$ /[H]LN #INKEY$ / SLOW5 6 RETURNZA4##<▘ COPY*Q GOSUB [K]TAN A ##▞▌ACS 9ACS =( IF \,,▘ 4\,,TAN LN [~~]INKEY$ ##ACS ZACS ZACS Z##STR$ LN [J]INKEY$ LET J NEW▛W#TAN LN [>]INKEY$ ##LN #INKEY$ VAL LN #INKEY$ AT LN [J]INKEY$ #TAN 2 COPY/▝2 STR$ LN [*]INKEY$ SGN GOSUB # UNPLOT ZLN CODE INKEY$ ##?( CLEARACS .*PI▌4▝▞▒▛( CLEAR#TAN Y COPY/▘[J] CLEARACS #[:]MWRNDLN [*]INKEY$ # RETURN,4▛ GOSUB # UNPLOT ZLN [*]INKEY$ ## GOSUB # UNPLOT Z6 UNPLOT ZVAL #[)]-▘K▖ GOSUB #- COPY4▝- FAST# CLEAR#Y LET [(]2▘K▖ GOSUB #2 COPY4▝2 CLEAR#X#[W]S▞##- /▝2 GOSUB #ZRND84▘96INKEY$ RND#[B]3#A 6#RNDAT VAL Y[Z][(] CLEAR#W CLEARACS ##4▌LN IF INKEY$ /▀LN 7# CLEAR#INKEY$ ▞ CLEAR###\,, CLEAR## GOSUB #ZRND CLEAR#PI GOSUB PIS▛ CLEAR## GOSUB #XRNDAT #▙##▄# CLEARO#UPIRND CLEAR[Y]#4[U]TAN LN #INKEY$ LN 4+ LOAD K LET $[M]H?▖O#[~~]+▞(## FOR 5 ACS TACS 3K▘; FOR D FOR ( POKE TAN Y COPY/▘[J]MWRND CLEARACS #[-]7LN [>]INKEY$ 5[+]▘6#RNDI 6#RND#6INKEY$ RND GOSUB # UNPLOT Z GOSUB ##RND FASTLN #INKEY$ LPRINT #6#RND6#RNDLN #INKEY$ CBLN #INKEY$ LN #INKEY$ M#RNDLN #INKEY$ C;LN #INKEY$ LN AT PI GOSUB ##RND TO LN #INKEY$ LN AT PI CLEARACS #CHR$ GOSUB ##RNDE#RND FASTEINKEY$ RND GOSUB ##RND▞▞ACS EACS .( IF GOSUB #6INKEY$ RND FOR E#RND▞▞ACS EACS .( IF GOSUB #6#RND GOSUB ##RNDLN PEEK PIU#RND##ACS +[£] PRINT ACS <[0]MRNDRNDEINKEY$ RND GOSUB ##RNDLN PEEK PIU#RND##ACS +[£]MZRND##ACS <[0]AT # CLEARACS ##C)E#RND#[P]C▞F6#RND/? CLEARACS #[-]Y[Z][(]S▞ CLEAR#WLN IF INKEY$ LPRINT F#[P]4█TAN CLEARQX▘LN #INKEY$ COS LN #INKEY$ MXRNDLN #INKEY$ COS LN [>]INKEY$ LN #INKEY$ [S]S▀#INKEY$ #LN ▜INKEY$ #INKEY$ LN ▜INKEY$ #PI GOSUB #YRND[)]W PRINT LN #INKEY$ [S]K▀#INKEY$ # GOSUB #RNDRND[(]W4▘XSGN # GOSUB #PIRND CLEAR#INKEY$ CLEAR#ZLN ▜INKEY$ LN CODE INKEY$ 6#RND CLEAR## CLEAR#RND CLEAR#ZLN ▜INKEY$ LN CODE INKEY$ 6#RND CLEAR##TAN GOSUB ##RNDE#RND CLEAR##[J]R*( UNPLOT M#RND CLEAR##[J]▌C▖R*( UNPLOT J CLEAR##▌TAN #[A] FOR ##J[A][K]# FOR TAN #VAL ▘4 ##\,,#LN ###AT ( LET [J][5]/ SLOWLN ACS #4*) 4544▘ STEP * GOSUB [K]▞4F#( UNPLOT CLEARPX4 REM TAN LN R# FAST[B] GOSUB # LPRINT C: FASTVAL STR$ LN ##Y COPYSGN AT LPRINT F/ FOR CLEAR[A]#LN ## CLEARPX4<>TAN VAL 5 )4 ;( CLEAR FOR E#RND; FASTE#RND;SGN AT TAN #VAL ▘4 ##[B] GOSUB PI#LN ###AT ( LOAD [J]###LN ACS #4*) COPYR5 TO R▘ STEP * GOSUB [S]▞47#( UNPLOT CLEARPX4 REM TAN LN R#LN [T]# FAST[B] GOSUB # LPRINT C: FASTVAL STR$ LN SQR #Y COPYSGN AT LPRINT F/ FOR CLEAR[A]#LN SQR # CLEARPX4 AND TAN LN ACS #4+5 COPYR▞4#[B]ACS -F( CLS[8]4 POKE CLEARPX4 GOTO TAN LN R##▖U#RNDVAL PRINT FASTSTR$ INKEY$ # PRINT FAST[B] GOSUB # LPRINT C+#[4]# LET #ACS * PRINT #J[A]# LET PRINT [K]#▞ COPYF/ SLOW#[4]### LET #ACS *[4] PRINT #J[A]# LET [K]#SGN LPRINT ▘4 FOR \,, FOR \,, LET AT ([Y] CLEARPX4[L]TAN LN ACS #4-5 4[B]▞4ACS 27( CLSYS[W]4 NEXT CLEARPX4 FOR TAN LN R##▖U#RND FOR VAL PRINT FASTSTR$ # PRINT FAST[B] GOSUB # LPRINT C+#[4]# LET #ACS 3 PRINT #J[A]# LET PRINT [K]#▞ COPY7/ SLOW#[4]### LET #ACS 3[4] PRINT #J[A]# LET [K]#SGN LPRINT ▘4 FOR \,, FOR \,, LET AT ([Z] CLEARPX4[L]TAN ###Y[Z][(]STR$ VAL PRINT LN IF INKEY$ LET AT SGN TAN 2 COPY/▝2 STR$ LN <>#SGN CLEAR##UINKEY$ RND5ZRND PRINT FASTLN RETURN#+C▞WLN ▖#/ RUN CLEAR#PI LPRINT LET F FASTLN RETURN#+C▞£LN ▖#/ RUN CLEAR## LPRINT URNDRND PRINT FASTLN RETURN#+C▞XLN ▖#/ RUN CLEAR#PI LPRINT LET 7LN RETURN#+COS $LN ▖#/ SAVE ##[A]##J##J[6][N]#)4 ;( LOAD TAN LN ACS #4+5 4▘ /#J#7YS[W]4 RUN CLEARPX4 GOTO TAN LN R#▖J FAST[B] GOSUB # LPRINT C: FASTVAL STR$ LN ##Y COPYSGN AT LPRINT F/ REM U#RNDJLN ## CLEARPX4 AND TAN A$( LN [J]INKEY$ FAST TO FAST5[X]#6-RNDLN 0)AT GOSUB #-RNDK▝INT 6777# RETURN▝4 PLOT 7#Y""[>]S LOAD 77#Y4[)]S SCROLL77 CLEAR#X▞ SGN TAN LN [>]INKEY$ ##Y4[)]MYRNDLN #INKEY$ SCROLLM[X]# SCROLL RETURN$4SIN ##INKEY$ VAL [J]# FOR GOSUB PI FOR AT TAN LN RAND # PRINT LN AT # LET ▞# FASTC0 RETURN,4[E] SCROLL RETURNA▞[A]C£ RETURNO▞[Q]C▞ RETURNX▞[I]4[*]LN #INKEY$ 4 CLS#M## LPRINT UYRNDINKEY$ :4VAL PRINT STR$ YS[U]4▖SGN -4STR$ ,#>7< CLEARPYATN <#( REM FOR LPRINT \,, FOR LET AT MYRND CLEARPX4 OR TAN Y /▝Y>M[4]#LN RAND #4[S]LN AT #UYRNDINKEY$ :4VAL PRINT STR$ YS[U]4▖SGN -4STR$ # PRINT ,# LET >7< CLEARPYATN <#( SCROLL FOR LPRINT \,, FOR LET AT MYRND CLEARPX4CHR$ TAN 7# RETURN0K▝INT 1 RETURNGK IF CHR$ 0TAN LN [U]##ACS 4ACS 4ACS 4ACS 4LN [U]#█#7# RETURN"#TAN SCROLL RETURN"TAB 9#7#ACS #C▝CHR$ RND) 77 FAST▞▒## FOR ;( CLEAR FOR 5 S; FOR LPRINT TAN LN STEP #7LN TAN #>4▀## ACS ACS RETURN;CG RETURN#C# RETURNAT C# RETURNTAB C#/# GOSUB # RETURNZ# NEW LIST LEN ( RETURNRNDCODE FAST#ATN STEP #/CHR$ #LEN ▒#[J]# GOSUB # RETURNZTAN ▞ COPY SCROLL RETURN#COS RETURN,4▖Y▖/" RETURN;4LEN ▖# RETURN▀ASN 9#M CLSZ/ SLOW GOSUB # RETURNZ/SGN LN #INKEY$ ## RETURN[T]ABS [▒]INKEY$ # RETURNRNDABS ▙INKEY$ GOSUB # RETURNZ TO /[)]LN #INKEY$ NEWZ GOSUB # RETURNZ[T]#K GOTO Y▒█#/ NEWLN #? CLEARACS ▘#CODE STR$ .LN SAVE <#[L]C OR ,VAL STR$ LN ##SGN AT <"/ LIST RETURN""4▖Y"/U PRINT NEW# RETURNRNDK▛ LET CLEARACS ▘LEN /G CLEARACS ▘#C\~~[J] CLEARACS ▘▚LN [/]#/▖ CLEARACS ▘LEN LET LN #\,,\~~ PRINT VAL NEW#LN [/]#AT ▀ LET RETURN█S LET CLEARACS ▘▚[J] GOSUB # RETURNZ PRINT YZ[)]>= STEP #LN 0# LET VAL M#RND[B]*[B]**- ACS >#5 2; FASTACS TLN [J]INKEY$ SGN U CLSZ RETURN▖ASN ;# RETURN▝CPI RETURN▘CEY▒ PRINT STR$ , PRINT U CLSZ[B]4\~~ CLEARACS ##C▖ LET J/▘ LET #)4 ;SGN LET TAN LN AT INKEY$ ##LN 4+ FASTLN ## LPRINT LN PLOT ;#[~~]+LN AT INKEY$ #▞ / REM <># PRINT LN SCROLL▝2"" CLEARACS ##C▝2[K]5 4[J]PEEK CLSLN #?ABS ▐▒<= CLS*K CLS-4▞▒#<= CLS3K CLS# NEW█PEEK CLSACS )( PAUSE 7+4 FOR <= CLS3K CLS14PEEK Y▖PEEK CLS LET RETURN GOSUB ASN ▛▝#STR$ RNDLN #INKEY$ Y*C▀LN #INKEY$ ) WE RETURNZ FAST GOSUB # RETURNZ GOSUB #£RND< PRINT ▞4,VAL STR$ LN [/]#SGN AT <( PRINT LET X4 GOSUB LPRINT 6 RETURNZTAN LN #INKEY$ CATN LN #INKEY$ W PRINT #Y""CHR$ ▒( UNPLOT ## LET /LEN )[(]RNDLN #INKEY$ C>STR$ LN #INKEY$ #LN #INKEY$ ▖SGN ,LEN █><( RAND TAN ▞4[J]><( UNPLOT TAN LN #INKEY$ RETURN4) ▞K▞LN NEXT ##▛#INT .▘4 \,,# RETURNS**#TAN LN #INKEY$ RETURN4K GOSUB LN #INKEY$ [B]***- #5 Y;6#RND##INKEY$ LN ## GOSUB # UNPLOT ZY[Z][(]K▝CHR$ RND##ACS WACS 1ACS WACS 1ACS WACS 1ACS GOTO 6 DIM Z#J NEW▛WM#RND) FOR Z GOSUB ##RNDY▒ PRINT #>\~~VAL #U#RND RETURN▌S)JLEN \,,[B]##: C:3ACS ;( CLS/▛#[J]ACS )*( CLS[Q]#7<#>#[Q]#FLN ###9#D##E DIM #M▛#P##S##9#D NEW#LD#R[<]#U##9#G##P0#S##9#C[W]#DTAB #EATN #R##1ABS #2 INPUT #3 SAVE #4▝#5▛#6 CLEAR#7 DIM #8 NEXT #[:]#X█#A##B OR INKEY$ C CONT PID(PIF CONT #I##L▚#P##R:#S##T##U▖#W##$##9# LPRINT ## LLIST :# SCROLL## LOAD [L]# LIST >=# PAUSE [)]# PRINT [D]# PLOT FOR INKEY$ RUN ACS RND SAVE =# RAND 8# CLS[0]INKEY$ UNPLOT LOAD INKEY$ CLEARSGN RND RETURN[Z]RND COPY[:]#9# 1 REM FAST SAVE LOAD ##▞▛ACS 5>=[;]#USR [▒]#Y▀X4 CLEAR GOSUB #▌TAB ##ACS 5>=[;]#USR [▒]#TAN <= RETURNY,X4 CLEARPEEK COPYY>X4 CLEAR#[H]##[0]#<= RETURNYDX4 CLEARPEEK COPYY4X4 CLEARF7RTAN ▘ █VAL LN ##AT ▌TAB [L]#▀ GOSUB #LN ##LN GOSUB #$LN ## CLEAR FAST LET #:[E]LN ##LN GOSUB ##LN ##LN GOSUB ##LN ## CLEAR FAST LET ##LN ##7.#[N]4 PLOT TAN LN SCROLL▝76-RNDLN #? FASTLN SAVE < LPRINT 7#[K]C: RETURN5K\~~# RETURNSCOS RETURNVCOS RETURNPCOS INT 0LN LIST # PRINT ##VAL ) ▝LN [-]#SGN LN [I]# LET E=RND RETURNS4▛5 4##/( RETURNP4▌)\,,RND/▖ GOSUB #(RND GOSUB # FOR LN [I]##▛▝<= RETURN*S CLS: £<= RETURN*K IF #LEN SCROLLACS E(RNDLN ##FLN [1]=SGN LPRINT LN ▛▝##▞5\,,RND/ GOTO 2 REM [6][4][-][C][O][L] PRINT ## LIST LIST LIST LIST LIST LIST LIST LIST WWWW LIST LIST LIST LIST #### LIST LIST LIST LIST ???? LIST LIST LIST LIST LIST LIST LIST LIST WWWWWWWWWWWW####WWWW????WWWW#[9]#[9]#[9]#[9] LIST LIST LIST LIST #[9]#[9]#[9]#[9] LIST LIST LIST LIST ##RND RNDRNDRND [4]E##[:][E] ##[▒]#▙## RND8 ▖ ##PI# # 6##CODE #PI4 ▜PIPI#PI#█ ▒▖#[8]▒ ▝▖▒▖▝ LIST ##RND#RND# #USR [Y]▜# #4I44# E# INPUT #E ▙▙##CC RND[8]RNDRND#▖▒ RND█ ▖▖▒ £# (-,,,,0(█▜[£]▜▜▜[:]█ LIST ▖\~~▝▖▒: LIST [:]▙▜▙[~~]▜█ LIST >-,2>>(█[:][▒][£]▙[~~]▜ LIST (=/0,,= LIST █[:]PIPI8C/((=E8##▜█ ▖[~~] IF [A][6][8] RND[8][6] NEW[E][A] COS [C]ATN [E][E]ATN #▜[~~][▒][▒]# TAB [6][A][E][E]LEN STEP ▜ASN [:][▒] NEW LLIST ▜EXP ▜▜▜ RND[8][~~][E][A]#£ [C][C] GOTO [E][E][E] SLOWRND### SLOW #4A6[6]#▖ [C][C]ASN ATN [E][E] ▜▜▜▜▜ LLIST [4] REM INPUT [I][E][E] ""[G][E][E][E][E] RND[8][E][E][E]# ""[G][E]ASN [£][▒]▒ RND[A][E][E][A]PI7 ""[G][E]COS [C][C] #▚#86ATN SLOW####PI [4][E][E][E][E]# [4][E][E][E]## [4][E][E][E] INPUT [E] [4][E]##[E][E] [4][E]##PIPI▖ STEP IPI#[▒] INPUT FAST5;N; FOR LPRINT U#RND NEW█U RETURNZ?▞▒VAL PRINT ,#CGS0 NEW LIST PRINT # NEW?# LET [K]#=S\~~ACS BACS BACS BACS B/ATN NEW?/ REM 10 LET HR=VAL "20000" 30 IF USR HR THEN CLS 40 IF USR HR THEN RUN 50 IF USR HR THEN PAUSE 4E4 60 IF USR HR THEN RETURN ```