Форум программистов, компьютерный форум, киберфорум
Assembler: DOS/Real Mode/16-bits
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6812 / 2052 / 238
Регистрация: 14.12.2014
Сообщений: 4,304
Записей в блоге: 12

Номер текущей строки CRT-луча

06.09.2018, 10:15. Показов 2293. Ответов 27
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всех категорически приветствую!
Кто-нибудь знает, возможно ли прочитать из портов графического адаптера (VGA в частности) номер текущей строки (линии), на которой находится луч?
Задача такая: вешаю обработчик на таймер (IRQ 0) и настраиваю частоту таймера как мне надо (чтобы он вызывался ≈ на каждой строке, на которой находится луч, либо раз в 5 строк). Процедура таймера совершает разные манипуляции (как банальный пример, рисует градиентную полосу с помощью настройки палитры). Зачем таймер? Чтобы параллельно можно было рисовать что-то ещё, а не тупо крутить цикл чтения порта 3DAh для трассировки луча
Читаю RBIL, ничего по поводу чтения номера линии не нахожу (есть намёки, но всё не то, но мало ли?)

Если такой возможности всё-таки нет, то как можно хотя бы понять, что начался новый фрейм? Причём даже при относительно низкой частоте таймера (к примеру, 1 срабатываение на 5 строк). Если проверять бит вертикального ретрейса, то при низкой частоте таймера можно проскочить этот момент (ретрейс длится довольно малое кол-во времени, буквально пару строк... и кстати говоря, окончание ретрейса не говорит о том, что луч находится в видимой области экрана). Бит горизонтального ретрейса включается на всё время отсутствия луча в области экрана.
Выглядит примерно так (последовательные чтения из порта):
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
V H - биты вертикального и горизонтального ретрейса
---
0 0 - луч в видимой области
0 1 - идёт горизонтальный ретрейс \
0 0 - видимая область              \ это повторяется
0 0 - видимая область              / для каждой строки
0 0 - видимая область             /
0 1 - луч вышел за область экрана (он находится снизу или сверху)
0 1 - луч за областью экрана
0 1 - луч за областью экрана
0 1 - луч за областью экрана
1 1 - вертикальный ретрейс
1 1 - вертикальный ретрейс
1 1 - вертикальный ретрейс
0 1 - луч пока ещё за областью экрана
0 1 - луч пока ещё за областью экрана
0 1 - луч пока ещё за областью экрана
0 1 - луч пока ещё за областью экрана
0 1 - луч пока ещё за областью экрана
0 0 - снова началась видимая область
Если проверять H-бит на повторы, то может оказаться так, что нам просто "везёт" нарываться на несколько горизонтальных ретрейсов подряд между видимыми линиями, а не между кадрами.
Что можно придумать для такого случая?

Добавлено через 6 минут
Может, есть какой-то отдельный бит какого-то другого порта, с помощью которого можно узнать, что луч находится за кадром (ниже или выше)?
1
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.09.2018, 10:15
Ответы с готовыми решениями:

Как узнать номер текущей строки?
Есть форма в виде таблицы. Надо узнать номер текущей строки. Как это сделать? Есть какая то функция?

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

Определить номер текущей строки таблицы по обработке клика кнопки
Здравствуйте ! В некоторых строках таблицы есть кнопки. Можно ли в процедуре обработки клика определить номер строки на которой эта...

27
Эксперт Hardware
Эксперт Hardware
 Аватар для R71MT
6211 / 2445 / 403
Регистрация: 29.07.2014
Сообщений: 3,175
Записей в блоге: 4
06.09.2018, 11:15
Цитата Сообщение от Jin X Посмотреть сообщение
Может, есть какой-то отдельный бит какого-то другого порта,
конкретно про регистр номера-строки лично я ничего не слышал,
но там есть регистр длительности строки 3D5h[0], и регистр общего кол-ва строк в растре 3D5h[12h].
если поймать момент обратного хода по кадрам 3D5h[15h], то начиная от него, путём не сложных вычислений по таймеру, можно узнать и текущий номер строки.

эта часть регистров относится к регистрам контроллёра трубки CRT, а не самого VGA-адаптера.
регистры: 03D4h (адрес) и 03D5h (данные).

из доков можешь почитать: М.В.Жутаев "Видеоадаптеры и видеомониторы EGA, VGA и SuperVGA", ну и кое-что есть у Несвижского.
2
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6812 / 2052 / 238
Регистрация: 14.12.2014
Сообщений: 4,304
Записей в блоге: 12
06.09.2018, 14:14  [ТС]
Цитата Сообщение от R71MT Посмотреть сообщение
если поймать момент обратного хода по кадрам 3D5h[15h], то начиная от него, путём не сложных вычислений по таймеру, можно узнать и текущий номер строки.
Что-то я не очень понял, что это за регистр: start vertical blanking-1. У меня (правда, в DOSBox, machine=vgaonly) показывает 407 (после коррекции на единицу) при vertical display end = 399, vertical total = 449.
Но в любом случае, как же его поймать?
Мне бы вычислить, не идёт ли сейчас луч вне кадра, но не просто через 0-й бит 3DAh, т.к. это может быть боковой ретрейс.

Про доки спасибо!

Добавлено через 13 минут
Ещё интересует определение кол-ва строк "за кадром" _после_ вертикального ретрейса...
Т.е. когда бит 3 регистра 3DAh погас и до начала отображения (пока бит 0 ещё горит).
1
Эксперт Hardware
Эксперт Hardware
 Аватар для R71MT
6211 / 2445 / 403
Регистрация: 29.07.2014
Сообщений: 3,175
Записей в блоге: 4
06.09.2018, 15:21
Цитата Сообщение от Jin X Посмотреть сообщение
vertical total = 449.
чёт маловато всего строк..
это 10-битный регистр, 2-старших бита находятся в регистре переполнения 3D5h[07]
а вообще кол-во строк зависит от в-моды - ты в каком тестируешь, тект или графика и т.д.?

Цитата Сообщение от Jin X Посмотреть сообщение
как же его поймать?
допустим всего строк 1000, а длительность одной равна 10
тогда общее время на кадр будет 10.000.
если поставить таймер на 10 и вести отсчёт сразу после обратного хода луча по кадрам (начало кадра), то каждое срабатывание таймера будет представлять из себя номер строки.

Добавлено через 4 минуты
Цитата Сообщение от R71MT Посмотреть сообщение
а вообще кол-во строк зависит от в-моды
тьфу.. блин.. речь идёт-же о регистрах CRT, а для них мода не играет роли - там стабильные V/H-Sync .
1
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
06.09.2018, 15:23
Прерывания там случайно не было?
(Между кадрами)
0
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6812 / 2052 / 238
Регистрация: 14.12.2014
Сообщений: 4,304
Записей в блоге: 12
06.09.2018, 18:21  [ТС]
Цитата Сообщение от R71MT Посмотреть сообщение
чёт маловато всего строк..
Почему маловато?
В VGA-режимах 350, 400 или 480 строк + информационные
http://www.epanorama.net/documents/pc/vga_timing

Цитата Сообщение от R71MT Посмотреть сообщение
допустим всего строк 1000, а длительность одной равна 10
тогда общее время на кадр будет 10.000.
В теории так, только частота VGA не бьётся с частотой таймера 1.19 МГц. И будут погрешности, которые через несколько кадров проявятся.
Не то чтобы это было нерешаемо, но несколько геморный этот подгон точности и не до конца надёжен.

Цитата Сообщение от politoto Посмотреть сообщение
Прерывания там случайно не было?
(Между кадрами)
Между какими?
1
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6812 / 2052 / 238
Регистрация: 14.12.2014
Сообщений: 4,304
Записей в блоге: 12
06.09.2018, 23:14  [ТС]
Не могу понять, что я делаю не так???

Запускаю в DOSBox - всё чётко работает. Запускаю на ноуте или на десктопе из FreeDOS, появляются глюки: внизу розовая полоса приличной ширины, а сверху красная полоса наполовину съедена (т.е. рисование начинается всё чуть выше видимой части экрана). Про полосы см. ниже.
При этом регистры показывают 400 видимых строк и 449 общее кол-во и там, и там. Только тайминги разные.

Итак, вкратце что тут происходит.
1. Перехватывается IRQ 0 (int 8), замеряется кол-во тиков таймера 1.19 МГц за кадр. Делится на 449, получаем значение счётчика для одной строки. Из них 400 видимых, 49 невидимых. Устанавливается счётчик таймера №0 в это значение.
2. Обработчик прерывания проверяет бит 3 (vertical retrace). Если он установлен, просто тупо ждём, когда погаснет бит 0 (horizontal retrace)*. Из рисунка в первом сообщении видно, что он выставляется вместе с 3-м и гаснет при появлении видимой части экрана. В этом случае счётчик линий сбрасывается в 0, в противном случае увеличивается на 1. Далее вызывается макрос эффекта
3. Макрос эффекта выводит сверху вниз полосы красного, жёлтого, зелёного, голубого цвета по 16 строк, внизу (в строке 399, если считать с 0, и ниже) то же самое, но в обратном порядке. Между ними синее. Вне экрана розовое.
Вот, собственно, и вся хитрость. Всё должно работать!!!

* этот момент мне не очень нравится (собственно, из-за него и был первоначальный вопрос), но пусть пока будет так...

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
PARTS_PER_FRAME =       400                     ; number of parts we want to divide screen by timer - set as you with
                                                ; (not less than number of visible screen lines / 2; best view for 400 and 200 in text mode [3] and Mode X [13h])
 
TOTAL_LINES_PER_FRAME = 449                     ; 449 for text mode and Mode X (including invisible frame zones)
VISIBLE_LINES_PER_FRAME = 400                   ; 400 for text mode and Mode X
 
; Don't change these values
TOTAL_PARTS_PER_FRAME = (PARTS_PER_FRAME*TOTAL_LINES_PER_FRAME+VISIBLE_LINES_PER_FRAME/2)/VISIBLE_LINES_PER_FRAME ; number of parts including invisible frame zones
 
SHOW_GRADIENT_BAR =     0                       ; 0=show static color lines, 1=show moving color bar
 
;-----------------------------------------------------------------------------------------------------------------------
 
; Intercept IRQ 0 handler and tune timer to synchronize with VGA clock
macro   InterceptTimer
{
                cli
                xor     dx,dx
                mov     es,dx
                les     ax,[es:8*4]             ; ES:AX = IRQ 0 handler
                mov     word [OrigTimerHandler+0],ax
                mov     word [OrigTimerHandler+2],es
                mov     es,dx
                mov     word [es:8*4+0],TimerHandler
                mov     [es:8*4+2],cs           ; set new handler
                mov     [CurrentPart],-1        ; current part number = -1
 
                call    TuneTimerClock          ; set mode 2 of timer (channel 0) to countdown by 1 instead of 2 (DX = 0 - default value)
                call    VerticalRetrace
                call    ReadTimerValue
                push    dx
                call    VerticalRetrace
                call    ReadTimerValue
                pop     ax
                sub     ax,dx                   ; AX = clocks per frame
                add     ax,TOTAL_PARTS_PER_FRAME/2
                xor     dx,dx
                mov     bx,TOTAL_PARTS_PER_FRAME
                div     bx                      ; AX = Round(clocks per frame / total parts per frame)
 
                xchg    dx,ax
                call    TuneTimerClock          ; set timer (channel 0) clocks
                sti
}
 
; Restore timer (channel 0) counter clock and IRQ 0 handler
macro   RestoreTimer
{
                cli
                les     ax,[OrigTimerHandler]
                push    ds
                xor     dx,dx
                mov     ds,dx
                mov     [8*4+0],ax
                mov     [8*4+2],es              ; restore IRQ 0 handler
                pop     ds
                call    TuneTimerClock          ; DX = 0 (reset to default 65536 value)
                sti
}
 
;-----------------------------------------------------------------------------------------------------------------------
 
use16
org     0x100
 
                mov     ax,0x13
                int     0x10
 
                InterceptTimer
 
                xor     ah,ah
                int     0x16
 
                RestoreTimer
 
                mov     ax,3
                int     0x10
 
                int     0x20
 
;-----------------------------------------------------------------------------------------------------------------------
 
; This macro is called from our IRQ 0 handler on first screen part
; Input value: DS = CS
; Segment registers (including DS) should be saved if changed !!!
macro   FirstPart
{
  if    SHOW_GRADIENT_BAR
        local   ..exit
                mov     ax,[BarPos]
                add     ax,[BarPosDelta]
                mov     [BarPos],ax
                jz      @F
                cmp     ax,MAX_LINE_POS
                jb      ..exit
        @@:     neg     [BarPosDelta]
        ..exit:
  end if
}
 
; This macro is called from our IRQ 0 handler on next screen part
; Input values: DS = CS; CX = screen part number (can be >= PARTS_PER_FRAME)
; Segment registers (except DS) should be saved if changed !!!
macro   NextPart
{
  if    SHOW_GRADIENT_BAR
  MAX_LINE_POS  =       PARTS_PER_FRAME-125
                mov     ax,[BarPos]
 
                xor     bx,bx                   ; black
                sub     cx,ax
                jb      @F                      ; jump if part number < BarPos
                cmp     cx,124
                ja      @F                      ; jump if part number - BarPos > 124
 
                mov     bx,cx
                inc     bx                      ; saturation = part number - BarPos + 1 (1..63)
                cmp     cx,63
                jb      @F                      ; jump if part number - BarPos < 63
 
                mov     bx,125
                sub     bx,cx                   ; saturation = 125 - (part number - BarPos)
        @@:
                xor     ax,ax
                mov     bh,bl
                SetPalette
  else ; ~ SHOW_GRADIENT_BAR
                mov     ax,0x3F00
                mov     bx,0x3F00               ; magenta (out of screen)
                cmp     cx,PARTS_PER_FRAME
                jae     @F
 
                xor     bx,bx                   ; red (first and last 16 lines)
                cmp     cx,16
                jb      @F
                cmp     cx,PARTS_PER_FRAME-16
                jae     @F
 
                mov     bl,0x3F                 ; yellow (next 16 lines)
                cmp     cx,32
                jb      @F
                cmp     cx,PARTS_PER_FRAME-32
                jae     @F
 
                cbw                             ; green (next 16 lines)
                cmp     cx,48
                jb      @F
                cmp     cx,PARTS_PER_FRAME-48
                jae     @F
 
                mov     bh,0x3F                 ; cyan (next 16 lines)
                cmp     cx,64
                jb      @F
                cmp     cx,PARTS_PER_FRAME-64
                jae     @F
 
                xor     bl,bl                   ; blue (other visible zone)
        @@:
                SetPalette
  end if
}
 
; Set palette of color AL to AH (red), BL (green), BH (blue)
macro   SetPalette
{
                mov     dx,0x3C8
                out     dx,al
                inc     dx
                mov     al,ah
                out     dx,al                   ; red
                mov     al,bl
                out     dx,al                   ; green
                mov     al,bh
                out     dx,al                   ; blue
}
 
BarPos          dw      0                       ; position of gradient bar
BarPosDelta     dw      1                       ; direction (positive = down, negative = up)
 
;-----------------------------------------------------------------------------------------------------------------------
 
; Our IRQ 0 handler
TimerHandler:
                pusha
                push    ds
                push    cs
                pop     ds
                inc     [CurrentPart]
 
                mov     dx,0x3DA
                in      al,dx
                test    al,8
                jz      .noretrace                      ; jump if no vertical retracing
        @@:     in      al,dx
                test    al,1
                jnz     @B                              ; wait for first visible screen line
                xor     ax,ax
                mov     [CurrentPart],ax
                FirstPart
        .noretrace:
                mov     cx,[CurrentPart]
                NextPart
 
                mov     al,0x20
                out     0x20,al                 ; EOI
                pop     ds
                popa
                iret
 
; Set timer (channel 0) counter to DX clock cycles between IRQ 0 generations
TuneTimerClock:
                mov     al,0x34                 ; channel 0 write mode, counter mode 2
                out     0x43,al
                xchg    dx,ax
                out     0x40,al                 ; low byte of clock cycles
                mov     al,ah
                out     0x40,al                 ; high byte of clock cycles
                ret
 
; Read timer (channel 0) counter value into DX
ReadTimerValue:
                xor     al,al
                out     0x43,al                 ; channel 0 read mode
                in      al,0x40
                xchg    dx,ax
                in      al,0x40
                mov     dh,al
                ret
 
; Wait for vertical retrace start
VerticalRetrace:
                mov     dx,0x3DA
        @@:     in      al,dx
                test    al,8
                jz      @B
        @@:     in      al,dx
                test    al,8
                jnz     @B
                ret
 
CurrentPart     rw      1                       ; current part number
OrigTimerHandler rd     1                       ; original timer handler far address
[del]
1
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
07.09.2018, 08:04
Цитата Сообщение от Jin X Посмотреть сообщение
Между какими?
Прерывание от VGA, а не от таймера, в начале обратного вертикального хода луча.
Инженеры IBM до такого не додумались?
Полезно, и не так уж часто срабатывало бы. 60Гц.
0
3410 / 1829 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
07.09.2018, 10:47
Цитата Сообщение от politoto Посмотреть сообщение
Полезно, и не так уж часто срабатывало бы. 60Гц.
Ага, 60 раз в секунду
Когда таймер - только 18.2 раза в секунду
1
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4574 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
07.09.2018, 10:59
Цитата Сообщение от politoto Посмотреть сообщение
Инженеры IBM до такого не додумались?
Легко смотреть с высоты сегодняшнего времени
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
07.09.2018, 12:37
Прерывания от винтажных видеокарт

Добавлено через 9 секунд
https://www.vogons.org/viewtopic.php?t=58445

Добавлено через 57 минут
Вот что нашёл в винтажном мануале.
http://bitsavers.trailing-edge... _May92.pdf
Input Status Register 0
The address for this read-only register is address hex 03C2.
Do not write to this register.

CI : CRT Interrupt
SS : Switch Sense

The register fields are
defined as follows:
CI
When the CRT
Interrupt field (bit 7) is 1, a vertical retrace interrupt is pending.

Vertical Retrace End Register
This register has an index of hex 11; its address is hex
03D5 or 03B5.

PR : Protect Registers 0-7
S5R : Select 5 Refresh Cycles
EVI : Enable Vertical Interrupt
CVI : Clear Vertical Interrupt
VRE : Vertical Retrace End


EVI

When the Enable
Vertical Interrupt field (bit 5) is set to
0, it enables a vertical retrace interrupt.
The vertical retrace interrupt is IRQ2.
This interrupt level can be shared, therefore, to
determine whether the video generated the interrupt, check the CRT
interrupt bit
in Input Status Register 0
1
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6812 / 2052 / 238
Регистрация: 14.12.2014
Сообщений: 4,304
Записей в блоге: 12
07.09.2018, 13:03  [ТС]
Цитата Сообщение от politoto Посмотреть сообщение
Прерывание от VGA, а не от таймера, в начале обратного вертикального хода луча.
Такое было раньше на старых компах. См. в сторону int 0Ah, int 71h (IRQ 2/9), но сейчас это даже в DOSBox не работает (хотя, может, можно выставить какие-то настройки, чтоб работал?)

Добавлено через 1 минуту
Цитата Сообщение от politoto Посмотреть сообщение
Enable Vertical Interrupt
А, вижу, что вы уже нашли.
А вот это попробую...

Добавлено через 1 минуту
Но я почти уверен, что если это и будет работать, то в DOSBox каком-нибудь, не более...

Добавлено через 15 минут
Нет, не работает (в DOSBox для machine=vgaonly). Записывал 0, проверял оба прерывания, макси PIC/PIC2 сбрасывал.
2
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
07.09.2018, 13:03
Да и работающих CRT остаётся всё меньше и меньше с каждым годом...
1
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6812 / 2052 / 238
Регистрация: 14.12.2014
Сообщений: 4,304
Записей в блоге: 12
07.09.2018, 13:43  [ТС]
politoto, но в любом случае современные девайсы поддерживают все эти функции, эмулируют их работу.
1
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
07.09.2018, 14:19
Бегущие полосочки при смене цвета бордюра на подавляющем большинстве LCD уже не увидишь.
0
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6812 / 2052 / 238
Регистрация: 14.12.2014
Сообщений: 4,304
Записей в блоге: 12
07.09.2018, 17:06  [ТС]
Короче, я понял в чём косяк. Оказывается, на этих мониторах 49 закадровых строк пробегают очень быстро, буквально за 5-6 видимых строк (по времени). Жесть какая-то! Как с этим бороться? Придётся, замерять это закадровое время отдельно, видимо... В регистрах же нет такой инфы (какая часть времени тратится на закадровые строки), я думаю, верно?
1
3410 / 1829 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
07.09.2018, 19:19
Цитата Сообщение от politoto Посмотреть сообщение
Бегущие полосочки при смене цвета бордюра на подавляющем большинстве LCD уже не увидишь.
Вам сказали:
Цитата Сообщение от liv Посмотреть сообщение
Легко смотреть с высоты сегодняшнего времени
LCD-мониторы, в отличии от ЭЛТ-мониторов, снабжены памятью и мозгами, последние тупо выводили входящий сигнал, LCD-мониторы, снабжены памятью и маленькими мозгами, приняв сигнал, проанализировав его, без участия юзера, принимают решение, как его "клевей" показать.

Не давно было, навернулся LCD-монитор(кондеры БП вздулись), пришлось ЭЛТ-монитор доставать из закромов(очень срочно нужно), на время покупки, в миллениум, был один из крутых 17", пол стола занимал. Настройка X:Y, заняла минут 15-ть., то не так, это не туда. А LCD-монитор, все делал на автомате. Ему(ЭЛТ-монитор) уже почти 20-ть лет, а работает, а LCD-монитор и двух лет не протянул.


Цитата Сообщение от politoto Посмотреть сообщение
Инженеры IBM до такого не додумались
Они додумались

Во время ЭЛТ-мониторов, промежутки времени обратного хода луча использовались, для регенерации памяти ОЗУ. И это происходило без без участия юзера. Не нужно юзверю мешать нормальной работе железа. 18.2 раза в секунду - и то позволяют руко-жопым кодерам(РЖК) вешать железо, у тут 60-т раз в секунду. Угадайте куда РЖК полезет в первую очередь. Наверное и у них в то время было пару РЖК, у которых была "бумажка"-диплом, вот я закончил-т.е. знаю, я умею, И скорее всего, именно для них придумали змейку, тетрис, героев, цивилизацию, повышай свой IQ, только не лезь к нам.

Приходит сын сисадмина(СС) к папе, сисадмину,(ПС)...
Папа, как всегда, трое суток не вылазя из-за компьютера что-то хачит...
СС - Папа, почему Солнце всходит на востоке, а заходит на Западе?
Папа - ноль эмоций...
СС - Папа, ну почему Солнце каждый день всходит на востоке,
а заходит на Западе?
Папа - опять ноль эмоций...
СС - (нетрпеливо дергая папу за рукав) Папа, папа, ну почему Солнце
каждый день всходит на востоке, а заходит на Западе?
ПС - (оторвавшись от Клавы и глядя мутным взором на сына) Солнце...
СС - Да
ПС - Всходит на востоке...
СС - Да
ПС - Заходит на западе...
СС - Да, папа
ПС - Каждый день?!
СС - Да...
ПС - И давно так?
СС - Ну, я не знаю... Всегда...
ПС - Знаешь что, Сынок? Работает - не трогай!!!
Не нужно РЖК давать свободу
1
 Аватар для Ethereal
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
08.09.2018, 20:16
Цитата Сообщение от Jin X Посмотреть сообщение
Кто-нибудь знает, возможно ли прочитать из портов графического адаптера (VGA в частности) номер текущей строки (линии), на которой находится луч?
Вот надо бы найти такую очень старую демонстрашку :
РIC.COM - работает по-человечески только на EGA. По <Ctrl>+<N> в центре экрана появляется на 5 секунд портрет девушки. Работает только в текстовом режиме. В графическом режиме не глюкует. Резидент.
и посмотреть как было сделано там. Я ее выдел. Действительно выводила изображение высотой несколько строк поверх текста и в текстовом режиме и потом убирала. И изображение как-то к строкам привязывалось.

Добавлено через 2 минуты
Цитата Сообщение от Jin X Посмотреть сообщение
фрейм
Цитата Сообщение от Jin X Посмотреть сообщение
ретрейса
И как люди раньше без этого по русски говорили. Кадр и развертка.

Добавлено через 1 минуту
Цитата Сообщение от Jin X Посмотреть сообщение
вертикального ретрейса
кадровой развертки

Добавлено через 1 минуту
Цитата Сообщение от Jin X Посмотреть сообщение
горизонтального ретрейса
да строчной-же развертки.

Добавлено через 15 минут
Цитата Сообщение от Constantin Cat Посмотреть сообщение
Во время ЭЛТ-мониторов, промежутки времени обратного хода луча использовались, для регенерации памяти ОЗУ.
Ну не знаю. Во времена CGA чтобы он не снежил нужно было писать в видеопамять именно во время обратного хода луча. А ты говоришь тогда регенерация. А мы как-раз в это время пишем. Так-что регенерация там делалась так, чтобы программист о ней ничегo не знал.

Добавлено через 18 минут
Цитата Сообщение от Constantin Cat Посмотреть сообщение
Ага, 60 раз в секунду
Когда таймер - только 18.2 раза в секунду
Если не забыл, но в ДВК-3 прерывание от таймера тикало от частоты сети 50 гц, которая стоит с достаточной точностью. Я когда первый раз увидел IBM PC был поражен кривизной решения на таймер. Ну хотя бы кварц часовой впаяли, чем так позориться. Эти 18.2 герц ни в п..у, ни в Красную армию. Они на одном кварце сэкономили и заиспользовали его частоту для нескольких разных нужд. Ну и в итоге вот.

Добавлено через 1 час 7 минут
Цитата Сообщение от Jin X Посмотреть сообщение
то-то я не очень понял, что это за регистр: start vertical blanking-1.
Начало кадрового импульса гашения. Импульс гашения еще в ламповых телевизорах был шире времени обратного хода луча по кадрам. Он гасил не только обратный ход, но и верхний и нижний края растра на прямом ходе. На них-же линейности никакой, там переходные процессы между обратным и прямым ходом и строки на этих краях надо тоже гасить.

Добавлено через 54 минуты
Цитата Сообщение от Jin X Посмотреть сообщение
У меня (правда, в DOSBox, machine=vgaonly) показывает 407 (после коррекции на единицу) при vertical display end = 399
Эти 8 линий разницы - это бордюр. vertical display end - это конец отображаемых из видеопамяти строк. start vertical blanking - конец бордюра, начало гашения. А start vertical retrace по идее должно быть больше start vertical blanking. Потому-что сначала начинается гашение, потом должно пройти чуточек строк (я мыслю аналогией с кинескопным телевизором) и только тут запускается обратный ход.

Добавлено через 7 минут
А 449 строк всего, как я понимаю, получилось от деления частоты строчной развертки 31.46875 кГц на частоту кадровой 70 Гц. Только чего-то делится с ошибкой в пол-строки.
3
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6812 / 2052 / 238
Регистрация: 14.12.2014
Сообщений: 4,304
Записей в блоге: 12
08.09.2018, 22:01  [ТС]
Цитата Сообщение от Constantin Cat Посмотреть сообщение
Не нужно юзверю мешать нормальной работе железа. 18.2 раза в секунду - и то позволяют руко-жопым кодерам(РЖК) вешать железо, у тут 60-т раз в секунду.
Таймер для IRQ 0 (8-е прерывание) программируется. Можно хоть на 11.93181 МГц настроить.
К тому же, есть ещё IRQ 8 (int 70h), real time clock, который генерируется (когда включен) с частотой 1024 Гц, хотя его можно ещё и настраивать вплоть до 8192 Гц.
Хотя тут понятно, что ничего программировать не надо, если всё настроено. Но можно было бы оставить возможность, просто отключить по умолчанию.

Цитата Сообщение от Ethereal Посмотреть сообщение
Только чего-то делится с ошибкой в пол-строки.
Потому что там не ровно 70 Гц, а 70.086.
Соответственно, для 60 Гц более точное значение – 59.94.

Добавлено через 10 минут
Цитата Сообщение от Ethereal Посмотреть сообщение
Эти 18.2 герц ни в п..у, ни в Красную армию.
Тут вообще забавные игры с цифрами.
14'318'184 Гц - частота кварцевого генератора
14'318'184 Гц / 4 = 3'579'545 Гц (NTSC color subcarrier frequency)
14'318'184 Гц / 3 = 4'772'728 Гц (частота проца PC/XT)
14'318'184 Гц / 12 = 1'193'182 Гц (частота таймера 8253/8254, хотя я чаще встречал число 1'193'181 Гц)
1'193'182 / 65536 = 18.2 (это, я думаю, все знают)

Цитата Сообщение от Ethereal Посмотреть сообщение
РIC.COM - работает по-человечески только на EGA. По <Ctrl>+<N> в центре экрана появляется на 5 секунд портрет девушки. Работает только в текстовом режиме. В графическом режиме не глюкует. Резидент.
и посмотреть как было сделано там. Я ее выдел. Действительно выводила изображение высотой несколько строк поверх текста и в текстовом режиме и потом убирала. И изображение как-то к строкам привязывалось.
Она может фонт менять и всё. Причём, есть же 512-символьный режим за счёт бита мигания, насколько я помню, вторые 256 символов используются. Так что, это не проблема. Если, конечно, это не многоцветный портрет, где в одном блоке 8x16 более 2-х цветов... Есть картинка?
Ну а если там есть игра с номером строки, то прога может через биты 3 и 0 регистра 3DAh найти начало кадра и отсчитать нужную строку (а вот с нужной позицией по горизонтали уже куда сложнее, специальных битов для этого нет).

Добавлено через 1 минуту
Цитата Сообщение от Ethereal Посмотреть сообщение
И как люди раньше без этого по русски говорили. Кадр и развертка.
Ну да. Я как вижу, так и произношу

Добавлено через 3 минуты
Цитата Сообщение от Jin X Посмотреть сообщение
14'318'184 Гц - частота кварцевого генератора
А вот почему именно такая частота? Это интересно!
2
Эксперт Hardware
Эксперт Hardware
 Аватар для R71MT
6211 / 2445 / 403
Регистрация: 29.07.2014
Сообщений: 3,175
Записей в блоге: 4
08.09.2018, 23:24
Цитата Сообщение от Ethereal Посмотреть сообщение
Вот надо бы найти такую очень старую демонстрашку :
и всё остальноле туда-же....

Добавлено через 4 минуты
Ethereal,
Женя пипец ищет не легаси решения... ему подавай что-нить поизнасиловать
оттяни эту карту --- чтоб все знали..
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.09.2018, 23:24
Помогаю со студенческими работами здесь

Пул потоками вывести номер столбца массива, в котором есть минимальный элемент текущей строки
Мне нужно пул потоками вивести номер столпца массива в котором есть минимальный елемент текущей строки. Програма сделана по шаблону даному...

Как получить номер(или какой нить индифиактор) текущей строки в открытом файле и перейти затем на эту строчку?
открываю файл так: ifstream input(&quot;morf.txt&quot;); перехожу на следующие строчки так: input.getline(buffer, 1024);

Какова степень поляризации отраженного луча, если угол падения светового луча на границу раздела двух диэлектриков равен углу Брюстера?
Подскажите как решить задачку

Определить номер строки, содержащей положительные числа, и вывести номер строки
В двумерном массиве определить номер строки, содержащих положительные числа и вывести номер строки. Массив вводить рандомом

Номер текущей записи в ADODB.Recordset
Подскажите каким образом можно получить номер текущей записи в ADODB.Recordset. ADODB.Recordset.AbsolutePosition возвращает только знения...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru