Assembler ist keine Alchimie
Die Assembler-Programmierung ist die eigentliche Sprache des Prozessors. Im Gegensatz zu Basic verarbeitet der Computer Maschinenbefehle direkt und damit wesentlich schneller.
Nachdruck aus:
Hinweis: Die Reihenfolge der Teile im Sonderheft weicht von der ursprünglichen Veröffentlichung ab. Teil 8 erscheint vor Teil 6 und 7. Kapitel 1-2 aus Teil 1 wurden weggelassen.
- 64'er 9/84, S. 138 (Teil 1, nur Kap. 3-6)
- 64'er 10/84, S. 150 (Teil 2)
- 64'er 11/84, S. 121 (Teil 3)
- 64'er 12/84, S. 134 (Teil 4)
- 64'er 1/85, S. 142 (Teil 5)
- 64'er 4/85, S. 138 (Teil 8)
- 64'er 2/85, S. 134 (Teil 6)
- 64'er 3/85, S. 124 (Teil 7)
- 64'er 5/85, S. 138 (Teil 9)
- 64'er 7/85, S. 127 (Teil 10)
- 64'er 8/85, S. 126 (Teil 11)
- 64'er 9/85, S. 109 (Teil 12)
- 64'er 10/85, S. 143 (Teil 12, Forts.)
1 rem ********************************* 2 rem * * 3 rem * test fuer die 1. version des * 4 rem * programm-projektes * 5 rem * v e r s c h i e b e n v o n * 6 rem * speicherbereichen * 7 rem * * 8 rem * heimo ponnath hamburg 1984 * 9 rem ********************************* 10 rem 15 rem ++++++ usr-vektor einstellen ++++ 20 rem 25 poke785,182:poke786,2 30 rem 35 rem ++++++ kopfzeile ++++++++++++++++ 40 rem 45 printchr$(147)chr$(18)"test: bild $0400=1024, farbe $d800=55296"chr$(146) 50 print:print:print"durch irgendein usr-kommando wird nun im programm-modus" 55 print"der erste teil des verschiebe-programmes aufgerufen" 60 print"die kopfzeile wird unter das obere rom kopiert." 65 rem 70 rem ++++++ 1. usr-aufruf ++++++++++++ 75 rem 80 a=usr(1) 85 print:print"hier geschieht das durch a=usr(1) in zeile 65" 90 print"dabei ist 1 ein dummy und mit a fangen wir auch nichts weiter an." 95 print"auf tastendruck wird der bildschirm ge-loescht" 100 rem 105 rem ++ueberschreiben der kopfzeile ++ 110 rem 115 poke198,0:wait198,1:printchr$(147) 120 rem 125 rem +++ neubeginn des programmes ++++ 130 rem 135 printchr$(19)"was auch immer jetzt in der kopfzeile steht, es wird beim 2.usr" 140 print"von dem zuvor durch das erste usr ge- speicherte ueberschrieben" 145 print:print"wenn sie jetzt eine taste druecken..." 150 poke198,0:wait198,1 155 rem 160 rem ++++++ 2. usr-aufruf +++++++++++ 165 rem 170 a=usr(1):print 175 print"ist die alte kopfzeile zurueck in den bildschirmspeicher geschoben." 180 end
5 rem*** test fuer flpt und mflpt *** 10 poke52,96:poke56,96:clr:printchr$(147)chr$(17)chr$(17) 15 print"ist der smon eingeladen?":input"j/n";a$:ifa$="n"thenend 20 printchr$(17)chr$(17)" flpt in fac"tab(25)"1":print 30 print" flpt in arg"tab(25)"2":print 40 print" mflpt ab $6800"tab(25)"3":print:print 50 geta$:ifa$<"1"ora$>"3"then50 60 print"auswahl",a$:print:print:input"geben sie eine zahl ein";z 65 printchr$(147) 70 onval(a$)goto100,200,300 100 rem***** fac ***** 110 poke785,0:poke786,192:rem usr-vektor auf smon = $c000 120 a=usr(z) 200 rem***** arg ***** 210 poke785,0:poke786,96:rem usr-vektor auf $6000 220 a=usr(z) 300 rem***** mflpt ***** 310 poke785,0:poke786,97:rem usr-vektor auf $6100 320 a=usr(z) 400 rem********************************* 410 rem nach meldung des smon mit den 420 rem kommandos 430 rem (1) m 0061 440 rem (2) m 0069 450 rem (3) m 6800 460 rem den monitor einschalten. die 470 rem eingegebene zahl ist dann als 480 rem hex-bytes sichtbar. 490 rem*********************************
,5000 A2 00 LDX #00 ,5002 86 5C STX 5C ,5004 86 5D STX 5D ,5006 A0 10 LDY #10 ,5008 06 57 ASL 57 ,500A 26 58 ROL 58 ,500C 26 5C ROL 5C ,500E 26 5D ROL 5D ,5010 38 SEC ,5011 A5 5C LDA 5C ,5013 E5 59 SBC 59 ,5015 AA TAX ,5016 A5 5D LDA 5D ,5018 E5 5A SBC 5A ,501A 90 06 BCC 5022 ,501C 86 5C STX 5C ,501E 85 5D STA 5D ,5020 E6 57 INC 57 ,5022 88 DEY ,5023 D0 E3 BNE 5008 ,5025 60 RTS
1 rem ********************************* 2 rem * * 3 rem * programm 2 * 4 rem * * 5 rem * erstellen und aufruf eines * 6 rem * hilfsbildschirmes * 7 rem * * 8 rem * heimo ponnath hamburg 1985 * 9 rem ********************************* 10 printchr$(147):poke785,0:poke786,96:goto30 15 rem -------- up cursor setzen ------ 20 poke211,sp:poke214,z:sys58640:return 25 rem- erstellen des hilfsbildschirmes- 30 z=1:sp=1:gosub20:print"**************************************" 40 z=21:sp=1:gosub20:print"**************************************" 50 z=10:sp=7:gosub20:print"test fuer die verschiebung" 55 rem ---- aufruf zum verschieben ---- 60 a=usr(dummy) 65 rem ---bildschirm neu beschreiben--- 70 geta$:ifa$=""then70 80 printchr$(147):z=2:sp=2:gosub20:print"jetzt sollte der alte bildschirm" 90 z=4:sp=2:gosub20:print"unter das kernal-rom geschoben sein" 100 print:print:print" -- jeder usr-aufruf holt den --" 110 print" -- hilfsbildschirm wieder . --" 120 print" -- auch im direkt-modus --" 130 print:print:print" probieren sie mal: a=usr(1) [return]" 140 z=19:sp=0:gosub20:end
,6000 A9 00 LDA #00 ,6002 85 5F STA 5F ,6004 A9 04 LDA #04 ,6006 85 60 STA 60 ,6008 A9 E8 LDA #E8 ,600A 85 5A STA 5A ,600C 85 58 STA 58 ,600E A9 07 LDA #07 ,6010 85 5B STA 5B ,6012 A9 E3 LDA #E3 ,6014 85 59 STA 59 ,6016 20 BF A3 JSR A3BF ,6019 A9 00 LDA #00 ,601B 85 5F STA 5F ,601D A9 D8 LDA #D8 ,601F 85 60 STA 60 ,6021 A9 E8 LDA #E8 ,6023 85 5A STA 5A ,6025 A9 DB LDA #DB ,6027 85 5B STA 5B ,6029 A9 D1 LDA #D1 ,602B 85 58 STA 58 ,602D A9 E7 LDA #E7 ,602F 85 59 STA 59 ,6031 20 BF A3 JSR A3BF ,6034 A9 40 LDA #40 ,6036 8D 11 03 STA 0311 ,6039 A9 60 LDA #60 ,603B 8D 12 03 STA 0312 ,603E 60 RTS
,603F EA NOP ,6040 A9 00 LDA #00 ,6042 85 5F STA 5F ,6044 A9 E0 LDA #E0 ,6046 85 60 STA 60 ,6048 A9 E8 LDA #E8 ,604A 85 5A STA 5A ,604C 85 58 STA 58 ,604E A9 E3 LDA #E3 ,6050 85 5B STA 5B ,6052 A9 07 LDA #07 ,6054 85 59 STA 59 ,6056 20 77 60 JSR 6077 ,6059 A9 E9 LDA #E9 ,605B 85 5F STA 5F ,605D A9 E3 LDA #E3 ,605F 85 60 STA 60 ,6061 A9 D1 LDA #D1 ,6063 85 5A STA 5A ,6065 A9 E7 LDA #E7 ,6067 85 5B STA 5B ,6069 A9 E8 LDA #E8 ,606B 85 58 STA 58 ,606D A9 DB LDA #DB ,606F 85 59 STA 59 ,6071 20 77 60 JSR 6077 ,6074 60 RTS ,6075 EA NOP ,6076 EA NOP ,6077 78 SEI ,6078 A5 01 LDA 01 ,607A 48 PHA ,607B A9 35 LDA #35 ,607D 85 01 STA 01 ,607F 38 SEC ,6080 A5 5A LDA 5A ,6082 E5 5F SBC 5F ,6084 85 22 STA 22 ,6086 A8 TAY ,6087 A5 5B LDA 5B ,6089 E5 60 SBC 60 ,608B AA TAX ,608C E8 INX ,608D 98 TYA ,608E F0 23 BEQ 60B3 ,6090 A5 5A LDA 5A ,6092 38 SEC ,6093 E5 22 SBC 22 ,6095 85 5A STA 5A ,6097 B0 03 BCS 609C ,6099 C6 5B DEC 5B ,609B 38 SEC ,609C A5 58 LDA 58 ,609E E5 22 SBC 22 ,60A0 85 58 STA 58 ,60A2 B0 08 BCS 60AC ,60A4 C6 59 DEC 59 ,60A6 90 04 BCC 60AC ,60A8 B1 5A LDA (5A),Y ,60AA 91 58 STA (58),Y ,60AC 88 DEY ,60AD D0 F9 BNE 60A8 ,60AF B1 5A LDA (5A),Y ,60B1 91 58 STA (58),Y ,60B3 C6 5B DEC 5B ,60B5 C6 59 DEC 59 ,60B7 CA DEX ,60B8 D0 F2 BNE 60AC ,60BA 68 PLA ,60BB 85 01 STA 01 ,60BD 58 CLI ,60BE 60 RTS
PROGRAMM : PRG.TIMER-TEST C000 C053 ----------------------------------- C000 : 78 AD 0E DC 29 FE 8D 0E 4B C008 : DC AD 0F DC 29 FE 8D 0F F9 C010 : DC A9 0F 8D 06 DC A9 00 24 C018 : 8D 07 DC A9 A0 8D 04 DC D5 C020 : A9 08 8D 05 DC A9 1F 8D 84 C028 : 0D DC A9 82 8D 0D DC AD 6E C030 : 0E DC 29 D7 8D 0E DC AD 0A C038 : 0F DC 29 D7 8D 0F DC AD 1B C040 : 0E DC 09 01 8D 0E DC AD 37 C048 : 0F DC 09 41 8D 0F DC 58 A5 C050 : 60 0E 07 CC
PROGRAMM : OBJ.ALARMUHR C000 C18D ----------------------------------- C000 : A9 8E 8D 11 03 A9 C0 8D 11 C008 : 12 03 A9 1D 8D 18 03 A9 A3 C010 : C0 8D 19 03 AD 0E DD 09 12 C018 : 80 8D 0E DD 60 48 8A 48 A1 C020 : 98 48 A9 7F 8D 0D DD AC 49 C028 : 0D DD 10 06 4C 6A C1 4C A0 C030 : 72 FE 20 BC F6 20 E1 FF B9 C038 : D0 F5 A2 04 BD 2F FD 9D B4 C040 : 13 03 CA D0 F7 A2 1A BD 1A C048 : 35 FD 9D 19 03 CA D0 F7 C0 C050 : A9 7F 8D 0D DC 8D 0D DD E8 C058 : 8D 00 DC A9 08 8D 0E DC 30 C060 : A9 88 8D 0E DD A9 08 20 FE C068 : B6 FD 4C 6C FE A9 48 8D 37 C070 : 11 03 A9 B2 8D 12 03 78 2A C078 : A9 47 8D 18 03 A9 FE 8D C0 C080 : 19 03 A9 31 8D 14 03 A9 84 C088 : EA 8D 15 03 58 60 24 0D 12 C090 : 30 03 4C 20 C1 20 82 B7 F0 C098 : C0 07 D0 40 AD 0F DD 29 35 C0A0 : 7F 8D 0F DD A0 00 A9 24 5E C0A8 : 20 FE C0 D0 02 A9 24 C9 23 C0B0 : 13 90 07 F8 38 E9 12 D8 B9 C0B8 : 09 80 8D 0B DD 20 FC C0 1A C0C0 : 8D 0A DD 20 FC C0 8D 09 EC C0C8 : DD 20 66 C1 8D 08 DD A9 6B C0D0 : 00 4C 3C BC 68 68 68 68 D9 C0D8 : A9 FF D0 F5 C0 08 D0 F8 F5 C0E0 : AD 0F DD 09 80 8D 0F DD 1A C0E8 : A9 84 8D 0D DD A9 3C 85 FF C0F0 : 04 85 02 A9 FF 85 03 A0 E6 C0F8 : 01 4C A6 C0 A9 60 85 24 DD C100 : 20 13 C1 0A 0A 0A 0A 85 80 C108 : 25 20 13 C1 05 25 C5 24 13 C110 : B0 C4 60 B1 22 38 E9 30 5D C118 : 90 BA C9 0A B0 B6 C8 60 5E C120 : A9 07 20 7D B4 A0 00 AD B0 C128 : 0B DD 08 29 1F C9 12 D0 73 C130 : 02 A9 00 28 10 05 F8 18 49 C138 : 69 12 D8 20 55 C1 AD 0A 13 C140 : DD 20 55 C1 AD 09 DD 20 96 C148 : 55 C1 AD 08 DD 20 60 C1 CE C150 : 68 68 4C CA B4 48 4A 4A A4 C158 : 4A 4A 20 60 C1 68 29 0F FE C160 : 09 30 91 62 C8 60 20 13 68 C168 : C1 60 A9 77 8D 14 03 A9 8B C170 : C1 8D 15 03 4C BC FE C6 D2 C178 : 02 F0 03 4C 31 EA A5 04 46 C180 : 85 02 AD 20 D0 45 03 8D D4 C188 : 20 D0 4C 31 EA 1F
7000 0823 ;
7000 084C ;**************************************
7000 0875 ;* *
7000 089E ;* ECHTZEITUHR MIT ALARMFUNKTION *
7000 08C7 ;* *
7000 08F0 ;* LAEUFT MIT DEM NMI-CIA *
7000 0919 ;* IN VERBINDUNG MIT DEM IRQ FUER *
7000 0942 ;* DEN ALARM *
7000 096B ;* *
7000 0994 ;* HEIMO PONNATH HAMBURG 1985 *
7000 09BD ;* *
7000 09E6 ;* (TEILWEISE WURDE EIN PROGRAMM AUS *
7000 0A0F ;* DEM INTERFACE AGE SYSTEMHANDBUCH *
7000 0A3B ;* ZUM COMMODORE 64 , SEITE 114 *
7000 0A61 ;* ALS BASIS VERWENDET ) *
7000 0A8A ;* *
7000 0AB3 ;**************************************
7000 0AB6 ;
C000 0AC2 .BA $C000
C000 0ACB .OS
C000 0ACB ;
C000 0AF4 ;********** ZEROPAGE-LABELS ***********
C000 0AF7 ;
C000 0B18 VERZ .DE $02 ;AKTUELLE VERZOEG.
C000 0B3B FARB .DE $03 ;WERT FUER RAHMEN
C000 0B57 ; EOR-OPERATION
C000 0B78 VORW .DE $04 ;VERZOEGERUNGSWERT
C000 0B9B VALTYP .DE $0D ;INHALT:F=STR 0=N
C000 0B9E ;
C000 0BAD INDEX .DE $22
C000 0BC6 INDEX3 .DE $24 ;POINTER
C000 0BD6 INDEX4 .DE $25
C000 0BF5 FAC1 .DE $62 ;1.MANTISSENBYTE
C000 0BF8 ;
C000 0C21 ;********** LABELS PAGES 3 ************
C000 0C24 ;
C000 0C44 USRADDL .DE $0311 ;USR-POINTER
C000 0C57 USRADDH .DE $0312
C000 0C5A ;
C000 0C6A FREI .DE $0313
C000 0C6D ;
C000 0C8A IRQVL .DE $0314 ;IRQ-VEKTOR
C000 0C9B IRQVH .DE $0315
C000 0C9E ;
C000 0CBC NMINVL .DE $0318 ;NMI-VEKTOR
C000 0CCE NMINVH .DE $0319
C000 0CD1 ;
C000 0CFA ;********** LABELS INTERPRETER ********
C000 0CFD ;
C000 0D23 ILLQUERR .DE $B248 ;ILLEGAL QUANTITY
C000 0D4B ; ERROR=NORMALWERT USR-VEKTOR
C000 0D4E ;
C000 0D70 STRIN18 .DE $B47D ;SPEICHERPLATZ
C000 0D99 ; PRUEFEN,STRINGPOINTER SETZEN
C000 0DBF STRLIT67 .DE $B4CA ;REST DER STRING-
C000 0DD8 ; LESE-ROUTINE
C000 0DF7 LEN1 .DE $B782 ;STRINGLAENGE
C000 0E11 ; IN Y-REGISTER
C000 0E32 ACTOFC .DE $BC3C ;AKKU NACH FAC
C000 0E35 ;
C000 0E5E ;********** LABELS VIC-II-CHIP ********
C000 0E61 ;
C000 0E7E RAND .DE $D020 ;RAHMENFARBE
C000 0E81 ;
C000 0EAA ;********** LABELS CIA-BAUSTEINE ******
C000 0EAD ;
C000 0ECA CIA1 .DE $DC00 ;START CIA-1
C000 0EEC ICR1 .DE $DC0D ;IRQ-KONTROLLREG.
C000 0F0E CRA1 .DE $DC0E ;TIMER-A KONTRREG
C000 0F11 ;
C000 0F34 TOD10TH2 .DE $DD08 ;1/10 SEKUNDEN
C000 0F51 TODSEC2 .DE $DD09 ;SEKUNDEN
C000 0F6D TODMIN2 .DE $DD0A ;MINUTEN
C000 0F8F TODHR .DE $DD0B ;STUNDEN + AM/PM
C000 0FB1 ICR2 .DE $DD0D ;NMI-KONTROLLREG.
C000 0FD3 CRA2 .DE $DD0E ;TIMER-A KONTRREG
C000 0FF5 CRB2 .DE $DD0F ;TIMER-B KONTRREG
C000 0FF8 ;
C000 0FFB ;
C000 1024 ;********** LABELS OBERES ROM *********
C000 1027 ;
C000 1045 NORM .DE $EA31 ;NORMALER IRQ
C000 1048 ;
C000 106B TASTFLAG .DE $F6BC ;TEIL DER NMI-
C000 108E ; ROUTINE (KEIN MODUL)
C000 10AD VECTAB .DE $F02F ;TABELLE DER
C000 10C8 ; ROM-VEKTOREN
C000 10E9 VECTAB7 .DE $FD35 ;MSB DES NMI-
C000 110E ; VEKTORS IN DER TABELLE
C000 1132 IORESET19 .DE $FDB6 ;I/O-RESET:BEI
C000 1157 ; SETZEN DES CRA IRQ-CIA
C000 117B NMIXCT16 .DE $FE6C ;NMI-ROUTINE AB
C000 119D ; SCREEN-EDITOR-RESET
C000 11C1 NMIRS232 .DE $FE72 ;NMI-ROUTINE AB
C000 11DE ; RS232-HANDLING
C000 11FF NMIEND .DE $FEBC ;ENDE DER NMI-
C000 1215 ; ROUTINE
C000 1237 STOP .DE $FFE1 ;KERNAL STOP SPRG
C000 1254 ; NACH JMP($328)
C000 1257 ;
C000 125A ;
C000 1283 ;********** AKTIVIEREN ****************
C000 1286 ;
C000 A9 8E 12A2 INIT LDA #L,USR ;USR-VEKTOR
C002 8D 11 03 12B7 STA USRADDL ;LADEN
C005 A9 C0 12C4 LDA #H,USR
C007 8D 12 03 12D2 STA USRADDH
C00A 12D5 ;
C00A A9 1D 12F2 LDA #L,NMI ;NMI-VEKTOR MIT
C00C 8D 18 03 130D STA NMINVL ;STARTADRESSE
C00F A9 C0 1327 LDA #H,NMI ;DER EIGENEN
C011 8D 19 03 1345 STA NMINVH ;NMI-ROUTINE LAD
C014 1348 ;
C014 AD 0E DD 1365 LDA CRA2 ;BIT7 CRA SETZEN:
C017 09 80 137C ORA #$80 ;%1000 0000
C019 8D 0E DD 1397 STA CRA2 ;NETZFREQ.=50HZ
C01C 139A ;
C01C 60 13A0 RTS
C01D 13A3 ;
C01D 13CC ;********** EIGENE NMI-ROUTINE ********
C01D 13CF ;
C01D 48 13EF NMI PHA ;ANFANG NORMALE NMI-R.
C01E 8A 1406 TXA ;REGISTER RETTEN
C01F 48 140C PHA
C020 98 1412 TYA
C021 48 1418 PHA
C022 141B ;
C022 A9 7F 1439 LDA #7F ;SPERREN ALLER NMI
C024 8D 0D DD 1444 STA DD0D
C027 1447 ;
C027 AC 0D DD 1462 LDY DD0D ;PRUEFEN OB NMI
C02A 10 06 1481 BPL RESTNMI ;VOM CIA2 KOMMT.
C02C 14A4 ; WENN NEIN=SPRUNG
C02C 4C 6A C1 14C1 JMP ALARM ;WENN JA, ALARM
C02F 4C 72 FE 14E1 CIANMI JMP NMIRS232 ;REST DER
C032 1508 ; NORMALEN NMI-ROUTINE
C032 150B ;
C032 1534 ;***** EIGENE RESTORE-NMI-ROUTINE *****
C032 1537 ;
C032 155F ; DIE MODULPRUEFUNG WIRD AUSGELASSEN
C032 1562 ;
C032 20 BC F6 1587 RESTNMI JSR TASTFLAG ;TEIL DER NMI-
C035 20 E1 FF 15A5 JSR STOP ;ROUTINE ZUR STOP-
C038 D0 F5 15C2 BNE CIANMI ;TASTEN-ABFRAGE
C03A 15C5 ;
C03A A2 04 15E3 LDX #$04 ;IRQ UND BRK VEKT.
C03C BD 2F FD 1606 UMLAD1 LDA VECTAB,X ;RESTAURIEREN
C03F 9D 13 03 1613 STA FREI,X
C042 CA 1619 DEX
C043 D0 F7 1626 BNE UMLAD1
C045 1629 ;
C045 1651 ; DER NMI-VEKTOR WIRD UEBERSPRUNGEN
C045 1654 ;
C045 A2 1A 1671 LDX #$1A ;RESTAURIEREN DER
C047 BD 35 FD 1693 UMLAD2 LDA VECTAB7,X ;RESTLICHEN
C04A 9D 19 03 16AC STA NMINVH,X ;VEKTOREN
C04D CA 16B2 DEX
C04E D0 F7 16BF BNE UMLAD2
C050 16C2 ;
C050 16E3 ; ZUNAECHST NORMALER I/O-RESET
C050 16E6 ;
C050 A9 7F 16FD LDA #$7F ;= 0111 111
C052 8D 0D DC 171B STA ICR1 ;SPERREN ALLER IRQ
C055 8D 0D DD 1739 STA ICR2 ;SPERREN ALLER NMI
C058 8D 00 DC 1753 STA CIA1 ;DATENREGISTER
C05B 177A ; PORT A AUF NORMALWERT
C05B A9 08 1791 LDA #$08 ;=0000 1000
C05D 8D 0E DC 17AD STA CRA1 ;TIMER A IM CIA1
C060 17B0 ;
C060 17D2 ; ERSATZ FUER BELEGUNG DES CRA2
C060 17D5 ;
C060 A9 88 17EC LDA #$88 ;=1000 1000
C062 8D 0E DD 1809 STA CRA2 ;TIMER A IM CIA2:
C065 1829 ; BIT 0 AUF STOP
C065 184F ; BIT 3 AUF EINZELLAUF
C065 1875 ; BIT 5 SYSTEMTAKT EIN
C065 189D ; BIT 7 ECHTZEITUHR=50HZ
C065 18A0 ;
C065 18C0 ; REST DES NORMALEN I/O-RESET
C065 18C3 ;
C065 18C6 ;
C065 A9 08 18DE LDA #$08 ;= 0000 1000
C067 20 B6 FD 18EE JSR IORESET19
C06A 18F1 ;
C06A 1919 ; REST DER NORMALEN RESTORE-NMI-ROUT.
C06A 191C ;
C06A 4C 6C FE 193A JMP NMIXCT16 ;EINSPRUNG BEI
C06D 195F ; SCREEN EDITOR RESET
C06D 1962 ;
C06D 198B ;**** ABSCHALTEN DER TIME OF DAY UHR **
C06D 198E ;
C06D 19AD ; DURCH SYS-KOMMANDO
C06D 19B0 ;
C06D A9 48 19D1 AUS LDA #L,ILLQUERR ;USR-VEKTOR
C06F 8D 11 03 19EF STA USRADDL ;AUF NORMALWERT
C072 A9 B2 1A01 LDA #H,ILLQUERR
C074 8D 12 03 1A0F STA USRADDH
C077 1A12 ;
C077 78 1A18 SEI
C078 A9 47 1A35 LDA #$47 ;RESTAURIEREN DES
C07A 8D 18 03 1A4F STA NMINVL ;NMI-VEKTORS
C07D A9 FE 1A5A LDA #$FE
C07F 8D 19 03 1A67 STA NMINVH
C082 1A6A ;
C082 A9 31 1A87 LDA #L,NORM ;RESTAURIEREN
C084 8D 14 03 1AA4 STA IRQVL ;DES IRQ-VEKTORS
C087 A9 EA 1AB2 LDA #H,NORM
C089 8D 15 03 1ABE STA IRQVH
C08C 1AC1 ;
C08C 58 1AC7 CLI
C08D 60 1ACD RTS
C08E 1AD0 ;
C08E 1AF9 ;**** DURCH USR AUFRUFBARE ROUTINE ****
C08E 1AFC ;
C08E 24 0D 1B1D USR BIT VALTYP ;WELCHER TYP VON
C090 1B44 ; VARIABLEN LIEGT VOR ?
C090 30 03 1B5F BMI STRING ;WENN STRING
C092 1B83 ; DANN UEBERSPRINGEN
C092 4C 20 C1 1B9F JMP ZAHLVAR ;SONST SPRUNG
C095 1BA2 ;
C095 1BC8 ;****** STELLEN DER ECHTZEITUHR *******
C095 1BEB ; DURCH USR("HHMMSST")
C095 1BEE ;
C095 20 82 B7 1C0F STRING JSR LEN1 ;Y=STRINGLAENGE
C098 C0 07 1C2C CPY #$07 ;STRING=7ZEICHEN?
C09A D0 40 1C4A BNE ALSET ;NEIN DANN ALARM
C09C 1C69 ; ZEIT STELLEN?
C09C 1C6C ;
C09C AD 0F DD 1C88 LDA CRB2 ;TIMER B IN CIA2
C09F 29 7F 1CA3 AND #$7F ;BIT7 LOESCHEN:
C0A1 8D 0F DD 1CBF STA CRB2 ;NORMALE UHRZEIT
C0A4 1CE4 ; IN ECHTZEITUHR CIA2
C0A4 1CE7 ;
C0A4 1D05 ; AUSLESEN DES ZEIT-STRINGS
C0A4 1D09 ;
C0A4 A0 00 1D22 LDY #$00 ;ZAEHLER AUF 0
C0A6 A9 24 1D47 STELLEN LDA #$24 ;BCD 24 STD-VERGL.
C0A8 20 FE C0 1D65 JSR ASCBCD ;ZEICHENTEST UND
C0AB 1D8D ; UMWANDLUNG IN BCD-ZAHL
C0AB D0 02 1DAB BNE STD12 ;STUNDEN UNGLEICH
C0AD 1DCF ; NULL ? DANN SPRUNG
C0AD A9 24 1DE6 LDA #$24 ;SONST = 24
C0AF 1DE9 ;
C0AF C9 13 1E0B STD12 CMP #$13 ;STUNDEN GROESSER
C0B1 90 07 1E2A BCC STDSET ;ODER GLEICH 12 ?
C0B3 1E4D ; NEIN, DANN SPRUNG
C0B3 F8 1E67 SED ;SONST DAVON BCD 12
C0B4 38 1E7B SEC ;SUBTRAHIEREN
C0B5 E9 12 1E8B SBC #$12 ;UND
C0B7 D8 1E91 CLD
C0B8 09 80 1EA9 ORA #$80 ;BIT7 SETZEN
C0BA 1EAC ;
C0BA 8D 0B DD 1ECF STDSET STA TODHR ;BCD-STUNDEN UND
C0BD 1EF7 ; AM/PM-FLAG IN TOD-CIA2
C0BD 1EFA ;
C0BD 20 FC C0 1F18 JSR ASCBCD1 ;ZEICHENTEST U.
COC0 1F3F ; UMWANDELN IN BCD-ZAHL
C0C0 8D 0A DD 1F5A STA TODMIN2 ;ERGEBNIS IN
C0C3 1F7F ; TOD-MIINUTENREGISTER
C0C3 1F82 ;
C0C3 20 FC C0 1F9F JSR ASCBCD1 ;DASSELBE
C0C6 8D 09 DD 1FBB STA TODSEC2 ;DIE SEKUNDEN
C0C9 1FBE ;
C0C9 20 66 C1 1FDA JSR TEST ;PRUEFEN,OB 1/10
C0CC 1FF9 ; SEKUNDEN=ZAHL
C0CC 8D 08 DD 2017 STA TOD10TH2 ;UND EINTRAGEN
C0CF 2039 ; INS TOD-REGISTER
C0CF 205D ; DIE UHR BEGINNT JETZT ZU LAUFEN
C0CF 2060 ;
C0CF A9 00 207D LDA #$00 ;KENNUNG FUER OK.
C0D1 4C 3C BC 20A2 AKKUFAC JMP ACTOFC ;AKKU ZUR UEBER-
C0D4 20C9 ; GABE INS BASIC IN FAC
C0D4 20CC ;
C0D4 20F5 ;********** FEHLER AUFGETRETEN ********
C0D4 20F8 ;
C0D4 68 2116 FEHLER PLA ;JSR-ADRESSEN VOM
C0D5 68 212A PLA ;STAPEL HOLEN
C0D6 212D ;
C0D6 68 2138 ERROR PLA
C0D7 68 213E PLA
C0D8 2141 ;
C0D8 A9 FF 2164 ERROR LDA #$FF ;FEHLERKENNUNG IN
C0DA D0 F5 2180 BNE AKKUFAC ;AKKU UND FAC
C0DC 2183 ;
C0DC 21AC ;ENDE DIESES TEILS D. UNBEDINGTEN SPRG.
C0DC 21D5 ;--------------------------------------
C0DC 21D8 ;
C0DC 2201 ;**** ALARMZEIT EINLESEN **************
C0DC 2204 ;
C0DC 222A ; AUFRUF DURCH Z.B. USR("AHHMMSSTT")
C0DC 222D ;
C0DC C0 08 224B ALSET CPY #$08 ; 8 ZEICHEN ?
C0DE D0 F8 2265 BNE ERROR1 ;NEIN=FEHLER
C0E0 2268 ;
C0E0 AD 0F DD 2273 LDA CRB2
C0E3 09 80 228E ORA #%10000000 ;ALARMBIT
C0E5 8D 0F DD 22A1 STA CRB2 ;SETZEN
C0E8 22A4 ;
C0E8 A9 84 22C0 LDA #%10000100 ;ALARM-NMI
C0EA 8D 0D DD 22D5 STA ICR2 ;ZULASSEN
C0ED 22D8 ;
C0ED A9 3C 22F3 LDA #$3C ;VERZOEGERUNGS-
C0EF 85 04 230D STA VORW ;WERT VORGEBEN
C0F1 85 02 2318 STA VERZ
C0F3 A9 FF 2336 LDA #$FF ;EOR-WERT VORGEBEN
C0F5 85 03 2341 STA FARB
C0F7 A0 01 235F LDY #$01 ;BUCHSTABE UEBERL.
C0F9 4C A6 C0 236D JMP STELLEN
C0FC 2370 ;
C0FC 2373 ;
C0FC 239C ;**************************************
C0FC 23C5 ;UNTERPROGRAMM ZUR UMWANDLUNG DER ASCII
C0FC 23EC ;CODES IN BCD-ZAHLEN UND PRUEFUNG DER
C0FC 23FF ;EINGABE-ZEICHEN.
C0FC 2402 ;
C0FC A9 60 2427 ASCBCD1 LDA #$60 ;BCD 60 ALS GRENZE
C0FE 244F ; FUER MIN UND SEK WERTE
C0FE 2452 ;
C0FE 85 24 2465 ASCBCD STA INDEX3
C100 20 13 C1 2482 JSR TEST1 ;PRUEFEN OB ZAHL
C103 0A 249A ASL ;AUS LSB INS MSB
C104 0A 24AB ASL ;SCHIEBEN
C105 0A 24B2 ASL
C106 0A 24B9 ASL
C107 85 25 24D7 STA INDEX4 ;UND ZW.SPEICHER
C109 24DA ;
C109 20 13 C1 24F7 JSR TEST1 ;NAECHSTE ZIFFER
C10C 2510 ; PRUEFEN
C10C 05 25 252C ORA INDEX4 ;MSB AUS ZWSP.
C10E 2552 ; UND LSB ZUSAMMENOREN
C10E C5 24 256F CMP INDEX3 ;UNTER GRENZW.?
C110 B0 C4 258D BCS ERROR ;NEIN=FEHLERAUSG.
C112 2590 ;
C112 60 2596 RTS
C113 2599 ;
C113 25C2 ;** PRUEFUNG OB ASCII-ZAHL VORLIEGT ***
C113 25C5 ;
C113 B1 22 25E8 TEST1 LDA (INDEX),Y ;ZEICHEN EIN-
C115 2607 ; LESEN IN AKKU
C115 38 260D SEC
C116 E9 30 2625 SBC #$30 ;< ASCII 0 ?
C118 90 BA 263D BCC FEHLER ;JA=FEHLER
C11A 2640 ;
C11A C9 0A 2659 CMP #$0A ;>= ASCII : ?
C11C B0 B6 2671 BCS FEHLER ;JA=FEHLER
C11E 2674 ;
C11E C8 2690 INY ;SCHLEIFENZAEHLER + 1
C11F 60 2696 RTS
C120 2699 ;
C120 26C2 ;**** ENDE PROGRAMMTEIL UHR STELLEN ***
C120 26C5 ;
C120 26EE ;--------------------------------------
C120 26F1 ;
C120 271A ;********** UHR LESEN *****************
C120 271D ;
C120 273E ; GESCHIEHT DURCH USR(ZAHL)
C120 2741 ;
C120 A9 07 2761 ZAHLVAR LDA #$07 ;STRINGLAENGE
C122 20 7D B4 277F JSR STRINI8 ;SCHAFFT 7 BYTE
C125 27A7 ; PLATZ FUER STRING UND
C125 27CF ; LEGT START NACH $62/63
C125 27F6 ; SOWIE LAENGE NACH $61
C125 2814 ; (FAC $61-66)
C125 2817 ;
C125 A0 00 2831 LDY #$00 ;ZAEHLER AUF 0
C127 AD 0B DD 284F LDA TODHR ;STUNDE AUSLESEN,
C12A 2878 ; DABEI WIRD GESAMTE ZEIT
C12A 28A1 ; ZWISCHENGESPEICHERT UND
C12A 28C7 ; ERST NACH LESEN DER
C12A 28EF ; 1/10-SEK ZURUECKGEHOLT
C12A 2914 ; MIT AKTUELLEN WERT.
C12A 2917 ;
C12A 08 2935 PHP ;STATUS ZWISCHENSPEICH.
C12B 2938 ;
C12B 29 1F 294F AND #$1F ;=0001 1111
C12D 2978 ; LOESCHEN DER AM/PM-FLAG
C12D C9 12 2996 CMP #$12 ;=0001 0010 =BCD12
C12F D0 02 29B0 BNE NO12 ;<>DANN SPRUNG
C131 A9 00 29CE LDA #$00 ;SONST STATTDESSEN
C133 29D1 ;
C133 28 29F0 NO12 PLP ;STATUS ZURUECKHOLEN
C134 10 05 2A0A BPL AM ;FALLS KEINE AM/
C136 2A2F ; PM-FLAG GESETZT WAR
C136 2A32 ;
C136 F8 2A4C SED ;SONST ADDIEREN VON
C137 18 2A62 CLC ;BCD 12 WEIL PM
C138 69 12 2A6D ADC #$12
C13A D8 2A73 CLD
C13B 2A76 ;
C13B 20 55 C1 2A96 AM JSR BCDASC ;UP ZUR UMRECHNG
C13E 2ABC ; VOM BCD IN ASCII UND
C13E 2AE5 ; ABLEGEN IM STRING. HIER
C13E 2B02 ; STUNDENWERT
C13E 2B05 ;
C13E AD 0A DD 2B22 LDA TODMIN2 ;DASSELBE FUER
C141 20 55 C1 2B3C JSR BCDASC ;MINUTENWERT
C144 2B3F ;
C144 AD 09 DD 2B5C LDA TODSEC2 ;UND SEKUNDEN-
C147 20 55 C1 2B6F JSR BCDASC ;WERT
C14A 2B72 ;
C14A AD 08 DD 2B8C LDA TOD10TH2 ;UND 1/10-
C14D 20 60 C1 2BA8 JSR BCDASC1 ;SEKUNDENWERT
C150 2BAB ;
C150 68 2BC7 PLA ;USR-STRING-ARGUMENT-
C151 68 2BE5 PLA ;RUECKSPRUNG VORBEREIT.
C152 2BE8 ;
C152 4C CA B4 2C06 JMP STRLIT67 ;BRINGT STRING
C155 2C29 ; DESCRIPTOR IN DIE
C155 2C52 ; DESCRIPTORTABELLE ($19-
C155 2C79 ; $21),SETZT POINTER IN
C155 2CA2 ; FAC(HIER $64/65) DARAUF
C155 2CC8 ; SETZT STRING-FLAGGE,
C155 2CE9 ; ERHOEHT LETZTEN
C155 2D10 ; DESCRIPTOR-INDEX UM 3
C155 2D38 ; ROUTINE ENDET MIT RTS.
C155 2D3B ;
C155 2D64 ;**** ENDE DES LESENS DER UHR *********
C155 2D67 ;
C155 2D90 ;--------------------------------------
C155 2D93 ;
C155 2DBC ;* UNTERPROGRAMM Z. UMRECHNUNG BCD IN *
C155 2DE5 ;* ASCII U.EINTRAGEN IN STRINGSPEICHER*
C155 2DE8 ;
C155 48 2E0B BCDASC PHA ;AUF STAPEL ZW.SPEICH.
C156 2E0E ;
C156 4A 2E2A LSR ;MSB INS LSB SCHIEBEN
C157 4A 2E31 LSR
C158 4A 2E38 LSR
C159 4A 2E3F LSR
C15A 2E42 ;
C15A 20 60 C1 2E5E JSR BCDASC1 ;IN ASCII UM-
C15D 2E85 ; RECHNEN UND SPEICHERN
C15D 2E88 ;
C15D 68 2EA5 PLA ;ZURUECKHOLEN DER BCD-
C15E 29 0F 2EC3 AND #$0F ;ZAHL,LOESCHEN DES
C160 2ED8 ; MSB
C160 2EDB ;
C160 09 30 2F00 BCDASC1 ORA #$30 ;DAZUODERN VON $30
C162 2F28 ; ERZEUGT (WEIL NUR ZAHL
C162 2F4F ; ZWISCHEN 0 UND 9) DEN
C162 2F78 ; ASCII-WERT ($30 BIS 39)
C162 2F7B ;
C162 91 62 2F98 STA (FAC1),Y ;EINTRAGEN IN
C164 2FB7 ; STRINGTABELLE
C164 2FBA ;
C164 C8 2FCC INY ;ZAEHLER +1
C165 2FCF ;
C165 60 2FD5 RTS
C166 2FD8 ;
C166 3001 ;****** REST DES UP ASCII-BCD *********
C166 3004 ;
C166 20 13 C1 3020 TEST JSR TEST1 ;PRUEFT AUF
C169 3042 ; ASCII-ZAHL (0-9)
C169 60 3048 RTS
C16A 304B ;
C16A 3074 ;****** NMI-REAKTION AUF ALARM ********
C16A 3077 ;
C16A A9 77 3097 ALARM LDA #L,ALIRQ ;NEUER IRQ-
C16C 8D 14 03 30AB STA IRQVL ;VEKTOR
C16F A9 C1 30BA LDA #H,ALIRQ
C171 8D 15 03 30C6 STA IRQVH
C174 30C9 ;
C174 4C BC FE 30E5 JMP NMIEND ;REST DER NOR-
C177 3108 ; MALEN NMI-ROUTINE
C177 310B ;
C177 3134 ;****** DIE NEUE IRQ-ROUTINE *********
C177 3151 ; RAHMENBLINKEN
C177 3154 ;
C177 3157 ;
C177 C6 02 3175 ALIRQ DEC VERZ ;ZEITSCHLEIFE
C179 F0 03 3191 BEQ BLINK ;BLINKEN WENN 0
C17B 3194 ;
C17B 4C 31 EA 31B2 JMP NORM ;SONST NORMALE IRQ
C17E 31B5 ;
C17E A5 04 31D5 BLINK LDA VORW ;ZAEHLER RUECK-
C180 85 02 31E8 STA VERZ ;SETZEN
C182 31EB ;
C182 AD 20 D0 3203 LDA RAND ;RAHMENFARBE
C185 45 03 321B EOR FARB ;INVERTIEREN
C187 8D 20 D0 3226 STA RAND
C18A 3229 ;
C18A 4C 31 EA 3244 JMP NORM ;ZUM NORMAL-IRQ
C18D 3247 ;
C18D 324D .EN