From 14bf02cf3d7bc56b460ae4779ebed87af3f96436 Mon Sep 17 00:00:00 2001 From: Lee Fastenau Date: Thu, 11 Apr 2019 23:34:51 -0700 Subject: [PATCH] Initial commit --- .gitignore | 3 + include/print | 23 +++++ include/stdio | 217 +++++++++++++++++++++++++++++++++++++++++ main.sublime-project | 25 +++++ makefile | 75 ++++++++++++++ res/dos3.3bootable.dsk | Bin 0 -> 143360 bytes res/runner.scpt | Bin 0 -> 2632 bytes src/main.asm | 23 +++++ 8 files changed, 366 insertions(+) create mode 100644 .gitignore create mode 100644 include/print create mode 100644 include/stdio create mode 100644 main.sublime-project create mode 100644 makefile create mode 100644 res/dos3.3bootable.dsk create mode 100644 res/runner.scpt create mode 100644 src/main.asm diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ea7a9c6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +*.sublime-workspace +/build +.DS_Store diff --git a/include/print b/include/print new file mode 100644 index 0000000..52a9e7a --- /dev/null +++ b/include/print @@ -0,0 +1,23 @@ +print subroutine + pla + sta $06 + pla + sta $07 + ldy #0 +.loop + inc $06 + bne .next + inc $07 +.next + lda ($06),y + beq .done + ora #$80 + jsr COUT + bne .loop +.done + jsr CROUT + inc $06 + bne .end + inc $07 +.end + jmp ($06) \ No newline at end of file diff --git a/include/stdio b/include/stdio new file mode 100644 index 0000000..b22dcf8 --- /dev/null +++ b/include/stdio @@ -0,0 +1,217 @@ +; Source: +; Assembly Cookbook for the Apple II/IIe part two by Don Lancaster +; https://www.americanradiohistory.com/Archive-Don-Lancaster/aacb2.pdf + +WNDLFT EQU $20 ; SCROLL WINDOW LEFT +WNDWDTH EQU $21 ; SCROLL WINDOW WIDTH +WNDTOP EQU $22 ; SCROLL WINDOW TOP +WNDBOT EQU $23 ; SCROLL WINDOW BOTTOM +CH EQU $24 ; CURSOR HORIZONTAL +CV EQU $25 ; CURSOR VERTICAL +GBASL EQU $26 ; LORES BASE LOW +GBASH EQU $27 ; LORES BASE HIGH +BASL EQU $28 ; TEXT BASE LOW +BASH EQU $29 ; TEXT BASE HIGH +HEND EQU $2C ; LORES RIGHT END H LINE +VBOT EQU $2D ; LORES BOTTOM OF V LINE +COLOR EQU $30 ; LORES COLOR +INVFLG EQU $31 ; NORMAL/INVERSE/FLASH (FF,7F,3F) +PROMPT EQU $33 ; HOLDS PROMPT SYMBOL +CSWL EQU $36 ; OUTPUT CHARACTER HOOK LOW +CSWH EQU $37 ; OUTPUT CHARACTER HOOK HIGH +KSWL EQU $38 ; INPUT CHARACTER HOOK LOW +KSWH EQU $39 ; INPUT CHARACTER HOOK HIGH +RNDL EQU $4E ; RANDOM NUMBER LOW +RNDH EQU $4F ; RANDOM NUMBER HIGH + +STACK EQU $0100 ; STACK PAGE ACCESS + +KEYBUF EQU $0200 ; KEYBUFFER START + +DOSWRM EQU $03D0 ; DOS WARM START JMP +DOSCLD EQU $03D3 ; DOS COLD START JMP +DOSFLM EQU $03D6 ; DOS FILE MANAGER JUMP +DOSRWTS EQU $03D9 ; DOS RWTS JUMP +DOSIPRM EQU $03DC ; DOS FILE PARAMETER FIND JUMP +DOSRWLS EQU $03E3 ; DOS RWTS PARAMETER FIND JUMP +DOSHOOK EQU $03EA ; DOS HOOK RECONNECT JUMP +BRK EQU $03F0 ; BREAK ADDRESS (AUTOSTART & 2E ONLY!) +SOFTEV EQU $03F2 ; SOFT RESET (AUTOSTART & 2E ONLY!) +PWRDUP EQU $03F4 ; WARM START EOR CHECKSUM +AMPERV EQU $03F5 ; APPLESOFT "&" JUMP +USRADR EQU $03F8 ; CTRL-Y JUMP +NMI EQU $03FB ; NON-MASKABLE INTERRUPT JUMP +IRQLOC EQU $03FE ; INTERRUPT ADDRESS LOW + +TEXTP1 EQU $0400 ; START OF TEXT PAGE ONE +TEXTP2 EQU $0800 ; START OF TEXT PAGE TWO +HIRESP1 EQU $2000 ; START OF HIRES PAGE ONE +HIRESP2 EQU $4000 ; START OF HIRES PAGE TWO + +IOADR EQU $C000 ; KEYBOARD INPUT +KBDSTR EQU $C010 ; KEYSTROBE RESET +TAPEOUT EQU $C020 ; CASSETTE OR AUDIO OUT +SPKR EQU $C030 ; SPEAKER CLICK OUTPUT +STROBE EQU $C040 ; GAME CONNECTOR STROBE +TXTCLR EQU $C050 ; GRAPHICS ON SOFT SWITCH +TXTSET EQU $C051 ; TEXT ON SOFT SWITCH +MIXCLR EQU $C052 ; FULL SCREEN SOFT SWITCH +MIXSET EQU $C053 ; MIXED SCREEN SOFT SWITCH +LOWSCR EQU $C054 ; PAGE ONE SOFT SWITCH +HISCR EQU $C055 ; PAGE TWO SOFT SWITCH +LORES EQU $C056 ; LORES SOFT SWITCH +HIRES EQU $C057 ; HIRES SOFT SWITCH +PB4 EQU $C060 ; CASS IN + "FOURTH" PB INPUT "SW3" +PB1 EQU $C061 ; OPEN APPLE + "FIRST" PB INPUT "SW0" +PB2 EQU $C062 ; CLOSED APPLE + "SECOND" PB INPUT "SW1" +PB3 EQU $C063 ; "THIRD" PUSHBUTTON INPUT "SW2" +PDL0 EQU $C064 ; GAME PADDLE 0 ANALOG IN +PDL1 EQU $C065 ; GAME PADDLE 1 ANALOG IN +PDL2 EQU $C066 ; GAME PADDLE 2 ANALOG IN +PDL3 EQU $C067 ; GAME PADDLE 3 ANALOG IN +PTRIG EQU $C070 ; ANALOG PADDLE RESET + +STEP00 EQU $C080 ; DISK STEPPER PHASE 0 OFF +STEP01 EQU $C081 ; DISK STEPPER PHASE 0 ON +STEP10 EQU $C082 ; DISK STEPPER PHASE 1 OFF +STEP11 EQU $C083 ; DISK STEPPER PHASE 1 ON +STEP20 EQU $C084 ; DISK STEPPER PHASE 2 OFF +STEP21 EQU $C085 ; DISK STEPPER PHASE 2 ON +STEP30 EQU $C086 ; DISK STEPPER PHASE 3 OFF +STEP31 EQU $C087 ; DISK STEPPER PHASE 3 ON +MOTON EQU $C088 ; DISK MAIN MOTOR OFF +MOTOFF EQU $C089 ; DISK MAIN MOTOR ON +DRV0EN EQU $C08A ; DISK ENABLE DRIVE 1 +DRV1EN EQU $C08B ; DISK ENABLE DRIVE 2 +Q6CLR EQU $C08C ; DISK Q6 CLEAR +Q6SET EQU $C08D ; DISK 06 SET +Q7CLR EQU $C08E ; DISK 07 CLEAR +Q7SET EQU $C08F ; DISK 07 SET + +BASICLD EQU $E000 ; ENTER BASIC COLD +BASICWM EQU $E003 ; RE-ENTER BASIC WARM + +HGR2 EQU $F3D8 ; APPLESOFT CLEAR TO HIRES 2 +HGR EQU $F3E2 ; APPLESOFT CLEAR TO HIRES 1 +BKGND EQU $F3F4 ; APPLESOFT HIRES BACKGROUND CLEAR +HCOLOR EQU $F6F0 ; APPLESOFT HIRES COLOR SELECT +HPOSN EQU $F411 ; APPLESOFT HIRES POSITION +HPLOT EQU $F457 ; APPLESOFT HIRES PLOT + +PLOT EQU $F800 ; PLOT LORES BLOCK +HLINE EQU $F819 ; HORIZ LORES LINE +VLINE EQU $F828 ; VERTICAL LORES LINE +CLRSCR EQU $F832 ; CLEAR FULL LORES SCREEN +CLRTOP EQU $F836 ; CLEAR TOP LORES SCREEN +GBSCALC EQU $F847 ; LORES BASE CALCULATION +NEXTCOL EQU $F85F ; INCREASE LORES COLOR BY 3 +SETCOL EQU $F864 ; SET LORES COLOR +SCRN EQU $F871 ; READ LORES SCREEN COLOR +PRNTAX EQU $F941 ; OUTPUT A THEN X. AS HEX +PRBLNK EQU $F948 ; OUTPUT 3 SPACES VIA BOOKS +PRBL2 EQU $F94A ; OUTPUT X BLANKS VIA HOOKS + +REGDSP EQU $FAD7 ; DISPLAY WORKING REGISTERS +PREAD EQU $FB1E ; READ GAME PADDLE X +INIT EQU $FB2F ; INITIALIZE TEXT SCREEN +SETTXT EQU $FB93 ; SET UP TEXT SCREEN (NOT 2E!) +SETGR EQU $FB40 ; SET UP GRAPHICS SCREEN +SETWND EQU $FB4B ; SET NORMAL TEXT WINDOW +BASCALC EQU $FBC1 ; CALCULATE TEXT BASE ADDRESS (NOT 2E!} +BELL1 EQU $FBD9 ; BEEP SPEAKER IF CTRL-G +BELL2 EQU $FBE4 ; BEEP SPEAKER ONCE +ADVANCE EQU $FBF4 ; TEXT CURSOR ONE TO RIGHT +VIDOUT EQU $FBFD ; OUTPUT ASCII TO SCREEN ONLY + +BS EQU $FC10 ; BACKSPACE SCREEN +UP EQU $FC1A ; MOVE SCREEN CURSOR UP ONE LINE +VTAB EQU $FC22 ; VERTICAL SCREEN TAB USING CV +VTABA EQU $FC24 ; VERTICAL SCREEN TAB USING A +ESC1 EQU $FC66 ; PROCESS ESCAPE CURSOR MOVES +CLREOP EQU $FC42 ; CLEAR TO END OF PAGE +HOME EQU $FC58 ; CLEAR TEXT SCREEN AND HOME CURSOR +CR EQU $FC62 ; CARRIAGE RETURN TO SCREEN +LF EQU $FC66 ; LINEFEED TO SCREEN ONLY +SCROLL EQU $FC70 ; SCROLL TEXT SCREEN UP ONE +CLEOL EQU $FC9C ; CLEAR TEXT TO END OF LINE +WAIT EQU $FCA8 ; TIME DELAY SET BY ACCUMULATOR +RDKEY EQU $FD0C ; GET INPUT CHARACTER VIA HOOKS +KEYIN EQU $FD1B ; READ THE APPLE KEYBOARD +RDCHAR EQU $FD35 ; GET KEY AND PROCESS ESC A-F +CANCEL EQU $FD62 ; CANCEL KEYBOARD LINE ENTRY +GETLNZ EQU $FD67 ; CR THEN GET KEYBOARD INPUT LINE +GETLN EQU $FD6A ; GET KEYBOARD INPUT LINE +GETLN1 EQU $FD6F ; GET KBD INPUT, NO PROMPT +CROUT1 EQU $FD8B ; CLEAR EOL THEN CR VIA BOOKS +CROUT EQU $FD8E ; OUTPUT CR VIA HOOKS +PRBYTE EQU $FDDA ; OUTPUT FULL A IN HEX TO HOOKS +PRHEX EQU $FDE3 ; OUTPUT LOW A IN HEX TO HOOKS +COUT EQU $FDED ; OUTPUT CHARACTER VIA HOOKS +COUT1 EQU $FDF0 ; OUTPUT CHARACTER TO SCREEN + +MOVE EQU $FE2C ; MOVE BLOCK OF MEMORY +VERIFY EQU $FE36 ; VERIFY BLOCK OF MEMORY +LIST EQU $FE5E ; DISASSEMBLE 20 INSTRUCTIONS +LIST2 EQU $FE63 ; DISASSEMBLE •A• INSTRUCTIONS +SETINV EQU $FE80 ; PRINT INVERSE TEXT TO SCREEN +SETNORM EQU $FE84 ; PRINT NORMAL TEXT TO SCREEN +SETVID EQU $FE93 ; GRAB OUTPUT HOOKS FOR SCREEN +XBASIC EQU $FEB0 ; GO BASIC, DESTROYING OLD +BASCON EQU $FEB3 ; GO BASIC, CONTINUING OLD +TRACE EQU $FEC2 ; START TRACING (OLD ROM ONLY!) +STEP EQU $FEC4 ; SINGLE STEP (OLD ROM ONLY!) +WRITE EQU $FECD ; WRITE TO CASSETTE TAPE +READ EQU $FEFD ; READ FROM CASSETTE TAPE +PRERR EQU $FF2D ; PRINT "ERR" TO OUTPUT HOOK +BELL EQU $FF3A ; OUTPUT BELL TO HOOKS +IORESR EQU $FF3F ; RESTORE ALL WORKING REGISTERS +IOSAVE EQU $FF4A ; SAVE ALL WORKING REGISTERS +RETURN EQU $FF58 ; "GUARANTEED" RETURN +OLDRST EQU $FF59 ; OLD RESET, NO AUTOSTART +MON EQU $FF65 ; ENTER MONITOR AND BEEP SPEAKER +MONZ EQU $FF69 ; ENTER MONITOR QUIETLY +GETNUM EQU $FFA7 ; ASCII TO HEX IN 3E & 3F + + ; *** HOOKS FOR 2E ONLY! *** + +CLRSOCO EQU $C000 ; SO STORE OFF (WRITE ONLY) +SETSOCO EQU $C001 ; SO STORE ON (WRITE ONLY) +RAMRDMN EQU $C002 ; READ MAIN MEMORY (WRITE ONLY) +RAMRDAX EQU $C003 ; READ AUXILIARY MEMORY (WRITE ONLY) +RAMWRMN EQU $C004 ; WRITE MAIN MEMORY (WRITE ONLY) +RAMWRAX EQU $C005 ; WRITE AUXILIARY MEMORY (WRITE ONLY) +SLOTXRM EQU $C006 ; INTERNAL ROM AT CXOO (WRITE ONLY) +SLOTXEX EQU $C007 ; SLOT ROM AT CXOO (WRITE ONLY) + +MAINZP EQU $C008 ; USE MAIN ZERO PAGE (WRITE ONLY) +ALTZP EQU $C009 ; USE ALTERNATE ZERO PAGE (WRITE ONLY) +SLOT3RM EQU $C00A ; SLOT #3 INTERNAL ROM (WRITE ONLY) +SLOT3EX EQU $C00B ; SLOT #3 EXTERNAL ROM (WRITE ONLY) +OFFSOCL EQU $C00C ; TURN 80 COLUMN OFF (WRITE ONLY) +ONSOCOL EQU $C00D ; TURN 80 COLUMN ON (WRITE ONLY) +ALTCSOF EQU $C00E ; USE MAIN CHARACTER SET (WRITE ONLY) +ALTCSON EQU $C00F ; USE ALT CHARACTER SET (WRITE ONLY) + +RAMRDS EQU $C013 ; 1 READ RAMREAD SWITCH (READ ONLY) +RAMWTS EQU $C014 ; , READ RAMWRITE SWITCH (READ ONLY) +SLTCXS EQU $C015 ; , READ SLOT CX SWITCH (READ ONLY) +ALTZPS EQU $C016 ; , READ ZERO PAGE SWITCH (READ ONLY) +SLTC3S EQU $C017 ; READ SLOT C3 SWITCH (READ ONLY) + +S80STR EQU $C018 ; READ 80STORE SWITCH (READ ONLY) +VBL EQU $C019 ; VERT. BLANKING >80=BLANK (READ ONLY) +TEXTS EQU $C01A ; READ TEXT SWITCH (READ ONLY) +MIXEDS EQU $C01B ; READ MIXED GR SWITCH (READ ONLY) +PAGE2S EQU $C01C ; READ PAGE 2 SWITCH (READ ONLY) +HIRESS EQU $C01D ; READ HIRES SWITCH (READ ONLY) +ALTCSS EQU $C01E ; READ ALTCHAR SET SWITCH (READ ONLY) +S80COL EQU $C01F ; READ 80 COLUMN SWITCH (READ ONLY) + +RB2RAM EQU $C080 ; READ BANK 2 RAM +WB2RAM EQU $C081 ; WRITE BANK 2 RAM, READ ROM +RROM EQU $C082 ; READ ROM ONLY, NO WRITE +RWRAM2 EQU $C083 ; READ & WRITE RAM2 (HIT TWICE!) +RRAM1 EQU $C088 ; READ BANK1 RAM +WRAM1 EQU $C0B9 ; WRITE BANK1 RAM, READ ROM +RB1ROM EQU $C08A ; READ BANK1 ROM +RWRAM1 EQU $C08B ; READ & WRITE RAM1 (HIT TWICE!) diff --git a/main.sublime-project b/main.sublime-project new file mode 100644 index 0000000..3b181bb --- /dev/null +++ b/main.sublime-project @@ -0,0 +1,25 @@ +{ + "folders": + [ + { + "path": "." + } + ], + "settings": + { + "tab_size": 8 + }, + "build_systems": + [ + { + "name": "Make - Disk", + "working_dir": "${project_path:${folder}}", + "shell_cmd": "make disk" + }, + { + "name": "Run", + "working_dir": "${project_path:${folder}}", + "shell_cmd": "make run" + } + ] +} diff --git a/makefile b/makefile new file mode 100644 index 0000000..7764444 --- /dev/null +++ b/makefile @@ -0,0 +1,75 @@ +# The name of the destination disk image +IMAGE_TARGET = main.dsk + +# Apple II command issued by the "run" recipe after booting the disk image. +RUN_CMD = "BRUN MAIN" + +# Paths and flags for build/processing applications +DASM = dasm +DASM_FLAGS = -v0 -f2 +AC = java -jar /usr/local/bin/ac.jar + +# Source folder. All files in this folder will produce an object file (No subfolders) +SDIR = ./src + +# Include folder. Changes to files in this folder will invalidate the current build (No subfolders) +IDIR = ./include + +# Output folder for build product +BDIR = ./build + +# Resource folder. Contains any resources required by this makefile. (No subfolders.) +RDIR = ./res + +# Path to the runner script +RUNNER = osascript $(RDIR)/runner.scpt + +# Paths to source files +SRC_FILES = $(shell ls $(SDIR)) +ASM_FILES = $(filter %.asm,$(SRC_FILES)) +# BAS_FILES = $(filter %.bas,$(SRC_FILES)) + +SRC = $(patsubst %,$(SDIR)/%,$(ASM_FILES)) + +# Paths to include files +_DEPS = $(shell ls $(IDIR)) +DEPS = $(patsubst %,$(IDIR)/%,$(_DEPS)) + +# Destination paths to object files +OBJ = $(patsubst %.asm,$(BDIR)/%,$(ASM_FILES)) + +# Path to disk image +IMAGE = $(abspath $(BDIR)/$(IMAGE_TARGET)) + +# Path to the blank bootable disk image +BOOTIMAGE = $(RDIR)/dos3.3bootable.dsk + +# Shell commands to copy object files to the disk image +COPY_OBJ = $(foreach FN,$(OBJ),$(AC) -cc65 $(IMAGE) "$(shell echo $(notdir $(FN)) | tr a-z A-Z | tr '_' ' ')" B < $(FN);) + +.PHONY: clean all disk run + +# Build all object files +all: $(OBJ) +$(OBJ): $(DEPS) $(SRC) + @mkdir -p $(BDIR) + $(eval OBJNAME = $(notdir $@)) + $(eval SRCPATH = $(patsubst %,$(SDIR)/%.asm,$(OBJNAME))) + $(eval LSTPATH = $(BDIR)/$(OBJNAME).lst) + $(DASM) $(SRCPATH) -o$@ -l$(LSTPATH) $(DASM_FLAGS) + +# Create disk image +disk: $(IMAGE) +$(IMAGE): $(OBJ) + cp $(BOOTIMAGE) $(IMAGE) + $(COPY_OBJ) + +# Delete all build output +clean: + @rm -rf $(BDIR) + @echo All clean. + +# Boot disk image in emulator +run: $(IMAGE) + $(RUNNER) $(IMAGE) $(RUN_CMD) + @echo Running... diff --git a/res/dos3.3bootable.dsk b/res/dos3.3bootable.dsk new file mode 100644 index 0000000000000000000000000000000000000000..1b25d2e48e14ee45004cdb0eabe83b3fbd47e777 GIT binary patch literal 143360 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 literal 0 HcmV?d00001 diff --git a/res/runner.scpt b/res/runner.scpt new file mode 100644 index 0000000000000000000000000000000000000000..59d182e4a399a76030bd6805c21b7852a6aed098 GIT binary patch literal 2632 zcmb_eSyxm?5dQ9Egt3Pn7Ng<{ahK=}s|(Q}2#6=@oFmJN$A`->F(bnahXGD}^C$Qd z`~!K&yP9a+HO4JQqY{j9i~AByG+O!kUI@cEz*8>M)mwGdSJhS3G&$+cwz`&*@=$r1 zX+Z$KJP}y1k!5iJ&2d(OQ}g-cgS^-9!H&E0EKEVRCdu0DamYW&k#~w+QOJo6^rf7h zo@9R_0qo_0eJJIpkpnB`o`<{*$Xoc!;B$I+4FI;hGb*!Tb-4_!@Z0cH_EacMV)wes z*$5z4lh{dj?&F!DCb6qHw}|s^n(6qP~s_9vsM?rta9>5eygV;coTH&dQ# z%!D1G$w9QD2(vVa>(fHCV786fWSfJzn#8@kLLPc1Pvwb{XS}=acslAt`v%P2iR^{Q zKA5p3Pt7GgF@BiKHcuXF%=0uAQSy8gYZ6yeF}9<`MhV$I#sW>^x~mwAun>zhiF+r- zD3M1>9>E`I>4~M;Dm7WGa)K|xLV2j~h(Di0L9qELH$ z=Z?nR(Y_Jb;2kx@2I3k^y}MY9<#Hd(6p2rHJIg#6OR)^ggIEsh8h{i5)RMc#V|R>*6>KXJ(j=~kDtsot zBaAY|&O^UBnI0pezwfI)O%^v{s!%Pr19Cev98mm18wb+0)eyoANc8FKW&z3{S2jam=S#kxIEsxEKS>Ae( zC1?YG);_=IjQ^9Gu!n8INyO7eu2n&=Sh_yckS9j2X69`n=48qbkChLwsD@eB%+)@p z%jAP0?@htvTbGxQEM&`1s6#zAGV(85oG^Im__kbVw4akK_ zLd=r$MsYoI^5sYBJtse)5lwPdaXOifa~bc1%|k@kNHfj^ zj>|DQD&Mmf9+AWH9ShmFSR;qzpd3(gnjvi-&48R5Yrx4#3{Y}{I462FlpG(<6D7w+ z)4Ed0(cwf^MB^1GB}azycDzEa*PM zX}mg8AZO9Gf2b?mcpuEkY_sGt;H0Cy{8uaY?cm_o{{o}@opb;I literal 0 HcmV?d00001 diff --git a/src/main.asm b/src/main.asm new file mode 100644 index 0000000..c95e016 --- /dev/null +++ b/src/main.asm @@ -0,0 +1,23 @@ + processor 6502 + incdir "include" + + seg main + org $c00 + +main subroutine + jsr HOME + + jsr print + byte "YOUR PROGRAM WORKED!",0 + + jsr print + byte '","CALL ",[main]d,'"," TO RUN AGAIN.",0 + + jmp DOSWRM + +; **************************************** +; includes +; **************************************** + + include "stdio" + include "print"