Rush #01: Spectrum Programming: Sound Effects with AY Chip

(C)1997-99, A.Bezugly (Ticklish Jim/BIS/Rush)

SOUND EFFECTS FOR THE MUSIC PROCESSOR AND THEIR COMBINATION WITH THE MAIN MELODY

So, the music processor... Gone are the days when people were satisfied with the unpretentious beeping of the SPECCY speaker during gameplay. Now, anyone who writes their own game necessarily includes music in it. Naturally, for the AY. Some go further and support LPT COVOX, SOUNDRIVE, GENERAL SOUND... Some have better music, some worse, but that's not the point - nowadays, a program without musical accompaniment for AY is at least surprising. However, music is music, but sometimes it's just not enough. It would be nice to hear the hero's footsteps or the dripping of water, for example, but you only hear some drawn-out melody (it's good if the music can be turned off). But suddenly you do hear the coveted rustle of the wind and... You notice that there is a dead silence around, which even your footsteps cannot liven up. This inevitably reminds you of the unmatched series of games about DIZZY, where sounds clearly break through the music... on the beeper speaker. In general, wherever you throw it, there's a wedge. Yes, occasionally there are programs where sound effects are output in parallel with the music, but such examples are quite rare.

I hope this article will help someone in writing their own little game. I do not claim to have the ultimate truth; moreover, I am sure that someone has solved/ will solve this problem more elegantly than I have, but still...

During the work on "CSC: Deja Vu," at a certain point, the question of the musical accompaniment of the game arose. Remembering the public's reaction to the absence of AY music in CSC-1 (by the way, there is already a version for machines with 128K of RAM. Moreover, the music plays both in the menu and during the game), it was unanimously decided to give the new game sound. After a while, it became clear that just music was not enough. Panda quickly whipped up a dozen effects and... Work came to a standstill. No one knew how to combine music and effects. All attempts ended in failure - hissing, crackling, and nothing more. Even working with specially written two-channel music yielded nothing. Although there's nothing to be surprised about: Panda writes music, but that's it, and I am completely far from this matter. One way or another, the question of effects was postponed indefinitely. Moreover, somewhere at the end of May '97, work on the game stopped. The reason was my own and no one else's glitches. Somewhere in the middle of autumn 1997, I visited Sevastopol, where I met Dismaster and Squizer (not to mention the SMASH gang). At that time, I started thinking again about continuing work on CSC (by that time, the AUTOMASK program had emerged, but my computer broke down), so I took the opportunity and agreed with Dismaster about a special player for music and special effects. I agreed, left... Three months passed... Dis probably forgot everything (I, however, am also not good, as I never got around to writing a letter to either Squizer or Dis), and no one thought to respond to the call of the Mighty Hacker. In short, there was no one to expect help from, so I had to tackle this problem myself.

Below is an example of a small program that I have provided with exhaustive comments, in my opinion. I think it won't be too difficult to figure out what is what. Yes, before I forget - my program is designed for sound effects to be output on channel 'B', and the music is two-channel. Of course, you can remove the latter limitation, but then you will have to sacrifice the sound clarity of the special effect and put up with the overlap that will inevitably arise. But everyone does it their own way, so see for yourself. The literature I used while figuring out how to work with the AY is scant: ZX-REVIEW #5'95 and the unforgettable "ZX-SPECTRUM and TR-DOS for Users and Programmers" by A.Larchenko and N.Rodionov.

At the very beginning, it is necessary to find out the number of notes (I am not a specialist, so I admit that some terms may be used incorrectly, however, the essence is the main thing) in the special effect. For this, I personally use the following primitive program in Basic:

10 RANDOMIZE USR 49152: LET A=65533: LET B=0: REM The sound effect is written in ProTracker and unloaded to disk at address 49152 20 RANDOMIZE USR 49158: LET B=B+1: OUT A,9: PRINT AT 0,0;"Volume of channel B=";IN A;" "';"Current note number=";B;" ": REM This line reads the volume information for channel B; a 0 on the screen and silence in the speaker indicate the end of the sound; the number B is the length LEN that will be discussed below. 30 PAUSE 0: IF INKEY$ "q" AND INKEY$ "Q" THEN GOTO 20: REM This line is necessary for step-by-step execution of the special effect.

Having calculated the length (number B), you can move on to the Assembly procedures. Load the FX file (you can skip loading if the computer's memory was not cleared after running the Basic program) with the required effect and sequentially execute the MAKE and PACKER subroutines. The first is necessary to create an array of data for the music processor registers in memory, and the second is for a small optimization of this array (the optimization is incomplete, as you can gain another byte with each note). After that, save the ready data block from the address pointed to by the SOUND variable (40000), with a length of LEN*4 (packed, although, as mentioned above, LEN*3 is also possible). Now you can move on to the demonstration itself. I think no one needs to be explained how to set music on interrupts. But before initializing the player, it is necessary to make some small changes to it. For this, you need to transfer the TO_PLAYER block to an address equal to music_load_address+1351 (for the player from PT2.1). The block length is 97 bytes. Someone may wonder: "Why completely remove the processing of an entire channel from the player when it's already empty?!" As a response, I can only suggest trying NOT to make changes to the player - listen and compare. Alright, we sorted that out. Now a few words about the program responsible for playing the special effect. I made it so that the sound is output on the AY when the FIRE button is pressed on the joystick (by the way, to exit the program, you need to press UP, DOWN, LEFT, RIGHT simultaneously on the same joystick). Of course, in the game you will have to add a procedure for selecting the desired sound, etc. But in this case, this is not required, so we assume that there is only one SFX that should sound when a certain key is pressed and not be interrupted until the last note sounds. It is quite natural that the SFX note should sound after the composition note, i.e., once per interrupt. In general, see the comments, as the actual description of my program has come to an end.

(C)1998, T.J.

MUS ORG 49152 ; .INCBIN MUSIC ORG 40000 ; .INCBIN fx2 ; ;PACK LENGTH=136 bytes

EFFECT ORG 49152 ; .INCBIN FX ; ;PT-module WITH SFX

FXBUF EQU 32768

ORG 25000
JR BEGIN
;PLAY MUSIC & SFX

CALL MAKE
;MAKE SOUND FX ;WORK WITH FILE AS LOADED AT ;"EFFECT"-ADDRESS
JP PACKER
;PACK SOUND FX

BEGIN DI
LD HL,TO_PLAYER
LD DE,MUS+1351
LD BC,97
LDIR
;Made changes to the melody player
LD A,#25
LD I,A
IM 2
LD A,195
LD HL,IMMER
LD (23670),A
LD (23671),HL
;Enabled interrupts of the second kind
CALL MUS
;Initialized the player
EI
HALT
M1 XOR A
IN A,(31)
CP 15
JR Z,EXIT
;If all 4 joystick buttons are pressed, ;go to the program exit procedure
CP 16
JR NZ,M1
;If the FIRE button is not pressed, ;return to the beginning of the cycle
LD A,1
LD (SND_PR),A
;Selected SFX number
K1 CALL NASTR
;Specified parameters for this SFX ;(data array address and SFX length)
LD A,#3A
LD (K1),A
;Blocked the call of the parameter update procedure ;so that the SFX plays to the end before ;the next SFX can play ;(of course, the blocking could be done more elegantly, but I repeat, in this case ;it doesn't matter, so I am satisfied with turning CALL NASTR into ;LD A,(NASTR)) and returned to the beginning of the cycle.
JR M1

;Procedure for stopping the demo program. ;Before exiting, the interrupts of the first kind are set, ;the music player is turned off, ;the SFX channel is muted, and a return to ;the main program.

EXIT DI
LD A,#3F
LD I,A
IM 1
CALL MUS ;MUSIC OFF
LD BC,65533
LD A,9
OUT (C),A
XOR A
LD B,#BF ;CHANNEL 'B' OFF
OUT (C),A
EI
RET

;Interrupt handling procedure. I hope, ;there's no need for explanation

IMMER DI
PUSH HL
PUSH DE
PUSH BC
PUSH AF
EX AF,AF'
PUSH AF
EXX
PUSH HL
PUSH DE
PUSH BC
EXX
PUSH IX
PUSH IY
CALL MUS+6
;Call the SFX player
CALL PLR
POP IY
POP IX
EXX
POP BC
POP DE
POP HL
EXX
POP AF
EX AF,AF'
POP AF
POP BC
POP DE
POP HL
EI
RET

SOUND DEFW 40000
SND_PR DEFB 0
LEN DEFB 8 ;LENGTH OF SFX (/4)

;PLAYER FOR SOUND FX ;WORK ONLY WITH CHANNEL 'B'!!!

;Player for SFX.

PLR LD A,(SND_PR)
OR A
RET Z
;Return if 0 is at SND_PR, i.e., no SFX is selected
ADR_SND LD HL,40000
;In HL, the address of the start of SFX ;(set by NASTR)
LD DE,#BFFF
LD A,80
;In A, the length of SFX (also set by ;NASTR)
X3 EX AF,AF'
;Next, output data to registers ;co-processor 2,3,6,7, and 9, ;with data for 3 and 9 unpacked ;from one byte
LD C,253
LD B,E
LD A,2
;SELECT CHANNEL 'B'
OUT (C),A
LD A,(HL)
LD B,D
OUT (C),A
INC HL
LD A,6
LD B,E
OUT (C),A
LD A,(HL)
LD B,D
OUT (C),A
INC HL
LD A,7
LD B,E
OUT (C),A
IN A,(C)
;OLD CONSEQUENCE
OR (HL)
;ADD NEW & OLD
;These two lines were needed so that our SFX would not mute ;the other channels used for outputting the main melody
LD B,D
OUT (C),A
INC HL
LD A,3 ;SEL. CH. 'B'
LD B,E
OUT (C),A
LD A,(HL)
RRA
RRA
RRA
RRA
AND #0F
;The value for R3 was saved in the upper ;nibble
LD B,D
OUT (C),A
LD A,9
;VOLUME OF CH 'B'
LD B,E
OUT (C),A
LD A,(HL)
AND #0F
;WITHOUT 4th BIT! (envelope) ;The value for R9 was saved ;in the lower nibble
LD B,D
OUT (C),A
INC HL
EX AF,AF'
DEC A
LD (SND_PR),A
;Until the SFX sounds completely, ;the variable will not be reset.
JR NZ,HLP
;ONLY FOR INTERRUPTS
;Adjust the address and length values of the SFX ;for the next note, ;which will sound in the next ;interrupt
LD A,#CD
LD (K1),A
;At the end of the SFX, it is necessary ;to restore the call to the parameter selection procedure for the next SFX (CALL NASTR)
RET
NASTR LD A,(LEN)
LD HL,(SOUND)
HLP LD (X3-1),A
LD (ADR_SND+1),HL
RET
;The TABL table contains a list of registers ;AY used by my program. ;Since we have only allocated channel B for effects, we only need ;registers 2,3 (pure and rough tone ;respectively), 6 (noise), 7 (mixer) ;and 9 (volume for B). ;I did not use registers 11,12, and 13 ;(frequency and envelope type) ;for memory saving purposes, but anyone who wishes can easily modify my ;program to their liking (although, as ;practice shows, when creating musical ;sound effects without an envelope, one can do just fine), one should not forget that this ;is just a basic example of working with ;sound. ;This table is only used by the MAKE and PACK procedures.

TABL DEFB 2,6,7,3,9
DEFB 255

;Subroutine for creating a data array.

MAKE CALL EFFECT
;Initialized the player
LD IX,FXBUF
;In IX, we enter the buffer address
LD A,(LEN)
LD B,A
;In B - the number of notes
M11 PUSH BC
PUSH IX
CALL EFFECT+6
;Played the note
POP IX
LD HL,TABL
M3 LD BC,65533
LD A,(HL)
CP 255
JR Z,M2
OUT (C),A
IN A,(C)
;Read data from the required register
LD (IX+0),A
;Entered into the buffer
INC HL
INC IX
JR M3
M2 POP BC
DJNZ M11 ;Repeat
CALL EFFECT
;Turned off the player
RET

;Subroutine for packing the data array

PACKER LD IX,FXBUF
;In IX the address of the buffer
LD HL,(SOUND)
;In HL the address from which the packed block will be located
LD A,(LEN)
LD B,A
;In B - the number of notes
L1 LD A,(IX+0)
LD (HL),A ;R2
INC HL
LD A,(IX+1)
LD (HL),A ;R6
INC HL
LD A,(IX+2)
LD (HL),A ;R7
INC HL
LD A,(IX+3)
AND #0F
RLA
RLA
RLA
RLA
LD C,A
LD A,(IX+4)
AND #0F
OR C
LD (HL),A ;R3+R9
INC HL
;Instead of 5 bytes for one note, we got 4. ;The total length of the ready block is LEN*4. ;If we use an envelope, then ;we will have to give up ;combining R3 and R9 (since in register 9 ;it will be necessary to account for the 4th bit, ;although R3 and R13 can be combined - ;both use only the lower 4 bits.)
LD DE,5
ADD IX,DE
DJNZ L1 ;Repeat the cycle
RET

;CHANGES FOR ProTracker2.1 PLAYER ;ADDRESS=LOAD_ADR+1351 ;(for PT2.1 by Golden Disk) ; =LOAD_ADR+1857 ;(for PT2.4 by GD & Fantom Family) ;LENGTH=97 bytes ;CHANNEL 'B' NOT USED!!! IT'S ONLY FOR SOUND FX!!!

;New block for the player

TO_PLAYER LD B,D
OUT (C),A ;R13
LD B,E
OUTD
DEC A
LD B,D
OUT (C),A ;R12
LD B,E
OUTD
DEC A
LD B,D
OUT (C),A ;R11
LD B,E
OUTD
DEC A
LD B,D
OUT (C),A ;R10
; (VOLUME 'C')
LD B,E
OUTD
DEC A
;(VOLUME 'B')!!!
DEC HL
;The previous two lines guarantee that ;no data from this ;composition will be output to ;channel B.
DEC A
LD B,D
OUT (C),A ;R8
; (VOLUME 'A')
LD B,E
OUTD
DEC A
LD B,D
OUT (C),A ;R7
; (MIXER!!!)
LD B,E
;And here we make it so that ;our own parameters for ;channel B find their way to the listener ;(reset bits 1 and 4, i.e., ;allow tone and noise output for ;channel B)
LD A,(HL)
AND #2D ;!!!
; (FOR 'B')
LD (HL),A
OUTD
LD A,6
LD B,D
OUT (C),A ;R6
LD B,E
OUTD
DEC A
LD B,D
OUT (C),A ;R5
LD B,E
OUTD
DEC A
LD B,D
OUT (C),A ;R4
LD B,E
OUTD
;Adjust the Accumulator so that it contains 1. ;This is necessary to avoid outputting data intended ;by the executed composition ;to the registers of pure and rough tone of channel B.
SUB 3
DEC HL ;R3
; (FOR 'B'!!!)
DEC HL ;R2
LD B,D
OUT (C),A ;R1
LD B,E
OUTD
DEC A
LD B,D
OUT (C),A ;R0
LD B,E
OUTD
DEFS 11
;The last line is necessary to ;pad the block to 97 bytes.

For the new version of the PT3.31 editor by Golden Disk, changes are made at LOAD_ADR+1825:

AND 45
;turn off channel "B"
OUT (C),A
INC L
LD B,D
OUT (C),L
LD B,E
OUTI
INC L
DEFS 3

I think it will not be difficult to figure out. I just want to note that this method of combining music and effects is, in my opinion, the simplest, as it uses a traditional player and a small procedure for outputting sound to the channel. The most complex part is the actual sound creation. More precisely, creating it is quite simple - in the same editor, but relatively difficult to then obtain the data. Maybe it's just for me; I won't argue. Yes, if someone wrote a decent program, I would be very happy, but in the absence of better... Perhaps someone has similar software, but I haven't come across it. Mostly, as I understand, authors either write their own players for melodies and effects (for example, the guys from BITMUNCHERS did this in their game KLIDEMINER), or they wildly distort the standard ones (the demo version of MARIO BROS from OMEGA HACKERS). I don't know how Slava Mednonogov does it - I didn't set out to find out. In any case, I have shared what I wanted, as I have yet to see an article dedicated to this topic. Again, either everyone knows everything, or everyone doesn't care. This material, at one time, suffered the same fate as the article on AUTOMASK. I hope that at least now, two years later, someone will read this and apply it in practice.

Contents of the publication: Rush #01

  • AMIGA NEWS
    Amiga Inc works on Amiga OS 3.5 with enhancements like CD drive and PowerPC support. Split development for M68K and PPC processors. Delayed release to late 1999 or early 2000.
  • AMIGA NEWS
    Description of the 'Fast JPEG 1.10' viewer for Amiga, focusing on its features, installation, and usage. It highlights advantages like fast processing without quality loss and provides user tips. Readers are encouraged to share their software experiences.
  • AMIGA NEWS
    Basic programming for classic Amiga, discussing challenges and sharing knowledge in Amiga coding. Overview of Amiga graphics capabilities and processor features. Introduction to Amiga assembly language specifics.
  • AMIGA NEWS
    Overview of events related to the Amiga platform from early to mid-1998. Highlights include new hardware, software releases, and notable company collaborations. Future updates and developments are scheduled for the next issue.
  • AMIGA NEWS
    Collection of cheats and secrets for classic Amiga games compiled by Postcard Man. Readers encouraged to share their findings on complex games. Selection of tips and level codes provided for various games.
  • AMIGA NEWS
    Discussion of Phase-5's graphics cards and Permedia 2 processor capabilities. Details on Permedia 2's 2D/3D acceleration and compatibility. Mention of GLINT Delta processors and comparison of prices and availability.
  • AMIGA NEWS
    Analysis of Amiga's survival in the 90s, highlighting community efforts and technological advancements. Discussion on hardware improvements and software development. Encouragement for further exploration and learning about the Amiga platform.
  • Spectrum Programming
    Explanation of a fast method for real-time 3D graphics on the ZX Spectrum. Introduces efficient rotation and deformation techniques for 3D objects. Emphasizes improvements over traditional methods with practical examples.
  • Spectrum Programming - Ticklish Jim
    Discussion of combining sound effects with music for Spectrum's AY chip. Examples from development of 'CSC: Deja Vu' and technical challenges faced. Contains practical guide and code examples.
  • Spectrum Programming
    Discussion on byte mirroring and background restoration in ZX Spectrum programming, with examples.
  • Spectrum Programming
    Comprehensive guide for system programmers with practical tips for creating efficient and user-friendly software, including coding techniques, device compatibility, and program testing strategies.
  • Spectrum Programming
    Advanced coding techniques and modern graphics methods for ZX Spectrum. Tips for optimizing graphical procedures and coding on assembly. Useful advice for programmers to improve performance and efficiency.
  • The End
    Reflections on the creation of the first issue of the magazine 'Rush', its goals, audience, and future development.
  • ZX-SOFT - Вячеслав Медноногов
    Development updates on Vyacheslav Mednoy's new game 'Black Raven II', including gameplay changes, new spell introductions, and performance improvements.
  • ZX-SOFT
    Overview of new features in the updated commander from REAL software for ZX Spectrum, including file management, autodetection, and media viewing. Improvements in text, font, and music handling. Questions addressed regarding future updates.
  • ZX-SOFT
    Debate on which demo deserved the top spot at Funtop'98: Forever by DR or Refresh by XTM. Discussions in the demoscene community highlight the clash between technical prowess and conceptual depth. Different opinions reflect on the evolution of demoscene preferences.
  • Authors
    Acknowledgment of contributors and partners in creating Rush magazine. Detailed roles of each author and collaboration insights. Recognition of technical support and media partnerships.
  • Virtual Specky
    Discussion on converting graphics from PC to Spectrum, featuring insights from various experts. Techniques for improving conversion quality and tools like Photoshop are detailed. Emphasis on post-conversion refinement in Spectrum graphics editors.
  • Virtual Speccy
    Discussion on the CBSpeccy emulator for ZX-Spectrum on Amiga, highlighting its features, community opinions, and technical performance. Criticisms and praises for its emulation capabilities, particularly compared to PC emulators. Examination of potential improvements and community debates around version updates.
  • Virtual Speccy
    FAQ on ZX-Spectrum emulation on PC, covering popular emulators and file formats. Instructions for using different emulators and managing file types like Hobeta and TR-DOS. Discussion on Russian ZX-oriented servers and resources for enthusiasts.
  • Introduction
    Introduction to the Rush magazine, emphasizing creativity, progressive scene, and the goal to create a superior information source. The magazine seeks to gather promising groups and offer a unique perspective. Focuses on content and atmosphere, welcoming creators to contribute.
  • Introduction - Grunge
    Introduction to Rush, a new scenemag for Speccy/Amiga enthusiasts, aims to provide quality content and news while encouraging reader feedback.
  • Interview - Konex
    Interview with ANTARES group after FUNTOP-98. Discussion on their demos, challenges, and future plans. Insight into the group's formation and dynamics.
  • Interview - Kvazar, DUX
    Interview with Alexander Seleznev (KVAZAR), discussing his history with computers, the state of the ZX Spectrum scene, and future plans.
  • Interview - Kvazar
    Interview with Vitebsk group POWER on demo 'Crazy Love', development experiences, and future projects.
  • Informatorium
    Exploration of a CD with emulators for various platforms, highlighting Spectrum. Details the content organization and diversity. Concludes with insights from the CD-ROM Project's Spectrum software collection.
  • Informacrium
    Compilation of interesting and useful Internet addresses related to Amiga resources, including magazines, hardware manufacturers, and software companies.
  • Informacrium - Viator
    Overview of existing and upcoming publications on the Amiga platform. Discussion of the availability and distribution challenges for Amiga literature. Appeal for collaboration with new publications.
  • About the Magazine
    Discussion on creating a multi-platform magazine focusing on Spectrum, Amiga, and PC. Emphasis on broader understanding of computer scene. Encourage professionalism and adaptation to changing technology.
  • Parallel Worlds
    Overview of the evolution of Windows OS and PC processors from 1981 to 2000. Development milestones of MS-DOS, Windows, Intel processors, and competition with AMD and Cyrix. Challenges in maintaining compatibility with new processor technologies.
  • Parallel Worlds
    Overview of Macintosh models and their relevance in design and graphics fields, covering prices and specifications from 1997-1998. Discussion includes the evolution of Apple's hardware, notably the PowerMac series, and compares new G3 processors with PC counterparts. It highlights the resurgence of Macintosh post-crisis and its ongoing influence in the market.
  • Development of the Spectrum - Slider
    The article discusses a new graphical extension for the ZX Spectrum that enhances color palettes without increasing resource demands. By using a modified flash signal, new colors are created without interfering with existing software compatibility. The article provides implementation details and addresses practical usage concerns.
  • Development of Spectrum
    Connecting a CDOS modem to the 'Compact-128' computer by addressing keyboard port conflicts. Description of hardware modifications to solve the issue. Solution includes automatic blocking using a transistor inverter.
  • Development of Spectrum - Ars
    Discussion on AZX-Monstrum 512K development, its hardware compatibility, processor options, and potential enhancements in graphics and OS.
  • Development of SPECTRUM
    Discussion of Clive Sinclair's new computer platform, the ZX2000, designed to outperform PCs with enhanced speed, affordability, and battery efficiency.
  • Development of Spectrum - Андрей Савичев
    Examination of the evolution and ongoing relevance of the Z80 processor, and its role in embedded systems. Comparison of Z80 with its successors, highlighting advantages like energy efficiency and command enhancements. Overview of integrated Z80-based CPUs and their peripherals.
  • Advertisement
    This article is an advertisement for Scorpion products including hardware for ZX Spectrum and Amiga software, along with pricing and ordering details.
  • Advertising
    Collection of advertisements for Amiga and ZX Spectrum hardware and software, with contact information for sellers and details about the new Amiga magazine subscription.
  • Advertisement
    Advertisement for X-TRADE's General Sound music board. Includes pricing, technical details, and purchase instructions. Features a FAQ section and compatibility info.
  • Meaning Without Meaning - Viator
    Philosophical reflections on existentialism, immortality, and human destiny. The narrative weaves through stories of ambition, the quest for eternal life, and a utopian downfall. A blend of introspection and speculative fiction.
  • Scene vs Professionals
    Exploration of the demoscene's creativity versus commercial game development. Discussion of potential for professional-quality programs by scene members. Call for collaboration with leading scene groups.
  • Scene Chronicle - Андрей Савичев
    Reflections on ZX Spectrum's enduring appeal, its community's resilience, and its potential resurgence in Russia.
  • Scene Chronology
    Overview of the Rush group's activities, including past projects, current endeavors, and future plans, with emphasis on software development and gaming.
  • Scene Chronicles
    The article discusses various ZX Spectrum scene news, including game releases, demoparties, and updates from developers and teams.
  • Chronicles of the Scene
    The article discusses the FUNTOP'98 international computer art festival held in Moscow, highlighting key events, notable attendees, and the various competitions held during the event.
  • Scene Chronia
    Discussion on Amiga scene development through collaboration, addressing user isolation and promoting network expansion.
  • Shell Management
    Статья описывает управление оболочкой для ZX Spectrum и Amiga, включая клавиши и функции для навигации. Упоминаются особенности работы на Amiga с PAL монитором и предоставляется контакт для поддержки. Также отмечено, что текстовые файлы имеют стандартную MS-DOS кодировку.