SuperCPU Tutorial Listings - Part 4
Listing 4.1 ; 65816 ; Clear screen using the stack ; Version 1 ; written in 1997 by Malte Mundt ; for GO64! £ba $c000 sei ldx #$00 lda #$00 fill: sta $0400,x ; 5 cycles sta $0500,x ; 5 sta $0600,x ; 5 sta $0700,x ; 5 dex ; 2 bne fill ; 3 ; = 25 total ; 4 bytes are cleared per loop ; 6250 cycles needed cli key: jsr $f13e ; wait for key beq key sei clc ; native xce rep #$30 ; a&x/y to 16 bit £al ; tell assembler £rl tsx ; save old stack stx oldstack ; (16 bit) ldx #$07e7 ; set stackpointer txs ; to screen-end ; lda #$2020 ; spaces clear: pha ; 4 cycles pha ; 4 tsx ; 2 cpx #$0400 ; 3 bcs clear ; 3 ; = 16 total ; 4 bytes per loop ; 4000 cycles ldx oldstack ; reset stack back txs ; to normal sep #$30 ;8 bit £as £rs sec ;emulation xce ;mode cli rts oldstack: £wo $0000
Listing 4.2 ; 65816 ; Clear screen using the stack ; Version 2 ; written in 1997 by Malte Mundt ; for GO64! £ba $c000 sei ldx #$00 lda #$00 fill: sta $0400,x ; 5 cycles sta $0500,x ; 5 sta $0600,x ; 5 sta $0700,x ; 5 dex ; 2 bne fill ; 3 ; = 25 total ; 4 bytes are cleared per loop ; 6250 cycles needed key: jsr $f13e ; wait for key beq key sei clc ; native xce rep #$30 ; a&x/y to 16 bit £al ; tell assembler £rl cli tsc ; save old stack sta oldstack ; using TSC (Stack to Accu) lda #$07e7 ; set stackpointer to tcs ; auf screen-end with TCS (Accu to Stack) ldx #$2020 ; spaces clear: phx ; use x-register this time phx tsc ; Stack to Accu cmp #$0400 ; done? bcs clear ; no, continue lda oldstack ; reset old stackpointer tcs ; Accu to Stack sep #$30 ;8 bit £as £rs sec ;emulation xce ;mode cli rts oldstack: £wo $0000
Listing 4.3 ; 65816 ; 16 Bit Examples ; written in 1997 by Malte Mundt ; for GO64! £ba $c000 sei clc ; clear carry xce ; native mode rep #%00110000 ; a,x,y 16 bit £al ; tell assembler £rl ldx #$5000 label: inx bpl label ; Loops to label: until x has reached ; $8000 (last POSITIVE value is $7fff) inc testvalue1 ; after that inc, testvalue1=$00, ; testvalue1+1 = $01 asl testwert2 ; after that asl, testvalue2 contains ; %00000000, testvalue2+1 contains ; %00000001 - the 7.bit moved to bit 8 lda #$1000 sta $fc ; after that sta, $fc conatins $00, ; $fd contains $10 lda #$0102 sta $d020 ; this sta sets the border to white and the ; background to red lda #$2121 sta $0400 ; 2 '!' pop up at the upper left screen lda $d800 ora #%1111111111111111 sta $d800 ; both chars get colored light grey sec xce cli rts testvalue1: £by $ff £by $00 testvalue2: £by %10000000 £by %00000000
Listing 4.4 ; 65816 ; Move Zeropage somewhere else - Version 1 ; Comment: The Zeropage on SCPU related documents ; often is called Direct Page aswell. ; written in 1997 by Malte Mundt ; for GO64! £ba $c000 sei clc ; native xce lda #$74 ; new zp to $7000 pha ; push highbyte to stack lda #$00 ; lowbyte pha ; to stack pld ; pull stack to direct page register ; from now on the 0-page resides from $7400 - $7500 ldx #$00 lda #$21 fill: sta $00,x ; fill new 'zero'-page inx bne fill ; $7400-$7500 will be filled now and the complete ; old zeropage will stay intact ! ; possible ideas for using such stuff as mentioned in ; the tutorial: music players with own zeropage ; and other critical timing stuff. ; Remember: Put you zeropage to a bitmap or color-ram and ; write to it very fast using 2 cycle commands :) lda #$00; load zero pha ; push to stack as pha ; high and low byte pld ; revive original zeropage :) ; Direct Page Register now has $0000 and sets up the ; Zeropage from $0000 - $0100 sec xce cli rts ; Final comment: Try to keep the Low Byte ; of your new Direct Pages $00. ; else the processor will slow down again, ; coz it has to calc to get the right ; address.
Listing 4.5 ; 65816 ; Move Zeropage somewhere else ; Version 2 ; written in 1997 by Malte Mundt ; for GO64! £ba $c000 sei clc ; native xce rep #%00100000 ; accu 16 bit £al ; tell assembler lda #$7400 ; new ZP-Location tcd ; to direct page register ; zeropage now is at $7400-$7500 sep #%00100000 ; akku 8 bit £as ; tell ass ldx #$00 lda #$21 fill: sta $00,x ; fill 'zero'-page inx bne fill ; only $7400-$7500 will get filled rep #%00100000 ; accu 16 bit £al lda #$0000 ; load adress $0000 tcd ; restore original ZP ; $0000-$0100 is now the direct page again sep #%00100000 £as sec xce ; emulation mode cli rts
Assembler Code © by Malte Mundt
Partial translation and cosmetical changes by Count Zero/SCS*TRC
[ Listings Part 3 ][
Tutorial Part 4 ][ Index ][ Listings
Part 5 ]