Pascal

Использование и разработка софта (преимущественно на ПЦ)

Moderator: Shaos

Romanich
Banned
Posts: 608
Joined: 12 Oct 2006 16:44

Post by Romanich »

Ну вот, со спокойной совестью могу отказаться от Паскаля, перейдя на Open Watcom C v1.6 :)
Romanich
Banned
Posts: 608
Joined: 12 Oct 2006 16:44

Post by Romanich »

Я забил на сабж, когда Шаос рассказал об Опен Ватком Си.

Считаю, паскаль менее гибким в работе со специфическими вещами.
Например - арифметика указателей:

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.
Представленная выше программа - конвертит 24-битные BMP в 16 битный бинарник. Написана мной на ТМТ Паскале.
User avatar
HardWareMan
Banned
Posts: 2139
Joined: 20 Mar 2005 13:41
Location: От туда

Post by HardWareMan »

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;
Ничего не напоминает? Например из х86 ассемблера? Правда, надо следить за лимитами, чтобы не повредить соседа по куче. И в реальном режиме есть ограничение на сегмент: 64К-8. В борланд паскале в защищенном режиме этот лимит увеличен, что перекочевало и в Дельфи.
Last edited by HardWareMan on 17 Jun 2008 23:42, edited 1 time in total.
Romanich
Banned
Posts: 608
Joined: 12 Oct 2006 16:44

Post by Romanich »

В Борланд Паскале защищённый режим какой-то уродский... через 16 битные регистры... так как задумывался для ы286.

Истинный защищенный режим появился в ы386

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

Кстати такая задачка - как "культурно" выделить ровно 64 кБ ОЗУ в ДОСе которые выровнены на сегмент?

Сейчас просто п#зжу сегмент по адресу 0x7000:0x0000 - не повисает, да и смотрелкой своей проверял - он пуст.

smartdrv не загружен. Висит только himem
User avatar
CHRV
God
Posts: 1101
Joined: 29 Dec 2003 01:00
Location: Москва

Post by CHRV »

Romanich wrote:Кстати такая задачка - как "культурно" выделить ровно 64 кБ ОЗУ в ДОСе которые выровнены на сегмент?
Блин работай в 32битном режиме - екстендеров тьма-тьмущая для того же ваткома... Че за извраты в 21 веке 8)
Московский филиал NedoPC http://www.nedopc.com
Romanich
Banned
Posts: 608
Joined: 12 Oct 2006 16:44

Post by Romanich »

CHRV wrote:
Romanich wrote:Кстати такая задачка - как "культурно" выделить ровно 64 кБ ОЗУ в ДОСе которые выровнены на сегмент?
Блин работай в 32битном режиме - екстендеров тьма-тьмущая для того же ваткома... Че за извраты в 21 веке 8)
ты не понял:)

объясню по-конкретнее. Мне нужно задействовать саунд-бластер c DMA режимом. DMA требует сегменты, выровненные на 4KБ.

Плюс сюда моё требование - выделить буфер размером 64 кБ.

что и даёт суммарное требование -выделить блок 64кб выровненный на сегмент.

Пишу в защищенном 32-битном режиме, но это не освобождает от выделения "нижней" памяти.

farmalloc() не хочет выделить столько "нижней памяти", вот и приходится п#зд$ть кусок по адресу 0x7000:0x0000
Romanich
Banned
Posts: 608
Joined: 12 Oct 2006 16:44

Post by Romanich »

тут ещё мега-извратная идея появилась попытаться использовать банк видеопамяти текстого режима 0xB000:0x0000

Данный сегмент свободен, так как прога работает в графических режимах (адреса 0xA000:0x0000).

Нужно только отобрать у видеоконтроллера текстовую видеопамять (когда установлен графический режим, текстовая видеопамять не доступна по записи - так что разлочивать VGA-регистрами прийдется :)

P.S. Идея проигрывать оцифрованный звук по кусочкам меня не катит :no:
Craz
Fanat
Posts: 64
Joined: 11 Mar 2007 03:57
Location: 217.9.147.66

Post by Craz »

Моё имхо:

Паскаль - это очень хороший язык! Он наверно больше всех понятен простому человеку, логичен, у него хороший синтаксис...

Другое дело что были некачественные компиляторы ( юзал BP и TP, новые Free Pascal - пока ещё нет ) - выдают очень большой по обьёму код ( а может я неоптимизированно писал или не использовал директивы... хз ).

С Паскаля я начинал и думаю, с него надо начинать.

Щас понемногу начал изучать Ассемблер ( юзаю FASM ), считаю его самым лучшим языком вообще и достаточно простым для понимания по сравнению со всякими Сями...
User avatar
CHRV
God
Posts: 1101
Joined: 29 Dec 2003 01:00
Location: Москва

Post by CHRV »

Romanich wrote:тут ещё мега-извратная идея появилась попытаться использовать банк видеопамяти текстого режима 0xB000:0x0000

Данный сегмент свободен, так как прога работает в графических режимах (адреса 0xA000:0x0000).

Нужно только отобрать у видеоконтроллера текстовую видеопамять (когда установлен графический режим, текстовая видеопамять не доступна по записи - так что разлочивать VGA-регистрами прийдется :)

P.S. Идея проигрывать оцифрованный звук по кусочкам меня не катит :no:
Блин ну воще, честно говоря не помню уже как это делается, но отзеркалировать системную память на 32битную запросто можно (там какието дескрипотры нужно сбацать или посмотреть откуда берется все). А вообще посмотри как под экстендерами работают в ДМА.
Московский филиал NedoPC http://www.nedopc.com
Romanich
Banned
Posts: 608
Joined: 12 Oct 2006 16:44

Post by Romanich »

В защищённом режиме ДМА всёравно требует страницу и смещение,не пересекающее 4кб. А программа обращается через селектор. Правильно Рома сказал! Это всё понятно. Но ДМА работает только с нижней памятью! В ДПМИ даже функция такая есть 'выделить нижнюю память',только если у неё попросишь много-может не дать!!!
в инете есть статья 'программирование СБ в защищённом режиме' -так вот,там делается проверка на возможность выделения такого объёма нижней памяти-и если нельзя, то выход! Либо отхавываем память с адресов после приложения,что является грязным методом- проще выгрузить все резиденты,кеши и тырить незанятый сегмент вручную...

а всё из-за крайне убогой архитектуры старенького ДМА! Юзать УДМА, БАС МАСТЕР- значит отказываться от совместимости с СБ,что мне в данной задаче требуется
User avatar
HardWareMan
Banned
Posts: 2139
Joined: 20 Mar 2005 13:41
Location: От туда

Post by HardWareMan »

Играл с 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
User avatar
Shaos
Admin
Posts: 24080
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Craz wrote:Паскаль - это очень хороший язык! Он наверно больше всех понятен простому человеку, логичен, у него хороший синтаксис...
Неправда - паскаль очень плохой язык, сворачивает голову нафиг неподготовленным школьникам и студентам, нелогичен и у него плохой синтаксис ;)

Самый логичнй и правильный язык программирования - это Си :roll:
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
HardWareMan
Banned
Posts: 2139
Joined: 20 Mar 2005 13:41
Location: От туда

Post by HardWareMan »

Shaos wrote:
Craz wrote:Паскаль - это очень хороший язык! Он наверно больше всех понятен простому человеку, логичен, у него хороший синтаксис...
Неправда - паскаль очень плохой язык, сворачивает голову нафиг неподготовленным школьникам и студентам, нелогичен и у него плохой синтаксис ;)
Самый логичнй и правильный язык программирования - это Си :roll:
Вот только не надо тут Сшной пропаганды! Я всегда был есть и буду за Паскаль. И буду плеваться на С. Если надо быстро и тупо - Паскаль/Дельфи, если нормально - ассемблер. А вот С, скока не пытался - никак не получается. ИМХО самый неудобочитаемый язык для тех, кому лень печатать. Согласен, все дело в привычке, но было время я и на бэйсика писал Программы с большой буквы (чего стоит только расчет транса и мостового выпрямителя на бейсике "Практик" для "Специалист"а.
Так что я попрошу воздержаться от таких резких и беспричинных высказываний. Я понимаю, что паскаль зажимает в жесткие рамки типизации, но как запасной вариант остаются указатели (что в конечном счете очень похоже на ассемблер). Но вот как раз новичкам лучше, когда есть контроль над данными, чтобы в случае ошибки в алгоритме не ломать голову, почему все рушится, откуда новичку знать, что какой-то индекс вышел за пределы и указывает на запрещенную часть памяти.
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)
Итак, где логика хваленного С? Самый логичный из всех логичных языков бы есть и будет ассемблер.
User avatar
Shaos
Admin
Posts: 24080
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Твой пример лишь показывает нелогичность C# и PHP - все си говорят одно и тоже :)
P.S. А для новичков лучше всего Java - строгая типизация и обнаружение подавляющего большинства ошибок на этапе компиляции
P.P.S. Попробуй написать на ассемблере что-то больше тысячи строк - посмотрим в какой момент ты взвоешь ;)
Я тут за главного - если что шлите мыло на me собака shaos точка net
Romanich
Banned
Posts: 608
Joined: 12 Oct 2006 16:44

Post by Romanich »

Для меня Паскаль был переходным мостом к пониманию Си. Уж так исторически сложилось, мой знакомый чуваг научил программировать на Turbo Pascal 7.0. Да! Было время когда хотел замутить игру на графике Borland - разочаровался в её тормознутости и малоцветности. Потом стал использовать обрубок ы286-го асма. Далее изучил TASM, стал obj- подключать к TP 7.0. Ну и VESA VBE, Flat Unreal попёр, чистый ДОС и всё такое... Осознание несовершенства даже Win9x, ненависть к XP и прочим Вистам... :lol:

Программить под винды до сих пор не катит, сейчас сижу в W9x и пишу под DOS32 (связка WCC + PMODE/W). Всё устраивает.

А Билл Гейтс - сцуко, он начиная в WinXP выкинул полезную функцию DPMI "Map Physical To Linear" - с помощью неё можно в любой регион памяти залезть по 32-битному физическому адресу.

Я так в буфер Винампа подсирал синусоиду !!! :) ;) :kruto:

А в Висте вообще VESA VBE убрал... В общем ДОС-машину похерил окончательно!!! :evil: За что ему огромный фуцк и г%вна за шиворот!

Ни и сам Писюк подкачал - куча разношерстного железа. Мой творческий потенциал угасает с написанием всяких проверок типа:

- а есть ли у нас VBE совместимая карта?
- какие режимы поддерживает?
- какая огранизация видеопамяти? (1:5:5:5 или 5:6:5)?
- а какой у нас адрес LFB?
- поддерживается ли СБ, тип и прочее, прочее, прочее...

От такого мозго%бства, простите, устаёшь...

То ли дело - приставки :) Типа NES, SEGA и пр... Не надо так париться :) На МикроМашине тоже всё фиксировано.