Результаты поиска потегупрограммирование

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

Отличный комментарий!

...и это только вторник

Как я по-быстрому инвенту хотел

По мотивам поста http://joyreactor.cc/post/4735169
В нём я писал что туповат, а быструю инвенту хочется, а так-же обещал сделать пост с готовым решением, когда смогу реализовать.
Здесь будет парочка довольно дубовых батников от которых у прошаренных пользователей винскриптов заболят глаза, так-что осторожно.
Итак, наша задача максимально просто и быстро инвертаризовать парк примерно в 70 виндовых машин. Машины не в домене, пользаки разные и не соответствуют пользователям, а среди данных что нам нужны есть фио и отдел пользователя машины. Приводить всё к красивостям и стандарту ввиду наличия лени и других задач не хочется, а данные надо сейчас.
Варианты:
Первый: правильный, красивый, надо много работать руками, и сначала привести в порядок уже имеющийся парк. Подал: http://joyreactor.cc/user/chuma. https://www.total-network-inventory.ru/ Красивая реально клёвая штука. Бегаем по пользакам\выпрашиваем возможность подключиться и создаём на каждой тачке админского пользака с некоторым логопассом, открываем 445 tcp, вбиваем диапазон адресов, наслаждаемся офигенски детализированной инвентой. Не решает вопросов с тем, что фио пользака не соответствует имени усера, но это решаемо просьбой запустить скрипт который я приведу ниже, свяжем ip и пользователя машины. Ну или в процессе создания учеток для инвенты это можно провернуть.
Скрипт:
@echo off
set /p UserInputData=vashe fio i otdel BEZ PROBELOV:
ipconfig /all | find "IPv4" > echo > \\vash_server\inventory\%UserInputData%.txt
Cmd не хавает пробелы, так-что вводим через _. Можно было поиграться и добиться наличия пробелов наверное, но это во-первых не страшно, во вторых играться с кодировками на разных тачках невесело. Получаем тхт файлы проименованные фио и отделами пользаков, внутри которых строка с их ipшником. В табличке связываем данные, готово. Найс. Но не таков мой путь, по крайней мере не сейчас. Потом обязательно надо будет приобрести эту прогу, будет очень красиво. Переходим к следующим вариантам.
Подал: http://joyreactor.cc/user/Asmyshlyaev177. В общем-то я и так смотрел в сторону скрипта запускающего аиду. Пишем скрипт, собираем папку "инвентаризация", внутри батник запускающий аиду со вписанными параметрами, батник же пишет в сетевую папку. Однако, изначально у меня этот вариант не работал, при казалось бы, правильных аргументах. Оказалось, аргументы правильные, аида неправильная. Вывод: не доверяйте безусловно одному варианту программы, попробовать другие тоже стоит.
Скрипт:
@echo off
set /p UserInputData=vashe fio i otdel BEZ PROBELOV:
start .\AIDA64\aida64.exe /R .\result\%UserInputData% /HTML /CUSTOM .\AIDA64\report.rpf
timeout /t 120 /nobreak #пауза чтобы успела отработать аида перез запуском робокопи
robocopy .\result \\vash_server\inventory /E #собственно копирование результата инвертаризации
ключи экзешника: /R запуск отчета /HTML формат отчета /CUSTOM отчет берём не стандартный, а из .rpf файла, его можно сгенерировать запустив предварительно мастер отчетов, отбросив ненужные параметры, в стандартном многовато ненужного, например тесты, оно только тормозить бедную машину будет. Почему использовать robocopy а не сразу писать в целевую папку? Потому-что у меня почему-то при полностью открытых правах на эту сетевую папку туда писать сразу не смогло. Решил вопрос robocopy.
Итого, собираем папку в которой: есть папка с .exe аиды. В неё же кладём кастомный .rpf. Рядом с папкой аиды делаем папку result в которую будет ложиться результат инвенты. Рядом со всем этим кладём батник. Скидываем пользакам любым способом, просим запустить. Им выкидывается консоль с просьбой ввести фио и отдел, они вводят, аида отрабатывает инвертаризацию, именует файл данными которые ввёл пользак, затем робокопи копирует его в вашу сетевую (или не очень) папку, оттуда забираете всё готовое.
Понимаю что оно всё более прошаренным ребятам не надо, но нам, туповатым эникеям тоже надо как-то жить и плодить свои костыли, чтобы потом на них учиться)
Отдельная благодарность http://joyreactor.cc/user/opie, который откликнувшись аж заморочился на написание под это дело проги на настоящем взаправдашнем языке. Страница на GitHub: https://github.com/mnocard/ConsoleApp1
Ну и вдогонку, вот вам мои ленивые скрипты для разворота тачек на 9м дебе, когда лень копипастить со страниц документации
proxmox 5 на debian 9 stretch:

#!/bin/bash
echo -e "\e[32mINSTALL PROXMOX SCRIPT\e[0m"
echo "s for start proxmox installation"
echo "e for exit"
read doing
case $doing in
s)
echo -e "\e[32mSTARTING INSTALLATION\e[0m"
ip=$(ip r l | grep -oE '\b[0-9]{1,3}(\.[0-9]{1,3}){3}\b' | tail -1)
#строка для переменной находящей локальный ip машины
hostname=$(hostname)
#находим имя хоста
echo -e "127.0.0.1  localhost.localdomain localhost\n$ip  $hostname.proxmox.com $hostname\n# The following lines are desirable for IPv6 capable hosts\n::1  localhost ip6-localhost ip6-loopback\nff02::1 ip6-allnodes\nff02::2 ip6-allrouters" > /etc/hosts
#изменяем файл hosts
hostname --ip-address > 1
if grep $ip ./1
#проверяем корректность изменения хостс файла
then
echo -e "\e[32mHOSTS FILE CORRECTLY REDACTED STARTING INSTALLATION\e[0m"
sleep 5
rm ./1
echo "deb http://download.proxmox.com/debian/pve stretch pve-no-subscription" > /etc/apt/sources.list.d/pve-install-repo.list
wget http://download.proxmox.com/debian/proxmox-ve-release-5.x.gpg -O /etc/apt/trusted.gpg.d/proxmox-ve-release-5.x.gpg
chmod +r /etc/apt/trusted.gpg.d/proxmox-ve-release-5.x.gpg  
# optional, if you have a changed default umask
apt update && apt dist-upgrade --yes
deb [arch=amd64] http://download.proxmox.com/debian/pve stretch pve-no-subscription
apt install proxmox-ve postfix open-iscsi --yes
echo -e "\e[32mSUCCESSFULLY DONE! WAIT UNTIL SYSTEM REBOOTED!\e[0m"
sleep 5
apt remove os-prober --yes
echo # > /etc/apt/sources.list.d/pve-enterprise.list
#удаляем платный репозиторий
reboot now
else
echo -e "\e[40m   HOSTS FILE REDACTED UNSUCCESSFULLY, REDACT HOSTS FILE AND SCRIPT\e[0m"
sleep 10
rm ./1
exit 0
fi
;;
e)
exit 0
;;
*)
echo "wrong key"
esac
OMV на debian 9 stretch:
#!/bin/bash
echo "omv install script"
echo "s start"
echo "e exit"
read doing
case $doing in
s)
echo "starting install"
apt-get update
apt-get install --yes apt-transport-https
cat <<EOF >> /etc/apt/sources.list.d/openmediavault.list
deb https://packages.openmediavault.org/public arrakis main
deb https://downloads.sourceforge.net/project/openmediavault/packages arrakis main
deb https://packages.openmediavault.org/public arrakis-proposed main
deb https://downloads.sourceforge.net/project/openmediavault/packages arrakis-proposed main
deb https://packages.openmediavault.org/public arrakis partner
deb https://downloads.sourceforge.net/project/openmediavault/packages arrakis partner
EOF
export LANG=C
export DEBIAN_FRONTEND=noninteractive
export APT_LISTCHANGES_FRONTEND=none
apt-get update
apt-get --allow-unauthenticated install openmediavault-keyring
apt-get update
apt-get --yes --auto-remove --show-upgraded \
  --allow-downgrades --allow-change-held-packages \
  --no-install-recommends \
  --option Dpkg::Options::="--force-confdef" \
  --option DPkg::Options::="--force-confold" \
  install postfix openmediavault
omv-initsystem
echo "omv installed sucessfuly"
exit 0
;;
e)
echo "script stopped"
exit 0
esac
Опять же, эти скрипты легко заменяются копипастой ручками комманд со страниц документации, но оно же красивее и удобней когда есть скрипт)
Благодарю всех помогавших глубокоуважаемых пидоров, надеюсь помог кому-нибудь со сходным родом деятельности и проблемами.

Господа пидоры погроммисты и IT-шники, памагити

Знаю что реактор ничья личная армия, но гуглёж не дал особо готовых решений, а я ни бум-бум в написании хоть чего-то сложнее простого bash-скрипта, за сим после пары дней очень тупого тыкания в visual studio было принято волевое решение обратиться к более прошаренным пидорам реактора.
Суть: очень хочется инвертаризировать виндовые пеки в количестве от 30 до примерно 70 штук, и очень не хочется каждый раз скакать с флешкой с аидой по всем кабинетам. Была идея залить в облако архив с аидой 64 и скриптом с параметрами чтобы он отрабатывал аиду, брал формат отчета из .rpf файла, именовал его переменной computername и заливал на шару. Но это не решает проблем с именем пользователя, которые почти везде дефолтные юзеры, то есть идентификации пользователя компьютера и связи его с ip\именем. Возникла идея "написать" методом копипасты что-то простейшее, с окошком и полями а-ля фамилия, кабинет, номер пеки. Даже было найдено почти готовое решение в виде кода на C#: решение Но в связи с моей полнейшей дуболомностью, я не понимаю как преобразовать\допилить его до рабочего состояния. Visual studio я открыл в первый раз когда столкнулся с этой задачей. Собственно вопрос: нет ли у вас каких-нибудь полуготовых решений требующих ещё меньших знаний, или может быть подсказок о том, как бы мне этот код допилить по человечески? Думаю подобным мне эникеям тоже будет полезно заиметь такое решение. Если подкинете идей, обещаю запилить пост с готовым решением как только смогу реализовать.
СЕРЕЖА
ОЧЕНЬ
ТУПОЙ

рохиссор
НИКИТА
БЕТЕХТИН,it,мольба,geek,Прикольные гаджеты. Научный, инженерный и  айтишный юмор,пидоры помогите,реактор помоги,Windows,Операционная система,программирование,языки программирования,С#,песочница
СТУДЕНТ ПРОГРАММИСТ
Google
как узнать текущую дату java	ф
Google Search I'm Feeling Lucky
СЕНЬОР РАЗРАБОТЧИК
Google
how to get date in java	vf,
Google Search
I’m Feeling Lucky,geek,Прикольные гаджеты. Научный, инженерный и  айтишный юмор,программирование,поиск

Программист под ником Turtius смог установить и запустить сервер Minecraft на зеркальной камере Canon SL2 (EOS200D).

Как уточняет PetaPixel, на камере запущен сервер игры, а не клиент. Сама игра установлена на компьютере. Теоретически другие игроки могут присоединиться к серверу на фотоаппарате через свой компьютер.

Для запуска сервера Turtius провел реверс-инжиниринг сетевого процессора камеры. Он уточнил, что устройство по-прежнему работает как камера, но находится «на пределе своих возможностей»: фотографии и видео получаются с трудом, а иногда камера дает сбой. Turtius считает, что если бы процессор камеры был немного мощнее, можно было бы поддерживать создание пользовательских карт.

Основой для запуска сервера стал Avrcraft — решение, разработанное для оптимизации Minecraft-сервера под 8-битные устройства. Turtius интегрировал его с программой для камер Canon Magic Lantern, которую он доработал и упростил.

Код доработанной Magic Lantern Turtius опубликовал на GitHub.
Ссыль на код : https://github.com/turtiustrek/magiclantern_simplified

Отличный комментарий!

Самое удивительное в этой новости то что это не дум.

Я уже не знаю, откуда мне просить помощи. (Java, Swing)

Коротко - как заставить JScrollPane работать с JPanel в NULL layout?

Длинно - Еcть JPanel, в который вставляются JLabel, количество которых зависит от массива. Вот код в картинке: (можно даже увидеть оставшиеся комменты от попыток запихнуть это в scrollPane)
public void actionPerformedCActionEvent e) {
try {
ReadFile file = new ReadFile(patb);
String[] aryLines = file.OpenFileQ;
JFrame frame2 = new JFrameC title "Table");
JPanel panel = new JPanelO;
// JScrollPane scrollPane = new JScrollPane(panel);
frame2.SetSize( width: 600, height: 300);
Как видно - долго бедный фрейм и панелька не продержатся, и туда было бы логично вписать скроллбар, но по ускользающей от меня причине, у меня не получается впихнуть туда JScrollPane, как бы я не старался. Я перерыл весь Стак, Кодранч и даже официальные доки от Оракла. Даже поменяв лейаут, нифига не происходит, генерируется пустое окно. Я уже три дня над этим голову ломаю. Полный текст кода скину в комментарий. (в скрин не поместилось)
КУПОН
НА 1 помощь,java,программирование,geek,Прикольные гаджеты. Научный, инженерный и  айтишный юмор,пидоры помогите,реактор помоги,языки программирования

SMC (оболочка для модульных конструкций)
shell for module constructions,программирование,geek,Прикольные гаджеты. Научный, инженерный и  айтишный юмор,разработка,песочница

Здравствуйте!
Позвольте рассказать вам о моей разработке - платформе SMC (http://www.smcsystem.ru/).

SMC, полное имя Оболочка для модульных конструкций (Shell for module constructions) – платформа для создания и запуска модульных приложений. Позволяет создавать из блоков (модулей) приложения в графическом конструкторе.

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

Ключевые особенности:
- Графический инструмент разработки - приложения создаются и редактируются в графическом конструкторе путем соединения экземпляров модулей (без кода). Это позволяет говорить о платформе как о no-code инструменте разработки.
- Открытый исходный код (Open source) - все приложения открыты для просмотра и изменения.
- Полная динамичность - программы можно изменять вручную, в том числе запущенные (на лету). Так же, программы могут изменяться самостоятельно.
- Плагины - можно добавить плагин (дочернее приложение) к любому приложению.
- Лаунчер приложений.
- Встроенный репозиторий приложений и модулей - позволяет распространять модульные программы привычным образом.
- Возможность создания мультиязыковых приложений (например, одни модули могут быть написана на Java другие на C++). Поддерживаются модули на: Java, Java Script, Python, C++.

Программа полностью бесплатна.

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

Сайт проекта: http://www.smcsystem.ru/
Документы: http://www.smcsystem.ru/#!/documents
Видео с примерами: http://www.smcsystem.ru/#!/video

Буду благодарен за отзыв.

ОСдев №9: основной загрузчик, часть 2. Работа с дисплеем при помощи функций BIOS.

Дисклеймер: эта серия постов не про UEFI. Это не значит, что я не знаю о существовании UEFI. Про UEFI будет отдельная серия постов. Почему я не пишу про UEFI прямо сейчас? Потому что UEFI - это уровень абстракции над железом, а мне интересно именно железо и работа с ним.
Продолжаем? Сейчас наш загрузчик второго уровня работает в "немом" режиме - без возможности подать сигнал об ошибке или выполнении операции. Это необходимо исправить. Самое очевидное решение - вывод информации на дисплей. Мы уже условились, что на нынешнем этапе для работы нашей ОС будет необходима VGA-совместимая карта и дисплей, так что вправе рассчитывать на их наличие.
Программирование VGA-контроллера - сложная штука. Однажды мы ею обязательно займёмся, но сейчас, раз уж мы всё ещё в Реальном режиме, есть вариант попроще: функции BIOS. Функции, связанные с работой дисплея, доступны через прерывание 10h. Мы уже пользовались им для вывода текста в первичном загрузчике, но так как теперь мы не ограничены в размере программы, функционал можно будет расширить.
Первое, что нам стоит сделать - установить нужный видеорежим на случай, если BIOS этого не сделала. Кроме того, понадобятся функции считывания положения курсора, прокрутки экрана и вывода строки. Весь код, связанный с вводом/выводом будет храниться в отдельном файле. У меня он называется io.inc. Мы ещё не использовали подключаемые файлы, но ничего сложного тут нет: в TASM они объявляются директивой include, после которой идёт путь и имя файла. Единственная тонкость тут в том, что подключенный файл не будет вынесен в какую-то изолированную область памяти, как это делается в языках высокого уровня, а окажется в исполняемом файле именно там, где был объявлен. Поэтому лучше объявлять подключаемые файлы где-нибудь в конце, за пределами основного кода.
VGA имеет набор стандартных режимов отображения, с которым можно ознакомиться тут:
Нас интересует режим номер 3 - 80х25 символов, 16 цветов. Для его включения создадим в файле io.inc процедуру set_vmode3. Её полный текст будет выглядеть так:
set_vmode3 proc
                                  push ax
                                  push bx
                                  pushf

                                  xor ax,ax
                                  mov ah,0Fh
                                  int 10h
                                  cmp al,03h
                                  je @@exit_good

                                  mov ax,0003h
                                  int 10h

                                  xor ax,ax
                                  mov ah,0Fh
                                  int 10h
                                  cmp al,03h
                                  jne @@exit_bad

@@exit_good:          mov byte ptr vmode,al
                                  mov byte ptr vcol,ah
                                  mov byte ptr vrow,19h
                                  mov byte ptr vpage,bh

                                  popf
                                  clc
                                  pop bx

                                  pop ax
                                  ret

@@exit_bad:            popf
                                  stc
                                  pop bx
                                  pop ax
                                  ret
set_vmode3 endp
Начинается процедура, как и почти всегда у меня, с сохранения состояния используемых регистров в стеке. Это нетипичный для ассемблера подход. Обычно, создавая низкоуровневый код, программист стремиться максимально оптимизировать использование инструкций, по возможности обходясь без обращений к памяти, использования стека и вызова процедур. К сожалению, при работе над большим проектом это невозможно, и я на горьком опыте выяснил, что лучше потратить лишние циклы на инкапсуляцию процедуры, чем потом мучительно отлавливать баг, который появился из-за того, что какой-то регистр внепланово изменил значение.
                    xor ax,ax                    mov ah,0Fh
                    int 10h
                    cmp al,03h
                    je @@exit_good
Этот блок нужен для того, чтобы остановить выполнение процедуры, если режим 3 уже установлен. Сначала регистр AX обнуляется, чтобы мы точно знали его значение. Функция 15 (0Fh) прерывания 10h возвращает в регистре AL номер установленного режима. Далее мы сравниваем результат с нужным значением (3), и если они равны, то переходим к завершению процедуры, метка @@exit_good. Если режим 3 не установлен, продолжаем.
                    mov ax,0003h                    int 10h
Здесь мы опять вызываем прерывание 10h со следующими параметрами: AH = 0(функция 0, установка видеорежима), AL = 3(номер режима). После этого снова идёт проверка режима. Если AL всё ещё не равен 0 - вероятно, возникла проблема, которую мы не сможем решить. Переходим к метке @@exit_bad. Если AL равен 3, продолжаем от @@exit_good. Первым делом - сохраняем в переменные параметры режима, которые вернуло прерывание 10h. В AL - номер режима; в AH - количество колонок символов; в BH - активную страницу видеопамяти (об этом позже). Параметр vrow не возвращается, потому что технически количество символьных строк ограничено только объёмом видеопамяти, а не размером дисплея. После этого восстанавливаем сохранённые в начале регистры, устанавливаем CF (флаг переноса) в нужное положение и завершаем процедуру.
Готово. Теперь в основной модуль после call read_BPB добавляем call set_vmode3 и после этого jc panic. JC - инструкция условного перехода. Переход выполняется при установленном флаге CF. То есть, если наша процедура set_vmode3 завершилась неудачно, программа продолжится от метки panic. Так как невозможность установить видеорежим говорит либо о серьёзных неполадках, либо о несовместимом оборудовании, продолжать выполнение смысла нет. После метки panic останавливаем программу инструкциями cli и hlt.
Далее стоит вывести какое-нибудь приветствие или заголовок, просто чтобы уведомить пользователя о том, что программа работает. Для этого первым делом стоит узнать положение курсора, ведь на экране скорее всего уже есть какой-то текст от BIOS. Это тоже можно сделать с помощью прерывания 10h. Добавьте в io.inc процедуру get_cursor_pos:
get_cursor_pos proc                                      push ax
                                      push bx
                                      push cx
                                      push dx
                                      pushf

                                      mov ah,03h
                                      mov bh,byte ptr vpage
                                      int 10h
                                      mov byte ptr cursor_X,dl
                                      mov byte ptr cursor_Y,dh

                                      popf
                                      pop dx
                                      pop cx
                                      pop bx
                                      pop ax
                                      ret
get_cursor_pos endp
Про сохранение/восстановление используемых регистров объяснять больше не буду, а в остальном тут всё просто: вызываем функцию 3 прерывания 10h, в BH передаём активную страницу видеопамяти. Прерывание возвращает в DL позицию курсора по X, а в DH - по Y. Сохраняем в переменных. Готово. Далее нам понадобится процедура для прокрутки содержимого дисплея. Тут чуть сложнее, добавьте в io.inc:
scroll_up proc                                     push ax
                                     push bx
                                     push cx
                                     push dx
                                     pushf

                                     mov ah,06h
                                     mov bh,CS_DEFAULT
                                     xor cx,cx
                                     mov dl,byte ptr vcol
                                     dec dl
                                     mov dh,byte ptr vrow
                                     dec dh
                                     int 10h

                                     popf
                                     pop dx
                                     pop cx
                                     pop bx
                                     pop ax
                                     ret
scroll_up endp
Функция прокрутки экрана BIOS требует, во-первых, цветовую схему, которой будут заполнены очищенные строки, а во-вторых, координаты верхнего левого и правого нижнего углов сдвигаемой области. Цветовая схема передаётся в регистре BH и состоит из цвета фона и цвета символа. Мы ещё не объявляли константы, давайте посмотрим, как это делается. Константы в отличие от подключаемых файлов можно объявлять где угодно, так как они нужны только на этапе компиляции и не попадают в исполняемый файл. В TASM для объявления констант используется инструкция equ. Вся конструкция выглядит так: ИМЯ КОНСТАНТЫ equ ЗНАЧЕНИЕ КОНСТАНТЫ. Так как в стандартной палитре третьего режима всего 16 цветов, уместно будет определить их в виде констант. Добавьте в код такую запись:
;Цвета фона.BC_BLACK               equ byte ptr 00h
BC_BLUE                 equ byte ptr 10h
BC_GREEN              equ byte ptr 20h
BC_CYAN                 equ byte ptr 30h
BC_RED                   equ byte ptr 40h
BC_MAGENTA          equ byte ptr 50h
BC_BROWN             equ byte ptr 60h
BC_LIGHTGRAY      equ byte ptr 70h

;Цвета символа.
SC_BLACK               equ byte ptr 00h
SC_BLUE                 equ byte ptr 01h
SC_GREEN              equ byte ptr 02h
SC_CYAN                 equ byte ptr 03h
SC_RED                   equ byte ptr 04h
SC_MAGENTA         equ byte ptr 05h
SC_BROWN             equ byte ptr 06h
SC_LIGHTGRAY      equ byte ptr 07h
SC_DARKGRAY       equ byte ptr 08h
SC_LIGHTBLUE       equ byte ptr 09h
SC_LIGHTGREEN   equ byte ptr 0Ah
SC_LIGHTCYAN      equ byte ptr 0Bh
SC_LIGHTRED        equ byte ptr 0Ch
SC_LIGHTMAGENTA equ byte ptr 0Dh
SC_LIGHTBROWN  equ byte ptr 0Eh
SC_WHITE               equ byte ptr 0Fh

;Несколько готовых цветовых схем.
CS_DEFAULT           equ BC_BLACK or SC_CYAN
CS_CLASSIC           equ BC_BLACK or SC_LIGHTGRAY
CS_DARK                 equ BC_BLACK or SC_DARKGRAY
CS_BLUE                 equ BC_BLUE or SC_LIGHTBLUE
CS_ALARM              equ BC_BLACK or SC_RED
CS_DEBUG              equ BC_BLUE or SC_WHITE
CS_INVERT             equ BC_LIGHTGRAY or SC_BLACK
CS_PANIC                equ BC_RED or SC_BLACK
Как видите, для передачи цвета фона/символа используется один байт. Нижние 4 бита отвечают за цвет символа, верхние - за цвет фона и некоторые другие эффекты (подчёркивание, мигание), которые нам сейчас не нужны. Теперь разберёмся с рабочей областью. Мы хотим сдвинуть вверх весь экран, поэтому верхняя левая точка будет в (0,0), а правая нижняя - в (число символов по X-1,число символов по Y-1). Первая передается в CX, вторая - в DX. Таким образом, код процедуры расшифровывается так:
AH=номер функции (6)BH=цветовая схема
CX=верхний левый угол рабочей области (0,0)
DX=правый нижний угол
Вызвать прерывание 10h
Процедура принимает число строк, на которое нужно прокрутить экран вверх, в AL. Добавьте после jc panic такой код:
                           call get_cursor_pos                           mov al,01h
                           call scroll_up
Последнее, что мы рассмотрим сегодня - вывод строки. Это функция 19 прерывания 10h. В качестве параметров она требует: сегмент и смещение строки в ES:BP; цветовую схему в BL; активную страницу видеопамяти в BH; позицию начала вывода по X в DL; позицию начала вывода по Y в DH; длину строки в CX; режим вывода в AL. Номер функции как всегда передаётся в AH.
Зная всё это, давайте подумаем, как организовать процедуру. В принципе тут всё почти однозначно, но что\ делать с длиной строки? Заносить в CX вручную перед каждым вызовом процедуры? Можно, но зачем раздувать код. Лучше включить эту информацию в саму строку. Например, приняв, что первые 16 бит строки будут содержать число символов в ней. У меня строка с заголовком загрузчика выглядит так:
str_title          dw 31                                                     ;Длина строки.                      db '=== Tardigrada Loader v.1.1 ==='    ;Строка.
Теперь давайте напишем саму процедуру в io.inc.
print_string proc                                   push ax
                                   push bx
                                   push cx
                                   push dx
                                   push bp
                                   push es
                                   pushf

                                   mov ax,0050h
                                   mov es,ax
                                   mov ax,1300h
                                   mov bh,byte ptr vpage
                                   mov cx,es:[bp]
                                   mov dh,byte ptr cursor_Y
                                   mov dl,byte ptr cursor_X
                                   add bp,0002h
                                   int 10h

                                   popf
                                   pop es
                                   pop bp
                                   pop dx
                                   pop cx
                                   pop bx
                                   pop ax
                                   ret
print_string endp
Наша процедура будет принимать два параметра: смещение строки в BP и цветовую схему в BL. Практически весь код - это заполнение регистров для вызова прерывания. В основном модуле после call scroll_up добавим:
                                   mov bl,CS_DEFAULT                                   mov bp,offset str_title
                                   call print_string
                                   mov al,01h
                                   call scroll_up
Этот код выведет заголовок и прокрутит экран ещё на одну строку вверх. Если всё сделано правильно, должно получиться что-то вроде этого:
^ Bochs for Windows - Display
USER ,__£
m2
■+Щ
•te
ТА
Reset susPEno Rower-
Û *
ujf'tnu vvwet
ù ф
Please visit :
. http://bochs.sourceforge.net . http ://www.nongnu.org/vgab ios
Bochs UBE Display Adapter enabled
Bochs 2.6.10.sun BIOS - build: 01/05/20
^Revision: 13752 $ $Date:
Чистая дискета: https://drive.google.com/file/d/1Bold4ds8oEruHQ7fJZKHglVo7A2Vc5MR/view?usp=sharing
Здесь мы собираем самые интересные картинки, арты, комиксы, мемасики по теме (+703 постов - )