Files
dino-game/intro/tech_diff.lst
T
2024-08-15 10:13:13 +02:00

1484 lines
55 KiB
Plaintext

mads 2.1.7 build 3 (13 Sep 23)
Source: tech_diff.asm
1 ; tech diff https://www.youtube.com/live/xXDjtDJf69E?si=Sg9HLaZ1krfz-m12&t=1578
2 ;---------------------------------------------------
3 OPT r+
4
5 ;---------------------------------------------------
6 ; Zpage variables
7 .zpvar temp_w .word = $80
8 .zpvar temp_b .byte
9 .zpvar temp_w2 .word
10 .zpvar temp_w3 .word
11 ;---------------------------------------------------
12 icl '../lib/ATARISYS.ASM'
Source: ATARISYS.ASM
1 ;****************************************************************************
2 ;* ATARI PERSONAL COMPUTER *
3 ;* SYSTEM EQUATES *
4 ;****************************************************************************
5 ;
6 ; OPERATING SYSTEM EQUATE FILE
7 ;
8 ; MODULE ORIGIN TABLE
9 ;
10 ; VECTOR TABLE
11 ;
12 ; HANDLER ENTRY POINTS ARE CALL-
13 ; ED OUT IN THE FOLLOWING VECTOR
14 ; TABLE. THESE ARE THE ADDRESSES
15 ; MINUS ONE.
16 ;
17 ; EXAMPLE FOR EDITOR
18 ;
19 ; E400 OPEN
20 ; 2 CLOSE
21 ; 4 GET
22 ; 6 PUT
23 ; 8 STATUS
24 ; A SPECIAL
25 ; C JUMP TO POWER ON INIT
26 ; F NOT USED
27 ;
28 = E400 EDITRV EQU $E400 ;EDITOR
29 = E410 SCRENV EQU $E410 ;TV SCREEN
30 = E420 KEYBDV EQU $E420 ;KEYBOARD
31 = E430 PRINTV EQU $E430 ;PRINTER
32 = E440 CASETV EQU $E440 ;CASSETTE
33 ;
34 ; JUMP VECTOR TABLE
35 ;
36 ; THE FOLLOWING IS A TABLE OF
37 ; JUMP INSTRUCTIONS TO VARIOUS
38 ; ENTRY POINTS IN THE OPERATING
39 ; SYSTEM
40 ;
41 = E450 DISKIV EQU $E450 ;DISK INITIALIZATION
42 = E453 DSKINV EQU $E453 ;DISK INTERFACE
43 = E456 CIOV EQU $E456 ;CENTRAL I/O ROUTINE
44 = E459 SIOV EQU $E459 ;SERIAL I/O ROUTINE
45 = E45C SETVBV EQU $E45C ;SET SYSTEM TIMERS
46 = E45F SYSVBV EQU $E45F ;VBLANK CALCULATIONS
47 = E462 XITVBV EQU $E462 ;EXIT VBLANK
48 = E465 SIOINV EQU $E465 ;SIO INITIALIZATION
49 = E468 SENDEV EQU $E468 ;SEND ENABLE ROUTINE
50 = E46B INTINV EQU $E46B ;INTRPT HANDLER INIT
51 = E46E CIOINV EQU $E46E ;CIO INITIALIZATION
52 = E471 BLKBDV EQU $E471 ;BLACKBOARD MODE
53 = E474 WARMSV EQU $E474 ;WARM START VECTOR
54 = E477 COLDSV EQU $E477 ;COLD START VECTOR
55 = E47A RBLOKV EQU $E47A ;CASSETTE READ BLOCK
56 = E47D CSOPIV EQU $E47D ;CASSETTE INPUT OPEN
57 ;
58 ; VECTORS ADDED FOR 800XL
59 ;
60 = E480 PUPDIV EQU $E480 ;POWER UP DISPLAY
61 = E483 SLFTSV EQU $E483 ;SELF TEST PROGRAM
62 = E486 PHENTV EQU $E486 ;UPLOADED HANDLER ENTER
63 = E489 PHULNV EQU $E489 ;UPLOADED HANDLER UNLINK
64 = E48C PHINIV EQU $E48C ;UPLOADED HANDLER INIT
65 ;
66 ; OPERATING SYSTEM EQUATES
67 ;
68 ; COMMAND CODES FOR IOCBS
69 ;
70 = 0003 _OPEN EQU $03 ;OPEN FOR I/O
71 = 0005 GETREC EQU $05 ;GET RECORD (TEXT)
72 = 0007 GETCHR EQU $07 ;GET CHARACTER(S)
73 = 0009 PUTREC EQU $09 ;PUT RECORD (TEXT)
74 = 000B PUTCHR EQU $0B ;PUT CHARACTER(S)
75 = 000C _CLOSE EQU $0C ;CLOSE DEVICE
76 = 000D STATIS EQU $0D ;STATUS REQUEST
77 = 000E SPECIL EQU $0E ;SPECIAL ENTRY COMMAND
78 ;
79 ; SPECIAL ENTRY COMMANDS
80 ;
81 = 0011 DRAWLN EQU $11 ;DRAW LINE
82 = 0012 FILLIN EQU $12 ;FILL
83 = 0020 RENAME EQU $20 ;RENAME DISK FILE
84 = 0021 DELETE EQU $21 ;DELETE DISK FILE
85 = 0022 FORMAT EQU $22 ;FORMAT DISK
86 = 0023 LOCKFL EQU $23 ;LOCK FILE
87 = 0024 UNLOCK EQU $24 ;UNLOCK FILE
88 = 0025 POINT EQU $25 ;POINT SECTOR
89 = 0026 NOTE EQU $26 ;NOTE SECTOR
90 = 00FF IOCFRE EQU $FF ;IOCB "FREE"
91 ;
92 ; AUX1 EQUATES
93 ; () INDICATES WHICH DEVICES
94 ;
95 = 0001 APPEND EQU $01 ;WR APPEND(D)-SCN RD(E)
96 = 0002 DIRECT EQU $02 ;OPEN DIRECTORY(D)
97 = 0004 OPNIN EQU $04 ;OPEN FOR INPUT(ALL)
98 = 0008 OPNOT EQU $08 ;OPEN FOR OUTPUT(ALL)
99 = 000C OPNINO EQU $0C ;OPEN INPUT&OUTPUT(ALL)
100 = 0010 MXDMOD EQU $10 ;OPEN MIXED MODE(E,S)
101 = 0020 INSCLR EQU $20 ;OPEN W/O CLEAR(E,S)
102 ;
103 ; DEVICE NAMES
104 ;
105 = 0045 SCREDT EQU 'E' ;SCREEN EDITOR (R/W)
106 = 004B KBD EQU 'K' ;KEYBOARD (R ONLY)
107 = 0053 DISPLY EQU 'S' ;SCREEN DISPLAY (R/W)
108 = 0050 PRINTR EQU 'P' ;PRINTER (W ONLY)
109 = 0043 CASSET EQU 'C' ;CASSETTE (R/W)
110 = 0052 RS232 EQU 'R' ;MODEM (R/W)
111 = 0044 DISK EQU 'D' ;DISK (R/W)
112 ;
113 ;
114 ;
115 ; OPERATING SYSTEM STATUS CODES
116 ;
117 = 0001 SUCCES EQU $01 ;SUCCESSFUL OPERATION
118 = 0080 BRKABT EQU $80 ;BREAK KEY ABORT
119 = 0081 PRVOPN EQU $81 ;IOCB ALREADY OPEN
120 = 0082 NONDEV EQU $82 ;NON-EXISTANT DEVICE
121 = 0083 WRONLY EQU $83 ;IOCB OPEN FOR W ONLY
122 = 0084 NVALID EQU $84 ;INVALID COMMAND
123 = 0085 NOTOPN EQU $85 ;DEVICE/FILE NOT OPEN
124 = 0086 BADIOC EQU $86 ;INVALID IOCB #
125 = 0087 RDONLY EQU $87 ;IOCB OPEN FOR R ONLY
126 = 0088 EOFERR EQU $88 ;END OF FILE
127 = 0089 TRNRCD EQU $89 ;TRUNCATED RECORD
128 = 008A TIMOUT EQU $8A ;PERIPHERAL TIMEOUT
129 = 008B DNACK EQU $8B ;DEVICE NO ACKNOWLEDGE
130 = 008C FRMERR EQU $8C ;SERIAL BUS FRAME ERR
131 = 008D CRSROR EQU $8D ;CURSOR OVERRANGE
132 = 008E OVRRUN EQU $8E ;SERIAL DATA OVERRUN
133 = 008F CHKERR EQU $8F ;SERIAL CHECKSUM ERR
134 = 0090 DERRER EQU $90 ;PERIPHRAL DEVICE ERR
135 = 0091 BADMOD EQU $91 ;BAD SCREEN MODE #
136 = 0092 FNCNOT EQU $92 ;NONEXISTANT FUNCTION
137 = 0093 SCRMEM EQU $93 ;SCREEN MEM TOO SMALL
138 = 00AA FILENF EQU $AA ;FILE NOT FOUND
139 ;
140 ; PAGE ZERO RAM ASSIGNMENTS
141 ;
142 = 0000 LNFLG EQU $00 ;LINBUG RAM
143 = 0001 NGFLAG EQU $01 ;POWER-UP SELF-TEST FLAG
144 ;
145 ; THESE LOCATIONS NOT CLEARED
146 ;
147 = 0002 CASINI EQU $02 ;CASSETTE INIT LOC
148 = 0004 RAMLO EQU $04 ;RAM POINTER MEM TST
149 = 0006 TRAMSZ EQU $06 ;TEMP REG RAM SIZE
150 = 0007 TSTDAT EQU $07 ;RAM TEST DATA REG
151 ;
152 ;CLEARED ON COLDSTART ONLY
153 ;
154 = 0008 WARMST EQU $08 ;WARM START FLAG
155 = 0009 BOOTQ EQU $09 ;SUCCESSFUL BOOT FLG
156 = 000A DOSVEC EQU $0A ;DOS START VECTOR
157 = 000C DOSINI EQU $0C ;DOS INIT ADDRESS
158 = 000E APPMHI EQU $0E ;APPL MEM HI LIMIT
159 ;
160 ;CLEARED ON COLD OR WARM START
161 ;
162 = 0010 POKMSK EQU $10 ;MASK POKEY IRQ
163 = 0011 BRKKEY EQU $11 ;BREAK KEY FLAG
164 = 0012 RTCLOK EQU $12 ;REAL TIME CLOCK
165 = 0015 BUFADR EQU $15 ;INDIRECT BUFF ADDR
166 = 0017 ICCOMT EQU $17 ;COMMAND FOR VECTOR
167 = 0018 DSKFMS EQU $18 ;FMS POINTER
168 = 001A DSKUTL EQU $1A ;DISK UTILITIES PTR
169 = 001C ABUFPT EQU $1C ;RESERVED
170 = 0020 ICHIDZ EQU $20 ;HANDLER INDEX #
171 = 0021 ICDNOZ EQU $21 ;DEVICE NUMBER
172 = 0022 ICCOMZ EQU $22 ;COMMAND CODE
173 = 0023 ICSTAZ EQU $23 ;STATUS RETURN
174 = 0024 ICBALZ EQU $24 ;BUFFER ADDRESS
175 = 0025 ICBAHZ EQU $25
176 = 0026 ICPTLZ EQU $26 ;PUT BYTE ROUTINE-1
177 = 0027 ICPTHZ EQU $27
178 = 0028 ICBLLZ EQU $28 ;BUFFER LENGTH
179 = 0029 ICBLHZ EQU $29
180 = 002A ICAX1Z EQU $2A ;AUXILIARY BYTES
181 = 002B ICAX2Z EQU $2B
182 = 002C ICSPRZ EQU $2C ;SPARE BYTES
183 = 002E ICIDNO EQU $2E ;IOCB # X 16
184 = 002F CIOCHR EQU $2F ;CIO CHARACTER BYTE
185 = 0030 STATUS EQU $30 ;INTERNAL STATUS
186 = 0031 CHKSUM EQU $31 ;CHECKSUM
187 = 0032 BUFRLO EQU $32 ;DATA BUFFER LO BYTE
188 = 0033 BUFRHI EQU $33 ;DATA BUFFER HI BYTE
189 = 0034 BFENLO EQU $34 ;NEXT BYTE PAST DATA
190 = 0035 BFENHI EQU $35 ;BUFFER (HI & LO)
191 = 0036 LTEMP EQU $36 ;LOADER TEMP
192 = 0038 BUFRFL EQU $38 ;DATA BUFFR FULL FLG
193 = 0039 RECVDN EQU $39 ;RECIEVE DONE FLAG
194 = 003A XMTDON EQU $3A ;XMIT DONE FLAG
195 = 003B CHKSNT EQU $3B ;CHECKSUM SENT FLAG
196 = 003C NOCKSM EQU $3C ;NO CHKSUM SENT FLAG
197 ;BPTR EQU $3D ;CASSETTE DATA INDEX
198 = 003E FTYPE EQU $3E ;INTERRECORD GAP TYPE
199 = 003F FEOF EQU $3F ;END OF FILE FLAG
200 = 0040 FREQ EQU $40 ;BEEP COUNT
201 = 0041 SOUNDR EQU $41 ;NOISY I/O FLAG
202 = 0042 CRITIC EQU $42 ;CRITICAL MODE
203 = 0043 FMSZPG EQU $43 ;FMS ZERO PAGE
204 = 004A ZCHAIN EQU $4A ;HANDLER LOADER TEMP
205 = 004C DSTAT EQU $4C ;DISPLAY STATUS
206 = 004D ATRACT EQU $4D ;ATTRACT FLAG
207 = 004E DRKMSK EQU $4E ;DARK ATTRACT MASK
208 = 004F COLRSH EQU $4F ;COLOR SHIFTER
209 = 0050 TMPCHR EQU $50 ;TEMP STORAGE
210 = 0051 HOLD1 EQU $51 ;TEMP STORAGE
211 = 0052 LMARGN EQU $52 ;LEFT MARGIN (1)
212 = 0053 RMARGN EQU $53 ;RIGHT MARGIN (38)
213 = 0054 ROWCRS EQU $54 ;CURSOR COUNTERS
214 = 0055 COLCRS EQU $55
215 = 0057 DINDEX EQU $57 ;DISPLAY MODE #
216 = 0058 SAVMSC EQU $58 ;SCREEN MEM ADDR
217 = 005A OLDROW EQU $5A ;DRAW START POSIT
218 = 005B OLDCOL EQU $5B
219 = 005D OLDCHR EQU $5D ;DATA UNDER CURSOR
220 = 005E OLDADR EQU $5E ;CURSOR MEM ADDR
221 = 0060 FKDEF EQU $60 ;FUNC KEY DEFEAT POINTER
222 = 0062 PALNTS EQU $62 ;PAL/NTSC FLAG
223 = 0063 LOGCOL EQU $63 ;COL IN LOGICAL LINE
224 = 0064 ADRESS EQU $64 ;TEMP STORAGE
225 = 0066 MLTEMP EQU $66 ;TEMP STORAGE
226 = 0068 SAVADR EQU $68 ;TEMP STORAGE
227 = 006A RAMTOP EQU $6A ;AVAILABLE RAM PAGES
228 = 006B BUFCNT EQU $6B ;BUFFER COUNT
229 = 006C BUFSTR EQU $6C ;EDITOR GETCH POINTR
230 = 006E BITMSK EQU $6E ;BIT MASK
231 = 006F SHFAMT EQU $6F ;PIXEL JUSTIFICATION
232 = 0070 ROWAC EQU $70 ;ROW ACCUMULATOR
233 = 0072 COLAC EQU $72 ;COLUMN ACCUMULATOR
234 = 0074 ENDPT EQU $74 ;LINE LENGTH
235 = 0076 DELTAR EQU $76 ;DELTA ROW
236 = 0077 DELTAC EQU $77 ;DELTA COLUMN
237 = 0079 KEYDEF EQU $79 ;KEY DEFEAT POINTER
238 = 007B SWPFLG EQU $7B ;SPLIT SCN CURS CNTL
239 = 007C HOLDCH EQU $7C ;KB CHAR TEMP HOLD
240 = 007D INSDAT EQU $7D ;TEMP STORAGE
241 = 007E COUNTR EQU $7E ;DRAW ITERATION CNT
242 ;
243 ; 80-FF ARE RESERVED FOR USER
244 ;
245 ; NOTE: SEE FLOATING POINT
246 ; SUBROUTINE AREA FOR ZERO
247 ; PAGE CELLS
248 ;
249 ; PAGE 1 - HARDWARE STACK
250 ;
251 ; PAGE TWO RAM ASSIGNMENTS
252 ;
253 = 0200 VDSLST EQU $0200 ;DSP LIST NMI VECTOR
254 = 0202 VPRCED EQU $0202 ;PROCEED IRQ VECTOR
255 = 0204 VINTER EQU $0204 ;INTERUPT IRQ VECTOR
256 = 0206 VBREAK EQU $0206 ;BRK INST IRQ VECTOR
257 = 0208 VKEYBD EQU $0208 ;POKEY KB IRQ VECTOR
258 = 020A VSERIN EQU $020A ;POKEY INPUT RDY IRQ
259 = 020C VSEROR EQU $020C ;POKEY OUTPUT RDY
260 = 020E VSEROC EQU $020E ;POKEY OUTPUT DONE
261 = 0210 VTIMR1 EQU $0210 ;POKEY TIMER 1 IRQ
262 = 0212 VTIMR2 EQU $0212 ;POKEY TIMER 2 IRQ
263 = 0214 VTIMR4 EQU $0214 ;POKEY TIMER 4 IRQ
264 = 0216 VIMIRQ EQU $0216 ;IMMED IRQ VECTOR
265 = 0218 CDTMV1 EQU $0218 ;COUNT DOWN TIMER 1
266 = 021A CDTMV2 EQU $021A ;COUNT DOWN TIMER 2
267 = 021C CDTMV3 EQU $021C ;COUNT DOWN TIMER 3
268 = 021E CDTMV4 EQU $021E ;COUNT DOWN TIMER 4
269 = 0220 CDTMV5 EQU $0220 ;COUNT DOWN TIMER 5
270 = 0222 VVBLKI EQU $0222 ;IMM VBLK NMI VECTOR
271 = 0224 VVBLKD EQU $0224 ;DEF VBLK NMI VECTOR
272 = 0226 CDTMA1 EQU $0226 ;CDTMV1 JSR ADDRESS
273 = 0228 CDTMA2 EQU $0228 ;CDTMV2 JSR ADDRESS
274 = 022A CDTMF3 EQU $022A ;CDTMV3 FLAG
275 = 022B SRTIMR EQU $022B ;SOFTWARE REPEAT TMR
276 = 022C CDTMF4 EQU $022C ;CDTMV4 FLAG
277 = 022D INTEMP EQU $022D ;IAN'S TEMP
278 = 022E CDTMF5 EQU $022E ;CDTMV5 FLAG
279 = 022F DMACTLS EQU $022F ;SAVE DMACTL REG
280 = 0230 DLPTRS EQU $0230 ;SAVE DISP LIST LO
281 ;SDLSTH EQU $0231 ;SAVE DISP LIST HI
282 = 0232 SSKCTL EQU $0232 ;SKCTL REGISTER RAM
283 = 0233 LCOUNT EQU $0233 ;LOADER TEMP
284 = 0234 LPENH EQU $0234 ;LIGHT PEN HORIZONTAL
285 = 0235 LPENV EQU $0235 ;LIGHT PEN VERTICAL
286 = 0236 BRKKY EQU $0236 ;BREAK KEY VECTOR
287 = 0238 RELADR EQU $0238 ;LOADER REL ADDR
288 = 023A CDEVIC EQU $023A ;COMMAND BUFFER-DEV
289 = 023B CCOMND EQU $023B ;COMMAND BUFFER-CMND
290 = 023C CAUX1 EQU $023C ;COMMAND BUFFER AUX1
291 = 023D CAUX2 EQU $023D ;COMMAND BUFFER AUX2
292 ;TEMP EQU $023E ;TEMPORARY RAM CELL
293 = 023F ERRFLG EQU $023F ;DEVICE ERROR FLAG
294 = 0240 DFLAGS EQU $0240 ;DISK FLAGS(SECTOR1)
295 = 0241 DBSECT EQU $0241 ;# DISK BOOT SECTORS
296 = 0242 BOOTAD EQU $0242 ;DISK BOOT ADDRESS
297 = 0244 COLDST EQU $0244 ;COLDSTART FLAG 1=CS
298 = 0245 RECLEN EQU $0245 ;LOADER LENGTH
299 = 0246 DSKTIM EQU $0246 ;DISK TIME OUT REG
300 = 026C VSFLAG EQU $026C ;FINE SCROLL TEMP
301 = 026D KEYDIS EQU $026D ;KEY DISABLE FLAG
302 = 026E FINE EQU $026E ;FINE SCROLL ENABLE(A1200)
303 = 026F GPRIOR EQU $026F ;GLOBAL PRIORITY
304 = 0270 PADDL0 EQU $0270 ;POT 0 RAM CELL
305 = 0271 PADDL1 EQU $0271
306 = 0272 PADDL2 EQU $0272
307 = 0273 PADDL3 EQU $0273
308 = 0278 STICK0 EQU $0278 ;JOYSTICK 0 RAM CELL
309 = 0279 STICK1 EQU $0279
310 = 027C PTRIG0 EQU $027C ;PADDLE TRIGGER 0
311 = 027D PTRIG1 EQU $027D
312 = 027E PTRIG2 EQU $027E
313 = 027F PTRIG3 EQU $027F
314 = 0284 STRIG0 EQU $0284 ;JOYSTICK TRIGGER 0
315 = 0285 STRIG1 EQU $0285
316 = 0288 HIBYTE EQU $0288 ;LOADER
317 = 0289 WMODE EQU $0289 ;CASSETTE R/W MODE
318 = 028A BLIM EQU $028A ;CASSETTE RECORD SIZE
319 = 028B IMASK EQU $028B
320 = 028C JVECK EQU $028C ;JUMP VECTOR
321 = 028E NEWADR EQU $028E ;LOADER NEW ADDRESS
322 = 0290 TXTROW EQU $0290 ;TEXT ROWCRS
323 = 0291 TXTCOL EQU $0291 ;TEXT COLCRS
324 = 0293 TINDEX EQU $0293 ;TEXT INDEX
325 = 0294 TXTMSC EQU $0294 ;TEXT WINDOW MEM ADD
326 = 0296 TXTOLD EQU $0296 ;TEXT OLDROW & COL
327 = 029C CRETRY EQU $029C ;# COMMAND RETRIES
328 = 029D HOLD3 EQU $029D
329 = 029E SUBTMP EQU $029E
330 = 029F HOLD2 EQU $029F
331 = 02A0 DMASK EQU $02A0 ;PIXEL LOCATION MASK
332 = 02A1 TMPLBT EQU $02A1
333 = 02A2 ESCFLG EQU $02A2 ;ESCAPE FLAG
334 = 02A3 TABMAP EQU $02A3 ;TAB STOP MAP
335 = 02B2 LOGMAP EQU $02B2 ;LINE START BIT MAP
336 = 02B6 INVFLG EQU $02B6 ;INVERSE VIDEO FLAG
337 = 02B7 FILFLG EQU $02B7 ;FILL FLAG FOR DRAW
338 = 02B8 TMPROW EQU $02B8
339 = 02B9 TMPCOL EQU $02B9
340 = 02BB SCRFLG EQU $02BB ;SET IF SCROLLING
341 = 02BC HOLD4 EQU $02BC ;TEMP USED BY DRAW
342 = 02BD DRETRY EQU $02BD ;# OF DEVICE RETRIES
343 = 02BE SHFLOK EQU $02BE ;SHIFT/CTL LOCK FLAG
344 = 02BF BOTSCR EQU $02BF ;BOTTOM OF SCREEN
345 = 02C0 PCOLR0 EQU $02C0 ;P0 COLOR
346 = 02C1 PCOLR1 EQU $02C1 ;P1 COLOR
347 = 02C2 PCOLR2 EQU $02C2 ;P2 COLOR
348 = 02C3 PCOLR3 EQU $02C3 ;P3 COLOR
349 = 02C4 COLOR0 EQU $02C4 ;COLOR 0
350 = 02C5 COLOR1 EQU $02C5
351 = 02C6 COLOR2 EQU $02C6
352 = 02C7 COLOR3 EQU $02C7
353 = 02C8 COLOR4 EQU $02C8
354 = 02C8 COLBAKS EQU COLOR4
355 = 02C9 RUNADR EQU $02C9 ;LOADER
356 = 02CB HIUSED EQU $02CB ;LOADER
357 = 02CD ZHIUSE EQU $02CD ;LOADER
358 = 02CF GBYTEA EQU $02CF ;LOADER
359 = 02D1 LOADAD EQU $02D1 ;LOADER
360 = 02D3 ZLOADA EQU $02D3 ;LOADER
361 = 02D5 DSCTLN EQU $02D5 ;DISK SECTOR LENGTH
362 = 02D7 ACMISR EQU $02D7 ;RESERVED
363 = 02D9 KRPDEL EQU $02D9 ;KEY REPEAT DELAY
364 = 02DA KEYREP EQU $02DA ;KEY REPEAT RATE(VBLANKS)
365 = 02DB NOCLIK EQU $02DB ;CLICK ENABLE/DISABLE
366 = 02DC HELPFG EQU $02DC ;HELP KEY FLAG
367 = 02DD DMASAV EQU $02DD ;DMA SAVE STATE
368 = 02DE PBPNT EQU $02DE ;PRINT BUFFER POINTER
369 = 02DF PBUFSZ EQU $02DF ;PRINT BUFFER SIZE
370 = 02E0 DOSRUN EQU $02E0 ;DOS RUN/INIT ADDRESSES
371 = 02E4 RAMSIZ EQU $02E4 ;RAM SIZE-HIGH BYTE
372 = 02E5 MEMTOP EQU $02E5 ;TOP OF AVAIL MEMORY
373 = 02E7 MEMLO EQU $02E7 ;BOTTOM OF AVAIL MEM
374 = 02E9 HNDLOD EQU $02E9 ;POLL FLAG (1200)
375 = 02EA DVSTAT EQU $02EA ;STATUS BUFFER
376 = 02EE CBAUDL EQU $02EE ;CASSETTE BAUD RATE
377 = 02EF CBAUDH EQU $02EF
378 = 02F0 CRSINH EQU $02F0 ;CURSOR INHIBIT 0=ON
379 = 02F1 KEYDEL EQU $02F1 ;KEY DELAY
380 = 02F2 CH1 EQU $02F2 ;PRIOR KB CHAR CODE
381 = 02F3 CHACT EQU $02F3 ;CHACTL REGISTER RAM
382 = 02F4 CHBAS EQU $02F4 ;CHBAS REGISTER RAM
383 = 02F5 NEWROW EQU $02F5 ;POINT DRAW GOES TO
384 = 02F6 NEWCOL EQU $02F6
385 = 02F8 ROWINC EQU $02F8 ;ROW INCREMENT VALUE
386 = 02F9 COLINC EQU $02F9 ;COL INCREMENT VALUE
387 = 02FA CHAR EQU $02FA ;INTERNAL CHAR CODE
388 = 02FB ATACHR EQU $02FB ;ATASCII CHARACTER
389 = 02FC CHKEY EQU $02FC ;KB CHAR CODE (FIFO)
390 = 02FD FILDAT EQU $02FD ;RIGHT FILL DATA
391 = 02FE DSPFLG EQU $02FE ;DISPLAY FLAG
392 = 02FF SSFLAG EQU $02FF ;START/STOP FLAG
393 ;
394 ; PAGE THREE RAM ASSIGNMENTS
395 ;
396 = 0300 DDEVIC EQU $0300 ;BUS I.D. NUMBER
397 = 0301 DUNIT EQU $0301 ;UNIT NUMBER
398 = 0302 DCOMND EQU $0302 ;BUS COMMAND
399 = 0303 DSTATS EQU $0303 ;COMMAND TYPE/STATUS
400 = 0304 DBUFLO EQU $0304 ;DATA BUFFER LO BYTE
401 = 0305 DBUFHI EQU $0305 ;DATA BUFFER HI BYTE
402 = 0306 DTIMLO EQU $0306 ;DEVICE TIMEOUT SECS
403 = 0307 DUNUSE EQU $0307 ;UNUSED BYTE
404 = 0308 DBYTLO EQU $0308 ;# OF BYTES XFERRED
405 = 0309 DBYTHI EQU $0309
406 = 030A DAUX1 EQU $030A ;COMMAND AUX BYTE 1
407 = 030B DAUX2 EQU $030B ;COMMAND AUX BYTE 2
408 = 030C TIMER1 EQU $030C ;INITIAL TIMER VALUE
409 = 030E JMPERS EQU $030E ;OPTIONS (1200)
410 = 030F CASFLG EQU $030F ;CASSETE MODE IF SET
411 = 0310 TIMER2 EQU $0310 ;FINAL TIMER VALUE
412 ;TEMP1 EQU $0312 ;TEMP STORAGE
413 ;TEMP2 EQU $0313 ;TEMP STORAGE
414 = 0314 PTIMOT EQU $0314 ;PRINTER TIMEOUT REG
415 ;TEMP3 EQU $0315 ;TEMP STORAGE
416 = 0316 SAVIO EQU $0316 ;SAVE SERIAL IN DATA
417 = 0317 TIMFLG EQU $0317 ;TIMEOUT FLAG C BAUD
418 = 0318 STACKP EQU $0318 ;SIO STACK PTR SAVE
419 = 0319 TSTAT EQU $0319 ;TEMP STATUS HOLDER
420 = 031A HATABS EQU $031A ;HANDLER ADDR TABLE
421 = 033D PUPBT1 EQU $033D ;POWER/UP RESET
422 = 033E PUPBT2 EQU $033E
423 = 033F PUPBT3 EQU $033F
424 = 0340 ICHID EQU $0340 ;HANDLER INDEX #
425 = 0341 ICDNO EQU $0341 ;DEVICE NUMBER
426 = 0342 ICCOM EQU $0342 ;COMMAND CODE
427 = 0343 ICSTA EQU $0343 ;STATUS
428 = 0344 ICBAL EQU $0344 ;BUFFER ADDR LO BYTE
429 = 0345 ICBAH EQU $0345 ;BUFFER ADDR HI BYTE
430 = 0346 ICPTL EQU $0346 ;PUT ROUTINE ADDR-1
431 = 0347 ICPTH EQU $0347
432 = 0348 ICBLL EQU $0348 ;BUFFER LENGTH LO
433 = 0349 ICBLH EQU $0349 ;BUFFER LENGTH HI
434 = 034A ICAX1 EQU $034A ;AUX BYTE 1
435 = 034B ICAX2 EQU $034B ;AUX BYTE 2
436 = 034C ICSPR EQU $034C ;SPARE BYTES
437 = 03C0 PRNBUF EQU $03C0 ;PRINTER BUFFER (40 BYTES)
438 = 03E8 SUPERF EQU $03E8 ;SCREEN EDITOR
439 = 03E9 CKEY EQU $03E9 ;START KEY FLAG
440 = 03EA CASSBT EQU $03EA ;CASSETTE BOOT FLAG
441 = 03EB CARTCK EQU $03EB ;CARTRIDGE CHECKSUM
442 = 03ED ACMVAR EQU $03ED ;RESERVED
443 = 03F9 MINTLK EQU $03F9 ;RESERVED
444 = 03FA GINTLK EQU $03FA ;CART INTERLOCK
445 = 03FB CHLINK EQU $03FB ;HANDLER CHAIN
446 ;
447 ; PAGE FOUR RAM ASSIGNMENTS
448 ;
449 = 03FD CASBUF EQU $03FD ;CASSETTE BUFFER (131 BYTES)
450 = 0480 USAREA EQU $0480 ;USER AREA
451 ;
452 ; PAGE FIVE AND SIX ARE RESERVED
453 ; FOR USER WORK SPACE
454 ;
455 ; COLLEEN MNEMONICS
456 ;
457 ; ---------------------------------------------------------------------------
458 = D200 POKEY EQU $D200
459 ; ---------------------------------------------------------------------------
460 ;
461 ; READ
462 ;
463 = D200 POT0 EQU POKEY+$00
464 = D201 POT1 EQU POKEY+$01
465 = D202 POT2 EQU POKEY+$02
466 = D203 POT3 EQU POKEY+$03
467 = D204 POT4 EQU POKEY+$04
468 = D205 POT5 EQU POKEY+$05
469 = D206 POT6 EQU POKEY+$06
470 = D207 POT7 EQU POKEY+$07
471 = D208 ALLPOT EQU POKEY+$08
472 = D209 KBCODE EQU POKEY+$09
473 = D20A RANDOM EQU POKEY+$0a
474 = D20B POTGO EQU POKEY+$0b
475 = D20D SERIN EQU POKEY+$0d
476 = D20E IRQST EQU POKEY+$0e
477 = D20F SKSTAT EQU POKEY+$0f
478 ;
479 ; WRITE
480 ;
481 = D200 AUDF1 EQU POKEY+$00
482 = D201 AUDC1 EQU POKEY+$01
483 = D202 AUDF2 EQU POKEY+$02
484 = D203 AUDC2 EQU POKEY+$03
485 = D204 AUDF3 EQU POKEY+$04
486 = D205 AUDC3 EQU POKEY+$05
487 = D206 AUDF4 EQU POKEY+$06
488 = D207 AUDC4 EQU POKEY+$07
489 = D208 AUDCTL EQU POKEY+$08
490 = D209 STIMER EQU POKEY+$09
491 = D20A SKRES EQU POKEY+$0a
492 = D20D SEROUT EQU POKEY+$0d
493 = D20E IRQEN EQU POKEY+$0e
494 = D20F SKCTL EQU POKEY+$0f
495 ;
496 ;
497 ;
498 ; ---------------------------------------------------------------------------
499 = D000 GTIA EQU $D000
500 ; ---------------------------------------------------------------------------
501 ;
502 ; WRITE
503 ;
504 = D000 HPOSP0 EQU GTIA+$00
505 = D001 HPOSP1 EQU GTIA+$01
506 = D002 HPOSP2 EQU GTIA+$02
507 = D003 HPOSP3 EQU GTIA+$03
508 = D004 HPOSM0 EQU GTIA+$04
509 = D005 HPOSM1 EQU GTIA+$05
510 = D006 HPOSM2 EQU GTIA+$06
511 = D007 HPOSM3 EQU GTIA+$07
512 = D008 SIZEP0 EQU GTIA+$08
513 = D009 SIZEP1 EQU GTIA+$09
514 = D00A SIZEP2 EQU GTIA+$0a
515 = D00B SIZEP3 EQU GTIA+$0b
516 = D00C SIZEM EQU GTIA+$0c
517 = D00D GRAFP0 EQU GTIA+$0d
518 = D00E GRAFP1 EQU GTIA+$0e
519 = D00F GRAFP2 EQU GTIA+$0f
520 = D010 GRAFP3 EQU GTIA+$10
521 = D011 GRAFM EQU GTIA+$11
522 = D012 COLPM0 EQU GTIA+$12
523 = D013 COLPM1 EQU GTIA+$13
524 = D014 COLPM2 EQU GTIA+$14
525 = D015 COLPM3 EQU GTIA+$15
526 = D016 COLPF0 EQU GTIA+$16
527 = D017 COLPF1 EQU GTIA+$17
528 = D018 COLPF2 EQU GTIA+$18
529 = D019 COLPF3 EQU GTIA+$19
530 = D01A COLBAK EQU GTIA+$1a
531 = D01B PRIOR EQU GTIA+$1b
532 = D01C VDELAY EQU GTIA+$1c
533 = D01D GRACTL EQU GTIA+$1d
534 = D01E HITCLR EQU GTIA+$1e
535 = D01F CONSOL EQU GTIA+$1f
536 ;
537 ; READ
538 ;
539 = D000 M0PF EQU GTIA+$00
540 = D001 M1PF EQU GTIA+$01
541 = D002 M2PF EQU GTIA+$02
542 = D003 M3PF EQU GTIA+$03
543 = D004 P0PF EQU GTIA+$04
544 = D005 P1PF EQU GTIA+$05
545 = D006 P2PF EQU GTIA+$06
546 = D007 P3PF EQU GTIA+$07
547 = D008 M0PL EQU GTIA+$08
548 = D009 M1PL EQU GTIA+$09
549 = D00A M2PL EQU GTIA+$0a
550 = D00B M3PL EQU GTIA+$0b
551 = D00C P0PL EQU GTIA+$0c
552 = D00D P1PL EQU GTIA+$0d
553 = D00E P2PL EQU GTIA+$0e
554 = D00F P3PL EQU GTIA+$0f
555 = D010 TRIG0 EQU GTIA+$10
556 = D011 TRIG1 EQU GTIA+$11
557 = D012 TRIG2 EQU GTIA+$12
558 = D013 TRIG3 EQU GTIA+$13
559 = D014 PAL EQU GTIA+$14
560 ;
561 ;
562 ; ---------------------------------------------------------------------------
563 = D400 ANTIC EQU $D400
564 ; ---------------------------------------------------------------------------
565 ;
566 = D400 DMACTL EQU ANTIC+$00
567 = D401 CHACTL EQU ANTIC+$01
568 = D402 DLPTR EQU ANTIC+$02
569 ;DLISTH EQU ANTIC+$03
570 = D404 HSCROL EQU ANTIC+$04
571 = D405 VSCROL EQU ANTIC+$05
572 = D407 PMBASE EQU ANTIC+$07
573 = D409 CHBASE EQU ANTIC+$09
574 = D40A WSYNC EQU ANTIC+$0a
575 = D40B VCOUNT EQU ANTIC+$0b
576 = D40C PENH EQU ANTIC+$0c
577 = D40D PENV EQU ANTIC+$0d
578 = D40E NMIEN EQU ANTIC+$0e
579 = D40F NMIRES EQU ANTIC+$0f
580 = D40F NMIST EQU ANTIC+$0f
581 ;
582 ;
583 ; ---------------------------------------------------------------------------
584 = D300 PIA EQU $D300
585 ; ---------------------------------------------------------------------------
586 ;
587 = D300 PORTA EQU PIA+0
588 = D301 PORTB EQU PIA+1
589 = D302 PACTL EQU PIA+2
590 = D303 PBCTL EQU PIA+3
591 ;
592 ; ---------------------------------------------------------------------------
593 ; Atari ANTIC chip display list equates
594 ; ---------------------------------------------------------------------------
595 ;
596 = 0001 JUMP EQU $01 ; display list jump instruction (3 byte)
597 = 0041 JVB EQU $41 ; display list jump and wait for vblank instruction (3)
598 ;
599 = 0010 SCH EQU $10 ; display list horizontal scrolling
600 = 0020 SCV EQU $20 ; display list vertical scrolling
601 = 0040 LMS EQU $40 ; display list load memory scan instruction (3 byte)
602 = 0080 DLII EQU $80 ; display list interrupt instruction
603 ;
604 = 0000 SKIP1 EQU $00 ; display list skip 1 scan line instruction
605 = 0010 SKIP2 EQU $10 ; display list skip 2 scan lines instruction
606 = 0020 SKIP3 EQU $20 ; display list skip 3 scan lines instruction
607 = 0030 SKIP4 EQU $30 ; display list skip 4 scan lines instruction
608 = 0040 SKIP5 EQU $40 ; display list skip 5 scan lines instruction
609 = 0050 SKIP6 EQU $50 ; display list skip 6 scan lines instruction
610 = 0060 SKIP7 EQU $60 ; display list skip 7 scan lines instruction
611 = 0070 SKIP8 EQU $70 ; display list skip 8 scan lines instruction
612 ;
613 = 0002 MODE2 EQU $02 ; display list mode 2
614 = 0004 MODE4 EQU $04 ; display list mode 4
615 = 0008 MODE8 EQU $08 ; display list mode 8
616 = 000E MODEE EQU $0E ; display list mode E
617 = 000F MODEF EQU $0F ; display list mode F
618 ; ---------------------------------------------------------------------------
619 ; ENUMS
620 ; ---------------------------------------------------------------------------
621
622 .enum @dmactl
623 = 0000 blank = %00
624 = 0001 narrow = %01
625 = 0002 standard= %10
626 = 0003 wide = %11
627 = 0004 missiles= %100
628 = 0008 players = %1000
629 = 0010 lineX1 = %10000
630 = 0000 lineX2 = %00000
631 = 0020 dma = %100000
632 .ende
633
634 = 003F scr48 = @dmactl(wide|dma|players|missiles|lineX1)
635 = 003E scr40 = @dmactl(standard|dma|players|missiles|lineX1)
636 = 003D scr32 = @dmactl(narrow|dma|players|missiles|lineX1)
637
638 .enum @pmcntl
639 = 0001 missiles= %1
640 = 0002 players = %10
641 = 0004 trigs = %100
642 .ende
643
644 .enum @gtictl
645 = 0000 prior0 = %0
646 = 0001 prior1 = %1
647 = 0002 prior2 = %10
648 = 0004 prior4 = %100
649 = 0008 prior8 = %1000
650 = 0010 ply5 = %10000 ; Fifth Player Enable
651 = 0020 mlc = %100000 ; Multiple Color Player Enable
652 = 0040 mode9 = %01000000
653 = 0080 mode10 = %10000000
654 = 00C0 mode11 = %11000000
655 .ende
656 ; ---------------------------------------------------------------------------
657 ; KBCODEs
658 ; ---------------------------------------------------------------------------
659 .enum @kbcode
660 = 00FF _none = 255
661 = 001C _esc = 28
662 = 001F _1 = 31
663 = 001E _2 = 30
664 = 001A _3 = 26
665 = 0018 _4 = 24
666 = 001D _5 = 29
667 = 001B _6 = 27
668 = 0033 _7 = 51
669 = 0035 _8 = 53
670 = 0030 _9 = 48
671 = 0032 _0 = 50
672 = 0036 _lt = 54
673 = 0037 _gt = 55
674 = 0034 _del = 52
675 = 002C _tab = 44
676 = 002F _Q = 47
677 = 002E _W = 46
678 = 002A _E = 42
679 = 0028 _R = 40
680 = 002D _T = 45
681 = 002B _Y = 43
682 = 000B _U = 11
683 = 000D _I = 13
684 = 0008 _O = 8
685 = 000A _P = 10
686 = 000E _min = 14
687 = 000E _up = 14 ; cursor function
688 = 000F _eq = 15
689 = 000F _down = 15 ; cursor function
690 = 000C _ret = 12
691 = 003F _A = 63
692 = 003E _S = 62
693 = 003A _D = 58
694 = 0038 _F = 56
695 = 003D _G = 61
696 = 0039 _H = 57
697 = 0001 _J = 1
698 = 0005 _K = 5
699 = 0000 _L = 0
700 = 0002 _semicolon = 2
701 = 0006 _plus = 6
702 = 0006 _left = 6 ; cursor function
703 = 0007 _asterisk = 7
704 = 0007 _right = 7 ; cursor function
705 = 003C _caps = 60
706 = 0017 _Z = 23
707 = 0016 _X = 22
708 = 0012 _C = 18
709 = 0010 _V = 16
710 = 0015 _B = 21
711 = 0024 _N = 36
712 = 0025 _M = 37
713 = 0020 _comma = 32
714 = 0022 _dot = 34
715 = 0026 _slash = 38
716 = 0027 _atari = 39
717 = 0011 _help = 17
718 = 0003 _F1 = 3
719 = 0004 _F2 = 4
720 = 0013 _F3 = 19
721 = 0014 _F4 = 20
722 = 0021 _space = 33
723 .ende
724 = 009B EOL = $9b
724 = 0080 TEMP_W
724 = 0082 TEMP_B
724 = 0083 TEMP_W2
724 = 0085 TEMP_W3
13 icl '../lib/MACRO.ASM'
Source: MACRO.ASM
1 ;-------------------------------------
2 .MACRO ROLW
3 ROL :1
4 ROL :1+1
5 .ENDM
6 ;-------------------------------------
7 .MACRO ASLW
8 ASL :1
9 ROL :1+1
10 .ENDM
11 ;-------------------------------------
12 .MACRO RORW
13 ROR :1+1
14 ROR :1
15 .ENDM
16 ;-------------------------------------
17 .MACRO LSRW
18 LSR :1+1
19 ROR :1
20 .ENDM
21
22 ;-------------------------------------
23 .MACRO VMAIN
24 ; VMAIN #WORD,interrupt.vector
25 ; interrupt.vector:
26 ; 0 - VIMIRQ
27 ; 1 - TIMCNT1
28 ; 2 - TIMCNT2
29 ; 3 - TIMCNT3
30 ; 4 - TIMCNT4
31 ; 5 - TIMCNT5
32 ; 6 - VVBLKI
33 ; 7 - VVBLKD
34 ; 8 - TIMVEC1
35 ; 9 - TIMVEC2
36 ; Initialises Vertical Blank Interrupts
37 ; (works only with system interrupts ON)
38 LDY # <:1
39 LDX # >:1
40 LDA #:2
41 JSR SETVBV
42 .ENDM
43 ;-------------------------------------
44 .MACRO VDLI
45 ; VDLI #WORD
46 ; Initialises Display List Interrupts
47 LDY # <:1
48 LDX # >:1
49 LDA #$C0
50 STY $0200
51 STX $0201
52 STA NMIEN
53 .ENDM
54 ;-------------------------------------
55 .MACRO VDL
56 ; VDL #WORD
57 ; Changes Display List addres
58 ; and sets width of the screen
59 ; vdl dl,$01 - narrow screen (32 bytes)
60 ; vdl dl,$02 - normal screen (40 bytes)
61 ; vdl dl,$03 - wide screen (48 bytes)
62 ; (works only with system interrupts ON)
63
64 .if %0=2
65 lda dmactls
66 and #$fc
67 ora #%2
68 sta dmactls
69 .endif
70
71 LDA # <%1
72 STA DLPTRS
73 LDA # >%1
74 STA DLPTRS+1
75 .ENDM
76 ;-------------------------------------
77 .MACRO halt
78 ?stop
79 lda RANDOM
80 and #$05
81 sta COLBAK
82 jmp ?stop
83 .ENDM
84 ;-------------------------------------
85 .MACRO KEY
86 ; KEY
87 ; waits for releasing and pressing "any key"
88 PHA
89 ?CK1 LDA SKSTAT
90 AND #$04
91 BEQ ?CK1
92 ?CK LDA SKSTAT
93 AND #$04
94 BNE ?CK
95 PLA
96 .ENDM
97 ;-------------------------------------
98 .MACRO WAIT
99 ; WAIT
100 ; waits one frame (1/50 s(PAL) or 1/60s(NTSC))
101 ?ze LDA VCOUNT
102 cmp #16 ; if line<16 then wait for line>15 (long VBI protection)
103 bcc ?ze
104 sbc #10 ; last lines correction
105 ?wa cmp VCOUNT
106 bcc ?wa
107 ?wf cmp VCOUNT
108 bcs ?wf
109 .ENDM
110 ;-------------------------------------
111 .macro waitRTC
112 lda RTCLOK+2
113 ?wa cmp RTCLOK+2
114 beq ?wa
115 .endm
116 ;-------------------------------------
117 .macro negw
118 ; negate the given word (0-a)
119 ;-------------------------------------
120 sec
121 lda #$00
122 sbc :1
123 sta :1
124 lda #$00
125 sbc :1+1
126 sta :1+1
127 .endm
128 ;-------------------------------------
129 .macro randomize
130 ;usage: randomize floor ceiling
131 ;returns (in A) a random .byte between "floor" and "ceiling"
132 .if :2 < :1
133 .error "floor higher than ceiling"
134 .endif
135 ?rand
136 lda random
137 cmp #:2+1-:1 ;ceiling
138 bcs ?rand
139 .if %1>0 ; if floor = 0 - no add offset
140 adc #:1
141 .endif
142 .endm
143 ;-------------------------------------
144 .macro phx
145 txa
146 pha
147 .endm
148 ;-------------------------------------
149 .macro phy
150 tya
151 pha
152 .endm
153 ;-------------------------------------
154 .macro plx
155 pla
156 tax
157 .endm
158 ;-------------------------------------
159 .macro ply
160 pla
161 tay
162 .endm
163 ;-------------------------------------
164 .macro txy
165 txa
166 tay
167 .endm
168 ;-------------------------------------
169 .macro tyx
170 tya
171 tax
172 .endm
173 ;-------------------------------------
174 .macro pause
175 ;waits :1 number (byte) of frames
176 ldx #:1
177 ?PAUSELOOP
178 wait
179 dex
180 bne ?PAUSELOOP
181 .ENDM
182 ;-------------------------------------
183 .MACRO POKEY_INIT
184 ; Initialises Pokey chip (required before playing sounds)
185 mva #0 AUDCTL
186 mva #3 SKSTAT
187 .ENDM
14 ;---------------------------------------------------
15 org $2000
16 PLAYER
17 icl '../music/playlzs16.asm' ; Music Player
Source: playlzs16.asm
1 ;
2 ; LZSS Compressed SAP player for 16 match bits
3 ; --------------------------------------------
4 ;
5 ; (c) 2020 DMSC
6 ; Code under MIT license, see LICENSE file.
7 ;
8 ; This player uses:
9 ; Match length: 8 bits (1 to 256)
10 ; Match offset: 8 bits (1 to 256)
11 ; Min length: 2
12 ; Total match bits: 16 bits
13 ;
14 ; Compress using:
15 ; lzss -b 16 -o 8 -m 1 input.rsap test.lz12
16 ;
17 ; Assemble this file with MADS assembler, the compressed song is expected in
18 ; the `test.lz16` file at assembly time.
19 ;
20 ; The plater needs 256 bytes of buffer for each pokey register stored, for a
21 ; full SAP file this is 2304 bytes.
22 ;
23 org $e0
24
25 = 00E0 song_start_ptr .ds 2
26 = 00E2 song_end_ptr .ds 2
27 = 00E4 chn_copy .ds 9
28 = 00ED chn_pos .ds 9
29 = 00F6 bptr .ds 2
30 = 00F8 cur_pos .ds 1
31 = 00F9 chn_bits .ds 1
32
33 = 00FA bit_data .ds 1
34
35
36
37 ;POKEY = $D200
38
39 org $2000
40
41
42 ;player
43 FFFF> 2000-20B3> 4C 56 + jmp play_frame
44 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
45 ; Song Initialization - this runs in the first tick:
46 ;
47 2003 .proc init_song
48
49 ;clear buffers
50 2003 A9 00 lda #0
51 2005 AA tax
52 @
53 2006 9D 00 21 9D 00 22 + :9 sta buffers+#*$100,x
54 2021 E8 inx
55 2022 D0 E2 bne @-
56
57 2024 A9 01 85 FA mva #1 bit_data
58
59 ; here initializes song pointer:
60 2028 18 A5 E0 69 01 8D + adw song_start_ptr #1 song_ptr
61
62 2037 A9 21 8D 4A 20 mva #>(buffers+255) cbuf+2
63 ; Init all channels:
64 203C A2 08 ldx #8
65 203E A0 00 ldy #0
66 2040 clear
67 ; Read just init value and store into buffer and POKEY
68 2040 20 A8 20 jsr get_byte
69 2043 9D 00 D2 sta POKEY, x
70 2046 94 E4 sty chn_copy, x
71 2048 cbuf
72 2048 8D FF 21 sta buffers + 255
73 204B EE 4A 20 inc cbuf + 2
74 204E CA dex
75 204F 10 EF bpl clear
76
77 ; Initialize buffer pointer:
78 2051 84 F6 sty bptr
79 2053 84 F8 sty cur_pos
80 2055 60 rts
81 .endp
82
83
84 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
85 ; Play one frame of the song
86 ;
87 2056 .proc play_frame
88 2056 A9 21 lda #>buffers
89 2058 85 F7 sta bptr+1
90
91 205A A0 00 ldy #0
92 205C B1 E0 lda (song_start_ptr),y
93 205E 85 F9 sta chn_bits
94 2060 A2 08 ldx #8
95
96 ; Loop through all "channels", one for each POKEY register
97 2062 chn_loop:
98 2062 46 F9 lsr chn_bits
99 2064 B0 29 bcs skip_chn ; C=1 : skip this channel
100
101 2066 B5 E4 lda chn_copy, x ; Get status of this stream
102 2068 D0 16 bne do_copy_byte ; If > 0 we are copying bytes
103
104 ; We are decoding a new match/literal
105 206A 46 FA lsr bit_data ; Get next bit
106 206C D0 06 bne got_bit
107 206E 20 A8 20 jsr get_byte ; Not enough bits, refill!
108 2071 6A ror ; Extract a new bit and add a 1 at the high bit (from C set above)
109 2072 85 FA sta bit_data ;
110 2074 got_bit:
111 2074 20 A8 20 jsr get_byte ; Always read a byte, it could mean "match size/offset" or "literal byte"
112 2077 B0 0F bcs store ; Bit = 1 is "literal", bit = 0 is "match"
113
114 2079 95 ED sta chn_pos, x ; Store in "copy pos"
115
116 207B 20 A8 20 jsr get_byte
117 207E 95 E4 sta chn_copy, x ; Store in "copy length"
118
119 ; And start copying first byte
120 2080 do_copy_byte:
121 2080 D6 E4 dec chn_copy, x ; Decrease match length, increase match position
122 2082 F6 ED inc chn_pos, x
123 2084 B4 ED ldy chn_pos, x
124
125 ; Now, read old data, jump to data store
126 2086 B1 F6 lda (bptr), y
127
128 2088 store:
129 2088 A4 F8 ldy cur_pos
130 208A 9D 00 D2 sta POKEY, x ; Store to output and buffer
131 208D 91 F6 sta (bptr), y
132
133 208F skip_chn:
134 ; Increment channel buffer pointer
135 208F E6 F7 inc bptr+1
136
137 2091 CA dex
138 2092 10 CE bpl chn_loop ; Next channel
139
140 2094 E6 F8 inc cur_pos
141
142 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
143 ; Check for ending of song and jump to the next frame
144 ;
145 2096 check_end_song
146 2096 AD AA 20 C5 E3 D0 + cpw song_ptr song_end_ptr
147 20A2 90 03 20 03 20 scc:jsr init_song
148 20A7 60 rts
149 .endp
150 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
151 20A8 get_byte
152 20A8 AD FF FF lda song_ptr: $ffff ;song_data+1
153 20AB EE A9 20 D0 03 EE + inw song_ptr
154 20B3 60 rts
155 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
156 /* start
157 mwa #song_data song_start_ptr
158 mwa #song_end song_end_ptr
159 jsr init_song
160 @
161 lda:cmp:req 20
162 jsr player
163
164 lda $d01f ;consol
165 cmp #7
166 seq:jsr init_song
167
168 jmp @- */
168
169
170
171
172
173 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
174 20B4 .align $100
175 2100 buffers
176 = 2100 .ds 256 * 9
177
178 ;song_data
179 ; ins 'InGame.lzss'
180 ;song_end
181
182
183 ; run start
184
18 ;---------------------------------------------------
19 ; BASIC off
20 ORG $2c00
21 2C00 start1
22 2C00-2E61> A9 FF 8D 01 + mva #$ff portb
23 2C05 A9 B2 8D 30 02 A9 + mwa #DL_pre dlptrs
24 2C0F A9 21 lda #@dmactl(narrow|dma) ; narrow screen width, DL on
25 2C11 8D 2F 02 sta dmactls
26 2C14 A9 00 8D C6 02 mva #0 COLOR2
27 2C19 8D 1A D0 sta COLBAK
28 2C1C A9 0F 8D C5 02 mva #15 COLOR1
29 2C21 20 9A 2C jsr wait_for_releasing_keyz
30 2C24 20 82 2F jsr PlayMusic
31 2C27 leet_anim
32 ; test for going further
33 2C27 AD 1F D0 lda CONSOL
34 2C2A C9 07 cmp #7
35 2C2C D0 65 bne leet_end
36 ; check keyboard
37 2C2E AD 0F D2 lda SKSTAT
38 2C31 C9 F7 cmp #$f7 ; SHIFT
39 2C33 F0 5E beq leet_end
40 2C35 C9 FF cmp #$ff
41 2C37 D0 5A bne leet_end
42 2C39 AD 10 D0 lda TRIG0
43 2C3C F0 55 beq leet_end
44
45
46 2C3E A9 D2 85 80 A9 2C + mwa #pre_screen temp_w
47 2C46 A9 62 85 85 A9 2E + mwa #leet_screen temp_w3
48 2C4E A0 00 ldy #0
49 @
50 2C50 B1 80 lda (temp_w),y
51 2C52 F0 20 beq next_letter ; ignore zeroes
52 ;is the letter leetable?
53 2C54 C9 61 cmp #"a"
54 2C56 90 1C bcc next_letter
55 2C58 C9 7B cmp #"z"+1
56 2C5A B0 18 bcs next_letter
57 ;letter is leetable
58 2C5C F0 16 beq next_letter
59 2C5E 38 sec
60 2C5F E9 61 sbc #"a"
61 2C61 A8 tay ;save the letter
62 2C62 AD 0A D2 lda RANDOM
63 2C65 29 03 and #%00000011 ; 0-3
64 2C67 AA tax
65 2C68 BD 5A 2E lda leet_speeks_l,x
66 2C6B 85 83 sta temp_w2
67 2C6D BD 5E 2E lda leet_speeks_h,x
68 2C70 85 84 sta temp_w2+1
69 2C72 B1 83 lda (temp_w2),y
70 2C74 next_letter
71 2C74 A0 00 ldy #0
72 2C76 91 85 sta (temp_w3),y
73 2C78 E6 80 D0 02 E6 81 inw temp_w
74 2C7E E6 85 D0 02 E6 86 inw temp_w3
75 2C84 A5 81 C9 2D D0 04 + cpw temp_w #pre_screen_end
76 2C8E F0 97 beq leet_anim
77 2C90 4C 50 2C jmp @-
78
79 2C93 leet_end
80 2C93 20 9F 2F jsr StopMusic
81 2C96 20 9A 2C jsr wait_for_releasing_keyz
82 2C99 60 rts
83
84
85 2C9A .proc wait_for_releasing_keyz
86 2C9A AD 1F D0 @ lda CONSOL
87 2C9D C9 07 cmp #7
88 2C9F D0 F9 bne @-
89 ; check keyboard
90 2CA1 AD 0F D2 @ lda SKSTAT
91 2CA4 C9 F7 cmp #$f7 ; SHIFT
92 2CA6 F0 F9 beq @-
93 2CA8 C9 FF cmp #$ff
94 2CAA D0 F5 bne @-
95 2CAC AD 10 D0 @ lda TRIG0
96 2CAF F0 FB beq @-
97 2CB1 60 rts
98 .endp
99
100 2CB2 DL_pre
101 2CB2 70 70 70 70 70 70 + :8 .by SKIP8
102 2CBA 42 .by LMS+MODE2
103 2CBB 62 2E .wo leet_screen
104 2CBD 00 02 .by SKIP1, MODE2
105 2CBF 70 .by SKIP8
106 2CC0 00 02 .by SKIP1, MODE2
107 2CC2 70 .by SKIP8
108 2CC3 00 02 00 02 00 02 + :6 .by SKIP1, MODE2
109 2CCF 41 .by JVB
110 2CD0 B2 2C .wo DL_pre
111 2CD2 pre_screen
112 ; 01234567890123456789012345678901"
113 2CD2 74 68 69 73 00 6C + dta "this little game was created in "
114 2CF2 00 66 6F 75 72 00 + dta " four evenings before SV2K24SE "
115 2D12 73 6F 72 72 79 00 + dta "sorry for technical difficulties"
116 2D32 63 6F 64 65 1A 00 + dta "code: "
117 2D52 00 00 00 00 00 00 + dta " pecus & pirx "
118 2D72 73 6F 75 6E 64 1A + dta "sound: "
119 2D92 00 00 00 00 00 00 + dta " alex, jochen hippel "
120 2DB2 67 66 78 1A 00 00 + dta "gfx: "
121 2DD2 00 00 00 00 00 00 + dta " alphabet, inc. "
122 2DF2 pre_screen_end
123 2DF2 leet_speek1
124 2DF2 61 62 63 64 65 66 + dta "abcdefghijklmnopqrstuvwxyz"
125 2E0C leet_speek2
126 2E0C 21 22 23 24 25 26 + dta "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
127 2E26 leet_speek3
128 2E26 14 18 3B 09 65 26 + dta "48[)eF9-|jk_mn0p@r57uvw*y2"
129 2E40 leet_speek4
130 2E40 3E 62 08 1E 5B 41 + dta "^b(>",$5b,$41,"gh1",$4c+$80,"k",$4b+$80,"M\",$54,$49+$80,"q",$51,"5",$57,"uvwxy/"
131
132 2E5A leet_speeks_l
133 2E5A F2 .by <leet_speek1
134 2E5B 0C .by <leet_speek2
135 2E5C 26 .by <leet_speek3
136 2E5D 40 .by <leet_speek4
137 2E5E leet_speeks_h
138 2E5E 2D .by >leet_speek1
139 2E5F 2E .by >leet_speek2
140 2E60 2E .by >leet_speek3
141 2E61 2E .by >leet_speek4
142 2E62 leet_screen
143 = 2E62 .ds 32*9
144 2F82 leet_screen_end
145 ;--------------------------------------------------
146 2F82 .proc PlayMusic
147 2F82-2FB1> A9 00 85 E0 + mwa #MUSIC_DATA song_start_ptr
148 2F8A A9 7F 85 E2 A9 35 + mwa #MUSIC_DATA_END song_end_ptr
149 2F92 20 03 20 jsr init_song
150 2F95 VMAIN VBLinterrupt,7 ; jsr SetVBL
Macro: VMAIN [Source: MACRO.ASM]
15 2F95 A0 A9 LDY # <VBLINTERRUPT
16 2F97 A2 2F LDX # >VBLINTERRUPT
17 2F99 A9 07 LDA #7
18 2F9B 20 5C E4 JSR SETVBV
Source: tech_diff.asm
151 2F9E 60 rts
152 .endp
153 2F9F .proc StopMusic
154 2F9F VMAIN XITVBV,7 ; jsr SetVBL
Macro: VMAIN [Source: MACRO.ASM]
15 2F9F A0 62 LDY # <XITVBV
16 2FA1 A2 E4 LDX # >XITVBV
17 2FA3 A9 07 LDA #7
18 2FA5 20 5C E4 JSR SETVBV
Source: tech_diff.asm
155 2FA8 60 rts
156 .endp
157 2FA9 .proc VBLinterrupt
158 2FA9 20 00 20 jsr PLAYER
159 2FAC 68 pla
160 2FAD A8 tay
161 2FAE 68 pla
162 2FAF AA tax
163 2FB0 68 pla
164 2FB1 40 rti
165 .endp
166 2FB2 .align $100
167 3000 MUSIC_DATA
168 3000-357E> 00 04 88 00 + ins '../music/Title.lzss' ; title music
169 357F MUSIC_DATA_END
170
171 02E2-02E3> 00 2C ini start1
172 ;---------------------------------------------------
173
174 org $3000
175 3000 screen
176 3000-98F4> FF FE FF F0 + ins 'difficulties.bmp',+62
177 3410 DL
178 3410 70 70 70 70 70 70 + :13 .by SKIP8
179 341D 4F .by MODEF+LMS
180 341E 00 30 .wo screen
181 3420 0F 0F 0F 0F 0F 0F + :25 .by MODEF
182 3439 41 .by JVB
183 343A 10 34 .wo DL
184
185 343C start
186 343C A9 10 8D 30 02 A9 + mwa #DL dlptrs
187 3446 A9 3E lda #@dmactl(standard|dma|players|missiles|lineX1) ; normal screen width, DL on, P/M on
188 3448 8D 2F 02 sta dmactls
189 344B A9 00 8D C6 02 mva #0 COLOR2
190 3450 8D 1A D0 sta COLBAK
191 3453 A9 0F 8D C5 02 mva #15 COLOR1
192 3458 POKEY_INIT
Macro: POKEY_INIT [Source: MACRO.ASM]
2 3458 A9 00 8D 08 D2 mva #0 AUDCTL
3 345D A9 03 8D 0F D2 mva #3 SKSTAT
Source: tech_diff.asm
193 3462 pause 3
Macro: PAUSE [Source: MACRO.ASM]
2 3462 A2 03 ldx #3
3 3464 ?PAUSELOOP
3 3464 AD 0B D4 ?ze LDA VCOUNT
4 3467 C9 10 cmp #16 ; if line<16 then wait for line>15 (long VBI protection)
5 3469 90 F9 bcc ?ze
6 346B E9 0A sbc #10 ; last lines correction
7 346D CD 0B D4 ?wa cmp VCOUNT
8 3470 90 FB bcc ?wa
9 3472 CD 0B D4 ?wf cmp VCOUNT
10 3475 B0 FB bcs ?wf
Source: tech_diff.asm
5 3477 CA dex
6 3478 D0 EA bne ?PAUSELOOP
Source: tech_diff.asm
194 347A A9 00 lda #0
195 347C 8D 0E D4 sta $d40e ; NMI OFF
196 347F 78 sei ; IRQ OFF
197
198
199 ;-----playa-da-sampla-----
200 3480 A2 00 ldx #0
201
202 3482 please_wait_loop
203 3482 BD C9 98 lda samples_l,x
204 3485 8D 99 34 sta sample_load
205 3488 BD D4 98 lda samples_h,x
206 348B 8D 9A 34 sta sample_load+1
207
208 348E BD DF 98 lda samples_end_l,x
209 3491 85 80 sta temp_w
210 3493 BD EA 98 lda samples_end_h,x
211 3496 85 81 sta temp_w+1
212
213 @
214 3498 AD FF FF lda sample_load: $ffff
215 349B A8 tay
216 349C 38 sec
217 349D 6A 6A 6A 6A :4 ror
218 34A1 8D 01 D2 sta AUDC1
219 34A4 8D 03 D2 sta AUDC2
220 34A7 8D 05 D2 sta AUDC3
221 ;sta AUDC4
222 34AA 8D 0A D4 sta wsync ;------------
223 ; test for going further
224 34AD AD 1F D0 lda CONSOL
225 34B0 C9 07 cmp #7
226 34B2 D0 50 bne exit_tech_diff
227 ; check keyboard
228 34B4 AD 0F D2 lda SKSTAT
229 34B7 C9 F7 cmp #$f7 ; SHIFT
230 34B9 F0 49 beq exit_tech_diff
231 34BB C9 FF cmp #$ff
232 34BD D0 45 bne exit_tech_diff
233 34BF 8D 0A D4 sta wsync ;------------
234 34C2 AD 10 D0 lda TRIG0
235 34C5 F0 3D beq exit_tech_diff
236 34C7 8D 0A D4 sta wsync ;------------
237
238 34CA 98 tya
239 34CB 29 0F and #$0F
240 34CD 09 10 ora #$10
241 34CF 8D 01 D2 sta AUDC1
242 34D2 8D 03 D2 sta AUDC2
243 34D5 8D 05 D2 sta AUDC3
244 ;sta AUDC4
245
246
247 34D8 EE 99 34 D0 03 EE + inw sample_load
248 34E0 8D 0A D4 sta wsync
249 34E3 AD 9A 34 C5 81 D0 + cpw sample_load temp_w
250 34EF 8D 0A D4 sta wsync
251 34F2 F0 06 beq @+
252 34F4 8D 0A D4 sta wsync
253 34F7 4C 98 34 jmp @-
254 @
255 34FA E8 inx
256 34FB E0 0B cpx #11
257 34FD D0 02 A2 01 sne:ldx #1
258 3501 4C 82 34 jmp please_wait_loop
259
260 3504 exit_tech_diff
261 ; wait for releasing keyz
262 3504 AD 1F D0 @ lda CONSOL
263 3507 C9 07 cmp #7
264 3509 D0 F9 bne @-
265 ; check keyboard
266 350B AD 0F D2 @ lda SKSTAT
267 350E C9 F7 cmp #$f7 ; SHIFT
268 3510 F0 F9 beq @-
269 3512 C9 FF cmp #$ff
270 3514 D0 F5 bne @-
271 3516 AD 10 D0 @ lda TRIG0
272 3519 F0 FB beq @-
273
274 ;
275 351B A9 40 lda #$40
276 351D 8D 0E D4 sta $d40e ; NMI On
277 3520 58 cli ; IRQ on
278 3521 A9 00 8D 2F 02 mva #0 DMACTLS
279 3526 8D 00 D4 sta dmactl
280 3529 60 rts
281
282 352A sample1
283 352A 57 77 77 77 77 77 + ins 'wait1.wav.bin'
284 4896 sample_end1
285 4896 sample2
286 4896 43 33 33 33 33 33 + ins 'wait2.wav.bin'
287 6B7B sample_end2
288 6B7B sample3
289 6B7B 32 22 22 22 22 22 + ins 'wait3.wav.bin'
290 6E15 sample_end3
291 6E15 sample4
292 6E15 56 66 66 66 66 66 + ins 'wait4.wav.bin'
293 70AF sample_end4
294 70AF sample5
295 70AF 57 67 67 67 67 67 + ins 'wait5.wav.bin'
296 98C9 sample_end5
297
298 98C9 samples_l
299 98C9 2A .by <sample1
300 98CA 96 .by <sample2
301 98CB 7B .by <sample3
302 98CC 96 .by <sample2
303 98CD 15 .by <sample4
304 98CE 96 .by <sample2
305 98CF AF .by <sample5
306 98D0 96 .by <sample2
307 98D1 7B .by <sample3
308 98D2 96 .by <sample2
309 98D3 15 .by <sample4
310 98D4 samples_h
311 98D4 35 .by >sample1
312 98D5 48 .by >sample2
313 98D6 6B .by >sample3
314 98D7 48 .by >sample2
315 98D8 6E .by >sample4
316 98D9 48 .by >sample2
317 98DA 70 .by >sample5
318 98DB 48 .by >sample2
319 98DC 6B .by >sample3
320 98DD 48 .by >sample2
321 98DE 6E .by >sample4
322 98DF samples_end_l
323 98DF 96 .by <sample_end1
324 98E0 7B .by <sample_end2
325 98E1 15 .by <sample_end3
326 98E2 7B .by <sample_end2
327 98E3 AF .by <sample_end4
328 98E4 7B .by <sample_end2
329 98E5 C9 .by <sample_end5
330 98E6 7B .by <sample_end2
331 98E7 15 .by <sample_end3
332 98E8 7B .by <sample_end2
333 98E9 AF .by <sample_end4
334 98EA samples_end_h
335 98EA 48 .by >sample_end1
336 98EB 6B .by >sample_end2
337 98EC 6E .by >sample_end3
338 98ED 6B .by >sample_end2
339 98EE 70 .by >sample_end4
340 98EF 6B .by >sample_end2
341 98F0 98 .by >sample_end5
342 98F1 6B .by >sample_end2
343 98F2 6E .by >sample_end3
344 98F3 6B .by >sample_end2
345 98F4 70 .by >sample_end4
346 98F5 finito
347 02E2-02E3> 3C 34 ini start