; R20-21 ist durch Wait2ms belegt .def temp = r16 .def temp1 = r17 .def temp2 = r18 .def temp3 = r19 .def Xc = r5 .def Yc = r6 .DSEG Buf_IN: .BYTE 280 ; 280 bytes RAM organisieren für Grafikzeilenpuffer .CSEG { INIT Zeugs und Hauptprogramm zum einlesen der Daten in den Puffer und starten der Converter-Routine, etc } ConvertInputBuffer: ; Aufgabe: aus den 280x8 bits im Speicher 8 Grafikzeilen a 280bits (35bytes) ; zusammenbasteln. LDI temp, 1 MOV Yc, temp ; Schleife starten, welche die Zeichenzeile im Inputbuffer durchläuft IN_ROW_LOOP: LDI ZL, LOW(Buf_IN) LDI ZH, HIGH(Buf_IN) ; INIT: 35 Grafikbytes an den Drucker ldi temp, $1B ; ESC rcall SendChar ldi temp, $67 ; GRAFIKDRUCK INIT rcall SendChar ldi temp, 35 ; Anzahl der folgenden Bytes für den Grafikdruck rcall SendChar CLR temp3 ; temp3 ist der bytecounter für Ausgabepuffer (35 = ende) ; 2. Schleife starten, welche die 8 Ausgabezeilen durchläuft OUT_ROW_LOOP: LDI temp2, 1 ; Temp2 ist das aktuelle Bit im Ausgabebyte CLR temp1 ; Temp1 wird nachher das auszugebende Zeichen ; 3. Schleife starten, welche die 8 bits des Ausgabebytes durchläuft OUT_CHAR_LOOP: ; nächstes Quell-byte holen LD temp, Z+ AND temp, Yc ; Wir wollen nur das aktuelle Bit im Eingabepuffer haben TST temp BREQ OUT_BIT_READY ; das bit ist clear, also brauchen wir das Ausgabebyte nicht aendern ; Hier müssen wir das aktuelle Bit im Ausgabebyte setzen EOR temp1, temp2 ; Das geht über Exklusiv-Oder, also im Prinzip das 0bit togglen OUT_BIT_READY: ; Bit fertig, nächstes bit schieben LSL temp2 TST temp2 BRNE OUT_CHAR_LOOP ; Rücksprung Schleife3 (noch nicht alle 8 bits fertig) MOV temp, temp1 RCALL SendChar ; Okay. das Ausgabebyte in temp1 ist fertig und wird gesendet INC temp3 CPI temp3, 35 BRLT OUT_ROW_LOOP ; Rücksprung Schleife 2 (die Ausgabezeile ist noch nicht voll) LSL Yc ; Zeilennummer erhöhen TST Yc BRNE IN_ROW_LOOP ; Rücksprung Schleife 1 (noch nicht alle 8 Zeilen durchlaufen!) RET ; Ende, jetzt sollten 8 Zeilen a 280 pixel gedruckt sein... WaitBusy: SBIC PINC, BUSY rjmp WaitBusy ret Pause2ms: ldi R20, $1F WGLOOP0: ldi R21, $55 WGLOOP1: dec R21 brne WGLOOP1 dec R20 brne WGLOOP0 ret SendChar: OUT PORTD, temp rcall Pause2ms SBI PORTC, STROBE rcall Pause2ms CBI PORTC, STROBE rcall WaitBusy RET