
Pascal
Moderator: Shaos
-
- Banned
- Posts: 608
- Joined: 12 Oct 2006 16:44
-
- Banned
- Posts: 608
- Joined: 12 Oct 2006 16:44
Я забил на сабж, когда Шаос рассказал об Опен Ватком Си.
Считаю, паскаль менее гибким в работе со специфическими вещами.
Например - арифметика указателей:
Представленная выше программа - конвертит 24-битные BMP в 16 битный бинарник. Написана мной на ТМТ Паскале.
Считаю, паскаль менее гибким в работе со специфическими вещами.
Например - арифметика указателей:
Code: Select all
{$I+}
uses CRT;
var fIN,fOUT:file;
nameIN,nameOUT:string;
BitmapPosition,BitmapWidth,BitmapHeight:word;
BufferIN,OBufferIN,BufferOUT:pointer;
Garbage:array[0..3] of byte;
i,O:dword;
BEGIN
ClrScr;
TextColor(15);
WriteLn('24 bit BMP to 16 bit RGB 5:6:5');
WriteLn('(C) Romanich 2008');
WriteLn;
TextColor(7);
Write('IN File:');
TextColor(15);
ReadLn(nameIN);
if nameIN='' then Halt;
TextColor(7);
Write('OUT File:');
TextColor(15);
ReadLn(nameOUT);
if nameOUT='' then Halt;
Assign(fIN,nameIN);
ReSet(fIN,1);
Seek(fIN,10);
BlockRead(fIN,BitmapPosition,2);
Seek(fIN,18);
BlockRead(fIN,BitmapWidth,2);
Seek(fIN,22);
BlockRead(fIN,BitmapHeight,2);
Seek(fIN,BitmapPosition);
GetMem(BufferIN,BitmapWidth*BitmapHeight*3);
for i:=BitmapHeight-1 downto 0 do begin
OBufferIN:=PTR(DWORD(BufferIN)+BitmapWidth*3*i);
BlockRead(fIN,OBufferIN^,BitmapWidth*3);
if BitmapWidth and 3<>0 then BlockRead(fIN,Garbage,BitmapWidth and 3);
end;
Close(fIN);
GetMem(BufferOUT,BitmapWidth*BitmapHeight*2);
for i:=0 to BitmapWidth*BitmapHeight-1 do begin
O:=DWORD(BufferIN)+3*i;
MemW[DWORD(BufferOUT)+(i shl 1)]:=((Mem[O+2] shr 3) shl 11) or ((Mem[O+1] shr 2) shl 5) or (Mem[O] shr 3);
end;
Assign(fOUT,nameOUT);
ReWrite(fOUT);
BlockWrite(fOUT,BufferOUT^,BitmapWidth*BitmapHeight*2);
Close(fOUT);
FreeMem(BufferIN,BitmapWidth*BitmapHeight*3);
FreeMem(BufferOUT,BitmapWidth*BitmapHeight*2);
END.
-
- Banned
- Posts: 2139
- Joined: 20 Mar 2005 13:41
- Location: От туда
Ну почему, есть в нем красивые решения, например:Romanich wrote:Считаю, паскаль менее гибким в работе со специфическими вещами.
Например - арифметика указателей:
Code: Select all
type tmem = array[$0000..$FF7F] of byte;
pmem = ^tmem;
var mem:pmem;
c:word;
begin
new(mem);
for c:=0 to $FF7F do mem^[c]:=$00;
dispose(mem);
end;
Last edited by HardWareMan on 17 Jun 2008 23:42, edited 1 time in total.
-
- Banned
- Posts: 608
- Joined: 12 Oct 2006 16:44
В Борланд Паскале защищённый режим какой-то уродский... через 16 битные регистры... так как задумывался для ы286.
Истинный защищенный режим появился в ы386
На счёт динамических структур и очередей - я как бы не фан их использовать, вручную распределяю ресурсы.
Кстати такая задачка - как "культурно" выделить ровно 64 кБ ОЗУ в ДОСе которые выровнены на сегмент?
Сейчас просто п#зжу сегмент по адресу 0x7000:0x0000 - не повисает, да и смотрелкой своей проверял - он пуст.
smartdrv не загружен. Висит только himem
Истинный защищенный режим появился в ы386
На счёт динамических структур и очередей - я как бы не фан их использовать, вручную распределяю ресурсы.
Кстати такая задачка - как "культурно" выделить ровно 64 кБ ОЗУ в ДОСе которые выровнены на сегмент?
Сейчас просто п#зжу сегмент по адресу 0x7000:0x0000 - не повисает, да и смотрелкой своей проверял - он пуст.
smartdrv не загружен. Висит только himem
-
- God
- Posts: 1101
- Joined: 29 Dec 2003 01:00
- Location: Москва
Блин работай в 32битном режиме - екстендеров тьма-тьмущая для того же ваткома... Че за извраты в 21 векеRomanich wrote:Кстати такая задачка - как "культурно" выделить ровно 64 кБ ОЗУ в ДОСе которые выровнены на сегмент?

Московский филиал NedoPC http://www.nedopc.com
-
- Banned
- Posts: 608
- Joined: 12 Oct 2006 16:44
ты не понял:)CHRV wrote:Блин работай в 32битном режиме - екстендеров тьма-тьмущая для того же ваткома... Че за извраты в 21 векеRomanich wrote:Кстати такая задачка - как "культурно" выделить ровно 64 кБ ОЗУ в ДОСе которые выровнены на сегмент?
объясню по-конкретнее. Мне нужно задействовать саунд-бластер c DMA режимом. DMA требует сегменты, выровненные на 4KБ.
Плюс сюда моё требование - выделить буфер размером 64 кБ.
что и даёт суммарное требование -выделить блок 64кб выровненный на сегмент.
Пишу в защищенном 32-битном режиме, но это не освобождает от выделения "нижней" памяти.
farmalloc() не хочет выделить столько "нижней памяти", вот и приходится п#зд$ть кусок по адресу 0x7000:0x0000
-
- Banned
- Posts: 608
- Joined: 12 Oct 2006 16:44
тут ещё мега-извратная идея появилась попытаться использовать банк видеопамяти текстого режима 0xB000:0x0000
Данный сегмент свободен, так как прога работает в графических режимах (адреса 0xA000:0x0000).
Нужно только отобрать у видеоконтроллера текстовую видеопамять (когда установлен графический режим, текстовая видеопамять не доступна по записи - так что разлочивать VGA-регистрами прийдется
P.S. Идея проигрывать оцифрованный звук по кусочкам меня не катит
Данный сегмент свободен, так как прога работает в графических режимах (адреса 0xA000:0x0000).
Нужно только отобрать у видеоконтроллера текстовую видеопамять (когда установлен графический режим, текстовая видеопамять не доступна по записи - так что разлочивать VGA-регистрами прийдется

P.S. Идея проигрывать оцифрованный звук по кусочкам меня не катит

-
- Fanat
- Posts: 64
- Joined: 11 Mar 2007 03:57
- Location: 217.9.147.66
Моё имхо:
Паскаль - это очень хороший язык! Он наверно больше всех понятен простому человеку, логичен, у него хороший синтаксис...
Другое дело что были некачественные компиляторы ( юзал BP и TP, новые Free Pascal - пока ещё нет ) - выдают очень большой по обьёму код ( а может я неоптимизированно писал или не использовал директивы... хз ).
С Паскаля я начинал и думаю, с него надо начинать.
Щас понемногу начал изучать Ассемблер ( юзаю FASM ), считаю его самым лучшим языком вообще и достаточно простым для понимания по сравнению со всякими Сями...
Паскаль - это очень хороший язык! Он наверно больше всех понятен простому человеку, логичен, у него хороший синтаксис...
Другое дело что были некачественные компиляторы ( юзал BP и TP, новые Free Pascal - пока ещё нет ) - выдают очень большой по обьёму код ( а может я неоптимизированно писал или не использовал директивы... хз ).
С Паскаля я начинал и думаю, с него надо начинать.
Щас понемногу начал изучать Ассемблер ( юзаю FASM ), считаю его самым лучшим языком вообще и достаточно простым для понимания по сравнению со всякими Сями...
-
- God
- Posts: 1101
- Joined: 29 Dec 2003 01:00
- Location: Москва
Блин ну воще, честно говоря не помню уже как это делается, но отзеркалировать системную память на 32битную запросто можно (там какието дескрипотры нужно сбацать или посмотреть откуда берется все). А вообще посмотри как под экстендерами работают в ДМА.Romanich wrote:тут ещё мега-извратная идея появилась попытаться использовать банк видеопамяти текстого режима 0xB000:0x0000
Данный сегмент свободен, так как прога работает в графических режимах (адреса 0xA000:0x0000).
Нужно только отобрать у видеоконтроллера текстовую видеопамять (когда установлен графический режим, текстовая видеопамять не доступна по записи - так что разлочивать VGA-регистрами прийдется
P.S. Идея проигрывать оцифрованный звук по кусочкам меня не катит
Московский филиал NedoPC http://www.nedopc.com
-
- Banned
- Posts: 608
- Joined: 12 Oct 2006 16:44
В защищённом режиме ДМА всёравно требует страницу и смещение,не пересекающее 4кб. А программа обращается через селектор. Правильно Рома сказал! Это всё понятно. Но ДМА работает только с нижней памятью! В ДПМИ даже функция такая есть 'выделить нижнюю память',только если у неё попросишь много-может не дать!!!
в инете есть статья 'программирование СБ в защищённом режиме' -так вот,там делается проверка на возможность выделения такого объёма нижней памяти-и если нельзя, то выход! Либо отхавываем память с адресов после приложения,что является грязным методом- проще выгрузить все резиденты,кеши и тырить незанятый сегмент вручную...
а всё из-за крайне убогой архитектуры старенького ДМА! Юзать УДМА, БАС МАСТЕР- значит отказываться от совместимости с СБ,что мне в данной задаче требуется
в инете есть статья 'программирование СБ в защищённом режиме' -так вот,там делается проверка на возможность выделения такого объёма нижней памяти-и если нельзя, то выход! Либо отхавываем память с адресов после приложения,что является грязным методом- проще выгрузить все резиденты,кеши и тырить незанятый сегмент вручную...
а всё из-за крайне убогой архитектуры старенького ДМА! Юзать УДМА, БАС МАСТЕР- значит отказываться от совместимости с СБ,что мне в данной задаче требуется
-
- Banned
- Posts: 2139
- Joined: 20 Mar 2005 13:41
- Location: От туда
Играл с SB в DMA так (по книжке Зубкова):
Code: Select all
;Пример программы, проигрывающей файл C:\WINDOWS\MEDIA\TADA.WAV
;на звуковой плате при помощи DMA
FILESPEC equ "01.wav" ;Воспроизводимый файл
SBPORT equ 220h ;Адрес SB
SBIRQ equ 7
.model tiny
.code
.186
org 100h
start: call dsp_reset
jnc cont
ret
cont: mov byte ptr cs:state,0
mov bl,0D1h
call dsp_write
call open_file
call hook_sbirq
mov bl,40h
call dsp_write
mov bl,0D2h ;0D2h
call dsp_write
call program_dma
push dx
mov ah,9
mov dx,offset messagestrt
int 21h
pop dx
mov al,byte ptr cs:state
mov byte ptr cs:stat,al
push dx
mov ah,9
mov dx,offset countb
int 21h
mov ax,word ptr cs:bytes
mov al,ah
call outhex
mov ax,word ptr cs:bytes
call outhex
mov ah,9
mov dx,offset counte
int 21h
pop dx
mainlp:mov al,byte ptr finished_flag
cmp al,128
je mainen
mov al,byte ptr cs:state
cmp byte ptr cs:stat,al
je mainlp
mov byte ptr cs:stat,al
push dx
mov ah,9
mov dx,offset countb
int 21h
mov ax,word ptr cs:bytes
mov al,ah
call outhex
mov ax,word ptr cs:bytes
call outhex
mov ah,9
mov dx,offset counte
int 21h
mov dx,word ptr bytes
inc dx
mov word ptr bytes,dx
pop dx
push ds
mov bx,40h
mov ds,bx
mov bx,17h
mov al,byte ptr ds:[bx]
pop ds
and al,3h
jz mainlp
mov dx,offset messageend
jmp exit
mainen:mov dx,offset messagefin
exit: mov ah,9
int 21h
call restore_sbirq
mov bl,0D3h
call dsp_write
mov bl,0D0h
call dsp_write
mov bl,0DAh
call dsp_write
mov bl,0D0h
call dsp_write
int 20h
ret
;Переменные
old_sbirq dd ?
finished_flag db 0
filename db FILESPEC,0
bytes dw 0
stat db 0
countb db 0Dh, "Воспроизведение блока номер $"
counte db "H.$"
messagestrt db "Воспроизведение. Для остановки нажмите любой SHIFT."
db 0Dh, 0Ah, '$'
messageend db 0Dh, 0Ah, "Прервано пользователем.", 0Dh, 0Ah, '$'
messagefin db 0Dh, 0Ah, "Кончилось.", 0Dh, 0Ah, '$'
;Обработчик прерывания звуковой карты
;Устанавливает флаг finished_flag в 128 если кончился файл
sbirq_handler proc far
pusha
mov al,20h
out 20h,al
mov dx,SBPORT+0Eh
in al,dx
mov ax,word ptr cs:file
mov bx,ax
mov ah,3Fh
mov cx,4000h
push ds
mov dx,ds
and dx,0F000h
mov al,byte ptr cs:state
or al,al
jnz second
first: add dx,1000h
mov ds,dx
mov dx,0
int 21h
pop ds
jc close
cmp ax,0
je close
mov byte ptr cs:state,255
popa
iret
second:add dx,1400h
mov ds,dx
mov dx,0
int 21h
pop ds
jc close
cmp ax,0
je close
mov byte ptr cs:state,0
popa
iret
close: mov byte ptr cs:finished_flag,128
popa
iret
state db 0
file dw 0
sbirq_handler endp
;Процедура outhex
;Выводит al в HEX виде
outhex proc near
push ax
shr al,4
and al,15
cmp al,10
jc out0
add al,7
out0: add al,48
mov byte ptr txt,al
pop ax
and al,15
cmp al,10
jc out1
add al,7
out1: add al,48
mov byte ptr txt+1,al
push dx
mov ah,9
mov dx,offset txt
int 21h
pop dx
ret
txt db 0,0,'$'
outhex endp
;Процедура dsp_reset
;Сброс и инициализация DSP
dsp_reset proc near
mov dx,SBPORT+6
mov al,1
out dx,al
mov cx,40
dsp_loop: in al,dx
loop dsp_loop
mov al,0
out dx,al
add dx,8
mov cx,100
check_port:in al,dx
and al,80h
jz not_ready
sub dx,4
in al,dx
add dx,4
cmp al,0AAh
je good_reset
not_ready: loop check_port
stc
ret
good_reset:clc
ret
dsp_reset endp
;Процедура dsp_write
;Посылает байт из BL в DSP
dsp_write proc near
mov dx,SBPORT+0Ch
write_loop:in al,dx
and al,80h
jnz write_loop
mov al,bl
out dx,al
ret
dsp_write endp
;Процедура hook_sbirq
;Перехватывает прерывание звуковой карты и разрешает его
hook_sbirq proc near
mov ax,3508h+SBIRQ
int 21h
mov word ptr old_sbirq,bx
mov word ptr old_sbirq+2,es
mov ax,2508h+SBIRQ
mov dx,offset sbirq_handler
int 21h
mov cl,1
shl cl,SBIRQ
not cl
in al,21h
and al,cl
out 21h,al
ret
hook_sbirq endp
;Процедура restore_sbirq
;Восстанавливает обработчик и запрещает прерывание
restore_sbirq proc near
mov ax,3508h+SBIRQ
lds dx,dword ptr old_sbirq
int 21h
mov cl,1
shl cl,SBIRQ
in al,21h
or al,cl
out 21h,al
ret
restore_sbirq endp
;Процедура open_file
;Открывает файл и заполняет буфер
open_file proc near
mov ax,3D00h
mov dx,offset filename
int 21h
jc error_exit
mov word ptr cs:file,ax
mov bx,ax
mov ax,4200h
mov cx,0
mov dx,38h
int 21h
mov ah,3Fh
mov cx,8000h
push ds
mov dx,ds
and dx,0F000h
add dx,1000h
mov ds,dx
mov dx,0
int 21h
pop ds
ret
error_exit:
mov ah,9
mov dx,offset not_open_msg
int 21h
int 20h
;Сообщение об ошибке
not_open_msg db "Ошибка при открытии файла",0Dh,0Ah,'$'
open_file endp
;Процедура program_dma
;Настраивает 1 канал DMA
program_dma proc near
mov al,5
out 0Ah,al
xor al,al
out 0Ch,al
mov al,59h ;Для авто = 59h
out 0Bh,al
push cs
pop dx
and dh,0F0h
add dh,10h
xor ax,ax
out 02h,al
out 02h,al
mov al,dh
shr al,4
out 83h,al
mov ax,8000h
dec ax
out 03h,al
mov al,ah
out 03h,al
mov al,1
out 0Ah,al
mov bl,48h
call dsp_write
mov bx,4000h
dec bx
call dsp_write
mov bl,bh
call dsp_write
mov bl,01Ch
call dsp_write
ret
program_dma endp
end start
-
- Admin
- Posts: 24080
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Неправда - паскаль очень плохой язык, сворачивает голову нафиг неподготовленным школьникам и студентам, нелогичен и у него плохой синтаксисCraz wrote:Паскаль - это очень хороший язык! Он наверно больше всех понятен простому человеку, логичен, у него хороший синтаксис...

Самый логичнй и правильный язык программирования - это Си

Я тут за главного - если что шлите мыло на me собака shaos точка net
-
- Banned
- Posts: 2139
- Joined: 20 Mar 2005 13:41
- Location: От туда
Вот только не надо тут Сшной пропаганды! Я всегда был есть и буду за Паскаль. И буду плеваться на С. Если надо быстро и тупо - Паскаль/Дельфи, если нормально - ассемблер. А вот С, скока не пытался - никак не получается. ИМХО самый неудобочитаемый язык для тех, кому лень печатать. Согласен, все дело в привычке, но было время я и на бэйсика писал Программы с большой буквы (чего стоит только расчет транса и мостового выпрямителя на бейсике "Практик" для "Специалист"а.Shaos wrote:Неправда - паскаль очень плохой язык, сворачивает голову нафиг неподготовленным школьникам и студентам, нелогичен и у него плохой синтаксисCraz wrote:Паскаль - это очень хороший язык! Он наверно больше всех понятен простому человеку, логичен, у него хороший синтаксис...
Самый логичнй и правильный язык программирования - это Си
Так что я попрошу воздержаться от таких резких и беспричинных высказываний. Я понимаю, что паскаль зажимает в жесткие рамки типизации, но как запасной вариант остаются указатели (что в конечном счете очень похоже на ассемблер). Но вот как раз новичкам лучше, когда есть контроль над данными, чтобы в случае ошибки в алгоритме не ломать голову, почему все рушится, откуда новичку знать, что какой-то индекс вышел за пределы и указывает на запрещенную часть памяти.
PS Много буков написал. Холи вор тушу брызгалкой еще в момент возгорания. Давайте будет взаимовежливы и воздержимся от резких высказываний.
PPS На счет логики С, как новичку понимать такую задачку:
Ответы:int i = 5;
i = ++i + ++i;
Вопрос: Чему равно i?
MS VC = 14 (++i, ++i, i+i)
C# = 13 (++i, i+i, ++i)
GCC = 14 (++i, ++i, i+i)
PHP = 13 (++i, i+i, ++i)
Итак, где логика хваленного С? Самый логичный из всех логичных языков бы есть и будет ассемблер.
-
- Admin
- Posts: 24080
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Твой пример лишь показывает нелогичность C# и PHP - все си говорят одно и тоже 
P.S. А для новичков лучше всего Java - строгая типизация и обнаружение подавляющего большинства ошибок на этапе компиляции
P.P.S. Попробуй написать на ассемблере что-то больше тысячи строк - посмотрим в какой момент ты взвоешь

P.S. А для новичков лучше всего Java - строгая типизация и обнаружение подавляющего большинства ошибок на этапе компиляции
P.P.S. Попробуй написать на ассемблере что-то больше тысячи строк - посмотрим в какой момент ты взвоешь

Я тут за главного - если что шлите мыло на me собака shaos точка net
-
- Banned
- Posts: 608
- Joined: 12 Oct 2006 16:44
Для меня Паскаль был переходным мостом к пониманию Си. Уж так исторически сложилось, мой знакомый чуваг научил программировать на Turbo Pascal 7.0. Да! Было время когда хотел замутить игру на графике Borland - разочаровался в её тормознутости и малоцветности. Потом стал использовать обрубок ы286-го асма. Далее изучил TASM, стал obj- подключать к TP 7.0. Ну и VESA VBE, Flat Unreal попёр, чистый ДОС и всё такое... Осознание несовершенства даже Win9x, ненависть к XP и прочим Вистам...
Программить под винды до сих пор не катит, сейчас сижу в W9x и пишу под DOS32 (связка WCC + PMODE/W). Всё устраивает.
А Билл Гейтс - сцуко, он начиная в WinXP выкинул полезную функцию DPMI "Map Physical To Linear" - с помощью неё можно в любой регион памяти залезть по 32-битному физическому адресу.
Я так в буфер Винампа подсирал синусоиду !!!
А в Висте вообще VESA VBE убрал... В общем ДОС-машину похерил окончательно!!!
За что ему огромный фуцк и г%вна за шиворот!
Ни и сам Писюк подкачал - куча разношерстного железа. Мой творческий потенциал угасает с написанием всяких проверок типа:
- а есть ли у нас VBE совместимая карта?
- какие режимы поддерживает?
- какая огранизация видеопамяти? (1:5:5:5 или 5:6:5)?
- а какой у нас адрес LFB?
- поддерживается ли СБ, тип и прочее, прочее, прочее...
От такого мозго%бства, простите, устаёшь...
То ли дело - приставки
Типа NES, SEGA и пр... Не надо так париться
На МикроМашине тоже всё фиксировано.

Программить под винды до сих пор не катит, сейчас сижу в W9x и пишу под DOS32 (связка WCC + PMODE/W). Всё устраивает.
А Билл Гейтс - сцуко, он начиная в WinXP выкинул полезную функцию DPMI "Map Physical To Linear" - с помощью неё можно в любой регион памяти залезть по 32-битному физическому адресу.
Я так в буфер Винампа подсирал синусоиду !!!



А в Висте вообще VESA VBE убрал... В общем ДОС-машину похерил окончательно!!!

Ни и сам Писюк подкачал - куча разношерстного железа. Мой творческий потенциал угасает с написанием всяких проверок типа:
- а есть ли у нас VBE совместимая карта?
- какие режимы поддерживает?
- какая огранизация видеопамяти? (1:5:5:5 или 5:6:5)?
- а какой у нас адрес LFB?
- поддерживается ли СБ, тип и прочее, прочее, прочее...
От такого мозго%бства, простите, устаёшь...
То ли дело - приставки

