Eine Routine, die Eingaben in R0 ( g1 ), R1 ( b1 ), R2 ( g2 ) und R3 ( b 2 ) vornimmtb2 ) vornimmt und das Vorzeichen setzt, wenn die 2. Mannschaft gewinnt, oder es anderweitig löscht.
275 PSHR R5 ; push return address
110 SUBR R2, R0 ; R0 -= R2
082 MOVR R0, R2 ; R2 = R0
04C SLL R0, 2 ; R0 <<= 2
0D0 ADDR R2, R0 ; R0 += R2
0D0 ADDR R2, R0 ; R0 += R2
0C8 ADDR R1, R0 ; R0 += R1
118 SUBR R3, R0 ; R0 -= R3
2B7 PULR R7 ; return
Der CP-1610 hat keine Multiplikationsanweisung und kann jeweils nur um 1 oder 2 Positionen verschoben werden. Daher berechnen wir stattdessen den folgenden Ausdruck:
((R0 - R2) << 2) + (R0 - R2) + (R0 - R2) + R1 - R3
Vollständiger Testcode
ROMW 10 ; use 10-bit ROM width
ORG $4800 ; map this program at $4800
;; ------------------------------------------------------------- ;;
;; test code ;;
;; ------------------------------------------------------------- ;;
main PROC
SDBD ; set up an interrupt service routine
MVII #isr, R0 ; to do some minimal STIC initialization
MVO R0, $100
SWAP R0
MVO R0, $101
EIS ; enable interrupts
SDBD ; R4 = pointer to test cases
MVII #@@data, R4
MVII #$200, R5 ; R5 = backtab pointer
@@loop PSHR R5 ; save R5 on the stack
MVI@ R4, R0 ; load the next test case
MVI@ R4, R1 ; into R0 .. R3
MVI@ R4, R2
MVI@ R4, R3
CALL score ; invoke our routine
BMI @@true
MVII #$80, R0 ; set output to '0'
B @@output
@@true MVII #$88, R0 ; set output to '1'
@@output PULR R5 ; restore R5
MVO@ R0, R5 ; draw the output
SDBD ; was it the last test case?
CMPI #@@end, R4
BLT @@loop ; if not, jump to @@loop
DECR R7 ; loop forever
@@data DECLE 1, 0, 0, 1 ; test cases
DECLE 2, 0, 0, 11
DECLE 10, 8, 11, 1
DECLE 0, 0, 1, 0
DECLE 100, 100, 117, 0
DECLE 7, 7, 5, 12
DECLE 2, 0, 0, 13
@@end ENDP
;; ------------------------------------------------------------- ;;
;; ISR ;;
;; ------------------------------------------------------------- ;;
isr PROC
MVO R0, $0020 ; enable display
CLRR R0
MVO R0, $0030 ; no horizontal delay
MVO R0, $0031 ; no vertical delay
MVO R0, $0032 ; no border extension
MVII #$D, R0
MVO R0, $0028 ; light-blue background
MVO R0, $002C ; light-blue border
JR R5 ; return from ISR
ENDP
;; ------------------------------------------------------------- ;;
;; routine ;;
;; ------------------------------------------------------------- ;;
score PROC
PSHR R5 ; push the return address
SUBR R2, R0 ; R0 -= R2
MOVR R0, R2 ; R2 = R0
SLL R0, 2 ; R0 <<= 2
ADDR R2, R0 ; R0 += R2
ADDR R2, R0 ; R0 += R2
ADDR R1, R0 ; R0 += R1
SUBR R3, R0 ; R0 -= R3
PULR R7 ; return
ENDP
Ausgabe
Screenshot von jzIntv
1. Ein CP-1610-Opcode wird mit einem 10-Bit-Wert codiert, der als "DECLE" bezeichnet wird. Diese Routine ist 9 DECLE lang.