TITLE "screen.a -- display screen object" ; implementation of the display screen object USE "hawk.macs" USE "monitor.h" ; note, there is only one instance of this object, here it is COMMON SCREEN,SCREENSIZE PSCREEN: W SCREEN METHTAB = 0 ; pointer to method table WIDTH = 4 ; display screen width HEIGHT = 8 ; display screen height SCREENSIZE = 12 ; method table for screen objects ; the format of this table is documented in display.h INT SCRTAB SCRTAB: W PUTC W AT W SIZE SUBTITLE "SCRINIT -- initializer" ARSIZE = 4 INT SCRINIT SCRINIT: ; returns R3 = pointer to screen object STORES R1,R2 ; save return address ADDI R2,R2,ARSIZE LOAD R1,PDSPINI JSRS R1,R1 ; call dspini in monitor ADDI R2,R2,-ARSIZE LOAD R5,PSCREEN ; setup to initialize object STORE R3,R5,WIDTH ; screen.width = width from dspini STORE R4,R5,HEIGHT ; screen.height = height from dspini LEA R4,SCRTAB STORES R4,R5 ; screen.methtab = my descriptor MOVE R3,R5 ; put return value in place LOADS R1,R2 JUMPS R1 ; return SUBTITLE "PUTC -- put a character to the screen" ARSIZE = 4 PUTC: ; takes R3 = pointer to screen object ; R4 = character to put to screen STORES R1,R2 ; save return address MOVE R3,R4 ADDI R2,R2,ARSIZE LOAD R1,PDSPCH JSRS R1,R1 ; use monitor to display the character ADDI R2,R2,-ARSIZE LOADS R1,R2 JUMPS R1 ; return SUBTITLE "AT -- set the screen location" ARSIZE = 4 AT: ; takes R3 = pointer to screen object ; R4 = X location ; R5 = Y location STORES R1,R2 ; save return address MOVE R3,R4 MOVE R4,R5 ADDI R2,R2,ARSIZE LOAD R1,PDSPAT JSRS R1,R1 ; use monitor to display the character ADDI R2,R2,-ARSIZE LOADS R1,R2 JUMPS R1 ; return SUBTITLE "SIZE -- get the screen dimensions" SIZE: ; takes R3 = pointer to screen object ; returns R3 = screen width ; R4 = screen height LOAD R4,R3,HEIGHT LOAD R3,R3,WIDTH JUMPS R1 ; return END