From: cuz Date: Sat, 27 Dec 2003 16:11:14 +0000 (+0000) Subject: More cbm510 changes to make file I/O and kernal access work X-Git-Tag: V2.12.0~971 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=dada43f570b54330ac99179452ef0dba77b9a03a;p=cc65 More cbm510 changes to make file I/O and kernal access work git-svn-id: svn://svn.cc65.org/cc65/trunk@2846 b7a2c559-68d2-44c3-8de9-860c34a00d81 --- diff --git a/libsrc/Makefile b/libsrc/Makefile index 71a19a899..dfd659e88 100644 --- a/libsrc/Makefile +++ b/libsrc/Makefile @@ -157,7 +157,7 @@ cbm510lib: 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 #----------------------------------------------------------------------------- diff --git a/libsrc/cbm510/Makefile b/libsrc/cbm510/Makefile index 27c0966c0..e1f6c43e0 100644 --- a/libsrc/cbm510/Makefile +++ b/libsrc/cbm510/Makefile @@ -42,14 +42,17 @@ OBJS = _scrsize.o \ 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 \ diff --git a/libsrc/cbm510/_scrsize.s b/libsrc/cbm510/_scrsize.s index 99a758455..b97c3d226 100644 --- a/libsrc/cbm510/_scrsize.s +++ b/libsrc/cbm510/_scrsize.s @@ -1,19 +1,12 @@ ; -; 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 diff --git a/libsrc/cbm510/banking.s b/libsrc/cbm510/banking.s index 77686a307..385f5d5c8 100644 --- a/libsrc/cbm510/banking.s +++ b/libsrc/cbm510/banking.s @@ -1,20 +1,20 @@ ; -; 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 @@ -24,7 +24,7 @@ .proc set_bank pha lda IndReg - sta IndSegSave + sta segsave pla sta IndReg rts @@ -32,7 +32,7 @@ .proc restore_bank pha - lda IndSegSave + lda segsave sta IndReg pla rts diff --git a/libsrc/cbm510/break.s b/libsrc/cbm510/break.s index 3f14b4499..2c23e77ed 100644 --- a/libsrc/cbm510/break.s +++ b/libsrc/cbm510/break.s @@ -7,9 +7,9 @@ .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 @@ -74,6 +74,8 @@ L1: lda #__BSS_RUN__ + lda #>__BSS_RUN__ sta ptr1+1 - lda #0 - tay + lda #0 + tay ; Clear full pages @@ -163,7 +261,7 @@ Z1: sta (ptr1),y iny bne Z1 inc ptr1+1 ; Next page - dex + dex bne Z1 ; Clear the remaining page @@ -174,34 +272,17 @@ Z3: sta (ptr1),y 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 @@ -213,7 +294,7 @@ Z4: 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 @@ -225,7 +306,7 @@ ccopy2: lda __VIDRAM_START__,y iny bne ccopy2 inc ptr1+1 - inc ptr2+1 ; Bump high pointer bytes + inc ptr2+1 ; Bump high pointer bytes dec tmp1 bne ccopy @@ -278,96 +359,11 @@ ccopy2: lda __VIDRAM_START__,y 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 @@ -377,14 +373,17 @@ Start: 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 @@ -400,102 +399,128 @@ _exit: jsr donelib ; Run module destructors 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 + diff --git a/libsrc/cbm510/extzp.inc b/libsrc/cbm510/extzp.inc index 2352224ca..be0cba71f 100644 --- a/libsrc/cbm510/extzp.inc +++ b/libsrc/cbm510/extzp.inc @@ -1,11 +1,19 @@ ; -; 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 + + diff --git a/libsrc/cbm510/extzp.s b/libsrc/cbm510/extzp.s index 986871975..8402a00a8 100644 --- a/libsrc/cbm510/extzp.s +++ b/libsrc/cbm510/extzp.s @@ -13,6 +13,12 @@ .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 @@ -24,5 +30,30 @@ ktab1: .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 diff --git a/libsrc/cbm510/kbhit.s b/libsrc/cbm510/kbhit.s index 9e2b3f6f1..b9f32ed0a 100644 --- a/libsrc/cbm510/kbhit.s +++ b/libsrc/cbm510/kbhit.s @@ -6,11 +6,11 @@ .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 diff --git a/libsrc/cbm510/kclose.s b/libsrc/cbm510/kclose.s new file mode 100644 index 000000000..a262313e9 --- /dev/null +++ b/libsrc/cbm510/kclose.s @@ -0,0 +1,21 @@ +; +; 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 + + + diff --git a/libsrc/cbm510/kernal.s b/libsrc/cbm510/kernal.s new file mode 100644 index 000000000..db9d852eb --- /dev/null +++ b/libsrc/cbm510/kernal.s @@ -0,0 +1,83 @@ +; +; 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 + diff --git a/libsrc/cbm510/kiobase.s b/libsrc/cbm510/kiobase.s new file mode 100644 index 000000000..1f21f0249 --- /dev/null +++ b/libsrc/cbm510/kiobase.s @@ -0,0 +1,19 @@ +; +; Ullrich von Bassewitz, 2003-12-19 +; +; IOBASE kernal call +; + + .export IOBASE + .import cia : zeropage + + + +.proc IOBASE + + ldx cia + ldy cia+1 + rts + +.endproc + diff --git a/libsrc/cbm510/kirq.s b/libsrc/cbm510/kirq.s deleted file mode 100644 index dc63ee3c0..000000000 --- a/libsrc/cbm510/kirq.s +++ /dev/null @@ -1,111 +0,0 @@ -; -; 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 - - diff --git a/libsrc/cbm510/kopen.s b/libsrc/cbm510/kopen.s new file mode 100644 index 000000000..025922320 --- /dev/null +++ b/libsrc/cbm510/kopen.s @@ -0,0 +1,22 @@ +; +; 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 + + + diff --git a/libsrc/cbm510/kplot.s b/libsrc/cbm510/kplot.s deleted file mode 100644 index c5f52f85b..000000000 --- a/libsrc/cbm510/kplot.s +++ /dev/null @@ -1,66 +0,0 @@ -; -; 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 - - - diff --git a/libsrc/cbm510/kreadst.s b/libsrc/cbm510/kreadst.s new file mode 100644 index 000000000..66c0b880f --- /dev/null +++ b/libsrc/cbm510/kreadst.s @@ -0,0 +1,26 @@ +; +; 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 + + diff --git a/libsrc/cbm510/kscnkey.s b/libsrc/cbm510/kscnkey.s index af4edadc6..3413c6b80 100644 --- a/libsrc/cbm510/kscnkey.s +++ b/libsrc/cbm510/kscnkey.s @@ -4,19 +4,21 @@ ; 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 @@ -35,7 +37,7 @@ L1: lda #$FF sta (tpi2),y jsr Poll pha - sta ModKey + sta modkey ora #$30 bne L3 ; Branch always @@ -44,11 +46,11 @@ L3: ldx #$05 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 @@ -60,8 +62,8 @@ L4: lsr a pla bcc NoKey ; Branch always -L5: ldy KbdScanBuf - sty NorKey +L5: ldy keyscanbuf + sty norkey pla asl a asl a @@ -69,7 +71,7 @@ L5: ldy KbdScanBuf 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 @@ -80,23 +82,23 @@ L7: lda (ktab1),y ; Normal key 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 @@ -105,20 +107,20 @@ End: lda #$7F 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 @@ -127,18 +129,15 @@ PutKey: sta KeyBuf,x ; 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 diff --git a/libsrc/cbm510/ksetnam.s b/libsrc/cbm510/ksetnam.s new file mode 100644 index 000000000..8de8f1c49 --- /dev/null +++ b/libsrc/cbm510/ksetnam.s @@ -0,0 +1,45 @@ +; +; 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 + + + diff --git a/libsrc/cbm510/kudtim.s b/libsrc/cbm510/kudtim.s index 54d6eb26e..4653d8148 100644 --- a/libsrc/cbm510/kudtim.s +++ b/libsrc/cbm510/kudtim.s @@ -1,13 +1,12 @@ ; -; 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 @@ -22,5 +21,3 @@ L9: rts .endproc - - diff --git a/libsrc/cbm510/revers.s b/libsrc/cbm510/revers.s index 47ed9ae7a..3d21c9771 100644 --- a/libsrc/cbm510/revers.s +++ b/libsrc/cbm510/revers.s @@ -5,8 +5,8 @@ ; .export _revers + .import RVS: zp - .include "cbm510.inc" .proc _revers