TITLE    LED - Steuerung am PORT 0
.Z80
;*************************************************************
;*      Hobby, Z80/Z180 
;*      einfache Programmierung
;*      Lernen Z80 Maschinensprache
;*************************************************************
;*      Kurt Pieper, Germany
;*      Version 25.07.2010
;*      Update  06.09.2020
;*************************************************************
;*      LED ansteuern Taste 0-8
;       SC22c (20Mhz) Modul -->  SC129 PORT 0
;*************************************************************
;*      Compiler: z80asm led
;**************************************************************
;       LED.MAC             ; umbenenen
;       M80 LED=LED/L
;       L80 LED,LED/N/E
;
; Die Benutung des Programmes erfolgt auf eigene Gefahr.
; Es wird der PORT 0 angesteuert.
; Das Programm testet das SC129 Board 
; Beispiel Motherboard rc2014 (Foto).
;
;    S e g u e n z e n
;
WARM          EQU     0H              ; CP/M warm start
BDOS          EQU     5H              ; oder FDOS
CONOUT        EQU     2H
DIRECT        EQU     6H
STRING        EQU     9H
LF            EQU     0AH
CR            EQU     0DH
ESC           EQU     1BH
CRLF          EQU     0D0AH
;
;how         ESC,+'[','17',';','37','H'              ;row 17, col 37
;
;    Tasten zur LED Anzeige
ONE           EQU     31H
TWO           EQU     32H
THREE         EQU     33H
FOUR          EQU     34H
FIVE          EQU     35H
SIX           EQU     36H
SEVEN         EQU     37H      
EIGHT         EQU     38H
NIX           EQU     30H
LL            EQU     4CH
PORTSC        EQU     00H         ; JUMPER 2 , 0H und kein JUMPER PORT = 0
rahmen_x      equ     25h
rahmen_y      equ     06h
;
;             ASEG                ; wenn M80 !!!! 
;
;    H A U P T P R O G R A M M  
;****************************************************************
              ORG     0100H           ; TPA 
;
;             JP      RAHMENC
              JP      START            
;

RAHMENC:      CALL  TIMER5
;              call  cls
RAHMEM:       ld    a,40h       ;rahmen_x
              daa
              ld    (xpos),a
              ld    a,23        ;rahmen_y
              daa
              ld    (ypos),a
              call  gotoxy
              jp    version
              jp    warm
;

VERSION:      LD      C,STRING
              LD      DE,MSG15
              CALL    BDOS
              RET
;
MSG15:        DB    1BH, '[','17',';','35','H'
              DB    1bh, "[7m"  
              DB    ' Version 1.1 v. 06.09.20 '
              DB     1bh, "[0m"
              DB    1BH, '[u'
              DB      '$'
;
START:        CALL    CLS             ; loesche Bildschirn
              LD      A,05H           ; 5 in Puffer  
              LD      (03BH),A        ; 01H nach 03BH
              LD      A,0             ; PORT 0 = 0
              OUT     (PORTSC),A
              CALL    HELLO           ; 1. Meldung
;
ENTRY:        LD      E,0FFH          ; Input a character using
              LD      C,DIRECT        ; Direct console I/O
              CALL    BDOS
              OR      A               ; Was a key pressed?
              JR      Z,ENTRY         ; If not, keep waiting
              CP      ESC             ; bye ? 
              JR      NZ,CRTEST       ; Did they press <ESC>?
              JP      BYE             ; If so, return to CP/M
CRTEST:       CP      CR              ; Did they press <CR>?
              JR      Z,MAIN          ; If so, do your terminal stuff
              CALL    BEEP            ; Else, signal error, led blink
              JR      ENTRY           ; and wait for another entry
;----------------------------------------------------------------
;
MAIN:         CALL    CLS
              CALL    DOIT             ; Tell user how to get out
;
LOOP:         JR      Z,KEYIN          ; check keyboard
              CP      ESC              ; Abfrage Minus [-] Nummernblock
              CP      'm'              ; ESC +'m'  
              JP      Z,BYE            ; BYE -> CP/M  
;
KEYIN:        CALL    KEYS             ; Taste ?, welches Zeichen
              JR      Z,LOOP           ; kein Zeichen gefunden, goto LOOP
              PUSH    AF               ; Register AF = A retten 
              CALL    MSGCLS           ; zuerst Zeile loeschen 
              POP     AF               ;  
              CP      ESC              ; + 
              CP      '['              ; Taste               
              CP      'k'              ; Keyblock
              JP      Z,FILL           ;
              CP      ESC              ; ESC+'[D'   Cursortaste 
              CP      '['              ;              links
              CP      'D'              ; A = oben
              JP      Z,KEYLINKS       ; oben 
              CP      ESC              ; ESC+'[C'    Cursortaste 
              CP      '['              ;               rechts
              CP      'C'              ; C = unten               
              JP      Z,KEYRECHTS      ; unten Cursortaste unten
              CP      ONE              ; A =  ? Taste 1
              JP      Z,LED1           ; Ausgabe PORT 0,00000001B 
              CP      TWO              ; war Taste 2
              JP      Z,LED2           ; Ausgabe PORT 0,00000010B 
              CP      THREE            ; usw.... 
              JP      Z,LED3
              CP      FOUR
              JP      Z,LED4
              CP      FIVE
              JP      Z,LED5
              CP      SIX
              JP      Z,LED6
              CP      SEVEN
              JP      Z,LED7
              CP      EIGHT
              JP      Z,LED8
              CP      NIX
              JP      Z,LED0           ; Taste 0 LED loeschen
              CP      LL               ; L gedrueckt
              JP      Z,DEMO1          ; LEDLL             
              CP      'R'
              JP      Z,DEMO2          ; LEDRR
              CP      'O'
              JP      Z,DEMO3          ; LEDLR Demo
              CP      'E'
              JP      Z,DEMO4          ; ENDLOS mit ESC Abruch 
              CP      'H'
              JP      Z,DEMO5
XX:           JR      LOOP             ; LOOP
              ;
;
DEMO1:        CALL    LEDLL
              JP      XX  
DEMO2:        CALL    LEDRR
              JP      XX
DEMO3:        CALL    LEDFF            ; JP      LEDLR
              JP      XX
DEMO4:        CALL    ENDLOS
              JP      XX
DEMO5:        CALL    BLINKER
              JP      XX
;
              ;Ende Hauptprogramm.
;----------------------------------------------------------------
              ;Unterprogramm zur Ausgabe PORT 0 - 255
;
FILL:         PUSH   AF
              LD     A,01H
              LD     (03BH),A
              POP    AF
              JP     XX             
;
KEYNO:        PUSH   AF
              CALL   MSGLED
              POP    AF
              JP     XX
;
;
KEYRECHTS:    PUSH   AF                 ; Cursor Taste rechts
              LD     A,(03BH)
              OUT    (PORTSC),A
              RRC    A                   ; rechts shiften 1000000
              LD     (03BH),A
              POP    AF
              JP     XX
;
KEYLINKS:     PUSH   AF                 ; Cursor Taste links
              LD     A,(03BH)
              OUT    (PORTSC),A
              RLC    A                  ; links shiften 00000010              
              LD     (03BH),A
              POP    AF
              JP     XX
;
LED1:         LD     A,00000001b
              OUT    (PORTSC),A
              JP     XX     
;
LED2:         LD     A,00000010b
              OUT    (PORTSC),A
              JP     XX
;
LED3:         LD     A,00000100b
              OUT    (PORTSC),A
              JP     XX
;
LED4:         LD     A,00001000b
              OUT    (PORTSC),A
              JP     XX
;
LED5:         LD     A,00010000b
              OUT    (PORTSC),A
              JP     XX
;
LED6:         LD     A,00100000b
              OUT    (PORTSC),A
              JP     XX
;
LED7:         LD     A,01000000b
              OUT    (PORTSC),A
              JP     XX
;
LED8:         LD     A,10000000b
              OUT    (PORTSC),A
              JP     XX
;
LED0:         LD     A,00000000b
              OUT    (PORTSC),A
              CALL   MSGLED             
              JP     XX
;
LEDLL:        RRA
              LD     A,10000000b
              OUT    (PORTSC),A
              CALL   TIMER5
              RRA    
              OUT    (PORTSC),A
              CALL   TIMER5
              RRA
              OUT    (PORTSC),A
              CALL   TIMER5
              RRA
              OUT    (PORTSC),A
              CALL   TIMER5
              RRA
              OUT    (PORTSC),A
              CALL   TIMER5
              RRA
              OUT    (PORTSC),A
              CALL   TIMER5
              RRA
              OUT    (PORTSC),A
              CALL   TIMER5
              RRA
              OUT    (PORTSC),A
              CALL   TIMER5
              RRA
              OUT    (PORTSC),A
              CALL   TIMER5
              RET

LEDRR:        LD     A,00000001b
              OUT    (PORTSC),A
              CALL   TIMER5
              RLC    A
              OUT    (PORTSC),A
              CALL   TIMER5
              RLC    A
              OUT    (PORTSC),A
              CALL   TIMER5
              RLC    A
              OUT    (PORTSC),A
              CALL   TIMER5
              RLC    A
              OUT    (PORTSC),A
              CALL   TIMER5
              RLC    A
              OUT    (PORTSC),A
              CALL   TIMER5
              RLC    A
              OUT    (PORTSC),A
              CALL   TIMER5
              RLC    A
              OUT    (PORTSC),A
              CALL   TIMER5
              LD     A,0
              OUT    (PORTSC),A
              CALL   TIMER5
              RET
;
BLINKER:      LD     A,255
              OUT    (PORTSC),A
              CALL   TIMER5
              LD     A,0
              OUT    (PORTSC),A
              CALL   TIMER5
              LD     A,255
              OUT    (PORTSC),A
              CALL   TIMER5
              LD     A,0
              OUT    (PORTSC),A
              CALL   TIMER5
              LD     A,255
              OUT    (PORTSC),A
              CALL   TIMER5
              LD     A,0
              OUT    (PORTSC),A
              CALL   TIMER5
              RET
;
LEDFF:        LD      A,0F0H          ; Taste O 
              LD      (03BH),A
CHECK:        CALL    LEDLR
              LD      A,(03BH)
              SUB     A     
              LD      (03BH),A
              LD      A,(03BH)
              CP      0
              RET
              JP      CHECK
;
ENDLOS:       CALL    MSGDEMO          ; Meldung endlos
LOOP99:       CALL    LEDLR            ; Taste E
              CALL    KEYS
              CP      ESC              ; ES Abbruch
              JR      Z,BRK 
              JP      LOOP99
BRK:          LD      A,0
              OUT     (PORTSC),A
              CALL    TIMER5
              LD      A,255
              OUT     (PORTSC),A
              CALL    TIMER5
              LD      A,0
              OUT     (PORTSC),A
              CALL    MSGCLS          ; Meldung loeschen
              RET

LEDLR:        CALL   LEDLL
              CALL   LEDRR
              LD     A,10000001b
              OUT    (PORTSC),A
              CALL   TIMER5
              LD     A,01000010b
              OUT    (PORTSC),A
              CALL   TIMER5
              LD     A,00100100b
              OUT    (PORTSC),A
              CALL   TIMER5
              LD     A,00011000b
              OUT    (PORTSC),A
              CALL   TIMER5
              LD     A,00000000b
              OUT    (PORTSC),A
              CALL   TIMER5
              LD     A,00011000b
              OUT    (PORTSC),A
              CALL   TIMER5
              LD     A,00100100b
              OUT    (PORTSC),A
              CALL   TIMER5
              LD     A,01000010b
              OUT    (PORTSC),A
              CALL   TIMER5
              LD     A,10000001b
              OUT    (PORTSC),A
              CALL   TIMER5
              LD     A,0
              OUT    (PORTSC),A
              CALL   TIMER5             
              RET                           ;JP     XX
;
TIMER5:       LD        E,02H               ;5 Sekunden 35H bei 10 MHZ
J60:          LD        B,0FFH
J61:          LD        D,0FFH
J62:          DEC       D
              JP        NZ,J62
              DEC       B
              JP        NZ,J61
              DEC       E
              JP        NZ,J60
              RET
;
              ; DELAY   nur Test
WAIT:         PUSH      AF
              LD        A,0F0H
P1:           LD        B,0H
P2:           DJNZ      P2
              DEC       A
              JP        NZ,P1
              POP       AF
              RET
;
BEEP:         LD      A,0FFH            ; kein Ton
              OUT     (PORTSC),A
              CALL    WAIT              ; delay Test
              LD      A,0H
              OUT     (PORTSC),A
              CALL    WAIT
              RET
;
BYE:          LD      A,0               ; Digital pin
              OUT     (PORTSC),A        ; schreibe port a=0
              CALL    TSCHUESS          ; have a nice day
              CALL    VERSION
;              JP      RAHMENC
              JP      WARM
;
CLS:          LD      E,0CH             ; ^L loesche Bildschirm
              LD      C,CONOUT
              CALL    BDOS
              RET
;
KEYS:         LD      E,0FFH            ; Direct input
              LD      C,DIRECT
              CALL    BDOS           
              AND     A                 ; A = char 
              RET
;
GOTOXY:
            LD      C,02H
            LD      E,1BH
            CALL    BDOS
            LD      C,02H
            LD      E,'['
            CALL    BDOS
;
            LD      A,(YPOS)
            CP      10H
            JP      C,L2
;
            RRA
            RRA
            RRA
            RRA
            AND     0FH
            ADD     A,'0'
;
            LD      C,02H
            LD      E,A
            CALL    BDOS
;
            LD      A,(YPOS)
;
L2:         AND     0FH
            ADD     A,'0'
;
            LD      C,02H
            LD      E,A
            CALL    BDOS
;
            LD      C,02H
            LD      E,3BH
            CALL    BDOS
;
            LD      A,(XPOS)
            CP      10H
            JP      C,L3

            RRA
            RRA
            RRA
            RRA
            AND     0FH
            ADD     A,'0'
;
            LD      C,02H
            LD      E,A
            CALL    BDOS
;
            LD      A,(XPOS)
;
L3:         AND     0FH
            ADD     A,'0'
;
            LD      C,02H
            LD      E,A
            CALL    BDOS
;
            LD      C,02H
            LD      E,'H'
            CALL    BDOS
;
            RET
;
;---------------------------------------------------------------
;
HELLO:        LD      C,STRING
              LD      DE,MSG1
              CALL    BDOS              ; erste Meldung 
              RET
;
MSG1:         ;DW      CRLF
              ;DW      CRLF
              ;DW      CRLF
              ;DW      CRLF
              DB      1BH, '[','5',';','1','H'
              DB      '                          P R O G R A M M  ** L E D'
              DW      CRLF
              DW      CRLF
              DB      '                             Minicom  115200 Baud   '
              DW      CRLF
              DB      '                        CPU (Z80) RS-232  115200,8,N,1'
              DW      CRLF
              DB      '                             SC129 - digital  I/O   '
              DW      CRLF
              DW      CRLF
              DB      '                                 Kurt Pieper        '
              DW      CRLF
              DB      '                             Version:  06.09.2020   '
              DW      CRLF
              DW      CRLF
              DW      CRLF
              DB      '                            Press <RETURN> Eingabe'
              DW      CRLF
              DB      '                              oder  <Esc> zu CPM  '
              DW      CRLF
              DB      '                                        '
              DB      '$'
;
DOIT:         LD      C,STRING  
              LD      DE,MSG2
              CALL    BDOS            
              RET
;
MSG2:         DW      CRLF
              DB      ' K u r z a n l e i t u n g !'
              DW      CRLF
              DW      CRLF
              DB      ' Eingabe 0-8, 0 loescht  L E D  SC129 PORT 0 aktiv'
              DW      CRLF
              DW      CRLF
              DB      '  - [+] Taste Keyblock vor Cursortasten druecken'
              DW      CRLF
              DB      '  - Keyblock Speicherplatz 03BH fuellen'
              DW      CRLF
              DW      CRLF
              DB      '  - Cursortasten links/rechts steuern LED Anzeige (an/aus) '
              DW      CRLF
              DB      '  - andere Tasten (m,C,D,E,L,R) oder loeschen Meldung.'
              DW      CRLF
              DW      CRLF
              DB      '  - [-] Taste KeyBlock oder m zurueck --> CP/M '
              DW      CRLF
              DB      '  - evtl. NUM Taste vorher druecken'
              DW      CRLF
              DW      CRLF
              DB      '$'
;
MSGLED:       LD      C,STRING
              LD      DE,MSG0
              CALL    BDOS
              LD      A,01H
              RET
;
MSG0:         DB      CR
              DB      1BH, '[','15',';','1','H'
              DB      ' Alle  L E D  aus '
              DB      '$'

MSGDEMO:      LD      C,STRING
              LD      DE,MSGEL
              CALL    BDOS
              RET            
;
MSGEL:        DB      CR
              DB      1BH, '[','15',';','1','H'
              DB      ' Endlos (ESC aus) '
              DB      '$'
;
MSGCLS:       LD      C,STRING
              LD      DE,MSG3              ; Meldung loeschen
              CALL    BDOS
              RET
;
MSG3:         DB      1BH, '[','15',';','1','H'
              DB      CR,'                   '
              DB      CR
              DB      '$'
;
TSCHUESS:     LD      C,STRING
              LD      DE,MSG4
              CALL    BDOS
              RET
;                          
MSG4:         DB      1BH, '[','15',';','1','H'         
              DB      '                   `//.   ',CR,LF
              DB      '                 _.~~~._  ',CR,LF
              DB      "                ( '0~0' ) ",CR,LF
              DB      "                {.  Y  .} ",CR,LF
              DB      "                 ( '~' )  ",CR,LF
              DB      "                  '-.-'   ",CR,LF
              DB      '                    have a nice day '
              DB      1BH, '[s'  ; save Cursor  
              DB      '$'
;
msg5:
              db     1bh, "[7m"," Version 1.0 (CPU Z80 20Mhz) v. 06.09.20 ", 1bh, "[0m"
              db     '$'
;
XPOS          DB     0
YPOS          DB     0
RAM:          DS     0
        END
^Z

