Path: csiph.com!v102.xanadu-bbs.net!xanadu-bbs.net!eternal-september.org!feeder.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail From: D Finnigan Newsgroups: comp.sys.apple2.programmer Subject: LJK Lower Case Character Generator driver Date: Tue, 2 Sep 2014 02:10:09 +0000 (UTC) Organization: Mac GUI Lines: 182 Message-ID: Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Injection-Date: Tue, 2 Sep 2014 02:10:09 +0000 (UTC) Injection-Info: mx05.eternal-september.org; posting-host="ac9e0e4d7dd3957fb97803ee6801bab8"; logging-data="14004"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1+Y9z6QRX9hp0t6vlv1PBwQ" User-Agent: Mac GUI Usenet Cancel-Lock: sha1:AnP8R59B9dRAzzTL+Ied9mCUCvU= Xref: csiph.com comp.sys.apple2.programmer:1304 Source code for the LJK Enterprises Lower Case Character Generator. Works with the single-wire shift key mod. Assembles in Merlin Pro and whatever other assemblers were around in 1981. I typed this out of the manual. It assembled with no errors, so that means there are no typos! ;-) Typos on lines 14 and 15 were in the original document, so I reproduced them. Reference: http://macgui.com/usenet/?group=1&id=60253&highlight=ljk --------------------- 1 ************************** 2 * LOWER CASE SOFTWARE * 3 * VERSION 1.0 * 4 * COPYRIGHT 1981 BY * 5 * LJK ENTERPRISES, INC. * 6 * COMMERCIAL RIGHTS * 7 * RESERVED * 8 ************************** 9 * 10 KSW EQU $38 keyhook 11 DHOOK EQU $3EA rehook of dos 12 BASE EQU $28 screen address 13 KEYIN EQU $FD1B read keyboard 14 CR EQU $8D carraige return 15 SP EQU $A0 space chareturn 16 CH EQU $24 cursor horizontal 17 RDKEY EQU $FD0C ind read keybd 18 CUR1 EQU $40 default (flash) 19 CUR2 EQU 0 lc no flash 20 STACK EQU $100 6502 stack 21 SHIFT EQU $C063 paddle shift 22 * 23 ORG $300 24 ;OBJ *300 25 * 0300: A9 0B 26 SETHOOK LDA #LC set our hooks 0302: 85 38 27 STA KSW on the input 0304: A9 03 28 LDA #>LC 0306: 85 39 29 STA KSW+1 0308: 4C EA 03 30 JMP DHOOK rehook dos to save 31 * 030B: 48 32 LC PHA resave character 030C: C9 E0 33 CMP #$E0 is it lower? 030E: 90 02 34 BCC LC1 ok to put 0310: 49 20 35 EOR #$20 set to upper 0312: 29 3F 36 LC1 AND #$3F put to screen 0314: 0D AA 03 37 ORA CUR use cur as or mask 0317: 91 28 38 STA (BASE),Y 0319: 68 39 PLA keyin will restore 031A: 20 1B FD 40 JSR KEYIN screen character 031D: 8D AC 03 41 STA CHAR save for now 0320: 8E AB 03 42 STX XSAVE 0323: BA 43 TSX get stack 0324: BD 06 01 44 LDA STACK+6,X see if getln 0327: C9 FD 45 CMP #$FD by looking on stack 0329: D0 0C 46 BNE DOKEY will change by 2 032B: BD 05 01 47 LDA STACK+5,X without dos 032E: C9 77 48 CMP #$77 if getln change to 0330: D0 05 49 BNE DOKEY addinp to bypass 0332: A9 83 50 LDA #$83 conversion to caps 0334: 9D 05 01 51 STA STACK+5,X found it! 0337: AE AB 03 52 DOKEY LDX XSAVE restore X reg 033A: AD AC 03 53 LDA CHAR and char 033D: C9 8C 54 CMP #$8C ^L shift toggle? 033F: D0 0B 55 BNE LC2 no, go on 0341: AD A9 03 56 LDA CAPS invert msb of caps 0344: 49 FF 57 EOR #$FF 0346: 20 9B 03 58 jsr DOCUR and place cur right 0349: 4C 0C FD 59 LC0 JMP RDKEY get new key exit ===== Page 2 ===== 034C: C9 9A 60 LC2 CMP #$9A is it ^Z? 034E: D0 0E 61 BNE LC3 0350: 20 0C FD 62 JSR RDKEY recursive 0353: 29 0F 63 AND #$F mask of char 0355: C9 0C 64 CMP #12 and see if in range 0357: B0 F0 65 BCS LC0 no, so get new key 0359: A8 66 TAY else, read from table 035A: B9 AD 03 67 LDA SCHAR,Y and exit 035D: 60 68 RTS 69 * 035E: C9 95 70 LC3 CMP #$95 since we skip capstst 0360: D0 06 71 BNE LC4 we must do screen read 0362: B1 28 72 LDA (BASE),Y ourselves 0364: 09 80 73 ORA #$80 make upper case 0366: 30 0C 74 BMI KADJ adj for lc addition 0368: C9 8D 75 LC4 CMP #CR if a cr set to caps lock 036A: D0 08 76 BNE KADJ 036C: A9 FF 77 LDA #$FF 036E: 20 9B 03 78 JSR DOCUR 0371: A9 8D 79 LDA #CR 0373: 60 80 RTS 0374: C9 C0 81 KADJ CMP #"@ handle p,m,n special 0376: D0 04 82 BNE KADJ2 0378: 49 10 83 KADJ1 EOR #$10 by eor with $10 037A: D0 08 84 BNE KADJ3 037C: C9 DD 85 KADJ2 CMP #$DD shift m 037E: 90 04 86 BCC KADJ3 0380: C9 DF 87 CMP #$DF shift n+1 0382: 90 F4 88 BCC KADJ1 0384: C9 C1 89 KADJ3 CMP #"A alpha test for caps 0386: 90 20 90 BCC RTS1 if leff than no adj 0388: C5 DB 91 CMP "Z+1 if >Z no adj 038A: B0 1C 92 BCS RTS1 038C: 2C A9 03 93 BIT CAPS do we adj to lc 038F: 30 02 94 BMI KADJ4 no, go on 0391: 09 20 95 ORA #$20 adjust to lc 0393: 2C 63 C0 96 KADJ4 BIT SHIFT is shift key hit? 0396: 30 10 97 BMI RTS1 no, exit 0398: 49 20 98 EOR #$20 yes, invert cap order 039A: 60 99 RTS 100 * 039B: 8D A9 03 101 DOCUR STA CAPS do default case 039E: 10 03 102 BPL DOCUR1 not default, load lc 03A0: A9 40 103 LDA #CUR1 load upper cursor 03A2: 2C 104 DFB $2C skip next lda 03A3: A9 00 105 DOCUR1 LDA #CUR2 03A5: 8D AA 03 106 STA CUR save mask 03A8: 60 107 RTS1 RTS and exit 108 * 03A9: FF 109 CAPS DFB $FF set for default 03AA: 40 110 CUR DFB $40 to up at startup 03AB: 00 111 XSAVE BRK 03AC: 00 112 CHAR BRK 03AD: C0 DB DC 113 SCHAR HEX C0DBDCDDDEDFE0FBFCFDFEFF 03B0: DD DE DF E0 FB FC FD FE 03B8: FF 114 * ===== Page 3 ===== --End assembly, 185 bytes, Errors: 0 Symbol table - alphabetical order: BASE =$28 CAPS =$03A9 ? CH =$24 CHAR =$03AC CR =$8D CUR =$03AA CUR1 =$40 CUR2 =$00 DHOOK =$03EA DOCUR =$039B DOCUR1 =$03A3 DOKEY =$0337 KADJ =$0374 KADJ1 =$0378 KADJ2 =$037C KADJ3 =$0384 KADJ4 =$0393 KEYIN =$FD1B KSW =$38 LC =$030B LC0 =$0349 LC1 =$0312 LC2 =$034C LC3 =$035E LC4 =$0368 RDKEY =$FD0C RTS1 =$03A8 SCHAR =$03AD ? SETHOOK =$0300 SHIFT =$C063 ? SP =$A0 STACK =$0100 XSAVE =$03AB Symbol table - numerical order: CUR2 =$00 ? CH =$24 BASE =$28 KSW =$38 CUR1 =$40 CR =$8D ? SP =$A0 STACK =$0100 ? SETHOOK =$0300 LC =$030B LC1 =$0312 DOKEY =$0337 LC0 =$0349 LC2 =$034C LC3 =$035E LC4 =$0368 KADJ =$0374 KADJ1 =$0378 KADJ2 =$037C KADJ3 =$0384 KADJ4 =$0393 DOCUR =$039B DOCUR1 =$03A3 RTS1 =$03A8 CAPS =$03A9 CUR =$03AA XSAVE =$03AB CHAR =$03AC SCHAR =$03AD DHOOK =$03EA SHIFT =$C063 RDKEY =$FD0C KEYIN =$FD1B -- ]DF$ Apple II Book: http://macgui.com/newa2guide/ Usenet: http://macgui.com/usenet/ <-- get posts by email! Apple II Web & Blog hosting: http://a2hq.com/