openpgp: 8A48C6AC
[www.jankratochvil.net.git] / project / PortDiag / PortDiag.asm
1 ;###############################################
2 ;### SPECIAL WARNING FOR NORMAL PROGRAMMERS: ###
3 ;###############################################
4 ;###### Please don't read this source !!! ######
5 ;##### It is completely ALTERNATIVELY made #####
6 ;### from scratch. Reading such thing may and ##
7 ;### possibly WILL leave permanent damage to ###
8 ;################ your _mind_. #################
9 ;##### Special recommendation for Lemming. #####
10 ;###############################################
11
12 ;DEBUG  equ     1
13
14         include "ssmac.h"
15
16 WARN_DDR_MASK   equ     $FFF800FF
17 WARN_PR_MASK    equ     $00000001
18
19 ciaa    equ     $bfe001
20 ciab    equ     $bfd000
21 CIABaseA4       equ     ciab
22 BaseA4  equ     $dff000
23 TEXT_PEN        equ     1
24 BGND_PEN        equ     0
25
26         dv.b    ST_joy0daty
27         dv.b    ST_joy0datx
28         dv.b    ST_joy1daty
29         dv.b    ST_joy1datx
30         dv.b    ST_pot0daty
31         dv.b    ST_pot0datx
32         dv.b    ST_pot1daty
33         dv.b    ST_pot1datx
34         dv.l    DefCIAIO
35         dv.l    SigMask
36         dv.l    MyWindow
37         dv.l    StdFont
38         dv.l    potgobase
39         dv.l    diskbase
40         dv.l    miscbase
41         dv.l    OrigWPtr
42         dv.l    VisualInfo
43         dv.w    GameAlloced
44         dbuf    ScrTitBuf,80
45         dv.b    CleanServ
46         dv.b    Signaled
47         dv.b    InitCounters
48         dv.b    DiskAlloc
49         dv.b    PortAdd
50
51         start
52
53         move.l  4.w,a6
54         addq.b  #1,TDNestCnt(a6)
55         gett    RzPortName,a1
56         call    FindPort
57         tst.l   d0
58         beq.s   NoPortFound
59         move.l  d0,a1
60         move.l  MP_SIGTASK(a1),a1
61         moveq   #1<<6,d0
62         rol.l   #8,d0
63         call    Signal
64         call    Permit
65         dtl     <Already running>,a0
66         bra.s   SSExitError
67         
68 NoPortFound     lea     RzPort(pc),a1
69         move.l  ThisTask(a6),MP_SIGTASK(a1)
70         call    AddPort
71         call    Permit
72         stv     PortAdd
73         lea     StdAttr(pc),a0
74         call    gfx,OpenFont
75         put.l   d0,StdFont
76         beq.s   OpenWinFail
77         dtl     <disk.resource>,a1
78         call    exec,OpenResource
79         put.l   d0,diskbase
80         beq.s   OpenWinFail
81         dtl     <misc.resource>,a1
82         call    OpenResource
83         put.l   d0,miscbase
84         beq.s   OpenWinFail
85         sub.l   a0,a0
86         call    intuition,LockPubScreen
87         move.l  d0,ScrLock
88         bne.s   LockScrOK
89 OpenWinFail     dtl     <Cannot open window>,a0
90 SSExitError     jump    ss,ExitError
91
92 LockScrOK       move.l  d0,a0
93         sub.l   a1,a1
94         call    gadtools,GetVisualInfoA
95         put.l   d0,VisualInfo
96         beq.s   OpenWinFail
97         move.l  d0,d5
98         lea     AGamePort(pc),a0
99         call    CreateContext
100         lea     GNGadgets(pc),a3
101         clr.l   -(sp)
102         clr.l   -(sp)
103         push    #GA_Immediate
104 GGNG_Loop       tst.l   d0
105         beq.s   OpenWinFail
106         move.l  d0,a0
107         move.l  a3,a1
108         tst.b   gng_GadgetID+1(a1)
109         bmi.s   GGNG_Skip
110         move.l  sp,4(sp)
111 GGNG_Skip       lea     gng_VisualInfo(a3),a3
112         move.l  d5,(a3)+
113         moveq   #BUTTON_KIND,d0
114         move.l  sp,a2
115         call    CreateGadgetA
116         tst.w   (a3)
117         bne.s   GGNG_Loop
118         tst.l   d0
119         beq.s   OpenWinFail
120         lea     1*8+4(sp),sp
121         lea     NewMyWindow(pc),a0
122 ;;;     move.w  #CUSTOMSCREEN,nw_Type(a0)
123         clr.l   -(sp)
124         dt      ScrTitle,<PortDiag - Copyright (c) 1995 Short Software ',60,'short@k332.feld.cvut.cz',62,'>
125         tpea    ScrTitle
126         push    #WA_ScreenTitle
127         push    sp
128         push    #WA_AutoAdjust
129         moveq   #0,d0
130         move.w  NewMyWindow+nw_Width(pc),d0
131         push    d0
132         push    #WA_InnerWidth
133         move.w  NewMyWindow+nw_Height(pc),d0
134         push    d0
135         push    #WA_InnerHeight
136         move.l  sp,a1
137         call    intuition,OpenWindowTagList
138         put.l   d0,MyWindow
139         beq     OpenWinFail
140         get.l   sv_thistask,a0
141         put.l   pr_WindowPtr(a0),OrigWPtr
142         move.l  d0,pr_WindowPtr(a0)
143         lea     4*8+4(sp),sp
144         move.l  d0,a0
145         move.l  wd_UserPort(a0),d6
146         move.l  wd_RPort(a0),d2
147         sub.l   a1,a1
148         call    gadtools,GT_RefreshWindow
149         lea     BorList(pc),a2
150         move.w  (a2)+,d0
151         get.l   intuitionbase,a6
152 NextBorder      lea     (a2,d0.w),a1
153         move.l  d2,a0
154         moveq   #0,d0
155         moveq   #0,d1
156         call    DrawBorder
157         move.w  (a2)+,d0
158         bne.s   NextBorder
159         get.l   StdFont,a0
160         move.l  d2,a1
161         call    gfx,SetFont
162         move.l  d2,a0
163         lea     MyWinITexts(pc),a1
164         moveq   #0,d0
165         moveq   #0,d1
166         call    intuition,PrintIText
167         dtl     <potgo.resource>,a1
168         call    exec,OpenResource
169         put.l   d0,potgobase
170         beq     OpenWinFail
171         get.l   intuitionbase,a6
172         bsr     ActivateScreen
173         call    ss,TrackSignal
174         moveq   #0,d2
175         bset    d0,d2
176         put.l   d2,SigMask
177         move.l  CIABaseA4Ptr(pc),a4
178         move.b  ciaa+ciaddra-CIABaseA4(a4),d0
179         rol.w   #8,d0
180         move.b  ciaa+ciaddrb-CIABaseA4(a4),d0
181         rol.l   #8,d0
182         move.b  ciab+ciaddra-CIABaseA4(a4),d0
183         rol.l   #8,d0
184         move.b  ciab+ciaddrb-CIABaseA4(a4),d0
185         put.l   d0,DefCIAIO
186         stv.b   CleanServ
187         moveq   #INTB_VERTB,d0
188         lea     IntStruct(pc),a1
189         move.l  v,IS_DATA(a1)
190         call    exec,AddIntServer
191 LoopIDCMP       lea     SetSelected(pc),a1
192         bsr     DoRoutUpdate
193         get.l   MyWindow,a2
194         move.l  wd_RPort(a2),d3
195         move.l  d3,a1
196         moveq   #TEXT_PEN,d0
197         call    gfx,SetAPen
198         move.l  d3,a1
199         moveq   #BGND_PEN,d0
200         call    SetBPen
201         move.l  joy0dat(a4),d2
202         geta    ST_joy0daty,a0
203         moveq   #64,d0
204         moveq   #125,d1
205         lea     G12l+gg_GadgetID(pc),a2
206         lea     G12r+gg_GadgetID(pc),a3
207         bsr     ProcCounterLR   ;joy0daty
208         moveq   #64,d0
209         moveq   #114,d1
210         lea     G11l+gg_GadgetID(pc),a2
211         lea     G11r+gg_GadgetID(pc),a3
212         bsr     ProcCounterLR   ;joy0datx
213         move.w  #216,d0
214         moveq   #125,d1
215         lea     G22l+gg_GadgetID(pc),a2
216         lea     G22r+gg_GadgetID(pc),a3
217         bsr     ProcCounterLR   ;joy1daty
218         move.w  #216,d0
219         moveq   #114,d1
220         lea     G21l+gg_GadgetID(pc),a2
221         lea     G21r+gg_GadgetID(pc),a3
222         bsr     ProcCounterLR   ;joy1datx
223         move.l  pot0dat(a4),d2
224         moveq   #64,d0
225         move.w  #147,d1
226         bsr.s   ProcCounter     ;pot0daty
227         moveq   #64,d0
228         move.w  #136,d1
229         bsr.s   ProcCounter     ;pot0datx
230         move.w  #216,d0
231         move.w  #147,d1
232         bsr.s   ProcCounter     ;pot1daty
233         move.w  #216,d0
234         move.w  #136,d1
235         bsr.s   ProcCounter     ;pot1datx
236         stv.b   InitCounters
237         clrv.b  Signaled
238         get.l   SigMask,d0
239         move.l  d6,a0
240         move.b  MP_SIGBIT(a0),d1
241         bset    d1,d0
242         or.w    #SIGBREAKF_CTRL_C!SIGBREAKF_CTRL_E,d0
243         call    exec,Wait
244         btst    #SIGBREAKB_CTRL_C,d0
245         beq.s   TestFlagE
246 SSReportBreak   moveq   #err_break,d0
247 SSReportError   jump    ss,ReportError
248
249
250 PC_Return       tstv.b  InitCounters
251         beq.s   PC_Cont
252         cmp.l   d0,d0
253         rts
254
255 ProcCounter     rol.l   #8,d2
256         cmp.b   (a0)+,d2
257         beq.s   PC_Return
258 PC_Cont move.l  a0,d5
259         move.b  d2,-(a0)
260         move.l  d3,a1
261         call    Move
262         move.l  d3,a1
263         moveq   #RP_JAM2,d0
264         call    SetDrMd
265         moveq   #0,d0
266         move.b  d2,d0
267         move.w  d0,-(sp)
268         move.l  sp,a1
269         subq    #4,sp
270         move.l  a2,d4
271         move.l  sp,a2
272         dtl     <%02x>,a0
273         call    ss,FormatStr
274         move.l  d4,a2
275         move.l  d3,a1
276         move.l  sp,a0
277         moveq   #2,d0
278         call    gfx,Text
279         addq    #6,sp
280         move.l  d5,a0
281         move.l  sp,d0
282 Return2 rts
283
284 ActivateScreen  move.l  ScrLock(pc),a0
285         jump    ScreenToFront
286
287 TestFlagE       btst    #SIGBREAKB_CTRL_E,d0
288         beq.s   RetryIDCMP
289         get.l   MyWindow,a0
290         call    intuition,ActivateWindow
291         get.l   MyWindow,a0
292         call    WindowToFront
293         bsr.s   ActivateScreen
294 RetryIDCMP      move.l  d6,a0
295         call    gadtools,GT_GetIMsg
296         tst.l   d0
297         beq     LoopIDCMP
298         move.l  d0,a1
299         movem.l im_Class(a1),d2/d3/a3
300         call    GT_ReplyIMsg
301         btst    #9,d2   ;bit(IDCMP_CLOSEWINDOW)
302         bne.s   Return2
303         moveq   #0,d0
304         move.l  CIABaseA4Ptr(pc),a4
305         btst    #6,d2   ;bit(IDCMP_GADGETUP)
306         beq.s   NoGadUp
307         move.b  gg_GadgetID+1(a3),d0
308         addq.b  #4,d0
309         bcc.s   RetryIDCMP
310         move.b  DefCIAIO(v,d0.w),d1
311         add.w   d0,d0
312         add.w   CIAddrTab(pc,d0.w),a4
313         move.b  d1,(a4)
314 SafeSetCIA      nop
315         move.b  (a4),(a4)
316         bra.s   RetryIDCMP
317
318 CIAprTab        dc.w    ciaa+ciapra-CIABaseA4
319         dc.w    ciaa+ciaprb-CIABaseA4
320         dc.w    ciab+ciapra-CIABaseA4
321         dc.w    ciab+ciaprb-CIABaseA4
322 CIAddrTab       dc.w    ciaa+ciaddra-CIABaseA4
323         dc.w    ciaa+ciaddrb-CIABaseA4
324         dc.w    ciab+ciaddra-CIABaseA4
325         dc.w    ciab+ciaddrb-CIABaseA4
326 CIAEndTab
327
328 NoGadUp btst    #5,d2   ;bit(IDCMP_GADGETDOWN)
329         beq.s   RetryIDCMP
330         move.b  gg_GadgetID+1(a3),d0
331         beq.s   RetryIDCMP
332         subq.b  #1,d0
333         cmp.b   #64,d0
334         bcc.s   OtherButtonDown
335         move.w  d0,d1
336         lsr.w   #3,d0
337         add.w   d0,d0
338         lea     Warn_DDR_Mask(pc),a0
339         subq.w  #8,d0
340         bcc.s   ItsddrChange
341         addq    #4,a0
342         move.w  CIAEndTab(pc,d0.w),d2
343         btst    d1,(a4,d2.w)
344         bne.s   ItsddrChange
345 CallScrBeep     bsr.s   DoScrBeep
346         bra     RetryIDCMP
347
348 DoScrBeep       move.l  ScrLock(pc),a0  ;(#66)
349         jump    intuition,DisplayBeep
350
351 ItsddrChange    tstv.l  Arg_Force
352         bne.s   NoWarnBit
353         move.l  (a0),d3
354         btst    d1,d3
355         beq.s   NoWarnBit
356         mpush   d0/d1/a0
357         dtl.lc  <WARNING:  You are attempting to change a bit>,a0
358         dt.lc   <which may cause permanent hardware damage or>
359         dt.lc   <unconditional immediate system crash!>
360         dt.lc   <>
361         dt.lc   <This is not a common warning as in many other programs:>
362         dt.lc   <THIS REALLY _MIGHT_ DESTROY YOUR MACHINE!!!>
363         dt.lc   <>
364         dt.lc   <And remember:  The author is not responsible for>
365         dt.l    <any damage caused by this (any ;-) ) software!>
366         dtl     <Change it|Oh no, forget it!>,a2
367         call    ss,SimpleRequest
368         subq.l  #1,d0
369         mpop    d0/d1/a0
370         bne     RetryIDCMP
371         bclr    d1,d3
372         move.l  d3,(a0)
373 NoWarnBit       add.w   CIAddrTab(pc,d0.w),a4
374         bchg    d1,(a4)
375         bra     SafeSetCIA
376
377 Warn_DDR_Mask   dc.l    WARN_DDR_MASK,WARN_PR_MASK
378
379 OtherButtonDown bne.s   NoWritePotgo
380 ;+++ Pressed "Start potgo" +++ (#65)
381         moveq   #1,d0   ;START
382         moveq   #1,d1   ;START
383         call    potgo,WritePotgo
384         bra     RetryIDCMP
385
386 NoWritePotgo    sub.b   #66,d0
387         bmi.s   CallScrBeep
388         bne.s   NoTXD
389         opt     nochkimm                ;(#67)
390         move.b  adkconr+BaseA4,d0
391         opt     chkimm
392         and.b   #ADKF_UARTBRK>>8,d0
393         bchg    #ADKB_UARTBRK-8,d0
394         lsl.b   #4,d0
395         bset    #ADKB_UARTBRK-8,d0
396         opt     nochkimm
397         move.b  d0,adkcon+BaseA4
398         opt     chkimm
399         bra     RetryIDCMP
400
401 NoTXD   subq.b  #1,d0
402         cmp.b   #8,d0
403         bcc.s   NoPotgoBits
404         moveq   #0,d1           ;(#68)..(#75)
405         bset    d0,d1
406         rol.w   #8,d1
407         get.l   potgobase,a6
408         move.w  $28(a6),d0
409         and.w   d1,d0
410         eor.w   d1,d0
411         call    WritePotgo
412         bra     RetryIDCMP
413
414 NoPotgoBits     subq.b  #8,d0
415         bne     NoASerial
416         moveq   #MR_SERIALPORT,d2
417         lea     ASerial+gg_GadgetID(pc),a2
418         dtl     <Seria>,a3
419 DoAParallel     move.l  a2,d7
420         bsr.s   ClearScrTit
421         geta    ScrTitBuf,a0
422 CopySerParName  move.b  (a3)+,(a0)+
423         bne.s   CopySerParName
424         lea     6(a0),a4
425         subq    #1,a0
426         dtl     <l port grab error, owned by >,a1
427 CopySerParSuff  move.b  (a1)+,(a0)+
428         bne.s   CopySerParSuff
429         move.l  d7,a2
430         tst.b   (a2)
431         bne.s   DoFreeSerPar
432         lea     -1(a0),a3
433         bsr.s   SerParHalf
434         addq.l  #1,d2
435         bsr.s   SerParHalf
436         dtl     <allocated.>,a0
437         moveq   #-1,d0
438         move.l  d7,a2
439 CopySerParSucc  move.b  (a0)+,(a4)+
440         bne.s   CopySerParSucc
441         bsr     SetSelected
442         bra.s   DoScrWinTitle
443
444 ClearScrTit     get.l   MyWindow,a0
445         moveq   #-1,d0
446         move.l  d0,a1
447         sub.l   a2,a2
448         jump    intuition,SetWindowTitles
449
450 DoFreeSerPar    bsr.s   FreeSerParRout
451         gett    GivenSys,a0
452         moveq   #0,d0
453         bra.s   CopySerParSucc
454
455 SerParHalf      move.l  d2,d0
456         lea     IntName(pc),a1
457         move.l  4.w,a0
458         addq.b  #1,TDNestCnt(a0)
459         call    misc,AllocMiscResource
460         tst.l   d0
461         beq.s   JumpExecPermit
462         move.l  d0,a0
463         moveq   #31,d0
464 CopyLimName     move.b  (a0)+,(a3)+
465         dbeq    d0,CopyLimName
466         clr.b   (a3)
467         bsr.s   JumpExecPermit
468         move.l  d2,d0
469         and.b   #~1,d0
470         cmp.l   d0,d2
471         beq.s   DontFreeRest
472         bsr.s   JumpMiscFree
473 DontFreeRest    addq    #4,sp
474         bsr     DoScrBeep
475 DoScrWinTitle   geta    ScrTitBuf,a2
476         bra     DoScrTitle
477
478 FreeSerParRout  move.l  d2,d0
479         bsr.s   JumpMiscFree
480         move.l  d2,d0
481         addq.l  #1,d0
482 JumpMiscFree    jump    misc,FreeMiscResource
483
484 JumpExecPermit  jump    exec,Permit
485
486 NoASerial       moveq   #MR_PARALLELPORT,d2
487         lea     AParallel+gg_GadgetID(pc),a2
488         dtl     <Paralle>,a3
489         subq.b  #2,d0
490         bcs     DoAParallel
491         bne     NoADisk
492         lea     ADisk+gg_GadgetID(pc),a2
493         tst.b   (a2)
494         bne     ADiskDoFree
495         move.l  a2,d7
496         get.l   MyWindow,a0
497         get.l   intuitionbase,a6
498         cmp.w   #39,LIB_VERSION(a6)
499         bcs.s   StupidGfx2
500         move.l  a0,a3
501         clr.l   -(sp)
502         push    sp
503         push    #WA_BusyPointer
504         push    sp
505         push    #WA_PointerDelay
506         move.l  sp,a1
507         call    SetWindowPointerA
508         move.l  a3,a0
509 StupidGfx2      moveq   #-1,d4
510         move.l  d4,a1
511         dtl     <Allocating disk...>,a2
512         call    SetWindowTitles
513         get.l   diskbase,a6
514         moveq   #3,d2
515 LoopADiskUnit   move.l  d2,d0
516         call    AllocUnit
517         tst.l   d0
518         sne     d1
519         move.b  d1,d0
520         roxr.b  #1,d0
521         roxl.b  #1,d3
522         bsr     PushSw
523         dbra    d2,LoopADiskUnit
524         put.b   d3,DiskAlloc
525         get.l   sv_thistask,a2
526         lea     pr_MsgPort(a2),a2
527 RetryGetUnit    lea     DRUnit(pc),a1
528         move.l  a2,a0
529         move.l  a0,MN_REPLYPORT(a1)
530         call    disk,GetUnit
531         tst.l   d0
532         bne.s   GotUnit
533         move.l  4.w,a6
534 RetryGiveReply  move.l  a2,a0
535         call    WaitPort
536         move.l  a2,a0
537         call    GetMsg
538         tst.l   d0
539         beq.s   RetryGiveReply
540         bra.s   RetryGetUnit
541
542 GotUnit move.l  d7,a2
543         moveq   #-1,d0
544         bsr     SetSelected
545         dtl     <Disk control hardware allocated; Units: 0 - %s, 1 - %s, 2 - %s, 3 - %s>,a0
546         move.l  sp,a1
547         geta    ScrTitBuf,a2
548         call    ss,FormatStr
549         lea     4*4(sp),sp
550         get.l   intuitionbase,a6
551         cmp.w   #39,LIB_VERSION(a6)
552         bcs.s   SetTitnRet
553         clr.l   -(sp)
554         clr.l   -(sp)
555         push    #WA_Pointer
556         move.l  a3,a0
557         move.l  sp,a1
558         call    SetWindowPointerA
559         lea     (1*8+4)+(2*8+4)(sp),sp
560 SetTitnRet      get.l   MyWindow,a0
561         move.l  d4,a1
562         call    SetWindowTitles
563         bra     RetryIDCMP
564
565 ADiskDoFree     bsr     FreeDiskRes
566         moveq   #0,d0
567         bsr     SetSelected
568         dtl.c   <Disk completely >,a2
569         dt      GivenSys,<given to system.>
570 DoScrTitle      get.l   intuitionbase,a6
571         moveq   #-1,d4
572         bra.s   SetTitnRet
573
574 NoADisk subq.b  #1,d0
575         bne     RetryIDCMP
576         lea     AGamePort+gg_GadgetID(pc),a2
577         get.l   potgobase,a6
578         tst.b   (a2)
579         bne.s   ADoFreeGame
580         move.w  #$5501,d0
581         move.w  d0,d2
582         call    AllocPotBits
583         and.w   d2,d0
584         beq.s   AGameFailed
585         put.w   d0,GameAlloced
586         moveq   #4,d2
587         ror.w   #2,d0
588 LoopPushRol     bsr.s   PushRolSw
589         dbra    d2,LoopPushRol
590         moveq   #-1,d0
591         bsr     SetSelected
592         bsr     ClearScrTit
593         dtl     <Game Port 1: A - %s, B - %s; Game Port 2: A - %s, B - %s; Start - %s>,a0
594         move.l  sp,a1
595         geta    ScrTitBuf,a2
596         call    ss,FormatStr
597         lea     5*4(sp),sp
598         bra.s   DoScrTitle
599
600 PushRolSw       rol.w   #2,d0
601         scs     d1
602 PushSw  neg.b   d1
603         ext.w   d1
604         lsl.w   #2,d1
605         dt      <Yes>
606         dt      NoMsg,<No>
607         gett    NoMsg,a0
608         sub.w   d1,a0
609         move.l  (sp),a1
610         move.l  a0,(sp)
611         jmp     (a1)
612
613 AGameFailed     bsr     DoScrBeep
614         dtl     <Game Ports are fully allocated!>,a2
615         bra.s   DoScrTitle
616
617 ADoFreeGame     get.w   GameAlloced,d0
618         clrv.w  GameAlloced
619         call    FreePotBits
620         moveq   #0,d0
621         bsr     SetSelected
622         dtl     <Game Ports given to system.>,a2
623         bra     DoScrTitle
624
625 FreeDiskRes     call    disk,GiveUnit
626         get.b   DiskAlloc,d3
627         ror.b   #4,d3
628         moveq   #3,d2
629 LoopFreeUnit    rol.b   #1,d3
630         bcc.s   SkipFreeUnit
631         move.l  d2,d0
632         call    FreeUnit
633 SkipFreeUnit    dbra    d2,LoopFreeUnit
634         rts
635
636 Cleanup move.l  4.w,a6
637         tstv.b  PortAdd
638         beq.s   NoPortAdd
639         clrv.b  PortAdd
640         lea     RzPort(pc),a1
641         call    RemPort
642 NoPortAdd       tstv.b  CleanServ
643         beq.s   NoCleanServ
644         clrv.b  CleanServ
645         lea     IntStruct(pc),a1
646         moveq   #INTB_VERTB,d0
647         call    RemIntServer
648 NoCleanServ     lea     ADisk+gg_GadgetID(pc),a2
649         tst.b   (a2)
650         beq.s   NoFreeDisk
651         clr.b   (a2)
652         bsr.s   FreeDiskRes
653 NoFreeDisk      lea     ASerial+gg_GadgetID(pc),a2
654         tst.b   (a2)
655         beq.s   NoFreeSerial
656         clr.b   (a2)
657         moveq   #MR_SERIALPORT,d2
658         bsr     FreeSerParRout
659 NoFreeSerial    lea     AParallel+gg_GadgetID(pc),a2
660         tst.b   (a2)
661         beq.s   NoFreeParallel
662         clr.b   (a2)
663         moveq   #MR_PARALLELPORT,d2
664         bsr     FreeSerParRout
665 NoFreeParallel  get.w   GameAlloced,d0
666         beq.s   NoFreeGamePort
667         clrv.w  GameAlloced
668         call    potgo,FreePotBits
669 NoFreeGamePort  get.l   MyWindow,d0
670         beq.s   NoMyWindow
671         clrv.l  MyWindow
672         get.l   sv_thistask,a0
673         get.l   OrigWPtr,pr_WindowPtr(a0)
674         move.l  d0,a4
675         move.l  4.w,a6
676         addq.b  #1,TDNestCnt(a6)
677 ClearWinPort    move.l  wd_UserPort(a4),a0
678         call    GetMsg
679         tst.l   d0
680         beq.s   WinPortCleared
681         move.l  d0,a1
682         call    ReplyMsg
683         bra.s   ClearWinPort
684
685 WinPortCleared  move.l  a4,a0
686         moveq   #0,d0
687         call    intuition,ModifyIDCMP
688         call    exec,Permit
689         move.l  a4,a0
690         call    intuition,CloseWindow
691 NoMyWindow      get.l   StdFont,d0
692         beq.s   NoCloseFont
693         clrv.l  StdFont
694         move.l  d0,a1
695         call    gfx,CloseFont
696 NoCloseFont     lea     AGamePort(pc),a1
697         move.l  (a1),a0
698         clr.l   (a1)
699         call    gadtools,FreeGadgets
700         get.l   VisualInfo,a0
701         clrv.l  VisualInfo
702         call    FreeVisualInfo
703         sub.l   a0,a0
704         lea     ScrLock(pc),a0
705         move.l  (a0),a1
706         clr.l   (a0)
707         jump    intuition,UnlockPubScreen
708
709 GadTable        dc.w    AA0l+gg_GadgetID-*-2
710         dc.w    AA1l+gg_GadgetID-*-2
711         dc.w    AA2l+gg_GadgetID-*-2
712         dc.w    AA3l+gg_GadgetID-*-2
713         dc.w    AA4l+gg_GadgetID-*-2
714         dc.w    AA5l+gg_GadgetID-*-2
715         dc.w    AA6l+gg_GadgetID-*-2
716         dc.w    AA7l+gg_GadgetID-*-2
717         dc.w    AB0l+gg_GadgetID-*-2
718         dc.w    AB1l+gg_GadgetID-*-2
719         dc.w    AB2l+gg_GadgetID-*-2
720         dc.w    AB3l+gg_GadgetID-*-2
721         dc.w    AB4l+gg_GadgetID-*-2
722         dc.w    AB5l+gg_GadgetID-*-2
723         dc.w    AB6l+gg_GadgetID-*-2
724         dc.w    AB7l+gg_GadgetID-*-2
725         dc.w    BA0l+gg_GadgetID-*-2
726         dc.w    BA1l+gg_GadgetID-*-2
727         dc.w    BA2l+gg_GadgetID-*-2
728         dc.w    BA3l+gg_GadgetID-*-2
729         dc.w    BA4l+gg_GadgetID-*-2
730         dc.w    BA5l+gg_GadgetID-*-2
731         dc.w    BA6l+gg_GadgetID-*-2
732         dc.w    BA7l+gg_GadgetID-*-2
733         dc.w    BB0l+gg_GadgetID-*-2
734         dc.w    BB1l+gg_GadgetID-*-2
735         dc.w    BB2l+gg_GadgetID-*-2
736         dc.w    BB3l+gg_GadgetID-*-2
737         dc.w    BB4l+gg_GadgetID-*-2
738         dc.w    BB5l+gg_GadgetID-*-2
739         dc.w    BB6l+gg_GadgetID-*-2
740         dc.w    BB7l+gg_GadgetID-*-2
741         dc.w    AA0r+gg_GadgetID-*-2
742         dc.w    AA1r+gg_GadgetID-*-2
743         dc.w    AA2r+gg_GadgetID-*-2
744         dc.w    AA3r+gg_GadgetID-*-2
745         dc.w    AA4r+gg_GadgetID-*-2
746         dc.w    AA5r+gg_GadgetID-*-2
747         dc.w    AA6r+gg_GadgetID-*-2
748         dc.w    AA7r+gg_GadgetID-*-2
749         dc.w    AB0r+gg_GadgetID-*-2
750         dc.w    AB1r+gg_GadgetID-*-2
751         dc.w    AB2r+gg_GadgetID-*-2
752         dc.w    AB3r+gg_GadgetID-*-2
753         dc.w    AB4r+gg_GadgetID-*-2
754         dc.w    AB5r+gg_GadgetID-*-2
755         dc.w    AB6r+gg_GadgetID-*-2
756         dc.w    AB7r+gg_GadgetID-*-2
757         dc.w    BA0r+gg_GadgetID-*-2
758         dc.w    BA1r+gg_GadgetID-*-2
759         dc.w    BA2r+gg_GadgetID-*-2
760         dc.w    BA3r+gg_GadgetID-*-2
761         dc.w    BA4r+gg_GadgetID-*-2
762         dc.w    BA5r+gg_GadgetID-*-2
763         dc.w    BA6r+gg_GadgetID-*-2
764         dc.w    BA7r+gg_GadgetID-*-2
765         dc.w    BB0r+gg_GadgetID-*-2
766         dc.w    BB1r+gg_GadgetID-*-2
767         dc.w    BB2r+gg_GadgetID-*-2
768         dc.w    BB3r+gg_GadgetID-*-2
769         dc.w    BB4r+gg_GadgetID-*-2
770         dc.w    BB5r+gg_GadgetID-*-2
771         dc.w    BB6r+gg_GadgetID-*-2
772         dc.w    BB7r+gg_GadgetID-*-2
773         dc.w    G13l+gg_GadgetID-*-2
774         dc.w    G13r+gg_GadgetID-*-2
775         dc.w    G14l+gg_GadgetID-*-2
776         dc.w    G14r+gg_GadgetID-*-2
777         dc.w    G23l+gg_GadgetID-*-2
778         dc.w    G23r+gg_GadgetID-*-2
779         dc.w    G24l+gg_GadgetID-*-2
780         dc.w    G24r+gg_GadgetID-*-2
781         dc.w    S1l+gg_GadgetID-*-2
782         dc.w    S2l+gg_GadgetID-*-2
783         dc.w    G13m+gg_GadgetID-*-2
784         dc.w    G23m+gg_GadgetID-*-2
785         dc.w    G14m+gg_GadgetID-*-2
786         dc.w    G24m+gg_GadgetID-*-2
787
788 ProcCounterLR   bsr     ProcCounter
789         beq.s   Return1ShEq
790         ror.b   #2,d2
791         scs     d0
792         bsr.s   ChkSelected
793         rol.b   #1,d2
794         scs     d0
795         rol.b   #1,d2
796         scs     d1
797         eor.b   d1,d0
798         move.l  a3,a2
799 ChkSelected     cmp.b   (a2),d0
800 Return1ShEq     beq.s   Return1
801 SetSelected     mpush   d2/d3/a0/a1/a3
802         move.b  d0,(a2)
803         get.l   MyWindow,a3
804         move.l  wd_RPort(a3),a1
805         cmp.b   #76,1(a2)
806         bcc.s   NoImage
807         move.l  a1,a0
808         lea     ImgZero(pc),a1
809         move.w  -gg_GadgetID+gg_LeftEdge(a2),d0
810         move.w  -gg_GadgetID+gg_TopEdge(a2),d1
811         move.l  -gg_GadgetID+gg_GadgetRender(a2),a3
812         cmp.l   a1,a3
813         bne.s   SS_DoInpOut
814         tst.b   (a2)
815         beq.s   SS_HaveImage
816         lea     ImgOne(pc),a1
817         bra.s   SS_HaveImage
818
819 NoImage moveq   #RP_COMPLEMENT,d0
820         call    gfx,SetDrMd
821         move.l  wd_RPort(a3),a0
822         moveq   #3,d0
823         cmp.w   #39,LIB_VERSION(a6)
824         bcs.s   StupidGfx
825         call    SetWriteMask    ;failures ignored
826 StupidGfxJump   move.l  wd_RPort(a3),a1
827         lea     -gg_GadgetID+gg_LeftEdge(a2),a0
828         move.w  (a0)+,d0        ;LeftEdge->xmin
829         move.w  (a0)+,d1        ;TopEdge->ymin
830         move.w  (a0)+,d2
831         add.w   d0,d2
832         subq.w  #1,d2           ;xmax
833         move.w  (a0),d3
834         add.w   d1,d3
835         subq.w  #1,d3           ;ymax
836         call    RectFill
837 Ret_SetSelected mpop    d2/d3/a0/a1/a3
838 Return1 rts
839
840 SS_DoInpOut     lea     ImgInput(pc),a1
841         tst.b   (a2)
842         beq.s   SS_HaveImage
843         lea     ImgOutput(pc),a1
844 SS_HaveImage    call    intuition,DrawImage
845         get.l   gfxbase,a6
846         bra.s   Ret_SetSelected
847
848 StupidGfx       move.b  d0,rp_Mask(a0)
849         bra.s   StupidGfxJump
850
851 DoRoutUpdate    lea     CIABaseA4,a4
852 CIABaseA4Ptr    equ     *-4
853         lea     GadTable(pc),a0
854         lea     CIAprTab(pc),a3
855         moveq   #7,d7
856 ChkCIALoop      move.w  (a3)+,d0
857         move.b  (a4,d0.w),d2
858         bsr.s   ChkEight
859         dbra    d7,ChkCIALoop
860         get.l   potgobase,a4
861         move.b  $28(a4),d2      ;$28(potgobase)/W=Contents of POTGO/POTINP
862         bsr.s   ChkEight
863         lea     BaseA4,a4
864 BaseA4Ptr       equ     *-4
865         move.b  potinp(a4),d2
866         move.b  d2,d0
867         and.b   #$05,d2
868         and.b   #$50,d0
869         lsr.b   #3,d0
870         or.b    d0,d2
871         btst    #ADKB_UARTBRK-8,adkconr(a4)
872         sne     d0      ;TXD
873         roxr.b  #1,d0
874         roxl.b  #1,d2
875         btst    #11-8,serdatr(a4)
876         sne     d0      ;RXD
877         roxr.b  #1,d0
878         roxl.b  #1,d2
879         moveq   #5,d3
880         bra.s   Chk8Loop
881
882 ChkEight        moveq   #7,d3
883 Chk8Loop        move.w  (a0)+,d0
884         lea     (a0,d0.w),a2
885         ror.b   d2
886         scs     d0
887         cmp.b   (a2),d0
888         beq.s   Chk8Okay
889         jsr     (a1)
890 Chk8Okay        dbra    d3,Chk8Loop
891         rts
892
893 IntRoutine      tst.b   Signaled(a1)
894         bne.s   IntReturnQuick
895         move.l  a1,v
896         mpush   d2-d4/d7/a2-a4
897         move.l  sp,d4
898         lea     DoSignal(pc),a1
899         bsr     DoRoutUpdate
900         move.l  joy0dat(a4),d0
901         vcmp.l  ST_joy0daty,d0
902         bne.s   DoSignal
903         move.l  pot0dat(a4),d0
904         vcmp.l  ST_pot0daty,d0
905         bne.s   DoSignal
906         bra.s   IntReturn
907
908 DoSignal        get.l   SigMask,d0
909         get.l   sv_thistask,a1
910         stv.b   Signaled
911         call    exec,Signal
912         move.l  d4,sp
913 IntReturn       mpop    d2-d4/d7/a2-a4
914 IntReturnQuick  move.l  BaseA4Ptr(pc),a0
915         cmp.l   d0,d0
916         rts
917
918 IntStruct       dc.l    0,0
919         dc.b    NT_INTERRUPT,-128
920         dc.l    IntName
921         dc.l    0               ;IS_DATA
922         dc.l    IntRoutine
923
924 IntName dc.b    'PortDiag',0
925         even
926
927 DRUnit  dc.l    0,0
928         dc.b    NT_MESSAGE,0
929         dc.l    IntName
930 DRReplyPort     dc.l    0
931         dc.w    DRU_SIZE
932
933         dc.l    0,0
934         dc.b    NT_INTERRUPT,-128
935         dc.l    IntName,0,0     ;LN_NAME,IS_DATA,IS_CODE
936
937         dc.l    0,0
938         dc.b    NT_INTERRUPT,-128
939         dc.l    IntName,0,0     ;LN_NAME,IS_DATA,IS_CODE
940
941         dc.l    0,0
942         dc.b    NT_INTERRUPT,-128
943         dc.l    IntName,0,0     ;LN_NAME,IS_DATA,IS_CODE
944
945 RzPort  dc.l    0,0
946         dc.b    NT_MSGPORT,-128
947         dc.l    RzPortName
948         dc.b    PA_IGNORE,0
949         dc.l    0
950 RzPortHead      dc.l    RzPortTail
951 RzPortTail      dc.l    0,RzPortHead
952         dc.b    NT_MESSAGE,0
953
954         dt      RzPortName,<PortDiag.rendezvous>
955
956 GNGadgets
957 GNGDefaultAA    dc.w    44,78,72,13
958         dc.l    DefaultTxt,StdAttr
959         dc.w    252
960         dc.l    PLACETEXT_IN,0
961
962 GNGDefaultAB    dc.w    196,78,72,13
963         dc.l    DefaultTxt,StdAttr
964         dc.w    253
965         dc.l    PLACETEXT_IN,0
966
967 GNGDefaultBA    dc.w    348,78,72,13
968         dc.l    DefaultTxt,StdAttr
969         dc.w    254
970         dc.l    PLACETEXT_IN,0
971
972 GNGDefaultBB    dc.w    500,78,72,13
973         dc.l    DefaultTxt,StdAttr
974         dc.w    255
975         dc.l    PLACETEXT_IN,0
976
977 GNGStartPotgo   dc.w    318,106,134,15
978         dc.l    SPotgoTxt,StdAttr
979         dc.w    65
980         dc.l    PLACETEXT_IN,0
981
982         dc.w    0
983
984         dt      DefaultTxt,<Default>
985         dt      SPotgoTxt,<Start potgo>
986
987         include "PortDiagWin.asm"
988
989 ScrLock equ     NewMyWindow+nw_Screen
990
991 BorList dc.w    AABorder-*-2
992         dc.w    ABBorder-*-2
993         dc.w    BABorder-*-2
994         dc.w    BBBorder-*-2
995         dc.w    G1Border-*-2
996         dc.w    G1Border1-*-2
997         dc.w    G1Border2-*-2
998         dc.w    G1Border3-*-2
999         dc.w    G1Border4-*-2
1000         dc.w    G2Border-*-2
1001         dc.w    G2Border1-*-2
1002         dc.w    G2Border2-*-2
1003         dc.w    G2Border3-*-2
1004         dc.w    G2Border4-*-2
1005         dc.w    PotgoBorder-*-2
1006         dc.w    SerialBorder-*-2
1007         dc.w    AllocBorder-*-2
1008         dc.w    0
1009
1010         dt      <$VER: PortDiag 1.0 (4.10.95)>
1011
1012         tags
1013         template <OMIT_ANY_OF_ALL_THOSE_ANNOYING_WARNING_MESSAGES=FORCE/S>
1014         dv.l    Arg_Force
1015         exitrout        Cleanup
1016         finish
1017         end