diff --git a/lib/65xx.zip b/lib/65xx.zip new file mode 100644 index 0000000..539235a Binary files /dev/null and b/lib/65xx.zip differ diff --git a/lib/AppleCommander-1.3.5-ac.jar b/lib/AppleCommander-1.3.5-ac.jar new file mode 100644 index 0000000..f66dfa5 Binary files /dev/null and b/lib/AppleCommander-1.3.5-ac.jar differ diff --git a/src/asm/Makefile b/src/asm/Makefile new file mode 100644 index 0000000..c53bd91 --- /dev/null +++ b/src/asm/Makefile @@ -0,0 +1,44 @@ +MERLIN_URL=https://www.brutaldeluxe.fr/products/crossdevtools/merlin/Merlin32_v1.0.zip + +PGM=rnd +BASE_DSK=prodos-2.0.3-boot.dsk +# It is necessary to use this older version of AppleCommander to support +# the PowerBook G4 and iBook G3. This version only requires Java 1.3. +AC=java -jar AppleCommander-1.3.5-ac.jar +AS65=java -cp 65xx.zip uk.co.demon.obelisk.w65xx.As65 +LK65=java -cp 65xx.zip uk.co.demon.obelisk.w65xx.Lk65 +SRC=$(PGM).s +VOL=$(PGM) +DSK=$(PGM).dsk +APPLEWIN_VER=1.29.10.0 + +ifeq ($(OS),Windows_NT) + COPY=copy + EMU=$(USERPROFILE)\Dropbox\opt\applewin-$(APPLEWIN_VER)\applewin.exe -no-printscreen-dlg -s7 empty -s6d1 +else + COPY=cp + EMU=$(HOME)/Dropbox/opt/applewin-$(APPLEWIN_VER)/applewin -no-printscreen-dlg -s7 empty -s6d1 +endif + +# There is some kind of problem with turning this into a boot disk +# after it is created by AppleCommander. So, copy an existing boot +# disk instead. +#$(AC) -pro140 $(DSK) $(VOL) + +$(DSK): $(PGM) + $(COPY) $(BASE_DSK) $(DSK) + $(AC) -p $(DSK) STARTUP BAS < STARTUP#fc0801 + $(AC) -p $(DSK) $(PGM) BIN 0x8000 < $(PGM) + +$(PGM): $(PGM).obj + $(LK65) -output $(PGM) -bin $(PGM).obj + +$(PGM).obj: symbols.s macros.s $(SRC) + $(AS65) $(SRC) + +test: $(DSK) + $(EMU) $(DSK) + +clean: + rm $(PGM) $(DSK) _FileInformation.txt $(PGM).obj *~ + diff --git a/src/asm/macros.s b/src/asm/macros.s new file mode 100644 index 0000000..3d1024a --- /dev/null +++ b/src/asm/macros.s @@ -0,0 +1,71 @@ +******************************** +* * +* MACROS * +* * +* AUTHOR: BILL CHATFIELD * +* LICENSE: GPL2 * +* * +******************************** + +PUSHY MAC + TYA + PHA + EOM + +POPY MAC + PLA + TAY + EOM + +PUSHXY MAC + TXA + PHA + TYA + PHA + EOM + +POPXY MAC + PLA + TAY + PLA + TAX + EOM + +******************************** +* * +* PUTS MACRO - OUTPUTS STRING * +* ]1 = ADDRESS OF NULL- * +* TERMINATED STRING * +* * +******************************** + +PUTS MAC + PUSHY + LDY #0 ; PREPARE LOOP INDEX +NEXT LDA ]1,Y ; LOAD A CHARACTER + CMP #0 ; CHECK FOR END OF STRING + BEQ DONE + ORA #%10000000 ; SET HIGH BIT FOR OUTPUT + JSR COUT + INY + JMP NEXT +DONE POPY + EOM + +******************************** +* * +* PUTF - * +* PRINTS FLOATING POINT NUMBER * +* IN FAC. DESTROYS VALUE IN * +* FAC. DON'T KNOW WHY. * +* * +* ]1 - ABS ADDR FOR STRING * +* * +******************************** + +PUTF MAC + JSR FOUT ;CONVERT FAC TO STRING + STA ]1 ;STORE LOW BYTE OF STRING + STY ]1+1 ;STORE HIGH BYTE OF STRING + PUTS (]1) ;PRINT STRING + EOM diff --git a/src/asm/rnd.s b/src/asm/rnd.s new file mode 100644 index 0000000..010dc91 --- /dev/null +++ b/src/asm/rnd.s @@ -0,0 +1,72 @@ +;************************** +; +; Random dungeon generator +; +;************************** + use symbols + use macros + dsk rnd + + org $8000 + +main jsr seedrnd + jsr rndcol ;Set the color + rts + +* Add A to FAC leaving result in FAC +addafac + pha + jsr MOVAF ;Move FAC to ARG + pla + jsr FLOAT ;Convert A to floating point in FAC + lda FACEXP ;Required for FADDT + jsr FADDT ;Add ARG to FAC putting result in FAC + rts ;Return with result in FAC + +* Multiply FAC by A leaving result in FAC +mulafac + pha ;Save A on stack + jsr MOVAF ;Move FAC to ARG + pla ;Get original value back in A + jsr FLOAT ;Convert value in A to floating point in FAC + lda FACEXP ;Required for FMULTT + jsr FMULTT ;Multiply ARG by FAC putting result in FAC + rts ;Return with result in FAC + +* Seed RND function by calling it with a variable negative number. +seedrnd lda RNDL ;RNDL is a good seed value, because it changes + ora #$80 ;Make it negative so RND will interpret it as a seed + jsr FLOAT ;Convert it to floating point + jsr RND ;Seed the random number generator + rts + +* Generate a floating point random number in the range [0,1) with result in FAC +genrnd lda #1 ;A 1 arg to RND says to give the next random num + jsr FLOAT ;Convert to floating point as required by RND + jsr RND ;Generate the random number + rts ;Return with result in FAC + +* Generate an integer random number in the range [0,A-1] with result in A +rnda + pha ;Save parameter in A to stack + jsr genrnd ;Generate random number [0,1) in FAC + pla ;Load multiplier into accumulator + jsr mulafac ;Multiply FAC by A + jsr CONINT ;Convert FAC to 1-byte int in X + txa ;Put the result in A + rts ;Return with result A + +* Generate an integer random number in the range [1,A] inclusive +* with result in A +rnd1a + jsr rnda ;Get an integer between [0,A-1] in A + inc ;Change the range to [1,A] + rts + +* Set the color to a random non-black value. +rndcol + lda #15 ;Max color number + jsr rnd1a ;Generate a random non-black color number + jsr SETCOL ;Set the color + rts + diff --git a/src/asm/symbols.s b/src/asm/symbols.s new file mode 100644 index 0000000..a5e7c2c --- /dev/null +++ b/src/asm/symbols.s @@ -0,0 +1,100 @@ +******************************** +* * +* SYMBOLS * +* * +* AUTHOR: BILL CHATFIELD * +* LICENSE: GPL2 * +* * +******************************** + +RNDL EQU $4e ;Continuously incremented while waiting for keyboard input +RNDH EQU $4f ;High byte of RNDL +FACEXP EQU $9d ;Address of FAC exponent used by FADDT,FSUBT,FMULTT,FDIVT + +******************************** +* * +* MEMORY MAPPED INPUT/OUTPUT * +* ADDRESSES $C000 - $C0FF * +* * +******************************** + +KBD EQU $C000 ;BIT 7 IS 1 IF KEY PRESSED +KBDSTRB EQU $C010 ;CLEARS KBD BIT 7 +CLR80STO EQU $C000 ;ALLOW PAGE2 PG1 & PG2 SWITCHING +SET80STO EQU $C001 ;ALLOW PAGE2 MAIN & AUX SWITCHNG +STO80 EQU $C018 ;1=PAGE2 SWITCHES MAIN/AUX + ;0=PAGE2 SWITCHES VIDEO PAGES +CLR80VID EQU $C00C ;TURN OFF 80-COL DISPLAY +SET80VID EQU $C00D ;TURN ON 80-COL DISPLAY +COL80 EQU $C01F ;0=40 COL IS ON, 1=80 COL IS ON +TEXTOFF EQU $C050 ;SELECTS GRAPHICS MODE +TEXTON EQU $C051 ;SELECTS TEXT MODE +TEXT EQU $C01A ;1=TEXT MODE ACTIVE,0=GRAPH MODE +MIXEDOFF EQU $C052 ;USE FULL-SCREEN GRAPHICS +MIXEDON EQU $C053 ;USE GRAPHICS WITH 4 LINES TEXT +MIXED EQU $C01B ;0=FULL SCREEN, 1=MIXED +PAGE2OFF EQU $C054 ;SELECTS PAGE1 OR MAIN VID MEM +PAGE2ON EQU $C055 ;SELECTS PAGE2 OR AUX VID MEM +PAGE2 EQU $C01C ;1=VID PG2 SELECTED OR AUX SEL +HIRESOFF EQU $C056 ;SELECTS LOW-RES GRAPHICS +HIRESON EQU $C057 ;SELECTS HIGH-RES GRAPHICS +HIRES EQU $C01D ;0=LOW-RES, 1=HIGH-RES + +******************************** +* * +* SUBROUTINES PROVIDED BY * +* APPLESOFT BASIC * +* IN READ-ONLY MEMORY * +* ADDRESSES $D000 - $F7FF * +* * +******************************** + +STROUT EQU $DB3A ;PRINT STRING IN Y,A +GIVAYF EQU $E2F2 ;CONVERT 2-BYTE INT A(HI) Y(LO) TO FLOAT IN FAC +CONINT EQU $E6FB ;CONVERT FAC TO BYTE IN X, ERR IF FAC > 255 +FADD EQU $E7BE ;FAC = MEM + FAC, MEM ADDR IS Y(HI) A(LO) +FSUB EQU $E7A7 ;FAC = MEM - FAC, MEM ADDR IS Y(HI) A(LO) +FMULT EQU $E97F ;FAC = MEM * FAC, MEM ADDR IS Y(HI) A(LO) +FDIV EQU $EA66 ;FAC = MEM / FAC, MEM ADDR IS Y(HI) A(LO) +FADDT EQU $E7C1 ;FAC = ARG + FAC, MUST LOAD FACEXP INTO A FIRST +FSUBT EQU $E7AA ;FAC = ARG - FAC, MUST LOAD FACEXP INTO A FIRST +FMULTT EQU $E982 ;FAC = ARG * FAC, MUST LOAD FACEXP INTO A FIRST +FDIVT EQU $EA69 ;FAC = ARG / FAC, MUST LOAD FACEXP INTO A FIRST +MUL10 EQU $EA39 ;MULTIPLY FAC BY 10 +FCOMP EQU $EBB2 ;COMP MEM TO FAC +QINT EQU $EBF2 ;CONVERT FAC TO INTEGER +FLOAT EQU $EB93 ;CONVERT A TO FAC, I THINK +MOVAF EQU $EB63 ;MOVE FAC INTO ARG +MOVMF EQU $EB2B ;MOVE FAC TO MEMORY Y,X +MOVFA EQU $EB53 ;MOVE ARG TO FAC +MOVFM EQU $EB2B ;MOVE MEMORY TO FAC +INT EQU $EC23 ;APPLESOFT INT FUNCTION +PRINTFAC EQU $ED2E ;PRINT FAC. USES FOUT,STROUT +FOUT EQU $ED34 ;FAC TO STRING, FAC DESTROYED +RND EQU $EFAE ;APPLESOFT RND FUNCTION + +******************************** +* * +* SUBROUTINES PROVIDED BY * +* SYSTEM MONITOR PROGRAM * +* IN READ-ONLY MEMORY * +* ADDRESSES $F800 - $FFFF * +* * +******************************** + +PLOT EQU $F800 ;PLOT BLOCK ON LOW-RES SCREEN +HLINE EQU $F819 ;HORIZONTAL LINE +VLINE EQU $F828 ;VERTICAL LINE +CLRSCR EQU $F832 ;CLEAR LOW-RES SCREEN +CLRTOP EQU $F836 ;CLEAR THE TOP OF LOW-RES +NEXTCOL EQU $F85F ;INCREMENT COLOR BY 3 +SETCOL EQU $F864 ;SET LOW-RES GRAPHICS COLOR +SCRN EQU $F871 ;READ THE LOW-RES SCREEN +TEXTCMD EQU $FB2F +TEXTMODE EQU $FB39 +GR EQU $FB40 ;BASIC GR COMMAND +WAIT EQU $FCA8 +COUT EQU $FDED ;WRITE A CHARACTER +CROUT EQU $FD8E ;WRITE A CARRIAGE RETURN +PRBYTE EQU $FDDA ;PRINT VALUE OF BYTE + diff --git a/storage/STARTUP#fc0801 b/storage/STARTUP#fc0801 new file mode 100644 index 0000000..a789c98 Binary files /dev/null and b/storage/STARTUP#fc0801 differ diff --git a/storage/prodos-2.0.3-boot.dsk b/storage/prodos-2.0.3-boot.dsk new file mode 100644 index 0000000..27c25ad Binary files /dev/null and b/storage/prodos-2.0.3-boot.dsk differ diff --git a/storage/startup.txt b/storage/startup.txt new file mode 100644 index 0000000..f176994 --- /dev/null +++ b/storage/startup.txt @@ -0,0 +1,2 @@ +10 print chr$(4);"-RND" +