home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 633.lha / EditKeys_v1.2 / Source.LZH / Source / EditKeys.s < prev    next >
Encoding:
Text File  |  1992-04-26  |  113.1 KB  |  5,869 lines

  1.         opt    l+,o+,ow-,ow6+
  2.         output    Source:EditKeys.o
  3.  
  4.         ; EditKeys v1.2
  5.         ; © 1991 by David Kinder
  6.  
  7.         ; EditKeys.s - Main source code
  8.  
  9.         ; Assemble with Devpac v3 then link:
  10.         ; 1> Blink EditKeys.o Graphics.o TO EditKeys
  11.  
  12.         ; The header "system.gs" must have been compiled
  13.         ; from v36 or higher include files.
  14.  
  15.         ; "I guess I believed in what we had
  16.         ;  But words got in the way"
  17.         ;    The Sisters of Mercy
  18.  
  19.         include    Source:xref.i
  20.  
  21.         incdir    Source:include/
  22.         include    devices/keymap.i
  23.         include    dos/rdargs.i
  24.         include    libraries/asl.i
  25.         include libraries/asl_lib.i
  26.         include    libraries/arp_lib.i
  27.         include    workbench/wb_lib.i
  28.  
  29. CALLSYS        MACRO
  30.         jsr    _LVO\1(a6)
  31.         ENDM
  32.  
  33.         section    Code,code
  34.  
  35.         movem.l    d0/a0,Parms        ; Save parameters
  36.  
  37.         suba.l    a1,a1
  38.         CALLEXEC FindTask
  39.         move.l    d0,a4
  40.  
  41.         tst.l    pr_CLI(a4)        ; Are we CLI or Workbench?
  42.         bne.s    EndStartup
  43.  
  44.         lea    pr_MsgPort(a4),a0
  45.         CALLSYS    WaitPort        ; Wait for a message
  46.         lea    pr_MsgPort(a4),a0
  47.         CALLSYS    GetMsg            ; Then get it
  48.         move.l    d0,ReturnMsg
  49.  
  50. EndStartup    bsr.s    _Main
  51.         tst.l    ReturnMsg
  52.         beq.s    ExitToDOS
  53.  
  54.         CALLEXEC Forbid
  55.         move.l    ReturnMsg,a1
  56.         CALLSYS    ReplyMsg
  57.  
  58. ExitToDOS    move.l    d5,d0
  59.         rts
  60.  
  61. _Main        lea    IntName,a1        ; Are we running under
  62.         moveq    #36,d0            ; KickStart 2?
  63.         CALLEXEC OpenLibrary
  64.         move.l    d0,_IntuitionBase
  65.         beq    NoNewOS
  66.  
  67.         move.b    #1,OS2            ; Note version
  68.         move.b    #1,MyBord1+bd_FrontPen
  69.         move.b    #1,MyBord2+bd_FrontPen
  70.         move.b    #1,MyBord3+bd_FrontPen
  71.         move.b    #3,MoreText+it_FrontPen
  72.         move.b    #0,NewName+it_FrontPen
  73.         move.b    #0,OpenName+it_FrontPen
  74.         move.b    #0,SaveName+it_FrontPen
  75.         move.b    #0,SaveAsName+it_FrontPen
  76.         move.b    #0,AboutName+it_FrontPen
  77.         move.b    #0,IconifyName+it_FrontPen
  78.         move.b    #0,QuitName+it_FrontPen
  79.         addi    #11,MainWindow+nw_TopEdge
  80.         move.l    #x2_Imagea,Gadg0a+gg_GadgetRender
  81.         move.l    #x2_Imageb,Gadg0b+gg_GadgetRender
  82.         move.l    #x2_Imagec,Gadg0c+gg_GadgetRender
  83.         move.l    #x2_Imaged,Gadg0d+gg_GadgetRender
  84.         move.l    #x2_Imagee,Gadg0e+gg_GadgetRender
  85.         move.l    #x2_CSI,CSIGadg+gg_GadgetRender
  86.         move.l    #0,MyBord3+bd_NextBorder
  87.         move.b    #2,DoubleReq+rq_BackFill
  88.         move.b    #1,DblBord1+bd_FrontPen
  89.         move.b    #1,DblBord2+bd_FrontPen
  90.         move.b    #1,DblBord3+bd_FrontPen
  91.         move.b    #1,DblBord4+bd_FrontPen
  92.         move.b    #2,DblGText4+it_BackPen
  93.         move.b    #1,DblGBord1+bd_FrontPen
  94.         move.b    #1,DblGBord2+bd_FrontPen
  95.         move.b    #1,DblGBord3+bd_FrontPen
  96.         move.b    #1,DblGBord4+bd_FrontPen
  97.         move.b    #2,LoseReq+rq_BackFill
  98.         move.b    #1,LsBord1+bd_FrontPen
  99.         move.b    #1,LsBord2+bd_FrontPen
  100.         move.b    #1,LsGBord1+bd_FrontPen
  101.         move.b    #1,LsGBord2+bd_FrontPen
  102.         move.l    #x2_Ls,LsGadg1+gg_GadgetRender
  103.         move.l    #x2_Comp,LsGadg4+gg_GadgetRender
  104.         move.b    #10,Par_Modify
  105.  
  106.         lea    Gadg0a,a0
  107.         bsr    FixGadg
  108.         lea    Gadg0b,a0
  109.         bsr    FixGadg
  110.         lea    Gadg0c,a0
  111.         bsr    FixGadg
  112.         lea    Gadg0d,a0
  113.         bsr.s    FixGadg
  114.         lea    Gadg0e,a0
  115.         bsr.s    FixGadg
  116.         lea    CSIGadg,a0
  117.         bsr.s    FixGadg
  118.  
  119.         lea    Img01dt,a0
  120. .colours    eori    #$ffff,(a0)+
  121.         cmpa.l    #CSIdat,a0
  122.         bne    .colours
  123.  
  124.         moveq    #0,d0            ; Try to open the
  125.         lea    AslLibName,a1        ; asl.library
  126.         CALLEXEC OpenLibrary
  127.         move.l    d0,_AslBase
  128.         beq    NoArp
  129.         movea.l    _AslBase,a6
  130.         CALLSYS    AllocFileRequest    ; Get struct
  131.         move.l    d0,AslFReq
  132.         beq    NoArp
  133.         move.l    d0,a0
  134.         move.l    rf_Dir(a0),xDir
  135.         move.l    rf_File(a0),xFile
  136.  
  137.         lea    DosName,a1        ; Open 'dos.library'
  138.         moveq    #36,d0
  139.         CALLEXEC OpenLibrary
  140.         move.l    d0,_DOSBase
  141.         beq    NoArp
  142.         bra.s    RunAllOS
  143.  
  144. FixGadg        subi    #2,gg_LeftEdge(a0)
  145.         subi    #1,gg_TopEdge(a0)
  146.         addi    #4,gg_Width(a0)
  147.         addi    #2,gg_Height(a0)
  148.         rts
  149.  
  150. NoNewOS        lea    IntName,a1        ; Open 'intuition.library'
  151.         moveq    #33,d0            ; Need v1.2 or later
  152.         CALLEXEC OpenLibrary
  153.         move.l    d0,_IntuitionBase
  154.         beq    NoIntuition        ; Open failed
  155.  
  156.         lea    ArpName,a1        ; Open 'arp.library'
  157.         moveq    #0,d0
  158.         CALLSYS    OpenLibrary
  159.         move.l    d0,_DOSBase
  160.         beq    NoArpLib
  161.  
  162. RunAllOS    lea    GrafName,a1        ; Open 'graphics.library'
  163.         moveq    #0,d0
  164.         CALLEXEC OpenLibrary
  165.         move.l    d0,_GfxBase
  166.         beq    NoGraphics        ; Open failed
  167.  
  168.         movem.l    Parms,d0/a0        ; Analyse parameters
  169.         tst.l    ReturnMsg
  170.         beq.s    ChanceParms
  171.  
  172.         move.l    ReturnMsg,a0        ; Get correct
  173.         move.l    sm_ArgList(a0),a0    ; 'current directory'
  174.         move.l    wa_Lock(a0),d1        ; for Workbench
  175.         CALLDOS    CurrentDir
  176.         bra    NoChanceParms
  177.  
  178. ChanceParms    bsr    _GADS            ; Parse input line
  179.         tst.l    d7
  180.         bmi.s    LineError
  181.         tst.l    Par_Arry+4        ; Was it 'NOMAP'?
  182.         bne.s    SetNone
  183.         tst.l    d7
  184.         beq.s    NoChanceParms
  185.         bra.s    CParms
  186.  
  187. SetNone        move    #HIGHCOMP!ITEMTEXT!COMMSEQ,Save+mi_Flags
  188.         bra    IconReturn        ; Disable 'Save' menu item
  189.  
  190. CParms        move.l    Par_Arry,a0
  191.         lea    PathName,a1
  192.         movea.l    xFile,a2
  193.         moveq    #0,d0
  194.         moveq    #13,d5
  195. CParmsLp    move.b    (a0,d0),(a1,d5)
  196.         move.b    (a0,d0),(a2,d0)
  197.         beq.s    AllLoad
  198.         addq    #1,d0
  199.         addq    #1,d5
  200.         cmpi.b    #72,d5
  201.         beq.s    AllLoad
  202.         bra    CParmsLp
  203.  
  204. LineError    tst.b    OS2
  205.         bne.s    .line
  206.         move.l    Par_Arry,a1
  207.         CALLDOS    Puts
  208.         bra    NoRun
  209. .line        neg.l    d7
  210.         move.l    d7,d1
  211.         moveq    #0,d2
  212.         CALLDOS    PrintFault
  213.         bra    NoRun
  214.  
  215. NoChanceParms    move.b    #1,ErrResponse
  216.         movea.l    AslFReq,a0        ; Can we use ASL?
  217.         cmpa.l    #0,a0
  218.         beq.s    PUseArp
  219.         lea    LoadTags,a1
  220.         movea.l    _AslBase,a6
  221.         CALLSYS    AslRequest
  222.         bra.s    PAllFDo
  223. PUseArp        lea    ArpFileReq,a0
  224.         CALLDOS    FileRequest        ; Call ARP FileRequest()
  225.  
  226. PAllFDo        tst.l    d0
  227.         beq    SetNone
  228.         bsr    ARP_Extract        ; Get path
  229. AllLoad        bsr    LoadKeyMap
  230.         cmpi    #1,d6
  231.         beq    NoRun
  232.         tst    d6
  233.         beq.s    ItWentOK
  234.         move.l    MySegment,d1
  235.         CALLDOS    UnLoadSeg
  236.         bra    NoRun
  237.  
  238. ItWentOK    bsr    CopyToSave
  239.         bsr    AnalyseKM
  240.         bsr    GenerateKeys
  241.         bsr    CancelDead
  242.  
  243. IconReturn    move.b    #2,ErrResponse
  244.         lea    MainWindow,a0        ; Open our window on
  245.         CALLINT    OpenWindow        ; Workbench screen
  246.         move.l    d0,Windowhd
  247.         beq    NoRun        ; Open window failed
  248.         bsr    WindSetUp
  249.  
  250.         move.l    Windowhd,a0        ; Install menus
  251.         lea    ProjectMenu,a1
  252.         CALLSYS    SetMenuStrip
  253.         tst.l    d0
  254.         beq    NoMenus            ; Menus failed
  255.  
  256.         move.l    RPort,a1        ; Set up colours for...
  257.         moveq    #1,d0
  258.         tst.b    OS2
  259.         beq.s    UsePen1
  260.         moveq    #2,d0
  261. UsePen1        CALLGRAF SetAPen
  262.  
  263.         move.l    RPort,a1        ; ...an area fill for
  264.         moveq    #4,d0            ; a 'keyboard' look!
  265.         moveq    #11,d1
  266.         move    #587,d2
  267.         moveq    #89,d3
  268.         CALLSYS    RectFill
  269.  
  270.         tst.b    OS2
  271.         beq.s    DoOSGadg
  272.         move.l    RPort,a0
  273.         lea    x2_Box,a1
  274.         moveq    #91,d0
  275.         moveq    #110,d1
  276.         CALLINT    DrawImage
  277.  
  278. DoOSGadg    move.l    Windowhd,a0        ; We don't want to have
  279.         lea    Gadg0a,a1        ; intuition draw all the
  280.         moveq    #0,d0            ; gadgets, then draw over
  281.         moveq    #-1,d1            ; them, then redraw them,
  282.         suba.l    a2,a2            ; so we only add the gadgets
  283.         CALLINT    AddGList        ; here
  284.  
  285.         lea    Gadg0a,a0        ; This makes the gadgets
  286.         move.l    Windowhd,a1        ; visible over the white
  287.         suba.l    a2,a2            ; background
  288.         CALLSYS    RefreshGadgets
  289.  
  290.         move.l    RPort,a0        ; Add a few finishing
  291.         lea    MyBord1,a1        ; extras to the display...
  292.         moveq    #0,d0
  293.         moveq    #0,d1
  294.         CALLSYS    DrawBorder
  295.  
  296.         move.l    RPort,a0
  297.         lea    MoreText,a1
  298.         moveq    #0,d0
  299.         moveq    #0,d1
  300.         CALLSYS    PrintIText
  301.  
  302.         move.l    RPort,a0
  303.         lea    MoreText,a1
  304.         move    #256,d0
  305.         moveq    #0,d1
  306.         CALLSYS    PrintIText
  307.  
  308.         move.l    RPort,a0
  309.         lea    SqrText,a1
  310.         moveq    #0,d0
  311.         moveq    #0,d1
  312.         CALLSYS    PrintIText
  313.  
  314.         cmpi.b    #1,MyMode        ; Should we enable
  315.         bne.s    MainLoop        ; DMRequest()?
  316.         move.l    Windowhd,a0
  317.         lea    DoubleReq,a1
  318.         CALLSYS    SetDMRequest
  319.  
  320. MainLoop    move.l    UserPort,a0        ; Wait for an Intuition
  321.         CALLEXEC WaitPort        ; message...
  322. CheckMessage    move.l    UserPort,a0
  323.         CALLEXEC GetMsg
  324.         tst.l    d0
  325.         beq    MainLoop
  326.         move.l    d0,a1
  327.         move.l    im_Class(a1),d2        ; Store the message
  328.         move    im_Code(a1),d3
  329.         move    im_Qualifier(a1),d4
  330.         move.l    im_IAddress(a1),a2
  331.         CALLSYS    ReplyMsg
  332.         cmpi.l    #CLOSEWINDOW,d2        ; Is it close time?
  333.         beq    QuitProper
  334.         cmpi.l    #MENUPICK,d2
  335.         beq.s    GoMenu
  336.         cmpi.l    #GADGETDOWN,d2
  337.         beq    GoGadget
  338.         cmpi.l    #GADGETUP,d2
  339.         beq    KeyGadget
  340.         cmpi.l    #RAWKEY,d2
  341.         beq.s    KeyPress
  342.         cmpi.l    #REQSET,d2
  343.         beq    ReqStart
  344.         bra    CheckMessage
  345.  
  346. KeyPress    cmpi    #$5f,d3            ; Was it 'Help'?
  347.         bne    CheckMessage
  348.  
  349.         move.l    Windowhd,a0        ; If so, set up a help
  350.         lea    HlpText1,a1        ; requester
  351.         suba.l    a2,a2
  352.         lea    ContText,a3
  353.         moveq    #0,d0
  354.         moveq    #0,d1
  355.         move    #520,d2
  356.         moveq    #71,d3
  357.         CALLINT    AutoRequest
  358.         bra    CheckMessage
  359.  
  360. GoMenu        move.l    d3,d0
  361.         andi.l    #%0000000000011111,d0    ; Was it the project menu?
  362.         bne    CheckMessage
  363.         
  364.         move.l    d3,d0            ; Check the subitems
  365.         andi.l    #%0000011111100000,d0
  366.         beq.s    MNew
  367.         cmpi.l    #%0000000000100000,d0
  368.         beq    MOpen
  369.         cmpi.l    #%0000000001000000,d0
  370.         beq    MSave
  371.         cmpi.l    #%0000000001100000,d0
  372.         beq    MSaveAs
  373.         cmpi.l    #%0000000010100000,d0
  374.         beq    MIconify
  375.         cmpi.l    #%0000000011000000,d0
  376.         beq    QuitProper
  377.         bra    CheckMessage
  378.  
  379. MNew        move.l    Windowhd,a0        ; Are you sure?
  380.         lea    MNewText,a1
  381.         lea    LReqText,a2
  382.         lea    RReqText,a3
  383.         moveq    #0,d0
  384.         moveq    #0,d1
  385.         move    #407,d2
  386.         moveq    #53,d3
  387.         CALLINT    AutoRequest
  388.         tst.l    d0
  389.         beq    CheckMessage
  390.  
  391.         bsr    ClearOut
  392.         bsr    GenerateKeys
  393.         move.l    Windowhd,a0        ; Disable 'Save' item...
  394.         move.l    #%0000000001000000,d0
  395.         CALLINT    OffMenu
  396.         move    #"«»",ModWindText-1    ; ...and reset name
  397.         clr.b    ModWindText+1
  398.         move.l    Windowhd,a0
  399.         lea    MainWindowText,a1
  400.         move.l    #-1,a2
  401.         CALLSYS    SetWindowTitles
  402.         move.l    #$20202020,DeadTxt
  403.         move.l    #$20202000,DeadTxt+4
  404.         move.l    #$20202020,DblGTxt4
  405.         move.l    #$20202000,DblGTxt4+4
  406.         clr.b    CurrDKey
  407.         move.b    #1,ChQVal
  408.         bsr    ChangeKString
  409.         clr.b    ChQVal
  410. MNew_NK        move.b    MyMode,d0
  411.         cmpi.b    #1,d0
  412.         beq    GGadga
  413.         cmpi.b    #2,d0
  414.         beq    GGadgb
  415.         cmpi.b    #3,d0
  416.         beq    GGadgc
  417.         cmpi.b    #4,d0
  418.         beq    GGadgd
  419.         bra    GGadge
  420.  
  421. MIconify    move.l    Windowhd,a0        ; Close old window...
  422.         move    wd_LeftEdge(a0),IconWindow
  423.         move    wd_TopEdge(a0),IconWindow+2
  424.         CALLINT    ClearMenuStrip
  425.         move.l    Windowhd,a0
  426.         CALLSYS    ClearDMRequest
  427.         move.l    Windowhd,a0
  428.         CALLSYS    CloseWindow
  429.  
  430.         tst.b    OS2
  431.         beq    DoOldIcon
  432.         lea    WBName,a1        ; If we are running
  433.         moveq    #36,d0            ; under 2.0, its nicer
  434.         CALLEXEC OpenLibrary        ; to become a menu item
  435.         move.l    d0,_WorkbenchBase    ; than a small window
  436.         beq.s    NoWBLib
  437.         CALLSYS    CreateMsgPort
  438.         move.l    d0,MyWBPort
  439.         beq.s    NoPort
  440.  
  441.         moveq    #1,d0
  442.         moveq    #1,d1
  443.         lea    WBTxt,a0
  444.         move.l    MyWBPort,a1
  445.         suba.l    a2,a2
  446.         movea.l    _WorkbenchBase,a6
  447.         CALLSYS    AddAppMenuItemA
  448.         move.l    d0,d7
  449.  
  450.         movea.l    MyWBPort,a0        ; Wait for what must be
  451.         CALLEXEC WaitPort        ; an AppMessage
  452. CheckWBMsg    move.l    MyWBPort,a0
  453.         CALLSYS    GetMsg
  454.         tst.l    d0
  455.         beq.s    ShutWB
  456.         move.l    d0,a1
  457.         CALLSYS    ReplyMsg
  458.         bra    CheckWBMsg
  459.  
  460. ShutWB        move.l    d7,a0
  461.         movea.l    _WorkbenchBase,a6
  462.         CALLSYS    RemoveAppMenuItem
  463.         movea.l    MyWBPort,a0
  464.         CALLEXEC DeleteMsgPort
  465. NoPort        movea.l    _WorkbenchBase,a1
  466.         CALLEXEC CloseLibrary
  467. NoWBLib        bra    IconReturn
  468.  
  469. DoOldIcon    lea    IconWindow,a0
  470.         CALLSYS    OpenWindow
  471.         move.l    d0,Windowhd
  472.         beq    NoRun
  473.         bsr    WindSetUp
  474.  
  475. IconLoop    move.l    UserPort,a0
  476.         CALLEXEC WaitPort
  477.         move.l    UserPort,a0
  478.         CALLSYS    GetMsg
  479.         tst.l    d0
  480.         beq    IconLoop
  481.         move.l    d0,a1
  482.         move.l    im_Class(a1),d2
  483.         CALLSYS    ReplyMsg
  484.         cmpi.l    #GADGETUP,d2
  485.         bne    IconLoop
  486.  
  487.         move.l    Windowhd,a0        ; Close iconified window
  488.         CALLINT    CloseWindow
  489.         bra    IconReturn
  490.  
  491. MOpen        movea.l    AslFReq,a0        ; Can we use ASL?
  492.         cmpa.l    #0,a0
  493.         beq.s    OUseArp
  494.         lea    LoadTags,a1
  495.         movea.l    _AslBase,a6
  496.         CALLSYS    AslRequest
  497.         bra.s    OAllFDo
  498. OUseArp        move.l    #fr_LHail,ArpFileReq
  499.         lea    ArpFileReq,a0
  500.         CALLDOS    FileRequest        ; Call ARP FileRequest()
  501.  
  502. OAllFDo        tst.l    d0
  503.         beq    CheckMessage
  504.         bsr    ARP_Extract        ; Analyse response
  505.         bsr    LoadKeyMap
  506.         cmpi    #1,d6
  507.         beq    NotFoundErr
  508.         tst    d6
  509.         beq.s    NewOkay
  510.         move.l    MySegment,d1
  511.         CALLDOS    UnLoadSeg
  512.         move.l    Windowhd,a0
  513.         lea    OpenErr2,a1
  514.         suba.l    a2,a2
  515.         lea    ContText,a3
  516.         moveq    #0,d0
  517.         moveq    #0,d1
  518.         move    #342,d2
  519.         moveq    #53,d3
  520.         CALLINT    AutoRequest
  521.         bra    CheckMessage
  522.  
  523. NewOkay        bsr    CopyToSave
  524.         bsr    AnalyseKM
  525.         bsr    GenerateKeys
  526.         move.l    Windowhd,a0
  527.         lea    MainWindowText,a1
  528.         move.l    #-1,a2
  529.         CALLINT    SetWindowTitles
  530.         move.l    #$20202020,DeadTxt
  531.         move.l    #$20202000,DeadTxt+4
  532.         move.l    #$20202020,DblGTxt4
  533.         move.l    #$20202000,DblGTxt4+4
  534.         clr.b    CurrDKey
  535.         move.b    #1,ChQVal
  536.         bsr    ChangeKString
  537.         clr.b    ChQVal
  538.         move.b    MyMode,d0
  539.         cmpi.b    #1,d0
  540.         beq    GGadga
  541.         cmpi.b    #2,d0
  542.         beq    GGadgb
  543.         cmpi.b    #3,d0
  544.         beq    GGadgc
  545.         cmpi.b    #4,d0
  546.         beq    GGadgd
  547.         bra    GGadge
  548.  
  549. NotFoundErr    move.l    Windowhd,a0
  550.         lea    OpenErr1,a1
  551.         suba.l    a2,a2
  552.         lea    ContText,a3
  553.         moveq    #0,d0
  554.         moveq    #0,d1
  555.         move    #350,d2
  556.         moveq    #53,d3
  557.         CALLINT    AutoRequest
  558.         bra    CheckMessage
  559.  
  560. MSave        move.l    #10240,d0
  561.         move.l    #MEMF_CLEAR,d1
  562.         CALLEXEC AllocMem        ; Get a buffer
  563.         movea.l    d0,a5            ; a5 is index into
  564.         move.l    d0,SaveBuffer        ; SaveBuffer
  565.         beq    NoMemBuff
  566.  
  567.         move.l    #5120,d0
  568.         move.l    #MEMF_CLEAR,d1
  569.         CALLSYS    AllocMem
  570.         move.l    d0,SaveBuffer2
  571.         bne.s    GotAllMem
  572.  
  573.         movea.l    SaveBuffer,a1        ; Free buffer
  574.         move.l    #10240,d0
  575.         CALLSYS    FreeMem
  576.         bra    NoMemBuff
  577.  
  578. GotAllMem    bsr    CreateOutput        ; Fill buffer...
  579.  
  580.         move.l    #SavePath,d1
  581.         move.l    #MODE_NEWFILE,d2
  582.         CALLDOS    Open            ; Open output file
  583.         move.l    d0,d7            ; Get file handle
  584.         beq    NoOpenMap
  585.  
  586.         move.l    d7,d1
  587.         move.l    SaveBuffer,d2
  588.         move.l    a5,d3
  589.         sub.l    SaveBuffer,d3
  590.         CALLSYS    Write            ; Write keymap
  591.         move.l    d7,d1
  592.         CALLSYS    Close            ; Close keymap
  593.  
  594.         movea.l    xFile,a0        ; Get keymap name
  595.         lea    ModWindText,a1
  596. .loop        move.b    (a0)+,d1
  597.         beq.s    .end
  598.         move.b    d1,(a1)+
  599.         cmpa.l    #EndWindText,a1
  600.         beq.s    .end
  601.         bra    .loop
  602.  
  603. .end        move.b    #"»",(a1)+
  604.         clr.b    (a1)
  605.         movea.l    Windowhd,a0
  606.         lea    MainWindowText,a1
  607.         movea.l    #-1,a2
  608.         CALLINT    SetWindowTitles
  609.  
  610. SaveEnd        movea.l    SaveBuffer,a1        ; Free buffer
  611.         move.l    #10240,d0
  612.         CALLEXEC FreeMem
  613.         movea.l    SaveBuffer2,a1
  614.         move.l    #5120,d0
  615.         CALLSYS    FreeMem
  616.         bra    CheckMessage
  617.  
  618. NoMemBuff    move.l    Windowhd,a0        ; Not enough memory so
  619.         lea    NSavText,a1        ; flag then return without
  620.         suba.l    a2,a2            ; saving keymap
  621.         lea    AbortText,a3
  622.         moveq    #0,d0
  623.         moveq    #0,d1
  624.         move    #311,d2
  625.         moveq    #53,d3
  626.         CALLINT    AutoRequest
  627.         bra    CheckMessage
  628.  
  629. NoOpenMap    move.l    Windowhd,a0
  630.         lea    OpenSErr,a1
  631.         suba.l    a2,a2
  632.         lea    AbortText,a3
  633.         moveq    #0,d0
  634.         moveq    #0,d1
  635.         move    #278,d2
  636.         moveq    #53,d3
  637.         CALLINT    AutoRequest
  638.         bra    SaveEnd
  639.  
  640. MSaveAs        movea.l    AslFReq,a0        ; Can we use ASL?
  641.         cmpa.l    #0,a0
  642.         beq.s    SUseArp
  643.         lea    SaveTags,a1
  644.         movea.l    _AslBase,a6
  645.         CALLSYS    AslRequest
  646.         bra.s    SAllFDo
  647. SUseArp        move.l    #fr_SHail,ArpFileReq
  648.         lea    ArpFileReq,a0
  649.         CALLDOS    FileRequest        ; Call ARP FileRequest()
  650.  
  651. SAllFDo        tst.l    d0
  652.         beq    CheckMessage
  653.         bsr    ARP_Extract        ; Analyse response
  654.         bsr    CopyToSave
  655.         bra    MSave
  656.  
  657. CreateOutput    move.l    #$3f3,(a5)+        ; a5=index into SaveBuffer
  658.         clr.l    (a5)+            ; Setup hunk structure
  659.         move.l    #1,(a5)+
  660.         clr.l    (a5)+
  661.         clr.l    (a5)+
  662.         addq.l    #4,a5            ; Skip hunk size
  663.         move.l    #$3e9,(a5)+        ; Hunk_code
  664.         addq.l    #4,a5
  665.  
  666.         move.l    SaveBuffer2,a6        ; a6=reloc buffer
  667.  
  668.         clr.l    (a5)+            ; Header
  669.         clr.l    (a5)+
  670.         clr    (a5)+
  671.  
  672.         addq    #4,a5            ; KMName
  673.         move.l    #$4c,(a5)+        ; KMLowMapType
  674.         move.l    #$c4,(a5)+        ; KMLowMap
  675.         move.l    #$2e,(a5)+        ; KMLCapsable
  676.         move.l    #$3d,(a5)+        ; KMLRepeatable
  677.         move.l    #$8c,(a5)+        ; KMHighMapType
  678.         move.l    #$1c4,(a5)+        ; KMHighMap
  679.         move.l    #$36,(a5)+        ; KMHCapsable
  680.         move.l    #$45,(a5)+        ; KMHRepeatable
  681.  
  682.         lea    CapsTab,a0        ; Do Capsable table
  683.         bsr    MakeBitTab
  684.         lea    ReptTab,a0        ; ...and Repeatable
  685.         bsr    MakeBitTab        ; table
  686.  
  687.         lea    KeyTypes,a0        ; Do KeyTypes...
  688.         moveq    #0,d0
  689. .loop        move.l    (a0,d0),(a5)+
  690.         addq    #4,d0
  691.         cmpi.b    #$60,d0
  692.         bne    .loop
  693.  
  694. .loopn        move.b    #KCF_NOP,(a5)+        ; clear end of table
  695.         addq    #1,d0
  696.         cmpi.b    #$78,d0
  697.         bne    .loopn
  698.  
  699.         move.l    a5,SaveDeadBuf1        ; Store for deadkeys
  700.  
  701.         lea    KeyDefs,a0        ; ...and KeyDefs
  702.         moveq    #0,d0
  703. .loop2        move.l    (a0,d0),(a5)+
  704.         addq    #4,d0
  705.         cmpi    #4*$60,d0
  706.         bne    .loop2
  707.  
  708. .loop3        clr.l    (a5)+
  709.         addq    #4,d0
  710.         cmpi    #4*$78,d0
  711.         bne    .loop3
  712.  
  713.         lea    KeyTypes,a0        ; Now deadkeys
  714.         lea    KeyDefs,a1
  715.         moveq    #0,d0
  716. SaveDLoop    lea    DeadTab,a2
  717.         move.b    (a0,d0),d2
  718.         andi.b    #KCF_DEAD,d2
  719.         beq    NoSDead
  720.  
  721.         move.b    (a0,d0),d2        ; Extract a deadkey
  722.         andi.b    #KC_VANILLA,d2
  723.         bsr    QualToIndex        ; How many to get?
  724.  
  725.         move.l    a5,SaveDeadBuf2
  726.         move    d0,d1
  727.         lsl    #4,d1
  728.         add    d1,a2
  729.         moveq    #0,d1
  730. .loop        move    (a2,d1),(a5)+        ; Transfer to buffer
  731.         addq    #2,d1
  732.         cmp    d1,d2
  733.         bne    .loop
  734.  
  735.         moveq    #0,d1
  736.         move.l    SaveDeadBuf2,a4
  737.         lea    DeadIndex,a3
  738. SaveMLoop    cmpi.b    #DPF_MOD,(a4,d1)
  739.         bne.s    NoSMod
  740.  
  741.         moveq    #0,d3
  742.         move.b    1(a4,d1),d3
  743.         lsl    #4,d3
  744.         move.l    a5,d4
  745.         sub.l    a4,d4
  746.         move.b    d4,1(a4,d1)
  747.         move.l    (a3,d3),(a5)+        ; Transfer modkey table
  748.         move.l    4(a3,d3),(a5)+
  749.         move.l    8(a3,d3),(a5)+
  750.         move.l    12(a3,d3),(a5)+
  751.  
  752. NoSMod        addq    #2,d1
  753.         cmp    d1,d2
  754.         bne    SaveMLoop
  755.  
  756.         move    d0,d1            ; Put address in reloc
  757.         lsl    #2,d1            ; table
  758.         move.l    SaveDeadBuf2,d2
  759.         sub.l    SaveBuffer,d2
  760.         subi.l    #32,d2
  761.  
  762.         move.l    SaveDeadBuf1,a4
  763.         add    d1,a4
  764.         move.l    d2,(a4)
  765.         sub.l    SaveBuffer,a4
  766.         sub.l    #32,a4
  767.         move.l    a4,(a6)+
  768.         bsr    CheckA6
  769.  
  770. NoSDead        addq    #1,d0
  771.         cmpi    #$60,d0
  772.         bne    SaveDLoop
  773.  
  774.         lea    KeyTypes,a0        ; Finally strings
  775.         lea    KeyDefs,a1
  776.         moveq    #0,d0
  777. SaveSLoop    lea    StringList,a2
  778.         move.b    (a0,d0),d2
  779.         andi.b    #KCF_STRING,d2
  780.         beq    NoSStr
  781.  
  782.         move.b    (a0,d0),d2        ; Extract string key
  783.         andi.b    #KC_VANILLA,d2
  784.         bsr    QualToIndex        ; How many to get?
  785.         lsr    #1,d2
  786.  
  787.         move.l    a5,SaveDeadBuf2
  788.         move    d0,d1
  789.         lsl    #3,d1
  790.         add    d1,a2
  791.         moveq    #0,d1
  792. .loop        move.b    (a2,d1),(a5)+        ; Transfer to buffer
  793.         clr.b    (a5)+
  794.         addq    #1,d1
  795.         cmp    d1,d2
  796.         bne    .loop
  797.  
  798.         lsl    #1,d2
  799.         moveq    #0,d1
  800.         move.l    SaveDeadBuf2,a4
  801. SaveStr        lea    StringArea,a3
  802.         moveq    #0,d3
  803.         move.b    (a4,d1),d3
  804.         lsl    #5,d3
  805.         move.l    a5,d4
  806.         sub.l    a4,d4
  807.         move.b    d4,1(a4,d1)
  808.         moveq    #0,d7            ; Transfer string
  809.         add    d3,a3
  810. .loop        move.b    (a3,d7),d6
  811.         beq.s    .loopstop
  812.         move.b    d6,(a5)+
  813.         addq    #1,d7
  814.         bra    .loop
  815.  
  816. .loopstop    move.b    d7,(a4,d1)
  817.         addq    #2,d1
  818.         cmp    d1,d2
  819.         bne    SaveStr
  820.  
  821.         move.l    a5,d7
  822.         andi.b    #1,d7
  823.         beq.s    .noalign
  824.         clr.b    (a5)+            ; Ensure word-aligned
  825.  
  826. .noalign    move    d0,d1            ; Put address in reloc
  827.         lsl    #2,d1            ; table
  828.         move.l    SaveDeadBuf2,d2
  829.         sub.l    SaveBuffer,d2
  830.         subi.l    #32,d2
  831.  
  832.         move.l    SaveDeadBuf1,a4
  833.         add    d1,a4
  834.         move.l    d2,(a4)
  835.         sub.l    SaveBuffer,a4
  836.         sub.l    #32,a4
  837.         move.l    a4,(a6)+
  838.         bsr    CheckA6
  839.  
  840. NoSStr        addq    #1,d0
  841.         cmpi    #$60,d0
  842.         bne    SaveSLoop
  843.  
  844.         move.l    a5,a1
  845.         movea.l    xFile,a0        ; Transfer name
  846.         moveq    #0,d0
  847. .loop        move.b    (a0,d0),(a5)+
  848.         beq.s    FinSName
  849.         addq    #1,d0
  850.         bra    .loop
  851.  
  852. FinSName    move.l    a5,d0
  853.         andi.b    #1,d0
  854.         beq.s    .noalign
  855.         clr.b    (a5)+
  856. .noalign    move.l    SaveBuffer,a0
  857.         move.l    a1,d0
  858.         sub.l    a0,d0
  859.         subi.l    #32,d0
  860.         move.l    d0,42(a0)
  861.  
  862.         move.l    a5,d0
  863.         andi.l    #3,d0
  864.         beq.s    .noline            ; Hunk must be long
  865.         clr    (a5)+            ; word aligned
  866.  
  867. .noline        move.l    a5,d0
  868.         move.l    SaveBuffer,a3
  869.         sub.l    a3,d0            ; Get Hunk_size
  870.         subi.l    #$20,d0
  871.         lsr.l    #2,d0
  872.         move.l    d0,$14(a3)        ; Save it
  873.         move.l    d0,$1c(a3)
  874.         move.l    #$3ec,(a5)+        ; Hunk_reloc32
  875.  
  876.         move.l    a6,d0
  877.         sub.l    SaveBuffer2,d0
  878.         lsr.l    #2,d0
  879.         addi.l    #9,d0
  880.         move.l    d0,(a5)+        ; No. of references
  881.         clr.l    (a5)+            ; in Hunk 0
  882.  
  883. RelocLoop    cmp.l    SaveBuffer2,a6
  884.         beq.s    GotReloc
  885.         move.l    -(a6),d0        ; Transfer reloc
  886.         move.l    d0,(a5)+
  887.         bra    RelocLoop
  888.  
  889. GotReloc    move.l    #$2a,(a5)+        ; Refs. to initial table
  890.         move.l    #$26,(a5)+
  891.         move.l    #$22,(a5)+
  892.         move.l    #$1e,(a5)+
  893.         move.l    #$1a,(a5)+
  894.         move.l    #$16,(a5)+
  895.         move.l    #$12,(a5)+
  896.         move.l    #$e,(a5)+
  897.         move.l    #$a,(a5)+
  898.  
  899.         clr.l    (a5)+            ; Termination
  900.         move.l    #$3f2,(a5)+        ; Hunk_end
  901.         rts
  902.  
  903. CheckA6        move.l    SaveBuffer2,a4
  904.         add.l    #5120,a4
  905.         cmpa.l    a4,a6
  906.         bne.s    NotProb
  907.         subq.l    #4,a6
  908. NotProb        rts
  909.  
  910. QualToIndex    cmpi.b    #KC_NOQUAL,d2
  911.         bne.s    .1
  912.         moveq    #2,d2
  913.         rts
  914. .1        cmpi.b    #KC_VANILLA,d2
  915.         bne.s    .2
  916.         moveq    #16,d2
  917.         rts
  918. .2        cmpi.b    #KCF_SHIFT,d2
  919.         bne.s    .3
  920.         moveq    #4,d2
  921.         rts
  922. .3        cmpi.b    #KCF_ALT,d2
  923.         bne.s    .4
  924.         moveq    #4,d2
  925.         rts
  926. .4        cmpi.b    #KCF_CONTROL,d2
  927.         bne.s    .5
  928.         moveq    #4,d2
  929.         rts
  930. .5        moveq    #8,d2
  931.         rts
  932.  
  933. MakeBitTab    moveq    #0,d0            ; a0 = byte table to
  934.         moveq    #0,d1            ; convert to bits
  935. MakeCLoop    bclr    d1,d2
  936.         tst.b    (a0,d0)            ; Test key
  937.         beq.s    NoCSet
  938.         bset    d1,d2
  939.  
  940. NoCSet        addq    #1,d0
  941.         addq    #1,d1
  942.         cmpi.b    #96,d0
  943.         beq.s    MCapsOver
  944.         cmpi.b    #8,d1
  945.         bne    MakeCLoop
  946.  
  947.         move.b    d2,(a5)+        ; Save byte
  948.         moveq    #0,d1
  949.         bra    MakeCLoop
  950.  
  951. MCapsOver    move.b    d2,(a5)+
  952.         addq    #3,a5
  953.         rts
  954.  
  955. GoGadget    move    gg_GadgetID(a2),d0    ; Which gadget was it?
  956.         cmpi    #90,d0
  957.         beq    GoGadg1
  958.         cmpi    #91,d0
  959.         beq    GoGadg2
  960.         cmpi    #92,d0
  961.         beq    GoGadg3
  962.         cmpi    #93,d0
  963.         beq    GoGadg4
  964.         cmpi    #89,d0
  965.         beq    EndQual
  966.         cmpi    #-1,d0
  967.         beq    GoGadga
  968.         cmpi    #-2,d0
  969.         beq    GoGadgb
  970.         cmpi    #-3,d0
  971.         beq    GoGadgc
  972.         cmpi    #-4,d0
  973.         beq    GoGadgd
  974.         cmpi    #-5,d0
  975.         beq    GoGadge
  976.  
  977. LoadCheck    cmpi.b    #1,MyMode        ; Is it 'Keymap' mode?
  978.         bne    CheckMessage
  979.         clr.b    StringBuf
  980.         move.l    a2,-(sp)
  981.         moveq    #0,d7
  982.         move.b    d0,d7
  983.         move    d7,MyNewKey
  984.         bsr    KeyInString
  985.         move.l    (sp)+,a2
  986.         cmpa.l    MyDefKey,a2        ; Is it same key?
  987.         bne.s    NotSame
  988.         bsr    CheckQual
  989.         move.b    d0,d6
  990.         cmp.b    MyDefQual,d6
  991.         bne.s    NotSame
  992.         bra    AllSame
  993.  
  994. NotSame        movea.l    a2,a4
  995.         bsr    CheckQual        ; Store current qualifiers
  996.         move.b    d0,d6
  997.  
  998.         move.l    Windowhd,a0
  999.         lea    StrGadg,a1
  1000.         suba.l    a2,a2
  1001.         moveq    #89,d0
  1002.         CALLINT    RemoveGList
  1003.  
  1004.         movea.l    MyDefKey,a3
  1005.         cmpa.l    #0,a3
  1006.         beq.s    FirstDef
  1007.         cmp.b    MyDefQual,d6
  1008.         bne.s    FirstDef
  1009.  
  1010. NotFirstDef    move    gg_Flags(a3),d0
  1011.         eori    #SELECTED,d0
  1012.         move    d0,gg_Flags(a3)
  1013.  
  1014. FirstDef    move.b    d6,MyDefQual
  1015.         move    gg_Flags(a4),d0
  1016.         eori    #SELECTED,d0        ; Turn new key on
  1017.         move    d0,gg_Flags(a4)
  1018.         move.l    a4,MyDefKey
  1019.  
  1020.         move.l    Windowhd,a0
  1021.         lea    StrGadg,a1
  1022.         moveq    #5,d0
  1023.         moveq    #89,d1
  1024.         CALLSYS    AddGList
  1025.  
  1026.         movea.l    a4,a0
  1027.         move.l    Windowhd,a1
  1028.         moveq    #1,d0
  1029.         CALLSYS    RefreshGList
  1030.         move.l    a3,a0
  1031.         move.l    Windowhd,a1
  1032.         moveq    #1,d0
  1033.         CALLSYS    RefreshGList
  1034. AllSame        move    #GADGHCOMP,StrGadg+gg_Flags
  1035.         lea    StrGadg,a0
  1036.         move.l    Windowhd,a1
  1037.         moveq    #1,d0
  1038.         CALLINT    RefreshGList
  1039.         bsr    CSIon
  1040.         bsr    ActString
  1041.  
  1042.         cmpa.l    #Gadg46,a3        ; Was any key 'Return'?
  1043.         beq.s    DoAnthrGadg
  1044.         cmpi.l    #Gadg46,MyDefKey
  1045.         bne    CheckMessage
  1046.  
  1047. DoAnthrGadg    lea    Gadg87,a0        ; If so, refresh key to
  1048.         move.l    Windowhd,a1        ; the left as well
  1049.         moveq    #1,d0
  1050.         CALLINT    RefreshGList
  1051.         bra    CheckMessage
  1052.  
  1053. KeyInString    bsr    CheckQual        ; Input: d7 GadgNo.
  1054.         move.l    d0,LastQualVal        ; a6 safe
  1055.         move.l    d7,LastGadgVal
  1056. KeyInString2    lsl    #2,d0
  1057.         lea    QualTable,a0
  1058.         move.l    (a0,d0),NoDeadStore
  1059.         lea    DQualTab,a0
  1060.         move.l    (a0,d0),DeadStore
  1061.  
  1062.         lea    IDtoGadget,a0
  1063.         lea    KeyTypes,a2
  1064.         lea    KeyDefs,a3
  1065.         lea    MapToKeys,a4
  1066.         suba.l    #1,a4
  1067.         moveq    #0,d2
  1068.         moveq    #0,d3
  1069.         move.b    (a4,d7),d2        ; Keycode in d2
  1070.         move.b    (a2,d2),d3        ; Get key type
  1071.         andi.b    #KCF_STRING,d3
  1072.         bne    KI_String
  1073.         move.b    (a2,d2),d3
  1074.         andi.b    #KCF_DEAD,d3
  1075.         bne    KI_Dead
  1076.         move.b    (a2,d2),d3
  1077.         andi.b    #KC_VANILLA,d3        ; Find which key in each
  1078.         moveq    #0,d6            ; key definition list
  1079.         bsr.s    KI_Sub
  1080.         cmpi.b    #KC_VANILLA,d3
  1081.         bne.s    KI_AllDoF
  1082.         move.l    LastQualVal,d4
  1083.         andi.b    #1,d4
  1084.         beq.s    KI_AllDoF
  1085.         andi.b    #KCF_SHIFT!KCF_ALT,d3
  1086.         moveq    #0,d6
  1087.         bsr.s    KI_Sub
  1088.         cmpi.b    #-1,d6
  1089.         beq.s    KI_None
  1090.         andi.b    #%10011111,d0
  1091.  
  1092. KI_AllDoF    cmpi.b    #-1,d6
  1093.         beq.s    KI_None
  1094. KI_AllDo    move.b    #32,SqrTxt
  1095.         tst.b    d0
  1096.         beq.s    KI_NoKey
  1097.         move.b    d0,SqrTxt
  1098. KI_NoKey    move.l    RPort,a0
  1099.         lea    SqrText,a1
  1100.         clr.b    it_BackPen(a1)
  1101.         moveq    #0,d0
  1102.         moveq    #0,d1
  1103.         CALLINT    PrintIText
  1104. KI_None        rts
  1105.  
  1106. KI_Sub        move.l    NoDeadStore,a5
  1107.         move.b    (a5,d3),d6        ; Get index
  1108.         moveq    #0,d4            ; Extract key from the
  1109.         move.b    d2,d4            ; 'KeyDefs' table
  1110.         lsl    #2,d4
  1111.         sub    d6,d4
  1112.         move.b    3(a3,d4),d0        ; ASCII value in gadget
  1113.         rts
  1114.  
  1115. KI_Dead        move.b    (a2,d2),d3
  1116.         andi.b    #KC_VANILLA,d3
  1117.         move.l    DeadStore,a5
  1118.         moveq    #0,d1
  1119.         move.b    (a5,d3),d1        ; Get index
  1120.         move.l    a0,d6
  1121.         lea    DeadTab,a0
  1122.         move    d2,d5
  1123.         lsl    #4,d5
  1124.         add    d1,d5
  1125.         move.b    (a0,d5),d2
  1126.         tst.b    d2
  1127.         beq.s    KI_DeadDead
  1128.         cmpi.b    #DPF_MOD,d2
  1129.         beq.s    KI_ModDead
  1130.         move.l    d6,a0
  1131.         bra    KI_None
  1132.  
  1133. KI_DeadDead    move.b    1(a0,d5),d0
  1134.         bra    KI_AllDo
  1135.  
  1136. KI_ModDead    moveq    #0,d2
  1137.         move.b    1(a0,d5),d2
  1138.         mulu    #16,d2
  1139.         lea    DeadIndex,a0
  1140.         moveq    #0,d0
  1141.         move.b    CurrDKey,d0
  1142.         add    d0,d2
  1143.         move.b    (a0,d2),d0
  1144.         bra    KI_AllDo
  1145.  
  1146. KI_String    move.b    (a2,d2),d3
  1147.         andi.b    #KC_VANILLA,d3
  1148.         move.l    DeadStore,a5
  1149.         moveq    #0,d1
  1150.         move.b    (a5,d3),d1        ; Get index
  1151.         lsr    #1,d1
  1152.         lea    StringList,a0
  1153.         lsl    #3,d2
  1154.         add    d2,d1
  1155.         moveq    #0,d3
  1156.         move.b    (a0,d1),d3
  1157.         lsl    #5,d3
  1158.         lea    StringArea,a0
  1159.         lea    StringBuf,a1
  1160.         moveq    #0,d0
  1161. KI_SMove    move.b    (a0,d3),(a1,d0)
  1162.         beq.s    KI_SDone
  1163.         addq    #1,d3
  1164.         addq    #1,d0
  1165.         cmpi.b    #32,d0
  1166.         bne    KI_SMove
  1167. KI_SDone    move    d0,si_BufferPos+SpecialInfo
  1168.         clr    si_DispPos+SpecialInfo
  1169.         move.b    #" ",SqrTxt
  1170.         move.l    RPort,a0
  1171.         lea    SqrText,a1
  1172.         move.b    #3,it_BackPen(a1)
  1173.         moveq    #0,d0
  1174.         moveq    #0,d1
  1175.         CALLINT    PrintIText
  1176.         rts
  1177.  
  1178. GoGadg1        move    Gadg91+gg_Flags,d0
  1179.         eori    #SELECTED,d0
  1180.         move    d0,Gadg91+gg_Flags
  1181.         lea    Gadg91,a0        ; Redraw gadget
  1182.         move.l    Windowhd,a1
  1183.         suba.l    a2,a2
  1184.         moveq    #1,d0
  1185.         CALLINT    RefreshGList
  1186.         bra    EndQual
  1187.  
  1188. GoGadg2        move    Gadg90+gg_Flags,d0
  1189.         eori    #SELECTED,d0
  1190.         move    d0,Gadg90+gg_Flags
  1191.         lea    Gadg90,a0
  1192.         move.l    Windowhd,a1
  1193.         suba.l    a2,a2
  1194.         moveq    #1,d0
  1195.         CALLINT    RefreshGList
  1196.         bra.s    EndQual
  1197.  
  1198. GoGadg3        move    Gadg93+gg_Flags,d0
  1199.         eori    #SELECTED,d0
  1200.         move    d0,Gadg93+gg_Flags
  1201.         lea    Gadg93,a0
  1202.         move.l    Windowhd,a1
  1203.         suba.l    a2,a2
  1204.         moveq    #1,d0
  1205.         CALLINT    RefreshGList
  1206.         bra.s    EndQual
  1207.  
  1208. GoGadg4        move    Gadg92+gg_Flags,d0
  1209.         eori    #SELECTED,d0
  1210.         move    d0,Gadg92+gg_Flags
  1211.         lea    Gadg92,a0
  1212.         move.l    Windowhd,a1
  1213.         suba.l    a2,a2
  1214.         moveq    #1,d0
  1215.         CALLINT    RefreshGList
  1216.  
  1217. EndQual        bsr    RedrawKeys        ; Perform routines common
  1218.         bsr    SortOutFlag        ; to all qualifier keys
  1219.         cmpi.b    #5,MyMode        ; If 'DeadKeys', select
  1220.         bne.s    GoEQual1        ; dead & ghost modifiable
  1221.         move.b    #DPF_DEAD,DeadByte
  1222.         bsr    PickUpDead
  1223.         bsr    CancelMod
  1224.         bsr    NoOfDead
  1225.         bsr    CancelString
  1226.         bsr    NoOfDead
  1227.  
  1228. GoEQual1    cmpi.b    #4,MyMode        ; If 'Modifiable', select
  1229.         bne.s    GoEQual2        ; modifiable & ghost dead
  1230.         move.b    #DPF_MOD,DeadByte
  1231.         bsr    PickUpDead
  1232.         bsr    CancelDead
  1233.         bsr    CancelString
  1234.         bsr    NoOfMod
  1235.  
  1236. GoEQual2    cmpi.b    #1,MyMode        ; If 'KeyMap', ghost dead
  1237.         bne.s    GoEQual3
  1238.         bsr    CancelDead
  1239.         bsr    SetUpKeyOn
  1240.         bsr    ActString
  1241.  
  1242. GoEQual3    bsr    ERedrawKeys        ; Complete and RefreshGList()
  1243.         bra    CheckMessage
  1244.  
  1245. GoGadga        cmpi.b    #1,MyMode
  1246.         beq    CheckMessage
  1247. GGadga        bsr    StartExclude
  1248.         move.b    #1,MyMode
  1249.         move    #GADGHCOMP!GADGIMAGE!SELECTED,Gadg0a+gg_Flags
  1250.         bsr    EndExclude
  1251.         bsr    GoGadgKey
  1252.         bsr    SNoToggleGadg
  1253.         bsr    CancelDead
  1254.         bsr    SetUpKeyOn
  1255.         bsr    ENoToggleGadg
  1256.         bsr    ActString
  1257.         bsr    ChangeKString
  1258.         bra    CheckMessage
  1259.  
  1260. GoGadgb        cmpi.b    #2,MyMode
  1261.         beq    CheckMessage
  1262. GGadgb        bsr    StartExclude
  1263.         move.b    #2,MyMode
  1264.         move    #GADGHCOMP!GADGIMAGE!SELECTED,Gadg0b+gg_Flags
  1265.         bsr    EndExclude
  1266.         bsr    GoGadgCap
  1267.         bsr    SToggleGadg
  1268.         bsr    SetupCaps
  1269.         bsr    EToggleGadg
  1270.         bra    CheckMessage
  1271.  
  1272. GoGadgc        cmpi.b    #3,MyMode
  1273.         beq    CheckMessage
  1274. GGadgc        bsr    StartExclude
  1275.         move.b    #3,MyMode
  1276.         move    #GADGHCOMP!GADGIMAGE!SELECTED,Gadg0c+gg_Flags
  1277.         bsr    EndExclude
  1278.         bsr    GoGadgCap
  1279.         bsr    SToggleGadg
  1280.         bsr    SetUpRept
  1281.         bsr    EToggleGadg
  1282.         bra    CheckMessage
  1283.  
  1284. GoGadgd        cmpi.b    #4,MyMode
  1285.         beq    CheckMessage
  1286. GGadgd        bsr    StartExclude
  1287.         move.b    #4,MyMode
  1288.         move    #GADGHCOMP!GADGIMAGE!SELECTED,Gadg0d+gg_Flags
  1289.         bsr    EndExclude
  1290.         bsr    GoGadgKey
  1291.         bsr    SToggleGadg
  1292.         move.b    #DPF_MOD,DeadByte
  1293.         bsr    PickUpDead
  1294.         bsr.s    CancelDead
  1295.         bsr    CancelString
  1296.         bsr    NoOfMod
  1297.         bsr    EToggleGadg
  1298.         bra    CheckMessage
  1299.  
  1300. GoGadge        cmpi.b    #5,MyMode
  1301.         beq    CheckMessage
  1302. GGadge        bsr.s    StartExclude
  1303.         move.b    #5,MyMode
  1304.         move    #GADGHCOMP!GADGIMAGE!SELECTED,Gadg0e+gg_Flags
  1305.         bsr    EndExclude
  1306.         bsr    GoGadgKey
  1307.         bsr    SToggleGadg
  1308.         move.b    #DPF_DEAD,DeadByte
  1309.         bsr    PickUpDead
  1310.         bsr.s    CancelMod
  1311.         bsr    CancelString
  1312.         bsr    NoOfDead
  1313.         bsr    EToggleGadg
  1314.         bra    CheckMessage
  1315.  
  1316. CancelDead    move    #GADGHCOMP!GADGIMAGE!GADGDISABLED,On_Value
  1317.         move.b    #DPF_DEAD,DeadByte
  1318.         bsr    PickUpDead
  1319.         move    #GADGHCOMP!GADGIMAGE!SELECTED,On_Value
  1320.         rts
  1321.  
  1322. CancelMod    move    #GADGHCOMP!GADGIMAGE!GADGDISABLED,On_Value
  1323.         move.b    #DPF_MOD,DeadByte
  1324.         bsr    PickUpDead
  1325.         move    #GADGHCOMP!GADGIMAGE!SELECTED,On_Value
  1326.         rts
  1327.  
  1328. StartExclude    bsr    CheckQual
  1329.         lsl    #2,d0
  1330.         lea    QualTable,a0
  1331.         move.l    (a0,d0),NoDeadStore
  1332.         lea    DQualTab,a0
  1333.         move.l    (a0,d0),DeadStore
  1334.  
  1335.         move.l    Windowhd,a0        ; Turn off all mode gadgets
  1336.         lea    Gadg0a,a1
  1337.         moveq    #5,d0
  1338.         CALLINT    RemoveGList
  1339.         move    #GADGHCOMP!GADGIMAGE,d0
  1340.         move    d0,Gadg0a+gg_Flags
  1341.         move    #GADGHCOMP!GADGIMAGE,d0
  1342.         move    d0,Gadg0b+gg_Flags
  1343.         move    #GADGHCOMP!GADGIMAGE,d0
  1344.         move    d0,Gadg0c+gg_Flags
  1345.         move    #GADGHCOMP!GADGIMAGE,d0
  1346.         move    d0,Gadg0d+gg_Flags
  1347.         move    #GADGHCOMP!GADGIMAGE,d0
  1348.         move    d0,Gadg0e+gg_Flags
  1349.         rts
  1350.  
  1351. EndExclude    move.l    Windowhd,a0
  1352.         lea    Gadg0a,a1
  1353.         moveq    #0,d0
  1354.         moveq    #5,d1
  1355.         suba.l    a2,a2
  1356.         CALLINT    AddGList        ; Turn on all mode gadgets
  1357.  
  1358.         lea    Gadg0a,a0
  1359.         move.l    Windowhd,a1
  1360.         moveq    #5,d0
  1361.         CALLSYS    RefreshGList        ; ...and redraw them
  1362.         rts
  1363.  
  1364. GoGadgCap    move    Gadg89+gg_Flags,d0    ; Do we need to alter any
  1365.         andi    #GADGDISABLED,d0    ; gadgets for the new mode?
  1366.         beq.s    SendGadgCap        ; Yes, so branch
  1367.         rts
  1368.  
  1369. SendGadgCap    move.l    Windowhd,a0        ; Deactivate qualifiers
  1370.         lea    Gadg89,a1
  1371.         moveq    #5,d0
  1372.         CALLINT    RemoveGList
  1373.  
  1374.         move    Gadg89+gg_Flags,d0    ; then turn them off
  1375.         ori    #GADGDISABLED,d0    ; similarly to OffGadget()
  1376.         move    d0,Gadg89+gg_Flags
  1377.         move    Gadg90+gg_Flags,d0
  1378.         ori    #GADGDISABLED,d0
  1379.         move    d0,Gadg90+gg_Flags
  1380.         move    Gadg91+gg_Flags,d0
  1381.         ori    #GADGDISABLED,d0
  1382.         move    d0,Gadg91+gg_Flags
  1383.         move    Gadg92+gg_Flags,d0
  1384.         ori    #GADGDISABLED,d0
  1385.         move    d0,Gadg92+gg_Flags
  1386.         move    Gadg93+gg_Flags,d0
  1387.         ori    #GADGDISABLED,d0
  1388.         move    d0,Gadg93+gg_Flags
  1389.  
  1390.         move.l    Windowhd,a0
  1391.         lea    Gadg89,a1
  1392.         moveq    #5+89,d0
  1393.         moveq    #5,d1
  1394.         CALLSYS    AddGList
  1395.  
  1396.         lea    Gadg89,a0        ; and redraw
  1397.         move.l    Windowhd,a1
  1398.         moveq    #5,d0
  1399.         CALLSYS    RefreshGList
  1400.         rts
  1401.  
  1402. GoGadgKey    move    Gadg89+gg_Flags,d0    ; Do we need to alter any
  1403.         andi    #GADGDISABLED,d0    ; gadgets for the new mode?
  1404.         bne.s    SendGadgKey        ; Yes, so branch
  1405.         rts
  1406.  
  1407. SendGadgKey    move.l    Windowhd,a0        ; Deactivate qualifiers
  1408.         lea    Gadg89,a1
  1409.         moveq    #5,d0
  1410.         CALLINT    RemoveGList
  1411.  
  1412.         move    Gadg89+gg_Flags,d0    ; then turn them on
  1413.         eori    #GADGDISABLED,d0    ; similarly to OnGadget()
  1414.         move    d0,Gadg89+gg_Flags
  1415.         move    Gadg90+gg_Flags,d0
  1416.         eori    #GADGDISABLED,d0
  1417.         move    d0,Gadg90+gg_Flags
  1418.         move    Gadg91+gg_Flags,d0
  1419.         eori    #GADGDISABLED,d0
  1420.         move    d0,Gadg91+gg_Flags
  1421.         move    Gadg92+gg_Flags,d0
  1422.         eori    #GADGDISABLED,d0
  1423.         move    d0,Gadg92+gg_Flags
  1424.         move    Gadg93+gg_Flags,d0
  1425.         eori    #GADGDISABLED,d0
  1426.         move    d0,Gadg93+gg_Flags
  1427.  
  1428.         move.l    Windowhd,a0
  1429.         lea    Gadg89,a1
  1430.         moveq    #5+89,d0
  1431.         moveq    #5,d1
  1432.         suba.l    a2,a2
  1433.         CALLSYS    AddGList
  1434.  
  1435.         lea    Gadg89,a0        ; and redraw
  1436.         move.l    Windowhd,a1
  1437.         moveq    #5,d0
  1438.         CALLSYS    RefreshGList
  1439.         rts
  1440.  
  1441. SToggleGadg    move.l    Windowhd,a0
  1442.         CALLINT    ClearDMRequest
  1443.         move.l    Windowhd,a0        ; Deactivate keys
  1444.         lea    StrGadg,a1
  1445.         moveq    #89,d0
  1446.         CALLSYS    RemoveGList
  1447.  
  1448.         move    #RELVERIFY!TOGGLESELECT,d0
  1449.         move    #gg_Activation,d1
  1450.         moveq    #0,d2
  1451.         lea    DeadIDtoGadg,a0
  1452. STGadgLoop    move.l    (a0,d2),a1
  1453.         move    d0,(a1,d1)
  1454.         addq    #4,d2
  1455.         cmpi    #88*4,d2
  1456.         bne    STGadgLoop
  1457.  
  1458.         move    #RELVERIFY!TOGGLESELECT!BOOLEXTEND,Gadg46+gg_Activation
  1459.         move    #GADGHCOMP!GADGDISABLED,StrGadg+gg_Flags
  1460.         bsr    CSIoff
  1461.         bra    SortOutFlag
  1462.  
  1463. EToggleGadg    move.l    Windowhd,a0        ; Finish & redraw
  1464.         lea    StrGadg,a1
  1465.         moveq    #5,d0
  1466.         moveq    #89,d1
  1467.         CALLINT    AddGList
  1468.  
  1469.         lea    StrGadg,a0
  1470.         move.l    Windowhd,a1
  1471.         moveq    #89,d0
  1472.         CALLSYS    RefreshGList
  1473.         rts
  1474.  
  1475. SNoToggleGadg    move.l    Windowhd,a0        ; Turn on requester
  1476.         lea    DoubleReq,a1
  1477.         CALLINT    SetDMRequest
  1478.         move.l    Windowhd,a0        ; Deactivate keys
  1479.         lea    StrGadg,a1
  1480.         moveq    #89,d0
  1481.         CALLSYS    RemoveGList
  1482.  
  1483.         move    #GADGIMMEDIATE,d0
  1484.         move    #gg_Activation,d1
  1485.         moveq    #0,d2
  1486.         lea    DeadIDtoGadg,a0
  1487. STNoGadgLp    move.l    (a0,d2),a1
  1488.         move    d0,(a1,d1)
  1489.         addq    #4,d2
  1490.         cmpi    #88*4,d2
  1491.         bne    STNoGadgLp
  1492.  
  1493.         move    #GADGIMMEDIATE!BOOLEXTEND,Gadg46+gg_Activation
  1494.         bra.s    SortOutFlag
  1495.  
  1496. ENoToggleGadg    move.l    Windowhd,a0
  1497.         lea    StrGadg,a1
  1498.         moveq    #5,d0
  1499.         moveq    #89,d1
  1500.         CALLINT    AddGList
  1501.  
  1502.         lea    StrGadg,a0
  1503.         move.l    Windowhd,a1
  1504.         moveq    #89,d0
  1505.         CALLSYS    RefreshGList
  1506.         rts
  1507.  
  1508. SortOutFlag    move    #GADGHCOMP!GADGIMAGE,d0
  1509.         move    #gg_Flags,d1
  1510.         moveq    #0,d2
  1511.         lea    DeadIDtoGadg,a0
  1512. SFlagLoop    move.l    (a0,d2),a1
  1513.         move    d0,(a1,d1)
  1514.         addq    #4,d2
  1515.         cmpi    #88*4,d2
  1516.         bne    SFlagLoop
  1517.         rts
  1518.  
  1519. SetupCaps    lea    CapsTab,a0        ; Analyse Caps table
  1520.         bra.s    BitInfo
  1521.  
  1522. SetUpRept    lea    ReptTab,a0        ; Analyse Repeat table
  1523.  
  1524. BitInfo        lea    KeysToMap,a1
  1525.         moveq    #0,d0
  1526.         moveq    #0,d1
  1527. BitLoop        move.b    (a0,d0),d2
  1528.         move.l    (a1,d1),a3
  1529.         cmpa    #0,a3            ; Is it a valid key?
  1530.         beq.s    EBit
  1531.         adda    #gg_Flags,a3
  1532.         tst.b    d2            ; Is it high?
  1533.         beq.s    NotBit            ; No...
  1534.         move    #GADGHCOMP!GADGIMAGE!SELECTED,(a3)
  1535.         bra.s    EBit
  1536. NotBit        move    #GADGHCOMP!GADGIMAGE,(a3)
  1537. EBit        addi    #4,d1            ; Continue loop
  1538.         addi    #1,d0
  1539.         cmpi    #$60,d0
  1540.         bne    BitLoop
  1541.         rts
  1542.  
  1543. KeyGadget    move    gg_GadgetID(a2),d0    ; Now process normal keys
  1544.         cmpi    #94,d0
  1545.         beq.s    CSIenter
  1546.         cmpi.b    #1,MyMode
  1547.         beq.s    OnKeyEd
  1548.         cmpi.b    #2,MyMode
  1549.         beq    OnCaps
  1550.         cmpi.b    #3,MyMode
  1551.         beq    OnRept
  1552.         cmpi.b    #4,MyMode
  1553.         beq    OnMod
  1554.         cmpi.b    #5,MyMode
  1555.         beq    OnDead
  1556.         bra    CheckMessage
  1557.  
  1558. CSIenter    move    #$9b00,StringBuf
  1559.         move    #1,si_BufferPos+SpecialInfo
  1560.         clr    si_DispPos+SpecialInfo
  1561.         lea    StrGadg,a0
  1562.         move.l    Windowhd,a1
  1563.         moveq    #1,d0
  1564.         CALLINT    RefreshGList
  1565.         bsr    ActString
  1566.         bra    CheckMessage
  1567.  
  1568. OnKeyEd        tst    d0            ; Has a string been entered?
  1569.         bne    CheckMessage
  1570.         tst.b    StringBuf
  1571.         beq    CheckMessage
  1572.         lea    StringBuf,a0
  1573.         lea    SoM,a1
  1574.         bsr    StrComp
  1575.         tst    d0
  1576.         bne.s    NotSpecString
  1577.         bsr    Sisters
  1578.  
  1579. NotSpecString    tst.b    StringBuf+1        ; Process string
  1580.         bne    StringEnter        ; User entered string
  1581.  
  1582.         lea    KeyTypes,a4        ; Handle single key input
  1583.         lea    MapToKeys,a2
  1584.         suba.l    #1,a2
  1585.         moveq    #0,d7
  1586.         move    MyNewKey,d2
  1587.         move.b    (a2,d2),d7
  1588.         move.b    (a4,d7),d1        ; Get key type
  1589.         andi.b    #KCF_STRING,d1
  1590.         bne    EdOneString        ; User modifies string
  1591.         move.b    (a4,d7),d1
  1592.         andi.b    #KCF_DEAD,d1
  1593.         bne    EditDead        ; User modifies deadkey
  1594.  
  1595.         move.b    (a4,d7),d1        ; Replace one single char
  1596.         move.b    MyDefQual,d2        ; definition with another
  1597.         cmpi.b    #7,d2
  1598.         beq    Ed_NoGo
  1599.         cmpi.b    #1,d2            ; Do we have to reorganise
  1600.         beq.s    Ed___C            ; the KeyDefinition?
  1601.         cmpi.b    #2,d2
  1602.         beq.s    Ed_S__
  1603.         cmpi.b    #3,d2
  1604.         beq.s    Ed_S_C
  1605.         cmpi.b    #4,d2
  1606.         beq.s    Ed__A_
  1607.         cmpi.b    #5,d2
  1608.         beq    Ed__AC
  1609.         cmpi.b    #6,d2
  1610.         beq.s    Ed_SA_
  1611.         bra    Ed_Go
  1612.  
  1613. Ed___C        cmpi.b    #KCF_ALT+KCF_SHIFT,d1
  1614.         beq.s    Ed_MustFix_1
  1615.         cmpi.b    #KC_VANILLA,d1
  1616.         bne    Ed_Go
  1617. Ed_MustFix_1    bsr    Ed_MustFix
  1618.         tst    d0
  1619.         beq    CheckMessage
  1620.         move.b    #KCF_SHIFT,(a4,d7)
  1621.         bra.s    Ed_Go
  1622.  
  1623. Ed_S__        cmpi.b    #KCF_ALT+KCF_CONTROL,d1
  1624.         bne.s    Ed_Go
  1625.         bsr    Ed_MustFix
  1626.         tst    d0
  1627.         beq    CheckMessage
  1628.         move.b    #KCF_ALT,(a4,d7)
  1629.         bra.s    Ed_Go
  1630.  
  1631. Ed__A_        cmpi.b    #KCF_CONTROL+KCF_SHIFT,d1
  1632.         bne.s    Ed_Go
  1633.         bsr    Ed_MustFix
  1634.         tst    d0
  1635.         beq    CheckMessage
  1636.         move.b    #KCF_SHIFT,(a4,d7)
  1637.         bra.s    Ed_Go
  1638.  
  1639. Ed_S_C        andi.b    #KCF_ALT,d1
  1640.         beq.s    Ed_Go
  1641.         bsr    Ed_MustFix
  1642.         tst    d0
  1643.         beq    CheckMessage
  1644.         eori.b    #KCF_ALT,(a4,d7)
  1645.         bra.s    Ed_Go
  1646.  
  1647. Ed_SA_        cmpi.b    #KC_VANILLA,d1
  1648.         beq.s    Ed_Go
  1649.         andi.b    #KCF_CONTROL,d1
  1650.         beq.s    Ed_Go
  1651.         bsr    Ed_MustFix
  1652.         tst    d0
  1653.         beq    CheckMessage
  1654.         eori.b    #KCF_CONTROL,(a4,d7)
  1655.         bra.s    Ed_Go
  1656.  
  1657. Ed__AC        andi.b    #KCF_SHIFT,d1
  1658.         beq.s    Ed_Go
  1659.         bsr    Ed_MustFix
  1660.         tst    d0
  1661.         beq    CheckMessage
  1662.         eori.b    #KCF_SHIFT,(a4,d7)
  1663.  
  1664. Ed_Go        lea    KeyDefs,a0        ; Change key definition
  1665.         move.b    MyDefQual,d2
  1666.         move.b    (a4,d7),d1
  1667.         move    d7,d6
  1668.         lsl    #2,d6
  1669.         cmpi.b    #KC_NOQUAL,d1
  1670.         beq.s    Eg____
  1671.         cmpi.b    #KCF_SHIFT,d1
  1672.         beq    Eg_S__
  1673.         cmpi.b    #KCF_ALT,d1
  1674.         beq    Eg__A_
  1675.         cmpi.b    #KCF_CONTROL,d1
  1676.         beq    Eg___C
  1677.         cmpi.b    #KCF_SHIFT+KCF_ALT,d1
  1678.         beq    Eg_SA_
  1679.         cmpi.b    #KCF_SHIFT+KCF_CONTROL,d1
  1680.         beq    Eg_S_C
  1681.         cmpi.b    #KCF_ALT+KCF_CONTROL,d1
  1682.         beq    Eg__AC
  1683.         cmpi.b    #KC_VANILLA,d1
  1684.         beq    Eg_SA_
  1685.  
  1686. Eg____        tst.b    d2
  1687.         bne.s    .1
  1688.         move.b    #KC_NOQUAL,(a4,d7)
  1689.         move.b    StringBuf,3(a0,d6)
  1690.         bra    Eg_Done
  1691. .1        cmpi.b    #1,d2
  1692.         bne.s    .2
  1693.         move.b    #KCF_CONTROL,(a4,d7)
  1694.         move.b    StringBuf,2(a0,d6)
  1695.         bra    Eg_Done
  1696. .2        cmpi.b    #2,d2
  1697.         bne.s    .3
  1698.         move.b    #KCF_SHIFT,(a4,d7)
  1699.         move.b    StringBuf,2(a0,d6)
  1700.         bra    Eg_Done
  1701. .3        cmpi.b    #4,d2
  1702.         bne.s    .4
  1703.         move.b    #KCF_ALT,(a4,d7)
  1704.         move.b    StringBuf,2(a0,d6)
  1705.         bra    Eg_Done
  1706. .4        cmpi.b    #3,d2
  1707.         bne.s    .5
  1708.         move.b    #KCF_SHIFT+KCF_CONTROL,(a4,d7)
  1709.         move.b    3(a0,d6),2(a0,d6)
  1710.         move.b    3(a0,d6),1(a0,d6)
  1711.         move.b    StringBuf,(a0,d6)
  1712.         bra    Eg_Done
  1713. .5        cmpi.b    #5,d2
  1714.         bne.s    .6
  1715.         move.b    #KCF_CONTROL+KCF_ALT,(a4,d7)
  1716.         move.b    3(a0,d6),2(a0,d6)
  1717.         move.b    3(a0,d6),1(a0,d6)
  1718.         move.b    StringBuf,(a0,d6)
  1719.         bra    Eg_Done
  1720. .6        move.b    #KCF_SHIFT+KCF_ALT,(a4,d7)
  1721.         move.b    3(a0,d6),2(a0,d6)
  1722.         move.b    3(a0,d6),1(a0,d6)
  1723.         move.b    StringBuf,(a0,d6)
  1724.         bsr    VanOrNot
  1725.         bra    Eg_Done
  1726.  
  1727. Eg_S__        tst.b    d2
  1728.         bne.s    .1
  1729.         move.b    StringBuf,3(a0,d6)
  1730.         bra    Eg_Done
  1731. .1        cmpi.b    #2,d2
  1732.         bne.s    .2
  1733.         move.b    StringBuf,2(a0,d6)
  1734.         bra    Eg_Done
  1735. .2        cmpi.b    #4,d2
  1736.         bne.s    .3
  1737.         move.b    #KCF_SHIFT+KCF_ALT,(a4,d7)
  1738.         move.b    2(a0,d6),(a0,d6)
  1739.         move.b    StringBuf,1(a0,d6)
  1740.         bsr    VanOrNot
  1741.         bra    Eg_Done
  1742. .3        cmpi.b    #6,d2
  1743.         bne.s    .4
  1744.         move.b    #KCF_SHIFT+KCF_ALT,(a4,d7)
  1745.         move.b    3(a0,d6),1(a0,d6)
  1746.         move.b    StringBuf,(a0,d6)
  1747.         bsr    VanOrNot
  1748.         bra    Eg_Done
  1749. .4        cmpi.b    #1,d2
  1750.         bne.s    .5
  1751.         move.b    #KCF_SHIFT+KCF_CONTROL,(a4,d7)
  1752.         move.b    2(a0,d6),(a0,d6)
  1753.         move.b    StringBuf,1(a0,d6)
  1754.         bra    Eg_Done
  1755. .5        move.b    #KCF_SHIFT+KCF_CONTROL,(a4,d7)
  1756.         move.b    3(a0,d6),1(a0,d6)
  1757.         move.b    StringBuf,(a0,d6)
  1758.         bra    Eg_Done
  1759.  
  1760. Eg__A_        tst.b    d2
  1761.         bne.s    .1
  1762.         move.b    StringBuf,3(a0,d6)
  1763.         bra    Eg_Done
  1764. .1        cmpi.b    #4,d2
  1765.         bne.s    .2
  1766.         move.b    StringBuf,2(a0,d6)
  1767.         bra    Eg_Done
  1768. .2        cmpi.b    #2,d2
  1769.         bne.s    .3
  1770.         move.b    #KCF_SHIFT+KCF_ALT,(a4,d7)
  1771.         move.b    2(a0,d6),1(a0,d6)
  1772.         move.b    2(a0,d6),(a0,d6)
  1773.         move.b    StringBuf,2(a0,d6)
  1774.         bsr    VanOrNot
  1775.         bra    Eg_Done
  1776. .3        cmpi.b    #6,d2
  1777.         bne.s    .4
  1778.         move.b    #KCF_SHIFT+KCF_ALT,(a4,d7)
  1779.         move.b    2(a0,d6),1(a0,d6)
  1780.         move.b    StringBuf,(a0,d6)
  1781.         bsr    VanOrNot
  1782.         bra    Eg_Done
  1783. .4        cmpi.b    #1,d2
  1784.         bne.s    .5
  1785.         move.b    #KCF_ALT+KCF_CONTROL,(a4,d7)
  1786.         move.b    2(a0,d6),(a0,d6)
  1787.         move.b    StringBuf,1(a0,d6)
  1788.         bra    Eg_Done
  1789. .5        move.b    #KCF_CONTROL+KCF_ALT,(a4,d7)
  1790.         move.b    3(a0,d6),1(a0,d6)
  1791.         move.b    StringBuf,(a0,d6)
  1792.         bra    Eg_Done
  1793.  
  1794. Eg___C        tst.b    d2
  1795.         bne.s    .1
  1796.         move.b    StringBuf,3(a0,d6)
  1797.         bra    Eg_Done
  1798. .1        cmpi.b    #1,d2
  1799.         bne.s    .2
  1800.         move.b    StringBuf,2(a0,d6)
  1801.         bra    Eg_Done
  1802. .2        cmpi.b    #2,d2
  1803.         bne.s    .3
  1804.         move.b    #KCF_SHIFT+KCF_CONTROL,(a4,d7)
  1805.         move.b    2(a0,d6),1(a0,d6)
  1806.         move.b    2(a0,d6),(a0,d6)
  1807.         move.b    StringBuf,2(a0,d6)
  1808.         bra    Eg_Done
  1809. .3        cmpi.b    #3,d2
  1810.         bne.s    .4
  1811.         move.b    #KCF_SHIFT+KCF_CONTROL,(a4,d7)
  1812.         move.b    2(a0,d6),1(a0,d6)
  1813.         move.b    StringBuf,(a0,d6)
  1814.         bra    Eg_Done
  1815. .4        cmpi.b    #4,d2
  1816.         bne.s    .5
  1817.         move.b    #KCF_ALT+KCF_CONTROL,(a4,d7)
  1818.         move.b    2(a0,d6),1(a0,d6)
  1819.         move.b    2(a0,d6),(a0,d6)
  1820.         move.b    StringBuf,2(a0,d6)
  1821.         bra    Eg_Done
  1822. .5        move.b    #KCF_CONTROL+KCF_ALT,(a4,d7)
  1823.         move.b    2(a0,d6),1(a0,d6)
  1824.         move.b    StringBuf,(a0,d6)
  1825.         bra    Eg_Done
  1826.  
  1827. Eg_SA_        tst.b    d2
  1828.         bne.s    .1
  1829.         move.b    StringBuf,3(a0,d6)
  1830.         bra    Eg_Done
  1831. .1        cmpi.b    #2,d2
  1832.         bne.s    .2
  1833.         move.b    StringBuf,2(a0,d6)
  1834.         bra    Eg_Done
  1835. .2        cmpi.b    #4,d2
  1836.         bne.s    .3
  1837.         move.b    StringBuf,1(a0,d6)
  1838.         bra.s    Eg_Done
  1839. .3        move.b    StringBuf,(a0,d6)
  1840.         bra.s    Eg_Done
  1841.  
  1842. Eg_S_C        tst.b    d2
  1843.         bne.s    .1
  1844.         move.b    StringBuf,3(a0,d6)
  1845.         bra.s    Eg_Done
  1846. .1        cmpi.b    #2,d2
  1847.         bne.s    .2
  1848.         move.b    StringBuf,2(a0,d6)
  1849.         bra.s    Eg_Done
  1850. .2        cmpi.b    #1,d2
  1851.         bne.s    .3
  1852.         move.b    StringBuf,1(a0,d6)
  1853.         bra.s    Eg_Done
  1854. .3        move.b    StringBuf,(a0,d6)
  1855.         bra.s    Eg_Done
  1856.  
  1857. Eg__AC        tst.b    d2
  1858.         bne.s    .1
  1859.         move.b    StringBuf,3(a0,d6)
  1860.         bra.s    Eg_Done
  1861. .1        cmpi.b    #4,d2
  1862.         bne.s    .2
  1863.         move.b    StringBuf,2(a0,d6)
  1864.         bra.s    Eg_Done
  1865. .2        cmpi.b    #1,d2
  1866.         bne.s    .3
  1867.         move.b    StringBuf,1(a0,d6)
  1868.         bra.s    Eg_Done
  1869. .3        move.b    StringBuf,(a0,d6)
  1870.  
  1871. Eg_Done        move.l    Windowhd,a0        ; Redraw affected key
  1872.         lea    StrGadg,a1
  1873.         moveq    #89,d0
  1874.         CALLINT    RemoveGList
  1875.         bsr    GenerateKeys
  1876.         move.l    Windowhd,a0
  1877.         lea    StrGadg,a1
  1878.         moveq    #5,d0
  1879.         moveq    #89,d1
  1880.         CALLINT    AddGList
  1881.  
  1882.         lea    DeadIDtoGadg,a0
  1883.         move    MyNewKey,d7
  1884.         subq    #1,d7
  1885.         move    d7,d0
  1886.         lsl    #2,d0
  1887.         move.l    (a0,d0),a0
  1888.         move.l    Windowhd,a1
  1889.         moveq    #1,d0
  1890.         CALLSYS    RefreshGList
  1891.  
  1892.         cmpi    #45,d7
  1893.         bne.s    Eg_FinalCall
  1894.         lea    Gadg87,a0
  1895.         move.l    Windowhd,a1
  1896.         moveq    #1,d0
  1897.         CALLSYS    RefreshGList
  1898. Eg_FinalCall    bsr    ChangeKString
  1899.         bra    CheckMessage
  1900.  
  1901. Ed_MustFix    move.l    Windowhd,a0        ; What should we do?
  1902.         lea    EdText,a1
  1903.         lea    EdPos,a2
  1904.         lea    AbortText,a3
  1905.         moveq    #0,d0
  1906.         moveq    #0,d1
  1907.         move.l    #320,d2
  1908.         moveq    #62,d3
  1909.         CALLINT    AutoRequest
  1910.         rts
  1911.  
  1912. Ed_NoGo        move.l    Windowhd,a0
  1913.         lea    NoEdText,a1
  1914.         suba.l    a2,a2
  1915.         lea    AbortText,a3
  1916.         moveq    #0,d0
  1917.         moveq    #0,d1
  1918.         move.l    #325,d2
  1919.         moveq    #53,d3
  1920.         CALLINT    AutoRequest
  1921.         bra    CheckMessage
  1922.  
  1923. VanOrNot    move.l    Windowhd,a0        ; What should we do
  1924.         lea    VanText,a1        ; about CTRL key?
  1925.         lea    VanPos,a2
  1926.         lea    VanNeg,a3
  1927.         moveq    #0,d0
  1928.         moveq    #0,d1
  1929.         move    #397,d2
  1930.         moveq    #62,d3
  1931.         CALLINT    AutoRequest
  1932.         tst.l    d0
  1933.         bne.s    ChangeToVan
  1934.         rts
  1935. ChangeToVan    move.b    #KC_VANILLA,(a4,d7)
  1936.         rts
  1937.  
  1938. EditDead    moveq    #0,d0
  1939.         move.b    MyDefQual,d0
  1940.         lsl    #2,d0
  1941.         lea    DQualTab,a0
  1942.         move.l    (a0,d0),a6
  1943.  
  1944.         move.b    (a4,d7),d1
  1945.         andi.b    #KC_VANILLA,d1
  1946.         moveq    #0,d0
  1947.         move.b    (a6,d1),d0
  1948.         lea    DeadTab,a5
  1949.         move    d7,d6
  1950.         lsl    #4,d6
  1951.         add    d0,d6
  1952.         move.b    (a5,d6),d2
  1953.         cmpi.b    #DPF_MOD,d2
  1954.         beq.s    EditMod
  1955.         tst.b    d2
  1956.         bne    CheckMessage
  1957.         move.b    StringBuf,1(a5,d6)    ; Store new definition
  1958.         bra    Eg_Done
  1959.  
  1960. EditMod        moveq    #0,d0
  1961.         move.b    1(a5,d6),d0
  1962.         lsl    #4,d0
  1963.         add.b    CurrDKey,d0
  1964.         lea    DeadIndex,a0
  1965.         move.b    StringBuf,(a0,d0)
  1966.         bra    Eg_Done
  1967.  
  1968. StringEnter    lea    KeyTypes,a4        ; Handle string input
  1969.         lea    MapToKeys,a2
  1970.         suba.l    #1,a2
  1971.         moveq    #0,d7
  1972.         move    MyNewKey,d2
  1973.         move.b    (a2,d2),d7
  1974.         move.b    (a4,d7),d1        ; Get key type
  1975.         andi.b    #KCF_STRING,d1
  1976.         bne    EditString
  1977.         move.b    (a4,d7),d1
  1978.         andi.b    #KCF_DEAD,d1
  1979.         beq    NormToStr        ; Convert to string
  1980.  
  1981.         move.l    Windowhd,a0        ; Cannot put a string on
  1982.         lea    NoDeadSText,a1        ; a deadkey
  1983.         suba.l    a2,a2
  1984.         lea    AbortText,a3
  1985.         moveq    #0,d0
  1986.         moveq    #0,d1
  1987.         move.l    #357,d2
  1988.         moveq    #53,d3
  1989.         CALLINT    AutoRequest
  1990.         bra    CheckMessage
  1991.  
  1992. EdOneString    move.b    (a4,d7),d1        ; Current keytype
  1993.         andi.b    #KC_VANILLA,d1
  1994.         move.b    MyDefQual,d2        ; Qualifier
  1995.         bsr    StringExpand
  1996.  
  1997.         move.l    DeadStore,a5        ; Now edit string
  1998.         move    d7,d2
  1999.         move.b    (a4,d2),d3
  2000.         andi.b    #KC_VANILLA,d3
  2001.         moveq    #0,d1
  2002.         move.b    (a5,d3),d1        ; Get index
  2003.         lsr    #1,d1
  2004.         lea    StringList,a0
  2005.         lsl    #3,d2
  2006.         add    d2,d1
  2007.         moveq    #0,d3
  2008.         move.b    (a0,d1),d3
  2009.         lsl    #5,d3
  2010.         lea    StringArea,a0
  2011.         lea    StringBuf,a1
  2012.         move.b    (a1),(a0,d3)        ; Copy key entered
  2013.         clr.b    1(a0,d3)
  2014.  
  2015.         lea    StringList,a1
  2016.         adda    d2,a1
  2017.         move.b    (a4,d7),d6
  2018.         andi.b    #KC_VANILLA,d6
  2019.         moveq    #0,d1
  2020. ExStrLoop    moveq    #0,d3            ; Can we turn this key
  2021.         move.b    (a1,d1),d3        ; back to a normal?
  2022.         lsl    #5,d3
  2023.         tst.b    1(a0,d3)
  2024.         bne    Eg_Done            ; No...
  2025.  
  2026.         addq    #1,d1
  2027.         cmpi.b    #KC_NOQUAL,d6
  2028.         beq.s    PassStrTest
  2029.         cmpi.b    #KCF_SHIFT,d6
  2030.         beq.s    .1
  2031.         cmpi.b    #KCF_ALT,d6
  2032.         beq.s    .1
  2033.         cmpi.b    #KCF_CONTROL,d6
  2034.         beq.s    .1
  2035.         cmpi.b    #KC_VANILLA,d6
  2036.         beq.s    .2
  2037.  
  2038.         cmpi.b    #4,d1
  2039.         beq.s    PassStrTest
  2040.         bra    ExStrLoop
  2041.  
  2042. .1        cmpi.b    #2,d1
  2043.         beq.s    PassStrTest
  2044.         bra    ExStrLoop
  2045.  
  2046. .2        cmpi.b    #8,d1
  2047.         beq.s    PassStrTest
  2048.         bra    ExStrLoop
  2049.  
  2050. PassStrTest    cmpi.b    #KC_VANILLA,d6
  2051.         bne.s    NoCheckNeed
  2052.  
  2053.         movem.l    a0-a1,-(sp)
  2054.         move.l    Windowhd,a0
  2055.         lea    ZapText1,a1
  2056.         lea    EdPos,a2
  2057.         lea    ZapNo,a3
  2058.         moveq    #0,d0
  2059.         moveq    #0,d1
  2060.         move    #415,d2
  2061.         moveq    #71,d3
  2062.         CALLINT    AutoRequest
  2063.         movem.l    (sp)+,a0-a1
  2064.  
  2065.         tst.l    d0
  2066.         beq    Eg_Done
  2067.         move.b    #KCF_STRING+KCF_SHIFT+KCF_ALT,(a4,d7)
  2068.         moveq    #0,d3            ; Remove CTRL defs
  2069.         move.b    4(a1),d3
  2070.         lsl    #5,d3
  2071.         clr    (a0,d3)
  2072.         moveq    #0,d3
  2073.         move.b    5(a1),d3
  2074.         lsl    #5,d3
  2075.         clr    (a0,d3)
  2076.         moveq    #0,d3
  2077.         move.b    6(a1),d3
  2078.         lsl    #5,d3
  2079.         clr    (a0,d3)
  2080.         moveq    #0,d3
  2081.         move.b    7(a1),d3
  2082.         lsl    #5,d3
  2083.         clr    (a0,d3)
  2084.  
  2085. NoCheckNeed    move.b    (a4,d7),d5        ; Turn string back to
  2086.         andi.b    #KC_VANILLA,d5        ; normal keytype
  2087.         move    d7,d6
  2088.         lsl    #2,d6
  2089.         lea    KeyDefs,a2
  2090.  
  2091.         moveq    #0,d3
  2092.         move.b    (a1),d3
  2093.         lsl    #5,d3
  2094.         move.b    (a0,d3),3(a2,d6)
  2095.         clr    (a0,d3)
  2096.         cmpi.b    #KC_NOQUAL,d5
  2097.         beq.s    StrChkOver
  2098.  
  2099.         moveq    #0,d3
  2100.         move.b    1(a1),d3
  2101.         lsl    #5,d3
  2102.         move.b    (a0,d3),2(a2,d6)
  2103.         clr    (a0,d3)
  2104.         cmpi.b    #KCF_SHIFT,d5
  2105.         beq.s    StrChkOver
  2106.         cmpi.b    #KCF_ALT,d5
  2107.         beq.s    StrChkOver
  2108.         cmpi.b    #KCF_CONTROL,d5
  2109.         beq.s    StrChkOver
  2110.  
  2111.         moveq    #0,d3
  2112.         move.b    2(a1),d3
  2113.         lsl    #5,d3
  2114.         move.b    (a0,d3),1(a2,d6)
  2115.         clr    (a0,d3)
  2116.         moveq    #0,d3
  2117.         move.b    3(a1),d3
  2118.         lsl    #5,d3
  2119.         move.b    (a0,d3),(a2,d6)
  2120.         clr    (a0,d3)
  2121.  
  2122. StrChkOver    andi.b    #$ff-KCF_STRING,(a4,d7)
  2123.         bsr    SortStringNow
  2124.  
  2125.         cmpi.b    #KCF_SHIFT+KCF_ALT,d5
  2126.         bne    Eg_Done
  2127.  
  2128.         move.l    Windowhd,a0        ; What should we do
  2129.         lea    VanText,a1        ; about CTRL key?
  2130.         lea    VanPos,a2
  2131.         lea    VanNeg,a3
  2132.         moveq    #0,d0
  2133.         moveq    #0,d1
  2134.         move    #397,d2
  2135.         moveq    #62,d3
  2136.         CALLINT    AutoRequest
  2137.         tst.l    d0
  2138.         beq    Eg_Done
  2139.         move.b    #KC_VANILLA,(a4,d7)
  2140.         bra    Eg_Done
  2141.  
  2142. EditString    move.b    (a4,d7),d1        ; Current keytype
  2143.         andi.b    #KC_VANILLA,d1
  2144.         move.b    MyDefQual,d2        ; Qualifier
  2145.         bsr.s    StringExpand
  2146.  
  2147.         move.l    DeadStore,a5        ; Now edit string
  2148.         move    d7,d2
  2149.         move.b    (a4,d2),d3
  2150.         andi.b    #KC_VANILLA,d3
  2151.         moveq    #0,d1
  2152.         move.b    (a5,d3),d1        ; Get index
  2153.         lsr    #1,d1
  2154.         lea    StringList,a0
  2155.         lsl    #3,d2
  2156.         add    d2,d1
  2157.         moveq    #0,d3
  2158.         move.b    (a0,d1),d3
  2159.         lsl    #5,d3
  2160.         lea    StringArea,a0
  2161.         lea    StringBuf,a1
  2162.         moveq    #0,d0
  2163. EdStrLoop    move.b    (a1,d0),(a0,d3)        ; Copy string entered
  2164.         beq    Eg_Done            ; to main buffers
  2165.         addq    #1,d3
  2166.         addq    #1,d0
  2167.         cmpi.b    #32,d0
  2168.         bne    EdStrLoop
  2169.  
  2170. StringExpand    lea    StringList,a0        ; d1=keytype of key,
  2171.         move    d7,d6            ; d2=keytype to be added
  2172.         lsl    #3,d6            ; d7=keyno, a4=keytypes
  2173.  
  2174.         cmpi.b    #KC_NOQUAL,d1
  2175.         beq    Str___
  2176.         cmpi.b    #KCF_SHIFT,d1
  2177.         beq    StrS__
  2178.         cmpi.b    #KCF_ALT,d1
  2179.         beq    Str_A_
  2180.         cmpi.b    #KCF_CONTROL,d1
  2181.         beq    Str__C
  2182.         cmpi.b    #KCF_SHIFT+KCF_ALT,d1
  2183.         beq    StrSA_
  2184.         cmpi.b    #KCF_SHIFT+KCF_CONTROL,d1
  2185.         beq.s    StrS_C
  2186.         cmpi.b    #KCF_ALT+KCF_CONTROL,d1
  2187.         beq.s    Str_AC
  2188.         rts                ; If KC_VANILLA then return
  2189.  
  2190. Str_AC        andi.b    #2,d2
  2191.         bne.s    .1
  2192.         rts
  2193. .1        move.b    3(a0,d6),6(a0,d6)
  2194.         move.b    2(a0,d6),4(a0,d6)
  2195.         move.b    1(a0,d6),2(a0,d6)
  2196.         lea    1(a0,d6),a1
  2197.         bsr    GetStr
  2198.         lea    3(a0,d6),a1
  2199.         bsr    GetStr
  2200.         lea    5(a0,d6),a1
  2201.         bsr    GetStr
  2202.         lea    7(a0,d6),a1
  2203.         bsr    GetStr
  2204.         move.b    #KCF_STRING+KC_VANILLA,(a4,d7)
  2205.         rts
  2206.  
  2207. StrS_C        andi.b    #4,d2
  2208.         bne.s    .1
  2209.         rts
  2210. .1        move.b    2(a0,d6),4(a0,d6)
  2211.         move.b    3(a0,d6),5(a0,d6)
  2212.         lea    2(a0,d6),a1
  2213.         bsr    GetStr
  2214.         lea    3(a0,d6),a1
  2215.         bsr    GetStr
  2216.         lea    6(a0,d6),a1
  2217.         bsr    GetStr
  2218.         lea    7(a0,d6),a1
  2219.         bsr    GetStr
  2220.         move.b    #KCF_STRING+KC_VANILLA,(a4,d7)
  2221.         rts
  2222.  
  2223. StrSA_        andi.b    #1,d2
  2224.         bne.s    .1
  2225.         rts
  2226. .1        lea    4(a0,d6),a1
  2227.         bsr    GetStr
  2228.         lea    5(a0,d6),a1
  2229.         bsr    GetStr
  2230.         lea    6(a0,d6),a1
  2231.         bsr    GetStr
  2232.         lea    7(a0,d6),a1
  2233.         bsr    GetStr
  2234.         move.b    #KCF_STRING+KC_VANILLA,(a4,d7)
  2235.         rts
  2236.  
  2237. Str__C        cmpi.b    #2,d2
  2238.         beq.s    .1
  2239.         cmpi.b    #4,d2
  2240.         beq.s    .2
  2241.         cmpi.b    #3,d2
  2242.         beq.s    .1
  2243.         cmpi.b    #5,d2
  2244.         beq.s    .2
  2245.         cmpi.b    #6,d2
  2246.         beq.s    .3
  2247.         cmpi.b    #7,d2
  2248.         beq.s    .3
  2249.         rts
  2250. .3        move.b    1(a0,d6),4(a0,d6)
  2251.         lea    1(a0,d6),a1
  2252.         bsr    GetStr
  2253.         lea    2(a0,d6),a1
  2254.         bsr    GetStr
  2255.         lea    3(a0,d6),a1
  2256.         bsr    GetStr
  2257.         lea    5(a0,d6),a1
  2258.         bsr    GetStr
  2259.         lea    6(a0,d6),a1
  2260.         bsr    GetStr
  2261.         lea    7(a0,d6),a1
  2262.         bsr    GetStr
  2263.         move.b    #KCF_STRING+KC_VANILLA,(a4,d7)
  2264.         rts
  2265. .2        move.b    1(a0,d6),2(a0,d6)
  2266.         lea    1(a0,d6),a1
  2267.         bsr    GetStr
  2268.         lea    3(a0,d6),a1
  2269.         bsr    GetStr
  2270.         move.b    #KCF_STRING+KCF_ALT+KCF_CONTROL,(a4,d7)
  2271.         rts
  2272. .1        move.b    1(a0,d6),2(a0,d6)
  2273.         lea    1(a0,d6),a1
  2274.         bsr    GetStr
  2275.         lea    3(a0,d6),a1
  2276.         bsr    GetStr
  2277.         move.b    #KCF_STRING+KCF_SHIFT+KCF_CONTROL,(a4,d7)
  2278.         rts
  2279.  
  2280. Str_A_        cmpi.b    #1,d2
  2281.         beq.s    .1
  2282.         cmpi.b    #2,d2
  2283.         beq.s    .2
  2284.         cmpi.b    #3,d2
  2285.         beq.s    .3
  2286.         cmpi.b    #5,d2
  2287.         beq.s    .1
  2288.         cmpi.b    #6,d2
  2289.         beq.s    .2
  2290.         cmpi.b    #7,d2
  2291.         beq.s    .3
  2292.         rts
  2293. .3        move.b    1(a0,d6),2(a0,d6)
  2294.         lea    1(a0,d6),a1
  2295.         bsr    GetStr
  2296.         lea    3(a0,d6),a1
  2297.         bsr    GetStr
  2298.         lea    4(a0,d6),a1
  2299.         bsr    GetStr
  2300.         lea    5(a0,d6),a1
  2301.         bsr    GetStr
  2302.         lea    6(a0,d6),a1
  2303.         bsr    GetStr
  2304.         lea    7(a0,d6),a1
  2305.         bsr    GetStr
  2306.         move.b    #KCF_STRING+KC_VANILLA,(a4,d7)
  2307.         rts
  2308. .2        move.b    1(a0,d6),2(a0,d6)
  2309.         lea    1(a0,d6),a1
  2310.         bsr    GetStr
  2311.         lea    3(a0,d6),a1
  2312.         bsr    GetStr
  2313.         move.b    #KCF_STRING+KCF_SHIFT+KCF_ALT,(a4,d7)
  2314.         rts
  2315. .1        lea    2(a0,d6),a1
  2316.         bsr    GetStr
  2317.         lea    3(a0,d6),a1
  2318.         bsr    GetStr
  2319.         move.b    #KCF_STRING+KCF_CONTROL+KCF_ALT,(a4,d7)
  2320.         rts
  2321.  
  2322. StrS__        cmpi.b    #1,d2
  2323.         beq.s    .1
  2324.         cmpi.b    #4,d2
  2325.         beq.s    .2
  2326.         cmpi.b    #3,d2
  2327.         beq.s    .1
  2328.         cmpi.b    #5,d2
  2329.         beq.s    .3
  2330.         cmpi.b    #6,d2
  2331.         beq.s    .2
  2332.         cmpi.b    #7,d2
  2333.         beq.s    .3
  2334.         rts
  2335. .3        lea    2(a0,d6),a1
  2336.         bsr    GetStr
  2337.         lea    3(a0,d6),a1
  2338.         bsr    GetStr
  2339.         lea    4(a0,d6),a1
  2340.         bsr    GetStr
  2341.         lea    5(a0,d6),a1
  2342.         bsr    GetStr
  2343.         lea    6(a0,d6),a1
  2344.         bsr    GetStr
  2345.         lea    7(a0,d6),a1
  2346.         bsr    GetStr
  2347.         move.b    #KCF_STRING+KC_VANILLA,(a4,d7)
  2348.         rts
  2349. .2        lea    2(a0,d6),a1
  2350.         bsr    GetStr
  2351.         lea    3(a0,d6),a1
  2352.         bsr    GetStr
  2353.         move.b    #KCF_STRING+KCF_SHIFT+KCF_ALT,(a4,d7)
  2354.         rts
  2355. .1        lea    2(a0,d6),a1
  2356.         bsr    GetStr
  2357.         lea    3(a0,d6),a1
  2358.         bsr    GetStr
  2359.         move.b    #KCF_STRING+KCF_SHIFT+KCF_CONTROL,(a4,d7)
  2360.         rts
  2361.  
  2362. Str___        cmpi.b    #1,d2
  2363.         beq    .1
  2364.         cmpi.b    #2,d2
  2365.         beq    .2
  2366.         cmpi.b    #4,d2
  2367.         beq    .3
  2368.         cmpi.b    #3,d2
  2369.         beq    .4
  2370.         cmpi.b    #5,d2
  2371.         beq.s    .5
  2372.         cmpi.b    #6,d2
  2373.         beq.s    .6
  2374.         cmpi.b    #7,d2
  2375.         beq.s    .7
  2376.         rts
  2377. .7        lea    1(a0,d6),a1
  2378.         bsr    GetStr
  2379.         lea    2(a0,d6),a1
  2380.         bsr    GetStr
  2381.         lea    3(a0,d6),a1
  2382.         bsr    GetStr
  2383.         lea    4(a0,d6),a1
  2384.         bsr    GetStr
  2385.         lea    5(a0,d6),a1
  2386.         bsr    GetStr
  2387.         lea    6(a0,d6),a1
  2388.         bsr    GetStr
  2389.         lea    7(a0,d6),a1
  2390.         bsr    GetStr
  2391.         move.b    #KCF_STRING+KC_VANILLA,(a4,d7)
  2392.         rts
  2393. .6        lea    1(a0,d6),a1
  2394.         bsr.s    GetStr
  2395.         lea    2(a0,d6),a1
  2396.         bsr.s    GetStr
  2397.         lea    3(a0,d6),a1
  2398.         bsr.s    GetStr
  2399.         move.b    #KCF_STRING+KCF_SHIFT+KCF_ALT,(a4,d7)
  2400.         rts
  2401. .5        lea    1(a0,d6),a1
  2402.         bsr.s    GetStr
  2403.         lea    2(a0,d6),a1
  2404.         bsr.s    GetStr
  2405.         lea    3(a0,d6),a1
  2406.         bsr.s    GetStr
  2407.         move.b    #KCF_STRING+KCF_CONTROL+KCF_ALT,(a4,d7)
  2408.         rts
  2409. .4        lea    1(a0,d6),a1
  2410.         bsr.s    GetStr
  2411.         lea    2(a0,d6),a1
  2412.         bsr.s    GetStr
  2413.         lea    3(a0,d6),a1
  2414.         bsr.s    GetStr
  2415.         move.b    #KCF_STRING+KCF_CONTROL+KCF_SHIFT,(a4,d7)
  2416.         rts
  2417. .3        lea    1(a0,d6),a1
  2418.         bsr.s    GetStr
  2419.         move.b    #KCF_STRING+KCF_ALT,(a4,d7)
  2420.         rts
  2421. .2        lea    1(a0,d6),a1
  2422.         bsr.s    GetStr
  2423.         move.b    #KCF_STRING+KCF_SHIFT,(a4,d7)
  2424.         rts
  2425. .1        lea    1(a0,d6),a1
  2426.         bsr.s    GetStr
  2427.         move.b    #KCF_STRING+KCF_CONTROL,(a4,d7)
  2428.         rts
  2429.  
  2430. GetStr        bsr.s    PickUpNew
  2431.         moveq    #0,d4
  2432.         move.b    (a0,d6),d4
  2433.         lsl    #5,d4
  2434.         move    StringNow,d5
  2435.         lsl    #5,d5
  2436.         lea    StringArea,a3
  2437.         move.l    (a3,d4),(a3,d5)
  2438.         move.l    4(a3,d4),4(a3,d5)
  2439.         move.l    8(a3,d4),8(a3,d5)
  2440.         move.l    12(a3,d4),12(a3,d5)
  2441.         move.l    16(a3,d4),16(a3,d5)
  2442.         move.l    20(a3,d4),20(a3,d5)
  2443.         move.l    24(a3,d4),24(a3,d5)
  2444.         move.l    28(a3,d4),28(a3,d5)
  2445.         rts
  2446.  
  2447. PickUpNew    bsr    SortStringNow
  2448.         cmpi    #$100,StringNow
  2449.         beq.s    FullUp
  2450.         move.b    StringNow+1,(a1)
  2451.         rts
  2452.  
  2453. FullUp        move.b    (a0,d6),(a1)
  2454.         rts
  2455.  
  2456. NormToStr    move.b    (a4,d7),d1        ; Convert normal key
  2457.         andi.b    #KC_VANILLA,d1        ; to string definition
  2458.         lea    StringArea,a0
  2459.         lea    StringList,a1
  2460.         lea    KeyDefs,a2
  2461.         move    d7,d6
  2462.         lsl    #2,d6
  2463.         move    d6,d5
  2464.         lsl    #1,d5
  2465.  
  2466.         cmpi.b    #KCF_SHIFT,d1
  2467.         beq.s    Norm1ToStr
  2468.         cmpi.b    #KCF_ALT,d1
  2469.         beq.s    Norm1ToStr
  2470.         cmpi.b    #KCF_CONTROL,d1
  2471.         beq.s    Norm1ToStr
  2472.         cmpi.b    #KCF_SHIFT+KCF_ALT,d1
  2473.         beq.s    Norm2ToStr
  2474.         cmpi.b    #KCF_SHIFT+KCF_CONTROL,d1
  2475.         beq.s    Norm2ToStr
  2476.         cmpi.b    #KCF_CONTROL+KCF_ALT,d1
  2477.         beq.s    Norm2ToStr
  2478.         cmpi.b    #KC_VANILLA,d1
  2479.         bne.s    Norm0ToStr
  2480.         move.b    #KCF_SHIFT+KCF_ALT,(a4,d7)
  2481.         bra.s    Norm2ToStr
  2482.  
  2483. Norm0ToStr    bsr    SortStringNow
  2484.         move    StringNow,d4
  2485.         move.b    d4,(a1,d5)
  2486.         lsl    #5,d4
  2487.         move.b    3(a2,d6),(a0,d4)    ; Turn byte definition
  2488.         andi.b    #$ff-KCF_NOP,(a4,d7)
  2489.         ori.b    #KCF_STRING,(a4,d7)    ; into a string
  2490.         bra    EditString
  2491.  
  2492. Norm1ToStr    bsr    SortStringNow
  2493.         move    StringNow,d4
  2494.         move.b    d4,1(a1,d5)
  2495.         lsl    #5,d4
  2496.         move.b    2(a2,d6),(a0,d4)
  2497.         bra    Norm0ToStr
  2498.  
  2499. Norm2ToStr    bsr    SortStringNow
  2500.         move    StringNow,d4
  2501.         move.b    d4,3(a1,d5)
  2502.         lsl    #5,d4
  2503.         move.b    (a2,d6),(a0,d4)
  2504.         bsr    SortStringNow
  2505.         move    StringNow,d4
  2506.         move.b    d4,2(a1,d5)
  2507.         lsl    #5,d4
  2508.         move.b    1(a2,d6),(a0,d4)
  2509.         bra    Norm1ToStr
  2510.  
  2511. OnCaps        subq    #1,d0
  2512.         moveq    #0,d1
  2513.         lea    MapToKeys,a0
  2514.         move.b    (a0,d0),d1
  2515.         lea    CapsTab,a1
  2516.         eori.b    #1,(a1,d1)        ; Toggle value in table
  2517.         bra    CheckMessage
  2518.  
  2519. OnRept        subq    #1,d0
  2520.         moveq    #0,d1
  2521.         lea    MapToKeys,a0
  2522.         move.b    (a0,d0),d1
  2523.         lea    ReptTab,a1
  2524.         eori.b    #1,(a1,d1)
  2525.         bra    CheckMessage
  2526.  
  2527. AnalyseKM    bsr    ClearOut
  2528.  
  2529.         clr.b    ModifyIndex        ; Reset counter
  2530.         move.l    MySegment,d0
  2531.         lsl.l    #2,d0
  2532.         addi.l    #18,d0
  2533.         move.l    d0,a2
  2534.         move.l    km_LoCapsable(a2),a0    ; First extract caps
  2535.         lea    CapsTab,a1
  2536.         moveq    #0,d1
  2537.         moveq    #0,d3
  2538. AnlCapLp    move.b    (a0,d3),d0
  2539.         bsr    Anly_Bit
  2540.         addq    #1,d3
  2541.         cmpi    #8,d3
  2542.         bne    AnlCapLp
  2543.         move.l    km_HiCapsable(a2),a0    ; Now high caps
  2544.         moveq    #0,d3
  2545. AnlCapLpHi    move.b    (a0,d3),d0
  2546.         bsr    Anly_Bit
  2547.         addq    #1,d3
  2548.         cmpi    #4,d3
  2549.         bne    AnlCapLpHi
  2550.  
  2551.         move.l    km_LoRepeatable(a2),a0    ; Now extract repeaters
  2552.         lea    ReptTab,a1
  2553.         moveq    #0,d1
  2554.         moveq    #0,d3
  2555. AnlRepLp    move.b    (a0,d3),d0
  2556.         bsr    Anly_Bit
  2557.         addq    #1,d3
  2558.         cmpi    #8,d3
  2559.         bne    AnlRepLp
  2560.         move.l    km_HiRepeatable(a2),a0
  2561.         moveq    #0,d3
  2562. AnlRepLpHi    move.b    (a0,d3),d0
  2563.         bsr    Anly_Bit
  2564.         addq    #1,d3
  2565.         cmpi    #4,d3
  2566.         bne    AnlRepLpHi
  2567.  
  2568.         move.l    km_LoKeyMapTypes(a2),a0    ; Get key types
  2569.         lea    KeyTypes,a1
  2570.         moveq    #$3e,d0
  2571. KTypeLp        move    (a0,d0),(a1,d0)
  2572.         tst    d0
  2573.         beq.s    KTypeLoOver
  2574.         subq    #2,d0
  2575.         bra    KTypeLp
  2576.  
  2577. KTypeLoOver    move.l    km_HiKeyMapTypes(a2),a0
  2578.         moveq    #$1e,d0
  2579. KTypeHi        move    (a0,d0),$40(a1,d0)
  2580.         tst    d0
  2581.         beq.s    KTypeOver
  2582.         subq    #2,d0
  2583.         bra    KTypeHi
  2584.  
  2585. KTypeOver    move.l    km_LoKeyMap(a2),a0    ; Now for the actual keys!
  2586.         lea    KeyDefs,a1
  2587.         move    #252,d0
  2588. ActKeyLp    move.l    (a0,d0),(a1,d0)
  2589.         tst    d0
  2590.         beq.s    ActKeyLoOvr
  2591.         subq    #4,d0
  2592.         bra    ActKeyLp
  2593.  
  2594. ActKeyLoOvr    move.l    km_HiKeyMap(a2),a0
  2595.         adda.l    #$100,a1
  2596.         move    #$7c,d0
  2597. ActKeyHi    move.l    (a0,d0),(a1,d0)
  2598.         tst    d0
  2599.         beq.s    ActKeyOvr
  2600.         subq    #4,d0
  2601.         bra    ActKeyHi
  2602.  
  2603. ActKeyOvr    lea    KeyTypes,a0        ; Get deadkeys
  2604.         lea    KeyDefs,a1
  2605.         lea    DeadTab,a3
  2606.         moveq    #0,d0
  2607. DeadLoop    move.b    (a0,d0),d1
  2608.         andi.b    #KCF_DEAD,d1
  2609.         beq.s    NotDead
  2610.  
  2611.         move    d0,d2            ; Get dead key descriptor
  2612.         lsl    #2,d2
  2613.         move.l    (a1,d2),a2
  2614.         lsl    #2,d2
  2615.         movea.l    a2,a6
  2616.         moveq    #0,d7
  2617. DeadLoop2    move.b    (a2),(a3,d2)
  2618.         move.b    1(a2),1(a3,d2)
  2619.         bsr    IndexSub
  2620.         adda.l    #2,a2
  2621.         addq    #2,d2
  2622.         addq    #2,d7
  2623.         cmpi    #16,d7
  2624.         bne    DeadLoop2
  2625.  
  2626. NotDead        addq    #1,d0
  2627.         cmpi    #96,d0
  2628.         bne    DeadLoop
  2629.  
  2630.         lea    DeadTab,a4        ; Check deads
  2631.         lea    KeyTypes,a0
  2632.         moveq    #0,d0
  2633.         moveq    #0,d4
  2634. SortDeadLp    move.b    (a0,d0),d1
  2635.         andi.b    #KCF_DEAD,d1
  2636.         cmpi.b    #KCF_DEAD,d1
  2637.         bne.s    ContDChk
  2638.         bsr    DeadToVan
  2639. ContDChk    addq    #1,d0
  2640.         addi    #16,d4
  2641.         cmpi.b    #96,d0
  2642.         bne    SortDeadLp
  2643.  
  2644.         clr.l    UseDead
  2645.         clr.l    UseDead+4
  2646.         clr.l    UseDead+8
  2647.         clr.l    UseDead+12
  2648.  
  2649.         lea    DeadTab,a0        ; Count no. of deadkeys
  2650.         lea    UseDead,a1        ; and modkeys
  2651.         lea    ModIndex,a2
  2652.         moveq    #0,d0
  2653.         moveq    #0,d1
  2654. UseDeadLp    move.b    (a0,d0),d1        ; Get key data
  2655.         cmpi.b    #DPF_DEAD,d1        ; Is it a deadkey?
  2656.         beq.s    Dead_D            ; Yes, so branch
  2657.         cmpi.b    #DPF_MOD,d1        ; Is it modifiable?
  2658.         beq.s    Dead_M
  2659.  
  2660. NotCounted    addq    #2,d0
  2661.         cmpi    #768*2,d0        ; Have we finished?
  2662.         bne    UseDeadLp
  2663.         bra    ExString
  2664.  
  2665. Dead_D        move.b    1(a0,d0),d1        ; Get significant byte
  2666.         andi.b    #$0f,d1            ; Avoid double-deadkeys
  2667.         move.b    #1,(a1,d1)        ; Mark as in use
  2668.         bra    NotCounted
  2669.  
  2670. Dead_M        move.b    1(a0,d0),d1        ; Mark modifiable as
  2671.         move.b    #1,(a2,d1)        ; in use
  2672.         bra    NotCounted
  2673.  
  2674. Anly_Bit    moveq    #0,d2            ; Extract nos. from the
  2675. Anly_BLp    btst    #0,d0            ; bit table
  2676.         beq.s    BitLow
  2677.         move.b    #1,(a1,d1)
  2678.         bra.s    EBLp
  2679. BitLow        clr.b    (a1,d1)
  2680. EBLp        lsr.b    d0
  2681.         addi    #1,d2
  2682.         addi    #1,d1
  2683.         cmpi    #8,d2
  2684.         bne    Anly_BLp
  2685.         rts
  2686.  
  2687. IndexSub    cmpi.b    #DPF_MOD,(a2)        ; Subroutine to extract data
  2688.         bne.s    NotIndex        ; for keys of type DPF_MOD
  2689.  
  2690.         movea.l    a6,a4            ; Only 256 DPF_MODs allowed!
  2691.         moveq    #0,d3
  2692.         move.b    1(a2),d3
  2693.         add.l    d3,a4
  2694.         move.b    ModifyIndex,d3
  2695.         mulu    #16,d3
  2696.         moveq    #0,d4
  2697.         lea    DeadIndex,a5
  2698. IndexLoop    move.b    (a4,d4),(a5,d3)
  2699.         move.b    1(a4,d4),1(a5,d3)
  2700.         cmpi    #14,d4
  2701.         beq.s    IndexOver
  2702.         addq    #2,d3
  2703.         addq    #2,d4
  2704.         bra    IndexLoop
  2705.  
  2706. IndexOver    move.b    ModifyIndex,1(a3,d2)
  2707.         addq.b    #1,ModifyIndex
  2708. NotIndex    rts
  2709.  
  2710. ExString    move.l    MySegment,d0        ; Get strings
  2711.         lsl.l    #2,d0
  2712.         addi.l    #18,d0
  2713.         move.l    d0,a0
  2714.         move.l    km_LoKeyMap(a0),a0
  2715.         lea    KeyTypes,a1
  2716.         moveq    #0,d0
  2717.         moveq    #0,d3
  2718. StrLoop        move.b    (a1,d0),d1
  2719.         andi.b    #KCF_STRING,d1
  2720.         beq    NotStr
  2721.  
  2722.         move.b    (a1,d0),d1
  2723.         andi.b    #KC_VANILLA,d1
  2724.         bne.s    .1
  2725.         clr    d2
  2726.         bra.s    .index
  2727. .1        cmpi.b    #KC_VANILLA,d1
  2728.         bne.s    .2
  2729.         move    #14,d2
  2730.         bra.s    .index
  2731. .2        cmpi.b    #KCF_SHIFT,d1
  2732.         bne.s    .3
  2733.         move    #2,d2
  2734.         bra.s    .index
  2735. .3        cmpi.b    #KCF_ALT,d1
  2736.         bne.s    .4
  2737.         move    #2,d2
  2738.         bra.s    .index
  2739. .4        cmpi.b    #KCF_CONTROL,d1
  2740.         bne.s    .5
  2741.         move    #2,d2
  2742.         bra.s    .index
  2743. .5        move    #6,d2
  2744.  
  2745. .index        move.l    (a0,d3),a2        ; Get string descriptor
  2746.         lea    StringList,a3
  2747.         lea    StringArea,a4
  2748.  
  2749. GetStrLoop    lsr    #1,d2
  2750.         move    StringNow,d5        ; Show where string is
  2751.         lsl    #3,d0
  2752.         add    d0,d2
  2753.         move.b    d5,(a3,d2)
  2754.         sub    d0,d2
  2755.         lsr    #3,d0
  2756.         lsl    #1,d2
  2757.         lsl    #5,d5            ; d5 = Pos in StringArea
  2758.         move.b    (a2,d2),d6        ; d6 = String length
  2759.         tst.b    d6
  2760.         beq.s    FinGotStr
  2761.         cmpi.b    #31,d6
  2762.         bcs.s    .okay
  2763.         move.b    #31,d6
  2764.         moveq    #0,d7
  2765. .okay        move.b    1(a2,d2),d7        ; Get string location
  2766.         move    d5,-(sp)        ; Save d5
  2767. GetString    move.b    (a2,d7),(a4,d5)        ; Get string from keymap
  2768.         cmpi.b    #1,d6
  2769.         beq.s    GotString
  2770.  
  2771.         addq    #1,d7
  2772.         addq    #1,d5
  2773.         subq    #1,d6
  2774.         bra    GetString
  2775.  
  2776. GotString    clr.b    1(a4,d5)
  2777.         bsr.s    SortStringNow
  2778.         move    (sp)+,d5        ; Restore d5
  2779. FinGotStr    tst    d2
  2780.         beq.s    NotStr
  2781.  
  2782.         subq    #2,d2
  2783.         bra    GetStrLoop
  2784.  
  2785. NotStr        addq    #1,d0
  2786.         addq    #4,d3
  2787.         cmpi.b    #$60,d0
  2788.         beq.s    EndStr
  2789.         cmpi.b    #$40,d0
  2790.         bne    StrLoop
  2791.         move    d0,-(sp)
  2792.         move.l    MySegment,d0
  2793.         lsl.l    #2,d0
  2794.         addi.l    #18,d0
  2795.         move.l    d0,a0
  2796.         move    (sp)+,d0
  2797.         move.l    km_HiKeyMap(a0),a0    ; Switch to high keymap
  2798.         moveq    #0,d3
  2799.         bra    StrLoop
  2800.  
  2801. EndStr        move.l    MySegment,d1        ; Unload keymap
  2802.         CALLDOS    UnLoadSeg        ; and finish routine
  2803.         rts
  2804.  
  2805. SortStringNow    move.l    d7,-(sp)        ; Finds a free string
  2806.         lea    StringArea,a5        ; a5 scratch
  2807.         moveq    #0,d7
  2808. SortLoop    tst.b    (a5,d7)
  2809.         beq.s    SoGotOne
  2810.         addi    #32,d7
  2811.         cmpi    #8192,d7
  2812.         bne    SortLoop
  2813.         move    #$100,StringNow
  2814.         bra.s    ResSort
  2815. SoGotOne    lsr    #5,d7
  2816.         clr.b    StringNow
  2817.         move.b    d7,StringNow+1
  2818. ResSort        move.l    (sp)+,d7
  2819.         rts
  2820.  
  2821. QuitProper    move.l    Windowhd,a0        ; Requester to check if
  2822.         lea    ReqText,a1        ; you really want to quit
  2823.         lea    LReqText,a2
  2824.         lea    RReqText,a3
  2825.         moveq    #0,d0
  2826.         moveq    #0,d1
  2827.         move    #255,d2
  2828.         moveq    #53,d3
  2829.         CALLINT    AutoRequest
  2830.  
  2831.         tst.l    d0
  2832.         beq    CheckMessage
  2833.         moveq    #RETURN_OK,d5
  2834.         move.l    Windowhd,a0        ; Tidy up and exit
  2835.         CALLINT    ClearMenuStrip
  2836. _NoMenus    move.l    Windowhd,a0
  2837.         CALLINT    CloseWindow
  2838. _NoRun        move.l    _GfxBase,a1
  2839.         CALLEXEC CloseLibrary
  2840. _NoGraphics    move.l    _DOSBase,a1
  2841.         CALLEXEC CloseLibrary
  2842. _NoArp        move.l    _IntuitionBase,a1
  2843.         CALLEXEC CloseLibrary
  2844.  
  2845.         movea.l    AslFReq,a0
  2846.         cmpa.l    #0,a0
  2847.         beq.s    AslError1
  2848.         movea.l    _AslBase,a6
  2849.         CALLSYS    FreeFileRequest
  2850. AslError1    move.l    _AslBase,a1
  2851.         cmpa.l    #0,a1
  2852.         beq.s    AslError2
  2853.         CALLEXEC CloseLibrary
  2854. AslError2    rts                ; Au revoir, mes amis!!
  2855.  
  2856. NoMenus        moveq    #RETURN_FAIL,d5        ; DOS error codes
  2857.         bra    _NoMenus
  2858. NoRun    moveq    #RETURN_FAIL,d5
  2859.         bra    _NoRun
  2860. NoGraphics    moveq    #RETURN_FAIL,d5
  2861.         bra    _NoGraphics
  2862. NoArp        moveq    #RETURN_FAIL,d5
  2863.         bra    _NoArp
  2864. NoIntuition    moveq    #RETURN_FAIL,d5
  2865.         rts
  2866.  
  2867. NoArpLib    suba.l    a0,a0
  2868.         lea    NoArpErr,a1
  2869.         suba.l    a2,a2
  2870.         lea    AbortText,a3
  2871.         moveq    #0,d0
  2872.         moveq    #0,d1
  2873.         move    #312,d2
  2874.         moveq    #83,d3
  2875.         CALLINT    AutoRequest
  2876.         bra    NoArp
  2877.  
  2878. WindSetUp    move.l    d0,a0
  2879.         move.l    wd_UserPort(a0),UserPort
  2880.         move.l    wd_RPort(a0),RPort
  2881.         rts
  2882.  
  2883. ClearOut    lea    CapsTab,a0
  2884.         moveq    #96,d0
  2885.         bsr.s    ClearIt
  2886.         lea    ReptTab,a0
  2887.         moveq    #96,d0
  2888.         bsr.s    ClearIt
  2889.         lea    KeyTypes,a0
  2890.         bsr.s    ClearIt2
  2891.         lea    UseDead,a0
  2892.         moveq    #16,d0
  2893.         bsr.s    ClearIt
  2894.         lea    ModIndex,a0
  2895.         move    #256,d0
  2896.         bsr.s    ClearIt
  2897.         lea    StringList,a0
  2898.         move    #768,d0
  2899.         bsr.s    ClearIt
  2900.         lea    DeadTab,a0
  2901.         move    #768*2,d0
  2902.         bsr.s    ClearIt
  2903.         lea    KeyDefs,a0
  2904.         move    #96*4,d0
  2905.         bsr.s    ClearIt
  2906.         lea    StringArea,a0
  2907.         move    #8192,d0
  2908.         bsr.s    ClearIt
  2909.         clr.b    DeadNo
  2910.         clr.b    ModNo
  2911.         bra    SortStringNow
  2912.  
  2913. ClearIt        subq    #1,d0
  2914. ClearLoop    clr.b    (a0,d0)
  2915.         tst    d0
  2916.         beq.s    ClearStop
  2917.         subq    #1,d0
  2918.         bra    ClearLoop
  2919. ClearStop    rts
  2920.  
  2921. ClearIt2    moveq    #95,d0
  2922. .loop        move.b    #KCF_NOP,(a0,d0)
  2923.         tst    d0
  2924.         beq.s    .stop
  2925.         subq    #1,d0
  2926.         bra    .loop
  2927. .stop        rts
  2928.  
  2929. ARP_Extract    lea    PathName,a0        ; Extract dir...
  2930.         movea.l    xFile,a1
  2931.         movea.l    xDir,a2
  2932. ARP_xLp        move.b    (a2)+,(a0)+
  2933.         bne    ARP_xLp
  2934.         lea    PathName,a0
  2935.         bsr    _TackOn
  2936.         lea    PathName,a0
  2937.         moveq    #0,d5
  2938. ARP_xLp2    tst.b    (a0,d5)
  2939.         beq.s    ARP_xLp3
  2940.         addq    #1,d5
  2941.         cmpi.b    #72,d5
  2942.         bne    ARP_xLp2
  2943. ARP_xLp3    rts
  2944.  
  2945. LoadKeyMap    moveq    #0,d6            ; Needs PathLength in d5,
  2946.         move.l    #PathName,d1        ; returns d6=0 ok
  2947.         CALLDOS    LoadSeg
  2948.         move.l    d0,MySegment
  2949.         beq.s    DskError        ; Problem so exit...
  2950.  
  2951.         bsr    TestKeyMap        ; Check integrity
  2952.         cmpi    #2,d6
  2953.         bne.s    AddNames
  2954.         rts
  2955.  
  2956. AddNames    lea    ModWindText-1,a3
  2957. AddName        move.b    (a2,d5),d2
  2958.         tst.b    d2
  2959.         bne.s    NoStopMod
  2960.         bra.s    StopMod
  2961.  
  2962. NoStopMod    move.b    d2,1(a3,d1)
  2963.         addq    #1,d5
  2964.         addq    #1,d1
  2965.         cmpi    #8,d1
  2966.         bne    AddName
  2967.  
  2968. StopMod        move.b    #"»",1(a3,d1)
  2969.         clr.b    2(a3,d1)
  2970.         tst.l    Windowhd
  2971.         beq.s    StopModF
  2972.         move.l    Windowhd,a0
  2973.         move.l    #%0000000001000000,d0
  2974.         CALLINT    OnMenu
  2975.         move.l    Windowhd,a0
  2976.         lea    MainWindowText,a1
  2977.         move.l    #-1,a2
  2978.         CALLSYS    SetWindowTitles
  2979. StopModF    rts
  2980.  
  2981. DskError    cmpi.b    #1,ErrResponse
  2982.         beq.s    WBDskErr
  2983.         cmpi.b    #2,ErrResponse
  2984.         beq.s    EndDskErr
  2985.         tst.l    ReturnMsg
  2986.         bne.s    WBDskErr
  2987.  
  2988.         CALLDOS    Output            ; Write out error message
  2989.         move.l    d0,d4
  2990.         move.l    d4,d1
  2991.         move.l    #FileErr1,d2
  2992.         move.l    #FileErr1End-FileErr1,d3
  2993.         CALLSYS    Write
  2994.         move.l    d4,d1
  2995.         move.l    #PathName,d2
  2996.         moveq    #0,d3
  2997.         move    d5,d3
  2998.         CALLSYS    Write
  2999.         move.l    d4,d1
  3000.         move.l    #FileErr2,d2
  3001.         move.l    #FileErr2End-FileErr2,d3
  3002.         CALLSYS    Write
  3003.         bra.s    EndDskErr
  3004.  
  3005. WBDskErr    suba.l    a0,a0
  3006.         lea    WBNoFile,a1        ; 'No File' requester
  3007.         suba.l    a2,a2
  3008.         lea    AbortText,a3
  3009.         moveq    #0,d0
  3010.         moveq    #0,d1
  3011.         move    #350,d2
  3012.         moveq    #62,d3
  3013.         CALLINT    AutoRequest
  3014. EndDskErr    moveq    #1,d6
  3015.         rts
  3016.  
  3017. TestKeyMap    move.l    d5,d7
  3018.         moveq    #0,d3
  3019.         lsl.l    #2,d0
  3020.         move.l    d0,a0
  3021.         adda.l    #14,a0
  3022.         move.l    (a0),a0
  3023.  
  3024.         subq    #1,d5            ; Get keymap name
  3025.         moveq    #0,d1
  3026.         lea    PathName,a2
  3027. GetKeyName    move.b    (a2,d5),d0
  3028.         cmpi.b    #"/",d0
  3029.         beq.s    Got1Name
  3030.         cmpi.b    #":",d0
  3031.         beq.s    Got1Name
  3032.         tst    d5
  3033.         beq.s    GotName
  3034.         subq    #1,d5
  3035.         bra    GetKeyName
  3036.  
  3037. Got1Name    addq    #1,d5
  3038. GotName        move    d5,-(sp)        ; Save d5
  3039. GotNameLp    move.b    (a2,d5),d2
  3040.         cmp.b    (a0,d3),d2
  3041.         bne.s    EndName
  3042.         addq    #1,d5
  3043.         tst.b    (a0,d3)
  3044.         beq    ItsOver
  3045.         addq    #1,d3
  3046.         bra    GotNameLp
  3047.  
  3048. EndName        moveq    #2,d6
  3049.         cmpi.b    #1,ErrResponse
  3050.         beq.s    WBFault
  3051.         cmpi.b    #2,ErrResponse
  3052.         beq.s    ItsOver
  3053.         tst.l    ReturnMsg
  3054.         bne.s    WBFault
  3055.  
  3056.         CALLDOS    Output            ; Write out error message
  3057.         move.l    d0,d4
  3058.         move.l    d4,d1
  3059.         move.l    #IntgErr1,d2
  3060.         move.l    #IntgErr1End-IntgErr1,d3
  3061.         CALLSYS    Write
  3062.         move.l    d4,d1
  3063.         move.l    #PathName,d2
  3064.         moveq    #0,d3
  3065.         move    d7,d3
  3066.         CALLSYS    Write
  3067.         move.l    d4,d1
  3068.         move.l    #IntgErr2,d2
  3069.         move.l    #IntgErr2End-IntgErr2,d3
  3070.         CALLSYS    Write
  3071.         bra.s    ItsOver
  3072.  
  3073. WBFault        suba.l    a0,a0
  3074.         lea    WBFaultFile,a1        ; 'Incorrect File' requester
  3075.         suba.l    a2,a2
  3076.         lea    AbortText,a3
  3077.         moveq    #0,d0
  3078.         moveq    #0,d1
  3079.         move    #342,d2
  3080.         moveq    #62,d3
  3081.         CALLINT    AutoRequest
  3082. ItsOver        move    (sp)+,d5        ; Recover d5
  3083.         rts
  3084.  
  3085. CheckQual    tst.b    ChQVal
  3086.         beq.s    NormCQual
  3087.         moveq    #0,d0
  3088.         move.b    MyDefQual,d0
  3089.         rts
  3090.  
  3091. NormCQual    moveq    #0,d0            ; Which qualifiers are
  3092.         move    Gadg89+gg_Flags,d1    ; currently active?
  3093.         andi    #SELECTED,d1
  3094.         beq.s    CheckShift
  3095.         addq    #1,d0
  3096. CheckShift    move    Gadg90+gg_Flags,d1
  3097.         andi    #SELECTED,d1
  3098.         beq.s    CheckAlt
  3099.         addq    #2,d0
  3100. CheckAlt    move    Gadg92+gg_Flags,d1
  3101.         andi    #SELECTED,d1
  3102.         beq.s    ChecksOver
  3103.         addq    #4,d0
  3104. ChecksOver    rts
  3105.  
  3106. GenerateKeys    bsr    CheckQual
  3107.         lsl    #2,d0
  3108.         lea    QualTable,a0
  3109.         move.l    (a0,d0),NoDeadStore
  3110.         lea    DQualTab,a0
  3111.         move.l    (a0,d0),DeadStore
  3112.  
  3113.         lea    IDtoGadget,a0
  3114.         lea    KeyTypes,a2
  3115.         lea    KeyDefs,a3
  3116.         lea    CodetoImage,a4
  3117.         lea    MapToKeys,a5
  3118.         moveq    #0,d0
  3119.         moveq    #0,d1
  3120.  
  3121. GenKeyLoop    move.l    (a0,d0),a1        ; Gadget address in a1
  3122.         cmpa.l    #0,a1            ; Should we change the image?
  3123.         beq.s    NotThisOne
  3124.  
  3125.         moveq    #0,d2
  3126.         move.b    (a5,d1),d2        ; Keycode in d2
  3127.  
  3128.         move.b    (a2,d2),d3        ; Get key type
  3129.         andi.b    #KCF_STRING,d3
  3130.         bne.s    NoGrafStr
  3131.         moveq    #0,d3
  3132.         move.b    (a2,d2),d3
  3133.         andi.b    #KCF_DEAD,d3
  3134.         bne.s    GenDead
  3135.         move.b    (a2,d2),d3
  3136.         cmpi.b    #KCF_NOP,d3
  3137.         beq.s    NoGraf
  3138.         andi.b    #KC_VANILLA,d3        ; Find which key in each
  3139.         moveq    #0,d6            ; key definition list
  3140.         move.l    NoDeadStore,a6
  3141.         move.b    (a6,d3),d6        ; Get index
  3142.         cmpi.b    #-1,d6            ; Is it invalid?
  3143.         beq.s    NoGraf
  3144.  
  3145.         moveq    #0,d5            ; Extract key from the
  3146.         move.b    d2,d3            ; 'KeyDefs' table
  3147.         lsl    #2,d3
  3148.         sub    d6,d3
  3149.         move.b    3(a3,d3),d4        ; ASCII value in d4
  3150. DeadASC        cmpi.b    #32,d4            ; Is it <SPACE
  3151.         bcs.s    NoGraf
  3152.  
  3153.         subi.b    #32,d4
  3154.         moveq    #0,d5
  3155.         move.b    d4,d5
  3156.         lsl    #2,d5
  3157.         move.l    (a4,d5),d6        ; Image address in d2
  3158.         move.l    d6,gg_GadgetRender(a1)    ; Phew!
  3159.  
  3160. NotThisOne    addq    #4,d0
  3161.         addq    #1,d1
  3162.         cmpi    #88,d1
  3163.         bne    GenKeyLoop
  3164.         rts
  3165.  
  3166. NoGrafStr    move.l    #StrIm,gg_GadgetRender(a1)
  3167.         bra    NotThisOne
  3168.  
  3169. NoGraf        move.l    #A20,gg_GadgetRender(a1)
  3170.         bra    NotThisOne
  3171.  
  3172. GenDead        move.b    (a2,d2),d3
  3173.         andi.b    #KC_VANILLA,d3
  3174.         move.l    DeadStore,a6
  3175.         moveq    #0,d7
  3176.         move.b    (a6,d3),d7        ; Get index
  3177.         move.l    a0,d6
  3178.         lea    DeadTab,a0
  3179.         move    d2,d5
  3180.         lsl    #4,d5
  3181.         add    d7,d5
  3182.         move.b    (a0,d5),d2
  3183.         tst.b    d2
  3184.         beq.s    CanDoDead
  3185.         cmpi.b    #DPF_MOD,d2
  3186.         beq.s    ModDead
  3187.         move.l    d6,a0
  3188.         bra    NoGraf
  3189.  
  3190. CanDoDead    move.b    1(a0,d5),d4
  3191.         move.l    d6,a0
  3192.         bra    DeadASC
  3193.  
  3194. ModDead        moveq    #0,d2
  3195.         move.b    1(a0,d5),d2
  3196.         mulu    #16,d2
  3197.         lea    DeadIndex,a0
  3198.         move.b    (a0,d2),d4
  3199.         move.l    d6,a0
  3200.         bra    DeadASC
  3201.  
  3202. RedrawKeys    move.l    Windowhd,a0        ; Redo all the keys eg
  3203.         lea    StrGadg,a1        ; after qualifier change
  3204.         moveq    #89,d0
  3205.         CALLINT    RemoveGList
  3206.         bra    GenerateKeys
  3207.  
  3208. ERedrawKeys    move.l    Windowhd,a0
  3209.         lea    StrGadg,a1
  3210.         moveq    #5,d0
  3211.         moveq    #89,d1
  3212.         CALLINT    AddGList
  3213.  
  3214.         lea    StrGadg,a0
  3215.         move.l    Windowhd,a1
  3216.         moveq    #89,d0
  3217.         CALLSYS    RefreshGList
  3218.         rts
  3219.  
  3220. PickUpDead    moveq    #0,d0            ; Pick out all dead keys
  3221.         moveq    #0,d1
  3222.         lea    DeadIDtoGadg,a0
  3223.         lea    KeyTypes,a2
  3224.         lea    MapToKeys,a5
  3225.  
  3226. DeadKeyLoop    move.l    (a0,d0),a1
  3227.         moveq    #0,d2
  3228.         move.b    (a5,d1),d2
  3229.         moveq    #0,d3
  3230.         move.b    (a2,d2),d3
  3231.         andi.b    #KCF_DEAD,d3        ; Is it KCF_DEAD?
  3232.         beq.s    FinDeadLoop
  3233.  
  3234.         move.b    (a2,d2),d3
  3235.         andi.b    #KC_VANILLA,d3
  3236.         move.l    DeadStore,a6
  3237.         moveq    #0,d7
  3238.         move.b    (a6,d3),d7
  3239.         lea    DeadTab,a4
  3240.         move    d2,d5
  3241.         lsl    #4,d5
  3242.         add    d7,d5
  3243.         move.b    (a4,d5),d2
  3244.         cmp.b    DeadByte,d2
  3245.         bne.s    FinDeadLoop
  3246.         move    On_Value,gg_Flags(a1)
  3247.  
  3248. FinDeadLoop    addq    #4,d0
  3249.         addq    #1,d1
  3250.         cmpi    #88,d1
  3251.         bne    DeadKeyLoop
  3252.         rts
  3253.  
  3254. SetUpKeyOn    bsr    CheckQual
  3255.         cmp.b    MyDefQual,d0
  3256.         beq.s    ItsThisOne
  3257. ItsVeryEarly    move    #GADGHCOMP!GADGDISABLED,StrGadg+gg_Flags
  3258.         bra    CSIoff
  3259.  
  3260. ItsThisOne    tst.l    MyDefKey
  3261.         beq    ItsVeryEarly
  3262.         move.l    MyDefKey,a0
  3263.         move    gg_Flags(a0),d0
  3264.         andi    #GADGDISABLED,d0
  3265.         bne.s    NewFirst
  3266.         move    gg_Flags(a0),d0
  3267.         eori    #SELECTED,d0
  3268.         move    d0,gg_Flags(a0)
  3269.         move    #GADGHCOMP,StrGadg+gg_Flags
  3270.         bra    CSIon
  3271.  
  3272. NewFirst    clr.l    MyDefKey
  3273.         bra    ItsVeryEarly
  3274.  
  3275. ActString    cmpi    #GADGHCOMP,StrGadg+gg_Flags
  3276.         beq.s    StringOn
  3277.         rts
  3278.  
  3279. StringOn    lea    StrGadg,a0        ; If gadget not disabled
  3280.         move.l    Windowhd,a1        ; then activate it...
  3281.         suba.l    a2,a2
  3282.         CALLINT    ActivateGadget
  3283.         rts
  3284.  
  3285. OnDead        lea    KeyTypes,a0
  3286.         lea    CheckTab,a2
  3287.         lea    MapToKeys,a3
  3288.         lea    DeadTab,a4
  3289.  
  3290.         subq    #1,d0
  3291.         move.b    d0,MD_GadgNo
  3292.         moveq    #0,d2
  3293.         moveq    #0,d4
  3294.         move.b    (a3,d0),d4
  3295.         move.b    d4,MD_KeyType        ; Store for later
  3296.  
  3297.         move.b    (a0,d4),d3
  3298.         bsr    CheckQual
  3299.         moveq    #0,d2
  3300.         move.b    (a2,d0),d2        ; Get offset into key
  3301.         lsl    #4,d4
  3302.         move    d4,MD_DeadTab        ; Store for later
  3303.         add    d4,d2            ; d2 hold key address
  3304.         move    d2,MD_DTbPos
  3305.  
  3306.         andi.b    #KCF_DEAD,d3        ; Is this a deadkey?
  3307.         beq    MakeNewDead
  3308.  
  3309.         cmpi.b    #DPF_DEAD,(a4,d2)    ; Is this key dead?
  3310.         beq    TurnDeadOff
  3311.  
  3312.         moveq    #7,d0
  3313. DeadChLp    move.b    (a4,d4),d2        ; Is there a dead on this
  3314.         cmpi.b    #DPF_DEAD,d2        ; physical key?
  3315.         beq.s    FoundXDead        ; Yes
  3316.         addq    #2,d4
  3317.         dbeq    d0,DeadChLp
  3318.  
  3319.         moveq    #0,d4
  3320.         move.b    MD_KeyType,d4
  3321.         bsr    NewDeadIndex
  3322.         bsr.s    CommonDead
  3323.         bra    MakeOldDead
  3324.  
  3325. FoundXDead    move    d4,OldDeadOff
  3326.         move.l    Windowhd,a0
  3327.         lea    DeadQuest,a1
  3328.         lea    LReqText,a2
  3329.         lea    RReqText,a3
  3330.         moveq    #0,d0
  3331.         moveq    #0,d1
  3332.         move    #445,d2
  3333.         moveq    #62,d3
  3334.         CALLINT    AutoRequest
  3335.  
  3336.         lea    KeyTypes,a0        ; Restore pointers
  3337.         lea    CheckTab,a2
  3338.         lea    MapToKeys,a3
  3339.         moveq    #0,d4
  3340.         move.b    MD_KeyType,d4
  3341.  
  3342.         tst    d0
  3343.         bne.s    UseOldDead
  3344.         bsr    NewDeadIndex
  3345.         bsr.s    CommonDead
  3346.         bra.s    MakeOldDead
  3347.  
  3348. UseOldDead    move    OldDeadOff,d6
  3349.         move.b    1(a4,d6),MD_Index    ; Store old deadkey
  3350.         bsr.s    CommonDead
  3351.         bra.s    MakeOldDead
  3352.  
  3353. CommonDead    moveq    #0,d4
  3354.         move.b    MD_KeyType,d4
  3355.         move.b    (a0,d4),d6
  3356.         andi.b    #KC_VANILLA,d6
  3357.  
  3358.         move    MD_DeadTab,d4
  3359.         move    MD_DTbPos,d2
  3360.         rts
  3361.  
  3362. MakeNewDead    bsr    CommonDead
  3363.         clr.l    (a4,d4)            ; Clear out deadkey
  3364.         clr.l    4(a4,d4)
  3365.         clr.l    8(a4,d4)
  3366.         clr.l    12(a4,d4)
  3367.  
  3368.         bsr    NewDeadIndex
  3369.         moveq    #0,d0
  3370.         move.b    MD_KeyType,d0
  3371.         bsr    NormToDead
  3372.  
  3373. MakeOldDead    move.b    #DPF_DEAD,(a4,d2)    ; Create dead
  3374.         move.b    MD_Index,1(a4,d2)    ; Store its index
  3375.  
  3376. DeadRedraw    move.l    Windowhd,a0        ; Redraw affected key
  3377.         lea    StrGadg,a1
  3378.         moveq    #89,d0
  3379.         CALLINT    RemoveGList
  3380.         bsr    GenerateKeys
  3381.         bsr    NoOfDead
  3382.         move.l    Windowhd,a0
  3383.         lea    StrGadg,a1
  3384.         moveq    #5,d0
  3385.         moveq    #89,d1
  3386.         CALLINT    AddGList
  3387.  
  3388.         lea    DeadIDtoGadg,a0
  3389.         moveq    #0,d0
  3390.         move.b    MD_GadgNo,d0
  3391.         lsl    #2,d0
  3392.         move.l    (a0,d0),a0
  3393.         move.l    Windowhd,a1
  3394.         moveq    #1,d0
  3395.         CALLSYS    RefreshGList
  3396.  
  3397.         cmpi.b    #1,d7
  3398.         bne.s    CheckReturn
  3399.         lea    Gadg01,a0
  3400.         move.l    Windowhd,a1
  3401.         moveq    #88,d0
  3402.         CALLSYS    RefreshGList
  3403.  
  3404. CheckReturn    cmpi.b    #45,MD_GadgNo
  3405.         bne    CheckMessage
  3406.         lea    Gadg87,a0
  3407.         move.l    Windowhd,a1
  3408.         moveq    #1,d0
  3409.         CALLSYS    RefreshGList
  3410.         bra    CheckMessage
  3411.  
  3412. NewDeadIndex    lea    UseDead,a5        ; Get a new index for
  3413.         moveq    #1,d0            ; deadkey
  3414. NDIndLoop    tst.b    (a5,d0)
  3415.         beq.s    GotNewIndex
  3416.         addq    #1,d0
  3417.         cmpi.b    #16,d0
  3418.         bne    NDIndLoop
  3419.         addq.l    #4,a7            ; None available
  3420.         bra    CheckMessage
  3421.  
  3422. GotNewIndex    move.b    #1,(a5,d0)
  3423.         move.b    d0,MD_Index        ; Store and return
  3424.         rts
  3425.  
  3426. NormToDead    lea    DeadTab,a4        ; d4 holds index in DeadTab
  3427.         lea    KeyDefs,a5        ; d5 = d4 ÷ 4
  3428.         move    d4,d5            ; d6 holds qualifiers
  3429.         lsr    #2,d5
  3430.  
  3431.         move.b    3(a5,d5),1(a4,d4)    ; Store NOQUAL
  3432.         cmpi.b    #KC_NOQUAL,d6        ; Is that all?
  3433.         beq.s    ENtoD
  3434.  
  3435.         move.b    2(a5,d5),3(a4,d4)
  3436.         cmpi.b    #KCF_SHIFT,d6
  3437.         beq.s    ENtoD
  3438.         cmpi.b    #KCF_ALT,d6
  3439.         beq.s    ENtoD
  3440.         cmpi.b    #KCF_CONTROL,d6
  3441.         beq.s    ENtoD
  3442.  
  3443.         move.b    1(a5,d5),5(a4,d4)
  3444.         move.b    (a5,d5),7(a4,d4)
  3445.         cmpi.b    #KC_VANILLA,d6
  3446.         bne.s    ENtoD
  3447.  
  3448.         move.l    (a4,d4),8(a4,d4)    ; Do VANILLA ctrl keys
  3449.         move.l    4(a4,d4),12(a4,d4)
  3450.         andi.b    #%10011111,9(a4,d4)
  3451.         andi.b    #%10011111,11(a4,d4)
  3452.         andi.b    #%10011111,13(a4,d4)
  3453.         andi.b    #%10011111,15(a4,d4)
  3454.  
  3455. ENtoD        clr.l    (a5,d5)            ; Clear old table
  3456.         bsr    DeadToVan        ; Sort out dead
  3457.         rts
  3458.  
  3459. TurnDeadOff    move    MD_DTbPos,d2
  3460.         moveq    #0,d7
  3461.         move.b    1(a4,d2),d7        ; Store deadkey index
  3462.         andi.b    #$0f,d7
  3463.         clr    (a4,d2)            ; Clear out deadkey
  3464.  
  3465.         moveq    #0,d6
  3466. TurnDLoop    cmpi.b    #DPF_DEAD,(a4,d6)    ; Is this dead index
  3467.         bne.s    TNotDead        ; used elsewhere?
  3468.         move.b    1(a4,d6),d5
  3469.         andi.b    #$0f,d5
  3470.         cmp.b    d5,d7
  3471.         beq.s    TDeadUsed
  3472. TNotDead    addq    #2,d6
  3473.         cmpi    #768*2,d6
  3474.         bne    TurnDLoop
  3475.  
  3476.         lea    UseDead,a5
  3477.         clr.b    (a5,d7)            ; Clear out old index
  3478.  
  3479. TDeadUsed    lea    KeyTypes,a3
  3480.         move    d4,d3
  3481.         lsr    #4,d3
  3482.         moveq    #7,d0
  3483.  
  3484. TDeadChLp    move.b    (a4,d4),d2
  3485.         cmpi.b    #DPF_DEAD,d2
  3486.         beq    DCheckNo
  3487.         cmpi.b    #DPF_MOD,d2
  3488.         beq    DCheckNo
  3489.         addq    #2,d4
  3490.         dbeq    d0,TDeadChLp
  3491.         move    MD_DeadTab,d4
  3492.  
  3493.         bsr    D_VanTest
  3494.         tst.b    d0
  3495.         bne    LoseSome
  3496.  
  3497. DeadToNorm    move    d4,d5            ; This routine expects
  3498.         lsr    #2,d5            ; as input a deadkey in
  3499.         lea    KeyDefs,a5        ; (a4,d4) (Not KC_VANILLA)
  3500.         clr.l    (a5,d5)            ; which it compresses as
  3501.         andi.b    #KC_VANILLA,(a3,d3)    ; much as is possible
  3502.  
  3503.         cmpi.b    #KC_NOQUAL,(a3,d3)
  3504.         beq    DN_DZero
  3505.         cmpi.b    #KCF_SHIFT,(a3,d3)    ; What is the key size?
  3506.         beq    DN_One
  3507.         cmpi.b    #KCF_ALT,(a3,d3)
  3508.         beq    DN_One
  3509.         cmpi.b    #KCF_CONTROL,(a3,d3)
  3510.         beq    DN_One
  3511.  
  3512.         tst.b    3(a4,d4)
  3513.         beq.s    DN_TwoA
  3514.         tst.b    5(a4,d4)
  3515.         beq.s    DN_TwoB
  3516.         move.b    3(a4,d4),d0
  3517.         move.b    1(a4,d4),d1
  3518.         cmp.b    d0,d1
  3519.         beq.s    DN_TwoC
  3520.         move.b    5(a4,d4),d0
  3521.         cmp.b    d0,d1
  3522.         beq.s    DN_TwoD
  3523.         bra    DN_DTwo
  3524.  
  3525. DN_TwoA        tst.b    7(a4,d4)
  3526.         bne.s    DN_DTwo
  3527.         move    4(a4,d4),2(a4,d4)
  3528.         bra.s    DN_Two_Rem3
  3529.  
  3530. DN_TwoB        tst.b    7(a4,d4)
  3531.         bne.s    DN_DTwo
  3532.         bra.s    DN_Two_Rem5
  3533.  
  3534. DN_TwoC        move.b    7(a4,d4),d0
  3535.         move.b    5(a4,d4),d1
  3536.         cmp.b    d0,d1
  3537.         bne.s    DN_DTwo
  3538.         move    4(a4,d4),2(a4,d4)
  3539.         bra.s    DN_Two_Rem3
  3540.  
  3541. DN_TwoD        move.b    7(a4,d4),d0
  3542.         move.b    3(a4,d4),d0
  3543.         cmp.b    d0,d1
  3544.         bne.s    DN_DTwo
  3545.         bra.s    DN_Two_Rem5
  3546.  
  3547. DN_Two_Rem3    cmpi.b    #KCF_ALT+KCF_SHIFT,(a3,d3)
  3548.         beq.s    DN_Two_R3a
  3549.         move.b    #KCF_CONTROL,(a3,d3)
  3550.         bra.s    DN_One
  3551. DN_Two_R3a    move.b    #KCF_ALT,(a3,d3)
  3552.         bra.s    DN_One
  3553.  
  3554. DN_Two_Rem5    cmpi.b    #KCF_ALT+KCF_CONTROL,(a3,d3)
  3555.         beq.s    DN_Two_R5a
  3556.         move.b    #KCF_SHIFT,(a3,d3)
  3557.         bra.s    DN_One
  3558. DN_Two_R5a    move.b    #KCF_ALT,(a3,d3)
  3559.  
  3560. DN_One        move.b    3(a4,d4),d1
  3561.         tst.b    d1
  3562.         beq.s    DN_OneA
  3563.         move.b    1(a4,d4),d0
  3564.         cmp.b    d0,d1
  3565.         bne.s    DN_DOne
  3566. DN_OneA        move.b    #KC_NOQUAL,(a3,d3)
  3567.         bra.s    DN_DZero
  3568.  
  3569. DN_DTwo        move.b    7(a4,d4),(a5,d5)    ; Transfer from DeadTab
  3570.         move.b    5(a4,d4),1(a5,d5)    ; to KeyDefs
  3571. DN_DOne        move.b    3(a4,d4),2(a5,d5)
  3572. DN_DZero    move.b    1(a4,d4),3(a5,d5)
  3573.  
  3574.         clr.l    (a4,d4)
  3575.         clr.l    4(a4,d4)
  3576.         clr.l    8(a4,d4)
  3577.         clr.l    12(a4,d4)
  3578.  
  3579.         cmpi.b    #KCF_SHIFT,(a3,d3)
  3580.         beq.s    DoVanTest
  3581.         cmpi.b    #KCF_ALT,(a3,d3)
  3582.         beq.s    DoVanTest
  3583.         cmpi.b    #KCF_SHIFT+KCF_ALT,(a3,d3)
  3584.         beq.s    DoVanTest
  3585.         bra    DCheckNo
  3586.  
  3587. DoVanTest    move.l    Windowhd,a0        ; What should we do
  3588.         lea    VanText,a1        ; about CTRL key?
  3589.         lea    VanPos,a2
  3590.         move.l    a3,-(sp)        ; Save a3
  3591.         lea    VanNeg,a3
  3592.         moveq    #0,d0
  3593.         moveq    #0,d1
  3594.         move    #397,d2
  3595.         move    d3,-(sp)        ; Save d3
  3596.         moveq    #62,d3
  3597.         CALLINT    AutoRequest
  3598.         move    (sp)+,d3
  3599.         move.l    (sp)+,a3
  3600.         tst.l    d0
  3601.         beq    DCheckNo
  3602.         cmpi.b    #KCF_SHIFT+KCF_ALT,(a3,d3)
  3603.         beq.s    VanTest
  3604.         move    2(a5,d5),(a5,d5)    ; Change type to VANILLA
  3605. VanTest        move.b    #KC_VANILLA,(a3,d3)
  3606.         bra    DCheckNo
  3607.  
  3608. LoseSome    bsr    DoLoseReq
  3609.         tst.b    d0            ; Should we abort?
  3610.         beq    DLStop
  3611.  
  3612.         cmpi.b    #1,d0            ; Now act on the users
  3613.         beq.s    DL_S            ; prompt in the requester
  3614.         cmpi.b    #2,d0
  3615.         beq.s    DL_A
  3616.         cmpi.b    #3,d0
  3617.         beq.s    DL_SA
  3618.         cmpi.b    #4,d0
  3619.         beq.s    DL_C
  3620.         cmpi.b    #5,d0
  3621.         beq.s    DL_SC
  3622.         cmpi.b    #6,d0
  3623.         beq.s    DL_AC
  3624.  
  3625.         move.b    #KC_NOQUAL,(a3,d3)
  3626.         bra    DeadToNorm
  3627. DL_AC        move.b    #KCF_SHIFT,(a3,d3)
  3628.         bra    DeadToNorm
  3629. DL_SC        move.b    #KCF_ALT,(a3,d3)
  3630.         move    4(a4,d4),2(a4,d4)
  3631.         bra    DeadToNorm
  3632. DL_C        move.b    #KCF_SHIFT+KCF_ALT,(a3,d3)
  3633.         bra    DeadToNorm
  3634. DL_SA        move.b    #KCF_CONTROL,(a3,d3)
  3635.         move    8(a4,d4),2(a4,d4)
  3636.         bra    DeadToNorm
  3637. DL_A        move.b    #KCF_SHIFT+KCF_CONTROL,(a3,d3)
  3638.         move.l    8(a4,d4),4(a4,d4)
  3639.         bra    DeadToNorm
  3640. DL_S        move.b    #KCF_ALT+KCF_CONTROL,(a3,d3)
  3641.         move    4(a4,d4),2(a4,d4)
  3642.         move    8(a4,d4),4(a4,d4)
  3643.         move    12(a4,d4),6(a4,d4)
  3644.         bra    DeadToNorm
  3645.  
  3646. DLStop        move    MD_DTbPos,d2        ; Repair deadkey
  3647.         move.b    #DPF_DEAD,(a4,d2)
  3648.         move.b    d7,1(a4,d2)
  3649.         move.b    #1,(a5,d7)
  3650.         lea    DeadIDtoGadg,a0
  3651.         moveq    #0,d0
  3652.         move.b    MD_GadgNo,d0
  3653.         lsl    #2,d0
  3654.         move.l    (a0,d0),a0
  3655.         ori    #SELECTED,gg_Flags(a0)
  3656.         bra    DeadRedraw
  3657.  
  3658. DoLoseReq    lea    LoseReq,a0
  3659.         move.l    Windowhd,a1
  3660.         CALLINT    Request
  3661.  
  3662. DLMLoop        move.l    UserPort,a0        ; Wait for an Intuition
  3663.         CALLEXEC WaitPort        ; message...
  3664. DLChkMsg    move.l    UserPort,a0
  3665.         CALLEXEC GetMsg
  3666.         tst.l    d0
  3667.         beq    DLMLoop
  3668.         move.l    d0,a1
  3669.         move.l    im_Class(a1),d2
  3670.         move.l    im_IAddress(a1),a2
  3671.         CALLSYS    ReplyMsg
  3672.         cmpi.l    #GADGETUP,d2
  3673.         beq.s    DLGadgBit
  3674.         bra    DLChkMsg
  3675.  
  3676. DLGadgBit    move    gg_GadgetID(a2),d0    ; Which gadget was it?
  3677.         cmpi    #4,d0
  3678.         beq.s    DLReqOver1
  3679.         cmpi    #5,d0
  3680.         beq    DLReqOver2
  3681.  
  3682.         cmpi    #GADGHCOMP!SELECTED!GADGIMAGE,LsGadg1+gg_Flags
  3683.         beq.s    DLG_Fin
  3684.         cmpi    #GADGHCOMP!SELECTED,LsGadg2+gg_Flags
  3685.         beq.s    DLG_Fin
  3686.         cmpi    #GADGHCOMP!SELECTED,LsGadg3+gg_Flags
  3687.         beq.s    DLG_Fin
  3688.         lea    LsGadg4,a0
  3689.         move.l    Windowhd,a1
  3690.         lea    LoseReq,a2
  3691.         move    #GADGHCOMP!GADGIMAGE!GADGDISABLED,LsGadg4+gg_Flags
  3692.         bra.s    DLG_Fin2
  3693.  
  3694. DLG_Fin        move    #GADGHCOMP!GADGIMAGE,LsGadg4+gg_Flags
  3695.  
  3696. DLG_Fin2    lea    LsGadg4,a0
  3697.         move.l    Windowhd,a1
  3698.         lea    LoseReq,a2
  3699.         moveq    #1,d0
  3700.         CALLINT    RefreshGList
  3701.         bra    DLChkMsg
  3702.  
  3703. DLReqOver1    clr.b    d0
  3704.         cmpi    #GADGHCOMP!GADGIMAGE,LsGadg1+gg_Flags
  3705.         beq.s    DLReq1
  3706.         addq.b    #2,d0
  3707. DLReq1        cmpi    #GADGHCOMP,LsGadg2+gg_Flags
  3708.         beq.s    DLReq2
  3709.         addq.b    #4,d0
  3710. DLReq2        cmpi    #GADGHCOMP,LsGadg3+gg_Flags
  3711.         beq.s    DLReq3
  3712.         addq.b    #1,d0
  3713. DLReq3        rts
  3714.  
  3715. DLReqOver2    clr.b    d0
  3716.         rts
  3717.  
  3718. DCheckNo    tst.b    DeadNo            ; Have we freed the
  3719.         beq    DeadRedraw        ; only available dead?
  3720.         clr.b    DeadNo
  3721.         lea    UseDead,a0
  3722.         cmpi.l    #$00010101,(a0)
  3723.         bne.s    DCheckPos
  3724.         cmpi.l    #$01010101,4(a0)
  3725.         bne.s    DCheckPos
  3726.         cmpi.l    #$01010101,8(a0)
  3727.         bne.s    DCheckPos
  3728.         cmpi.l    #$01010101,12(a0)
  3729.         bne.s    DCheckPos
  3730.         move.b    #1,DeadNo
  3731.         bra    DeadRedraw
  3732.  
  3733. DCheckPos    bsr    GenerateKeys
  3734.         bra    GGadge
  3735.  
  3736. D_VanTest    move.b    1(a4,d4),d0        ; Can we remove CTRL?
  3737.         move.b    9(a4,d4),d1
  3738.         tst.b    d0
  3739.         beq.s    D_VC1
  3740.         tst.b    d1
  3741.         beq.s    D_VC1
  3742.         cmp.b    d0,d1
  3743.         bne.s    D_VATest
  3744. D_VC1        move.b    3(a4,d4),d0
  3745.         move.b    11(a4,d4),d1
  3746.         tst.b    d0
  3747.         beq.s    D_VC2
  3748.         tst.b    d1
  3749.         beq.s    D_VC2
  3750.         cmp.b    d0,d1
  3751.         bne.s    D_VATest
  3752. D_VC2        move.b    5(a4,d4),d0
  3753.         move.b    13(a4,d4),d1
  3754.         tst.b    d0
  3755.         beq.s    D_VC3
  3756.         tst.b    d1
  3757.         beq.s    D_VC3
  3758.         cmp.b    d0,d1
  3759.         bne.s    D_VATest
  3760. D_VC3        move.b    7(a4,d4),d0
  3761.         move.b    15(a4,d4),d1
  3762.         tst.b    d0
  3763.         beq.s    D_VC4
  3764.         tst.b    d1
  3765.         beq.s    D_VC4
  3766.         cmp.b    d0,d1
  3767.         bne.s    D_VATest
  3768. D_VC4        tst.b    1(a4,d4)
  3769.         bne.s    D_VC5
  3770.         move.b    9(a4,d4),1(a4,d4)
  3771. D_VC5        tst.b    3(a4,d4)
  3772.         bne.s    D_VC6
  3773.         move.b    11(a4,d4),3(a4,d4)
  3774. D_VC6        tst.b    5(a4,d4)
  3775.         bne.s    D_VC7
  3776.         move.b    13(a4,d4),5(a4,d4)
  3777. D_VC7        tst.b    7(a4,d4)
  3778.         bne.s    D_VC8
  3779.         move.b    15(a4,d4),7(a4,d4)
  3780. D_VC8        move.b    #KCF_SHIFT+KCF_ALT,(a3,d3)
  3781.         clr.b    d0
  3782.         rts
  3783.  
  3784. D_VATest    move.b    5(a4,d4),d0        ; Can we remove ALT?
  3785.         move.b    1(a4,d4),d1
  3786.         tst.b    d0
  3787.         beq.s    D_VA1
  3788.         tst.b    d1
  3789.         beq.s    D_VA1
  3790.         cmp.b    d0,d1
  3791.         bne    D_VSTest
  3792. D_VA1        move.b    7(a4,d4),d0
  3793.         move.b    3(a4,d4),d1
  3794.         tst.b    d0
  3795.         beq.s    D_VA2
  3796.         tst.b    d1
  3797.         beq.s    D_VA2
  3798.         cmp.b    d0,d1
  3799.         bne.s    D_VSTest
  3800. D_VA2        move.b    13(a4,d4),d0
  3801.         move.b    9(a4,d4),d1
  3802.         tst.b    d0
  3803.         beq.s    D_VA3
  3804.         tst.b    d1
  3805.         beq.s    D_VA3
  3806.         cmp.b    d0,d1
  3807.         bne.s    D_VSTest
  3808. D_VA3        move.b    15(a4,d4),d0
  3809.         move.b    11(a4,d4),d1
  3810.         tst.b    d0
  3811.         beq.s    D_VA4
  3812.         tst.b    d1
  3813.         beq.s    D_VA4
  3814.         cmp.b    d0,d1
  3815.         bne.s    D_VSTest
  3816. D_VA4        tst.b    5(a4,d4)
  3817.         bne.s    D_VA5
  3818.         move.b    5(a4,d4),1(a4,d4)
  3819. D_VA5        tst.b    3(a4,d4)
  3820.         bne.s    D_VA6
  3821.         move.b    7(a4,d4),3(a4,d4)
  3822. D_VA6        tst.b    9(a4,d4)
  3823.         bne.s    D_VA7
  3824.         move.b    13(a4,d4),9(a4,d4)
  3825. D_VA7        move.b    9(a4,d4),5(a4,d4)
  3826.         tst.b    11(a4,d4)
  3827.         bne.s    D_VA8
  3828.         move.b    15(a4,d4),11(a4,d4)
  3829. D_VA8        move.b    11(a4,d4),7(a4,d4)
  3830.         move.b    #KCF_SHIFT+KCF_CONTROL,(a3,d3)
  3831.         clr.b    d0
  3832.         rts
  3833.  
  3834. D_VSTest    move.b    3(a4,d4),d0        ; Can we remove SHIFT?
  3835.         move.b    1(a4,d4),d1
  3836.         tst.b    d0
  3837.         beq.s    D_VS1
  3838.         tst.b    d1
  3839.         beq.s    D_VS1
  3840.         cmp.b    d0,d1
  3841.         bne    D_VEnd
  3842. D_VS1        move.b    7(a4,d4),d0
  3843.         move.b    5(a4,d4),d1
  3844.         tst.b    d0
  3845.         beq.s    D_VS2
  3846.         tst.b    d1
  3847.         beq.s    D_VS2
  3848.         cmp.b    d0,d1
  3849.         bne.s    D_VEnd
  3850. D_VS2        move.b    11(a4,d4),d0
  3851.         move.b    9(a4,d4),d1
  3852.         tst.b    d0
  3853.         beq.s    D_VS3
  3854.         tst.b    d1
  3855.         beq.s    D_VS3
  3856.         cmp.b    d0,d1
  3857.         bne.s    D_VEnd
  3858. D_VS3        move.b    15(a4,d4),d0
  3859.         move.b    13(a4,d4),d1
  3860.         tst.b    d0
  3861.         beq.s    D_VS4
  3862.         tst.b    d1
  3863.         beq.s    D_VS4
  3864.         cmp.b    d0,d1
  3865.         bne.s    D_VEnd
  3866. D_VS4        tst.b    3(a4,d4)
  3867.         bne.s    D_VS5
  3868.         move.b    3(a4,d4),1(a4,d4)
  3869. D_VS5        tst.b    5(a4,d4)
  3870.         bne.s    D_VS6
  3871.         move.b    7(a4,d4),5(a4,d4)
  3872. D_VS6        move.b    5(a4,d4),3(a4,d4)
  3873.         tst.b    9(a4,d4)
  3874.         bne.s    D_VS7
  3875.         move.b    11(a4,d4),9(a4,d4)
  3876. D_VS7        move.b    9(a4,d4),5(a4,d4)
  3877.         tst.b    13(a4,d4)
  3878.         bne.s    D_VS8
  3879.         move.b    15(a4,d4),13(a4,d4)
  3880. D_VS8        move.b    13(a4,d4),7(a4,d4)
  3881.         move.b    #KCF_ALT+KCF_CONTROL,(a3,d3)
  3882.         clr.b    d0
  3883.         rts
  3884.  
  3885. D_VEnd        move.b    -1,d0
  3886.         rts
  3887.  
  3888. DeadToVan    move.b    (a0,d0),d6        ; Expands deadkey to
  3889.         andi.b    #KC_VANILLA,d6        ; KC_VANILLA. (a4,d4) holds
  3890.         cmpi.b    #KC_NOQUAL,d6        ; key, (a0,d0) keytype
  3891.         beq    DV_NQual
  3892.         cmpi.b    #KCF_SHIFT,d6
  3893.         beq    DV_S
  3894.         cmpi.b    #KCF_ALT,d6
  3895.         beq    DV_A
  3896.         cmpi.b    #KCF_CONTROL,d6
  3897.         beq.s    DV_C
  3898.         cmpi.b    #KCF_SHIFT+KCF_ALT,d6
  3899.         beq.s    DV_SA
  3900.         cmpi.b    #KCF_SHIFT+KCF_CONTROL,d6
  3901.         beq.s    DV_SC
  3902.         cmpi.b    #KCF_CONTROL+KCF_ALT,d6
  3903.         bne    DV_Final
  3904.  
  3905.         move    6(a4,d4),12(a4,d4)
  3906.         move    4(a4,d4),8(a4,d4)
  3907.         move    2(a4,d4),4(a4,d4)
  3908.         move    (a4,d4),2(a4,d4)
  3909.         move    4(a4,d4),6(a4,d4)
  3910.         move    8(a4,d4),10(a4,d4)
  3911.         move    12(a4,d4),12(a4,d4)
  3912.         bra    DV_Final
  3913.  
  3914. DV_SC        move.l    4(a4,d4),8(a4,d4)
  3915.         move.l    (a4,d4),4(a4,d4)
  3916.         move.l    8(a4,d4),12(a4,d4)
  3917.         bra.s    DV_Final
  3918.  
  3919. DV_SA        move.l    (a4,d4),8(a4,d4)
  3920.         move.l    4(a4,d4),12(a4,d4)
  3921.         bra.s    DV_Final
  3922.  
  3923. DV_C        move    2(a4,d4),8(a4,d4)
  3924.         move    (a4,d4),2(a4,d4)
  3925.         move.l    (a4,d4),4(a4,d4)
  3926.         move    8(a4,d4),10(a4,d4)
  3927.         move.l    8(a4,d4),12(a4,d4)
  3928.         bra.s    DV_Final
  3929.  
  3930. DV_A        move    2(a4,d4),4(a4,d4)
  3931.         move    (a4,d4),2(a4,d4)
  3932.         move    4(a4,d4),6(a4,d4)
  3933.         move.l    (a4,d4),8(a4,d4)
  3934.         move.l    4(a4,d4),12(a4,d4)
  3935.         bra.s    DV_Final
  3936.  
  3937. DV_S        move.l    (a4,d4),4(a4,d4)
  3938.         move.l    (a4,d4),8(a4,d4)
  3939.         move.l    (a4,d4),12(a4,d4)
  3940.         bra.s    DV_Final
  3941.  
  3942. DV_NQual    move    (a4,d4),2(a4,d4)
  3943.         move.l    (a4,d4),4(a4,d4)
  3944.         move.l    (a4,d4),8(a4,d4)
  3945.         move.l    (a4,d4),12(a4,d4)
  3946.  
  3947. DV_Final    move.b    #KCF_DEAD+KC_VANILLA,(a0,d0)
  3948.         rts
  3949.  
  3950. CancelString    moveq    #0,d0
  3951.         lea    KeyTypes,a0
  3952.         lea    KeysToMap,a1
  3953. CStrLoop    move.b    (a0,d0),d1
  3954.         andi.b    #KCF_STRING,d1
  3955.         tst.b    d1
  3956.         bne.s    CancelStr
  3957. StrDone        addq    #1,d0
  3958.         cmpi.b    #96,d0
  3959.         bne    CStrLoop
  3960.         rts
  3961.  
  3962. CancelStr    move    d0,d1
  3963.         lsl    #2,d1
  3964.         move.l    (a1,d1),a2
  3965.         cmpa.l    #0,a2
  3966.         beq    StrDone
  3967.         move    #GADGHCOMP!GADGIMAGE!GADGDISABLED,gg_Flags(a2)
  3968.         bra    StrDone
  3969.  
  3970. NoOfDead    moveq    #0,d7            ; d7 holds returncode
  3971.         lea    UseDead,a0
  3972.         cmpi.l    #$00010101,(a0)
  3973.         bne.s    NotAllDead
  3974.         cmpi.l    #$01010101,4(a0)
  3975.         bne.s    NotAllDead
  3976.         cmpi.l    #$01010101,8(a0)
  3977.         bne.s    NotAllDead
  3978.         cmpi.l    #$01010101,12(a0)
  3979.         bne.s    NotAllDead
  3980.  
  3981.         moveq    #0,d0
  3982.         lea    KeysToMap,a0
  3983. NDeadLoop    move.l    (a0,d0),a1
  3984.         cmpa.l    #0,a1
  3985.         beq.s    NotCancelDead
  3986.  
  3987.         cmpi    #GADGHCOMP!GADGIMAGE!SELECTED,gg_Flags(a1)
  3988.         beq.s    NotCancelDead
  3989.         move    #GADGHCOMP!GADGIMAGE!GADGDISABLED,gg_Flags(a1)
  3990.  
  3991. NotCancelDead    addq    #4,d0
  3992.         cmpi    #4*96,d0
  3993.         bne    NDeadLoop
  3994.         move.b    #1,d7
  3995.         move.b    #1,DeadNo
  3996. NotAllDead    rts
  3997.  
  3998. OnMod        lea    KeyTypes,a0
  3999.         lea    CheckTab,a2
  4000.         lea    MapToKeys,a3
  4001.         lea    DeadTab,a4
  4002.  
  4003.         subq    #1,d0
  4004.         move.b    d0,MD_GadgNo
  4005.         moveq    #0,d2
  4006.         moveq    #0,d4
  4007.         move.b    (a3,d0),d4
  4008.         move.b    d4,MD_KeyType        ; Store for later
  4009.  
  4010.         move.b    (a0,d4),d3
  4011.         bsr    CheckQual
  4012.         moveq    #0,d2
  4013.         move.b    (a2,d0),d2        ; Get offset into key
  4014.         lsl    #4,d4
  4015.         move    d4,MD_DeadTab        ; Store for later
  4016.         add    d4,d2            ; d2 hold key address
  4017.         move    d2,MD_DTbPos
  4018.  
  4019.         andi.b    #KCF_DEAD,d3        ; Is this a deadkey?
  4020.         beq.s    MakeNewMod
  4021.  
  4022.         cmpi.b    #DPF_MOD,(a4,d2)    ; Is this key deadable?
  4023.         beq    TurnModOff
  4024.  
  4025.         bsr    NewModIndex        ; This is a physical key
  4026.         bsr.s    CommonMod        ; deadkey already
  4027.         bra.s    MakeOldMod
  4028.  
  4029. CommonMod    moveq    #0,d4
  4030.         move.b    MD_KeyType,d4
  4031.         move.b    (a0,d4),d6
  4032.         andi.b    #KC_VANILLA,d6
  4033.         move    MD_DeadTab,d4
  4034.         move    MD_DTbPos,d2
  4035.         rts
  4036.  
  4037. MakeNewMod    bsr    CommonMod
  4038.         clr.l    (a4,d4)            ; Clear out deadkey
  4039.         clr.l    4(a4,d4)
  4040.         clr.l    8(a4,d4)
  4041.         clr.l    12(a4,d4)
  4042.  
  4043.         bsr.s    NewModIndex
  4044.         moveq    #0,d0
  4045.         move.b    MD_KeyType,d0
  4046.         bsr    NormToDead
  4047.  
  4048. MakeOldMod    lea    DeadIndex,a0
  4049.         moveq    #0,d0
  4050.         move.b    MD_Index,d0
  4051.         lsl    #4,d0
  4052.         move.b    1(a4,d2),(a0,d0)    ; Start modkey
  4053.         move.b    (a0,d0),1(a0,d0)
  4054.         move    (a0,d0),2(a0,d0)
  4055.         move.l    (a0,d0),4(a0,d0)
  4056.         move.l    (a0,d0),8(a0,d0)
  4057.         move.l    (a0,d0),12(a0,d0)
  4058.         move.b    #DPF_MOD,(a4,d2)    ; Create mod
  4059.         move.b    MD_Index,1(a4,d2)    ; Store its index
  4060.         bra    ModRedraw        ; Redraw affected key
  4061.  
  4062. NewModIndex    lea    ModIndex,a5        ; Get a new index for
  4063.         moveq    #0,d0            ; modkey
  4064. NMIndLoop    tst.b    (a5,d0)
  4065.         beq    GotNewIndex
  4066.         addq    #1,d0
  4067.         cmpi    #256,d0
  4068.         bne    NMIndLoop
  4069.         addq.l    #4,a7            ; None available
  4070.         bra    CheckMessage
  4071.  
  4072. TurnModOff    move    MD_DTbPos,d2
  4073.         moveq    #0,d7
  4074.         move.b    1(a4,d2),d7        ; Store modkey index
  4075.         clr.b    (a4,d2)            ; Clear out modkey
  4076.  
  4077.         lea    DeadIndex,a3
  4078.         moveq    #0,d6
  4079.         move.b    d7,d6
  4080.         lsl    #4,d6
  4081.         move.b    (a3,d6),1(a4,d2)    ; Replace key value
  4082.  
  4083.         moveq    #0,d6
  4084. TurnMLoop    cmpi.b    #DPF_MOD,(a4,d6)    ; Is this dead index
  4085.         bne.s    TNotMod            ; used elsewhere?
  4086.         move.b    1(a4,d6),d5
  4087.         cmp.b    d5,d7
  4088.         beq.s    TModUsed
  4089. TNotMod        addq    #2,d6
  4090.         cmpi    #768*2,d6
  4091.         bne    TurnMLoop
  4092.  
  4093.         lea    ModIndex,a5
  4094.         clr.b    (a5,d7)            ; Clear out old index
  4095.  
  4096. TModUsed    lea    KeyTypes,a3
  4097.         move    d4,d3
  4098.         lsr    #4,d3
  4099.         moveq    #7,d0
  4100.  
  4101. TModChLp    move.b    (a4,d4),d2
  4102.         cmpi.b    #DPF_DEAD,d2
  4103.         beq    MCheckNo
  4104.         cmpi.b    #DPF_MOD,d2
  4105.         beq    MCheckNo
  4106.         addq    #2,d4
  4107.         dbeq    d0,TModChLp
  4108.         move    MD_DeadTab,d4
  4109.  
  4110.         bsr    D_VanTest
  4111.         tst.b    d0
  4112.         bne    M_LoseSome
  4113.  
  4114. ModToNorm    move    d4,d5            ; This routine expects
  4115.         lsr    #2,d5            ; as input a deadkey in
  4116.         lea    KeyDefs,a5        ; (a4,d4) (Not KC_VANILLA)
  4117.         clr.l    (a5,d5)            ; which it compresses as
  4118.         andi.b    #KC_VANILLA,(a3,d3)    ; much as is possible
  4119.  
  4120.         cmpi.b    #KC_NOQUAL,(a3,d3)
  4121.         beq    MN_DZero
  4122.         cmpi.b    #KCF_SHIFT,(a3,d3)    ; What is the key size?
  4123.         beq    MN_One
  4124.         cmpi.b    #KCF_ALT,(a3,d3)
  4125.         beq    MN_One
  4126.         cmpi.b    #KCF_CONTROL,(a3,d3)
  4127.         beq    MN_One
  4128.  
  4129.         tst.b    3(a4,d4)
  4130.         beq.s    MN_TwoA
  4131.         tst.b    5(a4,d4)
  4132.         beq.s    MN_TwoB
  4133.         move.b    3(a4,d4),d0
  4134.         move.b    1(a4,d4),d1
  4135.         cmp.b    d0,d1
  4136.         beq.s    MN_TwoC
  4137.         move.b    5(a4,d4),d0
  4138.         cmp.b    d0,d1
  4139.         beq.s    MN_TwoD
  4140.         bra    MN_DTwo
  4141.  
  4142. MN_TwoA        tst.b    7(a4,d4)
  4143.         bne.s    MN_DTwo
  4144.         move    4(a4,d4),2(a4,d4)
  4145.         bra.s    MN_Two_Rem3
  4146.  
  4147. MN_TwoB        tst.b    7(a4,d4)
  4148.         bne.s    MN_DTwo
  4149.         bra.s    MN_Two_Rem5
  4150.  
  4151. MN_TwoC        move.b    7(a4,d4),d0
  4152.         move.b    5(a4,d4),d1
  4153.         cmp.b    d0,d1
  4154.         bne.s    MN_DTwo
  4155.         move    4(a4,d4),2(a4,d4)
  4156.         bra.s    MN_Two_Rem3
  4157.  
  4158. MN_TwoD        move.b    7(a4,d4),d0
  4159.         move.b    3(a4,d4),d0
  4160.         cmp.b    d0,d1
  4161.         bne.s    MN_DTwo
  4162.         bra.s    MN_Two_Rem5
  4163.  
  4164. MN_Two_Rem3    cmpi.b    #KCF_ALT+KCF_SHIFT,(a3,d3)
  4165.         beq.s    MN_Two_R3a
  4166.         move.b    #KCF_CONTROL,(a3,d3)
  4167.         bra.s    MN_One
  4168. MN_Two_R3a    move.b    #KCF_ALT,(a3,d3)
  4169.         bra.s    MN_One
  4170.  
  4171. MN_Two_Rem5    cmpi.b    #KCF_ALT+KCF_CONTROL,(a3,d3)
  4172.         beq.s    MN_Two_R5a
  4173.         move.b    #KCF_SHIFT,(a3,d3)
  4174.         bra.s    MN_One
  4175. MN_Two_R5a    move.b    #KCF_ALT,(a3,d3)
  4176.  
  4177. MN_One        move.b    3(a4,d4),d1
  4178.         tst.b    d1
  4179.         beq.s    MN_OneA
  4180.         move.b    1(a4,d4),d0
  4181.         cmp.b    d0,d1
  4182.         bne.s    MN_DOne
  4183. MN_OneA        move.b    #KC_NOQUAL,(a3,d3)
  4184.         bra.s    MN_DZero
  4185.  
  4186. MN_DTwo        move.b    7(a4,d4),(a5,d5)    ; Transfer from DeadTab
  4187.         move.b    5(a4,d4),1(a5,d5)    ; to KeyDefs
  4188. MN_DOne        move.b    3(a4,d4),2(a5,d5)
  4189. MN_DZero    move.b    1(a4,d4),3(a5,d5)
  4190.  
  4191.         clr.l    (a4,d4)
  4192.         clr.l    4(a4,d4)
  4193.         clr.l    8(a4,d4)
  4194.         clr.l    12(a4,d4)
  4195.  
  4196.         cmpi.b    #KCF_SHIFT,(a3,d3)
  4197.         beq.s    M_DoVanTest
  4198.         cmpi.b    #KCF_ALT,(a3,d3)
  4199.         beq.s    M_DoVanTest
  4200.         cmpi.b    #KCF_SHIFT+KCF_ALT,(a3,d3)
  4201.         beq.s    M_DoVanTest
  4202.         bra    MCheckNo
  4203.  
  4204. M_DoVanTest    move.l    Windowhd,a0        ; What should we do
  4205.         lea    VanText,a1        ; about CTRL key?
  4206.         lea    VanPos,a2
  4207.         move.l    a3,-(sp)        ; Save a3
  4208.         lea    VanNeg,a3
  4209.         moveq    #0,d0
  4210.         moveq    #0,d1
  4211.         move    #397,d2
  4212.         move    d3,-(sp)        ; Save d3
  4213.         moveq    #62,d3
  4214.         CALLINT    AutoRequest
  4215.         move    (sp)+,d3
  4216.         move.l    (sp)+,a3
  4217.         tst.l    d0
  4218.         beq    MCheckNo
  4219.         cmpi.b    #KCF_SHIFT+KCF_ALT,(a3,d3)
  4220.         beq.s    M_VanTest
  4221.         move    2(a5,d5),(a5,d5)    ; Change type to VANILLA
  4222. M_VanTest    move.b    #KC_VANILLA,(a3,d3)
  4223.         bra    MCheckNo
  4224.  
  4225. M_LoseSome    bsr    DoLoseReq
  4226.         tst.b    d0            ; Should we abort?
  4227.         beq    MLStop
  4228.  
  4229.         cmpi.b    #1,d0            ; Now act on the users
  4230.         beq.s    ML_S            ; prompt in the requester
  4231.         cmpi.b    #2,d0
  4232.         beq.s    ML_A
  4233.         cmpi.b    #3,d0
  4234.         beq.s    ML_SA
  4235.         cmpi.b    #4,d0
  4236.         beq.s    ML_C
  4237.         cmpi.b    #5,d0
  4238.         beq.s    ML_SC
  4239.         cmpi.b    #6,d0
  4240.         beq.s    ML_AC
  4241.  
  4242.         move.b    #KC_NOQUAL,(a3,d3)
  4243.         bra    ModToNorm
  4244. ML_AC        move.b    #KCF_SHIFT,(a3,d3)
  4245.         bra    ModToNorm
  4246. ML_SC        move.b    #KCF_ALT,(a3,d3)
  4247.         move    4(a4,d4),2(a4,d4)
  4248.         bra    ModToNorm
  4249. ML_C        move.b    #KCF_SHIFT+KCF_ALT,(a3,d3)
  4250.         bra    ModToNorm
  4251. ML_SA        move.b    #KCF_CONTROL,(a3,d3)
  4252.         move    8(a4,d4),2(a4,d4)
  4253.         bra    ModToNorm
  4254. ML_A        move.b    #KCF_SHIFT+KCF_CONTROL,(a3,d3)
  4255.         move.l    8(a4,d4),4(a4,d4)
  4256.         bra    ModToNorm
  4257. ML_S        move.b    #KCF_ALT+KCF_CONTROL,(a3,d3)
  4258.         move    4(a4,d4),2(a4,d4)
  4259.         move    8(a4,d4),4(a4,d4)
  4260.         move    12(a4,d4),6(a4,d4)
  4261.         bra    ModToNorm
  4262.  
  4263. MLStop        move    MD_DTbPos,d2        ; Repair deadkey
  4264.         move.b    #DPF_MOD,(a4,d2)
  4265.         move.b    d7,1(a4,d2)
  4266.         move.b    #1,(a5,d7)
  4267.         lea    DeadIDtoGadg,a0
  4268.         moveq    #0,d0
  4269.         move.b    MD_GadgNo,d0
  4270.         lsl    #2,d0
  4271.         move.l    (a0,d0),a0
  4272.         ori    #SELECTED,gg_Flags(a0)
  4273.         bra.s    ModRedraw
  4274.  
  4275. MCheckNo    tst.b    ModNo            ; Have we freed the
  4276.         beq.s    ModRedraw        ; only available mod?
  4277.         clr.b    ModNo
  4278.  
  4279.         lea    ModIndex,a0
  4280.         moveq    #0,d0
  4281. MC_Loop        cmpi.b    #1,(a0,d0)
  4282.         bne.s    MCheckPos
  4283.         addq    #1,d0
  4284.         cmpi    #256,d0
  4285.         bne    MC_Loop
  4286.         move.b    #1,ModNo
  4287.         bra.s    ModRedraw
  4288.  
  4289. MCheckPos    bsr    GenerateKeys
  4290.         bra    GGadgd
  4291.  
  4292. ModRedraw    move.l    Windowhd,a0        ; Redraw affected key
  4293.         lea    StrGadg,a1
  4294.         moveq    #89,d0
  4295.         CALLINT    RemoveGList
  4296.         bsr    GenerateKeys
  4297.         bsr.s    NoOfMod
  4298.         move.l    Windowhd,a0
  4299.         lea    StrGadg,a1
  4300.         moveq    #5,d0
  4301.         moveq    #89,d1
  4302.         CALLINT    AddGList
  4303.  
  4304.         lea    DeadIDtoGadg,a0
  4305.         moveq    #0,d0
  4306.         move.b    MD_GadgNo,d0
  4307.         lsl    #2,d0
  4308.         move.l    (a0,d0),a0
  4309.         move.l    Windowhd,a1
  4310.         moveq    #1,d0
  4311.         CALLSYS    RefreshGList
  4312.  
  4313.         cmpi.b    #1,d7
  4314.         bne    CheckReturn
  4315.         lea    Gadg01,a0
  4316.         move.l    Windowhd,a1
  4317.         moveq    #88,d0
  4318.         CALLSYS    RefreshGList
  4319.         bra    CheckReturn
  4320.  
  4321. NoOfMod        moveq    #0,d7            ; d7 holds returncode
  4322.         lea    ModIndex,a0
  4323.         moveq    #0,d0
  4324. NoOfMod_1    cmpi.b    #1,(a0,d0)
  4325.         bne    NotAllDead
  4326.         addq    #1,d0
  4327.         cmpi    #256,d0
  4328.         bne    NoOfMod_1
  4329.  
  4330.         moveq    #0,d0
  4331.         lea    KeysToMap,a0
  4332. NModLoop    move.l    (a0,d0),a1
  4333.         cmpa.l    #0,a1
  4334.         beq.s    NotCancelMod
  4335.  
  4336.         cmpi    #GADGHCOMP!GADGIMAGE!SELECTED,gg_Flags(a1)
  4337.         beq.s    NotCancelMod
  4338.         move    #GADGHCOMP!GADGIMAGE!GADGDISABLED,gg_Flags(a1)
  4339.  
  4340. NotCancelMod    addq    #4,d0
  4341.         cmpi    #4*96,d0
  4342.         bne    NModLoop
  4343.         move.b    #1,d7
  4344.         move.b    #1,ModNo
  4345.         rts
  4346.  
  4347. ChangeKString    bsr    CheckQual        ; Should we alter the
  4348.         cmp.b    MyDefQual,d0        ; key in the small square?
  4349.         bne.s    ChangeKOver
  4350.  
  4351.         move    MyNewKey,d7
  4352.         tst    d7
  4353.         beq.s    ChangeKOver
  4354.         bra    KeyInString
  4355. ChangeKOver    rts
  4356.  
  4357. ReqStart    cmpi.b    #1,MyMode
  4358.         bne    CheckMessage
  4359.         move.l    DeadTxt,DDeadTxt
  4360.         move.l    DeadTxt+4,DDeadTxt+4
  4361.         move.b    CurrDKey,DCurrDKey
  4362.         bra.s    DMChkMsg
  4363.  
  4364. DMLoop        move.l    UserPort,a0        ; Wait for an Intuition
  4365.         CALLEXEC WaitPort        ; message...
  4366. DMChkMsg    move.l    UserPort,a0
  4367.         CALLEXEC GetMsg
  4368.         tst.l    d0
  4369.         beq    DMLoop
  4370.         move.l    d0,a1
  4371.         move.l    im_Class(a1),d2
  4372.         move    im_Code(a1),d3
  4373.         move    im_Qualifier(a1),d4
  4374.         move.l    im_IAddress(a1),a2
  4375.         CALLSYS    ReplyMsg
  4376.         cmpi.l    #RAWKEY,d2
  4377.         beq    DMKey
  4378.         cmpi.l    #GADGETUP,d2
  4379.         beq.s    DMGadg
  4380.         bra    DMChkMsg
  4381.  
  4382. DMGadg        cmpi    #1,gg_GadgetID(a2)
  4383.         beq.s    DMEndIt
  4384.         cmpi    #2,gg_GadgetID(a2)
  4385.         beq.s    DMQuit
  4386.         cmpi    #3,gg_GadgetID(a2)
  4387.         beq.s    DMClear
  4388.         bra    DMChkMsg
  4389.  
  4390. DMEndIt        move.l    DDeadTxt,DeadTxt
  4391.         move.l    DDeadTxt+4,DeadTxt+4
  4392.         move.b    DCurrDKey,CurrDKey
  4393.  
  4394. DMQuit        move.l    DeadTxt,DblGTxt4
  4395.         move.l    DeadTxt+4,DblGTxt4+4
  4396.         move.l    LastQualVal,d0
  4397.         move.l    LastGadgVal,d7
  4398.         cmpi.l    #-1,d7
  4399.         bne.s    DMDoSKey
  4400.         bsr    KI_NoKey
  4401.         bra    CheckMessage
  4402. DMDoSKey    bsr    KeyInString2
  4403.         bra    CheckMessage
  4404.  
  4405. DMClear        move.l    #$20202020,DblGTxt4
  4406.         move.l    #$20202000,DblGTxt4+4
  4407.         lea    DblGadg4,a0
  4408.         move.l    Windowhd,a1
  4409.         lea    DoubleReq,a2
  4410.         moveq    #1,d0
  4411.         CALLINT    RefreshGList
  4412.  
  4413.         clr.b    DCurrDKey
  4414.         move.l    #$20202020,DDeadTxt
  4415.         move.l    #$20202000,DDeadTxt+4
  4416.         bra    DMChkMsg
  4417.  
  4418. DMKey        cmpi.b    #$60,d3
  4419.         bcc    DMChkMsg
  4420.  
  4421.         move.l    #$2020202d,DblGTxt4
  4422.         move.l    #$20202000,DblGTxt4+4
  4423.  
  4424.         lea    KeyTypes,a0
  4425.         move.b    (a0,d3),d0        ; Is key KCF_DEAD?
  4426.         andi.b    #KCF_DEAD,d0
  4427.         beq    DMNotDead
  4428.  
  4429.         moveq    #0,d0            ; Analyse qualifiers
  4430.         moveq    #0,d7
  4431.         move.b    d4,d0
  4432.         andi.b    #IEQUALIFIER_LSHIFT,d0
  4433.         beq.s    DMKey2
  4434.         bsr    DMShift
  4435. DMKey2        move.b    d4,d0
  4436.         andi.b    #IEQUALIFIER_RSHIFT,d0
  4437.         beq.s    DMKey3
  4438.         bsr    DMShift
  4439. DMKey3        move.b    d4,d0
  4440.         andi.b    #IEQUALIFIER_CONTROL,d0
  4441.         beq.s    DMKey4
  4442.         bsr    DMControl
  4443. DMKey4        move.b    d4,d0
  4444.         andi.b    #IEQUALIFIER_LALT,d0
  4445.         beq.s    DMKey5
  4446.         bsr    DMAlt
  4447. DMKey5        move.b    d4,d0
  4448.         andi.b    #IEQUALIFIER_RALT,d0
  4449.         beq.s    DMKey6
  4450.         bsr    DMAlt
  4451.  
  4452. DMKey6        lea    KeyTab1,a0        ; Analyse key - is it
  4453.         moveq    #0,d0            ; a special one?
  4454. DMKLoop1    cmp.b    (a0,d0),d3
  4455.         beq.s    DMGotOne
  4456.         addq    #1,d0
  4457.         cmpi.b    #KeyTab1End-KeyTab1,d0
  4458.         bne    DMKLoop1
  4459.  
  4460.         moveq    #0,d0            ; Process normal key
  4461.         move.b    d3,d0
  4462.         lsl    #4,d0
  4463.         move    d0,d1
  4464.         addi    #16,d1
  4465.         lea    DeadTab,a0
  4466. DMKLoop2    tst.b    (a0,d0)
  4467.         beq.s    DMGotDef
  4468.         cmpi.b    #DPF_MOD,(a0,d0)
  4469.         beq.s    DMGotDef2
  4470.         addq    #2,d0
  4471.         cmp    d0,d1
  4472.         bne    DMKLoop2
  4473.         move.b    #" ",DblGTxt4+4
  4474.         bra.s    DMAllProc
  4475.  
  4476. DMGotDef    move.b    1(a0,d0),DblGTxt4+4
  4477.         bra.s    DMAllProc
  4478.  
  4479. DMGotDef2    moveq    #0,d1
  4480.         move.b    1(a0,d0),d1
  4481.         lsl    #4,d1
  4482.         lea    DeadIndex,a1
  4483.         move.b    (a1,d1),DblGTxt4+4
  4484.         bra.s    DMAllProc
  4485.  
  4486. DMGotOne    mulu    #3,d0            ; Get text for key
  4487.         lea    KeyTab2,a0
  4488.         move.b    (a0,d0),DblGTxt4+4
  4489.         move.b    1(a0,d0),DblGTxt4+5
  4490.         move.b    2(a0,d0),DblGTxt4+6
  4491.  
  4492. DMAllProc    moveq    #0,d0            ; Search for deadkey
  4493.         move.b    d3,d0
  4494.         lsl    #4,d0
  4495.         add    d7,d0
  4496.         lea    DeadTab,a0
  4497.         cmpi.b    #DPF_DEAD,(a0,d0)
  4498.         bne    DMNotDead
  4499.  
  4500. DMGotDead    move.b    1(a0,d0),DCurrDKey
  4501.         andi.b    #$0f,DCurrDKey
  4502.         cmpi.b    #" ",DblGTxt4+2
  4503.         bne.s    DMG_1
  4504.         bsr.s    DM_Tract2
  4505.         bra    DMGotDead
  4506. DMG_1        cmpi.b    #" ",DblGTxt4+1
  4507.         bne.s    DMG_2
  4508.         bsr.s    DM_Tract1
  4509.         bra    DMG_1
  4510. DMG_2        cmpi.b    #" ",DblGTxt4
  4511.         bne.s    DM_TDone
  4512.         bsr.s    DM_Tract
  4513.         bra    DMG_2
  4514.  
  4515. DM_TDone    cmpi.b    #"-",DblGTxt4
  4516.         bne.s    DM_T2
  4517.         bsr.s    DM_Tract
  4518.  
  4519. DM_T2        lea    DblGadg4,a0
  4520.         move.l    Windowhd,a1
  4521.         lea    DoubleReq,a2
  4522.         moveq    #1,d0
  4523.         CALLINT    RefreshGList
  4524.  
  4525.         move.l    DblGTxt4,DDeadTxt    ; Store new key
  4526.         move.l    DblGTxt4+4,DDeadTxt+4
  4527.         bra    DMChkMsg
  4528.  
  4529. DM_Tract    move.b    DblGTxt4+1,DblGTxt4
  4530. DM_Tract1    move.b    DblGTxt4+2,DblGTxt4+1
  4531. DM_Tract2    move.b    DblGTxt4+3,DblGTxt4+2
  4532.         move.b    DblGTxt4+4,DblGTxt4+3
  4533.         move.b    DblGTxt4+5,DblGTxt4+4
  4534.         move.b    DblGTxt4+6,DblGTxt4+5
  4535.         move.b    #" ",DblGTxt4+6
  4536.         rts
  4537.  
  4538. DMShift        move.b    #"S",DblGTxt4
  4539.         ori    #2,d7
  4540.         rts
  4541. DMAlt        move.b    #"A",DblGTxt4+1
  4542.         ori    #4,d7
  4543.         rts
  4544. DMControl    move.b    #"C",DblGTxt4+2
  4545.         ori    #8,d7
  4546.         rts
  4547.  
  4548. DMNotDead    suba.l    a0,a0
  4549.         CALLINT    DisplayBeep
  4550.         bra    DMChkMsg
  4551.  
  4552. CopyToSave    lea    PathName,a0        ; Store a pathname we
  4553.         lea    SavePath,a1        ; might need later...
  4554. CopyLoop    move.l    (a0)+,(a1)+
  4555.         cmpa.l    #PathName+72,a0
  4556.         bne    CopyLoop
  4557.         rts
  4558.  
  4559. Sisters        tst.b    SisTst
  4560.         beq.s    SisGo
  4561.         rts
  4562.  
  4563. SisGo        move.b    #1,SisTst
  4564.         move.l    Windowhd,a0
  4565.         lea    SoM1,a1
  4566.         suba.l    a2,a2
  4567.         lea    LucText,a3
  4568.         moveq    #0,d0
  4569.         moveq    #0,d1
  4570.         move    #386,d2
  4571.         move    #90,d3
  4572.         CALLINT    AutoRequest
  4573.         rts
  4574.  
  4575. StrComp        moveq    #0,d0            ; Compare two strings in a
  4576.         moveq    #0,d1            ; case sensitive way
  4577. StrCLoop    move.b    (a0,d0),d2        ; a0 & a1 hold strings...
  4578.         cmp.b    (a1,d1),d2
  4579.         bne.s    StrNeg
  4580.         tst.b    d2
  4581.         beq.s    StrPos
  4582.         addq    #1,d0
  4583.         addq    #1,d1
  4584.         bra    StrCLoop
  4585. StrPos        moveq    #0,d0
  4586.         rts
  4587. StrNeg        moveq    #1,d0
  4588.         rts
  4589.  
  4590. CSIon        lea    CSIGadg,a0
  4591.         move.l    Windowhd,a1
  4592.         suba.l    a2,a2
  4593.         CALLINT    OnGadget
  4594.         rts
  4595.  
  4596. CSIoff        lea    CSIGadg,a0
  4597.         move.l    Windowhd,a1
  4598.         suba.l    a2,a2
  4599.         CALLINT    OffGadget
  4600.         rts
  4601.  
  4602. _TackOn        moveq    #0,d0
  4603.         moveq    #0,d1
  4604.         tst.b    (a0)
  4605.         beq.s    .copy
  4606. .loop        tst.b    (a0,d0)
  4607.         beq.s    .out
  4608.         addq    #1,d0
  4609.         bra    .loop
  4610. .out        cmpi.b    #":",-1(a0,d0)
  4611.         beq.s    .copy
  4612.         cmpi.b    #"/",-1(a0,d0)
  4613.         beq.s    .copy
  4614.         move.b    #"/",(a0,d0)
  4615.         addq    #1,d0
  4616.  
  4617. .copy        move.b    (a1,d1),(a0,d0)
  4618.         beq.s    .over
  4619.         addq    #1,d0
  4620.         addq    #1,d1
  4621.         bra    .copy
  4622. .over        rts
  4623.  
  4624. _GADS        tst.b    OS2
  4625.         bne.s    .new
  4626.         lea    Par_Help,a1
  4627.         lea    Par_Arry,a2
  4628.         lea    Par_Temp,a3
  4629.         CALLDOS    GADS
  4630.         move.l    d0,d7
  4631.         rts
  4632.  
  4633. .new        move.l    #Par_Temp,d1
  4634.         move.l    #Par_Arry,d2
  4635.         move.l    #OS2Args,d3
  4636.         CALLDOS    ReadArgs
  4637.         CALLSYS    IoErr
  4638.         move.l    d0,d7
  4639.         bne.s    .errover
  4640.  
  4641.         move.l    Par_Arry,a0
  4642.         cmpa.l    #0,a0
  4643.         beq.s    .noover
  4644.         tst.b    (a0)
  4645.         beq.s    .noover
  4646.         moveq    #1,d7
  4647.         bra.s    .over
  4648.  
  4649. .errover    neg.l    d7
  4650.         bra.s    .over
  4651. .noover        moveq    #0,d7
  4652. .over        move.l    #OS2Args,d1
  4653.         CALLSYS    FreeArgs
  4654.         rts
  4655.  
  4656.         section    Data,data
  4657.  
  4658. OS2Args        dc.l    0,0,0,0,0,0,Par_Help,0
  4659.  
  4660. MainWindow    dc.w    0,0,592,128
  4661.         dc.b    0,1
  4662.         dc.l    MENUPICK!GADGETDOWN!GADGETUP!REQSET!RAWKEY!CLOSEWINDOW
  4663.         dc.l    WINDOWDRAG!WINDOWDEPTH!WINDOWCLOSE!ACTIVATE
  4664.         dc.l    0,0,MainWindowText,0,0
  4665.         dc.w    0,0,0,0,WBENCHSCREEN
  4666. MainWindowText    dc.b    "EditKeys v1.2 «"
  4667. ModWindText    dc.b    "»",0,0,0,0,0,0,0
  4668. EndWindText    dc.b    0,0
  4669.  
  4670. Gadg0a        dc.l    Gadg0b
  4671.         dc.w    31,95,90,11
  4672.         dc.w    GADGHCOMP!GADGIMAGE!SELECTED,GADGIMMEDIATE,BOOLGADGET
  4673.         dc.l    Imagea,0,0,0,0
  4674.         dc.w    -1
  4675.         dc.l    0
  4676.  
  4677. Gadg0b        dc.l    Gadg0c
  4678.         dc.w    141,95,90,11
  4679.         dc.w    GADGHCOMP!GADGIMAGE,GADGIMMEDIATE,BOOLGADGET
  4680.         dc.l    Imageb,0,0,0,0
  4681.         dc.w    -2
  4682.         dc.l    0
  4683.  
  4684. Gadg0c        dc.l    Gadg0d
  4685.         dc.w    251,95,90,11
  4686.         dc.w    GADGHCOMP!GADGIMAGE,GADGIMMEDIATE,BOOLGADGET
  4687.         dc.l    Imagec,0,0,0,0
  4688.         dc.w    -3
  4689.         dc.l    0
  4690.  
  4691. Gadg0d        dc.l    Gadg0e
  4692.         dc.w    361,95,90,11
  4693.         dc.w    GADGHCOMP!GADGIMAGE,GADGIMMEDIATE,BOOLGADGET
  4694.         dc.l    Imaged,0,0,0,0
  4695.         dc.w    -4
  4696.         dc.l    0
  4697.  
  4698. Gadg0e        dc.l    StrGadg
  4699.         dc.w    471,95,90,11
  4700.         dc.w    GADGHCOMP!GADGIMAGE,GADGIMMEDIATE,BOOLGADGET
  4701.         dc.l    Imagee,0,0,0,0
  4702.         dc.w    -5
  4703.         dc.l    0
  4704.  
  4705. StrGadg        dc.l    Gadg01
  4706.         dc.w    192,113,248,8
  4707.         dc.w    GADGHCOMP!GADGDISABLED,RELVERIFY
  4708.         dc.w    STRGADGET
  4709.         dc.l    0,0,0,0,SpecialInfo
  4710.         dc.w    0
  4711.         dc.l    0
  4712.  
  4713. StrBord1    dc.w    188,111
  4714.         dc.b    1,0,0,6
  4715.         dc.l    StrAry1,StrBord2
  4716. StrAry1        dc.w    0,11,0,0,254,0,254,11,1,11,1,0
  4717.  
  4718. StrBord2    dc.w    188,111
  4719.         dc.b    1,0,0,2
  4720.         dc.l    StrAry2,0
  4721. StrAry2        dc.w    255,0,255,11
  4722.  
  4723. SpecialInfo    dc.l    StringBuf,0
  4724.         dc.w    0,32,0,0,0,0,0,0
  4725.         dc.l    0
  4726.         dc.l    0,0
  4727.  
  4728. GadgMac        MACRO                ; This gadget, next gadget,
  4729. Gadg\1        dc.l    Gadg\2            ; x pos, y pos, image
  4730.         dc.w    \3,\4,24,10
  4731.         dc.w    GADGHCOMP!GADGIMAGE,GADGIMMEDIATE,BOOLGADGET
  4732.         dc.l    \5,0,0,0,0
  4733.         dc.w    \1
  4734.         dc.l    0
  4735.         ENDM
  4736.  
  4737.         GadgMac    01,02,12,16,Image01
  4738.  
  4739. Gadg02        dc.l    Gadg03
  4740.         dc.w    44,16,31,10
  4741.         dc.w    GADGHCOMP!GADGIMAGE,GADGIMMEDIATE,BOOLGADGET
  4742.         dc.l    If1,0,0,0,0
  4743.         dc.w    2
  4744.         dc.l    0
  4745.  
  4746. Gadg03        dc.l    Gadg04
  4747.         dc.w    76,16,31,10
  4748.         dc.w    GADGHCOMP!GADGIMAGE,GADGIMMEDIATE,BOOLGADGET
  4749.         dc.l    If2,0,0,0,0
  4750.         dc.w    3
  4751.         dc.l    0
  4752.  
  4753. Gadg04        dc.l    Gadg05
  4754.         dc.w    108,16,31,10
  4755.         dc.w    GADGHCOMP!GADGIMAGE,GADGIMMEDIATE,BOOLGADGET
  4756.         dc.l    If3,0,0,0,0
  4757.         dc.w    4
  4758.         dc.l    0
  4759.  
  4760. Gadg05        dc.l    Gadg06
  4761.         dc.w    140,16,31,10
  4762.         dc.w    GADGHCOMP!GADGIMAGE,GADGIMMEDIATE,BOOLGADGET
  4763.         dc.l    If4,0,0,0,0
  4764.         dc.w    5
  4765.         dc.l    0
  4766.  
  4767. Gadg06        dc.l    Gadg07
  4768.         dc.w    172,16,31,10
  4769.         dc.w    GADGHCOMP!GADGIMAGE,GADGIMMEDIATE,BOOLGADGET
  4770.         dc.l    If5,0,0,0,0
  4771.         dc.w    6
  4772.         dc.l    0
  4773.  
  4774. Gadg07        dc.l    Gadg08
  4775.         dc.w    211,16,31,10
  4776.         dc.w    GADGHCOMP!GADGIMAGE,GADGIMMEDIATE,BOOLGADGET
  4777.         dc.l    If6,0,0,0,0
  4778.         dc.w    7
  4779.         dc.l    0
  4780.  
  4781. Gadg08        dc.l    Gadg09
  4782.         dc.w    243,16,31,10
  4783.         dc.w    GADGHCOMP!GADGIMAGE,GADGIMMEDIATE,BOOLGADGET
  4784.         dc.l    If7,0,0,0,0
  4785.         dc.w    8
  4786.         dc.l    0
  4787.  
  4788. Gadg09        dc.l    Gadg10
  4789.         dc.w    275,16,31,10
  4790.         dc.w    GADGHCOMP!GADGIMAGE,GADGIMMEDIATE,BOOLGADGET
  4791.         dc.l    If8,0,0,0,0
  4792.         dc.w    9
  4793.         dc.l    0
  4794.  
  4795. Gadg10        dc.l    Gadg11
  4796.         dc.w    307,16,31,10
  4797.         dc.w    GADGHCOMP!GADGIMAGE,GADGIMMEDIATE,BOOLGADGET
  4798.         dc.l    If9,0,0,0,0
  4799.         dc.w    10
  4800.         dc.l    0
  4801.  
  4802. Gadg11        dc.l    Gadg12
  4803.         dc.w    339,16,31,10
  4804.         dc.w    GADGHCOMP!GADGIMAGE,GADGIMMEDIATE,BOOLGADGET
  4805.         dc.l    If0,0,0,0,0
  4806.         dc.w    11
  4807.         dc.l    0
  4808.  
  4809. Gadg12        dc.l    Gadg13
  4810.         dc.w    12,31,31,10
  4811.         dc.w    GADGHCOMP!GADGIMAGE,GADGIMMEDIATE,BOOLGADGET
  4812.         dc.l    Itl,0,0,0,0
  4813.         dc.w    12
  4814.         dc.l    0
  4815.  
  4816.         GadgMac    13,14,44,31,A20
  4817.         GadgMac    14,15,69,31,A20
  4818.         GadgMac    15,16,94,31,A20
  4819.         GadgMac    16,17,119,31,A20
  4820.         GadgMac    17,18,144,31,A20
  4821.         GadgMac    18,19,169,31,A20
  4822.         GadgMac    19,20,194,31,A20
  4823.         GadgMac    20,21,219,31,A20
  4824.         GadgMac    21,22,244,31,A20
  4825.         GadgMac    22,23,269,31,A20
  4826.         GadgMac    23,24,294,31,A20
  4827.         GadgMac    24,25,319,31,A20
  4828.         GadgMac    25,26,344,31,A20
  4829.         GadgMac    26,27,369,31,Image02
  4830.  
  4831. Gadg27        dc.l    Gadg28
  4832.         dc.w    406,31,30,10
  4833.         dc.w    GADGHCOMP!GADGIMAGE,GADGIMMEDIATE,BOOLGADGET
  4834.         dc.l    Image03,0,0,0,0
  4835.         dc.w    27
  4836.         dc.l    0
  4837.  
  4838. Gadg28        dc.l    Gadg29
  4839.         dc.w    437,31,30,10
  4840.         dc.w    GADGHCOMP!GADGIMAGE,GADGIMMEDIATE,BOOLGADGET
  4841.         dc.l    Image04,0,0,0,0
  4842.         dc.w    28
  4843.         dc.l    0
  4844.  
  4845.         GadgMac    29,30,481,31,A20
  4846.         GadgMac    30,31,506,31,A20
  4847.         GadgMac    31,32,531,31,A20
  4848.         GadgMac    32,33,556,31,A20
  4849.  
  4850. Gadg33        dc.l    Gadg34
  4851.         dc.w    12,42,44,10
  4852.         dc.w    GADGHCOMP!GADGIMAGE,GADGIMMEDIATE,BOOLGADGET
  4853.         dc.l    Image05,0,0,0,0
  4854.         dc.w    33
  4855.         dc.l    0
  4856.  
  4857.         GadgMac    34,35,57,42,A20
  4858.         GadgMac    35,36,82,42,A20
  4859.         GadgMac    36,37,107,42,A20
  4860.         GadgMac    37,38,132,42,A20
  4861.         GadgMac    38,39,157,42,A20
  4862.         GadgMac    39,40,182,42,A20
  4863.         GadgMac    40,41,207,42,A20
  4864.         GadgMac    41,42,232,42,A20
  4865.         GadgMac    42,43,257,42,A20
  4866.         GadgMac    43,44,282,42,A20
  4867.         GadgMac    44,45,307,42,A20
  4868.         GadgMac    45,47,332,42,A20
  4869.         GadgMac    47,48,481,42,A20
  4870.         GadgMac    48,49,506,42,A20
  4871.         GadgMac    49,50,531,42,A20
  4872.         GadgMac    50,51,556,42,A20
  4873.         GadgMac    51,52,64,53,A20
  4874.         GadgMac    52,53,89,53,A20
  4875.         GadgMac    53,54,114,53,A20
  4876.         GadgMac    54,55,139,53,A20
  4877.         GadgMac    55,56,164,53,A20
  4878.         GadgMac    56,57,189,53,A20
  4879.         GadgMac    57,58,214,53,A20
  4880.         GadgMac    58,59,239,53,A20
  4881.         GadgMac    59,60,264,53,A20
  4882.         GadgMac    60,61,289,53,A20
  4883.         GadgMac    61,87,314,53,A20
  4884.         GadgMac    87,46,339,53,A20
  4885.  
  4886. Gadg46        dc.l    Gadg62
  4887.         dc.w    357,42,36,21
  4888.         dc.w    GADGHCOMP!GADGIMAGE,GADGIMMEDIATE!BOOLEXTEND,BOOLGADGET
  4889.         dc.l    Image07,0,0,0,Spec46
  4890.         dc.w    46
  4891.         dc.l    0
  4892.  
  4893. Spec46        dc.w    BOOLMASK
  4894.         dc.l    Mask46,0
  4895.  
  4896.         GadgMac    62,63,425,53,Image08
  4897.         GadgMac    63,64,481,53,A20
  4898.         GadgMac    64,65,506,53,A20
  4899.         GadgMac    65,66,531,53,A20
  4900.         GadgMac    66,88,556,53,A20
  4901.         GadgMac    88,67,53,64,A20
  4902.         GadgMac    67,68,78,64,A20
  4903.         GadgMac    68,69,103,64,A20
  4904.         GadgMac    69,70,128,64,A20
  4905.         GadgMac    70,71,153,64,A20
  4906.         GadgMac    71,72,178,64,A20
  4907.         GadgMac    72,73,203,64,A20
  4908.         GadgMac    73,74,228,64,A20
  4909.         GadgMac    74,75,253,64,A20
  4910.         GadgMac    75,76,278,64,A20
  4911.         GadgMac    76,77,303,64,A20
  4912.         GadgMac    77,78,400,64,Image02
  4913.         GadgMac    78,79,425,64,Image10
  4914.         GadgMac    79,80,450,64,Image11
  4915.         GadgMac    80,81,481,64,A20
  4916.         GadgMac    81,82,506,64,A20
  4917.         GadgMac    82,83,531,64,A20
  4918.  
  4919. Gadg83        dc.l    Gadg84
  4920.         dc.w    89,75,225,10
  4921.         dc.w    GADGHCOMP!GADGIMAGE,GADGIMMEDIATE,BOOLGADGET
  4922.         dc.l    Isp,0,0,0,0
  4923.         dc.w    83
  4924.         dc.l    0
  4925.  
  4926. Gadg84        dc.l    Gadg85
  4927.         dc.w    481,75,49,10
  4928.         dc.w    GADGHCOMP!GADGIMAGE,GADGIMMEDIATE,BOOLGADGET
  4929.         dc.l    Im0,0,0,0,0
  4930.         dc.w    84
  4931.         dc.l    0
  4932.  
  4933.         GadgMac    85,86,531,75,A20
  4934.  
  4935. Gadg86        dc.l    Gadg89
  4936.         dc.w    556,64,24,21
  4937.         dc.w    GADGHCOMP!GADGIMAGE,GADGIMMEDIATE,BOOLGADGET
  4938.         dc.l    Image13,0,0,0,0
  4939.         dc.w    86
  4940.         dc.l    0
  4941.  
  4942. Gadg89        dc.l    Gadg90
  4943.         dc.w    12,53,27,10
  4944.         dc.w    GADGHCOMP!GADGIMAGE,GADGIMMEDIATE!TOGGLESELECT
  4945.         dc.w    BOOLGADGET
  4946.         dc.l    Image06,0,0,0,0
  4947.         dc.w    89
  4948.         dc.l    0
  4949.  
  4950. Gadg90        dc.l    Gadg91
  4951.         dc.w    12,64,40,10
  4952.         dc.w    GADGHCOMP!GADGIMAGE,GADGIMMEDIATE!TOGGLESELECT
  4953.         dc.w    BOOLGADGET
  4954.         dc.l    Ish,0,0,0,0
  4955.         dc.w    90
  4956.         dc.l    0
  4957.  
  4958. Gadg91        dc.l    Gadg92
  4959.         dc.w    328,64,65,10
  4960.         dc.w    GADGHCOMP!GADGIMAGE,GADGIMMEDIATE!TOGGLESELECT
  4961.         dc.w    BOOLGADGET
  4962.         dc.l    Image09,0,0,0,0
  4963.         dc.w    91
  4964.         dc.l    0
  4965.  
  4966. Gadg92        dc.l    Gadg93
  4967.         dc.w    31,75,27,10
  4968.         dc.w    GADGHCOMP!GADGIMAGE,GADGIMMEDIATE!TOGGLESELECT
  4969.         dc.w    BOOLGADGET
  4970.         dc.l    Image12,0,0,0,0
  4971.         dc.w    92
  4972.         dc.l    0
  4973.  
  4974. Gadg93        dc.l    CSIGadg
  4975.         dc.w    344,75,27,10
  4976.         dc.w    GADGHCOMP!GADGIMAGE,GADGIMMEDIATE!TOGGLESELECT
  4977.         dc.w    BOOLGADGET
  4978.         dc.l    Image12,0,0,0,0
  4979.         dc.w    93
  4980.         dc.l    0
  4981.  
  4982. CSIGadg        dc.l    0
  4983.         dc.w    452,112,48,10
  4984.         dc.w    GADGHCOMP!GADGIMAGE!GADGDISABLED,RELVERIFY,BOOLGADGET
  4985.         dc.l    CSI,0,0,0,0
  4986.         dc.w    94
  4987.         dc.l    0
  4988.  
  4989. SqrText        dc.b    1,0,1
  4990.         dc.w    168,113
  4991.         dc.l    NormText,SqrTxt,DeadText
  4992. SqrTxt        dc.b    " ",0
  4993.  
  4994. DeadText    dc.b    1,0,1
  4995.         dc.w    96,113
  4996.         dc.l    NormText,DeadTxt,0
  4997. DeadTxt        dc.b    "       ",0
  4998.         even
  4999. DDeadTxt    dc.b    "       ",0
  5000.         even
  5001.  
  5002. SqrBord1    dc.w    162,111
  5003.         dc.b    1,0,0,6
  5004.         dc.l    SqrAry1,SqrBord2
  5005. SqrAry1        dc.w    0,11,0,0,18,0,18,11,1,11,1,0
  5006.  
  5007. SqrBord2    dc.w    162,111
  5008.         dc.b    1,0,0,2
  5009.         dc.l    SqrAry2,SqrBord3
  5010. SqrAry2        dc.w    19,0,19,11
  5011.  
  5012. SqrBord3    dc.w    91,111
  5013.         dc.b    1,0,0,6
  5014.         dc.l    SqrAry3,SqrBord4
  5015. SqrAry3        dc.w    0,11,0,0,64,0,64,11,1,11,1,0
  5016.  
  5017. SqrBord4    dc.w    91,111
  5018.         dc.b    1,0,0,2
  5019.         dc.l    SqrAry4,StrBord1
  5020. SqrAry4        dc.w    63,1,63,11
  5021.  
  5022. MyBord1        dc.w    64,53
  5023.         dc.b    2,1,0,2
  5024.         dc.l    MyKeyAry1,MyBord2
  5025. MyKeyAry1    dc.w    -25,10,-2,10
  5026.  
  5027. MyBord2        dc.w    64,53
  5028.         dc.b    3,1,0,4
  5029.         dc.l    MyKeyAry2,MyBord3
  5030. MyKeyAry2    dc.w    -8,1,-5,1,-5,2,-8,2
  5031.  
  5032. MyBord3        dc.w    58,85
  5033.         dc.b    2,1,0,2
  5034.         dc.l    MyKeyAry3,SqrBord1
  5035. MyKeyAry3    dc.w    0,0,286,0
  5036.  
  5037. MoreText    dc.b    0,1,0
  5038.         dc.w    62,76
  5039.         dc.l    ItalFont,MoreTxt,0
  5040. MoreTxt        dc.b    "A",0
  5041.  
  5042. ItalFont    dc.l    NormFont
  5043.         dc.w    8
  5044.         dc.b    FSF_BOLD!FSF_ITALIC,0
  5045.         even
  5046.  
  5047. IconWindow    dc.w    0,0,80,23
  5048.         dc.b    0,1
  5049.         dc.l    GADGETUP
  5050.         dc.l    WINDOWDRAG!WINDOWDEPTH
  5051.         dc.l    IconGadget,0,0,0,0
  5052.         dc.w    0,0,0,0,WBENCHSCREEN
  5053.  
  5054. IconGadget    dc.l    0
  5055.         dc.w    2,10,76,12
  5056.         dc.w    GADGHCOMP,RELVERIFY,BOOLGADGET
  5057.         dc.l    0,0,IcnGdgtTxt,0,0
  5058.         dc.w    1
  5059.         dc.l    0
  5060. IcnGdgtTxt    dc.b    1,0,0,0
  5061.         dc.w    6,2
  5062.         dc.l    NormText,IcnGdgtText,0
  5063. IcnGdgtText    dc.b    "EditKeys",0
  5064.         even
  5065.  
  5066. ProjectMenu    dc.l    0
  5067.         dc.w    8,0,84,0,MENUENABLED
  5068.         dc.l    ProjectName
  5069.         dc.l    New
  5070.         dc.w    0,0,0,0
  5071. ProjectName    dc.b    "Project",0
  5072.         even
  5073.  
  5074. New        dc.l    Open
  5075.         dc.w    0,0,80+COMMWIDTH,10
  5076.         dc.w    HIGHCOMP!ITEMENABLED!ITEMTEXT!COMMSEQ
  5077.         dc.l    0,NewName,0
  5078.         dc.b    "N",0
  5079.         dc.l    0
  5080.         dc.w    0
  5081. NewName        dc.b    2,1,0,0
  5082.         dc.w    3,1
  5083.         dc.l    NormText,NewText,0
  5084. NewText        dc.b    "New",0
  5085.         even
  5086.  
  5087. Open        dc.l    Save
  5088.         dc.w    0,10,80+COMMWIDTH,10
  5089.         dc.w    HIGHCOMP!ITEMENABLED!ITEMTEXT!COMMSEQ
  5090.         dc.l    0,OpenName,0
  5091.         dc.b    "L",0
  5092.         dc.l    0
  5093.         dc.w    0
  5094. OpenName    dc.b    2,1,0,0
  5095.         dc.w    3,1
  5096.         dc.l    NormText,OpenText,0
  5097. OpenText    dc.b    "Load",0
  5098.         even
  5099.  
  5100. Save        dc.l    SaveAs
  5101.         dc.w    0,20,80+COMMWIDTH,10
  5102.         dc.w    HIGHCOMP!ITEMENABLED!ITEMTEXT!COMMSEQ
  5103.         dc.l    0,SaveName,0
  5104.         dc.b    "S",0
  5105.         dc.l    0
  5106.         dc.w    0
  5107. SaveName    dc.b    2,1,0,0
  5108.         dc.w    3,1
  5109.         dc.l    NormText,SaveText,0
  5110. SaveText    dc.b    "Save",0
  5111.         even
  5112.  
  5113. SaveAs        dc.l    About
  5114.         dc.w    0,30,80+COMMWIDTH,10
  5115.         dc.w    HIGHCOMP!ITEMENABLED!ITEMTEXT!COMMSEQ
  5116.         dc.l    0,SaveAsName,0
  5117.         dc.b    "A",0
  5118.         dc.l    0
  5119.         dc.w    0
  5120. SaveAsName    dc.b    2,1,0,0
  5121.         dc.w    3,1
  5122.         dc.l    NormText,SaveAsText,0
  5123. SaveAsText    dc.b    "Save As",0
  5124.         even
  5125.  
  5126. About        dc.l    Iconify
  5127.         dc.w    0,40,80+COMMWIDTH,10
  5128.         dc.w    HIGHNONE!ITEMENABLED!ITEMTEXT
  5129.         dc.l    0,AboutName,0
  5130.         dc.b    0,0
  5131.         dc.l    AboutSub
  5132.         dc.w    0
  5133. AboutName    dc.b    2,1,0,0
  5134.         dc.w    3,1
  5135.         dc.l    NormText,AboutText,0
  5136. AboutText    dc.b    "About",0
  5137.         even
  5138.  
  5139. Iconify        dc.l    Quit
  5140.         dc.w    0,50,80+COMMWIDTH,10
  5141.         dc.w    HIGHCOMP!ITEMENABLED!ITEMTEXT!COMMSEQ
  5142.         dc.l    0,IconifyName,0
  5143.         dc.b    "E",0
  5144.         dc.l    0
  5145.         dc.w    0
  5146. IconifyName    dc.b    2,1,0,0
  5147.         dc.w    3,1
  5148.         dc.l    NormText,IconifyText,0
  5149. IconifyText    dc.b    "Sleep",0
  5150.         even
  5151.  
  5152. Quit        dc.l    0
  5153.         dc.w    0,60,80+COMMWIDTH,10
  5154.         dc.w    HIGHCOMP!ITEMENABLED!ITEMTEXT!COMMSEQ
  5155.         dc.l    0,QuitName,0
  5156.         dc.b    "Q",0
  5157.         dc.l    0
  5158.         dc.w    0
  5159. QuitName    dc.b    2,1,0,0
  5160.         dc.w    3,1
  5161.         dc.l    NormText,QuitText,0
  5162. QuitText    dc.b    "Quit",0
  5163.         even
  5164.  
  5165. AboutSub    dc.l    AboutSub2
  5166.         dc.w    101,-8,305,50
  5167.         dc.w    HIGHNONE!ITEMENABLED
  5168.         dc.l    0,Logo,0
  5169.         dc.b    0,0
  5170.         dc.l    0
  5171.         dc.w    0
  5172.  
  5173. AboutSub2    dc.l    0
  5174.         dc.w    101,42,305,36
  5175.         dc.w    HIGHNONE!ITEMENABLED!ITEMTEXT
  5176.         dc.l    0,AbtSubNme1,0
  5177.         dc.b    0,0
  5178.         dc.l    0
  5179.         dc.w    0
  5180.  
  5181. AbtSubNme1    dc.b    0,1,0,0
  5182.         dc.w    29,2
  5183.         dc.l    NormText,AbtSubTxt1,AbtSubNme2
  5184. AbtSubTxt1    dc.b    "Copyright (c) 1991 David Kinder",0
  5185.         even
  5186.  
  5187. AbtSubNme2    dc.b    0,1,0,0
  5188.         dc.w    5,15
  5189.         dc.l    NormText,AbtSubTxt2,AbtSubNme3
  5190. AbtSubTxt2    dc.b    34,"And a thousand thousand slimy things",0
  5191.         even
  5192.  
  5193. AbtSubNme3    dc.b    0,1,0,0
  5194.         dc.w    13,24
  5195.         dc.l    NormText,AbtSubTxt3,0
  5196. AbtSubTxt3    dc.b    "Lived on; and so did I.",34,0
  5197.         even
  5198.  
  5199. NormText    dc.l    NormFont
  5200.         dc.w    8
  5201.         dc.b    0,0
  5202. NormFont    dc.b    "topaz.font",0
  5203.         even
  5204.  
  5205. ReqText        dc.b    0,1,0,0
  5206.         dc.w    9,7
  5207.         dc.l    NormText,ReqTxt,0
  5208. ReqTxt        dc.b    "Do you really want to quit?",0
  5209.         even
  5210.  
  5211. NSavText    dc.b    0,1,0,0
  5212.         dc.w    9,7
  5213.         dc.l    NormText,NSavTxt,0
  5214. NSavTxt        dc.b    "Not enough memory for save buffer!",0
  5215.         even
  5216.  
  5217. MNewText    dc.b    0,1,0,0
  5218.         dc.w    9,7
  5219.         dc.l    NormText,MNewTxt,0
  5220. MNewTxt        dc.b    "The current keymap will be lost. Are you sure?",0
  5221.         even
  5222.  
  5223. LReqText    dc.b    0,1,0,0
  5224.         dc.w    6,3
  5225.         dc.l    NormText,LReqTxt,0
  5226. LReqTxt        dc.b    "Yes",0
  5227.         even
  5228.  
  5229. RReqText    dc.b    0,1,0,0
  5230.         dc.w    6,3
  5231.         dc.l    NormText,RReqTxt,0
  5232. RReqTxt        dc.b    "No",0
  5233.         even
  5234.  
  5235. DoubleReq    dc.l    0
  5236.         dc.w    133,15,326,71,0,0
  5237.         dc.l    DblGadg1,DblBord1,DblText1
  5238.         dc.w    NOISYREQ
  5239.         dc.b    1,0
  5240.         dc.l    0
  5241.         ds.b    32
  5242.         dc.l    0,0
  5243.         ds.b    36
  5244.  
  5245. DblBord1    dc.w    0,0
  5246.         dc.b    2,0,0,6
  5247.         dc.l    DblAry1,DblBord2
  5248. DblAry1        dc.w    0,70,0,0,325,0,325,70,1,70,1,0
  5249.  
  5250. DblBord2    dc.w    0,0
  5251.         dc.b    2,0,0,2
  5252.         dc.l    DblAry2,DblBord3
  5253. DblAry2        dc.w    324,1,324,69
  5254.  
  5255. DblBord3    dc.w    131,31
  5256.         dc.b    2,0,0,6
  5257.         dc.l    DblAry3,DblBord4
  5258. DblAry3        dc.w    0,12,0,0,64,0,64,12,1,12,1,0
  5259.  
  5260. DblBord4    dc.w    131,31
  5261.         dc.b    2,0,0,2
  5262.         dc.l    DblAry4,0
  5263. DblAry4        dc.w    63,1,63,12
  5264.  
  5265. DblText1    dc.b    0,0,0,0
  5266.         dc.w    15,14
  5267.         dc.l    NormText,DblTxt1,DblText2
  5268. DblTxt1        dc.b    "Enter deadkey to be used on keyboard.",0
  5269.         even
  5270.  
  5271. DblText2    dc.b    0,0,0,0
  5272.         dc.w    47,34
  5273.         dc.l    NormText,DblTxt2,DblText3
  5274. DblTxt2        dc.b    "Deadkey:",0
  5275.         even
  5276.  
  5277. DblText3    dc.b    0,0,0,0
  5278.         dc.w    107,5
  5279.         dc.l    NormText,DblTxt3,0
  5280. DblTxt3        dc.b    "Select Deadkey",0
  5281.         even
  5282.  
  5283. DblGadg1    dc.l    DblGadg2
  5284.         dc.w    16,54,138,11
  5285.         dc.w    GADGHCOMP,RELVERIFY!ENDGADGET,BOOLGADGET!REQGADGET
  5286.         dc.l    DblGBord1,0,DblGText1,0,0
  5287.         dc.w    1
  5288.         dc.l    0
  5289. DblGText1    dc.b    0,0,0,0
  5290.         dc.w    5,2
  5291.         dc.l    NormText,DblGTxt1,0
  5292. DblGTxt1    dc.b    "Use this deadkey",0
  5293.         even
  5294.  
  5295. DblGadg2    dc.l    DblGadg3
  5296.         dc.w    172,54,138,11
  5297.         dc.w    GADGHCOMP,RELVERIFY!ENDGADGET,BOOLGADGET!REQGADGET
  5298.         dc.l    DblGBord1,0,DblGText2,0,0
  5299.         dc.w    2
  5300.         dc.l    0
  5301. DblGText2    dc.b    0,0,0,0
  5302.         dc.w    5,2
  5303.         dc.l    NormText,DblGTxt2,0
  5304. DblGTxt2    dc.b    "Cancel requester",0
  5305.         even
  5306.  
  5307. DblGadg3    dc.l    DblGadg4
  5308.         dc.w    260,32,50,11
  5309.         dc.w    GADGHCOMP,RELVERIFY,BOOLGADGET!REQGADGET
  5310.         dc.l    DblGBord3,0,DblGText3,0,0
  5311.         dc.w    3
  5312.         dc.l    0
  5313. DblGText3    dc.b    0,0,0,0
  5314.         dc.w    5,2
  5315.         dc.l    NormText,DblGTxt3,0
  5316. DblGTxt3    dc.b    "Clear",0
  5317.         even
  5318.  
  5319. DblGadg4    dc.l    0
  5320.         dc.w    130,32,1,1
  5321.         dc.w    GADGHNONE,RELVERIFY,BOOLGADGET!REQGADGET
  5322.         dc.l    0,0,DblGText4,0,0
  5323.         dc.w    0
  5324.         dc.l    0
  5325. DblGText4    dc.b    0,1,1,0
  5326.         dc.w    5,2
  5327.         dc.l    NormText,DblGTxt4,0
  5328. DblGTxt4    dc.b    "       ",0
  5329.         even
  5330.  
  5331. DblGBord1    dc.w    -2,-1
  5332.         dc.b    2,0,0,6
  5333.         dc.l    DblGAry1,DblGBord2
  5334. DblGAry1    dc.w    0,12,0,0,141,0,141,12,1,12,1,0
  5335.  
  5336. DblGBord2    dc.w    -2,-1
  5337.         dc.b    2,0,0,2
  5338.         dc.l    DblGAry2,0
  5339. DblGAry2    dc.w    140,0,140,11
  5340.  
  5341. DblGBord3    dc.w    -2,-1
  5342.         dc.b    2,0,0,6
  5343.         dc.l    DblGAry3,DblGBord4
  5344. DblGAry3    dc.w    0,12,0,0,53,0,53,12,1,12,1,0
  5345.  
  5346. DblGBord4    dc.w    -2,-1
  5347.         dc.b    2,0,0,2
  5348.         dc.l    DblGAry4,0
  5349. DblGAry4    dc.w    52,0,52,11
  5350.  
  5351. LoseReq        dc.l    0
  5352.         dc.w    103,15,365,71,0,0
  5353.         dc.l    LsGadg1,LsBord1,LoseText1
  5354.         dc.w    0
  5355.         dc.b    1,0
  5356.         dc.l    0
  5357.         ds.b    32
  5358.         dc.l    0,0
  5359.         ds.b    36
  5360.  
  5361. LsGadg1        dc.l    LsGadg2
  5362.         dc.w    72,32,56,11
  5363.         dc.w    GADGHCOMP!GADGIMAGE,TOGGLESELECT!RELVERIFY
  5364.         dc.w    BOOLGADGET!REQGADGET
  5365.         dc.l    Ls2,0,0,0,0
  5366.         dc.w    1
  5367.         dc.l    0
  5368.  
  5369. LsGadg2        dc.l    LsGadg3
  5370.         dc.w    72+58,32,56,11
  5371.         dc.w    GADGHCOMP!SELECTED,TOGGLESELECT!RELVERIFY
  5372.         dc.w    BOOLGADGET!REQGADGET
  5373.         dc.l    0,0,0,0,0
  5374.         dc.w    2
  5375.         dc.l    0
  5376.  
  5377. LsGadg3        dc.l    LsGadg4
  5378.         dc.w    72+116,32,56,11
  5379.         dc.w    GADGHCOMP,TOGGLESELECT!RELVERIFY
  5380.         dc.w    BOOLGADGET!REQGADGET
  5381.         dc.l    0,0,0,0,0
  5382.         dc.w    3
  5383.         dc.l    0
  5384.  
  5385. LsGadg4        dc.l    LsGadg5
  5386.         dc.w    11,54,74,11
  5387.         dc.w    GADGHCOMP!GADGIMAGE,RELVERIFY!ENDGADGET
  5388.         dc.w    BOOLGADGET!REQGADGET
  5389.         dc.l    Ls1,0,0,0,0
  5390.         dc.w    4
  5391.         dc.l    0
  5392.  
  5393. LsGadg5        dc.l    0
  5394.         dc.w    166,54,186,11
  5395.         dc.w    GADGHCOMP,RELVERIFY!ENDGADGET,BOOLGADGET!REQGADGET
  5396.         dc.l    LsGBord1,0,LsGText5,0,0
  5397.         dc.w    5
  5398.         dc.l    0
  5399. LsGText5    dc.b    0,0,0,0
  5400.         dc.w    5,2
  5401.         dc.l    NormText,LsGTxt5,0
  5402. LsGTxt5        dc.b    "Forget the whole thing",0
  5403.         even
  5404.  
  5405. LsGBord1    dc.w    -2,-1
  5406.         dc.b    2,0,0,6
  5407.         dc.l    LsGAry1,LsGBord2
  5408. LsGAry1        dc.w    0,12,0,0,189,0,189,12,1,12,1,0
  5409.  
  5410. LsGBord2    dc.w    -2,-1
  5411.         dc.b    2,0,0,2
  5412.         dc.l    LsGAry2,0
  5413. LsGAry2        dc.w    188,0,188,11
  5414.  
  5415. LsBord1        dc.w    0,0
  5416.         dc.b    2,0,0,6
  5417.         dc.l    LsAry1,LsBord2
  5418. LsAry1        dc.w    0,70,0,0,364,0,364,70,1,70,1,0
  5419.  
  5420. LsBord2        dc.w    0,0
  5421.         dc.b    2,0,0,2
  5422.         dc.l    LsAry2,0
  5423. LsAry2        dc.w    363,1,363,69
  5424.  
  5425. LoseText1    dc.b    0,0,0,0
  5426.         dc.w    47,5
  5427.         dc.l    NormText,LoseTxt1,LoseText2
  5428. LoseTxt1    dc.b    "Some key definitions must be lost.",0
  5429.         even
  5430.  
  5431. LoseText2    dc.b    0,0,0,0
  5432.         dc.w    7,14
  5433.         dc.l    NormText,LoseTxt2,LoseText3
  5434. LoseTxt2    dc.b    "Select type to loose then click on Complete.",0
  5435.         even
  5436.  
  5437. LoseText3    dc.b    0,0,0,0
  5438.         dc.w    23,34
  5439.         dc.l    NormText,LoseTxt3,0
  5440. LoseTxt3    dc.b    "Loose                        definitions",0
  5441.         even
  5442.  
  5443. HlpText1    dc.b    0,0,0,0
  5444.         dc.w    9,7
  5445.         dc.l    NormText,HlpTxt1,HlpText2
  5446. HlpTxt1        dc.b    "EditKeys allows you to edit keymap files, which"
  5447.         dc.b    " control what",0
  5448.         even
  5449.  
  5450. HlpText2    dc.b    0,0,0,0
  5451.         dc.w    9,16
  5452.         dc.l    NormText,HlpTxt2,HlpText3
  5453. HlpTxt2        dc.b    "programs 'see' when a key is depressed.  To learn"
  5454.         dc.b    " more about",0
  5455.         even
  5456.  
  5457. HlpText3    dc.b    0,0,0,0
  5458.         dc.w    9,25
  5459.         dc.l    NormText,HlpTxt3,0
  5460. HlpTxt3        dc.b    "keymaps and this program, read the text file"
  5461.         dc.b    " 'EditKeys.Doc'.",0
  5462.         even
  5463.  
  5464. IntName        INTNAME
  5465. GrafName    GRAFNAME
  5466. DosName        DOSNAME
  5467. AslLibName    AslName
  5468. WBName        dc.b    "workbench.library",0
  5469.         even
  5470. ArpName        dc.b    "arp.library",0
  5471.         even
  5472.  
  5473. ArpFileReq    dc.l    fr_LHail,fr_File,fr_Dir,0
  5474.         dc.b    0,0
  5475.         dc.l    0,0
  5476. fr_LHail    dc.b    "Load Keymap",0
  5477.         even
  5478. fr_SHail    dc.b    "Save Keymap",0
  5479.         even
  5480. fr_Dir        dc.b    "DEVS:keymaps"
  5481.         ds.b    64-12
  5482. PathName    dc.b    "DEVS:keymaps/"
  5483.         ds.b    128-13
  5484.         even
  5485.  
  5486. xDir        dc.l    fr_Dir
  5487. xFile        dc.l    fr_File
  5488.  
  5489. LoadTags    dc.l    ASL_Hail,fr_LHail,ASL_Dir,fr_Dir,TAG_DONE
  5490. SaveTags    dc.l    ASL_Hail,fr_SHail,ASL_FuncFlags,FILF_SAVE
  5491.         dc.l    ASL_Dir,fr_Dir,TAG_DONE
  5492.  
  5493. FileErr1    dc.b    27,"[0m",27,"[1m",27,"[33mEditKeys v1.2",10,10
  5494.         dc.b    27,"[0mCould not load ",34
  5495. FileErr1End    even
  5496.  
  5497. FileErr2    dc.b    34,10
  5498. FileErr2End    even
  5499.  
  5500. IntgErr1    dc.b    27,"[0m",27,"[1m",27,"[33mEditKeys v1.2",10,10
  5501.         dc.b    27,"[0m",34
  5502. IntgErr1End    even
  5503.  
  5504. IntgErr2    dc.b    34," is not a valid keymap!",10
  5505. IntgErr2End    even
  5506.  
  5507. NoArpErr    dc.b    0,1,0,0
  5508.         dc.w    9,16
  5509.         dc.l    NormText,NoArpTxt,NArp1
  5510. NoArpTxt    dc.b    "Error: Could not open arp.library.",0
  5511.         even
  5512. NArp1        dc.b    2,1,0,0
  5513.         dc.w    9,27
  5514.         dc.l    NormText,NArp1T,NArp2
  5515. NArp1T        dc.b    "Run 'CopyArp' or copy arp.library",0
  5516.         even
  5517. NArp2        dc.b    2,1,0,0
  5518.         dc.w    9,36
  5519.         dc.l    NormText,NArp2T,NArp3
  5520. NArp2T        dc.b    "to the 'libs' directory of your",0
  5521.         even
  5522. NArp3        dc.b    2,1,0,0
  5523.         dc.w    9,45
  5524.         dc.l    NormText,NArp3T,KeyHeadText
  5525. NArp3T        dc.b    "boot disk.",0
  5526.         even
  5527.  
  5528. WBNoFile    dc.b    0,1,0,0
  5529.         dc.w    9,16
  5530.         dc.l    NormText,NoFileTxt,KeyHeadText
  5531. NoFileTxt    dc.b    "Error: Could not load specified keymap.",0
  5532.         even
  5533.  
  5534. WBFaultFile    dc.b    0,1,0,0
  5535.         dc.w    9,16
  5536.         dc.l    NormText,FaultFileTxt,KeyHeadText
  5537. FaultFileTxt    dc.b    "Error: Specified file is not a keymap.",0
  5538.         even
  5539.  
  5540. KeyHeadText    dc.b    3,1,0,0
  5541.         dc.w    9,5
  5542.         dc.l    BoldText,KeyHeadTxt,0
  5543. KeyHeadTxt    dc.b    "EditKeys v1.2",0
  5544.         even
  5545.  
  5546. BoldText    dc.l    NormFont
  5547.         dc.w    8
  5548.         dc.b    FSF_BOLD,0
  5549.  
  5550. AbortText    dc.b    0,1,0,0
  5551.         dc.w    6,3
  5552.         dc.l    NormText,AbortTxt,0
  5553. AbortTxt    dc.b    "Abort",0
  5554.         even
  5555.  
  5556. Par_Help    dc.b    27,"[0m",27,"[1m",27,"[33mEditKeys v1.2",10
  5557.         dc.b    27,"[0m© 1991 by David Kinder",10,10
  5558.         dc.b    "Format: EditKeys [<keymap>] [NOMAP]",10
  5559. Par_Modify    dc.b    0
  5560. Par_Temp    dc.b    "KEYMAP,NOMAP/S",0
  5561.         even
  5562.  
  5563. OpenErr1    dc.b    0,1,0,0
  5564.         dc.w    9,7
  5565.         dc.l    NormText,NoFileTxt,0
  5566.  
  5567. OpenErr2    dc.b    0,1,0,0
  5568.         dc.w    9,7
  5569.         dc.l    NormText,FaultFileTxt,0
  5570.  
  5571. OpenSErr    dc.b    0,1,0,0
  5572.         dc.w    9,7
  5573.         dc.l    NormText,OpSTxt,0
  5574. OpSTxt        dc.b    "Cannot open keymap for saving.",0
  5575.         even
  5576.  
  5577. ContText    dc.b    0,1,0,0
  5578.         dc.w    6,3
  5579.         dc.l    NormText,ContTxt,0
  5580. ContTxt        dc.b    "Continue",0
  5581.         even
  5582.  
  5583. DeadQuest    dc.b    0,1,0,0
  5584.         dc.w    9,7
  5585.         dc.l    NormText,DQTxt1,DeadQuest2
  5586. DQTxt1        dc.b    "This physical key already has a deadkey definition.",0
  5587.         even
  5588.  
  5589. DeadQuest2    dc.b    0,1,0,0
  5590.         dc.w    9,16
  5591.         dc.l    NormText,DQTxt2,0
  5592. DQTxt2        dc.b    "Do you wish the new deadkey to be the same?",0
  5593.         even
  5594.  
  5595. VanText        dc.b    0,1,0,0
  5596.         dc.w    9,7
  5597.         dc.l    NormText,VanTxt,VanText2
  5598. VanTxt        dc.b    "This key is undefined for the CTRL qualifier.",0
  5599.         even
  5600.  
  5601. VanText2    dc.b    0,1,0,0
  5602.         dc.w    9,16
  5603.         dc.l    NormText,VanTxt2,0
  5604. VanTxt2        dc.b    "What effect should CTRL have on this key?",0
  5605.         even
  5606.  
  5607. VanPos        dc.b    0,1,0,0
  5608.         dc.w    6,3
  5609.         dc.l    NormText,VanPTxt,0
  5610. VanPTxt        dc.b    "Clear bits 5&6",0
  5611.         even
  5612.  
  5613. VanNeg        dc.b    0,1,0,0
  5614.         dc.w    6,3
  5615.         dc.l    NormText,VanNTxt,0
  5616. VanNTxt        dc.b    "None",0
  5617.         even
  5618.  
  5619. EdText        dc.b    0,1,0,0
  5620.         dc.w    9,7
  5621.         dc.l    NormText,EdTxt,EdText2
  5622. EdTxt        dc.b    "This key cannot be uniquely defined"
  5623.         even
  5624.  
  5625. EdText2        dc.b    0,1,0,0
  5626.         dc.w    9,16
  5627.         dc.l    NormText,EdTxt2,0
  5628. EdTxt2        dc.b    "without losing other definitions.",0
  5629.         even
  5630.  
  5631. EdPos        dc.b    0,1,0,0
  5632.         dc.w    6,3
  5633.         dc.l    NormText,EdPTxt,0
  5634. EdPTxt        dc.b    "Modify key",0
  5635.         even
  5636.  
  5637. NoEdText    dc.b    0,1,0,0
  5638.         dc.w    9,7
  5639.         dc.l    NormText,NoEdTxt,0
  5640. NoEdTxt        dc.b    "This key cannot be uniquely defined.",0
  5641.         even
  5642.  
  5643. ZapText1    dc.b    0,1,0,0
  5644.         dc.w    9,7
  5645.         dc.l    NormText,ZapTxt1,ZapText2
  5646. ZapTxt1        dc.b    "I could convert this key from STRING to NORMAL,",0
  5647.         even
  5648.  
  5649. ZapText2    dc.b    0,1,0,0
  5650.         dc.w    9,16
  5651.         dc.l    NormText,ZapTxt2,ZapText3
  5652. ZapTxt2        dc.b    "but I'll have to zap the CONTROL definitions...",0
  5653.         even
  5654.  
  5655. ZapText3    dc.b    0,1,0,0
  5656.         dc.w    9,25
  5657.         dc.l    NormText,ZapTxt3,0
  5658. ZapTxt3        dc.b    "What should I do?",0
  5659.         even
  5660.  
  5661. ZapNo        dc.b    0,1,0,0
  5662.         dc.w    6,3
  5663.         dc.l    NormText,ZapNoTxt,0
  5664. ZapNoTxt    dc.b    "Forget it",0
  5665.         even
  5666.  
  5667. NoDeadSText    dc.b    0,1,0,0
  5668.         dc.w    9,7
  5669.         dc.l    NormText,NoDeadSTxt,0
  5670. NoDeadSTxt    dc.b    "This physical key cannot accept strings.",0
  5671.         even
  5672.  
  5673. SoM        dc.b    "The Sisters of Mercy",0
  5674.         even
  5675. SoM1        dc.b    2,1,0,0
  5676.         dc.w    9,7
  5677.         dc.l    NormText,SoM1T,SoM2
  5678. SoM1T        dc.b    34,"I hear the roar of a big machine",0
  5679.         even
  5680. SoM2        dc.b    2,1,0,0
  5681.         dc.w    17,16
  5682.         dc.l    NormText,SoM2T,SoM3
  5683. SoM2T        dc.b    "Two worlds and in between",0
  5684.         even
  5685. SoM3        dc.b    2,1,0,0
  5686.         dc.w    17,25
  5687.         dc.l    NormText,SoM3T,SoM4
  5688. SoM3T        dc.b    "Love lost, fire at will",0
  5689.         even
  5690. SoM4        dc.b    2,1,0,0
  5691.         dc.w    17,34
  5692.         dc.l    NormText,SoM4T,SoM5
  5693. SoM4T        dc.b    "Dum-dum bullets and shoot to kill, I hear",0
  5694.         even
  5695. SoM5        dc.b    2,1,0,0
  5696.         dc.w    17,43
  5697.         dc.l    NormText,SoM5T,SoM6
  5698. SoM5T        dc.b    "Dive, bombers, and",0
  5699.         even
  5700. SoM6        dc.b    2,1,0,0
  5701.         dc.w    17,52
  5702.         dc.l    NormText,SoM6T,SoM7
  5703. SoM6T        dc.b    "Empire down",0
  5704.         even
  5705. SoM7        dc.b    2,1,0,0
  5706.         dc.w    17,61
  5707.         dc.l    NormText,SoM7T,0
  5708. SoM7T        dc.b    "Empire down",34,0
  5709.         even
  5710. LucText        dc.b    0,1,0,0
  5711.         dc.w    6,3
  5712.         dc.l    NormText,LucTxt,0
  5713. LucTxt        dc.b    "Lucretia",0
  5714.         even
  5715.  
  5716. WBTxt        dc.b    "EditKeys",0
  5717.         even
  5718.  
  5719. KeysToMap    dc.l    Gadg12,Gadg13,Gadg14,Gadg15,Gadg16,Gadg17,Gadg18,Gadg19
  5720.         dc.l    Gadg20,Gadg21,Gadg22,Gadg23,Gadg24,Gadg25,0,Gadg84
  5721.         dc.l    Gadg34,Gadg35,Gadg36,Gadg37,Gadg38,Gadg39,Gadg40,Gadg41
  5722.         dc.l    Gadg42,Gadg43,Gadg44,Gadg45,0,Gadg80,Gadg81,Gadg82
  5723.         dc.l    Gadg51,Gadg52,Gadg53,Gadg54,Gadg55,Gadg56,Gadg57,Gadg58
  5724.         dc.l    Gadg59,Gadg60,Gadg61,Gadg87,0,Gadg63,Gadg64,Gadg65
  5725.         dc.l    Gadg88,Gadg67,Gadg68,Gadg69,Gadg70,Gadg71,Gadg72,Gadg73
  5726.         dc.l    Gadg74,Gadg75,Gadg76,0,Gadg85,Gadg47,Gadg48,Gadg49
  5727.         dc.l    Gadg83,Gadg26,Gadg33,Gadg86,Gadg46,Gadg01,Gadg27,0
  5728.         dc.l    0,0,Gadg50,0,Gadg62,Gadg78,Gadg79,Gadg77
  5729.         dc.l    Gadg02,Gadg03,Gadg04,Gadg05,Gadg06,Gadg07,Gadg08,Gadg09
  5730.         dc.l    Gadg10,Gadg11,Gadg29,Gadg30,Gadg31,Gadg32,Gadg66,Gadg28
  5731.  
  5732. MapToKeys    dc.b    $45,$50,$51,$52,$53,$54,$55,$56
  5733.         dc.b    $57,$58,$59,$00,$01,$02,$03,$04
  5734.         dc.b    $05,$06,$07,$08,$09,$0a,$0b,$0c
  5735.         dc.b    $0d,$41,$46,$5f,$5a,$5b,$5c,$5d
  5736.         dc.b    $42,$10,$11,$12,$13,$14,$15,$16
  5737.         dc.b    $17,$18,$19,$1a,$1b,$44,$3d,$3e
  5738.         dc.b    $3f,$4a,$20,$21,$22,$23,$24,$25
  5739.         dc.b    $26,$27,$28,$29,$2a,$4c,$2d,$2e
  5740.         dc.b    $2f,$5e,$31,$32,$33,$34,$35,$36
  5741.         dc.b    $37,$38,$39,$3a,$4f,$4d,$4e,$1d
  5742.         dc.b    $1e,$1f,$40,$0f,$3c,$43,$2b,$30
  5743.  
  5744. IDtoGadget    dc.l    0,0,0,0,0,0,0,0
  5745.         dc.l    0,0,0,0,Gadg13,Gadg14,Gadg15,Gadg16
  5746.         dc.l    Gadg17,Gadg18,Gadg19,Gadg20,Gadg21,Gadg22,Gadg23,Gadg24
  5747.         dc.l    Gadg25,0,0,0,Gadg29,Gadg30,Gadg31,Gadg32
  5748.         dc.l    0,Gadg34,Gadg35,Gadg36,Gadg37,Gadg38,Gadg39,Gadg40
  5749.         dc.l    Gadg41,Gadg42,Gadg43,Gadg44,Gadg45,0,Gadg47,Gadg48
  5750.         dc.l    Gadg49,Gadg50,Gadg51,Gadg52,Gadg53,Gadg54,Gadg55,Gadg56
  5751.         dc.l    Gadg57,Gadg58,Gadg59,Gadg60,Gadg61,0,Gadg63,Gadg64
  5752.         dc.l    Gadg65,Gadg66,Gadg67,Gadg68,Gadg69,Gadg70,Gadg71,Gadg72
  5753.         dc.l    Gadg73,Gadg74,Gadg75,Gadg76,0,0,0,Gadg80
  5754.         dc.l    Gadg81,Gadg82,0,0,Gadg85,0,Gadg87,Gadg88
  5755.  
  5756. DeadIDtoGadg    dc.l    Gadg01,Gadg02,Gadg03,Gadg04,Gadg05,Gadg06,Gadg07,Gadg08
  5757.         dc.l    Gadg09,Gadg10,Gadg11,Gadg12,Gadg13,Gadg14,Gadg15,Gadg16
  5758.         dc.l    Gadg17,Gadg18,Gadg19,Gadg20,Gadg21,Gadg22,Gadg23,Gadg24
  5759.         dc.l    Gadg25,Gadg26,Gadg27,Gadg28,Gadg29,Gadg30,Gadg31,Gadg32
  5760.         dc.l    Gadg33,Gadg34,Gadg35,Gadg36,Gadg37,Gadg38,Gadg39,Gadg40
  5761.         dc.l    Gadg41,Gadg42,Gadg43,Gadg44,Gadg45,Gadg46,Gadg47,Gadg48
  5762.         dc.l    Gadg49,Gadg50,Gadg51,Gadg52,Gadg53,Gadg54,Gadg55,Gadg56
  5763.         dc.l    Gadg57,Gadg58,Gadg59,Gadg60,Gadg61,Gadg62,Gadg63,Gadg64
  5764.         dc.l    Gadg65,Gadg66,Gadg67,Gadg68,Gadg69,Gadg70,Gadg71,Gadg72
  5765.         dc.l    Gadg73,Gadg74,Gadg75,Gadg76,Gadg77,Gadg78,Gadg79,Gadg80
  5766.         dc.l    Gadg81,Gadg82,Gadg83,Gadg84,Gadg85,Gadg86,Gadg87,Gadg88
  5767.  
  5768. Tab___        dc.b    0,0,0,0,0,0,0,0
  5769. TabS__        dc.b    0,1,0,1,0,1,0,1
  5770. Tab_A_        dc.b    0,0,1,2,0,0,1,2
  5771. Tab__C        dc.b    0,0,0,0,1,2,2,-1
  5772. TabSA_        dc.b    0,1,1,3,0,1,1,3
  5773. Tab_AC        dc.b    0,0,1,2,1,2,3,-1
  5774. TabS_C        dc.b    0,1,0,1,1,3,2,-1
  5775. TabSAC        dc.b    0,1,1,3,1,3,3,-1
  5776.  
  5777. QualTable    dc.l    Tab___,Tab__C,TabS__,TabS_C
  5778.         dc.l    Tab_A_,Tab_AC,TabSA_,TabSAC
  5779.  
  5780. DTab___        dc.b    0,0,0,0,0,0,0,0
  5781. DTab_A_        dc.b    0,0,2,4,0,0,2,4
  5782. DTab__C        dc.b    0,0,0,0,2,4,4,8
  5783. DTabS__        dc.b    0,2,0,2,0,2,0,2
  5784. DTab_AC        dc.b    0,0,2,4,2,4,6,12
  5785. DTabSA_        dc.b    0,2,2,6,0,2,2,6
  5786. DTabS_C        dc.b    0,2,0,2,2,6,4,10
  5787. DTabSAC        dc.b    0,2,2,6,2,6,6,14
  5788.  
  5789. DQualTab    dc.l    DTab___,DTab__C,DTabS__,DTabS_C
  5790.         dc.l    DTab_A_,DTab_AC,DTabSA_,DTabSAC
  5791.  
  5792. CheckTab    dc.b    0,8,2,10,4,12,6,14
  5793.  
  5794. On_Value    dc.w    GADGHCOMP!GADGIMAGE!SELECTED
  5795.  
  5796. KeyTab1        dc.b    $40,$41,$42,$43,$44,$45,$46,$4c,$4d,$4e,$4f,$50,$51
  5797.         dc.b    $52,$53,$54,$55,$56,$57,$58,$59,$5f
  5798. KeyTab1End    even
  5799. KeyTab2        dc.b    "Spc","Bck","Tab","Ent","Ret","Esc","Del","Up ","Dwn"
  5800.         dc.b    "Rgt","Lft","F1 ","F2 ","F3 ","F4 ","F5 ","F6 ","F7 "
  5801.         dc.b    "F8 ","F9 ","F10","Hlp"
  5802.         even
  5803.  
  5804. MyMode        dc.b    1,0
  5805. LastGadgVal    dc.l    -1
  5806. KeyTypes    dcb.b    96,KCF_NOP
  5807.  
  5808.         section    BSS,BSS
  5809.  
  5810. DeadIndex    ds.b    4096
  5811. StringArea    ds.b    8192
  5812.  
  5813. fr_File        ds.b    64
  5814. StringBuf    ds.b    34
  5815. SavePath    ds.b    128
  5816. ArgBuf        ds.b    128
  5817.  
  5818. CapsTab        ds.b    96
  5819. ReptTab        ds.b    96
  5820. UseDead        ds.b    16
  5821. ModIndex    ds.b    256
  5822. StringList    ds.b    832
  5823. DeadTab        ds.w    768
  5824. KeyDefs        ds.l    96
  5825.  
  5826. _IntuitionBase    ds.l    1
  5827. _GfxBase    ds.l    1
  5828. _DOSBase    ds.l    1
  5829. _AslBase    ds.l    1
  5830. _WorkbenchBase    ds.l    1
  5831.  
  5832. ReturnMsg    ds.l    1
  5833. Windowhd    ds.l    1
  5834. UserPort    ds.l    1
  5835. RPort        ds.l    1
  5836. MySegment    ds.l    1
  5837. NoDeadStore    ds.l    1
  5838. DeadStore    ds.l    1
  5839. MyDefKey    ds.l    1
  5840. SaveBuffer    ds.l    1
  5841. SaveBuffer2    ds.l    1
  5842. SaveDeadBuf1    ds.l    1
  5843. SaveDeadBuf2    ds.l    1
  5844. LastQualVal    ds.l    1
  5845. AslFReq        ds.l    1
  5846. MyWBPort    ds.l    1
  5847. Par_Arry    ds.l    2
  5848. Parms        ds.l    2
  5849. MD_DeadTab    ds.w    1
  5850. MD_DTbPos    ds.w    1
  5851. OldDeadOff    ds.w    1
  5852. MyNewKey    ds.w    1
  5853. StringNow    ds.w    1
  5854. ErrResponse    ds.b    1
  5855. ModifyIndex    ds.b    1
  5856. DeadByte    ds.b    1
  5857. MyDefQual    ds.b    1
  5858. MD_Index    ds.b    1
  5859. MD_KeyType    ds.b    1
  5860. MD_GadgNo    ds.b    1
  5861. DeadNo        ds.b    1
  5862. ModNo        ds.b    1
  5863. ChQVal        ds.b    1
  5864. CurrDKey    ds.b    1
  5865. DCurrDKey    ds.b    1
  5866. SisTst        ds.b    1
  5867. OS2        ds.b    1
  5868. Quest        ds.b    1
  5869.