ZX-Forum №1 1993 г.

Системные программы - Расширение функций оператора PRINT.


Темы статьи: Программирование  

СИСТЕМНЫЕ ПРОГРАММЫ

Расширение функций оператора PRINT.

© 1994 Куковякин С.В., п. Залесье, Ивановской область

Предлагаю программу в машинных кодах, расширяющую возможности оператора PRINT в ПЗУ. Новые функции включаются "печатанием" соответствующих управляющих кодов, которые Вы можете изменить по собственному вкусу:

•S переключение на русский и английский FONT'bi; •S печать шрифтом высотой 8 и шириной от 3 до 7 пикселов; •S печать шрифтом высотой 16 и шириной 8 пикселов; •S печать 2-х типов меню с тенью или без неё; •S печать собственных или системных токенов ключевых слов. Сюда также входит подпрограмма, выдающая номер выбранной опции из меню и подпрограмма, похожая на ПЗУ-шную 203CH, только требующая для своей работы в регистре A -номер печатаемого стринга и в ОЗУ - таблицу начальных адресов этих стрингов.

А теперь перехожу к описанию самой программы. Список новых управляющих кодов:

128 - включает английский FONT.

129 - включает русский FONT.

130 - включает печать шрифтом шириной от 3 до 7 пикселов (ширина символов задается в операторе TAB, например, PRINT TAB 5 установит ширину символов в 5 пикселов).

131 - включает печать шрифтом шириной 8 и высотой 16 пикселов.

132 - включает стандартную печать.

133 - печатает меню 1 типа.

134 - печатает меню 2 типа.

Коды 133 и 134 требуют после себя наличия 6-ти байтов в таком порядке: 1 байт - цвет PAPER, 1 байт - цвет INK, 2 байта - координаты верхнего левого угла меню (как в операторе AT), 1 байт - высота меню в знакоместах, 1 байт - ширина в знакоместах.

135 - последнее напечатанное меню окаймляется тенью. Листинг процедуры, при помощи ассемблера ZEUS: набранный

00010

ORG

45000

00250

EX

DE, HL

00020

ENT

00260

JP

(HL)

00030 GENERAL

PUSH

AF

00270

TABLE

DW

FONT1

00040

LD

A,(CONTROL)

00280

DW

CODE130

00050

LD

B, A

00290

DW

CODE131

00060

POP

AF

00300

DW

CODE132

00070

DEC

B

00310

DW

MENU1

00080

JR

Z,PRINT

00320

DW

MENU2

00090

CP

128

00330

DW

DARK

00100

JR

C,PRINT

00340

00110

JR

Z,FONT0

00350

PRINT

PUSH

BC

00120

CP

165

00360

PUSH

DE

00130

JP

NC,TOKEN

00370

PUSH

HL

00140

CP

136

00380

LD

HL,(ADRESS)

00150

JR

NC,PRINT

00390

CALL

111

00160

LD

HL,TABLE

00400

LD

HL, (23633)

00170

SUB

129

00410

LD

BC,GENERAL

00180

SLA

A

00420

LD

E,(HL)

00190

LD

D, 0

00430

LD

(HL) ,C

00200

LD

E, A

00440

INC

HL

00210

ADD

HL, DE

00450

LD

D,(HL)

00220

LD

E,(HL)

00460

LD

(HL),B

00230

INC

HL

00470

LD

A, B

00240

LD

D, (HL)

00480

CP

D

00490

JR

NZ,CHNG

01040

Change1

LD

C,146

00500

LD

A, C

01050

LOOP1

LD

A,(WINDOW)

00510

CP

E

01060

DEC

A

00520

JR

Z,EXIT

01070

LD

(WINDOW) , A

00530

CHNG

LD

(ADRESS),DE

01080

JR

NZ,NLINE

00540

EXIT

POP

HL

01090

LD

C,153

00550

POP

DE

01100

CALL

PRAT

00560

POP

BC

01110

LD

C, 149

00570

RET

01120

JR

NOINCR

00580

01130

NLINE

DEC

C

00590

F0NT0

LD

HL,15360

01140

DEC

C

00600

LD

BC,CUTER1-32

01150

CALL

PRAT

00610

JR

FONT1+6

01160

LD

A, D

00620

FONT1

LD

HL,FNT1-256

01170

CP

E

00630

LD

BC,CUTER2-32

01180

JR

Z,INCR

00640

LD

(23606) , HL

01190

CP

2

00650

LD

(Cuter+1) , BC

01200

JR

Z,INCR

00660

RET

01210

JR

NOINCR

00670

CODE130

LD

HL,PRTPIX

01220

INCR

INC

C

00680

JR

CODE132+3

01230

INC

C

00690

CODE131

LD

HL,PRT16

01240

INC

C

00700

JR

CODE132+3

01250

NOINCR

DEC

D

00710

CODE132

LD

HL,2548

01260

JR

NZ,LOOP1

00720

LD

(ADRESS),HL

01270

LD

(ROW) , HL

00730

RET

01280

RET

00740

01290

PRAT

CALL

PRTHLC

00750

MENU1

CALL

MENUSET

01300

LD

A, (WIDTH)

00760

LD

B, 6

01310

DEC

A

00770

SUB

B

01320

DEC

A

00780

LD

(TIME),A

01330

LD

B, A

00790

LD

A, 146

01340

INC

C

00800

LD

(Change1+1) ,A

01350

LOOP2

CALL

PRTC

00810

LD

A,4

01360

DJNZ

LOOP2

00820

LD

(WINDOW) , A

01370

INC

C

00830

JR

MENU

01380

INC

L

00840

MENU2

CALL

MENUSET

01390

JR

PRTC

00850

LD

B, 3

01400

PRTHLC

LD

A,22

00860

SUB

B

01410

CALL

PRINT

00870

LD

(TIME),A

01420

LD

A, L

00880

LD

A,158

01430

CALL

PRINT

00890

LD

(Change1+1),A

01440

LD

A, H

00900

LD

(WINDOW) , A

01450

CALL

PRINT

00910

MENU

CALL

CODE132

01460

PRTC

LD

A,C

00920

LD

A, 17

01470

CALL

PRINT

00930

RST

16

01480

RET

00940

LD

A, (PAPER)

01490

MENUSET

LD

DE,PAPER

00950

RST

16

01500

LD

HL,(TEMPDE)

00960

LD

A, 16

01510

INC

HL

00970

RST

16

01520

LD

BC, 6

00980

LD

A, (INK)

01530

LDIR

00990

RST

16

01540

DEC

HL

01000

LD

HL,(ROW)

01550

LD

(TEMPDE) , HL

01010

LD

A, (HIGH)

01560

LD

HL,(TEMPBC)

01020

LD

D, A

01570

LD

BC, 6

01030

LD

E, A

01580

SBC

HL, BC

01590

LD

(TEMPBC),HL

02140

RET

C

01600

LD

HL,(POS)

02150

;

01610

LD

(ROW),HL

02160

LD

B, 0

01620

LD

A,(TIME)

02170

LD

C,A

01630

LD

(HIGH) , A

02180

Cuter

LD

HL,CUTER1-32

01640

PUSH

AF

02190

ADD

HL, BC

01650

ADD

A, L

02200

LD

E,(HL)

01660

DEC

A

02210

LD

BC,(23606)

01670

LD

(POS),A

02220

LD

H, 0

01680

POP

AF

02230

LD

L, A

01690

RET

02240

ADD

HL, HL

01700

02250

ADD

HL, HL

01710

DARK

LD

HL,(ROW)

02260

ADD

HL, HL

01720

INC

H

02270

ADD

HL, BC

01730

LD

C,143

02280

LD

C, 8;high

01740

CALL

PRTHLC

02290

LD

A,(SIZE)

01750

LD

A, (WIDTH)

02300

ADD

A,247

01760

DEC

A

02310

LD

D,A;skolko cut

01770

LD

B, A

02320

NBYTE

PUSH

DE

01780

LOOP3

CALL

PRTC

02330

LD

A, D

01790

INC

H

02340

SUB

247

01800

DJNZ

LOOP3

02350

LD

B, A

01810

LD

A, (HIGH)

02360

LD

A,(HL)

01820

LD

B, A

02370

NBIT

INC

D

01830

LOOP4

CALL

PRTHLC

02380

CALL

NZ,CUT

01840

DEC

L

02390

DEC

D

01850

DJNZ

LOOP4

02400

RLA

01860

RET

02410

CALL

C,PLOT

01870

02420

PUSH

AF

01880

TOKEN

SUB

165

02430

LD

A,(COORDX)

01890

LD

DE,TOKENS

02440

INC

A

01900

JP

#0C0A

02450

LD

(COORDX),A

01910

;

02460

POP

AF

01920

FNT1

EQU

40000

02470

DJNZ

NBIT

01930

ADRESS

DW

2548

02480

;

01940

ROW

DB

0

02490

INC

HL

01950

COL

DB

0

02500

PUSH

HL

01960

HIGH

DB

10

02510

LD

HL,(COORDX)

01970

WINDOW

DB

3

02520

DEC

H

01980

;

02530

LD

A, (SIZE)

01990

TOKENS

DB

255

02540

SUB

L

02000

DM

/RN/

02550

NEG

02010

DB

196

02560

LD

L, A

02020

DM

/INKEY/

02570

LD

(COORDX),HL

02030

DB

164

02580

POP

HL

02040

02590

POP

DE

02050

,'PRINT

WIDTH

3-8 PIXELS

02600

DEC

C

02060

;

02610

JR

NZ,NBYTE

02070

PRTPIX

CP

13

02620

;

02080

JP

Z,ENTER1

02630

CHECK1

LD

HL,(COORDX)

02090

CP

22

02640

LD

A, (SIZE)

02100

JP

Z, ATT1

02650

LD

B, A

02110

CP

23

02660

ADD

A, A

02120

JP

Z, TAB

02670

DEC

A

02130

CP

32

02680

ADD

A, L

02690

JR

C,NEWROW

03240

AT i—1

LD

DE,AT2

02700

LD

A, B

03250

JP

#0A7D

02710

ADD

A, L

03260

AT2

LD

DE,(ATCLOSE)

02720

LD

L, A

03270

CALL

#0A70

02730

LD

A, 8

03280

LD

HL, (23566)

02740

ADD

A, H

03290

LD

(COORDX),HL

02750

LD

H, A

03300

XOR

A

02760

JR

SETXY

03310

LD

(CONTROL) ,A

02770

NEWROW

INC

H

03320

RET

02780

JR

Z,SET00

03330

;

02790

DEC

H

03340

TAB

LD

DE,TAB1

02800

LD

A, 6

03350

JP

#0A80

02810

CP

H

03360

TAB1

LD

DE,PRTPIX

02820

JR

NC,SET00

03370

CALL

#0A7D

02830

LD

L, 0

03380

LD

A, (23566)

02840

JR

SETXY

03390

LD

(SIZE),A

02850

SET00

LD

HL,#AF00

03400

RET

02860

CALL

WAITCLS

03410

;

02870

SETXY

LD

(COORDX),HL

03420

WAITCLS

PUSH

BC

02880

RET

03430

PUSH

HL

02890

;

03440

LD

BC, 0

02900

CUT

SLA

E

03450

CALL

7997

02910

RET

NC

03460

CALL

8020

02920

RLA

03470

JR

NC,BREAK

02930

INC

D

03480

LD

DE,16385

02940

RET

Z

03490

LD

HL,16384

02950

JR

CUT

03500

LD

BC,6143

02960

;

03510

LD

(HL) ,0

02970

PLOT

PUSH

AF

03520

LDIR

02980

PUSH

BC

03530

POP

HL

02990

PUSH

DE

03540

POP

BC

03000

PUSH

HL

03550

RET

03010

LD

BC,(COORDX)

03560

;

03020

CALL

8933

03570

BREAK

POP

HL

03030

POP

HL

03580

POP

HL

03040

POP

DE

03590

POP

HL

03050

POP

BC

03600

JP

7035

03060

POP

AF

03610

;

03070

RET

03620

CONTROL

DB

0

03080

;

03630

ATCLOSE

DW

2548

03090

ENTER1

LD

HL,(COORDX)

03640

COORDX

EQU

23728

03100

LD

A, 8

03650

COORDY

EQU

23729

03110

SUB

H

03660

SIZE

EQU

23681

03120

NEG

03670

CUTER1

EQU

40768

03130

LD

H, A

03680

CUTER2

EQU

40864

03140

LD

L,255

03690

03150

JR

CHECK1+3

03700

;PRINT BY SIZE 8,16

03160

;

03710

;

03170

ATT1

LD

HL,PRTPIX

03720

PRT16

CP

13

03180

;

03730

JR

Z,ENTER2

03190

AT

LD

(ATCLOSE),HL

03740

CP

22

03200

LD

DE, AT1

03750

JR

Z, ATT2

03210

LD

A,1

03760

CP

32

03220

LD

(CONTROL) ,A

03770

RET

C

03230

JP

#0A80

03780

LD

DE, (23606)

03790

LD

L, A 04340 DJNZ LOOP8

03800

LD

H, 0 04350 INC DE

03810

ADD

HL,HL 04360 DEC C

03820

ADD

HL, HL 04370 JR NZ,LOOP7

03830

ADD

HL, HL 04380 POP HL

03840

ADD

HL,DE 04390 RET

03850

EX

DE,HL 04400 ;

03860

LD

BC, (COORDX) 04410 ENTER2 LD HL, (COORDX)

03870

LD

A, C 04420 LD H, 32

03880

AND

#18 04430 JR CHECK2

03890

OR

#40 04440 ;

03900

LD

H, A 04450 ATT2 LD HL,PRT16

03910

LD

A, C 044 60 JP AT

03920

AND

7 04470 ;........................

03930

OR

A 04480 NUMBER PUSH AF

03940

RRA

04490 LD A, 2

03950

RRA

04500 CALL #1601

03960

RRA

04510 POP AF

03970

RRA

04520 LD HL,CHART-2

03980

ADD

A, B 04530 LD BC,2

03990

LD

L, A 04540 LOOP9 ADD HL,BC

04000

PUSH

BC 04550 DEC A

04010

CALL

PRTHALF 04560 JR NZ,LOOP9

04020

LD

A, 32 04570 LD E, (HL)

04030

ADD

A, L 04580 INC HL

04040

LD

L,A 04590 LD D,(HL)

04050

JR

NC,NOSEGM 04 600 INC HL

04060

LD

A, 8 04610 LD C, (HL)

04070

ADD

A, H 04 620 INC HL

04080

LD

H, A 04630 LD B, (HL)

04090

NOSEGM

CALL

PRTHALF 04640 LD L, C

04100

POP

HL 04650 LD H, B

04110

;

04660 AND A

04120

CHECK2

INC

H 04670 SBC HL, DE

04130

LD

A, 31 04680 LD C, L

04140

CP

H 04690 LD B, H

04150

JP

NC,SETXY 04700 LOOP10 LD A,B

04160

INC

L 04710 OR C

04170

INC

L 04720 DEC BC

04180

LD

H,0 04730 RET Z

04190

LD

A,22 04740 LD A, (DE)

04200

CP

L 04750 LD (TEMPBC),BC

04210

JP

NC,SETXY 04760 LD (TEMPDE),DE

04220

LD

L, 0 04770 CALL GENERAL

04230

JP

SET00+3 04780 LD BC,(TEMPBC)

04240

;

04790 LD DE,(TEMPDE)

04250

PRTHALF

PUSH

HL 04800 INC DE

04260

LD

C, 4 04810 JR LOOP10

04270

LOOP7

LD

B,2 04820 TEMPDE DW 0

04280

LOOP8

LD

A,(DE) 04830 TEMPBC DW 0

04290

LD

(HL) ,A 04840 CHART EQU 40960

04300

SRL

A 04850 ;........................

04310

OR

(HL) 04860 ;MENU LINE

04320

LD

(HL) ,A 04870 ;

04330

INC

H 04880 LINE1 LD HL,35000-6

04890

LD

BC, 6

05440

NEG

04900

LOOP11

ADD

HL,BC

05450

LD

L,A

04910

DEC

A

05460

LD

(POS),HL

04920

JR

NZ,LOOP11

05470

RET

04930

LD

DE,PAPER

05480

END

LD

A,(TIME)

04940

LDIR

05490

LD

(TIME1),A

04950

05500

LD

HL,(POS)

04960

LINE2

CALL

BEGIN

05510

ADD

A, L

04970

CALL

NEWLINE

05520

LD

L,A

04980

INKEYS

LD

BC,33

05530

LD

(POS),HL

04990

CALL

7997

05540

RET

05000

LD

A, (23556)

05550

NEWLINE

LD

A,(INK)

05010

CP

65

05560

SLA

A

05020

JR

Z, DOWN

05570

SLA

A

05030

CP

81

05580

SLA

A

05040

JR

Z, UP

05590

LD

B, A

05050

CP

13

05600

LD

A,(PAPER)

05060

JR

NZ,INKEYS

05610

ADD

A, B

05070

QUIT

LD

BC,(TIME1)

05620

FILL

PUSH

AF

05080

LD

B, 0

05630

LD

DE, (POS)

05090

RET

05640

CALL

ATribut

05100

DOWN

LD

BC,#2C3C

05650

LD

A, (WIDTH)

05110

JR

UP+3

05660

LD

B, A

05120

UP

LD

BC,#2D3D

05670

POP

AF

05130

LD

HL,Change2

05680

LOOP12

LD

(HL),A

05140

LD

(HL) ,C

05690

INC

HL

05150

LD

HL,Change3

05700

DJNZ

LOOP12

05160

LD

(HL),B

05710

RET

05170

LD

A, (PAPER)

05720

ATribut

LD

A,E

05180

SLA

A

05730

AND

#18

05190

SLA

A

05740

SRL

A

05200

SLA

A

05750

SRL

A

05210

LD

B, A

05760

SRL

A

05220

LD

A, (INK)

05770

OR

#58

05230

ADD

A, B

05780

LD

H, A

05240

CALL

FILL

05790

LD

A, E

05250

LD

A,(TIME1)

05800

AND

7

05260

Change2

INC

A

05810

OR

A

05270

LD

(TIME1),A

05820

RRA

05280

LD

B, A

05830

RRA

05290

LD

A,(TIME)

05840

RRA

05300

CP

B

05850

RRA

05310

CALL

C,BEGIN

05860

ADD

A, D

05320

DEC

B

05870

LD

L,A

05330

CALL

M, END

05880

RET

05340

LD

HL,(POS)

05890

PAPER

DB

5

05350

Change3

INC

L

05900

INK

DB

1

05360

LD

(POS),HL

05910

POS

DW

#0003

05370

CALL

NEWLINE

05920

TIME

DB

21

05380

JR

INKEYS

05930

WIDTH

DB

5

05390

BEGIN

LD

A,1

05940

TIME1

DB

21

05400

LD

(TIME1),A

05950

05410

LD

HL,(POS)

05960

N1

DB

133,5,1,1

05420

LD

A,(TIME)

05970

DB

15, 10

05430

SUB

L

05980

DB

131,22,2,

05990

DM

/FILENAME/

06270

DM

/MOVE/

06000

DB

130,23,5

06280

DB

22,4,21

06010

DB

22,16,127

06290

DM

/DELETE/

06020

DM

/Mega BASIC/

06300

DB

22,5,21

06030

DB

22,16,119

06310

DM

/RENAME/

06040

DM

/Beta BASIC/

06320 N3

DB

134,0,7,9,20

06050

DB

22,16,111

06330

DB

7,9, 129

06060

DM

/LOGO/

06340

DB

21,1,130,23

06070

DB

22,16,103

06350

DB

5,22,184,103

06080

DM

/PASCAL/

06360

DM

/FAJL/

06090

DB

22,16,95

06370

DB

22,165,87

06100

DM

/PROLOG/

06380

DM

/KOPIROWATX/

06110

DB

22,16,87

06390

DB

22,165,79

06120

DM

/ZEUS/

06400

DM

/POAISTITX/

06130

DB

22,16,79

06410

DB

22,165,71

06140

DM

/GENS 4D/

06420

DM

/UDALITX/

06150

DB

22,16,71

06430

DB

22,165,63

06160

DM

/MONS 4D/

06440

DM

/PEREIMENOWATX/

06170

DB

22,16,63

06450

DB

128,132

06180

DM

/boot/

06460 N4

DB

0

06190

DB

132,16,0,135

06470 ;

06200 N2

DB

134,2,7,0,20

06480

ORG

CHART

06210

DB

7,8

06490

ENT

06220

DB

20,1,22,0,22

06500

DW

N1,N2,N3,N4

06230

DM

/FILE/

06510 ;

06240

DB

20,0,22,2,21

06520

ENT

06250

DM

/COPY/

06530 START

LD

A,1

06260

DB

22,3,21

06540

JP

NUMBER

Итак,

в строках

30-260 происходит обработка поступающего

на печать символа. Строки 30-

80 нужны для нормальной работы оператора AT при печати узкими символами. Если переменная CONTROL равна 1, а в это состояние она устанавливается после поступившего кода с номером 22, то сразу следует переход на процедуру PRINT. Туда же идет переход, если код символа менее 128 или лежит в диапазоне от 136 до 164. Если код больше 164, то это токен, и его печатью займется процедура TOKEN. Теперь остались только новые управляющие коды, за исключением 128-го (переход на его обработку был сделан, когда код поступившего символа проверялся, что он меньше 128). В регистр HL загружается начало таблицы, содержащей адреса процедур, обрабатывающих соответствующий код. Регистр A уменьшается на 129 и умножается на 2 так как адреса 2-хбайтные. Потом A загружается в DE и DE складывается с HL. Теперь HL указывает на место в памяти, в котором содержится адрес нужной процедуры. Этот адрес загружается в DE, происходит обмен между DE и HL и следует переход на этот адрес.

PRINT. Эта подпрограмма аналогична подпрограмме, напечатанной в ZX-РЕВЮ № 5,6 1992 на стр. 112.

FONT0. В HL загружается адрес набора символов в ПЗУ минус 256, в ВС - адрес таблицы, данные которой показывают, какие столбцы в символе вырезать (это нужно при печати узкими символами; об этом позже в PRTPIX) и HL загружается в CHARS (23606), а содержимое ВС подставляется после кода операции LD HL,NN в подпрограмме PRTPIX. Можно было бы завести еще одну переменную, например, CUTER и сделать так: LD (CUTER),BC LD HL,(CUTER).

FONT1. Все, как и в FONT0, только другой адрес набора символов и таблицы "вырезки".

CODE130. Установка печати узкими символами.

CODE131. Установка печати символами 8 на 16.

CODE132. Установка печати стандартными символами.

Дальше начинается подпрограмма печати меню. Данные для меню передаются из машинного кода (хотя желающие могут легко доработать программу, чтобы данные передавались из BASICS, например, через функцию DEF FN) от подпрограммы NUMBER. Сейчас нам нужно знать только то, что она хранит в переменной TEMPDE, где находится текст, и в ТЕМРВС - длину этого текста. Подпрограмма MENU передает параметры для DARK (тень от меню) и MENU LINE (выбор опции из меню). Меню строится с помощью символов UDG. Их расположение строго определенное (см. рис.1).

Рис.1. Символы UDG.

Печатью обоих меню занимается подпрограмма MENU. Разница состоит только в подготовительных операциях.

MENU1. Сразу вызывается подпрограмма MENUSET - данные для меню переносятся на место переменных подпрограммы MENU LINE. Затем, чтобы нормально работала подпрограмма NUMBER, TEMPDE увеличивается на 5 (откуда берется текст), а ТЕМРВС уменьшается на 6 (длина этого текста). Потом координаты левого верхнего угла меню копируются в переменной ROW и COL (эти переменные однобайтные и должны располагаться - сначала ROW, затем COL); высота меню копируется в переменную HIGH. Затем к строке, с которой начинается меню, прибавляется высота-1 и запоминается в POS, которая хранит координаты линии меню. Затем продолжает работу MENU1. На выходе из MENUSET в регистре A содержится высота меню. И для подпрограммы MENU LINE корректируется, из скольких пунктов (или опций) состоит меню. В данном случае 1 верхняя и 1 нижняя строка, плюс название, высотой 2 строки и 2 строки, чтобы отделить название от пунктов меню, - итого 6 строк. И в переменную TIME заносится скорректированное количество пунктов. Затем в А загружается символ UDG, определяющий правый верхний угол и подставляется на место Change1+1 (в последующем этот код будет загружаться в регистр C). Дальше в переменную WINDOW заносится число 4, которое определяет высоту "шапки" (или окна) меню, в котором печатается его название (эта переменная введена исключительно для печати 1-го меню; чтобы обойти ее действие при печати 2-го меню, ей достаточно присвоить значение большее чем 21) и следует переход на общую подпрограмму MENU. Здесь вызывается подпрограмма CODE132, включающая обычную печать (если Вы, например, до этого печатали нестандартным шрифтом), устанавливается цвет PAPER и INK, в HL загружаются начальная строка и столбец, в регистры D и E заносится высота меню и D становится счётчиком по которому определяется все ли меню напечатано, а по E определяется, что надо переходить на новый ряд из 3-х символов UDG (Тут даже можно было бы сделать проще: сравнивать D с HIGH, a E использовать как WINDOW). В общем, принцип печати такой: берётся первый ряд из трёх символов UDG, печатается 1-й символ, затем 2-й символ печатается в цикле WIDTH-2 раз, потом печатается 3-й символ. Если это первая или последняя строка, то берётся следующий ряд из трёх символов, иначе печатается этот же ряд с новой строки. По завершении печати координаты строки и столбца, находящиеся в HL, сохраняются для того, чтобы программа рисования тени знала, где рисовать.

DARK. С помощью этой подпрограммы последнее напечатанное меню "отбросит" тень. Тень печатается символом блочной графики с кодом 143. Работа подпрограммы достаточно понятна и без описания.

TOKEN. Здесь печатаются токены ключевых слов. Вы можете задать собственные токены, например, слоги слов - если Вы пишете текстовую программу, то можете сэкономить не один килобайт. Если же Вы хотите оставить стандартные токены, то строку 130 надо переписать так: JP NC,2548. А подпрограмму TOKEN можно стереть.

Прежде чем приступать к описанию подпрограммы печати узкими символами, хочу сначала рассказать о принципе печати символов, шириной меньше чем 8 пикселов, на примере буквы А. Стандартное изображение символа представляет собой шаблон размером 8x8 пикселов и задается с помощью 8-ми байт (см. рис.2).

Каждая строка шаблона - это один байт, состоящий из 8-ми битов. Чтобы напечатать букву

A шириной 5 "вырезать" по 3 бита, т.е. "вырезать" в шаблоне 3 столбца. Пусть это будут столбцы 7,5 и 4. Тогда буква А примет вид как на рис.3,4.

БИТЫ БИТЫ БИТЫ

Рис.2. Шаблон. Рис.3. "Урезание" буквы. Рис.4. "Урезанная" буква.

"Вырезание" столбцов в программе выполняется просто пропуском ненужных битов. Чтобы программа знала, какие столбцы в каждой букве можно вырезать, создаются 2 таблицы (для английского и русского шрифтов), каждая длиной 96 байт (символьный набор состоит из 96 символов). Включенные в байте биты показывают, какие столбцы можно "вырезать". Вообще-то, для каждого шрифта желательно иметь 2 такие таблицы: для режимов - 6-7 пикселов ширина и 3-5 пикселов так как с одной таблицей изображение некоторых букв в режиме 6 пикселов получается не очень хорошее (например, T,V,X,Y). Но иметь 2 таблицы из-за нескольких букв - большая роскошь. Можно сделать так, чтобы программа смотрела - если ширина печати равна 6, и печатаемая буква одна из вышеуказанных, то для неё устанавливается новый байт, показывающий, какие столбцы "вырезать". В программе на эти 2 таблицы указывают переменные CUTER1 (для английского шрифта) и CUTER2 (для русского). Создавать таблицы удобнее из BASICS таким образом:

10 DATA BIN 11110000," "

330 DATA BIN 10111000,"A" 340 DATA BIN 10111000,"B"

И с помощью следующей программки занести в память: 2 LET CUTER=407 68: REM адрес расположения таблицы в памяти 4 FOR X=0 TO 95: READ A,A$: POKE CUTER+X,A: NEXT X

Да, ещё насчёт экономии памяти: символы с кодами от 32 до 63 одинаковы в обоих шрифтах, поэтому для русского шрифта можно хранить в памяти только изображение букв, а для печати символов, с кодом меньшим 64, использовать символьный набор ПЗУ (и сделать это довольно просто, а экономия приблизительно равна 200 байтам - (64-32)*8=256 и минус примерно байт 40 на доработку программы).

PRTPIX. В строках 2070-2140 идёт обработка управляющих кодов ENTER, AT (формат данных для AT, как в операторе PLOT) и TAB (установка ширины символов). Другие управляющие коды просто игнорируются. Далее начинаются подготовительные операции для печати символа, суть которых сводится к установке регистров следующим образом: HL содержит адрес шаблона символа, E - какие биты вырезать, D - сколько этих битов вырезать, C - высота символа. Символ печатается слева направо и сверху вниз по точкам (включенный бит показывает, что надо напечатать точку на экране). Программа похожа на программу, печатавшуюся на страницах ZX-РЕВЮ, поэтому остановлюсь только на нескольких моментах. В строках 2320-2610 печатается весь символ; в 2370-2470 печатается один байт (строка) бит за битом слева направо. Далее горизонтальная координата печати увеличивается на ширину символа и, если выходит за пределы экрана, устанавливается в начало строки, а строка увеличивается на 1 (точнее сказать номер строки, так как вертикальная координата уменьшается на 8 пикселов - высоту символа). Если же новая строка не помещается на экране, то происходит инициализация координат в подпрограмме SET00 (забыл упомянуть, что начало координат - это точка с координатами 0,175), причём происходит обращение к подпрограмме WAITCLS, в которой ожидается нажатие любой клавиши и затем очищается экран. WAITCLS в общем-то не нужна тем кто программирует только в кодах и заранее расписывает где, как и что будет печататься на экране, но понадобится тому, кто даст из BASICS команду LIST при включенном новом режиме печати.

Подпрограмма CUT занимается "вырезкой" ненужных битов из байта (при входе в неё в A -печатаемый байт, в D - сколько битов надо "вырезать", в E - какие биты "вырезать"). Делает она это следующим образом. Регистр E сдвигается влево, при этом 7-ой бит поступает в CARRY-флаг, и если бит не включен (CARRY-флаг не включен), то и "вырезать" ничего не надо, поэтому сразу выход (RET NC) . Дальше из изображения символа "вырезается" 1 бит (RLA) и, если хватит "вырезать", то выход из подпрограммы, иначе пытается "вырезать" следующий бит (у, какая кровожадная!).

PLOT вводит координаты точки и строит её на экране при помощи подпрограммы ПЗУ. ENTER1 обрабатывает поступивший код 13. Все, что нужно для этого сделать - установить в HL текущие координаты, горизонтальную координату сделать максимальной и перейти на подпрограмму, проверяющую строку на выход за пределы экрана.

AT занимается обработкой кода 22. Так как эта подпрограмма общая для PRTPIX и PRT16, то на входе в неё в HL содержится адрес программы печати, устанавливаемой после принятия 2-ой координаты. Программа аналогична подпрограмме, находящейся в ПЗУ, но вначале заносит в переменную CONTROL единицу (так как координаты могут быть в диапазоне 0-255 и 0-175), чтобы, например, если код равен 170, программа не "подумала", что это код токена и не печатала его. Когда обе координаты приняты, CONTROL сбрасывается, а координаты, находящиеся сейчас в системной переменной TV_DATA, переносятся в переменную COORDX и COORDY.

TAB обрабатывает код 23 (как Вы помните, этим кодом управляется ширина печатаемых букв). Принимает следующий за 23-м код и загружает его в SIZE.

PRT16 - это программа печати символами 8 на 16 пикселей. Координаты задаются в стандартных знакоместах, как в операторе PRINT. В строках 3720-3770 происходят переходы на обработку управляющих кодов, или сразу выход из программы, если это не управляющий код, печатный символ или токен. Затем по коду символа в символьном наборе ищется изображение символа (строки 3780-3840), и теперь оно хранится в DE. Далее (строки 3860-3990) по координатам знакоместа рассчитывается адрес в дисплейном файле (см. "Элементарная графика", ИНФОРКОМ).

В подпрограмме PRTHALF символ как бы "вытягивается" в высоту, то есть берутся первые 4 байта изображения символа и каждый байт заносится в дисплейный файл по два раза. Потом для печати нижней половины символа к адресу дисплейного файла надо прибавить 32, если при этом включился флаг переноса, то значит нужно перейти к следующему сегменту. После того, как была напечатана и нижняя половина, горизонтальная координата увеличивается и, если не выходит за пределы, то переход к следующей строке (так как здесь строка высотой 2 знакоместа, то и увеличивается она на 2). Если строка не помещается на экране, то в HL устанавливаются начальные координаты и следует переход на SET00+3 (+3 - для того, чтобы пропустить установку начальных координат для программы печати узкими символами; о SET00 см. выше). Кстати, в подпрограмме PRTHALF в строках 4300-4320 печатаемый символ делается толще (эти строки лучше удалить, если Вы много будете печатать по-русски, так как такие буквы как "ш", "ю" и т.п. сливаются в сплошное пятно на экране).

NUMBER - эта подпрограмма служит для печати текстовых сообщений. На входе в неё в регистре A должен быть номер текстового сообщения, и в памяти должна находится таблица из 2-байтных адресов, указывающих на начало каждого текстового сообщения. Сообщения, как и адреса, указывающие на эти сообщения, должны располагаться в памяти строго друг за другом. На начало этих адресов указывает метка CHART. Программа NUMBER сама рассчитает длину печатаемого текста (как разницу между началами следующего и печатаемого в данный момент сообщения), и распечатает его с помощью LOOP10 (в DE - адрес, где находится текст, BC - длина текста). Пример, показывающий работу этой программы, приведен в строках 5960-6540.

MENU_LINE - эта программа предназначена для выбора пункта из меню. Входить в неё можно в двух точках: LINE2 - обычная точка входа после того, как Вы напечатали какое-либо меню (перед печатью меню подготавливаются данные для этой программы - см. MENUSET), и LINE1 -если Вас по какой-либо причине не устраивает первая (например, несколько меню уже напечатаны). Если вход в программу через LINE1, то Вам нужно подготовить где-то в памяти (адрес минус 6 загружается в HL см. строку 4 880) данные в таком виде: 1-й байт - цвет PAPER курсора, 2-й байт - цвет INK, 3-й и 4-й - координата самого нижнего пункта меню, 5-й - сколько пунктов в меню и 6-й - ширина меню. На входе в LINE1 в регистре A содержится номер меню.

В строках 4960-4970 выделяется 1-ый пункт цветом, инвертированным к цвету меню (т.е. PAPER становится INK и наоборот). Далее в 4980-4990 выдерживается пауза и в строках 5000-5060 опрашиваются клавиши: Q-вверх, А-вниз, ENTER - подтверждение выбора.

QUIT - сюда мы попадаем, если нажата клавиша ENTER. В регистр BC вводится номер текущего пункта и осуществляется выход из программы (т.е. можно из BASICS дать команду LET A=USR LINE2, где LINE2 - адрес программы LINE2, полученный в результате ассемблирования, и в переменной A Вы получите номер пункта меню).

Если нажаты клавиши вниз или вверх, то попадаем на подпрограмму DOWN или UP соответственно. Подпрограммы передвижения курсора вниз и вверх отличаются только тем, что при движении курсора вниз, вертикальная координата курсора и текущий номер пункта увеличиваются, а при движении вверх все происходит наоборот. Поэтому в этих подпрограммах происходит только настройка общей программы (подменяются операции в строках, помеченных как Change2 и Change3: для подпрограммы DOWN - это INC A (код #3C) и INC L (код #2C); для UP - DEC A (код #3D) и DEC L (код #2D)). Затем курсор передвигается на следующий пункт таким образом: текущий курсор закрашивается цветом меню (в строках 5170-5230 вычисляется байт для закраски, для этого цвет PAPER умножается на 8 и к нему прибавляется цвет INK, и подпрограмма FILL, рассчитав с помощью ATribut по координатам адрес в файле атрибутов, сотрёт текущий курсор. Потом номер текущего пункта, хранящегося в TIME1, увеличивается или уменьшается на единицу (в зависимости от того, куда перемещается курсор - вниз или вверх) и проверяется, что курсор не вышел за пределы меню. Если курсор находился на последнем пункте и при этом была нажата клавиша вниз, то курсор перепрыгнет на первый пункт меню (установка курсора с последнего пункта на первый выполняется подпрограмма BEGIN). Если курсор находился на первом пункте меню и при этом была нажата клавиша вверх, то курсор перепрыгнет на последний пункт (подпрограмма END). В завершение выделяется новый пункт и переход на опрос клавиатуры.

Включение новых функций для оператора PRINT выполняется открытием нового пользовательского канала (как в ZX-РЕВЮ № 5,6 1992):

5 LET START=PEEK 23635+256*PEEK 23636-1

10 LET L=START-256*INT (START/256) : LET H=INT (START/256)

15 FOR X=23296 TO 23304: READ A: POKE X,A: NEXT X

16 RANDOMIZE USR 23296

20 FOR X=START TO START+5: READ A: POKE X,A: NEXT X

21 POKE 23578,21

25 DATA 1,5,0,33,L,H, 195, 85,22 30 DATA L,H,196,21,83

В строках 25-30 L и Н - младший и старший адрес программы в кодах.

И ещё несколько слов в заключение. Программа не проверяет вводимые координаты на допустимые пределы, но это не трудно сделать тем, кто захочет.

Подпрограмма печати узкими символами не сможет напечатать в двух нижних строках, так как использует процедуру ПЗУ для печати точек. Чтобы устранить этот недостаток, Вы можете воспользоваться программой печати точек, напечатанной в "Элементарной графике" ИНФОРКОМа. Если Вы хотите уменьшить и высоту символов до 7 пикселов, то надо только заменить число 8 (сейчас высота 8 пикселов) на 7. Если же до 6, то тут придется немного труднее (создать ещё одну таблицу, указывающую какую горизонтальную строку можно выкинуть, и дополнить саму программу).

Программу печати меню можно сократить почти вдвое, если не использовать символы UDG, а печатать меню пробелом и окантовывать его при помощи PLOT-DRAW. Но преимущество UDG в том, что вид меню можно сделать разнообразным.

Для демонстрации работы новой процедуры печати предназначена демонстрационная Бейсик-программа, фрагменты работы которой Вы видите на рис. 5,6:

В приводимых ниже листингах Бейсик-программ подчеркнутые символы в скобках вводятся в графическом режиме. Так, например, выражение (g8) означает, что сначала надо включить графический регистр (CAPS SHIFT+9), затем нажать клавишу "8" (будет напечатан символ псевдографики с кодом 128). Для набора (q1) надо в графическом регистре нажать "1" (код 129) и т.д.

Рис. 5.

1 BORDER BIN : PAPER BIN : INK 7: CLEAR 29999

2 RANDOMIZE USR 15619: REM : LOAD "UDG MENU"CODE 65368

3 RANDOMIZE USR 15619: REM : LOAD "DEMO"CODE

5 POKE 23562,NOT BIN

10 DATA 1,5, 0,33,58, 93,195, 85,22

11 DATA 40,160,196,21,83

12 RESTORE 10: FOR n=23296 TO 23304: READ a: POKE n,a: NEXT n: RANDOMIZE USR 23296: FOR n=23866 TO 23870: READ a: POKE n,a: NEXT n: POKE 23578,21: POKE 23633,58: POKE 23634,93

20 PRINT "(g8)(g3)";AT 10,13;"D E M O": PAUSE 65: RANDOMIZE USR 42250

25 PRINT "(g2)(g1)";TAB 7;AT BIN ,175;" Напечатав оператором (g8)PRINT (д1)код 130Вы включите печать мелким шрифтом. Оператором (g8)ТАВ

(g1)можно управлять ши-риной шрифта (от 3 до 8 пикселей)."

30 PRINT '" Код 128 включает (g8)english(g1), а код 129-русский шрифт."

35 PRINT '" Шрифт высотой 16 и шириной 8 пик-селей включается кодом 131."

40 PRINT '" Переключиться на стандартную пе-чать можно, включив в оператор (g8) PRINT(g1)код 132."

45 PRINT '" Эта программа позволяет также пе-чатать 2 типа меню (коды 133 и 134) с тенью(код 135) или без нее и выби-рать из этих меню опции(номер опции содержится в регистровой паре (g8)BC)(g1)."

50 GO SUB 9000

55 PRINT AT 0,100;" Передвижение курсора клавишами:"''" (g8)Q(g1)-вверх, ^^^^-вниз, (g8) ENTER (g1) -ввод."

60 GO SUB 9000

65 PRINT "(g8)": POKE 40969,1: RANDOMIZE USR 40968: LET a=USR 41822

70 POKE 40969,2: RANDOMIZE USR 40968: LET a=USR 41822

75 POKE 40969,3: RANDOMIZE USR 40968: PRINT INK 1;CHR$ 135: LET a=USR 41822

80 PRINT #BIN ;AT NOT BIN ,BIN;"© 1994 Amateur Software System": PAUSE BIN : CLS

100 PRINT CHR$ 130;AT 0,175: FOR x=3 TO 7: PRINT TAB x: LIST 60 : PRINT ''': BEEP .05,30: NEXT x : PAUSE BIN : BEEP .1,BIN : CLS

110 PRINT CHR$ 131;AT BIN ,BIN ;: LIST 60

200 GO TO 20

9000 PRINT CHR$ 131;AT 22,5;"Нажмите любую клавишу";CHR$ 130;: PAUSE BIN : RANDOMIZE USR 42250: RETURN

Для переключения режимов управляющие символы можно непосредственно вставлять в оператор PRINT (строки 20, 25, 30, 40, 45, 55, 65), но можно и "печатать" при помощи CHR$ (строка 9000).

Ниже приводится шестнадцатеричный дамп файлов, необходимых программе.

Файл "DEMO" CODE 40000,2291.

9C40

00

00

00

00

00

00

00

00

DC

9C48

00

10

10

10

10

00

10

00

34

9C50

00

28

28

00

00

00

00

00

3C

9C58

00

28

7C

28

28

7C

28

00

8C

9C60

00

10

7C

50

7C

14

7C

10

F4

9C68

00

44

08

10

20

44

00

00

C4

9C70

00

20

50

20

54

48

34

00

6C

9C78

00

08

10

00

00

00

00

00

2C

9C80

00

04

08

08

08

08

04

00

44

9C88

00

40

20

20

20

20

40

00

24

9C90

00

00

28

10

7C

10

28

00

18

9C98

00

00

10

10

7C

10

10

00

F0

9CA0

00

00

00

00

00

00

10

20

6C

9CA8

00

00

00

00

7C

00

00

00

C0

9CB0

00

00

00

00

00

00

10

00

5C

9CB8

00

00

04

08

10

20

40

00

D0

9CC0

00

7C

44

44

44

44

7C

00

64

9CC8

00

10

30

10

10

10

7C

00

50

9CD0

00

7C

04

04

7C

40

7C

00

28

9CD8

00

7C

04

1C

04

04

7C

00

94

9CE0

00

44

44

44

7C

04

04

00

CC

9CE8

00

7C

40

7C

04

04

7C

00

40

9CF0

00

7C

40

7C

44

44

7C

00

C8

9CF8

00

7C

04

04

08

10

10

00

40

9D00

00

7C

44

7C

44

44

7C

00

DD

9D08

00

7C

44

44

7C

04

7C

00

A5

9D10

00

00

00

10

00

00

10

00

CD

9D18

00

00

00

10

00

00

10

20

F5

9D20

00

00

08

10

20

10

08

00

0D

9D28

00

00

00

7C

00

7C

00

00

BD

9D30

00

00

20

10

08

10

20

00

35

9D38

00

7C

44

04

1C

00

10

00

C5

9D40

00

5C

54

74

54

54

5C

00

05

9D48

00

7C

44

44

7C

44

44

00

ED

9D50

00

7C

40

7C

44

44

7C

00

29

9D58

00

44

44

44

44

44

7C

04

C9

9D60

00

3C

24

24

24

24

7C

44

89

9D68

00

7C

40

70

40

40

7C

00

2D

9D70

00

7C

54

54

54

7C

10

00

11

9D78

00

7C

40

40

40

40

40

00

D1

9D80

00

44

28

10

28

44

44

00

49

9D88

00

44

44

4C

54

64

44

00

F5

9D90

10

44

44

4C

54

64

44

00

0D

9D98

00

44

48

70

48

44

44

00

01

9DA0

00

3C

44

44

44

44

44

00

CD

9DA8

00

44

6C

54

44

44

44

00

15

9DB0

00

44

44

7C

44

44

44

00

1D

9DB8

00

7C

44

44

44

44

7C

00

5D

9DC0

00

7C

44

44

44

44

44

00

2D

9DC8

00

7C

44

44

7C

24

44

00

4D

9DD0

00

7C

44

44

7C

40

40

00

6D

9DD8

00

7C

40

40

40

40

7C

00

6D

9DE0

00

7C

10

10

10

10

10

00

49

9DE8

00

44

44

44

7C

04

7C

00

4D

9DF0

00

54

54

38

54

54

54

00

69

9DF8

00

7C

44

78

44

44

7C

00

D1

9E00

00

40

40

7C

44

44

7C

00

9E

9E08

00

44

44

74

54

54

74

00

BE

9E10

00

7C

04

18

04

04

7C

00

CA

9E18

00

44

54

54

54

54

7C

00

C6

9E20

00

7C

04

1C

04

04

7C

00

DE

9E28

00

44

54

54

54

54

7C

04

DA

9E30

00

44

44

44

7C

04

04

00

1E

9E38

00

1C

20

38

20

20

7C

00

06

9E40

00

00

5C

54

74

54

5C

00

B2

9E48

00

00

3C

04

7C

44

7C

00

62

9E50

00

00

78

40

7C

44

7C

00

E2

9E58

00

00

44

44

44

44

7C

04

86

9E60

00

00

3C

24

24

24

7C

44

66

9E68

00

00

7C

44

7C

40

7C

00

FE

9E70

00

00

7C

54

54

7C

10

00

BE

9E78

00

00

7C

40

40

40

40

00

92

9E80

00

00

44

28

10

28

44

00

06

9E88

00

00

44

4C

54

64

44

00

B2

9E90

00

10

44

4C

54

64

44

00

CA

9E98

00

00

44

48

70

48

44

00

BE

9EA0

00

00

3C

44

44

44

44

00

8A

9EA8

00

00

44

6C

54

44

44

00

D2

9EB0

00

00

44

44

7C

44

44

00

DA

9EB8

00

00

7C

44

44

44

7C

00

1A

9EC0

00

00

7C

44

44

44

44

00

EA

9EC8

00

00

7C

44

7C

14

64

00

1A

9ED0

00

00

7C

44

44

7C

40

00

2E

9ED8

00

00

7C

40

40

40

7C

00

2E

9EE0

00

00

7C

10

10

10

10

00

3A

9EE8

00

00

44

44

7C

04

7C

00

0A

9EF0

00

00

54

54

38

54

54

00

16

9EF8

00

00

7C

44

78

44

7C

00

8E

9F00

00

00

40

40

7C

44

7C

00

5B

9F08

00

00

44

44

74

54

74

00

6B

9F10

00

00

7C

04

18

04

7C

00

C7

9F18

00

00

44

54

54

54

7C

00

73

9F20

00

00

7C

04

1C

04

7C

00

DB

9F28

00

00

44

54

54

54

7C

04

87

9F30

00

00

44

44

7C

04

04

00

DB

9F38

00

00

60

20

3C

24

3C

00

F3

9F40

F0

E1

CA

8B

C3

C3

A5

C3

F3

9F48

E1

87

E2

E2

C3

C3

C3

E2

3E

9F50

B8

E2

B8

F0

A6

B8

B8

E4

2B

9F58

B8

B8

C6

C6

E2

F0

E1

F0

96

9F60

9C

B8

B8

B8

B8

B8

B8

B8

A3

9F68

B8

E2

B8

B2

B8

9C

B4

B8

CB

9F70

B8

B4

B8

B8

C6

B8

9C

AC

B1

9F78

9C

AA

D2

E2

C6

CC

C6

F0

59

9F80

C6

B2

D8

C6

B2

B2

E2

B2

2D

9F88

B2

C6

E2

D2

E2

AA

B2

9A

2B

9F90

B2

B1

C6

B2

C6

B2

C6

AA

F2

9F98

C6

B2

93

E2

E2

C6

E2

0F

BD

9FA0

F0

E1

C6

47

8B

93

8E

C3

8C

9FA8

E1

87

C6

C6

C3

C3

C3

E2

66

9FB0

B2

C6

B2

E2

B2

B2

9A

E2

3B

9FB8

B2

B2

C6

C6

C6

F0

C6

E2

A5

9FC0

CA

B2

B2

B2

9A

96

AA

B2

CB

9FC8

B2

8B

AA

B2

B2

9A

B2

B2

B0

9FD0

B2

9A

B2

B2

C6

B2

AA

AA

EB

9FD8

9A

AA

D2

AA

E2

AA

B2

8E

03

9FE0

CA

B2

9A

B2

9A

B2

AA

B2

EF

9FE8

B2

9A

9A

B2

B2

9A

B2

9A

B7

9FF0

B2

9A

B2

B2

C6

B2

AA

AA

0B

9FF8

B2

AA

D2

AA

E2

AA

B2

9A

47

A000

20

A4

8F

A4

C1

A4

0A

A5

AB

A008

3E

01

C3

11

A3

00

00

00

5E

A010

00

00

00

00

00

00

00

00

B0

A018

00

00

00

00

00

00

00

00

B8

A020

00

00

00

00

00

00

00

00

C0

A028

F5

3A

9A

A2

47

F1

05

28

98

A030

2D

FE

80

38

29

28

4B

FE

4D

A038

A5

D2

F4

09

FE

88

30

1E

20

A040

21

50

A0

D6

81

CB

27

16

50

A048

00

5F

19

5E

23

56

EB

E9

0B

A050

8A

A0

98

A0

9D

A0

A2

A0

D1

A058

A9

A0

BE

A0

69

A1

C5

D5

43

A060

E5

2A

88

A1

CD

6F

00

2A

9E

A068

51

5C

01

28

A0

5E

71

23

70

A070

56

70

78

BA

20

04

79

BB

60

A078

28

04

ED

53

88

A1

E1

D1

5F

A080

C1

C9

21

00

3C

01

20

9F

C7

A088

18

06

21

40

9B

01

80

9F

62

A090

22

36

5C

ED

43

A4

A1

C9

22

A098

21

8E

A1

18

08

21

9D

A2

08

A0A0

18

03

21

F4

09

22

88

A1

C4

A0A8

C9

CD

3A

A1

06

06

90

32

87

A0B0

1D

A4

3E

92

32

E9

A0

3E

DA

A0B8

04

32

8D

A1

18

11

CD

3A

EC

A0C0

A1

06

03

90

32

1D

A4

3E

CB

A0C8

9E

32

E9

A0

32

8D

A1

CD

EE

A0D0

A2

A0

3E

11

D7

3A

19

A4

CF

A0D8

D7

3E

10

D7

3A

1A

A4

D7

43

A0E0

2A

8A

A1

3A

8C

A1

57

5F

F2

A0E8

0E

92

3A

8D

A1

3D

32

8D

8C

A0F0

A1

20

09

0E

99

CD

15

A1

84

A0F8

0E

95

18

12

0D

0D

CD

15

61

A100

A1

7A

BB

28

06

FE

02

28

CD

A108

02

18

03

0C

0C

0C

15

20

1F

A110

D9

22

8A

A1

C9

CD

28

A1

36

A118

3A

1E

A4

3D

3D

47

0C

CD

4F

A120

35

A1

10

FB

0C

2C

18

0D

FF

A128

3E

16

CD

5E

A0

7D

CD

5E

90

A130

A0

7C

CD

5E

A0

79

CD

5E

5C

A138

A0

C9

11

19

A4

2A

4B

A3

28

A140

23

01

06

00

ED

B0

2B

22

F5

A148

4B

A3

2A

4D

A3

01

06

00

F8

A150

ED

42

22

4D

A3

2A

1B

A4

1B

A158

22

8A

A1

3A

1D

A4

32

8C

FF

A160

A1

F5

85

3D

32

1B

A4

F1

3B

A168

C9

2A

8A

A1

24

0E

8F

CD

B5

A170

28

A1

3A

1E

A4

3D

47

CD

27

A178

35

A1

24

10

FA

3A

8C

A1

84

A180

47

CD

28

A1

2D

10

FA

C9

FE

A188

F4

09

00

00

0A

03

FE

0D

3E

A190

CA

2E

A2

FE

16

CA

3B

A2

86

A198

FE

17

CA

64

A2

FE

20

D8

14

A1A0

06

00

4F

21

20

9F

09

5E

DD

A1A8

ED

4B

36

5C

26

00

6F

29

D1

A1B0

29

29

09

0E

08

3A

81

5C

D9

A1B8

C6

F7

57

D5

7A

D6

F7

47

D0

A1C0

7E

14

C4

16

A2

15

17

DC

77

A1C8

1E

A2

F5

3A

B0

5C

3C

32

D2

A1D0

B0

5C

F1

10

EC

23

E5

2A

9C

A1D8

B0

5C

25

3A

81

5C

95

ED

43

A1E0

44

6F

22

B0

5C

E1

D1

0D

21

A1E8

20

D1

2A

B0

5C

3A

81

5C

C7

A1F0

47

87

3D

85

38

09

78

85

5F

A1F8

6F

3E

08

84

67

18

13

24

88

A200

28

0A

25

3E

06

BC

30

04

2D

A208

2E

00

18

06

21

00

AF

CD

93

A210

77

A2

22

B0

5C

C9

CB

23

B0

A218

D0

17

14

C8

18

F8

F5

C5

47

A220

D5

E5

ED

4B

B0

5C

CD

E5

72

A228

22

E1

D1

C1

F1

C9

2A

B0

F3

A230

5C

3E

08

94

ED

44

67

2E

CE

A238

FF

18

B2

21

8E

A1

22

9B

B0

A240

A2

11

4C

A2

3E

01

32

9A

8E

A248

A2

C3

80

0A

11

52

A2

C3

A1

A250

7D

0A

ED

5B

9B

A2

CD

70

3B

A258

0A

2A

0E

5C

22

B0

5C

AF

75

A260

32

9A

A2

C9

11

6A

A2

C3

19

A268

80

0A

11

8E

A1

CD

7D

0A

28

A270

3A

0E

5C

32

81

5C

C9

C5

53

A278

E5

01

00

00

CD

3D

1F

CD

F6

A280

54

1F

30

10

11

01

40

21

48

A288

00

40

01

FF

17

36

00

ED

A4

A290

B0

E1

C1

C9

E1

E1

E1

C3

B3

A298

7B

1B

00

9D

A2

FE

0D

28

42

A2A0

63

FE

16

28

66

FE

20

D8

3D

A2A8

ED

5B

36

5C

6F

26

00

29

E2

A2B0

29

29

19

EB

ED

4B

B0

5C

EC

A2B8

79

E6

18

F6

40

67

79

E6

CD

A2C0

07

B7

1F

1F

1F

1F

80

6F

8B

A2C8

C5

CD

F0

A2

3E

20

85

6F

E0

A2D0

30

04

3E

08

84

67

CD

F0

94

A2D8

A2

E1

24

3E

1F

BC

D2

12

1E

A2E0

A2

2C

2C

26

00

3E

16

BD

B3

A2E8

D2

12

A2

2E

00

C3

0F

A2

B2

A2F0

E5

0E

04

06

02

1A

77

CB

ED

A2F8

3F

B6

77

24

10

F7

13

0D

51

A300

20

F1

E1

C9

2A

B0

5C

26

BA

A308

20

18

CF

21

9D

A2

C3

3E

13

A310

A2

F5

3E

02

CD

01

16

F1

5F

A318

21

FE

9F

01

02

00

09

3D

C2

A320

20

FC

5E

23

56

23

4E

23

4A

A328

46

69

60

A7

ED

52

4D

44

51

A330

78

B1

0B

C8

1A

ED

43

4D

66

A338

A3

ED

53

4B

A3

CD

28

A0

41

A340

ED

4B

4D

A3

ED

5B

4B

A3

41

A348

13

18

E5

00

00

00

00

21

1C

A350

B2

88

01

06

00

09

3D

20

9A

A358

FC

11

19

A4

ED

B0

CD

C0

EF

A360

A3

CD

E2

A3

01

21

00

CD

E7

A368

3D

1F

3A

04

5C

FE

41

28

68

A370

0F

FE

51

28

10

FE

0D

20

D4

A378

EB

ED

4B

1F

A4

06

00

C9

D0

A380

01

3C

2C

18

03

01

3D

2D

12

A388

21

A4

A3

71

21

B7

A3

70

EF

A390

3A

19

A4

CB

27

CB

27

CB

D9

A398

27

47

3A

1A

A4

80

CD

F0

DE

A3A0

A3

3A

1F

A4

3C

32

1F

A4

14

A3A8

47

3A

1D

A4

B8

DC

C0

A3

84

A3B0

05

FC

D3

A3

2A

1B

A4

2C

DF

A3B8

22

1B

A4

CD

E2

A3

18

A4

4A

A3C0

3E

01

32

1F

A4

2A

1B

A4

80

A3C8

3A

1D

A4

95

ED

44

6F

22

BD

A3D0

1B

A4

C9

3A

1D

A4

32

1F

47

A3D8

A4

2A

1B

A4

85

6F

22

1B

39

A3E0

A4

C9

3A

1A

A4

CB

27

CB

A5

A3E8

27

CB

27

47

3A

19

A4

80

62

A3F0

F5

ED

5B

1B

A4

CD

02

A4

02

A3F8

3A

1E

A4

47

F1

77

23

10

79

A400

FC

C9

7B

E6

18

CB

3F

CB

B7

A408

3F

CB

3F

F6

58

67

7B

E6

0B

A410

07

B7

1F

1F

1F

1F

82

6F

DF

A418

C9

05

01

03

00

15

05

15

BD

A420

85

05

01

01

01

0F

0A

83

ED

A428

16

02

02

46

49

4C

45

4E

54

A430

41

4D

45

82

17

05

16

10

6B

A438

7F

4D

65

67

61

20

42

41

78

A440

53

49

43

16

10

77

42

65

07

A448

74

61

20

42

41

53

49

43

43

A450

16

10

6F

4C

4F

47

4F

16

D0

A458

10

67

50

41

53

43

41

4C

27

A4 60

16

10

5F

50

52

4F

4C

4F

15

A4 68

47

16

10

57

5A

45

55

53

17

A470

16

10

4F

47

45

4E

53

20

D6

A478

34

44

16

10

47

4D

4F

4E

EB

A480

53

20

34

44

16

10

3F

62

D6

A488

6F

6F

74

84

10

02

87

86

21

A490

02

07

00

14

07

08

14

01

75

A498

16

00

16

46

49

4C

45

14

9C

A4A0

00

16

02

15

43

4F

50

59

AC

A4A8

16

03

15

4D

4F

56

45

16

C7

A4B0

04

15

44

45

4C

45

54

45

20

A4B8

16

05

15

52

45

4E

41

4D

FF

A4C0

45

86

00

07

09

14

07

09

63

A4C8

81

15

01

82

17

05

16

B8

6F

A4D0

67

46

41

4A

4C

16

A5

57

0A

A4D8

4B

4F

50

49

52

4F

57

41

E8

A4E0

54

58

16

A5

4F

50

4F

5E

37

A4E8

49

53

54

49

54

58

16

A5

2C

A4F0

47

55

44

41

4C

49

54

58

F6

A4F8

16

A5

3F

50

45

52

45

49

0B

A500

4D

45

4E

4F

57

41

54

58

18

A508

80

84

11

E8

03

AF

08

21

85

A510

00

40

01

00

18

AF

BE

28

A3

A518

0F

08

3E

01

08

1B

7A

B3

63

A520

20

03

11

E8

03

1A

A6

77

1B

A528

23

0B

78

B1

20

E7

08

3D

70

A530

28

DB

C9

00

00

00

00

00

A1

Дамп

файла

"UDG MENU" CODE 65368,168.

FF58

00

7F

7F

60

6F

68

68

68

5C

FF60

00

FF

FF

00

FF

00

00

00

5C

FF68

00

FE

FE

06

F6

16

16

16

A1

FF70

68

68

68

68

68

68

68

68

AF

FF78

00

00

00

00

00

00

00

00

77

FF80

16

16

16

16

16

16

16

16

2F

FF88

68

68

68

6F

60

7F

7F

00

8C

FF90

00

00

00

FF

00

FF

FF

00

8C

FF98

16

16

16

F6

06

FE

FE

00

D1

FFA0

68

68

68

68

6F

68

68

68

E6

FFA8

00

00

00

00

FF

00

00

00

A6

FFB0

16

16

16

16

F6

16

16

16

3F

FFB8

FF

FF

FF

FF

FF

FF

FF

FF

AF

FFC0

FF

FF

FF

FF

FF

FF

FF

FF

B7

FFC8

FF

FF

FF

FF

FF

FF

FF

FF

BF

FFD0

80

80

80

80

80

80

80

80

CF

FFD8

00

00

00

00

00

00

00

00

D7

FFE0

01

01

01

01

01

01

01

01

E7

FFE8

80

80

80

80

80

80

80

FF

66

FFF0 00 00 00

00 00 00 00 FF EE

FFF8 | 01 01 01

01 01 01 01 FF | FD

96-байтная таблица для

"вырезки" английских символов.

5 LET P=40768: RESTORE 10: FOR I=1

TO 96: READ A$,A: POKE P+I-1,A: NEXT I

STOP

10

DATA '

II

BIN

11110000

20

DATA '

• ,

BIN

11100001

30

DATA '

kawyAki

',BIN 110

40

DATA '

BIN

10001011

50

DATA '

$",

BIN

11000011

60

DATA '

O. П

о ,

BIN

11000011

70

DATA '

&",

BIN

10100101

80

DATA '

T II

BIN

11000011

90

DATA '

BIN

11100001

100

DATA

,BIN

10000111

110

DATA

,BIN

11100010

120

DATA

,BIN

11100010

130

DATA

П !

,BIN

11000011

140

DATA

,BIN

11000011

150

DATA

П !

,BIN

11000011

155

DATA

,BIN

11100010

160

DATA

"0"

,BIN

10111000

170

DATA

"1"

,BIN

11100010

180

DATA

"2"

,BIN

10111000

190

DATA

"3"

,BIN

11110000

200

DATA

"4"

,BIN

10100110

210

DATA

"5"

,BIN

10111000

220

DATA

"6"

,BIN

10111000

230

DATA

"7"

,BIN

11100100

240

DATA

"8"

,BIN

10111000

250

DATA

"9"

,BIN

10111000

260

DATA

,BIN

11000110

270

DATA

,BIN

11000110

280

DATA

,BIN

11100010

290

DATA

"="

,BIN

11110000

300

DATA

,BIN

11100001

310

DATA

11 !

,BIN

11110000

320

DATA

,BIN

10011100

330

DATA

"A"

,BIN

10111000

340

DATA

"B"

,BIN

10111000

350

DATA

"C"

,BIN

10111000

360

DATA

"D"

,BIN

10111000

370

DATA

"E"

,BIN

10111000

380

DATA

"F"

,BIN

10111000

390

DATA

"G'

,BIN

10111000

400

DATA

"H"

,BIN

10111000

410

DATA

"I"

,BIN

11100010

420

DATA

"J"

,BIN

10111000

430

DATA

"K"

,BIN

10110010

440

DATA

"L"

,BIN

10111000

450

DATA

"M"

,BIN

10011100

460

DATA

"N"

,BIN

10110100

470

DATA

"O"

,BIN

10111000

480

DATA

"P"

,BIN

10111000

490

DATA

"Q"

,BIN

10110100

500

DATA

"R"

,BIN

10111000

510

DATA

"S"

,BIN

10111000

520

DATA

"T"

,BIN

11000110

530

DATA

"U"

,BIN

10111000

540

DATA

"V"

,BIN

10011100

550

DATA

"W"

,BIN

10101100

560

DATA

"X"

,BIN

10011100: REM BIN 10101100

570

DATA

"Y"

,BIN

10101010

580

DATA

"Z"

,BIN

11010010

590

DATA

,BIN

11100010

600

DATA

,BIN

11000110

610

DATA

,BIN

11001100

620

DATA

II л II

,BIN

11000110

630

DATA

II II

,BIN

11110000

640

DATA

II s II

,BIN

11000110

650

DATA

"a"

,BIN

10110010

660

DATA

"b"

,BIN

11011000

670

DATA

"c"

,BIN

11000110

680

DATA

"d"

,BIN

10110010

690

DATA

"e"

,BIN

10110010

700

DATA

"f"

,BIN

11100010

710

DATA

"g"

,BIN

10110010

720

DATA

"h"

,BIN

10110010

730

DATA

"i"

,BIN

11000110

740

DATA

"j"

,BIN

11100010

750

DATA

"k"

,BIN

11010010

760

DATA

"l"

,BIN

11100010

770

DATA

"m"

,BIN

10101010

780

DATA

"n"

,BIN

10110010

790

DATA

"o"

,BIN

10011010

800

DATA

"p"

,BIN

10110010

810

DATA

"q"

,BIN

10110001

820

DATA

,BIN

11000110

830

DATA

"s"

,BIN

10110010

840

DATA

"t"

,BIN

11000110

850

DATA

"u"

,BIN

10110010

860

DATA

"v"

,BIN

11000110

870

DATA

"w"

,BIN

10101010

880

DATA

"x"

,BIN

11000110

890

DATA

"y"

,BIN

10110010

900

DATA

"z"

,BIN

10010011

910

DATA

,BIN

11100010

920

DATA

,BIN

11100010

930

DATA

,BIN

11000110

940

DATA

,BIN

11100010

950

DATA

,BIN

00001111

96-байтная таблица для "вырезки" русских символов

5 LET P=40864: RESTORE 10: FOR I=1 TO 96: READ A$,A: POKE P+I-1,A: NEXT I:

STOP

6 POKE 23606,80: POKE 23607,194: STOP 10 DATA " ",BIN 11110000

20 DATA "!",BIN 11100001 30 DATA "kawyAki",BIN 11000110 40 DATA "#",BIN 1000111 50 DATA "$",BIN 10001011

60 70 80 90 100

DATA " DATA " DATA " DATA " DATA

an

О , &",

T II

BIN 1 BIN 1 BIN 1 BIN 1 ,BIN

_0010011 _0001110 _1000011 _1100001 10000111

110

DATA

,BIN

11000110

120

DATA

,BIN

11000110

130

DATA

П П ,

,BIN

11000011

140

DATA

П _ П

,BIN

11000011

150

DATA

П П

,BIN

11000011

155

DATA

,BIN

11100010

160

DATA

"0"

,BIN

10110010

170

DATA

"1"

,BIN

11000110

180

DATA

"2"

,BIN

10110010

190

DATA

"3"

,BIN

11100010

200

DATA

"4"

,BIN

10110010

210

DATA

"5"

,BIN

10110010

220

DATA

"6"

,BIN

10011010

230

DATA

"7"

,BIN

11100010

240

DATA

"8"

,BIN

10110010

250

DATA

"9"

,BIN

10110010

260

DATA

,BIN

11000110

270

DATA

,BIN

11000110

280

DATA

,BIN

11000110

290

DATA

,BIN

11110000

300

DATA

,BIN

11000110

310

DATA

,BIN

11100010

320

DATA

,BIN

11001010

330

DATA

"A"

,BIN

10110010

340

DATA

"B"

,BIN

10110010

350

DATA

"C"

,BIN

10110010

360

DATA

"D"

,BIN

10011010

370

DATA

"E"

,BIN

10010110

380

DATA

"F"

,BIN

10101010

390

DATA

"G"

,BIN

10110010

400

DATA

"H"

,BIN

10110010

410

DATA

"I"

,BIN

10001011

420

DATA

"J"

,BIN

10101010

430

DATA

"K"

,BIN

10110010

440

DATA

"L"

,BIN

10110010

450

DATA

"M"

,BIN

10011010

460

DATA

"N"

,BIN

10110010

470

DATA

"O"

,BIN

10110010

480

DATA

"P"

,BIN

10110010

490

DATA

"Q"

,BIN

10011010

500

DATA

"R"

,BIN

10110010

510

DATA

"S"

,BIN

10110010

520

DATA

"T"

,BIN

11000110

530

DATA

"U"

,BIN

10110010

540

DATA

"V"

,BIN

10101010

550

DATA

"W"

,BIN

10101010

560

DATA

"X"

,BIN

10011010: REM BIN 10101100

570

DATA

"Y"

,BIN

10101010

580

DATA

"Z"

,BIN

11010010

590

DATA

,BIN

10101010

600

DATA

""

,BIN

11100010

610

DATA

"]"

,BIN

10101010

620

DATA

II Л II

,BIN

10110010

630

DATA

II II

,BIN

10001110

640

DATA

II s II

,BIN

11001010

650

DATA

"a"

,BIN

10110010

660

DATA

"b"

,BIN

10011010

670

DATA

"c"

,BIN

10110010

680

DATA

"d"

,BIN

10011010

690

DATA

"e"

,BIN

10110010

700

DATA

"f"

,BIN

10101010

710

DATA

"g"

,BIN

10110010

720

DATA

"h"

,BIN

10110010

730

DATA

"i"

,BIN

10011010

740

DATA

"j"

,BIN

10011010

750

DATA

"k"

,BIN

10110010

760

DATA

"l"

,BIN

10110010

770

DATA

"m"

,BIN

10011010

780

DATA

"n"

,BIN

10110010

790

DATA

"o"

,BIN

10011010

800

DATA

"p"

,BIN

10110010

810

DATA

"q"

,BIN

10011010

820

DATA

,BIN

10110010

830

DATA

"s"

,BIN

10110010

840

DATA

"t"

,BIN

11000110

850

DATA

"u"

,BIN

10110010

860

DATA

"v"

,BIN

10101010

870

DATA

"w"

,BIN

10101010

880

DATA

"x"

,BIN

10110010

890

DATA

"y"

,BIN

10101010

900

DATA

"z"

,BIN

11010010

910

DATA

"{"

,BIN

10101010

920

DATA

"|"

,BIN

11100010

930

DATA

"}"

,BIN

10101010

940

DATA

,BIN

10110010

950

DATA

,BIN

10011010




СОДЕРЖАНИЕ:


  Оставте Ваш отзыв:

  НИК/ИМЯ
  ПОЧТА (шифруется)
  КОД



Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Железо - схема Advansed Flash Modem pазpаботанная Flash Inc.
Посвящение в альбом - Рассуждения вокруг "Ы", или фантаст поневоле.
Abstract - Хз-тайм - газета нового поколения!
Размышления - конкурс на лучшую графику, музыку и DEMO 1998 года. О наездах и сделанных программах за последнее время. Журналы сейчас размножаются,как китайцы.
Твой сервер - О плохих пользователях BBS.

В этот день...   21 ноября