_  __   _  _         _ _     _      _           _           
  __| |/ /_ | || |     __| (_)___| | __ (_)_ __   __| | _____  __
 / _` | '_ \| || |_   / _` | / __| |/ / | | '_ \ / _` |/ _ \ \/ /
| (_| | (_) |__   _| | (_| | \__ \   <  | | | | | (_| |  __/>  < 
 \__,_|\___/   |_|    \__,_|_|___/_|\_\ |_|_| |_|\__,_|\___/_/\_\
                                                                 
            

KEYMAC.S

FILE INFORMATION

FILENAME(S): KEYMAC.S

FILE TYPE(S): PRG

FILE SIZE: 6K

FIRST SEEN: 2025-10-19 22:48:27

APPEARS ON: 3 disk(s)

FILE HASH

84cae588056e46ef7fa87bf78ebebccd5cf95e295c82e6ab451087b0339275ff

FOUND ON DISKS (3 DISKS)

DISK TITLE FILENAME FILE TYPE COLLECTION TRACK SECTOR ACTIONS
SNAPSHOT64 KEYMAC.S PRG Radd Maxx 14 9 DOWNLOAD FILE
MERLIN KEYMAC.S PRG High Voltage Complete C64 Collection 20 6 DOWNLOAD FILE
MERLIN KEYMAC.S PRG High Voltage Complete C64 Collection 20 6 DOWNLOAD FILE

FILE CONTENT & ANALYSIS

00000000: 00 0A 2A 2A 2A 2A 2A 2A  2A 2A 2A 2A 2A 2A 2A 2A  |..**************|
00000010: 2A 2A 2A 2A 2A 2A 2A 2A  2A 2A 2A 2A 2A 2A 2A 2A  |****************|
00000020: 2A 2A 0D 2A A0 A0 A0 A0  A0 A0 A0 A0 A0 A0 A0 A0  |**.*............|
00000030: A0 A0 A0 A0 A0 A0 A0 A0  A0 A0 A0 A0 A0 A0 A0 A0  |................|
00000040: A0 A0 2A 0D 2A A0 A0 A0  A0 A0 A0 A0 A0 A0 A0 A0  |..*.*...........|
00000050: 6B 65 79 6D 61 63 A0 A0  A0 A0 A0 A0 A0 A0 A0 A0  |keymac..........|
00000060: A0 A0 A0 2A 0D 2A A0 A0  A0 A0 A0 A0 A0 A0 A0 A0  |...*.*..........|
00000070: A0 A0 A0 A0 A0 A0 A0 A0  A0 A0 A0 A0 A0 A0 A0 A0  |................|
00000080: A0 A0 A0 A0 2A 0D 2A A0  65 58 41 4D 50 4C 45 53  |....*.*.eXAMPLES|
00000090: A0 4F 46 A0 55 53 45 53  A0 4F 46 A0 6D 65 72 6C  |.OF.USES.OF.merl|
000000A0: 69 6E 27 53 A0 2A 0D 2A  A0 41 44 44 2D 45 44 49  |in'S.*.*.ADD-EDI|
000000B0: 54 A0 4B 45 59 42 4F 41  52 44 A0 48 4F 4F 4B 53  |T.KEYBOARD.HOOKS|
000000C0: A0 41 54 A0 A0 A0 2A 0D  2A A0 24 37 65 2D 24 37  |.AT...*.*.$7e-$7|
000000D0: 66 2E A0 A0 A0 A0 A0 A0  A0 A0 A0 A0 A0 A0 A0 A0  |f...............|
000000E0: A0 A0 A0 A0 A0 A0 A0 2A  0D 2A A0 A0 A0 A0 A0 A0  |.......*.*......|
000000F0: A0 A0 A0 A0 A0 A0 A0 A0  A0 A0 A0 A0 A0 A0 A0 A0  |................|
00000100: A0 A0 A0 A0 A0 A0 A0 A0  2A 0D 2A A0 A0 A0 67 4C  |........*.*...gL|
00000110: 45 4E A0 65 2E A0 62 52  45 44 4F 4E A0 A0 A0 32  |EN.e..bREDON...2|
00000120: 2F 32 30 2F 38 33 A0 A0  A0 2A 0D 2A 2D 2D 2D 2D  |/20/83...*.*----|
00000130: 2D 2D 2D 2D 2D 2D 2D 2D  2D 2D 2D 2D 2D 2D 2D 2D  |----------------|
00000140: 2D 2D 2D 2D 2D 2D 2D 2D  2D 2D 2A 0D 2A A0 74 4F  |----------*.*.tO|
00000150: A0 55 53 45 3A A0 72 75  6E A0 44 45 53 49 52 45  |.USE:.run.DESIRE|
00000160: 44 A0 50 52 4F 47 52 41  4D A0 A0 2A 0D 2A A0 46  |D.PROGRAM..*.*.F|
00000170: 52 4F 4D A0 65 78 65 63  A0 28 67 29 A0 54 48 45  |ROM.exec.(g).THE|
00000180: 4E A0 49 4E 56 4F 4B 45  A0 A0 A0 A0 2A 0D 2A A0  |N.INVOKE....*.*.|
00000190: 57 49 54 48 A0 75 73 65  72 A0 46 52 4F 4D A0 45  |WITH.user.FROM.E|
000001A0: 44 49 54 4F 52 2E A0 A0  A0 A0 A0 A0 A0 2A 0D 2A  |DITOR........*.*|
000001B0: 2A 2A 2A 2A 2A 2A 2A 2A  2A 2A 2A 2A 2A 2A 2A 2A  |****************|
000001C0: 2A 2A 2A 2A 2A 2A 2A 2A  2A 2A 2A 2A 2A 2A 2A 0D  |***************.|
000001D0: 0D 20 74 72 0D 20 65 78  70 20 6F 66 66 0D 0D 79  |. tr. exp off..y|
000001E0: 20 3D 20 31 0D 79 65 73  20 3D 20 31 0D 6E 20 3D  | = 1.yes = 1.n =|
000001F0: 20 30 0D 6E 6F 20 3D 20  30 0D 73 61 76 6F 62 6A  | 0.no = 0.savobj|
00000200: 20 6B 62 64 20 27 64 4F  A0 59 4F 55 A0 57 41 4E  | kbd 'dO.YOU.WAN|
00000210: 54 A0 4F 42 4A 45 43 54  A0 43 4F 44 45 A0 53 41  |T.OBJECT.CODE.SA|
00000220: 56 45 44 3F A0 28 59 2F  4E 29 27 0D 70 72 6F 67  |VED?.(Y/N)'.prog|
00000230: 6E 75 6D 20 6B 62 64 20  27 61 53 53 45 4D 42 4C  |num kbd 'aSSEMBL|
00000240: 45 A0 57 48 49 43 48 A0  50 52 4F 47 52 41 4D 3F  |E.WHICH.PROGRAM?|
00000250: A0 28 31 2D 33 29 27 0D  20 65 72 72 20 70 72 6F  |.(1-3)'. err pro|
00000260: 67 6E 75 6D 2D 31 2F 33  0D 0D 69 6E 76 65 63 20  |gnum-1/3..invec |
00000270: 3D 20 24 37 65 20 3B 65  44 49 54 A0 4D 4F 44 45  |= $7e ;eDIT.MODE|
00000280: A0 4B 45 59 A0 49 4E 50  55 54 A0 56 45 43 54 4F  |.KEY.INPUT.VECTO|
00000290: 52 0D 65 66 6C 67 20 3D  20 24 33 38 20 3B 6D 49  |R.eflg = $38 ;mI|
000002A0: 4E 55 53 A0 57 48 45 4E  A0 49 4E A0 45 44 49 54  |NUS.WHEN.IN.EDIT|
000002B0: A0 4D 4F 44 45 0D 75 73  72 63 6D 64 20 3D 20 24  |.MODE.usrcmd = $|
000002C0: 33 32 65 20 3B 75 73 65  72 A0 56 45 43 54 4F 52  |32e ;user.VECTOR|
000002D0: 0D 73 74 72 69 6E 67 73  20 3D 20 24 38 36 30 20  |.strings = $860 |
000002E0: 3B 65 44 49 54 4F 52 A0  50 55 54 53 A0 53 54 52  |;eDITOR.PUTS.STR|
000002F0: 49 4E 47 A0 48 45 52 45  0D 67 65 74 69 6E 20 3D  |ING.HERE.getin =|
00000300: 20 24 66 66 65 34 0D 0D  73 74 61 64 72 20 6D 61  | $ffe4..stadr ma|
00000310: 63 0D 20 6C 64 61 20 23  5D 31 0D 20 73 74 61 20  |c. lda #]1. sta |
00000320: 5D 32 0D 20 6C 64 61 20  23 3E 5D 31 0D 20 73 74  |]2. lda #>]1. st|
00000330: 61 20 5D 32 2B 31 0D 20  3C 3C 3C 0D 0D 2A 2A 2A  |a ]2+1. <<<..***|
00000340: 2A 2A 2A 2A 2A 2A 2A 2A  2A 2A 2A 2A 2A 2A 2A 2A  |****************|
00000350: 2A 2A 2A 2A 2A 2A 2A 2A  2A 2A 2A 2A 2A 0D 2A 0D  |*************.*.|
00000360: 2A A0 63 4F 4D 4D 4F 4E  A0 43 4F 44 45 A0 54 4F  |*.cOMMON.CODE.TO|
00000370: A0 41 4C 4C A0 50 41 52  54 53 3A 0D 0D 20 6F 72  |.ALL.PARTS:.. or|
00000380: 67 20 24 39 30 30 0D 0D  20 3E 3E 3E 20 73 74 61  |g $900.. >>> sta|
00000390: 64 72 2E 73 74 61 72 74  3B 75 73 72 63 6D 64 0D  |dr.start;usrcmd.|
000003A0: 20 6C 64 79 20 23 24 34  30 30 2D 24 33 33 34 0D  | ldy #$400-$334.|
000003B0: 6D 6F 76 65 20 6C 64 61  20 6E 6F 77 73 74 61 72  |move lda nowstar|
000003C0: 74 2D 31 2C 79 0D 20 73  74 61 20 73 74 61 72 74  |t-1,y. sta start|
000003D0: 2D 31 2C 79 0D 20 64 65  79 0D 20 62 6E 65 20 6D  |-1,y. dey. bne m|
000003E0: 6F 76 65 0D 20 72 74 73  20 3B 65 4E 44 A0 4F 46  |ove. rts ;eND.OF|
000003F0: A0 43 4F 4D 4D 4F 4E A0  53 54 55 46 46 0D 0D 6E  |.COMMON.STUFF..n|
00000400: 6F 77 73 74 61 72 74 20  6F 72 67 20 24 33 33 34  |owstart org $334|
00000410: 0D 0D 2A 2A 2A 2A 2A 2A  2A 2A 2A 2A 2A 2A 2A 2A  |..**************|
00000420: 2A 2A 2A 2A 2A 2A 2A 2A  2A 2A 2A 2A 2A 2A 2A 2A  |****************|
00000430: 2A 2A 0D 2A 0D 2A A0 A0  A0 65 58 41 4D 50 4C 45  |**.*.*...eXAMPLE|
00000440: A0 31 A0 28 6B 45 59 42  4F 41 52 44 A0 4D 41 43  |.1.(kEYBOARD.MAC|
00000450: 52 4F 53 29 0D 2A 0D 2A  A0 77 49 54 48 A0 22 5C  |ROS).*.*.wITH."\|
00000460: 22 A0 4C 45 41 44 A0 49  4E 2C A0 50 52 49 4E 54  |".LEAD.IN,.PRINT|
00000470: 53 A0 41 A0 2A 0D 2A A0  46 4F 4C 4C 4F 57 45 44  |S.A.*.*.FOLLOWED|
00000480: A0 42 59 A0 33 31 A0 43  4F 50 49 45 53 A0 4F 46  |.BY.31.COPIES.OF|
00000490: A0 43 48 52 0D 2A A0 54  59 50 45 44 A0 41 46 54  |.CHR.*.TYPED.AFT|
000004A0: 45 52 A0 65 73 63 2E A0  A0 69 46 A0 54 48 49 53  |ER.esc...iF.THIS|
000004B0: A0 49 53 A0 41 0D 2A A0  53 50 41 43 45 A0 54 48  |.IS.A.*.SPACE.TH|
000004C0: 45 4E A0 41 4E 4F 54 48  45 52 A0 2A A0 49 53 A0  |EN.ANOTHER.*.IS.|
000004D0: 50 55 54 A0 41 54 0D 2A  A0 54 48 45 A0 45 4E 44  |PUT.AT.*.THE.END|
000004E0: 2E A0 A0 74 48 45 A0 43  55 52 53 4F 52 A0 49 53  |...tHE.CURSOR.IS|
000004F0: A0 54 48 45 4E 0D 2A A0  50 4C 41 43 45 44 A0 4F  |.THEN.*.PLACED.O|
00000500: 4E A0 54 48 45 A0 46 49  52 53 54 A0 43 48 41 52  |N.THE.FIRST.CHAR|
00000510: 41 43 54 45 52 2E 0D 2A  0D 2A 2A 2A 2A 2A 2A 2A  |ACTER..*.*******|
00000520: 2A 2A 2A 2A 2A 2A 2A 2A  2A 2A 2A 2A 2A 2A 2A 2A  |****************|
00000530: 2A 2A 2A 2A 2A 2A 2A 2A  2A 0D 0D 20 64 6F 20 70  |*********.. do p|
00000540: 72 6F 67 6E 75 6D 2D 31  0D 20 65 6C 73 65 0D 0D  |rognum-1. else..|
00000550: 73 74 61 72 74 20 3E 3E  3E 20 73 74 61 64 72 2E  |start >>> stadr.|
00000560: 69 6E 70 75 74 3B 69 6E  76 65 63 0D 73 65 74 73  |input;invec.sets|
00000570: 74 74 20 73 65 63 0D 20  72 6F 72 20 73 74 61 74  |tt sec. ror stat|
00000580: 65 20 3B 69 4E 49 54 A0  73 74 61 74 65 0D 20 72  |e ;iNIT.state. r|
00000590: 74 73 0D 0D 69 6E 70 75  74 20 62 69 74 20 73 74  |ts..input bit st|
000005A0: 61 74 65 20 3B 6D 41 43  52 4F A0 49 4E A0 45 46  |ate ;mACRO.IN.EF|
000005B0: 46 45 43 54 3F 0D 20 62  70 6C 20 6E 78 73 74 61  |FECT?. bpl nxsta|
000005C0: 74 65 20 3B 62 52 41 4E  43 48 A0 49 46 A0 53 4F  |te ;bRANCH.IF.SO|
000005D0: 0D 20 73 74 79 20 79 73  61 76 0D 66 72 73 74 6B  |. sty ysav.frstk|
000005E0: 65 79 20 6A 73 72 20 67  65 74 69 6E 20 3B 6F 54  |ey jsr getin ;oT|
000005F0: 48 45 52 57 49 53 45 2C  A0 47 45 54 A0 4B 45 59  |HERWISE,.GET.KEY|
00000600: 0D 20 74 61 79 0D 20 62  65 71 20 66 72 73 74 6B  |. tay. beq frstk|
00000610: 65 79 0D 20 63 6D 70 20  23 27 5C 27 20 3B 6C 45  |ey. cmp #'\' ;lE|
00000620: 41 44 A0 49 4E 3F 0D 20  62 65 71 20 6E 78 6B 20  |AD.IN?. beq nxk |
00000630: 3B 62 52 41 4E 43 48 A0  49 46 A0 53 4F 0D 20 6C  |;bRANCH.IF.SO. l|
00000640: 64 79 20 79 73 61 76 0D  72 65 74 20 72 74 73 20  |dy ysav.ret rts |
00000650: 20 3B 72 45 54 55 52 4E  A0 57 49 54 48 A0 4B 45  | ;rETURN.WITH.KE|
00000660: 59 A0 49 46 A0 4E 4F 54  0D 0D 6E 78 6B 20 6A 73  |Y.IF.NOT..nxk js|
00000670: 72 20 67 65 74 69 6E 20  3B 67 45 54 A0 4B 45 59  |r getin ;gET.KEY|
00000680: A0 41 46 54 45 52 A0 4C  45 41 44 49 4E 0D 20 74  |.AFTER.LEADIN. t|
00000690: 61 79 0D 20 62 65 71 20  6E 78 6B 0D 20 6C 64 79  |ay. beq nxk. ldy|
000006A0: 20 79 73 61 76 0D 20 62  69 74 20 72 65 74 20 3B  | ysav. bit ret ;|
000006B0: 63 4F 4E 54 52 4F 4C A0  43 48 52 3F 0D 20 62 65  |cONTROL.CHR?. be|
000006C0: 71 20 73 65 74 73 74 74  20 3B 61 42 4F 52 54 A0  |q setstt ;aBORT.|
000006D0: 49 46 A0 53 4F 0D 20 73  74 61 20 63 68 61 72 61  |IF.SO. sta chara|
000006E0: 63 20 3B 73 41 56 45 A0  4E 45 58 54 A0 43 48 52  |c ;sAVE.NEXT.CHR|
000006F0: 0D 20 6C 64 61 20 23 33  31 20 3B 69 4E 49 54 A0  |. lda #31 ;iNIT.|
00000700: 43 4F 55 4E 54 0D 20 73  74 61 20 73 74 61 74 65  |COUNT. sta state|
00000710: 0D 61 73 74 20 6C 64 61  20 23 27 2A 27 20 3B 73  |.ast lda #'*' ;s|
00000720: 45 4E 44 A0 49 4E 49 54  49 41 4C A0 2A 0D 20 72  |END.INITIAL.*. r|
00000730: 74 73 0D 6E 78 73 74 61  74 65 20 6C 64 61 20 63  |ts.nxstate lda c|
00000740: 68 61 72 61 63 20 3B 67  45 54 A0 43 48 52 0D 20  |harac ;gET.CHR. |
00000750: 64 65 63 20 73 74 61 74  65 20 3B 63 4F 55 4E 54  |dec state ;cOUNT|
00000760: 44 4F 57 4E 0D 20 62 6E  65 20 70 6C 75 73 3F 20  |DOWN. bne plus? |
00000770: 3B 6C 41 53 54 A0 43 4F  55 4E 54 A0 49 46 A0 45  |;lAST.COUNT.IF.E|
00000780: 51 55 41 4C 0D 20 63 6D  70 20 23 27 A0 27 20 3B  |QUAL. cmp #'.' ;|
00000790: 77 41 53 A0 43 48 52 A0  41 A0 53 50 41 43 45 3F  |wAS.CHR.A.SPACE?|
000007A0: 0D 20 62 65 71 20 61 73  74 20 3B 73 55 42 53 54  |. beq ast ;sUBST|
000007B0: 49 54 55 45 A0 2A A0 46  4F 52 A0 4C 41 53 54 A0  |ITUE.*.FOR.LAST.|
000007C0: 49 46 A0 53 4F 0D 20 72  74 73 0D 70 6C 75 73 3F  |IF.SO. rts.plus?|
000007D0: 20 62 70 6C 20 62 61 63  6B 20 3B 62 52 41 4E 43  | bpl back ;bRANC|
000007E0: 48 A0 49 46 A0 4E 4F 54  A0 44 4F 4E 45 0D 20 6C  |H.IF.NOT.DONE. l|
000007F0: 64 61 20 23 24 39 66 26  27 62 27 20 3B 70 55 54  |da #$9f&'b' ;pUT|
00000800: A0 43 55 52 53 4F 52 A0  4F 4E A0 31 53 54 A0 43  |.CURSOR.ON.1ST.C|
00000810: 48 52 0D 62 61 63 6B 20  72 74 73 0D 0D 79 73 61  |HR.back rts..ysa|
00000820: 76 20 62 72 6B 0D 73 74  61 74 65 20 62 72 6B 0D  |v brk.state brk.|
00000830: 63 68 61 72 61 63 20 62  72 6B 0D 20 64 6F 20 73  |charac brk. do s|
00000840: 61 76 6F 62 6A 0D 20 73  61 76 65 20 22 72 65 70  |avobj. save "rep|
00000850: 65 61 74 22 0D 20 66 69  6E 0D 20 66 69 6E 0D 0D  |eat". fin. fin..|
00000860: 2A 2A 2A 2A 2A 2A 2A 2A  2A 2A 2A 2A 2A 2A 2A 2A  |****************|
00000870: 2A 2A 2A 2A 2A 2A 2A 2A  2A 2A 2A 2A 2A 2A 2A 2A  |****************|
00000880: 2A 2A 2A 0D 2A 0D 2A A0  A0 A0 65 58 41 4D 50 4C  |***.*.*...eXAMPL|
00000890: 45 A0 32 A0 28 6B 45 59  42 4F 41 52 44 A0 4D 41  |E.2.(kEYBOARD.MA|
000008A0: 43 52 4F 53 29 0D 2A 0D  2A A0 6B 45 59 42 4F 41  |CROS).*.*.kEYBOA|
000008B0: 52 44 A0 4D 41 43 52 4F  53 A0 44 45 46 49 4E 45  |RD.MACROS.DEFINE|
000008C0: 44 A0 46 4F 52 A0 4B 45  59 53 0D 2A A0 A0 A0 2A  |D.FOR.KEYS.*...*|
000008D0: A0 3E A0 22 A0 27 A0 23  A0 2B A0 78 A0 79 A0 6C  |.>.".'.#.+.x.y.l|
000008E0: A0 73 A0 2D A0 6F A0 63  A0 61 A0 65 0D 2A A0 57  |.s.-.o.c.a.e.*.W|
000008F0: 49 54 48 A0 54 48 45 A0  53 48 49 46 54 45 44 A0  |ITH.THE.SHIFTED.|
00000900: 4F 4E 45 53 A0 45 51 55  49 56 41 4C 45 4E 54 0D  |ONES.EQUIVALENT.|
00000910: 2A A0 54 4F A0 54 48 45  49 52 A0 55 4E 53 48 49  |*.TO.THEIR.UNSHI|
00000920: 46 54 45 44 A0 43 4F 55  4E 54 45 52 50 41 52 54  |FTED.COUNTERPART|
00000930: 53 2E 0D 2A 0D 2A A0 6D  4F 53 54 A0 4F 46 A0 54  |S..*.*.mOST.OF.T|
00000940: 48 45 53 45 A0 41 52 45  A0 56 41 52 49 41 4E 54  |HESE.ARE.VARIANT|
00000950: 53 A0 4F 46 0D 2A A0 54  48 45 A0 49 4E 44 49 52  |S.OF.*.THE.INDIR|
00000960: 45 43 54 2C A0 49 4E 44  45 58 45 44 A0 42 59 A0  |ECT,.INDEXED.BY.|
00000970: 79 0D 2A A0 4F 50 43 4F  44 45 53 2C A0 45 58 49  |y.*.OPCODES,.EXI|
00000980: 54 49 4E 47 A0 49 4E A0  49 4E 53 45 52 54 A0 4D  |TING.IN.INSERT.M|
00000990: 4F 44 45 0D 2A A0 42 45  54 57 45 45 4E A0 54 48  |ODE.*.BETWEEN.TH|
000009A0: 45 A0 50 41 52 45 4E 54  48 45 53 45 53 2E 0D 2A  |E.PARENTHESES..*|
000009B0: 0D 2A 2A 2A 2A 2A 2A 2A  2A 2A 2A 2A 2A 2A 2A 2A  |.***************|
000009C0: 2A 2A 2A 2A 2A 2A 2A 2A  2A 2A 2A 2A 2A 2A 2A 2A  |****************|
000009D0: 2A 2A 2A 2A 0D 0D 20 64  6F 20 70 72 6F 67 6E 75  |****.. do prognu|
000009E0: 6D 2D 32 0D 20 65 6C 73  65 0D 0D 73 74 61 74 65  |m-2. else..state|
000009F0: 20 3D 20 24 34 61 20 3B  7A 45 52 4F A0 50 41 47  | = $4a ;zERO.PAG|
00000A00: 45 A0 55 53 45 44 A0 54  4F 0D 78 73 61 76 20 3D  |E.USED.TO.xsav =|
00000A10: 20 24 34 62 20 3B A0 4D  41 4B 45 A0 50 52 4F 47  | $4b ;.MAKE.PROG|
00000A20: 52 41 4D A0 46 49 54 0D  79 73 61 76 20 3D 20 24  |RAM.FIT.ysav = $|
00000A30: 34 63 20 3B A0 49 4E A0  24 33 34 34 A0 53 50 41  |4c ;.IN.$344.SPA|
00000A40: 43 45 0D 69 6E 64 65 78  20 3D 20 24 34 64 20 3B  |CE.index = $4d ;|
00000A50: 74 48 45 53 45 A0 41 52  45 A0 4E 4F 54 A0 55 53  |tHESE.ARE.NOT.US|
00000A60: 45 44 A0 42 59 A0 65 44  49 54 4F 52 0D 0D 73 74  |ED.BY.eDITOR..st|
00000A70: 61 72 74 20 3E 3E 3E 20  73 74 61 64 72 2E 69 6E  |art >>> stadr.in|
00000A80: 70 75 74 3B 69 6E 76 65  63 0D 20 73 65 63 0D 20  |put;invec. sec. |
00000A90: 72 6F 72 20 73 74 61 74  65 20 3B 69 4E 49 54 A0  |ror state ;iNIT.|
00000AA0: 73 74 61 74 65 0D 20 72  74 73 0D 0D 69 6E 70 75  |state. rts..inpu|
00000AB0: 74 20 73 74 78 20 78 73  61 76 20 3B 6D 55 53 54  |t stx xsav ;mUST|
00000AC0: A0 50 52 45 53 45 52 56  45 A0 78 A0 28 26 A0 79  |.PRESERVE.x.(&.y|
00000AD0: 29 0D 20 62 69 74 20 73  74 61 74 65 20 3B A0 49  |). bit state ;.I|
00000AE0: 46 A0 55 53 45 44 2E 0D  20 62 70 6C 20 67 65 74  |F.USED.. bpl get|
00000AF0: 69 6E 64 65 78 20 3B 62  52 41 4E 43 48 A0 49 46  |index ;bRANCH.IF|
00000B00: A0 44 4F 49 4E 47 A0 4D  41 43 52 4F 0D 66 72 73  |.DOING.MACRO.frs|
00000B10: 74 6B 65 79 20 6A 73 72  20 67 65 74 6B 65 79 20  |tkey jsr getkey |
00000B20: 3B 6F 54 48 45 52 57 49  53 45 2C A0 47 45 54 A0  |;oTHERWISE,.GET.|
00000B30: 4B 45 59 0D 20 63 6D 70  20 23 27 5C 27 20 3B 22  |KEY. cmp #'\' ;"|
00000B40: 5C 22 A0 4C 45 41 44 A0  49 4E 3F 0D 20 62 6E 65  |\".LEAD.IN?. bne|
00000B50: 20 65 78 69 74 20 3B 65  58 49 54 A0 49 46 A0 4E  | exit ;eXIT.IF.N|
00000B60: 4F 54 0D 6E 78 6B 20 6A  73 72 20 67 65 74 6B 65  |OT.nxk jsr getke|
00000B70: 79 20 3B 67 45 54 A0 4B  45 59 A0 41 46 54 45 52  |y ;gET.KEY.AFTER|
00000B80: A0 4C 45 41 44 A0 49 4E  0D 20 63 6D 70 20 23 27  |.LEAD.IN. cmp #'|
00000B90: 30 27 20 3B 73 48 49 46  54 A0 43 48 52 3F 0D 20  |0' ;sHIFT.CHR?. |
00000BA0: 62 67 65 20 6E 6F 6F 72  0D 20 6F 72 61 20 23 25  |bge noor. ora #%|
00000BB0: 30 30 30 31 30 30 30 30  20 3B 73 48 49 46 54 A0  |00010000 ;sHIFT.|
00000BC0: 44 4F 57 4E 0D 6E 6F 6F  72 20 73 74 61 20 65 6E  |DOWN.noor sta en|
00000BD0: 64 74 62 6C 20 3B 73 41  56 45 A0 43 55 52 52 45  |dtbl ;sAVE.CURRE|
00000BE0: 4E 54 A0 49 4E 50 55 54  0D 20 6F 72 61 20 23 24  |NT.INPUT. ora #$|
00000BF0: 38 30 0D 20 73 74 61 20  65 6E 64 74 62 6C 2B 31  |80. sta endtbl+1|
00000C00: 20 3B A0 49 4E A0 43 41  53 45 A0 43 4D 44 A0 4E  | ;.IN.CASE.CMD.N|
00000C10: 4F 54 A0 46 4F 55 4E 44  0D 20 6C 64 78 20 23 30  |OT.FOUND. ldx #0|
00000C20: 20 3B A0 54 4F A0 55 53  45 A0 46 4F 52 A0 49 54  | ;.TO.USE.FOR.IT|
00000C30: 0D 63 6D 64 3F 20 6C 64  61 20 6D 61 63 74 62 6C  |.cmd? lda mactbl|
00000C40: 2C 78 20 3B 6C 4F 4F 4B  A0 46 4F 52 A0 43 4F 4D  |,x ;lOOK.FOR.COM|
00000C50: 4D 41 4E 44 0D 20 63 6D  70 20 65 6E 64 74 62 6C  |MAND. cmp endtbl|
00000C60: 20 3B 6D 41 54 43 48 A0  49 4E 50 55 54 3F 0D 20  | ;mATCH.INPUT?. |
00000C70: 62 65 71 20 67 6F 74 6D  61 63 20 3B 62 52 41 4E  |beq gotmac ;bRAN|
00000C80: 43 48 A0 49 46 A0 53 4F  0D 67 65 74 63 68 72 20  |CH.IF.SO.getchr |
00000C90: 69 6E 78 20 20 3B 6D 4F  56 45 A0 54 4F A0 4E 45  |inx  ;mOVE.TO.NE|
00000CA0: 58 54 A0 4D 41 43 0D 20  6C 64 61 20 6D 61 63 74  |XT.MAC. lda mact|
00000CB0: 62 6C 2C 78 0D 20 62 70  6C 20 67 65 74 63 68 72  |bl,x. bpl getchr|
00000CC0: 20 3B 6C 4F 4F 50 A0 54  49 4C 4C A0 4D 49 4E 55  | ;lOOP.TILL.MINU|
00000CD0: 53 0D 20 69 6E 78 20 20  3B 70 4F 49 4E 54 A0 54  |S. inx  ;pOINT.T|
00000CE0: 4F A0 43 4D 44 A0 42 59  54 45 0D 20 62 6E 65 20  |O.CMD.BYTE. bne |
00000CF0: 63 6D 64 3F 20 3B 61 4C  57 41 59 53 A0 54 41 4B  |cmd? ;aLWAYS.TAK|
00000D00: 45 4E 0D 67 6F 74 6D 61  63 20 69 6E 78 20 20 3B  |EN.gotmac inx  ;|
00000D10: 70 4F 49 4E 54 A0 54 4F  A0 4D 41 43 52 4F A0 53  |pOINT.TO.MACRO.S|
00000D20: 45 4C 45 43 54 45 44 0D  73 78 69 20 73 74 78 20  |ELECTED.sxi stx |
00000D30: 69 6E 64 65 78 0D 67 65  74 69 6E 64 65 78 20 6C  |index.getindex l|
00000D40: 64 78 20 69 6E 64 65 78  20 3B 67 45 54 A0 49 4E  |dx index ;gET.IN|
00000D50: 44 45 58 A0 54 4F A0 43  55 52 52 45 4E 54 A0 43  |DEX.TO.CURRENT.C|
00000D60: 48 52 0D 20 69 6E 63 20  69 6E 64 65 78 20 3B 70  |HR. inc index ;p|
00000D70: 4F 49 4E 54 A0 54 4F A0  4E 45 58 54 A0 43 48 52  |OINT.TO.NEXT.CHR|
00000D80: 0D 20 6C 64 61 20 6D 61  63 74 62 6C 2C 78 20 3B  |. lda mactbl,x ;|
00000D90: 67 45 54 A0 43 55 52 52  45 4E 54 A0 43 48 52 A0  |gET.CURRENT.CHR.|
00000DA0: 4F 46 A0 4D 41 43 52 4F  2E 0D 20 73 74 61 20 73  |OF.MACRO.. sta s|
00000DB0: 74 61 74 65 20 3B 63 4C  45 41 52 A0 46 4C 41 47  |tate ;cLEAR.FLAG|
00000DC0: A0 4F 4E A0 4C 41 53 54  A0 43 48 52 0D 20 61 6E  |.ON.LAST.CHR. an|
00000DD0: 64 20 23 24 37 66 20 3B  6D 55 53 54 A0 41 4C 57  |d #$7f ;mUST.ALW|
00000DE0: 41 59 53 A0 43 4C 52 A0  48 49 47 48 A0 42 49 54  |AYS.CLR.HIGH.BIT|
00000DF0: 0D 20 74 61 78 20 20 3B  69 4E A0 43 41 53 45 A0  |. tax  ;iN.CASE.|
00000E00: 49 54 A0 49 53 A0 77 6E  64 75 70 2D 6D 61 63 74  |IT.IS.wndup-mact|
00000E10: 62 6C 0D 20 63 6D 70 20  23 77 6E 64 75 70 2D 6D  |bl. cmp #wndup-m|
00000E20: 61 63 74 62 6C 20 3B 69  53 A0 49 54 A0 57 49 4E  |actbl ;iS.IT.WIN|
00000E30: 44 55 50 A0 4D 41 43 3F  0D 20 62 65 71 20 73 78  |DUP.MAC?. beq sx|
00000E40: 69 20 3B 62 52 41 4E 43  48 A0 49 46 A0 53 4F 0D  |i ;bRANCH.IF.SO.|
00000E50: 65 78 69 74 20 6C 64 78  20 78 73 61 76 0D 20 72  |exit ldx xsav. r|
00000E60: 74 73 0D 0D 67 65 74 6B  65 79 20 73 74 79 20 79  |ts..getkey sty y|
00000E70: 73 61 76 0D 67 6B 20 6A  73 72 20 67 65 74 69 6E  |sav.gk jsr getin|
00000E80: 0D 20 74 61 79 0D 20 62  65 71 20 67 6B 0D 20 6C  |. tay. beq gk. l|
00000E90: 64 79 20 79 73 61 76 0D  20 72 74 73 0D 0D 6D 61  |dy ysav. rts..ma|
00000EA0: 63 74 62 6C 0D 20 64 63  69 20 27 3E A0 3E 3E 3E  |ctbl. dci '>.>>>|
00000EB0: A0 27 0D 20 74 78 74 20  27 32 A0 74 78 74 A0 22  |.'. txt '2.txt."|
00000EC0: 22 27 0D 20 64 66 62 20  24 31 31 2C 24 39 66 26  |"'. dfb $11,$9f&|
00000ED0: 22 69 22 20 3B 62 41 43  4B 53 50 41 43 45 A0 26  |"i" ;bACKSPACE.&|
00000EE0: A0 49 4E 53 45 52 54 0D  20 74 78 74 20 3A 37 A0  |.INSERT. txt :7.|
00000EF0: 74 78 74 A0 27 27 3A 0D  20 64 66 62 20 24 31 31  |txt.'':. dfb $11|
00000F00: 2C 24 39 66 26 22 69 22  0D 20 64 63 69 20 27 33  |,$9f&"i". dci '3|
00000F10: A0 6C 64 61 A0 23 27 0D  20 64 63 69 20 27 58 A0  |.lda.#'. dci 'X.|
00000F20: 6C 64 78 A0 23 27 0D 20  64 63 69 20 27 59 A0 6C  |ldx.#'. dci 'Y.l|
00000F30: 64 79 A0 23 27 0D 20 74  78 74 20 27 3B A0 61 64  |dy.#'. txt ';.ad|
00000F40: 63 27 0D 20 64 66 62 20  77 6E 64 75 70 2D 6D 61  |c'. dfb wndup-ma|
00000F50: 63 74 62 6C 2E 24 38 30  0D 20 74 78 74 20 27 3D  |ctbl.$80. txt '=|
00000F60: A0 73 62 63 27 0D 20 64  66 62 20 77 6E 64 75 70  |.sbc'. dfb wndup|
00000F70: 2D 6D 61 63 74 62 6C 2E  24 38 30 0D 20 74 78 74  |-mactbl.$80. txt|
00000F80: 20 27 4C A0 6C 64 61 27  0D 20 64 66 62 20 77 6E  | 'L.lda'. dfb wn|
00000F90: 64 75 70 2D 6D 61 63 74  62 6C 2E 24 38 30 0D 20  |dup-mactbl.$80. |
00000FA0: 74 78 74 20 27 53 A0 73  74 61 27 0D 20 64 66 62  |txt 'S.sta'. dfb|
00000FB0: 20 77 6E 64 75 70 2D 6D  61 63 74 62 6C 2E 24 38  | wndup-mactbl.$8|
00000FC0: 30 0D 20 74 78 74 20 27  4F A0 6F 72 61 27 0D 20  |0. txt 'O.ora'. |
00000FD0: 64 66 62 20 77 6E 64 75  70 2D 6D 61 63 74 62 6C  |dfb wndup-mactbl|
00000FE0: 2E 24 38 30 0D 20 74 78  74 20 27 43 A0 63 6D 70  |.$80. txt 'C.cmp|
00000FF0: 27 0D 20 64 66 62 20 77  6E 64 75 70 2D 6D 61 63  |'. dfb wndup-mac|
00001000: 74 62 6C 2E 24 38 30 0D  20 74 78 74 20 27 41 A0  |tbl.$80. txt 'A.|
00001010: 61 6E 64 27 0D 20 64 66  62 20 77 6E 64 75 70 2D  |and'. dfb wndup-|
00001020: 6D 61 63 74 62 6C 2E 24  38 30 0D 20 74 78 74 20  |mactbl.$80. txt |
00001030: 27 45 A0 65 6F 72 27 0D  77 6E 64 75 70 20 74 78  |'E.eor'.wndup tx|
00001040: 74 20 27 A0 28 29 2C 79  27 0D 20 68 65 78 20 31  |t '.(),y'. hex 1|
00001050: 31 31 31 31 31 20 3B 62  41 43 4B 53 50 41 43 45  |11111 ;bACKSPACE|
00001060: A0 54 4F A0 42 45 54 57  45 45 4E A0 28 29 0D 20  |.TO.BETWEEN.(). |
00001070: 64 66 62 20 24 39 66 26  22 69 22 20 3B 65 58 49  |dfb $9f&"i" ;eXI|
00001080: 54 A0 49 4E A0 49 4E 53  45 52 54 A0 4D 4F 44 45  |T.IN.INSERT.MODE|
00001090: 0D 0D 65 6E 64 74 62 6C  20 64 61 20 30 20 3B 63  |..endtbl da 0 ;c|
000010A0: 4F 4D 4D 41 4E 44 A0 43  48 52 A0 50 55 54 A0 48  |OMMAND.CHR.PUT.H|
000010B0: 45 52 45 0D 0D 20 65 72  72 20 2A 2D 31 2F 24 34  |ERE.. err *-1/$4|
000010C0: 30 30 0D 20 64 6F 20 73  61 76 6F 62 6A 0D 20 73  |00. do savobj. s|
000010D0: 61 76 65 20 22 6B 65 79  6D 61 63 22 0D 20 66 69  |ave "keymac". fi|
000010E0: 6E 0D 20 66 69 6E 0D 0D  2A 2A 2A 2A 2A 2A 2A 2A  |n. fin..********|
000010F0: 2A 2A 2A 2A 2A 2A 2A 2A  2A 2A 2A 2A 2A 2A 2A 2A  |****************|
00001100: 2A 2A 2A 2A 2A 2A 2A 2A  2A 2A 2A 2A 2A 2A 2A 2A  |****************|
00001110: 2A 0D 2A 0D 2A A0 A0 A0  65 58 41 4D 50 4C 45 A0  |*.*.*...eXAMPLE.|
00001120: 33 A0 28 61 55 54 4F 2D  45 44 49 54 29 0D 2A 0D  |3.(aUTO-EDIT).*.|
00001130: 2A A0 75 73 65 72 22 53  54 52 49 4E 47 22 A0 45  |*.user"STRING".E|
00001140: 53 54 41 42 4C 49 53 48  45 53 A0 41 4E A0 41 55  |STABLISHES.AN.AU|
00001150: 54 4F 2D 45 44 49 54 0D  2A A0 53 54 52 49 4E 47  |TO-EDIT.*.STRING|
00001160: A0 57 48 49 43 48 A0 57  49 4C 4C A0 42 45 A0 45  |.WHICH.WILL.BE.E|
00001170: 58 45 43 55 54 45 44 A0  4F 4E A0 45 41 43 48 0D  |XECUTED.ON.EACH.|
00001180: 2A A0 4C 49 4E 45 A0 4F  46 A0 41 A0 53 55 42 53  |*.LINE.OF.A.SUBS|
00001190: 45 51 55 45 4E 54 A0 65  44 49 54 2E A0 A0 61 4E  |EQUENT.eDIT...aN|
000011A0: A0 61 44 44 2F 69 4E 53  45 52 54 0D 2A A0 57 49  |.aDD/iNSERT.*.WI|
000011B0: 4C 4C A0 44 49 53 43 4F  4E 4E 45 43 54 A0 54 48  |LL.DISCONNECT.TH|
000011C0: 45 A0 52 4F 55 54 49 4E  45 2E 0D 2A 0D 2A A0 65  |E.ROUTINE..*.*.e|
000011D0: 2E 47 2E 2C A0 49 46 A0  22 53 54 52 49 4E 47 22  |.G.,.IF."STRING"|
000011E0: A0 49 53 A0 54 48 45 A0  53 45 51 55 45 4E 43 45  |.IS.THE.SEQUENCE|
000011F0: 0D 2A A0 43 4F 4E 54 52  4F 4C A0 6F 2C A0 43 4F  |.*.CONTROL.o,.CO|
00001200: 4E 54 52 4F 4C A0 6A A0  A0 54 48 45 4E 0D 2A A0  |NTROL.j..THEN.*.|
00001210: 43 4F 4E 54 52 4F 4C A0  6A A0 57 49 4C 4C A0 42  |CONTROL.j.WILL.B|
00001220: 45 A0 49 4E 53 45 52 54  45 44 A0 41 54 A0 54 48  |E.INSERTED.AT.TH|
00001230: 45 0D 2A A0 53 54 41 52  54 A0 4F 46 A0 45 41 43  |E.*.START.OF.EAC|
00001240: 48 A0 4C 49 4E 45 A0 4F  46 A0 54 48 45 A0 45 44  |H.LINE.OF.THE.ED|
00001250: 49 54 A0 52 41 4E 47 45  2E 0D 2A 0D 2A A0 63 4F  |IT.RANGE..*.*.cO|
00001260: 4E 54 52 4F 4C A0 72 A0  46 4F 4C 4C 4F 57 45 44  |NTROL.r.FOLLOWED|
00001270: A0 42 59 A0 3E A0 4F 52  A0 3C A0 47 49 56 45 A0  |.BY.>.OR.<.GIVE.|
00001280: 54 48 45 0D 2A A0 45 46  46 45 43 54 A0 44 55 52  |THE.*.EFFECT.DUR|
00001290: 49 4E 47 A0 54 48 45 A0  41 55 54 4F A0 45 44 49  |ING.THE.AUTO.EDI|
000012A0: 54 A0 4F 46 A0 54 48 45  0D 2A A0 43 55 52 53 4F  |T.OF.THE.*.CURSO|
000012B0: 52 A0 4B 45 59 53 A0 2D  3E A0 41 4E 44 A0 3C 2D  |R.KEYS.->.AND.<-|
000012C0: 2E 0D 2A 2A 2A 2A 2A 2A  2A 2A 2A 2A 2A 2A 2A 2A  |..**************|
000012D0: 2A 2A 2A 2A 2A 2A 2A 2A  2A 2A 2A 2A 2A 2A 2A 2A  |****************|
000012E0: 2A 2A 2A 2A 2A 2A 2A 2A  2A 2A 2A 0D 0D 20 64 6F  |***********.. do|
000012F0: 20 70 72 6F 67 6E 75 6D  2D 33 0D 20 65 6C 73 65  | prognum-3. else|
00001300: 0D 0D 73 74 61 72 74 20  6C 64 79 20 23 2D 31 20  |..start ldy #-1 |
00001310: 3B 6D 4F 56 45 A0 53 54  52 49 4E 47 A0 53 50 45  |;mOVE.STRING.SPE|
00001320: 43 49 46 49 45 44 0D 6E  78 62 20 69 6E 79 20 3B  |CIFIED.nxb iny ;|
00001330: A0 49 4E A0 75 73 65 72  A0 43 4F 4D 4D 41 4E 44  |.IN.user.COMMAND|
00001340: 0D 20 6C 64 61 20 73 74  72 69 6E 67 73 2C 79 0D  |. lda strings,y.|
00001350: 20 73 74 61 20 61 75 74  6F 63 6D 64 2C 79 20 3B  | sta autocmd,y ;|
00001360: 28 6D 41 58 A0 4C 45 4E  47 54 48 A0 3D A0 24 32  |(mAX.LENGTH.=.$2|
00001370: 30 29 0D 20 62 6E 65 20  6E 78 62 0D 20 73 74 61  |0). bne nxb. sta|
00001380: 20 69 6E 64 65 78 20 3B  69 4E 49 54 A0 49 4E 44  | index ;iNIT.IND|
00001390: 45 58 A0 54 4F A0 43 4D  44 0D 20 6C 64 61 20 69  |EX.TO.CMD. lda i|
000013A0: 6E 76 65 63 2B 31 20 3B  69 53 A0 49 54 A0 43 4F  |nvec+1 ;iS.IT.CO|
000013B0: 4E 4E 45 43 54 45 44 A0  4E 4F 57 3F 0D 20 63 6D  |NNECTED.NOW?. cm|
000013C0: 70 20 23 3E 61 75 74 6F  65 64 69 74 0D 20 62 65  |p #>autoedit. be|
000013D0: 71 20 73 65 74 76 65 63  20 3B 73 4B 49 50 A0 49  |q setvec ;sKIP.I|
000013E0: 46 A0 53 4F 0D 20 73 74  61 20 67 65 74 6B 65 79  |F.SO. sta getkey|
000013F0: 2B 32 20 3B 73 41 56 45  A0 4F 4C 44 A0 49 4E 56  |+2 ;sAVE.OLD.INV|
00001400: 45 43 54 4F 52 0D 20 6C  64 61 20 69 6E 76 65 63  |ECTOR. lda invec|
00001410: 0D 20 73 74 61 20 67 65  74 6B 65 79 2B 31 0D 73  |. sta getkey+1.s|
00001420: 65 74 76 65 63 20 3E 3E  3E 20 73 74 61 64 72 2E  |etvec >>> stadr.|
00001430: 61 75 74 6F 65 64 69 74  3B 69 6E 76 65 63 0D 20  |autoedit;invec. |
00001440: 72 74 73 0D 0D 61 75 74  6F 65 64 69 74 20 62 69  |rts..autoedit bi|
00001450: 74 20 65 66 6C 67 20 3B  66 52 4F 4D A0 61 44 44  |t eflg ;fROM.aDD|
00001460: 2F 69 4E 53 45 52 54 A0  4F 52 A0 45 44 49 54 3F  |/iNSERT.OR.EDIT?|
00001470: 0D 20 62 6D 69 20 73 61  76 79 20 3B 62 52 41 4E  |. bmi savy ;bRAN|
00001480: 43 48 A0 49 46 A0 46 52  4F 4D A0 45 44 49 54 0D  |CH.IF.FROM.EDIT.|
00001490: 20 6C 64 61 20 67 65 74  6B 65 79 2B 31 20 3B 64  | lda getkey+1 ;d|
000014A0: 49 53 43 4F 4E 4E 45 43  54 A0 4F 55 52 53 45 4C  |ISCONNECT.OURSEL|
000014B0: 56 45 53 A0 49 46 0D 20  73 74 61 20 69 6E 76 65  |VES.IF. sta inve|
000014C0: 63 20 3B A0 46 52 4F 4D  A0 41 4E A0 61 44 44 A0  |c ;.FROM.AN.aDD.|
000014D0: 4F 52 A0 69 4E 53 45 52  54 0D 20 6C 64 61 20 67  |OR.iNSERT. lda g|
000014E0: 65 74 6B 65 79 2B 32 0D  20 73 74 61 20 69 6E 76  |etkey+2. sta inv|
000014F0: 65 63 2B 31 0D 67 65 74  6B 65 79 20 6A 6D 70 20  |ec+1.getkey jmp |
00001500: 24 66 66 63 66 20 3B 61  44 44 52 45 53 53 A0 43  |$ffcf ;aDDRESS.C|
00001510: 48 41 4E 47 45 44 0D 0D  73 61 76 79 20 73 74 79  |HANGED..savy sty|
00001520: 20 79 73 61 76 20 3B 72  45 4D 45 4D 42 45 52 A0  | ysav ;rEMEMBER.|
00001530: 79 0D 20 6C 64 79 20 69  6E 64 65 78 20 3B 67 45  |y. ldy index ;gE|
00001540: 54 A0 49 4E 44 45 58 A0  54 4F A0 4E 45 58 54 A0  |T.INDEX.TO.NEXT.|
00001550: 43 4D 44 A0 43 48 52 0D  20 69 6E 63 20 69 6E 64  |CMD.CHR. inc ind|
00001560: 65 78 20 3B 70 4F 49 4E  54 A0 54 4F A0 4E 45 58  |ex ;pOINT.TO.NEX|
00001570: 54 A0 4F 4E 45 0D 20 6C  64 61 20 61 75 74 6F 63  |T.ONE. lda autoc|
00001580: 6D 64 2C 79 20 3B 67 45  54 A0 4E 45 58 54 A0 43  |md,y ;gET.NEXT.C|
00001590: 4D 44 A0 43 48 52 0D 20  62 6E 65 20 69 73 71 20  |MD.CHR. bne isq |
000015A0: 3B 62 52 41 4E 43 48 A0  49 46 A0 4E 4F 54 A0 4C  |;bRANCH.IF.NOT.L|
000015B0: 41 53 54 A0 4F 4E 45 0D  20 73 74 61 20 69 6E 64  |AST.ONE. sta ind|
000015C0: 65 78 20 3B 69 4E 49 54  A0 49 4E 44 45 58 A0 46  |ex ;iNIT.INDEX.F|
000015D0: 4F 52 A0 4E 45 58 54 A0  4C 49 4E 45 0D 20 6C 64  |OR.NEXT.LINE. ld|
000015E0: 61 20 23 24 64 20 3B 65  58 49 54 A0 57 49 54 48  |a #$d ;eXIT.WITH|
000015F0: A0 63 72 0D 69 73 71 20  63 6D 70 20 23 27 61 27  |.cr.isq cmp #'a'|
00001600: 26 24 39 66 20 3B 63 4F  4E 54 52 4F 4C A0 61 3F  |&$9f ;cONTROL.a?|
00001610: 0D 20 62 6E 65 20 6C 65  61 64 69 6E 0D 20 6C 64  |. bne leadin. ld|
00001620: 79 20 23 30 0D 20 73 74  79 20 69 6E 64 65 78 0D  |y #0. sty index.|
00001630: 6C 65 61 64 69 6E 20 63  6D 70 20 23 27 72 27 26  |leadin cmp #'r'&|
00001640: 24 39 66 20 3B 63 4F 4E  54 52 4F 4C A0 72 A0 4C  |$9f ;cONTROL.r.L|
00001650: 45 41 44 A0 49 4E 3F 0D  20 62 6E 65 20 64 6F 63  |EAD.IN?. bne doc|
00001660: 6D 64 20 3B 62 52 41 4E  43 48 A0 49 46 A0 4E 4F  |md ;bRANCH.IF.NO|
00001670: 54 0D 20 69 6E 63 20 69  6E 64 65 78 20 3B 62 55  |T. inc index ;bU|
00001680: 4D 50 A0 49 4E 44 45 58  0D 20 6C 64 61 20 61 75  |MP.INDEX. lda au|
00001690: 74 6F 63 6D 64 2B 31 2C  79 0D 20 63 6D 70 20 23  |tocmd+1,y. cmp #|
000016A0: 27 3C 27 20 3B 6E 45 58  54 A0 43 48 52 A0 41 A0  |'<' ;nEXT.CHR.A.|
000016B0: 3C 0D 20 62 6E 65 20 72  61 72 0D 20 6C 64 61 20  |<. bne rar. lda |
000016C0: 23 24 31 31 20 3B 74 52  41 4E 53 4C 41 54 45 A0  |#$11 ;tRANSLATE.|
000016D0: 54 4F A0 3C 2D 0D 72 61  72 20 63 6D 70 20 23 27  |TO.<-.rar cmp #'|
000016E0: 3E 27 20 3B 4F 52 A0 3E  0D 20 62 6E 65 20 64 6F  |>' ;OR.>. bne do|
000016F0: 63 6D 64 20 3B 6A 55 53  54 A0 49 47 4E 4F 52 45  |cmd ;jUST.IGNORE|
00001700: A0 43 4E 54 52 A0 72 A0  49 46 A0 4E 4F 54 0D 20  |.CNTR.r.IF.NOT. |
00001710: 6C 64 61 20 23 24 31 64  20 3B 74 52 41 4E 53 4C  |lda #$1d ;tRANSL|
00001720: 41 54 45 A0 54 4F A0 2D  3E 0D 64 6F 63 6D 64 20  |ATE.TO.->.docmd |
00001730: 6C 64 79 20 79 73 61 76  20 3B 72 45 54 52 49 45  |ldy ysav ;rETRIE|
00001740: 56 45 A0 79 A0 52 45 47  0D 20 72 74 73 20 3B 67  |VE.y.REG. rts ;g|
00001750: 49 56 45 A0 45 44 49 54  4F 52 A0 54 48 45 A0 43  |IVE.EDITOR.THE.C|
00001760: 48 52 0D 0D 79 73 61 76  20 62 72 6B 0D 69 6E 64  |HR..ysav brk.ind|
00001770: 65 78 20 62 72 6B 0D 61  75 74 6F 63 6D 64 20 62  |ex brk.autocmd b|
00001780: 72 6B 0D 20 65 72 72 20  2A 2D 31 2F 24 33 65 30  |rk. err *-1/$3e0|
00001790: 20 3B 6D 55 53 54 A0 45  4E 44 A0 42 45 46 4F 52  | ;mUST.END.BEFOR|
000017A0: 45 A0 24 33 65 30 0D 20  64 6F 20 73 61 76 6F 62  |E.$3e0. do savob|
000017B0: 6A 0D 20 73 61 76 65 20  22 61 75 74 6F A0 65 64  |j. save "auto.ed|
000017C0: 69 74 22 0D 20 66 69 6E  0D 20 66 69 6E 0D 0D 20  |it". fin. fin.. |
000017D0: 6C 73 74 20 6F 66 66 0D                           |lst off.        |
..********************************.*    
                          *.*           
KEYMAC             *.*                  
            *.* EXAMPLES OF USES OF MERL
IN'S *.* ADD-EDIT KEYBOARD HOOKS AT   *.
* $7E-$7F.                     *.*      
                        *.*   GLEN E. BR
EDON   2/20/83   *.*--------------------
----------*.* TO USE: RUN DESIRED PROGRA
M  *.* FROM EXEC (G) THEN INVOKE    *.* 
WITH USER FROM EDITOR.       *.*********
***********************.. TR. EXP OFF..Y
 = 1.YES = 1.N = 0.NO = 0.SAVOBJ KBD 'DO
 YOU WANT OBJECT CODE SAVED? (Y/N)'.PROG
NUM KBD 'ASSEMBLE WHICH PROGRAM? (1-3)'.
 ERR PROGNUM-1/3..INVEC = $7E ;EDIT MODE
 KEY INPUT VECTOR.EFLG = $38 ;MINUS WHEN
 IN EDIT MODE.USRCMD = $32E ;USER VECTOR
.STRINGS = $860 ;EDITOR PUTS STRING HERE
.GETIN = $FFE4..STADR MAC. LDA #]1. STA 
]2. LDA #>]1. STA ]2+1. <<<..***********
*********************.*.* COMMON CODE TO
 ALL PARTS:.. ORG $900.. >>> STADR.START
;USRCMD. LDY #$400-$334.MOVE LDA NOWSTAR
T-1,Y. STA START-1,Y. DEY. BNE MOVE. RTS
 ;END OF COMMON STUFF..NOWSTART ORG $334
..********************************.*.*  
 EXAMPLE 1 (KEYBOARD MACROS).*.* WITH "\
" LEAD IN, PRINTS A *.* FOLLOWED BY 31 C
OPIES OF CHR.* TYPED AFTER ESC.  IF THIS
 IS A.* SPACE THEN ANOTHER * IS PUT AT.*
 THE END.  THE CURSOR IS THEN.* PLACED O
N THE FIRST CHARACTER..*.***************
*****************.. DO PROGNUM-1. ELSE..
START >>> STADR.INPUT;INVEC.SETSTT SEC. 
ROR STATE ;INIT STATE. RTS..INPUT BIT ST
ATE ;MACRO IN EFFECT?. BPL NXSTATE ;BRAN
CH IF SO. STY YSAV.FRSTKEY JSR GETIN ;OT
HERWISE, GET KEY. TAY. BEQ FRSTKEY. CMP 
#'\' ;LEAD IN?. BEQ NXK ;BRANCH IF SO. L
DY YSAV.RET RTS  ;RETURN WITH KEY IF NOT
..NXK JSR GETIN ;GET KEY AFTER LEADIN. T
AY. BEQ NXK. LDY YSAV. BIT RET ;CONTROL 
CHR?. BEQ SETSTT ;ABORT IF SO. STA CHARA
C ;SAVE NEXT CHR. LDA #31 ;INIT COUNT. S
TA STATE.AST LDA #'*' ;SEND INITIAL *. R
TS.NXSTATE LDA CHARAC ;GET CHR. DEC STAT
E ;COUNTDOWN. BNE PLUS? ;LAST COUNT IF E
QUAL. CMP #' ' ;WAS CHR A SPACE?. BEQ AS
T ;SUBSTITUE * FOR LAST IF SO. RTS.PLUS?
 BPL BACK ;BRANCH IF NOT DONE. LDA #$9F&
'B' ;PUT CURSOR ON 1ST CHR.BACK RTS..YSA
V BRK.STATE BRK.CHARAC BRK. DO SAVOBJ. S
AVE "REPEAT". FIN. FIN..****************
*******************.*.*   EXAMPLE 2 (KEY
BOARD MACROS).*.* KEYBOARD MACROS DEFINE
D FOR KEYS.*   * > " ' # + X Y L S - O C
 A E.* WITH THE SHIFTED ONES EQUIVALENT.
* TO THEIR UNSHIFTED COUNTERPARTS..*.* M
OST OF THESE ARE VARIANTS OF.* THE INDIR
ECT, INDEXED BY Y.* OPCODES, EXITING IN 
INSERT MODE.* BETWEEN THE PARENTHESES..*
.***********************************.. D
O PROGNUM-2. ELSE..STATE = $4A ;ZERO PAG
E USED TO.XSAV = $4B ; MAKE PROGRAM FIT.
YSAV = $4C ; IN $344 SPACE.INDEX = $4D ;
THESE ARE NOT USED BY EDITOR..START >>> 
STADR.INPUT;INVEC. SEC. ROR STATE ;INIT 
STATE. RTS..INPUT STX XSAV ;MUST PRESERV
E X (& Y). BIT STATE ; IF USED.. BPL GET
INDEX ;BRANCH IF DOING MACRO.FRSTKEY JSR
 GETKEY ;OTHERWISE, GET KEY. CMP #'\' ;"
\" LEAD IN?. BNE EXIT ;EXIT IF NOT.NXK J
SR GETKEY ;GET KEY AFTER LEAD IN. CMP #'
0' ;SHIFT CHR?. BGE NOOR. ORA #%00010000
 ;SHIFT DOWN.NOOR STA ENDTBL ;SAVE CURRE
NT INPUT. ORA #$80. STA ENDTBL+1 ; IN CA
SE CMD NOT FOUND. LDX #0 ; TO USE FOR IT
.CMD? LDA MACTBL,X ;LOOK FOR COMMAND. CM
P ENDTBL ;MATCH INPUT?. BEQ GOTMAC ;BRAN
CH IF SO.GETCHR INX  ;MOVE TO NEXT MAC. 
LDA MACTBL,X. BPL GETCHR ;LOOP TILL MINU
S. INX  ;POINT TO CMD BYTE. BNE CMD? ;AL
WAYS TAKEN.GOTMAC INX  ;POINT TO MACRO S
ELECTED.SXI STX INDEX.GETINDEX LDX INDEX
 ;GET INDEX TO CURRENT CHR. INC INDEX ;P
OINT TO NEXT CHR. LDA MACTBL,X ;GET CURR
ENT CHR OF MACRO.. STA STATE ;CLEAR FLAG
 ON LAST CHR. AND #$7F ;MUST ALWAYS CLR 
HIGH BIT. TAX  ;IN CASE IT IS WNDUP-MACT
BL. CMP #WNDUP-MACTBL ;IS IT WINDUP MAC?
. BEQ SXI ;BRANCH IF SO.EXIT LDX XSAV. R
TS..GETKEY STY YSAV.GK JSR GETIN. TAY. B
EQ GK. LDY YSAV. RTS..MACTBL. DCI '> >>>
 '. TXT '2 TXT ""'. DFB $11,$9F&"I" ;BAC
KSPACE & INSERT. TXT :7 TXT '':. DFB $11
,$9F&"I". DCI '3 LDA #'. DCI 'X LDX #'. 
DCI 'Y LDY #'. TXT '; ADC'. DFB WNDUP-MA
CTBL.$80. TXT '= SBC'. DFB WNDUP-MACTBL.
$80. TXT 'L LDA'. DFB WNDUP-MACTBL.$80. 
TXT 'S STA'. DFB WNDUP-MACTBL.$80. TXT '
O ORA'. DFB WNDUP-MACTBL.$80. TXT 'C CMP
'. DFB WNDUP-MACTBL.$80. TXT 'A AND'. DF
B WNDUP-MACTBL.$80. TXT 'E EOR'.WNDUP TX
T ' (),Y'. HEX 111111 ;BACKSPACE TO BETW
EEN (). DFB $9F&"I" ;EXIT IN INSERT MODE
..ENDTBL DA 0 ;COMMAND CHR PUT HERE.. ER
R *-1/$400. DO SAVOBJ. SAVE "KEYMAC". FI
N. FIN..********************************
*********.*.*   EXAMPLE 3 (AUTO-EDIT).*.
* USER"STRING" ESTABLISHES AN AUTO-EDIT.
* STRING WHICH WILL BE EXECUTED ON EACH.
* LINE OF A SUBSEQUENT EDIT.  AN ADD/INS
ERT.* WILL DISCONNECT THE ROUTINE..*.* E
.G., IF "STRING" IS THE SEQUENCE.* CONTR
OL O, CONTROL J  THEN.* CONTROL J WILL B
E INSERTED AT THE.* START OF EACH LINE O
F THE EDIT RANGE..*.* CONTROL R FOLLOWED
 BY > OR < GIVE THE.* EFFECT DURING THE 
AUTO EDIT OF THE.* CURSOR KEYS -> AND <-
..**************************************
***.. DO PROGNUM-3. ELSE..START LDY #-1 
;MOVE STRING SPECIFIED.NXB INY ; IN USER
 COMMAND. LDA STRINGS,Y. STA AUTOCMD,Y ;
(MAX LENGTH = $20). BNE NXB. STA INDEX ;
INIT INDEX TO CMD. LDA INVEC+1 ;IS IT CO
NNECTED NOW?. CMP #>AUTOEDIT. BEQ SETVEC
 ;SKIP IF SO. STA GETKEY+2 ;SAVE OLD INV
ECTOR. LDA INVEC. STA GETKEY+1.SETVEC >>
> STADR.AUTOEDIT;INVEC. RTS..AUTOEDIT BI
T EFLG ;FROM ADD/INSERT OR EDIT?. BMI SA
VY ;BRANCH IF FROM EDIT. LDA GETKEY+1 ;D
ISCONNECT OURSELVES IF. STA INVEC ; FROM
 AN ADD OR INSERT. LDA GETKEY+2. STA INV
EC+1.GETKEY JMP $FFCF ;ADDRESS CHANGED..
SAVY STY YSAV ;REMEMBER Y. LDY INDEX ;GE
T INDEX TO NEXT CMD CHR. INC INDEX ;POIN
T TO NEXT ONE. LDA AUTOCMD,Y ;GET NEXT C
MD CHR. BNE ISQ ;BRANCH IF NOT LAST ONE.
 STA INDEX ;INIT INDEX FOR NEXT LINE. LD
A #$D ;EXIT WITH CR.ISQ CMP #'A'&$9F ;CO
NTROL A?. BNE LEADIN. LDY #0. STY INDEX.
LEADIN CMP #'R'&$9F ;CONTROL R LEAD IN?.
 BNE DOCMD ;BRANCH IF NOT. INC INDEX ;BU
MP INDEX. LDA AUTOCMD+1,Y. CMP #'<' ;NEX
T CHR A <. BNE RAR. LDA #$11 ;TRANSLATE 
TO <-.RAR CMP #'>' ;OR >. BNE DOCMD ;JUS
T IGNORE CNTR R IF NOT. LDA #$1D ;TRANSL
ATE TO ->.DOCMD LDY YSAV ;RETRIEVE Y REG
. RTS ;GIVE EDITOR THE CHR..YSAV BRK.IND
EX BRK.AUTOCMD BRK. ERR *-1/$3E0 ;MUST E
ND BEFORE $3E0. DO SAVOBJ. SAVE "AUTO ED
IT". FIN. FIN.. LST OFF.
C64 Preview

> CLICK IMAGE PREVIEW FOR FULL MODAL