AZERTY source code


;
; Predefined labels:
KBD            gequ $C000
KBDSTROBE      gequ $C010

               dc  a2'Open'
               dc  a2'Close'
               dc  a2'Action'
               dc  a2'Init'
NDAHeader      dc  i2'$FFFF'            ;Period
               dc  i2'$0143'            ;Event mask
               dc  h'2020'
               dc  c'Azerty\H**'
               dc  h'00'

Open           lda >WinExists
               beq FullOpen
               pea WinPtr|-$10
               pea WinPtr
               _SelectWindow
               rtl
FullOpen       pea $0000
               pea $0000
               pea WinParamLst|-$10
               pea WinParamLst
               _NewWindow
               plx
               pla
               sta $06,s
               sta >WinPtr+2
               txa
               sta $04,s
               sta >WinPtr
               pea $0000
               pea $0000
               lda >WinPtr+2
               pha
               lda >WinPtr
               pha
               pea CtlRect|-$10
               pea CtlRect
               pea CtlTitle|-$10
               pea CtlTitle
               pea $0000                ;Bit flag
               lda >CtlValue            ;Control initial value
               pha
               pea $0000                ;Additional param (view size for scroll b	
               pea $0000                ;Additional param (data size for scroll b
               pea $0200                ;$02000000 for a Check box control
               pea $0000
               pea $0000                ;Reserved for application used
               pea $0000                ;Reserved for application use
               pea $0000                ;NIL (4 bytes) for default color table
               pea $0000
               _NewControl
               pla
               sta >CtlHandle2
               pla
               sta >CtlHandle2+2
               lda >WinPtr+2
               pha
               lda >WinPtr
               pha
               _SetSysWindow
               lda #$FFFF
               sta >WinExists
               rtl

WinParamLst    dc  i2'$004E'            ;paramLength
               dc  i2'$C0A0'            ;Bit flag that defines window frame type
               dc  a4'$010B'            ;wTitle - Pointer to window's title
               dc  i4'$00000000'        ;wRefCon
               dc  i2'$0000,$0000,$0000,$0000'
               dc  i4'$00000000'        ;wColor
               dc  i2'$0000'            ;wYOrigin
               dc  i2'$0000'            ;wXOrigin
               dc  i2'$0000'            ;wDataH
               dc  i2'$0000'            ;wDataW
               dc  i2'$0000'            ;wMaxH
               dc  i2'$0000'            ;wMaxW
               dc  i2'$0000'            ;wScrollVer
               dc  i2'$0000'            ;wScrollHor
               dc  i2'$0000'            ;wPageVer
               dc  i2'$0000'            ;wPageHor
               dc  i4'$00000000'        ;wInfoRefCon
               dc  i2'$0000'            ;wInfoHeight
               dc  i4'$00000000'        ;wFrameDefProc
               dc  i4'$00000000'        ;wInfoDefProc
               dc  i4'$00000000'        ;wContDefProc
               dc  i2'$0032,$0046,$006E,$012C'
               dc  i4'$FFFFFFFF'
               dc  i4'$00000000'
               dw  'AZERTY'

RedrawWin      lda WinPtr+2
               pha
               lda WinPtr
               pha
               _BeginUpdate
               pea ClearRect|-$10
               pea ClearRect
               _EraseRect
               pea $0007
               pea $000A
               _MoveTo
               pea Description|-$10
               pea Description
               _DrawString
               pea $0007
               pea $0016
               _MoveTo
               pea Copyright|-$10
               pea Copyright
               _DrawString
               pea $0007
               pea $0022
               _MoveTo
               pea Author|-$10
               pea Author
               _DrawString
               pea $0000
               pea $002C
               _MoveTo
               pea $00E6
               pea $002C
               _LineTo
               lda WinPtr+2
               pha
               lda WinPtr
               pha
               _DrawControls
               lda WinPtr+2
               pha
               lda WinPtr
               pha
               _EndUpdate
               rtl

PressedAccent  brk $00                  ;If !=0, an accent key has been pressed
WinExists      dc  i2'$0000'
WinPtr         dc  i4'$00000000'
Description    dw  'Clavier Azerty pour le IIgs'
Copyright      dw  '(c) 1988'
Author         dw  'Huibert Aalbers'
CtlTitle       dw  'Accessoire actif'
ClearRect      dc  i2'$0000,$0000,$003C,$00E6'
CtlRect        dc  i2'$002F,$0019,$003B,$00C8'
CtlHandle2     dc  i4'$00000000'
CtlHandle      dc  i4'$00000000'
PointY         dc  i2'$0000'
PointX         dc  i2'$0000'
CtlValue       dc  i2'$0001'

Close          phb
               phk
               plb
               lda >WinExists
               beq skip
               lda WinPtr+2
               pha
               lda WinPtr
               pha
               _CloseWindow
               lda #$0000
               sta >WinExists
skip           plb
               rtl

Action         phb
               phk
               plb
               phy
               phx
               asl a
               tax
               jsr (JmpTable,x)
               pla
               pla
               plb
               rtl

JmpTable       dc  a2'Ignore'           ;Action code 0, never sent
               dc  a2'EventAction'      ;Action code 1, Event (the one we care ab
               dc  a2'Ignore'           ;Action code 2, Run (ignore)
               dc  a2'Ignore'           ;Action code 3, Cursor (ignore)
               dc  a2'Ignore'           ;Action code 4, Reserved (ignore)
               dc  a2'Ignore'           ;Action code 5, Undo (ignore)
               dc  a2'Ignore'           ;Action code 6, Cut (ignore)
               dc  a2'Ignore'           ;Action code 7, Copy (ignore)
               dc  a2'Ignore'           ;Action code 8, Paste (ignore)
               dc  a2'Ignore'           ;Action code 9, Clear (ignore)

Ignore         rts

EventAction    longa on
               longi on
               phd
               tsc
               tcd
               ldy #$000A
               lda [$05],y
               sta PointY
               iny
               iny
               lda [$05],y
               sta PointX
               lda [$05]
               pld
               cmp #$0006
               beq Redraw
               cmp #$0001
               beq HandleClick
               pea $0000
               pea $0000
               _GetPort
               lda WinPtr+2
               pha
               lda WinPtr
               pha
               _SetPort
               lda WinPtr+2
               pha
               lda WinPtr
               pha
               _DrawControls
               _SetPort
               rts
Redraw         jsl >RedrawWin
               rts

HandleClick    pea $0000
               pea CtlHandle|-$10
               pea CtlHandle
               lda PointX
               pha
               lda PointY
               pha
               lda WinPtr+2
               pha
               lda WinPtr
               pha
               _FindControl
               pla
               beq ClickHandled         ;User didn't click on a control
               pea $0000
               lda PointX
               pha
               lda PointY
               pha
               pea $0000
               pea $0000
               lda CtlHandle+2
               pha
               lda CtlHandle
               pha
               _TrackControl
               pla
               beq ClickHandled         ;User released button outside of control
               pea $0000
               lda CtlHandle+2
               pha
               lda CtlHandle
               pha
               _GetCtlValue
               pla
               eor #$0001               ;Toggle control value
               sta CtlValue
               pha
               lda CtlHandle+2
               pha
               lda CtlHandle
               pha
               _SetCtlValue
ClickHandled   rts

Init           longa on
               longi on
               pea $0000
               pea $0000
               pea $000F                ;Keyboard  interrupt handler
               _GetVector
               pla
               sta >$038B
               pla
               sep #$20
               longa off
               sta >$038D
               rep #$20
               longa on
               pea $000F                ;Keyboard  interrupt handler
               pea ProcessInt|-$10
               pea ProcessInt
               _SetVector
               lda #$0000
               sta PressedAccent
               rtl

WeirdRTS       rts

ProcessInt     longa off
               longi off
               phb
               phk
               plb
               lda CtlValue
               beq NDAInactive
               lda >KBD                 ;keyboard latch
               and #$7F
               ldx #$06
L0             cmp SpecChars,x
               beq Remap
               dex
               bpl L0
               ldx #$03
L1             cmp Accents,x
               beq HandleAccent
               dex
               bpl L1
               ldy PressedAccent
               bne ChrAfterAccent
NDAInactive    plb
Jmp2NormalInt  jmp >$000000             ;Code will modify address
HandleAccent   inx                      ;Store accent index+1 for later
               stx PressedAccent        ;processing
               sta >KBDSTROBE           ;turn off keypressed flag
               clc
               plb
               rtl

Remap          sta >KBDSTROBE           ;turn off keypressed flag
               lda AltSpecChars,x       ;Re-map special characters
               sec
               sbc #$40
               ora #$80			;Add appleKey modifier
               sta KeyEvent		;Store keyEvent
               rep #$30
               longa on
               longi on
               pea $0000
               pea $0003
               pea $0000
               lda KeyEvent
               pha
               _PostEvent
               pla
               sep #$30
               longa off
               longi off
               clc
               plb
               rtl

ChrAfterAccent ldx #$09
L2             cmp Vowels,x
               beq AccentedChar
               dex
               bpl L2
               sta KeyEvent             ;Not a vowel
               ldx PressedAccent        ;Print the accent and then the second cha
               dex
               lda Accents,x
               rep #$30
               longa on
               longi on
               and #$00FF
               pea $0000
               pea $0003
               pea $0000
               pha
               _PostEvent
               pla
               pea $0000
               pea $0003
               pea $0000
               lda KeyEvent
               pha
               _PostEvent
               pla
               sep #$30
               longa off
               longi off
               lda #$00
               sta PressedAccent
               sta >KBDSTROBE           ;turn off keypressed flag
               clc
               plb
               rtl

AccentedChar   ldy PressedAccent
               dey
               cpy #$00
               beq HandleCirc
               cpy #$01
               beq HandleGrave
               cpy #$02
               beq HandleAigu
HandleTilde    lda Table4,x
               bra L3
HandleAigu     lda Table3,x
               bra L3
HandleGrave    lda Table2,x
               bra L3
HandleCirc     lda Table1,x
L3             sec
               sbc #$40
               ora #$80                 ;Add appleKey modifier
               sta KeyEvent
               rep #$30
               longa on
               longi on
               pea $0000
               pea $0003
               pea $0000
               lda KeyEvent
               pha
               _PostEvent
               pla
               sep #$30
               longa off
               longi off
               lda #$00
               sta PressedAccent
               sta >KBDSTROBE           ;turn off keypressed flag
               clc
               plb
               rtl

SpecChars      dc  c'@{}]\|#'
AltSpecChars   dc  h'484E4F644D5D63'
Accents        dc  c'^`[~'
Vowels         dc  c'AEIOUaeiou'
Table1         dc  h'25262B2F33495054'
               dc  h'595E'
Table2         dc  h'0B292D3134484F53'
               dc  h'585D'
Table3         dc  h'27432A2E32474E52'
               dc  h'575C'
Table4         dc  h'40282C45464A5155'
               dc  h'5A5F'

KeyEvent       dc  i2'$0000'

               end

AZERTY source code