Signetics 2650 & 2636 编程/教程代码 - 同步到对象完成
外观
这是教程 同步到对象完成 的代码。
此代码块必须与标准 '硬件定义' 代码合并,才能进行汇编。 |
; Tutorial - Sync to object completion
;=============================================================================
org 0
reset_vector: ; the microprocessor starts here when the reset button is pressed
bcta,un reset
org 3
interrupt_vector: ; interrupts shouldn't happen, but set this just in case
retc,un
reset:
lodi,r0 $20 ; initialise program status word
lpsu ; inhibit interrupts, stack pointer=0
lpsl ; register bank 0, without carry, arithmetic compare
eorz r0
stra,r0 effects ; initialise the 74LS378
bsta,un DefineUnused ; push all unused objects offscreen
lodi,r0 $AA ; blank the score digits
stra,r0 score12
stra,r0 score34
lodi,r0 %00000000 ; X / 000 / 0 / 000
stra,r0 backgnd ; / black background / disabled / black screen
bsta,un Vsync0 ; make sure VRST hasn't started
endless:
bsta,un Vsync1 ; wait for VRST to start
bsta,un Object1A ; set initial state of object 1:
; shape, colour, size, HC,VC
; and HCB,VCB for first duplicate, B
bsta,un Vsync0 ; wait for VRST to end
lodi,r1 $08
bsta,un WaitObj ; wait for object 1 to complete
bsta,un Object1B ; set first duplicate of object 1:
; shape, colour, size
; and VCB for second duplicate, C
lodi,r1 $08
bsta,un WaitObj ; wait for object 1 to complete (first duplicate, B)
bsta,un Object1C ; set second duplicate of object 1:
; shape, colour, size, HCB
; and VCB to push next duplicate offscreen
bctr,un endless
;==================================================================
; subroutine - Primary object
; set initial state of object 1: shape, colour, size, HC,VC
; and HCB,VCB for first duplicate, B
Object1A:
lodi,r3 10
lodi,r0 $FF
loop1A:
stra,r0 shape1,r3- ; rectangle shape
brnr,r3 loop1A
stra,r3 objectsize ; size 0
lodi,r0 $07 ; white
stra,r0 colours12
lodi,r0 10
stra,r0 vc1 ; vc = 10
rrl,r0
stra,r0 vcb1 ; vcb = 20
rrl,r0
stra,r0 hc1 ; hc = 40
rrl,r0
stra,r0 hcb1 ; vcb = 80
retc,un
;==================================================================
; subroutine - First duplicate
; set: shape, colour, size
; and VCB for second duplicate
Object1B:
lodi,r3 10
lodi,r0 $FF
ppsl withcarry ; include carry in rotate instructions
loop1B:
stra,r0 shape1,r3- ; triangle shape
cpsl carrybit
rrr,r0 ; shift right with 0 from the carry bit
brnr,r3 loop1B
lodi,r3 1
stra,r3 objectsize ; size 1
lodi,r0 $08 ; yellow
stra,r0 colours12
lodi,r0 80
stra,r0 vcb1 ; vcb = 80
retc,un
;==================================================================
; subroutine - Second duplicate
; set: shape, colour, size, HCB
; and VCB to push next duplicate off screen
Object1C:
lodi,r3 10
lodi,r0 $FF
ppsl withcarry ; include carry in rotate instructions
loop1C:
stra,r0 shape1,r3- ; triangle shape
cpsl carrybit
rrl,r0 ; shift left with 0 from the carry bit
brnr,r3 loop1C
lodi,r3 2
stra,r3 objectsize ; size 2
lodi,r0 $28 ; green
stra,r0 colours12
lodi,r0 250
stra,r0 vcb1 ; make sure there are no more duplicates
lodi,r0 60
stra,r0 hcb1 ; hcb = 60
retc,un
;===================================================================
; subroutine - define position of unused objects
DefineUnused:
lodi,r0 254
stra,r0 vc2 ; push unused objects offscreen
stra,r0 vc3
stra,r0 vc4
lodi,r0 $FF ; set all objects black
stra,r0 colours12
stra,r0 colours34
retc,un
;=================================================================
; subroutine - wait for vertical reset to clear
; (see Tutorial......)
Vsync0:
tpsu sense
bctr,eq Vsync0 ; wait for Sense bit to clear
retc,un
;=================================================================
; subroutine - wait for vertical reset to set
Vsync1:
tpsu sense ; wait for Sense bit to be set
bctr,lt Vsync1
retc,un
;=================================================================
;subroutine - wait for object to finish
; enter with r1=mask for bit to be tested:
; obj1=$08, obj2=$04, obj3=$02, obj4=$01
WaitObj:
loda,r0 objectstatus
andz r1
bctr,eq waitobj
retc,un