Signetics 2650 & 2636 编程/教程代码 - 中断
外观
这是教程 中断 的代码
此代码块必须与标准 '硬件定义' 代码合并才能进行汇编 |
; Tutorial - Interrupts
;=============================================================================
Reg0 equ $1F0E ;save r0 here during interrupts
StatusL equ $1F0F ;save the program status word lower here during interrupts
Obj1dup equ $1F1E ;tracks which duplicates have been output
org 0
reset_vector: ; the microprocessor starts here when the reset button is pressed
bcta,un reset
org 3
interrupt_vector:
;Save state of processor when interrupt occured:
stra,r0 Reg0 ;preserve r0
ppsl $10 ;bank 1, logical compare
spsl
stra,r0 StatusL ;save PSL with bank 1 already selected!
loda,r0 collisions
tmi,r0 vrle ;case
bcfr,eq IVdup1 ; interrupt caused by VRLE
bsta,un Object1A ; set initial state of object 1
bcta,un IVend ; quit interrupt routine
IVdup1: ;
loda,r0 Obj1dup ;
comi,r0 1 ; next duplicate is the first
bcfr,eq IVdup2
bsta,un Object1B ; set first duplicate of object 1
bcta,un IVend ; quit interrupt routine
IVdup2: ;
loda,r0 Obj1dup ;
comi,r0 2 ; next duplicate is the second
bcfr,eq IVend
bsta,un Object1C ; set second duplicate of object 1
IVend: ;Restore processor to state it was in before interrupt:
loda,r0 StatusL
strz r4 ;put a copy of PSL in r4
lpsl ;restores psl (but with bank 1 still selected)
loda,r0 Reg0 ;restore r0 (but probably changes the condition code)
andi,r4 $C0 ;this restores the condition code!
cpsl $10 ;switch to bank 0
rete,un ;exit interrupt routine
;======================================================================================
reset:
lodi,r0 intinhibit ; 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
spsl compare ; logical compares
cpsu intinhibit ; enable interrupts
endless:
nop ; this is the main program loop
nop ; the processor is free to perform other tasks
nop ; in between servicing PVI interrupts
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
lodi,r0 1
stra,r0 Obj1dup ;next to draw is the first duplicate
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
lodi,r0 2
stra,r0 Obj1dup ;next to draw is the second duplicate
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
lodi,r0 0
stra,r0 Obj1dup ;next to draw is the primary object
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