Add the irq entry point

git-svn-id: svn://svn.cc65.org/cc65/trunk@3280 b7a2c559-68d2-44c3-8de9-860c34a00d81
This commit is contained in:
cuz
2004-11-06 13:27:38 +00:00
parent 16c81eb942
commit dc781be7f9
7 changed files with 127 additions and 145 deletions

View File

@@ -30,16 +30,17 @@
.byte $04 ; JOY_LEFT .byte $04 ; JOY_LEFT
.byte $08 ; JOY_RIGHT .byte $08 ; JOY_RIGHT
.byte $10 ; JOY_FIRE .byte $10 ; JOY_FIRE
.byte $00 ; Future expansion .byte $00 ; JOY_FIRE2 unavailable
.byte $00 ; Future expansion .byte $00 ; Future expansion
.byte $00 ; Future expansion .byte $00 ; Future expansion
; Jump table. ; Jump table.
.word INSTALL .addr INSTALL
.word DEINSTALL .addr UNINSTALL
.word COUNT .addr COUNT
.word READ .addr READ
.addr IRQ
; ------------------------------------------------------------------------ ; ------------------------------------------------------------------------
; Constants ; Constants
@@ -64,124 +65,104 @@ temp4: .byte 0
; ;
INSTALL: INSTALL:
sei
lda $0314
sta irqjmp+1
lda $0315
sta irqjmp+2
lda #<pollirq
sta $0314
lda #>pollirq
sta $0315
cli
lda #<JOY_ERR_OK lda #<JOY_ERR_OK
ldx #>JOY_ERR_OK ldx #>JOY_ERR_OK
rts ; rts ; Run into UNINSTALL instead
; ------------------------------------------------------------------------ ; ------------------------------------------------------------------------
; DEINSTALL routine. Is called before the driver is removed from memory. ; UNINSTALL routine. Is called before the driver is removed from memory.
; Can do cleanup or whatever. Must not return anything. ; Can do cleanup or whatever. Must not return anything.
; ;
DEINSTALL: UNINSTALL:
sei
lda irqjmp+1
sta $0314
lda irqjmp+2
sta $0315
cli
rts rts
; ------------------------------------------------------------------------ ; ------------------------------------------------------------------------
; we must use an irq here since we need timers ; IRQ entry point. Is called from the C layer as a subroutine in the
; which otherwhise would conflict with system-irq ; interrupt.
pollirq:
; cia 2 setup
ldy #$00 ; port b direction IRQ: ; cia 2 setup
sty $dd03 ; => input
sty $dd05 ; cia2 timer a highbyte ldy #$00 ; port b direction
sty $dc05 ; cia1 timer a highbyte sty $dd03 ; => input
iny
sty $dd04 ; cia2 timer a lowbyte
sty $dc04 ; cia1 timer a lowbyte
lda #%00010001 sty $dd05 ; cia2 timer a highbyte
sta $dd0e ; control register a sty $dc05 ; cia1 timer a highbyte
; timer: start iny
; continous sty $dd04 ; cia2 timer a lowbyte
; forced load sty $dc04 ; cia1 timer a lowbyte
; serial port: input
; cia 1 setup lda #%00010001
lda #%01010001 sta $dd0e ; control register a
sta $dc0e ; control register a ; timer: start
; timer: start ; continous
; continous ; forced load
; forced load ; serial port: input
; serial port: output
; cia 1 setup
lda #%01010001
sta $dc0e ; control register a
; timer: start
; continous
; forced load
; serial port: output
; read directions 3 ; read directions 3
lda $dd01 ;read cia 2 port b lda $dd01 ;read cia 2 port b
and #$0f and #$0f
sta temp3 sta temp3
; read button 3 ; read button 3
lda $dd02 ;cia 2 port a lda $dd02 ;cia 2 port a
and #%11111011 ;data direction and #%11111011 ;data direction
sta $dd02 ;=> bit 2 input sta $dd02 ;=> bit 2 input
lda $dd00 ;read cia 2 p.A lda $dd00 ;read cia 2 p.A
and #%00000100 ;check bit 2 and #%00000100 ;check bit 2
asl a asl a
asl a asl a
ora temp3 ora temp3
sta temp3 sta temp3
; read directions 4 ; read directions 4
lda $dd01 ;read cia 2 port b lda $dd01 ;read cia 2 port b
lsr a lsr a
lsr a lsr a
lsr a lsr a
lsr a lsr a
sta temp4 sta temp4
; read button 4 ; read button 4
ldx #$ff ;serial data register ldx #$ff ;serial data register
stx $dc0c;=> writing $ff causes stx $dc0c ;=> writing $ff causes
;cia to output some ;cia to output some
;count signals at cnt1 ;count signals at cnt1
ldx $dd0c ;read cia 2 serial in ldx $dd0c ;read cia 2 serial in
beq fire ;button press if zero beq fire ;button press if zero
lda temp4 lda temp4
ora #%00010000 ora #%00010000
sta temp4 sta temp4
fire: fire:
; Default Value: $40/64 on PAL
; $42/66 on NTSC
lda #$41
sta $dc05
; Default Value: $25/37 on PAL
; $95/149 on NTSC
lda #0
sta $dc04
; Default Value: $40/64 on PAL rts
; $42/66 on NTSC
lda #$41
sta $dc05
; Default Value: $25/37 on PAL
; $95/149 on NTSC
lda #0
sta $dc04
irqjmp: jmp $dead
; ------------------------------------------------------------------------ ; ------------------------------------------------------------------------
; COUNT: Return the total number of available joysticks in a/x. ; COUNT: Return the total number of available joysticks in a/x.
; ;
COUNT: COUNT: lda #<JOY_COUNT
lda #<JOY_COUNT
ldx #>JOY_COUNT ldx #>JOY_COUNT
rts rts
@@ -189,13 +170,12 @@ COUNT:
; READ: Read a particular joystick passed in A. ; READ: Read a particular joystick passed in A.
; ;
READ: READ: tax ; Joystick number into X
tax ; Joystick number into X
bne joy2 bne joy2
; Read joystick 1 ; Read joystick 1
joy1:
lda #$7F joy1: lda #$7F
sei sei
sta CIA1_PRA sta CIA1_PRA
lda CIA1_PRB lda CIA1_PRB
@@ -204,9 +184,9 @@ joy1:
eor #$1F eor #$1F
rts rts
; Read joystick 2 ; Read joystick 2
joy2:
dex joy2: dex
bne joy3 bne joy3
; ldx #0 ; ldx #0
@@ -223,20 +203,17 @@ joy2:
; Read joystick 3 ; Read joystick 3
joy3: joy3: dex
dex bne joy4
bne joy4
lda temp3 lda temp3
eor #$1F eor #$1F
ldx #0
rts rts
; Read joystick 4 ; Read joystick 4
joy4: joy4: lda temp4
lda temp4
eor #$1F eor #$1F
ldx #0 ldx #0
rts rts

View File

@@ -32,16 +32,17 @@
.byte $20 ; JOY_LEFT "4" .byte $20 ; JOY_LEFT "4"
.byte $08 ; JOY_RIGHT "6" .byte $08 ; JOY_RIGHT "6"
.byte $04 ; JOY_FIRE "5" ENTER .byte $04 ; JOY_FIRE "5" ENTER
.byte $00 ; Future expansion .byte $00 ; JOY_FIRE2 unavailable
.byte $00 ; Future expansion .byte $00 ; Future expansion
.byte $00 ; Future expansion .byte $00 ; Future expansion
; Jump table. ; Jump table.
.word INSTALL .addr INSTALL
.word UNINSTALL .addr UNINSTALL
.word COUNT .addr COUNT
.word READ .addr READ
.addr 0 ; IRQ entry unused
; ------------------------------------------------------------------------ ; ------------------------------------------------------------------------
; Constants ; Constants
@@ -63,13 +64,12 @@ JOY_COUNT = 1 ; Number of joysticks we support
; ;
INSTALL: INSTALL:
lda VIC_CLK_128 lda #JOY_ERR_OK ; Assume we have a joystick
cmp #$FF ldx VIC_CLK_128 ; Test for a C128
bne @C128 cpx #$FF
lda #JOY_ERR_NO_DEVICE bne @C128 ; Jump if we have one
.byte $2C lda #JOY_ERR_NO_DEVICE ; No C128 -> no numpad
@C128: lda #JOY_ERR_OK @C128: ldx #0 ; Set high byte
ldx #0
; rts ; Run into UNINSTALL instead ; rts ; Run into UNINSTALL instead

View File

@@ -30,16 +30,17 @@
.byte $04 ; JOY_LEFT .byte $04 ; JOY_LEFT
.byte $08 ; JOY_RIGHT .byte $08 ; JOY_RIGHT
.byte $10 ; JOY_FIRE .byte $10 ; JOY_FIRE
.byte $00 ; Future expansion .byte $00 ; JOY_FIRE2 unavailable
.byte $00 ; Future expansion .byte $00 ; Future expansion
.byte $00 ; Future expansion .byte $00 ; Future expansion
; Jump table. ; Jump table.
.word INSTALL .addr INSTALL
.word UNINSTALL .addr UNINSTALL
.word COUNT .addr COUNT
.word READ .addr READ
.addr 0 ; IRQ entry unused
; ------------------------------------------------------------------------ ; ------------------------------------------------------------------------
; Constants ; Constants

View File

@@ -12,7 +12,7 @@
.include "joy-error.inc" .include "joy-error.inc"
.include "cbm510.inc" .include "cbm510.inc"
.include "extzp.inc" .include "extzp.inc"
.macpack generic .macpack generic
@@ -33,16 +33,17 @@
.byte $04 ; JOY_LEFT .byte $04 ; JOY_LEFT
.byte $08 ; JOY_RIGHT .byte $08 ; JOY_RIGHT
.byte $10 ; JOY_FIRE .byte $10 ; JOY_FIRE
.byte $00 ; Future expansion .byte $00 ; JOY_FIRE2 unavailable
.byte $00 ; Future expansion .byte $00 ; Future expansion
.byte $00 ; Future expansion .byte $00 ; Future expansion
; Jump table. ; Jump table.
.word INSTALL .addr INSTALL
.word UNINSTALL .addr UNINSTALL
.word COUNT .addr COUNT
.word READ .addr READ
.addr 0 ; IRQ entry unused
; ------------------------------------------------------------------------ ; ------------------------------------------------------------------------
; Constants ; Constants

View File

@@ -36,10 +36,11 @@
; Jump table. ; Jump table.
.word INSTALL .addr INSTALL
.word UNINSTALL .addr UNINSTALL
.word COUNT .addr COUNT
.word READJOY .addr READJOY
.addr 0 ; IRQ entry unused
; ------------------------------------------------------------------------ ; ------------------------------------------------------------------------
; Constants ; Constants

View File

@@ -31,16 +31,17 @@
.byte $04 ; JOY_LEFT .byte $04 ; JOY_LEFT
.byte $08 ; JOY_RIGHT .byte $08 ; JOY_RIGHT
.byte $10 ; JOY_FIRE .byte $10 ; JOY_FIRE
.byte $00 ; Future expansion .byte $00 ; JOY_FIRE2 unavailable
.byte $00 ; Future expansion .byte $00 ; Future expansion
.byte $00 ; Future expansion .byte $00 ; Future expansion
; Jump table. ; Jump table.
.word INSTALL .addr INSTALL
.word UNINSTALL .addr UNINSTALL
.word COUNT .addr COUNT
.word READ .addr READ
.addr 0 ; IRQ entry unused
; ------------------------------------------------------------------------ ; ------------------------------------------------------------------------
; Constants ; Constants

View File

@@ -32,16 +32,17 @@
.byte $08 ; JOY_LEFT .byte $08 ; JOY_LEFT
.byte $80 ; JOY_RIGHT .byte $80 ; JOY_RIGHT
.byte $10 ; JOY_FIRE .byte $10 ; JOY_FIRE
.byte $00 ; Future expansion .byte $00 ; JOY_FIRE2 unavailable
.byte $00 ; Future expansion .byte $00 ; Future expansion
.byte $00 ; Future expansion .byte $00 ; Future expansion
; Jump table. ; Jump table.
.word INSTALL .addr INSTALL
.word UNINSTALL .addr UNINSTALL
.word COUNT .addr COUNT
.word READ .addr READ
.addr 0 ; IRQ entry unused
; ------------------------------------------------------------------------ ; ------------------------------------------------------------------------
; Constants ; Constants