ports.pp 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. {
  2. This file is part of the Free Pascal run time library.
  3. and implements some stuff for protected mode programming
  4. Copyright (c) 1999-2000 by the Free Pascal development team.
  5. These files adds support for TP styled port accesses
  6. See the file COPYING.FPC, included in this distribution,
  7. for details about the copyright.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  11. **********************************************************************}
  12. unit ports;
  13. { this unit uses classes so
  14. ObjFpc mode is required PM }
  15. {$if defined(CPU80386)
  16. or defined(CPUPENTIUM)
  17. or defined(CPUPENTIUM2)
  18. or defined(CPUPENTIUM3)
  19. or defined(CPUPENTIUM4)
  20. or defined(CPUPENTIUMM)}
  21. {$define CPU_IS_386_OR_LATER}
  22. {$endif}
  23. interface
  24. type
  25. tport = object
  26. procedure writeport(p : word;data : byte);
  27. function readport(p : word) : byte;
  28. property pp[w : word] : byte read readport write writeport;default;
  29. end;
  30. tportw = object
  31. procedure writeport(p : word;data : word);
  32. function readport(p : word) : word;
  33. property pp[w : word] : word read readport write writeport;default;
  34. end;
  35. {$ifdef CPU_IS_386_OR_LATER}
  36. tportl = object
  37. procedure writeport(p : word;data : longint);
  38. function readport(p : word) : longint;
  39. property pp[w : word] : longint read readport write writeport;default;
  40. end;
  41. {$endif CPU_IS_386_OR_LATER}
  42. var
  43. { we don't need to initialize port, because neither member
  44. variables nor virtual methods are accessed }
  45. port,
  46. portb : tport;
  47. portw : tportw;
  48. {$ifdef CPU_IS_386_OR_LATER}
  49. portl : tportl;
  50. {$endif CPU_IS_386_OR_LATER}
  51. implementation
  52. { to give easy port access like tp with port[] }
  53. procedure tport.writeport(p : word;data : byte);assembler;
  54. asm
  55. mov dx, p
  56. mov al, data
  57. out dx, al
  58. end;
  59. function tport.readport(p : word) : byte;assembler;
  60. asm
  61. mov dx, p
  62. in al, dx
  63. end;
  64. procedure tportw.writeport(p : word;data : word);assembler;
  65. asm
  66. mov dx, p
  67. mov ax, data
  68. out dx, ax
  69. end;
  70. function tportw.readport(p : word) : word;assembler;
  71. asm
  72. mov dx, p
  73. in ax, dx
  74. end;
  75. {$ifdef CPU_IS_386_OR_LATER}
  76. procedure tportl.writeport(p : word;data : longint);assembler;
  77. asm
  78. mov dx, p
  79. mov eax, data
  80. out dx, eax
  81. end;
  82. function tportl.readport(p : word) : longint;assembler;
  83. asm
  84. mov dx, p
  85. in eax, dx
  86. mov edx, eax
  87. shr edx, 16
  88. end;
  89. {$endif CPU_IS_386_OR_LATER}
  90. end.