ZX Format #07: Coding for Beginners: Assembly Guide

About coding for beginners.

music by COOPER (C) CREATOR product 1997
_______________________________

So, this article is intended for those who have already started studying assembler and want to continue but do not know how exactly. Perhaps I can help you a little.

First, let's discuss some technical terms: a bit is the smallest unit of information, it can be 0 or 1. A byte is 8 bits combined together, it can take a value from 0... 255. A word = 2 bytes - can take values from 0... 65535. A clock cycle is a unit of time measurement for the processor, for example, like seconds for us, but for the processor, it's clock cycles. Each command is executed in a certain number of clock cycles (the fastest takes 4 cycles). Here are, so to speak, some example commands:

commandcode cycles

NOP #00 4
LD HL,NN #21 N N 10
LD A,N #3E N 7
LD A,(NN) #3A N N 13
SRL (IX+S) #DD #CB S #3E 23

You can find the number of cycles for which a command is executed in some books, for example: "How to Write a Game in Assembler" or "Programming in Machine Codes in Assembler Language" Inforcom 93 year. I have the second one on my desk, and I must say it helps quite often. However, almost all tables contain minor errors.

So, it seems we have established a basic foundation and can now continue to deepen our knowledge. The first thing you need (of course) is to know assembler commands.

Second: it would be good to know Basic or some other programming language; otherwise, it will be really tough...

Processor Registers

- used only as reg. pair
+ can be used one by one
* can be used only one at a time

AF + AF'+ IR * SP -
BC + BC'+ IX +
DE + DE'+ IY +
HL + HL'+ PC -

PC - although it is not a register in terms of usefulness for us, it points to the address where the processor is working, that is, at which address the processor executes the command. It is needed by the processor itself; for example, when executing the CALL #nnnn command, the processor takes the PC register and pushes it onto the stack to know where to return. IR - This is not a register pair but single registers, I - points to the interrupt vector (in IM 2, not used in IM 1), and the R register is needed for memory regeneration; it increases with the execution of each command. A - Arithmetic register, you can do anything with it. Commands ADD, ADC SUB, OR, XOR, AND, CPL work with it and one more data (number or register). HL - the register can be used as arithmetic, but it's two bytes. You can also use it to set data addresses, for example, LD A,(HL), the data from the memory cell with the address contained in HL will be placed in register A. Or perform indirect addressing, for example, JP (HL), a jump will be made to the address contained in the register pair HL. DE, BC - are almost identical, only register B is used as a counter in DJNZ #nnnn operations. The register pair DE can easily be swapped with HL using one command EX DE,HL. These registers mainly have a common purpose.

F - flag register. Contains information about past events in the following form:

bit name content

0 C carry flag, it is set depending on whether there was an overflow of the register. For example, if you add 10 and 20, you get 30, which does not exceed 0 or 255, and bit 0 will be reset (is 0). If we subtract 20 from 10, we get 246 (since the processor has no negative numbers), and bit 0 will be set to 1. The same will happen if the sum exceeds 255.

1 N addition/subtraction flag
2 P/V parity/overflow flag
3 not used
4 H half-carry flag
5 not used
6 Z zero flag, it is set depending on whether the result is zero. For example, if you subtract 10 from 10, it will be set to 1; if you subtract 20 from 10, it will be reset.
7 S sign flag

In the early stages, you will only need two flags - the carry flag and the zero flag. The other flags are rarely used, even by very experienced programmers.

IX, IY - index registers. That is, with their help, you can easily organize access to a table or array. The indexing method is as follows: for example, you need to load elements of the array (TAB) 0, 1, 2, 3, and 4 into registers A, B, C, D, and E.

LD IX,TAB ; set ; register to the start of the table. You can also use register IY, but ; be careful, it is used by Basic for ; its needs.
LD A,(IX+0)
LD B,(IX+1)
LD C,(IX+2)
LD D,(IX+3)
LD E,(IX+4)

SP - stack pointer. It addresses a certain part of memory allocated for a data storage. It is convenient to store addresses/data that need to be temporarily saved. It is also used by commands CALL, RET, EX (SP), HL... For example, if there are not enough registers and you need to save an intermediate result somewhere, you can do PUSH HL, and the register pair HL is saved on the stack, while the SP register decreases by 2. Do not forget that if you save something on the stack, you need to remove that data before exiting the procedure/program; otherwise, the RET command will receive the last value pushed onto the stack instead of the return address.

The processor has two sets of registers; the alternative set can be used when you need to process a large amount of information and the main set is not enough. Since you cannot use them simultaneously, there is a command for their quick exchange. The alternative HL' DE' BC' are replaced by the current HL DE BC by the command EXX, the AF register is changed to AF' by a separate command EX AF, AF'. These two sets do not differ from each other in any way, and it is impossible to determine which one is the alternative.

Editors

To write programs in assembler, you need an editor (assembler); there are many of them now: TASM, ALASM, MASM, PASM ZXASM, XAS... I write in XAS version 7.446; actually, I haven't seen anything better so far, but to each their own, look at everything possible and choose your own. And for familiarization with the editor, it is advisable to read its description. Each of them is quite unique (purely functionally, so you can write in any of them, but with different conveniences), so comments here are unnecessary.

How to start.

I personally started writing in assembler on the same day I began studying it. It happened like this: I was already well-versed in Basic and wrote a commander and a database in it. The speed of work (especially the database) was just awful. And I delved into assembler, gradually studying it, translating Basic lines into machine code commands. As a result, there was a double benefit - I made a fast commander (for those times) and learned the basics of assembler. Naturally, at first, I used the ROM of Basic and its subroutines; there is nothing wrong with that; it will even help you a lot. You should not try to do everything in assembler right away; it will be easier for you.

Let's get started...

So, now it's time to start translating some program in Basic into assembler, using ROM and its procedures. Take a book with their descriptions (of Basic procedures) and start.

If you do not have anything suitable, you can write simultaneously in Basic and assembler. It is undesirable to use floating-point numbers, sines, etc., as working with them in assembler is somewhat different from Basic and is difficult for beginners.

I will provide some explanations regarding the translation of Basic into assembler. Essentially, processor registers are analogs of variables in Basic. FOR... NEXT loops can also be easily replaced with the use of registers/memory cells (indirect addressing), or LD B, N... DJNZ LABEL. Subroutine calls GOSUB... RETURN are equivalent to CALL... RET, GOTO N = JP #NNNN, and so on...

By starting to write in assembler, we free ourselves from the limitations of Basic, from its "guardianship," and gain full control of the processor. For example, the processor has no idea what a screen is; for it, it's just another piece of memory, like all the others, so you will have to work with the screen yourself.

Moving forward...

If you already know how to write using the ROM of Basic, that's great. We need to move on. We will gradually replace the ROM procedures with our own.

Here, for example, printing a character on the screen is one of the most necessary procedures. Below is one of the fastest variants for printing 8x8 characters. Printing lines using this procedure will not be difficult. You should call the procedure as follows:

in register A - the code of the character to print, in register DE - the coordinates on the screen

the coordinates start from the upper left corner)

;Procedure for printing a character, character code
;in register A, coordinates in register DE

PRINT LD L,A ;Count the necessary
LD H,0 ;number of bytes in
ADD HL,HL ;the font, since
ADD HL,HL ;one character occupies
ADD HL,HL ;8 bytes, just multiply
;the code of the needed character by 8 and add the address of the font
LD BC,15360
;Font address in ROM, you can create your own font and specify here
;its address! BUT! Be careful, this procedure starts printing from
;character code #00, while standard fonts (768 bytes) start from
;character code 32. So, if you use such
;font, then put SUB 32 as the first line in the PRINT procedure

ADD HL,BC
CALL POSIT
;Calculate the real address on the screen based on the coordinates
LD B,8
PRINT1 LD A,(HL)
LD (DE),A
INC HL
INC D
DJNZ PRINT1
RET

;Procedure for converting screen coordinates to a real
;address, coordinates are contained in register DE. D - row E - column, output in DE - address

POSIT LD A,D
AND 7
RRCA
RRCA
RRCA
OR E
LD E,A
LD A,D
AND #18
OR #40
LD D,A
RET

If necessary, you can also print with colors. To do this, after calling the POSIT procedure, put: CALL COLOR and the printing procedure with color is ready.

COLOR LD A,D
AND %00011000
RRCA
RRCA
RRCA
OR #58
LD B,A
LD C,E
LD A,(color) ; memory cell,
LD (BC),A ; where the
RET ; color byte is stored

Printing a line. For this procedure, you need to specify the following data: in register HL - the address of the text to be printed, at the end of the text there must be a byte 0 to find the end (can be replaced with any other). In register DE - the coordinates on the screen.

PR_LINE LD A,(HL)
AND A
RET Z
PUSH DE
CALL PRINT
POP DE
INC E ; increment the coordinate
; for printing left to right
JR PR_LINE

Printing numbers is also a common task. Its function is to convert a real number into a character string.

For example, let's take a byte to convert it into a character form. To do this, we need to allocate three variables, as it can take values from 0 to 255. We will take registers B, C, A. B - hundreds, C - tens, A - units. So, we place the necessary byte for conversion in register A. After exiting the procedure, we will have the character representation of the number in registers B, C, and A, and you can choose how to display them on the screen.

NUM_LINE
LD B,48
LD C,B
CP 200 ; hundreds exist
JR C,SM_200
LD B,"2"
SUB 200
SM_200 CP 100
JR C,SM_100
INC B
SM_100 CP 10 ; tens exist
JR C,SM_10
INC C
SUB 10
JR SM_100
SM_10 ADD A,48 ; units
RET

That's all, for converting larger numbers, nothing fundamentally changes, just the number of loops inside will increase. Naturally, this is not the fastest way, but one of the most accessible for understanding.

Next, you can take some debugger and see how the procedures in ROM are made. Try rewriting them.

Now I think we should go over the most bottleneck areas of the program (in terms of performance):
1. loops - they certainly consume a lot of time, and it is highly undesirable to save anything on the stack in them; you should use other registers as much as possible. Speaking of registers, it is very convenient to use LX, HX, LY, HY as registers if all others are already occupied. But even here there are difficulties; some assemblers cannot handle this (changes in registers IX, IY), and it is better not to change register IY; it will come in handy later; if possible, it is better to stick with IX. By the way, speaking of registers, if you are not aware yet, register IX can be used as two registers HX - the high byte, LX - the low byte. Mainly, books do not mention this. Some commands using halves of IX and IY are formed quite easily - just add the prefix #DD for HX and LX, #FD for HY and LY to the command that works with register H or L.

So, for example, let's take such a loop, where all registers are occupied except IX, and we have to use the stack: (the advantages of registers A, C, D, E, L, H are not even worth proving)

LD B,100 ; 7
LOOP PUSH BC;11
...
POP BC;10
DJNZ LOOP ; 13

So, the loop's operation will take: (99*13)+7+(100*(11+10))+7= 3401 clock cycles.

Replacing register B with LX...

LD LX,100 ; 8
LOOP
...
DEC LX ; 8
JP NZ,LOOP; 10

Now it turns out: 100*(8+10)+8=1808 cycles! The difference is obvious, about 1.88 times.

Also, in loops, avoid using commands JR x, nnnn as they take 12 cycles if the condition is met and 7 if not. In loops, this is not advisable.

2. branching the program: suppose you have a number and depending on it you need to jump to the corresponding procedure; this can be implemented like this:

LD A,(NUMBER) ; 13
CP 0 ; 7
JR Z,NUMBER0 ; 12/7
CP 1 ; 7
JR Z,NUMBER1 ; 12/7
CP 2 ; 7
JR Z,NUMBER2 ; 12/7
...

or like this:
LD A,(NUMBER) ; 13
AND A ; 4
JR Z,NUMBER0 ; 12/7
DEC A ; 4
JR Z,NUMBER1 ; 12/7
DEC A ; 4
JR Z,NUMBER2 ; 12/7
...

It is also noticeable that the second method is faster. Here I replaced CP 0 with AND A because they affect the flags equally, and AND A executes faster (you can also use OR A for checking 0). In this procedure, it's better to use the JR command than JP, as the probability that a specific branch will trigger is much less than 50%, and this is how you should choose these commands (do not forget that JR can only 'jump' up to 128 bytes, no more, and if the procedures are far apart, you can't get away from JP).

3. keyboard polling: If you need to poll 1... 10 keys, you can resort to direct reading from keyboard ports:

LD A,#7F
IN A,(#FE)
;now the lower five bits of register A will hold the values of the keys: 0 - bit space, symb shift, m, n, b if the bit is 0, then the key is pressed, if 1, then not. Under no circumstances should you compare the data with a number! The upper 3 bits can be anything, and moreover, if more than one key is pressed?... now let's check, for example, the space button, its value in the zero bit of reg. A
BIT 0,A
JP Z,PRESS_SPACE
;or you can do it this way, using the rotation command RRCA, it works like this: flag C>76543210>C, so our result will be in the CARRY flag
RRCA
JP NC,PRESS_SPACE

This, by the way, is similar to the branching example; if you need to poll more bits, then continue like this. If you need to poll the entire keyboard, it is better to refer to ROM and use its subroutine, of course if the time of its execution is not very critical. But if time is crucial, then take all the data from the keyboard ports and write a handler. Here, by the way, are the keyboard ports:

bits 0.4 port

caps shift, z, x, c, v #fe 254
a, s, d, f, g #fd 253
q, w, e, r, t #fb 251
1, 2, 3, 4, 5 #f7 247
0, 9, 8, 7, 6 #ef 239
p, o, i, u, y #df 223
enter, l, k, j, h #bf 191
space, symb shift, m, n, b #7f 127

4. If possible, replace stack saves with the use of the alternative set of registers.

Now we will consider the procedure for drawing a point on the screen; it will be a bit more complex. It can be slow - 130-150 cycles per point, or fast, but more complicated, with a table.

By the way, what is a table, and how is it used?

A table is a bunch of bytes (or words) that contain the necessary information with quick access. I certainly did not say this on purpose; I just cannot say it any other way. Look at the 'fast point.' It requires a small installation, i.e., before use, you need to run the INSTALL procedure (once), after which you can use the point-drawing procedure as much as you want. The INSTALL procedure creates the table. With the use of the table, there is no need to calculate anything, and indeed, counting takes up most of the time.

INSTALL ; installation procedure
LD HL,PLOTT ; address of the table
; in 1024 bytes for the point, the lower byte of the address must be #00! for example #F0 or #BC00
LD DE,#40 ; screen address
LD B,E
LD C,#80 ;*
LD HX,4
LOOP3 LD LX,8
LOOP2 LD A,8
LOOP1 LD (HL),E
INC H
LD (HL),D
INC H
LD (HL),B
INC H
LD (HL),C
RRC C
DEC H
DEC H
DEC H
INC HL
INC D
DEC A
JR NZ,LOOP1
INC B
LD A,B
AND 31
LD B,A
LD A,D
SUB 8
LD D,A
LD A,E
ADD A,#20
LD E,A
DEC LX
JR NZ,LOOP2
LD A,D
ADD A,8
LD D,A
DEC HX
JR NZ,LOOP3
RET

PLOT ; point drawing procedure
LD L,C
LD H,PLOTT/256
LD A,(HL)
INC H
LD D,(HL)
INC H
LD L,C
ADD A,(HL)
LD E,A
INC H
LD A,(DE)
OR (HL)
; OR (HL) can be replaced with XOR (HL) for overlaying by XOR principle, or with AND (HL) for erasing points, but then you need to replace register C at the input of the INSTALL procedure from #80 to #7F
LD (DE),A
RET

As seen from the PLOT procedure, it hardly calculates anything; it takes the coordinates of the point (in B 0.191 in C 0.255) at the input, and the procedure takes the necessary bytes from the table depending on the input data. Try to figure out for yourself what the table consists of; this will undoubtedly be beneficial.

A list of such or similar procedures can be kept for quite a while; start figuring it out yourself. What you need from the procedure, how to make it faster, etc. And I will provide you with the mathematical library of our group. It will undoubtedly help you a lot. So go for it. And if you need to know something in more detail, write, and I will try to answer all your questions.

(C) Copyright by Angel 2 MAIN CODE

List of procedures:

1. DIV - division

INPUT : HL

Contents of the publication: ZX Format #07

  • From the Authors
    Update on SMUC, distribution issues, and plans for future ZX Format issues. Authors address outdated SMUC info and distribution problems of ZF-6. Upcoming content includes game descriptions and new projects.
  • Аторы журнала
    Contact information and editorial team details for ZX-Format No.7. Provides mailing and electronic addresses, as well as contact phone numbers. Information on the availability of their website and specific contact instructions.
  • Содержание номера
    The article provides an overview of notable software releases on the St. Petersburg market for autumn. It also includes detailed descriptions of games, programming tips, and hardware projects. Interviews, philosophical tales, and reader letters enrich the issue.
  • Игрушки - Welcome
    An overview of software novelties for ZX Spectrum, including games like 'Los Angeles Drugs Bust' and 'Jungle Warfare'. Each game description provides insights into graphics, gameplay, and features. A variety of genres from action to strategy are covered, showcasing the diversity of software offerings.
  • Игрушки - Алешкин А.В.
    The article describes the game 'TAI-PAN' as an arcade-economic game set in the 19th-century East, focusing on trading and survival amidst pirates and danger. It details the gameplay mechanics, such as trading goods, managing finances, and navigating seas with different ships. Despite its engaging plot and interface, the game didn't achieve much popularity in Russia.
  • Игрушки - Soft
    A whimsical narrative in a fantastical world where colors converse with the Last, a character recounting tales of ancient humans, coders, and a mysterious past. The story explores themes of language, translation, and the creation of 'the Last' amidst fantastical beings like flying hippos and sea giraffes. It serves as a fictional narrative with humorous elements, blending science fiction with satire.
  • Игрушки - Alex ASP
    A parody on Tolkien's 'The Lord of the Rings' named 'Bored of the Rings' by Delta 4 is explored. The text references adaptations, humorous adventures of characters like Fordo and Bimbo, and differing versions from Delta 4 over the years. Anticipated prequels and correspondence excerpts with Delta 4's Fergus McNeill are mentioned.
  • Игрушки - Гил-Гелад
    The article provides a detailed guide on navigating the 3D Construction Kit interface for ZX Spectrum. It explains menu options for file management, game setup, and in-game conditions. Additionally, it covers object creation, editing, and logic implementation within the program.
  • Программистам - Дмитрий Рудовский
    The article concludes the description of BB commands and provides tips on their usage. It details the usage of the CLOCK command for time and alarm management on ZX Spectrum. Additionally, it explains the SORT command for array sorting and introduces new logical and mathematical functions.
  • Программистам - Angel
    Introduction to assembly programming for beginners, covering basic concepts and commands. Detailed explanation of processor registers and flags, with examples. Offers practical advice on transitioning from Basic to assembly language.
  • Программистам - GreenFort
    Discussion on fast calculations in assembler for tasks like vector graphics and astronomy. Describes procedures for binary division and multiplication, with examples for different byte sizes. Highlights the adaptability of these methods for increased precision.
  • Программистам - TP, Stinger
    Detailed technical description of the Mod file format for music composition on ZX Spectrum, focusing on structure and data offsets for title, instruments, and patterns.
  • Программистам - Research
    The article describes the capabilities and limitations of the Convert program, focusing on its use for converting images to the BMC format. It includes technical details about the program's functions, such as dithering methods, sprite and screen format output, and the removal of extraneous dots. Additionally, the article briefly discusses the source code of X-Color and its potential applications.
  • Обзор
    The article discusses the ENLiGHT'97 demo-party held in St. Petersburg on August 24, 1997, featuring platforms like Spectrum, Amiga, and PC. The event attracted around 1100 delegates, leading to overcrowding and technical issues, which caused the cancellation of the second day. Despite these issues, the event was generally enjoyable, and there is hope for another event in 1998.
  • Обзор
    Review of VideoFAIR exhibition in Manezh with highlights on video and audio equipment. Amiga-service and various companies showcased their technological advancements in video editing and broadcast systems. Notable innovations include 3D laser-scanned displays and professional audio solutions.
  • Железо - Nemo
    Discussion of KAY technology export to decentralize Spectrum production. Highlights potential benefits and challenges of local manufacturing. Emphasizes quality assurance and support systems.
  • Железо
    The article describes the development of a new Scorpion motherboard, focusing on enhancing graphics, speed, and compatibility with modern peripherals like IBM keyboards and mice. It introduces the GMX (Graphic Memory Extension) board, designed to upgrade existing Scorpion models to match the capabilities of the new motherboard. The GMX board offers significant improvements in memory, graphics, and processing speed, while maintaining compatibility with ZX Spectrum and Pentagon standards.
  • Железо
    The article provides a detailed overview of two popular audio amplifiers for ZX Spectrum users in St. Petersburg. It highlights the advantages and specifications of the 2 X 2W low-voltage amplifier and the 2 X 22W car amplifier. The article also includes a price list and ordering instructions through the 'Nemo' company.
  • Примьера
    The article describes the improvements and features of the Turbo Assembler version 1.1 for ZX Spectrum. It highlights the differences from version 1.0, such as bug fixes, screen size changes, and added features like line editor and syntax checking. It also details the memory allocation and provides a guide on using the editor and compiler functions.
  • Примьера - STS
    Description of the Riff Tracker MOD-editor for General Sound, its features, and functionalities. Provides detailed instructions on using editing and sample management. Notes on the current version limitations and expected improvements.
  • Примьера - Paul Atrides, Alex Noman
    Presentation of Oberon Creative Pack, consisting of ZX-WinWord and Sprite Cutter. ZX-WinWord is a text editor combining text and graphics with advanced features. Sprite Cutter allows sprite creation and manipulation in various formats.
  • Примьера
    Presentation of the second demo version of the game Headball by ZX-Masters, discussing its features and improvements since the first demo. The game offers two-player mode, four levels, three types of projectiles, various options, and computer difficulty settings. Availability of Turbo mode and enhanced synchronization and animation make it unique among other Spectrum games.
  • Интервью - Ruster
    Interview with Digital Reality about ongoing projects like DOOM and Paradise Lost. Discussion of challenges and progress in game development. Preview of their submissions for the ENLiGHT event.
  • Интервью - Ruster
    Interview with members of the newly formed group EXTREME. They work on demos for Spectrum and Amiga platforms and discuss their team members and activities. The interview also touches upon the state of the Amiga scene in Moscow.
  • Интервью - Борис Прытков
    Interview with Samara-based Spectrum enthusiasts discussing their achievements and challenges. Emphasis on community building and publication of Oberon magazine. Efforts to establish a Spectrum network and convert the game WALKER.
  • Интервью - Борис Прытков
    The article is an interview with members of the group Flash inc. discussing their projects for ZX Spectrum and PC, including a music editor with an innovative interface and a new multicolor graphic editor.
  • Интервью - Михаил Акимов
    Interview with Moscow-based group Progress discussing their current work on Spectrum demos, plans for future projects on Amiga, and opinions on the Russian demoscene.
  • Интервью - Михаил Акимов
    Interview with Felix about changes in the tech landscape, the enduring appeal of Amiga despite PC dominance, and his work on 'Winnie the Pooh - 2' for Spectrum.
  • Интервью - Ruster
    Interview with Slash about the ENLiGHT event, including sponsorship issues, attendee behavior, and the quality of music and demos. Discussion of the current state of the Spectrum and Amiga markets. Commentary on music trackers and the future of hardware development.
  • Интервью - Ruster
    Interview with V. Mednonogov after ENLiGHT'97 discussing impressions of the event, future of Spectrum, and his current project 'Black Raven'. Mednonogov shares his views on new hardware and software development and the importance of copyright. He also discusses his plans for upcoming projects and the challenges faced in game development.
  • Здесь был ты
    A satirical guide to gaining power and invisibility using magical rituals and Orbit gum.
  • Здесь был ты - Saggitarius
    A contemplative novella about a man's existential journey after encountering a mysterious individual offering a device called the Stop Crane. Through flashbacks, the protagonist reflects on his life, uniqueness, and his desire to break free from societal constraints. Ultimately, he faces the moral dilemma of using the Stop Crane to transcend time and existence.
  • Почта - Eagle Soft
    Critique of ZX-Spectrum software, highlighting the limitations of current programs and recommending the removal of outdated tools. Discussion on the limitations of assembly programs and the need for more efficient assemblers like M80. Evaluation of current music and graphic editors, with a focus on the redundancy of certain applications.
  • Почта
    Discussion of reader inquiries on ZX Format distribution and content. Responses include details on acquiring issues and technical insights on the KAY-256 computer. The magazine also addresses criticism of its market outlook article.
  • Почта
    This advertisement highlights XL Design Inc.'s software distribution campaign, offering games like 'Plutonia' and upcoming releases such as 'Mortal Kombat'. Mouse controllers are promoted with humorous selling points and pricing details. Studio LOGROS provides a wide range of software and peripherals, with options for local and remote purchases.
  • Разное - Александр Сысоев
    The article discusses the creation of an RPG game by the OBERON GROUP, inspired by 'Eye of Beholder'. It describes the game's humorous plot set in a distant galaxy and the battle against invaders on a planet named Agima. The team invites musicians, artists, coders, and scriptwriters for collaboration.
  • Разное - Viator
    The article describes the development of a new graphics editor called STATE OF THE ART for ZX Spectrum, aiming to improve upon existing editors like ART-STUDIO and ARTIST-2. The team AVALON, inspired by feedback from the SPECCY artist community, incorporates features from editors on Amiga and PC, while also addressing specific user requests. Key features include a user-friendly interface, enhanced magnify mode, advanced shape and window manipulation, and optimized performance.
  • Разное
    Discussion on enhancing consumer quality of Spectrum computers without altering their technical specifications. Suggestions include improving existing support, developing platform ideology, and structural changes. The article also touches on the potential of electronic books and their commercial viability.
  • Amiga Club - Максим Петров
    The article describes the author's admiration for the Amiga computer, emphasizing its aesthetic and technical merits compared to other platforms. It explores the author's programming experiences on Amiga, highlighting its efficiency and the impressive capabilities of its new hardware upgrades. The article concludes by reflecting on the unique community and passion of Amiga enthusiasts.