home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / programm / MM2_DEV / S / MOS / BINARY.I < prev    next >
Encoding:
Text File  |  1990-10-01  |  8.8 KB  |  3 lines

  1. ⓪ IMPLEMENTATION MODULE Binary; (* V#041 *)
  2. ⓪ (*$L-,R-*)
  3. ⓪ (*$Y+*)
  4. ⓪ 
  5. ⓪ (*
  6. ⓪"28.5.88 tt  Überflüssiges MOVEQ #0,D2 am Ende v. 'write' entfernt
  7. ⓪"3.7.88  tt  Bei write mit null Bytes wird A3 korrekt abgeräumt;
  8. ⓪.bei Seek wird auch richtig expandiert, wenn FilePos beim
  9. ⓪.Aufruf nicht am Fileende ist.
  10. ⓪"6.5.90  tt  Read/WriteLargeBlock neu
  11. ⓪ *)
  12. ⓪ 
  13. ⓪ FROM FileBase IMPORT Unit, UDataProc, UCloseProc, UFlushProc, URStrProc,
  14. ⓪(UWStrProc, UGChrProc;
  15. ⓪ 
  16. ⓪ FROM Files IMPORT File, Access, @CheckState;
  17. ⓪ 
  18. ⓪ FROM SYSTEM IMPORT ASSEMBLER, BYTE, WORD, LONGWORD, ADDRESS, ADR;
  19. ⓪ 
  20. ⓪ IMPORT MOSGlobals;
  21. ⓪ 
  22. ⓪ (*$I FileDesc.Icl *)
  23. ⓪ 
  24. ⓪ (*$O+*)
  25. ⓪ TYPE File = POINTER TO FileDesc;
  26. ⓪ (*$O-*)
  27. ⓪ 
  28. ⓪ 
  29. ⓪ PROCEDURE ErrHandler;
  30. ⓪"BEGIN
  31. ⓪$ASSEMBLER
  32. ⓪(MOVE.L  A0,(A3)+
  33. ⓪(JSR     @CheckState
  34. ⓪(TST     -(A3)
  35. ⓪(BEQ     e0
  36. ⓪(CLR     File.state(A0)
  37. ⓪%e0 CLR     D0
  38. ⓪$END
  39. ⓪"END ErrHandler;
  40. ⓪ 
  41. ⓪ PROCEDURE CheckAccess;
  42. ⓪"BEGIN
  43. ⓪$ASSEMBLER
  44. ⓪(TST     -(A3)
  45. ⓪(BEQ     rf
  46. ⓪(CMPI    #2,File.accmode(A0)
  47. ⓪(BLS     rt
  48. ⓪(MOVE    #MOSGlobals.fBadOp,File.state(A0)
  49. ⓪(JMP     ErrHandler
  50. ⓪%rf RTS
  51. ⓪%rt MOVEQ   #1,D0
  52. ⓪$END
  53. ⓪"END CheckAccess;
  54. ⓪ 
  55. ⓪ 
  56. ⓪ PROCEDURE FileSize (f: File): LONGCARD;
  57. ⓪"BEGIN
  58. ⓪$ASSEMBLER
  59. ⓪(LINK    A5,#0
  60. ⓪(JSR     @CheckState
  61. ⓪(JSR     CheckAccess
  62. ⓪(UNLK    A5
  63. ⓪(BEQ     r0
  64. ⓪(MOVE.L  File.len(A0),(A3)+
  65. ⓪(RTS
  66. ⓪%r0 CLR.L   (A3)+
  67. ⓪$END
  68. ⓪"END FileSize;
  69. ⓪ 
  70. ⓪ 
  71. ⓪ PROCEDURE FilePos (f: File): LONGCARD;
  72. ⓪"BEGIN
  73. ⓪$ASSEMBLER
  74. ⓪(LINK    A5,#0
  75. ⓪(JSR     @CheckState
  76. ⓪(JSR     CheckAccess
  77. ⓪(UNLK    A5
  78. ⓪(BEQ     r0
  79. ⓪(MOVE.L  File.pos(A0),(A3)+
  80. ⓪(RTS
  81. ⓪%r0 CLR.L   (A3)+
  82. ⓪$END
  83. ⓪"END FilePos;
  84. ⓪ 
  85. ⓪ 
  86. ⓪ PROCEDURE write (f:File; start: ADDRESS; len: LONGCARD);
  87. ⓪"BEGIN
  88. ⓪$ASSEMBLER
  89. ⓪(MOVE.L  -12(A3),(A3)+
  90. ⓪(JSR     @CheckState
  91. ⓪(TST     -(A3)
  92. ⓪(BEQ     err
  93. ⓪(MOVE    File.accmode(A0),D0
  94. ⓪(BEQ     badAcc
  95. ⓪(CMPI    #2,D0
  96. ⓪(BHI     badOp
  97. ⓪ 
  98. ⓪(MOVE.L  -(A3),D0                ; LEN
  99. ⓪(BEQ     ok0
  100. ⓪(MOVE.L  -(A3),-(A7)             ; START
  101. ⓪(MOVE.L  D0,-(A7)
  102. ⓪(MOVE    File.handle(A0),-(A7)
  103. ⓪(MOVE    #$40,-(A7)
  104. ⓪(TRAP    #1
  105. ⓪(ADDQ.L  #4,A7
  106. ⓪(MOVE.L  (A7)+,D1                ; LEN
  107. ⓪(ADDQ.L  #4,A7
  108. ⓪(MOVE.L  -(A3),A0
  109. ⓪(MOVE    #1,File.modified(A0)
  110. ⓪(TST.L   D0
  111. ⓪(BPL     ok
  112. ⓪(MOVE    D0,File.state(A0)
  113. ⓪(UNLK    A5
  114. ⓪(RTS
  115. ⓪'ok0:
  116. ⓪(SUBQ.L  #8,A3
  117. ⓪(UNLK    A5
  118. ⓪(RTS
  119. ⓪ 
  120. ⓪'badOp:
  121. ⓪(MOVE    #MOSGlobals.fBadOp,D0
  122. ⓪(BRA     errH
  123. ⓪'badAcc:
  124. ⓪(MOVE    #MOSGlobals.fBadAccess,D0
  125. ⓪'errH:
  126. ⓪(MOVE    D0,File.state(A0)
  127. ⓪(MOVE.L  A0,(A3)+
  128. ⓪(JSR     ErrHandler
  129. ⓪'err:
  130. ⓪(SUBA.W  #12,A3
  131. ⓪(UNLK    A5
  132. ⓪(RTS
  133. ⓪ 
  134. ⓪'full:
  135. ⓪(MOVE    #MOSGlobals.fDiskFull,File.state(A0)
  136. ⓪(UNLK    A5
  137. ⓪(RTS
  138. ⓪ 
  139. ⓪'ok:
  140. ⓪(CMP.L   D0,D1
  141. ⓪(BHI     full
  142. ⓪(ADD.L   D1,File.pos(A0)
  143. ⓪(MOVE.L  File.pos(A0),D0
  144. ⓪(CMP.L   File.len(A0),D0
  145. ⓪(BCS     end
  146. ⓪(MOVE.L  D0,File.len(A0)
  147. ⓪'end:
  148. ⓪(UNLK    A5
  149. ⓪$END
  150. ⓪"END write;
  151. ⓪ 
  152. ⓪ PROCEDURE seek0;
  153. ⓪"BEGIN
  154. ⓪$ASSEMBLER
  155. ⓪(MOVE.W  D3,-(A7)
  156. ⓪(MOVE.W  File.handle(A4),-(A7)
  157. ⓪(MOVE.L  D4,-(A7)
  158. ⓪(MOVE    #$42,-(A7)
  159. ⓪(TRAP    #1
  160. ⓪(ADDA.W  #10,A7
  161. ⓪$END
  162. ⓪"END seek0;
  163. ⓪ 
  164. ⓪ PROCEDURE Seek (f: File; offset : LONGINT; base: SeekMode);
  165. ⓪"BEGIN
  166. ⓪$ASSEMBLER
  167. ⓪(LINK    A5,#0
  168. ⓪(MOVEM.L D3-D5/A4,-(A7)
  169. ⓪(MOVE.W  -(A3),D3        ; base
  170. ⓪(MOVE.L  -(A3),D4        ; offset
  171. ⓪(JSR     @CheckState
  172. ⓪(JSR     CheckAccess
  173. ⓪(MOVE.L  A0,A4           ; f
  174. ⓪(BEQ.L   end
  175. ⓪(
  176. ⓪(; r := seek (offset,f^.handle,base);
  177. ⓪(JSR     seek0
  178. ⓪(TST.L   D0
  179. ⓪(BPL.L   noErr
  180. ⓪(
  181. ⓪(CMPI.W  #-64,D0
  182. ⓪(BNE.L   genErr
  183. ⓪(TST     File.accmode(A4)
  184. ⓪(BEQ.L   genErr
  185. ⓪(
  186. ⓪(; Seek ans Ende
  187. ⓪(MOVE.L  D4,D5
  188. ⓪(SWAP    D3
  189. ⓪(MOVEQ   #0,D4
  190. ⓪(MOVE    #fromEnd,D3
  191. ⓪(JSR     seek0
  192. ⓪(TST.L   D0
  193. ⓪(BMI.L   genErr
  194. ⓪(SWAP    D3
  195. ⓪(MOVE.L  D5,D4
  196. ⓪(
  197. ⓪(MOVE.L  File.len(A4),D5         ; len
  198. ⓪(CMP.L   D5,D0
  199. ⓪(BNE.L   interr          ; -> Fehler: len und seek-Pos nicht gleich
  200. ⓪(
  201. ⓪(CMPI    #1,D3
  202. ⓪(BEQ     frPos
  203. ⓪(BCS     frBeg
  204. ⓪(ADD.L   D5,D4
  205. ⓪&frPos
  206. ⓪(ADD.L   File.pos(A4),D4
  207. ⓪&frBeg
  208. ⓪(
  209. ⓪(CMP.L   D5,D4
  210. ⓪(BLS     noExp
  211. ⓪(
  212. ⓪(SUB.L   D4,D5
  213. ⓪(NEG.L   D5
  214. ⓪(
  215. ⓪%l0 MOVE.L  A4,(A3)+
  216. ⓪(MOVE.L  #$8000,(A3)+
  217. ⓪(CMPI.L  #$4000,D5
  218. ⓪(BLS     t2
  219. ⓪(MOVE.L  #$4000,D0
  220. ⓪(BRA     t3
  221. ⓪%t2 MOVE.L  D5,D0
  222. ⓪%t3 MOVE.L  D0,(A3)+
  223. ⓪(PEA     rtnadr(PC)
  224. ⓪(LINK    A5,#0
  225. ⓪(JMP     write
  226. ⓪%rtnadr:
  227. ⓪(TST     File.state(A4)
  228. ⓪(BMI     end
  229. ⓪(SUB.L   #$4000,D5
  230. ⓪(BGT     l0
  231. ⓪(
  232. ⓪(CLR     D3              ; base:= fromBegin
  233. ⓪(JSR     seek0
  234. ⓪(
  235. ⓪&noExp:
  236. ⓪(TST.L   D0
  237. ⓪(BPL     noErr
  238. ⓪(
  239. ⓪&genErr:
  240. ⓪(MOVE    D0,File.state(A4)
  241. ⓪(BRA     end
  242. ⓪(
  243. ⓪&interr
  244. ⓪(MOVE    #MOSGlobals.fInternalErr1,D0
  245. ⓪(BRA     genErr
  246. ⓪(
  247. ⓪&noErr:
  248. ⓪(MOVE.L  D0,File.pos(A4)
  249. ⓪(CMP.L   File.len(A4),D0
  250. ⓪(BLS     end
  251. ⓪(MOVE.L  D0,File.len(A4)
  252. ⓪(
  253. ⓪&end:
  254. ⓪(MOVEM.L (A7)+,D3-D5/A4
  255. ⓪(UNLK    A5
  256. ⓪$END
  257. ⓪"END Seek;
  258. ⓪ 
  259. ⓪ 
  260. ⓪ PROCEDURE read;
  261. ⓪"BEGIN
  262. ⓪$ASSEMBLER
  263. ⓪(MOVEM.L D1/D2/A0,-(A7)
  264. ⓪(MOVE    File.handle(A0),-(A7)
  265. ⓪(MOVE    #$3F,-(A7)
  266. ⓪(TRAP    #1
  267. ⓪(ADDQ.L  #4,A7
  268. ⓪(MOVEM.L (A7)+,D1/D2/A0  ; len / * / f
  269. ⓪(TST.L   D0
  270. ⓪(BPL     ok
  271. ⓪(MOVE    D0,File.state(A0)
  272. ⓪(UNLK    A5
  273. ⓪(RTS
  274. ⓪'ok
  275. ⓪(ADD.L   D1,File.pos(A0)
  276. ⓪'end
  277. ⓪(UNLK    A5
  278. ⓪$END
  279. ⓪"END read;
  280. ⓪ 
  281. ⓪ PROCEDURE rd_prep;
  282. ⓪"BEGIN
  283. ⓪$ASSEMBLER
  284. ⓪(MOVE.L  D1,D0
  285. ⓪(ADD.L   File.pos(A0),D0
  286. ⓪(CMP.L   File.len(A0),D0
  287. ⓪(BHI     t0
  288. ⓪(JMP     read
  289. ⓪%t0 MOVE    #MOSGlobals.fEndOfFile,File.state(A0)
  290. ⓪(MOVE.L  File.pos(A0),D0
  291. ⓪(CMP.L   File.len(A0),D0
  292. ⓪(BCS     e0
  293. ⓪(JSR     ErrHandler
  294. ⓪%e0
  295. ⓪$END
  296. ⓪"END rd_prep;
  297. ⓪ 
  298. ⓪ PROCEDURE ReadByte (f: File; VAR byte: BYTE);
  299. ⓪"BEGIN
  300. ⓪$ASSEMBLER
  301. ⓪(LINK    A5,#0
  302. ⓪(MOVE.L  -(A3),-(A7)
  303. ⓪(JSR     @CheckState
  304. ⓪(JSR     CheckAccess
  305. ⓪(BEQ     e0
  306. ⓪(MOVE.L  (A7)+,D2        ; start
  307. ⓪(MOVEQ   #1,D1           ; len
  308. ⓪(JSR     rd_prep
  309. ⓪%e0 UNLK    A5
  310. ⓪$END
  311. ⓪"END ReadByte;
  312. ⓪ 
  313. ⓪ PROCEDURE ReadWord (f: File; VAR word: WORD);
  314. ⓪"BEGIN
  315. ⓪$ASSEMBLER
  316. ⓪(LINK    A5,#0
  317. ⓪(MOVE.L  -(A3),-(A7)
  318. ⓪(JSR     @CheckState
  319. ⓪(JSR     CheckAccess
  320. ⓪(BEQ     e0
  321. ⓪(MOVE.L  (A7)+,D2        ; start
  322. ⓪(MOVEQ   #2,D1           ; len
  323. ⓪(JSR     rd_prep
  324. ⓪%e0 UNLK    A5
  325. ⓪$END
  326. ⓪"END ReadWord;
  327. ⓪ 
  328. ⓪ PROCEDURE ReadLong (f: File; VAR long: LONGWORD);
  329. ⓪"BEGIN
  330. ⓪$ASSEMBLER
  331. ⓪(LINK    A5,#0
  332. ⓪(MOVE.L  -(A3),-(A7)
  333. ⓪(JSR     @CheckState
  334. ⓪(JSR     CheckAccess
  335. ⓪(BEQ     e0
  336. ⓪(MOVE.L  (A7)+,D2        ; start
  337. ⓪(MOVEQ   #4,D1           ; len
  338. ⓪(JSR     rd_prep
  339. ⓪%e0 UNLK    A5
  340. ⓪$END
  341. ⓪"END ReadLong;
  342. ⓪ 
  343. ⓪ PROCEDURE ReadBlock (f: File; VAR block: ARRAY OF BYTE);
  344. ⓪"BEGIN
  345. ⓪$ASSEMBLER
  346. ⓪(LINK    A5,#0
  347. ⓪(MOVE.W  -(A3),-(A7)
  348. ⓪(MOVE.L  -(A3),-(A7)
  349. ⓪(JSR     @CheckState
  350. ⓪(JSR     CheckAccess
  351. ⓪(BEQ     e0
  352. ⓪(MOVE.L  (A7)+,D2        ; start
  353. ⓪(MOVEQ   #0,D1
  354. ⓪(MOVE.W  (A7)+,D1        ; HIGH
  355. ⓪(ADDQ.L  #1,D1
  356. ⓪(JSR     rd_prep
  357. ⓪%e0 UNLK    A5
  358. ⓪$END
  359. ⓪"END ReadBlock;
  360. ⓪ 
  361. ⓪ PROCEDURE ReadLargeBlock (f: File; VAR block: LONGARRAY OF BYTE);
  362. ⓪"BEGIN
  363. ⓪$ASSEMBLER
  364. ⓪(LINK    A5,#0
  365. ⓪(MOVE.L  -(A3),-(A7)
  366. ⓪(MOVE.L  -(A3),-(A7)
  367. ⓪(JSR     @CheckState
  368. ⓪(JSR     CheckAccess
  369. ⓪(BEQ     e0
  370. ⓪(MOVE.L  (A7)+,D2        ; start
  371. ⓪(MOVE.L  (A7)+,D1        ; HIGH
  372. ⓪(ADDQ.L  #1,D1
  373. ⓪(JSR     rd_prep
  374. ⓪%e0 UNLK    A5
  375. ⓪$END
  376. ⓪"END ReadLargeBlock;
  377. ⓪ 
  378. ⓪ PROCEDURE ReadBytes (    f        : File;
  379. ⓪9addr     : ADDRESS;
  380. ⓪9bytes    : LONGCARD;
  381. ⓪5VAR bytesRead: LONGCARD);
  382. ⓪"BEGIN
  383. ⓪$ASSEMBLER
  384. ⓪(LINK    A5,#0
  385. ⓪(MOVE.L  -(A3),-(A7)     ; bytesRead
  386. ⓪(MOVE.L  -(A3),-(A7)
  387. ⓪(MOVE.L  -(A3),-(A7)
  388. ⓪(JSR     @CheckState
  389. ⓪(JSR     CheckAccess
  390. ⓪(BEQ     e0
  391. ⓪(MOVE.L  (A7)+,D2        ; addr
  392. ⓪(MOVE.L  (A7)+,D1        ; bytes
  393. ⓪(MOVE.L  (A7)+,A1        ; bytesRead
  394. ⓪(MOVE.L  File.len(A0),D0
  395. ⓪(SUB.L   File.pos(A0),D0
  396. ⓪(CMP.L   D0,D1
  397. ⓪(BLS     t0
  398. ⓪(MOVE.L  D0,D1
  399. ⓪%t0 MOVE.L  D1,(A1)
  400. ⓪(JMP     read
  401. ⓪%e0 UNLK    A5
  402. ⓪$END
  403. ⓪"END ReadBytes;
  404. ⓪ 
  405. ⓪ 
  406. ⓪ PROCEDURE WriteByte (f: File; byte: BYTE);
  407. ⓪"BEGIN
  408. ⓪$ASSEMBLER
  409. ⓪(LINK    A5,#0
  410. ⓪(MOVE.W  -(A3),-(A7)
  411. ⓪(MOVE.L  A7,(A3)+
  412. ⓪(MOVEQ   #1,D0
  413. ⓪(MOVE.L  D0,(A3)+
  414. ⓪(JMP     write
  415. ⓪$END
  416. ⓪"END WriteByte;
  417. ⓪ 
  418. ⓪ PROCEDURE WriteWord (f: File; word: WORD);
  419. ⓪"BEGIN
  420. ⓪$ASSEMBLER
  421. ⓪(LINK    A5,#0
  422. ⓪(MOVE.W  -(A3),-(A7)
  423. ⓪(MOVE.L  A7,(A3)+
  424. ⓪(MOVEQ   #2,D0
  425. ⓪(MOVE.L  D0,(A3)+
  426. ⓪(JMP     write
  427. ⓪$END
  428. ⓪"END WriteWord;
  429. ⓪ 
  430. ⓪ PROCEDURE WriteLong (f: File; long: LONGWORD);
  431. ⓪"BEGIN
  432. ⓪$ASSEMBLER
  433. ⓪(LINK    A5,#0
  434. ⓪(MOVE.L  -(A3),-(A7)
  435. ⓪(MOVE.L  A7,(A3)+
  436. ⓪(MOVEQ   #4,D0
  437. ⓪(MOVE.L  D0,(A3)+
  438. ⓪(JMP     write
  439. ⓪$END
  440. ⓪"END WriteLong;
  441. ⓪ 
  442. ⓪ PROCEDURE WriteBlock (f: File; REF block: ARRAY OF BYTE);
  443. ⓪"BEGIN
  444. ⓪$ASSEMBLER
  445. ⓪(LINK    A5,#0
  446. ⓪(MOVEQ   #0,D0
  447. ⓪(MOVE.W  -(A3),D0
  448. ⓪(ADDQ.L  #1,D0
  449. ⓪(MOVE.L  D0,(A3)+
  450. ⓪(JMP     write
  451. ⓪$END
  452. ⓪"END WriteBlock;
  453. ⓪ 
  454. ⓪ PROCEDURE WriteLargeBlock (f: File; REF block: LONGARRAY OF BYTE);
  455. ⓪"BEGIN
  456. ⓪$ASSEMBLER
  457. ⓪(LINK    A5,#0
  458. ⓪(ADDQ.L  #1,-4(A3)
  459. ⓪(JMP     write
  460. ⓪$END
  461. ⓪"END WriteLargeBlock;
  462. ⓪ 
  463. ⓪ PROCEDURE WriteBytes (f: File; addr: ADDRESS; bytes: LONGCARD);
  464. ⓪"BEGIN
  465. ⓪$ASSEMBLER
  466. ⓪(LINK    A5,#0
  467. ⓪(JMP     write
  468. ⓪$END
  469. ⓪"END WriteBytes;
  470. ⓪ 
  471. ⓪ END Binary.
  472. ⓪ ə
  473. (* $00001B3D$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$000002CB$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDAÇ$00000259T.......T.......T.......T.......T.......T.......T.......T.......T.......T.......$00001FA8$00000A99$000020C8$FFF0C822$FFF0C822$00000838$00000259$FFED095D$00000BB8$0000146B$0000158B$000016AF$000017DA$000018DE$00001A3C$00002052£Çâ*)
  474.