1 | | ------------------------------------------------------------------------------
|
---|
2 | | acctrl.s -- VSDD access table control functions
|
---|
3 | | Version 6 -- 1987-04-13 -- D.N. Lynx Crowe
|
---|
4 | | (c) Copyright 1987 -- D.N. Lynx Crowe
|
---|
5 | | ------------------------------------------------------------------------------
|
---|
6 |
|
---|
7 | | objclr(obj)
|
---|
8 | | unsigned int obj;
|
---|
9 |
|
---|
10 | | Clear bits in access table for object 'obj'.
|
---|
11 | | Disables object 'obj'.
|
---|
12 |
|
---|
13 | | objoff(obj, line, num)
|
---|
14 | | unsigned int obj, line, num;
|
---|
15 |
|
---|
16 | | Disable object obj at line thru line+num.
|
---|
17 |
|
---|
18 | | objon(obj, line, num)
|
---|
19 | | unsigned int obj, line, num;
|
---|
20 |
|
---|
21 | | Enable object obj at line thru line+num.
|
---|
22 |
|
---|
23 |
|
---|
24 | | Assumes VSDD is looking at bank 0.
|
---|
25 | | Assumes a screen height of 350 lines.
|
---|
26 | | No error checks are done, so beware.
|
---|
27 | | ------------------------------------------------------------------------------
|
---|
28 | .text
|
---|
29 |
|
---|
30 | .xdef _objclr,_objoff,_objon
|
---|
31 |
|
---|
32 | .xref _v_actab
|
---|
33 |
|
---|
34 | SCSIZE = 350 | Screen height
|
---|
35 |
|
---|
36 | OBJ = 8 | Object number argument offset
|
---|
37 | LINE = 10 | Beginning line argument offset
|
---|
38 | NUM = 12 | Object height argument offset
|
---|
39 | | ------------------------------------------------------------------------------
|
---|
40 | .page
|
---|
41 | | ------------------------------------------------------------------------------
|
---|
42 |
|
---|
43 | | objclr(obj)
|
---|
44 | | unsigned int obj;
|
---|
45 |
|
---|
46 | | Disables object obj in access table by turning on
|
---|
47 | | its bit in all words of the access table.
|
---|
48 | | ------------------------------------------------------------------------------
|
---|
49 | _objclr: link a6,#0 | Link stack frames
|
---|
50 | move.w OBJ(a6),d1 | Get object bit number in d1
|
---|
51 | lea _v_actab,a0 | Get base of object table in a0
|
---|
52 | move.w #SCSIZE-1,d2 | Put line count in d2
|
---|
53 |
|
---|
54 | objclr1: move.w (a0),d0 | Get access table word
|
---|
55 | bset.l d1,d0 | Set the bit
|
---|
56 | move.w d0,(a0)+ | Update word in access table
|
---|
57 | dbf d2,objclr1 | Loop until done
|
---|
58 |
|
---|
59 | unlk a6 | Unlink stack frame
|
---|
60 | rts | Return to caller
|
---|
61 |
|
---|
62 | .page
|
---|
63 | | ------------------------------------------------------------------------------
|
---|
64 | | objoff(obj, line, num)
|
---|
65 | | unsigned int obj, line, num;
|
---|
66 |
|
---|
67 | | Turn on access table bits for object 'obj' at
|
---|
68 | | lines 'line' through 'line'+'num'. Disables the object.
|
---|
69 | | Assumes object bits were set at those locations.
|
---|
70 | | ------------------------------------------------------------------------------
|
---|
71 | _objoff: link a6,#0 | Link stack frames
|
---|
72 | move.w OBJ(a6),d1 | Get object bit number into d1
|
---|
73 | move.w LINE(a6),d2 | Get top line number
|
---|
74 | add.w d2,d2 | Convert to word offset
|
---|
75 | lea _v_actab,a0 | Get base address of access table
|
---|
76 | move.w 0(a0,d2),d0 | Get top line access word
|
---|
77 | bset.l d1,d0 | Set object bit
|
---|
78 | move.w d0,0(a0,d2) | Update word in access table
|
---|
79 | tst.w NUM(a6) | Number of lines = 0 ?
|
---|
80 | beq objoff1 | Done if so
|
---|
81 |
|
---|
82 | move.w NUM(a6),d2 | Get object depth
|
---|
83 | add.w LINE(a6),d2 | Add to top line number
|
---|
84 | cmpi.w #SCSIZE,d2 | Bottom line >= screen height ?
|
---|
85 | bge objoff1 | Done if so
|
---|
86 |
|
---|
87 | add.w d2,d2 | Convert to word offset
|
---|
88 | move.w 0(a0,d2),d0 | Get bottom line access word
|
---|
89 | bset.l d1,d0 | Set object bit
|
---|
90 | move.w d0,0(a0,d2) | Update word in access table
|
---|
91 |
|
---|
92 | objoff1: unlk a6 | Unlink stack frame
|
---|
93 | rts | Return to caller
|
---|
94 |
|
---|
95 | .page
|
---|
96 | | ------------------------------------------------------------------------------
|
---|
97 | | objon(obj, line, num)
|
---|
98 | | unsigned int obj, line, num;
|
---|
99 |
|
---|
100 | | Turn off access table bits for object 'obj'
|
---|
101 | | at 'line' thru 'line'+'num'. Enables the object.
|
---|
102 | | ------------------------------------------------------------------------------
|
---|
103 | _objon: link a6,#0 | Link stack frames
|
---|
104 | move.w OBJ(a6),d1 | Get object bit number into d1
|
---|
105 | move.w LINE(a6),d2 | Get top line number
|
---|
106 | add.w d2,d2 | Convert to word offset
|
---|
107 | lea _v_actab,a0 | Get base address of access table
|
---|
108 | move.w 0(a0,d2),d0 | Get top line access word
|
---|
109 | bclr.l d1,d0 | Clear object bit
|
---|
110 | move.w d0,0(a0,d2) | Update word in access table
|
---|
111 | tst.w NUM(a6) | Number of lines = 0 ?
|
---|
112 | beq objon1 | Done if so
|
---|
113 |
|
---|
114 | move.w NUM(a6),d2 | Get object depth
|
---|
115 | add.w LINE(a6),d2 | Add top line number
|
---|
116 | cmpi.w #SCSIZE,d2 | Bottom line >= screen height ?
|
---|
117 | bge objon1 | Done if so
|
---|
118 |
|
---|
119 | add.w d2,d2 | Convert to word offset
|
---|
120 | move.w 0(a0,d2),d0 | Get bottom line access word
|
---|
121 | bclr.l d1,d0 | Clear object bit
|
---|
122 | move.w d0,0(a0,d2) | Update word in access table
|
---|
123 |
|
---|
124 | objon1: unlk a6 | Unlink stack frame
|
---|
125 | rts | Return to caller
|
---|
126 |
|
---|
127 | .end
|
---|