diff --git a/platform/c64/c64_0.oph b/platform/c64/c64_0.oph new file mode 100644 index 0000000..7b64a59 --- /dev/null +++ b/platform/c64/c64_0.oph @@ -0,0 +1,60 @@ +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Commodore 64 Basic Runtime File +;; +;; Include this at the TOP of your C64 program, and it will handle +;; hiding away the BASIC ROM and data and restoring it at the end. +;; +;; You will have a contiguous block of RAM from $0800 to $CF81, and +;; Zero Page access from $02 to $7F in the segment "zp". + +.word $0801 +.org $0801 + +; BASIC program that just calls our machine language code +.scope + .word _next, 10 ; Next line and current line number + .byte $9e," 2062",0 ; SYS 2062 +_next: .word 0 ; End of program +.scend + +.data zp ; Zero Page memory segment. +.org $0002 + +.text + +.scope + ; Cache BASIC zero page at top of available RAM + ldx #$7E +* lda $01, x + sta $CF81, x + dex + bne - + + ; Swap out the BASIC ROM for RAM + lda $01 + and #$fe + ora #$06 + sta $01 + + ; Run the real program + jsr _main + + ; Restore BASIC ROM + lda $01 + ora #$07 + sta $01 + + ; Restore BASIC zero page + ldx #$7E +* lda $CF81, x + sta $01, x + dex + bne - + + ; Back to BASIC + rts + +_main: + ; Program follows... +.scend diff --git a/platform/c64/c64kernal.oph b/platform/c64/c64kernal.oph new file mode 100644 index 0000000..be39cee --- /dev/null +++ b/platform/c64/c64kernal.oph @@ -0,0 +1,67 @@ +; KERNAL routine aliases (C64) + +.alias acptr $ffa5 +.alias chkin $ffc6 +.alias chkout $ffc9 +.alias chrin $ffcf +.alias chrout $ffd2 +.alias ciout $ffa8 +.alias cint $ff81 +.alias clall $ffe7 +.alias close $ffc3 +.alias clrchn $ffcc +.alias getin $ffe4 +.alias iobase $fff3 +.alias ioinit $ff84 +.alias listen $ffb1 +.alias load $ffd5 +.alias membot $ff9c +.alias memtop $ff99 +.alias open $ffc0 +.alias plot $fff0 +.alias ramtas $ff87 +.alias rdtim $ffde +.alias readst $ffb7 +.alias restor $ff8a +.alias save $ffd8 +.alias scnkey $ff9f +.alias screen $ffed +.alias second $ff93 +.alias setlfs $ffba +.alias setmsg $ff90 +.alias setnam $ffbd +.alias settim $ffdb +.alias settmo $ffa2 +.alias stop $ffe1 +.alias talk $ffb4 +.alias tksa $ff96 +.alias udtim $ffea +.alias unlsn $ffae +.alias untlk $ffab +.alias vector $ff8d + +; Character codes for the colors. +.alias color'0 144 +.alias color'1 5 +.alias color'2 28 +.alias color'3 159 +.alias color'4 156 +.alias color'5 30 +.alias color'6 31 +.alias color'7 158 +.alias color'8 129 +.alias color'9 149 +.alias color'10 150 +.alias color'11 151 +.alias color'12 152 +.alias color'13 153 +.alias color'14 154 +.alias color'15 155 + +; ...and reverse video +.alias reverse'on 18 +.alias reverse'off 146 + +; ...and character set +.alias upper'case 142 +.alias lower'case 14 diff --git a/platform/c64/demo/c64_hello.oph b/platform/c64/demo/c64_hello.oph new file mode 100644 index 0000000..4dd0f55 --- /dev/null +++ b/platform/c64/demo/c64_hello.oph @@ -0,0 +1,12 @@ +.include "../c64_0.oph" +.include "../c64kernal.oph" + + ldy #$00 +* lda text, y + beq + + jsr chrout + iny + bne - +* rts + +text: .byte "HELLO, C64 WORLD!", 13, 0 diff --git a/platform/nes/nes.oph b/platform/nes/nes.oph new file mode 100644 index 0000000..e85b13f --- /dev/null +++ b/platform/nes/nes.oph @@ -0,0 +1,15 @@ +; NES-related headers. Unlike the C64 and Stella developers, there is +; no standard nomenclature for these registers. It's not uncommon to +; see them hardcoded. + +; PPU registers have reasonably standard names, at least. + +.alias PPUCTRL $2000 ; PPU Control Register #1 +.alias PPUMASK $2001 ; PPU Control Register #2 +.alias PPUSTATUS $2002 ; PPU Status Register +.alias OAMADDR $2003 ; SPR-RAM Address Register +.alias OAMDATA $2004 ; SPR-RAM I/O Register +.alias PPUSCROLL $2005 ; VRAM Address Register #1 (Panning control) +.alias PPUADDR $2006 ; VRAM Address Register #2 (Direct Address control) +.alias PPUDATA $2007 ; VRAM I/O Register +.alias OAMDMA $4014 ; Sprite DMA Register diff --git a/platform/stella/stella.oph b/platform/stella/stella.oph new file mode 100644 index 0000000..f4492e5 --- /dev/null +++ b/platform/stella/stella.oph @@ -0,0 +1,127 @@ +; Register mnemonics for the Atari 2600 VCS +; +; Taken from the "Stella Programming Guide", at +; http://www.alienbill.com/2600/101/docs/stella.html + +; Writable TIA addresses + +.alias VSYNC $00 ; vertical sync set-clear +.alias VBLANK $01 ; vertical blank set-clear +.alias WSYNC $02 ; wait for leading edge of horizontal blank +.alias RSYNC $03 ; reset horizontal sync counter +.alias NUSIZ0 $04 ; number-size player-missile 0 +.alias NUSIZ1 $05 ; number-size player-missile 1 +.alias COLUP0 $06 ; color-lum player 0 +.alias COLUP1 $07 ; color-lum player 1 +.alias COLUPF $08 ; color-lum playfield +.alias COLUBK $09 ; color-lum background +.alias CTRLPF $0A ; control playfield ball size and collisions +.alias REFP0 $0B ; reflect player 0 +.alias REFP1 $0C ; reflect player 1 +.alias PF0 $0D ; playfield register byte 0 +.alias PF1 $0E ; playfield register byte 1 +.alias PF2 $0F ; playfield register byte 2 +.alias RESP0 $10 ; reset player 0 +.alias RESP1 $11 ; reset player 1 +.alias RESM0 $12 ; reset missile 0 +.alias RESM1 $13 ; reset missile 1 +.alias RESBL $14 ; reset ball +.alias AUDC0 $15 ; audio control 0 +.alias AUDC1 $16 ; audio control 1 +.alias AUDF0 $17 ; audio frequency 0 +.alias AUDF1 $18 ; audio frequency 1 +.alias AUDV0 $19 ; audio volume 0 +.alias AUDV1 $1A ; audio volume 1 +.alias GRP0 $1B ; Graphics player 0 +.alias GRP1 $1C ; Graphics player 1 +.alias ENAM0 $1D ; Graphics enable missile 0 +.alias ENAM1 $1E ; Graphics enable missile 1 +.alias ENABL $1F ; Graphics enable ball +.alias HMP0 $20 ; horizontal motion player 0 +.alias HMP1 $21 ; horizontal motion player 1 +.alias HMM0 $22 ; horizontal motion missile 0 +.alias HMM1 $23 ; horizontal motion missile 1 +.alias HMBL $24 ; horizontal motion ball +.alias VDELP0 $25 ; vertical delay player 0 +.alias VDELP1 $26 ; vertical delay player 1 +.alias VDELBL $27 ; vertical delay ball +.alias RESMP0 $28 ; reset missile 0 to player 0 +.alias RESMP1 $29 ; reset missile 1 to player 1 +.alias HMOVE $2A ; apply horizontal motion +.alias HMCLR $2B ; clear horizontal motion registers +.alias CXCLR $2C ; clear collision latches + +; Readable TIA addresses + +.alias CXM0P $00 ; read collision missile 0 players +.alias CXM1P $01 ; read collision missile 1 players +.alias CXP0FB $02 ; read collision player 0 playfield/ball +.alias CXP1FB $03 ; read collision player 1 playfield/ball +.alias CXM0FB $04 ; read collision missile 0 playfield/ball +.alias CXM1FB $05 ; read collision missile 1 playfield/ball +.alias CXBLPF $06 ; read collision ball playfield +.alias CXPPMM $07 ; read collision player/player missile/missile +.alias INPT0 $08 ; read pot port +.alias INPT1 $09 ; read pot port +.alias INPT2 $0A ; read pot port +.alias INPT3 $0B ; read pot port +.alias INPT4 $0C ; read input +.alias INPT5 $0D ; read input + +; PIA addresses + +.alias SWCHA $280 ; Port A data register (read/write) +.alias SWACNT $281 ; Port A data direction register (0=input, 1=output) +.alias SWCHB $282 ; Port B - console switches (read-only) +.alias SWBCNT $283 ; Port B data direction register (hardwired to 0) +.alias INTIM $284 ; Timer output (read only) +.alias TIM1T $294 ; Set 1-clock interval (838 nsec/interval) +.alias TIM8T $295 ; Set 8-clock interval (6.7 usec/interval) +.alias TIM64T $296 ; Set 64-clock interval (53.6 usec/interval +.alias T1024T $297 ; Set 1025-clock interval (858.2 usec/interval) + +; These macros are adapted from DASM's old macro.h. Credit and description are +; replicated from there. + +;------------------------------------------------------------------------------- +; VERTICAL_SYNC +; Original author: Manuel Polik +; Inserts the code required for a proper 3 scanline +; vertical sync sequence +; +; Note: Alters the accumulator +; +; IN: +; OUT: A = 1 + +.macro vertical'sync + lda #$02 + sta WSYNC + sta VSYNC + sta WSYNC + sta WSYNC + lsr + sta WSYNC + sta VSYNC +.macend + +;------------------------------------------------------------------------------- +; CLEAN_START +; Original author: Andrew Davie +; Standardised start-up code, clears stack, all TIA registers and RAM to 0 +; Sets stack pointer to $FF, and all registers to 0 +; Sets decimal mode off, sets interrupt flag (kind of un-necessary) +; Use as very first section of code on boot (ie: at reset) +; Code written to minimise total ROM usage - uses weird 6502 knowledge :) +.macro clean'start + sei + cld + ldx #$00 + txa + tay +_clear'stack: + dex + txs + pha + bne _clear'stack +.macend