!src "../include/gmod3.inc" !cpu 6502 *= $0801 !byte $0b,$08 ;link to next line !byte $40,$03 ;line-number !byte $9e,$32,$30,$36,$31 ;"SYS 2061" !byte 0 ;end of line !byte 0,0 ;null-link, no more lines following jmp start !src "../lib/gmod3.asm" ;------------------------------------------------------------------------------- start: sei ; init RAM lda #$34 sta $01 lda #$01 ldx #0 - sta $0002,x sta $1000,x sta $2000,x sta $3000,x sta $4000,x sta $5000,x sta $6000,x sta $7000,x sta $8000,x sta $9000,x sta $a000,x sta $b000,x sta $c000,x sta $d000,x sta $e000,x sta $f000,x sta $ff00,x dex bne - lda #$37 sta $01 ; clear screen ldx #0 - lda #$20 sta $0400,x sta $0500,x sta $0600,x sta $0700,x lda #$01 sta $d800,x sta $d900,x sta $da00,x sta $db00,x inx bne - ; I/O lda #$10 ldx #15 - sta $d000,x dex bpl - ; screen at fc00 ldx #0 - txa sta $fc00 + (21*40),x sta $fc00 + (22*40),x sta $fc00 + (23*40),x sta $fc00 + (24*40),x inx cpx #40 bne - ; charset at f800 ldy #0 ldx #0 - sta $f800,x sta $f801,x sta $f802,x sta $f803,x sta $f804,x sta $f805,x sta $f806,x sta $f807,x iny txa clc adc #8 tax bne - lda #$7f sta $dc0d lda $dc0d lda #$2e sta $d012 lda #$1b sta $d011 ; set up irq vectors lda #>kernalirq sta $0315 lda #hwirq sta $ffff sta ghostbyte lda #cartirq sta $000e lda #$7f sta $dd0d lda $dd0d lda #0 sta $dd0e ; set up nmi vectors lda #>kernalnmi sta $0319 lda #hwnmi sta $fffb lda #cartnmi sta $000a - bit $d011 bpl - - bit $d011 bmi - lda #$20 - cmp $d012 bne - lda #>((63*312)-1) sta $dd05 lda #<((63*312)-1) sta $dd04 lda #%00010001 sta $dd0e lda #$81 sta $dd0d lda $dd0d inc $d019 lda #$01 sta $d01a cli ;------------------------------------------------------------------------------- mainlp: lda #%01111111 sta $dc00 lda $dc01 cmp #%10111111 ; Q bne ++ inc banklo bne + inc bankhi + ++ lda #%11111101 sta $dc00 lda $dc01 cmp #%11111101 ; W bne ++ lda banklo sec sbc #1 sta banklo bcs + dec bankhi + ++ lda #%11111101 sta $dc00 lda $dc01 cmp #%10111111 ; E bne + lda control eor #GMOD3_CTRL_BITBANG_ENABLED sta control + lda #%11111011 sta $dc00 lda $dc01 cmp #%11111101 ; R bne + lda control eor #GMOD3_CTRL_EXROM sta control + lda #%11111011 sta $dc00 lda $dc01 cmp #%10111111 ; T bne + lda control eor #GMOD3_CTRL_VECTORS sta control + lda #%11111101 sta $dc00 lda $dc01 cmp #%11111011 ; A bne + inc cpuport + lda #%11111101 sta $dc00 lda $dc01 cmp #%11011111 ; S bne + dec cpuport + lda #%11111011 sta $dc00 lda $dc01 cmp #%11111011 ; D bne + lda bankhi asl ; bit 7 to C rol banklo rol bankhi + bankhi=*+1 lda #$00 ; upper 3 bits of the bank number and #7 tax banklo=*+1 lda #$00 ; lower 8 bits of the bank number sta GMOD3_BANK0,x control=*+1 lda #0 sta GMOD3_CTRL ; protip: we can not put random values here when we want to use the IRQ vector in RAM :) ghostbyte=*+1 lda #%11001100 sta $ffff ldx #>$0400 lda #<$0400 jsr setaddr lda bankhi jsr puthex lda banklo jsr puthex lda control jsr puthex lda ghostbyte jsr puthex lda cpuport and #7 ora #$30 jsr puthex ldx #>($0400+(1*40)) lda #<($0400+(1*40)) jsr setaddr lda GMOD3_BANKHI_R jsr puthex lda GMOD3_BANKLO_R jsr puthex cpuport=*+1 lda #$07 and #$07 ora #$30 sta $01 ldx #>($0400+(3*40)) lda #<($0400+(3*40)) jsr setaddr lda #$00 jsr puthexline lda #$10 jsr puthexline lda #$20 jsr puthexline lda #$30 jsr puthexline lda #$40 jsr puthexline lda #$50 jsr puthexline lda #$60 jsr puthexline lda #$70 jsr puthexline lda #$80 jsr puthexline lda #$90 jsr puthexline lda #$a0 jsr puthexline lda #$b0 jsr puthexline lda #$c0 jsr puthexline lda #$d0 jsr puthexline lda #$e0 jsr puthexline lda #$f0 jsr puthexline lda #$ff jsr puthex ldx #0 - lda $fff8,x jsr puthex inx cpx #8 bne - lda #$37 sta $01 lda #%00000000 sta $dc00 - lda $dc01 cmp #%11111111 bne - - jsr showgfx lda $dc01 cmp #%11111111 beq - jmp mainlp ;------------------------------------------------------------------------------- showgfx: lda #$d6 - cmp $d012 bne - inc $d020 lda #0 sta $dd00 lda #$ff ; charset $f800, screen $fc00 sta $d018 lda #$f9 - cmp $d012 bne - lda $d011 and #$f7 sta $d011 lda #$fd - cmp $d012 bne - lda $d011 ora #8 sta $d011 lda #0 sta framecounter - bit $d011 bpl - - bit $d011 bmi - lda #3 sta $dd00 lda #$15 sta $d018 dec $d020 ; irq will trigger around here lda cpuport and #$07 ora #$30 sta $01 - lda framecounter beq - lda #$37 sta $01 rts ;------------------------------------------------------------------------------- hwirq: ; entry point via fffe/f vector pha txa pha tya pha lda $01 pha lda #$35 sta $01 lda #10 sta $d020 ldx #0 - inx bne - lda #14 sta $d020 inc framecounter inc $d019 pla sta $01 pla tay pla tax pla rti kernalirq: ; entry point via 0314/5 vector lda $01 pha lda #$35 sta $01 lda #7 sta $d020 ldx #0 - inx bne - lda #14 sta $d020 inc framecounter inc $d019 pla sta $01 pla tay pla tax pla rti cartirq: ; via zeropage vector pha txa pha tya pha lda $01 pha lda #$35 sta $01 lda #13 sta $d020 ldx #0 - inx bne - lda #14 sta $d020 inc framecounter inc $d019 pla sta $01 pla tay pla tax pla rti framecounter: !byte 0 ;------------------------------------------------------------------------------- hwnmi: ; entry point via fffa/b vector pha txa pha tya pha lda $01 pha lda #$35 sta $01 lda #2 sta $d020 ldx #0 - inx bne - lda #14 sta $d020 lda $dd0d pla sta $01 pla tay pla tax pla rti kernalnmi: ; entry point via 0318/9 vector pha txa pha tya pha lda $01 pha lda #$35 sta $01 lda #8 sta $d020 ldx #0 - inx bne - lda #14 sta $d020 lda $dd0d pla sta $01 pla tay pla tax pla rti cartnmi: ; via zeropage vector pha txa pha tya pha lda $01 pha lda #$35 sta $01 lda #5 sta $d020 ldx #0 - inx bne - lda #14 sta $d020 lda $dd0d pla sta $01 pla tay pla tax pla rti ;------------------------------------------------------------------------------- setaddr: stx scraddr1+1 stx scraddr2+1 sta scraddr1 sta scraddr2 inc scraddr2 bne + inc scraddr2+1 + rts puthexline: sta hexlineaddr jsr puthex ldx #0 hexlineaddr=*+2 - lda $f000,x jsr puthex inx cpx #10 bne - lda scraddr1 clc adc #40-(3*11) sta scraddr1 bcc + inc scraddr1+1 + lda scraddr2 clc adc #40-(3*11) sta scraddr2 bcc + inc scraddr2+1 + rts ;------------------------------------------------------------------------------- puthex: pha lsr lsr lsr lsr tay lda hexdigits,y scraddr1=*+1 sta $0400 pla and #$0f tay lda hexdigits,y scraddr2=*+1 sta $0401 lda scraddr1 clc adc #3 sta scraddr1 bcc + inc scraddr1+1 + lda scraddr2 clc adc #3 sta scraddr2 bcc + inc scraddr2+1 + rts ;------------------------------------------------------------------------------- hexdigits: !scr "0123456789abcdef"