From 4317a32920b6c91de4750913925735b7f4bac739 Mon Sep 17 00:00:00 2001 From: short <> Date: Fri, 3 Oct 2003 20:22:10 +0000 Subject: [PATCH] +Amiga etc. --- autogen.pl | 6 +- configure.ac | 6 +- project/CasioA/Casio-A.asm | 1930 +++++++++++++++++++++++++++++++++++++++ project/CasioA/Casio-A.lha | Bin 0 -> 22528 bytes project/CasioA/Casio-A.png | Bin 0 -> 3262 bytes project/CasioA/CasioSchema.png | Bin 0 -> 1305 bytes project/CasioA/Index.html.pl | 43 + project/CasioA/ListItem.pm | 49 + project/CasioA/Makefile.am | 24 + project/Islet/Index.html.pl | 8 +- project/Islet/ListItem.pm | 9 +- project/LaserGame/Index.html.pl | 41 + project/LaserGame/LaserComm.png | Bin 0 -> 1830 bytes project/LaserGame/ListItem.pm | 52 ++ project/LaserGame/Makefile.am | 24 + project/Makefile.am | 8 +- project/PortDiag/Index.html.pl | 41 + project/PortDiag/ListItem.pm | 51 ++ project/PortDiag/Makefile.am | 24 + project/PortDiag/PortDiag.asm | 1017 +++++++++++++++++++++ project/PortDiag/PortDiag.lha | Bin 0 -> 23983 bytes project/PortDiag/PortDiag.png | Bin 0 -> 4851 bytes project/ShortRel/Index.html.pl | 39 + project/ShortRel/ListItem.pm | 50 + project/ShortRel/Makefile.am | 25 + project/ShortRel/ShortRel.asm | 684 ++++++++++++++ project/ShortRel/ShortRel.lha | Bin 0 -> 7915 bytes 27 files changed, 4118 insertions(+), 13 deletions(-) create mode 100644 project/CasioA/Casio-A.asm create mode 100644 project/CasioA/Casio-A.lha create mode 100644 project/CasioA/Casio-A.png create mode 100644 project/CasioA/CasioSchema.png create mode 100755 project/CasioA/Index.html.pl create mode 100755 project/CasioA/ListItem.pm create mode 100644 project/CasioA/Makefile.am create mode 100755 project/LaserGame/Index.html.pl create mode 100644 project/LaserGame/LaserComm.png create mode 100755 project/LaserGame/ListItem.pm create mode 100644 project/LaserGame/Makefile.am create mode 100755 project/PortDiag/Index.html.pl create mode 100755 project/PortDiag/ListItem.pm create mode 100644 project/PortDiag/Makefile.am create mode 100644 project/PortDiag/PortDiag.asm create mode 100644 project/PortDiag/PortDiag.lha create mode 100644 project/PortDiag/PortDiag.png create mode 100755 project/ShortRel/Index.html.pl create mode 100755 project/ShortRel/ListItem.pm create mode 100644 project/ShortRel/Makefile.am create mode 100644 project/ShortRel/ShortRel.asm create mode 100644 project/ShortRel/ShortRel.lha diff --git a/autogen.pl b/autogen.pl index a7d2204..da0ac40 100755 --- a/autogen.pl +++ b/autogen.pl @@ -41,7 +41,6 @@ AutoGen->run( ./dia-w.sh ./project/Nokia61/Nokia61 ./project/Nokia61/Nokia61_23.cache - ./project/surprise/surprise-gnome-0.gif ./project/line9k/line9k.png ./project/line9k/line9k.gif ./project/captive/doc/fig/*.png @@ -49,5 +48,10 @@ AutoGen->run( ./project/captive/doc/dia/*.dia~ ./project/captive/doc/*.gif ./project/captive/*.gif + ./project/PortDiag/*.gif + ./project/CasioA/*.gif + ./project/LaserGame/*.gif + ./project/Islet/*.gif + ./project/surprise/*.gif )], ); diff --git a/configure.ac b/configure.ac index 9f278b4..9116950 100644 --- a/configure.ac +++ b/configure.ac @@ -32,7 +32,7 @@ Makefile ./My/Makefile ./project/Makefile ./project/step/Makefile -./project/icp/Makefile +./project/Islet/Makefile ./project/FordFulk/Makefile ./project/Heat/Makefile ./project/kix/Makefile @@ -73,6 +73,10 @@ Makefile ./project/captive/doc/Makefile ./project/captive/doc/fig/Makefile ./project/captive/doc/dia/Makefile +./project/PortDiag/Makefile +./project/CasioA/Makefile +./project/LaserGame/Makefile +./project/ShortRel/Makefile ]) echo done. diff --git a/project/CasioA/Casio-A.asm b/project/CasioA/Casio-A.asm new file mode 100644 index 0000000..e18d5ff --- /dev/null +++ b/project/CasioA/Casio-A.asm @@ -0,0 +1,1930 @@ +;DEBUG equ 1 + +;TODO: +; TRANSMIT/K/M & AppMessage w/arg>1 + + include "ssmac.h" + +BaudRateBase equ 1200 +Def_BaudRateN equ 3 +Def_BaudRate equ BaudRateBase<,a0 + get.l Arg_Device,d0 + beq.s NoDevice + move.l d0,a0 + move.l (a0),a0 +NoDevice put.l a0,Arg_Device + moveq #0,d1 + get.l Arg_DevUnit,d0 + beq.s NoDevUnit + move.l d0,a0 + move.l (a0),d1 +NoDevUnit put.l d1,Arg_DevUnit + move.l #Def_BaudRate,d1 + get.l Arg_Baud,d0 + beq.s NoBaud + move.l d0,a0 + move.l (a0),d1 +NoBaud put.l d1,Arg_Baud + + lea SerErrTab(pc),a0 + move.l a0,a2 + geta SerErrMem,a1 +LoopSerErr move.b -(a0),1(a1) + beq.s DoneSerErr + moveq #0,d0 + move.b -(a0),d0 + move.b d0,3(a1) + addq #4,a1 + subq.b #1,d0 +LoopSerErr2 move.l a2,(a1)+ +SkipSerErr tst.b (a2)+ + bne.s SkipSerErr + dbra d0,LoopSerErr2 + bra.s LoopSerErr + +DoneSerErr get.l Arg_To,d0 + vor.l Arg_From,d0 + snev GotCmdArgs + tstv.l Arg_MUI + bne.s DoMUI + tst.l d0 + bne ProcessCmdArgs +DoMUI dtl ,a0 + moveq #MUIMaster_MVer,d0 + call TrackLibrary + put.l d0,muimasterbase + move.l d0,a6 + bset.b #svfb_errorreq,sv_flags+3(v) + + dtl <_Transmit>,a2 + dt <_Receive> + dt <_Settings> + dt <_Quit> + dt <_Abort> + dt <_Save> + dt <_Use> + dt <_Restore> + dt <_Close> + geta Buttons,a3 + moveq #8,d2 +LoopMakeObj push a2 + move.l sp,a0 + moveq #MUIO_Button,d0 + call muimaster,MUI_MakeObjectA + addq #4,sp + move.l d0,(a3)+ + bne.s GenTButton +MUIDosError dtl ,a0 +SSDosError jump ss,DosError + +GenTButton tst.b (a2)+ + bne.s GenTButton + move.l d0,a0 + move.w #MUIA_CycleChain-MUITags,d0 + moveq #TRUE,d1 + bsr SetAttr + dbra d2,LoopMakeObj + + move.w #MUIA_InputMode-MUITags,d0 + moveq #MUIV_InputMode_Toggle,d1 + get.l SettingsButton,a0 + bsr SetAttr + move.w #MUIA_Weight-MUITags,d0 + moveq #0,d1 + get.l AbortButton,a0 + bsr SetAttr + + move.w #MUIA_Popstring_Toggle-MUITags,d0 + moveq #1,d1 + get.l TransmitButton,a0 + bsr SetAttr + move.w #MUIA_Popstring_Toggle-MUITags,d0 + moveq #1,d1 + get.l ReceiveButton,a0 + bsr SetAttr + + moveq #(6*32*16/8)>>2,d0 + rol.l #2,d0 + moveq #MEMF_PUBLIC!MEMF_CHIP,d1 + call ss,TrackAllocMem + move.l d0,a6 + + lea CasioIcons(pc),a2 + lea PartTab(pc),a4 + geta Bitmaps,a3 + geta StatBar0,a1 + moveq #5,d7 +SkipZeroPart tst.b (a4)+ + beq.s SkipZeroPart + lea -1(a4),a0 + put.l a0,StatBarText + put.l a3,StatBarBMap + move.l #$00040010,(a3)+ ;bm_BytesPerRow+bm_Rows + move.l #$00010000,(a3)+ ;bm_Flags+bm_Depth+bm_Pad + move.l a6,(a3)+ ;bm_Planes[0] + moveq #15,d0 +GenIconLine move.w (a2)+,d1 + moveq #15,d2 +GenIconPix move.w d1,d4 + roxr.w #1,d4 + roxr.l #1,d3 + roxr.w #1,d1 + roxr.l #1,d3 + dbra d2,GenIconPix + move.l d3,(a6)+ + dbra d0,GenIconLine + mpush a1-a3/a6 + lea MUI_StatBar(pc),a3 + bsr GenerateMUI + mpop a1-a3/a6 + move.l d0,(a1)+ ;StatBar + get.l StatBarNumber,(a1)+ ;StatBarNum +SkipPartPart tst.b (a4)+ + bne.s SkipPartPart + dbra d7,SkipZeroPart + + move.l #gnm_SIZEOF*PackMenuNum+1,d0 + move.l d0,d2 + call ss,IPAlloc + clr.l -(sp) + push d0 + move.l d0,a3 + add.l d0,d2 + subq.l #1,d2 + lea PackMenus(pc),a2 + geta MenusHots,a4 + moveq #FirstMenuCode,d3 +NextMenuField addq.b #NM_ITEM,(a3) +NextMenuTag move.b (a2)+,d0 + beq.s GotMenuTitle + bpl.s GotMenuHot + addq.b #1,d0 + bne.s NotMenuSepar + subq.l #-NM_BARLABEL,gnm_Label(a3) + bra.s NextMenuRecord + +NotMenuSepar move.w #CHECKIT!MENUTOGGLE,gnm_Flags(a3) + bra.s NextMenuTag + +GotMenuTitle subq.b #NM_ITEM-NM_TITLE,(a3) +GotMenuHot subq.b #2,d0 + bmi.s NotMenuHot + move.b d0,(a4) + move.l a4,gnm_CommKey(a3) + addq #2,a4 +NotMenuHot move.l a2,gnm_Label(a3) +ToEndLabel tst.b (a2)+ + bne.s ToEndLabel + move.l d3,gnm_UserData(a3) + addq.l #1,d3 +NextMenuRecord lea gnm_SIZEOF(a3),a3 + cmp.l a3,d2 + bne.s NextMenuField + move.l sp,a0 + moveq #MUIO_MenustripNM,d0 + call muimaster,MUI_MakeObjectA + put.l d0,MenuStrip + beq MUIDosError + addq #8,sp + pea (FirstMenuCode+1).w + push #MUIM_FindUData + move.l d0,a2 + bsr DoMethod + put.l d0,TransmitMItem + addq.l #1,4(sp) ;2 + bsr DoMethod + put.l d0,ReceiveMItem + beq MUIDosError + addq.l #6,4(sp) ;8 + bsr DoMethod + put.l d0,ConfigMItem + beq MUIDosError + addq #8,sp + + get.l sv_thistask,a0 + move.l v,TC_Userdata(a0) + sub.l a0,a0 + gett STR_Slider,a1 + sub.l a2,a2 + moveq #6,d0 + lea BaudRateFunc(pc),a3 + call muimaster,MUI_CreateCustomClass + put.l d0,BaudRateClass + beq MUIDosError + move.l d0,a0 + move.l mcc_Class(a0),a0 + clr.l -(sp) + push sp ;TRUE + push #MUIA_CycleChain + pea Def_BaudRateN.w + push #MUIA_Numeric_Max + pea Def_BaudRateN.w + push #MUIA_Numeric_Value + pea 3.w + push #MUIA_ExportID + sub.l a1,a1 + move.l sp,a2 + call intuition,NewObjectA + lea 4*8+4(sp),sp + put.l d0,BaudRateSlider + beq MUIDosError + + lea MUI_Applic(pc),a3 + bsr GenerateMUI + + lea MUI_Notific(pc),a3 + bsr SetNotify + + push TriggerValPtr(pc) ;28 + vpush MainWin ;24 + push #MUIM_Popstring_Open ;20 + pea 1.w ;16 + vpush TransmitAsl ;12 + pea (FirstMenuCode+1).w ;8 + push #MUIA_Application_MenuAction ;4 + push #MUIM_Notify ;0 + bsr DoMethodAppl + addq.l #1,8(sp) ;2 + get.l ReceiveAsl,12(sp) + bsr DoMethod + addq.l #2,8(sp) ;4 + get.l ApplObj,12(sp) + addq.l #1,16(sp) ;->2 + move.w #MUIM_Application_AboutMUI-MUITags,22(sp) + bsr DoMethod + addq.l #5,8(sp) ;9 + moveq #MUIV_Application_Load_ENVARC,d0 + move.l d0,24(sp) + move.w #MUIM_Application_Load-MUITags,22(sp) + bsr DoMethod + addq.l #1,8(sp) ;10 + move.w #MUIM_Application_OpenConfigWindow-MUITags,22(sp) + clr.l 24(sp) + bsr DoMethod + move.w #MUIA_Window_Open-MUITags,6(sp) + move.l EveryTimePtr(pc),8(sp) + move.w #MUIM_CallHook-MUITags,22(sp) + geta WOpenHook,a0 + lea WinOpenHook(pc),a1 + move.l a1,h_Entry(a0) + move.l v,h_Data(a0) + move.l a0,24(sp) + get.l MainWin,a2 + bsr DoMethod + move.w #MUIA_AppMessage-MUITags,6(sp) + move.l a2,12(sp) + addq.l #1,16(sp) ;->3 + geta AppObjHook,a0 + lea AppDropHook(pc),a1 + move.l a1,h_Entry(a0) + move.l v,h_Data(a0) + move.l a0,24(sp) + bsr DoMethod + lea 8*4(sp),sp + + bsr ActRestore + + move.w #MUIA_Window_Open-MUITags,d0 + moveq #TRUE,d1 + get.l MainWin,a0 + bsr SetAttr + move.w #MUIA_Window_Open-MUITags,d0 + get.l MainWin,a0 + bsr GetAttr + beq MUIDosError + + bsr ProcessCmdArgs + tstv.b GotCmdArgs + bne Return8 + +LoopNewInput bsr.s DoMUIPoll + get.l MUIWaitMask,d0 + beq.s LoopNewInput + bsr.s MUIPollEnd + bra.s LoopNewInput + +MUIPollEnd bset.l #SIGBREAKB_CTRL_C,d0 + call exec,Wait + put.l d0,MUIWaitMask + btst.l #SIGBREAKB_CTRL_C,d0 + beq Return8 +BreakOut moveq #err_break,d0 +SSReportError jump ss,ReportError + +DoMUIPoll call ss,TestBreak + push a2 + vpea MUIWaitMask + push #MUIM_Application_NewInput + bsr DoMethodAppl + addq #8,sp + pop a2 + addq.l #1,d0 + beq EXIT ;MUIV_Application_ReturnID_Quit + subq.l #2,d0 + bmi Return8 + moveq #8,d1 + cmp.l d0,d1 + bcs Return8 + cmp.w #5,d0 + bcc.s CallAct + tstv.b Inside + bne.s Return8 +CallAct add.l d0,d0 + lea ButtonAct(pc),a0 + add.w (a0,d0.w),a0 + jmp (a0) + +ButtonAct dc.w ActTransmit-ButtonAct ;0 + dc.w ActReceive-ButtonAct ;1 + dc.w ActSave-ButtonAct ;2 + dc.w ActUse-ButtonAct ;3 + dc.w ActRestore-ButtonAct ;4 + dc.w ActAbort-ButtonAct ;5 + dc.w Return8-ButtonAct ;6 + dc.w Return8-ButtonAct ;7 + dc.w ActAbout-ButtonAct ;8 + +ActAbout moveq #TRUE,d1 + bsr.s ApplicSleep + dtl.lc ,a0 + dt.lc + dt.lc <© 1996 Short Software ',60,'short@k332.feld.cvut.cz',62,'> + dt.lc + dt.lc <> + dt.lc + dt.lc + dt.lc <> + dt.lc + push a2 + dtl ,a2 + call ss,SimpleRequest + pop a2 + moveq #FALSE,d1 +ApplicSleep move.w #MUIA_Application_Sleep-MUITags,d0 + get.l ApplObj,a0 + bra SetAttr + +ActUse push #MUIV_Application_Save_ENV + bra.s ActUseCont + +ActSave push #MUIV_Application_Save_ENVARC +ActUseCont push #MUIM_Application_Save + bsr DoMethodAppl + addq #8,sp + move.w #MUIA_Window_Open-MUITags,d0 + moveq #FALSE,d1 + get.l ConfigWin,a0 + bra SetAttr + +ActRestore push #MUIV_Application_Load_ENV + push #MUIM_Application_Load + bsr DoMethodAppl + addq #8,sp +Return8 rts + +ActTransmit get.l Arg_From,d0 + bne TrasmitClear + get.l TransmitText,a0 + bsr GetAttrStr + bra DoTransmit + +ActReceive get.l ReceiveText,a0 + bsr GetAttrStr + bra DoReceive + +ActAbort stv InAbort +Return10 rts + +ChangeState0 tstv.l muimasterbase + beq.s Return10 + moveq #0,d2 +;--------------- +ChangeState clr.l -(sp) + vpush ConfigGroup + vpush ReceiveButton + vpush TransmitButton + push d2 + push #MUIA_Disabled + push #MUIM_MultiSet + bsr DoMethodAppl + lea 7*4(sp),sp + move.w #MUIA_Menuitem_Enabled-MUITags,d0 + bchg.l #0,d2 + move.l d2,d1 + get.l TransmitMItem,a0 + bsr.s SetAttr + move.w #MUIA_Menuitem_Enabled-MUITags,d0 + move.l d2,d1 + get.l ReceiveMItem,a0 + bsr.s SetAttr + move.w #MUIA_Disabled-MUITags,d0 + move.l d2,d1 + get.l GaugeGroup,a0 +SetAttr clr.l -(sp) + push d1 + move.w d0,-(sp) + move.w #MUITags>>16,-(sp) + move.l sp,a1 + call intuition,SetAttrsA + lea 12(sp),sp + rts +;--------------- +ProcessCmdArgs get.l Arg_To,d0 + beq.s NoArgTo + bsr.s DoReceive + clrv.l Arg_To +NoArgTo get.l Arg_From,d0 + beq.s Return13 +TrasmitClear bsr.s DoTransmit + clrv.l Arg_From +Return13 rts + +DoTransmit pea CallTransmit(pc) + moveq #1,d1 + bra.s CallRoutine + +DoReceive pea CallReceive(pc) + moveq #2,d1 +CallRoutine put.b d1,Inside + push d0 + + tstv.l muimasterbase + beq.s SkipPrepCfg + moveq #1,d2 + bsr ChangeState + get.l DeviceString,a0 + bsr GetAttrStr + put.l d0,Arg_Device + move.w #MUIA_Numeric_Value-MUITags,d0 + get.l UnitNumber,a0 + bsr GetAttr + put.l d0,Arg_DevUnit + move.w #MUIA_Numeric_Value-MUITags,d0 + get.l BaudRateSlider,a0 + bsr GetAttr + moveq #1200>>4,d1 + addq.l #4,d0 + lsl.l d0,d1 + put.l d1,Arg_Baud + move.w #MUIA_Numeric_Value-MUITags,d0 + get.l MicroSecSlider,a0 + bsr GetAttr + put.l d0,Arg_MicroWait + + get.b Inside,d0 + subq.b #1,d0 + dtl ,a0 + beq.s SkipRecvInfo + dtl ,a0 +SkipRecvInfo move.l a0,d1 + move.w #MUIA_Gauge_InfoText-MUITags,d0 + get.l ProgressGauge,a0 + bsr SetAttr + moveq #0,d0 + bsr DoSetGauge + moveq #5,d2 + vlea PartCounts+6*4,a2 + move.l (v),a6 +ClearCounts clr.l -(a2) + move.l a2,a1 + bsr.s SetNumber + dbra d2,ClearCounts +SkipPrepCfg pop a1 + pop a0 + push a1 + moveq #0,d0 + clrv.b InAbort + call ss,CallBlock + get.b Inside,d0 + bmi.s AskDelete + subq.b #2,d0 + beq.s DoDelete + bra.s WasTransmit + +AskDelete dtl.lc ,a0 + dt + move.l sp,a1 + dtl ,a2 + call ss,SimpleRequest + tst.l d0 + beq.s WasTransmit +DoDelete move.l (sp),d1 + call dos,DeleteFile +WasTransmit addq #4,sp + clrv.b Inside + tstv.b FallOut + beq ChangeState0 +EXIT stv FallOut +SSExitCleanup jump ss,ExitCleanup + +AddPartCount moveq #0,d0 + get.b CurPart,d0 + beq.s IsZeroPart + subq.b #2,d0 +IsZeroPart lsl.l #2,d0 + lea PartCounts(v,d0.w),a1 + addq.l #1,(a1) +SetNumber push a2 + lea -12(sp),sp + move.l sp,a2 + push a1 + dt PercLUT,<%lu> + gett PercLUT,a0 + call ss,FormatStr + pop a1 + move.l sp,d1 + geta PartCounts,a0 + sub.l a0,a1 + add.l a1,a1 + geta StatBarNum0,a0 + move.l (a0,a1),a0 + move.w #MUIA_Text_Contents-MUITags,d0 + bsr SetAttr + lea 12(sp),sp + pop a2 + move.l (v),a6 + rts + +CallReceive move.l a1,a0 + moveq #OPEN_NEW+OPEN_LINEBUF,d0 + moveq #0,d1 + call TrackOpenBuf + move.l d0,a3 + stv CurPart + bsr SerialInit + put.b #ASCII_ACK,SerByte +WaitSig1 bsr GetSerByte + cmp.b #ASCII_CR,d0 + bne.s WaitSig1 + bsr GetSerByte + cmp.b #ASCII_LF,d0 + bne.s WaitSig1 + stv.b Inside +NextRcvPacket tstv.l muimasterbase + beq.s NotUpdGauge + get.b CurPart,d0 + bmi.s NotUpdGauge + bne.s NotZeroPart + moveq #2,d0 +NotZeroPart subq.l #1,d0 + moveq #100,d1 + mulu.w d1,d0 + moveq #7,d1 + divu.w d1,d0 + bsr.s ChkSetGauge +NotUpdGauge bsr SendItNow + bsr GetSerByte + cmp.b #ASCII_EOT,d0 + bne.s NotEndTrans + put.b d0,Inside +FullGaugeRet moveq #100,d0 +ChkSetGauge vcmp.w GaugeSet,d0 + bls Return7 +DoSetGauge tstv.l muimasterbase + beq Return7 + put.w d0,GaugeSet + ext.l d0 + move.l d0,d1 + move.w #MUIA_Gauge_Current-MUITags,d0 + get.l ProgressGauge,a0 + bra SetAttr + +NotEndTrans cmp.b #2,d0 + beq.s GotValidPkt + dtl ,a0 + move.w d0,-(sp) +ExitErrorA1 move.l sp,a1 +ExitError jump ExitError + +GotValidPkt bsr GetSerByte + move.b d0,d7 + vcmp.b CurPart,d0 + beq.s IsCurPart + put.b d0,CurPart + cmp.b #8,d0 + bcs.s SmallPartN +BadPartN dtl ,a0 + moveq #0,d0 + get.b CurPart,d0 + move.w d0,-(sp) + bra.s ExitErrorA1 + +SmallPartN lea PartTab(pc),a4 +LoopPart subq.b #1,d0 + bcs.s DoneParts +ScanPart tst.b (a4)+ + bne.s ScanPart + bra.s LoopPart + +DoneParts tst.b (a4) + beq.s BadPartN + dtl <',Char_Term,Char_Term,Char_Term,'>,a0 + call BPuts + move.l a4,a0 + call BPutsNL + bra.s NoFirstRec + +IsCurPart cmp.b #7,d7 + beq.s NoFirstRec + dtl <',Char_Term,Char_Term,'>,a0 + call BPutsNL +NoFirstRec bsr GetSerByte + add.b d0,d7 + move.b d0,d2 + bsr GetSerByte + add.b d0,d7 + rol.w #8,d0 + move.b d2,d0 + cmp.w #SerBufSiz-1,d0 + bcs.s OkaySize + dtl ,a0 + move.w #SerBufSiz-1,-(sp) +ExitErrorD0W move.w d0,-(sp) + bra.s ExitErrorA1 + +OkaySize geta SerBuf,a4 + clr.b (a4,d0.l) + move.w d0,d2 + move.w d0,d3 + bsr SerReceiveX + bsr GetSerByte + move.l a4,a0 +NextXSumChar add.b d0,d7 + move.b (a0)+,d0 + dbra d2,NextXSumChar + tst.b d7 + beq.s GoodXSum + dtl ,a0 + move.w d7,-(sp) + clr.b (sp) + bra ExitErrorA1 + +GoodXSum bsr AddPartCount + st d4 + get.b CurPart,d0 + beq BefRecScan + cmp.b #7,d0 ;CALENDAR + beq.s DoCalendar + cmp.b #$F8,(a4)+ + beq.s AfterF8 + dtl ,a0 + moveq #0,d0 + move.b -(a4),d0 + bra.s ExitErrorD0W + +DoCalendar cmp.w #6,d3 + beq.s GoodCalLen + dtl ,a0 + move.w d3,-(sp) + bra ExitErrorA1 + +GoodCalLen move.w (a4)+,d0 + bsr.s PrintDate + moveq #':',d0 + call BPutByte + moveq #3,d0 +ReadLELong move.b (a4)+,d2 + ror.l #8,d2 + dbra d0,ReadLELong + clr.w -(sp) +NextDate addq.w #1,(sp) + ror.l #1,d2 + bcc.s NotMarked + dtl < %02u>,a0 + move.l sp,a1 + call BPrintf +NotMarked cmp.w #31,(sp) + bne.s NextDate + addq #2,sp + bra DoneThisRec + +PrintDate move.w d0,d1 + and.w #$000F,d1 + move.w d1,-(sp) + lsr.w #4,d0 + add.w #$1900,d0 + btst.l #8,d0 + bne.s Not2000 + add.w #$2000-$1A00,d0 +Not2000 move.w d0,-(sp) + dtl <%x-%02u>,a0 + move.l sp,a1 + call BPrintf + addq #4,sp +Return7 rts + +AfterF8 cmp.b #5,d0 ;SCHEDULE + bne BefRecScan + cmp.b #12,d3 + bcc.s LongSchedDat + dtl ,a0 + move.w d3,-(sp) + bra ExitErrorA1 + +LongSchedDat moveq #0,d0 + move.b 10(a4),d0 + move.w d0,-(sp) + move.b 8(a4),d0 + move.w d0,-(sp) + move.b 3(a4),d0 + cmp.b #$F3,d0 + bne.s BadSchDat + cmp.l #$00F30000,(sp) + beq.s GoodSched +BadSchDat move.w d0,-(sp) + dtl ,a0 + bra ExitErrorA1 + +GoodSched addq #4,sp + move.w 1(a4),d0 + rol.w #8,d0 + bsr.s PrintDate + moveq #0,d0 + move.b 4(a4),d0 + move.w d0,-(sp) + move.b 5(a4),d0 + move.w d0,-(sp) + move.b (a4),d0 + move.w d0,-(sp) + dtl <-%02x: %02x:%02x>,a0 + move.l sp,a1 + call BPrintf + addq #6,sp + moveq #0,d0 + move.b 7(a4),d0 + cmp.b #$30,d0 + beq.s NoEndTime + moveq #0,d1 + move.b 6(a4),d1 + move.w d1,-(sp) + move.w d0,-(sp) + dtl <-%02x:%02x>,a0 + move.l sp,a1 + call BPrintf + addq #4,sp + moveq #0,d0 +NoEndTime move.b 9(a4),d0 + beq.s NoSchedImg + move.w d0,-(sp) + dtl.c < >,a0 + dt PercUT,<%u> + move.l sp,a1 + call BPrintf + addq #2,sp +NoSchedImg moveq #10,d0 + call BPutChar + lea 11(a4),a4 + +BefRecScan moveq #0,d2 +MainRecScan move.b (a4)+,d0 + beq.s DoneThisRec + cmp.b #Char_Term,d0 + bne.s NotCharTerm + moveq #Char_TermRepl,d0 + bra.s NotCharE4 + +NotCharTerm cmp.b #Char_CasSep,d0 + bne.s NotCharF3 + tst.b d4 + bne.s LoopRecScan + bsr.s FlushRecScan + moveq #Char_Term,d0 + call BPutByte + bra.s DoCharNL + +NotCharF3 cmp.b #Char_CasCR,d0 + bne.s NotCharE4 +DoCharNL addq.l #1,d2 + bra.s LoopRecScan + +NotCharE4 move.w d0,-(sp) + bsr.s FlushRecScan + move.w (sp)+,d0 + call BPutChar +LoopRecScan clr.b d4 + bra.s MainRecScan + +DoneThisRec moveq #10,d0 + call BPutChar + bra NextRcvPacket + +FlushRecScan tst.l d2 +FlushRecScanX beq Return7 + moveq #10,d0 + call BPutChar + subq.l #1,d2 + bra.s FlushRecScanX +;*************** +CallTransmit put.l a1,TransmitFName + move.l a1,a0 + moveq #OPEN_OLD,d0 + moveq #0,d1 + call TrackOpenBuf + push d0 + tstv.l muimasterbase + beq.s EmptyFile + move.l d0,a0 + move.l bh_handle(a0),d1 + move.l d1,d4 + moveq #0,d2 + moveq #OFFSET_END,d3 + call dos,Seek + moveq #OFFSET_BEGINNING,d3 + move.l d4,d1 + call Seek + put.l d0,TxFileSize + bne.s EmptyFile + addqv.l #1,TxFileSize +EmptyFile bsr SerialInit + move.l (sp),a2 + call BFlush + put.l sp,ErrPtr + moveq #0,d6 + stv CurPart + move.w #ASCII_CR<<8!ASCII_LF,-(sp) + move.l sp,a0 + moveq #2,d0 + bsr DoSendBuf + addq #2,sp + bsr WaitAck +NextLine addqv.l #1,CurLine + geta LineBuf,a3 + move.l a3,a0 + move.l #LineBufSiz,d0 + call BGets + subq.l #1,d0 + beq.s StringOK + bsr FlushRec + addq #4,sp + moveq #ASCII_EOT,d0 + bsr DoSendByte + bra FullGaugeRet + +StringOK cmp.w #Char_Term<<8!Char_Term,(a3) + bne NotSpec + bsr FlushRec + addq #2,a3 + tst.b (a3) + beq.s NextLine + cmp.b #Char_Term,(a3)+ + beq.s ReadPartID +DoInvUse dt InvUseT, + tpea InvUseT + bra.s ErrDesc + +ReadPartID lea PartTab(pc),a4 + clrv.b CurPart + moveq #0,d2 +LoopRdPartN move.l a3,a0 + move.l a4,a1 + call utility,Stricmp + move.l (v),a6 + beq.s NextLine +ScanRdPartN tst.b (a4)+ + bne.s ScanRdPartN + addqv.b #1,CurPart + cmpv.b #8,CurPart + bne.s LoopRdPartN +DoUnkPID dt UnkPIDT,,a0 + tpea UnkPIDT +ErrDesc geta LineBuf,a0 + push a0 +LenLine tst.b (a0)+ + bne.s LenLine + sub.l (sp),a0 + vpush CurLine + get.l TransmitFName,a2 + push a2 +LenFName tst.b (a2)+ + bne.s LenFName + sub.l (sp),a2 + add.l a2,a0 + lea 64(a0),a0 + move.l a0,d0 + call IPAlloc + move.l d0,a2 + dtl < in "%s", line %lu: "%s">,a0 + move.l sp,a1 + call FormatStr + lea 12(sp),sp + pop a0 + get.l ErrPtr,a1 + move.l a2,(a1) + bra ExitErrorA1 + +NotSpec move.l d6,a0 + tst.l d6 + bne AlreadyBeginX + moveq #0,d4 + geta SerBuf,a0 + move.b #2,(a0)+ + get.b CurPart,d0 + bmi.s DoUnkPID + move.b d0,(a0)+ + clr.w (a0)+ ;Length 2 B filled L8R + cmp.b #7,d0 + beq WrCalendar + tst.b d0 + beq AlreadyBegin + move.b #$F8,(a0)+ + move.b #Char_CasSep,(a0)+ + cmp.b #5,d0 + bne AlreadyBegin +WrSchedule moveq #'-',d3 + bsr ParseYear + move.w -(a4),d0 + rol.w #8,d0 + move.w d0,(a4)+ + bsr SchedStrStr + cmp.l #32,d0 + bcc BadSched + tst.l d0 + beq BadSched + bsr ConvByteBCD + move.b d0,-3(a4) + move.w #Char_CasSep<<8,(a4)+ + bsr SchReadHour + move.b d0,(a4)+ + move.l a4,a0 +LoopSch2Col move.b (a3)+,d0 + move.b d0,(a4)+ + beq.s TermSch2ColX + cmp.b #' ',d0 + beq.s TermSch2Col + cmp.b #'-',d0 + bne.s LoopSch2Col +TermSch2ColX subq #1,a3 +TermSch2Col bsr StrStrToLA4 + cmp.l #60,d0 + bcc.s BadSched + bsr ConvByteBCD + move.b d0,-2(a4) + clr.b (a4)+ + move.l #$30F30000,(a4)+ + move.l a4,a0 +SkipSchSpc move.b (a3)+,d0 + beq.s DoneSchParse + cmp.b #' ',d0 + beq.s SkipSchSpc + cmp.b #'-',d0 + bne.s NoEndSchTim + bsr.s SchReadHour + move.b d0,-4(a4) + move.l a4,a0 +LoopSch3Col move.b (a3)+,d0 + move.b d0,(a4)+ + beq.s TermSch3Col + cmp.b #' ',d0 + bne.s LoopSch3Col +TermSch3Col bsr StrStrToLA4 + cmp.l #60,d0 + bcc.s BadSched + bsr.s ConvByteBCD + move.b d0,-5(a4) +NoEndSchTim move.l a4,a0 +LoopSch4Col move.b (a3)+,d0 + move.b d0,(a4)+ + beq.s TermSch4Col + cmp.b #' ',d0 + bne.s LoopSch4Col +TermSch4Col bsr StrStrToLA4 + move.l d0,d1 + lsr.l #8,d1 + bne.s BadSched + move.b d0,-2(a4) + subq #1,a3 +LoopSch5Col move.b (a3)+,d0 + beq.s DoneSchParse + cmp.b #' ',d0 + beq.s LoopSch5Col +BadSched get.l ErrPtr,sp + dt BadSchedT, + tpea BadSchedT + bra ErrDesc + +DoneSchParse move.l a4,d6 + bra NextLine + +SchReadHour bsr SchedStrStr + cmp.l #24,d0 + bcc.s BadSched +ConvByteBCD divu.w #10,d0 + move.w d0,d1 + swap d0 + rol.b #4,d1 + or.b d1,d0 + rts + +ParseYear move.l a0,a4 +LoopYrMin move.b (a3)+,d0 + beq.s BadYear + move.b d0,(a4)+ + cmp.b #'-',d0 + bne.s LoopYrMin + bsr StrStrToLA4 + cmp.l #2100,d0 + bcs.s SmallYrYear +BadYear dt BadYearT, + tpea BadYearT + bra ErrDesc + +SmallYrYear cmp.w #1901,d0 + bcs.s BadYear + move.l d0,d2 + move.l a4,a0 +LoopYrCol move.b (a3)+,d0 + beq.s BadYear + move.b d0,(a4)+ + cmp.b d3,d0 + bne.s LoopYrCol + bsr StrStrToLA4 + cmp.l #13,d0 + bcc.s BadYear + tst.l d0 + beq.s BadYear + sub.w #1900,d2 + moveq #10,d1 + divu.w d1,d2 + swap d2 + rol.b #4,d2 + or.b d2,d0 + move.b d0,1(a4) + clr.w d2 + swap d2 + divu.w d1,d2 + swap d2 + move.b d2,d0 + swap d2 + rol.b #4,d2 + or.b d2,d0 + move.b d0,(a4) + addq #2,a4 +Return2 rts + +WrCalendar moveq #':',d3 + bsr.s ParseYear + moveq #0,d2 +NextCalenDay move.l a4,a0 +SkipSpcCalen move.b (a3)+,d0 + beq.s SendCalend + cmp.b #' ',d0 + beq.s SkipSpcCalen + bra.s SkipZeroCalI + +SkipZeroCal move.b (a3)+,d0 +SkipZeroCalI cmp.b #'0',d0 + beq.s SkipZeroCal +CopyDayNum move.b d0,(a4)+ + move.b (a3),d0 + beq.s DoneDayNum + addq #1,a3 + cmp.b #' ',d0 + bne.s CopyDayNum +DoneDayNum clr.b (a4) + move.l a0,a4 + call StrToL + subq.l #1,d0 + bmi.s BadCalend + bset.l d0,d2 + cmp.l #31,d0 + bcs.s NextCalenDay +BadCalend dt CalBadT, + tpea CalBadT + bra ErrDesc + +SchedStrStr move.l a4,a0 +LoopSchCol move.b (a3)+,d0 + beq BadSched + move.b d0,(a4)+ + cmp.b #':',d0 + bne.s LoopSchCol +StrStrToLA4 clr.b -(a4) + move.l a0,a4 + moveq #0,d0 +StrStrToL move.b (a0)+,d0 + beq.s Return2 + cmp.b #' ',d0 + beq.s StrStrToL + cmp.b #'0',d0 + beq.s StrStrToL + subq #1,a0 + jump StrToL + +SendCalend moveq #3,d0 +WrCalenLong move.b d2,(a4)+ + ror.l #8,d2 + dbra d0,WrCalenLong + move.l a4,d6 + bsr.s FlushRec + bra NextLine + +AlreadyBeginX moveq #Char_CasCR-$100,d0 + bclr.l #0,d4 + bne.s PutToBuf +AlreadyBegin move.b (a3)+,d0 + bne.s NotNL + addq.l #1,d4 + move.l a0,d6 + bra NextLine + +NotNL cmp.b #Char_Term,d0 + bne.s PutToBuf + tst.b (a3) + bne DoInvUse + moveq #-1,d4 + moveq #Char_CasSep-$100,d0 +PutToBuf geta SerBuf+SerBufSiz-1,a1 + cmp.l a1,a0 + bcs.s GoodPktLen + move.w #SerBufSiz,-(sp) + dt PktDatLT, + tpea PktDatLT + bra ErrDesc + +GoodPktLen move.b d0,(a0)+ + bra.s AlreadyBegin + +FlushRec tst.l d6 + beq.s Return3 + tstv.l muimasterbase + beq.s NoMUITxProg + call BTell + moveq #100,d1 + call utility,UMult32 + get.l TxFileSize,d1 + call utility,UDivMod32 + bsr DoSetGauge + bsr AddPartCount +NoMUITxProg move.l d6,d0 + geta SerBuf+4,a0 + sub.l a0,d0 + ror.w #8,d0 + put.w d0,SerBuf+2 + ror.w #8,d0 + addq.l #5,d0 + move.l d6,a1 + subq #4,a0 + lea 1(a0),a1 + move.w d0,d1 + subq.w #4,d1 + move.b (a1)+,d2 +TxXSum add.b (a1)+,d2 + dbra d1,TxXSum + neg d2 + move.b d2,(a1) + moveq #0,d6 + pea WaitAck(pc) + +DoSendBuf subq.w #1,d0 + bmi.s Return3 +LoopSendB push d0 + move.b (a0)+,d0 + push a0 + bsr.s DoSendByte + pop a0 + pop d0 + dbra d0,LoopSendB +Return3 rts + +DoSendByte put.b d0,SerByte + get.l TimerTrk,a1 + move.l trk_data(a1),a0 + get.l Arg_MicroWait,IOTV_TIME+TV_MICRO(a0) + beq.s SendItNow + clr.l IOTV_TIME+TV_SECS(a0) + dtl ,a0 + call ss,ChkDoIO +SendItNow get.l SerialIO,a0 + geta SerByte,a1 + move.l a1,IO_DATA(a0) + moveq #1,d0 + move.l d0,IO_LENGTH(a0) + move.w #CMD_WRITE,IO_COMMAND(a0) + dtl ,a0 + get.l SerialTrk,a1 + jump ss,ChkDoIO +;*************** +WaitAck bsr.s GetSerByte + cmp.b #ASCII_ACK,d0 + beq.s Return1 + addq #2,sp + move.w d0,(sp) + dtl ,a0 + cmp.b #5,d0 + beq.s MemoryErr + dtl ,a0 + cmp.b #ASCII_EOT,d0 + beq.s MemoryErr + dtl ,a0 +MemoryErr push a0 + bra ErrDesc + +;--------------- +GetSerByte moveq #1,d0 + subq #2,sp + move.l sp,a0 + bsr.s SerReceive + moveq #0,d0 + move.b (sp)+,d0 +Return1 rts +;--------------- +SerReceiveX move.l a4,a0 +SerReceive get.l SerialIO,a1 + move.l a0,IO_DATA(a1) + move.w #CMD_READ,IO_COMMAND(a1) + move.l d0,IO_LENGTH(a1) + move.l MN_REPLYPORT(a1),a0 + move.b MP_SIGBIT(a0),d5 + call exec,SendIO +LoopSerInput tstv.l muimasterbase + beq.s SkipAbort + bsr DoMUIPoll + tstv.b InAbort + beq.s SkipAbort + pea SSExitCleanup(pc) + put.b #ASCII_EOT,SerByte + bra SendItNow + +SkipAbort get.l SerialIO,a1 + call exec,CheckIO + tst.l d0 + bne.s DoneReadIO + tstv.l muimasterbase + beq.s ForceMUIPoll + get.l MUIWaitMask,d0 + beq.s LoopSerInput +ForceMUIPoll bset.l d5,d0 + bsr MUIPollEnd + bra.s LoopSerInput + +DoneReadIO get.l SerialIO,a1 + call exec,WaitIO + move.l (v),a6 +ProcSerErr ext.w d0 + beq.s Return1 + geta SerErrMem,a0 +;Stolen from SSLib.asm +10$ move.w d0,d1 + sub.w (a0)+,d1 + bcs.s 11$ + move.w (a0)+,d2 + beq.s 0$ + cmp.w d2,d1 + bcc.s 12$ + lsl.w #2,d1 + move.l 0(a0,d1.w),d2 + moveq #err_iofail2,d0 + bra.s 01$ + +11$ move.w (a0)+,d2 +12$ lsl.w #2,d2 + add.l d2,a0 + bra.s 10$ + +0$ moveq #err_iofail,d0 + get.l Arg_Device,d2 +01$ dtl ,a1 + jump ReportError +;--------------- +SerialInit dt TimerDev, + gett TimerDev,a0 + moveq #IOTV_SIZE,d0 + move.l d0,a1 + moveq #UNIT_MICROHZ,d0 + moveq #0,d1 + sub.l a2,a2 + call ss,TrackDevice + put.l d1,TimerTrk + move.w #TR_ADDREQUEST,IO_COMMAND(a1) + + get.l Arg_Device,a0 + get.l Arg_DevUnit,d0 + moveq #IOEXTSER_SIZE,d1 + move.l d1,a1 + moveq #0,d1 + geta SerErrMem,a2 + call TrackDevice + put.l d1,SerialTrk + put.l a1,SerialIO + move.w #SDCMD_SETPARAMS,IO_COMMAND(a1) + get.l Arg_Baud,IO_BAUD(a1) + move.l #$08080100!SERF_XDISABLED!SERF_RAD_BOOGIE,IO_READLEN(a1) + ;io_ReadLen,io_WriteLen,io_StopBits,io_SerFlags + dtl ,a0 + move.l d1,a1 + jump ChkDoIO +;--------------- +GenerateMUI gett __BaseText,a2 + get.l muimasterbase,a6 + moveq #0,d2 + bra.s .loopnext + +BuildMUILoop equ * +.loop push d2 +.loop2 move.l #MUITags,d2 + move.w (a3)+,d2 + beq.s .end + moveq #-1,d0 + cmp.w d0,d2 + bne.s .loopnext + move.l #ASL_TB,d2 + move.w (a3)+,d2 +.loopnext moveq #0,d3 + move.w (a3)+,d3 + bmi.s .subobj + bclr #14,d3 + bne.s .numb + add.l a2,d3 ; String + push d3 + bra.s .loop + +.numb cmp.w #$2000,d3 ; Number + beq.s .long + bcs.s .plus + or.l #$FFFFE000,d3 +.plus push d3 + bra.s .loop +.long push (a3)+ + bra.s .loop + +.subobj bclr #15,d3 + bclr #14,d3 + bne.s .var + add.l a2,d3 + link a4,#0 + push d3 + move.w (a3)+,-(sp) + push d2 + clr.l -(sp) + bra.s .loop2 + +.var move.l (a5,d3.w),-(sp) + bra.s .loop + +.end move.l -4(a4),a0 + move.l sp,a1 + call MUI_NewObject + tst.l d0 + beq MUIDosError + + move.w -6(a4),d3 + move.l d0,(a5,d3.w) + move.l -10(a4),d2 + unlk a4 + tst.w d2 + beq.s Return6 + push d0 + bra BuildMUILoop +;--------------- +DoMethodAppl get.l ApplObj,a2 +DoMethod lea 4(sp),a1 + move.l -4(a2),a0 +DoMethodEntry move.l h_Entry(a0),a6 + jmp (a6) +;--------------- +GetAttrStr move.w #MUIA_String_Contents-MUITags,d0 +GetAttr move.l #MUITags,d1 + move.w d0,d1 + move.l d1,d0 + clr.l -(sp) + move.l sp,a1 + call intuition,GetAttr + pop d0 +Return6 rts +;--------------- +;-1=Done,-2=TriggerValue,-3=ReturnID_Quit,-4=ID 1 +SetNotify move.l sp,d2 + move.w (a3)+,d0 + bpl.s FilledLongD0E + move.w d0,d1 + addq.w #1,d1 + beq.s Return6 + move.l #MUIV_TriggerValue,d0 +TriggerValPtr equ *-4 + addq.w #1,d1 + beq.s FilledLongD0 + push #MUIV_Application_ReturnID_Quit + addq.w #1,d1 + beq.s RetQuitID + neg.w d1 + ext.l d1 + move.l d1,(sp) +RetQuitID push #MUIM_Application_ReturnID + pea 2.w + vpush ApplObj + bra.s DoneRetID + +FilledLongD0E ext.l d0 +FilledLongD0 push d0 + move.w (a3)+,-(sp) + move.w #MUITags>>16,-(sp) + push #MUIM_Set + pea 3.w + move.w (a3)+,d0 + move.l (v,d0.w),d0 + push d0 +DoneRetID move.w (a3)+,d0 + ext.l d0 + push d0 + addq.l #1,d0 + bne.s NotEveryTime + move.l #MUIV_EveryTime,(sp) +EveryTimePtr equ *-4 +NotEveryTime move.w (a3)+,-(sp) + move.w #MUITags>>16,-(sp) + push #MUIM_Notify + move.w (a3)+,d0 + move.l (v,d0.w),a2 + bsr DoMethod + move.l d2,sp + bra.s SetNotify +;--------------- +BaudRateFunc cmp.l #MUIM_Numeric_Stringify,(a1) + beq.s GotNumString + move.l cl_Super(a0),a0 + bra DoMethodEntry + +GotNumString move.w cl_InstOffset(a0),d0 + mpush a2/a5/a6 + add.w d0,a2 + move.l 4(a1),d0 ;offsetof(struct MUIP_Numeric_Stringify,value) + moveq #1200>>4,d1 + addq.l #4,d0 + lsl.l d0,d1 + push d1 + move.l 4.w,a0 + move.l ThisTask(a0),a0 + move.l TC_Userdata(a0),v + move.l sp,a1 + gett PercLUT,a0 + call ss,FormatStr + addq #4,sp + move.l a2,d0 + mpop a2/a5/a6 + rts +;--------------- +WinOpenHook mpush a5/a6 + move.l h_Data(a0),v + move.w #MUIA_Window_Window-MUITags,d0 + get.l MainWin,a0 + bsr GetAttr + get.l sv_thistask,a0 + move.l d0,pr_WindowPtr(a0) + mpop a5/a6 + rts +;--------------- +AppDropHook mpush d2/d3/a2/a5/a6 + move.l h_Data(a0),v + move.l (a1),a1 + move.l am_NumArgs(a1),d0 + beq.s DoneDropHook + subq.l #1,d0 + beq.s OneDropHook +BeepDropHook sub.l a0,a0 + call intuition,DisplayBeep + bra.s DoneDropHook + +OneDropHook tstv.b Inside + bne.s BeepDropHook + move.l am_ArgList(a1),a0 + move.l (a0)+,d1 ;wa_Lock + push (a0) ;wa_Name + geta AppDropBuf,a2 + move.l a2,d2 + move.l #AppBufSiz,d3 + call dos,NameFromLock + pop d2 + tst.l d0 + beq.s BeepDropHook + move.l a2,d1 + call AddPart + tst.l d0 + beq.s BeepDropHook + put.l a2,Arg_From + moveq #1,d0 + push d0 + push #MUIM_Application_ReturnID + bsr DoMethodAppl + addq #8,sp + move.w #MUIA_Application_Iconified-MUITags,d0 + moveq #0,d1 + get.l ApplObj,a0 + bsr SetAttr +DoneDropHook mpop d2/d3/a2/a5/a6 + rts +;--------------- +Cleanup get.l muimasterbase,a6 + get.l ApplObj,d0 + beq.s NoApplObj + move.l d0,a0 + clrv.l ApplObj + call MUI_DisposeObject +NoApplObj get.l BaudRateClass,d0 + beq Return6 + move.l d0,a0 + clrv.l BaudRateClass + jump MUI_DeleteCustomClass +;--------------- + dc.b 0,1,15,3,11,3,4,1,1 +SerErrTab dc.b 'DevBusy',0 + dc.b 'BufErr',0 + dc.b 'InvParam',0 + dc.b 'LineErr',0 + dc.b 'TimerErr',0 + dc.b 'BufOverflow',0 + dc.b 'NoDSR',0 + dc.b 'DetectedBreak',0 +;!!! SerErrTabSize on begin - keep fresh +;--------------- +PackMenus dc.b 0,'Project',0 ;0 + dc.b 'T'+2,'Transmit...',0 ;1 + dc.b 'R'+2,'Receive...',0 ;2 + dc.b -1 + dc.b '?'+2,'About...',0 ;3 + dc.b 1,'About MUI...',0 ;4 + dc.b -1 + dc.b 'H'+2,'Hide',0 ;5 + dc.b 'Q'+2,'Quit',0 ;6 + dc.b 0,'Configuration',0 ;7 + dc.b -2,'C'+2,'Settings',0 ;8 + dc.b 1,'Restore last saved',0 ;9 + dc.b -1 + dc.b 'M'+2,'MUI...',0 ;10 +PackMenuNum equ 14 +;!!! PackMenuHots on begin - keep fresh +;--------------- +PartTab dc.b 'ProtID',0 ;0 + dc.b 0 ;1 + dc.b 0 ;2 + dc.b 'Phone-B',0 ;3 + dc.b 'Phone-P',0 ;4 + dc.b 'Schedule',0 ;5 + dc.b 'Memo',0 ;6 + dc.b 'Calendar',0 ;7 + even +;--------------- +MTag macro + ifge \1-MUITags + dc.w \1-MUITags + else + dc.w -1,\1-ASL_TB + endc + endm + +MOffs macro + dc.w \1+\2-__BaseText + endm + +MObj macro + ifne \1 + MTag \1 + endc + ifnd STREX_\2 +STREX_\2 set 1 + dt STR_\2,<\2.mui> + endc + MOffs $8000,STR_\2 + ifgt NARG-2 + dc.w \3 + dv.l \3 + elseif + dc.w __Trash + endc + endm + +MText macro + MTag \1 + dt STR_\@a,<\2> + MOffs 0,STR_\@a + endm + +MNum macro + MTag \1 + ifge \2-$2000 + dc.w $6000 + dc.l \2 + elseif + ifle \2+$2000 + dc.w $6000 + dc.l \2 + elseif + dc.w $4000+(\2&$3FFF) + endc + endc + endm + +MVar macro + MTag \1 + ifd \2 + ifge \2-$4000 + fail + endc + endc + dc.w \2+$C000 + endm + +MEnd macro + dc.w 0 + endm + +Notify macro + ifeq NARG-4 + ifc 'Quit','\4' + dc.w -3 + else + dc.w -(\4)-4 + endc + else + ifc 'TriggerValue','\6' + dc.w -2 + else + dc.w \6 + endc + dc.w MUIA_\5-MUITags,\4 + endc + ifc 'EveryTime','\3' + dc.w -1 + else + dc.w \3 + endc + dc.w MUIA_\2-MUITags,\1 + endm + + dv.l __Trash + dt.c __BaseText,<> +;--------------- +MUI_Applic + MObj 0,Application,ApplObj + MText MUIA_Application_Title, + MText MUIA_Application_Version,<$VER: Casio-A 1.0 (31.8.96)> + MText MUIA_Application_Copyright,<© 1996 Short Software> + MText MUIA_Application_Author, + MText MUIA_Application_Description, + MText MUIA_Application_Base, + MVar MUIA_Application_Menustrip,MenuStrip + MObj MUIA_Application_Window,Window,MainWin + MText MUIA_Window_Title, + MNum MUIA_Window_ID,'MAIN' + MNum MUIA_Window_AppWindow,TRUE + MObj MUIA_Window_RootObject,Group + MObj MUIA_Group_Child,Group,GaugeGroup + MNum MUIA_Group_Horiz,TRUE + MNum MUIA_Frame,MUIV_Frame_Button + MNum MUIA_Disabled,TRUE + MVar MUIA_Group_Child,AbortButton + MObj MUIA_Group_Child,Gauge,ProgressGauge + MNum MUIA_Gauge_Horiz,TRUE + MText MUIA_Gauge_InfoText,<%ld%%> + MNum MUIA_Frame,MUIV_Frame_Gauge + MEnd + MEnd + MObj MUIA_Group_Child,Rectangle + MEnd + MObj MUIA_Group_Child,Group + MNum MUIA_Group_Columns,2 + MNum MUIA_Frame,MUIV_Frame_Text + MVar MUIA_Group_Child,QuitButton + MVar MUIA_Group_Child,SettingsButton + MObj MUIA_Group_Child,Popasl,ReceiveAsl + MVar MUIA_Popstring_Button,ReceiveButton + MObj MUIA_Popstring_String,String,ReceiveText + MNum MUIA_ExportID,6 + MNum MUIA_ShowMe,FALSE + MEnd + MText ASLFR_TitleText, + MNum ASLFR_DoSaveMode,TRUE + MNum ASLFR_RejectIcons,TRUE + MEnd + MObj MUIA_Group_Child,Popasl,TransmitAsl + MVar MUIA_Popstring_Button,TransmitButton + MObj MUIA_Popstring_String,String,TransmitText + MNum MUIA_ExportID,5 + MNum MUIA_ShowMe,FALSE + MEnd + MText ASLFR_TitleText, + MNum ASLFR_RejectIcons,TRUE + MEnd + MEnd + MObj MUIA_Group_Child,Rectangle + MEnd + MObj MUIA_Group_Child,Group + MNum MUIA_Group_Columns,2 + MNum MUIA_Frame,MUIV_Frame_Group + MText MUIA_FrameTitle, + MVar MUIA_Group_Child,StatBar5 + MVar MUIA_Group_Child,StatBar2 + MVar MUIA_Group_Child,StatBar4 + MVar MUIA_Group_Child,StatBar1 + MVar MUIA_Group_Child,StatBar3 + MVar MUIA_Group_Child,StatBar0 + MEnd + MEnd + MEnd + MVar MUIA_Application_DropObject,MainWin + MObj MUIA_Application_Window,Window,ConfigWin + MText MUIA_Window_Title, + MNum MUIA_Window_ID,'SETT' + MObj MUIA_Window_RootObject,Group,ConfigGroup + MObj MUIA_Group_Child,Group + MNum MUIA_Group_Horiz,TRUE + MVar MUIA_Group_Child,CloseButton + MVar MUIA_Group_Child,RestoreButton + MVar MUIA_Group_Child,UseButton + MVar MUIA_Group_Child,SaveButton + MEnd + MObj MUIA_Group_Child,Group,MicroSecSlider + MNum MUIA_Group_Columns,2 + MNum MUIA_Frame,MUIV_Frame_Button + MObj MUIA_Group_Child,Slider + MNum MUIA_Numeric_Min,0 + MNum MUIA_Numeric_Max,1000 + MNum MUIA_Numeric_Value,Def_Micros + MNum MUIA_ExportID,4 + MNum MUIA_CycleChain,TRUE + MEnd + MObj MUIA_Group_Child,Text + MText MUIA_Text_Contents,<',27,'rDelay [MicroSec]> + MNum MUIA_HorizWeight,0 + MEnd + MVar MUIA_Group_Child,BaudRateSlider + MObj MUIA_Group_Child,Text + MText MUIA_Text_Contents,<',27,'rBaud rate> + MNum MUIA_HorizWeight,0 + MEnd + MObj MUIA_Group_Child,String,UnitNumber + MText MUIA_String_Accept,<0123456789> + MNum MUIA_Frame,MUIV_Frame_String + MVar MUIA_String_Integer,Arg_DevUnit + MNum MUIA_ExportID,2 + MNum MUIA_CycleChain,TRUE + MEnd + MObj MUIA_Group_Child,Text + MText MUIA_Text_Contents,<',27,'rDevice unit> + MNum MUIA_HorizWeight,0 + MEnd + MObj MUIA_Group_Child,String,DeviceString + MNum MUIA_Frame,MUIV_Frame_String + MVar MUIA_String_Contents,Arg_Device + MNum MUIA_ExportID,1 + MNum MUIA_CycleChain,TRUE + MEnd + MObj MUIA_Group_Child,Text + MText MUIA_Text_Contents,<',27,'rDevice> + MNum MUIA_HorizWeight,0 + MEnd + MEnd + MEnd + MEnd + MEnd + +MUI_StatBar + MObj 0,Group + MNum MUIA_Group_Horiz,TRUE + MNum MUIA_Frame,MUIV_Frame_Text + MObj MUIA_Group_Child,Rectangle + MNum MUIA_FixWidth,1 + MEnd + MObj MUIA_Group_Child,Text,StatBarNumber + MText MUIA_Text_Contents,< 0> + MText MUIA_Text_PreParse,<',27,'r',27,'8> + MEnd + MObj MUIA_Group_Child,Text + MVar MUIA_Text_Contents,StatBarText + MNum MUIA_Text_SetMax,TRUE + MEnd + MObj MUIA_Group_Child,Rectangle + MNum MUIA_Rectangle_VBar,TRUE + MNum MUIA_FixWidth,1 + MEnd + MObj MUIA_Group_Child,Bitmap + MVar MUIA_Bitmap_Bitmap,StatBarBMap + MNum MUIA_Bitmap_Width,32 + MNum MUIA_Bitmap_Height,16 + MNum MUIA_Bitmap_Precision,PRECISION_ICON + MNum MUIA_Frame,MUIV_Frame_None + MNum MUIA_FixWidth,32 + MNum MUIA_FixHeight,16 + MEnd + MEnd + +MUI_Notific + Notify SettingsButton,Selected,EveryTime,ConfigWin,Window_Open,TriggerValue + Notify ConfigWin,Window_Open,EveryTime,SettingsButton,Selected,TriggerValue + Notify ConfigWin,Window_Open,EveryTime,ConfigMItem,Menuitem_Checked,TriggerValue + Notify ConfigWin,Window_CloseRequest,TRUE,ConfigWin,Window_Open,FALSE + Notify CloseButton,Pressed,FALSE,ConfigWin,Window_Open,FALSE + Notify MainWin,Window_CloseRequest,TRUE,Quit + Notify TransmitText,String_Acknowledge,EveryTime,0 + Notify ReceiveText,String_Acknowledge,EveryTime,1 + Notify QuitButton,Pressed,FALSE,Quit + Notify SaveButton,Pressed,FALSE,2 + Notify UseButton,Pressed,FALSE,3 + Notify RestoreButton,Pressed,FALSE,4 + Notify AbortButton,Pressed,FALSE,5 + Notify ApplObj,Application_MenuAction,FirstMenuCode+5,ApplObj,Application_Iconified,TRUE + Notify ApplObj,Application_MenuAction,FirstMenuCode+6,Quit + Notify ConfigMItem,Menuitem_Checked,EveryTime,ConfigWin,Window_Open,TriggerValue + dc.w -1 +;--------------- +CasioIcons incbin "Casio-A.gfx" +;--------------- + tags + template + dv.l Arg_To + dv.l Arg_From + dv.l Arg_Device + dv.l Arg_DevUnit + dv.l Arg_Baud + dv.l Arg_MicroWait + dv.l Arg_MUI + defvar + diserr 1<Tn-=Z;kc08s6L2LMrI00007 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Ȼ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 literal 0 HcmV?d00001 diff --git a/project/CasioA/CasioSchema.png b/project/CasioA/CasioSchema.png new file mode 100644 index 0000000000000000000000000000000000000000..043ebf11ba9777ad3b2a9deccc1c8609843e1a46 GIT binary patch literal 1305 zcmV+!1?KvRP)mlq(av0V=2oe_J3c8N6nao^rGpr!H_`}d%#Dj;s3D_7)koUkV*H)>sQk?{iBFvI{7(mPsU_{L*A*IHs zQj2}yot_R~+C<^IJ33tHq42p_hYL6yQ8SK=8dvZd^N8#N2xOHb2;B0+P`&H&jr$+q zFj4Pr@{e~rIJ_%T{(b`9ZSreBypF?lkusgYREYWY-Z~B!hCy(03^TFCKiT)xm}wd9 zFd&=N7(tC*m`4Po_QO-H9CmBq?rILVB0tPj^5sfLx=Lxt>>5V^D+ zD+v*P=!A>0>e>E`2dV1W3OZ~2I#E5_2xrETk#QQ#V>OP<8u`QpU6D~Cqe8g*NWV6h zTYP}_YcbZuJfYz5MA@(5l`U&)vs8lvF|<*_Lg=pW%3|&E#~QpV`uK&sU&Cu|sI4C- z8tnHW1ClYbpr|Q=ehn|9MrK`_mmMK0N6pT)M58wbBbJK_&MpfLoE@z4wGw`Hfy3fX z!P!x0x9m*=?%d$8T(lrGa4X}jKhTT^ExuF2?Q;M(ZP=Rq3mK2PU)~pm-#TTEnyY{r zJ}+SU{ukc>yo^E4$1-F3%=YfGFQbT)61HF6jYW+08P#M=>!GZ%6B9F*Cq3}84YfVCKjW4gLX9m0YI|%uV`M;Wk3F3;YkWD> zp}EJl=A-(GhV~xYs8RIm0#^3e)_g4fSKVXV^RbA?-ebGI*EziDhVou->}#;=$+$ky zpt;93?=}4Xpddq_%$RC$>V~pk--tEH-B7Lo%D|yqQ&6B>rKqsJh1^=isS3r-{Jw`k zSV=`1T--q*tj)xHRPfu_13QTZv5au(tzprnv*b+A+^!gdDIZOh&A7S7EgsC)n%RUZ zNbu|?5w?3dly}AhJ4Hr&Ib*}CJt90qg(dl~VT%eADun%v4$VsFHCs4`j;Lz?DP=k>er7p z;{p|WqJjTM2x~tQ%+e0O24YrpKXzbl literal 0 HcmV?d00001 diff --git a/project/CasioA/Index.html.pl b/project/CasioA/Index.html.pl new file mode 100755 index 0000000..297bc76 --- /dev/null +++ b/project/CasioA/Index.html.pl @@ -0,0 +1,43 @@ +#! /usr/bin/perl +# +# $Id$ +# Main page of 'My::Project::CasioA' +# Copyright (C) 2003 Jan Kratochvil +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; exactly version 2 of June 1991 is required +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +package project::CasioA::Index; +require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway +our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; }; +our $CVS_ID=q$Id$; +use strict; +use warnings; + +BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,)[0]]}; eval "use lib '$top_dir'"; close F; } +use My::Web; +use My::Project; +use project::CasioA::ListItem; + + +My::Project->init_project( + "__PACKAGE__"=>__PACKAGE__, + "ListItem"=>\@project::CasioA::ListItem::ListItem, + ); + +print '
'.My::Web::img("Casio-A","Casio-A Snapshot").'
'."\n"; + +print '
'.My::Web::img("CasioSchema","Casio-A Interface Scheme").'
'."\n"; + +My::Web->footer(); diff --git a/project/CasioA/ListItem.pm b/project/CasioA/ListItem.pm new file mode 100755 index 0000000..b3f51fb --- /dev/null +++ b/project/CasioA/ListItem.pm @@ -0,0 +1,49 @@ +#! /usr/bin/perl +# +# $Id$ +# Definition of 'My::Project::CasioA' for list.cgi.pl +# Copyright (C) 2003 Jan Kratochvil +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; exactly version 2 of June 1991 is required +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +package project::CasioA::ListItem; +require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway +our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; }; +our $CVS_ID=q$Id$; +use strict; +use warnings; + +use My::Web; + + +our @ListItem=( + "name"=>"Casio Diary Backup", + "priority"=>3, + "download"=>"Casio-A.lha", + "link-source file"=>"Casio-A.asm", + "summary"=>"Hardware Analysing Utility", + "license"=>"PD", + "maintenance"=>"obsolete-Casio SF-A10 diary and AmigaOS are no longer being used.", + "language"=>"680x0 asm", + "description"=><<"HERE", +

Casio-A is a software for backup/restore of Casio SF-A10 personal digital +diary. Its development involved reverse-engineering the Casio communication +protocol by sniffing serial communication of the vendor's MS-DOS backup tool.

+

Hardware issues, Casio SF-A10, electronic scheme and images by the courtesy of +@{[ a_href 'http://www.pavouk.org/','Pavel "Pavouk" Ruzicka' ]}.

+HERE + ); + +1; diff --git a/project/CasioA/Makefile.am b/project/CasioA/Makefile.am new file mode 100644 index 0000000..544d810 --- /dev/null +++ b/project/CasioA/Makefile.am @@ -0,0 +1,24 @@ +# $Id$ +# automake source for the Makefile of project/CasioA/ subdir +# Copyright (C) 2003 Jan Kratochvil +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; exactly version 2 of June 1991 is required +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +include $(top_srcdir)/Makefile-head.am + +EXTRA_DIST+= \ + ListItem.pm \ + Index.html.pl \ + Casio-A.png diff --git a/project/Islet/Index.html.pl b/project/Islet/Index.html.pl index 136fb10..a97494e 100755 --- a/project/Islet/Index.html.pl +++ b/project/Islet/Index.html.pl @@ -1,7 +1,7 @@ #! /usr/bin/perl # # $Id$ -# Main page of 'My::Project::icp' +# Main page of 'My::Project::Islet' # Copyright (C) 2003 Jan Kratochvil # # This program is free software; you can redistribute it and/or modify @@ -18,7 +18,7 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -package project::icp::Index; +package project::Islet::Index; require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; }; our $CVS_ID=q$Id$; @@ -28,12 +28,12 @@ use warnings; BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,)[0]]}; eval "use lib '$top_dir'"; close F; } use My::Web; use My::Project; -use project::icp::ListItem; +use project::Islet::ListItem; My::Project->init_project( "__PACKAGE__"=>__PACKAGE__, - "ListItem"=>\@project::icp::ListItem::ListItem, + "ListItem"=>\@project::Islet::ListItem::ListItem, ); print <<'HERE'; diff --git a/project/Islet/ListItem.pm b/project/Islet/ListItem.pm index 9e29222..4c38652 100755 --- a/project/Islet/ListItem.pm +++ b/project/Islet/ListItem.pm @@ -1,7 +1,7 @@ #! /usr/bin/perl # # $Id$ -# Definition of 'My::Project::icp' for list.cgi.pl +# Definition of 'My::Project::Islet' for list.cgi.pl # Copyright (C) 2003 Jan Kratochvil # # This program is free software; you can redistribute it and/or modify @@ -18,7 +18,7 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -package project::icp::ListItem; +package project::Islet::ListItem; require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; }; our $CVS_ID=q$Id$; @@ -29,7 +29,7 @@ use My::Web; our @ListItem=( - "name"=>'ICP 1998 Competition Software', + "name"=>'Islet Simulation', "priority"=>5, "download"=>"Islet/Islet.zip", "summary"=>"Web game applet", @@ -37,8 +37,7 @@ our @ListItem=( "maintenance"=>"ready", "language"=>"Java 1.1", "description"=><<"HERE", -

Simple game. Written for the purpose of -a @{[ a_href 'http://www.stv.cz/icp/','programming competition' ]}.

+

Simple 'game', Java demostration.

HERE ); diff --git a/project/LaserGame/Index.html.pl b/project/LaserGame/Index.html.pl new file mode 100755 index 0000000..d8ffcc8 --- /dev/null +++ b/project/LaserGame/Index.html.pl @@ -0,0 +1,41 @@ +#! /usr/bin/perl +# +# $Id$ +# Main page of 'My::Project::LaserGame' +# Copyright (C) 2003 Jan Kratochvil +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; exactly version 2 of June 1991 is required +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +package project::LaserGame::Index; +require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway +our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; }; +our $CVS_ID=q$Id$; +use strict; +use warnings; + +BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,)[0]]}; eval "use lib '$top_dir'"; close F; } +use My::Web; +use My::Project; +use project::LaserGame::ListItem; + + +My::Project->init_project( + "__PACKAGE__"=>__PACKAGE__, + "ListItem"=>\@project::LaserGame::ListItem::ListItem, + ); + +print '
'.My::Web::img("LaserComm","LaserComm Utility").'
'."\n"; + +My::Web->footer(); diff --git a/project/LaserGame/LaserComm.png b/project/LaserGame/LaserComm.png new file mode 100644 index 0000000000000000000000000000000000000000..a5d88c69641556a5e5f888de09d54e0219df6c11 GIT binary patch literal 1830 zcmV+>2if?EP)tc&mDlSN3T<|L2+$WLBj_s4?tYV~9L#_i|zdi@*! z1^#=#mMv_yTE^Zrwm!P4a?q^5BN(-wGyRLZKFC4TF@h2mR9mf-l)~hHf#4L+rMh!Aj#PE8Y7-I=X`ws%9%6`mj&y&3f~F>|CCYUHm}BAny_VU? z+G0;d>$x47iP`+wdhPjjdf?nTV5x3WSWZeMp_HT?VZzFLI0~cI3iInRZJXY3fb;~I zqX4C%DC|V|it2I_o0u<|Dw~wwC?`g!YIMda4v0m%cF1U)Uq$WBG}lDLm}P!HE4 zb>h6GMvqju@OmKI?h=qRY>@>1n)U9CSOmmYFMw7j0wLysk3`wa{3#CpLZf)mfK39ZsdQkJ>Lw1X<>w~0IuQsFgTy5l z&s5`G15R#66@yHklDM37+&o3SuN2*azxye^vHTVYpdP>zf7X#Xo8gYEG@zZ zJV^q%kD!K<^caUdyK(_UDnQZzm28mM6}S*3spo0u_9Q9(8$U1C=d zEJ^BVz{8m(_;E=VIOI6@O}znLE4g+c8>pUK0qO-14H3-7^#W*Obnq}kv-Q_v5~(~R@-+oVa~XxDp+hWs(S+f6y44S$ z3aG)CXRpTc2)X z@|f&)0`DQx2{JT`Aj9RO3N~#~4n$gk%(JN}S~qvy3*hThYj2x+v!BuPsgK12s+by( zTAKt9ZoiANI7^m_E3tP$$|d7j%%M zCaL7qSguBRs#6Rst*G%U#CeZAc#mRBxa9q7OQGBvpa>-xxd9>*(f~`Gi3k&+l2UuN zhXEp_YOuUnKnR{PNv2~r(-O7-#H|E+TcqB|_obUT1f1k>Z8rqo2B6)LCsId*5|*)W z8*;>QKSJGT^2$9og Uxy;^F+yDRo07*qoM6N<$g4P9F@&Et; literal 0 HcmV?d00001 diff --git a/project/LaserGame/ListItem.pm b/project/LaserGame/ListItem.pm new file mode 100755 index 0000000..3d1b2d9 --- /dev/null +++ b/project/LaserGame/ListItem.pm @@ -0,0 +1,52 @@ +#! /usr/bin/perl +# +# $Id$ +# Definition of 'My::Project::LaserGame' for list.cgi.pl +# Copyright (C) 2003 Jan Kratochvil +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; exactly version 2 of June 1991 is required +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +package project::LaserGame::ListItem; +require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway +our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; }; +our $CVS_ID=q$Id$; +use strict; +use warnings; + +use My::Web; + + +our @ListItem=( + "name"=>"LaserGame Shooting Hardware", + "priority"=>4, + "download"=>"LaserGame.lha", + "link-source file"=>"LaserGame.asm", + "summary"=>"Embedded firmware and Communication Tool", + "license"=>"PD", + "maintenance"=>"obsolete-Communication is written for discontinued Amiga platform.", + "language"=>"i8051 asm, 680x0 asm", + "description"=><<"HERE", +

LaserGame is a clone of commercial shoot'n'run game. Each player has its +own hardware with multiple infra detecting sensor and one laser/infra gun. +Shooting is visually targeting by red laser diode while the shooting +information is being emitted by infrared.

+

Its Amiga communication tool will receive shooting statistics while being +also capable of remote hardware configuration.

+

Hardware part done by +@{[ a_href 'http://www.pavouk.org/','Pavel "Pavouk" Ruzicka' ]}.

+HERE + ); + +1; diff --git a/project/LaserGame/Makefile.am b/project/LaserGame/Makefile.am new file mode 100644 index 0000000..c848438 --- /dev/null +++ b/project/LaserGame/Makefile.am @@ -0,0 +1,24 @@ +# $Id$ +# automake source for the Makefile of project/LaserGame/ subdir +# Copyright (C) 2003 Jan Kratochvil +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; exactly version 2 of June 1991 is required +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +include $(top_srcdir)/Makefile-head.am + +EXTRA_DIST+= \ + ListItem.pm \ + Index.html.pl \ + LaserGame.png diff --git a/project/Makefile.am b/project/Makefile.am index 22fa393..9c4769a 100644 --- a/project/Makefile.am +++ b/project/Makefile.am @@ -20,7 +20,7 @@ include $(top_srcdir)/Makefile-head.am SUBDIRS= \ step \ - icp \ + Islet \ FordFulk \ Heat \ kix \ @@ -56,7 +56,11 @@ SUBDIRS= \ ppp9k \ LaceMail \ line9k \ - captive + captive \ + PortDiag \ + CasioA \ + LaserGame \ + ShortRel EXTRA_DIST+= \ Index.html.pl \ diff --git a/project/PortDiag/Index.html.pl b/project/PortDiag/Index.html.pl new file mode 100755 index 0000000..b3b6b94 --- /dev/null +++ b/project/PortDiag/Index.html.pl @@ -0,0 +1,41 @@ +#! /usr/bin/perl +# +# $Id$ +# Main page of 'My::Project::PortDiag' +# Copyright (C) 2003 Jan Kratochvil +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; exactly version 2 of June 1991 is required +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +package project::PortDiag::Index; +require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway +our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; }; +our $CVS_ID=q$Id$; +use strict; +use warnings; + +BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,)[0]]}; eval "use lib '$top_dir'"; close F; } +use My::Web; +use My::Project; +use project::PortDiag::ListItem; + + +My::Project->init_project( + "__PACKAGE__"=>__PACKAGE__, + "ListItem"=>\@project::PortDiag::ListItem::ListItem, + ); + +print '
'.My::Web::img("PortDiag","PortDiag Snapshot").'
'."\n"; + +My::Web->footer(); diff --git a/project/PortDiag/ListItem.pm b/project/PortDiag/ListItem.pm new file mode 100755 index 0000000..6f3f35c --- /dev/null +++ b/project/PortDiag/ListItem.pm @@ -0,0 +1,51 @@ +#! /usr/bin/perl +# +# $Id$ +# Definition of 'My::Project::PortDiag' for list.cgi.pl +# Copyright (C) 2003 Jan Kratochvil +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; exactly version 2 of June 1991 is required +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +package project::PortDiag::ListItem; +require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway +our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; }; +our $CVS_ID=q$Id$; +use strict; +use warnings; + +use My::Web; + + +our @ListItem=( + "name"=>"I/O Port Diagnostics", + "priority"=>4, + "download"=>"PortDiag.lha", + "link-source file"=>"PortDiag.asm", + "aminet"=>"hard/hack/PortDiag", + "summary"=>"Hardware Analysing Utility", + "license"=>"PD", + "maintenance"=>"ready", + "language"=>"680x0 asm", + "description"=><<"HERE", +

PortDiag is generally used for low-level hardware watching and modifying. +It has support for all the bits of the four CIA ports, digital and analog parts +of the game ports, serial port TXD and RXD signals and selective system +allocation of this hardware.

+

Hardware issues and images by the courtesy of +@{[ a_href 'http://www.pavouk.org/','Pavel "Pavouk" Ruzicka' ]}.

+HERE + ); + +1; diff --git a/project/PortDiag/Makefile.am b/project/PortDiag/Makefile.am new file mode 100644 index 0000000..08328cd --- /dev/null +++ b/project/PortDiag/Makefile.am @@ -0,0 +1,24 @@ +# $Id$ +# automake source for the Makefile of project/PortDiag/ subdir +# Copyright (C) 2003 Jan Kratochvil +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; exactly version 2 of June 1991 is required +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +include $(top_srcdir)/Makefile-head.am + +EXTRA_DIST+= \ + ListItem.pm \ + Index.html.pl \ + PortDiag.png diff --git a/project/PortDiag/PortDiag.asm b/project/PortDiag/PortDiag.asm new file mode 100644 index 0000000..a6cc02b --- /dev/null +++ b/project/PortDiag/PortDiag.asm @@ -0,0 +1,1017 @@ +;############################################### +;### SPECIAL WARNING FOR NORMAL PROGRAMMERS: ### +;############################################### +;###### Please don't read this source !!! ###### +;##### It is completely ALTERNATIVELY made ##### +;### from scratch. Reading such thing may and ## +;### possibly WILL leave permanent damage to ### +;################ your _mind_. ################# +;##### Special recommendation for Lemming. ##### +;############################################### + +;DEBUG equ 1 + + include "ssmac.h" + +WARN_DDR_MASK equ $FFF800FF +WARN_PR_MASK equ $00000001 + +ciaa equ $bfe001 +ciab equ $bfd000 +CIABaseA4 equ ciab +BaseA4 equ $dff000 +TEXT_PEN equ 1 +BGND_PEN equ 0 + + dv.b ST_joy0daty + dv.b ST_joy0datx + dv.b ST_joy1daty + dv.b ST_joy1datx + dv.b ST_pot0daty + dv.b ST_pot0datx + dv.b ST_pot1daty + dv.b ST_pot1datx + dv.l DefCIAIO + dv.l SigMask + dv.l MyWindow + dv.l StdFont + dv.l potgobase + dv.l diskbase + dv.l miscbase + dv.l OrigWPtr + dv.l VisualInfo + dv.w GameAlloced + dbuf ScrTitBuf,80 + dv.b CleanServ + dv.b Signaled + dv.b InitCounters + dv.b DiskAlloc + dv.b PortAdd + + start + + move.l 4.w,a6 + addq.b #1,TDNestCnt(a6) + gett RzPortName,a1 + call FindPort + tst.l d0 + beq.s NoPortFound + move.l d0,a1 + move.l MP_SIGTASK(a1),a1 + moveq #1<<6,d0 + rol.l #8,d0 + call Signal + call Permit + dtl ,a0 + bra.s SSExitError + +NoPortFound lea RzPort(pc),a1 + move.l ThisTask(a6),MP_SIGTASK(a1) + call AddPort + call Permit + stv PortAdd + lea StdAttr(pc),a0 + call gfx,OpenFont + put.l d0,StdFont + beq.s OpenWinFail + dtl ,a1 + call exec,OpenResource + put.l d0,diskbase + beq.s OpenWinFail + dtl ,a1 + call OpenResource + put.l d0,miscbase + beq.s OpenWinFail + sub.l a0,a0 + call intuition,LockPubScreen + move.l d0,ScrLock + bne.s LockScrOK +OpenWinFail dtl ,a0 +SSExitError jump ss,ExitError + +LockScrOK move.l d0,a0 + sub.l a1,a1 + call gadtools,GetVisualInfoA + put.l d0,VisualInfo + beq.s OpenWinFail + move.l d0,d5 + lea AGamePort(pc),a0 + call CreateContext + lea GNGadgets(pc),a3 + clr.l -(sp) + clr.l -(sp) + push #GA_Immediate +GGNG_Loop tst.l d0 + beq.s OpenWinFail + move.l d0,a0 + move.l a3,a1 + tst.b gng_GadgetID+1(a1) + bmi.s GGNG_Skip + move.l sp,4(sp) +GGNG_Skip lea gng_VisualInfo(a3),a3 + move.l d5,(a3)+ + moveq #BUTTON_KIND,d0 + move.l sp,a2 + call CreateGadgetA + tst.w (a3) + bne.s GGNG_Loop + tst.l d0 + beq.s OpenWinFail + lea 1*8+4(sp),sp + lea NewMyWindow(pc),a0 +;;; move.w #CUSTOMSCREEN,nw_Type(a0) + clr.l -(sp) + dt ScrTitle, + tpea ScrTitle + push #WA_ScreenTitle + push sp + push #WA_AutoAdjust + moveq #0,d0 + move.w NewMyWindow+nw_Width(pc),d0 + push d0 + push #WA_InnerWidth + move.w NewMyWindow+nw_Height(pc),d0 + push d0 + push #WA_InnerHeight + move.l sp,a1 + call intuition,OpenWindowTagList + put.l d0,MyWindow + beq OpenWinFail + get.l sv_thistask,a0 + put.l pr_WindowPtr(a0),OrigWPtr + move.l d0,pr_WindowPtr(a0) + lea 4*8+4(sp),sp + move.l d0,a0 + move.l wd_UserPort(a0),d6 + move.l wd_RPort(a0),d2 + sub.l a1,a1 + call gadtools,GT_RefreshWindow + lea BorList(pc),a2 + move.w (a2)+,d0 + get.l intuitionbase,a6 +NextBorder lea (a2,d0.w),a1 + move.l d2,a0 + moveq #0,d0 + moveq #0,d1 + call DrawBorder + move.w (a2)+,d0 + bne.s NextBorder + get.l StdFont,a0 + move.l d2,a1 + call gfx,SetFont + move.l d2,a0 + lea MyWinITexts(pc),a1 + moveq #0,d0 + moveq #0,d1 + call intuition,PrintIText + dtl ,a1 + call exec,OpenResource + put.l d0,potgobase + beq OpenWinFail + get.l intuitionbase,a6 + bsr ActivateScreen + call ss,TrackSignal + moveq #0,d2 + bset d0,d2 + put.l d2,SigMask + move.l CIABaseA4Ptr(pc),a4 + move.b ciaa+ciaddra-CIABaseA4(a4),d0 + rol.w #8,d0 + move.b ciaa+ciaddrb-CIABaseA4(a4),d0 + rol.l #8,d0 + move.b ciab+ciaddra-CIABaseA4(a4),d0 + rol.l #8,d0 + move.b ciab+ciaddrb-CIABaseA4(a4),d0 + put.l d0,DefCIAIO + stv.b CleanServ + moveq #INTB_VERTB,d0 + lea IntStruct(pc),a1 + move.l v,IS_DATA(a1) + call exec,AddIntServer +LoopIDCMP lea SetSelected(pc),a1 + bsr DoRoutUpdate + get.l MyWindow,a2 + move.l wd_RPort(a2),d3 + move.l d3,a1 + moveq #TEXT_PEN,d0 + call gfx,SetAPen + move.l d3,a1 + moveq #BGND_PEN,d0 + call SetBPen + move.l joy0dat(a4),d2 + geta ST_joy0daty,a0 + moveq #64,d0 + moveq #125,d1 + lea G12l+gg_GadgetID(pc),a2 + lea G12r+gg_GadgetID(pc),a3 + bsr ProcCounterLR ;joy0daty + moveq #64,d0 + moveq #114,d1 + lea G11l+gg_GadgetID(pc),a2 + lea G11r+gg_GadgetID(pc),a3 + bsr ProcCounterLR ;joy0datx + move.w #216,d0 + moveq #125,d1 + lea G22l+gg_GadgetID(pc),a2 + lea G22r+gg_GadgetID(pc),a3 + bsr ProcCounterLR ;joy1daty + move.w #216,d0 + moveq #114,d1 + lea G21l+gg_GadgetID(pc),a2 + lea G21r+gg_GadgetID(pc),a3 + bsr ProcCounterLR ;joy1datx + move.l pot0dat(a4),d2 + moveq #64,d0 + move.w #147,d1 + bsr.s ProcCounter ;pot0daty + moveq #64,d0 + move.w #136,d1 + bsr.s ProcCounter ;pot0datx + move.w #216,d0 + move.w #147,d1 + bsr.s ProcCounter ;pot1daty + move.w #216,d0 + move.w #136,d1 + bsr.s ProcCounter ;pot1datx + stv.b InitCounters + clrv.b Signaled + get.l SigMask,d0 + move.l d6,a0 + move.b MP_SIGBIT(a0),d1 + bset d1,d0 + or.w #SIGBREAKF_CTRL_C!SIGBREAKF_CTRL_E,d0 + call exec,Wait + btst #SIGBREAKB_CTRL_C,d0 + beq.s TestFlagE +SSReportBreak moveq #err_break,d0 +SSReportError jump ss,ReportError + + +PC_Return tstv.b InitCounters + beq.s PC_Cont + cmp.l d0,d0 + rts + +ProcCounter rol.l #8,d2 + cmp.b (a0)+,d2 + beq.s PC_Return +PC_Cont move.l a0,d5 + move.b d2,-(a0) + move.l d3,a1 + call Move + move.l d3,a1 + moveq #RP_JAM2,d0 + call SetDrMd + moveq #0,d0 + move.b d2,d0 + move.w d0,-(sp) + move.l sp,a1 + subq #4,sp + move.l a2,d4 + move.l sp,a2 + dtl <%02x>,a0 + call ss,FormatStr + move.l d4,a2 + move.l d3,a1 + move.l sp,a0 + moveq #2,d0 + call gfx,Text + addq #6,sp + move.l d5,a0 + move.l sp,d0 +Return2 rts + +ActivateScreen move.l ScrLock(pc),a0 + jump ScreenToFront + +TestFlagE btst #SIGBREAKB_CTRL_E,d0 + beq.s RetryIDCMP + get.l MyWindow,a0 + call intuition,ActivateWindow + get.l MyWindow,a0 + call WindowToFront + bsr.s ActivateScreen +RetryIDCMP move.l d6,a0 + call gadtools,GT_GetIMsg + tst.l d0 + beq LoopIDCMP + move.l d0,a1 + movem.l im_Class(a1),d2/d3/a3 + call GT_ReplyIMsg + btst #9,d2 ;bit(IDCMP_CLOSEWINDOW) + bne.s Return2 + moveq #0,d0 + move.l CIABaseA4Ptr(pc),a4 + btst #6,d2 ;bit(IDCMP_GADGETUP) + beq.s NoGadUp + move.b gg_GadgetID+1(a3),d0 + addq.b #4,d0 + bcc.s RetryIDCMP + move.b DefCIAIO(v,d0.w),d1 + add.w d0,d0 + add.w CIAddrTab(pc,d0.w),a4 + move.b d1,(a4) +SafeSetCIA nop + move.b (a4),(a4) + bra.s RetryIDCMP + +CIAprTab dc.w ciaa+ciapra-CIABaseA4 + dc.w ciaa+ciaprb-CIABaseA4 + dc.w ciab+ciapra-CIABaseA4 + dc.w ciab+ciaprb-CIABaseA4 +CIAddrTab dc.w ciaa+ciaddra-CIABaseA4 + dc.w ciaa+ciaddrb-CIABaseA4 + dc.w ciab+ciaddra-CIABaseA4 + dc.w ciab+ciaddrb-CIABaseA4 +CIAEndTab + +NoGadUp btst #5,d2 ;bit(IDCMP_GADGETDOWN) + beq.s RetryIDCMP + move.b gg_GadgetID+1(a3),d0 + beq.s RetryIDCMP + subq.b #1,d0 + cmp.b #64,d0 + bcc.s OtherButtonDown + move.w d0,d1 + lsr.w #3,d0 + add.w d0,d0 + lea Warn_DDR_Mask(pc),a0 + subq.w #8,d0 + bcc.s ItsddrChange + addq #4,a0 + move.w CIAEndTab(pc,d0.w),d2 + btst d1,(a4,d2.w) + bne.s ItsddrChange +CallScrBeep bsr.s DoScrBeep + bra RetryIDCMP + +DoScrBeep move.l ScrLock(pc),a0 ;(#66) + jump intuition,DisplayBeep + +ItsddrChange tstv.l Arg_Force + bne.s NoWarnBit + move.l (a0),d3 + btst d1,d3 + beq.s NoWarnBit + mpush d0/d1/a0 + dtl.lc ,a0 + dt.lc + dt.lc + dt.lc <> + dt.lc + dt.lc + dt.lc <> + dt.lc + dt.l + dtl ,a2 + call ss,SimpleRequest + subq.l #1,d0 + mpop d0/d1/a0 + bne RetryIDCMP + bclr d1,d3 + move.l d3,(a0) +NoWarnBit add.w CIAddrTab(pc,d0.w),a4 + bchg d1,(a4) + bra SafeSetCIA + +Warn_DDR_Mask dc.l WARN_DDR_MASK,WARN_PR_MASK + +OtherButtonDown bne.s NoWritePotgo +;+++ Pressed "Start potgo" +++ (#65) + moveq #1,d0 ;START + moveq #1,d1 ;START + call potgo,WritePotgo + bra RetryIDCMP + +NoWritePotgo sub.b #66,d0 + bmi.s CallScrBeep + bne.s NoTXD + opt nochkimm ;(#67) + move.b adkconr+BaseA4,d0 + opt chkimm + and.b #ADKF_UARTBRK>>8,d0 + bchg #ADKB_UARTBRK-8,d0 + lsl.b #4,d0 + bset #ADKB_UARTBRK-8,d0 + opt nochkimm + move.b d0,adkcon+BaseA4 + opt chkimm + bra RetryIDCMP + +NoTXD subq.b #1,d0 + cmp.b #8,d0 + bcc.s NoPotgoBits + moveq #0,d1 ;(#68)..(#75) + bset d0,d1 + rol.w #8,d1 + get.l potgobase,a6 + move.w $28(a6),d0 + and.w d1,d0 + eor.w d1,d0 + call WritePotgo + bra RetryIDCMP + +NoPotgoBits subq.b #8,d0 + bne NoASerial + moveq #MR_SERIALPORT,d2 + lea ASerial+gg_GadgetID(pc),a2 + dtl ,a3 +DoAParallel move.l a2,d7 + bsr.s ClearScrTit + geta ScrTitBuf,a0 +CopySerParName move.b (a3)+,(a0)+ + bne.s CopySerParName + lea 6(a0),a4 + subq #1,a0 + dtl ,a1 +CopySerParSuff move.b (a1)+,(a0)+ + bne.s CopySerParSuff + move.l d7,a2 + tst.b (a2) + bne.s DoFreeSerPar + lea -1(a0),a3 + bsr.s SerParHalf + addq.l #1,d2 + bsr.s SerParHalf + dtl ,a0 + moveq #-1,d0 + move.l d7,a2 +CopySerParSucc move.b (a0)+,(a4)+ + bne.s CopySerParSucc + bsr SetSelected + bra.s DoScrWinTitle + +ClearScrTit get.l MyWindow,a0 + moveq #-1,d0 + move.l d0,a1 + sub.l a2,a2 + jump intuition,SetWindowTitles + +DoFreeSerPar bsr.s FreeSerParRout + gett GivenSys,a0 + moveq #0,d0 + bra.s CopySerParSucc + +SerParHalf move.l d2,d0 + lea IntName(pc),a1 + move.l 4.w,a0 + addq.b #1,TDNestCnt(a0) + call misc,AllocMiscResource + tst.l d0 + beq.s JumpExecPermit + move.l d0,a0 + moveq #31,d0 +CopyLimName move.b (a0)+,(a3)+ + dbeq d0,CopyLimName + clr.b (a3) + bsr.s JumpExecPermit + move.l d2,d0 + and.b #~1,d0 + cmp.l d0,d2 + beq.s DontFreeRest + bsr.s JumpMiscFree +DontFreeRest addq #4,sp + bsr DoScrBeep +DoScrWinTitle geta ScrTitBuf,a2 + bra DoScrTitle + +FreeSerParRout move.l d2,d0 + bsr.s JumpMiscFree + move.l d2,d0 + addq.l #1,d0 +JumpMiscFree jump misc,FreeMiscResource + +JumpExecPermit jump exec,Permit + +NoASerial moveq #MR_PARALLELPORT,d2 + lea AParallel+gg_GadgetID(pc),a2 + dtl ,a3 + subq.b #2,d0 + bcs DoAParallel + bne NoADisk + lea ADisk+gg_GadgetID(pc),a2 + tst.b (a2) + bne ADiskDoFree + move.l a2,d7 + get.l MyWindow,a0 + get.l intuitionbase,a6 + cmp.w #39,LIB_VERSION(a6) + bcs.s StupidGfx2 + move.l a0,a3 + clr.l -(sp) + push sp + push #WA_BusyPointer + push sp + push #WA_PointerDelay + move.l sp,a1 + call SetWindowPointerA + move.l a3,a0 +StupidGfx2 moveq #-1,d4 + move.l d4,a1 + dtl ,a2 + call SetWindowTitles + get.l diskbase,a6 + moveq #3,d2 +LoopADiskUnit move.l d2,d0 + call AllocUnit + tst.l d0 + sne d1 + move.b d1,d0 + roxr.b #1,d0 + roxl.b #1,d3 + bsr PushSw + dbra d2,LoopADiskUnit + put.b d3,DiskAlloc + get.l sv_thistask,a2 + lea pr_MsgPort(a2),a2 +RetryGetUnit lea DRUnit(pc),a1 + move.l a2,a0 + move.l a0,MN_REPLYPORT(a1) + call disk,GetUnit + tst.l d0 + bne.s GotUnit + move.l 4.w,a6 +RetryGiveReply move.l a2,a0 + call WaitPort + move.l a2,a0 + call GetMsg + tst.l d0 + beq.s RetryGiveReply + bra.s RetryGetUnit + +GotUnit move.l d7,a2 + moveq #-1,d0 + bsr SetSelected + dtl ,a0 + move.l sp,a1 + geta ScrTitBuf,a2 + call ss,FormatStr + lea 4*4(sp),sp + get.l intuitionbase,a6 + cmp.w #39,LIB_VERSION(a6) + bcs.s SetTitnRet + clr.l -(sp) + clr.l -(sp) + push #WA_Pointer + move.l a3,a0 + move.l sp,a1 + call SetWindowPointerA + lea (1*8+4)+(2*8+4)(sp),sp +SetTitnRet get.l MyWindow,a0 + move.l d4,a1 + call SetWindowTitles + bra RetryIDCMP + +ADiskDoFree bsr FreeDiskRes + moveq #0,d0 + bsr SetSelected + dtl.c ,a2 + dt GivenSys, +DoScrTitle get.l intuitionbase,a6 + moveq #-1,d4 + bra.s SetTitnRet + +NoADisk subq.b #1,d0 + bne RetryIDCMP + lea AGamePort+gg_GadgetID(pc),a2 + get.l potgobase,a6 + tst.b (a2) + bne.s ADoFreeGame + move.w #$5501,d0 + move.w d0,d2 + call AllocPotBits + and.w d2,d0 + beq.s AGameFailed + put.w d0,GameAlloced + moveq #4,d2 + ror.w #2,d0 +LoopPushRol bsr.s PushRolSw + dbra d2,LoopPushRol + moveq #-1,d0 + bsr SetSelected + bsr ClearScrTit + dtl ,a0 + move.l sp,a1 + geta ScrTitBuf,a2 + call ss,FormatStr + lea 5*4(sp),sp + bra.s DoScrTitle + +PushRolSw rol.w #2,d0 + scs d1 +PushSw neg.b d1 + ext.w d1 + lsl.w #2,d1 + dt + dt NoMsg, + gett NoMsg,a0 + sub.w d1,a0 + move.l (sp),a1 + move.l a0,(sp) + jmp (a1) + +AGameFailed bsr DoScrBeep + dtl ,a2 + bra.s DoScrTitle + +ADoFreeGame get.w GameAlloced,d0 + clrv.w GameAlloced + call FreePotBits + moveq #0,d0 + bsr SetSelected + dtl ,a2 + bra DoScrTitle + +FreeDiskRes call disk,GiveUnit + get.b DiskAlloc,d3 + ror.b #4,d3 + moveq #3,d2 +LoopFreeUnit rol.b #1,d3 + bcc.s SkipFreeUnit + move.l d2,d0 + call FreeUnit +SkipFreeUnit dbra d2,LoopFreeUnit + rts + +Cleanup move.l 4.w,a6 + tstv.b PortAdd + beq.s NoPortAdd + clrv.b PortAdd + lea RzPort(pc),a1 + call RemPort +NoPortAdd tstv.b CleanServ + beq.s NoCleanServ + clrv.b CleanServ + lea IntStruct(pc),a1 + moveq #INTB_VERTB,d0 + call RemIntServer +NoCleanServ lea ADisk+gg_GadgetID(pc),a2 + tst.b (a2) + beq.s NoFreeDisk + clr.b (a2) + bsr.s FreeDiskRes +NoFreeDisk lea ASerial+gg_GadgetID(pc),a2 + tst.b (a2) + beq.s NoFreeSerial + clr.b (a2) + moveq #MR_SERIALPORT,d2 + bsr FreeSerParRout +NoFreeSerial lea AParallel+gg_GadgetID(pc),a2 + tst.b (a2) + beq.s NoFreeParallel + clr.b (a2) + moveq #MR_PARALLELPORT,d2 + bsr FreeSerParRout +NoFreeParallel get.w GameAlloced,d0 + beq.s NoFreeGamePort + clrv.w GameAlloced + call potgo,FreePotBits +NoFreeGamePort get.l MyWindow,d0 + beq.s NoMyWindow + clrv.l MyWindow + get.l sv_thistask,a0 + get.l OrigWPtr,pr_WindowPtr(a0) + move.l d0,a4 + move.l 4.w,a6 + addq.b #1,TDNestCnt(a6) +ClearWinPort move.l wd_UserPort(a4),a0 + call GetMsg + tst.l d0 + beq.s WinPortCleared + move.l d0,a1 + call ReplyMsg + bra.s ClearWinPort + +WinPortCleared move.l a4,a0 + moveq #0,d0 + call intuition,ModifyIDCMP + call exec,Permit + move.l a4,a0 + call intuition,CloseWindow +NoMyWindow get.l StdFont,d0 + beq.s NoCloseFont + clrv.l StdFont + move.l d0,a1 + call gfx,CloseFont +NoCloseFont lea AGamePort(pc),a1 + move.l (a1),a0 + clr.l (a1) + call gadtools,FreeGadgets + get.l VisualInfo,a0 + clrv.l VisualInfo + call FreeVisualInfo + sub.l a0,a0 + lea ScrLock(pc),a0 + move.l (a0),a1 + clr.l (a0) + jump intuition,UnlockPubScreen + +GadTable dc.w AA0l+gg_GadgetID-*-2 + dc.w AA1l+gg_GadgetID-*-2 + dc.w AA2l+gg_GadgetID-*-2 + dc.w AA3l+gg_GadgetID-*-2 + dc.w AA4l+gg_GadgetID-*-2 + dc.w AA5l+gg_GadgetID-*-2 + dc.w AA6l+gg_GadgetID-*-2 + dc.w AA7l+gg_GadgetID-*-2 + dc.w AB0l+gg_GadgetID-*-2 + dc.w AB1l+gg_GadgetID-*-2 + dc.w AB2l+gg_GadgetID-*-2 + dc.w AB3l+gg_GadgetID-*-2 + dc.w AB4l+gg_GadgetID-*-2 + dc.w AB5l+gg_GadgetID-*-2 + dc.w AB6l+gg_GadgetID-*-2 + dc.w AB7l+gg_GadgetID-*-2 + dc.w BA0l+gg_GadgetID-*-2 + dc.w BA1l+gg_GadgetID-*-2 + dc.w BA2l+gg_GadgetID-*-2 + dc.w BA3l+gg_GadgetID-*-2 + dc.w BA4l+gg_GadgetID-*-2 + dc.w BA5l+gg_GadgetID-*-2 + dc.w BA6l+gg_GadgetID-*-2 + dc.w BA7l+gg_GadgetID-*-2 + dc.w BB0l+gg_GadgetID-*-2 + dc.w BB1l+gg_GadgetID-*-2 + dc.w BB2l+gg_GadgetID-*-2 + dc.w BB3l+gg_GadgetID-*-2 + dc.w BB4l+gg_GadgetID-*-2 + dc.w BB5l+gg_GadgetID-*-2 + dc.w BB6l+gg_GadgetID-*-2 + dc.w BB7l+gg_GadgetID-*-2 + dc.w AA0r+gg_GadgetID-*-2 + dc.w AA1r+gg_GadgetID-*-2 + dc.w AA2r+gg_GadgetID-*-2 + dc.w AA3r+gg_GadgetID-*-2 + dc.w AA4r+gg_GadgetID-*-2 + dc.w AA5r+gg_GadgetID-*-2 + dc.w AA6r+gg_GadgetID-*-2 + dc.w AA7r+gg_GadgetID-*-2 + dc.w AB0r+gg_GadgetID-*-2 + dc.w AB1r+gg_GadgetID-*-2 + dc.w AB2r+gg_GadgetID-*-2 + dc.w AB3r+gg_GadgetID-*-2 + dc.w AB4r+gg_GadgetID-*-2 + dc.w AB5r+gg_GadgetID-*-2 + dc.w AB6r+gg_GadgetID-*-2 + dc.w AB7r+gg_GadgetID-*-2 + dc.w BA0r+gg_GadgetID-*-2 + dc.w BA1r+gg_GadgetID-*-2 + dc.w BA2r+gg_GadgetID-*-2 + dc.w BA3r+gg_GadgetID-*-2 + dc.w BA4r+gg_GadgetID-*-2 + dc.w BA5r+gg_GadgetID-*-2 + dc.w BA6r+gg_GadgetID-*-2 + dc.w BA7r+gg_GadgetID-*-2 + dc.w BB0r+gg_GadgetID-*-2 + dc.w BB1r+gg_GadgetID-*-2 + dc.w BB2r+gg_GadgetID-*-2 + dc.w BB3r+gg_GadgetID-*-2 + dc.w BB4r+gg_GadgetID-*-2 + dc.w BB5r+gg_GadgetID-*-2 + dc.w BB6r+gg_GadgetID-*-2 + dc.w BB7r+gg_GadgetID-*-2 + dc.w G13l+gg_GadgetID-*-2 + dc.w G13r+gg_GadgetID-*-2 + dc.w G14l+gg_GadgetID-*-2 + dc.w G14r+gg_GadgetID-*-2 + dc.w G23l+gg_GadgetID-*-2 + dc.w G23r+gg_GadgetID-*-2 + dc.w G24l+gg_GadgetID-*-2 + dc.w G24r+gg_GadgetID-*-2 + dc.w S1l+gg_GadgetID-*-2 + dc.w S2l+gg_GadgetID-*-2 + dc.w G13m+gg_GadgetID-*-2 + dc.w G23m+gg_GadgetID-*-2 + dc.w G14m+gg_GadgetID-*-2 + dc.w G24m+gg_GadgetID-*-2 + +ProcCounterLR bsr ProcCounter + beq.s Return1ShEq + ror.b #2,d2 + scs d0 + bsr.s ChkSelected + rol.b #1,d2 + scs d0 + rol.b #1,d2 + scs d1 + eor.b d1,d0 + move.l a3,a2 +ChkSelected cmp.b (a2),d0 +Return1ShEq beq.s Return1 +SetSelected mpush d2/d3/a0/a1/a3 + move.b d0,(a2) + get.l MyWindow,a3 + move.l wd_RPort(a3),a1 + cmp.b #76,1(a2) + bcc.s NoImage + move.l a1,a0 + lea ImgZero(pc),a1 + move.w -gg_GadgetID+gg_LeftEdge(a2),d0 + move.w -gg_GadgetID+gg_TopEdge(a2),d1 + move.l -gg_GadgetID+gg_GadgetRender(a2),a3 + cmp.l a1,a3 + bne.s SS_DoInpOut + tst.b (a2) + beq.s SS_HaveImage + lea ImgOne(pc),a1 + bra.s SS_HaveImage + +NoImage moveq #RP_COMPLEMENT,d0 + call gfx,SetDrMd + move.l wd_RPort(a3),a0 + moveq #3,d0 + cmp.w #39,LIB_VERSION(a6) + bcs.s StupidGfx + call SetWriteMask ;failures ignored +StupidGfxJump move.l wd_RPort(a3),a1 + lea -gg_GadgetID+gg_LeftEdge(a2),a0 + move.w (a0)+,d0 ;LeftEdge->xmin + move.w (a0)+,d1 ;TopEdge->ymin + move.w (a0)+,d2 + add.w d0,d2 + subq.w #1,d2 ;xmax + move.w (a0),d3 + add.w d1,d3 + subq.w #1,d3 ;ymax + call RectFill +Ret_SetSelected mpop d2/d3/a0/a1/a3 +Return1 rts + +SS_DoInpOut lea ImgInput(pc),a1 + tst.b (a2) + beq.s SS_HaveImage + lea ImgOutput(pc),a1 +SS_HaveImage call intuition,DrawImage + get.l gfxbase,a6 + bra.s Ret_SetSelected + +StupidGfx move.b d0,rp_Mask(a0) + bra.s StupidGfxJump + +DoRoutUpdate lea CIABaseA4,a4 +CIABaseA4Ptr equ *-4 + lea GadTable(pc),a0 + lea CIAprTab(pc),a3 + moveq #7,d7 +ChkCIALoop move.w (a3)+,d0 + move.b (a4,d0.w),d2 + bsr.s ChkEight + dbra d7,ChkCIALoop + get.l potgobase,a4 + move.b $28(a4),d2 ;$28(potgobase)/W=Contents of POTGO/POTINP + bsr.s ChkEight + lea BaseA4,a4 +BaseA4Ptr equ *-4 + move.b potinp(a4),d2 + move.b d2,d0 + and.b #$05,d2 + and.b #$50,d0 + lsr.b #3,d0 + or.b d0,d2 + btst #ADKB_UARTBRK-8,adkconr(a4) + sne d0 ;TXD + roxr.b #1,d0 + roxl.b #1,d2 + btst #11-8,serdatr(a4) + sne d0 ;RXD + roxr.b #1,d0 + roxl.b #1,d2 + moveq #5,d3 + bra.s Chk8Loop + +ChkEight moveq #7,d3 +Chk8Loop move.w (a0)+,d0 + lea (a0,d0.w),a2 + ror.b d2 + scs d0 + cmp.b (a2),d0 + beq.s Chk8Okay + jsr (a1) +Chk8Okay dbra d3,Chk8Loop + rts + +IntRoutine tst.b Signaled(a1) + bne.s IntReturnQuick + move.l a1,v + mpush d2-d4/d7/a2-a4 + move.l sp,d4 + lea DoSignal(pc),a1 + bsr DoRoutUpdate + move.l joy0dat(a4),d0 + vcmp.l ST_joy0daty,d0 + bne.s DoSignal + move.l pot0dat(a4),d0 + vcmp.l ST_pot0daty,d0 + bne.s DoSignal + bra.s IntReturn + +DoSignal get.l SigMask,d0 + get.l sv_thistask,a1 + stv.b Signaled + call exec,Signal + move.l d4,sp +IntReturn mpop d2-d4/d7/a2-a4 +IntReturnQuick move.l BaseA4Ptr(pc),a0 + cmp.l d0,d0 + rts + +IntStruct dc.l 0,0 + dc.b NT_INTERRUPT,-128 + dc.l IntName + dc.l 0 ;IS_DATA + dc.l IntRoutine + +IntName dc.b 'PortDiag',0 + even + +DRUnit dc.l 0,0 + dc.b NT_MESSAGE,0 + dc.l IntName +DRReplyPort dc.l 0 + dc.w DRU_SIZE + + dc.l 0,0 + dc.b NT_INTERRUPT,-128 + dc.l IntName,0,0 ;LN_NAME,IS_DATA,IS_CODE + + dc.l 0,0 + dc.b NT_INTERRUPT,-128 + dc.l IntName,0,0 ;LN_NAME,IS_DATA,IS_CODE + + dc.l 0,0 + dc.b NT_INTERRUPT,-128 + dc.l IntName,0,0 ;LN_NAME,IS_DATA,IS_CODE + +RzPort dc.l 0,0 + dc.b NT_MSGPORT,-128 + dc.l RzPortName + dc.b PA_IGNORE,0 + dc.l 0 +RzPortHead dc.l RzPortTail +RzPortTail dc.l 0,RzPortHead + dc.b NT_MESSAGE,0 + + dt RzPortName, + +GNGadgets +GNGDefaultAA dc.w 44,78,72,13 + dc.l DefaultTxt,StdAttr + dc.w 252 + dc.l PLACETEXT_IN,0 + +GNGDefaultAB dc.w 196,78,72,13 + dc.l DefaultTxt,StdAttr + dc.w 253 + dc.l PLACETEXT_IN,0 + +GNGDefaultBA dc.w 348,78,72,13 + dc.l DefaultTxt,StdAttr + dc.w 254 + dc.l PLACETEXT_IN,0 + +GNGDefaultBB dc.w 500,78,72,13 + dc.l DefaultTxt,StdAttr + dc.w 255 + dc.l PLACETEXT_IN,0 + +GNGStartPotgo dc.w 318,106,134,15 + dc.l SPotgoTxt,StdAttr + dc.w 65 + dc.l PLACETEXT_IN,0 + + dc.w 0 + + dt DefaultTxt, + dt SPotgoTxt, + + include "PortDiagWin.asm" + +ScrLock equ NewMyWindow+nw_Screen + +BorList dc.w AABorder-*-2 + dc.w ABBorder-*-2 + dc.w BABorder-*-2 + dc.w BBBorder-*-2 + dc.w G1Border-*-2 + dc.w G1Border1-*-2 + dc.w G1Border2-*-2 + dc.w G1Border3-*-2 + dc.w G1Border4-*-2 + dc.w G2Border-*-2 + dc.w G2Border1-*-2 + dc.w G2Border2-*-2 + dc.w G2Border3-*-2 + dc.w G2Border4-*-2 + dc.w PotgoBorder-*-2 + dc.w SerialBorder-*-2 + dc.w AllocBorder-*-2 + dc.w 0 + + dt <$VER: PortDiag 1.0 (4.10.95)> + + tags + template + dv.l Arg_Force + exitrout Cleanup + finish + end diff --git a/project/PortDiag/PortDiag.lha b/project/PortDiag/PortDiag.lha new file mode 100644 index 0000000000000000000000000000000000000000..820fc7e9f21f9d8f4cfcad9489c0facd6ddb7786 GIT binary patch literal 23983 zcmagF1CS=c60SYAZQHhO+nycUwr$(kv2EMdj&0A~Jy&s0{1JagbVqeYXVz0$)$#S0 zZ#O9)t@STf+8{sx08d~50GfJqd;&li5mPfm7i(uHItwS8{W?`p0EOZJZ~#SszZ*D! z%3~xq0{{S^nQ>Z8>52F3H^5J9F{J}Z<+2Am*glikK*^cCUm{DfEqx0ZeJt$=0#&6R zPihaC6@bQq?b#fDU=8=RS7=N6`DXR64>?vxT)&)}n#0zlT=i&=JIQ$Kw!{Ne)|^>n z>dn3|^$Yd#l1SX#yzcbJt<9TYaIhExxGfVIRLOjV7CJngUL)}k=4tu3ctU!S2RR5u zgAYXkVjvTOIly6SW%pwj?%W8)qfe%M>jH{jjorgG`5b>i|VQrdvs=9&)7zoLGm^d`19(WM@et0ze1_J4a^`3qx~0-v6GZ(}gc4000!2 z;K8d*Ik^-s0%97Hq%#tdU_y8aAw&u>AX-JMxkLz13>2cdF2~vAL|`GwIsb?_Eh}BW z>_Z)!)!(=dCs_`oIu5nGE~C+H7sDM-qjnrCoen3to+}+!wN0gMXKA_FO1>XA-SKQ! z#x3l&`he^MyWl@=y4s546d|-9B5sFAA3TII7upcg0s0qk-KJy!C8GfMc`T}*j1KyQ zm6ws*tJw6;b8UiRFZ>yRQ;V#|uokO1_x2C`YgOL9aD z2L61IA=TIn9f%59-tPWk$uO;Z8{^0ALn_p#Kw07W^1Y0_X*0CLDr)Y@X$c+uyHN)% zNTZL}M5hQy@x>s-z6`?n%~6lvaV*#$fIGfH7zDnr1Tbno6SBtD;oF2QpZeKoPXg@L zuuX9vD295!+WL1ptD_E#**|T5@WK>BXejebc;;ISkJL{=vZm7J)*|&9kC96CuOJ?< zk*TJAimuBUZ>{|d5>!QnLV6Et`pv%uo(To#O4x5aAY?7QWpW^5u6p5m=DD7&Y2=Fi zwRvfV-1MV<)2Ck8BU=BX2Q!3^Qi5Mb4^b!LIV7>6;9jhCj6l?yy*f2l8IM)(k20 z;Cu{JAm_ebNfj%29S%{&zec~MB5)T%Qn!TUI-v8T1*wsQL5wszpcyaHXgfs~|R zRIG6XyPu<{4Z+nFw|k?p1PZG@MCu{`@>^F&4fGtVrjkY(w7&^cNAru&MDr`eeY|o3 zI!hlE9ITEKoC6_dgyLTR<#N!D{e z6H$1QT#uk>VaU>ih$r6^ASCju3-;fHf1o}SZS@U{3qJoieBy-0e?FZfyyUq3Y5g^Wst12=|vBmQC98FDd}I)8PiKm?d-LoW6$C&fzC za#J$b@Oh9vk5iHCjYLyK(zvF$02}rQq>a8UXuz_|X`7`M3~tcmlF1&*JBz;5*S=_F-(#i!npG4GZzY(14NlE8YW2tvf*WW`w_a zXc>CzHUzNhGcOMeu7?6f zA;n9!DUhc+d(&B4mt8^^W8PP~f5VWUO|4uRsyDr_90=_~JO<{|X`5Z&$9hS?CfVdV z66+23rrhdN?zAz;jbt{ccryq#lop{6Da3dt7X?reQhIWtnj6r$M0J3C`Gx_8@UHd$ zjE0!PSspg2CduVMjwPv^&5?ZSnHTT)bPd_lkU|w|v!T6JQKdLXN zh29U&Of+UfRlXH_(MJxkn=_}@vpE|OV?r?;{zFzt3(pu5kz#$}5sFe`wxB99^eFUw z_Xe&wXNZ|X8k|F!!yDZ%@o~z5y~n5s3l0n!!B)wAs951+Rh` zx}{@wvvsx!SuN>1TwyI#^aop5GuYe_MSSV~G%_t)e%Y$}IXk!J6Th+z{oCfGX>h_K z^kSDrUmAh=sB5da1X=AR)bt0NWCG2r67tQ^62m0GCq)GUi>M)*wOTKL` z0ooVGUJWGoY?zr^9Z6}lU}Hb%qo zXij7+(*s#AXtmm~c5DvbM?yWpE0EnL+e_C;x5~qcCPl$Tl(Lz*SlR7mPCBAOsx_*^ zYCgJ^Jxt>+xmq(kTSMDjyLHV#+m1UT2biN#mFjlrUd$zO&uK0C4f@f&%{=QanUByN z)VGr;+U)0E&@So2gdiyK2En4Irm@>Z7Ch^u7!(AvDtV!B!Jy2E6K)>;ucDToWOAz*b`K zLLI7V0SR>ae1iuWBIj>InwQMvYd$xU1a4;FT^D4q81$SjyYKW*r(j{;J+vkoEqJy* z)d!gY5G~*G-PosQXn@KRWTs2N^uwDlfWhTO`$1st48{#_2sT53@r)bP+R^Cia&}sS z9XAiN@Vh4))m2yFy7vAB`tlu*-gz%E@#n8BMsGJ+imPg$9X8Y~1!Y$bMlpd5GyHKE zk-GN;XL7g{`1tPSQxh7XIl|0&JQ<1inVfa6X?9^jSb!NZk$mL@y-GO19di{8L2$%b zg}agBm$$|AD_^l5dA;AMI!FsC`0Dp~>wI^8E%9<8S|kSD;UW3$XbKb*%UiQG@{72V z7k)KzIw73=TImZY=b{a0dy;~(gq4=X$Qkb@-(&g*X6;V<@kq&mC_DL)oJ2_)MUU#g zti?oMIGWjej^Ue?`xiH=Y~Y zI$@rl!5GRZTEZCHJq6{y9x<+i)AN-w0Y?VQLyRJD4ph_KolT*P(qq()^?KsGyVfsU zj-`d;+}RYBY$8%v{T97i7MDInq?h14YvrW>6K@xb^Wp@1HlrVfvyDaYhqT(cm|d)o z)7S==5_bMfI5V^SOu{y1&dJ1~{k-k?^cpxlW^bq+Cunj}V>UN_G!*BC7H_bF?lM6> zke(y*l?+K$ce{Tr)of`nZDfd%vg$3=xfwUMWl)GQHZ?U>8h*@Nmf@0W>#Ld)0drA~ z9ksR!Fk+gOB^8Sq!&&&gy82T0R4}wq8a5z@71+)Eh?NCioHP_Lnu~G0y@e^L-D;O~ z2XnC)ud-vN8jzZ*DN(~G2*cZ0!y+K0*C%X`3%uQunO~E&EOGD=7kFzCF-&yFP^#_} z?>IY}$;whIDc>sx5yNCCm_ zG2bi9HH=|Al+<<{c#D%WRMv(%))~Gr7Mx5vWu64y)djrFiZqPm6#v(C?bxRBIH^o| zDt;{s>@-VyX_k}(zRq#=947-Wd#W=$gpui>U&z*?jax(fbp7&juU||-Kb84idqv<{!QEvp7tCzpQ9=nsgtghiX1lFqmCk^3+{27 zKhT58^kEeGewp-x@oDkDx~meh3^1Onru1xnwnz0OnP@(}%NMiwe_UxjBA2kUa}w+) zJ3GC0wdOY5T)d7Ym9@-WZMg@c@#7{jiv$IXzl#7U2=nGc-A;p&2JVL3N0>($v-F26 zK;M&8^WbEx#53WC;T(#C&cE}01M;r}uI4Le!+7`Xf1fKzf|q>toy!h>$^u>${I&9H zaK+Dyl}qo}A9<>|~KLh8v5b&i5@YQ<&=Ov4SXCdJ@dkM}Mz2{LwzXg9Y1`h2vEtLGPG4N5@ z8%}-%4)b$dF9ElNdg^5GaS!|;0k_J6GtyGH7UVq5d((7#gg?Px-YB)VriT_SK;^L0)0{_p_ed{#(Avlh? zeCV@x6n#GUHxau{I0-pM@Lhk8239{Bn^)i@=9;FTf&(We(HFq_?^8^`<)9W1wmlLv zjR*-jV%Fx2H3B-<9Q+iVr&8cAN5D@#dp-=U;K0+N`VUqRaOtSYrtrK%Ht<_G@NBkm z4^zSEoQ#^cMTmD@)!Fv8N_WpWdm*^5z%-)JvFMagF z`{+huJ-?tACeRnY^nin~?gjMH2Iz&{miGGe#VPbB<5wBPIswq}$_atwL7$C^X@O#yoTNpv~$t}}Hn5Bht-SiuH6F25f|tgigKs`OKe<5z?bYXQA4^b;Ok z^69Bo|7eX_WfJQM{O#a7I>sB|FUWnJ32PE@!h`?cSVz@G*Z*+-iN+Hifn~uzrGX`%&wk6`gGTW6KoJfRUD1mH0QZ z3S!;zf4MVb!a9LiZT%PTY;1M(Up(2$_?5O8ABDdtZ#<{Y5CDI3x2Q8_l|!uiFLytq z#M*uT^0b)&Yc;mo@z3>KVm0z#4_Q%!weB%K{(oJ69+9OS1pbcftosLM2 zweTjY8-;!=VNE;M)bbBy4bM<&mjU|vgq1F7^|bysScmU}E>s`-rcaDVZ+1e>n1$1f zRV+OO1>WW$%=y@A4;1*RyXd%`7BZ{fJN`^SM%B;U?Ht#DWi5thtv3=~YZu)_A9LI- z>qT+%9zbuP=uqNnKcFA5-m$d40O&)pCgmhe{@m*4pKfG^e2;~lwiw%ifD?(1d)B{^ z-X=YXS^Z9={Rm=wn2)`XeaFoEZlD{}pbsy*i0(Ev{JS`X-m(C<5No$Uf4nrl_q`dO zeSa)^WZR81m$(Uf%(S0Dtd8&=1Z!5TG?^RaQwV>niS^W9yR$Y;TU{bc9<0OK7Tftx zf_1wZYb9FcC}z-KI=N(?%p_dp8DQIWgSKb=@-_Zp zwVUpI>w$4;yJ39Qc>Uq!pAC4pzbCz?zGu(CrC;lOwg#+n#%`KjJHN=eIM30xx^&Tc zuY!j4>e$4VsuMUL*=S!j>z$}F)`v_oSYz+Kx513fvP2La;aF_21f= z(3WtMzczx+9TniRVN2&lS|#&RtRd)$Xr#lQKc|N`g0VPK28?y)ts-7IFn% zPxtp?ykY!9~$}&HUa}3Rm58&x*dCde|I%J?|>KkV&Mq_ zyf#SpeCz{-?#8ZO1P4=V8fOf4e-EMVxSs(zqCw>khQJmCZ_~ME90CXZYPzGhRN$tq z`-_{aE}>;`_57lWTK8h)xORR!C#LSI+9lO^d6}c8)KyTZcZYSnec@RcYDW*mpc+CbJVM1kUSj$rv;1Rf+#4%5Z99+n% zJWCrp9-){4@ng+D(ECOlp>`BvTn6REfW23R3kWFN za19pr=^cbH5D5pnN5Y8kPPXS5x+1-$*b;Oxcg) z8w(z9ci@Tw9p2tCP!qgd=rI~f9?$l+efy@n=1DU52uV!x3 zj1nPHnh1-GBD2UJR7+|Qb&A?~A<@t%=P36m->4PQ0nsth$f)F~ZP8iLdC?WoHPLl3 z635dyVwD(6*3&b@W^sj>4qhd$N7wSJ`7ZHh@!&YyI7GZRJSsjVzC!*GJS9OAy@Wuq zah&2c67MA2Bv^7tazt`ga!zs!G9eX7DXDo{E^U(9g+XcGG|x0ddQ$p^w9>T7R4Sc@ zG!&+0Qg+IHbx@ngE!2MMQ1v$T4t0}i=P_jxS&58FbIIyOAz4KB;;cp4G1%|`V2Ki?B;JgL-v$FlNgRqyOgC05)&SO?%sp9S zSy!@7s(7kmm1Wh$^2j<=BdR}CBdROvbTvRNmY1mO)WN?!eYbWYc6W0uu;}epObCNUYK2*-I~2LdQ?an zLg&iq&m6iT-D8@Ay5p)>REJfka>GMqnfgp~jvcohH<0VM8=Tux&XL?lQrFu~(~W~C z>BVY;eu=(b&%V$553BE;Uv+PCZ*FgKZ$l5wea5l!G7fE8Zqt6-+3;C=e8A6DkT;CAbPa1>u}+ zIr}3H6^s_VYf!!5qk?HYWfT}!C|&x6##Vj5af@-c@qqD&ar9{6X!$5^tS;0978g1T z*9L|Pw!f(O2DZ@B1VMCdz(nNo1d(yE6Oe;+{nGTvxsxFwWtEP%1MaI0! zJa?gwXo%>UqQkFtXT3k@a#2k)x|yX`>&<4{Ih`CZH|zV2PnhphZ!ljY-p@WG4#Jz- zbi^B=T2Q=TWrAk5-aaD(saM$Twz~9OnuvJ|4_%k#+gpa>Kfx5+yI$C(x3k~RY>2tm z&Wb;8>tfu~hcmjrJ3nxL7`pd;js3>mfa|Dd|5Moy{j08o|J`Scxc_P}NdLRCPb+C_ z@8V2nVP=+7``Rn6g~5}1OEsrB(aNa*QA2_qv!2v? zQXp3bel*j2Ox#*Wv-}_6fBF5lZ~X@t`TqjDIRCFCPeA=Qv*G__HdR(?ZiaZSbsRg3 zx6cYh+s10(-;~0G2f0NoRYpcen%4uIN5I5aLG24~A4Jaw!fCI^$hIT@RcFnHQZds# z5dv7=6{)`4BrByff#|d{kep{*+6#`n0jdj%W@kCS+gwSQzMH|_^MUeqOZ`;#J-x^E zNk#A<>gfMPz4#w$#Q#IBW$I}6FVAE0|IIA_KbfunF#|u>swSBA?Kx}Qa%~o=iGNrK zOA5(bBo7Tu2=_HX5djll{#_Xy29E&3X>7#EF+-QAuw(-%$tNr23RqD?rL%lQmQJ}0 zQMoNB#UDsHHt6;*TFAPe%`;ALVAwap5u4Cl3qRlDA@kPZT?qP zqy_>2hz`a5yFB3kH#eP7@di)=;i>A%rS?&g z!IJw>6PJu0UuJhHuRi$O+j17;_)*nPNvgq8NM3ch=zp>A#(wX;f~*|m>##KD&jk)* z?6W8ba(9v%W=6?M`Mh0kuY5?U@nIhQ4$HUxj0M~m)Eu~+(boMFUCM@x@{@R2N~+;* zQbu1)V(WS@p>U_1i(6|af0g*sWCAcpq=5>iG{+=VN1FqreD;uFru1Cwj2bc;EMQ+p zpA%*qvwVG{U=Y5{Q$L&%SPn40w?@K=l`psP(Bh%gmZoraZ_SRZn4%&Mn0#<4mOFUB zo>tyOg$-2&kAM80bZ7U-QJ?(VnGyx%fj|~f>V*Z#9@n<_4_S-n;?9YC+6!@ko(7dV z)GH2WVG{^56@CdAOmMnmPlXM?Mm>#u-_SQ*lJzK|$4 z^Hlr_On2Ux+A<^wsCMOWJO-qg>~BqMv*Ii#5RdswLM2|c$BzBb?q=tuo0kBJR#lnm zftl{5pmTa^_vgX0b7?mMdkfqO+opB&{O9FpG{59yg<8uvM=lks-SSTgXKho-WQ{gF z>T&J5MU?9$tKW^n7yJi8c;d5qcFZ5#Q1}K>B9Bp(q>9(2SX@LS5BaL|_vFPnrKL#l zP880@Kc3KasyULd@)c)VWgb8)4AIzDNB%kCe-9(yF)!`ieGw#q{%Yn`=jW> z^rSChd1j1CmY+(~t1nS6ngch{zlx7M-`d;TDi)8A>1!XqD@{KE>S(g*K(}$Hj#J93{{j}Te;!r#Bqul8=+Kghd*r_LFB?M??MjRI0k8VK>!fpL@QgZN*pYYI?ro^%$P>)``33 z`U!jTA;#el1V%nOK7E{g8u{@kdsdD7$Ysxn*f(!|dErc(!8j!MuB0Y2a*gRU9C%LM z?N3KiJ{8$MqfbYEqcWo}2h`;EJnDuq=ZynrNY3Lom*XckaSLu^WNP9iie!Ec0op?~ z>u9pnbEZ-0^o55_WGaahG4a-brpDExsFuL{o-f`RhPI&;T|yi-y#l}?B*0*iejng;>6%C2l9(UAj0_x*}J zIjTod2n>`nG9{2QV|{Ks*v!tcCNx-M_>~Xpf+~g=C`I{H92F}!t}F=LHwq(3A_|{9 zG9K5i-M-^rU6LoLxY5u^sDyDVSiqU>M;R+<=Bdb|QS4YC+`aWo1cJq0Yfy+~cZ`Zw z`vCPB2w}5J5bVhihC1ywvYb-A37#g7tAybsR*PN&yxh>} z<&D>oU%tTgn+9Nj&k-}?T(g1Y8D2GX`}G<0c%$QFY*6!vo~*#ppKvJH?ed4Ki+A&R zd?mdq8iOVzYnNM4aue=X&iyd{s1ff-M4~D6c7<>lFASw|Fd0xH8}%)Xnm=L8doBo~ zel?%>&%`q|N=Qua;ieFf5M>qAOmgElSyIPz-&$I_ReC#M>e z$Xg15a$`;Sk$=wKk*9vRw?b%B<2k+;sX#e+gbIeR3RKIg%%T zpzf9aUdMRjpR6qrJu~*AZmM?$<~I5qTfg(f53E{(R5_G|%xiIau!o&V+fFJEM{zd+m%c@CDJSqGa^N$-Hy&{HQ$Td@P`BJ+U}5S6 z7_>Dx@#Q?wi$DT+06ydl5`7TX3(SI8N?1JTuCZ=9;iWa{dM961qM!GM%DnsAgBC@2sq2j|> zjDEfb!31u(m`8xYxjkOETBIjePaatq0)5BH|Bake0`dkgbw`1Q6UWj*E;2x?Wf7+D zDKvSbh(&6F&RW_>jhC_L1Es?FbsBUmw_ma$W&1NUPgXW~G_6NDPQy5qgi-8QM`-Ke z5wC!hZA%WMBv!--dVjd=DJ1dcAwF3}t1PCfv`XpzNVClT8)8-Dc+U^lm7Lx5$c9th zR!ikWUMhDc6+cay?(gxG^xe5@sG+n;od%`Uvg&B8ba`aG|5d}HMRFaDxEUnvC`ybT z%aI$k*$>ne+sM*3yhA7x@f<)0E8E1*vfIinN;a$iWa60;&sD*`dgHbkE`p1>gV~np zg@<77Zn2kZ&t{t5GpTv~idj^<)ZUd|Ug9}7<4Pm59=+Ji*P}+BN=+w(I%(s9`|egX zXEs&eJJw%{C{>^CSVRGq1_$;s%DkaK5%;uU$cl(_LplcS)mzL;HQlWBlv(=|=A$G8 zyuzi87cS*TxWw+DGdX4dF>7s8u@1feoSZ3%5mfQx#Q{4ZZil)QQx;(Wb01 z7#S0)k87qeHF@ZAvk)Q00*0z3`wynGSBzl%ilez7 z$d<$%9PjIjDT3@9dO1i6kEW1QM*=q(O!|;EwrQy|3pPY_tvUQCf>^!4Z;dwIjiB|Y zZQqu=1Zk$C!78e1mX+I-(Eu|W7wcFOmv0+bl8JoJtzH}pxB6ta=0Zj8lChwv8pq^} z0s5K*OnsDqXi&W63&O;9%c10!yowZI^^RySDwCEb3k8KYDSZE`z59M?0A$s zLbG+&s7)O?#v>({UvetCr1yskNF6!vUy>PAWM9A$>3HbJn*>^*wqESk&Y5?@G6X>!q8}~Ahrh=E}GY@ zz{GI-=1iTCfq+kO1j+zg8G^|1hFDZy5wS3N%6z8mfXBlaDF_9HB&Cx4t(}w+fiucD zLXq4MAZJx_J<7=gN)9L6U?)-M^!YQU}?3tXCi^89sZn~wLlI=~4miF^Vaz|3?WbJoiy$KNffs3gYJqJ@*d6_@xXjfoNi6=F;mk;$wP`PO-IrW`v9hsjiI_A^b97r z^a;UKo7@;gp@~Xm)HpvJTl>Syi5i;;!-&{@YxUem(VT%U%$HVbK2a5AwP59T5P9*; zfnX>iuP^NEC|!`{O8l$dE}|4N)Vo?iXW%Bgo1&!#-;xfyHlbO0BTYR_Bus88>EZ_; zPVpoo=M2}hNutw@EKmxM)8DKEJ=XUib$2cBe zgn7V)ltyhD*mIy>v|b(_^6-0dgJ&k+IScPhqp23Furc4>n&T?6j}%jcgl!(uGh)_4 z26mq&$UMKqHQk97Oxzz2EvTRmHcOc{YeSMm z0g^;25gurD*cDh3d`o*O#VQMjzmW*^8!$ZZv$0j#81x!e$vEwFESe;Guq>rT-S+6j z70UZj>;e3SM$Zn%n7(XW(;V=u1xL*momKE=P`X+GAHfCOg8@Lek{2Z|D3*zHYjX`+ z9;1})lSGT!Mw=v!!6l$zDrb8uM`Rx;8nm~p1Rh95JsMx|_xZxO%eQX^4mcu$_9hW5 zS(4*ujhn4S-Qv0PB&BRsqm)-TmFbx^&Tz=A5E_i}@T+i(*d2UQ$A+2cqEt`C*=`=_=tR>10Z}>jZs<$T< z*o1_wKGs!!4Wk;MiZ*x})d* zH?-w=5jx-#a3qe;7D*ju`gu6)?TVk8X< zo3qcv!vjn^XL~+`;(E1u8mPH_jg_2;F_1D=WLmZ(~)`*u5YBERp}D>B+sI$19PmLiEqpvXI#;D_%8(E(2AR21s!MarvCOD#N5 zm`oFVx$3&>F-f9nLV<&h_#!bpH0YaZ)1V@*lfsNHqh9RpmbP?5)&AyT4;%;DFtK7y z%fgX_v^B>kE3XehbJWS}9O1y0j#KFz9c1y2L48P0*_k5tudo-fjQNvaTcE zi^M1>PDT4t-k+EI!PzNwveR!oMCP?$j^M^8HbKC?yX6*lpxRcz`in4CNwmsJ{|cZ`yo z#CtKr>7ra+%OpDe%HebZE{aBCIy}wrg;^q@?n5afHi}JgeZOqVEEBJ*hWWjhEHP~O zzMHC>1<^b$UI3$E1F4IJ4bP!Cm!sv*-hF9ZNFW%Jf>Gx*Z=OL`|H4<_)7P0r`Z6!6 zWL$BFtO?LQoW*>V1Nn*>1p#AjKGjnH?_he2dq!M1BZe?ZjasvN3S_g ztgc-Y)Y&3_gh68mpVWk@3)uDiNyThxRH&&~QMc<(Wxlv9)`-Fd-VDT`G($;qKoIH} zz#G?a;RCls>WJ!g&s8+r_dv7EONN2Wejz#~n~pjp%CLj%Z1EuV3ssHKVBMQ5`!1j6 z1!KAGH*6~qtD7~c7_(ivP(0(gpRo_1<{PRBTsT8Je5Pi$^nG`K|0}CFn_Zt5TMbM# z*uFbvobP2$uDjKtriX$uZDGFh=zuSIwR+aiGEqSIDEi1*TYVm46dbUwK z*}r>c1M*Z{$gGK-%X#tXR4QTRqF-njY7Z8LiDDgx-(I|Sg4-=zsK4mM|0#N77!Go?9snAn!&EYGxPomF9F)*j`}MFD%sUI^xkH1tFP-WSu|t__`(i4<#+~>vnF$8hN|!HDYd5=R zjkcp=3Wx7%Pf=CfYdY^`mre$hMJBZLHh&35L$X^*w2cC3j@ZN*2~R3#bKvz4qOTQtFA^HhY9GNIn76{-7frBei1_s|sSa5W(!+qz zN+1^v+W_ye5fM0eszTTrOMtr1RGvZj&LxgK>IPk?AL4Q+`c1uAf0qQ->aPs)h-8>< zWz|f8Z1gKXY{;^o2SSCT;0;@Yw&6~w^hx|LtLC3qEM2niU(a8O<_76RdODRyEPeHX z%UNk!LdK;AVf81tdF5-0N11%$=tUXFH4$|Mz@i>-y%r*@uuge{dcv` z>@21Up-@eg%j#hfdZ^1<1(C@1*w+aPlet4dO(5ANFRScOFWjir?8bK}btEkPX3~?| z*L&ano_XcENvO+IcYX%l`fGGXy}mj8m*~6sbh6Vgp>AL_Xa}m6h9sDtwf6AD}5(_80E28SBI5=4cZ;xujiPR&Va-9`5I7-P8sVeuPNh zLZqL;(wB&cT(1$*ztfDUajkavlxcJ2HMCS;%3UN1mntfn)e@J^d^SIf>W`cVejUPY zzugC)s2p|LF1lm1U-!FZ0a)Gl?KWI}0PeNBZCn1y#-(Ak_d5=V`PrRzsa#?I9fb~; z07f((l!;LfLY;fR}k*bnad-a4%=pY0Pi^{vL$F+sisqIxD!f}Z6-D);bkVC(ty_> z3F>Ze{&1q`Oy0IXJHTy2*^cWhr1RZdIO~ElE}tD zRJx+e4P&*mF2QT))HOTLmzzkVVnT~eCX>?5qmDaMB@0iN?HQ_*cc$3V6{*{mrSloA z*WE=t(mvSQTLV<+hL(m_UYKh4UX<2E&*vR9#c4nlE7tt)=jAyy2-7wdL4D7ZEsCm3 z(E^gzM6oNZM{*FI*195ETkm77Y}~revT{58$qS2$gvnIZ6%h|Sg;g%JD;wziaBOb5 z9gDjsNi3j)rXDU%C&$kZcLUt#rl6xe5J!tE*)V zvrAn>Y)p%I7|4Xy6c#qjqaZU&mZq-oP&caG&Z;)R!3^T7ncm0x;BysDPL@iScgkBE z4DS!jqBoPVV7fciap$FJw5Lr@3%5(?3$L!u=Z~vzt%o3324RU6zP2Is{Q$Hg>JtPp zy|Q7`cQ!#2qhd%FDq%BxLp>ROM%`5?J%ms2L2;ZWPnnYvV!io-7R$i^OepL{1NXEz z2k(_l@*gsmJy@BW=F4C(ogG-$r4^;93rIJZk69hKJ$4N(0^N>SsL}MtOm(ei2Jx%W ze9N8EArh!#6ACXIHg)gupY^o6UlsXyHOj3HOEbqRLTDDEUXBN(>4zX(O)(DvpA&N= z?3UBPx;AC(lKCVJICPdAanK2$PaP*|bkRrd4rIv@I^j-b<<(+NEmX_Bq5MV{rmt;` zr}yxN7awm)$y0JL%RhJjyJC7}nvC-vC!%KXroZ=!iYmXAN!*nbiNd}@kX5TOeoUM2G0 z{pyY1nLT=Ih5c&^tu@~Ar&I_tOV2%b03W`5G`mJ%O??sSFTAR#)x|CPTyywF&c8h> zH@cF7vyPZ$a)i2*7J3x}pM!Y-_I?=H^X%4)F|-sb44A<>Kla!{eCMhdBYgT`Vo=z# zCNJkK96oza_*<1}imd0;Gzjlj7?=nd0#TEJc>y=RNCCCAO*nxdL12dH+^zg+tk|TL z#UdT)2t?$HDq}x1su{M}gPk;Q)`c2?glHZiTTh=)FD_@VUtOI&JDERtb8`Ij#d00? zUYxyIyt@CsTFE>5^ZanOn72AxqL-&Gu1?RNCP%W=1J@=WA2$ezwB78G%-v2#0Ob&7 z+bH)EE!hC_BJAMj%M-fHYp2^Oh^yj+MZVJ?#jFl8_%Y*m_d0iI6>Ka=;A$Tp(?}q3 zSxf@UL=&$O093brE`y%mlP-#NegwhIYN3yFDTok9sq4N&0O8o_<^I6;(JJM^h-gj($_O$-*|lr|nG zCA7jgWaFu|8|1aEt4jjIJh46t&HaxI=8V!&Vwm;22=}s!D;l@!O(3@j6tockTgPQM z3AAu2m3Y1HfQh zD1h2bX8_KC?1TgePqE+yY*M!|PjkTcz;<|ul!G7|4O=)HL3YT#$ssJVndbU@MVJce z%=)#5r>HhM$`2?jyeWB>_Ft+=>ywq;=&I5~f;{~9(y0SNa-c`nf!9-HDFocKdG5uK z0Clq!d2QXb)KOwC>gt8cI<5^OxIp?u=A38 z%a&6h`!T($5+-HDYfzz5J=6-^*B&MzyWet zZxzGwDHi|1001prX9ecUO5Cf0@JB#gJ;2ZVq?6+t)My(y2aQADjX>zqhtZ_BfUIAk zhBXIR>Lsf7GZ!E1VlV7tIfDC=aAuaU;-(F7i$iF%@C?EKWt{%rfFDO`d^|=XOjZBE z#H{f#(LLq+nYsf<3G7nuD!CLc2h(o)y#-&cNS8|UDsa~q$sl6Th!CH@%Y7WKGzd=R z4QFPJXBg7WFy2xlRIF?Gr4bvhuo)7A95Q}FpJ0tG5^^sUk;3D;w*@pD#Yg#m=V))M z-ml^(HorLk-V)m=nLwUmq=DdkMl7pI4UT3Hk;OYoRQyn9*jn_PvO>;1fsmYm6E#Km zm8~(4IREtYS^%1pChU0DMGB@z?2I9L6wsc*AKZ4lKS8kjl~5V3B19)y3g-i^B)Huz;s zxG4h0fY1AYhw-#y-W|H0&jo#B^H@Xm^x}MWEUJ4!Z20)-=+c1X)6WLE0TGkW8Ad&E zF^W!-ZcqKa*-6AvC2>)jYxMMRWt2kvo>H2VbV$WPm$`Nqs?aVy1>9wS_6FP;ShR$> z7>Yw96J9c%&pFM;!XVO37vdf#mwG0|$ z^8!;>q>)-9@maZs%;QnPEYV|uF_n9`3!$LrZccC*EVpG5`aM6;%?>jqKc8Z!4;*uV zui9}TV%qU0M#*tFShzjP{l{s`Z3=lR6)iB+EnAd~JjDf4lH6-O%f_?Q&-agBZ9k*E z{ObDT>YMR5?Idyws}kF4@Q2`|9S9kwyNaT^Y9)NjlXc4L724Q@DyE8r}shh?hM&80qa+$_~| zu}~k8ecrOn>d9eKYM^os7tszyPv5sr83B)FpqlLci>bJE6D4mJO-pezC`Z29;F9^g zsk5V3vR&+R2$YVfKLPc3$J8wX0oM&Wd}Sw;Fa0O{M`)b@Zp~i`C`Jbg&{fd8PoN5u z?xsvH+}oE{e)5?%d|I<7h@s%YKQ3@ISp(v36%(%sEa zQqnbobjyG+bcad}IW$O1w}MEQGzik&@doaFcfEJtyMOGn&i?xR&bQV%-(KI|V}pp9 zAjE8J0=wpl*)Z{L>5vn)hhY>DG6EC$>5rEl-m{epKM6wN>3jj4f3*nNyV$sH5C8iw zul~~^0|?_rzWdeO7k?hq!njnhc1R3Kt1co^KyB&Oy87%KJhM)on7v-~DSay@D%B_i zgPrJ7=6ixPDEd1nuMhmP?C9uviEnTYKU|?2lL`LuYV%Gf{wgDd&}GLcRrwP&2n)KP z%9*RafvGk8a!IytOH=}5U!cz9)Eu1f436;<=r$-C{=`nj2KRiFjn0pzl;68p za&-xnA{|hAYn^*@NGyMgR03FYlOS8k3452t62p^D=wyFj2l3C6S+>`}H2F=JCh;D< ziI;8D(5nA+ZbZT>8L6Y_B_hBO)le^fzMFEch0Hq3Fa?9ce48A8l^Kdf>96yvFy-bk zv^$I4W{NGNb7X%xzi&blvc4mg&5@~Zr})1g`Epv5d(S2gWbxl6aH8kRR5DfHYP1`S zkY1Ob{lQjS7lXa}*}UI4T=f?FtV!U``!{i=R&UU3+GsTJ&8j-7#C+0~jp5&0PKWu8 zO83I>sfK3YLcG(bnc>6XUCCZ}TrW~3*86X1Q3lkoA6T>TfoyiWjg3;YLwO||v9 z<@3y3rk%=^r07Gv5x*M{=n}Z`lKE%pya;tgIzY3gdxK$@aqu9jjrW$ncujjrL0dRxs7-=)Lq1#yX2OH7X0MV z)L{V!evA7D?y{aF{+Pesn;u#8aXB|Gb_{T!(P(B7$*A%ny5-L7^iWX6php-6fQsfp ztQYoTIx$=R?&tBf^YlCb*UvdWSD(%Ne&&Pu{8h9bCZlvKMHCa7MMSNrvv8y$ug)8! zOkUUr88zW)YfkQ)%!P)-7}HTA6N%)^o7Wszv4Uxty!NzB`Ao0g@~RAtb7S!~*}2H5 zj^7&m8Ec}|{x;^pGTXt(U*&H7VQ37imH*re+*(N=@Jixue)y`yp&YhSX-;OJUuLjz z;b~*EaiL#k9M=00cg@F(){4ugVU>xD*Ta$m$wMkr8!tLEZda8B@VYFuZ z{SDIP(e}HWbY18O%eDU0`+`udO~8`Ebxf)Dpaa=bFqOTrBD_1E;$_R07vp8;bpx}x_-?c@vAFj54EMG_5$+Gx9CB`*2 z0>T@41cZ0~j|&d}YMC{#cj1CJY5v*&_snQmeq3|FF!B3TBRD_)*?I{nyttskk^g6*Er~>UferyxzTn?)RR-BB}z<}mh1g(#2s+Z zVw9r2P!av6?6db(eS?p8YkD(dXHfV9beI_$mo{71KfHZV*^37q9zEf{$zC7+8LZ6+Ppe|E&P;;C}ONdGHcza46U9e!>@POKrZ{%7iY zyB`~bo8AEhfV8&vZMfwaU2;1}m}w9h>OOip=- zd|GMGBDl>g6E|)VSKP%n$9RRsRI{JrD5oI781Dz@YmU~Kfy}1=S^DD zvWTqvaWIvUl=_mpTZobDd$+Jj5b@rH5Q{;+f&$AIoz7S|BdQ`tFI+xWOC$%pzeN2a zj``x7NzvAeJt87S4d4lkMRV`)W7X>B+Uk111rE_m>9X+7jBpAa=S8z#7j@OZ3Z_4p zN8l}3maHo8pN&MD7w_AO)%^Uf?`U4{On=MLU_jFXeW&KVu8CTbU&MyK01b#)pG9!{ zw5LrrX-=WgA+t7GbCU&_s~uDZh5CKmEPiXwD})`@XJ&+U@eKVWvo14-w=`V$C~X?` z&2r~?L-Zw+I9kO@$~Wt?6|eT#1GEJdwI4gdKe))O`pnD?f#2E4^80KXZM>pKFtR^5 z4nMdK;gRL7q|FeHVq}NllBx8`@1Sv4S@AOkB7lbIixwn^JFCI1>eQRw_AbeuH=|0Y%}vdZ`E7TAUS^=sj*LwPGZpc4iANJzcEwkd4%fh zk{5zUPCzSFHiQKRKmqa25_G=X84h?vdQ&(WRSp2vdn|oW$HG5&%zT$lYr<-XpUTLy z%_m-FTzY$6>C@B>JaX;T=miUH z#OZg?BAy$C0 z(Fv$E3(>VG%EpCcWSRKdr0E3I7KhLAUpVEN|dn@Vbct!$4s zmiWi&Q;G0VJBzGgLLr6NjksJVoY#xH8oRXDwEd$v_gsNo>Z-iCEi`h6?@j{_ zaSe7Uulake56|BV>x{<^8(So|$%+nP5==fT&}occi2Fq_d5ytw)zUS~88nz$NlYtr zWRSsC$#dfQ@;g%;C|#GCKh>XOK6Q!wv=pSMPX*j|BvdbucGAU8^}it^^6}=-#VwGW zE2fYo6V<`F{mQ_O`ytmT1+!YSiR0>=4OLy2TRYbiMq(FSUJ`z9L_qXWN^@8_99W#C zA|3#N5Nya^r#zo4&Kkv}SZhdWPX&ir{Luj!^yKg;cn%SZ!ZF|Y{VsslqV=Uvn|_DnY7=oG%x^J#7WxJ z^0`>-b$|4!P;k;25IpkPk?mKRw3Q_r;RP@XW2?$DbcYqpXW}j|lW>RU1*350mo}WZ^CD8r-b;oet&$r#e%2XF zWk!)0^>Pm?O`@nH*&@S|$r|WSOBF_uVf9uID%*8%L@w)$gU4?1DQOah`asFqgr}rF zcb`#FpW0d5`GE#Y1tCmno z%=#~f7ONplU^Rj{Igjq1L(AR*ZV190-OC8!J|zzs z?fYU2g#BJp4c523bos>`TD^P^Lt0xr32^Rtg$^=IV|&$`kcU!jTruz(Bk6^Kzpik_>-(wh<$zMH zO32zAhw{u7RU6&+F^)w2qU6aspQHyZyW?i>NVoVjjZefYTq&#)=taXH1xEElpA+~; zo6*HBs1D{aXrx~$oMXIibM9pZiTGbYJuctARIyXSNP92cve|V*B&jDxzZ!HI#iv-U zdk84?E9$w+>nV?eJYVIMPp~Xm))TLD9zP1f=h7zld+hKqmxZd+;p?C2rF+iM^Svmz z_oSvMS~l{8hRpW9WW`yddwgT)N_Wd+z@olzCC+e;$*haMwpt^6E-n1Etyy|uwCIrh zTnzl4MRHq*I-t}7V!Xy!J3HY}F&cB=qA{tzJdNXegDL(Z z9O|H52_=u*^DXDYMKxd@@)Sou7MvDtUf&%hz?o2YJS39W4n3}v`a7putKeUoVcN2n zc_(^er{QwB;A%f2$l}VjE%>K*`WtBNR=9oW+(FET;`I2z$$wVNSHR8XCrGs;W_zkIhoJ{hf(s;_1yjYfd+AE=Dgl7)z~ayq%vC%n6ftFs=HE zapWw{Xpo^J8O!>ba*9*0>v)=_)as5?Z(Ho$Y-dR-%ECuK4uIJv68don^T&&kPL8C+ z+i#k_i)uEq9qW@>abDqZMS2p{EUln~ZTl(>u?e&Woj=*7oNfsPnBaE~miZuXa*u3_ zXLf;rA~WL;IY+7*9rE!$jRs-TABbd5NR4J)UGjD~H4T?DhB-RIL0w(5Y#ph`Gt7>A zRVr#=Uk<*ts?HyBu6tFXsa@>ZDc~heFz&rRev=c^;w4ZDinN3;#)q-2eNPu`Lr7$C zD~C740_(nnNTqA*eY}A9C60VBC1V?6NA%@z{54F7zcm=NWVI0c$}0n1&?&K?=X(R0 zl}>)(C~Y?WZ_G)PC%uejIJ8HTCBALLrU9k-%_(AK<^Bq;+ zV-jcEB`6Nz+VLpwXAf#jv3NyFl*d*Puw9WK!I- zFCwtC7g&miqk<2vaX>I*i|6Sx8H!<5>cs4E%zQW1;(Uqxk9Eu>l(*GZ&J{=;PQk^D z0JD9%;D`d|IE(uP!aTavPQo9-9|R>$Kd@WUg$Uf6eX^$G+u*ch0YHcWMJ6b}oq}6X zbO4Z9@qpolmg_-$H6UarqI`y~u@Nv@gS3mUPRAM<5dm2dGd6C)=&>1|X2&m**nuX*rWGPA?`=pr0m7}Df<{Gab?*_x?e&FzR+lVZA!b?OL?Z?0 zf?_u)nd4_2UisGnhNtK;W3?<}Rk4D@6j=7P29_K2PX<1;a0$EkT0z0HNKS82}<`xO^BNq3_i; z{+BX&BI>+e>I|nr$>KAr@2^>B;0G5K%llT7>iS0!`dinsB0<-^SS~Ag6b@Q6W8C2M zz!)|OzYK+~YaeR-q=e-Tnze+LDON;k<3$IQ>q|dPu{f6Tfn&$0;Mx*Is@ph5ABg1d z`Qs(cXrhQ-eDYpe=6XVNS~xm(G4CLft<`J#UdjuWF99)@@wj>&YJCG(4WFsXF(q4D z6rP1`j~<7t`^#r3bbnZ;mmk3TD$h{SeDz2st7k>_qNY~^MlVN9u_A1mpzOkPK-S7m8}-_Q0<9GP%VR`TBbM=e z$CC8S42TOtM)3%{+Ne7>6p+7pm7>r=q!_VyW)Bcv337WP3gze^^4BsIapRPTu6!Ig z!{?t2s$cmyMdw5ja}&X0@hszmNFKGqKD1g(gGkSK6fsO*Q&pVr&BMW_wOvOb3H^pOOb?lXk|S_A&3FX8Lox@A%v_VM!r{(+=tf0nD1jE zD%EW~X9`48F?z0=!bn^p5%qs@LJ33G=iBSQY%guufQ}`h8Vp$BC5jX;Ey7c%(*&98 zm5q{p^^*o}$Cq+44J3jyS4R(8&MX;uJS{LIu5$tH+aiIDJ0eO%RP3Zo4?O*GdBXTZ z5;L0{Z{No&E3PK}YQkxpees}mLaBX1i~VZ(*)ZK2LgN66s?Fh<-OW1?KGYoJ;Dy^F zduTuhML9150pY@1R&bb*7Uo~WDpFf;H+6@(d(d!jhbQv0yDC!L4vPm*WW*V4iTe(7 zQN-XNXBw$^v;Z2JO7oXg!Ck|_3(g?CT{J3V#Ef`^_*Or};9WFwPvqCeh>MDjC_a%C zy+4Km$FmFFV*|eg1%4c;hK>^kN1VJ(@P-uPUW1KW;?+>zb;k;L^Y&G=777?X#NutnEJcyzr4RkIi5~isKI}h4 zDE0X$0JAmMAjMu^zoyR%r;yK#%SEopa+I=GRvZ8YXSTCH!1g&r=8jjo%jK*ub2^=M mxv@Q^jow-OSY9?Oh)D&YvcMEEZ$=d*qQ literal 0 HcmV?d00001 diff --git a/project/PortDiag/PortDiag.png b/project/PortDiag/PortDiag.png new file mode 100644 index 0000000000000000000000000000000000000000..063c525c718c0e4c0b1b54521605d93cb6771adb GIT binary patch literal 4851 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 we +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; exactly version 2 of June 1991 is required +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +package project::ShortRel::Index; +require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway +our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; }; +our $CVS_ID=q$Id$; +use strict; +use warnings; + +BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,)[0]]}; eval "use lib '$top_dir'"; close F; } +use My::Web; +use My::Project; +use project::ShortRel::ListItem; + + +My::Project->init_project( + "__PACKAGE__"=>__PACKAGE__, + "ListItem"=>\@project::ShortRel::ListItem::ListItem, + ); + +My::Web->footer(); diff --git a/project/ShortRel/ListItem.pm b/project/ShortRel/ListItem.pm new file mode 100755 index 0000000..e464a22 --- /dev/null +++ b/project/ShortRel/ListItem.pm @@ -0,0 +1,50 @@ +#! /usr/bin/perl +# +# $Id$ +# Definition of 'My::Project::ShortRel' for list.cgi.pl +# Copyright (C) 2003 Jan Kratochvil +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; exactly version 2 of June 1991 is required +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +package project::ShortRel::ListItem; +require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway +our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; }; +our $CVS_ID=q$Id$; +use strict; +use warnings; + +use My::Web; + + +our @ListItem=( + "name"=>"Shorten Relocations", + "priority"=>4, + "download"=>"ShortRel.lha", + "link-source file"=>"ShortRel.asm", + "aminet"=>"util/cli/ShortRel", + "summary"=>"Executable file squeezer", + "license"=>"PD", + "maintenance"=>"ready", + "language"=>"680x0 asm", + "description"=><<"HERE", +

ShortRel loads the input file (must be an executable), converts relocations +(32-bit to 16-bit or vice versa), strips debug informaion (if requested) and +writes out the result. 16-bit relocations use 2 bytes per each one and 32-bit +relocations use 4 bytes. So conversion of any executable with many relocations +from 32-bit to 16-bit relocations saves 2 bytes per each one.

+HERE + ); + +1; diff --git a/project/ShortRel/Makefile.am b/project/ShortRel/Makefile.am new file mode 100644 index 0000000..ec2c257 --- /dev/null +++ b/project/ShortRel/Makefile.am @@ -0,0 +1,25 @@ +# $Id$ +# automake source for the Makefile of project/ShortRel/ subdir +# Copyright (C) 2003 Jan Kratochvil +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; exactly version 2 of June 1991 is required +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +include $(top_srcdir)/Makefile-head.am + +EXTRA_DIST+= \ + ListItem.pm \ + Index.html.pl \ + ShrotRel.lha \ + ShortRel.asm diff --git a/project/ShortRel/ShortRel.asm b/project/ShortRel/ShortRel.asm new file mode 100644 index 0000000..dd70b08 --- /dev/null +++ b/project/ShortRel/ShortRel.asm @@ -0,0 +1,684 @@ +;DEBUG equ 1 + + include "SSMac.h" + + dv.l FileStart + dv.l Hunks + dv.l OldKeepDebug + dv.l RelocPool + dv.l BackupA2 + dv.l FirstInsert + dv.l LastInsert + dv.b FlgBufEnd + dv.b Advisory + + start + + get.l Arg_File,a0 + call LoadFile + put.l d0,FileStart + move.l d0,a2 + add.l -(a2),d0 + move.l d0,d7 + moveq #20,d0 + cmp.l (a2)+,d0 + bhi.s InvalidNE1 + lea (a2,d0.l),a3 + cmp.l #HUNK_HEADER,(a2)+ + bne.s InvalidNE1 + tst.l (a2)+ + bne.s InvalidNE1 + move.l (a2)+,d2 + beq Invalid + tst.l (a2)+ + bne.s InvalidNE1 + move.l (a2)+,d0 + addq.l #1,d0 + cmp.l d0,d2 + bne.s InvalidNE1 + dtl ,a6 + bsr.s CheckWordLimit + swap d0 + put.l d0,Hunks + lsl.l #3,d0 + call ss,TrackAllocPub + move.l d0,a4 + move.l d2,d0 + moveq #0,d4 + bsr CopyLongs + + moveq #0,d3 +MainHunkLoop + ifd DEBUG + push d4 + push d3 + push a2 + dtl ,a0 + move.l sp,a1 + call ss,Printf + lea 12(sp),sp + endc + cmp.l a2,d7 + beq.s FileEnd + move.l (a2)+,d0 + push d0 + ifd DEBUG + dtl.l ,a0 + move.l sp,a1 + call Printf + move.l (sp),d0 + endc + bclr.l #HUNKB_ADVISORY,d0 + snev Advisory + sub.w #HUNK_NAME,d0 + bcs.s BadHunk + cmp.w #HUNK_RELRELOC32-HUNK_NAME+1,d0 + bcc.s BadHunk + lsl.l #1,d0 + move.w HunkTable(pc,d0.w),d1 + swap d0 + lsl.w #2,d0 +InvalidNE1 bne Invalid + pop d0 + jsr HunkTable(pc,d1.w) + bra.s MainHunkLoop + +CheckWordLimit swap d0 + tst.w d0 + beq Return5 + push a0 + dtl ,a0 + bra ErrorSSA1 + +BadHunk tstv.b Advisory + beq Invalid + tst.l d4 + bne.s AdviSkip + move.l d0,(a3)+ +AdviSkip bsr GetLong + +FileEnd tstv.l Arg_NoEnd + beq.s PatchNoEnd + addq #4,a3 +PatchNoEnd geta Arg_To,a0 + move.l (a0),d0 + bne.s ArgToSpecified + move.l -4(a0),d0 + move.l d0,(a0) +ArgToSpecified move.l d0,a0 + moveq #OPEN_NEW,d0 + call ss,TrackOpen + move.l d1,d2 + get.l FileStart,a2 + move.l -4(a2),d4 + get.l FirstInsert,d3 + moveq #0,d5 + +FlushLoop tst.l d3 + beq.s FlushNoInsertX + move.l d3,a1 + move.l (a1)+,d1 ;Next + move.l (a1)+,d0 ;Point + sub.l a2,d0 + bne.s FlushNoInsert + move.l d1,d3 + move.l (a1)+,d0 ;Length + bra.s FlushSkip + +hunk macro ;HUNK_#?[,] + ifne _hunk-\1 + fail Mismatched hunk numbers! + endc + ifeq NARG-1 + dc.w BadHunk-HunkTable + else + dc.w hunk_\2-HunkTable + endc +_hunk set _hunk+1 + endm +_hunk set 1000 +HunkTable + hunk HUNK_NAME,skipcnt ;1000 + hunk HUNK_CODE,main ;1001 + hunk HUNK_DATA,main ;1002 + hunk HUNK_BSS,bss ;1003 + hunk HUNK_RELOC32,rel32 ;1004 + hunk HUNK_RELOC16 ;1005 + hunk HUNK_RELOC8 ;1006 + hunk HUNK_EXT ;1007 + hunk HUNK_SYMBOL,symbol ;1008 + hunk HUNK_DEBUG,skipcnt ;1009 + hunk HUNK_END,end ;1010 + hunk HUNK_HEADER ;1011 + hunk 1012 ;???? + hunk HUNK_OVERLAY ;1013 + hunk HUNK_BREAK ;1014 + hunk HUNK_DREL32,rel16 ;1015 + hunk HUNK_DREL16 ;1016 + hunk HUNK_DREL8 ;1017 + hunk HUNK_LIB ;1018 + hunk HUNK_INDEX ;1019 + hunk HUNK_RELOC32SHORT,rel16 ;1020 + hunk HUNK_RELRELOC32,rrel16 ;1021 + ifne _hunk-HUNK_RELRELOC32-1 + fail Invalid number of hunks! + endc + +FlushNoInsertX move.l a3,d0 + sub.l a2,d0 +FlushNoInsert move.l a2,a1 + add.l d0,a2 +FlushSkip move.l d2,a0 + add.l d0,d5 + call ss,ChkWrite + cmp.l a2,a3 + bne.s FlushLoop + + tstv.l Arg_Quiet + bne.s Return5 + + move.l d5,d0 + moveq #100,d1 + get.l utilitybase,a0 + jsr _LVOUMult32(a0) + move.l d4,d1 + jsr _LVOUDivMod32(a0) + pop d1 + move.w d0,-(sp) + get.l Arg_To,d3 + get.l Arg_File,d2 + mpush d1-d5 + lea 4(sp),a1 + dtl.l <%s =',62,' %s: %lu =',62,' %lu (%u%%)>,a0 + jump Printf + +hunk_rel16 moveq #-31,d2 + bra.s HunkReloc + +RelocRead16 moveq #0,d0 + move.w (a2)+,d0 +Return5 rts + +hunk_rel32 moveq #2,d2 +HunkReloc tst.l d3 + beq.s InvalidEQ1 +RelocLoop bsr.s RelocRead + beq.s RelocReturn + move.l d0,d1 + bsr.s RelocRead + vcmp.l Hunks,d0 + bcc Invalid + lsl.l #2,d0 + lea (a4,d0.l),a0 + move.l d1,d0 + tst.l d4 + bne.s RelocScan + lsl.l #2,d0 + move.l (a0),a1 + add.l d0,(a0) + tst.l d2 + bmi.s RelocCopy16 + move.l a2,a0 + add.l d0,a2 + call exec,CopyMemQuick + bra.s RelocLoop + +RelocCopy16 subq.l #1,d1 +RC16Loop clr.w (a1)+ + move.w (a2)+,(a1)+ + dbra d1,RC16Loop + bra.s RelocLoop + +RelocScan add.l d1,(a0) + rol.l d2,d0 + bsr SkipBytes + bra.s RelocLoop + +RelocRead cmp.l a2,d7 + beq InvalidEnd + tst.l d2 + bmi.s RelocRead16 + move.l (a2)+,d0 + rts + +RelocReturnRR cmp.l a3,d7 + beq.s InvalidEQ1 + clr.w (a3) + move.l a3,d0 + addq.l #3,d0 + and.w #~3,d0 + move.l d0,a3 +RelocReturn move.l a2,d0 + addq.l #3,d0 + and.w #~3,d0 + move.l d0,a2 + rts + +hunk_rrel16 tst.l d3 +InvalidEQ1 beq Invalid + moveq #-1,d2 + tst.l d4 + bne.s RRel16Loop + move.l d0,(a3)+ +RRel16Loop bsr.s RelocRead + tst.l d4 + bne.s SkipCpNum16 + move.w d0,(a3)+ +SkipCpNum16 tst.w d0 + beq.s RelocReturnRR + addq.l #1,d0 + lsl.l #1,d0 + bsr.s CopyBytes ;or SkipBytes if d4\ne0 + bra.s RRel16Loop + +hunk_skipcnt bsr.s SymInit + moveq #0,d2 + bsr.s RelocRead + tst.l d6 + beq.s SymbolSkip + move.l d0,(a3)+ +SymbolSkip push d4 + move.l d6,d4 + subq.l #1,d4 + subx.l d4,d4 + bsr.s CopyLongs + pop d4 +Return1 rts + +SymInit get.l Arg_KeepDebug,d6 + beq.s Return6 +PutnRet move.l d0,(a3)+ +Return6 rts + +hunk_symbol moveq #0,d2 + bsr.s SymInit +SkipSymbol bsr.s RelocRead + tst.l d6 + beq.s KeepNull + move.l d0,(a3)+ +KeepNull tst.l d0 + beq.s Return1 + addq.l #1,d0 + bsr.s SymbolSkip + bra.s SkipSymbol + +CopyLongs lsl.l #2,d0 +CopyBytes tst.l d4 + bne SkipBytes + move.l d7,d1 + sub.l a2,d1 + cmp.l d0,d1 + bcs InvalidEnd + move.l a2,a0 + move.l a3,a1 + add.l d0,a2 + add.l d0,a3 + cmp.l a0,a1 + beq.s Return1 + cmp.l a3,a0 + bcc.s JumpCopyMem + lsr.l #2,d0 + bcc.s CopyQuad + move.w (a0)+,(a1)+ +CopyQuad move.w d0,d1 + swap d0 + bra.s MyCopyInto + +MyCopyLoop move.l (a0)+,(a1)+ +MyCopyInto dbra d1,MyCopyLoop + dbra d0,MyCopyLoop + rts + +JumpCopyMem jump exec,CopyMem + +hunk_end tst.l d3 + beq Invalid +HunkEndJump tst.l d4 + beq.s Pass1Done + ifd DEBUG + dtl ,a0 + call ss,PutsNL + endc + moveq #64,d0 + lsl.l #4,d0 + moveq #96,d1 + lsl.l #3,d1 + moveq #0,d2 + call ss,TrackPool + put.l d0,RelocPool + push d3 + move.l d0,d3 + get.l Hunks,d2 + move.l d2,d0 + lsl.l #2,d0 + lea (a4,d0.l),a2 + push a4 + bra.s AllocRelocInto + +AllocRelocLoop move.l (a4),d0 + lsl.l #2,d0 + move.l d0,(a2)+ + beq.s NoAllocReloc + move.l d3,a0 + call PoolAlloc +NoAllocReloc move.l d0,(a4)+ +AllocRelocInto dbra d2,AllocRelocLoop + pop a4 + pop d3 + move.l d4,a2 + moveq #0,d4 + vmovev.l OldKeepDebug,Arg_KeepDebug + rts + +Pass1Done + ifd DEBUG + push d0 + dtl ,a0 + call ss,PutsNL + pop d0 + endc + put.l a2,BackupA2 + mpush d0/d7/a4 + get.l Hunks,d6 + move.l d6,d3 + lsl.l #2,d6 + move.l (v),a6 + lea (a4,d6.l),a2 ;A2=RelLengths, A4=RelEnds + moveq #0,d4 ;define to 16 if at least 1 32bit + moveq #0,d5 ;saved bytes by 16bit header + tstv.l Arg_Reloc32 + bne.s Only32Fake + get.l RelocPool,a0 + move.l d6,d0 + call PoolAlloc + push a3 + move.l d0,a3 + add.l d6,a3 + push a3 + bra.s NormalPtrsInto + +NormalPtrsLoop move.l (a2)+,d0 + sub.l d0,(a4) + move.l d0,d7 + move.l (a4)+,a0 + beq.s EmptyHunk + move.l a0,d2 + lsr.l #2,d0 + call SortLongs + moveq #0,d0 + move.l d2,a0 + move.l d7,d1 +EdgeLoop move.l d0,d2 + add.l d1,d2 + lsr.l #1,d2 + and.w #~3,d2 + cmp.l d0,d2 + beq.s EdgeFound + tst.w (a0,d2.l) + bne.s EdgeDown + move.l d2,d0 + move.l d1,d2 +EdgeDown move.l d2,d1 + bra.s EdgeLoop + +Only32Fake subq.l #1,d3 +Only32Loop move.l (a4),a0 + move.l (a2)+,d0 + sub.l d0,a0 + move.l a0,(a4)+ + lsr.l #2,d0 + call SortLongs + dbra d3,Only32Loop + bra.s FromFaked32 + +EdgeFound tst.w (a0,d0.l) + bne.s EdgeFix + addq.l #4,d0 +EdgeFix add.l d0,d5 + addq.l #8,d5 +EmptyHunk move.l d0,-(a3) ;real # of 16bit relocs + beq.s NormalPtrsInto + moveq #16,d4 + subq.l #8,d0 + bhi.s MoreThatTwo + sub.l d0,d5 + subq.l #8,d5 + subq.l #8,d5 + clr.l (a3) +MoreThatTwo sub.l d4,d5 +NormalPtrsInto dbra d3,NormalPtrsLoop ;A2=TotalEnd, A4=RelLengths + mpop a0/a3 +FromFaked32 move.l d6,d3 + lsr.l #2,d3 + subq.l #1,d3 + sub.l d6,a2 + sub.l d6,a2 ;A2=RelStarts, A4=RelLengths + sub.l d4,d5 + bmi.s Hunks32 + beq.s Hunks32 + tst.l d4 + beq.s Hunks32 + mpush d3/a0/a2/a4 + moveq #8,d0 +H16SizeLoop move.l -(a0),d1 + beq.s H16SizeSkip + lsr.l #1,d1 + addq.l #4,d1 + add.l d1,d0 +H16SizeSkip dbra d3,H16SizeLoop + and.w #~3,d0 + bsr ReserveReloc + movem.l 4(sp),d3/a0/a2/a4 + move.l #HUNK_DREL32,(a3)+ + dtl ,a6 +H16Loop move.l -(a0),d0 + sub.l d0,(a4)+ + lsr.l #2,d0 + move.l (a2),a1 + beq.s H16SkipAll + move.w d0,(a3)+ + subq.w #1,d0 + move.w 6(sp),(a3) ;Desthunk + sub.w d3,(a3)+ + +H16InLoop addq #2,a1 + move.w (a1)+,(a3)+ + dbra d0,H16InLoop + bsr CheckWordLimit ;# of relocs>65535 ?!? +H16SkipAll move.l a1,(a2)+ + dbra d3,H16Loop + clr.w (a3)+ + move.w a3,d0 + ror.w #2,d0 + bcc.s H16Aligned + clr.w (a3)+ +H16Aligned pop a3 + mpop d3/a0/a2/a4 +Hunks32 moveq #0,d0 + move.l d3,d2 + push a4 +H32SizeLoop move.l (a4)+,d1 + beq.s H32SizeInto + addq.l #8,d1 + add.l d1,d0 +H32SizeInto dbra d2,H32SizeLoop + pop a4 + tst.l d0 + beq.s HunksDone + addq.l #8,d0 + bsr.s ReserveReloc + move.l #HUNK_RELOC32,(a3)+ + move.l d3,d2 + moveq #0,d5 ;Current DestHunk +H32Loop move.l (a2)+,a0 + move.l (a4)+,d0 + beq.s H32Skip + move.l d0,d1 + lsr.l #2,d1 + move.l d1,(a3)+ + move.l d5,(a3)+ + move.l a3,a1 + add.l d0,a3 + call exec,CopyMemQuick +H32Skip addq.l #1,d5 + dbra d2,H32Loop + clr.l (a3)+ + pop a3 +HunksDone get.l RelocPool,a0 + call ss,FreeObject + get.l BackupA2,a2 + moveq #0,d3 + moveq #0,d4 + pop (a3) + tstv.l Arg_NoEnd + bne.s IsNoEnd + addq #4,a3 +IsNoEnd mpop d7/a4 +Return4 rts + +ReserveReloc add.l a3,d0 + vcmp.l BackupA2,d0 + bls.s ReserveReturn + sub.l a3,d0 + push d0 + addq.l #8,d0 + addq.l #4,d0 + call ss,TrackAllocPub + geta FirstInsert,a0 + get.l LastInsert,d1 + beq.s NoLastInsert + move.l d1,a0 +NoLastInsert move.l d0,(a0) + put.l d0,LastInsert + move.l d0,a1 + clr.l (a1)+ ;^NextInsert + move.l a3,(a1)+ ;^InsertPoint + pop (a1)+ ;^InsertLength + move.l a3,d0 + move.l a1,a3 +ReserveReturn move.l (sp),a0 + move.l d0,(sp) + jmp (a0) + +hunk_main bsr.s HunkMainInit + push a3 + bsr.s GetLong + move.l d0,d2 + bsr CopyLongs + move.w d2,d0 + swap d2 + move.l a3,d1 + cmp.l d0,d0 ;ZF=1 + bra.s SqueezeInto + +GetLong cmp.l a2,d7 + beq.s Invalid + move.l (a2)+,d0 + tst.l d4 + bne.s Return2 + move.l d0,(a3)+ +Return2 rts + +HunkMainInit tst.l d3 + beq.s WereFree + push d0 + move.l #HUNK_END,d0 + bsr HunkEndJump + pop d0 + tst.l d3 + bne.s HMI_Skip +WereFree tst.l d4 + beq PutnRet +HMI_Skip addq #4,sp + rts + +SqueezeLoop tst.l -(a3) +SqueezeInto dbne d0,SqueezeLoop + dbne d2,SqueezeLoop + beq.s TotalSqueeze + addq #4,a3 +TotalSqueeze sub.l a3,d1 + lsr.l #2,d1 + pop a0 + sub.l d1,(a0) +JumpFromBSS get.l Hunks,d0 + move.l a4,a0 + bra.s ClrHunkTabInto + +hunk_bss bsr.s HunkMainInit + bsr.s GetLong + bra.s JumpFromBSS + +ClrHunkTabLoop clr.l (a0)+ +ClrHunkTabInto dbra d0,ClrHunkTabLoop + move.l a2,d4 + vmovev.l Arg_KeepDebug,OldKeepDebug + clrv.l Arg_KeepDebug + moveq #-1,d3 +Return3 rts + +SkipBytes add.l d0,a2 + cmp.l a2,d7 + bcc.s Return3 +InvalidEnd move.l d7,a2 +Invalid vsub.l FileStart,a2 + push a2 + dtl ,a0 + vpush Arg_File +ErrorSSA1 move.l sp,a1 + jump ss,ExitError + + ifd DEBUG +EXIT jump ss,ExitCleanup + endc + + tags + template + dv.l Arg_File + dv.l Arg_To + dv.l Arg_KeepDebug + dv.l Arg_Reloc32 + dv.l Arg_NoEnd + dv.l Arg_Quiet + finish + end +ShortRel dvitype /bin.new.exp/dvitype RELOC32 +ShortRel gftodvi /bin.new.exp/gftodvi RELOC32 +ShortRel gftopk /bin.new.exp/gftopk RELOC32 +ShortRel gftype /bin.new.exp/gftype RELOC32 +ShortRel inimf /bin.new.exp/inimf RELOC32 +ShortRel initex /bin.new.exp/initex RELOC32 +ShortRel mft /bin.new.exp/mft RELOC32 +ShortRel pltotf /bin.new.exp/pltotf RELOC32 +ShortRel tftopl /bin.new.exp/tftopl RELOC32 +ShortRel vftovp /bin.new.exp/vftovp RELOC32 +ShortRel virmf /bin.new.exp/virmf RELOC32 +ShortRel virtex /bin.new.exp/virtex RELOC32 +ShortRel vptovf /bin.new.exp/vptovf RELOC32 +ShortRel MakeInfo /bin.new.exp/MakeInfo RELOC32 +ShortRel tr2tex /bin.new.exp/tr2tex RELOC32 +ShortRel dvi2tty /bin.new.exp/dvi2tty RELOC32 +ShortRel disdvi /bin.new.exp/disdvi RELOC32 +ShortRel DVIprint /bin.new.exp/DVIprint RELOC32 +ShortRel flib /bin.new.exp/flib RELOC32 +ShortRel PToFront /bin.new.exp/PToFront RELOC32 +ShortRel TeXindex /bin.new.exp/TeXindex RELOC32 +ShortRel ShowDVI /bin.new.exp/ShowDVI RELOC32 +ShortRel SpecialHost /bin.new.exp/SpecialHost RELOC32 +ShortRel bm2font /bin.new.exp/bm2font RELOC32 + + +A2=000EEE44, D3=00000000, D4=00000000 - Got HUNK_CODE +A2=00102524, D3=FFFFFFFF, D4=00102524 - Got HUNK_DREL32 +A2=00102E08, D3=FFFFFFFF, D4=00102524 - Got HUNK_RELOC32 +A2=00102E1C, D3=FFFFFFFF, D4=00102524 - Got HUNK_DATA +A2=00102524, D3=FFFFFFFF, D4=00000000 - Got HUNK_DREL32 +A2=00102E08, D3=FFFFFFFF, D4=00000000 - Got HUNK_RELOC32 +A2=00102E1C, D3=FFFFFFFF, D4=00000000 - Got HUNK_DATA +A2=00103308, D3=FFFFFFFF, D4=00103308 - Got HUNK_RELOC32 +A2=00103320, D3=FFFFFFFF, D4=00103308 - Got HUNK_BSS +A2=00103308, D3=FFFFFFFF, D4=00000000 - Got HUNK_RELOC32 +A2=00103320, D3=FFFFFFFF, D4=00000000 - Got HUNK_BSS +A2=00103328, D3=FFFFFFFF, D4=00103328 - Got HUNK_END +A2=00103328, D3=FFFFFFFF, D4=00000000 - Got HUNK_END +A2=0010332C, D3=00000000, D4=00000000 - bm2font => :t/shortrel.res: 83208 => 80888 (97%) diff --git a/project/ShortRel/ShortRel.lha b/project/ShortRel/ShortRel.lha new file mode 100644 index 0000000000000000000000000000000000000000..417fcc144488fb4552c030fd03937accea76ced0 GIT binary patch literal 7915 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

3A`oM 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 NON7A78q8q8{{rhmIz|8h literal 0 HcmV?d00001 -- 1.8.3.1