        ORG 0000H

;Benötigte externe Adressen
data    EQU 0FF90H ;Datenregister für Grafikdisplay
command EQU data+1 ;Commandoregister für Grafikdisplay

;Eingebaute Befehle:
;
; DISPINI    = Display initialisieren
; SETTHA     = Text Home Adress setzen
; SETTA      = Text Area setzen
; SETGHA     = Graphic Home Adress setzen
; SETGA      = Graphic Area setzen
; SETGMODE   = Graphic Modus sezen
; SETDMODE   = Display Modus setzen
; SETCRSPAT  = Cursor Pattern setzen
; SETINCW    = Auto Increment Modus starten
; SETADRP    = Adresspointer setzen
; SETCRSADR  = Cursorpointer setzen
; CLRINCW    = Auto Increment Modus zurücksetzen
; CLRSRC     = Clear Screen
; WRITEGDATA = Grafik Data zum Display senden
; WRITETDATA = Text Data zum Display schicken
 
 
START:       ACALL DISPINI
 
;             ACALL SETCRSADR
 
;Display löschen
             MOV   R0,#00h
             MOV   R1,#00h
             ACALL SETADRP
 
             ACALL CLRSCR
 
;Grafik ausgeben
             MOV   R0,#00h
             MOV   R1,#40h
             ACALL SETADRP
 
             ACALL SETINCW
 
             MOV   DPTR,#PoloEnd
             MOV   R0,DPL
             MOV   R1,DPH
             MOV   DPTR,#Polo
             ACALL WRITEGDATA
 
             ACALL CLRINCW
 
;             SJMP  STOP
;Text ausgeben
             MOV   R0,#00h
             MOV   R1,#00h
             ACALL SETADRP
 
             ACALL SETINCW
 
             MOV   DPTR,#TextEnd
             MOV   R0,DPL
             MOV   R1,DPH
             MOV   DPTR,#Text

             ACALL WRITETDATA
 
             ACALL CLRINCW
 
STOP:        SJMP  STOP
 
 


;********************************************************************
;*********      Hier folgen die Unterprogs zum Steuern      *********
;********************************************************************

;Display initialisieren
DISPINI:     ACALL SETTHA                  ;Text Home Adress setzen
             ACALL SETTA                   ;Text Area setzen
             ACALL SETGHA                  ;Graphic Home Adress setzen
             ACALL SETGA                   ;Graphic Area setzen
             ACALL SETGMODE                ;Graphic Modus setzen
             ACALL SETDMODE                ;Display Modus setzen
             ACALL SETCRSPAT               ;Cursor Pattern setzen
             RET

;Text Home Adress (THA) setzen.
SETTHA:      ACALL check1                  ;Kann ich Daten senden?
             MOV   DPTR,#data              ;
             MOV   A,#00h                  ;Zuerst LSB senden
             MOVX  @DPTR,A                 ;
 
             ACALL check1                  ;Kann ich Daten senden?
             MOV   DPTR,#data              ;
             MOV   A,#00h                  ;Jetzt MSB
             MOVX  @DPTR,A                 ;
 
             ACALL check1                  ;Kann ich Daten senden?
             MOV   DPTR,#command           ;
             MOV   A,#40h                  ;Befehl für 'THA setzen' senden
             MOVX  @DPTR,A                 ;
             RET
 
;Text Area (TA) setzen
SETTA:       ACALL check1                  ;Kann ich Daten senden?
             MOV   DPTR,#data              ;
             MOV   A,#1Eh                  ;Zuerst LSB senden
             MOVX  @DPTR,A                 ;
 
             ACALL check1                  ;Kann ich Daten senden?
             MOV   DPTR,#data              ;
             MOV   A,#00h                  ;Jetzt MSB
             MOVX  @DPTR,A                 ;
 
             ACALL check1                  ;Kann ich Daten senden?
             MOV   DPTR,#command           ;
             MOV   A,#41h                  ;Befehl für 'TA setzen' senden
             MOVX  @DPTR,A                 ;
             RET

;Graphic Home Adress (GHA) setzen.
SETGHA:      ACALL check1                  ;Kann ich Daten senden?
             MOV   DPTR,#data              ;
             MOV   A,#00h                  ;Zuerst LSB senden
             MOVX  @DPTR,A                 ;
 
             ACALL check1                  ;Kann ich Daten senden?
             MOV   DPTR,#data              ;
             MOV   A,#40h                  ;Jetzt MSB
             MOVX  @DPTR,A                 ;
 
             ACALL check1                  ;Kann ich Daten senden?
             MOV   DPTR,#command           ;
             MOV   A,#42h                  ;Befehl für 'GHA setzen' senden
             MOVX  @DPTR,A                 ;
             RET

;Graphic Area (GA) setzen (240 Pixel / 8 = 30d = 001Eh)
SETGA:       ACALL check1                  ;Kann ich Daten senden?
             MOV   DPTR,#data              ;
             MOV   A,#1Eh                  ;Zuerst LSB senden
             MOVX  @DPTR,A                 ;
 
             ACALL check1                  ;Kann ich Daten senden?
             MOV   DPTR,#data              ;
             MOV   A,#00h                  ;Jetzt MSB
             MOVX  @DPTR,A                 ;
 
             ACALL check1                  ;Kann ich Daten senden?
             MOV   DPTR,#command           ;
             MOV   A,#43h                  ;Befehl für 'GA setzen' senden
             MOVX  @DPTR,A                 ;
             RET
 
;Modus setzen
;            OR             = 1000x000b = 80h
;            EXOR           = 1000x001b = 81h
;            AND            = 1000x011b = 83h
;            Text Attribute = 1000x100b = 84h
SETGMODE:    ACALL check1                  ;Kann ich Daten senden?
             MOV   DPTR,#command           ;
             MOV   A,#81H                  ;'OR' Modus
             MOVX  @DPTR,A                 ;
             RET

;Display Modus
;            Display OFF          = 10010000 = 90h
;            Cursor on, blink off = 1001xx10 = 92h
;            Cursor on, blink on  = 1001xx11 = 93h
;            Text on, Graphic off = 100101xx = 94h
;            Text off, Graphic on = 100110xx = 98h
;            Text on, Graphic on  = 100111xx = 9Ch
SETDMODE:    ACALL check1                  ;Kann ich Daten senden?
             MOV   DPTR,#command           ;
             MOV   A,#10011100b            ;
             MOVX  @DPTR,A                 ;
             RET

;Cursor Pattern setzen
;            1-line Cursor                 = 10100000 = A0h
;            2-line Cursor                 = 10100001 = A1h
;            3-line Cursor                 = 10100010 = A2h
;            4-line Cursor                 = 10100011 = A3h
;            5-line Cursor                 = 10100100 = A4h
;            6-line Cursor                 = 10100101 = A5h
;            7-line Cursor                 = 10100110 = A6h
;            8-line Cursor                 = 10100111 = A7h
SETCRSPAT:   ACALL check1                  ;Kann ich Daten senden?
             MOV   DPTR,#command           ;
             MOV   A,#10100000b            ;1-line Cursor
             MOVX  @DPTR,A                 ;
             RET
 
;Adresszeiger setzten
SETADRP:     ACALL check1                  ;Kann ich Daten senden?
             MOV   DPTR,#data              ;
             MOV   A,R0                    ;LSB wird gesendet
             MOVX  @DPTR,A                 ;
 
             ACALL check1                  ;Kann ich Daten senden?
             MOV   DPTR,#data              ;
             MOV   A,R1                    ;MSB wird gesendet
             MOVX  @DPTR,A                 ;
 
             ACALL check1                  ;Kann ich Daten senden?
             MOV   DPTR,#command           ;
             MOV   A,#24h                  ;Befehl für 'Adress Pointer' setzen
             MOVX  @DPTR,A                 ;
             RET
 
;Cursor Pointer setzen
SETCRSADR:   ACALL check1                  ;Kann ich Daten senden?
             MOV   DPTR,#data              ;
             MOV   A,R0                    ;Zuerst X Position senden
             MOVX  @DPTR,A                 ;
 
             ACALL check1                  ;Kann ich Daten senden?
             MOV   DPTR,#data              ;
             MOV   A,R1                    ;Jetzt Y Position senden
             MOVX  @DPTR,A                 ;
 
             ACALL check1                  ;Kann ich Daten senden?
             MOV   DPTR,#command           ;
             MOV   A,#21h                  ;Befehl für 'GA setzen' senden
             MOVX  @DPTR,A                 ;
             RET
 
;Auto Increment Modus initialisieren
SETINCW:     ACALL check1                  ;Kann ich Daten senden?
             MOV   DPTR,#command           ;
             MOV   A,#0B0h                 ;Befehl für 'Data Write and Increment ADP'
             MOVX  @DPTR,A                 ;
             ACALL check1
             RET
 
;Auto Increment Modus löschen
CLRINCW:     ACALL check1                  ;Kann ich Daten senden?
             MOV   DPTR,#command           ;
             MOV   A,#0B2h                 ;Befehl für 'Auto Reset'
             MOVX  @DPTR,A                 ;
             ACALL check1
             RET
 
check1:     ;Kann ich Daten ans Display schicken?
             MOV   DPTR,#command
             MOVX  A,@DPTR
             ANL   A,#03h
             CJNE  A,#03h,check1
             RET

check2:      ;Kann ich im Automode Grafikdaten ans Display schicken?
             MOV   DPTR,#command
             MOVX  A,@DPTR
             ANL   A,#08h
             CJNE  A,#08h,check2
             RET

;Speicherbereich löschen
CLRSCR:      ACALL SETINCW
             MOV   R2,#0F0h
loopCS:      ACALL check2
             MOV   A,#'1'
             MOV   DPTR,#data
             MOVX  @DPTR,A
             DEC   R2
             CJNE  R2,#00h,loopCS
             ACALL CLRINCW
             RET

;Write Graphic Data to LCD module
WRITEGDATA:  MOV   A,#00h
LoopGD:      MOVC  A, @A+DPTR
             PUSH  ACC
             MOV   A,R1
             CJNE  A,DPH,NextGD
             MOV   A,R0
             CJNE  A,DPL,NextGD
             POP   ACC
             RET
NextGD:      POP   ACC
             PUSH  DPH
             PUSH  DPL
             PUSH  ACC
             ACALL check2
             POP   ACC
 
             MOV   DPTR,#data
             MOVX  @DPTR,A
             POP   DPL
             POP   DPH
 
             INC   DPTR
             MOV   A,#00h
             SJMP  LoopGD
 
;Write Text Data to LCD module
WRITETDATA:  MOV   ACC,#00h
LoopTD:      MOVC  A, @A+DPTR
             PUSH  ACC
             MOV   A,R1
             CJNE  A,DPH,NextTD
             MOV   A,R0
             CJNE  A,DPL,NextTD
             POP   ACC
             RET
NextTD:      POP   ACC
             PUSH  DPH
             PUSH  DPL
             PUSH  ACC
             ACALL check2
             POP   ACC
 
             SUBB  A,#20h
             MOV   DPTR,#data
             MOVX  @DPTR,A
             POP   DPL
             POP   DPH
 
             INC   DPTR
             MOV   ACC,#00h
             SJMP  LoopTD
 

;********************************************************************
;*********              Hier folgen die Texte               *********
;********************************************************************
 
     ORG 400H

Text:        ;      123456789012345678901234567890
;             DB    '                              '
             DB    '   Initialisierung...         '
             DB    '                              '
             DB    '                              '
             DB    '                              '
             DB    '                              '
             DB    '                              '
             DB    '                              '
             DB    '                              '
;             DB    'Franz jagt im komplett verwahrlosten Taxi '
;             DB    'quer durch Bayern.'
Textend:

.i Hallo.asm       ;Begrüßungsschirm

     END

