]> github.com/historicalsource and other repositories - DRGNSRC.git/blob - DDIO.ASM
Fixed README extension
[DRGNSRC.git] / DDIO.ASM
1 \r
2 cseg            segment public 'code'\r
3 \r
4 public          return, newivector, restore_int\r
5 public          load, save, create, open, writeF, error, READF, close\r
6 public          INIT_STICKS,load_error\r
7 \r
8 extrn   delzw:near,main_loop:near,write_text:near\r
9 \r
10 PUBLIC  TEST_SND\r
11 ;PUBLIC ANJOY_INIT, ANJOY_READ, ANJOY_INIT_2, ANJOY_READ_2\r
12 public  hit_snd, thud_snd, linda_snd, will_snd, colaps_snd, whip_snd\r
13 public  thumb_snd, splash_snd, splat_snd, bounce_snd, knife_snd, gun_snd\r
14 \r
15 ;       when a whatsit error occurs erm\r
16 ;       try first error_fl and returning ?\r
17 \r
18 assume          cs:cseg, ds:dseg\r
19 \r
20 include         ddeqfile\r
21 \r
22 load_error:\r
23 ;       ax denotes disk I should have at this point\r
24 ;       0-3 for different ones\r
25 ;       I think ?\r
26 ;       0 - main disc/cga grafix\r
27 ;       1 - main disc/cga grafix\r
28 ;       2 - Ega graphics disc \r
29 ;       3 - Vga graphics disc \r
30 \r
31         pushall\r
32 ;w_f_n_sp:\r
33 ;cmp    byte ptr [keybd+39h],0\r
34 ;je     w_f_n_sp\r
35 \r
36 ;border 1\r
37 \r
38         shl     ax,1\r
39         mov     si,ax\r
40         mov     si,[si+offset disc_names]\r
41         mov     dx,24*256\r
42         call    write_text\r
43 w_f_sp:\r
44         cmp     byte ptr [keybd+39h],0\r
45         jne     w_f_sp\r
46         mov     si,offset null_str\r
47         mov     dx,24*256       ;bottom of screen.\r
48         call    write_text\r
49 \r
50         popall\r
51 ;       note after this another attempt is made to load the file\r
52         ret\r
53 \r
54 return:         \r
55         mov     ax,seg dseg\r
56         mov     ds,ax\r
57         call    restore_int\r
58         IN      AL, 61H         ; this kills the sound effects\r
59         AND     AL, 0FCH        \r
60         OUT     61H, AL         ;so buzzes ! dont cont after ESC\r
61         MOV     SND_PTR, 0      \r
62                 mov     ax, 2\r
63                 int     16\r
64 l_shift_key     equ     2ah\r
65 not_pressed:\r
66                 mov     ax, 4c00h\r
67                 int     33\r
68 \r
69 newivector:     cli\r
70                 push    ds\r
71                 push    es\r
72                 mov     ax, dseg\r
73                 mov     ds, ax\r
74                 xor     ax, ax\r
75                 mov     es, ax\r
76 \r
77                 mov     ax, es: [36]\r
78                 mov     ivect9_ip, ax\r
79                 mov     ax, es: [38]\r
80                 mov     ivect9_cs, ax\r
81 \r
82 ;mov    ax, es: [36]\r
83 ;mov    ivect_ip, ax\r
84 ;mov    ax, es: [38]    ;take over critical\r
85 ;mov    ivect_cs, ax    ;error handler.\r
86 \r
87                 mov     ax, es: [8*4]\r
88                 mov     ivect28_ip, ax\r
89                 mov     es:[0fh*4],ax\r
90 \r
91                 mov     ax, es: [8*4+2]\r
92                 mov     ivect28_cs, ax\r
93                 mov     es:[0fh*4+2],ax\r
94 \r
95         call    fast_i\r
96 \r
97                 mov     word ptr es: [36], offset scan\r
98                 mov     es: [38], cs\r
99                 mov     word ptr es: [8*4], offset timer_int\r
100                 mov     es: [8*4+2], cs\r
101 \r
102                 MOV     FIREJ,1\r
103                 MOV     FIREK,1\r
104         mov     dx,201h ; Iam sure this is wrong !\r
105         out     dx,al   ;leave for the moment BUT !\r
106         sti\r
107                 pop     es\r
108                 pop     ds\r
109                 ret\r
110 fast_i:\r
111         mov     byte ptr in_slow,0\r
112         mov     al,36h\r
113         out     [43h],al\r
114         mov     al,0\r
115         out     [40h],al\r
116         mov     al,16   ;for 4 times the ints 74hz\r
117         out     [40h],al        ;\r
118         ret\r
119 \r
120 slow_i:\r
121         mov     byte ptr in_slow,1\r
122         mov     al,36h\r
123         out     [43h],al\r
124         xor     al,al\r
125         out     [40h],al\r
126         out     [40h],al        ;timer back to default 54ms\r
127         ret\r
128 \r
129 INIT_STICKS:\r
130                 CLI\r
131                 MOV     FIREJ,1\r
132                 MOV     FIREK,1\r
133                 call    anjoy_init\r
134                 call    anjoy_init_2\r
135                 STI\r
136         RET\r
137 \r
138 restore_int:    cli\r
139                 push    ds\r
140                 push    es\r
141                 mov     ax, dseg\r
142                 mov     ds, ax\r
143                 xor     ax, ax\r
144                 mov     es, ax\r
145                 mov     ax, ivect9_ip\r
146                 mov     es: [36], ax\r
147                 mov     ax, ivect9_cs\r
148                 mov     es: [38], ax\r
149 \r
150                 call    slow_i\r
151 \r
152                 mov     ax, ivect28_ip          ;timer int\r
153                 mov     es: [8*4], ax           ;\r
154                 mov     ax, ivect28_cs          ;\r
155                 mov     es: [8*4+2], ax ;\r
156                 pop     es\r
157                 pop     ds\r
158                 sti\r
159                 ret\r
160 \r
161 \r
162 \r
163 \r
164 no_call:\r
165                 mov    al,20h  ;god knows but its in the pink book\r
166                 out    20h,al  ;\r
167         STI\r
168                 pop     ds\r
169                 pop     ax\r
170 \r
171 no_call2:       iret\r
172 \r
173 timer_int:\r
174 ;put timer interrupt code here (ie Second count and sfx)\r
175                 push    ax\r
176                 push    ds\r
177                 MOV     AX,DSEG         ; SEG FRAME_COUNT\r
178                 MOV     DS,AX\r
179                 INC     FRAME_COUNT     ; always count dont care speed\r
180                 cmp     byte ptr in_slow,1\r
181                 jp_e    slower\r
182                 push    si\r
183 \r
184                 MOV     SI, SND_PTR\r
185                 OR      SI, SI\r
186                 JZ      END_SOUND\r
187 SOUND:\r
188                 LODSW\r
189                 OR      AX, AX\r
190                 JZ      STOP_SOUND\r
191                 MOV     SND_PTR, SI\r
192                 OUT     42H, AL\r
193                 MOV     AL, AH\r
194                 OUT     42H, AL\r
195                 JMP     END_SOUND\r
196 STOP_SOUND:\r
197                 IN      AL, 61H\r
198                 AND     AL, 0FCH\r
199                 OUT     61H, AL\r
200                 MOV     SND_PTR, 0\r
201 END_SOUND:\r
202                 POP     SI\r
203                 mov     ax,[intcount]\r
204                 inc     ax\r
205                 mov     [intcount],ax\r
206                 test    ax,3    ;low bits\r
207                 jnz     no_call\r
208         cmp     nojoyflag,-1\r
209         je      soddestick\r
210         push    dx\r
211         push    bx\r
212         push    cx\r
213         mov     fudlr,31\r
214         mov     fudlr_2,31\r
215 \r
216         MOV     DX,201H\r
217         IN      AL,DX   ;READ THE BUTTONS (this is silly)\r
218         NOT     AL\r
219         CMP     AJF1,0\r
220         JNE     ONAL\r
221         TEST    AL,30H  ;HAVE I PRESSED A BUTTON ON JOYSTICK ? \r
222         JZ      ONAL    ;WHEN STICK NOT ON ?\r
223         CALL    ANJOY_INIT\r
224         CMP     AJF2,0\r
225         JE      ONAL2\r
226         CALL    ANJOY_INIT_2\r
227 ;RE-READ DATA FOR OTHER STICK \r
228         JMP     ONAL2\r
229 ONAL:   CMP     AJF2,0\r
230         JNE     ONAL2\r
231         TEST    AL,0C0H ;HAVE I PRESSED A BUTTON ON JOYSTICK ? \r
232         JZ      ONAL2   ;WHEN STICK NOT ON ?\r
233         CALL    ANJOY_INIT_2\r
234         CMP     AJF1,0\r
235         JE      ONAL2\r
236         CALL    ANJOY_INIT      ;RE-READ DATA FOR OTHER STICK \r
237 ONAL2:  call    anjoy_read\r
238         call    anjoy_read_2\r
239 shag:\r
240         pop     cx\r
241         pop     bx\r
242         pop     dx\r
243 soddestick:\r
244                 sti     ;re-interruptable !\r
245 slower:         pop     ds\r
246                 pop     ax\r
247                 int     0fh     ; bless my soul ! there is an easier way !\r
248                 iret\r
249 \r
250 \r
251 ;Jake Sound Routines for setting up different Sound Effects !\r
252 \r
253 hit_snd:        mov     snd_ptr, offset snd_tab_2\r
254                 jmp     start_sound\r
255 \r
256 thud_snd:       mov     snd_ptr, offset snd_tab_3\r
257                 jmp     start_sound\r
258 \r
259 linda_snd:      mov     snd_ptr, offset snd_tab_4\r
260                 jmp     start_sound\r
261 \r
262 will_snd:       mov     snd_ptr, offset snd_tab_5\r
263                 jmp     start_sound\r
264 \r
265 colaps_snd:     mov     snd_ptr, offset snd_tab_6\r
266                 jmp     start_sound\r
267 \r
268 thumb_snd:      mov     snd_ptr, offset snd_tab_7\r
269                 jmp     start_sound\r
270 \r
271 whip_snd:       mov     snd_ptr, offset snd_tab_8\r
272                 jmp     start_sound\r
273 \r
274 splash_snd:     mov     snd_ptr, offset snd_tab_9\r
275                 jmp     start_sound\r
276 \r
277 splat_snd:      mov     snd_ptr, offset snd_tab_10\r
278                 jmp     start_sound\r
279 \r
280 bounce_snd:     mov     snd_ptr, offset snd_tab_11\r
281                 jmp     start_sound\r
282 \r
283 knife_snd:      mov     snd_ptr, offset snd_tab_12\r
284                 jmp     start_sound\r
285 \r
286 gun_snd:        mov     snd_ptr, offset snd_tab_13\r
287                 jmp     start_sound\r
288 \r
289 TEST_SND:\r
290                 MOV     SND_PTR, OFFSET SND_TAB_1\r
291 START_SOUND:\r
292                 CMP     SND_FLAG, 0\r
293                 JE      NO_SOUND\r
294 \r
295                 MOV     AL,0B6H                 ; init spkr timer\r
296                 OUT     43H, AL\r
297                 IN      AL, 61H\r
298                 OR      AL, 3\r
299                 OUT     61H, AL\r
300                 RET\r
301 NO_SOUND:\r
302                 MOV     SND_PTR, 0\r
303                 RET\r
304 \r
305 \r
306 try_cont:\r
307         cmp     byte ptr [keybd+bx],0   ;pressed\r
308         jne     no_go\r
309         sti\r
310 \r
311         jmp     main_loop       ;oh god ( what about the bloody stack !)\r
312 ; and itll get called twice !\r
313 no_go:\r
314         jmp     try_back        ;ie dont on release\r
315 \r
316 scan:\r
317                 push    ax\r
318                 push    bx\r
319                 push    ds\r
320                 mov     ax, dseg\r
321                 mov     ds, ax\r
322 \r
323                 in      al, 60h\r
324                 mov     bl, al\r
325                 in      al, 61h\r
326                 or      al, 80h\r
327                 out     61h, al\r
328                 and     al, 7fh\r
329                 out     61h, al\r
330 \r
331                 xor     al, al\r
332                 mov     bh, al\r
333                 shl     bl, 1\r
334                 rcl     al, 1\r
335                 shr     bl, 1\r
336                 mov     [keybd + bx], al\r
337 \r
338                 mov     al, 61h\r
339                 out     20h, al\r
340         cmp     bx,1    ;pressing the escape key !\r
341         je      escape\r
342 \r
343 ;cmp    bx,3    ;f2 key ? \r
344 ;jne    no_ch_time\r
345 ;mov    timer,11\r
346 ;no_ch_time:\r
347 \r
348         push    si\r
349         mov     si,cht_ptr\r
350         cmp     bl,[si] ;does it equal this one ?\r
351         jne     no_cheat_mde    ;no so leave ptr here\r
352         inc     cht_ptr\r
353         cmp     si,offset endtxt\r
354         jne     no_cheat_mde\r
355         mov     cheat_mode,-1   ;turn it to the opposite\r
356         mov     cht_ptr,offset cht_text\r
357 no_cheat_mde:\r
358         pop     si\r
359 \r
360         cmp     bx,42h  ;f8 key\r
361         jne     no_reset\r
362         mov     cht_ptr,offset cht_text\r
363 no_reset:\r
364         cmp     bx,43h  ;f9 key\r
365         jne     no_reset_cht\r
366         mov     cheat_mode,0    ;put to no cheat\r
367 no_reset_cht:\r
368 \r
369 try_back:\r
370                 CMP     BX,FIRE_K\r
371                 JNE     NF1\r
372                 MOV     FIREK,AL        ;STORE THE REAL FIRE KEY\r
373 NF1:\r
374                 CMP     BX,FIRE_J\r
375                 JNE     NF2     \r
376                 MOV     FIREJ,AL        ;STORE THE REAL FIRE KEY\r
377 NF2:\r
378 \r
379                 pop     ds\r
380                 pop     bx\r
381                 pop     ax\r
382                 sti\r
383                 iret\r
384 \r
385 escape:\r
386         sti     ;\r
387         jmp     return\r
388         \r
389 \r
390 \r
391 loadit:\r
392         mov     errfl,0 ;zero the error variable\r
393         push    nojoyflag\r
394         mov     nojoyflag,-1    ;kill sticks ?\r
395                 call    open\r
396 ;border 8\r
397                 call    READF\r
398 ;border 9\r
399                 call    close\r
400         pop     nojoyflag\r
401                 ret\r
402 save:\r
403         mov     errfl,0 ;zero the error variable\r
404                 call    create\r
405                 call    writeF\r
406                 call    close\r
407                 ret\r
408 create:\r
409                 mov     dx, file_name\r
410                 xor     cx, cx\r
411                 mov     al, 2\r
412                 mov     ah, 3ch                 ; function 3c - create file\r
413                 int     33\r
414                 jc      error\r
415                 mov     handle, ax\r
416                 ret\r
417 ;           open a file for READFing\r
418 \r
419 open:\r
420                 mov     ah,13\r
421                 int     21h\r
422                 mov     dx, file_name\r
423                 xor     al, al\r
424                 mov     ah, 3dh                 ; function 3d - open file\r
425                 int     33\r
426                 jc      error\r
427                 mov     handle, ax\r
428                 ret\r
429 ;            write to file\r
430 \r
431 writeF:\r
432                 mov     ax, start_seg\r
433                 mov     bx, handle\r
434                 mov     cx, len\r
435                 mov     dx, start_offset\r
436                 push    ds\r
437                 mov     ds, ax\r
438                 mov     ah, 40h                 ; function 40 - write file\r
439                 int     33\r
440                 pop     ds\r
441                 jc      error\r
442                 ret\r
443 \r
444 ;       flag error\r
445 flg_error:              ;assumes dseg is set correct at this point.\r
446         mov     errfl,-1\r
447         ret     ;returns as before!\r
448 \r
449 ; print up the error message\r
450 \r
451 error:          \r
452 ;       grief what state is the stack in at this point !!!\r
453 ;       restore what we can !!!\r
454 ;       ???????????????\r
455 \r
456 ;       let other rout sort this out.\r
457 ;       this is going to be problematical\r
458 ;       hmmm.\r
459         jmp     word ptr [error_rout]\r
460 \r
461 \r
462 div_err:\r
463                 call    restore_int\r
464                 mov     ax,2\r
465                 int     16      ;change mode before exit.\r
466                 int     0       ;exit with divide overflow (v.tacky or what)\r
467                 mov     ax, 4c00h\r
468                 int     33\r
469 \r
470 ;          read a file\r
471 \r
472 READF:\r
473                 mov     ah,13\r
474                 int     21h\r
475         jc      error   ;will it help\r
476                 mov     ax, start_seg\r
477                 mov     bx, handle\r
478                 mov     cx, 0ffffh\r
479                 mov     dx, start_offset\r
480                 push    ds\r
481                 mov     ds, ax\r
482                 mov     ah, 3fh                 ; function 3f - read file\r
483                 int     33\r
484                 pop     ds\r
485                 jc      error\r
486                 ret\r
487 \r
488 close:\r
489                 mov     bx, handle\r
490                 mov     ah, 3eh                 ; function 3e - close file\r
491                 int     33\r
492                 jc      error\r
493                 ret\r
494 \r
495 load:\r
496         pushall\r
497         call    slow_i\r
498 ;de_vice:\r
499         push    es\r
500         push    ds\r
501 \r
502         push    start_seg\r
503         push    start_offset\r
504         mov     start_offset,0\r
505         mov     ax,buff_seg\r
506         mov     start_seg,ax\r
507 ;border 15\r
508         call    loadit  ;loads into normal space ?\r
509 \r
510 ;border 12\r
511 \r
512         pop     di      ;start_offset\r
513         pop     es      ;start_seg\r
514         cmp     errfl,0\r
515         jne     error_on_load\r
516         xor     si,si\r
517         mov     ax,start_seg\r
518         mov     ds,ax\r
519         call    delzw   ;decompress from DS:SI to ES:DI\r
520 error_on_load:\r
521         pop     ds\r
522         pop     es\r
523         sub     cx,di   ;well ya never know !\r
524         mov     len,cx\r
525         call    fast_i\r
526         popall  ;this is just so fucking rediculous\r
527         ret\r
528 \r
529 ;ASSUME NO STICK BUT WHEN A BUTTON IS PRESSED INITIATE THE JOYSTICK\r
530 ;The Tandy joystick routines from Jake\r
531 \r
532 no_stcks:\r
533         ret\r
534 \r
535 ANJOY_START:\r
536         cmp     nojoyflag,-1\r
537         jp_e    no_stcks\r
538 ;CLI                    ; NOTE !!!\r
539                 MOV     DX, 201H\r
540                 OUT     DX, AL\r
541                 NOP\r
542                 NOP\r
543                 MOV     BX, 0\r
544                 MOV     CX, 0\r
545 AJS_ALP:\r
546                 IN      AL, DX\r
547                 INC     BX\r
548                 INC     CX\r
549                 TEST    AL, 1\r
550                 JZ      AJS_YLP_A\r
551                 TEST    AL, 2\r
552                 JZ      AJS_XLP_A\r
553                 CMP     CX, 1000\r
554                 JL      AJS_ALP\r
555                 JMP     AJS_TO          ; for time-out\r
556 AJS_XLP:\r
557                 ; Y done - just count x\r
558                 IN      AL, DX\r
559                 INC     BX\r
560                 NOP\r
561                 NOP\r
562                 NOP                     ; adjust timing\r
563                 NOP\r
564                 NOP\r
565                 CMP     BX, 1000        ;0      ; for time-out\r
566                 JGE     AJS_TO\r
567 AJS_XLP_A:\r
568                 TEST    AL, 1\r
569                 JNZ     AJS_XLP\r
570 ;STI\r
571                 RET\r
572 AJS_YLP:\r
573                 ; X done - just count y\r
574                 IN      AL, DX\r
575                 INC     CX\r
576                 NOP\r
577                 NOP\r
578                 NOP\r
579                 NOP\r
580                 NOP\r
581                 CMP     CX, 1000        ;0\r
582                 JGE     AJS_TO\r
583 AJS_YLP_A:\r
584                 TEST    AL, 2\r
585                 JNZ     AJS_YLP\r
586 ;STI\r
587                 RET\r
588 AJS_TO:\r
589 ; time-out      SHOULDNT IT MAKE THE JOY FLAG FALSE ?\r
590                 MOV     AJF1, 0         ; F\r
591 ;STI\r
592                 RET\r
593 \r
594                 \r
595 ANJOY_INIT:\r
596         cmp     nojoyflag,-1\r
597         jp_e    no_stcks\r
598                 MOV     AJF1,1\r
599                 CALL    ANJOY_START\r
600                 CMP     AJF1, 0\r
601                 JE      E_AJI\r
602                 MOV     AJXO1, BX       ; x-origin\r
603                 MOV     AJXN1, BX\r
604                 SHR     BX, 1           ; calc x-nullzone\r
605                 SUB     AJXN1, BX\r
606                 MOV     AJYO1, CX       ; Y-origin\r
607                 MOV     AJYN1, CX\r
608                 SHR     CX, 1\r
609                 SUB     AJYN1, CX       ; Y-nullzone\r
610 E_AJI:\r
611                 RET\r
612 \r
613 \r
614 ANJOY_READ:\r
615         cmp     nojoyflag,-1\r
616         jp_e    no_stcks\r
617         MOV     FUDLR_2,31\r
618                 CMP     AJF1, 0\r
619                 JE      E_ANJR1\r
620                 CALL    ANJOY_START\r
621                 CMP     AJF1, 0\r
622                 JE      E_ANJR1\r
623         MOV     DL,FIREJ\r
624         MOV     KEYBD+FIRE_J,DL\r
625                 MOV     DL,0\r
626                 NOT     AL\r
627                 TEST    AL,030H ; both buttons\r
628                 JZ      N_ANJF1\r
629         MOV     BYTE PTR KEYBD+FIRE_J,0 ;changed\r
630 N_ANJF1:\r
631                 SUB     BX, AJXO1\r
632                 MOV     AX, AJXN1\r
633                 CMP     BX, AX\r
634                 JL      N_R1\r
635                 OR      DL, 1           ; R bit\r
636 N_R1:\r
637                 NEG     AX\r
638                 CMP     BX, AX\r
639                 JG      N_L1\r
640                 OR      DL, 2           ; L bit\r
641 N_L1:\r
642                 SUB     CX, AJYO1\r
643                 MOV     AX, AJYN1\r
644                 CMP     CX, AX\r
645                 JL      N_D1\r
646                 OR      DL, 4           ; D bit\r
647 N_D1:\r
648                 NEG     AX\r
649                 CMP     CX, AX\r
650                 JG      N_U1\r
651                 OR      DL, 8           ; U bit\r
652 N_U1:\r
653                 XOR     DL,31\r
654                 MOV     FUDLR_2, DL\r
655 E_ANJR1:        RET\r
656 \r
657 ANJOY_START_2:\r
658         cmp     nojoyflag,-1\r
659         jp_e    no_stcks\r
660 ;CLI                    ; NOTE !!!\r
661                 MOV     DX, 201H\r
662                 OUT     DX, AL\r
663                 NOP\r
664                 NOP\r
665                 MOV     BX, 0\r
666                 MOV     CX, 0\r
667 AJS2_ALP:\r
668                 IN      AL,DX\r
669                 INC     BX\r
670                 INC     CX\r
671                 TEST    AL, 4\r
672                 JZ      AJS2_YLP_A\r
673                 TEST    AL, 8\r
674                 JZ      AJS2_XLP_A\r
675                 CMP     CX, 1000\r
676                 JL      AJS2_ALP\r
677                 JMP     AJS2_TO         ; for time-out\r
678 AJS2_XLP:\r
679                 ; Y done - just count x\r
680                 IN      AL, DX\r
681                 INC     BX\r
682                 NOP\r
683                 NOP\r
684                 NOP                     ; adjust timing\r
685                 NOP\r
686                 NOP\r
687                 CMP     BX, 1000        ;0      ; for time-out\r
688                 JGE     AJS2_TO\r
689 AJS2_XLP_A:\r
690                 TEST    AL, 4\r
691                 JNZ     AJS2_XLP\r
692 ;STI    no need off already !\r
693                 RET\r
694 AJS2_YLP:\r
695                 ; X done - just count y\r
696                 IN      AL, DX\r
697                 INC     CX\r
698                 NOP\r
699                 NOP\r
700                 NOP\r
701                 NOP\r
702                 NOP\r
703                 CMP     CX, 1000        ;0\r
704                 JGE     AJS2_TO\r
705 AJS2_YLP_A:\r
706                 TEST    AL, 8\r
707                 JNZ     AJS2_YLP\r
708 ;STI\r
709                 RET\r
710 AJS2_TO:        ; time-out\r
711                 MOV     AJF2, 0         ; F\r
712 ;STI\r
713                 RET\r
714                 \r
715 ANJOY_INIT_2:\r
716         cmp     nojoyflag,-1\r
717         jp_e    no_stcks\r
718                 MOV     AJF2,1  ;ASSUME JOYSTICK PRESENT\r
719                 CALL    ANJOY_START_2\r
720                 CMP     AJF2, 0\r
721                 JE      E_AJI2\r
722                 MOV     AJXO2, BX       ; x-origin\r
723                 MOV     AJXN2, BX\r
724                 SHR     BX, 1           ; calc x-nullzone\r
725                 SUB     AJXN2, BX\r
726                 MOV     AJYO2, CX       ; Y-origin\r
727                 MOV     AJYN2, CX\r
728                 SHR     CX, 1\r
729                 SUB     AJYN2, CX       ; Y-nullzone\r
730 E_AJI2:\r
731                 RET\r
732 \r
733 ANJOY_READ_2:\r
734         cmp     nojoyflag,-1\r
735         jp_e    no_stcks\r
736         MOV     FUDLR,31        ;changed\r
737                 CMP     AJF2, 0\r
738                 JE      E_ANJR2\r
739                 CALL    ANJOY_START_2\r
740                 CMP     AJF2, 0\r
741                 JE      E_ANJR2\r
742         MOV     DL,FIREK\r
743         MOV     KEYBD+FIRE_K,DL\r
744                 MOV     DL, 0\r
745                 NOT     AL\r
746                 TEST    AL, 0C0H        ; both buttons\r
747                 JZ      N_ANJF2\r
748         MOV     BYTE PTR KEYBD+FIRE_K,0\r
749 N_ANJF2:\r
750                 SUB     BX, AJXO2\r
751                 MOV     AX, AJXN2\r
752                 CMP     BX, AX\r
753                 JL      N_R2\r
754                 OR      DL, 1           ; R bit\r
755 N_R2:\r
756                 NEG     AX\r
757                 CMP     BX, AX\r
758                 JG      N_L2\r
759                 OR      DL, 2           ; L bit\r
760 N_L2:\r
761                 SUB     CX, AJYO2\r
762                 MOV     AX, AJYN2\r
763                 CMP     CX, AX\r
764                 JL      N_D2\r
765                 OR      DL, 4           ; D bit\r
766 N_D2:\r
767                 NEG     AX\r
768                 CMP     CX, AX\r
769                 JG      N_U2\r
770                 OR      DL, 8           ; U bit\r
771 N_U2:\r
772                 XOR     DL,31\r
773                 MOV     FUDLR, DL       ;changed\r
774 E_ANJR2:\r
775                 RET\r
776         \r
777 cseg            ends\r
778 \r
779 dseg            segment public 'data'\r
780 \r
781 public          keybd, start_seg, start_offset, len, file_name, handle\r
782 PUBLIC          INTCOUNT,frame_count\r
783 PUBLIC          FUDLR, FUDLR_2, SND_PTR, SND_FLAG\r
784 PUBLIC          AJF1, AJF2,error_rout,errfl,cheat_mode\r
785 \r
786 ;extrn          dum_ptr:dword\r
787 extrn           nojoyflag:word,timer:word\r
788 \r
789 cheat_mode      dw      0       ;off for the moment.\r
790 \r
791 ivect9_ip       dw      0\r
792 ivect9_cs       dw      0\r
793 ivect28_ip      dw      0\r
794 ivect28_cs      dw      0\r
795 intcount        dw      0\r
796 frame_count     dw      0\r
797 \r
798 error_rout      dw      offset flg_error        ;div_err\r
799 ;       jmps short via this for a disc loading error\r
800 \r
801 keybd           db      128 dup (1)\r
802 \r
803 cht_ptr dw      offset cht_text ;start at the beginning\r
804                                 ; reset pointer by pressing f8\r
805 \r
806 cht_text        db      16h;    u whats the text ????\r
807         db      26h     ;l\r
808         db      14h     ;t\r
809         db      13h     ;r\r
810         db      1eh     ;a\r
811 \r
812         db      2fh     ;v\r
813         db      17h     ;i\r
814         db      18h     ;o\r
815         db      26h     ;l\r
816 \r
817         db      12h     ;e\r
818         db      31h     ;n\r
819         db      2eh     ;c\r
820 endtxt  db      12h     ;e\r
821 \r
822 ; 13 letters once done we can cheat ! 1-5 works and enemy has low energy.\r
823 ; lets try ultraviolence\r
824 \r
825 errfl   dw      0\r
826 start_seg       dw      0\r
827 start_offset    dw      0\r
828 len             dw      0\r
829 file_name       dw      0\r
830 handle          dw      0\r
831 in_slow         db      1\r
832 \r
833 AJF1            DB      0       ;F\r
834 AJXO1           DW      0\r
835 AJYO1           DW      0\r
836 AJXN1           DW      0\r
837 AJYN1           DW      0\r
838 AJF2            DB      0       ;F\r
839 AJXO2           DW      0\r
840 AJYO2           DW      0\r
841 AJXN2           DW      0\r
842 AJYN2           DW      0\r
843 \r
844 SND_PTR         DW      0\r
845 SND_FLAG        DW      -1              ; T\r
846 FUDLR           DB      0\r
847 FUDLR_2         DB      0\r
848 LKEY            DB      0\r
849 FIREK   DB      1\r
850 FIREJ   DB      1\r
851 \r
852 snd_tab_1       dw      0\r
853 \r
854 snd_tab_2       dw      1000, 2000, 4000, 6000, 5000, 8000, 7500, 9000, 11000\r
855                 dw      9000, 12000, 18000, 15000, 20000, 17000, 23000\r
856                 dw      0\r
857 \r
858 snd_tab_3       dw      5000, 8000, 12000, 6000, 9000, 13000, 7000, 10000\r
859                 dw      15000, 8000, 11000, 16000, 13000, 9000, 17000, 14000\r
860                 dw      15500, 19000, 20000, 18500, 23000, 27000, 31000\r
861                 dw      0\r
862 \r
863 snd_tab_4       dw      1000, 950, 900, 850, 800, 700, 600, 450, 300, 200\r
864                 dw      90, 250, 400, 650, 900, 1100, 1300, 1600, 1900, 2200\r
865                 dw      2500, 3200, 4000, 4100, 4200, 4300, 4400\r
866                 dw      0\r
867 \r
868 snd_tab_5       dw      5000, 5400, 4900, 5300, 4800, 5200, 4600, 5000\r
869                 dw      4600, 4900, 4600, 4800, 4800, 5200, 4900, 5300\r
870                 dw      5000, 5400, 5100, 5500, 5300, 5600, 5500, 5700\r
871                 dw      0\r
872 \r
873 snd_tab_6       dw      4000, 4500, 4100, 4600, 4300, 4800, 4300, 4800, 4200, 4700\r
874                 dw      4400, 4900, 4500, 5000, 4600, 5100, 4600, 5100, 4500, 5000\r
875                 dw      4400, 4900, 4500, 5000, 4800, 5300, 5000, 5500, 5200, 5700\r
876                 dw      5500, 5500, 5600, 6100, 5700, 6200, 5700, 6200, 5600, 6100\r
877                 dw      5500, 6000, 5600, 6100, 5700, 6200, 5900, 6400, 6000, 6500\r
878                 dw      6000, 6500, 6200, 6700, 6500, 7000, 6600, 7100, 6600, 7100\r
879                 dw      0\r
880 \r
881 snd_tab_7       dw      1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000\r
882                 dw      1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000\r
883                 dw      1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000\r
884                 dw      1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000\r
885                 dw      1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000\r
886                 dw      0\r
887 \r
888 snd_tab_8       dw      4000, 8000, 3500, 7500, 2700, 6700, 2000, 6000\r
889                 dw      2000, 6000, 2500, 6500, 3000, 7000, 3900, 7900\r
890                 dw      4500, 8500, 5000, 9000, 5500, 9500, 6000, 10000\r
891                 dw      6500, 10500, 7000, 11000, 7500, 11500, 8000, 12000\r
892                 dw      0\r
893 \r
894 snd_tab_9       dw      1000, 6000, 300, 9000, 5000, 12000, 1500, 5000, 400\r
895                 dw      1500, 7000, 9000, 4000, 4600, 3000, 13000, 8000, 7000\r
896                 dw      15000, 11000, 2300, 6700, 3000, 12000, 7000, 6000, 760\r
897                 dw      3000, 4000, 8000, 11000, 800, 9000, 11500, 3500, 7500\r
898                 dw      11300, 15500, 9500, 5500, 6789, 9999, 13000, 7500\r
899                 dw      0\r
900 \r
901 snd_tab_10      dw      8000, 12000, 8000, 8000, 12000, 8000, 12000, 8000\r
902                 dw      12000, 8000, 12000, 8000, 12000\r
903                 dw      0\r
904 \r
905 snd_tab_11      dw      1000, 8000, 8600, 8100, 9000, 8800, 8500, 9500, 9000\r
906                 dw      10000, 9400, 9900, 10200, 10700, 9800, 11050, 10600\r
907                 dw      12000, 11300, 11700, 13000, 11200, 11900, 12600, 13200\r
908                 dw      12800, 13400, 12900, 13300, 13700, 13400, 13900, 14000\r
909                 dw      13800, 14200, 14450, 13960, 14800, 15300, 14300, 14850\r
910                 dw      15200, 14950, 14300, 15500, 15000, 15350, 15400, 15600\r
911                 dw      16200, 16000, 15900, 16600, 16900, 17000, 16700, 17300\r
912                 dw      0\r
913 \r
914 snd_tab_12      dw      12000, 2000, 800, 700, 710, 700, 710, 700, 710, 700\r
915                 dw      710, 700, 710, 700, 710, 700, 710, 700, 710, 700\r
916                 dw      0\r
917 \r
918 snd_tab_13      dw      3000, 5000, 12000\r
919                 dw      0\r
920 \r
921 null_str db     39 dup (32),0\r
922 \r
923 disc_names      dw      offset main_str\r
924                 dw      offset main_str\r
925                 dw      offset ega_str\r
926                 dw      offset vga_str\r
927 \r
928 main_str        db      " Insert Main disc .  Then Press Space .",0\r
929 ega_str         db      " Insert EGA disc  .  Then Press Space .",0\r
930 vga_str         db      " Insert VGA disc  .  Then Press Space .",0\r
931 \r
932 \r
933 dseg            ends\r
934 \r
935 buff_seg  segment para public 'DATA'\r
936 \r
937 ;db      4096 dup (?)   ;why is there an extra 4096 bytes here !\r
938 ;                       ; there is about 30k in this area anyway !\r
939 \r
940 buff_seg  ends\r
941 \r
942         end\r
943 \r
944 cseg            segment public 'code'\r
945 \r
946 public          return, newivector, restore_int\r
947 public          load, save, create, open, writeF, error, READF, close\r
948 public          de_vice,INIT_STICKS\r
949 \r
950 extrn   delzw:near\r
951 \r
952 PUBLIC  TEST_SND\r
953 ;PUBLIC ANJOY_INIT, ANJOY_READ, ANJOY_INIT_2, ANJOY_READ_2\r
954 public  hit_snd, thud_snd, linda_snd, will_snd, colaps_snd, whip_snd\r
955 public  thumb_snd, splash_snd, splat_snd, bounce_snd, knife_snd, gun_snd\r
956 \r
957 assume          cs:cseg, ds:dseg\r
958 \r
959 include         ddeqfile\r
960 include         c:\masm\macross.asm\r
961 \r
962 return:         call    restore_int\r
963                 mov     ax, 2\r
964                 int     16\r
965                 mov     ax, 4c00h\r
966                 int     33\r
967 \r
968 newivector:     cli\r
969                 push    ds\r
970                 push    es\r
971                 mov     ax, dseg\r
972                 mov     ds, ax\r
973                 xor     ax, ax\r
974                 mov     es, ax\r
975                 mov     ax, es: [36]\r
976                 mov     ivect9_ip, ax\r
977                 mov     ax, es: [38]\r
978                 mov     ivect9_cs, ax\r
979                 mov     ax, es: [28*4]\r
980                 mov     es:[0fh*4],ax\r
981                 mov     ivect28_ip, ax\r
982                 mov     ax, es: [28*4+2]\r
983                 mov     es:[0fh*4+2],ax\r
984                 mov     ivect28_cs, ax\r
985 \r
986                 call    fast_i\r
987 \r
988                 mov     word ptr es: [36], offset scan\r
989                 mov     es: [38], cs\r
990 \r
991                 mov     word ptr es: [28*4], offset timer_int\r
992                 mov     es: [28*4+2], cs\r
993                 MOV     FIREJ,1\r
994                 MOV     FIREK,1\r
995         mov     dx,201h\r
996         out     dx,al\r
997         sti\r
998                 pop     es\r
999                 pop     ds\r
1000                 ret\r
1001 \r
1002 \r
1003 START_SOUND:\r
1004                 CMP     SND_FLAG, 0\r
1005                 JE      NO_SOUND\r
1006 \r
1007                 MOV     AL,0B6H                 ; init spkr timer\r
1008                 OUT     43H, AL\r
1009                 IN      AL, 61H\r
1010                 OR      AL, 3\r
1011                 OUT     61H, AL\r
1012                 RET\r
1013 NO_SOUND:\r
1014                 MOV     SND_PTR, 0\r
1015                 RET\r
1016 \r
1017 scan:\r
1018                 push    ax\r
1019                 push    bx\r
1020                 push    ds\r
1021                 mov     ax, dseg\r
1022                 mov     ds, ax\r
1023 \r
1024                 in      al, 60h\r
1025                 mov     bl, al\r
1026                 in      al, 61h\r
1027                 or      al, 80h\r
1028                 out     61h, al\r
1029                 and     al, 7fh\r
1030                 out     61h, al\r
1031 \r
1032                 xor     al, al\r
1033                 mov     bh, al\r
1034                 shl     bl, 1\r
1035                 rcl     al, 1\r
1036                 shr     bl, 1\r
1037                 mov     [keybd + bx], al\r
1038                 CMP     BX,FIRE_K\r
1039                 JNE     NF1\r
1040                 MOV     FIREK,AL        ;STORE THE REAL FIRE KEY\r
1041 NF1:\r
1042                 CMP     BX,FIRE_J\r
1043                 JNE     NF2     \r
1044                 MOV     FIREJ,AL        ;STORE THE REAL FIRE KEY\r
1045 NF2:\r
1046                 mov     al, 61h\r
1047                 out     20h, al\r
1048 \r
1049                 pop     ds\r
1050                 pop     bx\r
1051                 pop     ax\r
1052                 sti\r
1053                 iret\r
1054 loadit:\r
1055         push    nojoyflag\r
1056         mov     nojoyflag,-1    ;kill sticks ?\r
1057                 call    open\r
1058                 call    READF\r
1059                 call    close\r
1060         pop     nojoyflag\r
1061                 ret\r
1062 save:\r
1063                 call    create\r
1064                 call    writeF\r
1065                 call    close\r
1066                 ret\r
1067 create:         mov     dx, file_name\r
1068                 xor     cx, cx\r
1069                 mov     al, 2\r
1070                 mov     ah, 3ch                 ; function 3c - create file\r
1071                 int     33\r
1072                 jc      error\r
1073                 mov     handle, ax\r
1074                 ret\r
1075 ;           open a file for READFing\r
1076 \r
1077 open:           mov     ah,13\r
1078                 int     21h\r
1079                 mov     dx, file_name\r
1080                 xor     al, al\r
1081                 mov     ah, 3dh                 ; function 3d - open file\r
1082                 int     33\r
1083                 jc      error\r
1084                 mov     handle, ax\r
1085                 ret\r
1086 ;            write to file\r
1087 \r
1088 writeF:         mov     ax, start_seg\r
1089                 mov     bx, handle\r
1090                 mov     cx, len\r
1091                 mov     dx, start_offset\r
1092                 push    ds\r
1093                 mov     ds, ax\r
1094                 mov     ah, 40h                 ; function 40 - write file\r
1095                 int     33\r
1096                 pop     ds\r
1097                 jc      error\r
1098                 ret\r
1099 ; print up the error message\r
1100 \r
1101 error:          \r
1102                 call    restore_int\r
1103                 int     0\r
1104                 mov     ax, 4c00h\r
1105                 int     33\r
1106 \r
1107 ;          read a file\r
1108 \r
1109 READF:          mov     ah,13\r
1110                 int     21h\r
1111                 mov     ax, start_seg\r
1112                 mov     bx, handle\r
1113                 mov     cx, 0ffffh\r
1114                 mov     dx, start_offset\r
1115                 push    ds\r
1116                 mov     ds, ax\r
1117                 mov     ah, 3fh                 ; function 3f - read file\r
1118                 int     33\r
1119                 pop     ds\r
1120                 jc      error\r
1121                 ret\r
1122 \r
1123 close:          mov     bx, handle\r
1124                 mov     ah, 3eh                 ; function 3e - close file\r
1125                 int     33\r
1126                 jc      error\r
1127                 ret\r
1128 \r
1129 load:\r
1130         call    slow_i\r
1131 de_vice:\r
1132 ;load the file into a buffer area and then decompress to load area\r
1133         push    es\r
1134         push    ds\r
1135 \r
1136         push    start_seg\r
1137         push    start_offset\r
1138 \r
1139         xor     ax,ax\r
1140         mov     start_offset,ax\r
1141 ;       mov     ax,word ptr [dum_ptr+2]\r
1142 ;       add     ax,4096 ;+64k\r
1143         mov     ax,buff_seg\r
1144         mov     start_seg,ax\r
1145 ;load into free memory (hopefully!)\r
1146         call    loadit  ;loads into normal space ?\r
1147         pop     di      ;start_offset\r
1148         pop     es      ;start_seg\r
1149 ;those are destination for deviceing\r
1150         xor     si,si\r
1151         mov     ax,start_seg\r
1152         mov     ds,ax\r
1153         call    delzw   ;decompress from DS:SI to ES:DI\r
1154 \r
1155         pop     ds\r
1156         pop     es\r
1157 \r
1158         call    fast_i\r
1159 \r
1160         ret\r
1161 \r
1162 ;ASSUME NO STICK BUT WHEN A BUTTON IS PRESSED INITIATE THE JOYSTICK\r
1163 ;The Tandy joystick routines from Jake\r
1164 \r
1165 ANJOY_START_2:\r
1166 ;CLI                    ; NOTE !!!\r
1167                 MOV     DX, 201H\r
1168                 OUT     DX, AL\r
1169                 NOP\r
1170                 NOP\r
1171                 MOV     BX, 0\r
1172                 MOV     CX, 0\r
1173 AJS_ALP:\r
1174                 IN      AL, DX\r
1175                 INC     BX\r
1176                 INC     CX\r
1177                 TEST    AL, 1\r
1178                 JZ      AJS_YLP_A\r
1179                 TEST    AL, 2\r
1180                 JZ      AJS_XLP_A\r
1181                 CMP     CX, 1000\r
1182                 JL      AJS_ALP\r
1183                 JMP     AJS_TO          ; for time-out\r
1184 AJS_XLP:\r
1185                 ; Y done - just count x\r
1186                 IN      AL, DX\r
1187                 INC     BX\r
1188                 NOP\r
1189                 NOP\r
1190                 NOP                     ; adjust timing\r
1191                 NOP\r
1192                 NOP\r
1193                 CMP     BX, 1000        ;0      ; for time-out\r
1194                 JGE     AJS_TO\r
1195 AJS_XLP_A:\r
1196                 TEST    AL, 1\r
1197                 JNZ     AJS_XLP\r
1198 ;STI\r
1199                 RET\r
1200 AJS_YLP:\r
1201                 ; X done - just count y\r
1202                 IN      AL, DX\r
1203                 INC     CX\r
1204                 NOP\r
1205                 NOP\r
1206                 NOP\r
1207                 NOP\r
1208                 NOP\r
1209                 CMP     CX, 1000        ;0\r
1210                 JGE     AJS_TO\r
1211 AJS_YLP_A:\r
1212                 TEST    AL, 2\r
1213                 JNZ     AJS_YLP\r
1214 ;STI\r
1215                 RET\r
1216 AJS_TO:\r
1217 ; time-out      SHOULDNT IT MAKE THE JOY FLAG FALSE ?\r
1218                 MOV     AJF1, 0         ; F\r
1219 ;STI\r
1220                 RET\r
1221 \r
1222                 \r
1223 ANJOY_INIT_2:\r
1224                 MOV     AJF1,1\r
1225                 CALL    ANJOY_START_2\r
1226                 CMP     AJF1, 0\r
1227                 JE      E_AJI\r
1228                 MOV     AJXO1, BX       ; x-origin\r
1229                 MOV     AJXN1, BX\r
1230                 SHR     BX, 1           ; calc x-nullzone\r
1231                 SUB     AJXN1, BX\r
1232                 MOV     AJYO1, CX       ; Y-origin\r
1233                 MOV     AJYN1, CX\r
1234                 SHR     CX, 1\r
1235                 SUB     AJYN1, CX       ; Y-nullzone\r
1236 E_AJI:\r
1237                 RET\r
1238 \r
1239 \r
1240 ANJOY_READ_2:\r
1241         MOV     FUDLR,31\r
1242                 CMP     AJF1, 0\r
1243                 JE      E_ANJR1\r
1244                 CALL    ANJOY_START_2\r
1245                 CMP     AJF1, 0\r
1246                 JE      E_ANJR1\r
1247         MOV     DL,FIREK\r
1248         MOV     KEYBD+FIRE_K,DL\r
1249                 MOV     DL,0\r
1250                 NOT     AL\r
1251                 TEST    AL,030H ; both buttons\r
1252                 JZ      N_ANJF1\r
1253         MOV     BYTE PTR KEYBD+FIRE_K,0\r
1254 N_ANJF1:\r
1255                 SUB     BX, AJXO1\r
1256                 MOV     AX, AJXN1\r
1257                 CMP     BX, AX\r
1258                 JL      N_R1\r
1259                 OR      DL, 1           ; R bit\r
1260 N_R1:\r
1261                 NEG     AX\r
1262                 CMP     BX, AX\r
1263                 JG      N_L1\r
1264                 OR      DL, 2           ; L bit\r
1265 N_L1:\r
1266                 SUB     CX, AJYO1\r
1267                 MOV     AX, AJYN1\r
1268                 CMP     CX, AX\r
1269                 JL      N_D1\r
1270                 OR      DL, 4           ; D bit\r
1271 N_D1:\r
1272                 NEG     AX\r
1273                 CMP     CX, AX\r
1274                 JG      N_U1\r
1275                 OR      DL, 8           ; U bit\r
1276 N_U1:\r
1277                 XOR     DL,31\r
1278                 MOV     FUDLR, DL\r
1279 E_ANJR1:        RET\r
1280 \r
1281 ANJOY_START:\r
1282 ;CLI                    ; NOTE !!!\r
1283                 MOV     DX, 201H\r
1284                 OUT     DX, AL\r
1285                 NOP\r
1286                 NOP\r
1287                 MOV     BX, 0\r
1288                 MOV     CX, 0\r
1289 AJS2_ALP:\r
1290                 IN      AL,DX\r
1291                 INC     BX\r
1292                 INC     CX\r
1293                 TEST    AL, 4\r
1294                 JZ      AJS2_YLP_A\r
1295                 TEST    AL, 8\r
1296                 JZ      AJS2_XLP_A\r
1297                 CMP     CX, 1000\r
1298                 JL      AJS2_ALP\r
1299                 JMP     AJS2_TO         ; for time-out\r
1300 AJS2_XLP:\r
1301                 ; Y done - just count x\r
1302                 IN      AL, DX\r
1303                 INC     BX\r
1304                 NOP\r
1305                 NOP\r
1306                 NOP                     ; adjust timing\r
1307                 NOP\r
1308                 NOP\r
1309                 CMP     BX, 1000        ;0      ; for time-out\r
1310                 JGE     AJS2_TO\r
1311 AJS2_XLP_A:\r
1312                 TEST    AL, 4\r
1313                 JNZ     AJS2_XLP\r
1314 ;STI    no need off already !\r
1315                 RET\r
1316 AJS2_YLP:\r
1317                 ; X done - just count y\r
1318                 IN      AL, DX\r
1319                 INC     CX\r
1320                 NOP\r
1321                 NOP\r
1322                 NOP\r
1323                 NOP\r
1324                 NOP\r
1325                 CMP     CX, 1000        ;0\r
1326                 JGE     AJS2_TO\r
1327 AJS2_YLP_A:\r
1328                 TEST    AL, 8\r
1329                 JNZ     AJS2_YLP\r
1330 ;STI\r
1331                 RET\r
1332 AJS2_TO:        ; time-out\r
1333                 MOV     AJF2, 0         ; F\r
1334 ;STI\r
1335                 RET\r
1336                 \r
1337 ANJOY_INIT:\r
1338                 MOV     AJF2,1  ;ASSUME JOYSTICK PRESENT\r
1339                 CALL    ANJOY_START\r
1340                 CMP     AJF2, 0\r
1341                 JE      E_AJI2\r
1342                 MOV     AJXO2, BX       ; x-origin\r
1343                 MOV     AJXN2, BX\r
1344                 SHR     BX, 1           ; calc x-nullzone\r
1345                 SUB     AJXN2, BX\r
1346                 MOV     AJYO2, CX       ; Y-origin\r
1347                 MOV     AJYN2, CX\r
1348                 SHR     CX, 1\r
1349                 SUB     AJYN2, CX       ; Y-nullzone\r
1350 E_AJI2:\r
1351                 RET\r
1352 \r
1353 ANJOY_READ:\r
1354         MOV     FUDLR_2,31\r
1355                 CMP     AJF2, 0\r
1356                 JE      E_ANJR2\r
1357                 CALL    ANJOY_START\r
1358                 CMP     AJF2, 0\r
1359                 JE      E_ANJR2\r
1360         MOV     DL,FIREJ\r
1361         MOV     KEYBD+FIRE_J,DL\r
1362                 MOV     DL, 0\r
1363                 NOT     AL\r
1364                 TEST    AL, 0C0H        ; both buttons\r
1365                 JZ      N_ANJF2\r
1366         MOV     BYTE PTR KEYBD+FIRE_J,0\r
1367 N_ANJF2:\r
1368                 SUB     BX, AJXO2\r
1369                 MOV     AX, AJXN2\r
1370                 CMP     BX, AX\r
1371                 JL      N_R2\r
1372                 OR      DL, 1           ; R bit\r
1373 N_R2:\r
1374                 NEG     AX\r
1375                 CMP     BX, AX\r
1376                 JG      N_L2\r
1377                 OR      DL, 2           ; L bit\r
1378 N_L2:\r
1379                 SUB     CX, AJYO2\r
1380                 MOV     AX, AJYN2\r
1381                 CMP     CX, AX\r
1382                 JL      N_D2\r
1383                 OR      DL, 4           ; D bit\r
1384 N_D2:\r
1385                 NEG     AX\r
1386                 CMP     CX, AX\r
1387                 JG      N_U2\r
1388                 OR      DL, 8           ; U bit\r
1389 N_U2:\r
1390                 XOR     DL,31\r
1391                 MOV     FUDLR_2, DL\r
1392 E_ANJR2:\r
1393                 RET\r
1394         \r
1395 cseg            ends\r
1396 \r
1397 \1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a