diff --git a/CANYON.6502 b/CANYON.6502 new file mode 100644 index 0000000..0b641e8 --- /dev/null +++ b/CANYON.6502 @@ -0,0 +1,784 @@ + DSK CANYON + + +************************************************** +* To Do: +* adjust perspective to lean forward/back +* turning/sliding left/right +* additional example with light/shadow? +* Mode switch for demo purposes. +************************************************** +* Variables +************************************************** +TMP EQU $06 ; scratch +LOBYTE EQU $00 +HIBYTE EQU $01 + +CHAR EQU $FC ; char/pixel to plot + +BASELINE EQU $FB ; current plotrow to return to +PLOTROW EQU $FE ; 0-47 (#00-#30) +PLOTCOLUMN EQU $FF ; 0-39 (#00-#28) + +ROLBYTE EQU $FA ; byte for perspective +PROGRESS EQU $FD ; byte counter + +CANYONDATALO EQU $02 ; pixel data starts +CANYONDATAHI EQU $03 ; memory page + +PERSPECTIVELO EQU $04 ; processing data starts +PERSPECTIVEHI EQU $05 ; + +SCREENDATALO EQU $07 ; displayed data starts +SCREENDATAHI EQU $08 ; memory page + +HEIGHTBYTE EQU $09 ; how tall to draw +CDEND EQU $0A ; hi byte of data end + +HORIZON EQU $0B ; for Demo + +************************************************** +* Apple Standard Memory Locations +************************************************** +CLRLORES EQU $F832 +LORES EQU $C050 +TXTSET EQU $C051 +MIXCLR EQU $C052 +MIXSET EQU $C053 +TXTPAGE1 EQU $C054 +TXTPAGE2 EQU $C055 +KEY EQU $C000 +C80STOREOF EQU $C000 +C80STOREON EQU $C001 +STROBE EQU $C010 +SPEAKER EQU $C030 +VBL EQU $C02E +RDVBLBAR EQU $C019 ;not VBL (VBL signal low +WAIT EQU $FCA8 +RAMWRTAUX EQU $C005 +RAMWRTMAIN EQU $C004 +SETAN3 EQU $C05E ;Set annunciator-3 output to 0 +SET80VID EQU $C00D ;enable 80-column display mode (WR-only) +CLR80VID EQU $C00C +HOME EQU $FC58 ; clear the text screen +CH EQU $24 ; cursor Horiz +CV EQU $25 ; cursor Vert +VTAB EQU $FC22 ; Sets the cursor vertical position (from CV) +COUT EQU $FDED ; Calls the output routine whose address is stored in CSW, + ; normally COUTI +STROUT EQU $DB3A ;Y=String ptr high, A=String ptr low + +ALTTEXT EQU $C055 +ALTTEXTOFF EQU $C054 +RDPAGE2 EQU $C01C ; high bit set if on page2 +ROMINIT EQU $FB2F +ROMSETKBD EQU $FE89 +ROMSETVID EQU $FE93 + +ALTCHAR EQU $C00F ; enables alternative character set - mousetext + +BLINK EQU $F3 +SPEED EQU $F1 + +BELL EQU $FF3A ; Monitor BELL routine +CROUT EQU $FD8E ; Monitor CROUT routine +PRBYTE EQU $FDDA ; Monitor PRBYTE routine +MLI EQU $BF00 ; ProDOS system call +OPENCMD EQU $C8 ; OPEN command index +READCMD EQU $CA ; READ command index +CLOSECMD EQU $CC ; CLOSE command index + +OPENAPPLE EQU $C061 ; shift down = bit 7 + + +************************************************** +* START - sets up various fiddly zero page bits +************************************************** + + ORG $2000 ; PROGRAM DATA STARTS AT $2000 + + JSR ROMSETVID ; Init char output hook at $36/$37 + JSR ROMSETKBD ; Init key input hook at $38/$39 + JSR ROMINIT ; GR/HGR off, Text page 1 + + LDA #$00 + STA BLINK ; blinking text? no thanks. + STA LORES ; low res graphics mode + STA MIXCLR + + BIT TXTPAGE1 + JSR CLEARSKY ; clear screen + BIT TXTPAGE2 + JSR CLEARSKY ; clear screen + + + + +* data size 7800 +* data starts 2500 +* data ends 9d00 (2500 + 7800) + +* screen size 12c0 + +; pixels in memory start at end of program code +; 120px per line = #$78 + +* LOAD TERRAIN DATA FROM DISK + JSR BLOAD + + LDA CDHI ; start of CANYONDATA + STA CANYONDATAHI + STA SCREENDATAHI + + CLC + ADC #$78 ; data is $7800 long + STA CDEND + + LDA CDLO ; should be #$00 + STA CANYONDATALO + STA SCREENDATALO + + DEC PDLO + + LDA #$0A + STA HORIZON + +* APPEND FIRST SCREEN TO END OF TERRAIN DATA FOR SMOOTH LOOP + JSR LOOPTERRAIN ; appends $11D0 (38 lines of 120 bytes) + + + +************************************************** +* MAIN LOOP +************************************************** + ; 1 - 965,487 cycles + ; 2 - 822,028 CHECKROW BCC NEXTPIXEL + ; 3 - 813,377 ADDCHARTOPIXEL + ; 4 - 765,409 LSR clears high bits. + ; 5 - 773,160 GRRR. + ; 6 - reversing render + ; 7 - 795,705 + ; 8 - 740,233 render only on black + ; 9 - 801,500 double buffer + ; 10 - 674,168 added shortcuts + ; 11 - 630,679 optimized loops for frame,row,column + ; skip ahead 8 terrain bytes on 00 perspective byte + ; 12 - 618,134 + ; skip ahead (progress) bytes any time rolbyte = 00. + ; 13 - 660,294 - MEH. + ; 14 - 645,099 - checking cycle count for first full screen. + ; skip ahead if end of row reached before checking perspective 00s + ; 15 - 573,699 started making macros and ]loops + ; 572,142 + ; 16 - 568,259 reverse perspective bytes to INC instead of SBC + ; 17 - 536,209 TAX instead of LDA STA in DRAWPIXEL + ; 18 - start at top of heightpixel, go down until bg is not X0, skip the rest + ; 531,472 combine two runs of plotpixel if target == 00. + ; 19 - 392,381 "shortcutZ" + ; 20 - 419,717 added page flipping. Maybe do one test and branch? + ; 21 - 396,788 + + + +* EACH FRAME +NEXTFRAME BIT RDPAGE2 ; hi bit on = on page 2. Set to page 1 + BPL SETPAGE2 ; hi bit off, set to page 2 + +SETPAGE1 BIT TXTPAGE1 ; set to page 1 + JMP CLEARPAGE + +SETPAGE2 BIT TXTPAGE2 + + ; clear screen to #$00 +CLEARPAGE JSR CLEARSKY ; 5,422 cycles (or 3,854 if it's unrolled) + + +RESETROW LDA #$30 ; start on row 47 +; LDX #$0A +*** modeswitch + BIT OPENAPPLE + BPL ROW47 +; LDX #$00 + LDA #$2F +ROW47 STA PLOTROW ; + STA BASELINE +; STX HORIZON + + + LDA SCREENDATAHI + CMP CDEND ; is screendata looking after the end of CANYONDATA? + BCC FRAMEDATA + +RESETDATA LDA CDHI ; if so, set it back to beginning of terrain data + STA SCREENDATAHI + LDX #$0 + STX SCREENDATALO + +FRAMEDATA STA CANYONDATAHI + LDA SCREENDATALO + STA CANYONDATALO + +RESETPERSPECTIVE ; reset perspective processing + LDA PDHI ; beginning of "perspective" data + STA PERSPECTIVEHI + LDA PDLO ; + STA PERSPECTIVELO + + +* EACH ROW +RESETCOLUMN + + LDA #$28 + STA PLOTCOLUMN ; plotcolumn 40 + +RESETPROGRESS LDA #$09 ; 8 bits in, decrement each run + STA PROGRESS ; zero out ROL count + +GETPERSPECTIVE +*** mode switch - 00=3D +; LDA MODEBYTE + BIT OPENAPPLE + BPL INCPERSPECTIVE + + LDA PERSPECTIVELO ; have we loaded 40 bytes (1 line) + SEC + SBC PDLO + CMP #$0F ; 120 bits later... + BNE INCPERSPECTIVE + + LDA PDHI ; beginning of "perspective" data + STA PERSPECTIVEHI + LDA PDLO ; + STA PERSPECTIVELO + INC PERSPECTIVELO + JMP NEXTPERSPECTIVE + +INCPERSPECTIVE INC PERSPECTIVELO + BNE NEXTPERSPECTIVE + INC PERSPECTIVEHI + +NEXTPERSPECTIVE LDY #$0 + LDA (PERSPECTIVELO),Y ; read byte from perspective data + BNE NEXTROLBYTE + +*** shortcut if zero + CLC + LDA CANYONDATALO + ADC #$08 ; did CANYONDATALO roll over? + STA CANYONDATALO + BCC JUMPEIGHT + INC CANYONDATAHI +JUMPEIGHT JMP GETPERSPECTIVE +*** shortcut if zero + + + +NEXTROLBYTE STA ROLBYTE ; on 00, skip ahead 8 bytes in terrain + +* EACH COLUMN + +*** advance to next row when rendering to column #$FF, reset column to $27, decrement row, etc + + +NEXTPIXEL DEC PROGRESS + BEQ RESETPROGRESS ; progress == 00, reload and get new perspective + +NEXTTERRAIN INC CANYONDATALO ; did CANYONDATALO roll over? + BNE ROLLY + INC CANYONDATAHI + +ROLLY CLC + ROL ROLBYTE + BCC NEXTPIXEL ; HI bit rolls into CARRY, grab the color byte. + + + DEC PLOTCOLUMN ; set up to render on correct column + BPL DRAWPIXEL ; if column is still >0, render + ; column has rolled over to FF. Do next row. +NEXTROW + DEC PLOTROW ; end of row + DEC BASELINE + + LDA PLOTROW ; done with FRAME? + CMP HORIZON ; "horizon" at row #$0A (row10) + BNE STARTLINE + +DONEROWS ; done with all screen rows, move pointer + LDA SCREENDATALO ; SCREENDATA is the starting point of what is displayed + CLC ; increment 120 bytes per frame + ADC #$78 + STA SCREENDATALO + BCC LOOPTY ; carry set if rolled over + INC SCREENDATAHI + +LOOPTY JMP NEXTFRAME + + + ; moved up a row, shortcut to start next terrain line? +STARTLINE LDA #$27 + STA PLOTCOLUMN ; plotcolumn 39 + + +DRAWPIXEL LDY #$0 + LDA (CANYONDATALO),Y ; read in byte at (CANYONDATALO,HI) + STA HEIGHTBYTE ; hang onto the height nibble + + AND #$0F ; strip high nibble - color in low nibble + TAX + +*** mode switch - 00=3D mode +; LDA MODEBYTE + BIT OPENAPPLE + BMI TWODMODE + + + LSR HEIGHTBYTE ; ROR high nibble down to low + LSR HEIGHTBYTE + LSR HEIGHTBYTE + LSR HEIGHTBYTE ; clears low nibble from HEIGHTBYTE + SEC + LDA PLOTROW + SBC HEIGHTBYTE + STA PLOTROW + JMP WHICHPAGE + +TWODMODE STA HEIGHTBYTE ; mode=1, height of all columns = 1 + LDA BASELINE + STA PLOTROW + +WHICHPAGE ; loop until height = 0 + BIT RDPAGE2 + BPL DRAWZ2 + + +DRAWZ PLOTQUICK1 + CONTINUEPLOT ; plot @ baseline - CHAR IN X + ; PLOTROW in ACCUMULATOR + INC PLOTROW ; inc PLOTROW, going down... + LDA PLOTROW + CMP BASELINE ; return PLOTROW to baseline + + BCC DRAWZ ; loop and plot next Z + JMP NEXTPIXEL + +DRAWZ2 PLOTQUICK2 + CONTINUEPLOT ; plot @ baseline - CHAR IN X + ; PLOTROW in ACCUMULATOR + INC PLOTROW ; inc PLOTROW, going down... + LDA PLOTROW + CMP BASELINE ; return PLOTROW to baseline + + BCC DRAWZ2 ; loop and plot next Z + JMP NEXTPIXEL + +SHORTCUTZ LDA BASELINE ; no more blank pixels below, skip trying to render them + STA PLOTROW + JMP NEXTPIXEL + +* EACH COLUMN + + +; Compare Instruction Results +; +; Compare Result N Z C +; A < Memory * 0 0 +; A = Memory 0 1 1 +; A > Memory * 0 1 + + + +* EACH ROW + + + +************************************************** +* SUBROUTINES + + +************************************************** +* prints one CHAR at PLOTROW,PLOTCOLUMN - clobbers A,X,Y +* Used for every pixel. MACRO. +* 61/67 cycles on a shortcut, 79 to render +* *** now rendering top of column first. *** +************************************************** +PLOTQUICK1 MAC + ; *** CHAR IN X + ; *** PLOTROW in A + LSR ; divide PLOTROW by 2 - odd=CARRY + TAY ; get GR row + + LDA LoLineTableL,Y + STA LOBYTE + LDA LoLineTableH,Y ; *** for page1 + <<< ; End of Macro + +PLOTQUICK2 MAC + ; *** CHAR IN X + ; *** PLOTROW in A + LSR ; divide PLOTROW by 2 - odd=CARRY + TAY ; get GR row + + LDA LoLineTableL,Y + STA LOBYTE +LDALT LDA AltLineTableH,Y ; *** for page2 + <<< ; End of Macro + + + +CONTINUEPLOT MAC +STAHIBYTE STA HIBYTE ; now word/pointer at $0+$1 points to line on TXT page. + + LDY PLOTCOLUMN ; get the current pixel byte + +GETSCREENPIXEL LDA (LOBYTE),Y ; only render if byte is 00 or X0 + +; row 0 or 1? + BCC CHECKEVEN ; carry set = rendering on odd row + +CHECKODD BNE DONEPLOTQUICK ; only render odd rows on 00 + +RENDERROW1 CLC ; A=0, screen pixel=00, char in X + TXA + ROL ; rotate the color nibble left x 4 + ROL + ROL + ROL ; color in hi nibble + JMP PLOTPIXEL + + +CHECKEVEN ; CARRY CLEAR + + BEQ RENDERBOTH ; shortcut: 00 means rendering onto row 0 (lo nibble) +; *** WILL DO BOTH ROWS *** + + STA TMP ; store screen pixel + ; render on even, only with 00 or X0 + AND #$0F ; rendering on row 0, clear HI nibble. + BNE SHORTCUTZ ; low nibble nonzero, skip. *** shortcut *** + + +RENDERROW0 TXA ; Color in X, screen pixel in TMP, lo nibble == 0 + + ORA TMP ; combine nibbles into A + + JMP PLOTPIXEL + + + +RENDERBOTH TXA ; *** WILL DO BOTH ROWS *** + STX TMP ; A=0, screen pixel = 0, set lo & hi nibbles to color/char (in X) + ROL ; TMP has char in lo nibble. + ROL ; ROL A into hi nibble. + ROL + ROL + ORA TMP + INC PLOTROW ; increment PLOTROW + +PLOTPIXEL + STA (LOBYTE),Y ; write new pixel to screen +DONEPLOTQUICK + <<< ; End of Macro + +;/PLOTQUICK + +************************************************** +* Load "CANYONDATA" into memory at $3000 +* Used once +************************************************** + + +BLOAD JSR OPEN ;open "CANYONDATA" + JSR READ +; JSR ERROR + JSR CLOSE +; JSR ERROR + RTS ;Otherwise done + +OPEN JSR MLI ;Perform call + DB OPENCMD ;CREATE command number + DW OPENLIST ;Pointer to parameter list +; JSR ERROR ;If error, display it + LDA REFERENCE + STA READLIST+1 + STA CLOSELIST+1 + RTS + +READ JSR MLI + DB READCMD + DW READLIST + RTS + +CLOSE JSR MLI + DB CLOSECMD + DW CLOSELIST + RTS + +ERROR JSR PRBYTE ;Print error code + JSR BELL ;Ring the bell + JSR CROUT ;Print a carriage return + RTS + +OPENLIST DB $03 ; parameter list for OPEN command + DW FILENAME + DA MLI-$400 ; buffer snuggled up tight with PRODOS +REFERENCE DB $00 ; reference to opened file + +READLIST DB $04 + DB $00 ; REFERENCE written here after OPEN + DB CANYONDATA ; append to end of program + DB $00,$78 ; read to EOF at $7800 (120 * 256) +TRANSFERRED DB $00,$00 + +CLOSELIST DB $01 + DB $00 + +FILENAME DB ENDNAME-NAME ;Length of name +NAME ASC 'CANYONDATA' ;followed by the name +ENDNAME EQU * + + + +************************************************** +* Append one screen from top of terrain to bottom of data for smooth looping +* Used once +************************************************** + +LOOPTERRAIN + + LDA CDLO ; Setup pointers to move memory + STA $3C ; $3C and $3D for source start ($2500) + STA $42 ; $42 and $43 for destination ($9d00) + + LDA CDHI + STA $3D ; grabbing from top of terrain data + CLC + ADC #$11 ; screen size = #$11D0 (38 lines x 120 buyes) + STA $3F ; appending to end of terrain data + ADC #$67 ; 11+66=78 + STA $43 ; destination HI + + LDA #$CF ; last byte of extra 11D0 = 11CF + STA $3E ; $3E and $3F for source end + +MOVEIMAGE LDA #$00 ; Clear ACC, X,Y for smooth operation + TAX + TAY + JSR $FE2C ; F8ROM:MOVE ; Do the memory move + + RTS + +************************************************** +* blanks the screen quickly. +* Used every frame. Macro? +* CLOBBERS A,Y +************************************************** +CLEARSKY + LDA #$00 + LDY #$78 + + BIT RDPAGE2 ; displaying page 2, clear page 1. + BMI FILL1 ; and vice versa + JMP FILL2 + +FILL1 DEY + STA $400, Y + STA $480, Y + STA $500, Y + STA $580, Y + STA $600, Y + STA $680, Y + STA $700, Y + STA $780, Y + BNE FILL1 + RTS + +FILL2 DEY + STA $800, Y + STA $880, Y + STA $900, Y + STA $980, Y + STA $a00, Y + STA $a80, Y + STA $b00, Y + STA $b80, Y + BNE FILL2 + RTS + +************************************************** +* Data Tables +* +************************************************** + + + +************************************************** +* Lores/Text lines +* Thanks to Dagen Brock for this. +************************************************** +Lo01 equ $400 +Lo02 equ $480 +Lo03 equ $500 +Lo04 equ $580 +Lo05 equ $600 +Lo06 equ $680 +Lo07 equ $700 +Lo08 equ $780 +Lo09 equ $428 +Lo10 equ $4a8 +Lo11 equ $528 +Lo12 equ $5a8 +Lo13 equ $628 +Lo14 equ $6a8 +Lo15 equ $728 +Lo16 equ $7a8 +Lo17 equ $450 +Lo18 equ $4d0 +Lo19 equ $550 +Lo20 equ $5d0 +* the "plus four" lines +Lo21 equ $650 +Lo22 equ $6d0 +Lo23 equ $750 +Lo24 equ $7d0 + +; alt text page lines +Alt01 equ $800 +Alt02 equ $880 +Alt03 equ $900 +Alt04 equ $980 +Alt05 equ $A00 +Alt06 equ $A80 +Alt07 equ $B00 +Alt08 equ $B80 +Alt09 equ $828 +Alt10 equ $8a8 +Alt11 equ $928 +Alt12 equ $9a8 +Alt13 equ $A28 +Alt14 equ $Aa8 +Alt15 equ $B28 +Alt16 equ $Ba8 +Alt17 equ $850 +Alt18 equ $8d0 +Alt19 equ $950 +Alt20 equ $9d0 +* the "plus four" lines +Alt21 equ $A50 +Alt22 equ $Ad0 +Alt23 equ $B50 +Alt24 equ $Bd0 + + + + +LoLineTable da Lo01,Lo02,Lo03,Lo04 + da Lo05,Lo06,Lo07,Lo08 + da Lo09,Lo10,Lo11,Lo12 + da Lo13,Lo14,Lo15,Lo16 + da Lo17,Lo18,Lo19,Lo20 + da Lo21,Lo22,Lo23,Lo24 + +; alt text page +AltLineTable da Alt01,Alt02,Alt03,Alt04 + da Alt05,Alt06,Alt07,Alt08 + da Alt09,Alt10,Alt11,Alt12 + da Alt13,Alt14,Alt15,Alt16 + da Alt17,Alt18,Alt19,Alt20 + da Alt21,Alt22,Alt23,Alt24 + + +** Here we split the table for an optimization +** We can directly get our line numbers now +** Without using ASL +LoLineTableH db >Lo01,>Lo02,>Lo03 + db >Lo04,>Lo05,>Lo06 + db >Lo07,>Lo08,>Lo09 + db >Lo10,>Lo11,>Lo12 + db >Lo13,>Lo14,>Lo15 + db >Lo16,>Lo17,>Lo18 + db >Lo19,>Lo20,>Lo21 + db >Lo22,>Lo23,>Lo24 +LoLineTableL db Alt01,>Alt02,>Alt03 + db >Alt04,>Alt05,>Alt06 + db >Alt07,>Alt08,>Alt09 + db >Alt10,>Alt11,>Alt12 + db >Alt13,>Alt14,>Alt15 + db >Alt16,>Alt17,>Alt18 + db >Alt19,>Alt20,>Alt21 + db >Alt22,>Alt23,>Alt24 +AltLineTableL db PERSPECTIVEDATA +PERSPECTIVEDATA + HEX 00,00,00,00,00,FF,FF,FF,FF,FF,00,00,00,00,00 + HEX 00,00,00,00,01,7F,FF,F7,FF,FF,80,00,00,00,00 + HEX 00,00,00,00,02,FF,FF,F7,FB,FF,40,00,00,00,00 + HEX 00,00,00,00,05,FF,DF,F7,FD,EF,A0,00,00,00,00 + HEX 00,00,00,00,0B,EF,DF,F7,BD,F7,D0,00,00,00,00 + HEX 00,00,00,00,16,EF,DE,F7,BE,FB,E8,00,00,00,00 + HEX 00,00,00,00,2E,EE,DE,FB,DF,6D,F4,00,00,00,00 + HEX 00,00,00,00,5D,DD,DE,DB,DB,6E,FA,00,00,00,00 + HEX 00,00,00,00,BB,BB,B5,BB,DB,6E,ED,00,00,00,00 + HEX 00,00,00,01,77,57,6D,BB,5B,B7,76,80,00,00,00 + HEX 00,00,00,02,AE,D7,6D,BB,6D,DB,AB,40,00,00,00 + HEX 00,00,00,05,5A,D7,6D,BB,6D,AD,D5,A0,00,00,00 + HEX 00,00,00,0B,5A,D7,6D,B5,B6,D6,AA,D0,00,00,00 + HEX 00,00,00,16,B5,AA,DB,6B,6D,AD,A9,68,00,00,00 + HEX 00,00,00,29,6B,5A,DB,6B,6D,56,D4,B4,00,00,00 + HEX 00,00,00,52,D6,B5,B6,D6,D5,56,95,5A,00,00,00 + HEX 00,00,00,95,56,B5,B6,D6,D5,54,AA,AD,00,00,00 + HEX 00,00,01,4A,AD,6B,6D,56,95,55,55,56,80,00,00 + HEX 00,00,02,AA,AD,6A,6D,55,6A,AA,AA,AA,40,00,00 + HEX 00,00,05,55,52,D4,DA,AA,AA,AA,AA,AA,A0,00,00 + HEX 00,00,0A,AA,AA,AA,AA,AA,AA,AA,AA,AA,90,00,00 + HEX 00,00,14,AA,AA,AA,AA,AA,AA,AA,95,55,28,00,00 + HEX 00,00,29,52,AA,A5,55,55,55,55,55,4A,94,00,00 + HEX 00,00,52,A5,55,2A,AA,A9,55,54,AA,A5,4A,00,00 + HEX 00,00,A5,4A,AA,55,54,A5,4A,AA,55,52,A5,00,00 + HEX 00,01,4A,95,52,A9,54,A5,2A,55,4A,A9,52,80,00 + HEX 00,02,95,29,52,A9,54,A5,2A,55,4A,54,A9,40,00 + HEX 00,05,2A,52,A5,52,A9,4A,4A,52,A5,2A,54,A0,00 + HEX 00,0A,54,A5,4A,A5,52,94,94,A5,4A,4A,4A,50,00 + HEX 00,14,A5,52,4A,52,94,A5,24,A5,2A,94,A5,28,00 + HEX 00,29,25,29,4A,52,94,A5,29,4A,52,94,92,94,00 + HEX 00,52,49,4A,52,95,49,52,4A,4A,94,A4,92,4A,00 + HEX 00,A4,AA,92,52,92,49,29,24,94,94,A4,92,95,00 + HEX 01,4A,A5,24,A4,92,49,24,92,49,25,29,54,92,80 + HEX 02,92,55,24,A4,92,49,24,92,49,25,25,25,49,40 + HEX 05,24,92,49,49,24,92,52,49,24,94,92,4A,A5,20 + HEX 0A,49,24,92,49,24,92,52,49,24,92,4A,92,49,50 + HEX 12,49,24,92,49,24,95,49,24,92,49,24,92,49,48 + HEX 24,92,49,24,92,49,24,92,49,24,92,49,24,92,A4 + HEX 49,24,92,49,24,92,49,24,92,49,24,92,49,24,92 + +CDLO db CANYONDATA + + DS \ + +CANYONDATA EQU * + + \ No newline at end of file diff --git a/CANYON.dsk b/CANYON.dsk new file mode 100644 index 0000000..e09ad46 Binary files /dev/null and b/CANYON.dsk differ