Split out test driver into driver2
This commit is contained in:
parent
2ccb2f9a5d
commit
2ebbbd7468
2 changed files with 154 additions and 101 deletions
101
driver.a65
101
driver.a65
|
@ -50,10 +50,6 @@ BAUD_RATE = 600
|
||||||
|
|
||||||
; entry points
|
; entry points
|
||||||
.code
|
.code
|
||||||
; for development and testing
|
|
||||||
.export rs_test
|
|
||||||
rs_test:
|
|
||||||
jmp test
|
|
||||||
; these are convenience entry points right at the beginning of the page,
|
; these are convenience entry points right at the beginning of the page,
|
||||||
; to reduce dependency on code size.
|
; to reduce dependency on code size.
|
||||||
; relocatable code would be perfect, but that's a lot more work.
|
; relocatable code would be perfect, but that's a lot more work.
|
||||||
|
@ -99,103 +95,6 @@ BAUD_RATE = 600
|
||||||
; main code follows
|
; main code follows
|
||||||
.code
|
.code
|
||||||
|
|
||||||
;FIXME BEGIN
|
|
||||||
; test code:
|
|
||||||
; single-byte RS-232 transmission
|
|
||||||
; this code runs asynchronously in a VIA T2 interrupt handler
|
|
||||||
; the handler is installed and uninstalled automatically until
|
|
||||||
; transmission is complete.
|
|
||||||
; do not call this too quickly in succession, or you will lock
|
|
||||||
; up the CPU in an endless loop.
|
|
||||||
test:
|
|
||||||
sei
|
|
||||||
|
|
||||||
lda #10
|
|
||||||
sta rs_available
|
|
||||||
lda rs_data
|
|
||||||
asl a
|
|
||||||
sta rs_data
|
|
||||||
lda #%00000001
|
|
||||||
rol a
|
|
||||||
sta rs_data+1
|
|
||||||
|
|
||||||
lda VIA_DDRB
|
|
||||||
ora #%00001000
|
|
||||||
sta VIA_DDRB
|
|
||||||
|
|
||||||
lda IRQVec
|
|
||||||
ldx IRQVec+1
|
|
||||||
sta oldvector
|
|
||||||
stx oldvector+1
|
|
||||||
lda #<irqtest
|
|
||||||
ldx #>irqtest
|
|
||||||
sta IRQVec
|
|
||||||
stx IRQVec+1
|
|
||||||
|
|
||||||
lda VIA_CR
|
|
||||||
and #%11011111
|
|
||||||
sta VIA_CR
|
|
||||||
lda #%10100000
|
|
||||||
sta VIA_IER
|
|
||||||
testperiod = PHI2_CLOCK/BAUD_RATE
|
|
||||||
lda #<testperiod
|
|
||||||
ldx #>testperiod
|
|
||||||
sta VIA_T2CL
|
|
||||||
stx VIA_T2CH
|
|
||||||
rts
|
|
||||||
|
|
||||||
cli
|
|
||||||
rts
|
|
||||||
|
|
||||||
irqtest:
|
|
||||||
sei
|
|
||||||
cld
|
|
||||||
pha
|
|
||||||
txa
|
|
||||||
pha
|
|
||||||
|
|
||||||
lda VIA_IFR
|
|
||||||
and #%00100000
|
|
||||||
beq @irqtestend
|
|
||||||
|
|
||||||
ldx rs_available
|
|
||||||
beq @irqtestrestore
|
|
||||||
dex
|
|
||||||
stx rs_available
|
|
||||||
|
|
||||||
;lda #<testperiod
|
|
||||||
ldx #>testperiod
|
|
||||||
;sta VIA_T2CL
|
|
||||||
stx VIA_T2CH
|
|
||||||
|
|
||||||
lsr rs_data+1
|
|
||||||
ror rs_data
|
|
||||||
lda VIA_PB
|
|
||||||
bcc @irqtestblank
|
|
||||||
ora #%00001000
|
|
||||||
bcs @irqtestwrite
|
|
||||||
@irqtestblank:
|
|
||||||
and #%11110111
|
|
||||||
@irqtestwrite:
|
|
||||||
sta VIA_PB
|
|
||||||
|
|
||||||
@irqtestend:
|
|
||||||
pla
|
|
||||||
tax
|
|
||||||
pla
|
|
||||||
jmp (oldvector)
|
|
||||||
|
|
||||||
@irqtestrestore:
|
|
||||||
lda #%00100000
|
|
||||||
sta VIA_IER
|
|
||||||
lda oldvector
|
|
||||||
ldx oldvector+1
|
|
||||||
sta IRQVec
|
|
||||||
stx IRQVec+1
|
|
||||||
clv
|
|
||||||
bvc @irqtestend
|
|
||||||
;FIXME END
|
|
||||||
|
|
||||||
; driver installation, must be called once to set up IRQs, etc.
|
; driver installation, must be called once to set up IRQs, etc.
|
||||||
install:
|
install:
|
||||||
; FIXME this doesn't work if we're loading from ROM
|
; FIXME this doesn't work if we're loading from ROM
|
||||||
|
|
154
driver2.a65
Normal file
154
driver2.a65
Normal file
|
@ -0,0 +1,154 @@
|
||||||
|
|
||||||
|
; 6502 mode
|
||||||
|
.p02
|
||||||
|
|
||||||
|
; load useful register/memory locations
|
||||||
|
.include "pet.inc"
|
||||||
|
|
||||||
|
; for some reason, the PIA registers are missing in pet.inc...
|
||||||
|
PIA1 := $E810
|
||||||
|
PIA1_PA := PIA1+$0 ; PORT A or DDR A: Data Direction Register A
|
||||||
|
PIA1_CRA := PIA1+$1 ; CRA: Control Register A
|
||||||
|
PIA1_PB := PIA1+$2 ; PORT B or DDR B: Data Direction Register B
|
||||||
|
PIA1_CRB := PIA1+$3 ; CRB: Control Register B
|
||||||
|
PIA2 := $E820
|
||||||
|
PIA2_PA := PIA2+$0
|
||||||
|
PIA2_CRA := PIA2+$1
|
||||||
|
PIA2_PB := PIA2+$2
|
||||||
|
PIA2_CRB := PIA2+$3
|
||||||
|
|
||||||
|
; 1MHz phase2 clock
|
||||||
|
PHI2_CLOCK = 1000000
|
||||||
|
; don't set the baud rate too high, or other operations will be starved
|
||||||
|
BAUD_RATE = 600
|
||||||
|
|
||||||
|
; parameters and return values can reside in an unused area of the zero page
|
||||||
|
.zeropage
|
||||||
|
; used as the shift register counter
|
||||||
|
.export rs_available
|
||||||
|
rs_available: .byte 0
|
||||||
|
; shift register
|
||||||
|
.export rs_data
|
||||||
|
rs_data: .word 0
|
||||||
|
; saved old interrupt vector
|
||||||
|
.export rs_vector
|
||||||
|
rs_vector: .word 0
|
||||||
|
|
||||||
|
; this is for the load address, so we can generate PRG files.
|
||||||
|
; works as long as the code segment comes right after these two bytes,
|
||||||
|
; i.e. as long as the LOADADDR segment resides at $load_address - 2
|
||||||
|
.segment "LOADADDR"
|
||||||
|
.export LOADADDR
|
||||||
|
LOADADDR:
|
||||||
|
.word *+2
|
||||||
|
|
||||||
|
; test code follows
|
||||||
|
.code
|
||||||
|
|
||||||
|
; test code:
|
||||||
|
; single-byte RS-232 transmission
|
||||||
|
; this code runs asynchronously in a VIA T2 interrupt handler
|
||||||
|
; the handler is installed and uninstalled automatically until
|
||||||
|
; transmission is complete.
|
||||||
|
; do not call this too quickly in succession, or you will lock
|
||||||
|
; up the CPU in an endless loop.
|
||||||
|
|
||||||
|
testperiod = PHI2_CLOCK/BAUD_RATE
|
||||||
|
|
||||||
|
test:
|
||||||
|
sei
|
||||||
|
|
||||||
|
lda IRQVec
|
||||||
|
cmp irqtest
|
||||||
|
bne @testok
|
||||||
|
lda IRQVec+1
|
||||||
|
cmp irqtest+1
|
||||||
|
beq @testend
|
||||||
|
|
||||||
|
@testok:
|
||||||
|
lda #10
|
||||||
|
sta rs_available
|
||||||
|
lda rs_data
|
||||||
|
asl a
|
||||||
|
sta rs_data
|
||||||
|
lda #%00000001
|
||||||
|
rol a
|
||||||
|
sta rs_data+1
|
||||||
|
|
||||||
|
lda VIA_DDRB
|
||||||
|
ora #%00001000
|
||||||
|
sta VIA_DDRB
|
||||||
|
|
||||||
|
lda IRQVec
|
||||||
|
ldx IRQVec+1
|
||||||
|
sta rs_vector
|
||||||
|
stx rs_vector+1
|
||||||
|
lda #<irqtest
|
||||||
|
ldx #>irqtest
|
||||||
|
sta IRQVec
|
||||||
|
stx IRQVec+1
|
||||||
|
|
||||||
|
lda VIA_CR
|
||||||
|
and #%11011111
|
||||||
|
sta VIA_CR
|
||||||
|
lda #%10100000
|
||||||
|
sta VIA_IER
|
||||||
|
lda #<testperiod
|
||||||
|
ldx #>testperiod
|
||||||
|
sta VIA_T2CL
|
||||||
|
stx VIA_T2CH
|
||||||
|
|
||||||
|
@testend:
|
||||||
|
cli
|
||||||
|
rts
|
||||||
|
|
||||||
|
irqtest:
|
||||||
|
sei
|
||||||
|
cld
|
||||||
|
pha
|
||||||
|
txa
|
||||||
|
pha
|
||||||
|
|
||||||
|
lda VIA_IFR
|
||||||
|
and #%00100000
|
||||||
|
beq @irqtestend
|
||||||
|
|
||||||
|
ldx rs_available
|
||||||
|
beq @irqtestrestore
|
||||||
|
dex
|
||||||
|
stx rs_available
|
||||||
|
|
||||||
|
;lda #<testperiod
|
||||||
|
ldx #>testperiod
|
||||||
|
;sta VIA_T2CL
|
||||||
|
stx VIA_T2CH
|
||||||
|
|
||||||
|
lsr rs_data+1
|
||||||
|
ror rs_data
|
||||||
|
lda VIA_PB
|
||||||
|
bcc @irqtestblank
|
||||||
|
ora #%00001000
|
||||||
|
bcs @irqtestwrite
|
||||||
|
@irqtestblank:
|
||||||
|
and #%11110111
|
||||||
|
@irqtestwrite:
|
||||||
|
sta VIA_PB
|
||||||
|
|
||||||
|
@irqtestend:
|
||||||
|
pla
|
||||||
|
tax
|
||||||
|
pla
|
||||||
|
jmp (rs_vector)
|
||||||
|
|
||||||
|
@irqtestrestore:
|
||||||
|
lda #%00100000
|
||||||
|
sta VIA_IER
|
||||||
|
lda rs_vector
|
||||||
|
ldx rs_vector+1
|
||||||
|
sta IRQVec
|
||||||
|
stx IRQVec+1
|
||||||
|
lda #0
|
||||||
|
sta rs_vector
|
||||||
|
sta rs_vector+1
|
||||||
|
clv
|
||||||
|
bvc @irqtestend
|
Loading…
Reference in a new issue