|
|
1.1 root 1: PAGE
2: SBTTL "--- X-OPS ---"
3:
4: ; ------
5: ; EQUAL?
6: ; ------
7:
8: ZEQUAL: DEC ARGCNT
9: BNE DOEQ
10:
11: ; *** ERROR #9: NOT ENOUGH "EQUAL?" ARGS ***
12:
13: LDA #9
14: JSR ZERROR
15:
16: DOEQ: LDD ARG1
17: CMPD ARG2
18: BEQ EQOK
19: DEC ARGCNT
20: BEQ EQBAD
21:
22: CMPD ARG3
23: BEQ EQOK
24: DEC ARGCNT
25: BEQ EQBAD
26:
27: CMPD ARG4
28: BEQ EQOK
29: EQBAD: JMP PREDF
30:
31: EQOK: JMP PREDS
32:
33: ; ----
34: ; CALL
35: ; ----
36:
37: ; Branch to function pointed to by [arg1 * 2], passing
38: ; the optional parameters "arg2" thru "arg4" [VALUE]
39:
40: ZCALL: LDD ARG1 ; DID FUNCTION = 0?
41: BNE DOCALL ; NO, CONTINUE
42: JMP MATH ; ELSE RETURN A ZERO
43:
44: DOCALL: LDD OZSTAK ; ZSP FROM PREVIOUS ZCALL
45: JSR PSHDZ
46: LDB ZPCL ; LOW 8 BITS OF ZPC
47: JSR PSHDZ ; SAVE TO Z-STACK
48: LDD ZPCH ; PUSH H & M PC
49: JSR PSHDZ
50:
51: ; MULTIPLY ARG1 BY 2; FORM 17-BIT ADDR
52:
53: CLRA
54: ASL ARG1+1 ; BOTTOM 8 BITS
55: ROL ARG1 ; MIDDLE 8
56: ROLA ; TOP BIT
57: STA ZPCH
58: LDD ARG1
59: STD ZPCM
60: CLR ZPCFLG ; [ZPC] HAS CHANGED ...
61:
62: JSR NEXTPC ; FETCH # NEW LOCALS
63: STA TEMP2 ; SAVE IT HERE FOR INDEXING
64: STA TEMP2+1 ; AND HERE FOR REFERENCE
65: BEQ ZCALL2 ; NO LOCALS IN THIS FUNCTION
66:
67: ; SAVE OLD LOCALS, REPLACE WITH NEW
68:
69: LDX #LOCALS ; INIT POINTER
70: ZCALL1: LDD ,X ; GRAB AN OLD LOCAL
71: PSHS X ; SAVE THE POINTER
72: JSR PSHDZ ; PUSH OLD LOCAL TO Z-STACK
73: JSR NEXTPC ; GET MSB OF NEW LOCAL
74: PSHS A ; SAVE HERE
75: JSR NEXTPC ; NOW GET LSB
76: TFR A,B ; POSITION IT PROPERLY
77: PULS A ; RETRIEVE MSB
78: PULS X ; THIS IS WHERE IT GOES
79: STD ,X++ ; STORE NEW LOCAL, UPDATE POINTER
80: DEC TEMP2 ; ANY MORE OLD LOCALS?
81: BNE ZCALL1 ; KEEP LOOPING TILL DONE
82:
83: ZCALL2: DEC ARGCNT ; EXTRA ARGUMENTS IN THIS CALL?
84: BEQ ZCALL4 ; NO ARGS TO PASS
85:
86: ; MOVE UP TO 3 ARGS TO LOCAL STORAGE
87:
88: ZCALL3: LDD ARG2
89: STD LOCALS
90: DEC ARGCNT
91: BEQ ZCALL4
92: LDD ARG3
93: STD LOCALS+2
94: DEC ARGCNT
95: BEQ ZCALL4
96: LDD ARG4
97: STD LOCALS+4
98:
99: ZCALL4: LDB TEMP2+1 ; REMEMBER # LOCALS SAVED
100: TFR B,A ; COPY INTO [A]
101: COMA ; COMPLEMENT FOR ERROR CHECK (BM 11/24/84)
102: JSR PSHDZ ; AND RETURN
103: STU OZSTAK ; "THE WAY WE WERE ..."
104: RTS
105:
106: ; ---
107: ; PUT
108: ; ---
109:
110: ; Set item "arg2" in WORD-table "arg1" equal to "arg3"
111:
112: ZPUT: ASL ARG2+1 ; WORD-ALIGN
113: ROL ARG2 ; ARG2
114: LDD ARG2
115: ADDD ARG1 ; ADD Z-ADDR OF TABLE
116: ADDD #ZCODE ; FORM ABSOLUTE ADDRESS
117: TFR D,X ; FOR USE AS AN INDEX
118: LDD ARG3
119: STD ,X
120: RTS
121:
122: ; ----
123: ; PUTB
124: ; ----
125:
126: ; Set item "arg2" in BYTE-table "arg1" equal to "arg3"
127:
128: ZPUTB: LDD ARG2
129: ADDD ARG1
130: ADDD #ZCODE
131: TFR D,X
132: LDA ARG3+1
133: STA ,X
134: RTS
135:
136: ; ----
137: ; PUTP
138: ; ----
139:
140: ; Set property "arg2" in object "arg1" equal to "arg3"
141:
142: ZPUTP: JSR PROPB
143: PUTP1: JSR PROPN
144: CMPA ARG2+1
145: BEQ PUTP2
146: BHS PTP
147:
148: ; *** ERROR #10: BAD PROPERTY NUMBER ***
149:
150: LDA #10
151: JSR ZERROR ; ERROR #7 (BAD PROPERTY #)
152:
153: PTP: JSR PROPNX ; NEXT ITEM
154: BRA PUTP1
155:
156: PUTP2: JSR PROPL
157: INCB
158: TSTA
159: BEQ PUTP2A
160: CMPA #1
161: BEQ PTP1
162:
163: ; *** ERROR #11: PROPERTY LENGTH ***
164:
165: LDA #11
166: JSR ZERROR ; ERROR #8 (PROP TOO LONG)
167:
168: PTP1: LDX TEMP
169: ABX
170: LDD ARG3
171: STD ,X
172: RTS
173:
174: PUTP2A: LDA ARG3+1
175: LDX TEMP
176: ABX
177: STA ,X
178: RTS
179:
180: ; ------
181: ; PRINTC
182: ; ------
183:
184: ; Print the character with ASCII value "arg1"
185:
186: ZPRC: LDA ARG1+1
187: JMP COUT
188:
189: ; ------
190: ; PRINTN
191: ; ------
192:
193: ; Print "arg1" as a signed integer
194:
195: ZPRN: LDD ARG1
196: STD TEMP
197:
198: ; PRINT THE SIGNED VALUE IN [TEMP]
199:
200: NUMBER: LDD TEMP
201: BPL DIGCNT ; IF NUMBER IS NEGATIVE,
202: LDA #$2D ; START WITH A MINUS SIGN
203: JSR COUT
204: JSR ABTEMP ; GET ABS(TEMP)
205:
206: ; COUNT # OF DECIMAL DIGITS
207:
208: DIGCNT: CLR MASK ; RESET INDEX
209: DGC: LDD TEMP ; CHECK QUOTIENT
210: BEQ PRNTN3 ; SKIP IF ZERO
211: LDD #10
212: STD VAL ; ELSE DIVIDE BY 10
213: JSR UDIV ; UNSIGNED DIVIDE
214: LDA VAL+1 ; GET LSB OF REMAINDER
215: PSHS A ; SAVE ON STACK
216: INC MASK ; INCREMENT CHAR COUNT
217: BRA DGC ; LOOP TILL ARG1=0
218:
219: PRNTN3: LDA MASK
220: BEQ PZERO ; PRINT AT LEAST A "0"
221: PRNTN4: PULS A ; GET A CHAR
222: ADDA #$30 ; CONVERT TO ASCII NUMBER
223: JSR COUT
224: DEC MASK ; OUT OF CHARS?
225: BNE PRNTN4 ; KEEP PRINTING TILL
226: RTS ; DONE
227:
228: ; PRINT A ZERO
229:
230: PZERO: LDA #$30 ; ASCII "0"
231: JMP COUT
232:
233: ; ------
234: ; RANDOM
235: ; ------
236:
237: ; Return a random value between zero and "arg1" [VALUE]
238:
239: ZRAND: LDD ARG1 ; USE [ARG1]
240: STD VAL ; AS THE DIVISOR
241:
242: LDD RAND1 ; GET A RANDOM #
243: ADDD #$AA55 ; DO WEIRD THINGS
244: STA RAND2 ; SAVE AS
245: STB RAND1 ; NEW SEED
246: ANDA #%01111111 ; MAKE POSITIVE
247: STD TEMP ; MAKE IT THE DIVIDEND
248:
249: JSR DIVIDE ; UNSIGNED DIVIDE!
250: LDD VAL ; GET REMAINDER
251: ADDD #1 ; AT LEAST 1
252: JMP MATH
253:
254: ; ----
255: ; PUSH
256: ; ----
257:
258: ; Push "arg1" onto the Z-stack
259:
260: ZPUSH: LDD ARG1
261: JMP PSHDZ
262:
263: ; ---
264: ; POP
265: ; ---
266:
267: ; Pop a word off Z-stack and store in variable "arg1"
268:
269: ZPOP: JSR POPSTK
270: LDA ARG1+1 ; GET VARIABLE ID
271: JMP VARPUT
272:
273: ; -----
274: ; SPLIT
275: ; -----
276:
277: ZSPLIT EQU ZNOOP
278:
279: ; ------
280: ; SCREEN
281: ; ------
282:
283: ZSCRN EQU ZNOOP
284:
285: END
286:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.