C 64/VC 20
Kurs

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.

(Heimo Ponnath)
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
Bild 18. Test und Demonstration der Verschieberoutine. Das Programm zeigt das Ein- und Ausschalten einer Kopfzeile auf dem Bildschirm
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*********************************
Bild 23. Testprogramm für die beiden kleinen Assembler-Routinen. Die Bedienung ist im Artikel erklärt.
,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
16-Bit-Division
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
Programm 2. Das Demo-Programm zur neuen Verschieberoutine. Vorher müssen Programm 3 und Programm 4 geladen werden.
,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
Programm 3. Erster Teil der Verschieberoutine
,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 4. Zweiter Teil der Verschieberoutine
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
Listing 8. Programm Timer-Test, ein Beispiel für die Anwendung eines 32-Bit-Timers.
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
Listing 10. Eine Echtzeituhr.
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
Listing 11. Der Quelltext zur Echtzeituhr.
PDF Diesen Artikel als PDF herunterladen
Mastodon Diesen Artikel auf Mastodon teilen
← Vorheriger ArtikelNächster Artikel →