Результаты поиска по запросу

Дополнительные фильтры
Теги:
новый тег
Автор поста
Рейтинг поста:
-∞050100200300400+
Найдено: 61
Сортировка:

Олдфажного геймдева пост

Привет, реактор. Заxожу сюда за xорошим настроением (или как получится) уже давно, но написать собрался впервые.

Несколько лет назад я по приколу начал пилить с нуля ОС для ПК с x86-ми процами. Без комментариев, просто заxотелось. Потиxоньку занимаюсь ею и по сию пору. Появилось порядка 20 нерабочиx версий, одна полурабочая и одна (будем надеяться) нормальная, которая ещё не окончена. Операционка получилась как я люблю: грузится с дискеты, даёт минимальный интерфейс к  клавиатуре, дисплею и флоппи-приводу, позволяет запускать плоские бинарники с точкой вxода 500000h и не мешает. В следующей версии будут ещё всякие излишества вроде поддержки жёсткого диска и графическиx режимов VGA, но сейчас не о том.


Bochs for Windows - Display
_ □
Not a command or executable file.
CTRL + 3rd button enables mouse IPS: 48,590M
NUM CAPS SCRL HD:0-IV UHCI,gamedev,Игры,ASM,ASM Comics,ASM Комиксы,Roguelike,олдфаги поймут,Операционная система,длиннопост


Bochs for Windows - Display
_ □
USEIR g-py
Reset suspehd Power-
(Ь Ф
Unformatted memory map:
Entry öl 0x0 Entry #2	0x9F000
0X9FO0O
0x1000
0x18000
OxlFEFOOOO
Entry ö3 0XE8O0O 0x18000 Entry Ö4 0x100000 OxlFEFO Entry Ö5 0xlFFFO000 0x10000 Entry Ö6 0xFFFCO000 0x40000
available
reserved


Мне стало жаль просто убрать в ящик ту полурабочую версию оси и я решил написать под неё игру. Конечно, в дуxе самой ОС: олдфажный текстовый рогалик, как бы плод запретной связи Colossal Cave Advenure и Rogue. От первой достались текстовые описания и перемещение по "комнатам", от второй - процедурная генерация, голод, xолод и пермасмерть.

Сразу опишу основные фишки проекта и приведу немного цифр:
- 1000 комнат
- 7 концовок
- износ, ремонт и апгрейд снаряжения
- прокачка атрибутов, заклинаний и навыков от использования
- около 50 видов монстров
- около 25 видов магии
- около 1,5 часов на успешную партию
- дружелюбный интерфейс

Ну и напоследок несколько скринов из последней и старыx версий:

Character creation - step 1. Distribute points between primary attributes.
trength:
Constitution: 5 Dexterity:	5
Intelligence: 5 Luck:	5
Poo 1: 25
Health: 110	x to avoid trap: 22
Health regen.: 1
Metabolism: 1
Physica1 res.: 1
Physical damage: 1-2
Use Up and Down arrows to select an
Entry Hall
Uaults of this huge hall are supported by many elegant columns. Long stone benches are situated along the walls, central place is taken by a large, intricately decorated fountain with no water. Daylight fills the hall through the gates and small windows high above, near the ceiling.
Corridor
A dark, empty corridor with high ceiling and crude stone walls. You see test visuals, wooden chest with lock(?).
You hear test sound
Use arrow keys to move around the map.
Break container
Character
Inventory
Listen
Search
Take
PosX: 9 PosY: 0 PosZ: 0 Time: 154,gamedev,Игры,ASM
old sword
Plain old sword that Type: weapon Durability: 29/48 Physical damage: 10
had seen better times.,gamedev,Игры,ASM,ASM Comics,ASM Комиксы,Roguelike,олдфаги поймут,Операционная система,длиннопост
ROUND RESULTS
skul lback spider runs beneath your foot
albino spider watches you with its" beady eyes
You make a leaping attack at skul lback spider skullback spider takes 31 points of physical damage skullback spider takes 7 points of electric damage skullback spider dies,gamedev,Игры,ASM,ASM
ROUND RESULTS
purple worm attacks and misses
skullback spider runs beneath your foot
You don't have time for this now.,gamedev,Игры,ASM,ASM Comics,ASM Комиксы,Roguelike,олдфаги поймут,Операционная система,длиннопост

Игра в процессе разработки, текущая версия готова процентов на 30 в смысле меxаник и примерно на 5 в смысле контента. Если кому интересно, в следующем посте выложу ссыль и инструкцию для запуска. Ну а так - приветствую комменты и просто потрепаться за жизнь, низкоуровневое программирование и геймдев.

История видеоигр, часть 21: Empire (1977)

щ eizuiuiLs;
■,Игры,старые игры,обзор,длиннопост

Empire - игра с тяжёлой судьбой. Задуманная Уолтером Брайтом ещё в 1971 году, она оформилась в виде рабочей версии только 6 лет спустя. Первая вариация использовала символьную графику и была написана для компьютера PDP-10, который стоял в Калифорнийском Технологическом Институте. Несмотря на то, что игра стала расползаться по другим PDP вирусным методом, Брайт попытался сделать коммерческую версию. Успеха затея не имела -- было продано всего две копии. Хуже того -- некий злоумышленник взломал защиту КалТеха и выкрал исходники программы. Спустя ещё 10 лет Брайт обнаружил своё детище в библиотеке DECUS и заявил права.


'Margawe of the Centura'
Ml
msmsMumtm

UERSION 2.05C 24-0cM
(c) 1978, 1982, 1983, 1984, 1987 by Halter ¿right â Northwest Software
This software is copyrighted. Unauthorized
n production and/or sales is illegal! ure to observe the Copyright Law will result in severe legal penalties and way
Проще всего сейчас поиграть в версию 1987 года для DOS.

Брайт переписал Empire для IBM PC и отправил в журнал BYTE. Вопреки ожиданиям, вскоре посыпались заказы, и игра всё-таки принесла своему автору умеренные деньги и славу. Empire переиздавалась несколько раз, но к следующим вариациям мы обратимся, когда придёт время.

Empire, Wargame of the Century - глобальная пошаговая стратегия, в которой два или три игрока сражаются за контроль над, ни много ни мало, целой планетой. Статья в Википедии, кстати говоря, ошибочно причисляет Empire к варгеймам, хотя устоявшееся определение жанра подразумевает наличие начального набора юнитов, который убывает в процессе игры; в Empire же производство и организация доставки войск к фронтам - ключевой момент игры.

I " I
TOM'S OPPONENTS
ANCEL,Игры,старые игры,обзор,длиннопост
При желании можно стравить друг с другом трёх компьютерных
игроков и просто наслаждаться зрелищем.


Война идёт за контроль над городами. Города позволяют производить армии и военную технику. Лишившись последнего города, игрок выбывает из партии.

Начало игры. 

CIIV PRODUCTION
03
CIIV: Dyle	I K I
LOC: 29,72	Turns Unir.
Const. Cnst.
MODE:
TURN:,Игры,старые игры,обзор,длиннопост

Игра началась. Всё, что я сейчас вижу - свой стартовый город и соседние с ним клетки. Выскакивает окошко с предложением выбрать тип юнитов, который будет производить город. Изменить решение можно в любой момент, накопленные "очки производства" при этом не пропадут. Отличное, кстати, место, чтобы пройтись по типам войск - благо список совсем невелик.

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

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

Эсминцы, крейсеры, линкоры (destroyers, cruisers, battleships): боевые корабли. Различаются скоростью перемещения и живучестью.

Транспортные корабли (transports): слабо защищены, перевозят пехоту.

Подводные лодки (submarines): подходят для охоты на вражеские суда, т.к. каждое попадание по кораблю наносит тройной урон.

Авианосцы (carriers): плавучие аэродромы. Могут нести до шести истребителей.

В игре отсутствуют ресурсы и экономика в привычном понимании. Единственное, на что стоит смотреть при выборе продукции для города - время производства юнита. Так, линкор, самый мощный из кораблей в игре, строится в десять раз дольше, чем соединение пехоты. Первоочередная задача - создать несколько сухопутных подразделений и захватить ближайшие нейтральные города.

,Игры,старые игры,обзор,длиннопост
Исследуем родной остров. Обнаружили нейтральный город.

Вероятность успешного штурма игра определяет броском виртуальной монетки. То есть, шансы при взятии города - 50/50. Такая же механика действует при стычке двух юнитов. Разнообразие вносит то, что большинство юнитов имеет "запас здоровья" отличный от единицы: эсминец, например, должен получить три удара, прежде чем пойдёт ко дну, а линкор - все двенадцать. Ещё одно исключение - подводная лодка, у которой каждая успешная атака наносит кораблям врага не одно, а три очка урона. При встрече двух юнитов в одной клетке борьба будет продолжатся до тех пор, пока один не будет уничтожен.

NODE: Group Srvy TURN: 38,Игры,старые игры,обзор,длиннопост
Истребители подходят для быстрой разведки территории вокруг городов.

Итак, наш родной остров исследован, все города захвачены. Неожиданно встаёт вопрос транспортировки армий на соседние острова. Транспорт -- штука долгостроящаяся и медленная. Созданием их, конечно, стоило бы озаботиться заранее. Что делать, придётся подождать. И тут выясняется, что в игре нет опции остановить производство в городе. Пока я жду постройки транспортов, мой остров заполняется бестолково шатающейся солдатнёй. Спасибо создателям игры за режим случайного перемещения -- по крайней мере эта орава не требует от меня указаний каждый ход.


File Reports Orders,Игры,старые игры,обзор,длиннопост
Карта мира показывает геополитическую ситуацию: очертания
материков, положение и принадлежность городов и войск. 


Теперь, когда механизм экспансии налажен, время заняться поиском приключений. Где-то там на неисследованной территории строят свои империи два моих оппонента. Кстати, самое время поговорить про исследование территории. Кроме скрытых земель, где юниты игрока ещё не бывали (чёрное на карте) в игре есть так называемый "туман войны". То есть актуальную информацию о происходящем на его землях игрок получает только если поблизости есть его войска или города. Информация по исследованной, но незаселённой территории не обновляется. А если учесть, что сам "туман войны" визуально никак не обозначается, то начинают получаться неожиданные ситуации: армии противника, возникающие из ниоткуда рядом с городами игрока, фантомные неприятельские юниты, которые уже давно ушли, но остаются на карте до тех пор, пока кто-то снова не разведает ту местность и прочие радости войн доспутниковой эпохи.

Середина игры. 

File Reports Orders Commands Hi
1/3 Orders: None,Игры,старые игры,обзор,длиннопост
Первая встреча с врагом. Мой транспорт наткнулся на эсминец
красного игрока. Прощайте, шесть отборных отрядов пехоты.
Семьям не напишут, что сыновья погибли из-за некомпетентности
командующего, отправившего их без сопровождения.


Небольшие стычки с врагом, которые начались на этом этапе, показали, что ИИ вполне сносно разбирается в стратегии -- использует юниты разных типов, атакует с разных направлений или концентрируется для мощной атаки по одному городу. Его единственной существенной слабостью оказалось почти полное игнорирование авиации. Бог знает, почему, но, кажется, я за всю игру видел только два или три вражеских истребителя. Истребители в Empire - основа обороны городов, а с появлением авианосцев -- мощное подспорье для штурмующей пехоты. Такая брешь в стратегии компьютерных командующих свела на нет все достоинства их неплохого интеллекта.

MAR REPORT
□ CITIES
UNDER SOONESI ARE IN CONSTR COMPLETE CONBAÏ
HE' UE HE* ME DESTRVD LOST 0	14
Fighter
Destroyer
Transport
J Suhnarine , Cruiser " Carrier □Battleship
Fi 1 e Reports Orders Comands Mise,Игры,старые игры,обзор,длиннопост
Отчёт о ходе войны. Сверху видно, что мы контролируем 11 из 71
городов и исследовали 10% площади карты. 


Когда количество подконтрольных городов перевалило за два десятка, а юнитов -- за полсотни, начались проблемы с логистикой. Как я писал выше, застопорить производство в городе нельзя, поэтому все они, даже самые отдалённые от линии фронта, продолжали клепать войска. Доставлять их к линии фронта оказалось сущим мучением. Около десятка транспортных кораблей постоянно курсировали между островами и отвозили наплодившуюся пехоту к окопам. Никакой автоматизации для этого не предусмотрено. Мне приходилось постоянно мониторить плотность населения на подконтрольных территориях и вручную отправлять суда к тем островам, где уже не оставалось свободного места. Неплохим решением стало переключение всех тыловых городов на производство линкоров. Это снизило темы производства, но от лишнего микроменеджмента не избавило: алгоритм нахождения пути оказался неспособен самостоятельно провести корабли через извилистые проливы. Судя по всему, создатели игры наличие проблемы понимали, так как попытались запрограммировать возможность автоматической доставки истребителей к фронтам. Не вышло. Суть системы была в том, что произведённые в городе А истребители можно было переключить в режим автоматического перелёта в ближайший город, назовём его Б. По задумке автора, видимо, по цепочке они должны были бы куда-то добираться. Проблема оказалась в том, что если третий по счёту пункт -- город В -- оказывался дальше, чем А, то истребители разворачивались и летели обратно в А.

ipts (Meps Cotwands Hi sc,Игры,старые игры,обзор,длиннопост
Подходим вплотную к границе жёлтого игрока.

Так, постепенно тесня силы жёлтого игрока, мы продвигались на запад. Красный игрок к тому времени сдал позиции и почти не показывался. Не исключено, впрочем, что он также подтачивал жёлтую империю, только с другого направления.

Конец игры. 

,Игры,старые игры,обзор,длиннопост
На западе - остатки жёлтого игрока, к югу от него - несколько островов
красного. Всё остальное - моя адски перенаселённая империя.


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

Transport ALBION xas sunkî,Игры,старые игры,обзор,длиннопост

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

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


Ihe computer wishes to resign!
Ko you accept?
Accept I I .rush Hih""1
File Reports	Orders	ConH&nds Mise	NODE:	TURN: 309
116th Fighter.	FANGE:	20. Orders: None,Игры,старые игры,обзор,длиннопост

Empire оказалась очень даже годной игрой. Даже перегруженный микроменеджмент не отвратил меня от неё, а я большой любитель всё автоматизировать.


Геймплей:
классическая пошаговая стратегия. Этот игровой процесс ещё долго будут копировать -- влияние Empire можно почувствовать в CivilizationMaster of Magic и многих других ставших классическими стратегических играх.

Управление и интерфейс:
В игре понятное и легко запоминаемое управление. Через полчаса игры руки уже помнят все наиболее часто применяемые команды и в руководство заглядывать практически не приходится. Управление сотнями боевых единиц, однако, к концу игры становится утомительным.

Графика и анимация:
Напомню, что играл я в позднюю версию, адаптированную для DOS. Оригинал использовал текстовый дисплей и обходился без графики. В DOS-версии графика, на мой взгляд, приемлема и даже удобна для глобальной стратегии. Анимации в игре нет.

Звук и музыка:
Наименее, по-моему, важный аспект для стратегии. Звуки ограничиваются гудением и жужжанием при схватке двух юнитов. Зато на титульном экране звучит "В пещере горного короля" Грига.

116th Fighter. RANGE: 28. Orders: None
	A Toast To You, General KRIEG TOTAL VICTORY IS YOURS!	
1 " 1,Игры,старые игры,обзор,длиннопост
Нет! Выпьем за пацанов-новобранцев, которые задохнулись в толчее на
родных островах, так и не дождавшись транспорта.


История видеоигр, часть 35: Escape! (1978)

ESCAPE !
COPYRIGHT 1973, SILAS S. ALL RIGHTS RESERUED
WARNER
READ PRIOR GAME FROM TAPE? ÍY OR N !>,старые игры,apple II
Прежде, чем перейти к сегодняшнему экспонату, придётся сделать небольшое историческое отступление. Escape! -- одна из тех игр, говорить о которой в отрыве от биографии автора -- неинтересно и неправильно. Наш герой, Сайлас Уорнер, поступив в 17 лет в Университет Индианы, провёл там около десяти лет жизни -- сначала как студент, а позже -- администратор системы PLATO IV, к мейнфреймам которой в альма матер были подключены несколько дорогих графических терминалов высокого разрешения. Надо ли говорить, что это была благодатная среда для разработки игр? Уорнер не только внёс свою лепту в пополнение библиотеки программ PLATO, но и приобщился к созданным до него играм, в том числе от первого лица. Этот факт важен для нашей истории!
В 1976 году Уорнера наняли разрабатывать учебные программы для финансовой компании Commercial Credit. Там он подружился с программистом Эдом Зэроном и клерком Джимом Блэком. Троица вскоре стала собираться у Зэрона, который был одним из первых владельцев недавно выпущенного компьютера Apple II, и писать игры и прочий софт. Чтобы не класть написанное в стол, в 1978 году они записали два своих продукта на кассеты (да, это были тёмные времена) и отправились на Трентонский компьютерный фестиваль. Зэрон пришёл с мультиплеерной аркадой Tank Wars, а Уорнер -- с лабиринтом от первого лица Maze Game. Каким-то образом ему удалось не просто перенести с мощных и дорогих университетских мейнфреймов каркасную псевдотрёхмерную графику на домашний Apple II с 1-мегагерцевым процессором и несколькими килобайтами RAM, но и добавить заливку полигонов цветом и плавную анимацию перемещения с клетки на клетку. Да, это не было честным 3D, даже не 2,5D вроде Wolfenstein 3D, перемещение всё ещё было дискретным и с поворотами на 90 градусов, но сам факт существования такого уровня графики на домашнем компьютере тех лет поражает. Конечно, для слабенького Apple II это было непросто. Генерация лабиринта могла занимать до двух минут реального времени. И всё же, кассеты с игрой разлетались как пирожки. Дело пошло настолько хорошо, что Зэрон зарегистрировал компанию MUSE Software и ушёл с постоянной работы, чтобы полностью посвятить себя разработке и продаже софта. Блэк и Уорнер вскоре последовали за ним.
SOUTH
A
i
0
M FOR MAP
YOU HAUE A PASS,старые игры,apple II
Сейчас, смотря на картинку, я очень живо себе представил выворачивающего
из-за угла пикселизованного фашиста.

Видя успех своего продукта, Уорнер решил его усовершенствовать, добавив какого-никакого геймплея: в Maze Game единственной целью игрока было найти выход из лабиринта, проиграть было невозможно. Для новой версии, которую автор назвал Escape!, было придумано что-то вроде предыстории и сеттинга: игрок выступает в роли человека, заблудившегося в некоем странном и сильно охраняемом учреждении. Цель осталась прежней -- выбраться наружу, но сделать это стало сложнее. Каждый раз, входя на новую клетку, игрок может встретить NPC, которые делятся на охранников и обычных сотрудников. Охранники могут конфисковать пропуск героя или арестовать его, если пропуска нет. В последнем случае случается геймовер. Страшно подумать, сколько людей в этом заведении каждый день выходят на обед и пропадают в застенках охраны. Впрочем, иногда попадаются лояльные охранники, которые выдают пропуск и отпускают.
EAST
M FOR MAP	I YOU HAUE A PASS,старые игры,apple II

Что касается NPC-сотрудников, то они могут указать направление, в котором идёт герой, дать ему карту, пропуск или компас. Но важно помнить, что часть NPC врёт, карта и компас, которые они вам дадут, будут неправильными, а пропуск -- фальшивым. Узнать, говорит ли NPC правду, можно только по косвенным признакам. Например, если вы доподлинно знаете, что идёте на север, а NPC говорит, что на запад, то он врёт, и принимать подарки от этого персонажа не стоит. Карта, которую вы добыли, может быть трёх видов: правильной; неточной -- отражённой по вертикали или горизонтали -- такую карту, приноровившись, можно использовать; или же полностью неправильной, которая вообще не имеет ничего общего с реальной формой лабиринта.
,старые игры,apple II
Пойман!
Мне удалось одолеть Escape! с третьего-четвёртого захода. Играя, я вывел для себя некоторые правила, которым нужно следовать, чтобы победить:
1.Рисуйте карту.2.Добыв настоящие карту и компас, другие не берите.3.Прежде, чем идти к выходу, раздобудьте настоящий пропуск.
Зарисовывать весь лабиринт необязательно. Достаточно небольшого фрагмента, чтобы можно было сравнить его с полученной от NPC картой и определить, правильная она или нет. Настоящие карта и компас -- максимальный уровень снаряжения, который вам доступен, ничего лучше уже не дадут, так что, как только уверены в этих устройствах, принимать от NPC больше ничего не нужно.

,старые игры,apple II

Строгость охраны растёт по мере приближения к выходу, поэтому имеет смысл потратить время на поиск настоящего пропуска где-нибудь рядом со стартовой точкой. Это требует времени и везения, но стоит того. Нет ничего хуже, чем попасться за пару коридоров от выхода.
,старые игры,apple II
Игрок всегда начинает на юго-востоке. Выход всегда на северо-западе.
Забавно: во время последнего забега у меня проснулась паранойя. Я разглядел на карте четырёхзначный код и записал его, решив, что придётся ввести его для того, чтобы выйти.
THE EXIT IS AT THE NORTHWEST,старые игры,apple II

Ничего такого, это было просто моё воображение. Выйти из здания оказалось просто -- они даже не позаботились закрыть дверь.
M FOR MAP
YOU HAUE A PASS,старые игры,apple II
Финишная прямая. Так и ждёшь в последний момент окрика "стой!"
Escape! поддерживает сохранение игры на кассету и загрузку с неё. Видимо, автор считал её достаточно масштабной, чтобы проходить в несколько присестов. Ничего такого, удачный забег у меня занял около получаса. При условии, что игрок будет зарисовывать карты лабиринта, Escape! достаточно проста.
CARE TO TRY AGAIN?«,старые игры,apple II

Графически игра впечатляет. Хотя здесь нет настоящего трёхмерного пространства, но переход с клетки на клетку сопровождается плавной анимацией. Вообще Apple II для своего времени поражал изобразительными возможностями, но работал не слишком шустро. Так, чтобы посмотреть на карту лабиринта в Escape!, приходилось ждать около 30 секунд. Разумеется, в эпоху эмуляторов это не проблема, но аутентичный опыт -- он именно такой.
Звука в Escape! практически нет. Режущий ухо писк в момент начала игры -- единственный звуковой эффект, который я могу припомнить.
Оценивать управление в игре с настолько ограниченными геймплейными возможностями я особого смысла не вижу. Конечно, для современного игрока, привыкшего к WASD, перемещаться будет неудобно. Для движения вперёд используется клавиша RETURN, для разворота влево\вправо - стрелки, а для поворота на 180 градусов - слэш.
Тем не менее, в своё время Escape! имела большой успех и даже вдохновила молодого Ричарда Гэрриота добавить в свой первый хит Akalabeth подземелья с видом от первого лица. Это не единственный случай, когда работы Уорнера сподвигали будущих гигантов индустрии на технические или художественные свершения, но об этом мы поговорим в другой раз. Что же касается самого Уорнера, он работал в MUSE Software до её распада в 1985 году, после чего перешёл в Microprose под крылышко к Сиду Мейеру, где и продолжил радовать нас своим техническим гением. К сожалению, Сайлас Уорнер умер рано, всего в 54 года, но влияние этого тихого и незаметного человека на индустрию компьютерных и видео игр сложно переоценить.

,старые игры,apple II
Сайлас С. Уорнер
Я думаю, точка, когда можно было оставаться в стороне, отговариваясь тем, что не мы такие, а жизнь такая, пройдена. Я ходил на митинги против пенсионной реформы и ареста Навального, и всё, что я оттуда вынес - ощущение, что здесь всем на всех плевать. Но то, что происходит сейчас, коснётся каждого, лично, независимо от его политических убеждений. Если не из гуманистических или политических взглядов, то из инстинкта самосохранения сейчас все россияне должны организоваться и остановить ёбаного маразматика. Я это запощу здесь и везде где смогу вместе с фрагментами своей личной переписки с соображениями относительно обозримого будущего России
Медуза — UVE I Медуза —UVE
I Министр обороны РФ Шойгу заявил, что Россия не ост_
Также Шойгу заявил, что Россия проведет «первый международный антифашистский конгресс*
ДАННОЕ СООБЩЕНИЕ (МАТЕРИАЛ) СОЗДАНО И (ИЛИ)
^	РАСПРОСТРАНЕНО ИНОСТРАННЫМ СРЕДСТВОМ
МАССОВОЙ ИНФОРМАЦИИ. ВЫПОЛНЯЮЩИМ ФУНКЦИИ
И всё, скуа, потому, что вова - ссыкливый параноик, которс V наличие ядерного оружия не казалось достаточным сдерживающим фактором для НАТО. Ему, блядь, хотелось буферную зону между ними и его мягкими булками
14:11 >//,политика,политические новости, шутки и мемы,песочница политоты,Вторжение в
Я понимаю, что страшно. Не только страшно, но и обидно из-за понимания, что идёшь подставляться ни за что с небольшой группкой людей за огромное равнодушное стадо. И чтобы пересилить себя и начать что-то делать, нужно не меньше, чем под бомбёжками, потому что там - есть враг, а есть друзья и союзники, есть осознание своей правоты. Здесь враг - всё и все, любой встречный ватан может пырнуть тебя ножом и ещё окажется героем, менты опустят тебе почки ради смеха и получат повышение, кто-то стуканёт и тебя посадят, а если есть кто-то, кто от тебя зависит, то страшнее вдвойне. Но если не сделать ничего сейчас, потом будет поздно. Лично для тебя и для меня и вот для того чувака, а не для абстрактной "страны". Страна - это ты, пидор.
Постскриптум специально для реактора: диванный свергатель, когда будешь шитпостить в комментах про то, как мы неправильно протестовали, думай о том, что если скажешь мне это лично, я тебе нахуй лицо обглодаю.

История видеоигр, часть 26: Hustle (1977)

Уже вторая "змейка" от Gremlin. Похоже, компания нашла свою нишу. Нельзя, впрочем, сказать, что Hustle -- это переизданная Blockade, в ней достаточно оригинального. Во-первых, есть режим для одного игрока. В Blockade единственной целью было сделать так, чтобы оппонент врезался в ваш или свой собственный хвост. Здесь же главная задача -- набрать как можно больше очков, наползая на призовые "коробки", а строить козни ближнему -- приятный бонус.
000000000000000000000000000О
0				0^
0				0W
0				0O
0				0O
0	□□□□□□□□□□□□□□□□□			0*
0	□		□	0TI
0	□		□	0ГЛ
0	□	□□□□□	□	03
0	□	□ □	□	0H
0	□	□	□	0Г
0	□	□	□	04
0	□	□	O	0-C
0	□	□		0
0	□	□		H
0	□	□		HUI
0	□	□		3CÛ
0	□□□□□□□□			m
0				0
0				0
0				0
0				0CO
0				0O
0				0O
0
В Hustle после столкновения игра не заканчивается, но
есть 90-секундный лимит времени.
Коробки с очками могут быть двух типов: с числом или тремя знаками вопроса. Первые всегда добавляют очки к финальному счёту, вторые при столкновении могут оказаться со знаком плюс или минус.
OB00000000000000000000000000
os			в
<rs			в
OB			в
OB			в
'¡>B			в
US			в
tt в			в
ÜB			в
ÜB	□		в
(AB	□		в
в	□□□□□□□□□□в		в
в		¡L □	в
в		ШВ	в
Ui	700		в
os		o □	в
он		□	в
H		Li <>□□□□□□	в
в		s	в
>в		a	в
нв		ü	в
JB			в
ŒB			в
2В			в
ши			в
CLB			в
			в
OB			в
OB			в
OB
Каждый собранный приз ускоряет темп игры. Впрочем, максимальная скорость набирается быстро, и она невелика. Каждое столкновение сбрасывает темп, но удлиняет хвост проштрафившегося игрока.

Уроки ОСдева №1

В прошлом посте я представил свою операционку и игру, которую пишу под неё в свободное время. Там же я сделал несколько заявок на будущие посты. Среди прочего я сказал, что, возможно, сделаю серию образовательных постов про разработку операционных систем и низкоуровневое программирование. Сегодня будет первый такой пост. Для понимания материала не нужно знать ассемблер или разбираться в устройстве ОС - про всё это я буду рассказывать. Нужно иметь представление об архитектуре компьютера в общих чертах: понимать, что такое BIOS, процессор, материнская плата, оперативная память, видео-, звуковая и сетевая карты, жёсткий диск, оптические и флоппи-приводы и как примерно всё это между собой скрепляется. Неплохо бы знать, что такое бит, байт и слово. Вообще супер, если вы в курсе, чем десятичная система счисления отличается от двоичной и шестнадцатеричной и умеете переводить из одной в другую. Поехали.

P.S.: если знаете английский, советую зайти сюда. Это довольно старая серия уроков по ОСдеву для новичков. Я в своё время почерпнул там очень много и в своих постах наверняка буду невольно цитировать оттуда.


Часть 1, теоретическая.

С чего начать? Вопрос, который возникает в голове любого, кто собрался писать ОС с нуля. В интернете полно тематических ресурсов, но не так много обучающих, где бы задача написания операционной системы разбивалась на небольшие последовательные этапы-уроки. Например, на OSDev.org очень много информации, распределённой по тематическим разделам, но составить на её основе у себя в голове необходимую последовательность действий для новичка будет очень сложно.

Я думаю, стоит начать с включения компьютера. Это не шутка: чтобы создать свою операционную систему, надо до определённой степени понимать как работает компьютер. Что происходит, когда вы нажимаете кнопку POWER на системном блоке и как у вас на экране оказывается ваш заваленный ярлыками и "новыми папками" рабочий стол? Для того, чтобы программа (а наша ОС - это, конечно же, программа) начала исполняться, она должна сначала попасть в оперативную память. Содержимое оперативной памяти же на момент включения пусто. Если среди читающих есть инженеры, советую зажмуриться и пропустить до следующего абзаца: сейчас будет упрощённая модель.

1. Нажатая кнопка POWER посылает электрический сигнал на материнскую плату.
2. Сигнал доходит до материнской платы и отправляется к блоку питания.
3. Блок питания просыпается и начинает подавать энергию подключенным устройствам.
4. Блок питания посылает сигнал на материнскую плату, начинает исполняться программа BIOS.
5. BIOS проводит POST (power-on self-test), посылая сигналы разным устройствам и получая (или не получая) от них ответ. Если устройство не отправило ответ, оно помечается как нерабочее или отсутствующее. Тут же BIOS определяет количество оперативной памяти и некоторые другие параметры системы.
6. Если POST окончен и никаких критических поломок не выявлено, BIOS сверяется со списком загрузочных устройств. Наверняка вы хоть раз его видели, если устанавливали Windows: его обычно можно настроить через интерфейс BIOS, выбрав, с чего загружать ОС (floppy, HDD, USB, ...).

Вот тут начинается часть, которая интересует нас. Предположим, мы вставили дискету с нашей ОС в привод и настроили приоритет загрузки следующим образом: CD-ROM, флоппи-привод, жёсткий диск, USB. Как BIOS определит, что на одном из носителей есть операционная система для загрузки? Физическое устройство цифровых носителей и способы доступа к информации на них это тема для отдельного урока или даже нескольких, так что пока удовольствуемся упрощённой схемой: BIOS считывает с 0 по 511 байты носителя и проверяет, чему равны байты 510 и 511. Если они равны 170 и 85 (AAh и 55h в шестнадцатеричной системе), BIOS считает, что нашёл программу-загрузчик. После этого считанный участок носителя размером в 512 байт загружается в оперативную память и запускается центральный процессор компьютера, который начинает выполнять загруженную программу. Программа-загрузчик догружает остальные файлы ОС и располагает их в памяти нужным образом, а потом говорит процессору, откуда нужно начать выполнение ОС.

Какие выводы можно сделать из полученной информации?

1. Помимо операционной системы на носителе должна быть программа-загрузчик, т.к. компьютер не знает, как именно структурированы файлы ОС и куда их надо загружать. Загрузка ОС - тоже задача разработчика.
2. Загрузчик должен быть не больше 510 байт, ведь BIOS считывает 512 и последние два из них заняты меткой загрузчика.
3. Последние два байта программы-загрузчика должны быть равны AA55h.
3. Загрузчик должен занимать строго определённое место на носителе: с 0 по 511 байты. Думаю, вы замечали, что когда копируете файлы на носитель обычными методами, никто не спрашивает вас, в какой именно участок памяти вы хотите их поместить. Значит, копировать загрузчик нужно каким-то особенным способом.

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


Продолжать?
Да
306(59,77%)
Единая Россия
206(40,23%)

История видеоигр, часть 23: Canyon Bomber (1977)

,Игры,старые игры,игровой автомат,обзор

     Canyon Bomber - простая однокнопочная (чуть не напечатал "одноклеточная") игра для одного или двух игроков. Действие происходит на одном экране, представляющем собой вид каньона в разрезе. Пространство между склонами заполнено круглыми блоками с цифрами. Игроки, пролетая над каньоном, сбрасывают бомбы, потихоньку уничтожая запас блоков. Если бомба игрока долетает до дна или стены каньона, не задев ни одного блока, это считается промахом. Три промаха -- и игрок выбывает. Побеждает игрок с большим числом очков в конце партии.

BLACK HIGH SCORE SCORE OO	OO
1 COIN PER PLAVER VOU HAVE 2 CREDITS,Игры,старые игры,игровой автомат,обзор

Соперники начинают партию на дирижаблях, но позже пересаживаются на бипланы, которые летят быстрее. Не уверен, происходит это по таймеру или зависит от оставшегося запаса блоков. Бомбы пробивают несколько слоёв блоков, так что игра длится не так долго, как может показаться, глядя на скриншот. За уничтожение блока игра начисляет очки в соответствии с цифрой, которой он был обозначен.

,Игры,старые игры,игровой автомат,обзор

Огромный недостаток игры - её малая интерактивность. Игрок не управляет ни высотой, ни направлением, ни скоростью полёта своего транспортного средства. Он нужен только для того, чтобы нажимать на кнопку в нужное время. Откровенно говоря, всё это вызывает зевоту уже к середине первой партии.

BLACK
SCORE
223
MISSES
LEFT
1,Игры,старые игры,игровой автомат,обзор

Графическое и звуковое оформление игры на уровне для своего времени. Хотя отсутствие нормального игрового процесса, конечно, было бы здорово компенсировать картинкой выше среднего. Зато -- это игра, которая подошла бы Стивену Хокингу, когда у того остался всего один рабочий палец.

И зачем, чёрт возьми, герои бомбят этот несчастный каньон? Чтобы как-то объяснить для себя происходящее, я фантазировал, что круглые блоки -- это головы санкционного сыра, который пытались ввезти в РФ контрабандисты.

Надо бы ещё придумать шутку про леопардовую расцветку летсредств с арта наверху, но лень. Голова после игры пустая, как тот самый каньон.

Да, кстати, Canyon Bomber не имеет абсолютно никакой исторической ценности, так что я только что зря потратил ваше и своё время.

История видеоигр, часть 34: Destroyer (1977)

,старые игры,arcade
,старые игры,arcade
Сегодня на нашем столе снова морская аркада наподобие Sea Wolf и Depthcharge. В Destroyer игрок, управляя эсминцем, должен за отведённое время потопить как можно больше вражеских кораблей и подлодок. Звучит увлекательно? Умерьте ожидания: два гениальных дизайнерских хода сделали из игры цифровой аналог феназепама. Во-первых, "управляя" -- громко сказано; корабль движется от одного края экрана к другому независимо от желания игрока, во власти которого только замедлить его ход. Во-вторых, вражеские суда не могут дать сдачи и покорно идут ко дну. Да, Destroyer -- что-то вроде тира с уточками.
,старые игры,arcade
Сброс глубинных бомб выполнен чуть интереснее, чем в Sea Wolf, за счёт необходимости заранее устанавливать глубину детонации, перемещая вверх-вниз пунктирную линию. К тому же, опускаются снаряды медленнее, из-за чего подгадать верный момент для сброса сложнее. Графически игра приятнее предшественниц: анимации по-прежнему почти нет (за исключением взрывов и движущихся волн на поверхности моря), зато спрайты крупнее, детальнее и выполнены в целых трёх оттенках серого!
,старые игры,arcade
Звук и управление в игре функциональны и нареканий не вызывают. Стоит ли сегодняшнему геймеру ворошить прошлое и играть в Destroyer? Не думаю. Слабый челлендж и отсутствие режима для двух игроков сильно обесценивают этот реликт семидесятых. Впрочем, и откровенно плохого об игре сказать нечего. Середнячок.

Уроки ОСдева №2: схемы адресации и твоя первая программа на ассемблере

Если кто-то решил следовать этим туторам, самое время обзавестись необходимыми инструментами. Скачайте turbo assembler (TASM) или любой другой привычный вам. Установите виртуальную машину с Windows XP. Работать с большинством используемых программ проще в ней. Я бы посоветовал Oracle VirtualBox.

CHS

В прошлый раз мы выяснили несколько важных вещей:
- для того, чтобы загрузить ОС с дискеты, нам нужна программа-загрузчик.
- программа-загрузчик должна занимать ровно 512 байт, причём последние два байта должны содержать метку загрузчика (AA55h).
- программа-загрузчик должна располагаться в первом физическом секторе носителя.

Эта информация в свою очередь ставит перед нами новый вопрос: как поместить загрузчик на полагающееся ему место? Придётся разбираться в схемах адресации данных на цифровых носителях. Тема не очень простая, но необходимая, так что крепитесь.

,geek,Прикольные гаджеты. Научный, инженерный и  айтишный юмор,OSDev,Операционная система,разработка,программирование,ассемблер,песочница

На картине выше - структура дискового носителя. Это может быть жёсткий диск, дискета или CD, суть не поменяется. Головка, она же лицо, - это одна сторона поверхности носителя (пластины). У жёсткого диска на рисунке 4 двусторонних пластины, то есть 8 головок. Головка в свою очередь разбита на концентрические дорожки (они же цилиндры), а те - на одинакового размера (как правило 512 байт) секторы. Независимо от радиуса цилиндра в каждом из них одинаковое число секторов, что позволяет для доступа к любому конкретному сектору использовать трёхкомпонентную координату Цилиндр-Головка-Сектор (Cylinder-Head-Sector, CHS). Важно помнить, что в системе CHS цилиндры и головки нумеруются с 0, а секторы - с 1. То есть для доступа к первому физическому сектору носителя наши координаты будут иметь значения: 0(цилиндр), 0(головка), 1(сектор).

Проблема в том, что привычные нам файловые системы скрывают физическую геометрию носителей за набором абстракций вроде файлов и папок. К счастью, есть альтернативы. Например, в Windows есть команда debug. Выглядит так:

debug boot.bin(имя файла, загружается в память по адресу 100h)
-w(запись) 100(адрес загруженного файла) 0(номер привода) 0(номер первого сектора) 1(число секторов для загрузки)
-q(выход)

Я выше писал, что секторы нумеруются с 1, но debug закон не писан. Всё остальное время правило в силе.

Само собой, для этого дискета должна быть вставлена в первый флоппи-привод. Так как большинство из вас скорее всего флоппи-привода и набора дискет не имеет, я предлагаю использовать привод вашей виртуальной машины и чистый образ дискеты.

LBA

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

boot.asm

Итак, мы разобрались, как поместить нашу программу в нужное место на дискете. Самое время приступать к написанию кода! Мы, конечно, не будем в этот раз писать полный загрузчик. Это будет просто небольшая вводная в турбо ассемблер. Она предназначена для людей без опыта в ассемблере и подразумевает, что вы будете пользоваться TASM. Если вы уже знаете x86 ассемблер и намерены пользоваться каким-то другим - смело пропускайте конец статьи.

Скачали TASM? Отлично, инсталлируйте его в какое-нибудь легкодоступное место на диске и в папке BIN/ создайте папки OS/boot/stage1/.

Теперь в stage1/ создайте пустой текстовый файл, переименуйте его в boot.asm и откройте текстовым редактором. В файле создайте следующий текст:

.386p
CSEG segment use16
ASSUME cs:CSEG, ds:CSEG, es:CSEG, fs:CSEG, gs:CSEG, ss:CSEG
begin:

CSEG ends
end begin

Сделали? Сохраните и давайте разбираться. Сразу скажу, что собственно программы здесь пока нет. Всё, что вы видите - набор инструкций для компилятора, в исполняемый файл они не попадут.

.386p - указание компилятору сверять инструкции с набором для 386 процессора в защищённом (protected, отсюда p) режиме. Соответственно, если компилятор встретит инструкцию, которую данный процессор не поддерживает, он выдаст ошибку.

CSEG - название сегмента, в котором будет содержаться код нашей программы.

Следующую строчку будет сложно объяснить, т.к. мы пока не касались устройства процессора, так что просто примите как есть: это указание компилятору считать, что все сегментные регистры процессора указывают на сегмент CSEG.

begin - метка начала программы. Отсюда будет начинаться собственно код.

CSEG ends - конец сегмента CSEG.

end begin - метка конца программы.

Скомпилировать программу в таком виде не выйдет, так как в ней нет ни одной инструкции. Давайте добавим парочку.

.386p
CSEG segment use16
ASSUME cs:CSEG, ds:CSEG, es:CSEG, fs:CSEG, gs:CSEG, ss:CSEG
begin:                    cli
                             hlt
CSEG ends
end begin
Мы добавили 2 команды: cli и hlt. Первая запрещает прерывания, то есть не даёт устройствам отправить сигнал процессору, а вторая останавливает сам процессор. Таким образом, сейчас наша программа при запуске просто "вешает" компьютер. Тем не менее, её уже можно превратить в исполняемый файл.

Откройте командную строку, перейдите в папку BIN/ и введите: tasm OS/boot/stage1/boot.asm. После нажатия enter в папке BIN/ появится файл BOOT.OBJ. Это ещё не конец. Файл .obj - это инструкция для линкера, так что пишите: tlink boot.obj. Теперь у вас добавились два новых файла, BOOT.MAP и BOOT.EXE, последний из которых - и есть исполняемый файл, который нам нужен! Незадача в том, что мы пишем не приложение под DOS, а операционную систему, которая должна будет работать на голом железе. exe-формат содержит таблицы релокации и всякие прочие данные, которые нам будут мешать. В нашем исполняемом файле должны быть только инструкции программы и больше ничего. К счастью, и тут есть готовое решение. Пишите в командной строке exe2bin boot.exe и жмите enter. Появился файл boot.bin. Проверьте его размер, он должен занимать ровно 2 байта, по одному байту на инструкции cli и hlt. Успех!

В качестве ДЗ предлагаю всем желающим самостоятельно загнать файл в первый сектор дискеты, вся нужная информация в тексте статьи есть.

Урок ОСдева №5: подготовка к работе с файловой системой FAT12.

В прошлый раз мы инициализировали сегментные регистры и обеспечили загрузчику безопасную среду
обитания. Сегодня будем готовить почву для работы с файловой системой FAT12. Для начала стоит
поподробнее ознакомиться с её структурой. В FAT12 пространство носителя можно разделить на
несколько областей. Они могут быть разного размера, но идут всегда в следующем порядке:

ЗАГРУЗОЧНЫЙ СЕКТОР - ЗАРЕЗЕРВИРОВАНО - FAT - КД - ОБЛАСТЬ ДАННЫX

Наша задача - вычислить начало и размер каждой области на нашем носителе. Эта информация понадобится
для загрузки файлов. Важный момент: при работе с контроллером флоппи-привода мы оперируем секторами,
а не байтами. То есть, когда я пишу "размер", я имею в виду количество секторов, занятыx
областью.

Загрузочный сектор - место, где обитает наша программа. Это всегда сектор
номер 1 на носителе, и занимает он ровно 1 сектор. Было несложно.

Далее, зарезервированныx секторов у нас нет. Вернее, есть один, загрузочный. Общее число
зарезервированныx секторов включая загрузочный можно найти в переменой BPB_reserved блока
параметров BIOS.

FAT, таблица распределения файлов. Будет чуть сложнее. Размер FAT в секторах xранится в переменной
BPB_FATsize. Но, как я уже писал ранее, часто на диске может быть дублирующая FAT на случай
повреждения данныx. Количество FAT на диске указано в переменной BPB_numFATs. Для вычисления
общего размера всех FAT на диске нам нужно умножить размер FAT на число FAT.

Дальше у нас идёт корневая директория. Это набор записей о размещении файлов. Размер записи КД
в FAT12 - 32 байта. Количество записей указано в переменной BPB_RDentries. Берём размер записи
и умножаем на число записей. Всё? Нет. Так мы получим размер в байтах, его нужно перевести
в секторы. Для этого резльтат делится на размер сектора в байтах, который хранится в переменной
BPB_bytespersec.

Вот теперь всё. Вспомним, как выглядела программа в конце прошлого поста:

.386p
CSEG segment use16
ASSUME cs:CSEG, ds:CSEG, es:CSEG, fs:CSEG, gs:CSEG, ss:CSEG

begin:                    jmp short execute                    ;Точка входа. Перейти к исполняемой части.
                            nop                                         ;Пустой оператор. Заполняет 3-й байт перед BPB.



;БЛОК ПАРАМЕТРОВ BIOS======================================================================;

;=======================================;
;Блок параметров BIOS, 33 байта.;
;Здесь хранятся характеристики;
;носителя. Должен быть в 3 байтах;
;от начала загрузочного сектора.;
;=======================================;
          BPB_OEMname db 'BOOTDISK'          ;0-7. Имя производителя. Может быть любым.
          BPB_bytespersec dw 512                  ;8-9. Размер сектора в байтаx.
          BPB_secperclust db 1                        ;10. Количество секторов в кластере.
          BPB_reserved dw 1                          ;11-12. Число зарезервированныx секторов (1, загрузочный).
          BPB_numFATs db 2                          ;13. Число FAT.
          BPB_RDentries dw 224                     ;14-15. Число записей Корневой Директории.
          BPB_sectotal dw 2880                      ;16-17. Всего секторов на носителе.
          BPB_mediatype db 0F0h                   ;18. Тип носителя. 0F0 - 3,5-дюймовая дискета с 18 секторами в дорожке.
          BPB_FATsize dw 9                           ;19-20. Размер FAT в сектораx.
          BPB_secpertrack dw 18                    ;21-22. Число секторов в дорожке.
          BPB_numheads dw 2                        ;23-24. Число головок (поверxностей).
          BPB_hiddensec dd 0                        ;25-28. Число скрытыx секторов перед загрузочным.
          BPB_sectotal32 dd 0                        ;29-32. Число секторов, если иx больше 65535.

;===============================================;
;Расширенный блок параметров BIOS, 26 байт.;
;Этот раздел используется в DOS 4.0.;
;===============================================;
          EBPB_drivenumdb 0                         ;0. Номер привода.
          EBPB_NTflagsdb 0;1. Флаги в Windows NT. Бит 0 - флаг необxодимости проверки диска. Бит 1 - флаг необходимости диагностики поверхности.
          EBPB_extsigndb 29h;2. Признак расшренного BPB по версии DOS 4.0.
          EBPB_volIDdd 0;3-6. "Серийный номер". Любое случайное число или ноль, без разницы.
          EBPB_vollabeldb 'BOOTLOADER ';7-17. Название диска. Устарело.
          EBPB_filesysdb 'FAT12   ';18-25. Имя файловой системы.



;ИСПОЛНЯЕМЫЙ БЛОК========================================================================;

;Шаг 1. Исправить значения сегментных регистров.
execute:
         ;DS, ES, FS, GS.
                   mov ax,07C0h                    ;Сегмент загрузчика.
                   mov ds,ax                          ;Поместить это значение во все сегментные регистры.
                   mov es,ax
                   mov fs,ax
                   mov gs,ax

          ;СЕГМЕНТ СТЕКА.
                   cli                                      ;Запретить прерывания перед переносом стека.
                   mov ss,ax                           ;Поместить в SS адрес сегмента загрузчика.
                   mov sp,0FFFFh                   ;Указатель стека - на конец сегмента.
                   sti                                      ;Разрешить прерывания.

          ;СЕГМЕНТ КОДА.
                   push ax                              ;Поместить в стек сегмент.
                   mov ax,offset stop               ;Указатель на инструкцию после retf.
                   and ax,03FFh                      ;Обнулить 6 старших бит (аналогично вычитанию 7C00h, если смещение больше 7C00h).
                   push ax                              ;Поместить в стек смещение.
                   retf                                    ;Дальний возврат для смены CS.

stop:            cli
                   hlt

          org 1FEh;Заполняет память нулями до 511-го байта.
          dw 0AA55h;Байты 511 и 512. Признак загрузочного сектора.

CSEG ends
end begin


Как всегда я написал максимально подробные комментарии к каждому действию. Теперь после retf добавьте
следующий код вместо cli и hlt:

stop:           mov byte ptr EBPB_drivenum,dl

                  mov ax,BPB_RDentries
                  shl ax,5
                  div BPB_bytespersec
                  mov cx,ax
                  xor ax,ax
                  mov al,byte ptr BPB_numFATs
                  mul BPB_FATsize
                  mov total_FATs_size,ax
                  add ax,BPB_reserved
                  mov datasector,ax
                  add datasector,cx

                  cli
                  hlt


Давайте разбираться. С инструкцией mov мы уже знакомы, так что первая строка должна быть понятна:
команда помещает содержимое регистра DL в переменную EBPB_drivenum. Но что за byte ptr?
Это префикс смены разрядности. Так как мы работаем в 16-битном режиме, TASM предполагает, что
и разрадность всех ипользуемых ячеек памяти - 16 бит. Если мы хотим работать с 8-битной
переменной, её разрядность нужно указать вот таким способом.

И зачем вообще мы сохраняем DL как номер привода, с которого была загружена программа? Дело в
том, что по идее BIOS должна вернуть его в DL. В принципе, доверять этому значению не стоит,
и использовать его мы не будем, так что делать это не обязательно. Просто я педант.

Далее команда mov ax,BPB_RDentries считывает в AX число записей в корневой директории,
а команда shl ax,5 умножает его на 32. Команды shl и shr сдвигает биты числа влево и, соответственно,
вправо (сокращение от shift left и shift right). Сдвиг числа влево на 1 эквивалентен умножению
на 2. Сдвиг на 5 эквивалентен умножению на 32. На старых процессорах сдвиг выполнялся быстрее,
чем умножние или деление, на новых эти команды, кажется, выполняются с одинаковой скоростью.

div BPB_bytespersec делит результат предыдущей операции на число байтов в секторе. Вы наверное
заметили, что регистр ax в команде нигде не указан: операция DIV всегда выполняется на этом
регистре. В результате деления мы получаем чсло секторов, которые занимает КД. mov cx,ax
сохраняет результат в cx, а xor ax,ax обнуляет ax, выполняя на нём "исключающее или" с ним же.

mov al,byte ptr BPB_numFATs считывает в регистр al количество FAT на диске. Кстати! Регистров
al и dl не было в списке, который я приводил на прошлом уроке. Сейчас поясню.
Четыре регистра общего назначения ax,bx,cx и dx делятся на две 8-битные половины.
ax на al и ah, bx на bl и bh, ... l в данном слуае значит low, то есть младшие 8 бит.
h, соответственно, старшие high. Так вот, получив число FAT в al, мы умножаем его на
BPB_FATsize (размер FAT в секторах). Обратите внимание, операция умножения выполняется
на всём регистре ax, а значение мы поместили в al. Для этого мы и обнуляли ax операцией
раньше. Получив в результате общий размер всех FAT на диске, сохраняем его в переменной
total_FATs_size.

Добавив к ax BPB_reserved, получим общий размер FAT и зарезервированных секторов.
Сохраним его в переменной datasector, а затем прибавим к ней cx, в котором хранится
размер КД. Теперь в datasector хранится общий размер КД, FAT и зарезервированных
секторов, то есть номер сектора, с которого начинается область данных. Обратите внимание,
с точки зрения быстродействия правильнее было бы сначала сложить ax и cx, а уже потом
сохранить результат в переменной, так как обращения к памяти занимают намного больше
времени, чем операции надрегистрами. Зачем я сделал именно так, станет понятно в
следующий раз. А на сегодня всё! Сегодня мы вычислили важные значения, которые помогут
в дальнейшем, и познакомились в общих чертах со структурой FAT12.

В качестве ДЗ предлагаю самостоятельно объявить использованные нами переменные total_FATs_size и
datasector. Обе 16-битного формата. Переменные можно объявлять где угодно до тех пор, пока они не
встревают в исполняемый код. Например, можно вставить между dw 0AA55h и CSEG ends
Здесь мы собираем самые интересные картинки, арты, комиксы, мемасики по теме (+61 постов - )