; Simulate Key strokes for parameterstring
;
      INCLUDE "includes/MACS.ASM"

      INIT_AMIGA

LASTKEY: EQU   $BFEC01

        CMPI.B #' ',(A0)  ; check for any characters
        BLT.S Instructions ; print out instructions and exit

      MOVEQ    #$3A,D0     ; caps lock released
      BSR      TYPE_KEY    ; enable lower case (Important for MODULA2)
Skip_spc:
      MOVE.B   (A0)+,D0
      CMP.B    #'"',D0
      BEQ.S    Delimiter
      CMP.B    #39,D0
      BEQ.S    Delimiter
      CMP.B    #10,D0      ; end of line ?
      BEQ.S    Instructions
      BRA.S    Skip_spc
Delimiter:
      MOVE.B   D0,D7       ; store String delimiter
Type_loop:
      MOVE.B   (A0)+,D0
      CMP.B    D7,D0       ; end of string ?
      BEQ      Exit_prog
      CMP.B    #10,D0      ; end of line ?
      BEQ      Exit_prog
      CMP.B    #'\',D0     ; special character ?
      BNE.S    Type_1
      BSR      ASCII_D0    ; convert to ASCII
Type_1:
      BSR      TYPE_CHR    ; type in character
      BRA.S    Type_loop
; ------------------------------------------------
; convert \n \x.. \r....... \f to ASCII
; ------------------------------------------------
ASCII_D0:
      MOVE.B   (A0)+,D0
      CMP.B    #'n',D0
      BNE.S    ASC_1
      MOVEQ    #13,D0
      RTS
ASC_1:
      CMP.B    #'f',D0
      BNE.S    ASC_2
      MOVEQ    #12,D0
      RTS
ASC_2:
      CMP.B    #'x',D0
      BNE.S    ASC_3
      BSR      READ_HEX
      RTS
ASC_3:
      CMP.B    #'r',D0
      BNE.S    ASC_4
ASC31:
      MOVE.B   (A0),D0
      CMP.B    #'0',D0
      BLT.S    ASC_EX
      CMP.B    #'F',D0
      BGT.S    ASC_EX
      BSR      READ_HEX
      BSR      TYPE_KEY
      BRA.S    ASC31
ASC_4:
ASC_EX:
      RTS

READ_HEX:
      MOVE.L   D1,-(A7)
      MOVE.B   (A0)+,D0
      SUB.B    #48,D0   ; '0' -> 0
      CMP.B    #9,D0
      BLE.S    ASC_21
      SUB.B    #7,D0    ; 'A' -> 10
ASC_21:
      MULU     #16,D0   ; make MSB
      MOVE.B   (A0)+,D1
      SUB.B    #48,D1   ; '0' -> 0
      CMP.B    #9,D1
      BLE.S    ASC_22   ; 'A' -> 10
      SUB.B    #7,D1
ASC_22:
      ADD.B    D1,D0    ; add LSB
      MOVE.L   (A7)+,D1
      RTS

Instructions:             ; print out instructions and exit
        BSR    PRINT
 DC.B '(C) 09.88 by RAKO',10
 DC.B 'Usage: Type_in "Dies ist ein Test\n"',10
 DC.B 'Purpose: simulating Keystrokes to batch every program',10
 DC.B 'Special keys:',10
 DC.B '\n = Return, \f = Form Feed, \x = ASCII in Hex',10
 DC.B '\r = raw key sequence in Hex. Use any non Hex as delimiter',10
 DC.B '  USE Uppercase letters only for Hex numbers ! ',10,0
        MOVEQ  #$64,D0    ; signal error
        BRA    Exit_prog  ; and exit
Exit_prog:
        MOVEQ #0,D0
        EXIT_AMIGA

; ------------------------------------------------
; Type in single character with ASCII code in D0
; ------------------------------------------------
TYPE_CHR:
      MOVEM.L  D0/D1/A0,-(A7)
      ANDI.L   #$7F,D0     ; just in case...
      MULU     #4,D0       ; 4 byte for each entry in table
      LEA      Trans_Tab,A0
      MOVE.L   0(A0,D0.W),D1 ; get sequence of keystrokes for ASCII
      MOVE.L   D1,D0       ; get first Key in sequence
      SWAP     D0
      LSR.W    #8,D0
      BSR      TYPE_KEY
      MOVE.L   D1,D0       ; get second Key in sequence
      SWAP     D0
      BSR      TYPE_KEY
      MOVE.W   D1,D0       ; get third Key
      LSR.W    #8,D0
      BSR      TYPE_KEY
      MOVE.B   D1,D0       ; get last Key
      BSR      TYPE_KEY
      MOVEM.L  (A7)+,D0/D1/A0
      RTS
; ---------------------------------------------
; Type in single Keystroke and wait for accept
; ---------------------------------------------
TYPE_KEY:
      MOVEM.L  D0-D7/A0-A5,-(A7)
      TST.B    D0
      BEQ.S    TypKeyEx
      MOVE.B   D0,LASTKEY   ; type in
      MOVE.L   4,A6        ; execbase -> A6
      MOVEM.L  $78(A6),A5/A1 ; Interrupt struct -> A1
      MOVE.L   A1,A2
TYPE_K1:
      MOVE.L   (A2),A2       ; get next node in list
      MOVEM.L  $E(A2),A1/A5  ; get is_Data and is_Code
      CMPA.L   #$F00000,A5   ; test for code in ROM
      BLT.S    TYPE_K1       ; jump if code in RAM
      MOVE.L   A1,A2
      MOVEM.L  $64(A2),A1/A5 ; address and dataspace for kbd interrupt server
      JSR      (A5)        ; call interrupt server to read key
TypKeyEx:
      MOVEM.L  (A7)+,D0-D7/A0-A5
      RTS

Trans_Tab:
       DC.B    0,0,0,0
       DC.B    $39,$BF,$BE,$38
       DC.B    $39,$95,$94,$38
       DC.B    $39,$99,$98,$38
       DC.B    $39,$BB,$BA,$38
       DC.B    $39,$DB,$DA,$38
       DC.B    $39,$B9,$B8,$38
       DC.B    $39,$B7,$B6,$38
       DC.B    $39,$B5,$B4,$38
       DC.B    $39,$D1,$D0,$38
       DC.B    $39,$B3,$B2,$38
       DC.B    $39,$B1,$B0,$38
       DC.B    $39,$AF,$AE,$38
       DC.B    $39,$91,$90,$38
       DC.B    $39,$92,$92,$38
       DC.B    $39,$CF,$CE,$38
       DC.B    $39,$CD,$CC,$38
       DC.B    $39,$DF,$DE,$38
       DC.B    $39,$D9,$D8,$38
       DC.B    $39,$BD,$BC,$38
       DC.B    $39,$D7,$D6,$38
       DC.B    $39,$D3,$D2,$38
       DC.B    $39,$97,$96,$38
       DC.B    $39,$DD,$DC,$38
       DC.B    $39,$9B,$9A,$38
       DC.B    $39,$9D,$9C,$38
       DC.B    $39,$D5,$D4,$38
       DC.B    $0,$75,$74,$0
       DC.B    $0,$67,$66,$0
       DC.B    $0,$65,$64,$0
       DC.B    $0,$63,$62,$0
       DC.B    $0,$61,$60,$0
       DC.B    $0,$7F,$7E,$0
       DC.B    $3F,$FD,$FC,$3E
       DC.B    $3F,$FB,$FA,$3E
       DC.B    $0,$A9,$A8,$0
       DC.B    $3F,$F7,$F6,$3E
       DC.B    $3F,$F5,$F4,$3E
       DC.B    $3F,$F3,$F2,$3E
       DC.B    $3F,$F1,$F0,$3E
       DC.B    $3F,$EF,$EE,$3E
       DC.B    $3F,$ED,$EC,$3E
       DC.B    $3F,$C9,$C8,$3E
       DC.B    $0,$C9,$C8,$0
       DC.B    $0,$8F,$8E,$0
       DC.B    $0,$8B,$8A,$0
       DC.B    $0,$8D,$8C,$0
       DC.B    $3F,$F1,$F0,$3E
       DC.B    $0,$EB,$EA,$0
       DC.B    $0,$FD,$FC,$0
       DC.B    $0,$FB,$FA,$0
       DC.B    $0,$F9,$F8,$0
       DC.B    $0,$F7,$F6,$0
       DC.B    $0,$F5,$F4,$0
       DC.B    $0,$F3,$F2,$0
       DC.B    $0,$F1,$F0,$0
       DC.B    $0,$EF,$EE,$0
       DC.B    $0,$ED,$EC,$0
       DC.B    $3F,$8D,$8C,$3E
       DC.B    $3F,$8F,$8E,$3E
       DC.B    $0,$9F,$9E,$0
       DC.B    $3F,$EB,$EA,$3E
       DC.B    $3F,$9F,$9E,$3E
       DC.B    $3F,$E9,$E8,$3E
       DC.B    $0,$0,$0,$0
       DC.B    $3F,$BF,$BE,$3E
       DC.B    $3F,$95,$94,$3E
       DC.B    $3F,$99,$98,$3E
       DC.B    $3F,$BB,$BA,$3E
       DC.B    $3F,$DB,$DA,$3E
       DC.B    $3F,$B9,$B8,$3E
       DC.B    $3F,$B7,$B6,$3E
       DC.B    $3F,$B5,$B4,$3E
       DC.B    $3F,$D1,$D0,$3E
       DC.B    $3F,$B3,$B2,$3E
       DC.B    $3F,$B1,$B0,$3E
       DC.B    $3F,$AF,$AE,$3E
       DC.B    $3F,$91,$90,$3E
       DC.B    $3F,$93,$92,$3E
       DC.B    $3F,$CF,$CE,$3E
       DC.B    $3F,$CD,$CC,$3E
       DC.B    $3F,$DF,$DE,$3E
       DC.B    $3F,$D9,$DA,$3E
       DC.B    $3F,$BD,$BC,$3E
       DC.B    $3F,$D7,$D6,$3E
       DC.B    $3F,$D3,$D2,$3E
       DC.B    $3F,$97,$96,$3E
       DC.B    $3F,$DD,$DC,$3E
       DC.B    $3F,$9B,$9C,$3E
       DC.B    $3F,$9D,$9C,$3E
       DC.B    $3F,$D5,$D4,$3E
       DC.B    $0,$4B,$4A,$0
       DC.B    $0,$E5,$E4,$0
       DC.B    $0,$49,$48,$0
       DC.B    $3F,$A9,$A8,$3E
       DC.B    $3F,$8B,$8A,$3E
       DC.B    $0,$FF,$FE,$0
       DC.B    $0,$BF,$BE,$0
       DC.B    $0,$95,$94,$0
       DC.B    $0,$99,$98,$0
       DC.B    $0,$BB,$BA,$0
       DC.B    $0,$DB,$DA,$0
       DC.B    $0,$B9,$B8,$0
       DC.B    $0,$B7,$B6,$0
       DC.B    $0,$B5,$B4,$0
       DC.B    $0,$D1,$D0,$0
       DC.B    $0,$B3,$B2,$0
       DC.B    $0,$B1,$B0,$0
       DC.B    $0,$AF,$AE,$0
       DC.B    $0,$91,$90,$0
       DC.B    $0,$93,$92,$0
       DC.B    $0,$CF,$CE,$0
       DC.B    $0,$CD,$CC,$0
       DC.B    $0,$DF,$DE,$0
       DC.B    $0,$D9,$D8,$0
       DC.B    $0,$BD,$BC,$0
       DC.B    $0,$D7,$D6,$0
       DC.B    $0,$D3,$D2,$0
       DC.B    $0,$97,$96,$0
       DC.B    $0,$DD,$DC,$0
       DC.B    $0,$9B,$9A,$0
       DC.B    $0,$9D,$9C,$0
       DC.B    $0,$D5,$D4,$0
       DC.B    $3F,$4B,$4A,$3E
       DC.B    $3F,$E5,$E4,$3E
       DC.B    $3F,$49,$48,$3E
       DC.B    $3F,$FF,$FE,$3E
       DC.B    $0,$73,$72,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$5F,$5E,$0
       DC.B    $0,$5D,$5C,$0
       DC.B    $0,$5B,$5A,$0
       DC.B    $0,$59,$58,$0
       DC.B    $0,$57,$56,$0
       DC.B    $0,$55,$54,$0
       DC.B    $0,$53,$52,$0
       DC.B    $0,$51,$50,$0
       DC.B    $0,$4F,$4E,$0
       DC.B    $0,$4D,$4C,$0
       DC.B    $0,$41,$40,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $3F,$7B,$7A,$3E
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $3F,$F9,$F8,$3E
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $3F,$AB,$AA,$3E
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $3F,$AD,$AC,$3E
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $3F,$CB,$CA,$3E
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$E9,$E8,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$AD,$AC,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$AD,$AC,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$CB,$CA,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
       DC.B    $0,$0,$0,$0
        END


