ports.pp 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  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. {$Mode ObjFpc}
  16. {$if defined(CPU80386)
  17. or defined(CPUPENTIUM)
  18. or defined(CPUPENTIUM2)
  19. or defined(CPUPENTIUM3)
  20. or defined(CPUPENTIUM4)
  21. or defined(CPUPENTIUMM)}
  22. {$define CPU_IS_386_OR_LATER}
  23. {$endif}
  24. interface
  25. type
  26. tport = class
  27. procedure writeport(p : word;data : byte);
  28. function readport(p : word) : byte;
  29. property pp[w : word] : byte read readport write writeport;default;
  30. end;
  31. tportw = class
  32. procedure writeport(p : word;data : word);
  33. function readport(p : word) : word;
  34. property pp[w : word] : word read readport write writeport;default;
  35. end;
  36. {$ifdef CPU_IS_386_OR_LATER}
  37. tportl = class
  38. procedure writeport(p : word;data : longint);
  39. function readport(p : word) : longint;
  40. property pp[w : word] : longint read readport write writeport;default;
  41. end;
  42. {$endif CPU_IS_386_OR_LATER}
  43. var
  44. { we don't need to initialize port, because neither member
  45. variables nor virtual methods are accessed }
  46. port,
  47. portb : tport;
  48. portw : tportw;
  49. {$ifdef CPU_IS_386_OR_LATER}
  50. portl : tportl;
  51. {$endif CPU_IS_386_OR_LATER}
  52. implementation
  53. { to give easy port access like tp with port[] }
  54. procedure tport.writeport(p : word;data : byte);assembler;
  55. asm
  56. mov dx, p
  57. mov al, data
  58. out dx, al
  59. end;
  60. function tport.readport(p : word) : byte;assembler;
  61. asm
  62. mov dx, p
  63. in al, dx
  64. end;
  65. procedure tportw.writeport(p : word;data : word);assembler;
  66. asm
  67. mov dx, p
  68. mov ax, data
  69. out dx, ax
  70. end;
  71. function tportw.readport(p : word) : word;assembler;
  72. asm
  73. mov dx, p
  74. in ax, dx
  75. end;
  76. {$ifdef CPU_IS_386_OR_LATER}
  77. procedure tportl.writeport(p : word;data : longint);assembler;
  78. asm
  79. mov dx, p
  80. mov eax, data
  81. out dx, eax
  82. end;
  83. function tportl.readport(p : word) : longint;assembler;
  84. asm
  85. mov dx, p
  86. in eax, dx
  87. mov edx, eax
  88. shr edx, 16
  89. end;
  90. {$endif CPU_IS_386_OR_LATER}
  91. end.