-
Notifications
You must be signed in to change notification settings - Fork 0
/
QUEUE.MAC
executable file
·123 lines (113 loc) · 2.54 KB
/
QUEUE.MAC
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
subttl QUEUE.MAC
;
; QUEUE.MAC -- Thorbjørn 910203
;
; Dette modul indeholder definition af ADT Queue.
;
; Registrene A, BC, DE, HL benyttes af adt'en. Index pointeren IX skal
; sættes inden indgang, men kun første gang. Queue {ndrer ikke IX.
;
; En queue defineres med NAVN: QUEUE Queuesize
; som resulterer i pseudodefinitionen
; NAVN: RECORD
; Size: INTEGER= QueueSize;
; First: INTEGER= 0;
; Free: INTEGER= 0;
; Data: ARRAY[0..QueueSize-1] OF BYTE;
; END;
;
; PROCEDURER: (Disse har INGEN check - pas p} )
; ===========
; En byte indsættes i queue med
; LD A,<value>
; LD IX,<QueueNavn>
; CALL Q$PUT
;
; og en byte hentes igen med
;
; LD IX, <QueueNavn>
; CALL Q$GET
; LD (xxxx),A
;
; FUNCTIONER:
; ===========
; LD IX, <queueNavn>
; CALL Q$EMPTY
; JP NZ, QUEUENOTEMPTY
;
; LD IX, <QueueNavn>
; CALL Q$FULL
; JP NZ, QUEUENOTFULL
;
; Z=1 hvis funktionen lykkedes (eller er som forventet), og Z=0 ved fejl.
;
;
Queue MACRO queuesize
DW queuesize, 0, 0
DS QueueSize
ENDM
Q$GetFF:: ; Returnerer med HL=FIRST, DE=FREE;
ld l,(ix+2) ;
ld h,(ix+3) ; Hl:= Queue.First
ld e,(ix+4) ; DE:= Queue.Free;
ld d,(ix+5) ;
RET ;
Q$Rot:: ; FUNCTION Q$Rot(Value: HL): INTEGER;
; (* HL:= (HL+1) MOD Queue.SIZE (*IX*)
; hl:= Value
ld e,(ix+0) ;
ld d,(ix+1) ; de:= Queue.Size;
inc hl ; value:= value+1
call Q$CompareDEHL ; if BC=DE THEN (* Udenfor 0..Queue.Size-1 *)
ret nz ;
ld hl,0 ; Value:= 0;
ret ;END;
Q$EMPTY:: ; True if First=Free
call Q$GetFF ;
jr Q$CompareDEHL ;
Q$FULL:: ; True if first=rot(free)
call Q$GetFF ;
push hl ; (Save)
ex de, hl ; (Parameter)
call Q$Rot ;
pop de ; (restore) (A short cut )
;; jr Q$CompareDEHL ; **** FALL THROUGH
Q$CompareDEHL:: ; FUNCTION Q$Compare: BOOLEAN;
ld a,l ; BEGIN
cp e ; Q$Compare:= hl=de;
ret nz ;
ld a,h ;
cp d ; END;
ret ;
Q$PUT:: ; PROCEDIRE Q$Put(A:BYTE; IX: ^);
call q$GetFF ; BEGIN
push ix ;
pop bc ;
ld hl, 6 ;
add hl, bc ;
add hl, de ; Data[Free]:= a;
ld (hl),a ;
;
ex de, hl ; Free:= Rot(Free);
call q$rot ;
ld (ix+4),l ;
ld (ix+5),h ;
ret ; END;
Q$GET:: ; FUNCTION Q$Get(ix:^): BYTE;
call q$GetFF ; BEGIN
push ix ;
pop bc ;
ex de, hl ; (* Gem first i DE*)
ld hl, 6 ;
add hl, de ;
add hl, bc ; a:= Data[First];
ld a,(hl) ;
push af ;
;
ex de, hl ; First:= Rot(First);
call q$rot ;
ld (ix+2),l ;
ld (ix+3),h ;
pop af ;
ret ; END;
; end of include