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:
- 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.
- 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.
- 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 SYMBOLX=3— SYMBOL TABLE OVERFLOWX=4— BAD OP-CODEX=5— BAD SYMBOLX=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: whenX=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
POKEpairs, used consistently for line numbers and renumber parameters. - All machine code entry points are called with
LET X=USR addressso the return value is immediately available for branching. - The
SAVEstatement 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 theSAVEat line 104; this suggests a post-save checksum verification routine at address 21328, though no corresponding error path beyond line 106 exists other thanSTOP. - 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.
Content
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▖7</ POKE # RETURN█K,#7 RETURN█S IF #7 RETURN GOSUB C IF RETURN CLEARC PLOT RETURN<>C 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 <LN 8##[K]#5 62##Y# RETURN[.]4▞)COS PI#K####XXX RETURN["]4▖#[9]# #># )[$]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<LN 8#SGN ,#K# FASTSTR$ FOR LN [C]# RETURN 4 LPRINT SGN LPRINT .,#[>]# #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: <LN 4#SGN AT LET ### #7#7#[0]# RETURN[▒]4▝/CHR$ RETURN[2]4YVAL LPRINT 7#LN [C]# RETURN C▒▘▌ SGN SGN #[C]#VAL LPRINT GOSUB #▜RND<<RZ GOSUB ## RETURN C,, RETURN COPYC"▘,, / LPRINT ACS #4 RUN /▖ACS #C LET # LPRINT SGN Y[▒]/[5]SGN SGN LN +## LPRINT ## RETURN TAB ###Y## RETURNBS,,C▘TAN # RETURN(S▘TAN LN COPY## CONT #~~ RETURN,ASN ##: ### RETURN ASN [0]## RAND #E REM FAST▞▛# RETURN0S▒##RND# 7( SAVE Y▘ LPRINT TAN Y LPRINT GOSUB #4#TAN RETURN;ASN [4]##ACS #, RETURN ASN ▝## LIST #XSTR$ PRINT RETURN[~~]4▀▀/~~ RETURN[▒]4▀#▟##[7]#STR$ VAL LPRINT 7SGN GOSUB #▜RND LET SGN RETURN[▒]4▘7###SGN SGN SGN LN >## 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▘▖</ LOAD E▜RND LET RETURN▄C▖7( CLEARTAN 77( UNPLOT TAN XXXXXX RETURN▚ASN [J]# RETURN▐TAB C#E▜RNDVAL SGN <,#▞ <,[T]C▖#7( RUN #[0]#XASN RND##6#6##AT #<#VAL LN [9]##:#7#7AT 6###A#▀VAL SGN ,▞ TAN ASN ~~# RETURN[1]ASN [4]##PEEK # RETURN[1]TAB C#LN [9]# RETURN TAB [B]# LPRINT FASTVAL LN £#LN 6#AT RETURN TAB [B]#LN -##[4]#5 69#LN [7]#TAN #6▜RND#[4]# FASTE(RND)# ; FAST▞$Y #7( UNPLOT SGN LPRINT FAST GOSUB #▜RNDRZ GOSUB PI#E▜RND FOR # RETURN C7STR$ GOSUB ###LN FOR #▞▝LN :INKEY$ SGN #7 RETURN▌S▝:▖▞▘LN :INKEY$ <<$# RETURN 4 NEXT LPRINT LN [£]# LPRINT LN [B]#▘ TAN INKEY$ #M▄#F###6▜RND6##TAN LN [B]#E9#769#TAN ▖"▖,▀ INPUT ▝)#RND5[2]#, RETURN#4▘TAN [Y]<S▛4~~7,[Y]K▌LN COPY#/ SCROLL.U[6]#><U[7]#>U[8]##U[9]##U[6]##U[7]##,,#M[6]##M[7]##[)]#5[4]#, RETURN#4▘TAN [Y]<SLN 4▛7,[Y]SLEN TAN CODE TAN FOR 7#7#;7 FOR TAN 60#RZ GOSUB #▘ E0#ABS ##▘▀ TAN VAL 5#RND# POKE #VAL PRINT PRINT 6#INKEY$ GOSUB ## GOSUB ## LET FASTE#INKEY$ #[(]INKEY$ """ GOSUB #[,,]INKEY$ VAL ▞£5#INKEY$ Y #7#7#[K]INKEY$ ▌M### GOSUB #4#TAN ASN ##LEN █[Y]TAB ## FAST5##O LPRINT 7#V#U## RETURN COS FASTSTR$ VAL LPRINT GOSUB #[,,]#; FASTAT SGN LPRINT TAN S LN ####<># 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: ,▟#<F# RETURN COPY4 PLOT ▞ TAN X
2 CLS
3 CLEAR
4 DIM A$(70)
5 DIM B$(13)
6 LET C$="ASSEMBLE"
7 LET D$="ASSEMBLE AND LIST"
8 LET E$="ASSEMBLE AND PRINT"
9 LET F$="RENUMBER SOURCE"
10 LET G$="DEBUG"
11 LET H$="ENTER "
12 PRINT "██████[S][C][I][E][N][T][I][F][I][C]██[S][O][F][T][W][A][R][E]██████",,,,"ASSEMBLER/DEBUGGER V2.1",,,,,"(C) INTERCOMPUTER INC. 1983 ",,,,,"A ";C$,,"L ";D$,"P ";E$,"R ";F$,"D ";G$,,"Q QUIT";AT 21,0;H$;"CHOICE:"
13 INPUT M$
14 GOSUB 91
15 IF M$="R" THEN GOTO 49
16 IF M$="D" THEN GOTO 64
17 IF M$="Q" THEN STOP
18 IF M$<>"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
Note: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.






