ZX учебный класс - увеличенная печать BASIC и цифровая запись звука

ZX Revija #02

Увеличенный PRINT из BASIC

Эта статья может стать продолжением материала из ZX REVIJE № 1, автор которого — DADO. Здесь тоже используется команда LPRINT для вывода текста на экран. Я хотел бы подробнее объяснить, как это возможно.

Для начала введите следующую программу:

5 BORDER 1:PAPER 1:INK 7:BRIGHT 1:CLS
10 LET a=64
20 LET a$="ZX REVIJA"
30 FOR i=0 TO 7
40 POKE 23681,a+i:LPRINT a$
50 NEXT i
60 LET a=72
70 LET a$=
80 FOR i=0 TO 7
90 POKE 23681,a+i:LPRINT a$
100 NEXT i
110 LET a=80
120 LET a$="SUBOTA"
130 FOR i=0 TO 7
140 POKE 23681,a+i:

ZX Занимательности

LPRINT a$
150 NEXT i
160 GO TO 160

Вы, вероятно, сразу заметили, что ядро программы составляют две команды: POKE 23681,x и LPRINT a$. В руководстве по Spectrum, в главе о системных переменных, указано, что эта ячейка не используется (NOT USED), но это неверно!

Странно и то, что команда LPRINT выводит текст на экран, хотя это не её назначение. Объяснение очень простое. При инициализации компьютера в ячейку 23681 записывается значение 91. Для ясности взгляните и на ячейку перед ней. В ячейке 23680 хранится младший байт адреса символа в буфере принтера. Если принтер в данный момент не используется, это значение равно нулю.

Если вы до сих пор не поняли, попробуйте рассуждать логически. Вам наверняка знакома формула:

младший байт + 256 × старший байт = адрес

То есть:

0 + 256 × 91 = 23296

Это начало буфера принтера.

Изменив значение в ячейке 23681, вы перемещаете эту область памяти. Если записать в 23681 числа от 64 до 71, первая треть экрана превратится в буфер принтера. Аналогично, при использовании чисел от 72 до 79 и от 80 до 87 начало буфера принтера окажется соответственно во второй и третьей третях экрана. В этом и заключается секрет того, почему команду печати можно использовать для вывода текста на экран.

Но пока непонятно, откуда берётся увеличение размера: программа ничего об этом не говорит. Ответ в том, что байты в буфере принтера хранятся в другом формате.

Вспомните: в этом буфере для 32 символов зарезервировано целых 256 байт памяти. Вот и весь секрет!

И ещё: если в строках 30, 80 и 130 дописать после команды STEP 2, изображение на экране получится ещё интереснее.

Б. Й.

Цифровая запись звука

С помощью приведённой ниже подпрограммы можно записать в память компьютера любой звуковой фрагмент. Для этого сначала нужно записать на кассету то, что вы хотите оцифровать. Включите кассету и, когда дойдёте до нужного места, нажмите ENTER. Подождите, пока компьютер завершит работу. По её окончании появится сообщение OK.

Машинную подпрограмму можно использовать отдельно, без BASIC (и даже по отдельности: она содержит две подпрограммы — для записи и воспроизведения).

BASIC-программа для демонстрации:

1 CLEAR 32767: REM резервирует место для звукового файла
2 PRINT "Цифровая запись звука"
3 PRINT "Запустите кассетный магнитофон"
4 PRINT "В нужном месте нажмите ENTER"
5 RANDOMIZE USR 65290: REM цифровая запись
6 REM для воспроизведения введите:
7 REM RANDOMIZE USR 65318

Подпрограмма очень короткая и размещается начиная с адреса 65290. Перед её использованием обязательно опустите RAMTOP до 32767.

Запустите цифровую запись командой:

RANDOMIZE USR 65290

а воспроизведение — командой:

RANDOMIZE USR 65318
Адрес  Байты       Команда
65290  243         DI
65291  33,0,128    LD HL,32768
65294  6,8         LD B,8
65296  219,254     IN A,(254)
65298  203,119     BIT 6,A
65300  32,2        JR NZ,65304
65302  203,254     SET 7,(HL)
65304  203,62      SRL (HL)
65306  16,244      DJNZ 65296
65308  203,14      RRC (HL)
65310  35          INC HL
65311  124         LD A,H
65312  254,254     CP 254
65314  32,234      JR NZ,65294
65316  251         EI
65317  201         RET

65318  243         DI
65319  33,0,128    LD HL,32768
65322  6,8         LD B,8
65324  203,70      BIT 0,(HL)
65326  40,4        JR NZ,65332
65328  62,0        LD A,0
65330  211,254     OUT (254),A
65332  62,255      LD A,255
65334  211,254     OUT (254),A
65336  203,6       RLC (HL)
65338  16,240      DJNZ 65324
65340  203,6       RLC (HL)
65342  35          INC HL
65343  124         LD A,H
65344  254,254     CP 254
65346  32,230      JR NZ,65322
65348  251         EI
65349  201         RET

Эту подпрограмму можно разместить в памяти с помощью команды DATA или ассемблера.

Материал подготовил:

Brada Jožef
Bajmočka 18
24220 Čantivar

Поделитесь вашим мнением о статье