done
mv cbm510/crt0.o cbm510.o
cp cbm510/*.emd .
- cp cbm510/*.joy .
+ cp cbm510/cbm510-stdjoy.joy cbm510-std.joy
cp cbm510/cbm510-stdser.ser cbm510-std.ser
#-----------------------------------------------------------------------------
cgetc.o \
clrscr.o \
color.o \
- conio.o \
cputc.o \
crt0.o \
extzp.o \
kbhit.o \
- kirq.o \
- kplot.o \
+ kclose.o \
+ kernal.o \
+ kiobase.o \
+ kopen.o \
+ kreadst.o \
kscnkey.o \
+ ksetnam.o \
kudtim.o \
mainargs.o \
mouse.o \
;
-; Ullrich von Bassewitz, 13.09.2000
+; Ullrich von Bassewitz, 26.10.2000
;
; Screen size variables
;
- .export screensize
-
- .include "cbm510.inc"
-
-.proc screensize
-
- ldx #XSIZE
- ldy #YSIZE
- rts
-
-.endproc
+ .export screensize
+ .import SCREEN
+
+ screensize = SCREEN
;
-; Ullrich von Bassewitz, 13.09.2001
+; Ullrich von Bassewitz, 28.09.1998
;
-; Banking routines for the 510.
+; Banking routines for the 610.
;
.export set_bank, sys_bank, restore_bank
- .importzp ptr1
+ .importzp ptr1, segsave
- .include "cbm510.inc"
+ .include "cbm510.inc"
.code
.proc sys_bank
pha
lda IndReg
- sta IndSegSave
+ sta segsave
lda #$0F
sta IndReg
pla
.proc set_bank
pha
lda IndReg
- sta IndSegSave
+ sta segsave
pla
sta IndReg
rts
.proc restore_bank
pha
- lda IndSegSave
+ lda segsave
sta IndReg
pla
rts
.export _set_brk, _reset_brk
.export _brk_a, _brk_x, _brk_y, _brk_sr, _brk_pc
- .import _atexit
+ .import _atexit, BRKVec
- .include "cbm510.inc"
+ .include "cbm510.inc"
.bss
.proc brk_handler
+ pla
+ sta _brk_01
pla
sta _brk_y
pla
pla ; PC high
sbc #0
sta _brk_pc+1
- lda IndReg
- sta _brk_01
- lda ExecReg
- sta IndReg
jsr uservec ; Call the user's routine
lda _brk_01
- sta IndReg
+ sta IndReg
lda _brk_pc+1
pha
.include "joy-kernel.inc"
.include "joy-error.inc"
.include "cbm510.inc"
-
+ .include "extzp.inc"
+
.macpack generic
ExecReg = $0000
IndReg = $0001
-; Up to $20 and $60-8F used by runtime and fixed values
-; -----------------------------------
-
-KbdScanBuf = $20 ; Intermediate for keyboard scan
-
-FileNameAdrLo = $90
-FileNameAdrHi = $91
-FileNameAdrSeg = $92
-FileNameLen = $9D
-LogicalAdr = $9E
-FirstAdr = $9F
-SecondAdr = $A0
-IndSegSave = $B5
-SCREEN_PTR = $C8
-CURS_Y = $CA
-CURS_X = $CB
-GrafMode = $CC
-LastIndex = $CD
-LastLine = $CE
-LastCol = $CF
-crsw = $D0
-KeyIndex = $D1
-QuoteSw = $D2
-Insrt = $D3
-Config = $D4
-LastLinePos = $D5
-PgmKeyIndex = $D6
-RepeatCount = $D7
-RepeatDelay = $D8
-ModKey = $E0
-NorKey = $E1
-CURS_FLAG = $E6 ; 1 = no cursor
-CURS_BLINK = $E7 ; cursor blink counter
-CRAM_PTR = $E8
-CURS_STATE = $EB ; Cursor blink state
-CHARCOLOR = $EC
-CURS_COLOR = $ED ; Color behind cursor
-
-;-----------------------------------------------------------------------------
-; Page 3 variables
-
-;
-; system ram vectors
-;
-
-IRQVec = $0300
-BRKVec = $0302
-NMIVec = $0304
-
-;
-;
-;
-
-LogicalAdrTable = $0334
-FirstAdrTable = $033E
-SecondAdrTable = $0348
-SysMemBot = $0352
-SysMemTop = $0355
-UsrMemBot = $0358
-UsrMemTop = $035B
-DevTabIndex = $0360
-PgmKeyEnd = $0380
-PgmKeySeg = $0382
-RVS = $0383
-LastPrtChar = $0399
-InsertFlag = $039A
-ScrollFlag = $039B
-PgmKeyIdx = $039D
-LogScrollFlag = $039E
-BellMode = $039F ; Bell on/off 00 = an
-SegSave = $03A0
-TabStopTable = $03A1 ; 80 bits for tabstops
-KeyBuf = $03AB ; Keyboard buffer
-
; ---------------------------------------------------------------------------
; Screen size
.import cursor
.include "cbm510.inc"
+ .include "extzp.inc"
; ------------------------------------------------------------------------
.proc _cgetc
- lda KeyIndex ; Characters waiting?
+ lda keyidx ; Characters waiting?
bne L3 ; Jump if so
; Switch on the cursor if needed
pha
lda cursor
jsr setcursor
-L1: lda KeyIndex
+L1: lda keyidx
beq L1
ldx #0
pla
; Read the character from the keyboard buffer
L3: ldx #$00 ; Get index
- ldy KeyBuf ; Get first character in the buffer
+ ldy keybuf ; Get first character in the buffer
sei
-L4: lda KeyBuf+1,x ; Move up the remaining chars
- sta KeyBuf,x
+L4: lda keybuf+1,x ; Move up the remaining chars
+ sta keybuf,x
inx
- cpx KeyIndex
+ cpx keyidx
bne L4
- dec KeyIndex
+ dec keyidx
cli
ldx #$00 ; High byte
tax ; On or off?
bne @L9 ; Go set it on
lda CURS_FLAG ; Is the cursor currently off?
- bne @L8 ; Jump if yes
+ bne @L8 ; Jump if yes
lda #1
sta CURS_FLAG ; Mark it as off
lda CURS_STATE ; Cursor currently displayed?
.endproc
+
.import plot
.include "cbm510.inc"
+ .include "extzp.inc"
; ------------------------------------------------------------------------
; void __fastcall__ clrscr (void);
.export _textcolor, _bgcolor, _bordercolor
.import sys_bank, restore_bank
- .importzp vic
+ .import vic: zp, CHARCOLOR: zp
.include "cbm510.inc"
+++ /dev/null
-;
-; Ullrich von Bassewitz, 14.09.2001
-;
-; Low level stuff for screen output/console input
-;
-
- .exportzp CURS_X, CURS_Y
-
- .include "cbm510.inc"
-
.export _cputcxy, _cputc, cputdirect, putchar
.export newline, plot
- .import PLOT
.import popa, _gotoxy
+ .import __VIDRAM_START__
+ .import CURS_X: zp, CURS_Y: zp, CHARCOLOR: zp, RVS: zp
+ .import SCREEN_PTR: zp, CRAM_PTR: zp
.include "cbm510.inc"
+ .macpack generic
+
; ------------------------------------------------------------------------
;
L3: sty CURS_X
rts
-newline:
- clc
- lda #XSIZE
- adc SCREEN_PTR
- sta SCREEN_PTR
- bcc L4
- inc SCREEN_PTR+1
- clc
-L4: lda #XSIZE
- adc CRAM_PTR
- sta CRAM_PTR
- bcc L5
- inc CRAM_PTR+1
-L5: inc CURS_Y
- rts
-
; Handle character if high bit set
-L10: and #$7F
+L10: and #$7F
cmp #$7E ; PI?
- bne L11
- lda #$5E ; Load screen code for PI
- bne cputdirect
-L11: ora #$40
- bne cputdirect
+ bne L11
+ lda #$5E ; Load screen code for PI
+ bne cputdirect
+L11: ora #$40
+ bne cputdirect ; Branch always
+
+; Move the cursor into the next line
+
+newline:
+ inc CURS_Y
; Set cursor position, calculate RAM pointers
-plot: ldy CURS_X
- ldx CURS_Y
- clc
- jmp PLOT ; Set the new cursor
+plot: ldx CURS_Y
+ lda LineLSBTab,x
+ sta SCREEN_PTR
+ sta CRAM_PTR
+ lda LineMSBTab,x
+ sta SCREEN_PTR+1
+ add #.hibyte(COLOR_RAM - __VIDRAM_START__)
+ sta CRAM_PTR+1
+ rts
; Write one character to the screen without doing anything else, return X
; position in Y
stx IndReg
rts
+; -------------------------------------------------------------------------
+; Low bytes of the start address of the screen lines
+
+.rodata
+
+LineLSBTab:
+ .repeat 25, I
+ .byte .lobyte(__VIDRAM_START__ + I * 40)
+ .endrep
+
+; -------------------------------------------------------------------------
+; High bytes of the start address of the screen lines
+
+LineMSBTab:
+ .repeat 25, I
+ .byte .hibyte(__VIDRAM_START__ + I * 40)
+ .endrep
.export _exit
- .import _clrscr, initlib, donelib
+ .import _clrscr, initlib, donelib, condes
.import push0, callmain
.import __CHARRAM_START__, __CHARRAM_SIZE__, __VIDRAM_START__
- .import __EXTZP_RUN__, __EXTZP_SIZE__
- .import __BSS_RUN__, __BSS_SIZE__
- .import irq, nmi
- .import k_irq, k_nmi, PLOT, UDTIM, SCNKEY
+ .import __BSS_RUN__, __BSS_SIZE__, __EXTZP_RUN__
+ .import __IRQFUNC_TABLE__, __IRQFUNC_COUNT__
+ .import scnkey, UDTIM
.include "zeropage.inc"
.include "extzp.inc"
; that is overwritten later.
;
-.code
+.segment "BASICHDR"
-; To make things more simple, make the code of this module absolute.
-
- .org $0001
-Head: .byte $03,$00,$11,$00,$0a,$00,$81,$20,$49,$b2,$30,$20,$a4,$20,$34,$00
+ .byte $03,$00,$11,$00,$0a,$00,$81,$20,$49,$b2,$30,$20,$a4,$20,$34,$00
.byte $19,$00,$14,$00,$87,$20,$4a,$00,$27,$00,$1e,$00,$97,$20,$32,$35
.byte $36,$aa,$49,$2c,$4a,$00,$2f,$00,$28,$00,$82,$20,$49,$00,$39,$00
.byte $32,$00,$9e,$20,$32,$35,$36,$00,$4f,$00,$3c,$00,$83,$20,$31,$32
.byte $30,$2c,$31,$36,$39,$2c,$30,$2c,$31,$33,$33,$2c,$30,$00,$00,$00
+;------------------------------------------------------------------------------
+; A table that contains values that must be transfered from the system zero
+; page into out zero page. Contains pairs of bytes, first one is the address
+; in the system ZP, second one is our ZP address. The table goes into page 2,
+; but is declared here, because it is needed earlier.
+
+.SEGMENT "PAGE2"
+
+.proc transfer_table
+
+ .byte $CA, CURS_Y
+ .byte $CB, CURS_X
+ .byte $EC, CHARCOLOR
+ .byte
+
+.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
; not used by any kernal routine.
- .res $F8-*
-Back: ldx spsave
+.segment "STARTUP"
+
+Back: sei
+ ldx spsave
txs
lda IndReg
sta ExecReg
-; The following code is a copy of the code that is poked in the system bank
-; memory by the basic header program, it's only for documentation and not
-; actually used here:
+; 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
+; documentation and not actually used here:
sei
lda #$00
; This is the actual starting point of our code after switching banks for
; startup. Beware: The following code will get overwritten as soon as we
-; use the stack (since it's in page 1)!
+; use the stack (since it's in page 1)! We jump to another location, since
+; we need some space for subroutines that aren't used later.
- tsx
- stx spsave ; Save the system stackpointer
- ldx #$FF
- txs ; Set up our own stack
+ jmp Origin
-; Set the interrupt, NMI and other vectors
+; Hardware vectors, copied to $FFFA
- ldy #vectable_size
-L0: lda vectable-1,y
- sta $FF81-1,y
- dey
- bne L0
+.proc vectors
+ sta ExecReg
+ rts
+ nop
+ .word nmi ; NMI vector
+ .word 0 ; Reset - not used
+ .word irq ; IRQ vector
+.endproc
-; Initialize the extended zero page variables
+; Initializers for the extended zeropage. See extzp.s
- ldx #zptable_size
-L1: lda zptable-1,x
- sta <(__EXTZP_RUN__-1),x
- dex
- bne L1
+.proc extzp
+ .word $0100 ; sysp1
+ .word $0300 ; sysp3
+ .word $d800 ; vic
+ .word $da00 ; sid
+ .word $db00 ; cia1
+ .word $dc00 ; cia2
+ .word $dd00 ; acia
+ .word $de00 ; tpi1
+ .word $df00 ; tpi2
+ .word $eab1 ; ktab1
+ .word $eb11 ; ktab2
+ .word $eb71 ; ktab3
+ .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
sta IndReg
-; Copy the kernal zero page ($90-$F2) from the system bank
+; Initialize the extended zeropage
- lda #$90
- sta ptr1
- lda #$00
- sta ptr1+1
- ldy #$62-1
-L2: lda (ptr1),y
- sta $90,y
- dey
- bpl L2
+ ldx #.sizeof(extzp)-1
+L1: lda extzp,x
+ sta <__EXTZP_RUN__,x
+ dex
+ bpl L1
+
+; Copy stuff from the system zeropage to ours
+
+ lda #.sizeof(transfer_table)
+ sta ktmp
+L2: ldx ktmp
+ ldy transfer_table-2,x
+ lda transfer_table-1,x
+ tax
+ lda (sysp0),y
+ sta $00,x
+ dec ktmp
+ dec ktmp
+ bne L2
-; Copy the page 3 vectors in place
+; Set the interrupt, NMI and other vectors
- ldy #$00
-L3: lda p3vectable,y
- sta $300,y
- iny
- cpy #p3vectable_size
- bne L3
+ ldx #.sizeof(vectors)-1
+L3: lda vectors,x
+ sta $10000 - .sizeof(vectors),x
+ dex
+ bpl L3
-; Copy the rest of page 3 from the system bank
+; Setup the C stack
- lda #$00
- sta ptr1
- lda #$03
- sta ptr1+1
-L4: lda (ptr1),y
- sta $300,y
- iny
- bne L4
+ lda #.lobyte($FEAE - .sizeof(callsysbank_15))
+ sta sp
+ lda #.hibyte($FEAE - .sizeof(callsysbank_15))
+ 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.
+
+
+ ldy #.sizeof(callsysbank_15)-1 ; Copy the modified part
+@L1: lda callsysbank_15,y
+ sta $FEAE - .sizeof(callsysbank_15),y
+ dey
+ bpl @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
+
+ ldy #$00
+ ldx #45-1 ; Number of vectors
+@L3: lda #$20 ; JSR opcode
+ sta $FF6F,y
+ iny
+ lda #.lobyte($FEAE - .sizeof(callsysbank_15))
+ sta $FF6F,y
+ iny
+ lda #.hibyte($FEAE - .sizeof(callsysbank_15))
+ 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
; Set the indirect segment to bank we're executing in
- lda ExecReg
- sta IndReg
+ lda ExecReg
+ sta IndReg
; Zero the BSS segment. We will do that here instead calling the routine
; in the common library, since we have the memory anyway, and this way,
lda #<__BSS_RUN__
sta ptr1
- lda #>__BSS_RUN__
+ lda #>__BSS_RUN__
sta ptr1+1
- lda #0
- tay
+ lda #0
+ tay
; Clear full pages
iny
bne Z1
inc ptr1+1 ; Next page
- dex
+ dex
bne Z1
; Clear the remaining page
iny
dex
bne Z3
-Z4:
-
-; Setup the C stack
-
- lda #<$FF81
- sta sp
- lda #>$FF81
- sta sp+1
-
-; We expect to be in page 2 now
+Z4: jmp Init
-.if (* < $1FD)
- jmp $200
- .res $200-*
-.endif
-.if (* < $200)
- .res $200-*,$EA
-.endif
-.if (* >= $2F0)
-.error "Code range invalid"
-.endif
+; ------------------------------------------------------------------------
+; We are at $200 now. We may now start calling subroutines safely, since
+; the code we execute is no longer in the stack page.
-; This code is in page 2, so we may now start calling subroutines safely,
-; since the code we execute is no longer in the stack page.
+.segment "PAGE2"
; Copy the character rom from the system bank into the execution bank
- lda #<$C000
+Init: lda #<$C000
sta ptr1
lda #>$C000
sta ptr1+1
sta tmp1
ldy #$00
ccopy: lda #$0F
- sta IndReg ; Access the system bank
+ sta IndReg ; Access the system bank
ccopy1: lda (ptr1),y
sta __VIDRAM_START__,y
iny
iny
bne ccopy2
inc ptr1+1
- inc ptr2+1 ; Bump high pointer bytes
+ inc ptr2+1 ; Bump high pointer bytes
dec tmp1
bne ccopy
lda ExecReg
sta IndReg
-; Call module constructors
-
- jsr initlib
-
-; Execute the program code
-
- jmp Start
+; Call module constructors, enable chained IRQs afterwards.
-; ------------------------------------------------------------------------
-; Additional data that we need for initialization and that's overwritten
-; later
-
-zptable:
- .word $d800 ; vic
- .word $da00 ; sid
- .word $db00 ; cia1
- .word $dc00 ; cia2
- .word $dd00 ; acia
- .word $de00 ; tpi1
- .word $df00 ; tpi2
- .word $eab1 ; ktab1
- .word $eb11 ; ktab2
- .word $eb71 ; ktab3
- .word $ebd1 ; ktab4
- .dword $0000 ; time
- .word $0100 ; RecvBuf
- .word $0200 ; SendBuf
-zptable_size = * - zptable
-
-vectable:
- jmp $0000 ; CINT
- jmp $0000 ; IOINIT
- jmp $0000 ; RAMTAS
- jmp $0000 ; RESTOR
- jmp $0000 ; VECTOR
- jmp $0000 ; SETMSG
- jmp $0000 ; SECOND
- jmp $0000 ; TKSA
- jmp $0000 ; MEMTOP
- jmp $0000 ; MEMBOT
- jmp SCNKEY
- jmp $0000 ; SETTMO
- jmp $0000 ; ACPTR
- jmp $0000 ; CIOUT
- jmp $0000 ; UNTLK
- jmp $0000 ; UNLSN
- jmp $0000 ; LISTEN
- jmp $0000 ; TALK
- jmp $0000 ; READST
- jmp SETLFS
- jmp SETNAM
- jmp $0000 ; OPEN
- jmp $0000 ; CLOSE
- jmp $0000 ; CHKIN
- jmp $0000 ; CKOUT
- jmp $0000 ; CLRCH
- jmp $0000 ; BASIN
- jmp $0000 ; BSOUT
- jmp $0000 ; LOAD
- jmp $0000 ; SAVE
- jmp SETTIM
- jmp RDTIM
- jmp $0000 ; STOP
- jmp $0000 ; GETIN
- jmp $0000 ; CLALL
- jmp UDTIM
- jmp SCREEN
- jmp PLOT
- jmp IOBASE
- sta ExecReg
- rts
- .byte $01 ; Filler
- .word nmi
- .word 0 ; Reset - not used
- .word irq
-vectable_size = * - vectable
-
-p3vectable:
- .word k_irq ; IRQ user vector
- .word k_brk ; BRK user vector
- .word k_nmi ; NMI user vector
-p3vectable_size = * - p3vectable
-
-
-; ------------------------------------------------------------------------
-; This is the program code after setup. It starts at $400
-
- .res $400-*
-
-Start:
+ jsr initlib
+ lda #.lobyte(__IRQFUNC_COUNT__*2)
+ sta irqcount
; Enable interrupts
jsr callmain
-; Call module destructors. This is also the _exit entry.
+; Call module destructors. This is also the _exit entry and the default entry
+; point for the break vector.
-_exit: jsr donelib ; Run module destructors
+_exit: lda #$00
+ sta irqcount ; Disable custom irq handlers
+ jsr donelib ; Run module destructors
-; We need access to the system bank now
+; Address the system bank
- lda #$0F
- sta IndReg
+ lda #$0F
+ sta IndReg
; Switch back the video to the system bank
lda vidsave+2
sta (vic),y
-; Clear the start of the zero page, since it will be interpreted as a
-; (garbage) BASIC program otherwise. This is also the default entry for
-; the break vector.
+; Copy stuff back from our zeropage to the systems
-k_brk: sei
- lda #$00
- ldx #$3E
-Clear: sta $02,x
- dex
- bne Clear
-
-; Setup the welcome code at the stack bottom in the system bank. Use
-; the F4/F5 vector to access the system bank
-
- ldy #$00
- sty $F4
- iny
- sty $F5
- ldy #reset_size-1
-@L1: lda reset,y
- sta ($F4),y
- dey
- bne @L1
- jmp Back
+.if 0
+ lda #.sizeof(transfer_table)
+ sta ktmp
+@L0: ldx ktmp
+ ldy transfer_table-2,x
+ lda transfer_table-1,x
+ tax
+ lda $00,x
+ sta (sysp0),y
+ dec ktmp
+ dec ktmp
+ bne @L0
+.endif
-; ------------------------------------------------------------------------
-; Code that is copied into the system bank at $100 when switching back
+; Copy back the old system bank stack contents
-reset: cli
- jmp $8000 ; BASIC cold start
-reset_size = * - reset
+ ldy #$FF
+@L1: lda $300,y
+ sta (sysp1),y
+ dey
+ cpy spsave
+ bne @L1
-; ------------------------------------------------------------------------
-; Code for a few simpler kernal calls goes here
+; Setup the welcome code at the stack bottom in the system bank.
-.export IOBASE
-.proc IOBASE
- ldx cia2
- ldy cia2+1
- rts
-.endproc
+ ldy #$00
+ lda #$58 ; CLI opcode
+ sta (sysp1),y
+ iny
+ lda #$60 ; RTS opcode
+ sta (sysp1),y
+ jmp Back
-.export SCREEN
-.proc SCREEN
- ldx #40 ; Columns
- ldy #25 ; Lines
- rts
-.endproc
+; -------------------------------------------------------------------------
+; The IRQ handler goes into PAGE2. For performance reasons, and to allow
+; easier chaining, we do handle the IRQs in the execution bank (instead of
+; passing them to the system bank).
-.export SETLFS
-.proc SETLFS
- sta LogicalAdr
- stx FirstAdr
- sty SecondAdr
- rts
-.endproc
+; This is the mapping of the active irq register of the 6525 (tpi1):
+;
+; Bit 7 6 5 4 3 2 1 0
+; | | | | ^ 50 Hz
+; | | | ^ SRQ IEEE 488
+; | | ^ cia
+; | ^ IRQB ext. Port
+; ^ acia
+
+irq: pha
+ txa
+ pha
+ tya
+ pha
+ lda IndReg
+ pha
+ lda ExecReg
+ sta IndReg ; Be sure to address our segment
+ tsx
+ lda $105,x ; Get the flags from the stack
+ and #$10 ; Test break flag
+ bne dobrk
-.export SETNAM
-.proc SETNAM
- sta FileNameLen
- lda $00,x
- sta FileNameAdrLo
- lda $01,x
- sta FileNameAdrHi
- lda $02,x
- sta FileNameAdrSeg
- rts
-.endproc
+; It's an IRQ
-.export RDTIM
-.proc RDTIM
- sei
- lda time+0
- ldx time+1
- ldy time+2
- cli
- rts
-.endproc
+ cld
-.export SETTIM
-.proc SETTIM
- sei
- sta time+0
- stx time+1
- sty time+2
- cli
- rts
-.endproc
+; Call chained IRQ handlers
+
+ ldy irqcount
+ beq irqskip
+ lda #<__IRQFUNC_TABLE__
+ ldx #>__IRQFUNC_TABLE__
+ jsr condes ; Call the functions
+
+; Done with chained IRQ handlers, check the TPI for IRQs and handle them
+
+irqskip:lda #$0F
+ sta IndReg
+ ldy #TPI::AIR
+ lda (tpi1),y ; Interrupt Register 6525
+ beq noirq
+
+; 50/60Hz interrupt
+
+ cmp #%00000001 ; ticker irq?
+ bne irqend
+ jsr scnkey ; Poll the keyboard
+ jsr UDTIM ; Bump the time
+
+; Done
+
+irqend: ldy #TPI::AIR
+ sta (tpi1),y ; Clear interrupt
+
+noirq: pla
+ sta IndReg
+ pla
+ tay
+ pla
+ tax
+ pla
+nmi: rti
+
+dobrk: jmp (BRKVec)
; -------------------------------------------------------------------------
-; Data area - switch back to relocatable mode
+; Page 3
+
+.segment "PAGE3"
+
+BRKVec: .addr _exit ; BRK indirect vector
- .reloc
+
+; -------------------------------------------------------------------------
+; Data area
.data
spsave: .res 1
vidsave:.res 3
+.bss
+irqcount: .byte 0
+
;
-; Ullrich von Bassewitz, 2003-02-16
+; Ullrich von Bassewitz, 2003-12-27
;
; Additional zero page locations for the CBM510.
;
; ------------------------------------------------------------------------
- .globalzp vic, sid, cia1, cia2, acia, tpi1, tpi2, ktab1
- .globalzp ktab2, ktab3, ktab4, time
+ .globalzp sysp1, sysp3, vic, sid, ipccia, cia1, cia2, acia
+ .globalzp tpi1, tpi2, ktab1, ktab2, ktab3, ktab4
+
+ .globalzp sysp0, time, segsave, ktmp, CURS_X, CURS_Y, CURS_FLAG
+ .globalzp CURS_STATE, CURS_BLINK, CURS_COLOR, CHARCOLOR, RVS
+ .globalzp SCREEN_PTR, CRAM_PTR
+ .globalzp keyidx, keybuf, keyscanbuf, keysave, modkey
+ .globalzp norkey, graphmode, lastidx, rptdelay, rptcount
+
+
.segment "EXTZP" : zeropage
+; The following values get initialized from a table in the startup code.
+; While this sounds crazy, it has reasons that have to do with modules (and
+; we have the space anyway). So when changing anything, be sure to adjust the
+; initializer table
+sysp1: .res 2
+sysp3: .res 2
vic: .res 2
sid: .res 2
cia1: .res 2
ktab2: .res 2
ktab3: .res 2
ktab4: .res 2
-time: .res 4
+
+sysp0: .word $0000
+time: .dword $0000
+segsave: .byte 0
+ktmp: .byte 0
+CURS_X: .byte 0
+CURS_Y: .byte 0
+CURS_FLAG: .byte 0
+CURS_STATE: .byte 0
+CURS_BLINK: .byte 0
+CURS_COLOR: .byte 0
+CHARCOLOR: .byte 0
+RVS: .byte 0
+SCREEN_PTR: .word 0
+CRAM_PTR: .word 0
+; Stuff for our own kbd polling routine
+keyidx: .byte 0 ; Number of keys in keyboard buffer
+keybuf: .res 10 ; Keyboard buffer
+keyscanbuf: .byte 0
+keysave: .byte 0
+modkey: .byte 0
+norkey: .byte 0
+graphmode: .byte 0
+lastidx: .byte 0
+rptdelay: .byte 0
+rptcount: .byte 0
.export _kbhit
.import return0, return1
+ .import keyidx: zp
- .include "cbm510.inc"
.proc _kbhit
- lda KeyIndex ; Get number of characters
+ lda keyidx ; Get number of characters
bne L1
jmp return0
L1: jmp return1
--- /dev/null
+;
+; Ullrich von Bassewitz, 2003-12-21
+;
+; CLOSE kernal call.
+;
+; NOTE: The CLOSE system call in the CBM610 kernal will only remove the file
+; entry and not close the file on IEC if the carry is clear on entry. To make
+; this somewhat compatible with the C64, set the carry before jumping to the
+; kernal.
+
+ .export CLOSE
+
+.proc CLOSE
+
+ sec
+ jmp $FFC3
+
+.endproc
+
+
+
--- /dev/null
+;
+; Ullrich von Bassewitz, 2003-12-20
+;
+; CBM610 kernal functions
+;
+
+ .export CINT
+ .export IOINIT
+ .export RAMTAS
+ .export RESTOR
+ .export VECTOR
+ .export SETMSG
+ .export SECOND
+ .export TKSA
+ .export MEMTOP
+ .export MEMBOT
+ .export SCNKEY
+ .export SETTMO
+ .export ACPTR
+ .export CIOUT
+ .export UNTLK
+ .export UNLSN
+ .export LISTEN
+ .export TALK
+ .export SETLFS
+ .export CHKIN
+ .export CKOUT
+ .export CLRCH
+ .export BASIN
+ .export BSOUT
+ .export LOAD
+ .export SAVE
+ .export STOP
+ .export GETIN
+ .export CLALL
+ .export PLOT
+
+
+;-----------------------------------------------------------------------------
+; All functions are available in the kernal jump table. Functions having
+; replacements (usually short ones where the overhead of the cross bank call
+; is not worth the trouble) are commented out.
+
+CINT = $FF81
+IOINIT = $FF84
+RAMTAS = $FF87
+RESTOR = $FF8A
+VECTOR = $FF8D
+SETMSG = $FF90
+SECOND = $FF93
+TKSA = $FF96
+MEMTOP = $FF99
+MEMBOT = $FF9C
+SCNKEY = $FF9F
+SETTMO = $FFA2
+ACPTR = $FFA5
+CIOUT = $FFA8
+UNTLK = $FFAB
+UNLSN = $FFAE
+LISTEN = $FFB1
+TALK = $FFB4
+;READST = $FFB7
+SETLFS = $FFBA
+;SETNAM = $FFBD
+;OPEN = $FFC0
+;CLOSE = $FFC3
+CHKIN = $FFC6
+CKOUT = $FFC9
+CLRCH = $FFCC
+BASIN = $FFCF
+BSOUT = $FFD2
+LOAD = $FFD5
+SAVE = $FFD8
+;SETTIM = $FFDB
+;RDTIM = $FFDE
+STOP = $FFE1
+GETIN = $FFE4
+CLALL = $FFE7
+;UDTIM = $FFEA
+;SCREEN = $FFED
+PLOT = $FFF0
+;IOBASE = $FFF3
+
--- /dev/null
+;
+; Ullrich von Bassewitz, 2003-12-19
+;
+; IOBASE kernal call
+;
+
+ .export IOBASE
+ .import cia : zeropage
+
+
+
+.proc IOBASE
+
+ ldx cia
+ ldy cia+1
+ rts
+
+.endproc
+
+++ /dev/null
-;
-; Ullrich von Bassewitz, 28.09.1998
-;
-; IRQ routine for the 510.
-;
-
- .export irq, nmi, k_irq, k_nmi
- .import SCNKEY, UDTIM, k_rs232
- .import condes
- .import __IRQFUNC_TABLE__, __IRQFUNC_COUNT__
- .importzp tpi1
-
- .include "cbm510.inc"
-
-
-; -------------------------------------------------------------------------
-; This is the mapping of the active irq register of the 6525 (tpi1):
-;
-; Bit 7 6 5 4 3 2 1 0
-; | | | | ^ 50 Hz
-; | | | ^ SRQ IEEE 488
-; | | ^ cia2
-; | ^ cia1 IRQB ext. Port
-; ^ acia
-
-
-
-; -------------------------------------------------------------------------
-; IRQ entry point
-
-.proc irq
-
- pha
- txa
- pha
- tya
- pha
- tsx
- lda $104,x ; Get the flags from the stack
- and #$10 ; Test break flag
- bne L1
- jmp (IRQVec)
-L1: jmp (BRKVec)
-
-.endproc
-
-; -------------------------------------------------------------------------
-; NMI entry point
-
-.proc nmi
-
- jmp (NMIVec)
-
-.endproc
-
-
-; -------------------------------------------------------------------------
-; Kernal irq entry point. The IRQvec points here (usually).
-
-k_irq:
- lda IndReg ; Ind. Segment retten
- pha
- cld
- lda #$0F
- sta IndReg
- ldy #TPI::AIR
- lda (tpi1),y ; Interrupt Register 6525
- beq noirq
-
-; -------------------------------------------------------------------------
-; 50/60Hz interrupt
-
- cmp #%00000001 ; ticker irq?
- bne irq1
-
-; Call user IRQ handlers if we have any
-
- ldy #<(__IRQFUNC_COUNT__*2)
- beq @L1
- lda #<__IRQFUNC_TABLE__
- ldx #>__IRQFUNC_TABLE__
- jsr condes ; Call the functions
-
-; Call replacement kernal IRQ routines
-
-@L1: jsr SCNKEY ; Poll the keyboard
- jsr UDTIM ; Bump the time
-
-; -------------------------------------------------------------------------
-; UART interrupt
-
-irq1: cmp #%00010000 ; interrupt from uart?
- bne irqend
- jsr k_rs232 ; Read character from uart
-
-; -------------------------------------------------------------------------
-; Done
-
-irqend: ldy #TPI::AIR
- sta (tpi1),y ; Clear interrupt
-
-noirq: pla
- sta IndReg
- pla
- tay
- pla
- tax
- pla
-k_nmi: rti
-
-
--- /dev/null
+;
+; Ullrich von Bassewitz, 2003-12-20
+;
+; OPEN kernal call.
+;
+; NOTE: The OPEN system call in the CBM610 kernal is different from the
+; standard. It evaluates the carry flag and does a normal open if carry clear
+; and some strange things (output sa 15 + name on IEC) if carry set. To be
+; compatible with our CBM file stuff, we have to clear the carry before
+; calling the real OPEN.
+
+ .export OPEN
+
+.proc OPEN
+
+ clc
+ jmp $FFC0
+
+.endproc
+
+
+
+++ /dev/null
-;
-; Ullrich von Bassewitz, 13.09.2001
-;
-; PLOT routine for the 510.
-;
-
- .export PLOT
- .import __VIDRAM_START__
- .importzp crtc
-
- .include "cbm510.inc"
-
- .macpack generic
-
-; ------------------------------------------------------------------------
-;
-
-.proc PLOT
-
- bcs get
-
- stx CURS_Y
- sty CURS_X
-
- lda LineLSBTab,x
- sta SCREEN_PTR
- sta CRAM_PTR
- lda LineMSBTab,x
- sta SCREEN_PTR+1
- sub #>__VIDRAM_START__
- add #>COLOR_RAM
- sta CRAM_PTR+1
-
-get: ldx CURS_Y
- ldy CURS_X
-
- rts
-
-.endproc
-
-; -------------------------------------------------------------------------
-; Low bytes of the start address of the screen lines
-
-.rodata
-
-.macro LineLoTab
- .repeat 25, I
- .byte <(__VIDRAM_START__ + I * 40)
- .endrep
-.endmacro
-
-LineLSBTab: LineLoTab
-
-; -------------------------------------------------------------------------
-; High bytes of the start address of the screen lines
-
-.macro LineHiTab
- .repeat 25, I
- .byte >(__VIDRAM_START__ + I * 40)
- .endrep
-.endmacro
-
-LineMSBTab: LineHiTab
-
-
-
--- /dev/null
+;
+; Ullrich von Bassewitz, 2003-12-19
+;
+; READST kernal call
+;
+
+ .export READST
+
+ .import sys_bank, restore_bank
+ .import sysp0: zp, ktmp: zp
+
+ .include "cbm510.inc"
+
+
+.proc READST
+
+ jsr sys_bank
+ sty ktmp ; Save Y register
+ ldy #$9C ; STATUS
+ lda (sysp0),y ; Load STATUS from system bank
+ ldy ktmp
+ jmp restore_bank ; Will set condition codes on A
+
+.endproc
+
+
; Keyboard polling stuff for the 510.
;
- .export SCNKEY
+ .export scnkey
.importzp tpi2, ktab1, ktab2, ktab3, ktab4
+ .importzp keyidx, keybuf, keyscanbuf, keysave, modkey, norkey
+ .importzp graphmode, lastidx, rptdelay, rptcount
.include "cbm510.inc"
-.proc SCNKEY
+.proc scnkey
lda #$FF
- sta ModKey
- sta NorKey
+ sta modkey
+ sta norkey
lda #$00
- sta KbdScanBuf
+ sta keyscanbuf
ldy #TPI::PRB
sta (tpi2),y
ldy #TPI::PRA
sta (tpi2),y
jsr Poll
pha
- sta ModKey
+ sta modkey
ora #$30
bne L3 ; Branch always
ldy #$00
L4: lsr a
bcc L5
- inc KbdScanBuf
+ inc keyscanbuf
dex
bpl L4
sec
- ldy TPI::PRB
+ ldy #TPI::PRB
lda (tpi2),y
rol a
sta (tpi2),y
pla
bcc NoKey ; Branch always
-L5: ldy KbdScanBuf
- sty NorKey
+L5: ldy keyscanbuf
+ sty norkey
pla
asl a
asl a
bcc L6
bmi L7
lda (ktab2),y ; Shifted normal key
- ldx GrafMode
+ ldx graphmode
beq L8
lda (ktab3),y ; Shifted key in graph mode
bne L8
L8: tax
cpx #$FF ; Valid key?
beq Done
- cpy LastIndex
+ cpy lastidx
beq Repeat
ldx #$13
- stx RepeatDelay
- ldx KeyIndex
+ stx rptdelay
+ ldx keyidx
cpx #$09
beq NoKey
cpy #$59
bne PutKey
cpx #$08
beq NoKey
- sta KeyBuf,x
+ sta keybuf,x
inx
bne PutKey
NoKey: ldy #$FF
-Done: sty LastIndex
+Done: sty lastidx
End: lda #$7F
ldy #TPI::PRA
sta (tpi2),y
sta (tpi2),y
rts
-Repeat: dec RepeatDelay
+Repeat: dec rptdelay
bpl End
- inc RepeatDelay
- dec RepeatCount
+ inc rptdelay
+ dec rptcount
bpl End
- inc RepeatCount
- ldx KeyIndex
+ inc rptcount
+ ldx keyidx
bne End
-PutKey: sta KeyBuf,x
+PutKey: sta keybuf,x
inx
- stx KeyIndex
+ stx keyidx
ldx #$03
- stx RepeatCount
+ stx rptcount
bne Done
.endproc
; Poll the keyboard port until it's stable
.proc Poll
- ldy TPI::PRC
+ ldy #TPI::PRC
L1: lda (tpi2),y
- sta KeySave
+ sta keysave
lda (tpi2),y
- cmp KeySave
+ cmp keysave
bne L1
rts
.endproc
-.bss
-
-KeySave: .res 1
--- /dev/null
+;
+; Ullrich von Bassewitz, 2003-12-18
+;
+; SETNAM kernal call.
+;
+; NOTE: The routine does not work like that in the CBM610 kernal (which works
+; different than that on all other CBMs). Instead, it works like on all other
+; Commodore machines. No segment has to be passed, the current segment is
+; assumed.
+
+ .export SETNAM
+
+ .import sys_bank, restore_bank
+ .import sysp0: zp, ktmp: zp
+
+ .include "cbm510.inc"
+
+.proc SETNAM
+
+ pha
+ jsr sys_bank
+ sty ktmp
+
+ txa
+ ldy #$90 ; FNAM
+ sta (sysp0),y
+
+ lda ktmp
+ iny
+ sta (sysp0),y
+
+ lda ExecReg ; Assume name is always in this segment
+ ldy #$92 ; FNAM_SEG
+ sta (sysp0),y
+
+ ldy #$9D ; FNAM_LEN
+ pla
+ sta (sysp0),y
+ ldy ktmp
+ jmp restore_bank
+
+.endproc
+
+
+
;
-; Ullrich von Bassewitz, 13.09.2001
+; Ullrich von Bassewitz, 2003-12-21
;
-; udtim routine for the 510. We will not check for the stop key here, since
+; udtim routine for the 610. We will not check for the stop key here, since
; C programs will not use it.
-;
-
- .export UDTIM
- .importzp time
+;
+ .export UDTIM
+ .import time: zp
.proc UDTIM
.endproc
-
-
;
.export _revers
+ .import RVS: zp
- .include "cbm510.inc"
.proc _revers