407 lines
11 KiB
Tal
407 lines
11 KiB
Tal
( ff.tal )
|
|
|
|
%TILE-NW { #70 }
|
|
%TILE-NE { #6e }
|
|
%TILE-SE { #7d }
|
|
%TILE-SW { #6d }
|
|
%TILE-VERT { #5d }
|
|
%TILE-HORIZ { #40 }
|
|
|
|
( devices )
|
|
|
|
|00 @System [ &vector $2 &pad $6 &r $2 &g $2 &b $2 ]
|
|
|10 @Console [ &vector $2 &read $1 &pad $5 &write $1 ]
|
|
|20 @Screen [ &vector $2 &width $2 &height $2 &auto $1 &pad $1
|
|
&x $2 &y $2 &addr $2 &pixel $1 &sprite $1 ]
|
|
|80 @Controller [ &vector $2 &button $1 &key $1 ]
|
|
|b0 @DateTime [ &y $2 &m $1 &d $1 &H $1 &M $1
|
|
&S $1 &dotw $1 &doty $2 &isdst $1 ]
|
|
|
|
( variables )
|
|
|0000
|
|
@draw-mode $1
|
|
|
|
( program )
|
|
|0100
|
|
#81 .draw-mode STZ
|
|
|
|
;redraw .Screen/vector DEO2 ( set up screen )
|
|
;on-key .Controller/vector DEO2 ( set up keyboard )
|
|
;init-rng JSR2 ( initialize rng )
|
|
|
|
#0100 .Screen/width DEO2 ( 256 pixels wide; 32 tiles )
|
|
#00e0 .Screen/height DEO2 ( 224 pixels high; 28 tiles )
|
|
|
|
#08f3 .System/r DEO2
|
|
#0cd5 .System/g DEO2
|
|
#0b66 .System/b DEO2
|
|
|
|
|
|
;draw-scene JSR2
|
|
;draw-party-info JSR2
|
|
;draw-menu JSR2
|
|
;draw-monsters JSR2
|
|
|
|
|
|
( #0008 #0008 ;goto JSR2 #1234 ;draw-dec2 JSR2 )
|
|
( #0008 #0010 ;goto JSR2 )
|
|
( #32 ;draw-dec-pad JSR2 LIT '/ ;draw-ascii JSR2 #35 ;draw-dec-pad JSR2 )
|
|
( ;party ;draw-health JSR2 )
|
|
BRK
|
|
|
|
@draw-name ( hero* -> )
|
|
INC2 ;draw-string JSR2
|
|
JMP2r
|
|
|
|
@draw-health ( hero* -> )
|
|
#0009 ADD2 STH2k #0002 ADD2 LDA2 STH2r LDA2
|
|
( ;draw-dec2-pad JSR2 LIT '/ ;draw-ascii JSR2 ;draw-dec2-pad JSR2 )
|
|
;draw-dec2 JSR2 LIT '/ ;draw-ascii JSR2 ;draw-dec2 JSR2
|
|
JMP2r
|
|
|
|
@draw-party-info ( -> )
|
|
#00a8 #0090 #09 #08 ;draw-box JSR2
|
|
#81 .draw-mode STZ
|
|
;party LIT2r 0098
|
|
&loop
|
|
#00b0 STH2kr ;goto JSR2
|
|
DUP2 ;draw-name JSR2
|
|
LIT2r 0008 ADD2r
|
|
#00d0 STH2kr ;goto JSR2
|
|
DUP2 ;draw-health JSR2
|
|
LIT2r 0008 ADD2r
|
|
#000d ADD2
|
|
DUP2 ;party-limit LTH2 ,&loop JCN
|
|
POP2 POP2r
|
|
JMP2r
|
|
|
|
@draw-scene ( -> )
|
|
#0000 #0000 #1e #10 ;draw-box JSR2
|
|
;draw-party-sprites JSR2
|
|
;draw-monster-sprites JSR2
|
|
;draw-background-sprites JSR2
|
|
JMP2r
|
|
|
|
@draw-background-sprites
|
|
#0008
|
|
&loop
|
|
DUP2 #0008 ;goto JSR2
|
|
#c0 #05 #04 ;draw-sprite-nn JSR2
|
|
#0028 ADD2
|
|
DUP2 #00d8 LTH2 ,&loop JCN
|
|
POP2
|
|
JMP2r
|
|
|
|
( #00d8 #0028 ;goto JSR2 #00 ;draw-sprite-23 JSR2
|
|
#00d8 #0040 ;goto JSR2 #10 ;draw-sprite-23 JSR2
|
|
#00d8 #0058 ;goto JSR2 #20 ;draw-sprite-23 JSR2
|
|
#00d8 #0070 ;goto JSR2 #30 ;draw-sprite-23 JSR2 )
|
|
@draw-party-sprites ( -> )
|
|
#0000
|
|
&loop
|
|
( DUP2 #0018 MUL2 #0028 ADD2 #00d8 SWP2 ;goto JSR2 )
|
|
DUP2 #0018 MUL2 #0028 ADD2 #00d0 SWP2 ;goto JSR2
|
|
DUP2 #000d MUL2 ;party ADD2 LDA #40 SFT ;draw-sprite-23 JSR2
|
|
INC2
|
|
DUP2 #0004 LTH2 ,&loop JCN
|
|
POP2 JMP2r
|
|
|
|
@draw-monster-sprites ( -> )
|
|
#0018 #0028 ;goto JSR2 #60 ;draw-sprite-33 JSR2
|
|
#0018 #0048 ;goto JSR2 #60 ;draw-sprite-33 JSR2
|
|
#0018 #0068 ;goto JSR2 #60 ;draw-sprite-33 JSR2
|
|
#0038 #0028 ;goto JSR2 #60 ;draw-sprite-33 JSR2
|
|
#0038 #0048 ;goto JSR2 #60 ;draw-sprite-33 JSR2
|
|
#0038 #0068 ;goto JSR2 #60 ;draw-sprite-33 JSR2
|
|
#0058 #0028 ;goto JSR2 #60 ;draw-sprite-33 JSR2
|
|
#0058 #0048 ;goto JSR2 #60 ;draw-sprite-33 JSR2
|
|
#0058 #0068 ;goto JSR2 #60 ;draw-sprite-33 JSR2
|
|
JMP2r
|
|
|
|
@draw-menu ( -> )
|
|
#0058 #0090 #08 #08 ;draw-box JSR2
|
|
#81 .draw-mode STZ
|
|
#0060 #0098 ;goto JSR2 #1e ;draw-tile JSR2
|
|
#0068 #0098 ;goto JSR2 ;fight ;draw-string JSR2
|
|
#0068 #00a0 ;goto JSR2 ;run ;draw-string JSR2
|
|
#0068 #00a8 ;goto JSR2 ;magic ;draw-string JSR2
|
|
#0068 #00b0 ;goto JSR2 ;drink ;draw-string JSR2
|
|
#0068 #00b8 ;goto JSR2 ;item ;draw-string JSR2
|
|
JMP2r
|
|
|
|
@draw-monsters ( -> )
|
|
#0000 #0090 #09 #08 ;draw-box JSR2
|
|
#81 .draw-mode STZ
|
|
#0018 #0098 ;goto JSR2 ;imp ;draw-string JSR2
|
|
#0018 #00a0 ;goto JSR2 ;wolf ;draw-string JSR2
|
|
JMP2r
|
|
|
|
@load-tile ( offset* base* -> )
|
|
STH2
|
|
#00 SWP #40 SFT2
|
|
STH2r ( ;petscii ) ADD2 .Screen/addr DEO2
|
|
JMP2r
|
|
|
|
@draw ( -> )
|
|
#81 .Screen/sprite DEO JMP2r
|
|
|
|
@draw-tile ( index^ -> )
|
|
;petscii ,load-tile JSR ( ,draw JMP )
|
|
.draw-mode LDZ .Screen/sprite DEO JMP2r
|
|
|
|
@draw-fg ( -> )
|
|
#c3 .Screen/sprite DEO JMP2r
|
|
|
|
@draw-sprite-tile ( index^ -> )
|
|
;sprites ,load-tile JSR ,draw-fg JMP
|
|
|
|
@draw-sprite-23 ( index^ -> )
|
|
#02 #03 ,draw-sprite-nn JMP
|
|
|
|
@draw-sprite-33 ( index^ -> )
|
|
#03 #03 ,draw-sprite-nn JMP
|
|
|
|
@draw-sprite-nn ( index^ cols^ rows^ -> )
|
|
#01 .Screen/auto DEO
|
|
,&rows STR ,&cols STR STH
|
|
#00
|
|
&row-loop
|
|
#00
|
|
&col-loop
|
|
STHkr ;draw-sprite-tile JSR2 INCr
|
|
INC DUP ,&cols LDR LTH ,&col-loop JCN
|
|
POP INC
|
|
.Screen/x DEI2 #00 ,&cols LDR #0008 MUL2 SUB2 .Screen/x DEO2
|
|
.Screen/y DEI2 #0008 ADD2 .Screen/y DEO2
|
|
DUP ,&rows LDR LTH ,&row-loop JCN
|
|
POP POPr
|
|
JMP2r [ &cols $1 &rows $1 ]
|
|
|
|
@goto ( x* y* -> )
|
|
.Screen/y DEO2 .Screen/x DEO2 JMP2r
|
|
|
|
@draw-string ( s* -> )
|
|
STH2
|
|
#01 .Screen/auto DEO
|
|
&loop
|
|
STH2kr LDA DUP ,&continue JCN
|
|
POP POP2r JMP2r
|
|
&continue
|
|
( #20 SUB ;draw-tile JSR2 )
|
|
;draw-ascii JSR2
|
|
INC2r ,&loop JMP
|
|
|
|
@vertical-line ( count^ -> )
|
|
.draw-mode LDZ STH
|
|
#02 .Screen/auto DEO
|
|
TILE-VERT ;petscii ;load-tile JSR2
|
|
#00 SWP SUB
|
|
&loop STHkr .Screen/sprite DEO INC DUP ,&loop JCN
|
|
POP POPr
|
|
JMP2r
|
|
|
|
@horizontal-line ( count^ -> )
|
|
.draw-mode LDZ STH
|
|
#01 .Screen/auto DEO
|
|
TILE-HORIZ ;petscii ;load-tile JSR2
|
|
#00 SWP SUB
|
|
&loop STHkr .Screen/sprite DEO INC DUP ,&loop JCN
|
|
POP POPr
|
|
JMP2r
|
|
|
|
( w and h refer to the "internal" size of the box )
|
|
@draw-box ( x* y* w^ h^ -> )
|
|
,&h STR ,&w STR ,&y STR2 ,&x STR2
|
|
|
|
#83 .draw-mode STZ
|
|
|
|
( top line )
|
|
#01 .Screen/auto DEO
|
|
,&x LDR2 .Screen/x DEO2
|
|
,&y LDR2 .Screen/y DEO2
|
|
TILE-NW ;draw-tile JSR2
|
|
,&w LDR ;horizontal-line JSR2
|
|
TILE-NE ;draw-tile JSR2
|
|
|
|
( stash some variables here )
|
|
,&continue JMP
|
|
[ &x $2 &y $2 &w $1 &h $1 ]
|
|
&continue
|
|
|
|
( bottom line )
|
|
,&x LDR2 .Screen/x DEO2
|
|
,&y LDR2 #00 ,&h LDR INC2 #30 SFT2 ADD2 .Screen/y DEO2
|
|
TILE-SW ;draw-tile JSR2
|
|
,&w LDR ;horizontal-line JSR2
|
|
TILE-SE ;draw-tile JSR2
|
|
|
|
( prepare to draw vertical lines )
|
|
,&h LDR DUP
|
|
|
|
( left line )
|
|
,&x LDR2 .Screen/x DEO2
|
|
,&y LDR2 #0008 ADD2 STH2k .Screen/y DEO2
|
|
;vertical-line JSR2
|
|
|
|
( right line )
|
|
,&x LDR2 #00 ,&w LDR INC2 #30 SFT2 ADD2 .Screen/x DEO2
|
|
STH2r .Screen/y DEO2
|
|
;vertical-line JSR2
|
|
|
|
( reset )
|
|
#00 .Screen/auto DEO
|
|
JMP2r
|
|
|
|
( draw the screen )
|
|
@randomize ( x0* y0* x1* y1* )
|
|
,&y1 STR2 ,&x1 STR2 ,&y0 STR2 ,&x0 STR2
|
|
#01 .Screen/auto DEO ( ; auto update x pos )
|
|
,&y0 LDR2 ( row )
|
|
&rows ( row )
|
|
DUP2 .Screen/y DEO2 ( row ; y=row )
|
|
,&x0 LDR2 DUP2 .Screen/x DEO2 ( row col ; x=0 )
|
|
&cols ( row col )
|
|
;draw-random-sprite JSR2 ( ; random sprite/style )
|
|
#0008 ADD2 ( row col+8 )
|
|
DUP2 ,&x1 LDR2 ( #0078 ) LTH2 ,&cols JCN ( row col+8 )
|
|
POP2 #0008 ADD2 ( row+8 )
|
|
DUP2 ,&y1 LDR2 ( #0068 ) LTH2 ,&rows JCN ( row+8 )
|
|
POP2 #00 .Screen/auto DEO ( )
|
|
JMP2r ( )
|
|
[ &x0 $2 &y0 $2 &x1 $2 &y1 $2 ]
|
|
|
|
( draw a random sprite with a random style )
|
|
@draw-random-sprite
|
|
;rng JSR2 NIP ;petscii ;load-tile JSR2
|
|
#81 .Screen/sprite DEO
|
|
JMP2r
|
|
|
|
( redraw the screen )
|
|
@redraw
|
|
( LIT &count 00 ,&skip JCN
|
|
#0008 #0008 #00f8 #0028 ;randomize JSR2
|
|
&skip
|
|
,&count LDR INC #03 AND ,&count STR )
|
|
BRK
|
|
|
|
( respond to key-presses and controllers )
|
|
@on-key
|
|
( #0008 #0008 #0078 #0068 ;randomize JSR2 )
|
|
#0008 #0008 #00f8 #0028 ;randomize JSR2
|
|
BRK
|
|
|
|
( initialize the rng seed )
|
|
( TODO: consider using date/time? )
|
|
@init-rng
|
|
#1234 ,rng/x STR2
|
|
#5678 ,rng/y STR2
|
|
JMP2r
|
|
|
|
( returns the next number in a length 4294967295 sequence. )
|
|
@rng ( -> n* )
|
|
,&x LDR2 ( x )
|
|
DUP2 #50 SFT2 EOR2 ( t=x^(x<<5) )
|
|
DUP2 #03 SFT2 EOR2 ( u=t^(t>>3) )
|
|
,&y LDR2 DUP2 ,&x STR2 ( u y ; x<-y )
|
|
DUP2 #01 SFT2 EOR2 EOR2 ( v=u^(y^(y>>1)) )
|
|
,&y STR2k POP ( v ; y<-v )
|
|
JMP2r [ &x $2 &y $2 ] ( v )
|
|
|
|
( string constants )
|
|
|
|
@fight "fight 00
|
|
@run "run 00
|
|
@magic "magic 00
|
|
@drink "drink 00
|
|
@item "item 00
|
|
|
|
@imp "imp 00
|
|
@wolf "wolf 00
|
|
|
|
( pc stats: 13 bytes per hero )
|
|
( - 1 byte: class )
|
|
( - 8 bytes: name )
|
|
( - 2 bytes: cur hp )
|
|
( - 2 bytes: max hp )
|
|
@party
|
|
03 "asta 00 00 00 00 0024 0025
|
|
02 "brek 00 00 00 00 0011 0015
|
|
01 "dain 00 00 00 00 001c 001f
|
|
00 "garl 00 00 00 00 0010 0010
|
|
@party-limit
|
|
|
|
@draw-ascii ( c^ -> )
|
|
#20 SUB ;draw-tile JMP2
|
|
|
|
@draw-dec ( n^ -> )
|
|
#01 .Screen/auto DEO
|
|
LITr 00 ( n [0] )
|
|
&read ( n [k] )
|
|
#0a DIVk STHk MUL SUB STHr INCr ( n%10 n/10 [k+1] )
|
|
DUP ,&read JCN
|
|
POP ( top element was 0000 )
|
|
&write ( n0 n1 ... nk [k+1] )
|
|
#30 ADD ( #18 DEO ) ;draw-ascii JSR2 LITr 01 SUBr ( n0 ... n{k-1} [k] )
|
|
STHkr ,&write JCN
|
|
POPr JMP2r
|
|
|
|
@draw-dec-pad ( n^ -> )
|
|
#01 .Screen/auto DEO
|
|
LITr 00 ( n [0] )
|
|
&read ( n [k] )
|
|
#0a DIVk STHk MUL SUB STHr INCr ( n%10 n/10 [k+1] )
|
|
STHkr #03 LTH ,&read JCN
|
|
POP ( top element was 0000 )
|
|
&write0 ( n0 n1 ... nk [k+1] )
|
|
DUP ,draw-dec/write JCN
|
|
POP #00 ;draw-tile JSR2 ( sp ) LITr 01 SUBr
|
|
STHkr ,&write0 JCN
|
|
POPr JMP2r
|
|
|
|
@draw-dec2 ( n* -> )
|
|
#01 .Screen/auto DEO
|
|
LITr 00 ( n [0] )
|
|
&read ( n [k] )
|
|
#000a DIV2k STH2k MUL2 SUB2 STH2r INCr ( n%10 n/10 [k+1] )
|
|
DUP2 ORA ,&read JCN
|
|
POP2 ( top element was 0000 )
|
|
&write ( n0 n1 ... nk [k+1] )
|
|
NIP #30 ADD ( #18 DEO ) ;draw-ascii JSR2 LITr 01 SUBr ( n0 ... n{k-1} [k] )
|
|
STHkr ,&write JCN
|
|
POPr JMP2r
|
|
|
|
@draw-dec2-pad ( n* -> )
|
|
#01 .Screen/auto DEO
|
|
LITr 00 ( n [0] )
|
|
&read ( n [k] )
|
|
#000a DIV2k STH2k MUL2 SUB2 STH2r INCr ( n%10 n/10 [k+1] )
|
|
STHkr #05 LTH ,&read JCN
|
|
POP2 ( top element was 0000 )
|
|
&write0 ( n0 n1 ... nk [k+1] )
|
|
DUP2 ORA ,draw-dec2/write JCN
|
|
POP2 #00 ;draw-tile JSR2 ( sp ) LITr 01 SUBr
|
|
STHkr ,&write0 JCN
|
|
POPr JMP2r
|
|
|
|
@draw-dec2-vpad ( n* pad^ -> )
|
|
#01 .Screen/auto DEO
|
|
LITr 00 ( n [0] )
|
|
&read ( n [k] )
|
|
#000a DIV2k STH2k MUL2 SUB2 STH2r INCr ( n%10 n/10 [k+1] )
|
|
STHkr #05 LTH ,&read JCN
|
|
POP2 ( top element was 0000 )
|
|
&write0 ( n0 n1 ... nk [k+1] )
|
|
DUP2 ORA ,draw-dec2/write JCN
|
|
POP2 #00 ;draw-tile JSR2 ( sp ) LITr 01 SUBr
|
|
STHkr ,&write0 JCN
|
|
POPr JMP2r
|
|
|
|
( PETSCII tiles, 2-bit binary data )
|
|
( TODO: these could be 1-bit instead )
|
|
@petscii
|
|
~chr/petscii.tal
|
|
|
|
( sprite tiles, 2-bit binary data )
|
|
@sprites
|
|
~chr/tiles.tal
|