Изучение программирования
Как сейчас человеку научиться программировать?
Самое простое это записаться на курсы, благо рекламы всяких разных курсов от «Python с трудоустройством» до «С++ за месяц» полно на любом сайте.
Можно смотреть обучающие ролики на Ютубе.
Можно читать обучающие статьи.
Можно задавать вопросы на форумах и читать Stack Overflow.
Можно скачать самоучители и учиться по ним.
Можно делать все это вместе взятое, так наверное даже будет эффективнее.
А как научиться программировать 12-и летнему подростку в начале 90-х в богом забытом моногороде, когда папа инженер по ДВС, мама медик, в школе даже компьютерного класса с монстрами типа БК-0010 нет, а интернетом не пахнет еще лет 10?
Лежал я тут недавно на диване, плевал в потолок и мой взгляд остановился на книжной полке, где у самой стенки составлены тоненькие брошюрки с пожелтевшими от времени корешками.
«А что это там такое черненькое белеет?» - подумал я, решив разобрать эту макулатуру и выбросить ненужное.
Первое, что попало в руки — вот такие книжечки:
Когда и откуда они у меня появились я уже не помню. Может купил на барахолке, а может выменял у кого.
И тут, как здесь принято говорить, воспоминание разблокировано.
На дворе 1992 или 1993 год и в подарок на день рождения я получаю бытовой компьютер ZX Spectrum.
Компьютеры продавались даже без упаковки. Просто тебе из-за прилавка вручали сам компьютер, блок питания, джойстик, инструкцию, шнурок для подключения к телевизору и аудиокассету с каким-то начальным набором игр.
Кассета мне попалась с сюрпризом. Кроме обычных пулялок-бродилок и прочих тетрисов в наборе оказалась игра Peep Show.
Что такое Peep Show мы тогда не знали, но картинка на заставке во время загрузки игры как-то не двусмысленно намекала, на что-то интересное:
Смысл игры оказался в следующем: Есть шесть дверей. За каждой дверью голая женщина. Чтобы открыть дверь нужно решать какие-то головоломки и ребусы.
И то ли головоломки оказались сложными, то ли терпения не хватало, но попробовав несколько раз открыть дверь я решил: ТАК!
Картинки с голыми женщинами не из воздуха берутся. Они загружаются с аудиокассеты вместе с игрой. Значит они хранятся в оперативной памяти. Как их от туда достать?
Что вообще такое оперативная память? Читаем книжечку:
Итак, понятно. Память это набор ячеек, каждая из которых имеет свой адрес. Адресация начинается с адреса 0 и заканчивается адресом 65535. Видеопамять находится в том же адресном пространстве, начинается с адреса 16384 и заканчивается адресом 22528. Схема вывода изображения на экран просто побитово читает эту область памяти и преобразует в видеосигнал (спасибо подшивкам журнала «Радио» в городской библиотеке). Игра с магнитофона загружается в память начиная с адреса 32768.
Для вывода картинки на экран нужно просто найти ее начальный адрес в оперативной памяти и скопировать в видеопамять столько байт, сколько она занимает.
Следующий вопрос: как копировать байты?
Во встроенном Бейсике есть команды PEEK и POKE. Первая получает байт по заданному адресу, а вторая записывает заданное значение в память по заданному адресу.
Это все хорошо, но когда я обычным образом загружаю игру командой LOAD““ игра просто запускается и не дает мне писать какие-либо команды. Кроме того, в оперативной памяти кроме самой игры еще где-то должна располагаться моя программа копирования изображений голых женщин. Значит надо управлять памятью и загрузкой.
Какими-то комбинациями команд LOAD DATA и LOAD CODE пропускаю загрузку первоначального загрузчика, а загружаю только основные файлы игры уже по определенному мной адресу.
Код игры загружен в память, но как теперь искать адреса, по которым лежат голые женщины? Самое простое решение это начиная с адреса 32768 последовательно в циклах копировать в видеопамять блоки по 6144 байта. Рано или поздно среди цветной мешанины на экране появятся фрагменты изображений.
Сказано — сделано. Но оказалось, что интерпретатор Бейсика работает ну ОООчень медленно. Первое копирование цветной мешанины происходило построчно, как в плохой анимации к какому-то дешевому фильму про хакеров.
Как же так? Ведь сама игра выводит изображения моментально, значит должен быть способ делать это быстрее.
И действительно, в книжке написано:
Можно в машинных кодах, а можно на ассемблере. Что это такое, где эти штуки найти, а самое главное, как поместить в память и запустить на выполнение? В сотый раз перечитываю книжку. Ага! Вот оно! Глава 26 использование машинных кодов.
Т.е. получается, что команда ассемблера это просто число, которое можно поместить в память командой POKE по нужному адресу. Затем в следующий байт поместить ее операнд, затем следующую команду и так далее.
Смотрю, какие команды мне доступны:
Прикидываю алгоритм и последовательность команд, в тетрадке составляю табличку с адресами, командами и их опкодами. Получается последовательность чисел. Вбиваю эти числа в память компьютера.
Пусть и не с первого раза и даже не в тот же день, но программа начинает делать свою работу. И делать ее почти моментально В какой-то момент на экране начинают появляться то нога, то рука, то еще кое-что. Зная, с какого адреса я начинаю копировать фрагмент и прикидывая расположение начала картинки на экране сдвигаю адрес начала блока, размер блока и в итоге нахожу адреса всех шести картинок.
Программа для копирования и адреса картинок записаны в тетрадку, теперь осталось только выгрузить картинки на аудиокассету без всяких бесячих головоломок.






