UsbBuffers.Mod 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. MODULE UsbBuffers; (** AUTHOR ""; PURPOSE ""; *)
  2. CONST
  3. Align = 32;
  4. TYPE
  5. BufferPtr * = Buffer;
  6. Buffer * = OBJECT
  7. VAR
  8. data: POINTER TO ARRAY OF CHAR;
  9. ofs: LONGINT;
  10. PROCEDURE & SetSize * (size: LONGINT);
  11. BEGIN
  12. NEW(data, size + Align);
  13. ofs := Align - ADDRESSOF(data[0]) MOD Align;
  14. ASSERT(ADDRESSOF(data[ofs]) MOD Align = 0)
  15. END SetSize;
  16. PROCEDURE ToArray * (): POINTER TO ARRAY OF CHAR;
  17. VAR
  18. ptr: POINTER TO ARRAY OF CHAR;
  19. i: LONGINT;
  20. BEGIN
  21. NEW(ptr, LEN(data) - Align);
  22. FOR i := 0 TO LEN(ptr) - 1 DO ptr[i] := data[ofs + i] END;
  23. RETURN ptr
  24. END ToArray;
  25. PROCEDURE ToArrayOfs * (): LONGINT;
  26. BEGIN
  27. RETURN ofs
  28. END ToArrayOfs;
  29. OPERATOR "[]" * (idx: LONGINT): CHAR;
  30. BEGIN
  31. ASSERT(idx >= 0, 7);
  32. ASSERT(idx < LEN(data) - Align, 7);
  33. RETURN data[ofs + idx]
  34. END "[]";
  35. OPERATOR "[]" * (idx: LONGINT; val: CHAR);
  36. BEGIN
  37. ASSERT(idx >= 0, 7);
  38. ASSERT(idx < LEN(data) - Align, 7);
  39. data[ofs + idx] := val
  40. END "[]";
  41. END Buffer;
  42. PROCEDURE GetDataAddress * (buffer: Buffer): ADDRESS;
  43. BEGIN
  44. ASSERT(ADDRESSOF(buffer.data[buffer.ofs]) # 0);
  45. RETURN ADDRESSOF(buffer.data[buffer.ofs])
  46. END GetDataAddress;
  47. OPERATOR "LEN" * (buffer: Buffer): LONGINT;
  48. BEGIN
  49. RETURN LEN(buffer.data) - Align
  50. END "LEN";
  51. END UsbBuffers.