home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Transactor
/
Transactor_19_1987_Transactor_Publishing.d64
/
menus v1.0.pal
(
.txt
)
< prev
next >
Wrap
Commodore BASIC
|
2023-02-26
|
27KB
|
1,000 lines
10 rem "mouse driven menus" v1.0
11 rem
12 rem source file by anthony bryant
13 rem
14 rem august 1986
15 sys 700
16 .opt n
18 ;
20 ;*** basic rom routines ***
22 chrget = $0073 ;get new char
24 chr(NULL)t = $0079 ;get old char
26 evalfm = $ad9e ;evaluate formula
28 eatcma = $aefd ;eat ","
30 syntax = $af08 ;syntax error
32 illqnt = $b248 ;illegal quantity
34 frestr = $b6a3 ;free descriptor
36 facbyt = $b7a1 ;fac to byt in x
38 getbyt = $b7f1 ;eat "," get byt in x
40 ;
42 ;*** memory map ***
44 progm = $8000 ;start of program
46 ; = $8c00 ;future expansion
48 mlist = $8d00 ;menulist (252 bytes)
50 cmem0 = $8e00 ;color store 1/2scrn
52 bmap0 = $9000 ;bitmap store 1/2scrn
54 cmem1 = $cc00 ;'hires' color memory
56 sptr0 = $cff8 ;sprite 0 pointer
58 chset = $d800 ;lowercase rom set
60 bmap1 = $e000 ;'hires' bitmap
62 ascii = $ebc2 ;table keycode/ascii
64 slot1 = $ff40 ;sprite slot (#253)
66 ;
68 ;*** zero page requirement ***
70 cs = $9b ;current column save
72 ce = $9c ;current column end
74 cc = $9e ;current column
76 rr = $9f ;current row
78 ; $a3 to $ab - various
80 lc = $b0 ;left column current menu
82 tr = $b1 ;top row " "
84 wd = $b2 ;width of " "
86 dp = $b3 ;depth of " "
88 hs = $b4 ;temp save header param
90 hc = $bd ;left column of header
92 hr = $be ;top row of header/menubar
94 hw = $bf ;width of header
96 ht = $c0 ;headerform/text$ or image$
98 ; $f7 to $fa - pntr to cmem & bmap
100 ;
102 ;
104 *=progm ;start of code
106 ;
108 ;
110 ;menus command and variables
112 jmp menus ;menus manager
114 mnum .byt 0 ;menu number - #mn(1-7)
116 mcol .byt 1 ;menu color byte fg/bg
118 mflg .byt 0 ;menubar on/off flag
120 mitm .byt 0 ;menu item - #mi(0-8)
122 mtyp .byt 0 ; " item type #mt(0-2)
124 mlix .byt 0 ;menu [155] index
126 ;mouse comm[175] [175] variables
128 jmp mouse ;mouse manager[173]driver
130 mb .byt 0 ;but[164]n status
132 mcx .byt 0 ;cell x[171]co[176]ds
134 mcy .byt 0 ;cell y[171]co[176]d
136 mx .byt 0 ;pixel x lo
138 .byt 0 ;pixel x hi
140 my .byt 0 ;pixel y
142 myi .byt 0 ;pixel 199[171]y
144 ;
146 ;
148 ;[172][172][172] menu [131] structures ***
150 ;
152 ;
154 ; #mn [171][171][171] 0 1 2 3 4 5 6 7
156 m[164]p .byt 0, 0, 0, 0, 0, 0, 0, 0
158 mnlc .byt 0, 0, 0, 0, 0, 0, 0, 0
160 mntr .byt 0, 1, 1, 1, 1, 1, 1, 1
162 mnwd .byt 40, 0, 0, 0, 0, 0, 0, 0
164 mndp .byt 1, 0, 0, 0, 0, 0, 0, 0
166 m[134] .byt 00,00,00,00,00,00,00,00
168 mchk .byt 00,00,00,00,00,00,00,00
170 ;
172 ; #mi [171][171][171] 1, 2, 3, 4, 5, 6, 7 ,8
174 mrow .byt 0, 0, 0, 0, 0, 0, 0, 0
176 ;
178 mask .byt $80,$40,$20,$10,8,4,2,1
180 ;
182 cset .w[176]d chset
184 char .byt 0 ;current char
186 rvse .byt 0 ;rvs [145] flag
188 [134]f .byt 0 ;[134] [145] flag
190 imgf .byt 0 ;image$[173]text$ flag
192 ;
194 ;
196 ;[172][172][172] menu manager [172][172][172]
198 ;
200 ;
202 ;[158] menus,mn, 0,mt,name$[,xr]
204 ;[171] where xr[178] 0 [176] oc [129] text$
206 ; (mi[178]0) xr[178]128 [176] oc [129] image$[171]1
208 ; xr[178]192 [176] oc [129] image$[171]2
210 ;
212 ;[158] menus,mn,mi,mt,item$[,xr]
214 ;[171] where xr[178] 0 [176] kc [129] text$
216 ; (mi[179][177]0) xr[178]128 [176] kc [129] image$[171]1
218 ; xr[178]192 [176] oc [129] image$[171]2
220 ;
222 ;[158] menus,mn,mi,mt [171][171] (change type)
224 ;[158] menus [145] [,bg,fg](show menubar)
226 ;[158] menus [off] .....(hide menubar)
228 ;[158] menus [156][,bg,fg] (clear [155]s)
230 ;
232 menus [178] [172] ;check [129] [164]kens
234 jsr chr[203]t:beq menuoff
236 cmp #"," :beq menupar
238 pha:jsr menucol:pla ;optn col[176]s
240 cmp #$9c :beq menu[156]
242 cmp #$91 :beq menu[145]
244 jmp syntax ;err[176]
246 menupar [178] [172] ;[161] ,#mn,#mi,#mt
248 jsr [161]byt:txa:beq ill
250 cpx #8:bcs ill:stx mnum ;#mn(1[171]7)
252 jsr [161]byt
254 cpx #9:bcs ill:stx mitm ;#mi(0[171]8)
256 jsr [161]byt
258 cpx #3:bcs ill:stx mtyp ;#mt(0[171]2)
260 jsr settype ;in menu [131] area
262 jsr chr[203]t:bne [172][170]3:rts
264 ;[161] name$ [176] item$ [181]o menu[155]
266 jsr eatcma ;eat ","
268 jsr e[197]fm ;e[197] string
270 jsr [184]str ;[161] descrip[164]r
272 jsr set[155] ;[181]o menu[155]
274 jsr chr[203]t:bne [172][170]3:rts
276 ;[161] xr [[176] oc] [[176] kc] coded byte
278 jsr [161]byt:txa
280 jmp setlast ;[181]o menu[155]
282 ;
284 ill jmp illqnt ;illegal quantity
286 ;
288 menu[156] [178] [172] ;clear all menu [155]s
290 ldx #0:txa:sta m[164]p,x
292 inx:cpx #8:bcc [172][171]6:sta mlix
294 tax:sta m[155],x
296 inx:bne [172][171]4 ;[175] do a menuoff
298 menuoff [178] [172] ;hide menubar
300 lda mflg:beq menust
302 jsr mnull:sty mitm
304 jsr closwndw ;[160] window
306 lda #0:beq menust
308 menu[145] [178] [172] ;show menubar
310 lda mflg:bne menust ;al[135]y [145]!
312 jsr [162]bp ;reset bptr
314 lda m[164]p:beq menust ;no menus!
316 jsr menusiz ;size menubar
318 jsr [159]wndw ;[159] window
320 jsr menubar ;display headers
322 lda #[171]1 ;flag [171] [145]
324 menust sta mflg:rts
326 ;
328 menucol [178] [172] ;eat [164]ken [,bg,fg]
330 jsr chr[161]:bne [172][170]3:rts
332 jsr [161]byt:txa:[175] #$0f:sta mcol
334 jsr [161]byt:txa:asl:asl:asl:asl
336 [176]a mcol:sta mcol:rts
338 ;
340 ;menu types 1 bit[178]1 item
342 ;[131] struct 1 byt=1 menu (8 items)
344 ;
346 settype [178] [172] ;set menu type
348 ldy mnum ;#mn(1[171]7) current menu
350 ldx mitm ;#mi(0[171]8) current item
352 bne [172][170]7 ;[139] #mi[178]0 [167] use
354 ldy #0:ldx mnum ; #mn[178]0 bits
356 [156]m[134] [178] [172] ;type is [168] disabled
358 lda mask[171]1,x:e[176] #$ff
360 [175] m[134],y ;clear bit #mi
362 sta m[134],y
364 [156]mchk [178] [172] ;type is [168] marked
366 lda mask[171]1,x:e[176] #$ff
368 [175] mchk,y ;clear bit #mi
370 sta mchk,y
372 lda mtyp ;#mt(0[171]2) current type
374 cmp #0:beq setm[134]
376 cmp #2:beq setmchk
378 rts ;else #mt[178]1
380 ;
382 setm[134] [178] [172] ;type is disabled
384 lda m[134],y ;[134] bits
386 [176]a mask[171]1,x ;set bit #mi
388 sta m[134],y:rts
390 ;
392 setmchk [178] [172] ;type is marked
394 lda mchk,y ;check bits
396 [176]a mask[171]1,x ;set bit #mi
398 sta mchk,y:rts
400 ;
402 [161]type [178] [172] ;check menu types
404 ldy mnum ;#mn(1[171]7) current menu
406 ldx mitm ;#mi(0[171]8) current item
408 bne [161]m[134]
410 ldy #0:ldx mnum ;[139] #mi[178]0
412 [161]m[134] [178] [172] ;check [139] disabled
414 lda m[134],y ;item flags
416 [175] mask[171]1,x
418 sta [134]f ;0[178]off
420 [161]mchk [178] [172] ;check [139] marked
422 lda mchk,y ;item flags
424 [175] mask[171]1,x
426 rts ;0[178]off
428 ;
430 setrow [178] [172] ;set menu row per item
432 ldx mitm:sta mrow[171]1,x:rts
434 [161]row [178] [172] ;[161] menu row per item
436 ldx mitm:ldy mrow[171]1,x:rts
438 ;
440 ;
442 ;menu[155] [171] a table of po[181]ers
444 ;[164] text$ [176] image$ descrip[164]rs
446 ; 4 bytes per name$ [176] item$
448 ; index [171] mlix[178](mn[171]1)[172]36[170]mi[172]4
450 ;
452 mlx [178] [172] ;[161] index [181]o menu[155]
454 lda mnum:sec:sbc #1 ;(mn[171]1)
456 asl:asl:sta $a3 ;[172]4
458 asl:adc $a3:sta $a3 ;[172]12
460 asl:adc $a3:sta $a3 ;[172]36
462 lda mitm:asl:asl ;[172]4
464 adc $a3:tay:rts
466 ;
468 set[155] [178] [172] ;descrip[164]r in $22[173]23
470 tax ;[195]gth of string
472 jsr mlx:txa:sta m[155],y ;ml[171]x
474 iny:lda $22:sta m[155],y ;ml[171]l
476 iny:lda $23:sta m[155],y ;ml[171]h
478 iny:sty mlix ;update index
480 lda #0:jsr setlast ;[150]ault
482 setm[164]p [178] [172] ;update maximums menus
484 ldx mnum:cpx m[164]p:bcc [172][170]5
486 stx m[164]p ;update maximum #mn
488 lda mitm:cmp m[164]p,x:bcc [172][170]5
490 sta m[164]p,x ;update maximum #mi
492 rts
494 ;
496 setlast [178] [172] ;add xr [164] menu[155]
498 ldy mlix:sta m[155],y:rts ;ml[171]xr
500 ;
502 [161][155] [178] [172] ;descrip[164]r [164] $a3[173]a4
504 jsr mlx:ldx m[155],y ;ml[171]x
506 iny:lda m[155],y:sta $a3 ;ml[171]l
508 iny:lda m[155],y:sta $a4 ;ml[171]h
510 iny:lda m[155],y:sta $a5 ;ml[171]xr
512 sty mlix ;[148] .y index
514 txa:bit $a5 ;string [195]gth in .x
516 [161][195] [178] [172] ; cell [195]gth in .x
518 bpl [172][170]8 ;[139] text$
520 bvc [172][170]3:lsr ;[139] image$[171]1
522 lsr:lsr:lsr ;[173]8 [176] [173]16
524 tax:lda $a5:bit $a5:rts
526 ;
528 ;
530 ;[172][172][172] menu routines [172][172][172]
532 ;
534 ;
536 menusiz [178] [172] ;size pro[185]ed menubar
538 lda #1:sta mndp ;1 row
540 ldy #0:sty mitm:iny
542 msiz2 sty mnum
544 cpy m[164]p:beq [172][170]4:bcs mnull
546 jsr [161][155]:bvs msiz3 ;check [129]m
548 ldy mnum:iny:bne msiz2
550 msiz3 lda #2:sta mndp ;2 rows
552 mnull ldy #0:sty mnum:rts
554 ;
556 menubar [178] [172] ;display menu bar
558 ldx mnlc:stx hc
560 ldy mntr:sty hr:jsr scrsr
562 ldy #0:sty mitm:iny
564 mbar2 sty mnum
566 cpy m[164]p:beq [172][170]4:bcs mnull
568 lda m[164]p,y:bne [172][170]8
570 sta mtyp:jsr settype ;no items!
572 jsr lcase ;lowercase [150]ault
574 jsr [161]type ;set [134]f [145]ly
576 jsr [161][155] ;menu[155] params
578 [175] #$3f:beq mbar3 ;[161] offset oc
580 clc:adc hc:tax ;[185]iti[145] [164] oc
582 ldy hr:jsr scrsr ;set curs[176]
584 mbar3 jsr [161][155] ;menu[155] params
586 [176]a cc:jsr setlast ;set oc in xr
588 bit $a5 ;check [129]m
590 jsr plt[129]m ;text$ [176] image$
592 mbar4 ldy mnum:iny:bne mbar2
594 ;
596 menusel [178] [172] ;select from menubar
598 lda mflg:beq msel4 ;no menubar!
600 lda m[164]p:beq msel4 ;no menus!
602 ldy mntr:sty hr ;set header row
604 jsr mcmxy ;mouse [185]n (mcx,mcy)
606 iny:lda mndp ;within menubar"?
608 dey:cpy hr:beq *+7 ;yes!
610 lsr:bcc *-6:bcs msel4 ;no, exit
612 ldy #0:sty mitm:iny
614 msel2 sty mnum ;scan each menu name
616 cpy mtop:beq *+4:bcs msel4
618 jsr getlist:sta ht ;form state
620 and #$3f:sta hc ;cc offset
622 cmp mcx:beq *+4:bcs msel4
624 txa:clc:adc hc ;within header"?
626 cmp mcx:beq [172][170]4:bcs msel3 ;found!
628 ldy mnum:iny:bne msel2 ;[130] menu
630 msel3 stx hs ;[148] header width
632 jsr [161]type:lda [134]f:bne msel4
634 lda hs ;[195]gth in .a [129] hilite
636 ldx hc:ldy hr:bit ht ;[129]m state
638 jsr hlit[129]m ;hlit text$ [176] image$
640 clc:rts ;[142] with #mn hilited
642 msel4 jsr mnull ;#mn[178]0
644 sec:rts ;[139] c[178]1 no select!
646 ;
648 menubox [178] [172] ;size up menu box
650 lda hr:clc:adc mndp:sta tr ;[164]prow
652 lda hc ;try [164] align at left edge
654 mbox2 sta lc:ldy #0
656 sty wd:sty dp:sty $a6 ;past oc
658 ldx #1:stx mitm
660 mbox3 jsr [161][155]:bvs mbox4
662 [175] #$3f:beq [172][170]4:inx:inx
664 ldy #0:sty $a6:beq mbox5 ;[139] 1 row
666 mbox4 [175] #$3f:cmp $a6 ;[139] 2 rows
668 beq [172][170]4:bcs [172][170]6:ldy #0:sty $a6
670 ldy $a6:sta $a6 ;update past oc
672 txa:sec:adc $a6:tax ;size width
674 cpy #0:bne [172][170]6:inc dp ;size depth
676 mbox5 inc dp ;size depth
678 cpx wd:bcc [172][170]4:stx wd ;size width
680 mbox6 inc mitm:ldy mnum
682 lda mitm:cmp m[164]p,y
684 bcc mbox3:beq mbox3 ;[130] item
686 lda lc:clc:adc wd ;check max width
688 cmp #39:bcc mbox7:beq mbox7
690 sbc #39:e[176] #[171]1:adc hc ;adjust
692 jmp mbox2 ;try lc[178]hc[171](lc[170]wd[171]39)
694 mbox7 lda lc:sta mnlc,y
696 lda wd:sta mnwd,y ;s[164]re the
698 lda tr:sta mntr,y ;viewp[176]t params
700 lda dp:cmp #21:bcc [172][170]4
702 lda #21:sta mndp,y:rts
704 ;
706 menudown [178] [172] ;find menu & display
708 jsr menubox ;size menu box
710 jsr [159]wndw ;[159] window
712 jsr vb[176]der ;b[176]der viewp[176]t
714 menuplt [178] [172] ;plot menu
716 ldy tr:sty rr ;[164]p row is start
718 ldx #1:stx mitm:ldy #0:sty $a6
720 mplt2 jsr lcase ;lowercase [150]ault
722 jsr [161][155]:bvc mplt3;[168] image$[171]2
724 [175] #$3f:cmp $a6 ;past oc
726 beq [172][170]4:bcs [172][170]6:ldy #0:sty $a6
728 ldy $a6:sta $a6 ;update past oc
730 clc:adc lc:tax ;add offset column
732 cpy #0:beq mplt3b
734 ldy rr:dey:dey:jmp mplt3c
736 mplt3 ldx lc ;set column
738 mplt3b ldy rr ;set row
740 mplt3c jsr scrsr ;set curs[176]
742 lda rr:jsr setrow ;per item
744 jsr [161]type:beq [172][170]5 ;set [134]f
746 jsr pltmark ;checkmark [139] set
748 jsr [161][155] ;menu[155] params
750 jsr plt[129]m ;text$ [176] image$
752 bit $a5:bvs mplt5 ;[139] image$[171]2
754 mplt4 ldy #0:sty $a6 ;reset past oc
756 lda $a5:[175] #$3f:beq mplt6
758 tax:lda [198]ii,x ;alt key sequence
760 jsr pltaltk ;plot [188]o & key
762 jmp mplt6
764 mplt5 jsr ccrsr ;(2 rows)
766 mplt6 jsr ccrsr ;(1 row)
768 inc mitm:ldy mnum
770 lda mitm:cmp m[164]p,y
772 bcc mplt2:beq mplt2:rts
774 ;
776 menukey [178] [172] ;scan menu[155] [129] key
778 lda $c5:cmp #64:bne [172][170]3:rts
780 ldy #1 ;start scan at menu #1
782 mkey2 sty mnum
784 cpy m[164]p:beq [172][170]4:bcs mkey7 ;exit
786 lda m[164]p,y:beq mkey5 ;[130] menu
788 ldx #0:stx mitm
790 jsr [161]type:lda [134]f:bne mkey5
792 mkey3 jsr [161][155]:bvs mkey4
794 ldx mitm:beq mkey4 ;[130] item
796 [175] #$3f:cmp $c5:beq mkey6 ;found!
798 mkey4 inc mitm:ldy mnum
800 lda mitm:cmp m[164]p,y
802 bcc mkey3:beq mkey3
804 mkey5 ldy mnum:iny:bne mkey2
806 mkey6 dec $c6 ;de[136]e from buffer
808 jsr [161]type ;item [134]med"?
810 lda dimf:bne mkey7 ;yes, exit
812 rts ;exit with #mn & #mi
814 mkey7 jsr mnull ;not found
816 sty mitm:rts ;or item dimmed
818 ;
820 menuaway = * ;remove menu & header
822 jsr closwndw ;close window
824 lda hs:ldx hc:ldy hr:bit ht ;form
826 hlitform = * ;choose form & hilite
828 bpl hlittext ;by exchanging
830 bvc hlitimg1 ;color nibbles
832 bvs hlitimg2 ;over length - hw
834 ;cell length in .a
836 hlitimg1 = *
838 hlittext sta hw ;hilite 1 row
840 hlitword jsr vcposn
842 hlitwor2 ldy #0
844 hlitwor3 lda ($f7),y
846 asl:asl:asl:asl:sta $af
848 lda ($f7),y:lsr:lsr:lsr:lsr
850 ora $af:sta ($f7),y
852 iny:cpy hw:bcc hlitwor3:rts
854 ;
856 hlitimg2 sta hw ;hilite 2 rows
858 hlitarea jsr vcposn ;area x2
860 ldx #0:jsr hlitwor2
862 jsr adlnf7:inx:cpx #2:bcc *-9:rts
864 ;
866 menuctrl = * ;item selection
868 jsr rmpos0y ;sprite0 at top row
870 ldy tr:sty rr ;top row
872 lda #1:sta mitm ;1st item
874 mctr2 ldx wd:stx hw ;set width
876 ldx lc:stx cc ;set column
878 jsr getrow:sty rr ;set row
880 jsr getlist:bvc mctr3:stx hw
882 and #$3f:clc:adc lc:sta cc ;set cc
884 mctr3 jsr checkbox:bcs mctr6b
886 jsr rmbtns:beq mexit ;if released
888 bit $a5:bvc mctr4 ;if not image$-2
890 cpy rr:beq *+11:bcc mctr9
892 dey:cpy rr:beq *+4:bcs mctr9
894 cpx cc:bcc mctr9:txa
896 sbc cc:cmp hw:bcs mctr9:bcc mctr5
898 mctr4 cpy rr:bne mctr9
900 mctr5 jsr highlite ;menu item
902 mctr6 jsr checkbox ;mouse in box"?
904 mctr6b bcs mexit ;exit [139] outside
906 jsr rmbtns:beq flash ;[139] released
908 bit $a5:bvc mctr7 ;[139] [168] image$[171]2
910 cpy rr:beq [172][170]11:bcc mctr8
912 dey:cpy rr:beq [172][170]4:bcs mctr8
914 cpx cc:bcc mctr8:txa
916 sbc cc:cmp hw:bcs mctr8:bcc mctr6
918 mctr7 cpy rr:beq mctr6
920 mctr8 php:jsr highlite:plp;old item
922 mctr9 bcs [172][170]10 ;[164] [130] item
924 dec mitm ;previous item
926 lda mitm:bne [172][170]5
928 inc mitm:jmp mctr2 ;[130] item
930 ;
932 mexit ldx #0:stx mitm:stx mb:rts
934 ;
936 flash [178] [172] ;[139] item selected
938 jsr [161]type:lda [134]f:bne mexit
940 flash8 jsr flash4
942 flash4 jsr flash2
944 flash2 jsr flash1
946 flash1 [178] [172] ;delayed highlite
948 ldy #48:jsr delay ;48 millisec
950 highlite [178] [172] ;([176] unhighlite)
952 jsr [161]type:lda [134]f:beq [172][170]3:rts
954 lda hw:ldx cc:ldy rr:bit $a5
956 jmp hlit[129]m ;hlit text$ [176] image$
958 ;
960 delay [178] [172] ;.y [178] millisec delay
962 ldx #$b8:dex:bne [172][171]1
964 dey:bne [172][171]6:rts
966 ;
968 checkbox [178] [172] ;check mouse co[176]ds
970 ldy #16:jsr delay ;16 millisec
972 jsr rdmouse ;mouse co[176]ds
974 jsr mcmxy ;colm & row co[176]ds
976 cpx lc:bcc limit:txa ;outside box
978 sbc lc:cmp wd:bcs limit
980 cpy tr:bcc limit:tya
982 sbc tr:cmp dp:bcs limit
984 clc:rts ; ok! within menubox
986 limit sec:rts ;outside menubox
988 ;
990 ;
992 ;
994 ;[172][172][172] window routines [172][172][172]
996 ;
998 ;
1000 [159]wndw [178] [172] ;[159] window
1002 jsr viewp[176]t ;[150]ine viewp[176]t
1004 jsr vwipe ;clear bitmap bmap0
1006 jsr vcocmem ;col[176] cmem0 area
1008 jsr savbp ;[148] buffer pntr
1010 jsr vswcmem ;swap col[176] mem[176]y
1012 jsr vxfer ;swap bitmap out
1014 jmp setbp ;advance buffer pntr
1016 ;
1018 closwndw [178] [172] ;[160] window
1020 jsr viewp[176]t ;[150]ine viewp[176]t
1022 jsr lodbp ;put back bptr
1024 jsr vxfer ;swap bitmap bmap0
1026 jmp vswcmem ;swap cmem0 cmem
1028 ;
1030 ;window [148] area buffer
1032 ;po[181]er "bptr" po[181]s [164]
1034 ;bitmap [148] area [171] bmap0
1036 bptr .w[176]d 0
1038 bplo .byte 00,00
1040 bphi .byte 00,00
1042 ;
1044 [161]bp [178] [172] ;[161] "bptr"
1046 lda bptr:ldx bptr[170]1
1048 sta $a7:stx $a8:rts
1050 savbp jsr [161]bp ;[148] "bptr"
1052 ldy mnum:beq [172][170]4:ldy #1
1054 sta bplo,y:txa:sta bphi,y:rts
1056 lodbp [178] [172] ;[147] [148]d "bptr"
1058 ldy mnum:beq [172][170]4:ldy #1
1060 lda bplo,y:ldx bphi,y:bne putbp
1062 setbp [178] [172] ;set "bptr"
1064 lda $a7:ldx $a8:bne putbp
1066 [162]bp [178] [172] ;init "bptr"
1068 lda #[179]bmap0:ldx #[177]bmap0
1070 putbp sta bptr:stx bptr[170]1:rts
1072 ;
1074 [161]cbp [178] [172] ;compute "cmem bptr"
1076 lda bptr[170]1:sec:sbc #[177]bmap0
1078 sta $fa:lda bptr:lsr $fa:r[176] ;[173]8
1080 lsr $fa:r[176]:lsr $fa:r[176]:sta $f9
1082 clc:lda $fa:adc #[177]cmem0:sta $fa
1084 rts
1086 ;
1088 ;
1090 ;[172][172][172] viewp[176]t routines [172][172][172]
1092 ;
1094 ;byte[171]aligned viewp[176]ts
1096 vpx .w[176]d 0 ;pixel byte address
1098 ;
1100 viewp[176]t [178] [172] ;viewp[176]t params
1102 ldy mnum ;menu number
1104 lda mnlc,y :sta lc ;left c[176]ner
1106 lda mntr,y :sta tr ;[164]p row
1108 lda mnwd,y :sta wd ;width
1110 lda mndp,y :sta dp ;depth
1112 ;set up co[176]dinate pixel address
1114 clc:lda lc:adc wd:sta ce ;col [128]
1116 jsr hcrsr:ldx $f9 ;home curs[176]
1118 stx vpx:sta vpx[170]1:rts
1120 ;
1122 vaddr [178] [172] ;[164]p left c[176]ner byte
1124 lda vpx:ldx vpx[170]1
1126 sta $a7:stx $a8
1128 vram [178] [172] ;disable [181]errupts & rom
1130 pha:lda #$7f:sta $dc0d
1132 lda #$34:sta $01:pla:rts
1134 ;
1136 ;[185]i[164]n col[176] mem po[181]ers
1138 ; f7[173]f8 pntr [164] cmem1 area
1140 vchome ldx lc:ldy tr ;home
1142 vc[185]n lda #0 ;set [185]iti[145]
1144 sta $f7:sta $f8:tya:beq [172][170]8
1146 jsr adlnf7:dey:bne [172][171]4
1148 txa:clc:adc $f7:sta $f7:tax
1150 lda #0:adc $f8:pha
1152 adc #[177]cmem1:sta $f8:pla:rts
1154 ;
1156 adlnf7 clc ;advance [145]e cmem line
1158 lda $f7:adc #40:sta $f7
1160 bcc [172][170]4:inc $f8:rts
1162 ;
1164 ;cmem0 area [129] colr mem [148]s
1166 ; f9[173]fa pntr [164] cmem0 area
1168 vcocmem lda mcol:.byt $2c
1170 vswcmem lda #0:sta $a3:jsr vram
1172 jsr vchome:jsr [161]cbp:ldx #0
1174 ldy #0:lda $a3:bne [172][170]10
1176 lda ($f7),y:pha:lda ($f9),y
1178 sta ($f7),y:pla:sta ($f9),y
1180 iny:cpy wd:bcc [172][171]17
1182 tya:clc:adc $f9:sta $f9
1184 bcc [172][170]4:inc $fa:jsr adlnf7
1186 inx:cpx dp:bcc [172][171]37:jmp vrom
1188 ;
1190 adlna7 clc ;advance [145]e bmap line
1192 lda $ab:adc #[179]320:sta $a7
1194 lda $ac:adc #[177]320:sta $a8
1196 adlna9 clc ;advance [145]e bmap line
1198 lda $ad:adc #[179]320:sta $a9
1200 lda $ae:adc #[177]320:sta $aa:rts
1202 ;
1204 vwipe [178] [172] ;clear hires buffer area
1206 lda #0:.byt $2c
1208 vxfer [178] [172] ;xfer viewp[176]t bitmap
1210 lda #1:sta $a4 ;xfer flag
1212 jsr vaddr:sta $a9:stx $aa
1214 jsr [161]bp:ldy #0
1216 jsr vrow:jsr adlna9
1218 ldy $af:iny:cpy dp:bcc [172][171]11
1220 vrom [178] [172] ;enable [181]errupts & rom
1222 lda #$37:sta $01
1224 lda #$81:sta $dc0d:rts
1226 ;
1228 ;subroutine [129] vwipe[173]vxfer
1230 vrow sty $af:ldx #0 ;do [145]e row
1232 lda $a7:sta $ab:lda $a8:sta $ac
1234 lda $a9:sta $ad:lda $aa:sta $ae
1236 vro2 ldy #0
1238 vro3 lda $a4 ;flag[178]0 [129] vwipe
1240 beq vro4 ;flag[178]1 [129] vxfer
1242 lda ($a9),y:pha
1244 lda ($a7),y:sta ($a9),y:pla
1246 vro4 sta ($a7),y
1248 iny:cpy #8:bne vro3
1250 tya:clc:adc $a7:sta $a7
1252 bcc [172][170]4:inc $a8
1254 tya:clc:adc $a9:sta $a9
1256 bcc [172][170]4:inc $aa
1258 inx:cpx wd:bcc vro2:rts
1260 ;
1262 vb[176]der [178] [172] ;b[176]der viewp[176]t
1264 jsr vaddr:ldx #0
1266 vblft lda #%10000000:ldy #7
1268 sta ($a7),y:dey:bpl [172][171]3
1270 inx:cpx dp:bcs vbbot
1272 lda $a7:adc #[179]320:sta $a7
1274 lda $a8:adc #[177]320:sta $a8
1276 bne vblft
1278 vbbot ldx #0:ldy #7
1280 jsr vblin ;bot[164]m line
1282 vbrht ldx #0:dey
1284 lda #%00000001
1286 sta ($a7),y:dey:bpl [172][171]3
1288 inx:cpx dp:bcs vb[128]:sec
1290 lda $a7:sbc #[179]320:sta $a7
1292 lda $a8:sbc #[177]320:sta $a8
1294 ldy #7:bne vbrht[170]3
1296 vb[128] jmp vrom
1298 ;
1300 vb[164]p [178] [172] ;[164]p line of viewp[176]t
1302 jsr vaddr:ldx #0:ldy #0
1304 vblin lda #%11111111
1306 sta ($a7),y:inx:cpx wd:bcs [172][170]14
1308 lda $a7:adc #8:sta $a7
1310 bcc [172][170]4:inc $a8:bne vblin
1312 rts
1314 ;
1316 ;
1318 ;[172][172][172] plotting routines [172][172][172]
1320 ;
1322 ;3 [129]ms of objects
1324 plt[129]m [178] [172] ;choose [129]m & plot
1326 bpl plttext ;with au[164][171]advance
1328 bvc pltimg1 ;of curs[176] pntrs
1330 bvs pltimg2 ;[175] bitmap pntrs
1332 ;cell [195]gth in .x
1334 plttext [178] [172] ;do text$
1336 inx:ldy #0:sty imgf ;set flag
1338 dex:beq [172][170]10
1340 lda ($a3),y:jsr dochar
1342 iny:bne [172][171]9:rts
1344 ;
1346 pltimg1 [178] [172] ;do image$[171]1 ( 1 row)
1348 inx ;cell [195]gth in .x
1350 pltimga ldy #$80:sty imgf
1352 lda $a3:ldy $a4 ;l[173]h desc
1354 sta $a9:sty $aa ;put pntr
1356 pltimgb dex:bne [172][170]3:rts
1358 jsr dochar
1360 clc:lda $a9:adc #8:sta $a9
1362 bcc [172][170]4:inc $aa:jmp pltimgb
1364 ;
1366 pltimg2 [178] [172] ;do image$[171]2 (2 rows)
1368 lda cc:sta cs ;[148] current colm
1370 txa:pha ;cell [195]gth in .x
1372 inx:jsr pltimga ;do 1st row
1374 ldx cc:ldy rr:lda cs
1376 stx cs:tax:iny:jsr scrsr
1378 pla:tax:inx:jsr pltimgb ; 2nd row
1380 ldx cs:ldy rr:dey:jmp scrsr
1382 ;
1384 pltmark [178] [172] ;do checkmark "sqr"
1386 bit $a5:bvs [172][170]8 ;[139] image$[171]2
1388 jsr putchk:jmp lcrsr
1390 jsr lcrsr :jmp putchk
1392 ;
1394 pltaltk [178] [172] ;do [188]o & alt key
1396 sta char:jsr ecrsr ;edge right
1398 jsr putcom ;com[171][188]o
1400 jsr lcase:ldy #0:sty imgf
1402 lda char ;do key
1404 dochar [178] [172] ;plot a cell
1406 sta char:txa:pha:tya:pha
1408 jsr exchar
1410 pla:tay:pla:tax:rts
1412 ;
1414 exchar [178] [172] ;text$ [176] image$
1416 lda imgf:bne [153] ;[139] image$
1418 lda char:bmi hichr ;filter text$
1420 lochr cmp #$20:bcc loch2:cmp #$60
1422 bcc [172][170]6:[175] #$df:bne [172][170]4:[175] #$3f
1424 prchr ldx rvse:beq [172][170]4:[176]a #$80
1426 ldx #0:stx $aa ;[161] chset offset
1428 asl:rol $aa:asl:rol $aa
1430 asl:rol $aa:clc:adc cset:tax
1432 lda $aa:adc cset[170]1:tay
1434 stx $a9:sty $aa
1436 [153] jmp putbyts
1438 loch2 cmp #$0e:bne rvchr
1440 lcase lda cset[170]1:[176]a #8:bne pcase
1442 rvchr cmp #$12:beq prvse:rts
1444 hichr [175] #$7f:cmp #$7f:bne [172][170]4
1446 lda #$5e:cmp #$20:bcc hich2
1448 [176]a #$40:bne prchr
1450 hich2 cmp #$0e:bne ofchr
1452 ucase lda cset[170]1:[175] #$f0
1454 pcase sta cset[170]1:rts
1456 ofchr cmp #$12:bne [172][170]7:lda #0
1458 prvse sta rvse:rts
1460 ;
1462 ccrsr ldx lc:ldy rr:iny ;[179]cr[173]lf[177]
1464 scrsr stx cc:sty rr ;set curs[176]
1466 jsr vc[185]n:sta $fa:stx $f9
1468 asl $f9:rol:asl $f9:rol:asl $f9
1470 rol:clc:adc #[177]bmap1:sta $fa:rts
1472 ;
1474 hcrsr ldx lc:ldy tr:jmp scrsr
1476 ecrsr ldx ce:dex:dex ;edge right
1478 ldy rr:jmp scrsr ;set curs[176]
1480 ;
1482 ;special 8x8 cell graphics
1484 chk [178] [172] ;checkmark
1486 .byt %00000000
1488 .byt %00000001
1490 .byt %00000010
1492 .byt %00000100
1494 .byt %00101000
1496 .byt %00010000
1498 .byt %00000000
1500 .byt %00000000
1502 com [178] [172] ;commod[176]e key [188]o
1504 .byt %00111000
1506 .byt %01000110
1508 .byt %10110100
1510 .byt %10111000
1512 .byt %10110100
1514 .byt %01000110
1516 .byt %00111000
1518 .byt %00000000
1520 [134] [178] [172] ;[134] bits mask
1522 .byt %10101010
1524 .byt %01010101
1526 .byt %10101010
1528 .byt %01010101
1530 .byt %10101010
1532 .byt %01010101
1534 .byt %10101010
1536 .byt %01010101
1538 spc [178] [172] ;cell w[176]k space
1540 [172][178][172][170]8 ;8 bytes
1542 ;
1544 putchk [178] [172] ;put checkmark bytes
1546 ldx #[179]chk:ldy #[177]chk:bne putptrs
1548 putcom [178] [172] ;put com[171][188]o bytes
1550 ldx #[179]com:ldy #[177]com
1552 putptrs stx $a9:sty $aa
1554 putbyts [178] [172] ;8 bytes per cell
1556 lda $dc0e:[175] #[171]2:sta $dc0e
1558 lda #$31:sta $01
1560 ldy #7:lda ($a9),y
1562 sta spc,y:dey:bpl [172][171]6
1564 lda [134]f:beq chkbits
1566 [134]bits ldy #7:lda spc,y
1568 [175] [134],y:sta spc,y
1570 dey:bpl [172][171]10
1572 chkbits ldy #7:lda ($f9),y
1574 [176]a spc,y:sta ($f9),y
1576 dey:bpl [172][171]8
1578 lda #$37:sta $01
1580 lda $dc0e:[176]a #1:sta $dc0e
1582 rcrsr [178] [172] ;curs[176] right
1584 ldx cc:inx:cpx ce:bcs [172][170]15:stx cc
1586 clc:lda $f9:adc #8:sta $f9
1588 bcc [172][170]4:inc $fa:rts
1590 lcrsr [178] [172] ;curs[176] left
1592 ldx cc:dex:cpx lc:bcc [172][170]15:stx cc
1594 sec:lda $f9:sbc #8:sta $f9
1596 bcs [172][170]4:dec $fa:rts
1598 ;
1600 ;
1602 ;[172][172][172] mouse manager & driver [172][172][172]
1604 ;
1606 ;
1608 ;[158] mouse,curs[176]$ [171][171](make curs[176])
1610 ;[158] mouse,0 [171][171][171](transparent)
1612 ;[158] mouse,1 [171][171](arrow curs[176])
1614 ;[158] mouse,2 [171][171](cross curs[176])
1616 ;[158] mouse [145] [,col[176]] (show mouse)
1618 ;[158] mouse [off] [171][171][171][171](hide mouse)
1620 ;
1622 mouse [178] [172] ;check [129] [164]kens
1624 jsr chr[203]t:beq mouseoff
1626 cmp #"," :beq mousepar
1628 pha:jsr mousecol:pla
1630 cmp #$91 :beq mouse[145]
1632 jmp syntax ;err[176]
1634 mousepar jsr eatcma ;eat ","
1636 jsr e[197]fm ;e[197]uate
1638 bit $0d:bmi mousestr
1640 mousenum jsr facbyt ;byt in .x
1642 cpx #0 :beq settrans ;transparent
1644 cpx #1 :beq setarrow ;[174][171]arrow
1646 cpx #2 :beq setcross ;x[171]cross
1648 jmp illqnt
1650 setarrow lda #[179]arrow:ldy #[177]arrow
1652 ldx #39:bne setpntr
1654 setcross lda #[179]cross:ldy #[177]cross
1656 ldx #15 ;[195]gth in .x
1658 setpntr sta $22:sty $23
1660 bne settrans
1662 mousestr jsr [184]str ;[161] descript
1664 tax ;[195]gth in .x
1666 settrans ldy #63:lda #0 ;clear
1668 sta slot1,y:dey:bpl [172][171]4 ;out
1670 ldy #0:inx
1672 dex:beq mouseptr
1674 lda ($22),y:sta slot1,y
1676 iny:cpy #64:bcc [172][171]11
1678 mouseptr lda #253:sta sptr0:rts
1680 ;
1682 mouseoff [178] [172] ;hide mouse
1684 ldx #[171]2:lda #[179]oldirq:ldy #[177]oldirq
1686 bne [172][170]8 ;skip over
1688 mouse[145] [178] [172] ;show mouse
1690 ldx #01:lda #[179][162]irq:ldy #[177][162]irq
1692 sei:sta $0314:sty $0315
1694 jsr rmsprt0 ;init sprite0
1696 cli:rts
1698 ;
1700 mousecol [178] [172] ;eat [164]ken [,col[176]]
1702 jsr chr[161]:bne [172][170]3:rts
1704 jsr [161]byt:txa:[175] #$0f
1706 jmp rmscol0 ;sprite0 col[176]
1708 ;
1710 oldirq [178] $ea31 ;keyscan, etc.
1712 extirq [178] $ea81 ;[142] from irq
1714 ;
1716 [162]irq [178] [172] ;set up mouse driver
1718 lda #[177]msdirq:pha ;[130] [145] stack
1720 lda #[179]msdirq:pha
1722 php:pha:pha:pha ;call dummy [131]
1724 jmp oldirq
1726 ;
1728 ;
1730 ;[172][172][172] mouse routines [172][172][172]
1732 ;
1734 ;
1736 msdirq [178] [172] ;[162] mouse driver irq
1738 jsr rdmouse ;[135] mouse (p[176]t 2)
1740 jsr rmbtns ;[135] mouse btns
1742 sta mb:beq msd2 ;no btns
1744 jsr msevent ;do btns
1746 jmp extirq ;exit irq
1748 msd2 ldy $028e ;check com[171]key
1750 cpy #2:bne msd3 ;[139] [168] pressed
1752 ldx $c6:beq msd3 ;skip scan
1754 jsr menukey ;menu[155] keycodes
1756 msd3 jmp extirq ;exit
1758 ;
1760 msevent [178] [172] ;left & right btns
1762 bmi select ;left btn
1764 nop ;(rts [171] right btn ign[176]ed)
1766 bpl menubtn ;right btn
1768 noevent rts
1770 ;
1772 select [178] [172] ;left mouse but[164]n
1774 rts ;(nop [171] right btn ign[176]ed)
1776 nop:nop ;future [189]ansi[145]
1778 ;
1780 menubtn [178] [172] ;right mouse but[164]n
1782 jsr menusel:bcs noevent
1784 jsr menudown ;layout menu items
1786 jsr menuctrl ;select item
1788 jmp menuaway ;erase menu items
1790 ;
1792 mcmxy [178] [172] ;mouse cell column & row
1794 lda mx[170]1:lsr ;xhi set carry
1796 lda mx:r[176]:lsr:lsr ;[173]8 with carry
1798 tax:stx mcx
1800 lda my:lsr:lsr:lsr ;[173]8
1802 tay:sty mcy:rts
1804 ;
1806 ;
1808 ;[172][172][172] sprite0 routines [172][172][172]
1810 ;
1812 ;
1814 rdmouse [178] [172] ;[135] mouse [185]iti[145]
1816 lda #$c0:sta $dc02 ;ctrl p[176]t 2
1818 lda #$80:sta $dc00
1820 ldx #0:inx:bne [172][171]1 ;settle lines
1822 ldx $d419 ;[135] potx
1824 lda $dc00:pha ;[135] p[176]t
1826 [175] #$10:sta mb ;[148] left btn
1828 txa:bmi [172][170]5 ;right btn
1830 lda #$20:.byt $2c ;[188]ic high
1832 lda #$00:[176]a mb:lsr;[188]ic low
1834 lsr:e[176] #[171]1:sta mb ;[148] l&r btns
1836 pla:[175] #$0f ;filter directi[145]s
1838 ldx #$ff:stx $dc02 ;reset ddr
1840 ldx #$7f:stx $dc00 ;reset reg
1842 rmup tay:[175] #%0001:bne rmdn
1844 lda $d001 ;sprite0(y)
1846 cmp #48:beq rmlf
1848 dec $d001:bne rmlf
1850 rmdn tya:[175] #%0010:bne rmlf
1852 lda $d001 ;sprite0(y)
1854 cmp #247:beq rmlf
1856 inc $d001
1858 rmlf tya:[175] #%0100:bne rmrt
1860 ldx $d000 ;sprite0(x)
1862 lda $d010:[175] #1:bne [172][170]6
1864 cpx #22:beq rmxy
1866 dec $d000:cpx #0:bne rmxy
1868 lda $d010:[175] #$fe:sta $d010
1870 jmp rmxy
1872 rmrt tya:[175] #%1000:bne rmxy
1874 ldx $d000 ;sprite0(x)
1876 lda $d010:[175] #1:beq [172][170]6
1878 cpx #85:beq rmxy
1880 inc $d000:bne rmxy
1882 lda $d010:[176]a #$01:sta $d010
1884 rmxy [178] [172] ;put mouse [185]n (mx,my)
1886 lda $d000:sec:sbc #22:sta mx
1888 lda $d010:[175] #1:sbc #0:sta mx[170]1
1890 lda $d001:sec:sbc #48:sta my
1892 lda #199:sbc my:sta myi:rts
1894 ;
1896 rm[185]0y [178] [172] ;[185]iti[145] sprite0(y)
1898 lda tr:asl:asl:asl ;within menu
1900 adc #52:sta $d001:rts ;viewp[176]t
1902 ;
1904 rmsprt0 [178] [172] ;init sprite0
1906 lda $d001:cmp #48:bcs [172][170]26
1908 lda #75:sta $d000:sta $d001
1910 lda #[171]2:[175] $d010:sta $d010
1912 lda #[171]2:[175] $d01b:sta $d01b
1914 txa:bmi [172][170]7:[176]a $d015:bne [172][170]5
1916 [175] $d015:sta $d015:rts
1918 ;
1920 rmscol0 [178] [172] ;set sprite0 col[176]
1922 sta $d027:rts
1924 ;
1926 rmbtns [178] [172] ;[135] mouse but[164]ns
1928 lda #4:bit mb:bne rmbtn1
1930 asl:bit mb:bne rmbtn2
1932 rmbtn0 lda # 0:rts ; no btn z[178]1
1934 rmbtn1 lda #[171]1:rts ;left btn z[178]0
1936 rmbtn2 lda # 1:rts ;rght btn z[178]0
1938 ;
1940 ;
1942 ;
1944 arrow [178] [172] ;sprite [131]
1946 .byt %00000000,%00000000,%00000000
1948 .byt %00000000,%00000000,%00000000
1950 .byt %00100000,%00000000,%00000000
1952 .byt %00110000,%00000000,%00000000
1954 .byt %00111000,%00000000,%00000000
1956 .byt %00111100,%00000000,%00000000
1958 .byt %00111110,%00000000,%00000000
1960 .byt %00111111,%00000000,%00000000
1962 .byt %00111100,%00000000,%00000000
1964 .byt %00100110,%00000000,%00000000
1966 .byt %00000110,%00000000,%00000000
1968 .byt %00000011,%00000000,%00000000
1970 .byt %00000011,%00000000,%00000000
1972 ;
1974 cross [178] [172] ;sprite [131]
1976 .byt %10001000,%00000000,%00000000
1978 .byt %01010000,%00000000,%00000000
1980 .byt %00100000,%00000000,%00000000
1982 .byt %01010000,%00000000,%00000000
1984 .byt %10001000,%00000000,%00000000
1986 ;
1988 ;
1990 ;code currently [128]s at $8bd6
1992 ;
1994 ;
1996 ;
1998 phase .[139] phase[171][172]:phase err[176]
2000 .[128]