;======== BEGIN putc ======================= ;-- putc.asm ;-- Basic display service: ;-- putc: Puts char out to display. ;-- putc_init: Sets up putc's IVT slot ;------------------------------------- ;;;------------------------------------------------ ;;;-- putc_init ;;;-- Sets IVT slot at x0021 to putc_BEGIN. ;-------------------------------------------------- putc_init_BEGIN: ;--------------------------------- push__( r0 ) ;-- save reg push__( r1 ) ;-- save reg ld r0, PUTC_TVT_LOC ;-- r0 <== vector slot addr lea r1, putc_BEGIN ;-- r1 <== svc routine addr str r1, r0, 0 ;-- IVT[r0] <== routine addr pop__( r1 ) ;-- unsave reg pop__( r0 ) ;-- unsave reg putc_init_END: ret ;------------------------------- ;;;------------------------------------------------ ;;;-- putc - trap x21: ;;;-- (aka, "out") ;;;-- Display char on output device. ;;;-- argument: R0[low_byte] ==> display ;;;-- Sends one char from R0 to display via polling. ;;;-- (Interrupt vector not currently defined by LC3.) ;-------------------------------------------------- putc_BEGIN: ;-------------------------------------- push__( r0 ) ;-- save reg push__( r1 ) ;-- save reg push__( r2 ) ;-- save reg putc_POLL: ;-- do ldi r2, DSR ;-- status <== DSR brzp putc_POLL ;-- until( status == READY ) sti r0, DDR ;-- DDR <== char (print char) pop__( r2 ) ;-- unsave reg pop__( r1 ) ;-- unsave reg pop__( r0 ) ;-- unsave reg putc_END: ret ;------------------------------------ ;;;------------------------------------------------ ;;;-- putc Data area ;-------------------------------------------------- PUTC_TVT_LOC: .FILL x0021 ;-- putc trap's IVT slot. DSR: .FILL xFE04 ;-- display status register DDR: .FILL xFE06 ;-- display data register DSR_READY_MASK: .FILL x8000 ;-- DSR[15] == 1 (ready) ;============== END putc ======================