aboutsummaryrefslogtreecommitdiff
path: root/newtitle.s
blob: f52ac57d888be871a1c61ca2198180989f710a93 (plain)
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
; this file needs to be assembled with:
; cl65 -o newtitle.xex -t none newtitle.s
; It contains only an init routine, no run address.

 .include "atari.inc"

 ; where our screen was loaded (see newtitle.pl)
screendata = $9000

 ; homebrew atari xex header
 .word $ffff
 .word version
 .word end-1

 ; needs to be above the BSS (see taipan.map). we'll place it right at
 ; the end of screendata.
 .org $a800

version:
 .incbin "ver.dat"

 ; executable code here
start:
 ; setup color registers
 lda #$c0 ; dark green
 sta COLOR2 ; text bg
 lda #$0c ; white
 sta COLOR1

 ; turn off screen, in case vblank happens while we work
 lda #0
 sta SDMCTL

 ; wait for the next frame, to avoid graphics glitching
 jsr wait1jiffy

 ; setup our display list
 lda SDLSTL
 sta FR0
 lda SDLSTH
 sta FR0+1
 lda #<dlist
 sta SDLSTL
 lda #>dlist
 sta SDLSTH

 ; switch to narrow playfield, enable screen
 lda #$21
 sta SDMCTL

 ; clear any keypress that happened during loading
 lda #$ff
 sta CH

 ; wait for user to press a key
wait4key:
 lda CH
 cmp #$ff
 beq wait4key

 ; eat the keypress
 lda #$ff
 sta CH

 ; restore OS's display list
 ;lda #0
 ;sta SDMCTL ; disable screen again
 ;lda FR0
 ;sta SDLSTL
 ;lda FR0+1
 ;sta SDLSTH

 ;jsr wait1jiffy

 ; switch to normal playfield, enable screen. this is now
 ; done in atari_text_setup() in taipan.c, so the title screen
 ; can keep displaying.
 ;lda #$22
 ;sta SDMCTL

 rts ; return to DOS

wait1jiffy:
 lda RTCLOK+2
wait:
 cmp RTCLOK+2
 beq wait
 rts

 ; display list here
dlist:
 .byte $70 ; 24 scanlines of blanks
 .byte $70
 .byte $70
; .byte $30 ; 4 more since image is only 184 lines tall

 .byte $0f | $40 ; LMS, BASIC mode 8
 .word screendata
 .repeat 127
  .byte $0f ; 127 more scanlines of mode 8
 .endrepeat

 .byte $0f | $40 ; Hit 4K boundary, LMS again
 .word screendata+$1000
 .repeat 55
  .byte $0f ; 55 more scanlines of mode 8
 .endrepeat
; .byte $30 ; blank 4 lines to match GR.8 (does it even matter?)
 .byte $02 | $40 ; LMS, 1 line of GR.0 for the version
 .word version
 .byte $41 ; JVB, jump & wait for vblank
 .word dlist

end:
 .word INITAD
 .word INITAD+1
 .word start