--- title: "ZXAD MCoder Stopper" id: 56752 type: "computer_media" slug: "zxad-mcoder-stopper" url: "http://localhost/computer_media/zxad-mcoder-stopper/" markdown_url: "http://localhost/computer_media/zxad-mcoder-stopper.md" published_at: "2024-09-22T23:31:59+00:00" modified_at: "2026-04-04T20:17:47+00:00" author: "David Anderson" featured_image: url: "http://localhost/wp-content/uploads/2024/09/ZXAD.jpeg" excerpt: "Three utilities in one tape image: a two-pass Z80 assembler with debugger, a BASIC compiler, and a tool to strip autorun from any loaded program." 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: "InterComputer" slug: "intercomputer" taxonomy: "post_tag" url: "http://localhost/tag/intercomputer/" - 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/" genre: - name: "Programming" slug: "programming" taxonomy: "genre" url: "http://localhost/type/programming/" media_type: "Program" download_url: "https://archive.org/download/timex-sinclair-software-archive/ZXAD%20MCoder%20Stopper%20%281983%29%28Intercomputer%29%28TS1000%29%28US%29%28Program%29.zip" mediadate: "1983" producer_company: - id: 10957 title: "Intercomputer, Inc." type: "company" url: "http://localhost/company/intercomputer/" images: - url: "http://localhost/wp-content/uploads/2024/09/ZXAD.jpeg" - url: "http://localhost/wp-content/uploads/2024/09/MCoder-1.jpeg" - url: "http://localhost/wp-content/uploads/2024/09/Stopr.jpeg" - url: "http://localhost/wp-content/uploads/2024/09/Cass1.jpg" - url: "http://localhost/wp-content/uploads/2024/09/Cass2.jpg" - url: "http://localhost/wp-content/uploads/2024/09/Cover-1.jpg" - url: "http://localhost/wp-content/uploads/2024/09/Stopr-scaled.jpg" related_products: - id: 11820 title: "ZXAD Assembler/Debugger" type: "product" url: "http://localhost/product/assembler-debugger-zxad/" - id: 13244 title: "MCoder" type: "product" url: "http://localhost/product/mcoder/" - id: 14099 title: "Stopper" type: "product" url: "http://localhost/product/stopper/" media_type_tags: "Programming" --- This tape image bundles three separate utilities: ZXAD (an assembler/debugger), MCoder (a BASIC compiler), and Stopper (a tool to disable autorun in programs). The ZXAD assembler operates as a two-pass assembler driven by machine code routines called via USR at fixed addresses (e.g., USR 19083, USR 18417, USR 19389), supporting error codes for duplicate symbols, symbol table overflow, bad opcodes, bad symbols, and JR-out-of-range conditions. The Stopper utility copies ten bytes from address 16514 to 32389 using POKE and PEEK in a FOR loop, then instructs the user to load a target program via RAND USR 32389, after which the program can be listed and saved without autorun executing. The REM line at line 1 of the ZXAD program contains the complete Z80 assembler machine code as embedded data, including opcode tables covering the full Z80 instruction set (LD, PUSH, POP, ADD, ADC, SUB, SBC, AND, OR, XOR, CP, INC, DEC, JP, JR, CALL, RET, CB-prefix and ED-prefix instructions). The renumber function (option R) uses six POKE operations to parameters at addresses starting at 20894 before invoking USR 20902. *** ## Program Analysis ### Overall Structure The tape image contains three independent programs stored sequentially. Each is self-contained with its own line numbering and purpose: 1. **ZXAD** — A two-pass Z80 assembler and debugger (lines 1–107), with the assembler engine embedded as machine code in the REM at line 1. 2. **MCoder** — A BASIC compiler stub (lines 0–230 in a second program block), which calls a machine code compiler at address 18821 and displays a splash screen. 3. **Stopper** — A short utility (lines 10–70) that relocates a small machine code patch to high memory so that autorun can be suppressed in subsequently loaded programs. ### ZXAD: Machine Code Embedding The entire Z80 assembler engine is stored as binary data within the REM statement at line 1. This is a standard technique for embedding machine code in BASIC programs without a separate code block. The REM data includes a comprehensive Z80 opcode table covering all standard, CB-prefix (bit manipulation), ED-prefix (block/IO), and IX/IY instructions. Entry points are invoked from BASIC using `USR` at hard-coded addresses. ### ZXAD: Key USR Entry Points | Address | Function | | --- | --- | | `19083` | Pass 1 initialization | | `19090` | Pass 1 line processing loop | | `18417` | Pass 2 initialization | | `19389` | Pass 2 line processing loop | | `20902` | Renumber source | | `16518` | Debugger: disassemble at address | | `16543` | Debugger: advance to next instruction | ### ZXAD: Program Flow The main menu (line 12) offers five options: Assemble (`A`), Assemble and List (`L`), Assemble and Print (`P`), Renumber Source (`R`), Debug (`D`), and Quit (`Q`). Assembly runs as a two-pass process: Pass 1 (lines 23–33) resolves symbol definitions, and Pass 2 (lines 34–48) generates object code. The variable `X` receives the return code from each `USR` call; a return of 6 signals end-of-source, while 2–5 and 9 are error codes dispatched through the subroutine at line 75. ### ZXAD: Error Handling The subroutine at line 75 maps numeric error codes returned by the machine code to human-readable strings stored in `P$`: - `X=2` — DUPLICATE SYMBOL - `X=3` — SYMBOL TABLE OVERFLOW - `X=4` — BAD OP-CODE - `X=5` — BAD SYMBOL - `X=9` — JR TOO FAR Errors are routed to screen or printer depending on whether `M$="P"`, a pattern repeated throughout the BASIC layer for all output operations. ### ZXAD: Line Number Passing Convention The subroutine at lines 83–85 stores the source start line number `N` into two bytes at addresses 18415 and 18416 using a high-byte/low-byte split: `POKE 18416,INT (N/256)` and `POKE 18415,N-256*INT (N/256)`. The same split idiom appears in the renumber routine (lines 58–59) which writes four parameters (start line, end line, new start, increment) into consecutive byte pairs beginning at address 20894. ### ZXAD: Debugger The debugger (lines 64–74) uses a simple interactive loop. The user enters an address string into `A$`; `USR 16518` disassembles the instruction at that address and returns a status, while `USR 16543` advances the pointer. Entering `Q` as the first character exits back to the main menu. The optional print mode is controlled by the flag variable `PF` (line 97), toggled via `P` and `N` commands within the debugger input loop (lines 101–102). ### ZXAD: Output Line Format The listing subroutine at line 86 reads the assembled address from `PEEK 18597+256*PEEK 18598` into `T` and computes the source column width as `69-PEEK 20867` into `U`. It then prints address, byte values (`B$`, conditionally masked with `AND (X-6)` to suppress output when `X=6`), and the source line trimmed to column `U`. ### MCoder: Compiler Stub The MCoder program (second block) is minimal BASIC scaffolding around a machine code compiler. Line 10 POKEs value 118 (the `HALT` opcode, used here as a data sentinel) to address 16389, then line 20 calls `USR 18821` to invoke the compiler. A splash screen is displayed after the compiler returns, crediting PSS (Personal Software Services) under whose licence the product was sold. Lines 200–230 implement a simple delay loop of 80 iterations followed by `CLS`. The comment in the REM at line 3 explicitly records the compiler’s load address: `ZXGT=17389 PROG=18823`, indicating the ZXGT engine sits at 17389 and the compiled program area begins at 18823. ### Stopper: Autorun Disabler Stopper copies 10 bytes from addresses 16514–16523 to 32389–32398 using a `FOR`/`PEEK`/`POKE` loop (lines 15–30). The target address 32389 is in high RAM. Once relocated, the user types `RAND USR 32389` before loading the target program; this intercepts autorun and returns control with report code C/0, allowing the program to be listed and re-saved. Line 55 halts execution and line 60 saves the utility. ### Notable Techniques and Idioms - Use of `B$ AND (X-6)` as a conditional string: when `X=6`, the expression evaluates to the null string, suppressing byte output at end-of-source. - High-byte/low-byte splitting for 16-bit parameter passing via `POKE` pairs, used consistently for line numbers and renumber parameters. - All machine code entry points are called with `LET X=USR address` so the return value is immediately available for branching. - The `SAVE` statement at line 104 of ZXAD saves the entire program including its machine code REM, making the file self-contained. - The REM line in ZXAD encodes Z80 mnemonics as tokenized BASIC keywords interspersed with literal bytes — a consequence of the assembler being developed on the target machine and stored as a REM blob. ### Potential Anomalies - Line 105 (`IF USR 21328=0 THEN GOTO 2`) appears after the `SAVE` at line 104; this suggests a post-save checksum verification routine at address 21328, though no corresponding error path beyond line 106 exists other than `STOP`. - The MCoder block uses line numbers starting at 0, which is unusual and may cause ordering issues in some BASIC editors, but is syntactically valid. ## Source Code ``` 1 REM XX## GOSUB #(RND)▞ ; FAST)▐RND▞▝LN UNPLOT RND7>.( SAVE # OR RND GOSUB #(RND)▞ ; FAST# RETURN.C* RETURN C3 RETURN0SY RETURNGKULN UNPLOT RND GOSUB #▜RND## OR RND GOSUB #▜RND" GOSUB #▜RND# OR RND GOSUB #▜RND▀ GOSUB #▜RND)▐RND▞▝ LPRINT LN :INKEY$ Y #7▞▘ GOSUB #▜RND# SCROLLINKEY$ ▘▘ TAN RETURNXCP# CLS# LPRINT TAN #CHR$ 0ACS BACS BACS BACS B NEW LIST 7▚CHR$ 0TAN ,ACS ZACS ZACS ZACS ZLEN 0#7, NEW?LEN 0#7.( DIM TAN LN ["]INKEY$ GOSUB #▜RND FAST▞▀)AINKEY$ #>7<( IF ▞▀ LPRINT )DINKEY$ ,#7<( IF # OR RND 7C18 7BDC 1122 3344 5566 7788 028F 4000 5678 9ABC 1234 1EEA /# STR$ #7# OR FASTSTR$ VAL CLEAR FAST<> FAST OR FASTSTR$ VAL PRINT 50 T FASTFF#7##S# SGN GOSUB #▜RND)▐RNDVAL ▞▝LN :INKEY$ AT Y #7( FOR E[,,]INKEY$ FAST)AINKEY$ ▞▀,#7<( IF LN E~~▘X )#INKEY$ LN #" LPRINT LET AT SGN STOPTAN LN :INKEY$ Y #7 GOSUB #▜RND,## LOAD RND~~B C ▘D ▝E ▀H ▖L ▌(HL) ▞A ▛(IX+ <>(IY+ CLEAR▛B C ▘D ▝E ▀H ▖L ▌A ▛▘A ▘HL ▘IX ▘IY ▀AF KBC DE (▀SP KBC DE (▀0 1 (2 /▝(BC) (DE) (▝I R ▒▘AF" ▘(HL) ▒0 8 ▒16 (24 /32 440 C48 K56 S▘(C) ▛B C ▒D (E /H 4L CA S▘(IX) ▘(IY) JP[.]<> DIM JP[0] CLEAR DIM LDB▗RNDINB[;] GOSUB RNDINC[;] GOSUB #IND[;] GOSUB #INE[;] GOSUB #INH[;] GOSUB #INL[;] GOSUB #INA[;] GOSUB #INI["] GOSUB [6]INIR["] GOSUB [M]IND["] GOSUB [E]INDR["] GOSUB [U]OUT(C)[,] GOSUB INKEY$ OUT([6]PEEK OUTI["] GOSUB [7]OTIR["] GOSUB [N]OUTD["] GOSUB [F]OTDR["] GOSUB [V]RST[/]SIN CALLNC[,,]USR CALLZ[,,]ATN INA[5]<=LDC▗#LDD▗#LDE▗#LDH▗#LDL▗#LD(HL)[£]#LDA▗#LDB[▒]▞LDC[▒]:LDD[▒]-LDE[▒]2LDH[▒]ALDL[▒]ILD(HL)[▒]QLDA[=]~~LD(IX+[£]<>#LD(IY+[£] CLEAR#LD(IX+[▒]<>QLD(IY+[▒] CLEARQLD(BC)[$]▝LD(DE)[$]>LD([$]MLDI[$] GOSUB #LDR[$] GOSUB #LDA[+] GOSUB #LDA[▒]YLDA[~~]ULDBC[,,]▘LDDE[,,])LDHL[,,]5LDSP[:] RAND LDIX[,,]<>5LDIY[,,] CLEAR5LDBC[~~] GOSUB #LDDE[~~] GOSUB #LDHL[~~]ELDSP[?]<> RAND LDIX[~~]<>ELDIY[~~] CLEARELDSP[(] CLEAR RAND LDSP[,,]LLDSP[~~] GOSUB #LD([>] GOSUB #LD([:]6LD([?]<>6LD([(] CLEAR6PUSH[)]VAL PUSH[:] FASTPUSH[?]<> FASTPUSH[(] CLEAR FASTPOP[)]AT POP[:] LPRINT POP[?]<> LPRINT POP[(] CLEAR LPRINT EXDE[:] FOR EXAF[-]▒EXX["] OR EX(SP)[:] STOPEX(SP)[?]<> STOPEX(SP)[(] CLEAR STOPLDI["] GOSUB [4]LDIR["] GOSUB [K]LDD["] GOSUB [C]LDDR["] GOSUB [S]CPI["] GOSUB [5]CPIR["] GOSUB [L]CPD["] GOSUB [D]CPDR["] GOSUB [T]ADDA▗█ADDA[▒]LEN ADCA▗[▒]ADCA[▒]EXP SUB▗[(]SUB[▒]CHR$ SBCA▗[/]SBCA[▒] THENAND▗[4]AND[▒] NEWOR▗[K]OR[▒] PLOT XOR▗[C]XOR[▒] INPUT CP▗[S]CP[▒] RETURNINC[3]▖DEC[3]▌DAA["]BCPL["]JNEG["] GOSUB #CCF["]ZSCF["]RNOP["] HALT["]#DI["] NEXT EI["] CLSIM[<] GOSUB #ADDHL[:]DADDHL[>],,ADDIX[>]<>,,ADDIX[?]<>DADDIY[>] CLEAR,,ADDIY[(] CLEARDADCHL[:] GOSUB #ADCHL[>] GOSUB #SBCHL[:] GOSUB #SBCHL[>] GOSUB PIINC[:]7INC[>]▀INC[?]<>7INC[(] CLEAR7DEC[:]FDEC[>]"DEC[?]<>FDEC[(] CLEARFRLCA["]▛RRCA["]?RLA["]*RRA["]3RLD["] GOSUB #RRD["] GOSUB #RLC▗ACS RRC▗ACS ▒RL▗ACS (RR▗ACS /SLA▗ACS 4SRA▗ACS CSRL▗ACS SBIT0▗ACS RNDBIT1▗ACS #BIT2▗ACS #BIT3▗ACS #BIT4▗ACS #BIT5▗ACS #BIT6▗ACS #BIT7▗ACS #RES0▗ACS █RES1▗ACS [▒]RES2▗ACS [(]RES3▗ACS [/]RES4▗ACS [4]RES5▗ACS [C]RES6▗ACS [K]RES7▗ACS [S]SET0▗ACS ""SET1▗ACS COS SET2▗ACS SQR SET3▗ACS **SET4▗ACS STEP SET5▗ACS CONT SET6▗ACS LIST SET7▗ACS SAVE JP[*] DIM JPC[,,] AND JPNC[,,]ABS JPZ[,,]ASN JPNZ[,,]TAB JPPE[,,] REM JPPO[,,] LLIST JPM[,,] IF JPP[,,] PAUSE JP[,,]#JR[2]/JRC[2]SJRNC[2]KJRZ[2]CJRNZ[2]4CALL[,,]LN CALLC[,,]>=CALLNZ[,,]CODE CALLPE[,,] GOTO CALLPO[,,] SLOWCALLM[,,] UNPLOT CALLP[,,] POKE DJNZ[2](RETI["] GOSUB #RETN["] GOSUB #RET[4]""RET["]TAN ORG▟ DEFB▙ DEFW▄ DEFS▜ DEFC▐ EQU[1] END▚ REL[7] COPYVAL LN [9]## POKE #XX NEW##0# FAST#7### GOSUB # LOAD #RZ GOSUB #K" LPRINT 77#7#;7# POKE # LPRINT )▌ ;AT 6 LOAD #TAN XXX[/]#$#Y# GOSUB #2#Y LN ## RETURN CE FAST▞▞,#[:]# [Y]###<( POKE Y LPRINT )▞ ;TAN LPRINT )▒ ; FAST GOSUB #0#RZ GOSUB #K▞ LPRINT /LN Y▘TAN LPRINT Y▝TAN GOSUB #0RND)RND ; GOSUB #2#5 T GOSUB # GOSUB #2##▒# Y F##[U]4 SAVE #[V]4 POKE TAN OPLN [V]#TAN RETURN0 AND [▒]# RETURNRNDABS [▒]##R# RETURN;ASN [4]##[4]#XX>▝#F RETURN REM 4 IF FF#F# GOSUB #[9]#)▌ ; FAST GOSUB #(RND)▞ ;SGN ▞#, RETURN#C▌#<7( PLOT FOR LN ▜#; GOSUB # LOAD #TAN ▘TAN 7/ )END LY M[W]## RETURN C▛ RETURN#4▞Y▘TAN 7/ LET )[U]#▞▌# RETURN C" RETURN#CV>7<( PAUSE /O# RETURN C▞ RETURN#C./▀7/ PAUSE ###### RETURN C, RETURN,C▛ RETURN#C>7/ INPUT LPRINT ▞(# RETURN,C,,>7<( PLOT /▝ LPRINT FY >TAN XXXXX# ▖Q▘ REM FASTAT 5CHR$ PI)[U]## RETURN COPYC#, RETURN CN[Y]4▖7C PAUSE RETURNACS C INPUT /LN .,< RETURN(C" RETURN+C▛/ OR # RETURN█SUSR Y▘6(#TAN Y TAN XVAL LPRINT 7# RETURN$4£7LN U##7LN UNPLOT RND#/)LN [~~]# RETURN 4$LN 6# RETURN 4▞#7#Y TAN Y▘TAN XXXXXXXXVAL LPRINT 7,#< FAST,[Y]4£ RETURN C.< RETURN+C-7/ LIST # RETURN#C/ LPRINT ,< RETURN 4 IF < ( TO Y TAN <,62# LPRINT #Y▘TAN # TO #X AND #F FASTAT GOSUB #(#### # F62# GOSUB #0# GOSUB #▜RND# RETURN<>S▖#A# ,#<7 RETURN CLEARC SAVE RETURN GOSUB C POKE RETURN<>C LIST RETURNACS 4. FAST E2## RETURN+4H7 #U# LET LPRINT #7 PRINT AT /SGN F▟#7 FAST GOSUB #2## RETURN+4>7LN [C]# LPRINT #7 GOSUB #0#TAN LPRINT TAN LPRINT /[M]TAN Y ###▘ REM LN .#LN LET #TAN GOSUB # LOAD ## FAST RETURN C##[.]# LN [~~]# RETURN C▒▘▌ #[C]# LN 6# RETURN 4▒▘▝ #[C]# RETURN▘C▒▘▀ #[C]# SGN STR$ ▞▞,LN ▖#( IF U▜RND#7U▐RND# LPRINT FAST# RETURN C▀7/ SAVE LN FAST# RETURN C▒▘▖ #[C]# LN ## RETURN 4▒▘▖ #[C]# ##[K]# VAL LPRINT 7LN [C]# RETURN C▌▘▌ /E##B# RETURN▙TAB RAND #LN ## /# RETURN▄4▒LN ## /# RETURN▜4= LN [9]# RETURN C▌▘▌ /# GOSUB #▜RND,,/# RETURN▐4>LN SCROLL##E▜RND<,[T]C▖#7( RUN /U RETURN▚4▝/# FAST# DIM #RND RETURN[,,]4▀ /▖ RETURN[~~]4▖77 ., RETURN+C▌ RETURN(4▝77SGN <,7 RETURN CLEARC RAND RETURN<>C PRINT RETURN GOSUB C LET RETURNACS C GOSUB #I# E▜RND#I# TAN LPRINT VAL LN [<]#AT TAN ▘▞ E9#F69#/ GOSUB XX GOSUB # LOAD ## FAST RETURN C~~#NOT # 7# RETURN 4 IF LN FAST# RETURN C▞▘▖ #[C]#LN ## RETURN C NEXT # RETURN▟# INPUT # RETURN▙4-# LLIST # RETURN C▛AT ▘▌ #[C]#E###7#INT # RETURN▄4?#CHR$ # RETURN 4 NEW GOSUB ### #["]# RETURN▜4▀#S##[C]# FAST RETURN▗4M) RUN INKEY$ LN **#SGN RETURN 4▛LN >## LPRINT #SGN # )[$]PI/"" RETURN[<]4▌)#PI/[R] RETURN[+]4▌)#PI/[I] RETURN[)]4▌)#PI/[9] RETURN[-]4▌)█PI/[0] RETURN[=]4▌)#PI/[<] RETURN[*]4▌)▚PI/[~~] RETURN[,]4▌)[M]PI/▟STR$ RETURN[£]4S)3PILN **# RETURN 4▒SGN SGN LN >## LPRINT # LPRINT SGN FAST]# #7#7#[0]# RETURN[$]4▌)PPI/TAB RETURN[:]4▛)TPI /[R]#ACS # )#PI/[I] RETURN[~~]4▀▀/▖ RETURN[,,]48VAL LN [9]# LPRINT 7 RETURN 4[4] LPRINT SGN , PRINT VAL FAST: ## RAND # RETURN▗4R) RUN INKEY$ LN **# RETURN TAB [;]#/ NEW RETURN,C▛ RETURN C▀#PEEK ## DIM #XX RETURN0S▛ RETURNRNDK▀#COS ##INT #XX RETURN[2]4▘7# COPY#XX RETURN[=]4▞)#PI#A# RETURN[+]4▞)#PI#A# RETURN[$]4▞)PPI#A# RETURN[3]4▞) REM ##A##[,,]#XXXX RETURN[>]4▞)#PI#A# RETURN[:]4▞)TPI#A##[:]#XXX RETURN[,,]C▀#3# PRINT ▀~~" RETURN(C▖ LET # UNPLOT # LET #-#END ) TS) ) XXX RETURN[?]4▞)YPI#[R]# RETURN[(]4▞)#PI#[R]# RETURN[>]4▀#▖####X~~B C ▒D (E /H 4L C(HL) KA S(IX+ THEN(IY+ RETURN RETURN[3]4▞) REM ##K# RETURN[/]4▀###### RETURN THEN4▌X:K/▞ RETURN RETURNC RUN :▞#7#P#VAL STR$ LN [C]#) GOSUB #2#SGN ###▒NZ Z ▒NC (C /PO 4PE CP KM S RETURN[4]TAB ##)###K#.#0# RETURN[0]TAB W#)INT PI#K#▀~~" RETURN(ASN -#Y[▒]# UNPLOT # RETURN[£]TAB [I]#)3PI#A#.., RETURN+TAB ▒# GOSUB #▜RND<< GOSUB #▜RND#▒# RETURN[?]4▞)YPI#A# RETURN[(]4▞)#PI#A# RETURN[)]4▞)#PI#A# RETURN[4]4▞)###A# RETURN[.]4▞)COS PI#A# RETURN[0]4▞)INT PI#A# RETURN[*]4▞)▚PI#A# RETURN[;]TAB ▒#)[G]PI#A# RETURN[5]4▖7### RETURN[6]ASN ▗#/ PLOT VAL LN [9]#TAN ▀~~ RETURN, ASN LET # RETURN ASN [0]# RETURN#C RAND / GOSUB ▀~~ RETURN, ASN "# RETURN ASN [0]# RETURN#C RAND / GOSUB RETURN[;]TAB ##)[G]PI#K# RETURN[5]4▖▀#=# RETURN[6]TAB ,,#.STR$ AT #=# RETURN[▒]ASN N# RETURN["]ABS N##[1]# FASTU[W]# RETURNF4▌Y #6## RETURN;#TAN # PRINT ▀VAL SGN ▞▘, RETURN C£ RETURN#C▒ RETURN,4▘▖U[8]##U[9]##U[6]##U[7]##,,#M[6]##M[7]##[)]#5[4]#, RETURN#4▘TAN [Y]# RETURN(TAB SCROLL#LN ### FAST#LN ###L#6[,,]#LN ##TAN LEN █#<7TAN RETURN▟ASN ~~# RETURN[7]TAB 1#VAL LPRINT 7LN [C]# RETURN TAB =#LN <=# #[4]#LN ###7#TAN RETURN[7]TAB GOSUB ##[4]#VAL LPRINT GOSUB #▜RNDRZ GOSUB PI6[,,]#TAN IF # FOR STR$ GOSUB #[,,]#;6 DIM #SGN FOR ) REM #TAN RETURNQ4O▘ LPRINT TAN RETURN ASN [G]##[E]#U##MATN #LN [~~]#TAN #7#UATN # RETURN "")▛ RZ GOSUB #▞▞# RETURN COS CHR$ █#7( PLOT TAN GOSUB #▜RND# OR RNDY M##LN UNPLOT RNDTAN # RETURN#C▀7/ SAVE )▞ TAN #5ACS >)▜RND: ,▟#"A" AND M$<>"L" AND M$<>"P" THEN GOTO 2 19 PRINT AT 21,0;H$;"LINE NUMBER:" 20 INPUT N 21 GOSUB 83 22 GOSUB 91 23 PRINT AT 3,0;"PASS 1",,,, 24 IF M$="P" THEN LPRINT E$,,,"PASS 1",,,, 25 IF USR 19083=0 THEN GOTO 28 26 GOSUB 75 27 STOP 28 LET X=USR 19090 29 IF X=0 THEN GOTO 28 30 IF X=6 THEN GOTO 34 31 GOSUB 75 32 GOSUB 86 33 GOTO 28 34 PRINT 35 PRINT "PASS 2",,,, 36 IF M$="P" THEN LPRINT 37 IF M$="P" THEN LPRINT "PASS 2",,,, 38 GOSUB 83 39 LET X=USR 18417 40 LET X=USR 19389 41 IF X<>0 AND X<>6 THEN GOSUB 75 42 IF M$<>"A" OR X<>0 THEN GOSUB 86 43 IF X<>6 THEN GOTO 40 44 PRINT 45 LET N=PEEK 20773+256*PEEK 20774 46 PRINT "END OF ASSEMBLY, ";N;" ERRORS" 47 IF M$="P" THEN LPRINT "END OF ASSEMBLY, ";N;" ERRORS" 48 STOP 49 PRINT AT 2,0;F$ 50 FOR X=1 TO 4 51 SCROLL 52 PRINT H$; 53 IF X=1 THEN PRINT "START LINE:" 54 IF X=2 THEN PRINT "END LINE:" 55 IF X=3 THEN PRINT "NEW START LINE NUMBER:" 56 IF X=4 THEN PRINT "INCREMENT:" 57 INPUT N 58 POKE 20894+(2*X-2),INT (N/256) 59 POKE 20894+(2*X-1),N-256*INT (N/256) 60 PRINT AT 21,28;N 61 NEXT X 62 LET X=USR 20902 63 GOTO 2 64 GOSUB 96 65 SCROLL 66 PRINT H$;"ADDRESS:" 67 INPUT A$ 68 IF A$(1)="Q" THEN GOTO 2 69 LET X=USR 16518 70 SCROLL 71 PRINT A$( TO 9) 72 GOSUB 99 73 IF USR 16543=0 THEN GOTO 65 74 GOTO 70 75 IF X=2 THEN LET P$="[D][U][P][L][I][C][A][T][E]█[S][Y][M][B][O][L]" 76 IF X=3 THEN LET P$="[S][Y][M][B][O][L]█[T][A][B][L][E]█[O][V][E][R][F][L][O][W]" 77 IF X=4 THEN LET P$="[B][A][D]█[O][P][-][C][O][D][E]" 78 IF X=5 THEN LET P$="[B][A][D]█[S][Y][M][B][O][L]" 79 IF X=9 THEN LET P$="[J][R]█[T][O][O]█[F][A][R]" 80 IF M$<>"P" THEN PRINT P$ 81 IF M$="P" THEN LPRINT P$ 82 RETURN 83 POKE 18416,INT (N/256) 84 POKE 18415,N-256*INT (N/256) 85 RETURN 86 LET T=PEEK 18597+256*PEEK 18598 87 LET U=69-PEEK 20867 88 IF M$<>"P" THEN PRINT T;TAB 5;B$ AND (X-6);TAB 19;A$( TO U) 89 IF M$="P" THEN LPRINT T;TAB 5;B$ AND (X-6);TAB 19;A$( TO U) 90 RETURN 91 CLS 92 IF M$="A" THEN PRINT C$ 93 IF M$="L" THEN PRINT D$ 94 IF M$="P" THEN PRINT E$ 95 RETURN 96 PRINT AT 2,0;G$ 97 LET PF=0 98 RETURN 99 IF PF<>0 THEN LPRINT A$( TO 9) 100 INPUT A$ 101 IF A$(1)="P" THEN LET PF=1 102 IF A$(1)="N" THEN LET PF=0 103 RETURN 104 SAVE "ZXA[D]" 105 IF USR 21328=0 THEN GOTO 2 106 PRINT "BAD CHECKSUM, PLEASE RELOAD" 107 STOP 0 REM [Z][X][G][T]###[O]RND#7INKEY$ ##INKEY$ ##INKEY$ #▐INKEY$ #[*]INKEY$ #[F]INKEY$ #5PI#[0]PI# THENPI#T########[S]#INT [£] FASTSTR$ [J]LN 5PIACS #C▒Y-LN 5PILN .INKEY$ )(BLN ▛INKEY$ K,) CONT ▀LN ▛INKEY$ K+)# LN ▛INKEY$ K<2~~LN ▛INKEY$ K># UNPLOT RNDLN $INKEY$ ) CONT ▀LN $INKEY$ )# LN $INKEY$ 2~~LN $INKEY$ 2▘LN $INKEY$ [J]SGN LPRINT #5PI FAST[B] GOSUB # LPRINT TAN Y0[B] GOSUB #S▀W/ RAND ;#5PI#J##J#7TAN E£RND)5 FAST▘ ,,7 FAST; FOR 5CHR$ ▝ GOSUB PI STOPAT FOR GOSUB [K] LPRINT ▘[Q]▝,,6:RNDY5MTRNDY▀MURNDTAN LN [V]▝# RETURN RETURN4:LN [V]▝84 IF LN [V]▝# RETURN COPYC SAVE ▘# CLEAR[J] FAST GOSUB PI LPRINT ASN [M]RND▘ LOAD UNPLOT [J] FAST GOSUB PI LPRINT C<>#8COS #LN [X]▛# RETURN TAN ACS UNPLOT 6ORNDEORND# NEW#[P]COS LN #INKEY$ C NEXT ▞(## FOR 5 ACS T3K▘; FOR D FOR ( PRINT TAN YF[(] AND >=PI#Y▘ACS CK▝Y▖ACS DK▝ACS ▛ PRINT LN FOR INKEY$ #ACS ▛ RETURN(K▛ACS ?K▝ INPUT [?]#)[2]£UKRND[<] IF LPRINT INKEY$ LET J[4]/▝ LET [K] RETURN▒S▝ INPUT [?]/QY*[(] AND >=PI# NEW3#VAL VAL VAL [J]ACS (ACS (ACS (##DDAT ##,,AT #,, GOSUB #£RND,,76:RNDAT Y/[(]MURNDY5[)]MTRNDTAN STR$ FASTVAL PRINT UURND RETURN▝CU LET RETURN#CE RETURNRNDK#E:RND#76:RNDUTRNDXMTRND# RETURN#4#UURNDXMURND76:RNDY5MTRND/SE:RND# RETURN#C NEW7/ SAVE E£RND▘ SAVE ▝,,Q[?]LN #INKEY$ C CLS RETURNCC+ RETURNZC. RETURND4▒5(BF#[O]4 CLSLN 7INKEY$ /▀LN E~~ LET /[,]AT LPRINT SGN TAN LN #▒/PEEK #[L]COS ,LN 5PI<"/ PRINT RETURN#S,, RETURN""ACS [R] AND PPI NEWZ5)▘#▖ RETURN5K▖[J]LN 5PIACS #7C CLS( RAND #ACS #4▞LN 5PI7/ PRINT NEWZLN 5PI[J]#HPIINT [~~]#[M]C IF LN D#VAL #[M]▛S LET #PI) STR$ FOR 7D FOR D#[+]#[0] FOR K PLOT FOR FOR [J]#3##3#[O]C/ FOR [J]ACS 0ACS 1#[+]#[0] IF RETURNPI#[+]##[0]# STOP; STOP/<> LPRINT AT ACS #TAB .INKEY$ TAN ##*>=.INKEY$ FOR #[C]#ACS #TAB .INKEY$ TAN GOSUB #MRND#I CLEAR#[R]▞ GOSUB #[/] GOSUB #[/]## GOSUB #K▘76MRNDACS [W]TAN ▀▀▀VAL ▀▀▀▀5█#LN [7],,7Y##7Q▝7AT #7#7Q REM 7#7#7TAN 5 FAST FASTLN #INKEY$ RETURN-4,, LPRINT SGN PRINT FASTLN 5PI/ LIST RETURN# LPRINT C3D FASTDDSGN ;#LN 5PI#CHR$ 0S▒#▞ ,, RETURN~~SPEEK LET Y NEWLN 5PI/SIN LET ATN .INKEY$ TAN VAL FASTE#RND PRINT # FAST76#RNDLN #INKEY$ RETURND4>Y#LN 5PI LPRINT LN [O]RND LET A #LN [O]RND/▝ LPRINT LET LPRINT AT [J]TAN TAN TAN Y?NOT LN ##/>5 LN >#LN RUN #▀LN ## FASTLN ▞# LPRINT LN >#LN ##LN 4#LN $#INT #YTAN ###6#RND GOSUB #0RND<5#RNDLN ,,#E#RNDQ/7Q#76#RND)# ;6#RND5#RNDLN USR #77 FAST76-RNDLN ## RETURN PAUSE ATN ACS # RETURN RAND ATN [-]# RETURN IF ATN COS # RETURN THENC REM RETURN DIM ATN 1# RETURN GOTO ATN F# RETURN GOSUB ATN RND# RETURN FOR ATN SIN # RETURN NEXT ATN POKE # RETURN SLOWATN # RETURN POKE ATN [Q]# RETURN FASTATN LET # RETURN INPUT ATN ## RETURN PLOT ATN ## RETURN UNPLOT ATN [>]# RETURN LET ATN ▀# RETURN CLSATN [3]# RETURN STOPASN [-]# RETURN PRINT ATN ## RETURN REM C+ RETURN SCROLLATN [8]# RETURN RETURNATN $# RETURN 4:LN ## RETURN#4▛ LPRINT LN :#TAB Q#Y[S]LN ##LN ##INT [.]LN ##5###[D]# FAST#7#STR$ FOR FAST67RND6~~RNDLN GOTO #LN ## LPRINT LN <#.. FOR SGN LN ,,# GOSUB ##RNDLN ,,# FAST GOSUB ##RND[B] GOSUB # LPRINT S▀6#RND LPRINT TAN #7#7TAN #7#7TAN FASTAT E0RND7LN :# FOR [B] GOSUB PISQR E#RND GOSUB #** FOR 7/ GOSUB Y# PRINT LN ##LN E#LN <# FOR LN :# FOR LET #[F]#YLN / DIM FAST SCROLL RETURN#C,, RETURN#C▌ PRINT LN ## LET LPRINT TAN LN ## RETURN#C# RETURN"C< RETURNAT C# RETURNCHR$ C#LN ##5##LN [D]#/#Y/LN ##E#RND FASTLN ##▘ COPY COPYE-RND7▀# PRINT LN ## LET RETURN"C▌LN ##/ LOAD 6-RND LPRINT VAL #7Y)LN [F]#Y▘ LPRINT LN [F]#5##LN [D]#/>LN R#LN AT #5##LN [I]#5 PRINT ▒LN [D]#LN ## RETURN,C[£] RETURN;C[▒]5 GOTO #LN [D]#E-RNDF6-RND[J]TAN LN ##Y#LN ##5##LN [D]#/CHR$ Y#### RETURNRNDABS AT #CHR$ A** GOSUB ##RNDA #,,TAN LN ##LN LET # RETURN#4~~LN E#Y FASTLN ##A COPY FASTLN ## RETURN=TAB AT #LN X#LN PEEK # LPRINT # RETURN COPY4£5SGN FOR LN [I]#5,,##[D]#Y6#[F]#[J] PRINT LN ##Y FASTLN ##LN ## RETURN)C# RETURN#C# PRINT LN ## LET RETURN+C▖ RETURN-47AT ## RETURN 4▖ PRINT FAST/** FAST5##LN [I]#LN ##Y FAST5##LN [F]#/CODE PRINT VAL /0 RETURN/C( RETURN*TAB AT #LN LEN #5##LN [D]#/[G]LN LEN #5##/ NEXT Y LPRINT LN ## LET RETURN COS RETURN+C)LN LEN #5[B] FOR LN [I]#5 GOSUB #LN [I]#/ SCROLLLN LEN #Y;LN ##/<>YSGN ### RETURNPEEK 4?LN ##5##LN [I]#5A #[I]# RETURNUSR 4>LN ##5 FOR ##[D]#▘ LET #VAL FASTTAN ##TAN RETURNCODE TAB ?#LN ## RETURNINKEY$ TAB AT #5##LN [D]#YA5 ##[F]# RETURNRNDTAB ,#5###[D]# RETURNABS 4)LN ##5ACS #LN [I]#YCODE 5###[F]# RETURNINT TAB AT ####LN ##LN ## PRINT Y FASTLN ##LN ##YSGN LN ## LET TAN LN ## RETURN- PRINT ATN ## RETURN(C- RETURNRNDK$ RETURNAUSR ▙#>=[?]# LET ATN ##TAN LN ACS #/ PLOT LN X#/ LET 5##/J#J##J#7TAN LN LET # RETURN#ASN Z#YE#[F]#LN E#Y5/+LN $# LPRINT GOSUB ##RNDTAN 5E~~/▌5##/ YLN LN ###LN ######LN R#LN AT #5 FOR #/ GOSUB RETURN,TAB AT #TAN LN ##LN LET # FAST FASTLN ##LN R#Y7LN ##5 GOSUB #LN [I]# LPRINT LN [I]#Y677LN [F]# LPRINT GOSUB ##RNDLN ,,#TAN LN ##LN LET # FAST FASTYELN [F]#576LN [I]# LPRINT LN [I]#77Y GOSUB LN ##Y#LN [F]#Y[B]5 GOSUB #LN [F]#Y IF LPRINT LN :# FOR LN [F]#TAN 5 /?LN ## RETURN#C, PRINT )~~ LN ## LET RETURNAABS AT # RETURN0 AND AT #CHR$ 0▞ #,,/ TO FASTE-RND)▌ ;6-RND LPRINT TAN 5##LN [D]#LN ##LN LET ##S#Y[.] PRINT LN R#LN AT #5##LN [I]#YYLN ## LET LN ##YM5KRNDLN [F]#5###[D]#Y[4]/**YE5ORNDLN [F]#Y65MRND#[F]# RETURN<>C> RETURN=C=3K▘ FOR *[B] GOSUB #R SAVE *SQR /▒ GOSUB #R""/▖ GOSUB #RCOS ZTAN LN R##IYLN [I]#5[A]#LN [D]#E~~RND7LN <# FOR LN :# FOR YABS LN [F]#LN ## RETURN THENTAB AT #TAN 5 RUN ##[D]#LN SCROLL▝5VRNDACS [Q]TAN 5▞##[D]#5VRNDACS PLOT #▛▝#7#,,7U£RND[1]""U$RND[0]TAN LN ## RETURNZTAB AT #LN ##[J]TAN LN ##5 GOSUB #LN [I]#50RNDLN [I]#5D,,#[I]#LN E#YSTR$ LN ##5:#LN [D]#5 FOR SGN #[I]##[▒]RND#["]RND#[:]RND#[)]RND#[=]RND#[*]RND#[,]RND#[1]RND#[4]RND FOR #[7]RND#[A]RND#[D]RND#[G]RND#[J]RND[J] 2 REM 5#RND FAST6#RND77#7#,,777#7#,,777#7#,,7SGN [B] GOSUB #6#RND FOR E▖RND#7#7 FOR E#RND GOSUB ##RND GOSUB [K][J]TAN LN SCROLL▝5VRNDACS [Q]I# FASTE▖RND#7# LPRINT FASTVAL LN [7],,E▖RND77AT SGN GOSUB [K][J]TAN #RND # 3 REM TAN -ZXGT COMPILER - ZXGT=17389 PROG=18823 4 REM [M][C][O][D][E][R] COPYRIGHT 1982 PSS 5 REM 6 REM 9 SAVE "MCODE[R]" 10 POKE 16389,118 20 LET L=USR 18821 25 SLOW 30 PRINT AT 5,11;"INTER" 40 PRINT AT 7,6;"[C] [O] [M] [P] [U] [T] [E] [R]" 50 PRINT AT 9,10;"PRESENTS" 60 PRINT AT 11,11;"[M][C][O][D][E][R]" 70 PRINT AT 15,3;"(C)1982 INTERCOMPUTER INC" 80 PRINT AT 16,1;"UNDER LICENCE FROM PSS,COVENTRY ENGLAND" 90 GOSUB 200 100 PRINT AT 5,5;"YOU MAY DELETE ALL LINES EXCEPT 1 TO 4 INCLUSIVE" 110 GOSUB 200 120 STOP 200 FOR F=1 TO 80 210 NEXT F 220 CLS 230 RETURN 10 REM LN 7?LN ▐.LN #▀TAN 15 FOR F=16514 TO 16523 20 POKE (F+15875),PEEK F 30 NEXT F 40 PRINT AT 1,12;"[S][T][O][P][P][E][R]";AT 8,3;"NOW LOAD YOUR PROGRAM BY";AT 9,3;"TYPING RAND USR 32389.";AT 10,3;"WHEN THE PROGRAM HAS LOADED";AT 11,3;"YOU WILL GET REPORT CODE C/0";AT 13,3;"YOU CAN NOW LIST AND SAVE";AT 14,3;"AT LEISURE";AT 20,1;"[C] [P][E][R][S][O][N][A][L]█[S][O][F][T][W][A][R][E]█[S][E][R][V][I][C][E][S]" 55 STOP 60 SAVE "STOPPE[R]" 70 GOTO 10 ```