238 lines
6.9 KiB
NASM
238 lines
6.9 KiB
NASM
C8RAMSIZE = 4096
|
|
.virtual $2000
|
|
C8RAM .fill C8START
|
|
C8ENTRY .fill C8RAMSIZE - C8START
|
|
c8ramend = *-1
|
|
.endvirtual
|
|
|
|
IS_PET = true
|
|
|
|
ZP_START = $54
|
|
|
|
.BasicStub MainEntry, 2021
|
|
|
|
.section code
|
|
|
|
MainEntry .proc
|
|
;lda #EF_REGS
|
|
lda #0
|
|
sta eflags
|
|
|
|
jsr InitRandom
|
|
jsr ClearScreen
|
|
jsr ShowTitle
|
|
jsr C8Reset
|
|
jsr SoundInit
|
|
jsr SetupIRQ
|
|
jsr C8Run
|
|
rts
|
|
.endproc
|
|
|
|
NOKEY = 255
|
|
|
|
SetupIRQ .proc
|
|
lda #NOKEY
|
|
sta prevkey
|
|
sei
|
|
lda CINV
|
|
sta sysirq
|
|
lda CINV+1
|
|
sta sysirq+1
|
|
lda #<handler
|
|
sta CINV
|
|
lda #>handler
|
|
sta CINV+1
|
|
cli
|
|
rts
|
|
handler
|
|
lda LSTX
|
|
tax
|
|
cmp prevkey
|
|
beq dotick
|
|
cmp #20 ; backspace: reset
|
|
bne +
|
|
lda #EF_RESET
|
|
ora eflags
|
|
sta eflags
|
|
jmp done
|
|
+ txa
|
|
cmp #'p' ; P: Pause
|
|
bne +
|
|
lda #EF_PAUSE
|
|
eor eflags
|
|
sta eflags
|
|
jmp done
|
|
+ txa
|
|
cmp #'=' ; =: Registers
|
|
bne +
|
|
lda #EF_REGS
|
|
eor eflags
|
|
sta eflags
|
|
jmp done
|
|
+ txa
|
|
cmp #'/' ; /: Shift behaviour
|
|
bne +
|
|
lda #EF_SHIFTX
|
|
eor eflags
|
|
sta eflags
|
|
jmp done
|
|
+ txa
|
|
cmp #'l' ; L: Load
|
|
bne +
|
|
lda #EF_LOAD
|
|
ora eflags
|
|
sta eflags
|
|
jmp done
|
|
+
|
|
done stx prevkey
|
|
dotick jsr Tick
|
|
jmp (sysirq)
|
|
|
|
.section bss
|
|
sysirq .word ?
|
|
prevkey .byte ?
|
|
.endsection bss
|
|
|
|
.endproc
|
|
|
|
RestoreIRQ .proc
|
|
sei
|
|
lda SetupIRQ.sysirq
|
|
sta CINV
|
|
lda SetupIRQ.sysirq+1
|
|
sta CINV+1
|
|
cli
|
|
rts
|
|
.endproc
|
|
|
|
InitRandom .proc
|
|
ldx #0
|
|
- lda TIME, x
|
|
sta rngst, x
|
|
inx
|
|
cpx #3
|
|
bne -
|
|
;lda io.vic2.raster
|
|
;sta rngst+3
|
|
rts
|
|
.endproc
|
|
|
|
ClearScreen .proc
|
|
lda #'{clear}'
|
|
jsr CHROUT
|
|
rts
|
|
.endproc
|
|
|
|
ReadKeyboard .proc
|
|
lda LSTX
|
|
cmp #NOKEY
|
|
bne +
|
|
nokey
|
|
lda #$ff
|
|
rts
|
|
|
|
+ ldy #0
|
|
- cmp kbdcodes, y
|
|
beq +
|
|
cpy #size(kbdcodes)
|
|
beq nokey
|
|
iny
|
|
bne -
|
|
+ tya
|
|
rts
|
|
.endproc
|
|
|
|
GetVBlank .proc
|
|
; Clear carry flag if retracing
|
|
; FIXME
|
|
clc
|
|
rts
|
|
|
|
lda #io.CRTC_VBLANK
|
|
bit io.crtc.ctrl
|
|
bne +
|
|
sec
|
|
rts
|
|
+ clc
|
|
rts
|
|
.endproc
|
|
|
|
SoundInit .proc
|
|
lda #io.VIA_SR_OUT_T2_FR
|
|
sta io.via.acr
|
|
lda #0
|
|
sta io.via.t2c
|
|
lda #22
|
|
sta io.via.sr
|
|
rts
|
|
.endproc
|
|
|
|
SoundOn .proc
|
|
lda #211
|
|
sta io.via.t2c
|
|
rts
|
|
.endproc
|
|
|
|
SoundOff .proc
|
|
lda #0
|
|
sta io.via.t2c
|
|
rts
|
|
.endproc
|
|
|
|
|
|
InputFileName .proc
|
|
jsr RestoreIRQ
|
|
ldy #0
|
|
sty ch8filenamelen
|
|
sty NDX
|
|
lda #'{home}'
|
|
jsr CHROUT
|
|
ldx #ROW_FILENAME
|
|
lda #'{down}'
|
|
- jsr CHROUT
|
|
dex
|
|
bne -
|
|
ldx #ROW_FILENAME
|
|
ldy #0
|
|
jsr myPLOT
|
|
lda #<prompt
|
|
ldy #>prompt
|
|
jsr mySTROUT
|
|
lda #ROW_FILENAME
|
|
sta TBLX
|
|
lda #size(prompt)
|
|
sta PNTR
|
|
jsr $e07f
|
|
ldy #0
|
|
- lda #0
|
|
sta ch8filename, y
|
|
jsr CHRIN
|
|
cmp #13
|
|
beq +
|
|
sta ch8filename, y
|
|
iny
|
|
jmp -
|
|
+ sty ch8filenamelen
|
|
ldx #ROW_FILENAME
|
|
jsr ClearLine
|
|
jsr SetupIRQ
|
|
rts
|
|
|
|
.section data
|
|
.enc "screen"
|
|
prompt .null "file name: "
|
|
.enc "none"
|
|
.endsection data
|
|
.endproc
|
|
|
|
|
|
|
|
.endsection code
|
|
|
|
.section data
|
|
; kbdcodes .byte 56, 59, 8, 11, 62, 9, 14, 17, 10, 13, 18, 21, 12, 23, 20, 31
|
|
kbdcodes .text "1234qwerasdfzxcv"
|
|
.endsection data
|
|
|
|
; vim: syntax=64tass
|