org 100h siob_data equ 083h siob_ctrl equ 082h lcd_data equ 0dbh lcd_ctrl equ 0dah celcius_offset equ 08ah pressure_offset equ 0cah humid_offset equ 09eh bdos equ 0005h conout equ 02h conin equ 01h start: call init_lcd call init_siob call lcd_delay ld a,celcius_offset ; write celcius label out (lcd_ctrl),a call lcd_delay ld hl,clabel call print_str_to_lcd ld a,pressure_offset ; write pressure label out (lcd_ctrl),a call lcd_delay ld hl,plabel call print_str_to_lcd ld a,humid_offset ; write humidity label out (lcd_ctrl),a call lcd_delay ld hl,hlabel call print_str_to_lcd main: call read_char_b call print_char_to_lcd ld c,11 call bdos or a jr z,main ret init_siob: ld a,018h ; channel reset out (siob_ctrl),a ld a,04h out (siob_ctrl),a ; wr4 baud settings ld a,0c4h out (siob_ctrl),a ld a,03h out (siob_ctrl),a ; rx enable ld a,0c1h out (siob_ctrl),a ld a,05h out (siob_ctrl),a ; tx settings ld a,0eah out (siob_ctrl),a ret init_lcd: ld a,38h out (lcd_ctrl),a ; function 8 bit, 2 lines, 5x8 dot font call lcd_delay ld a,0ch out (lcd_ctrl),a ; display on, cursor off, no blink call lcd_delay ld a,01h out (lcd_ctrl),a ; clear display ret lcd_delay: ld bc,500 delay1: dec bc ld a,b or c jr nz,delay1 ret read_char_b: wait: in a,(siob_ctrl) bit 0,a jr z,wait in a,(siob_data) ret print_char_to_lcd: cp a,0dh ; carriage return jr z,lcd_done cp a,0ah ; new line jr z,lcd_done cp a,054h ; T character call z,move_to_tempaddr cp a,050h ; P character call z,move_to_presaddr cp a,048h ; H character call z,move_to_humidaddr out (lcd_data),a lcd_done: ret print_str_to_lcd: ; place memory address in hl first ld a,(hl) or a jr z,print_done out (lcd_data),a call lcd_delay inc hl jr print_str_to_lcd print_done: ret move_to_tempaddr: ld c,a ld a,85h out (lcd_ctrl),a ld a,c ret move_to_presaddr: ld a,0c1h out (lcd_ctrl),a ret move_to_humidaddr: ld a,99h out (lcd_ctrl),a ret print_char: ld e,a ld c,conout call bdos ret clabel: DB 'degree C',0 plabel: DB 'pascal',0 hlabel: DB '% RH',0 end start