mirror of
https://github.com/blondie7575/WeeGUI.git
synced 2025-01-22 01:31:17 +00:00
- Initial commit
This commit is contained in:
parent
1c7737fc2a
commit
9cbc3e0cf8
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
/WeeGUI.xcodeproj/project.xcworkspace/xcuserdata/
|
||||
|
||||
/WeeGUI.xcodeproj/xcuserdata/
|
BIN
AppleCommander.jar
Normal file
BIN
AppleCommander.jar
Normal file
Binary file not shown.
42
Makefile
Normal file
42
Makefile
Normal file
@ -0,0 +1,42 @@
|
||||
#
|
||||
# Makefile
|
||||
# WeeGUI
|
||||
#
|
||||
# Created by Quinn Dunki on 8/15/14.
|
||||
# One Girl, One Laptop Productions
|
||||
# http://www.quinndunki.com
|
||||
# http://www.quinndunki.com/blondihacks
|
||||
#
|
||||
|
||||
|
||||
CL65=cl65
|
||||
AC=AppleCommander.jar
|
||||
ADDR=4000
|
||||
ADDRDEMO=6000
|
||||
|
||||
PGM=gui
|
||||
DEMO=guidemo
|
||||
|
||||
all: $(DEMO) $(PGM)
|
||||
|
||||
$(DEMO):
|
||||
@PATH=$(PATH):/usr/local/bin; $(CL65) -t apple2enh --start-addr $(ADDRDEMO) -l$(DEMO).lst $(DEMO).s
|
||||
java -jar $(AC) -d $(DEMO).dsk $(DEMO)
|
||||
java -jar $(AC) -p $(DEMO).dsk $(DEMO) BIN 0x$(ADDRDEMO) < $(DEMO)
|
||||
rm -f $(DEMO)
|
||||
rm -f $(DEMO).o
|
||||
|
||||
$(PGM):
|
||||
@PATH=$(PATH):/usr/local/bin; $(CL65) -t apple2enh --start-addr $(ADDR) -l$(PGM).lst $(PGM).s
|
||||
java -jar $(AC) -d $(DEMO).dsk $(PGM)
|
||||
java -jar $(AC) -p $(DEMO).dsk $(PGM) BIN 0x$(ADDR) < $(PGM)
|
||||
rm -f $(PGM)
|
||||
rm -f $(PGM).o
|
||||
osascript V2Make.scpt $(PROJECT_DIR) $(DEMO) $(PGM)
|
||||
|
||||
clean:
|
||||
rm -f $(DEMO)
|
||||
rm -f $(DEMO).o
|
||||
rm -f $(PGM)
|
||||
rm -f $(PGM).o
|
||||
|
BIN
V2Make.scpt
Normal file
BIN
V2Make.scpt
Normal file
Binary file not shown.
205
WeeGUI.xcodeproj/project.pbxproj
Normal file
205
WeeGUI.xcodeproj/project.pbxproj
Normal file
@ -0,0 +1,205 @@
|
||||
// !$*UTF8*$!
|
||||
{
|
||||
archiveVersion = 1;
|
||||
classes = {
|
||||
};
|
||||
objectVersion = 46;
|
||||
objects = {
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
709E88E319AC0A5F0069DB55 /* views.s */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.asm; path = views.s; sourceTree = "<group>"; };
|
||||
709E88E419AC0DC20069DB55 /* unit_test.s */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.asm; path = unit_test.s; sourceTree = "<group>"; };
|
||||
70B2272519A9685200702171 /* utility.s */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.asm; path = utility.s; sourceTree = "<group>"; };
|
||||
70D435B119A0137F001BFD9B /* Makefile */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.make; path = Makefile; sourceTree = "<group>"; };
|
||||
70D435B219A013AF001BFD9B /* gui.s */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; path = gui.s; sourceTree = "<group>"; };
|
||||
70D435B419A0141F001BFD9B /* guidemo.s */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.asm; path = guidemo.s; sourceTree = "<group>"; };
|
||||
70F1DB4A19A56CDA00321637 /* macros.s */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.asm; path = macros.s; sourceTree = "<group>"; };
|
||||
70F1DB4B19A56D6300321637 /* switches.s */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.asm; path = switches.s; sourceTree = "<group>"; };
|
||||
70F1DB5619A6B02900321637 /* painting.s */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.asm; path = painting.s; sourceTree = "<group>"; };
|
||||
70F1DB5D19A7FF8700321637 /* memory.s */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.asm; path = memory.s; sourceTree = "<group>"; };
|
||||
/* End PBXFileReference section */
|
||||
|
||||
/* Begin PBXGroup section */
|
||||
70D435A619A012CF001BFD9B = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
70D435B119A0137F001BFD9B /* Makefile */,
|
||||
70F1DB4A19A56CDA00321637 /* macros.s */,
|
||||
70F1DB4B19A56D6300321637 /* switches.s */,
|
||||
70F1DB5D19A7FF8700321637 /* memory.s */,
|
||||
70B2272519A9685200702171 /* utility.s */,
|
||||
70F1DB5619A6B02900321637 /* painting.s */,
|
||||
709E88E319AC0A5F0069DB55 /* views.s */,
|
||||
70D435B219A013AF001BFD9B /* gui.s */,
|
||||
709E88E419AC0DC20069DB55 /* unit_test.s */,
|
||||
70D435B419A0141F001BFD9B /* guidemo.s */,
|
||||
);
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
/* End PBXGroup section */
|
||||
|
||||
/* Begin PBXLegacyTarget section */
|
||||
70D435AB19A012D0001BFD9B /* WeeGUI */ = {
|
||||
isa = PBXLegacyTarget;
|
||||
buildArgumentsString = "$(ACTION)";
|
||||
buildConfigurationList = 70D435AE19A012D0001BFD9B /* Build configuration list for PBXLegacyTarget "WeeGUI" */;
|
||||
buildPhases = (
|
||||
);
|
||||
buildToolPath = /usr/bin/make;
|
||||
dependencies = (
|
||||
);
|
||||
name = WeeGUI;
|
||||
passBuildSettingsInEnvironment = 1;
|
||||
productName = WeeGUI;
|
||||
};
|
||||
/* End PBXLegacyTarget section */
|
||||
|
||||
/* Begin PBXProject section */
|
||||
70D435A719A012CF001BFD9B /* Project object */ = {
|
||||
isa = PBXProject;
|
||||
attributes = {
|
||||
LastUpgradeCheck = 0600;
|
||||
ORGANIZATIONNAME = "One Girl, One Laptop Productions";
|
||||
TargetAttributes = {
|
||||
70D435AB19A012D0001BFD9B = {
|
||||
CreatedOnToolsVersion = 6.0;
|
||||
};
|
||||
};
|
||||
};
|
||||
buildConfigurationList = 70D435AA19A012CF001BFD9B /* Build configuration list for PBXProject "WeeGUI" */;
|
||||
compatibilityVersion = "Xcode 3.2";
|
||||
developmentRegion = English;
|
||||
hasScannedForEncodings = 0;
|
||||
knownRegions = (
|
||||
en,
|
||||
);
|
||||
mainGroup = 70D435A619A012CF001BFD9B;
|
||||
projectDirPath = "";
|
||||
projectRoot = "";
|
||||
targets = (
|
||||
70D435AB19A012D0001BFD9B /* WeeGUI */,
|
||||
);
|
||||
};
|
||||
/* End PBXProject section */
|
||||
|
||||
/* Begin XCBuildConfiguration section */
|
||||
70D435AC19A012D0001BFD9B /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
|
||||
CLANG_CXX_LIBRARY = "libc++";
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CLANG_ENABLE_OBJC_ARC = YES;
|
||||
CLANG_WARN_BOOL_CONVERSION = YES;
|
||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
||||
CLANG_WARN_EMPTY_BODY = YES;
|
||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||
CLANG_WARN_INT_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
COPY_PHASE_STRIP = NO;
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu99;
|
||||
GCC_DYNAMIC_NO_PIC = NO;
|
||||
GCC_OPTIMIZATION_LEVEL = 0;
|
||||
GCC_PREPROCESSOR_DEFINITIONS = (
|
||||
"DEBUG=1",
|
||||
"$(inherited)",
|
||||
);
|
||||
GCC_SYMBOLS_PRIVATE_EXTERN = NO;
|
||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
||||
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.10;
|
||||
MTL_ENABLE_DEBUG_INFO = YES;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
SDKROOT = macosx;
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
70D435AD19A012D0001BFD9B /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
|
||||
CLANG_CXX_LIBRARY = "libc++";
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CLANG_ENABLE_OBJC_ARC = YES;
|
||||
CLANG_WARN_BOOL_CONVERSION = YES;
|
||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
||||
CLANG_WARN_EMPTY_BODY = YES;
|
||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||
CLANG_WARN_INT_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
COPY_PHASE_STRIP = YES;
|
||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||
ENABLE_NS_ASSERTIONS = NO;
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu99;
|
||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
||||
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.10;
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
SDKROOT = macosx;
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
70D435AF19A012D0001BFD9B /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
DEBUGGING_SYMBOLS = YES;
|
||||
GCC_GENERATE_DEBUGGING_SYMBOLS = YES;
|
||||
GCC_OPTIMIZATION_LEVEL = 0;
|
||||
OTHER_CFLAGS = "";
|
||||
OTHER_LDFLAGS = "";
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
70D435B019A012D0001BFD9B /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
OTHER_CFLAGS = "";
|
||||
OTHER_LDFLAGS = "";
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
/* End XCBuildConfiguration section */
|
||||
|
||||
/* Begin XCConfigurationList section */
|
||||
70D435AA19A012CF001BFD9B /* Build configuration list for PBXProject "WeeGUI" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
70D435AC19A012D0001BFD9B /* Debug */,
|
||||
70D435AD19A012D0001BFD9B /* Release */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
70D435AE19A012D0001BFD9B /* Build configuration list for PBXLegacyTarget "WeeGUI" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
70D435AF19A012D0001BFD9B /* Debug */,
|
||||
70D435B019A012D0001BFD9B /* Release */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
/* End XCConfigurationList section */
|
||||
};
|
||||
rootObject = 70D435A719A012CF001BFD9B /* Project object */;
|
||||
}
|
7
WeeGUI.xcodeproj/project.xcworkspace/contents.xcworkspacedata
generated
Normal file
7
WeeGUI.xcodeproj/project.xcworkspace/contents.xcworkspacedata
generated
Normal file
@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Workspace
|
||||
version = "1.0">
|
||||
<FileRef
|
||||
location = "self:WeeGUI.xcodeproj">
|
||||
</FileRef>
|
||||
</Workspace>
|
@ -0,0 +1,41 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>IDESourceControlProjectFavoriteDictionaryKey</key>
|
||||
<false/>
|
||||
<key>IDESourceControlProjectIdentifier</key>
|
||||
<string>CF799A61-C8B1-43FD-B9D1-A4282374D325</string>
|
||||
<key>IDESourceControlProjectName</key>
|
||||
<string>WeeGUI</string>
|
||||
<key>IDESourceControlProjectOriginsDictionary</key>
|
||||
<dict>
|
||||
<key>F041408A2ABBA5E27FC164AE936A5C1AA13AD5FD</key>
|
||||
<string>https://github.com/blondie7575/WeeGUI</string>
|
||||
</dict>
|
||||
<key>IDESourceControlProjectPath</key>
|
||||
<string>WeeGUI.xcodeproj</string>
|
||||
<key>IDESourceControlProjectRelativeInstallPathDictionary</key>
|
||||
<dict>
|
||||
<key>F041408A2ABBA5E27FC164AE936A5C1AA13AD5FD</key>
|
||||
<string>../..</string>
|
||||
</dict>
|
||||
<key>IDESourceControlProjectURL</key>
|
||||
<string>https://github.com/blondie7575/WeeGUI</string>
|
||||
<key>IDESourceControlProjectVersion</key>
|
||||
<integer>111</integer>
|
||||
<key>IDESourceControlProjectWCCIdentifier</key>
|
||||
<string>F041408A2ABBA5E27FC164AE936A5C1AA13AD5FD</string>
|
||||
<key>IDESourceControlProjectWCConfigurations</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>IDESourceControlRepositoryExtensionIdentifierKey</key>
|
||||
<string>public.vcs.git</string>
|
||||
<key>IDESourceControlWCCIdentifierKey</key>
|
||||
<string>F041408A2ABBA5E27FC164AE936A5C1AA13AD5FD</string>
|
||||
<key>IDESourceControlWCCName</key>
|
||||
<string>WeeGUI</string>
|
||||
</dict>
|
||||
</array>
|
||||
</dict>
|
||||
</plist>
|
128
gui.s
Normal file
128
gui.s
Normal file
@ -0,0 +1,128 @@
|
||||
;
|
||||
; gui.s
|
||||
; AssemblyTest
|
||||
;
|
||||
; Created by Quinn Dunki on 8/15/14.
|
||||
; Copyright (c) 2014 One Girl, One Laptop Productions. All rights reserved.
|
||||
;
|
||||
|
||||
|
||||
.org $4000
|
||||
|
||||
|
||||
; Common definitions
|
||||
|
||||
.include "switches.s"
|
||||
.include "macros.s"
|
||||
|
||||
|
||||
; Main
|
||||
|
||||
main:
|
||||
jsr begin80cols
|
||||
jsr WGClearScreen
|
||||
|
||||
lda #<testView
|
||||
sta PARAM0
|
||||
lda #>testView
|
||||
sta PARAM1
|
||||
jsr WGCreateView
|
||||
|
||||
lda #0
|
||||
jsr WGSelectView
|
||||
|
||||
jsr WGPaintView
|
||||
|
||||
ldx #4
|
||||
ldy #3
|
||||
jsr WGSetCursor
|
||||
|
||||
; lda #-4
|
||||
; jsr WGScrollX
|
||||
; lda #-3
|
||||
; jsr WGScrollY
|
||||
|
||||
lda #<testStr
|
||||
sta PARAM0
|
||||
lda #>testStr
|
||||
sta PARAM1
|
||||
jsr WGPrintASCII
|
||||
|
||||
; lda #1
|
||||
; sta PARAM0
|
||||
; lda #1
|
||||
; sta PARAM1
|
||||
; lda #2
|
||||
; sta PARAM2
|
||||
; lda #2
|
||||
; sta PARAM3
|
||||
; ldx #'Q'+$80
|
||||
; jsr WGFillRect
|
||||
; jsr WGStrokeRect
|
||||
; jmp loop
|
||||
; jsr waitForKey
|
||||
|
||||
; jmp tortureTestRects
|
||||
|
||||
loop:
|
||||
; lda #'Q' + $80
|
||||
; jsr COUT
|
||||
jmp loop
|
||||
rts ; This seems to work for returning to BASIC.SYSTEM, but I don't think it's right
|
||||
|
||||
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
; begin80cols
|
||||
; Enables 80 column mode (and enhanced video firmware)
|
||||
begin80cols:
|
||||
lda #$a0
|
||||
jsr $c300
|
||||
SETSWITCH TEXTON
|
||||
SETSWITCH PAGE2OFF
|
||||
SETSWITCH COL80ON
|
||||
SETSWITCH STORE80ON
|
||||
rts
|
||||
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
; waitForKey
|
||||
; Spinlocks until a key is pressed
|
||||
waitForKey:
|
||||
lda KBDSTRB
|
||||
bpl waitForKey
|
||||
rts
|
||||
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
; read80ColSwitch
|
||||
; Returns value of the 80 col switch on //c and //c+ machines
|
||||
; OUT A: Switch state (non-zero=80 cols)
|
||||
; NOTE: Untested
|
||||
read80ColSwitch:
|
||||
lda $c060
|
||||
bpl read80ColSwitch_40
|
||||
lda #$1
|
||||
rts
|
||||
|
||||
read80ColSwitch_40:
|
||||
lda #$0
|
||||
rts
|
||||
|
||||
|
||||
; Code modules
|
||||
.include "utility.s"
|
||||
.include "painting.s"
|
||||
.include "views.s"
|
||||
.include "unit_test.s"
|
||||
.include "memory.s"
|
||||
|
||||
|
||||
testView:
|
||||
.byte "0007033e130404"
|
||||
|
||||
testStr:
|
||||
.byte "This is a test of the emergency broadcast system. If this had been a real emergency, you would be dead now.",0
|
||||
|
||||
|
||||
|
BIN
guidemo.dsk
Normal file
BIN
guidemo.dsk
Normal file
Binary file not shown.
37
guidemo.lst
Normal file
37
guidemo.lst
Normal file
@ -0,0 +1,37 @@
|
||||
ca65 V2.13.3 - (C) Copyright 1998-2012 Ullrich von Bassewitz
|
||||
Main file : guidemo.s
|
||||
Current file: guidemo.s
|
||||
|
||||
000000r 1 ;
|
||||
000000r 1 ; gui.s
|
||||
000000r 1 ; AssemblyTest
|
||||
000000r 1 ;
|
||||
000000r 1 ; Created by Quinn Dunki on 8/15/14.
|
||||
000000r 1 ; Copyright (c) 2014 One Girl, One Laptop Productions. All rights reserved.
|
||||
000000r 1 ;
|
||||
000000r 1
|
||||
000000r 1
|
||||
000000r 1 .org $6000
|
||||
006000 1
|
||||
006000 1 ; Reserved locations
|
||||
006000 1
|
||||
006000 1
|
||||
006000 1 ; Constants
|
||||
006000 1
|
||||
006000 1
|
||||
006000 1 ; ROM entry points
|
||||
006000 1
|
||||
006000 1
|
||||
006000 1 ; WeeGUI entry points
|
||||
006000 1
|
||||
006000 1 GUI_MAIN = $4000
|
||||
006000 1
|
||||
006000 1
|
||||
006000 1 ; Main
|
||||
006000 1
|
||||
006000 1 main:
|
||||
006000 1 4C 00 40 jmp GUI_MAIN
|
||||
006003 1
|
||||
006003 1
|
||||
006003 1
|
||||
006003 1
|
32
guidemo.s
Normal file
32
guidemo.s
Normal file
@ -0,0 +1,32 @@
|
||||
;
|
||||
; gui.s
|
||||
; AssemblyTest
|
||||
;
|
||||
; Created by Quinn Dunki on 8/15/14.
|
||||
; Copyright (c) 2014 One Girl, One Laptop Productions. All rights reserved.
|
||||
;
|
||||
|
||||
|
||||
.org $6000
|
||||
|
||||
; Reserved locations
|
||||
|
||||
|
||||
; Constants
|
||||
|
||||
|
||||
; ROM entry points
|
||||
|
||||
|
||||
; WeeGUI entry points
|
||||
|
||||
GUI_MAIN = $4000
|
||||
|
||||
|
||||
; Main
|
||||
|
||||
main:
|
||||
jmp GUI_MAIN
|
||||
|
||||
|
||||
|
137
macros.s
Normal file
137
macros.s
Normal file
@ -0,0 +1,137 @@
|
||||
;
|
||||
; macros.s
|
||||
; Generally useful macros for 6502 code
|
||||
;
|
||||
; Created by Quinn Dunki on 8/15/14.
|
||||
; Copyright (c) 2014 One Girl, One Laptop Productions. All rights reserved.
|
||||
;
|
||||
|
||||
|
||||
; Macros
|
||||
|
||||
.macro SETSWITCH name ; Sets the named softswitch (assumes write method)
|
||||
sta name
|
||||
.endmacro
|
||||
|
||||
|
||||
.macro SAVE_AXY ; Saves all registers
|
||||
pha
|
||||
txa
|
||||
pha
|
||||
tya
|
||||
pha
|
||||
.endmacro
|
||||
|
||||
|
||||
.macro RESTORE_AXY ; Restores all registers
|
||||
pla
|
||||
tay
|
||||
pla
|
||||
tax
|
||||
pla
|
||||
.endmacro
|
||||
|
||||
|
||||
.macro SAVE_AY ; Saves accumulator and Y index
|
||||
pha
|
||||
tya
|
||||
pha
|
||||
.endmacro
|
||||
|
||||
|
||||
.macro RESTORE_AY ; Restores accumulator and Y index
|
||||
pla
|
||||
tay
|
||||
pla
|
||||
.endmacro
|
||||
|
||||
|
||||
.macro SAVE_AX ; Saves accumulator and X index
|
||||
pha
|
||||
txa
|
||||
pha
|
||||
.endmacro
|
||||
|
||||
|
||||
.macro RESTORE_AX ; Restores accumulator and X index
|
||||
pla
|
||||
tax
|
||||
pla
|
||||
.endmacro
|
||||
|
||||
|
||||
.macro SAVE_ZPP ; Saves Zero Page locations we use for parameters
|
||||
lda PARAM0
|
||||
pha
|
||||
lda PARAM1
|
||||
pha
|
||||
lda PARAM2
|
||||
pha
|
||||
lda PARAM3
|
||||
pha
|
||||
.endmacro
|
||||
|
||||
|
||||
.macro RESTORE_ZPP ; Restores Zero Page locations we use for parameters
|
||||
pla
|
||||
sta PARAM3
|
||||
pla
|
||||
sta PARAM2
|
||||
pla
|
||||
sta PARAM1
|
||||
pla
|
||||
sta PARAM0
|
||||
.endmacro
|
||||
|
||||
|
||||
.macro SAVE_ZPS ; Saves Zero Page locations we use for scratch
|
||||
lda SCRATCH0
|
||||
pha
|
||||
lda SCRATCH1
|
||||
pha
|
||||
.endmacro
|
||||
|
||||
|
||||
.macro RESTORE_ZPS ; Restores Zero Page locations we use for scratch
|
||||
pla
|
||||
sta SCRATCH1
|
||||
pla
|
||||
sta SCRATCH0
|
||||
.endmacro
|
||||
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
; Rendering macros
|
||||
;
|
||||
|
||||
.macro LDY_ACTIVEVIEW
|
||||
lda WG_ACTIVEVIEW ; Find our new view record
|
||||
and #%00001111
|
||||
asl
|
||||
asl
|
||||
asl
|
||||
asl ; Records are 8 bytes wide
|
||||
tay
|
||||
.endmacro
|
||||
|
||||
|
||||
.macro LDX_ACTIVEVIEW
|
||||
lda WG_ACTIVEVIEW ; Find our new view record
|
||||
and #%00001111
|
||||
asl
|
||||
asl
|
||||
asl
|
||||
asl ; Records are 8 bytes wide
|
||||
tax
|
||||
.endmacro
|
||||
|
||||
|
||||
.macro VBL_SYNC ; Synchronize with vertical blanking
|
||||
lda #$80
|
||||
macroWaitVBLToFinish:
|
||||
bit RDVBLBAR
|
||||
bmi tortureTestRectsWaitVBLToFinish
|
||||
macroWaitVBLToStart:
|
||||
bit RDVBLBAR
|
||||
bpl tortureTestRectsWaitVBLToStart
|
||||
.endmacro
|
123
memory.s
Normal file
123
memory.s
Normal file
@ -0,0 +1,123 @@
|
||||
;
|
||||
; memory.s
|
||||
; Memory mapping information
|
||||
;
|
||||
; Created by Quinn Dunki on 8/15/14.
|
||||
; Copyright (c) 2014 One Girl, One Laptop Productions. All rights reserved.
|
||||
;
|
||||
|
||||
|
||||
; Reserved locations
|
||||
|
||||
INVERSE = $32
|
||||
BASL = $28
|
||||
BASH = $29
|
||||
|
||||
|
||||
; Zero page locations we use (unused by Monitor, Applesoft, or ProDOS)
|
||||
PARAM0 = $06
|
||||
PARAM1 = $07
|
||||
PARAM2 = $08
|
||||
PARAM3 = $09
|
||||
SCRATCH0 = $19
|
||||
SCRATCH1 = $1A
|
||||
|
||||
; Constants
|
||||
|
||||
CHAR_NORMAL = $ff
|
||||
CHAR_INVERSE = $3f
|
||||
CHAR_FLASH = $7f
|
||||
|
||||
|
||||
; ROM entry points
|
||||
|
||||
COUT = $fded
|
||||
BASCALC = $fbc1
|
||||
|
||||
|
||||
; System state
|
||||
WG_CURSORX: ; In screenspace
|
||||
.byte 0
|
||||
WG_CURSORY:
|
||||
.byte 0
|
||||
|
||||
WG_LOCALCURSORX: ; In current viewspace
|
||||
.byte 0
|
||||
WG_LOCALCURSORY:
|
||||
.byte 0
|
||||
|
||||
WG_ACTIVEVIEW:
|
||||
.byte 0
|
||||
|
||||
WG_VIEWRECORDS:
|
||||
; X, Y, Screen Width, Screen Height, Style, X Offset, Y Offset, View Width, View Height
|
||||
.byte 0,0,0,0,0,0,0,0
|
||||
.byte 0,0,0,0,0,0,0,0
|
||||
.byte 0,0,0,0,0,0,0,0
|
||||
.byte 0,0,0,0,0,0,0,0
|
||||
.byte 0,0,0,0,0,0,0,0
|
||||
.byte 0,0,0,0,0,0,0,0
|
||||
.byte 0,0,0,0,0,0,0,0
|
||||
.byte 0,0,0,0,0,0,0,0
|
||||
.byte 0,0,0,0,0,0,0,0
|
||||
.byte 0,0,0,0,0,0,0,0
|
||||
.byte 0,0,0,0,0,0,0,0
|
||||
.byte 0,0,0,0,0,0,0,0
|
||||
.byte 0,0,0,0,0,0,0,0
|
||||
.byte 0,0,0,0,0,0,0,0
|
||||
.byte 0,0,0,0,0,0,0,0
|
||||
.byte 0,0,0,0,0,0,0,0
|
||||
|
||||
|
||||
; Video memory lookup table
|
||||
TEXTLINES_H:
|
||||
.byte $04 ;0
|
||||
.byte $04 ;1
|
||||
.byte $05 ;2
|
||||
.byte $05 ;3
|
||||
.byte $06 ;4
|
||||
.byte $06 ;5
|
||||
.byte $07 ;6
|
||||
.byte $07 ;7
|
||||
.byte $04 ;8
|
||||
.byte $04 ;9
|
||||
.byte $05 ;10
|
||||
.byte $05 ;11
|
||||
.byte $06 ;12
|
||||
.byte $06 ;13
|
||||
.byte $07 ;14
|
||||
.byte $07 ;15
|
||||
.byte $04 ;16
|
||||
.byte $04 ;17
|
||||
.byte $05 ;18
|
||||
.byte $05 ;19
|
||||
.byte $06 ;20
|
||||
.byte $06 ;21
|
||||
.byte $07 ;22
|
||||
.byte $07 ;23
|
||||
|
||||
TEXTLINES_L:
|
||||
.byte $00 ;0
|
||||
.byte $80 ;1
|
||||
.byte $00 ;2
|
||||
.byte $80 ;3
|
||||
.byte $00 ;4
|
||||
.byte $80 ;5
|
||||
.byte $00 ;6
|
||||
.byte $80 ;7
|
||||
.byte $28 ;8
|
||||
.byte $a8 ;9
|
||||
.byte $28 ;10
|
||||
.byte $a8 ;11
|
||||
.byte $28 ;12
|
||||
.byte $a8 ;13
|
||||
.byte $28 ;14
|
||||
.byte $a8 ;15
|
||||
.byte $50 ;16
|
||||
.byte $d0 ;17
|
||||
.byte $50 ;18
|
||||
.byte $d0 ;19
|
||||
.byte $50 ;20
|
||||
.byte $d0 ;21
|
||||
.byte $50 ;22
|
||||
.byte $d0 ;23
|
606
painting.s
Normal file
606
painting.s
Normal file
@ -0,0 +1,606 @@
|
||||
;
|
||||
; painting.s
|
||||
; Rendering routines for 80 column text elements
|
||||
;
|
||||
; Created by Quinn Dunki on 8/15/14.
|
||||
; Copyright (c) 2014 One Girl, One Laptop Productions. All rights reserved.
|
||||
;
|
||||
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
; WGClearScreen
|
||||
; Clears the text screen (assumes 80 cols)
|
||||
; Side effects: Clobbers BASL,BASH
|
||||
;
|
||||
WGClearScreen:
|
||||
|
||||
SAVE_AXY
|
||||
SETSWITCH PAGE2OFF
|
||||
ldx #23
|
||||
|
||||
WGClearScreen_lineLoop:
|
||||
|
||||
lda TEXTLINES_L,x ; Compute video memory address of line
|
||||
sta BASL
|
||||
lda TEXTLINES_H,x
|
||||
sta BASH
|
||||
|
||||
ldy #39
|
||||
lda #' ' + $80
|
||||
|
||||
WGClearScreen_charLoop:
|
||||
sta (BASL),y
|
||||
SETSWITCH PAGE2ON
|
||||
sta (BASL),y
|
||||
SETSWITCH PAGE2OFF
|
||||
dey
|
||||
bpl WGClearScreen_charLoop
|
||||
|
||||
dex
|
||||
bpl WGClearScreen_lineLoop
|
||||
|
||||
RESTORE_AXY
|
||||
rts
|
||||
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
; WGFillRect
|
||||
; Fills a rectangle (assumes 80 cols)
|
||||
; PARAM0: Left edge
|
||||
; PARAM1: Top edge
|
||||
; PARAM2: Width
|
||||
; PARAM3: Height
|
||||
; X: Character to fill
|
||||
; Side effects: Clobbers BASL,BASH
|
||||
;
|
||||
WGFillRect:
|
||||
|
||||
SAVE_AXY
|
||||
SAVE_ZPS
|
||||
stx SCRATCH0
|
||||
|
||||
clc ; Compute bottom edge
|
||||
lda PARAM1
|
||||
adc PARAM3
|
||||
tax
|
||||
|
||||
WGFillRect_vertLoop:
|
||||
phx ; We'll need X back for now, but save the line number
|
||||
|
||||
lda TEXTLINES_L,x ; Compute video memory address of left edge of rect
|
||||
sta BASL
|
||||
lda TEXTLINES_H,x
|
||||
sta BASH
|
||||
|
||||
lda PARAM0
|
||||
lsr
|
||||
clc
|
||||
adc BASL
|
||||
sta BASL
|
||||
lda #$0
|
||||
adc BASH
|
||||
sta BASH
|
||||
|
||||
lda PARAM0 ; Left edge even?
|
||||
and #$01
|
||||
bne WGFillRect_horzLoopOdd
|
||||
|
||||
; CASE 1: Left edge even-aligned, even width
|
||||
SETSWITCH PAGE2OFF
|
||||
lda PARAM2
|
||||
lsr
|
||||
tay ; Iterate w/2
|
||||
dey
|
||||
phy ; We'll reuse this calculation for the odd columns
|
||||
|
||||
WGFillRect_horzLoopEvenAligned0: ; Draw even columns
|
||||
lda SCRATCH0 ; Plot the character
|
||||
sta (BASL),y
|
||||
dey
|
||||
bpl WGFillRect_horzLoopEvenAligned0 ; Loop for w/2
|
||||
|
||||
SETSWITCH PAGE2ON ; Prepare for odd columns
|
||||
ply ; Iterate w/2 again
|
||||
|
||||
WGFillRect_horzLoopEvenAligned1: ; Draw odd columns
|
||||
lda SCRATCH0 ; Plot the character
|
||||
sta (BASL),y
|
||||
dey
|
||||
bpl WGFillRect_horzLoopEvenAligned1 ; Loop for w/2
|
||||
|
||||
lda PARAM2 ; Is width even?
|
||||
and #$01
|
||||
beq WGFillRect_horzLoopEvenAlignedEvenWidth
|
||||
|
||||
; CASE 1a: Left edge even aligned, odd width
|
||||
lda PARAM2 ; Fill in extra last column
|
||||
lsr
|
||||
tay
|
||||
lda SCRATCH0 ; Plot the character
|
||||
sta (BASL),y
|
||||
|
||||
WGFillRect_horzLoopEvenAlignedEvenWidth:
|
||||
plx ; Prepare for next row
|
||||
dex
|
||||
cpx PARAM1
|
||||
bcs WGFillRect_vertLoop
|
||||
jmp WGFillRect_done
|
||||
|
||||
WGFillRect_horzLoopOdd:
|
||||
; CASE 2: Left edge odd-aligned, even width
|
||||
SETSWITCH PAGE2ON
|
||||
lda PARAM2
|
||||
lsr
|
||||
tay ; Iterate w/2
|
||||
phy ; We'll reuse this calculation for the even columns
|
||||
|
||||
WGFillRect_horzLoopOddAligned0: ; Draw even columns
|
||||
lda SCRATCH0 ; Plot the character
|
||||
sta (BASL),y
|
||||
dey
|
||||
bne WGFillRect_horzLoopOddAligned0 ; Loop for w/2
|
||||
|
||||
SETSWITCH PAGE2OFF ; Prepare for odd columns
|
||||
ply ; Iterate w/2 again, shift left 1
|
||||
dey
|
||||
|
||||
WGFillRect_horzLoopOddAligned1: ; Draw even columns
|
||||
lda SCRATCH0 ; Plot the character
|
||||
sta (BASL),y
|
||||
dey
|
||||
bpl WGFillRect_horzLoopOddAligned1 ; Loop for w/2
|
||||
|
||||
lda PARAM2 ; Is width even?
|
||||
and #$01
|
||||
beq WGFillRect_horzLoopOddAlignedEvenWidth
|
||||
|
||||
; CASE 2a: Left edge odd aligned, odd width
|
||||
lda PARAM2 ; Fill in extra last column
|
||||
lsr
|
||||
tay
|
||||
lda SCRATCH0 ; Plot the character
|
||||
sta (BASL),y
|
||||
|
||||
WGFillRect_horzLoopOddAlignedEvenWidth:
|
||||
plx ; Prepare for next row
|
||||
dex
|
||||
cpx PARAM1
|
||||
bcs WGFillRect_vertLoopJmp
|
||||
jmp WGFillRect_done
|
||||
WGFillRect_vertLoopJmp:
|
||||
jmp WGFillRect_vertLoop
|
||||
|
||||
WGFillRect_done:
|
||||
RESTORE_ZPS
|
||||
RESTORE_AXY
|
||||
rts
|
||||
|
||||
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
; WGStrokeRect
|
||||
; Strokes a rectangle (assumes 80 cols)
|
||||
; PARAM0: Left edge
|
||||
; PARAM1: Top edge
|
||||
; PARAM2: Width
|
||||
; PARAM3: Height
|
||||
; Side effects: Clobbers BASL,BASH
|
||||
;
|
||||
CH_TOP = '_'+$80
|
||||
CH_BOTTOM = 'L';'_'+$80
|
||||
CH_LEFT = 'Z';'_'+$80
|
||||
CH_RIGHT = '_'
|
||||
CH_BOTTOMLEFT = 'L'
|
||||
CH_BOTTOMRIGHT = '_'+$80
|
||||
|
||||
WGStrokeRect:
|
||||
|
||||
SAVE_AXY
|
||||
SAVE_ZPS
|
||||
|
||||
; Top and bottom edges
|
||||
;
|
||||
ldx PARAM1 ; Start with top edge
|
||||
dex
|
||||
lda #CH_TOP
|
||||
sta SCRATCH0
|
||||
|
||||
WGStrokeRect_horzEdge:
|
||||
lda TEXTLINES_L,x ; Compute video memory address of left edge of rect
|
||||
sta BASL
|
||||
lda TEXTLINES_H,x
|
||||
sta BASH
|
||||
|
||||
lda PARAM0
|
||||
lsr
|
||||
clc
|
||||
adc BASL
|
||||
sta BASL
|
||||
lda #$0
|
||||
adc BASH
|
||||
sta BASH
|
||||
|
||||
lda PARAM0 ; Left edge even?
|
||||
and #$01
|
||||
bne WGStrokeRect_horzLoopOdd
|
||||
|
||||
; CASE 1: Left edge even-aligned, even width
|
||||
SETSWITCH PAGE2OFF
|
||||
lda PARAM2
|
||||
lsr
|
||||
tay ; Start at right edge
|
||||
dey
|
||||
phy ; We'll reuse this calculation for the odd columns
|
||||
|
||||
WGStrokeRect_horzLoopEvenAligned0: ; Draw even columns
|
||||
lda SCRATCH0 ; Plot the character
|
||||
sta (BASL),y
|
||||
dey
|
||||
bpl WGStrokeRect_horzLoopEvenAligned0 ; Loop for w/2
|
||||
|
||||
SETSWITCH PAGE2ON ; Prepare for odd columns
|
||||
ply ; Start at right edge again
|
||||
|
||||
WGStrokeRect_horzLoopEvenAligned1: ; Draw odd columns
|
||||
lda SCRATCH0 ; Plot the character
|
||||
sta (BASL),y
|
||||
dey
|
||||
bpl WGStrokeRect_horzLoopEvenAligned1 ; Loop for w/2
|
||||
|
||||
lda PARAM2 ; Is width even?
|
||||
and #$01
|
||||
beq WGStrokeRect_horzLoopEvenAlignedEvenWidth
|
||||
|
||||
; CASE 1a: Left edge even aligned, odd width
|
||||
;SETSWITCH PAGE2OFF
|
||||
lda PARAM2 ; Fill in extra last column
|
||||
lsr
|
||||
tay
|
||||
lda SCRATCH0 ; Plot the character
|
||||
sta (BASL),y
|
||||
|
||||
WGStrokeRect_horzLoopEvenAlignedEvenWidth:
|
||||
inx
|
||||
cpx PARAM1
|
||||
bne WGStrokeRect_vertEdge
|
||||
clc ; Prepare for bottom edge
|
||||
lda PARAM1
|
||||
adc PARAM3
|
||||
tax
|
||||
lda #CH_BOTTOM
|
||||
sta SCRATCH0
|
||||
jmp WGStrokeRect_horzEdge
|
||||
|
||||
WGStrokeRect_horzLoopOdd:
|
||||
; CASE 2: Left edge odd-aligned, even width
|
||||
SETSWITCH PAGE2ON
|
||||
lda PARAM2
|
||||
lsr
|
||||
tay ; Iterate w/2
|
||||
phy ; We'll reuse this calculation for the even columns
|
||||
|
||||
WGStrokeRect_horzLoopOddAligned0: ; Draw even columns
|
||||
lda SCRATCH0 ; Plot the character
|
||||
sta (BASL),y
|
||||
dey
|
||||
bne WGStrokeRect_horzLoopOddAligned0 ; Loop for w/2
|
||||
|
||||
SETSWITCH PAGE2OFF ; Prepare for odd columns
|
||||
ply ; Iterate w/2 again, shift left 1
|
||||
dey
|
||||
|
||||
WGStrokeRect_horzLoopOddAligned1: ; Draw even columns
|
||||
lda SCRATCH0 ; Plot the character
|
||||
sta (BASL),y
|
||||
dey
|
||||
bpl WGStrokeRect_horzLoopOddAligned1 ; Loop for w/2
|
||||
|
||||
lda PARAM2 ; Is width even?
|
||||
and #$01
|
||||
beq WGStrokeRect_horzLoopOddAlignedEvenWidth
|
||||
|
||||
; CASE 2a: Left edge odd aligned, odd width
|
||||
lda PARAM2 ; Fill in extra last column
|
||||
dec
|
||||
lsr
|
||||
tay
|
||||
lda SCRATCH0 ; Plot the character
|
||||
sta (BASL),y
|
||||
|
||||
WGStrokeRect_horzLoopOddAlignedEvenWidth:
|
||||
inx
|
||||
cpx PARAM1
|
||||
bne WGStrokeRect_vertEdge
|
||||
clc ; Prepare for bottom edge
|
||||
lda PARAM1
|
||||
adc PARAM3
|
||||
tax
|
||||
lda #CH_BOTTOM
|
||||
sta SCRATCH0
|
||||
jmp WGStrokeRect_horzEdge
|
||||
|
||||
|
||||
WGStrokeRect_vertEdge:
|
||||
; Left and right edges
|
||||
;
|
||||
clc
|
||||
lda PARAM1 ; Compute bottom edge
|
||||
adc PARAM3
|
||||
sta SCRATCH0
|
||||
|
||||
ldx PARAM1 ; Start with top edge
|
||||
|
||||
WGStrokeRect_vertLoop:
|
||||
|
||||
phx ; We'll need X back for now, but save the line number
|
||||
|
||||
lda TEXTLINES_L,x ; Compute video memory address of left edge of rect
|
||||
sta BASL
|
||||
lda TEXTLINES_H,x
|
||||
sta BASH
|
||||
|
||||
lda PARAM0
|
||||
dec
|
||||
lsr
|
||||
clc
|
||||
adc BASL
|
||||
sta BASL
|
||||
lda #$0
|
||||
adc BASH
|
||||
sta BASH
|
||||
|
||||
lda PARAM0 ; Left edge even?
|
||||
dec
|
||||
and #$01
|
||||
bne WGStrokeRect_vertLoopOdd
|
||||
|
||||
; CASE 1: Left edge even-aligned, even width
|
||||
SETSWITCH PAGE2ON
|
||||
ldy #$0
|
||||
lda #CH_LEFT ; Plot the left edge
|
||||
sta (BASL),y
|
||||
|
||||
lda PARAM2 ; Is width even?
|
||||
inc
|
||||
inc
|
||||
and #$01
|
||||
bne WGStrokeRect_vertLoopEvenAlignedOddWidth
|
||||
|
||||
lda PARAM2 ; Calculate right edge
|
||||
inc
|
||||
inc
|
||||
lsr
|
||||
dec
|
||||
tay
|
||||
SETSWITCH PAGE2OFF
|
||||
lda #CH_RIGHT ; Plot the right edge
|
||||
sta (BASL),y
|
||||
jmp WGStrokeRect_vertLoopEvenAlignedNextRow
|
||||
|
||||
WGStrokeRect_vertLoopEvenAlignedOddWidth:
|
||||
; CASE 1a: Left edge even-aligned, odd width
|
||||
SETSWITCH PAGE2ON
|
||||
lda PARAM2 ; Calculate right edge
|
||||
inc
|
||||
inc
|
||||
lsr
|
||||
tay
|
||||
lda #CH_RIGHT ; Plot the right edge
|
||||
sta (BASL),y
|
||||
|
||||
WGStrokeRect_vertLoopEvenAlignedNextRow:
|
||||
plx ; Prepare for next row
|
||||
inx
|
||||
cpx SCRATCH0
|
||||
bne WGStrokeRect_vertLoop
|
||||
jmp WGStrokeRect_done
|
||||
|
||||
|
||||
WGStrokeRect_vertLoopOdd:
|
||||
; CASE 2: Left edge odd-aligned, even width
|
||||
SETSWITCH PAGE2OFF
|
||||
ldy #$0
|
||||
lda #CH_LEFT ; Plot the left edge
|
||||
sta (BASL),y
|
||||
|
||||
lda PARAM2 ; Is width even?
|
||||
inc
|
||||
inc
|
||||
and #$01
|
||||
bne WGStrokeRect_vertLoopOddAlignedOddWidth
|
||||
|
||||
lda PARAM2 ; Calculate right edge
|
||||
inc
|
||||
inc
|
||||
lsr
|
||||
tay
|
||||
SETSWITCH PAGE2ON
|
||||
lda #CH_RIGHT ; Plot the right edge
|
||||
sta (BASL),y
|
||||
jmp WGStrokeRect_vertLoopOddAlignedNextRow
|
||||
|
||||
WGStrokeRect_vertLoopOddAlignedOddWidth:
|
||||
; CASE 2a: Left edge odd-aligned, odd width
|
||||
SETSWITCH PAGE2OFF
|
||||
lda PARAM2 ; Calculate right edge
|
||||
inc
|
||||
inc
|
||||
lsr
|
||||
tay
|
||||
lda #CH_RIGHT ; Plot the right edge
|
||||
sta (BASL),y
|
||||
|
||||
WGStrokeRect_vertLoopOddAlignedNextRow:
|
||||
plx ; Prepare for next row
|
||||
inx
|
||||
cpx SCRATCH0
|
||||
bne WGStrokeRect_vertLoopJmp
|
||||
jmp WGStrokeRect_done
|
||||
WGStrokeRect_vertLoopJmp:
|
||||
jmp WGStrokeRect_vertLoop
|
||||
|
||||
WGStrokeRect_done:
|
||||
RESTORE_ZPS
|
||||
RESTORE_AXY
|
||||
rts
|
||||
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
; WGPlot
|
||||
; Plots a character at current cursor position (assumes 80 cols)
|
||||
; A: Character to plot
|
||||
; Side effects: Clobbers SCRATCH0,BASL,BASH
|
||||
;
|
||||
WGPlot:
|
||||
sta SCRATCH0
|
||||
SAVE_AXY
|
||||
SAVE_ZPS
|
||||
|
||||
ldx WG_CURSORY
|
||||
lda TEXTLINES_L,x ; Compute video memory address of point
|
||||
sta BASL
|
||||
lda TEXTLINES_H,x
|
||||
sta BASH
|
||||
|
||||
lda WG_CURSORX
|
||||
lsr
|
||||
clc
|
||||
adc BASL
|
||||
sta BASL
|
||||
lda #$0
|
||||
adc BASH
|
||||
sta BASH
|
||||
|
||||
lda WG_CURSORX ; X even?
|
||||
and #$01
|
||||
bne WGPlot_xOdd
|
||||
|
||||
SETSWITCH PAGE2ON ; Plot the character
|
||||
ldy #$0
|
||||
lda SCRATCH0
|
||||
sta (BASL),y
|
||||
jmp WGPlot_done
|
||||
|
||||
WGPlot_xOdd:
|
||||
SETSWITCH PAGE2OFF ; Plot the character
|
||||
ldy #$0
|
||||
lda SCRATCH0
|
||||
sta (BASL),y
|
||||
|
||||
WGPlot_done:
|
||||
RESTORE_ZPS
|
||||
RESTORE_AXY
|
||||
rts
|
||||
|
||||
|
||||
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
; WGPrintASCII
|
||||
; Prints a null-terminated ASCII string at the current view's
|
||||
; cursor position. Clips to current view
|
||||
; PARAM0: String pointer, LSB
|
||||
; PARAM1: String pointer, MSB
|
||||
; Side effects: Clobbers BASL,BASH
|
||||
;
|
||||
WGPrintASCII:
|
||||
SAVE_AXY
|
||||
SAVE_ZPS
|
||||
|
||||
jsr WGSyncGlobalCursor
|
||||
|
||||
LDY_ACTIVEVIEW
|
||||
|
||||
iny ; Clip to upper extent
|
||||
lda WG_CURSORY
|
||||
cmp WG_VIEWRECORDS,y
|
||||
bcc WGPrintASCII_done
|
||||
|
||||
lda WG_VIEWRECORDS,y ; Clip to lower extent
|
||||
iny
|
||||
iny
|
||||
clc
|
||||
adc WG_VIEWRECORDS,y
|
||||
dec
|
||||
cmp WG_CURSORY
|
||||
bcc WGPrintASCII_done
|
||||
|
||||
jsr WGStrLen ; We'll need the length of the string to clip horizontally
|
||||
sta SCRATCH0
|
||||
|
||||
dey ; Clip left/right extents
|
||||
dey
|
||||
dey
|
||||
lda WG_CURSORX ; startIndex = -(globalX - windowStartX)
|
||||
sec
|
||||
sbc WG_VIEWRECORDS,y
|
||||
eor #$ff
|
||||
inc
|
||||
bmi WGPrintASCII_leftEdgeStart
|
||||
cmp SCRATCH0
|
||||
bcs WGPrintASCII_done ; Entire string is left of window
|
||||
|
||||
tax ; Starting mid-string on the left
|
||||
lda WG_VIEWRECORDS,y
|
||||
sta WG_CURSORX
|
||||
txa
|
||||
bra WGPrintASCII_findRightEdge
|
||||
|
||||
WGPrintASCII_leftEdgeStart:
|
||||
lda #0
|
||||
|
||||
WGPrintASCII_findRightEdge:
|
||||
pha ; Stash start index
|
||||
|
||||
lda WG_VIEWRECORDS,y
|
||||
iny
|
||||
iny
|
||||
clc
|
||||
adc WG_VIEWRECORDS,y
|
||||
tax
|
||||
dex
|
||||
ply ; End cursor in X, start index in Y
|
||||
|
||||
WGPrintASCII_loop:
|
||||
cpx WG_CURSORX
|
||||
bcc WGPrintASCII_done ; Hit the right edge of the window
|
||||
lda (PARAM0),y
|
||||
beq WGPrintASCII_done ; Hit the end of the string
|
||||
ora #$80
|
||||
jsr WGPlot
|
||||
|
||||
iny
|
||||
clc
|
||||
lda #1
|
||||
adc WG_CURSORX
|
||||
sta WG_CURSORX
|
||||
lda #0
|
||||
adc WG_CURSORY
|
||||
sta WG_CURSORY
|
||||
jmp WGPrintASCII_loop
|
||||
|
||||
WGPrintASCII_done:
|
||||
RESTORE_ZPS
|
||||
RESTORE_AXY
|
||||
rts
|
||||
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
; WGPrint
|
||||
; Prints a null-terminated Apple string at the current view's
|
||||
; cursor position. Clips to current view.
|
||||
; PARAM0: String pointer, LSB
|
||||
; PARAM1: String pointer, MSB
|
||||
; Side effects: Clobbers BASL,BASH
|
||||
;
|
||||
WGPrint:
|
||||
SAVE_AXY
|
||||
SAVE_ZPS
|
||||
|
||||
|
||||
|
||||
|
||||
WGPrint_done:
|
||||
RESTORE_ZPS
|
||||
RESTORE_AXY
|
||||
rts
|
29
switches.s
Normal file
29
switches.s
Normal file
@ -0,0 +1,29 @@
|
||||
;
|
||||
; switches.s
|
||||
; Softswitches for Apple ][
|
||||
;
|
||||
; Created by Quinn Dunki on 8/15/14.
|
||||
; Copyright (c) 2014 One Girl, One Laptop Productions. All rights reserved.
|
||||
;
|
||||
|
||||
|
||||
PAGE2 = $c01c ; Read bit 7
|
||||
PAGE2OFF = $c054 ; Read/Write
|
||||
PAGE2ON = $c055 ; Read/Write
|
||||
|
||||
COL80 = $c01f ; Read bit 7
|
||||
COL80OFF = $c00c ; Write
|
||||
COL80ON = $c00d ; Write
|
||||
|
||||
STORE80 = $c018 ; Read bit 7
|
||||
STORE80OFF = $c000 ; Write
|
||||
STORE80ON = $c001 ; Write
|
||||
|
||||
TEXT = $c01a ; Read bit 7
|
||||
TEXTOFF = $c050 ; Read/Write
|
||||
TEXTON = $C051 ; Read/Write
|
||||
|
||||
KBD = $c000 ; Read
|
||||
KBDSTRB = $c010 ; Read/Write
|
||||
|
||||
RDVBLBAR = $C019 ; Read bit 7 (active low)
|
85
unit_test.s
Normal file
85
unit_test.s
Normal file
@ -0,0 +1,85 @@
|
||||
;
|
||||
; unit_test.s
|
||||
; WeeGui
|
||||
;
|
||||
; Unit tests of various systems
|
||||
;
|
||||
; Created by Quinn Dunki on 8/15/14.
|
||||
; Copyright (c) 2014 One Girl, One Laptop Productions. All rights reserved.
|
||||
;
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
; tortureTestRects
|
||||
; Strokes and paints rectangles of many different geometries
|
||||
;
|
||||
; Stack:
|
||||
; Curr X
|
||||
; Curr Y
|
||||
; Curr Width
|
||||
; Curr Height
|
||||
tortureTestRects:
|
||||
jsr WGClearScreen
|
||||
|
||||
lda #38 ; Initialize
|
||||
pha
|
||||
lda #11
|
||||
pha
|
||||
lda #2
|
||||
pha
|
||||
lda #2
|
||||
pha
|
||||
|
||||
tortureTestRectsLoop:
|
||||
|
||||
jsr WGClearScreen
|
||||
|
||||
tsx
|
||||
inx
|
||||
lda $0100,x ; Load Height, then modify
|
||||
sta PARAM3
|
||||
inc
|
||||
inc
|
||||
sta $0100,x
|
||||
cmp #25
|
||||
bcs tortureTestRectsDone
|
||||
|
||||
inx ; Load Width, then modify
|
||||
lda $0100,x
|
||||
sta PARAM2
|
||||
inc
|
||||
inc
|
||||
inc
|
||||
inc
|
||||
inc
|
||||
inc
|
||||
sta $0100,x
|
||||
|
||||
inx ; Load Y, then modify
|
||||
lda $0100,x
|
||||
sta PARAM1
|
||||
dec
|
||||
sta $0100,x
|
||||
|
||||
inx ; Load X, then modify
|
||||
lda $0100,x
|
||||
sta PARAM0
|
||||
dec
|
||||
dec
|
||||
dec
|
||||
sta $0100,x
|
||||
|
||||
; ldx #'Q'+$80
|
||||
; jsr WGFillRect
|
||||
jsr WGStrokeRect
|
||||
|
||||
; jsr delayShort
|
||||
|
||||
jmp tortureTestRectsLoop
|
||||
|
||||
tortureTestRectsDone:
|
||||
pla
|
||||
pla
|
||||
pla
|
||||
pla
|
||||
jmp tortureTestRects
|
||||
|
133
utility.s
Normal file
133
utility.s
Normal file
@ -0,0 +1,133 @@
|
||||
;
|
||||
; utility.s
|
||||
; General utilities for 6502
|
||||
;
|
||||
; Created by Quinn Dunki on 8/15/14.
|
||||
; Copyright (c) 2014 One Girl, One Laptop Productions. All rights reserved.
|
||||
;
|
||||
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
; delay
|
||||
; Sleeps for ~1 second
|
||||
;
|
||||
delay:
|
||||
SAVE_AXY
|
||||
|
||||
ldy #$ce ; Loop a bunch
|
||||
delayOuter:
|
||||
ldx #$ff
|
||||
delayInner:
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
dex
|
||||
bne delayInner
|
||||
dey
|
||||
bne delayOuter
|
||||
|
||||
RESTORE_AXY
|
||||
rts
|
||||
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
; delayShort
|
||||
; Sleeps for ~1/30th second
|
||||
;
|
||||
delayShort:
|
||||
SAVE_AXY
|
||||
|
||||
ldy #$06 ; Loop a bit
|
||||
delayShortOuter:
|
||||
ldx #$ff
|
||||
delayShortInner:
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
dex
|
||||
bne delayShortInner
|
||||
dey
|
||||
bne delayShortOuter
|
||||
|
||||
RESTORE_AXY
|
||||
rts
|
||||
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;
|
||||
; scanHexDigit
|
||||
; Scans a 4 bit hex value from an ASCII character
|
||||
; A: ASCII character
|
||||
; Out A: Hex value
|
||||
;
|
||||
scanHexDigit:
|
||||
cmp #'A'
|
||||
bcs scanHexDigitLetter
|
||||
sec
|
||||
sbc #'0'
|
||||
jmp scanHexDigitDone
|
||||
|
||||
scanHexDigitLetter:
|
||||
sec
|
||||
sbc #55
|
||||
|
||||
scanHexDigitDone:
|
||||
rts
|
||||
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;
|
||||
; scanHex8
|
||||
; Scans an 8 bit hex value from a string
|
||||
; PARAM0: Pointer to string (LSB)
|
||||
; PARAM1: Pointer to string (MSB)
|
||||
; Y: Offset into string
|
||||
; Out A: 8-bit hex value
|
||||
; Side effects: Clobbers Y and S0
|
||||
;
|
||||
scanHex8:
|
||||
lda (PARAM0),y
|
||||
jsr scanHexDigit
|
||||
asl
|
||||
asl
|
||||
asl
|
||||
asl
|
||||
sta SCRATCH0 ; Stash first digit for later
|
||||
|
||||
iny
|
||||
lda (PARAM0),y
|
||||
jsr scanHexDigit
|
||||
ora SCRATCH0
|
||||
iny ; Be nice and advance Y to end
|
||||
rts
|
||||
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
; WGStrLen
|
||||
; Finds the length of a null-terminated string
|
||||
; PARAM0: String pointer, LSB
|
||||
; PARAM1: String pointer, MSB
|
||||
; Return: A: String length, not including null
|
||||
;
|
||||
WGStrLen:
|
||||
phy
|
||||
|
||||
ldy #$0
|
||||
WGStrLen_loop:
|
||||
lda (PARAM0),y
|
||||
beq WGStrLen_done
|
||||
iny
|
||||
bra WGStrLen_loop
|
||||
|
||||
WGStrLen_done:
|
||||
tya
|
||||
ply
|
||||
rts
|
||||
|
||||
|
249
views.s
Normal file
249
views.s
Normal file
@ -0,0 +1,249 @@
|
||||
;
|
||||
; views.s
|
||||
; Management routines for GUI views
|
||||
;
|
||||
; Created by Quinn Dunki on 8/15/14.
|
||||
; Copyright (c) 2014 One Girl, One Laptop Productions. All rights reserved.
|
||||
;
|
||||
|
||||
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
; WGCreateView
|
||||
; Creates a new view
|
||||
; PARAM0: Pointer to configuration string (LSB)
|
||||
; PARAM1: Pointer to configuration string (MSB)
|
||||
;
|
||||
; Configuration string: "STXXYYSWSHVWVH"
|
||||
; ST: (4:4) Style:ID
|
||||
; XX: Screen X origin
|
||||
; YY: Screen Y origin
|
||||
; SW: Screen width
|
||||
; SH: Screen height
|
||||
; VW: View Width
|
||||
; VH: View Height
|
||||
;
|
||||
WGCreateView:
|
||||
SAVE_AXY
|
||||
SAVE_ZPS
|
||||
|
||||
ldy #0
|
||||
jsr scanHex8
|
||||
pha
|
||||
|
||||
and #%00001111 ; Find our new view record
|
||||
asl
|
||||
asl
|
||||
asl
|
||||
asl ; Records are 8 bytes wide
|
||||
tax
|
||||
|
||||
pla ; Cache style nybble for later
|
||||
lsr
|
||||
lsr
|
||||
lsr
|
||||
lsr
|
||||
pha
|
||||
|
||||
jsr scanHex8
|
||||
sta WG_VIEWRECORDS,x ; Screen X
|
||||
inx
|
||||
|
||||
jsr scanHex8
|
||||
sta WG_VIEWRECORDS,x ; Screen Y
|
||||
inx
|
||||
|
||||
jsr scanHex8
|
||||
sta WG_VIEWRECORDS,x ; Screen Width
|
||||
inx
|
||||
|
||||
jsr scanHex8
|
||||
sta WG_VIEWRECORDS,x ; Screen Height
|
||||
inx
|
||||
|
||||
pla
|
||||
sta WG_VIEWRECORDS,x ; Style
|
||||
inx
|
||||
|
||||
lda #0 ; Initialize scrolling
|
||||
sta WG_VIEWRECORDS,x
|
||||
inx
|
||||
sta WG_VIEWRECORDS,x
|
||||
inx
|
||||
|
||||
jsr scanHex8
|
||||
sta WG_VIEWRECORDS,x ; View Width
|
||||
inx
|
||||
|
||||
jsr scanHex8
|
||||
sta WG_VIEWRECORDS,x ; View Height
|
||||
|
||||
WGCreateView_done:
|
||||
RESTORE_ZPS
|
||||
RESTORE_AXY
|
||||
rts
|
||||
|
||||
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
; WGPaintView
|
||||
; Paints the current view
|
||||
;
|
||||
WGPaintView:
|
||||
SAVE_AY
|
||||
SAVE_ZPP
|
||||
|
||||
LDY_ACTIVEVIEW
|
||||
|
||||
lda WG_VIEWRECORDS,y ; Fetch the record
|
||||
sta PARAM0
|
||||
iny
|
||||
lda WG_VIEWRECORDS,y
|
||||
sta PARAM1
|
||||
iny
|
||||
lda WG_VIEWRECORDS,y
|
||||
sta PARAM2
|
||||
iny
|
||||
lda WG_VIEWRECORDS,y
|
||||
sta PARAM3
|
||||
|
||||
jsr WGStrokeRect
|
||||
|
||||
WGPaintView_done:
|
||||
RESTORE_ZPP
|
||||
RESTORE_AY
|
||||
rts
|
||||
|
||||
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
; WGSelectView
|
||||
; Selects the active view
|
||||
; A: ID
|
||||
;
|
||||
WGSelectView:
|
||||
SAVE_AY
|
||||
sta WG_ACTIVEVIEW
|
||||
|
||||
LDY_ACTIVEVIEW
|
||||
|
||||
; Initialize cursor to local origin
|
||||
lda #0
|
||||
sta WG_LOCALCURSORX
|
||||
sta WG_LOCALCURSORY
|
||||
|
||||
WGSelectView_done:
|
||||
RESTORE_AY
|
||||
rts
|
||||
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
; WGSetCursor
|
||||
; Sets the current local view cursor
|
||||
; X: X
|
||||
; Y: Y
|
||||
;
|
||||
WGSetCursor:
|
||||
stx WG_LOCALCURSORX
|
||||
sty WG_LOCALCURSORY
|
||||
rts
|
||||
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
; WGSyncGlobalCursor
|
||||
; Synchronizes the global cursor with the current local view's
|
||||
; cursor
|
||||
;
|
||||
WGSyncGlobalCursor:
|
||||
SAVE_AY
|
||||
|
||||
; X
|
||||
LDY_ACTIVEVIEW
|
||||
|
||||
clc ; Transform to viewspace
|
||||
lda WG_LOCALCURSORX
|
||||
adc WG_VIEWRECORDS,y
|
||||
|
||||
iny
|
||||
iny
|
||||
iny
|
||||
iny
|
||||
iny
|
||||
clc
|
||||
adc WG_VIEWRECORDS,y ; Transform to scrollspace
|
||||
sta WG_CURSORX
|
||||
|
||||
; Y
|
||||
LDY_ACTIVEVIEW
|
||||
iny
|
||||
|
||||
clc ; Transform to viewspace
|
||||
lda WG_LOCALCURSORY
|
||||
adc WG_VIEWRECORDS,y
|
||||
|
||||
iny
|
||||
iny
|
||||
iny
|
||||
iny
|
||||
iny
|
||||
clc
|
||||
adc WG_VIEWRECORDS,y ; Transform to scrollspace
|
||||
sta WG_CURSORY
|
||||
|
||||
WGSyncGlobalCursor_done:
|
||||
RESTORE_AY
|
||||
rts
|
||||
|
||||
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
; WGScrollX
|
||||
; Scrolls the current view horizontally
|
||||
; A: Delta to scroll
|
||||
; Side effects: Clobbers A
|
||||
;
|
||||
WGScrollX:
|
||||
phy
|
||||
pha
|
||||
LDY_ACTIVEVIEW
|
||||
pla
|
||||
iny
|
||||
iny
|
||||
iny
|
||||
iny
|
||||
iny
|
||||
clc
|
||||
adc WG_VIEWRECORDS,y
|
||||
sta WG_VIEWRECORDS,y
|
||||
|
||||
WGScrollX_done:
|
||||
ply
|
||||
rts
|
||||
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
; WGScrollY
|
||||
; Scrolls the current view vertically
|
||||
; A: Delta to scroll
|
||||
; Side effects: Clobbers A
|
||||
;
|
||||
WGScrollY:
|
||||
phy
|
||||
pha
|
||||
LDY_ACTIVEVIEW
|
||||
pla
|
||||
iny
|
||||
iny
|
||||
iny
|
||||
iny
|
||||
iny
|
||||
iny
|
||||
clc
|
||||
adc WG_VIEWRECORDS,y
|
||||
sta WG_VIEWRECORDS,y
|
||||
|
||||
WGScrollY_done:
|
||||
ply
|
||||
rts
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user