1
0
mirror of https://github.com/cc65/cc65.git synced 2024-06-27 12:29:33 +00:00

PET-II improvements

git-svn-id: svn://svn.cc65.org/cc65/trunk@2849 b7a2c559-68d2-44c3-8de9-860c34a00d81
This commit is contained in:
cuz 2003-12-28 18:35:00 +00:00
parent 7c609c4e8e
commit 96ef6d828f
3 changed files with 269 additions and 161 deletions

View File

@ -72,6 +72,109 @@
.endproc
;------------------------------------------------------------------------------
; Page 3 data. This page contains the break vector and the bankswitch
; subroutine that is copied into high memory on startup. The space occupied by
; this routine will later be used for a copy of the bank 15 stack. It must be
; saved, since we're going to destroy it when calling bank 15.
.segment "PAGE3"
BRKVec: .addr _exit ; BRK indirect vector
.proc callbank15
excrts = $FEFE
.org $FEC3
entry: php
pha
lda #$0F ; Bank 15
sta IndReg
txa
pha
tya
pha
sei
ldy #$FF
lda (sysp1),y
tay
lda ExecReg
sta (sysp1),y
dey
lda #.hibyte(excrts-1)
sta (sysp1),y
dey
lda #.lobyte(excrts-1)
sta (sysp1),y
tya
sec
sbc #7
sta $1FF ; Save new sp
tay
tsx
pla
iny
sta (sysp1),y
pla
iny
sta (sysp1),y
pla
iny
sta (sysp1),y
pla
iny
sta (sysp1),y
lda $105,x
sec
sbc #3
iny
sta (sysp1),y
lda $106,x
sbc #0
iny
sta (sysp1),y
ldy $1FF ; Restore sp in bank 15
lda #.hibyte(expull-1)
sta (sysp1),y
dey
lda #.lobyte(expull-1)
sta (sysp1),y
dey
pla
pla
tsx
stx $1FF
tya
tax
txs
lda IndReg
jmp $FFF6
expull: pla
tay
pla
tax
pla
plp
rts
.if (expull <> $FF26)
.error "Symbol expull must be aligned with kernal in bank 15"
.endif
.reloc
.endproc
;------------------------------------------------------------------------------
; The code in the target bank when switching back will be put at the bottom
; of the stack. We will jump here to switch segments. The range $F2..$FF is
@ -79,11 +182,7 @@
.segment "STARTUP"
Back: sei
ldx spsave
txs
lda IndReg
sta ExecReg
Back: sta ExecReg
; We are at $100 now. The following snippet is a copy of the code that is poked
; in the system bank memory by the basic header program, it's only for
@ -129,27 +228,9 @@ Back: sei
.word $ebd1 ; ktab4
.endproc
; The following code is part of the kernal call subroutine. It is copied
; to $FFAE
.proc callsysbank_15
php
pha
lda #$0F ; Bank 15
sta IndReg
sei
.endproc
; Save the old stack pointer from the system bank and setup our hw sp
Origin: tsx
stx spsave ; Save the system stackpointer
ldx #$FE ; Leave $1FF untouched for cross bank calls
txs ; Set up our own stack
; Switch the indirect segment to the system bank
lda #$0F
Origin: lda #$0F
sta IndReg
; Initialize the extended zeropage
@ -160,6 +241,15 @@ L1: lda extzp,x
dex
bpl L1
; Save the old stack pointer from the system bank and setup our hw sp
tsx
txa
ldy #$FF
sta (sysp1),y ; Save system stack point into $F:$1FF
ldx #$FE ; Leave $1FF untouched for cross bank calls
txs ; Set up our own stack
; Copy stuff from the system zeropage to ours
lda #.sizeof(transfer_table)
@ -184,57 +274,34 @@ L3: lda vectors,x
; Setup the C stack
lda #.lobyte($FEAE - .sizeof(callsysbank_15))
lda #.lobyte(callbank15::entry)
sta sp
lda #.hibyte($FEAE - .sizeof(callsysbank_15))
lda #.hibyte(callbank15::entry)
sta sp+1
; Setup the subroutine and jump vector table that redirects kernal calls to
; the system bank. Copy the bank switch routines starting at $FEAE from the
; system bank into the current bank.
; the system bank.
ldy #.sizeof(callsysbank_15)-1 ; Copy the modified part
@L1: lda callsysbank_15,y
sta $FEAE - .sizeof(callsysbank_15),y
ldy #.sizeof(callbank15)
@L1: lda callbank15-1,y
sta callbank15::entry-1,y
dey
bpl @L1
bne @L1
lda #.lobyte($FEAE) ; Copy the ROM part
sta ptr1
lda #.hibyte($FEAE)
sta ptr1+1
ldy #$00
@L2: lda (ptr1),y
sta $FEAE,y
iny
cpy #<($FF6F-$FEAE)
bne @L2
; Setup the jump vector table. Y is zero on entry.
; Setup the jump vector table
ldy #$00
ldx #45-1 ; Number of vectors
@L3: lda #$20 ; JSR opcode
@L2: lda #$20 ; JSR opcode
sta $FF6F,y
iny
lda #.lobyte($FEAE - .sizeof(callsysbank_15))
lda #.lobyte(callbank15::entry)
sta $FF6F,y
iny
lda #.hibyte($FEAE - .sizeof(callsysbank_15))
lda #.hibyte(callbank15::entry)
sta $FF6F,y
iny
dex
bpl @L3
; Copy the stack from the system bank into page 3
ldy #$FF
L4: lda (sysp1),y
sta $300,y
dey
cpy spsave
bne L4
bpl @L2
; Set the indirect segment to bank we're executing in
@ -414,23 +481,20 @@ _exit: lda #$00
bne @L0
.endif
; Copy back the old system bank stack contents
ldy #$FF
@L1: lda $300,y
sta (sysp1),y
dey
cpy spsave
bne @L1
; Setup the welcome code at the stack bottom in the system bank.
ldy #$00
ldy #$FF
lda (sysp1),y ; Load system bank sp
tax
iny ; Y = 0
lda #$58 ; CLI opcode
sta (sysp1),y
iny
lda #$60 ; RTS opcode
sta (sysp1),y
lda IndReg
sei
txs
jmp Back
; -------------------------------------------------------------------------
@ -504,19 +568,10 @@ nmi: rti
dobrk: jmp (BRKVec)
; -------------------------------------------------------------------------
; Page 3
.segment "PAGE3"
BRKVec: .addr _exit ; BRK indirect vector
; -------------------------------------------------------------------------
; Data area
.data
spsave: .res 1
vidsave:.res 3
.bss

View File

@ -72,6 +72,109 @@
.endproc
;------------------------------------------------------------------------------
; Page 3 data. This page contains the break vector and the bankswitch
; subroutine that is copied into high memory on startup. The space occupied by
; this routine will later be used for a copy of the bank 15 stack. It must be
; saved, since we're going to destroy it when calling bank 15.
.segment "PAGE3"
BRKVec: .addr _exit ; BRK indirect vector
.proc callbank15
excrts = $FF05
.org $FECB
entry: php
pha
lda #$0F ; Bank 15
sta IndReg
txa
pha
tya
pha
sei
ldy #$FF
lda (sysp1),y
tay
lda ExecReg
sta (sysp1),y
dey
lda #.hibyte(excrts-1)
sta (sysp1),y
dey
lda #.lobyte(excrts-1)
sta (sysp1),y
tya
sec
sbc #7
sta $1FF ; Save new sp
tay
tsx
pla
iny
sta (sysp1),y
pla
iny
sta (sysp1),y
pla
iny
sta (sysp1),y
pla
iny
sta (sysp1),y
lda $105,x
sec
sbc #3
iny
sta (sysp1),y
lda $106,x
sbc #0
iny
sta (sysp1),y
ldy $1FF ; Restore sp in bank 15
lda #.hibyte(expull-1)
sta (sysp1),y
dey
lda #.lobyte(expull-1)
sta (sysp1),y
dey
pla
pla
tsx
stx $1FF
tya
tax
txs
lda IndReg
jmp $FFF6
expull: pla
tay
pla
tax
pla
plp
rts
.if (expull <> $FF2E)
.error "Symbol expull must be aligned with kernal in bank 15"
.endif
.reloc
.endproc
;------------------------------------------------------------------------------
; The code in the target bank when switching back will be put at the bottom
; of the stack. We will jump here to switch segments. The range $F2..$FF is
@ -79,11 +182,7 @@
.segment "STARTUP"
Back: sei
ldx spsave
txs
lda IndReg
sta ExecReg
Back: sta ExecReg
; We are at $100 now. The following snippet is a copy of the code that is poked
; in the system bank memory by the basic header program, it's only for
@ -100,7 +199,7 @@ Back: sei
jmp Origin
; Hardware vectors, copied to $FFFA
; Hardware vectors, copied to $FFF6
.proc vectors
sta ExecReg
@ -129,27 +228,9 @@ Back: sei
.word $eb49 ; ktab4
.endproc
; The following code is part of the kernal call subroutine. It is copied
; to $FFAE
.proc callsysbank_15
php
pha
lda #$0F ; Bank 15
sta IndReg
sei
.endproc
; Save the old stack pointer from the system bank and setup our hw sp
Origin: tsx
stx spsave ; Save the system stackpointer
ldx #$FE ; Leave $1FF untouched for cross bank calls
txs ; Set up our own stack
; Switch the indirect segment to the system bank
lda #$0F
Origin: lda #$0F
sta IndReg
; Initialize the extended zeropage
@ -160,6 +241,15 @@ L1: lda extzp,x
dex
bpl L1
; Save the old stack pointer from the system bank and setup our hw sp
tsx
txa
ldy #$FF
sta (sysp1),y ; Save system stack point into $F:$1FF
ldx #$FE ; Leave $1FF untouched for cross bank calls
txs ; Set up our own stack
; Copy stuff from the system zeropage to ours
lda #.sizeof(transfer_table)
@ -184,57 +274,34 @@ L3: lda vectors,x
; Setup the C stack
lda #.lobyte($FEB5 - .sizeof(callsysbank_15))
lda #.lobyte(callbank15::entry)
sta sp
lda #.hibyte($FEB5 - .sizeof(callsysbank_15))
lda #.hibyte(callbank15::entry)
sta sp+1
; Setup the subroutine and jump vector table that redirects kernal calls to
; the system bank. Copy the bank switch routines starting at $FEB5 from the
; system bank into the current bank.
; the system bank.
ldy #.sizeof(callsysbank_15)-1 ; Copy the modified part
@L1: lda callsysbank_15,y
sta $FEB5 - .sizeof(callsysbank_15),y
ldy #.sizeof(callbank15)
@L1: lda callbank15-1,y
sta callbank15::entry-1,y
dey
bpl @L1
bne @L1
lda #.lobyte($FEB5) ; Copy the ROM part
sta ptr1
lda #.hibyte($FEB5)
sta ptr1+1
ldy #$00
@L2: lda (ptr1),y
sta $FEB5,y
iny
cpy #<($FF6F-$FEB5)
bne @L2
; Setup the jump vector table. Y is zero on entry.
; Setup the jump vector table
ldy #$00
ldx #45-1 ; Number of vectors
@L3: lda #$20 ; JSR opcode
@L2: lda #$20 ; JSR opcode
sta $FF6F,y
iny
lda #.lobyte($FEB5 - .sizeof(callsysbank_15))
lda #.lobyte(callbank15::entry)
sta $FF6F,y
iny
lda #.hibyte($FEB5 - .sizeof(callsysbank_15))
lda #.hibyte(callbank15::entry)
sta $FF6F,y
iny
dex
bpl @L3
; Copy the stack from the system bank into page 3
ldy #$FF
L4: lda (sysp1),y
sta $300,y
dey
cpy spsave
bne L4
bpl @L2
; Set the indirect segment to bank we're executing in
@ -321,23 +388,20 @@ _exit: lda #$00
bne @L0
.endif
; Copy back the old system bank stack contents
ldy #$FF
@L1: lda $300,y
sta (sysp1),y
dey
cpy spsave
bne @L1
; Setup the welcome code at the stack bottom in the system bank.
ldy #$00
ldy #$FF
lda (sysp1),y ; Load system bank sp
tax
iny ; Y = 0
lda #$58 ; CLI opcode
sta (sysp1),y
iny
lda #$60 ; RTS opcode
sta (sysp1),y
lda IndReg
sei
txs
jmp Back
; -------------------------------------------------------------------------
@ -411,20 +475,9 @@ nmi: rti
dobrk: jmp (BRKVec)
; -------------------------------------------------------------------------
; Page 3
.segment "PAGE3"
BRKVec: .addr _exit ; BRK indirect vector
; -------------------------------------------------------------------------
; Data area.
.data
spsave: .res 1
.bss
irqcount: .byte 0

View File

@ -10,7 +10,7 @@
.globalzp ktab1, ktab2, ktab3, ktab4
.globalzp sysp0, time, segsave, ktmp, CURS_X, CURS_Y, RVS, config
.globalzp CharPtr, keyidx, keybuf, keyscanbuf, keysave, modkey
.globalzp norkey, graphmode, lastidx, rptdelay, rptcount
.globalzp CharPtr, keyidx, keybuf, keyscanbuf, keysave
.globalzp modkey, norkey, graphmode, lastidx, rptdelay, rptcount