|
Читатель-читателю - нестандартный загрузчик со счётчиком.
|
A
(#FC1A),A IX,#FC21 DE,#0011 A
#FC8A NC,#FE81 #FE0F A,#01 (#FC1A),A IX,(#FC2E) DE,(#FC2C) A, #FF
XOR
LD
LD
LD
XOR
SCF
CALL
JR
CALL
LD
LD
LD
LD
LD
SCF
CALL
JR
EI
RET
3P
#FC8A NC,#FEAC
#053F
Загрузка блока кодов без заголовка осуществляется нестандартной процедурой по адресу #FC8A. При первом ее вызове считывается хэдер в адрес #FC21. При следующем - загружается массив кодов. Эта процедура (#FC8A) похожа на процедуру загрузки ПЗУ LDJBYTES, (#0556 или 01366), но есть определенные различия.
LD-BYTES
INC D
EX AF,AF'
DEC D DI
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
Далее происходит включение атрибутов счетчика, а в 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
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 |
ЧИТАТЕЛЬ-ЧИТАТЕЛЮ
Алгоритм работы процедуры 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
Теперь для порядка в начале программы (перед таблицей) поставим:
#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.
В. Толстой из г. Петрозаводска спрашивает, почему на его компьютере не работает 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 |
г л ю |
|
|