ЧИТАТЕЛЬ-ЧИТАТЕЛЮ
Читатель-читателю - нестандартный загрузчик со счётчиком.
A
(#FC1A),A IX,#FC21 DE,#0011 A
#FC8A NC,#FE81 #FE0F A,#01 (#FC1A),A IX,(#FC2E) DE,(#FC2C) A, #FF
#FE81
XOR
LD
LD
LD
XOR
SCF
CALL
JR
CALL
LD
LD
LD
LD
LD
SCF
CALL
JR
EI
RET
3P
#FC8A NC,#FEAC
#FEAC
#053F
Загрузка блока кодов без заголовка осуществляется нестандартной процедурой по адресу #FC8A. При первом ее вызове считывается хэдер в адрес #FC21. При следующем - загружается массив кодов. Эта процедура (#FC8A) похожа на процедуру загрузки ПЗУ LDJBYTES, (#0556 или 01366), но есть определенные различия.
LD-BYTES
INC D
EX AF,AF'
FC8A FC8B FC8C FC8D
DEC D DI
FC8E FC8F FC91
FC92 FC94 FC96 FC98 FC99 FC9B FC9D FC9E FC9F FCA0 FCA3 FCA5 FCA8 FCAA FCAB FCAC FCAD'
Далее, для того, чтобы при загрузке хэдера не включался счетчик, введены строки:
Далее опять
LD-BREAK LD-START
LD-WAIT
|
EXX | |
|
LD |
c,#oo |
|
EXX | |
|
аналогично ПЗУ: | |
|
LD |
A, #0A |
|
OUT |
(#FE),A |
|
IN |
A,(#FE) |
|
RRA | |
|
AND |
#20 |
|
OR |
#00 |
|
LD |
C,A |
|
CP |
A |
|
RET |
NZ |
|
CALL |
LD-EDGE-1 |
|
OR |
NC,LD-BREAK |
|
LD |
HL-, #0415 |
|
DJNZ |
LD-WAIT |
|
DEC |
HL |
|
LD |
A,H |
|
OR |
L |
|
aR |
NZ,LD-WAIT |
|
FCAF |
CALL |
LD-EDGE-2 |
FD09 |
CP |
В | |
|
FCB2 |
JR |
NC,LD-BREAK |
FDOA |
RL |
L | |
|
FCB4 |
LD-LEADER |
LD |
B,#9C |
FDOC |
LD |
в,#во |
|
FCB6 |
CALL |
LD-EDGE-2 |
FDOE |
JP |
NC,LD-8-BITS | |
|
FCB9 |
JR |
NC,LD-BREAK |
FD11 |
LD |
А,Н | |
|
FCBB |
LD |
A,#C6 |
FD12 |
XOR |
L | |
|
FCBD |
CP |
В |
FD13 |
LD |
Н,А | |
|
FCBE |
JR |
NC,LD-START |
FD14 |
LD |
A,D | |
|
FCCO |
INC |
H |
FD15 |
OR |
Е | |
|
FCC1 |
JR |
NZ,LD-LEADER |
FD16 |
JR |
NZ,LD-LOOP | |
|
FCC3 |
LD-SYNC |
LD |
B,#C9 |
FD18 |
LD |
A,H |
|
FCC5 |
CALL |
LD-EDGE-1 |
FD19 |
CP |
#01 | |
|
FCC8 |
JR |
NC,LD-BREAK |
FD1B |
RET | ||
|
FCCA |
LD |
А,В | ||||
|
FCCB |
CP |
#D4 |
Программы LD-EDGE- |
-2 И LD-ED- | ||
|
FCCD |
JR |
NC,LD-SYNC |
GE-1 |
изменены следующим образом: | ||
FCCF CALL LD-EDGE-1
|
FCD2 |
RET |
NC |
FD1C LD-EDGE- |
2 CALL LD-EDGE-1 | |||
|
FD1F |
RET |
NC | |||||
|
Опять. |
, ДЛЯ |
того |
, чтобы при |
FD20 LD-EDGE- |
1 JP |
PICTO | |
|
загрузке |
хэдера не включался |
FD23 |
INC |
B | |||
|
счетчик, |
поставлен выключатель: |
FD24 |
RET |
z | |||
|
FD25 |
LD- |
A, #7F | |||||
|
FCD3 |
EXX |
FD27 |
IN |
A,(#FE) | |||
|
FCD4 |
LD |
A,(#FC1A) |
FD29 |
RRA | |||
|
FCD7 |
LD |
С,A |
FD2A |
RET |
NC | ||
|
FCD8 |
LD |
(#FC1F),A |
FD2B |
XOR |
С | ||
|
FCDB |
EXX |
FD2C FD2E |
AND JR |
#20 Z,LD-SAMPLE | |||
|
Далее |
- аналогично ПЗУ: | ||||||
|
Описание работы LD-SAMPLE так | |||||||
|
FCDC |
LD |
H,#00 |
же можно найти |
в указанном ZX-PE- | |||
|
FCDE |
LD |
B,#B0 |
ВЮ. Отличия: | ||||
|
FCEO |
JR |
LD-MARKER | |||||
|
FCE2 |
LD- |
-LOOP |
EX |
AF,AF' |
FD30 |
LD |
А,С |
|
FCE3 |
JR |
NZ,LD-FLAG |
FD31 |
CPL | |||
|
FCE5 |
JR |
NC,LD-VERIFY |
FD32 |
LD |
С,A | ||
|
FCE7 |
LD |
(IX+0),L |
FD33 |
LD |
(#5AFE),A | ||
|
FCEA |
JR |
LD-NEXT |
FD36 |
LD |
(#5AFF),A | ||
|
FCEC |
LD- |
-FLAG |
RL |
С | |||
|
FCEE |
XOR |
L |
- если в отведенное время фронт | ||||
|
FCEF |
RET |
NZ |
импульса найден, |
инвертируются | |||
|
FCFO |
LD |
А,С |
все биты на противоположные и вы | ||||
|
FCF1 |
RRA |
дается значение аккумулятора в | |||||
|
FCF2 |
LD |
С,A |
две последние |
ячейки атрибутов. | |||
|
FCF3 |
INC |
DE |
Это приводит к |
тому, |
что при заг- | ||
|
FCF4 |
JR |
LD-DEC |
руэке в двух ' |
последних знакомее- | |||
|
FCF6 |
LD- |
•VERIFY |
LD |
A, (IX+0) |
тах можно наблюдать |
полосы, ана- | |
|
FCF9 |
XOR |
L |
логичные бордюрным |
(сам бордюр | |||
|
FCFA |
RET |
NZ |
при загрузке остается черным). | ||||
|
FCFB |
LD-NEXT |
INC |
IX |
Далее: | |||
|
FCFD |
LD- |
•DEC |
DEC |
DE | |||
|
FCFE |
EX |
AF,AF' |
FD39 |
SCF | |||
|
FCFF |
LD |
B,#B2 |
FD3A |
RET | |||
|
FD01 |
LD- |
•MARKER |
LD |
L, #01 |
FD3B PICTO |
EXX | |
|
FD03 |
LD- |
•8-BITS |
CALL |
LD-EDGE-2 |
FD3C |
LD |
А,С |
|
FD06 |
RET |
NC |
FD3D |
OR |
А | ||
|
FD07 |
LD |
A,#CB |
FD3E |
JR |
Z,LD-DELAY | ||
ЧИТАТЕЛЬ-ЧИТАТЕЛЮ
- если в С ноль, то счетчик не включать. Иначе - проверка положения счетчика:
LD HL,#FC1F
DEC (HL)
LD A,(HL)
JR Z,SHET
FD47 FD49 FD4B
СР OR LD
Далее происходит включение атрибутов счетчика, а в HL - адрес счетчика в таблице:
#05
NC,ATT-R HL,#FC1B
FD70 FD71 FD72 FD73 FD74 FD75 FD76 FD77 FD78 FD79 FD7A FD7B FD7C FD7D
INC
INC
LD
LD
INC
INC
LD
LD
INC
INC
LD
LD
EXX
JP
FD40 FD43 FD44 FD45
E H
A,(DE) (HL),A E H
A,(DE) (HL),A E H
A,(DE) (HL),A
LD-SAMPLE
Далее - фрагмент осуществляю-
|
Теперь |
переход |
на адреса в |
сора: | |||
|
дисплейном файле: | ||||||
|
FD80 |
LD-DELAY |
LD |
B, #17 | |||
|
FD4E |
INC |
(HL) |
FD82 |
WAIT-1 |
DJNZ |
WAIT-1 |
|
FD4F |
INC |
L |
FD84 |
LD |
A,#00 | |
|
FD50 |
INC |
L |
FD86 |
NEG | ||
|
FD51 |
DEC |
(HL) |
FD88 |
AND |
A | |
|
FD52 |
LD |
HL,(#FC1B) |
FD89 FD8A |
EXX JP |
LD-SAMPLE | |
Дальнейшая часть вычисляет адрес печатаемой цифры:
Затем - установка атрибутов знакоместах счетчика:
FD55
LD A,(HL)
|
FD56 |
ADD |
A,#32 |
FD8D |
ATT-R |
LD |
A,#47 |
|
FD58 |
LD |
E,A |
FD8F |
LD |
(#5AFA),A | |
|
FD59 |
LD |
D,#FC |
FD92 |
LD |
(#5AFB),A | |
|
FD95 |
LD |
(#5AFC),A | ||||
|
Следующий фрагмент рисует шаб |
FD98 |
LD |
(*5AFD),A | |||
|
лон, лежащий в |
таблице по адресам |
FD9B |
INC |
HL | ||
|
#FC32 - #FC89: |
FD9C |
INC |
HL | |||
|
FD9D |
LD |
B,#0D | ||||
|
FD5B |
LD |
HL,(#FC1D) |
FD9F |
JP |
WAIT-1 | |
|
FD5E |
LD |
A,(DE) | ||||
|
FD5F |
LD |
(HL),A |
Далее следует процедура SHET | |||
|
FD60 |
INC |
E | ||||
|
FD61 |
INC |
H |
FDA2 |
SHET |
LD |
B,#4F |
|
FD62 |
LD |
A,(DE) |
FDA4 |
LD |
DE,(#FC16) | |
|
FD63 |
LD |
(HL),A |
FDA8 |
LD |
HL,(#FC18) | |
|
FD64 |
INC |
E |
FDAB |
DEC |
E | |
|
FD65 |
INC |
H |
FDAC |
JP |
P,DES | |
|
FD66 |
LD |
A,(DE) |
FDAF |
LD |
E,B | |
|
FD67 |
LD |
(HL),A |
FDBO |
DEC |
D | |
|
FD68 |
INC |
E |
FDB1 |
LD |
B, #05 | |
|
FD69 |
INC |
H |
FDB3 |
WAIT-2 |
DJNZ |
WAIT-2 |
|
FD6A |
LD |
A,(DE) |
FDB5 |
LD |
A,(HL) | |
|
FD6B |
LD |
(HL),A |
FDB6 |
JP |
END | |
|
FD6C |
INC |
E |
FDB9 |
DES |
LD |
A,D |
|
FD6D |
INC |
H |
FDBA |
AND |
#07 | |
|
FD6E |
LD |
A,(DE) |
FDBC |
JP |
Z,SOT-l | |
|
FD6F |
LD |
(HL),A |
FDBF |
DEC |
D | |
ЧИТАТЕЛЬ-ЧИТАТЕЛЮ
1
Алгоритм работы процедуры SHBT.

|
FDCO |
JP |
P,SOT-2 |
Регистр DE |
также |
загружается | |
|
FDC3 |
LD |
D,B |
из таблицы, |
а, в ВС - заносится | ||
|
FDC4 |
DEC |
L |
число, соответствующее Десятично | |||
|
FDC5 |
LD |
А,(#8000) |
му 1000: | |||
|
FDC8 |
LD |
А,(#8000) | ||||
|
FDCB |
LD |
А,(#8000) |
FE1A |
LD |
DE,#FC19 | |
|
FDCE |
OP |
END |
FE1D LOOP-2 |
LD |
A, #FF | |
|
FDD1 |
SOT-1 |
LD |
A,(HL) |
FE1F |
LD |
ВС,#03Е8 |
|
FD02 |
LD |
A,(HL) | ||||
|
FDD3 |
SOT-2 |
LD |
A,L |
Повтором получаем |
В А 0, 1,2 | |
|
FDD 4 |
AND |
#07 |
и т.д.: | |||
|
FDD6 |
JP |
Z,HANDR-1 | ||||
|
FDD9 |
DEC |
L |
FE22 LOOP-1 |
INC |
А | |
|
FDDA |
JP |
P,HANDR-2 |
FE23 |
OR |
А | |
|
FDDD |
LD |
L,B |
FE24 |
SBC |
HL,BC | |
|
FDDE |
DEC |
H |
FE26 |
JR |
NC,LOOP-1 | |
|
FDDF |
NEG | |||||
|
FDE1 |
JP |
END |
После сложения и |
умножения на | ||
|
FDfi4 |
HANDR- |
1 LD |
A,(HL) |
8, кладем это |
значение в таблицу: | |
|
FDE5 |
LD |
A,(HL) | ||||
|
FDE6 |
HANDR- |
2 LD |
A,H |
FE28 |
ADD |
HL,BC |
|
FDE7 |
AND |
#07 |
FE29 |
ADD |
А,А | |
|
FDE9 |
JR |
Z,END |
FE2A |
ADD |
А,А | |
|
FDEB |
DEC |
H |
FE2B |
ADD |
А,А | |
|
FDEC |
END |
LD |
(#FC16), DE |
FE2C |
LD |
(DE),А |
|
FDFO |
LD |
(#FC18),HL | ||||
|
FDF3 |
LD |
HL,#FC15 |
Умножаем HL на 10: | |||
|
FDF6 |
LD |
(#FC1B),HL | ||||
|
FDF9 |
LD |
HL,#50FE |
FE2D |
LD |
C,L | |
|
FDFC |
LD |
(#FC1D),HL |
FE2E |
LD |
В,Н | |
|
FDFF |
LD |
A, #40 |
FE2F |
ADD |
HL,ftL | |
|
FE01 |
LD |
(#FC1F),A |
FE30 |
ADD |
HL,HL | |
|
FE04 |
NEG |
FE31 |
ADD |
HL,BC | ||
|
FE06 |
NEG |
FE32 |
ADD |
HL,HL | ||
|
FE08 |
NEG | |||||
|
FEOA |
AND |
A |
Переход к |
следующей ячейке и | ||
|
FEOB |
EXX |
повтор, если не конец: | ||||
|
FEOC |
JP |
LD-SAMPLE |
FE33 |
DEC |
DE | |
|
В приведенной процедуре SHET |
FE34 |
LD |
A, E | |||
|
настолько точно просчитаны такты |
FE35 |
CP |
#15 | |||
|
выполнения, |
что она работает не |
FE37 |
JR |
NZ,LOOP-2 | ||
|
хуже |
процедуры ПЗУ. |
Если просчи- |
FE39 |
RET | ||
|
тать |
все ветви выхода программы, | |||||
|
то будет 358 |
тактов. |
Чтобы сменить цифру в счетчи | ||||
|
Расчет значений счетчика про |
ке , обозначающую 1 |
байт, надо | ||||
|
изводится следующим образом. Дли |
сделать 32 вызова процедуры рас | |||||
|
на программы |
в HL |
берется из |
чета значения |
счетчика. | ||
|
считанного в |
таблицу хэдера, за- |
С началом |
загрузки программой | |||
|
тем это значение делится на 32: |
блока кодов включаются атрибуты в | |||||
|
правом нижнем |
углу, |
затем с каж- | ||||
|
FE0F |
LD |
HL,(#FC2C) |
дым вызовом |
процедуры LD-EDGE | ||
|
FE12 |
WAIT-3 |
LD |
В,#05 |
происходит смена положения счет | ||
|
FE14 |
SRL |
Н |
чика. Так происходит |
до тех пор, | ||
|
FE16 |
RR |
L |
пока блок кодов не загрузится и в | |||
|
FE18 |
DJNZ |
WAIT-3 |
счетчике не будет "0000". | |||
ЧИТАТЕЛЬ-ЧИТАТЕЛЮ
Коменщцрий ЦЦфОЮОШ.
Загрузчик со счетчиком, который привел Сергей Штурхолев иногда встречается в западных программах, правда, при внимательном анализе листинга видны некоторые изиенения, однако они непринципиальны. Нам, в частности, при подготовке материала к печати, попалась под руку игра "GUN RUNNER", снабженная таким загрузчикои.
Теория - дело хорошее, но пос-мотрии, как же можно использовать такой загрузчик на практике. Основная процедура загрузчика расположена с адреса #FE81. Мы же для получения более компактного блока расположин эту процедуру с адреса #FE3A. Эту процедуру с успехом можно использовать вместо LOAD ""CODE, выполняя вместо него RANDOMIZE USR ADR и придавая, таким образом, "определенный вес" своей програнне. Правда при этой необходимо соблюсти некоторые моменты, о которых мы и хотим рассказать. Прежде всего - сама основная процедура #FE3A (сравните с листингои в начале статьи):
|
FE3A |
XOR |
A |
|
FE3B |
LD |
(#FC1A),A |
|
FE3E |
LD |
IX,#FC21 |
|
FE42 |
LD |
DE,#0011 |
|
FE45 |
XOR |
A |
|
FE46 |
SCF | |
|
FE47 |
CALL |
#FC8A |
|
FE4A |
JR |
NC,#FE66 |
|
FE4C |
CALL |
#FE0F |
|
FE4F |
LD |
A,#01 |
|
FE51 |
LD |
(#FC1A),A |
|
FE54 |
LD |
IX,(#FC2E) |
|
FE58 |
LD |
DE,(#FC2C) |
|
FE5C |
LD |
A, #FF |
|
FE5E |
SCF | |
|
FE5F |
CALL |
#FC8A |
|
FE62 |
JR |
NC,#FE66 |
|
FE64 |
EI | |
|
FE65 |
RET | |
|
FE66 |
JP |
#0806 |
После первого вызова подпрограмма #FC8A (считывания хэдера) в случае неудачи програнна переходит на процедуру ПЗУ, вызывающую печать сообщения "Таре loading error". Это происходит через адрес #FE66. В тон варианте, который приведен в статье, управление передается на начало программы, из-за этого блокировалась остановка загрузки нажатием BREAK. Если Ван все же необходиио заблокировать клавишу BREAK при загрузке как хэдера, так и основного блока кодов, можете сделать замену соответственно:
FE4A
JR NC,#FE3A JR NC,#FE3A
FE62
принципиальным моментом является введение перед коиандой RET коианды EI - без нее программа "виснет" при возврате в Бейсик.
Следующий не менее принципиальный иомент - это сохранение на стеке значения регистра HL альтернативного набора перед вызовом процедуры #FE3A. Иначе возврат в Бейсик будет невозиожен. Выполнено это может быть так:
FE69 FE6A FE6B FE6C FE6F FE70 FE71 FE72
ЕХХ
PUSH HL EXX
CALL #FE3A EXX
POP HL
EXX
RET
FC13
JP
Теперь для порядка в начале программы (перед таблицей) поставим:
#FE69
и можно считать, что дело сделано.
Ниже приведен полный даип блока кодов загрузчика со всеии необходимыми подпрограммами, таблицами и прочими вещами. Он начинается с адреса 64531 и имеет длину 608 байт. Вы можете убедиться в той, что он практически не отличается от того варианта, о котором рассказал наш корреспондент.
Теперь в Бейсик-загрузчике любой Вашей программы Вы сможете первой строкой поставить: LOAD ""CODE - загрузится код приведенного загрузчика, а затем каждую следующую команду LOAD ""CODE можно заменить на RANDOMIZE USR 64531. Теперь при загрузке блоков кодов бордюр будет черным, а на экране будет изображение счетчика, показывающего, сколько осталось до конца загрузки. На рисунке приведено изображение экрана в момент загрузки на него картинки (счетчик - внизу справа):
ЧИТАТЕЛЬ-ЧИТАТЕЛЮ
Итак, полный дамп блока кодов загрузчика с контрольными суммами в конце каждой строки. Как его использовать - Вы уже знаете.
|
FC13 |
СЗ |
69 |
FE |
48 |
48 |
48 |
48 |
00 |
59 |
|
FC1B |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
17 |
|
FC23 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
IF |
|
FC2B |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
FE |
25 |
|
FC33 |
Сб |
ВА |
ВА |
ВА |
ВА |
Сб |
FE |
FE |
9F |
|
FC3B |
ЕЕ |
СЕ |
ЕЕ |
ЕЕ |
ЕЕ |
82 |
FE |
FE |
3B |
|
FC43 |
С6 |
ВА |
F6 |
ЕЕ |
DE |
82 |
FE |
FE |
FF |
|
FC4B |
82 |
F6 |
Еб |
FA |
ВА |
Сб |
FE |
FE |
IB |
|
FC53 |
F6 |
Еб |
D6 |
В6 |
82 |
F6 |
FE |
FE |
2B |
|
FC5B |
82 |
BE |
86 |
FA |
ВА |
Сб |
FE |
FB |
93 |
|
FC63 |
Е6 |
DE |
86 |
ВА |
ВА |
Сб |
FE |
FE |
DF |
|
FC6B |
82 |
FA |
F6 |
F6 |
ЕЕ |
ЕЕ |
FE |
FE |
A7 |
|
FC73 |
С6 |
ВА |
С6 |
ВА |
ВА |
Сб |
FE |
FE |
EB |
|
FC7B |
С6 |
ВА |
ВА |
С2 |
FA |
Сб |
FE |
FE |
2F |
|
FC83 |
С6 |
ВА |
ВА |
ВА |
ВА |
Сб |
FE |
14 |
05 |
|
FC8B |
08 |
15 |
F3 |
D9 |
0Е |
00 |
D9 |
3E |
95 |
|
FC93 |
0А |
D3 |
FE |
DB |
FE |
1F |
Еб |
20 |
68 |
|
FC9B |
F6 |
00 |
4F |
BF |
СО |
CD |
20 |
FD |
45 |
|
FCA3 |
30 |
FA |
21 |
15 |
04 |
10 |
FE |
2B |
3C |
|
FCAB |
7С |
В5 |
20 |
F9 |
CD |
1С FD |
30 |
07 | |
|
FCB3 |
ЕВ |
06 |
9С |
CD |
1С |
FD |
30 |
E4 |
36 |
|
FCBB |
ЗЕ |
С6 |
В8 |
30 |
Е0 |
24 |
20 |
F1 |
B8 |
|
FCC3 |
06 |
C9 |
CD |
20 |
FD |
30 |
D5 |
78 |
F5 |
|
FCCB |
FE |
D4 |
30 |
F4 |
CD |
20 |
FD |
DO |
77 |
|
FCD3 |
D9 |
ЗА |
1A |
FC |
4F |
32 |
IF |
FC |
94 |
|
FCDB |
D9 |
26 |
00 |
06 |
BO |
18 |
IF |
08 |
CB |
|
FCE3 |
20 |
07 |
30 |
OF |
DD |
75 |
00 |
18 |
AF |
|
FCEB |
OF |
CB |
11 |
AD |
CO |
79 |
IF |
4F |
26 |
|
FCF3 |
13 |
18 |
07 |
DD |
7E |
00 |
AD |
CO |
E9 |
|
FCFB |
DD |
23 |
IB |
08 |
06 |
B2 |
2E |
01 |
01 |
|
FD03 |
CD |
1С |
FD |
DO |
3E |
CB |
B8 |
CB |
42 |
|
FD0B |
15 |
06 |
BO |
D2 |
03 |
FD |
7C |
AD |
CE |
|
FD13 |
67 |
7A |
B3 |
20 |
CA |
7C |
FE |
01 |
09 |
|
FD1B |
C9 |
CD |
20 |
FD |
DO |
C3 |
3B |
FD |
96 |
|
FD23 |
04 |
C8 |
3E |
7F |
DB |
FE |
IF |
DO |
71 |
|
FD2B |
A9 |
E6 |
20 |
28 |
F3 |
79 |
2F |
4F |
E9 |
|
FD33 |
32 |
FE |
5A |
32 |
FF |
5A |
37 |
C9 |
45 |
|
FD3B |
D9 |
79 |
B7 |
28 |
40 |
21 |
IF |
FC |
E5 |
|
FD43 |
35 |
7E |
28 |
5B |
FE |
05 |
30 |
42 |
EB |
|
FD4B |
21 |
IB |
FC |
34 |
2C |
2C |
35 |
2A |
6B |
|
FD53 |
IB |
FC |
7E |
Сб |
32 |
5F |
16 |
FC |
4E |
|
FD5B |
2A |
ID |
FC |
1A |
77 |
1С |
24 |
1A |
86 |
|
FD63 |
77 |
1С |
24 |
1A |
77 |
1С |
24 |
1A |
02 |
|
FD6B |
77 |
1С |
24 |
1A |
77 |
1С |
24 |
1A |
OA |
|
FD73 |
77 |
1С |
24 |
1A |
77 |
1С |
24 |
1A |
12 |
|
FD7B |
77 |
D9 |
C3 |
23 |
FD |
06 |
17 |
10 |
D8 |
|
FD83 |
FE |
3E |
00 |
ED |
44 |
A7 |
D9 |
C3 |
30 |
|
FD8B |
23 |
FD |
3E |
47 |
32 |
FA |
5A |
32 |
E5 |
|
FD93 |
FB |
5A |
32 |
FC |
5A |
32 |
FD |
5A |
F6 |
|
FD9B |
23 |
23 |
06 |
OD |
C3 |
82 |
FD |
06 |
39 |
|
FDA3 |
4F |
ED |
5B |
16 |
FC |
2A |
18 |
FC |
87 |
|
FDAB |
ID |
F2 |
B9 |
FD |
58 |
15 |
06 |
05 |
E5 |
|
FDB3 |
10 |
FE |
7E |
C3 |
EC |
FD |
7A |
E6 |
48 |
|
FDBB |
07 |
CA |
D1 |
FD |
15 |
F2 |
D3 |
FD |
2E |
|
FDC3 |
50 |
2D |
ЗА |
00 |
80 |
ЗА |
00 |
80 |
B1 |
|
FDCB |
ЗА |
00 |
80 |
C3 |
EC |
FD |
7E |
7E |
2A |
|
FDD3 |
7D |
Еб |
07 |
CA |
E4 |
FD |
2D |
F2 |
04 |
|
FDDB |
Еб |
FD |
68 |
25 |
ED |
44 |
C3 |
EC |
28 |
|
FDE3 |
FD |
7E |
7E |
7C |
E6 |
07 |
28 |
01 |
6B |
|
FDEB |
25 |
ED |
53 |
16 |
FC |
22 |
18 |
FC |
95 |
|
FDF3 |
21 |
15 |
FC |
22 |
IB |
FC |
21 |
FE |
7A |
|
FDFB |
50 |
22 |
ID |
FC |
3E |
40 |
32 |
IF |
52 |
|
FE03 |
FC |
ED |
44 |
ED |
44 |
ED |
44 |
A7 |
37 |
|
FE0B |
D9 |
C3 |
23 |
FD |
2A |
2C |
FC |
06 |
ID |
|
FE13 |
05 |
CB |
3C |
CB |
ID |
10 |
FA |
11 |
20 |
|
FE1B |
19 |
FC |
3E |
FF |
01 |
E8 |
03 |
3C |
93 |
|
FE23 |
B7 |
ED |
42 |
30 |
FA |
09 |
87 |
87 |
48 |
|
FE2B |
87 |
12 |
4D |
44 |
29 |
29 |
09 |
29 |
D7 |
|
FE33 |
IB |
7B |
FE |
15 |
20 |
E4 |
C9 |
AF |
56 |
|
FE3B |
32 |
1A |
FC |
DD |
21 |
21 |
FC |
11 |
AD |
|
FE43 |
11 |
00 |
AF |
37 |
CD |
8A |
FC |
30 |
BB |
|
FE4B |
1A |
CD |
OF |
FE |
3E |
01 |
32 |
1A |
C8 |
|
FE53 |
FC |
DD |
2A |
2E |
FC |
ED |
5B |
2C |
F2 |
|
FE5B |
FC |
3E |
FF |
37 |
CD |
8A |
FC |
30 |
4C |
|
FE63 |
02 |
FB |
C9 |
C3 |
06 |
08 |
D9 |
E5 |
B6 |
|
FE6B |
D9 |
CD |
ЗА |
FE |
D9 |
El |
D9 |
C9 |
A3 |
|
* |
★ |
* |
(С) Александр Исаков,
г.Нарва, 1995.
1 -о(,51
В. Толстой из г. Петрозаводска спрашивает, почему на его компьютере не работает DCU 2.02, 2.12, 2.31 (ZX-PEBI0-94, N4, стр.22). У меня тоже не работали все версии DCU выше 2.01. Мне кажется, что я знаю, в чем дело и могу помочь ему и некоторым другим синклерис-там.
Дело в том, что для вызова подпрограмм TR-DOS есть специальная точка входа по адресу 15663 (#3D2F). При обращении через нее сначала помещают на стек адрес нужной подпрограммы, а затем делают переход по адресу 15663. По этому адресу находится команда NOP, а за ней RET. Переключение на ПЗУ TR-DOS требует некоторого времени, причем это время различно для разных экземпляров компьютеров даже одного типа, так как время задержки распространения у применяемых в них микросхемах имеет некоторый разброс. Между прочим, если бы этот параметр у них не был, как правило, значительно лучше указанного в справочниках, то большинство наших самоделок не работало бы вообще. Команда NOP нужна для обеспечения задержки работы программы на это время.
В DCU же версий 2.02 и выше (а также и в некоторых других программах) используется переход по адресу 15664 (#3030), то есть непосредственно на команду RE?. Большинство компьютеров при этом нормально работают, но не все. Если Ваша машина оказалась именно такой, то возьмите M0NS4 или что-нибудь подобное, найдите в программе все ЗР и CALL по адресу 15664 и уменьшите адрес на единицу - скорее всего, после этого Ваши неприятности исчезнут.
Например, в программе DCU 2.31 вызов подпрограмм TR-00S данный способом используется в двух местах:
|
ЧИТАТЕЛЬ-Ч1 |
i Т А Т 1 |
г л ю |