EASYtype is a small word processor that prints sideways on the TS2040 printer, at any width from 20 to 128 columns. Text is entered on screen with BASIC-style cursor control, insert space (SHIFT 1) and delete space (SHIFT 9), and is word-wrapped automatically. Formatting is done with embedded commands: a function character (EXTENDED then SPACE) followed by a letter selects NORMAL (left-justified with word wrap), CENTER, TABULATION or PARAGRAPH indent, with an optional number and a closing space. A menu (EXTENDED then M) offers Print, Save, Load, Clear and Quit, and the printout can be repeated for several copies. The magazine gives the capacity as up to 1,012 lines, about 5,400 words.
Written by Eric Boisvert, EASYtype version 1.0 appeared on the first issue of Byte Power, August 1986, where it followed the magazine program and the games on the tape. The tape also carried EASYtype F, a sample text that only makes sense when printed at width 50 and the four pages laid one above the other. This download holds the EASYtype program, the EASYtype F file and, after them, the RENUM63000 code block from the same tape (see RENUM63000).
Program Analysis
Structure
The editor itself is machine code stored in the REM at line 0. Line 3 clears RAMTOP to 33148, shows the title screen and enters the code with GO TO USR 27770; line 1020 re-enters it at 27879. The menu functions that need the tape are handled in BASIC: line 1000 loads a text file, line 2000 saves and verifies one, and line 3000 asks for a file name of up to ten characters.
Text files
The text is kept from address 33149 upward. Its end address is held at 27557/27558; when saving, the BASIC writes the text length into the first two bytes of the buffer and saves it as a CODE file, and when loading it reads those two bytes back to rebuild the end pointer.
Notable Techniques
- Numbers written as
VAL "1020",VAL "3e3"andNOT PIto save memory. IF VAL " PEEK 23681 <> 0"on line 3 decides whether to start the editor or stop for copying.- The two-byte text length is stored inside the saved file itself, so no separate header data is needed.
Potential Issues
- Saving stores the length as end−33148, while loading rebuilds the end as length+33149. The end pointer therefore appears to move one byte further each time a file is saved and loaded again.
As with every Byte Power program, the copy instructions in the magazine say to POKE 23681,0 before loading; the program then stops after loading instead of starting, and RUN 9999 saves a personal backup.
Source Code
0 REM STEP SIN ▝USR STEP FLASH !<>^$FREE $$FREE $\\T RETURN TtF&db TJT P<BB<8TSTICK ```@ <bRJF<DBFREE @@dRRRRL$BBJJ40($FREE .JJJJ2<JJJJ0b4JJJJ4RRRR<H dD(((((D(R<BZVZSTICKSTICKFREE JJJJ4<BBBB$FREE BBB$FREE JJJJBFREE <BBRR4FREE FREE BBFREE BB0@@@@>FREE @FREE @@@@@FREE FREE FREE FREE <BBBB<FREE <BRbB<FREE L$JJJJ0FREE >@@@@> @@ >@ @>B$$BpBbRJFBFREE BB@BBFREE FREE HSTICKJJBD TTTxFREE HHH08DDD0HHHFREE 8TTTHSTICK PLAY PLAY PLAY STICKFREE pHz@@ zFREE $@>@@xxxSTICKx8DDD8 DRAW $$$$$$ DRAW xHTTT >D@<@@@<0@0<@@<@@<D(D\q\q\qSTICKDdTLDvBBFREE BBv<B\jRNDRND▝B<FREE FREE zrbBFREE !©▝▝6 GO SUB VAL <> LPRINT m▝bk# GO SUB VAL <> RANDOMIZE bk+ GO SUB LN <>©▝©▝▝L©▝ CONTINUE ▜ LOAD ▝▝ FORMAT SAVE __ c \aPrint,Save,Load,Clear,Quit:_Are you sure:_ _ Width:No. of Copy: PRINTING RESTORE FOR FOR LLIST s#r+<> RESTORE ATN FOR GO SUB B PAUSE RESTORE >bkLN CLS EXP SAVE STOP ATN RESTORE FOR B0 CLS MERGE !ON ERR\\>kw!STICK\\>kw!k\\>w!\rk STEP Kl STEP ON ERRk! SPECTRUM k▝ STEP Kl!RNDk GO SUB [ SPECTRUM k STEP Kl!PIk STEP Kl!POINT k STEP Kl!bh: SPECTRUM kw!ATTR k GO SUB [ SPECTRUM k STEP ll!ch:ATTR kw STEP [h!\b\\>w:PIkG:POINT kO STEP SIN k STEP FLASH ! STEP \h! STEP DIM 0 STEP FOR !TAB k:\\w#6:PIkG:POINT kO STEP SIN k STEP FLASH ! STEP \h!!\b\\>w!CODE k GO SUB [PIk STEP \\l GO SUB KPOINT k STEP Kl GO SUB K SPECTRUM k STEP Kl*TAB k GO SUB R IF nm*TAB kATN GO SUB R PAUSE nmNOT o*TAB kATN GO SUB RCHR$ BEEP mNOT ;p*TAB kATN GO SUB RCHR$ ▄mNOT VAL$ p*TAB kATN GO SUB RCHR$ \lmNOT Wo*TAB kATN GO SUB RCHR$ SCREEN$ mNOT ©o*TAB kATN GO SUB RCHR$ EXP mNOT Rq*TAB kATN GO SUB RCHR$ >=mNOT STEP p*TAB kATN GO SUB RCHR$ BEEP mNOT $q*TAB kATN GO SUB RCHR$ NEW mNOT zq*TAB kATN GO SUB RCHR$ PRINT mNOT CONTINUE q*TAB kATN GO SUB R LINE nNOT REM l!\b\\>w:PIkG:POINT kO STEP SIN k STEP FLASH ! STEP \h! STEP DIM 0 STEP FOR !TAB k:\\w#6:PIkG:POINT kO STEP SIN k STEP FLASH ! STEP \h!!\b\\>w*TAB kATN GO SUB RCHR$ in!TAB k STEP Kl*TAB kATN GO SUB RCHR$ ▝n!TAB k STEP Kl*TAB kATN GO SUB RCHR$ \jn!TAB k STEP Kl*TAB kATN GO SUB RCHR$ LEN n!TAB k STEP Kl*TAB kATN GO SUB RCHR$ <>n!TAB k STEP Kl*TAB kATN GO SUB RCHR$ LLIST n!TAB k STEP Kl*TAB kATN GO SUB RCHR$ RANDOMIZE n!TAB k STEP Kl*TAB kATN GO SUB RCHR$ oNOT VrNOT 7m*CODE k:TAB kw! FLASH k:TAB kw:PIkG:POINT kO STEP SIN k STEP FLASH ! STEP \h!*TAB kATN GO SUB R LINE Wo*CODE k GO SUB [RNDk GO SUB R IF Wo!RNDk GO SUB [CODE k STEP Kl!POINT k GO SUB [POINT k STEP Kl*POINT kATN GO SUB R LINE soNOT REM l!POINT k STEP Kl!PIk GO SUB [PIk STEP Kl*PIkATN GO SUB RCHR$ \loNOT \ooNOT REM l* SPECTRUM k GO TO ATN GO SUB RCHR$ EXP o!PIk STEP KlNOT REM l! SPECTRUM k GO SUB [ SPECTRUM kUSR STEP Kl!PIk STEP KlNOT TO l* SPECTRUM k▝ATN GO SUB RCHR$ LIST o!PIk STEP KlNOT REM l! SPECTRUM k GO SUB [ SPECTRUM kUSR STEP Ul!PIk STEP Kl*\rkATN GO SUB RCHR$ 8p!\rk STEP Kl:PIkG:POINT kO STEP SIN k STEP FLASH ! STEP \h!NOT TO l!POINT k GO SUB [POINT k STEP Ul*POINT kATN GO SUB R PAUSE STICKp!POINT k STEP Kl!PIk GO SUB [PIk STEP Ul*PIkATN GO SUB R PAUSE STICKpNOT MERGE o*\rkATN GO SUB RCHR$ ATTR p:PIkG:POINT kO STEP SIN k STEP FLASH ! STEP \h!!\rk STEP KlNOT REM l!PIk GO SUB [PIk STEP Ul*PIkATN GO SUB R PAUSE LINE pNOT MERGE oNOT REM l*CODE k GO SUB [RNDk GO SUB R IF CONTINUE p!RNDk GO SUB [CODE k STEP Kl!LEN k GO SUB [CODE k FOR GO SUB \q FOR 6*LEN kATN GO SUB R LINE qNOT so*CODE k>\aw:PIkG:POINT kO STEP SIN k STEP FLASH ! STEP \h!NOT so!\rk STEP Kl*CODE k▝ATN GO SUB R LINE Oq!COS k GO SUB [CODE k STEP Ul*COS k> wNOT ;p!ATTR k:j\\w#6*ATTR kATN GO SUB RCHR$ qq!j\\>wNOT REM l!j\\>wNOT REM l*CODE k GO SUB [RNDk GO SUB R IF ▛qNOT REM l!ASN k GO SUB [CODE k STEP ll!▟k:CODE kw!▙k:ASN kw!ASN k GO SUB [RNDk GO SUB KCODE k STEP Ul STEP Kl!▌k:ASN kw!ASN k GO SUB [ASN k STEP ll!▛k:ASN kw STEP ▞k!RNDk GO SUB [RNDk STEP UlNOT BORDER l*CODE k GO SUB [RNDk GO SUB R IF RANDOMIZE qNOT REM l!RNDk GO SUB [RNDk STEP Kl!ASN k GO SUB [RNDk STEP ll!\jk:RNDkw!\kk:ASN kw!ASN k GO SUB [RNDk GO SUB KCODE k STEP Ul!\gk:ASN kw!ASN k GO SUB [ASN k STEP ll!\hk:ASN kw STEP \fk*CODE k> wNOT BORDER l STEP SIN k STEP FLASH ! STEP \h! STEP DIM 0 STEP FOR !TAB k:\\w#6 STEP ,s*TAB kATN GO SUB RCHR$ ▙rNOT `t*TAB kATN GO SUB RCHR$ AT r STEP s*TAB kATN GO SUB RCHR$ AT rNOT \il*TAB kATN GO SUB RCHR$ LINE r STEP s*TAB kATN GO SUB RCHR$ LINE r STEP *TAB kATN GO SUB RCHR$ READ r!COS k FORMAT STEP Kl<>*TAB kATN GO SUB RCHR$ COPY r STEP ON ERRk!COS k CONTINUE STEP Kl<>NOT REM l STEP SIN k\h! STEP DIM 0 STEP FOR !TAB k:\\w#6 STEP ,s<> STEP SIN l STEP FLASH ! STEP \h!<>!ATN k STEP KlkO STEP SIN l STEP FLASH ! STEP \h! STEP DIM 0 STEP FOR !TAB k:\\w#6*TAB kATN GO SUB RCHR$ ▀sNOT t*TAB kATN GO SUB RCHR$ \as<>!TAB k GO SUB [TAB k0 STEP Ul*TAB k GO SUB R IF TAB sNOT Ls*TAB kATN GO SUB R PAUSE SGN sNOT Ls*TAB kATN GO SUB RCHR$ BEEP s*ATN kATN GO SUB RCHR$ BEEP sNOT LskO STEP SIN GO SUB KTAB k STEP DIM 0 STEP \r1 STEP \h!!ATN k GO SUB [ATN k STEP \\l GO SUB KTAB k STEP Kl!COS k GO SUB [COS k STEP Kl*ATN k GO SUB R IF t<>NOT Ls*ATN kATN GO SUB RCHR$ .tNOT LskO STEP SIN l STEP FLASH ! STEP \h!!ATN k GO SUB [ATN k STEP ll!COS k GO SUB [COS k STEP UlNOT Ls!COS k STEP Kl!EXP k STEP Kl STEP SIN l STEP FLASH ! STEP \h! STEP @s*ATN k GO SUB R IF \rt STEP ,sNOT `t*ATN kATN GO SUB R LINE INT t!EXP k GO SUB [ATN k STEP Ul!SQR k STEP Kl STEP SIN l\h!!COS k STEP Kl STEP @s STEP ,s*ATN kATN GO SUB R LINE u!SQR k GO SUB [ATN k STEP Kl!\\>w STEP SIN l STEP FLASH ! STEP \h!!ABS k STEP Kl!IN k▝ STEP Kl!STR$ k GO SUB [EXP k STEP ll!NOT k GO SUB [EXP k STEP ll! OR k STEP Kl!<=k STEP Kl!COS k LOAD STEP Kl*COS k> w*COS k COPY ATN GO SUB R LINE \fu!COS k GO SUB [COS k STEP KlNOT su!<>k GO SUB [IN k FOR GO SUB \q FOR 6!IN k GO SUB [IN k STEP Kl!ATTR k GO SUB [IN k FOR GO SUB \q FOR 6*<>kATN GO SUB RCHR$ THEN uNOT ▗x*<>kATN GO SUB R LINE PAPER uNOT Aw*ATTR k GO SUB R IF POKE u!ATTR k GO SUB [ATTR k STEP Ul*ABS kATN GO SUB RCHR$ vNOT sv*ATTR kATN GO SUB R LINE NOT ;v STEP BRIGHT v*ATN kATN GO SUB R LINE .v!STR$ k GO SUB [ATN k STEP Kl!<=k GO SUB [STR$ k STEP Ul*ATTR kATN GO SUB R LINE JvNOT sv STEP BRIGHT v*ATN kATN GO SUB R LINE fv!NOT k GO SUB [ATN k STEP Kl!<=k GO SUB [NOT k STEP Ul*ATTR kATN GO SUB RCHR$ ▛v!ABS k STEP Kl*ATTR kATN GO SUB RCHR$ SPECTRUM v!ABS k STEP Kl!<>k GO SUB [IN k FOR GO SUB \q FOR 6*<>kATN GO SUB R LINE TO v!IN k GO SUB [IN k STEP KlNOT SPECTRUM v!IN k GO SUB [IN k STEP KlNOT \fu!ATN k STEP Kl!IN k GO SUB [IN k STEP Kl!COS k GO SUB [IN k FOR GO SUB \q FOR 6!COS k GO SUB [COS k0 STEP Ul*COS kATN GO SUB R PAUSE w<>*COS k GO SUB R IF *w<>!ATN k GO SUB [ATN k STEP \\l GO SUB KCOS k STEP KlNOT CONTINUE v!TAB k:\\w#6*TAB kATN GO SUB RCHR$ ZwNOT ON ERRON ERR!CODE k GO SUB [ OR k▗ STEP \\l GO SUB K<=k STEP Kl© LOAD STEP Kl*CODE k:<>kw*<=k GO SUB [EXP kATN GO SUB R PAUSE \iw!<=k GO SUB [<=k STEP KlNOT \fu*ATTR kATN GO SUB RCHR$ PIwNOT ▗x! THEN k GO SUB [CODE k STEP Kl!LEN k GO SUB [ THEN k FOR GO SUB \q FOR 6*LEN kATN GO SUB R LINE x*LEN kATN GO SUB R LINE x*LEN kATN GO SUB R LINE x*LEN kATN GO SUB R LINE x*LEN kATN GO SUB R LINE x! THEN k GO SUB [ THEN k STEP Ul!IN k GO SUB [IN k STEP UlNOT TAN w* THEN k GO SUB [CODE kATN GO SUB R LINE =x! THEN k GO SUB [ THEN k STEP Kl* THEN k> wNOT x*ABS kATN GO SUB RCHR$ Lx STEP ABS x!<=k STEP Kl! OR k GO SUB [ OR k STEP Kl* OR kATN GO SUB R LINE ▝x*IN k GO SUB [RNDkATN GO SUB R PAUSE ▝xNOT \fuNOT PEEK y!<>k GO SUB [IN k FOR GO SUB \q FOR 6*<>kATN GO SUB RCHR$ INT x!IN k GO SUB [IN k STEP Kl*IN k GO SUB [RNDkATN GO SUB R PAUSE INT xNOT ▗xNOT =x! STEP k STEP Kl!ASN k GO SUB [ OR k▗ STEP \\lFREE LOAD STEP Kl GO SUB KEXP k STEP Kl!<>k GO SUB [ASN k STEP Kl!COS k GO SUB [ASN k GO SUB KEXP k STEP Ul STEP Kl!ATTR k GO SUB [<>k FOR GO SUB \q FOR 6*ATTR kATN GO SUB RCHR$ Hy! STEP k GO SUB [ STEP k STEP Kl*<>k GO SUB [COS k GO SUB R IF Hy!<>k GO SUB [<>k STEP UlNOT y*<>k GO SUB [COS kATN GO SUB RCHR$ Vy<>! STEP k GO SUB [ STEP k STEP ll!\jk:ASN kw!ASN k GO SUB [ASN k STEP ll!\kk:ASN kw!ASN k GO SUB [EXP k STEP Ul!\gk:ASN kw!\hk>w* STEP kATN GO SUB RCHR$ RNDy<> STEP \fk*COS k> w! STEP k GO SUB [ STEP k STEP UlNOT \iy!COS k LOAD STEP Kl!ATTR k GO SUB [COS k FOR GO SUB \q FOR 6*ATTR kATN GO SUB R LINE NEW yNOT z*COS k COPY ATN GO SUB R LINE z!COS k GO SUB [COS k STEP KlNOT LINE yNOT NON ERR! OR k STEP Kl!TAB k:\\w#6*TAB kATN GO SUB RCHR$ *zNOT ON ERRON ERR!<=k STEP Kl!LEN k GO SUB [<=k▗ STEP \\l GO SUB K OR k STEP Kl© LOAD STEP Kl!LEN k GO SUB [LEN k FOR GO SUB \q FOR 6!LEN k GO SUB [LEN k STEP \\lkg STEP Kl! CAT k STEP Kl! MOVE k GO SUB [LEN k GO SUB K CAT k STEP Kl! MOVE k GO SUB [ MOVE k FOR GO SUB \q FOR 6!ATTR k GO SUB [ CAT k STEP \\l!COS k[ GO SUB K<=k STEP Ul GO SUB KATTR k STEP Kl*COS k: MOVE kw! CAT k GO SUB [ CAT k STEP Kl* CAT kATN GO SUB R LINE FLASH zNOT STICKz!<=k GO SUB [<=k STEP Kl*<=kATN GO SUB R LINE RUN zNOT 6z STEP #* OR k GO SUB [EXP kATN GO SUB R LINE OR k GO SUB [ OR k STEP KlNOT STEP #! OR k[ STEP Kl* OR k>▖w! OR k GO SUB [ OR k STEP Kl* OR k[ATN GO SUB R PAUSE HON ERRNOT &ON ERR STEP # STEP #*IN k GO SUB [RNDkATN GO SUB R PAUSE ^ON ERRNOT Ou!SQR k GO SUB [SQR k STEP Ul*SQR k GO SUB R IF ON ERRON ERRNOT u STEP ,sNOT REM l
1 REM Written by E BOISVERT
2 GO TO VAL "1020"
3 CLEAR VAL "33148": PRINT AT VAL "8",VAL "5";"EASYtype, version 1.0"''TAB VAL "7";"© 1986 BYTE POWER"''TAB VAL "3";"Written by Eric Boisvert": IF VAL "PEEK 23681<>0" THEN PAUSE VAL "180": CLS : PRINT AT BIN ,BIN ;: GO TO USR VAL "27770"
4 PRINT AT 18,0;: LIST VAL "9999": STOP
1000 REM LOAD TEXT FILE
1005 GO SUB VAL "3e3"
1010 LOAD n$CODE VAL "33149": LET lc=VAL "PEEK 33149+PEEK 33150*256+33149": POKE VAL "27557",VAL "lc-256*INT (lc/256)": POKE VAL "27558",INT (lc/VAL "256")
1020 POKE VAL "23659",VAL "1": PRINT AT NOT PI,NOT PI: GO TO VAL "USR 27879"
2000 REM SAVE TEXT FILE
2005 GO SUB VAL "3e3": IF n$="" THEN GO TO VAL "2e3"
2010 LET a=VAL "PEEK 27557+256*PEEK 27558-33148": POKE VAL "33149",VAL "a-256*INT (a/256)": POKE VAL "33150",INT (a/VAL "256"): SAVE n$CODE VAL "33149",a
2020 CLS : PRINT "VERIFY:";n$
2030 VERIFY n$CODE : GO TO VAL "1020"
3000 POKE VAL "23659",VAL "2": CLS : INPUT "NAME:"; LINE n$
3010 IF LEN n$>VAL "10" THEN GO TO VAL "3e3"
3020 RETURN
9999 SAVE "EASYtype" LINE VAL "3": VERIFY "EASYtype"Note: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.
