Accès bas niveau

Codes specifiques à Linux
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Accès bas niveau

Message par flaith »

J'ai fait ce code il y a quelques jours (genre fOpen, fRead, fClose, fEof, ... et ioctl)

Le fichier include : io_linux.pbi

Code : Tout sélectionner

; IO Linux
; Flaith 26.02.2009-28.02.09

;-******** Permissions
; #S_IRUSR + #S_IWUSR + #S_IRGRP + #S_IWGRP + #S_IROTH + #S_IWOTH
#S_ISUID        = $0800
#S_ISGID        = $0400
#S_ISVTX        = $0200
;User
#S_IRUSR        = $0100                       ; user permission to read
#S_IWUSR        = $0080                       ; to write
#S_IXUSR        = $0040                       ; to execute
;Group
#S_IRGRP        = $0020
#S_IWGRP        = $0010
#S_IXGRP        = $0008
;Autre
#S_IROTH        = $0004
#S_IWOTH        = $0002
#S_IXOTH        = $0001

;-******** File
#SYS_READ       = 3
#SYS_WRITE      = 4
#SYS_OPEN       = 5
#SYS_CLOSE      = 6
#SYS_CREATE     = 8
#SYS_IOCTL      = 54

;-******** Seek value
#SEEK_SET       = 0                           ; Seek from beginning of file.
#SEEK_CUR       = 1                           ; Seek from current position.
#SEEK_END       = 2                           ; Seek from End of file.

;-******** Open mode
#O_RDONLY       = $0000                       ; file is read-only
#O_WRONLY       = $0001                       ; file is write-only
#O_RDWR         = $0002                       ; read or write
#O_ACCMODE      = $0003
#O_CREAT        = $0040                       ; create file or erase it
#O_EXCL         = $0080
#O_NOCTTY       = $0100
#O_TRUNC        = $0200
#O_APPEND       = $0400
#O_NONBLOCK     = $0800

;-******** Divers
#STDIN_FILENO   = 0                           ; Standard input
#STDOUT_FILENO  = 1                           ; Standard output
#STDERR_FILENO  = 2                           ; Error output

Global __num_error.i
Global __stderr.s

;-******************
;-*** Procedures ***
;-******************
;-fOpen(namefile.s,open_mode.i)
Procedure.i fOpen(namefile.s,open_mode.i)
  !mov  dword eax, 5                                  ; SYS_OPEN
  !mov  dword ebx, [p.v_namefile]
  !mov  dword ecx, [p.v_open_mode]
  !xor  dword edx, edx
  !int  byte  0x80
  !test dword eax, eax
  !js   _open_error
  ProcedureReturn                                     ; return value in EAX
  !_open_error:
  !mov  dword [v___num_error], eax
  ProcedureReturn -1
EndProcedure

;-fRead(fd.i,buffer.i,size.i)
Procedure.i fRead(fd.i,buffer.i,size.i)
  !mov  dword eax, 3                                  ; SYS_READ
  !mov  dword ebx, [p.v_fd]
  !mov  dword ecx, [p.v_buffer]
  !mov  dword edx, [p.v_size]
  !int  byte  0x80
  !test dword eax, eax
  !js   _read_error
  ProcedureReturn
  !_read_error:
  !mov  dword [v___num_error], eax
  ProcedureReturn -1
EndProcedure

;-fCreate(namefile.s,rights.i,open_mode.i)
Procedure.i fCreate(namefile.s,rights.i=#S_IRUSR+#S_IWUSR+#S_IRGRP+#S_IROTH,open_mode.i=#O_CREAT+#O_TRUNC+#O_WRONLY)
  !mov  dword eax, 5                                  ; SYS_OPEN
  !mov  dword ebx, [p.v_namefile]
  !mov  dword ecx, [p.v_open_mode]
  !mov  dword edx, [p.v_rights]
  !int  byte  0x80
  !test dword eax, eax
  !js   _create_error
  ProcedureReturn
  !_create_error:
  !mov  dword [v___num_error], eax
  ProcedureReturn -1
EndProcedure

;-fWrite(fd.i,buffer.i,size.i)
Procedure.i fWrite(fd.i,buffer.i,size.i)
  !mov  dword eax, 4                                  ; SYS_WRITE
  !mov  dword ebx, [p.v_fd]                           ; to print to console put #STDOUT_FILENO or #STDERR_FILENO
  !mov  dword ecx, [p.v_buffer]
  !mov  dword edx, [p.v_size]
  !int  byte  0x80
  !test dword eax, eax
  !js   _write_error
  ProcedureReturn
  !_write_error:
  !mov  dword [v___num_error], eax
  ProcedureReturn -1
EndProcedure

;-fClose(fd.i)
Procedure.i fClose(fd.i)
  !mov  dword eax, 6                                  ; SYS_CLOSE
  !mov  dword ebx, [p.v_fd]
  !int  byte  0x80
  !test dword eax, eax
  !js   _close_error
  ProcedureReturn
  !_close_error:
  !mov  dword [v___num_error], eax
  ProcedureReturn -1
EndProcedure

;-fSeek(fd.i, offset.i, whence.i)
Procedure.i fSeek(fd.i, offset.i, whence.i)
  !mov  dword eax, 19
  !mov  dword ebx, [p.v_fd]
  !mov  dword ecx, [p.v_offset]
  !mov  dword edx, [p.v_whence]
  !int  byte  0x80
  !test dword eax, eax
  !js   _lseek_error
  ProcedureReturn
  !_lseek_error:
  !mov  dword [v___num_error], eax
  ProcedureReturn -1
EndProcedure

;-fEof(fd.i)
Procedure.i fEof(fd.i)
Protected lenfile.i = fSeek(fd,0,#SEEK_END)

  If lenfile > 0
    fSeek(fd,0,#SEEK_SET)
    ProcedureReturn lenfile
  Else
    ProcedureReturn -1
  EndIf
EndProcedure

;-fAppend(filename.s)
Procedure.i fAppend(filename.s)
Protected fd.i = fOpen(filename,#O_APPEND+#O_RDWR)

  If fd > 0
    ProcedureReturn fd
  Else
    ProcedureReturn -1
  EndIf
EndProcedure

;-ioctl(fd.i,tdata.l,value.l)
Procedure.i ioctl(fd.i,tdata.l,value.l)
  !mov  dword eax, 54
  !mov  dword ebx, [p.v_fd]
  !mov  dword ecx, [p.v_tdata]
  !lea  dword edx, [p.v_value]
  !int  byte  0x80
  !test dword eax, eax
  !js   _ioctl_error				                          ;Jump short if sign (SF=1) (if <> 0 => error)
  ProcedureReturn
  !_ioctl_error:
  !mov  dword [v___num_error], eax
  ProcedureReturn -1
EndProcedure

Procedure.s strerror()
Protected err.s = "Unknow !!!"

  Select __num_error
    Case -2
      err = "No such file or directory"
    Case -9
      err = "Bad file number"
  EndSelect
  
  ProcedureReturn "(" + Str(__num_error) + ")" + ": " + err
EndProcedure

Procedure.s perror(error_string.s)
  __stderr = error_string + strerror()
  ProcedureReturn __stderr
EndProcedure
Dernière modification par flaith le sam. 28/mars/2009 12:49, modifié 1 fois.
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Message par flaith »

1er exemple : test_io.pb

Code : Tout sélectionner

; Test IO
XIncludeFile "io_linux.pbi"

Procedure error(err.s = "Errno")
  PrintN(perror(err))
  End
EndProcedure

;-******************
;-*****  Main  *****
;-******************
OpenConsole()
PrintN("--- fOpen("+Chr(34)+"io_linux.pbi"+Chr(34)+",#O_RDONLY)")
  fd.i = fOpen("io_linux.pbi",#O_RDONLY)

  If fd > 0
    lenfile.i = fEof(fd)
    If lenfile > 0
      buffer.s = Space(lenfile)
      PrintN("--- fRead(fd,@buffer,lenfile)")
      fRead(fd,@buffer,lenfile)
      PrintN(">>> BEGIN"):PrintN(buffer):PrintN("<<< END")
    Else
;       error("fEof")
      error()
    EndIf
  Else
    error()
  EndIf

fClose(fd)

PrintN("--- fCreate("+Chr(34)+"testouille.txt"+Chr(34)+")")
  fd.i = fCreate("testouille.txt")

  test.s = "Hello World !"+#CRLF$
  sizew.i = fWrite(fd,@test,Len(test))
  PrintN("Writing "+Str(sizew)+" bytes")

fClose(fd)

PrintN("--- fAppend("+Chr(34)+"testouille.txt"+Chr(34)+")")
  fd.i = fAppend("testouille.txt")

  test.s = "New line added !"+#CRLF$
  sizew.i = fWrite(fd,@test,Len(test))
  PrintN("Adding "+Str(sizew)+" bytes")

fClose(fd)

PrintN("--- fOpen("+Chr(34)+"testouille.txt"+Chr(34)+",#O_RDONLY)")
  fd.i = fOpen("testouille.txt",#O_RDONLY)

  lenfile.i = fEof(fd)
  If lenfile > 0
    buffer.s = Space(lenfile)
    PrintN("--- fRead(fd,@buffer,lenfile)")
    fRead(fd,@buffer,lenfile)
    PrintN(">>> BEGIN"):PrintN(buffer):PrintN("<<< END")
  EndIf

fClose(fd)

CloseConsole()
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Message par flaith »

2ème exemple : test_ioctl.pb

Code : Tout sélectionner

; IOCTL Test
XIncludeFile "io_linux.pbi"

#SNDCTL_DSP_RESET         = $00005000
#SNDCTL_DSP_SYNC          = $00005001
#SNDCTL_DSP_SPEED         = $C0045002
#SNDCTL_DSP_STEREO        = $C0045003
#SNDCTL_DSP_GETBLKSIZE    = $C0045004
#SNDCTL_DSP_SETFMT        = $C0045005
#SNDCTL_DSP_CHANNELS      = $C0045006

#AFMT_S16_LE              = $00000010

;-= Datasection =
DataSection
  SNDCTL:
    Data.l #SNDCTL_DSP_RESET        , 0
    Data.l #SNDCTL_DSP_SPEED        , 44100
    Data.l #SNDCTL_DSP_CHANNELS     , 1
    Data.l #SNDCTL_DSP_SETFMT       , #AFMT_S16_LE
    Data.l -1
EndDataSection

Structure STBLSND
  tData.l
  Value.l
EndStructure

Global Dim TBL_SND.STBLSND(20)

TBL_Data.i  = 0
TBL_Value.i = 0
i.i         = 0

;-******************
;-*****  Main  *****
;-******************
Restore SNDCTL
Read.l TBL_Data
While TBL_Data <> -1
  Read.l TBL_Value
  TBL_SND(i)\tData = TBL_Data
  TBL_SND(i)\Value = TBL_Value
  i + 1
  Read.l TBL_Data
Wend

OpenConsole()
PrintN("--- ioctl test")
fd.i = fOpen("/dev/dsp",#O_RDWR)
a = 0
While a < 4
  If ioctl(fd, TBL_SND(a)\tData, TBL_SND(a)\Value) <> 0
    MessageRequester("Error","ioctl_() error: $"+RSet(Hex(TBL_SND(a)\tData),8,"0"))
    End
  EndIf
  a + 1
Wend

#TAILLE = 100000
*audio_data = AllocateMemory(#TAILLE)

esi.i = 40000 : ebp.l = 0 : ecx.i = 0
While esi > 0
 PokeL(*audio_data + ecx, ebp)
 esi - 4 : ecx + 4
 ebp + 100
Wend

;dump it to the audio device
sizew.i = fWrite(fd,*audio_data,#TAILLE)

;set output to stereo
ioctl(fd,#SNDCTL_DSP_CHANNELS,2)

;dump it to the audio device
sizew.i = fWrite(fd,*audio_data,#TAILLE)

fClose(fd)
CloseConsole()
Répondre