Z80Ardu – PC16550 Ausgabe
Hier die Routine mit der ich die ersten Daten über die serielle Schnittstelle des Z80Ardu ausgegeben habe:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 |
;*********************************** ;* UART Test Program * ;* * ;*********************************** ORG 0000H ;****************************************************************** ;INIT_UART ;Function: Initialize the UART to BAUD Rate 9600 (1.8432 MHz clock input) ;DLAB A2 A1 A0 Register ;Dez 4 2 1 ;0 0 0 0 Receiver Buffer (read), = 0 = $00 ; Transmitter Holding ; Register (write) ;0 0 0 1 Interrupt Enable = 8 = $08 ;X 0 1 0 Interrupt Identification (read) = 16 = $10 ;X 0 1 0 FIFO Control (write) = 16 = $10 ;X 0 1 1 Line Control = 24 = $18 ;X 1 0 0 MODEM Control = 32 = $20 ;X 1 0 1 Line Status = 40 = $28 ;X 1 1 0 MODEM Status = 48 = $30 ;X 1 1 1 Scratch = 56 = $38 ;1 0 0 0 Divisor Latch = 0 = $00 ; (least significant byte) ;1 0 0 1 Divisor Latch = 8 = $08 ; (most significant byte) ;****************************************************************** ; --< Globale Variable >------------------------------------------- stack: equ 0CFFFH LCR: equ 003H + 20H ; Line Control Register LSR: equ 005H + 20H ; Line Status Register DLL: equ 000H + 20H ; Divisor Latch LSB DLM: equ 001H + 20H ; Divisor Latch MSB RBR: equ 001H + 20H ; Receive Buffer Register THR: equ 000H + 20H ; Transmitter Holding Register FCR: equ 002H + 20H ; FiFo Control Register _8N1: equ 00000011B ; 8 Datenbits, ein Stopbit, keine Parität ;****************************************************************** ;Main Program ;Function: Display A->Z then a new line and loop ;****************************************************************** ld sp,stack ; Stackpointer setzen ld b, 0FFH ; wait1: nop nop nop nop nop nop nop nop nop nop djnz wait1 _again: call _inituart ; Serielle Schnittstelle initialisieren ld hl,_init ; Text adressieren _mainloop: nop nop nop in A,(LSR) ; Line-Status-Register lesen bit 5,A ; Teste BIT 5. Es ist gesetzt, wenn UART bereit. jr Z,_mainloop ; ld a, (hl) ; Nächsten Buchstaben im Text cp 0 jr z,ende ; Dann von Vorne out (THR),a ; Buchstabe ausgeben inc hl ; nächster Buchstabe jr _mainloop ende: halt ; --< UART initialisieren >--------------------------------------------------------- _inituart: ld a,01H ; FIFO anschalten out (FCR),a ld A,80H ; DLAB-Flag maskieren -- Divisor Latch out (LCR),A ld A,1EH ; 38400 bps und 18,432 Mhz Takt out (DLL),A ; Setze BAUD Rate auf 38400 ld A,00H out (DLM),A ; Setze BAUD Rate auf 38400 ld A,_8N1 ; out (LCR),A ; 8 Datenbits, 1 Stopbit, DLAB Flag zurücksetzen or a out (LCR),a ; Und normale Funktion ret ; --< Texte >--------------------------------------------------------- _init: defm 1bh,"[0;34mZ80Ardu Homebrew Computer^[[0m",0dH,0ah defm "64K Byte RAM. ",0dh,0ah defm 0dh,0ah defm "Powered by Atmega 328 & Z80",0dh,0ah defm 0dh,0ah defm "© 2018 by Unilein@dev-tronic.de",0dh,0ah |