From dd81cd05dd82ef184227062dd71695b77eb8b005 Mon Sep 17 00:00:00 2001 From: Rob Date: Sun, 18 Sep 2016 21:31:57 -0500 Subject: [PATCH] Fixing build; adding first set of work to make bootable disk; adding AppleSoft BASIC programs that generate some of the initial graphics. --- Makefile | 22 ++-- gravestone.bas | 22 ++++ jewel-draw1.bas | 23 ++++ jewel-draw2.bas | 15 +++ jok.system.s | 278 ++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 352 insertions(+), 8 deletions(-) create mode 100755 gravestone.bas create mode 100755 jewel-draw1.bas create mode 100755 jewel-draw2.bas create mode 100755 jok.system.s diff --git a/Makefile b/Makefile index d25ed42..2df6c12 100644 --- a/Makefile +++ b/Makefile @@ -2,23 +2,29 @@ include local.config # Local stuff: -SRC = -PGM = jok -SYS = jok.system +# > PGMS is a list of direct assembler targetrs +PGMS = jok.system.s +# > SRC is a list of all source files used to trigger a rebuild +SRC = $(PGMS) +SYS = JOK.SYSTEM TYPE = SYS ADDR = 0x2000 TMPL = template.po -DISK = jewel-of-kaldun.po +APP = jewel-of-kaldun +DISK = $(APP).po +ZIP = $(APP).zip jok: $(SRC) - $(ASM) $(PGM).s + $(ASM) $(PGMS) cp $(TMPL) $(DISK) - cat $(PGM) | $(AC) -p $(DISK) $(SYS) $(TYPE) $(ADDR) + cat $(SYS) | $(AC) -p $(DISK) $(SYS) $(TYPE) $(ADDR) $(AC) -k $(DISK) $(SYS) $(AC) -ll $(DISK) - zip $(PGM).zip $(DISK) + zip $(ZIP) $(DISK) clean: - rm $(PGM) $(DISK) $(PGM).zip + rm $(PGM) $(DISK) $(ZIP) + rm *_Output.txt _FileInformation.txt + rm $(SYS) diff --git a/gravestone.bas b/gravestone.bas new file mode 100755 index 0000000..888a6eb --- /dev/null +++ b/gravestone.bas @@ -0,0 +1,22 @@ +10 HGR +20 GOSUB 200 +30 GOSUB 300 +90 END +200 HCOLOR= 1 +210 FOR Y = 90 TO 159 STEP 4 +220 FOR X = 0 TO 279 STEP 8 +230 HPLOT X,Y TO X +3,Y +240 NEXT X,Y +250 FOR Y = 92 TO 159 STEP 4 +260 FOR X = 5 TO 276 STEP 8 +270 HPLOT X,Y TO X +3,Y +280 NEXT X,Y +290 RETURN +300 HCOLOR= 3 +310 FOR D = 0 TO 3.14159 STEP 0.02 +320 X = 139 -35 * COS(D) +330 Y = 90 -20 * SIN(D) +340 HPLOT X,Y TO X,140 +345 IF INT(Y) < > INT(OY) THEN PRINT "(x,y)="; INT(X);","; INT(Y):OY = Y +350 NEXT D +360 RETURN \ No newline at end of file diff --git a/jewel-draw1.bas b/jewel-draw1.bas new file mode 100755 index 0000000..0c9f272 --- /dev/null +++ b/jewel-draw1.bas @@ -0,0 +1,23 @@ +10 HGR : POKE -16302,0 +15 GOSUB 200: REM background +20 D1 = 70:D2 = 77:D3 = 80 +30 DEF FN FX(A) = COS(D) *Z +40 DEF FN FY(A) = SIN(D) *Z +50 FOR D = 0 TO 6.28 STEP 0.01 +55 HCOLOR= 4 +60 Z = 60: GOSUB 100 +80 NEXT D +90 PRINT CHR$(4);"-jewel-draw2" +100 X = FN FX(1):Y = FN FY(1) +110 HPLOT 140,96 TO 140 -X,96 -Y +120 RETURN +200 HCOLOR= 6 +210 FOR Y = 0 TO 191 STEP 4 +220 FOR X = 0 TO 279 STEP 8 +230 HPLOT X,Y TO X +3,Y +240 NEXT X,Y +250 FOR Y = 2 TO 191 STEP 4 +260 FOR X = 3 TO 276 STEP 8 +270 HPLOT X,Y TO X +3,Y +280 NEXT X,Y +290 RETURN diff --git a/jewel-draw2.bas b/jewel-draw2.bas new file mode 100755 index 0000000..a9d0fc5 --- /dev/null +++ b/jewel-draw2.bas @@ -0,0 +1,15 @@ +20 D1 = 60:D2 = 73:D3 = 77 +30 DEF FN FX(A) = COS(D) *Z +40 DEF FN FY(A) = SIN(D) *Z +50 FOR D = 0 TO 6.28 STEP 0.01 +55 HCOLOR= 3 +60 Z = 55: GOSUB 100 +65 HCOLOR= 1 +70 Z = 53: GOSUB 100 +80 NEXT D +82 HCOLOR= 7:Z = D3:: FOR D = 0 TO 6.28 STEP 0.1 +83 X = FN FX(1):Y = FN FY(1): HPLOT 140 -D1 * COS(D),96 -D1 * SIN(D) TO 140 -X,96 -Y: NEXT D +90 END +100 X = FN FX(1):Y = FN FY(1) +110 HPLOT 140,96 TO 140 -X,96 -Y +120 RETURN \ No newline at end of file diff --git a/jok.system.s b/jok.system.s new file mode 100755 index 0000000..20709db --- /dev/null +++ b/jok.system.s @@ -0,0 +1,278 @@ +******************************** +* Jewel of Kaldun loader * +* program. * +******************************** + + TYP $FF ; system program + ORG $2000 ; they originate @ $2000 + EXP OFF ; macro expansion + TR ON ; truncate + +* General Macros -- + +MOVB MAC + LDA ]1 + STA ]2 + EOM + +MOVW MAC + MOVB ]1;]2 + IF #=]1 + MOVB ]1/$100;]2+1 + ELSE + MOVB ]1+1;]2+1 + FIN + EOM + +* ProDOS Command Codes -- + +OPEN = $C8 ; open file +READ = $CA ; read file +CLOSE = $CC ; close file + +* ProDOS addresses -- + +MLI = $BF00 + +* ProDOS Macro commands -- +* call: @name parameter #1;parameter #2; ... ;parameter #n + +@OPEN MAC ; @open path;file_buffer; (1K) + MOVW ]1;D:C8PATH ; reference_number (ret) + MOVW ]2;D:C8BUFF + JSR _OPEN + MOVB D:C8REF;]3 + EOM + +@READ MAC ; @read ref_num;input_buff; + MOVB ]1;D:CAREF ; requested_length + MOVW ]2;D:CABUFF ; (actual_length returned) + MOVW ]3;D:CARLEN + JSR _READ + EOM + +@CLOSE MAC ; @close reference_number + MOVB ]1;D:CCREF + JSR _CLOSE + EOM + +* Memory locations: + +PTR EQU $00 ; pointer for checksum +LINE10 EQU $05A8 ; text line #10 +LINE12 EQU $06A8 ; " " #12 +LINE15 EQU $0450 ; " " #15 +LINE24 EQU $07D0 ; " " #24 +JOK_BUFF EQU $3000 ; ProDOS buffer +JOK_ADDR EQU $6000 ; Address to load at +JOK_LEN EQU $5EFF ; Length of JOK (this is max) +JOK2BUFF EQU $3000 +JOK2ADDR EQU $0800 +JOK2LEN EQU $07FF +TIT_BUFF EQU $3000 ; ProDOS buffer +TIT_ADDR EQU $4000 ; Address to load at +TIT_LEN EQU $2000 ; Length of Title (full screen) + +******************************** +* Main program: * +******************************** + LDA #149 ; disable 80 columns + JSR $FDED + JSR $FB2F ; text + JSR $FC58 ; home +* Draw title lines: + LDY #13 +:LINE10 LDA DATA10-1,Y + STA LINE10+12,Y + DEY + BNE :LINE10 + LDY #26 +:LINE12 LDA DATA12-1,Y + STA LINE12+6,Y + DEY + BNE :LINE12 + LDY #19 +:LINE15 LDA DATA15A-1,Y + STA LINE15+9,Y + DEY + BNE :LINE15 +* Clear memory: + LDY #24 ; clear the bitmap of the + LDA #0 ; system... +:CLRMEM STA $BF58-1,Y + DEY + BPL :CLRMEM + LDA #$CF ; and set back to memory + STA $BF58 ; as being empty except + LDA #$01 ; ProDOS. + STA $BF6F +* Load in Title: + @OPEN #TIT_NAME;#TIT_BUFF;REFNUM + BCS :HELPERR ; can't quite make it. + @READ REFNUM;#TIT_ADDR;#TIT_LEN + @CLOSE REFNUM +* Print version of Loader: + LDY #19 +:LINE15B LDA DATA15B-1,Y + STA LINE15+9,Y + DEY + BNE :LINE15B +* Calculate checksum: + JSR CHECKSUM +* Load in JOK: + @OPEN #JOK_NAME;#JOK_BUFF;REFNUM +:HELPERR BCS :HELPER2 + @READ REFNUM;#JOK_ADDR;#JOK_LEN + @CLOSE REFNUM +* Load in JOK end game: + @OPEN #JOK2NAME;#JOK2BUFF;REFNUM +:HELPER2 BCS LOADERR2 + @READ REFNUM;#JOK2ADDR;#JOK2LEN + @CLOSE REFNUM +* Check Checksum: (A0E647) + LDA SUM+2 + CMP #$A0 + BNE DATACORR + LDA SUM+1 + CMP #$E6 + BNE DATACORR + LDA SUM + CMP #$47 + BNE DATACORR +* Start JOK: + JMP JOK_ADDR ; begin game! + +LOADERR LDY #40 +:LOOP LDA ERRORMSG-1,Y + STA LINE24-1,Y + DEY + BNE :LOOP + BEQ ERRORXX +LOADERR2 LDY #40 +:LOOP2 LDA ERRORMS2-1,Y + STA LINE24-1,Y + DEY + BNE :LOOP2 +ERRORXX JSR $FF3A ; bell +FOREVER LDA #<$0200 ; sets $03F0 (BRK address) to + STA $3F0 ; point at $0200. + STA $201 ; And, sets $0200:4C 00 02 + LDA #>$0200 ; ie, JMP $0200. + STA $3F1 ; ... the begining of FOREVER! + STA $202 + LDA #$4C + STA $200 + LDA $3F3 ; scramble power-up byte, so + EOR #%11111111 ; power-up automatically occurs + STA $3F3 ; upon RESET. + LDY #0 ; prepare to erase memory from + LDA #<$4000 ; $4000 - $BEFF ... + STA $00 + LDA #>$4000 + STA $01 + LDA #0 +:ERASE STA ($00),Y ; erase a page. + INY + BNE :ERASE + INC $01 ; add 1 to hi byte + LDA $01 + CMP #$BF ; at end? + BLT :ERASE ; nope, do more + LDA #$20 ; yes: Erase loader program. + STA $01 ; will exit when BRK + JMP :ERASE ; encountered. + +DATACORR LDY #28 +:LOOP LDA DATA15C-1,Y + STA LINE15+5,Y + DEY + BNE :LOOP + JSR $FF3A ; bell + JMP FOREVER + +ERRORMSG ASC "ERROR: JEWEL.OF.KALDUN IS UNACCESSABLE!" +ERRORMS2 ASC "ERROR: JEWEL.END.GAME IS UNACCESSABLE!" +JOK2NAME STR "JEWEL.END.GAME" +JOK_NAME STR "JEWEL.OF.KALDUN" +TIT_NAME STR "JEWEL.TITLE.PIC" +REFNUM HEX 00 +DATA10 INV " PLEASE WAIT " +DATA12 ASC "JEWEL OF KALDUN IS LOADING" +DATA15A ASC " L O A D E R " +DATA15B ASC "LOADER: VERSION 1.3" +DATA15C ASC "CANNOT LOAD: DATA CORRUPTED!" + +* ProDOS Routines -- + +_OPEN JSR MLI ; perform open function + DFB OPEN + DW D:OPEN + RTS + +_READ JSR MLI ; perform read function + DFB READ + DW D:READ + RTS + +_CLOSE JSR MLI ; perform close function + DFB CLOSE + DW D:CLOSE + RTS + +* ProDOS data/parameters -- + +D:OPEN DFB $3 ; 3 parameters +D:C8PATH DW 0 ; address of path name +D:C8BUFF DW 0 ; address of file buffer +D:C8REF DFB 0 ; reference number (returned) + +D:READ DFB $4 ; 4 parameters +D:CAREF DFB 0 ; reference number +D:CABUFF DW 0 ; address of data buffer +D:CARLEN DW 0 ; requested length +D:CAALEN DW 0 ; actual length + +D:CLOSE DFB $1 ; 1 parameter +D:CCREF DFB 0 ; reference number + +******************************** +* Compute a checksum on the * +* graphic title page after * +* being loaded into memory. * +******************************** +CHECKSUM LDA #$00 ; point to location + STA PTR ; $4000, beginning + LDA #$40 ; of graphics page + STA PTR+1 + LDA #0 ; initialize checksum + STA SUM ; to be zero. + STA SUM+1 + STA SUM+2 + LDY #0 +:LOOP CLC + LDA (PTR),Y ; grab byte + ADC SUM ; and add it to + STA SUM ; the sum. + ADC SUM+1 ; add following + STA SUM+1 ; carry bits. + ADC SUM+2 + STA SUM+2 + INY + BNE :LOOP + INC PTR+1 + CMP #$60 ; check if done + BLT :LOOP ; if not, continue + LDA SUM+2 ; dump sum to screen. + JSR $FDDA ; will be replaced to + LDA SUM+1 ; actually check if a + JSR $FDDA ; an unmodified page + LDA SUM ; was loaded. + JSR $FDDA + RTS +SUM HEX 000000 ; check sum + +* Save file: + + SAV JOK.SYSTEM + +