home *** CD-ROM | disk | FTP | other *** search
/ GEMini Atari / GEMini_Atari_CD-ROM_Walnut_Creek_December_1993.iso / files / utility / kbext / kbext.asm < prev    next >
Encoding:
Assembly Source File  |  1987-07-12  |  11.7 KB  |  264 lines

  1. ;***************************************************************
  2. ;*                                                             *
  3. ;* KBEXT.ASM: extend keyboard functions                        *
  4. ;* installs itself in the keyboard interrupt                   *
  5. ;* valid for TOS 20/11/1985                                    *
  6. ;*                                                             *
  7. ;* TOS version dependent (marked with **):                     *
  8. ;*     address for kbshifts: A5D (TOS 20.06.85 D)              *
  9. ;*                           E1B (TOS 20.11.85 GB)             *
  10. ;*                           E1B (TOS 06.02.86 D)              *
  11. ;*                                                             *
  12. ;* Version for GST-Assembler                                   *
  13. ;* THIS PROGRAM IS IN THE PUBLIC DOMAIN                        *
  14. ;*                                                             *
  15. ;********* Roland Waldi *** 2.00-87/07 *************************
  16.  
  17.           SECTION   MAIN
  18.           RORG      0
  19.           BRA       install
  20. kbint:
  21.           MOVE.L    TOSvec,A0
  22.           JSR       (A0)           ;* jump to TOS routine
  23.           BRA.S     go
  24. timerint:
  25.           MOVE.W    4(A7),D0
  26.           MOVE.W    D0,-(A7)       ;* copy argument
  27.           MOVE.L    TMRvec,A0
  28.           JSR       (A0)           ;* call etv_timer
  29.           ADDQ.L    #2,A7
  30. go:
  31.           MOVE.L    IOrec,A0
  32.           MOVE.L    (A0),A2        ;* get address of io-buffer
  33.           MOVE.W    8(A0),D1       ;* tail index
  34.           CMP.W     OLDtail,D1     ;* test if changed
  35.           BEQ.S     rturn
  36.           LEA       OLDtail,A1
  37.           MOVE.W    D1,(A1)        ;* save tail index at OLDtail
  38.           MOVE.B    $E1B,D2        ;* get kbshifts (** TOS dependent **)
  39.           BTST      #3,D2          ;* ALT set?
  40.           BEQ.S     rturn          ;* if 0, return
  41.           MOVE.W    0(A2,D1.W),D0  ;*
  42.           AND.W     #$7F,D0        ;* key code
  43.           LEA       ALTtabl,A1     ;* get translation table
  44.           AND.B     #$13,D2        ;* test SHIFT l/r and CapsL
  45.           BEQ.S     goon           ;* if none set
  46.           ADDA.L    #128,A1        ;* use second table (ALT&SHIFT)
  47. goon:
  48.           MOVE.B    0(A1,D0.W),D0  ;* translate
  49.           MOVE.W    D0,2(A2,D1.W)  ;* store char code
  50. rturn:
  51.           RTS
  52. TOSvec:
  53.           DC.L      0
  54. TMRvec:
  55.           DC.L      0
  56. IOrec:
  57.           DC.L      0
  58. OLDtail:
  59.           DC.W      -1
  60. ;*
  61. ;* here are the keyboard tables for normal, SHIFT,
  62. ;*                                  and normal with CAPS LOCK
  63. ;*                                  ALT, ALT&SHIFT
  64. ;*
  65. ;* to change the keyboard layout, use the "normal" table as a
  66. ;* guide for the keys (the layout is for a UK keyboard)
  67. ;* and insert the ATARI/ASCII codes of the characters you want.
  68. ;* NOTE:
  69. ;* with ALT, the positions 02 ('1') ... 09 ('8') move to
  70. ;* 78 ... 7F,
  71. ;* and 0A ('9') ... 0D ('=') to 00 ... 03 (actually 80 ... 83)
  72. ;* these rearrangements are done BY THE PROGRAM
  73. ;*
  74. normal:
  75.           DC.B      $00,$1B,'1','2','3','4','5','6' ;* 00 Esc
  76.           DC.B      '7','8','9','0','-','=',$08,$09 ;* 08 BS,TAB
  77.           DC.B      'q','w','e','r','t','y','u','i' ;* 10
  78.           DC.B      'o','p',$5B,$5D,$0D,$00,'a','s' ;* 18 brackets,CR
  79.           DC.B      'd','f','g','h','j','k','l',';' ;* 20
  80.           DC.B      $27,'`',$00,'#','z','x','c','v' ;* 28 '
  81.           DC.B      'b','n','m',',','.','/',$00,$00 ;* 30
  82.           DC.B      $00,' ',$00,$00,$00,$00,$00,$00 ;* 38
  83.           DC.B      $00,$00,$00,$00,$00,$00,$00,$00 ;* 40
  84.           DC.B      $00,$00,'-',$00,$00,$00,'+',$00 ;* 48
  85.           DC.B      $00,$00,$00,$7F,$00,$00,$00,$00 ;* 50 DEL
  86.           DC.B      $00,$00,$00,$00,$00,$00,$00,$00 ;* 58
  87.           DC.B      $5C,$00,$00,'(',')','/','*','7' ;* 60 \
  88.           DC.B      '8','9','4','5','6','1','2','3' ;* 68
  89.           DC.B      '0','.',$0D,$00,$00,$00,$00,$00 ;* 70 Enter
  90.           DC.B      $00,$00,$00,$00,$00,$00,$00,$00 ;* 78
  91. shiftblk:
  92.           DC.B      $00,$1B,'!','@','#','$','%','^' ;* 00
  93.           DC.B      '&','*','(',')','_','+',$08,$09 ;* 08
  94.           DC.B      'Q','W','E','R','T','Y','U','I' ;* 10
  95.           DC.B      'O','P','{','}',$0D,$00,'A','S' ;* 18
  96.           DC.B      'D','F','G','H','J','K','L',':' ;* 20
  97.           DC.B      '"',$BA,$00,'~','Z','X','C','V' ;* 28
  98.           DC.B      'B','N','M','<','>','?',$00,$00 ;* 30
  99.           DC.B      $00,' ',$00,$00,$00,$00,$00,$00 ;* 38
  100.           DC.B      $00,$00,$00,$00,$00,$00,$00,$00 ;* 40
  101.           DC.B      $00,$00,'-',$00,$00,$00,'+',$00 ;* 48
  102.           DC.B      $00,$00,$00,$7F,$00,$00,$00,$00 ;* 50
  103.           DC.B      $00,$00,$00,$00,$00,$00,$00,$00 ;* 58
  104.           DC.B      '|',$00,$00,'(',')','/','*','7' ;* 60
  105.           DC.B      '8','9','4','5','6','1','2','3' ;* 68
  106.           DC.B      '0','.',$0D,$00,$00,$00,$00,$00 ;* 70
  107.           DC.B      $00,$00,$00,$00,$00,$00,$00,$00 ;* 78
  108. capslock:
  109.           DC.B      $00,$1B,'1','2','3','4','5','6' ;* 00
  110.           DC.B      '7','8','9','0','-','=',$08,$09 ;* 08
  111.           DC.B      'Q','W','E','R','T','Y','U','I' ;* 10
  112.           DC.B      'O','P',$5B,$5D,$0D,$00,'A','S' ;* 18
  113.           DC.B      'D','F','G','H','J','K','L',';' ;* 20
  114.           DC.B      $27,'`',$00,'#','Z','X','C','V' ;* 28
  115.           DC.B      'B','N','M',',','.','/',$00,$00 ;* 30
  116.           DC.B      $00,' ',$00,$00,$00,$00,$00,$00 ;* 38
  117.           DC.B      $00,$00,$00,$00,$00,$00,$00,$00 ;* 40
  118.           DC.B      $00,$00,'-',$00,$00,$00,'+',$00 ;* 48
  119.           DC.B      $00,$00,$00,$7F,$00,$00,$00,$00 ;* 50
  120.           DC.B      $00,$00,$00,$00,$00,$00,$00,$00 ;* 58
  121.           DC.B      $5C,$00,$00,'(',')','/','*','7' ;* 60
  122.           DC.B      '8','9','4','5','6','1','2','3' ;* 68
  123.           DC.B      '0','.',$0D,$00,$00,$00,$00,$00 ;* 70
  124.           DC.B      $00,$00,$00,$00,$00,$00,$00,$00 ;* 78
  125. ALTtabl:
  126.           DC.B      $00,$1B,$BB,$AB,$9C,$AC,$BF,$A9 ;* 78
  127.           DC.B      $BD,$F9,$F8,$B2,$9E,$F0,$00,$00 ;* 00
  128.           DC.B      $91,$C2,$89,$D5,$E7,$98,$81,$8B ;* 10
  129.           DC.B      $94,$E3,$C7,$F5,$00,$00,$84,$9E ;* 18
  130.           DC.B      $EB,$9F,$C4,$C6,$C0,$CC,$CD,$C8 ;* 20
  131.           DC.B      $CA,$CB,$00,$86,$B0,$B1,$87,$DE ;* 28
  132.           DC.B      $C3,$A4,$E6,$DB,$DC,$B3,$00,$00 ;* 30
  133.           DC.B      $00,$20,$00,$00,$00,$00,$00,$00 ;* 38
  134.           DC.B      $00,$00,$00,$00,$00,$00,$00,$00 ;* 40
  135.           DC.B      $00,$00,$D9,$00,$00,$00,$D8,$00 ;* 48
  136.           DC.B      $00,$00,$00,$00,$00,$00,$00,$00 ;* 50
  137.           DC.B      $00,$00,$00,$00,$00,$00,$00,$00 ;* 58
  138.           DC.B      $B4,$00,$00,$E0,$E1,$ED,$EF,$A1 ;* 60
  139.           DC.B      $8C,$8D,$A0,$83,$85,$82,$88,$8A ;* 68
  140.           DC.B      $E9,$E5,$00,$00,$00,$00,$00,$00 ;* 70
  141.           DC.B      $BB,$AB,$9C,$AC,$BF,$A9,$BD,$F9 ;* 78
  142. ;* ALT & SHIFT
  143.           DC.B      $00,$1B,$AD,$B9,$DD,$9B,$F6,$AA ;* 00
  144.           DC.B      $BE,$FA,$A6,$A7,$F7,$F1,$00,$00 ;* 08
  145.           DC.B      $92,$D6,$EE,$D4,$D3,$9D,$9A,$EC ;* 10
  146.           DC.B      $99,$BC,$CF,$F4,$00,$00,$8E,$E4 ;* 18
  147.           DC.B      $C5,$CE,$E2,$C9,$C1,$D1,$D2,$D3 ;* 20
  148.           DC.B      $D4,$FF,$00,$8F,$B7,$B8,$80,$FB ;* 28
  149.           DC.B      $DF,$A5,$D0,$F3,$F2,$A8,$00,$00 ;* 30
  150.           DC.B      $00,$20,$00,$00,$00,$00,$00,$00 ;* 38
  151.           DC.B      $00,$00,$00,$00,$00,$00,$00,$00 ;* 40
  152.           DC.B      $00,$00,$DA,$00,$00,$00,$D7,$00 ;* 48
  153.           DC.B      $00,$00,$00,$00,$00,$00,$00,$00 ;* 50
  154.           DC.B      $00,$00,$00,$00,$00,$00,$00,$00 ;* 58
  155.           DC.B      $B5,$00,$00,$AE,$AF,$E8,$B6,$A2 ;* 60
  156.           DC.B      $93,$95,$A3,$96,$97,$90,$FD,$FE ;* 68
  157.           DC.B      $EA,$FC,$00,$00,$00,$00,$00,$00 ;* 70
  158.           DC.B      $00,$00,$00,$00,$00,$00,$00,$00 ;* 78
  159. pglength:
  160.           DC.L      0
  161. install:
  162.           MOVEA.L   4(A7),A5       ;* basepage
  163.           LEA       pglength(PC),A0
  164.           LEA       install(PC),A1
  165.           MOVE.L    A1,D0
  166.           SUB.L     A5,D0          ;* calculate length
  167.           MOVE.L    D0,(A0)
  168.           MOVE.L    D0,-(A7)       ;* length
  169.           MOVE.L    A5,-(A7)       ;* start
  170.           CLR.W     -(A7)
  171.           MOVE.W    #$4A,-(A7)
  172.           TRAP      #1             ;* SETBLOCK, reserve storage
  173.           LEA       12(A7),A7
  174.           CLR.W     -(A7)          ;* read file DEFAULT.KBD
  175.           PEA       file1(PC)
  176.           MOVE.W    #$3D,-(A7)     ;* open
  177.           TRAP      #1
  178.           ADDQ.L    #8,A7
  179.           TST.W     D0
  180.           BMI.S     nodefault
  181.           PEA       normal(PC)     ;* table address for read
  182.           MOVE.L    #384,-(A7)     ;* length
  183.           MOVE.W    D0,-(A7)       ;* handle 
  184.           MOVE.W    #$3F,-(A7)     ;* read
  185.           TRAP      #1
  186.           LEA       12(A7),A7
  187.           MOVE.W    handle(PC),-(A7)
  188.           MOVE.W    #$3E,-(A7)     ;* close
  189.           TRAP      #1
  190.           ADDQ.L    #4,A7
  191. nodefault:
  192.           CLR.W     -(A7)          ;* read file ALT.KBD
  193.           PEA       file2(PC)
  194.           MOVE.W    #$3D,-(A7)     ;* open
  195.           TRAP      #1
  196.           ADDQ.L    #8,A7
  197.           TST.W     D0
  198.           BMI.S     noaltfile
  199.           LEA       handle(PC),A0  ;* file handle
  200.           MOVE.W    D0,(A0)
  201.           PEA       ALTtabl(PC)    ;* table address for read
  202.           MOVE.L    #256,-(A7)     ;* length
  203.           MOVE.W    D0,-(A7)       ;* handle 
  204.           MOVE.W    #$3F,-(A7)     ;* read
  205.           TRAP      #1
  206.           LEA       12(A7),A7
  207.           MOVE.W    handle(PC),-(A7)
  208.           MOVE.W    #$3E,-(A7)     ;* close
  209.           TRAP      #1
  210.           ADDQ.L    #4,A7
  211. noaltfile:
  212.           LEA       ALTtabl(PC),A0 ;* rearrange ALT-Codes
  213.           MOVE.L    $02(A0),$78(A0)
  214.           MOVE.L    $06(A0),$7C(A0)
  215.           MOVE.L    $0A(A0),$00(A0)
  216.           MOVE.L    $082(A0),$0F8(A0) ;* same for ALFT SHIFT
  217.           MOVE.L    $086(A0),$0FC(A0)
  218.           MOVE.L    $08A(A0),$080(A0)
  219.           MOVE.W    #1,-(A7)
  220.           MOVE.W    #14,-(A7)
  221.           TRAP      #14            ;* get iorec(1)
  222.           ADDQ.L    #4,A7
  223.           LEA       IOrec(PC),A0
  224.           MOVE.L    D0,(A0)        ;* save pointer to kbd-iorec
  225.           PEA       capslock(PC)   ;* CapsL
  226.           PEA       shiftblk(PC)   ;* shifted
  227.           PEA       normal         ;* unshifted
  228.           MOVE.W    #16,-(A7)
  229.           TRAP      #14            ;* XBIOS keytbl(,,)
  230.           ADDA.L    #14,A7
  231.           MOVE.W    #34,-(A7)
  232.           TRAP      #14            ;* Kbdvbase()
  233.           ADDQ.L    #2,A7
  234.           MOVE.L    D0,A1          ;* A1 = addr(kbdvbase)
  235.           LEA       TOSvec,A0
  236.           MOVE.L    32(A1),(A0)    ;* save interrupt routine address
  237.           LEA       kbint,A0
  238.           MOVE.L    A0,32(A1)      ;* install new interrupt vector
  239.           CLR.L     -(A7)
  240.           MOVE.W    #$20,-(A7)
  241.           TRAP      #1             ;* Super
  242.           ADDQ.L    #6,A7
  243.           LEA       TMRvec,A0
  244.           MOVE.L    $400,(A0)      ;* save etv_timer routine address
  245.           LEA       timerint,A0
  246.           MOVE.L    A0,$400        ;* install new interrupt vector
  247.           MOVE.L    D0,-(A7)
  248.           MOVE.W    #$20,-(A7)
  249.           TRAP      #1
  250.           ADDQ.L    #6,A7
  251.           CLR.W     -(A7)          ;* return code
  252.           MOVE.L    pglength,-(A7) ;* program length
  253.           MOVE.W    #$31,-(A7)     ;* Ptermres
  254.           TRAP      #1             ;* reserve storage and end
  255.           RTS                      ;* never reached
  256. handle:   DC.W      0
  257. file1:    DC.B      $5C,'A','U','T','O',$5C
  258.           DC.B      'D','E','F','A','U','L','T','.'
  259.           DC.B      'K','B','D',$00
  260. file2:    DC.B      $5C,'A','U','T','O',$5C
  261.           DC.B      'A','L','T','.'
  262.           DC.B      'K','B','D',$00
  263.           END
  264.