ZXAD MCoder Stopper

Date: 1983
Type: Program
Platform(s): TS 1000

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

AddressFunction
19083Pass 1 initialization
19090Pass 1 line processing loop
18417Pass 2 initialization
19389Pass 2 line processing loop
20902Renumber source
16518Debugger: disassemble at address
16543Debugger: 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.

Content

Appears On

Related Products

BASIC to machine code compiler.
Break through any machine code software, list on screen, save to another tape or print out.
Two-pass assembler. Using ZILOG mnemonics with labels and symbols, 8 pseudo-ops (ORG, DEFB, DEFW, DEFS, DEFC, EQU, END), syntax checking,...

Related Articles

Related Content

Image Gallery

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.

People

No people associated with this content.

Scroll to Top