Увеличенный 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
Поделитесь вашим мнением о статье