Here is the relevant Z80 assembly for OR and AND...bwinkel67 wrote: ↑Tue Apr 28, 2020 7:02 pm I don't mind that it has 0 as false and non-zero as true. But the unique and weird thing is the evaluation result of an AND and OR. Most languages and the QL will give a 1 for the result of and AND or OR but activate as true for any non-zero in an IF. For the ZX81 to return the first argument as true in AND and convert to a 1 for OR is inconsistent. At least if there was consistency I would expect 2 OR 17 to return 2 and 17 OR 2 to return 17, not that I like that. I'd prefer those results to all be 1. Whereas I'm fine with IF 17 THEN PRINT "HELLO" to work. This will need fixing on the ZXSimulator as a work-around :-/
Code: Select all
; -----------------
; THE 'OR' OPERATOR
; -----------------
; (offset: $07 'or' )
; The Boolean OR operator. e.g. X OR Y
; The result is zero if both values are zero else a non-zero value.
;
; e.g. 0 OR 0 returns 0.
; -3 OR 0 returns -3.
; 0 OR -3 returns 1.
; -3 OR 2 returns 1.
;
; A binary operation.
; On entry HL points to first operand (X) and DE to second operand (Y).
;; or
L351B: EX DE,HL ; make HL point to second number
CALL L34E9 ; routine TEST-ZERO
EX DE,HL ; restore pointers
RET C ; return if result was zero - first operand,
; now the last value, is the result.
SCF ; set carry flag
JR L350B ; back to FP-0/1 to overwrite the first operand
; with the value 1.
; ---------------------------------
; THE 'NUMBER AND NUMBER' OPERATION
; ---------------------------------
; (offset: $08 'no-&-no')
; The Boolean AND operator.
;
; e.g. -3 AND 2 returns -3.
; -3 AND 0 returns 0.
; 0 and -2 returns 0.
; 0 and 0 returns 0.
;
; Compare with OR routine above.
;; no-&-no
L3524: EX DE,HL ; make HL address second operand.
CALL L34E9 ; routine TEST-ZERO sets carry if zero.
EX DE,HL ; restore pointers.
RET NC ; return if second non-zero, first is result.
;
AND A ; else clear carry.
JR L350B ; back to FP-0/1 to overwrite first operand
; with zero for return value.
See also The Complete Spectrum ROM Disassembly. You want page 208 (PDF page) / 203 (actual book page).
Mark