diff --git a/colourgo.xcodeproj/project.pbxproj b/colourgo.xcodeproj/project.pbxproj index 164af2f..f02c65c 100644 --- a/colourgo.xcodeproj/project.pbxproj +++ b/colourgo.xcodeproj/project.pbxproj @@ -19,6 +19,10 @@ 9DFD77D31F1F9C2500639A48 /* V2Make.scpt */ = {isa = PBXFileReference; lastKnownFileType = file; name = V2Make.scpt; path = make/V2Make.scpt; sourceTree = ""; }; 9DFD77D91F1FA47900639A48 /* main.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = main.c; sourceTree = ""; }; 9DFD77DB1F1FA4A400639A48 /* game.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = game.h; sourceTree = ""; }; + 9DFD77DC1F1FB69600639A48 /* vbl.s */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.asm; path = vbl.s; sourceTree = ""; }; + 9DFD77DD1F1FB69600639A48 /* vbl.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = vbl.h; sourceTree = ""; }; + 9DFD77DE1F1FB69600639A48 /* machine.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = machine.c; sourceTree = ""; }; + 9DFD77DF1F1FB69600639A48 /* machine.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = machine.h; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXGroup section */ @@ -35,6 +39,10 @@ 9DFD77C91F1F9C2500639A48 /* game.s */, 9DFD77DB1F1FA4A400639A48 /* game.h */, 9DFD77D91F1FA47900639A48 /* main.c */, + 9DFD77DC1F1FB69600639A48 /* vbl.s */, + 9DFD77DD1F1FB69600639A48 /* vbl.h */, + 9DFD77DE1F1FB69600639A48 /* machine.c */, + 9DFD77DF1F1FB69600639A48 /* machine.h */, 9DFD77CA1F1F9C2500639A48 /* Makefile */, 9DFD77CB1F1F9C2500639A48 /* make */, ); diff --git a/colourgo/game.s b/colourgo/game.s index 3fdbda6..6292bb3 100644 --- a/colourgo/game.s +++ b/colourgo/game.s @@ -9,6 +9,8 @@ .export _game + .import _vblWait + .include "apple2.inc" @@ -218,27 +220,102 @@ LINE191 = LINE190 + 1024 .CODE -_game: +.proc _game ; Set up hires screen - jsr clearScreen lda TXTCLR lda MIXCLR lda HIRES lda LOWSCR - -wait: + + ldy #150 + jsr drawLine + ldy #155 + jsr drawLine + + ldx #0 +@L1: + jsr _vblWait + ldy #151 + jsr drawGrid + ldy #152 + jsr drawGrid + ldy #153 + jsr drawGrid + ldy #154 + jsr drawGrid + inx + cpx #7 + bne @L2 + ldx #0 + +@L2: lda KEYBOARD - bpl wait + bpl @L1 lda STROBE lda TXTSET rts -clearScreen: +.endproc + + +.proc drawLine + lda loAddrs,y + sta ZPADDR + lda page1HiAddrs,y + sta ZPADDR+1 + + ldy #0 +@L1: + lda #$55 + sta (ZPADDR),y + iny + lda #$2a + sta (ZPADDR),y + iny + cpy #MAXXBYTE + bne @L1 + + rts +.endproc + + +.proc drawGrid + lda loAddrs,y + sta ZPADDR + lda page1HiAddrs,y + sta ZPADDR+1 + + lda violetEvenGrid,x + sta evenVal + lda violetOddGrid,x + sta oddVal + + ldy #0 +@L1: + lda evenVal + sta (ZPADDR),y + iny + lda oddVal + sta (ZPADDR),y + iny + cpy #MAXXBYTE + bne @L1 + + rts + +; Locals +evenVal: .BYTE $00 +oddVal: .BYTE $00 + +.endproc + + +.proc clearScreen ldx #0 ldy #0 @@ -260,6 +337,8 @@ clearScreen: bne @L1 rts +.endproc + .DATA @@ -340,3 +419,10 @@ page2HiAddrs: .HIBYTES LINE168+$2000, LINE169+$2000, LINE170+$2000, LINE171+$2000, LINE172+$2000, LINE173+$2000, LINE174+$2000, LINE175+$2000 .HIBYTES LINE176+$2000, LINE177+$2000, LINE178+$2000, LINE179+$2000, LINE180+$2000, LINE181+$2000, LINE182+$2000, LINE183+$2000 .HIBYTES LINE184+$2000, LINE185+$2000, LINE186+$2000, LINE187+$2000, LINE188+$2000, LINE189+$2000, LINE190+$2000, LINE191+$2000 + +violetEvenGrid: + .BYTE $00, $00, $00, $40, $10, $04, $01 + +violetOddGrid: + .BYTE $20, $08, $02, $00, $00, $00, $00 + diff --git a/colourgo/machine.c b/colourgo/machine.c new file mode 100644 index 0000000..9305d7e --- /dev/null +++ b/colourgo/machine.c @@ -0,0 +1,103 @@ +// +// machine.c +// colourgo +// +// Created by Jeremy Rand on 2017-07-19. +// Copyright © 2017 Jeremy Rand. All rights reserved. +// + + +#include +#include +#include + +#include "machine.h" +#include "vbl.h" + + +// Typedefs +typedef enum { + GS_SPEED_SLOW, + GS_SPEED_FAST +} tMachineGSSpeed; + + +// Globals + +static tMachineGSSpeed gOldSpeed = GS_SPEED_SLOW; + + +// Implementation + + +static bool machineIs2c(void) +{ + switch (get_ostype()) { + case APPLE_IIC: + case APPLE_IIC35: + case APPLE_IICEXP: + case APPLE_IICREV: + case APPLE_IICPLUS: + return true; + } + + return false; +} + + +static bool machineIs2GS(void) +{ + switch (get_ostype()) { + case APPLE_IIGS: + case APPLE_IIGS1: + case APPLE_IIGS3: + return true; + } + + return false; +} + + +static tMachineGSSpeed setGSSpeed(tMachineGSSpeed newSpeed) +{ + uint8_t *speedRegister = (uint8_t *)0xc036; + uint8_t value = *speedRegister; + tMachineGSSpeed oldSpeed; + + if ((value & 0x80) != 0) + oldSpeed = GS_SPEED_FAST; + else + oldSpeed = GS_SPEED_SLOW; + + if (oldSpeed != newSpeed) { + if (newSpeed == GS_SPEED_FAST) { + value |= 0x80; + } else { + value &= 0x7f; + } + *speedRegister = value; + } + + return oldSpeed; +} + + +void initMachine(void) +{ + gVblWait = vblWaitNon2c; + + if (machineIs2c()) { + gVblWait = vblWait2c; + } else if (machineIs2GS()) { + vblInit2gs(); + gOldSpeed = setGSSpeed(GS_SPEED_SLOW); + } +} + + +void uninitMachine(void) +{ + if (machineIs2GS()) { + setGSSpeed(gOldSpeed); + } +} diff --git a/colourgo/machine.h b/colourgo/machine.h new file mode 100644 index 0000000..3c7a342 --- /dev/null +++ b/colourgo/machine.h @@ -0,0 +1,19 @@ +// +// machine.h +// colourgo +// +// Created by Jeremy Rand on 2017-07-19. +// Copyright © 2017 Jeremy Rand. All rights reserved. +// + +#ifndef __colourgo__machine__ +#define __colourgo__machine__ + + +// API + +extern void initMachine(void); +extern void uninitMachine(void); + + +#endif /* defined(__colourgo__machine__) */ diff --git a/colourgo/main.c b/colourgo/main.c index 5b70219..3fc4b4b 100644 --- a/colourgo/main.c +++ b/colourgo/main.c @@ -9,10 +9,13 @@ #include #include "game.h" +#include "machine.h" int main(void) { + initMachine(); game(); + uninitMachine(); return 0; } diff --git a/colourgo/vbl.h b/colourgo/vbl.h new file mode 100644 index 0000000..14ae50b --- /dev/null +++ b/colourgo/vbl.h @@ -0,0 +1,32 @@ +// +// vbl.h +// colourgo +// +// Created by Jeremy Rand on 2017-07-19. +// Copyright © 2017 Jeremy Rand. All rights reserved. +// + +#ifndef __colourgo__vbl__ +#define __colourgo__vbl__ + + +// Typedefs + +typedef void (*tVblWaitFunction)(void); + + +// Globals + +extern tVblWaitFunction gVblWait; + +// API + +extern void __fastcall__ vblInit2gs(void); +extern void __fastcall__ vblWait(void); +extern void __fastcall__ vblWaitNon2c(void); +extern void __fastcall__ vblWait2c(void); + +extern void __fastcall__ vblIRQCallback(void); + + +#endif /* defined(__colourgo__vbl__) */ diff --git a/colourgo/vbl.s b/colourgo/vbl.s new file mode 100644 index 0000000..f31af66 --- /dev/null +++ b/colourgo/vbl.s @@ -0,0 +1,75 @@ +; +; vbl.s +; colourgo +; +; Created by Jeremy Rand on 2017-07-19. +; Copyright © 2017 Jeremy Rand. All rights reserved. +; + + + + .export _vblWait, _vblWaitNon2c, _vblWait2c, _vblInit2gs + .export _gVblWait + .interruptor _vblIRQCallback + + + .include "apple2.inc" + + +RDVBLBAR := $C019 + + +.proc _vblWait + jmp (_gVblWait) +.endproc + +.proc _vblInit2gs + lda #$fe + sta compType +.endproc + + +.proc _vblWaitNon2c + lda compType +@L1: + cmp RDVBLBAR + bpl @L1 +@L2: + cmp RDVBLBAR + bmi @L2 + + rts +.endproc + + +.proc _vblIRQCallback + pha + lda #$0 + sta vbl2cByte + pla + rts +.endproc + + +.proc _vblWait2c + lda #$ff + sta vbl2cByte + +@L1: + lda vbl2cByte + bne @L1 + + rts +.endproc + + +.data + +_gVblWait: + .BYTE $0, $0 + +compType: + .BYTE $7e + +vbl2cByte: + .BYTE $00