home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 8 / FreshFishVol8-CD2.bin / bbs / dev / ssl-4.1.lha / SSL / SSLExamp / KeyRes.asm < prev    next >
Assembly Source File  |  1993-12-21  |  8KB  |  449 lines

  1. ; Keymap Resourcer
  2. ; (c) 1993 MJSoft System Software
  3. ; Martin Mares
  4.  
  5. ;    opt    x+
  6.  
  7.     include    "ssmac.h"
  8.  
  9.     tbase    a4
  10.     clistart
  11.  
  12.     writeln    <Keymap Resourcer 1.0, (c) 1993 MJSoft System Software>
  13.  
  14.     dtl    <keymap.resource>,a1
  15.     call    exec,OpenResource
  16.     tst.l    d0
  17.     beq.s    keyload
  18.     move.l    d0,a0
  19.     call    Forbid
  20.     lea    14(a0),a0
  21.     get.l    from,a1
  22.     call    FindName
  23.     call    Permit
  24.     tst.l    d0
  25.     bne.s    keymok
  26.  
  27. keyload    get.l    from,d1
  28.     call    dos,LoadSeg
  29.     dv.l    myseg
  30.     put.l    d0,myseg
  31.     bne.s    segok
  32.     dtl    <Unable to load %s>,a0
  33.     geta    from,a1
  34.     jump    ss,ExitError
  35.  
  36. segok    add.l    d0,d0
  37.     add.l    d0,d0
  38.     addq.l    #4,d0
  39. keymok    put.l    d0,keymap
  40.  
  41.     dv.l    keymap
  42.     dbuf    destname,80
  43.  
  44.     move.l    d0,a0
  45.     move.l    10(a0),a2        ; Keymap name
  46.     get.l    to,a0
  47.     move.l    a0,d0
  48.     bne.s    makedest
  49.     move.l    a2,a0
  50. makedest    geta    destname,a1
  51.     push    a1
  52.     push    a2
  53.     dtl    <kms>,a2
  54.     moveq    #80,d0
  55.     call    ss,AddExtension
  56.  
  57.     geta    destname,a0
  58.     move.l    #1006,d0
  59.     call    ss,TrackOpen    ; Errors are filtered out by SSLib
  60.     put.l    d0,destfh
  61.     dv.l    destfh
  62.  
  63. opendest2    dtl.l    <Resourcing %s to %s.>,a0
  64.     move.l    sp,a1
  65.     call    Printf
  66.     addq.l    #8,sp
  67.  
  68.     moveq    #0,d7            ; Estimate number of dead keys
  69.     moveq    #0,d5
  70.     get.l    keymap,a0
  71.     lea    14(a0),a0
  72.     moveq    #$3f,d6
  73.     bsr    analyse
  74.     get.l    keymap,a0
  75.     lea    30(a0),a0
  76.     moveq    #$27,d6
  77.     bsr    analyse
  78.     add.l    d5,d7
  79.     put.l    d7,maxdead
  80.     dv.l    maxdead
  81.  
  82.     get.l    keymap,a0        ; Resource the keymap
  83.     lea    keytab0(pc),a2
  84.     lea    14(a0),a0
  85.     bsr.s    resource
  86.     get.l    keymap,a0
  87.     lea    keytab1(pc),a2
  88.     lea    30(a0),a0
  89.     bsr.s    resource
  90.  
  91.     rts
  92.  
  93. cleanup    get.l    myseg,d1
  94.     beq.s    .segment
  95.     call    dos,UnLoadSeg
  96. .segment    rts
  97.  
  98. ; A0=keymap structure, A2=key list
  99.  
  100. resource    move.l    (a0)+,a1        ; A1=types
  101.     move.l    (a0)+,a3        ; A3=keymap
  102.     move.l    (a0)+,d2        ; D2=capsability
  103.     move.l    (a0)+,d3        ; D3=repeatability
  104.     get.l    destfh,d7        ; D7=dest file handle
  105.     moveq    #0,d1            ; D1=bit number
  106. reskey    call    ss,TestBreak
  107.     tst.b    (a2)
  108.     beq    resend
  109.     move.b    (a1)+,d4        ; D4=key flags
  110.     sub.l    a0,a0
  111.     btst    d1,0(a0,d2.l)
  112.     sne    d6            ; D6=is capsable
  113.     btst    d1,0(a0,d3.l)
  114.     sne    d5            ; D5=is repeatable
  115.     addq.b    #1,d1
  116.     bclr    #3,d1
  117.     beq.s    resloop1
  118.     addq.l    #1,d3
  119.     addq.l    #1,d2
  120. resloop1    btst    #7,d4            ; Is it a NOP key ?
  121.     bne    resskip
  122.     mpush    d1-d3/a1/a3
  123.  
  124.     dtl    <DEAD >,a0        ; Key type
  125.     btst    #5,d4
  126.     bne.s    restype
  127.     dtl    <STRING >,a0
  128.     btst    #6,d4
  129.     beq.s    restype1
  130. restype    bsr    putsit
  131.  
  132. restype1    dtl    <KEY >,a0        ; Key header
  133.     bsr    putsit
  134.     move.l    a2,a0
  135.     bsr    putsit
  136.     btst    #2,d4            ; CTRL
  137.     beq.s    resctrl
  138.     dtl    < CTRL>,a0
  139.     bsr    putsit
  140. resctrl    btst    #1,d4            ; ALT
  141.     beq.s    resalt
  142.     dtl    < ALT>,a0
  143.     bsr    putsit
  144. resalt    btst    #0,d4            ; SHIFT
  145.     beq.s    resshift
  146.     dtl    < SHIFT>,a0
  147.     bsr    putsit
  148. resshift    tst.b    d6            ; Capsability
  149.     beq.s    rescaps
  150.     dtl    < CAPS>,a0
  151.     bsr    putsit
  152. rescaps    tst.b    d5            ; Repeatability
  153.     bne.s    resrep
  154.     dtl    < NOREP>,a0
  155.     bsr    putsit
  156. resrep    btst    #4,d4            ; DownUp flag
  157.     beq.s    resdoup
  158.     dtl    < DOWNUP>,a0
  159.     bsr    putsit
  160. resdoup    bsr    newlin            ; End of header
  161.  
  162.     not.b    d4
  163.     btst    #5,d4
  164.     beq.s    resdead
  165.     btst    #6,d4
  166.     beq    resstring
  167.  
  168.     addq.l    #4,a3            ; Normal key
  169.     moveq    #0,d3            ; D3=counter of meanings
  170.     btst    #0,d4
  171.     bne.s    norm_loop
  172.     btst    #1,d4
  173.     bne.s    norm_loop
  174.     bset    #2,d4
  175. norm_loop    move.b    d3,d0
  176.     and.b    d4,d0
  177.     bne.s    norm_next
  178.     move.b    -(a3),d2
  179.     beq.s    norm_next
  180.     bsr    shipattr
  181.     move.b    d2,d0
  182.     bsr    shipcode
  183.     bsr    newlin
  184. norm_next    addq.b    #1,d3
  185.     cmp.b    #8,d3
  186.     bcs.s    norm_loop
  187.     bra    reskend
  188.  
  189. ; Dead/Modified key
  190.  
  191. resdead    moveq    #0,d3            ; D3=counter of meanings
  192.     move.l    (a3),a3
  193.     move.l    a3,a0
  194. dead_loop    move.b    d3,d0
  195.     and.b    d4,d0
  196.     bne.s    dead_next2
  197.     move.b    (a0)+,d0
  198.     moveq    #0,d2
  199.     move.b    (a0)+,d2
  200.     push    a0
  201.     btst    #3,d0
  202.     bne.s    dead_dead
  203.     btst    #0,d0
  204.     bne.s    dead_mod
  205.     tst.b    d2
  206.     beq.s    dead_next
  207.     bsr    shipattr
  208.     move.b    d2,d0
  209.     bsr    shipcode
  210. dead_line    bsr    newlin
  211. dead_next    pop    a0
  212. dead_next2    addq.b    #1,d3
  213.     cmp.b    #8,d3
  214.     bcs.s    dead_loop
  215.     bra    reskend
  216.  
  217. dead_dead    bsr    shipattr
  218.     dtl    <PREFIX >,a0
  219.     bsr    putsit
  220.     move.b    d2,d0
  221.     and.b    #$0F,d0
  222.     bsr    shipcode
  223.     lsr.b    #4,d2
  224.     beq.s    1$
  225.     moveq    #',',d0
  226.     bsr    putcit
  227.     move.b    d2,d0
  228.     bsr    shipcode
  229. 1$    bra.s    dead_line
  230.  
  231. dead_mod    bsr    shipattr
  232.     dtl    <MOD >,a0
  233.     bsr.s    putsit
  234.     lea    0(a3,d2.w),a0
  235.     get.l    maxdead,d2
  236.     bra.s    dead_mod_2
  237. dead_mod_1    move.b    (a0)+,d0
  238.     push    a0
  239.     bsr    shipcode
  240.     moveq    #',',d0
  241.     bsr.s    putcit
  242.     pop    a0
  243. dead_mod_2    dbra    d2,dead_mod_1
  244.     move.b    (a0)+,d0
  245.     bsr    shipcode
  246.     bra.s    dead_line
  247.  
  248. ; String key
  249.  
  250. resstring    moveq    #0,d3            ; D3=counter of meanings
  251.     move.l    (a3),a3
  252.     move.l    a3,a0
  253. string_loop    move.b    d3,d0
  254.     and.b    d4,d0
  255.     bne.s    string_next
  256.     move.b    (a0)+,d2
  257.     moveq    #0,d0
  258.     move.b    (a0)+,d0
  259.     tst.b    d2
  260.     beq.s    string_next
  261.     push    a0
  262.     pea    0(a3,d0.w)
  263.     bsr.s    shipattr
  264.     moveq    #'"',d0
  265.     bsr.s    putcit
  266.     pop    a0
  267. string_str    move.b    (a0)+,d0
  268.     push    a0
  269.     bsr    putcstr
  270.     pop    a0
  271.     subq.b    #1,d2
  272.     bne.s    string_str
  273.     moveq    #'"',d0
  274.     bsr.s    putcit
  275.     bsr.s    newlin
  276.     pop    a0
  277. string_next    addq.b    #1,d3
  278.     cmp.b    #8,d3
  279.     bcs.s    string_loop
  280.  
  281. reskend    bsr.s    newlin
  282.     mpop    d1-d3/a1/a3
  283. resskip    tst.b    (a2)+
  284.     bne.s    resskip
  285.     addq.l    #4,a3
  286.     bra    reskey
  287.  
  288. resend    rts
  289.  
  290. newlin    dtl    <',10,'>,a0
  291. putsit    move.l    d7,d1
  292.     push    d2
  293.     move.l    a0,d2
  294.     call    dos,FPuts
  295.     pop    d2
  296.     rts
  297.  
  298. putcit    push    d2
  299.     move.l    d7,d1
  300.     move.l    d0,d2
  301.     call    dos,FPutC
  302.     pop    d2
  303.     rts
  304.  
  305. ; D3=key meaning attribute
  306.  
  307. shipattr    btst    #2,d3
  308.     beq.s    sat_ctrl
  309.     dtl    <CTRL >,a0
  310.     bsr.s    putsit
  311. sat_ctrl    btst    #1,d3
  312.     beq.s    sat_alt
  313.     dtl    <ALT >,a0
  314.     bsr.s    putsit
  315. sat_alt    btst    #0,d3
  316.     beq.s    sat_shift
  317.     dtl    <SHIFT >,a0
  318.     bsr.s    putsit
  319. sat_shift    rts
  320.  
  321. ; D0=character code
  322.  
  323. shipcode    move.w    d0,-(sp)
  324.     cmp.b    #32,d0
  325.     bcs.s    shipcode1
  326.     cmp.b    #127,d0
  327.     bcs.s    shipcode2
  328.     cmp.b    #160,d0
  329.     bcs.s    shipcode1
  330. shipcode2    moveq    #'''',d0
  331.     bsr.s    putcit
  332.     move.w    (sp)+,d0
  333.     cmp.b    #'''',d0
  334.     bne.s    shipcode3
  335.     bsr.s    putcit
  336.     moveq    #'''',d0
  337. shipcode3    bsr.s    putcit
  338.     moveq    #'''',d0
  339.     bra.s    putcit
  340.  
  341. shipcode1    clr.b    (sp)
  342.     dtl    <%d>,a0
  343.     mpush    d2-d3
  344.     move.l    sp,d3
  345.     addq.l    #8,d3
  346.     move.l    d7,d1
  347.     move.l    a0,d2
  348.     call    dos,VFPrintf
  349.     mpop    d2-d3
  350.     addq.l    #2,sp
  351.     rts
  352.  
  353. putcstr    cmp.b    #'"',d0
  354.     beq.s    putcstrq
  355.     cmp.b    #'\',d0
  356.     beq.s    putcstr1
  357.     cmp.b    #32,d0
  358.     bcs.s    putcstr3
  359.     cmp.b    #127,d0
  360.     bcs.s    putcstr2
  361.     cmp.b    #160,d0
  362.     bcc.s    putcstr2
  363. putcstr3    move.w    d0,-(sp)
  364.     moveq    #'\',d0
  365.     bsr.s    putcstr2
  366.     move.w    (sp),d0
  367.     lsr.b    #4,d0
  368.     bsr.s    putnib
  369.     move.w    (sp)+,d0
  370.     bra.s    putnib
  371.  
  372. putcstrq    bsr.s    putcstrq1
  373.     moveq    #'"',d0
  374.     bra.s    putcstr2
  375.  
  376. putcstr1    bsr.s    putcstr2
  377. putcstrq1    moveq    #'\',d0
  378. putcstr2    bra    putcit
  379.  
  380. putnib    and.b    #$0f,d0
  381.     cmp.b    #10,d0
  382.     bcs.s    1$
  383.     addq.l    #7,d0
  384. 1$    add.b    #'0',d0
  385.     bra    putcit
  386.  
  387. analyse    move.l    (a0)+,a2        ; A2=types
  388.     move.l    (a0)+,a3        ; A3=data
  389. anal1    move.b    (a2)+,d4
  390.     move.l    (a3)+,d0
  391.     btst    #5,d4
  392.     beq.s    anal2
  393.     not.b    d4
  394.     moveq    #0,d3
  395.     move.l    d0,a0
  396. anal3    move.b    d3,d0
  397.     and.b    d4,d0
  398.     bne.s    anal_skip
  399.     move.b    (a0)+,d0
  400.     move.b    (a0)+,d1
  401.     btst    #3,d0
  402.     beq.s    anal_skip
  403.     move.b    d1,d0
  404.     and.b    #$0f,d0
  405.     cmp.b    d0,d7
  406.     bcc.s    1$
  407.     move.b    d0,d7
  408. 1$    lsr.b    #4,d1
  409.     ext.w    d0
  410.     ext.w    d1
  411.     mulu    d1,d0
  412.     cmp.l    d0,d5
  413.     bcc.s    anal_skip
  414.     move.l    d0,d5
  415. anal_skip    addq.b    #1,d3
  416.     cmp.b    #8,d3
  417.     bcs.s    anal3
  418. anal2    subq.b    #1,d6
  419.     bne.s    anal1
  420.     rts
  421.  
  422. keytab0    dc.b    'TILDE',0,'ONE',0,'TWO',0,'THREE',0,'FOUR',0,'FIVE',0,'SIX',0,'SEVEN',0,'EIGHT',0    ;0
  423.     dc.b    'NINE',0,'ZERO',0,'MINUS',0,'EQUAL',0,'BACKSLASH',0,'???1',0,'K0',0        ;9
  424.     dc.b    'Q',0,'W',0,'E',0,'R',0,'T',0,'Y',0,'U',0,'I',0        ;10
  425.     dc.b    'O',0,'P',0,'LBRACK',0,'RBRACK',0,'???2',0,'K1',0,'K2',0,'K3',0    ;18
  426.     dc.b    'A',0,'S',0,'D',0,'F',0,'G',0,'H',0,'J',0,'K',0        ;20
  427.     dc.b    'L',0,'SEMICOLON',0,'APOSTROPHE',0,'HASH',0,'???3',0,'K4',0,'K5',0,'K6',0 ; 28
  428.     dc.b    'LESS',0,'Z',0,'X',0,'C',0,'V',0,'B',0,'N',0,'M',0    ;30
  429.     dc.b    'COMMA',0,'DOT',0,'SLASH',0,'???4',0,'KDOT',0,'K7',0,'K8',0,'K9',0    ;38
  430.     dc.b    0
  431.  
  432. keytab1    dc.b    'SPACE',0,'BACKSPACE',0,'TAB',0,'KENTER',0,'ENTER',0,'ESC',0,'DEL',0,'???5',0    ;40
  433.     dc.b    '???6',0,'???7',0,'KMINUS',0,'???8',0,'UP',0,'DOWN',0,'RIGHT',0,'LEFT',0        ;48
  434.     dc.b    'F1',0,'F2',0,'F3',0,'F4',0,'F5',0,'F6',0,'F7',0,'F8',0                ;50
  435.     dc.b    'F9',0,'F10',0,'KLBRACK',0,'KRBRACK',0,'KSLASH',0,'KASTERISK',0,'KPLUS',0,'HELP',0        ;58
  436.     dc.b    'LSHIFT',0,'RSHIFT',0,'CAPSLOCK',0,'CONTROL',0,'LALT',0,'RALT',0,'LAMIGA',0,'RAMIGA',0 ;60
  437.     dc.b    0
  438.  
  439.     tags
  440.  
  441.     exitrout    cleanup
  442.     template    <FROM/A,TO>
  443.     dv.l    from
  444.     dv.l    to
  445.  
  446.     finish
  447.  
  448.     end
  449.