Навигация

• Онлайн: 2

qr_code

Flag Counter




Рейтинг@Mail.ru

Индекс цитирования

Яндекс
creation/prograf/vehi/second.txt · Последнее изменение: 15.01.2025 12:37 — nozdr

Как я учился программировать - 2

Знакогенераторы

В процессе загрузки бейсика, да и некоторых других программ, в уголке экрана среди бинарной мешанины программного кода иногда проскакивали упорядоченные символы. Как я через некоторое время понял, это был знакогенератор, то есть изображения всех символов. Сейчас на компьютерах сотни разных шрифтов, а раньше такого разнообразия не было. Один знакогенератор и всё. Потому что вся эта красота просит много памяти, а памяти на всё про всё 64Кб. Хочешь буквы покрасивее, а фигвам – только те, которые есть в стандартном знакогенераторе. Но, как выяснилось, эти изображения можно изменять.

Скрин из Урока 8 про знакогенератор

В некоторых играх встречались очень симпатичные (по сравнению со стандартным) шрифты.

Exolon Мне тоже захотелось иметь возможность менять начертание букв. К этому времени я уже несколько лет занимался оформительскими работами в школе, и что такое шрифты, знал очень хорошо. Если бы у меня была к тому времени программа для разработки и сохранения знакогенератора, то я бы ею и воспользовался.

Программа "Редактор знакогенератора"

Но её у меня не было, поэтому я по обыкновению начал изобретать своё колесо с блэкджеком и шлю..1). Стандартный знакогенератор я уже видел, на один символ отводилась матрица всего 5×8 пикселов. Особо не разбежишься, поэтому в нём символы и были такие «убогие». Но зато всего 5*128=640 байт. Для начала я попробовал просто подкорректировать некоторые символы.

NoZDR со старым и новым начертаниями

Точечная замена знакогенератора

Точечная замена знакогенератора

100 CLS:SCREEN 0,15,255:COLOR 15
110 POKE 78*5,254,8,16,32,254:REM N
120 POKE 111*5,124,130,130,130,124:REM О
130 POKE 90*5,194,178,146,154,134:REM Z
140 POKE 68*5,130,254,130,130,124:REM D
150 POKE 82*5,254,18,50,82,140:REM R
160 PLOT 55,160,2:LINE 5,5,BS:PRINT "NОZDR"
170 POKE 78*5,254,4,8,16,254:REM N
180 POKE 111*5,112,136,136,136,112:REM О
190 POKE 90*5,194,162,146,138,134:REM Z
200 POKE 68*5,254,130,130,130,124:REM D
210 POKE 82*5,254,34,34,98,156:REM R
220 COLOR 3:PLOT 55,110,2:LINE 5,5,BS:PRINT "NОZDR"
230 POKE 78*5,254,254,8,16,254:REM N
240 POKE 111*5,112,216,136,216,112:REM О
250 POKE 90*5,226,242,186,158,142:REM Z
260 POKE 68*5,254,254,130,130,124:REM D
270 POKE 82*5,254,254,34,34,220:REM R
280 COLOR 4:PLOT 55,60,2:LINE 5,5,BS:PRINT "NОZDR"

Наконец-то можно было написать на экране свой ник в нормальном виде! И я засел за миллиметровку. Оригиналов у меня не сохранилось, поэтому пришлось повторить это в экселе :)

шрифт N_FIT

Посидев несколько часов с миллиметровкой и калькулятором, я в конце концов сделал аж целых три знакогенератора по 128 символов 5*8 (корректирующий ST_FIX, с большими и маленькими русскими буквами N_RUS, с толстыми буквами N_FIT), да на этом и успокоился.

4 знакогенератора

Посмотреть вживую

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

Программа с 4-мя знакогенераторами

Программа с 4-мя знакогенераторами

100 CLS:HIMEM 30000
110 SCREEN0,15,255
200 RESTORE 1100: GOSUB 500: DX=25:  DY=45:  GOSUB 600
210 RESTORE 1120: GOSUB 500: DX=135: DY=45:  GOSUB 600
220 RESTORE 1140: GOSUB 500: DX=25:  DY=130: GOSUB 600
230 RESTORE 1160: GOSUB 500: DX=135: DY=130: GOSUB 600
250 PRINT AT 1,2 SPC(30):CUR1,2:GOTO 2000
500 REM ГРУЗИМ ЗНАКОГЕНЕРАТОР В ПАМЯТЬ
510 READ ZG¤:PRINT AT 1,2 "ГРУЗИМ ЗНАКОГЕНЕРАТОР ";ZG¤;"     "
520 K=0:FOR I=0 TO 15
530 READ S8¤
540 FOR J=1 TO 80 STEP 2
550 X=(ASC(MID¤(S8¤,J,1))-48)*16+ASC(MID¤(S8¤,J+1,1))-48
560 POKE K,X: K=K+1: NEXT J: NEXT I
570 RETURN
600 REM РИСУЕМ ЗНАКОГЕНЕРАТОР
630 PLOT DX,255-DY,2: LINE1,1,BS: COLOR10: PRINTZG¤: CUR1,2: COLOR15
610 FOR I=8 TO 15
615 I1=255-(I-7)*9-DY:I2=(I-8)*16+128
620 FOR J=0 TO 15
630 PLOT J*6+DX,I1,2: LINE1,1,BS: PRINTCHR¤(I2+J):CUR1,2
640 NEXTJ:NEXTI
800 RETURN
1000 REM ДАННЫЕ ЗНАКОГЕНЕРАТОРОВ
1100 DATA "ST"
1101 DATA "00000000007<:::2::7<7<=6=>=67<183<783<1810387<38103892?>9238381=?>1=380010381000"
1102 DATA "?>>><6>>?>0038283800?><6=6<6?>3048300<0<0854?254088080?<121<80?>0:4:3>5438>>3854"
1103 DATA "00?>7<381010387<?>00286<?>6<2800;>00;>008<8:7>027:90:<::6:12>0>0>0>0>008:4?>:408"
1104 DATA "080<?>0<082060?>602010107<381010387<10107040404040103810381070787<78701<3<7<3<1<"
1105 DATA "00000000000000;>00000006000600287<287<284438283844462610<8<46<92:<40:000160>0000"
1106 DATA "003844820000824438004830?<304810107<101000;0700000101010101000<0<000004020100804"
1107 DATA "7<:2928:7<000804?>0084<2:2928<4282929:66302824?>204>8:8:8:727<929292640002?20:06"
1108 DATA "6<9292926<4<9292927<00<<<<000000;67600000010284482282828282882442810000<02;2120<"
1109 DATA "7<82;2::3<?8242224?8?>9292926<7<8282824482?>82827<?>92929282?>121212027<82829274"
1110 DATA "?>101010?>0082?>8200428282827>?>10284482?>808080<0?>041804?>?>081020?>7<8282827<"
1111 DATA "?>1212120<7<82:2<2?<?>1232528<4<929292640202?>02027>8080807>3>4080403>7>8070807>"
1112 DATA "<6281028<60608?00806<2;2929:8600?>8282000408102040008282?>0008040204088080808080"
1113 DATA "?>107<827<?8242224?8?>929292627>404040?><07<427><0?>929292823844?>4438?>02020206"
1114 DATA "<6281028<6?>201008?>?>402610?>?>1028448280?80402?>?>041804?>?>101010?>7<8282827<"
1115 DATA "?>020202?>8<523212?>?>1212120<7<828282440202?>02020>9090907><628?>28<6?>9292926<"
1116 DATA "?>90909060?>906000?>448282926<?>80?>80?>449292927<7>407>40?>1>101010?>?<?<?<?<?<"
1120 DATA "ST_FIX"
1121 DATA "00000000007<:::2::7<7<=6=>=67<183<783<1810387<38103892?>9238389<?>9<380010381000"
1122 DATA "7<6<446<7<00382838007<4454447<2050201<0<0854?254088080?<121<80?>0:4:3>5438>>3854"
1123 DATA "00?>7<381010387<?>00286<?>6<2800;>00;>008<8:7>027:90:<::6:12>0>0>0>0>008:4?>:408"
1124 DATA "080<?>0<082060?>602010107<381010387<10107040404040103810381060707870601838783818"
1125 DATA "00000000000000;>00000006000600287<287<284854?>5424462610<8<46<92:<40:0000:060000"
1126 DATA "003844820000824438004830?<304810107<101000:0600000101010101000<0<000004020100804"
1127 DATA "7<:2928:7<000804?>0084<2:2928<4482929:66302824?>204>8:8:8:727<929292640402>2120>"
1128 DATA "6<9292926<4<9292927<00<<<<000000;67600000010284482282828282882442810000402:2120<"
1129 DATA "7<82;2::3<?<222222?<?>9292926<7<82828244?>8282827<?>92928244?>121202047<82829274"
1130 DATA "?>101010?>0082?>8200408282827>?>10284482?>808080<0?>041804?>?>040810?>7<8282827<"
1131 DATA "?>2222221<7<82:242;<?>2222629<4<929292640202?>02027>8080807>3>4080403>7>8070807>"
1132 DATA "<6281028<60>10>0100><4:2928:4600?>8282000408102040008282?>0008040204088080808080"
1133 DATA "?>10?>827<?8242222?>?>92929264?>8080?>8080?<8282?>?>929282443<42?>423<?>02020204"
1134 DATA "<6281028<6?>201008?>?>201308?>?>10284482807<0202?>?>083008?>?>101010?>7<8282827<"
1135 DATA "?>020202?>9<622222?>?>2222221<7<828282440202?>02020>9090907>>>10?>10>>?>9292926<"
1136 DATA "?>90909060?>909060?>448292926<?>80?>80?>449292927<7>407>40?>1>101010?>7>7>7>7>7>"
1140 DATA "N_FIT"
1141 DATA "00000000007<:::2::7<7<=6=>=67<183<783<1810387<38103892?>9238389<?>9<380010381000"
1142 DATA "7<6<446<7<00382838007<4454447<2050201<0<0854?254088080?<121<80?>0:4:3>5438>>3854"
1143 DATA "00?>7<381010387<?>00286<?>6<28;>;>00;>;>8<?>7>027:;8;<::7:3:>0>0>0>0>008:4?>:408"
1144 DATA "080<?>0<082060?>602010107<381010387<10107040404040103810381060707870601838783818"
1145 DATA "000000000000;>;>;>000606000606287<287<285<54?>54744<2<1068646<94:<40:000080>0600"
1146 DATA "00387<<60000<67<38006<38?>386<18187>181800;0?070001818181818>0>0>00000<06030180<"
1147 DATA "7<82?>?>7<04?>?>?>00>4?2;>;>9<4492?>?>6<3824?>?>?>4>8:?:?:707<?>?>926406>2?>?>1>"
1148 DATA "7<92?>?>7<5<92?>?>7<00<<<<<<0000;6?6760010387<>><66<6<6<6<6<<6>>7<38100<:2;>;>1<"
1149 DATA "?>82;:;>;>?<12?>?>?<?>?>?>927<7<?>?>8244?>?>?>827<?>?>?>9282?>?>?>12027<?>?>8272"
1150 DATA "?>?>?>10?>82?>?>?>824080?>?>7>?>?>?>38<6?>?>?>8080?>1<?8?<?>?>?>?<18?>7<?>?>827<"
1151 DATA "?>?>?>120<7<82?>7>;<?>?>?>22=<4<9>?>?26402?>?>?>027>80?>?>7>3>40?>7>3>7>>07>?>7>"
1152 DATA ">>3>?>?8>>0>?0?>?>0>?2?:?>;>9>00?>?>82000<183060<00082?>?>00180<060<18<0<0<0<0<0"
1153 DATA "?>10?>86?>?<22?>?>?<?>?>?>92627>707>7>?0?<82?>?>?>?>?>?>92447>>2?>>27>?>?>?>0206"
1154 DATA ">>?8?>3>>>?>30?8?<?>?>30?:?<?>?>?>?>18>6?804?>?>?>?>3<?83<?>?>?>?>10?>?>?>?>82?>"
1155 DATA "?>02?>?>?>=<22?>?>?>?>?>?>221<7<?>?>824402?>?>?>025>90?>?>7>?>7<?>7<?>?>?>?>927<"
1156 DATA "?>?>?>8870?>?>8>70?>4492?>?>6<?>>0?>>0?>4492?>?>7<7>707>70?>3>20?>?>?>7>7>7>7>7>"
1160 DATA "N_RUS"
1161 DATA "00000000007<:::2::7<7<=6=>=67<183<783<1810387<38103892?>9238389<?>9<380010381000"
1162 DATA "7<6<446<7<00382838007<4454447<2050201<0<0854?254088080?<121<80?>0:4:3>5438>>3854"
1163 DATA "00?>7<381010387<?>00286<?>6<2800;>00;>008<8:7>027:90:<::6:12>0>0>0>0>008:4?>:408"
1164 DATA "080<?>0<082060?>602010107<381010387<10107040404040103810381060707870601838783818"
1165 DATA "00000000000000;>00000006000600287<287<284854?>5424462610<8<46<92:<40:0000:060000"
1166 DATA "003844820000824438004830?<304810107<101000:0600000101010101000<0<000004020100804"
1167 DATA "7<:2928:7<000804?>0084<2:2928<4482929:66302824?>204>8:8:8:727<929292640402>2120>"
1168 DATA "6<9292926<4<9292927<00<<<<000000;67600000010284482282828282882442810000402:2120<"
1169 DATA "?>10?>827<?8242222?>?>92929264?>8080?>8080?<8282?>?>929282443<42?>423<?>02020204"
1170 DATA "<6281028<6?>201008?>?>201308?>?>10284482807<0202?>?>083008?>?>101010?>7<8282827<"
1171 DATA "?>020202?>9<622222?>?>2222221<7<828282440202?>02020>9090907>>>10?>10>>?>9292926<"
1172 DATA "?>90909060?>909060?>448292926<?>80?>80?>449292927<7>407>40?>1>101010?>8080808080"
1173 DATA "?<2078847860949454?87894949260?<8080?<80609294947878949494583844?>4438?<04040408"
1174 DATA "<4281028<47<808040?<7<808640?<?<101028<480780404?<?<08?008?<?<101010?<7884848478"
1175 DATA "?<040404?<98642424?<?<2424241878848484480404?<04041<:0:0:07<><10?<10><?894949468"
1176 DATA "?<90909060?<909060?<4884949468?<80?<80?<48849494787<407<40?<3<202020?<7>7>7>7>7>"
2000 PAUSE 10: RUN

У меня даже появилась извращённая идея написать текст одним и тем же символом, на лету переписывая его графическое изображение :) А также сделать шрифты 8*8 и 16*16. Но эту идею я так и не додумал, потому что сам процесс я освоил, а собственно терять время на изобретение всех остальных колёс не хотелось.

кусочек Unicode

В процессе перерисовки знакогенератора возник закономерный вопрос: а сколько же всего есть существует разных символов, которые может понадобиться отобразить на экране компьютера? Этот этап стал ещё одной «вехой» большого пути – моим увлечением символами – семиотикой вообще и ставрографией в частности. Таких символов оказалось очень много, как минимум больше 150000, и это только самих графем, не говоря уже о фонтах.

В общем, рисование пиксельных шрифтов было фактически рисованием маленьких пиксельных картинок, поэтому я плавно перешёл к рисованию спрайтов.

Спрайты

Продолжение следует… …


Инструменты страницы

Инструменты пользователя