VM02/plasma2/rod.s

671 lines
10 KiB
ArmAsm
Executable File

.INCLUDE "plstub.s"
; 1: const speaker=$C030
; speaker = 49200
; 2: const showgraphics=$C050
; showgraphics = 49232
; 3: const showtext=$C051
; showtext = 49233
; 4: const showfull=$C052
; showfull = 49234
; 5: const showmix=$C053
; showmix = 49235
; 6: const TRUE=$FFFF
; TRUE = 65535
; 7: const FALSE=$0000
; FALSE = 0
; 8: const showpage1=$C054
; showpage1 = 49236
; 9: const showpage2=$C055
; showpage2 = 49237
; 10: const showlores=$C056
; showlores = 49238
; 11: const showhires=$C057
; showhires = 49239
; 12: const keyboard=$C000
; keyboard = 49152
; 13: const keystrobe=$C010
; keystrobe = 49168
; 14: const hgr1=$2000
; hgr1 = 8192
; 15: const hgr2=$4000
; hgr2 = 16384
; 16: const page1=0
; page1 = 0
; 17: const page2=1
; page2 = 1
; 18: byte exitmsg[] = "PRESS ANY KEY TO EXIT."
D0000: ; exitmsg
DB $16
DB $50,$52,$45,$53,$53,$20,$41,$4E
DB $59,$20,$4B,$45,$59,$20,$54,$4F
DB $20,$45,$58,$49,$54,$2E
; 19: byte goodbye[] = "THAT'S ALL FOLKS!"
D0023: ; goodbye
DB $11
DB $54,$48,$41,$54,$27,$53,$20,$41
DB $4C,$4C,$20,$46,$4F,$4C,$4B,$53
DB $21
; 20: byte rebootmsg[] = "PRESS ANY KEY TO REBOOT..."
D0041: ; rebootmsg
DB $1A
DB $50,$52,$45,$53,$53,$20,$41,$4E
DB $59,$20,$4B,$45,$59,$20,$54,$4F
DB $20,$52,$45,$42,$4F,$4F,$54,$2E
DB $2E,$2E
; 21: byte i, j, k, w, fmi, fmk, color
D0068: DS 1 ; i
D0069: DS 1 ; j
D0070: DS 1 ; k
D0071: DS 1 ; w
D0072: DS 1 ; fmi
D0073: DS 1 ; fmk
D0074: DS 1 ; color
; 22: ;
; 23: ; CALL 6502 ROUTINE
; 24: ; ROMCALL(AREG, XREG, YREG, STATUS, ADDR)
; 25: ;
; 26: asm romcall
C0000: ; romcall()
; 27: TMP EQU $06
TMP EQU $06
; 28:
; 29: PHP
PHP
; 30: LDA ESTKL,X
LDA ESTKL,X
; 31: STA TMP
STA TMP
; 32: LDA ESTKH,X
LDA ESTKH,X
; 33: STA TMP+1
STA TMP+1
; 34: INX
INX
; 35: LDA ESTKL,X
LDA ESTKL,X
; 36: PHA
PHA
; 37: INX
INX
; 38: LDA ESTKL,X
LDA ESTKL,X
; 39: TAY
TAY
; 40: INX
INX
; 41: LDA ESTKL+1,X
LDA ESTKL+1,X
; 42: PHA
PHA
; 43: LDA ESTKL,X
LDA ESTKL,X
; 44: INX
INX
; 45: STX TMP+2
STX TMP+2
; 46: TAX
TAX
; 47: PLA
PLA
; 48: BIT ROMIN
BIT ROMIN
; 49: PLP
PLP
; 50: JSR JMPTMP
JSR JMPTMP
; 51: PHP
PHP
; 52: BIT LCBNK2
BIT LCBNK2
; 53: STA REGVALS+0
STA REGVALS+0
; 54: STX REGVALS+1
STX REGVALS+1
; 55: STY REGVALS+2
STY REGVALS+2
; 56: PLA
PLA
; 57: STA REGVALS+3
STA REGVALS+3
; 58: LDX TMP+2
LDX TMP+2
; 59: LDA #<REGVALS
LDA #<REGVALS
; 60: LDY #>REGVALS
LDY #>REGVALS
; 61: STA ESTKL,X
STA ESTKL,X
; 62: STY ESTKH,X
STY ESTKH,X
; 63: PLP
PLP
; 64: RTS
RTS
; 65: JMPTMP: JMP (TMP)
JMPTMP: JMP (TMP)
; 66: REGVALS: DS 4
REGVALS: DS 4
; 67: end
RTS
; 68: ;
; 69: ; CHAR OUT
; 70: ; COUT(CHAR)
; 71: ;
; 72: asm cout
C0002: ; cout()
; 73: LDA ESTKL,X
LDA ESTKL,X
; 74: INX
INX
; 75: ORA #$80
ORA #$80
; 76: BIT ROMIN
BIT ROMIN
; 77: JSR $FDED
JSR $FDED
; 78: BIT LCBNK2
BIT LCBNK2
; 79: end
RTS
; 80: ;
; 81: ; PRINT STRING
; 82: ; PRSTR(STR)
; 83: ;
; 84: asm prstr
C0004: ; prstr()
; 85: LDY #$00
LDY #$00
; 86: LDA ESTKL,X
LDA ESTKL,X
; 87: STA TMP
STA TMP
; 88: LDA ESTKH,X
LDA ESTKH,X
; 89: STA TMP+1
STA TMP+1
; 90: BIT ROMIN
BIT ROMIN
; 91: LDA (TMP),Y
LDA (TMP),Y
; 92: STA ESTKL,X
STA ESTKL,X
; 93: BEQ :+
BEQ :+
; 94: _PRS1: INY
_PRS1: INY
; 95: LDA (TMP),Y
LDA (TMP),Y
; 96: ORA #$80
ORA #$80
; 97: JSR $FDED
JSR $FDED
; 98: TYA
TYA
; 99: CMP ESTKL,X
CMP ESTKL,X
; 100: BNE _PRS1
BNE _PRS1
; 101: : INX
: INX
; 102: BIT LCBNK2
BIT LCBNK2
; 103: end
RTS
; 104: def textmode
C0006: ; textmode()
; 105: drop romcall(0, 0, 0, 0, $FB39)
JSR _INTERP
DB $00 ; ZERO
DB $00 ; ZERO
DB $00 ; ZERO
DB $00 ; ZERO
DB $2C,$39,$FB ; CW 64313
DB $54,<C0000,>C0000 ; CALL C0000
DB $30 ; DROP
; 106: end
DB $5C ; RET
; 107: def home
C0008: ; home()
; 108: drop romcall(0, 0, 0, 0, $FC58)
JSR _INTERP
DB $00 ; ZERO
DB $00 ; ZERO
DB $00 ; ZERO
DB $00 ; ZERO
DB $2C,$58,$FC ; CW 64600
DB $54,<C0000,>C0000 ; CALL C0000
DB $30 ; DROP
; 109: end
DB $5C ; RET
; 110: def gotoxy(x, y)
C0010: ; gotoxy()
; x = 2
; y = 4
; 111: ^($24) = x
JSR _INTERP
DB $58,$06,$02 ; ENTER 6,2
DB $2A,$24 ; CB 36
DB $66,$02 ; LLW 2
DB $70 ; SB
; 112: drop romcall(y, 0, 0, 0, $FB5B)
DB $66,$04 ; LLW 4
DB $00 ; ZERO
DB $00 ; ZERO
DB $00 ; ZERO
DB $2C,$5B,$FB ; CW 64347
DB $54,<C0000,>C0000 ; CALL C0000
DB $30 ; DROP
; 113: end
DB $5A ; LEAVE
; 114: def crout
C0012: ; crout()
; 115: cout($0D)
JSR _INTERP
DB $2A,$0D ; CB 13
DB $54,<C0002,>C0002 ; CALL C0002
; 116: end
DB $5C ; RET
; 117: def grmode
C0014: ; grmode()
; 118: drop romcall(0, 0, 0, 0, $FB40)
JSR _INTERP
DB $00 ; ZERO
DB $00 ; ZERO
DB $00 ; ZERO
DB $00 ; ZERO
DB $2C,$40,$FB ; CW 64320
DB $54,<C0000,>C0000 ; CALL C0000
DB $30 ; DROP
; 119: drop ^showlores
DB $2C,$56,$C0 ; CW 49238
DB $60 ; LB
DB $30 ; DROP
; 120: end
DB $5C ; RET
; 121: ; grcolor(color)
; 122: asm grcolor
C0016: ; grcolor()
; 123: LDA ESTKL,X
LDA ESTKL,X
; 124: INX
INX
; 125: STX TMP+2
STX TMP+2
; 126: BIT $C081
BIT $C081
; 127: JSR $F864
JSR $F864
; 128: BIT $C080
BIT $C080
; 129: LDX TMP+2
LDX TMP+2
; 130: end
RTS
; 131: ; grplot(x, y)
; 132: asm grplot
C0018: ; grplot()
; 133: LDA ESTKL,X
LDA ESTKL,X
; 134: INX
INX
; 135: LDY ESTKL,X
LDY ESTKL,X
; 136: INX
INX
; 137: STX TMP+2
STX TMP+2
; 138: BIT $C081
BIT $C081
; 139: JSR $F800
JSR $F800
; 140: BIT $C080
BIT $C080
; 141: LDX TMP+2
LDX TMP+2
; 142: end
RTS
; 143: defopt colors
C0020: ; colors()
; 144: while TRUE
C0022:
DEX
LDA #$FF
STA ESTKL,X
STA ESTKH,X
INX
LDA ESTKL-1,X
ORA ESTKH-1,X
BNE :+
JMP C0023
:
; 145: for w = 3 to 50
DEX
LDA #$03
STA ESTKL,X
LDY #$00
STY ESTKH,X
C0025:
LDA ESTKL,X
STA D0071
DEX
LDA #$32
STA ESTKL,X
LDY #$00
STY ESTKH,X
INX
LDA ESTKL-1,X
CMP ESTKL,X
LDA ESTKH-1,X
SBC ESTKH,X
BPL :+
JMP C0024
:
INC ESTKL,X
BNE :+
INC ESTKH,X
:
; 146: for i = 1 to 19
DEX
LDA #$01
STA ESTKL,X
STY ESTKH,X
C0027:
LDA ESTKL,X
STA D0068
DEX
LDA #$13
STA ESTKL,X
LDY #$00
STY ESTKH,X
INX
LDA ESTKL-1,X
CMP ESTKL,X
LDA ESTKH-1,X
SBC ESTKH,X
BPL :+
JMP C0026
:
INC ESTKL,X
BNE :+
INC ESTKH,X
:
; 147: for j = 0 to 19
DEX
STY ESTKL,X
STY ESTKH,X
C0029:
LDA ESTKL,X
STA D0069
DEX
LDA #$13
STA ESTKL,X
LDY #$00
STY ESTKH,X
INX
LDA ESTKL-1,X
CMP ESTKL,X
LDA ESTKH-1,X
SBC ESTKH,X
BPL :+
JMP C0028
:
INC ESTKL,X
BNE :+
INC ESTKH,X
:
; 148: k = i + j
DEX
LDA D0068
STA ESTKL,X
STY ESTKH,X
DEX
LDA D0069
STA ESTKL,X
STY ESTKH,X
JSR ADD
LDA ESTKL,X
STA D0070
; 149: color = (j * 3) / (i + 3) + i * w / 12
LDA D0069
STA ESTKL,X
STY ESTKH,X
DEX
LDA #$03
STA ESTKL,X
STY ESTKH,X
JSR MUL
DEX
LDA D0068
STA ESTKL,X
STY ESTKH,X
DEX
LDA #$03
STA ESTKL,X
STY ESTKH,X
JSR ADD
JSR DIV
DEX
LDA D0068
STA ESTKL,X
LDY #$00
STY ESTKH,X
DEX
LDA D0071
STA ESTKL,X
STY ESTKH,X
JSR MUL
DEX
LDA #$0C
STA ESTKL,X
STY ESTKH,X
JSR DIV
JSR ADD
LDA ESTKL,X
STA D0074
; 150: fmi = 40 - i
LDA #$28
STA ESTKL,X
LDY #$00
STY ESTKH,X
DEX
LDA D0068
STA ESTKL,X
STY ESTKH,X
JSR SUB
LDA ESTKL,X
STA D0072
; 151: fmk = 40 - k
LDA #$28
STA ESTKL,X
STY ESTKH,X
DEX
LDA D0070
STA ESTKL,X
STY ESTKH,X
JSR SUB
LDA ESTKL,X
STA D0073
; 152: grcolor(color);
LDA D0074
STA ESTKL,X
STY ESTKH,X
JSR C0016
; 153: grplot(i, k);
DEX
LDA D0068
STA ESTKL,X
LDY #$00
STY ESTKH,X
DEX
LDA D0070
STA ESTKL,X
STY ESTKH,X
JSR C0018
; 154: grplot(k, i);
DEX
LDA D0070
STA ESTKL,X
LDY #$00
STY ESTKH,X
DEX
LDA D0068
STA ESTKL,X
STY ESTKH,X
JSR C0018
; 155: grplot(fmi, fmk);
DEX
LDA D0072
STA ESTKL,X
LDY #$00
STY ESTKH,X
DEX
LDA D0073
STA ESTKL,X
STY ESTKH,X
JSR C0018
; 156: grplot(fmk, fmi);
DEX
LDA D0073
STA ESTKL,X
LDY #$00
STY ESTKH,X
DEX
LDA D0072
STA ESTKL,X
STY ESTKH,X
JSR C0018
; 157: grplot(k, fmi);
DEX
LDA D0070
STA ESTKL,X
LDY #$00
STY ESTKH,X
DEX
LDA D0072
STA ESTKL,X
STY ESTKH,X
JSR C0018
; 158: grplot(fmi, k);
DEX
LDA D0072
STA ESTKL,X
LDY #$00
STY ESTKH,X
DEX
LDA D0070
STA ESTKL,X
STY ESTKH,X
JSR C0018
; 159: grplot(i, fmk);
DEX
LDA D0068
STA ESTKL,X
LDY #$00
STY ESTKH,X
DEX
LDA D0073
STA ESTKL,X
STY ESTKH,X
JSR C0018
; 160: grplot(fmk, i);
DEX
LDA D0073
STA ESTKL,X
LDY #$00
STY ESTKH,X
DEX
LDA D0068
STA ESTKL,X
STY ESTKH,X
JSR C0018
; 161: if ^keyboard >= 128
DEX
LDY #$00
STY ESTKL,X
LDA #$C0
STA ESTKH,X
JSR LB
DEX
LDA #$80
STA ESTKL,X
STY ESTKH,X
JSR ISGE
INX
LDA ESTKL-1,X
ORA ESTKH-1,X
BNE :+
JMP C0030
:
; 162: drop ^keystrobe
DEX
LDA #$10
STA ESTKL,X
LDA #$C0
STA ESTKH,X
LDY #$00
JSR LB
; 163: return
INX
INX
RTS
; 164: fin
INX
INX
C0030:
C0031:
; 165: next
JMP C0029
C0028:
; 166: next
INX
JMP C0027
C0026:
; 167: next
INX
JMP C0025
C0024:
; 168: loop
INX
JMP C0022
C0023:
; 169: end
RTS
; 170:
; 171: grmode()
START: ; JSR INTERP
DB $54,<C0014,>C0014 ; CALL C0014
; 172: home()
DB $54,<C0008,>C0008 ; CALL C0008
; 173: gotoxy(10,22)
DB $2A,$0A ; CB 10
DB $2A,$16 ; CB 22
DB $54,<C0010,>C0010 ; CALL C0010
; 174: prstr(@exitmsg)
DB $26,<D0000,>D0000 ; LA D0000
DB $54,<C0004,>C0004 ; CALL C0004
; 175: colors()
DB $54,<C0020,>C0020 ; CALL C0020
; 176: textmode()
DB $54,<C0006,>C0006 ; CALL C0006
; 177: home()
DB $54,<C0008,>C0008 ; CALL C0008
; 178: prstr(@goodbye)
DB $26,<D0023,>D0023 ; LA D0023
DB $54,<C0004,>C0004 ; CALL C0004
; 179: while ^keyboard < 128
C0032:
DB $2C,$00,$C0 ; CW 49152
DB $60 ; LB
DB $2A,$80 ; CB 128
DB $46 ; ISLT
DB $4C,<C0033,>C0033 ; SKPFLS C0033
; 180: loop
DB $50,<C0032,>C0032 ; SKIP C0032
C0033:
; 181: drop ^keystrobe
DB $2C,$10,$C0 ; CW 49168
DB $60 ; LB
DB $30 ; DROP
; 182: done
DB $5C ; RET