-
Notifications
You must be signed in to change notification settings - Fork 0
/
menu.asm
1145 lines (958 loc) · 18.2 KB
/
menu.asm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
Base = $2800
include "renderer_header.asm"
PlotDriverLS = $f6d3
PlotDriverMS = $f6d8
GraphicsCtrl = $f6dd
KernelOsrdch = $fe94
RDCVEC = $20a
IF (sddos = 1)
TmpPtr = $78 ; 2 bytes
SortTablePtr = $7a ; 2 bytes
PageState = $7c ; 1 byte
NumPages = $7d ; 1 byte
Item = $7e ; 1 byte
SortType = $7f ; 1 byte
FilterType = $8c ; 1 byte
FilterString = $8d ; 2 bytes
AutoRepeat = $8f ; 1 byte
ExecAddr = $9e ; don't change this, it's what SDDOS uses
ELIF (econet = 1)
TmpPtr = $78 ; 2 bytes
SortTablePtr = $7a ; 2 bytes
PageState = $7c ; 1 byte
NumPages = $7d ; 1 byte
Item = $7e ; 1 byte
SortType = $7f ; 1 byte
FilterType = $8c ; 1 byte
FilterString = $8d ; 2 bytes
AutoRepeat = $8f ; 1 byte
ExecAddr = $d0 ; don't change this, it's what ECONET uses
ELSE
TmpPtr = $70 ; 2 bytes
SortTablePtr = $72 ; 2 bytes
PageState = $74 ; 1 byte
NumPages = $75 ; 1 byte
Item = $76 ; 1 byte
SortType = $77 ; 1 byte
FilterType = $78 ; 1 byte
FilterString = $79 ; 2 bytes
AutoRepeat = $7b ; 1 byte
ExecAddr = $cd ; don't change this, it's what AtoMMC uses
ENDIF
IF (econet = 1)
DirSep = '.'
ELSE
DirSep = '/'
ENDIF
AutoRepeat1 = -$200
AutoRepeat2 = -$20
; Basic -> Machine Code Variable Mapping
;
; A -> Annotation - the annotation to show on the RHS
; B -> n/a - the load address of the MENUMC file
; C -> SortTablePtr - the load address of the SORT data file
; D -> MenuTablePtr - the load address of the MENU data file
; E -> FilterString - current filter record address
; F -> PageState - page state variable (0=Normal title selection, F=1,2,3 showing the filter selection pages)
; G -> FilterType - current filter (0=No filter; 1=Publisher, 2=Genre, 3=Collection)
; H -> FilterVal - current filter value (as an integer)
; I -> TmpI - A temporary variable
; K - The index number of the program about to be *RUN
; L -> LinesPerPage - (CONSTANT) The number of lines per page
; M -> NumPages - The current number of pages
; P -> Page - The current page (1..M)
; Q -> n/a - The constant #8f
; R -> RowReturnBuf - (CONSTANT) The address of a buffer into which the machine code stores the rendered row addresses
; S -> SortType - The current sort order (0=Title,1=Publisher,2=Genre,3=Collection)
; Y -> Item - The currently highlighted row (0..L-1)
; Z -> Sort - The currently base address of the current sort index or filter pointer table)
org Base - 22
.STARTOFHEADER
; 22 byte ATM header
EQUS "MENU"
EQUB $00
EQUB $00
EQUB $00
EQUB $00
EQUB $00
EQUB $00
EQUB $00
EQUB $00
EQUB $00
EQUB $00
EQUB $00
EQUB $00
EQUB <Base
EQUB >Base
EQUB <Base
EQUB >Base
EQUW ENDOF - STARTOF
.STARTOF
.Menu
; Work around for issue with older versions of AtomMMC on some titles (e.g. SUB HUNT)
LDA #<KernelOsrdch
STA RDCVEC
LDA #>KernelOsrdch
STA RDCVEC + 1
; Quick test for memory beyond 0x3C00
LDY #0
STY TmpPtr
LDA #$3C
STA TmpPtr + 1
.MemWrLoop
LDA TmpPtr + 1
EOR #$FF
STA (TmpPtr),Y
INC TmpPtr + 1
BPL MemWrLoop
LDA #$3C
STA TmpPtr + 1
.MemRdLoop
LDA TmpPtr + 1
EOR #$FF
CMP (TmpPtr),Y
BNE MemTestFail
INC TmpPtr + 1
BPL MemRdLoop
BMI MemTestDone
.MemTestFail
INC SplashNum
DEC MenuMaxKey + 1
.MemTestDone
IF (econet = 1)
JSR OscliString
EQUS "DIR $.ASA", Return
;JSR OscliString
;EQUS "LIB $.ATOMLIB", Return
ELSE
; 10 *NOMON
JSR OscliString
EQUS "NOMON", Return
ENDIF
.MenuSplash
; 20 CLEAR 4
LDY #4
JSR Clear
; 30 *LOAD SPLASH
JSR OscliString
EQUS "LOAD SPLASH"
.SplashNum
EQUB '1', Return
.MenuMain
JSR Osrdch
CMP #'A'
BCC MenuMain
.MenuMaxKey
CMP #'G' + 1
BCC MenuNext
; Check for special system key for Rolands system
CMP #'R'
BNE MenuMain
LDY #0
JSR Clear
JSR OscliString
IF (econet = 1)
EQUS "DIR SYS", Return
ELSE
EQUS "CWD SYS", Return
ENDIF
JSR OscliString
EQUS "INIT", Return
; Don't expect to return, but just in case....
JMP $c2b2
.MenuNext
IF (sddos = 1)
ADC #<(1016 - 'A')
STA BinBuffer
LDA #>(1016 - 'A')
STA BinBuffer + 1
LDA #'1'
JSR LoadDisk
JSR OscliString
EQUS "DRIVE 1", Return
ELSE
STA MenuDirChunk
JSR OscliString
IF (econet = 1)
EQUS "DIR MNU"
ELSE
EQUS "CWD MNU"
ENDIF
.MenuDirChunk
EQUS " ", Return
ENDIF
; 90 CLEAR 0
LDY #0
JSR Clear
LDA #12
JSR Oswrch
;100 *LOAD MNU/MENU1
JSR OscliString
EQUS "LOAD MENU1", Return
;110 D=!#CD&#FFFF
LDA ExecAddr
STA MenuTablePtr
LDA ExecAddr + 1
STA MenuTablePtr + 1
;115 *LOAD MNU/MENU2
JSR OscliString
EQUS "LOAD MENU2", Return
; // Initialize the variables
; 120 L=13;S=0;F=0;A=1;G=0;R=#2880;Q=#8F
LDY #0
STY SortType ; S=0
STY PageState ; F=0
STY FilterType ; G=0
INY
STY Annotation ; A=1
JSR LoadSortTable
; // Initialize the search buffer to empty
; 125 ?#120=13
LDA #0
STA SearchBuffer
.LabelA
; // Turn off the cursor and refresh the screen
; 130a?#E1=0;GOS.x
; ?#E1=0 Not needed as we do our own screen output driver
JSR LabelX
.LabelB
; // Refresh rows, page number and total number of pages
; 200bGOS.j
JSR LabelJ
; 260 LINK B;M=(!R&#FFFF+L-1)/L
JSR WritePage
JSR CalculateNumPages
STY NumPages
; 270 ?#801B=P/10+176;?#801C=P%10+176
; 280 ?#801E=M/10+176;?#801F=M%10+176
JSR UpdateTotalPages
; 290 GOS.i
JSR LabelI
.ReleaseKey
JSR HandleAutoRepeat
.LabelC
; // Check for original Atom
LDA $bd00
CMP #$bf
BNE HandleUpKeyOriginal
; // Shift Key is pressed emulator (scroll up)
; 300cIF ?#B001&128>0 G.d
BIT $b001
BMI LabelD
JMP LabelC2
.HandleUpKeyOriginal
; // Ctrl Key is pressed Original Atom (scroll up)
; 300cIF ?#B001&64>0 G.d
BIT $b001
BVS LabelD
.LabelC2
; 310 IF Y>0 GOS.i;Y=Y-1;GOS.i;G.c
LDA Item
BEQ LabelC1
JSR LabelI
DEC Item
JSR LabelI
BMI ReleaseKey ; Always
.LabelC1
; 320 IF P>1 P=P-1;GOS.i;Y=L-1;G.b
LDA Page
CMP #1
BEQ LabelD
DEC Page
JSR LabelI
LDA #(LinesPerPage - 1)
STA Item
JMP LabelB
.LabelD
; // Check for original Atom
LDA $bd00
CMP #$bf
BNE HandleDownKeyOriginal
; // Control Key is pressed emulator (scroll down)
; 400dIF?#B001&64>0 G.e
BIT $b001
BVS LabelE
JMP LabelD2
.HandleDownKeyOriginal
; // Shift Key is pressed Original Atom (scroll down)
; 300cIF ?#B001&128>0 G.d
BIT $b001
BMI LabelE
.LabelD2
; 410 IF Y<>L-1 AND ?(#8060+Y*32)<>32 GOS.i;Y=Y+1;GOS.i;G.c
LDA Item
CMP #(LinesPerPage - 1)
BEQ LabelD1
CLC
ADC #1
JSR TestRowActive
BEQ LabelD1
JSR LabelI
INC Item
JSR LabelI
JMP ReleaseKey
.LabelD1
; 420 IF P<M P=P+1;GOS.i;Y=0;G.b
LDA Page
CMP NumPages
BEQ LabelE
INC Page
.SetItemToZero
JSR LabelI
LDA #0
STA Item
JMP LabelB
.LabelE
; 500eIF?#B002&64=0 AND F=0 A=(A+1)&3;GOS.i;Y=0;G.b
BIT $b002
BVS CallInkey
LDA PageState
BNE CallInkey
INC Annotation
LDA Annotation
AND #3
STA Annotation
JMP SetItemToZero
.CallInkey
; // Call InKey()
; 510 LINK (B+3)
JSR Inkey
; // No key pressed
; 520 IF ?Q=255 G.c
CPY #$FF
BNE TestForPrevPage
JMP LabelC
.TestForPrevPage
; // < key pressed (previous page)
; 600 IF ?Q=28 IF M>1 P=P-1+(P=1)*M;GOS.i;Y=0;G.b
CPY #28
BNE TestForNextPage
LDA NumPages
CMP #1
BEQ TestForNextPage
DEC Page
BNE PrevPageNoWrap
STA Page
.PrevPageNoWrap
JMP SetItemToZero
.TestForNextPage
; // > key pressed (next page)
; 610 IF ?Q=30 IF M>1 P=P+1-(P=M)*M;GOS.i;Y=0;G.b
CPY #30
BNE TestForHelp
LDA NumPages
CMP #1
BEQ TestForHelp
INC Page
LDA NumPages
CMP Page
BCS NextPageNoWrap
LDA #1
STA Page
.NextPageNoWrap
JMP SetItemToZero
.TestForHelp
; // ? key pressed (help)
; 615 IF ?Q=31 GOS.h;G.a
CPY #31
BNE TestForChangeSort
JSR LabelH
JMP LabelA
.TestForChangeSort
; // 1..4 key pressed (change sort)
; 620 IF ?Q>16 AND ?Q<21 S=?Q-17;F=0;A=A&127;G.a
CPY #17
BCC TestForClearFilter
CPY #21
BCS TestForClearFilter
TYA
SBC #16
STA SortType
; Page in the appropriate sort table
JSR LoadSortTable
.PageStateZero
LDA #0
STA PageState
LDA Annotation
AND #$7f
STA Annotation
JMP LabelA
.TestForClearFilter
; // 5 key pressed (clear filter>
; 630 IF ?Q=21 F=0;G=0;A=A&127;G.a
CPY #21
BNE TestForChangeFilter
LDA #0
STA FilterType
BEQ PageStateZero
.TestForChangeFilter
; // 6..8 key pressed (filter by publisher, genre or connection)
; 640 IF ?Q>21 AND ?Q<25 F=?Q-21;G=0;A=A|128;G.a
CPY #22
BCC TestForSelect
CPY #25
BCS TestForSelect
TYA
SBC #20
STA PageState
LDA #0
STA FilterType
LDA Annotation
ORA #$80
STA Annotation
JMP LabelA
.TestForSelect
; // <Return> or <Space> pressed (select current item)
; 650 IF ?Q=0 OR ?Q=13 G.f
CPY #0
BEQ LabelF
CPY #Return
BEQ LabelF
; // S key pressed (start search)
; 655 IF ?Q=51 AND F=0 GOS.i;P=1;GOS.j;LINK(B+9);G.a
CPY #51
BNE TestForAtoM
LDA PageState
BNE TestForAtoM
JSR LabelI
LDA #1
STA Page
JSR LabelJ
JSR Search
JMP LabelA
.JumpToLabelC
JMP LabelC
.TestForAtoM
; // A..M key pressed (select an item)
; 660 IF ?Q<33 OR ?Q>45 G.c
CPY #32
BCC JumpToLabelC
CPY #46
BCS JumpToLabelC
; // Make sure that the row is not blank
; 670 Y=?Q-33;IF ?(#8040+Y*32)=32 G.c
TYA
SBC #32
TAY
JSR TestRowActive
BEQ JumpToLabelC
TYA
STA Item
.LabelF
; // Get the address of the record selected
; 680fI=R!(Y*2 + 2)
LDA Item
ASL A
ADC #2
TAY
LDA #<(RowReturnBuf)
STA TmpPtr
LDA #>(RowReturnBuf)
STA TmpPtr + 1
LDA (TmpPtr),Y
PHA
INY
LDA (TmpPtr),Y
STA TmpPtr + 1
PLA
STA TmpPtr
; // Handle selection of a filter item
; 690 IF F>0 G=F;F=0;A=A&127;E=I+4;H=(P-1)*L+Y;G.a
LDA PageState
BEQ BootProgram
LDA PageState
STA FilterType
CLC
LDA TmpPtr
ADC #4
STA FilterString
LDA TmpPtr + 1
ADC #0
STA FilterString + 1
; Assume the filter item is an 8 bit value
LDA Item
LDY Page
.LabelF1
DEY
BEQ LabelF2
CLC
ADC #LinesPerPage
BCC LabelF1
.LabelF2
STA FilterVal
JMP PageStateZero
.BootProgram
; // Handle *RUN of a title - K is the title index
; 800 K=(!I)FF
LDX #TmpPtr
JSR Dereference
LDA TmpPtr
STA BinBuffer
LDA TmpPtr + 1
AND #$7
STA BinBuffer + 1
; 810 P=#100
; 820 $P="RUN MNU/"
; 830 P=P+LEN(P)
; 840 IF K>99 P?0=48+(K/100)%10;P=P+1
; 850 IF K>9 P?0=48+(K/10)%10;P=P+1
; 860 ?P=48+K%10;P?1=13;P?2=13
; CountString and OscliBuffer are the same ($100)
; 870 P.$12;LINK #FFF7
; 880 END
LDA #12
JSR Oswrch
IF (sddos = 1)
LDA #'2'
JSR LoadDisk
JSR OscliString
EQUS "DRIVE 2", Return
JSR OscliString
EQUS "RUN BOOT", Return
.LoadDisk
STA RunCommand + 4
ELIF (econet = 1)
JSR ChangeDirectory
JSR OscliString
EQUS "BOOT", Return
.ChangeDirectory
ENDIF
.RunCommand0
LDX #0
.RunCommand1
LDA RunCommand, X
BEQ RunCommand2
STA OscliBuffer, X
INX
BNE RunCommand1
.RunCommand2
IF (econet = 1)
JSR WritePath
ELSE
JSR WriteDecimal
ENDIF
LDA #Return
STA OscliBuffer, X
INX
STA OscliBuffer, X
JMP Oscli
IF (sddos = 1)
.RunCommand
EQUS "DIN ,",0
ELIF (econet = 1)
.RunCommand
EQUS "DIR $.ASA.",0
ELSE
.RunCommand
EQUS "RUN ", 0
ENDIF
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Translated Basic Subroutines
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Subroutine to show the help
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.LabelH
;900h*LOAD HELP 8000
JSR OscliString
EQUS "LOAD HELP", Return
;895 LINK#FFE3;P.$12;R.
JSR Osrdch
LDA #12
JSR Oswrch
RTS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Subroutine to invert line 2+Y on the screen
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.LabelI
;900i?Q=Y+2;LINK(B+6);R.
LDY Item
INY
INY
STY Row
JMP HighlightRow
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Subroutine to set the zero page locations prior to calling machine code
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.LabelJ
;950j!#80=Z
;not needed as these are collapsed
;951 !#82=1+(P-1)*L
LDY #0
STY StartRow + 1
INY
STY StartRow
.LabelJ1
CPY Page
BEQ LabelJ3
CLC
LDA StartRow
ADC #LinesPerPage
STA StartRow
BCC LabelJ2
INC StartRow + 1
.LabelJ2
INY
BNE LabelJ1
.LabelJ3
;952 !#84=R
LDA #<RowReturnBuf
STA RowRet
LDA #>RowReturnBuf
STA RowRet+1
;953 ?#86=A
;not needed as these are collapsed
;954 ?#87=(G&1)*2+(G&2)/2
LDA #0
STA Filter
LDA FilterType
LSR A
ROL Filter
LSR A
ROL Filter
;955 ?#88=H
;not needed as these are collapsed
;956 ?#89=F
LDA PageState
STA SearchMode
; 957 ?#8A=P
;not needed as these are collapsed
;958 R.
RTS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Subroutine to update the page header
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 1000xP.$30'" "$30
; 1010 IF F=0 P."ATOMMC";I=S;Z=!(C+S*2)&#FFFF
; 1020 IF F>0 P."FILTER";I=F;Z=!(D+F*2 + 2)&#FFFF
; 1030 P." BY ";GOS.y;P." PAGE / "
; 1040 IF G>0 I=G;P." ";GOS.z;P."="$E'
; 1050 Z=Z+2
; 1060 Y=-2;GOS.i;Y=0;P=1;R.
.LabelX
;1000xP.$30'" "$30
LDA #32
LDY #64
.LabelX1
STA ScreenStart,Y
DEY
BNE LabelX1
LDA #<ScreenStart
STA Screen
LDA #>ScreenStart
STA Screen + 1
LDA PageState
BNE LabelX2
; F is zero
;1010 IF F=0 P."ATOMMC";I=S;Z=!(C+S*2)&#FFFF
LDA #<LabelXString1
STA TmpPtr
LDA #>LabelXString1
STA TmpPtr + 1
LDA SortType
PHA
LDA SortTablePtr
STA Sort
LDA SortTablePtr + 1
STA Sort + 1
BNE LabelX3
.LabelX2
; F is not zero
;1020 IF F>0 P."FILTER";I=F;Z=!(D+F*2 + 2)&#FFFF
LDA #<LabelXString2
STA TmpPtr
LDA #>LabelXString2
STA TmpPtr + 1
LDA PageState
PHA
ASL A
ADC #2
ADC MenuTablePtr
STA Sort
LDA MenuTablePtr + 1
ADC #0
STA Sort + 1
LDX #Sort
JSR Dereference
.LabelX3
;1030 P." BY ";GOS.y;P." PAGE / "
JSR ScreenString
PLA
JSR LabelY
LDA #<LabelXString3
STA TmpPtr
LDA #>LabelXString3
STA TmpPtr + 1
JSR ScreenString
;1040 IF G>0 I=G;P." ";GOS.z;P."="$(E+4)'
LDA FilterType
BEQ LabelX4
LDA #' '
JSR WriteToScreen
JSR WriteToScreen
LDA FilterType
JSR LabelZ
LDA #'='
JSR WriteToScreen
LDA FilterString
STA TmpPtr
LDA FilterString + 1
STA TmpPtr + 1
JSR ScreenString
.LabelX4
;1050 Z=Z+2
CLC
LDA Sort
ADC #2
STA Sort
BCC LabelX5
INC Sort + 1
.LabelX5
;1060 Y=-2;GOS.i;Y=0;P=1;R.
LDA #$fe
STA Item
JSR LabelI
LDY #$00
STY Item
INY
STY Page
RTS
.LabelXString1
EQUS "ATOMMC BY ", 0
.LabelXString2
EQUS "FILTER BY ", 0
.LabelXString3
EQUS " PAGE / ", 0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Subroutine to print the filter name padded with spaces to 10 chars
; I is passed in as the accumulator
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.LabelY
;1200yGOS.z
PHA
JSR LabelZ
PLA
;1220 IF I=1 P." "
;1230 IF I=2 P." "
;1240 R.
TAY
LDA LabelYNumSpaces,Y
TAY
LDA #' '
.LabelYLoop
DEY
BMI LabelYExit
JSR WriteToScreen
BNE LabelYLoop
.LabelYExit
RTS
.LabelYNumSpaces
EQUB 0, 1, 5, 0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Subroutine to print the filter name not padded at all
; I is passed in as the accumulator
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.LabelZ
;1500zIF I=0 P."TITLE "
;1510 IF I=1 P."PUBLISHER"
;1520 IF I=2 P."GENRE"
;1530 IF I=3 P."COLLECTION"
;1540 R.
CLC
ASL A
ADC #<LabelZJumpTable
STA TmpPtr
LDA #0
ADC #>LabelZJumpTable
STA TmpPtr + 1
LDX #TmpPtr
JSR Dereference
JMP ScreenString
.LabelZJumpTable
EQUW LabelZ0
EQUW LabelZ1
EQUW LabelZ2
EQUW LabelZ3
.LabelZ0
EQUS "TITLE ", 0
.LabelZ1
EQUS "PUBLISHER", 0
.LabelZ2
EQUS "GENRE", 0
.LabelZ3
EQUS "COLLECTION", 0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Machine Code Subroutines
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.TestRowActive
ASL A
ASL A
ASL A
ASL A
ASL A
PHP
ADC #<(ScreenStart + CharsPerLine * 2)
STA TmpPtr
LDA #>(ScreenStart + CharsPerLine * 2)
ADC #0
PLP
ADC #0
STA TmpPtr + 1
LDX #0
LDA (TmpPtr,X)
CMP #' '
RTS
.Clear
LDA PlotDriverLS,Y
STA $3FE
LDA PlotDriverMS,Y
STA $3FF
LDA GraphicsCtrl,Y
PHA
LDA GraphicsLastPage,Y
TAX
LDA #>ScreenStart
STA TmpPtr + 1
LDA #0
STA TmpPtr
CPY #0
BNE NotClear0
ORA #$20
.NotClear0
LDY #0
.ClearLoop
STA (TmpPtr),Y
INY
BNE ClearLoop
INC TmpPtr + 1