Как сделать простой текстовый редактор на Turbo-C++ без Windows API?

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

Я хочу знать, как мне сделать текстовый редактор на турбо С++ без Windows API. Я начал делать это некоторое время назад в Turbo C++, а также научился включать мышь с помощью функции int86() и реализовал это. Но время от времени я застреваю на том или ином. Как и сейчас, я застрял, как мне выделить и выбрать текст для щелчка правой кнопкой мыши.

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

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

Примечание. Я не хочу использовать какую-либо другую IDE или какой-либо API для этого по чисто образовательным причинам.

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

PS: это не домашнее задание. Просто для учебных целей.


person Aditya    schedule 14.07.2012    source источник
comment
Черт, ты заставляешь меня думать о тех временах, когда мне было 17 лет (и это 15 лет назад). Уважать :)   -  person huysentruitw    schedule 14.07.2012
comment
Дэн! Это цель! +1!!!!!!   -  person Linuxios    schedule 14.07.2012
comment
Спасибо за все ваши комментарии и +1, лол. Но проблема все еще остается.   -  person Aditya    schedule 14.07.2012
comment
Вы ориентируетесь на реальную консоль DOS или Win32?   -  person Seva Alekseyev    schedule 14.07.2012
comment
Вам нужно будет прочитать о структурах данных - вы почти достигли предела того, что вы можете делать с прямыми массивами. Вы также можете загрузить исходный код в один из более простых редакторов OSS, таких как ed   -  person jthill    schedule 14.07.2012
comment
Я думаю, что это настоящий DOS. И @jthill спасибо, что сказал мне это   -  person Aditya    schedule 14.07.2012
comment
Еще в студенческие годы я изучал графику Turbo C++, BGI и другие вещи. Но поскольку вы тратите время только на обучение, а не на какое-либо домашнее задание, предлагаю вам потратить время на QT. QT широко используется в промышленности, является кроссплатформенным и чрезвычайно мощным. Гораздо проще и мощнее, чем другие решения с графическим интерфейсом для C++.   -  person Groovy    schedule 14.07.2012


Ответы (1)


Насколько я помню, вы устанавливаете видеорежим, устанавливая регистр AX (ah:al) и вызывая INT 10h см. это.

Затем доступ к карте пикселей осуществляется по адресу памяти 0xA000. Если вы выберете видеорежим, т.е. 320x200 с 256 цветовой палитрой, вы можете установить цветовую палитру RGB, записав индекс цвета в порт 0x3C8, а затем записав значение Red в порт 0x3C9, записав значение Green в порт 0x3C9 и записав значение Blue в порт 0x3C9.

// select mode 320x200
asm {
    mov ah, 0
    mov al, 13
    int 10h
}

// set red background (color index 0)
asm {
    mov dx, 0x3c8
    mov al, 0
    out dx, al

    mov dx, 0x3c9
    mov al, 0xff
    out dx, al

    mov al, 0x00
    out dx, al
    out dx, al
}

Вместо asm вы также можете использовать outportb и inportb

// Set color with index 5 in color palette with outportb:
outportb(0x3c8, 5); // color with index 5
outportb(0x3c9, 0xFF); // red channel value
outportb(0x3c9, 0x00); // green channel value
outportb(0x3c9, 0x00); // blue channel value

Изменить видеорежим в C, может быть примерно так:

union REGS    regs;
regs.w.ax = 13;
int86(0x10, &regs, &regs);

C указатель на графическую карту пикселей:

volatile unsigned char *pixmap = (volatile unsigned char *)0xA000;
// Write a pixel with color index 5 to X:10 Y:25 in 320x200x256 video mode:
pixmap[10 + 25 * 320] = 5;

Указатель C на текстовую карту:

volatile char *charmap = (volatile char *)0xB800;
// Write hello world in text-mode
int offset = 0;
charmap[offset++] = 'H';
charmap[offset++] = 'e';
charmap[offset++] = 'l';
charmap[offset++] = 'l';
charmap[offset++] = 'o';
charmap[offset++] = ' ';
charmap[offset++] = 'w';
charmap[offset++] = 'o';
charmap[offset++] = 'r';
charmap[offset++] = 'l';
charmap[offset++] = 'd';

Обратите внимание, что все это предполагает, что вы находитесь в режиме DOS, и я не проверял это. В Windows это не удастся и даст вам ошибки сегментации или ошибки доступа к памяти...

person huysentruitw    schedule 14.07.2012
comment
asm немного выше моей головы, поэтому не могли бы вы объяснить, используя outportb и inportb. Большое спасибо. - person Aditya; 14.07.2012
comment
То, что вы пытаетесь сделать, выше вашей головы. Вам нужно сделать шаг назад и изучить некоторые основы, начиная со структур данных. Четкое понимание структур данных абсолютно необходимо для решения нетривиальных задач программирования, и то, что вы пытаетесь здесь сделать, определенно нетривиально. Это все равно, что сказать нам, что вы хотите построить дом, но не знаете, как возводить стены, и не хотите учиться. - person Carey Gregory; 14.07.2012
comment
Спасибо. Мне придется провести серьезное исследование. (и, кстати, я хочу научиться, это то, что я также сказал в своем вопросе) - person Aditya; 14.07.2012
comment
Я не знаю, действительно ли стоит изучать такие вещи, современные среды программирования и языки намного сложнее. Думаю, вам лучше научиться использовать фреймворки более высокого уровня. Если вы действительно не хотите придерживаться DOS или хотите написать свою собственную ОС с нуля;) - person huysentruitw; 14.07.2012
comment
@WouterH Я делаю это одновременно. Это крайнее любопытство привело меня сюда, чтобы узнать, как это работает на самом деле или работало раньше. - person Aditya; 14.07.2012
comment
Тогда я предлагаю вам начать изучать, как работают компьютеры (в данном случае на базе Intel), что такое порты ввода-вывода, что такое прерывания. Затем вы можете искать порты для PIC, видеокарты, клавиатуры, таймера и делать с ними какие-то сумасшедшие вещи (и даже сильно ломать вашу систему). Проверьте такие прерывания, как 21h (dos), 13h (bios), 10h (video) и посмотрите, какие функции они предлагают... Очень интересные вещи, но в наши дни они вас ни к чему не приведут. - person huysentruitw; 14.07.2012
comment
Какой-нибудь конкретный справочник по этим вещам? - person Aditya; 14.07.2012
comment
У меня есть очень хорошая книга, но она 1995 года и на голландском языке. Это называется PC Underground от Easy Computing. - person huysentruitw; 14.07.2012
comment
Не на английском? В любом случае, я постараюсь достать несколько таких книг и буду добиваться этого, в конце концов, добраться куда-то — не единственная цель. Спасибо за всю помощь Wouter. - person Aditya; 14.07.2012