mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			244 lines
		
	
	
		
			8.6 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			244 lines
		
	
	
		
			8.6 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| ''***************************************
 | |
| ''*  TV Terminal v1.1                   *
 | |
| ''*  Author: Chip Gracey                *
 | |
| ''*  Copyright (c) 2005 Parallax, Inc.  *
 | |
| ''*  See end of file for terms of use.  *
 | |
| ''***************************************
 | |
| 
 | |
| {-----------------REVISION HISTORY-----------------
 | |
|  v1.1 - Updated 5/15/2006 to use actual pin number, instead of pin group, for Start method's basepin parameter.}
 | |
|  
 | |
| CON
 | |
| 
 | |
|   x_tiles = 16
 | |
|   y_tiles = 13
 | |
| 
 | |
|   x_screen = x_tiles << 4
 | |
|   y_screen = y_tiles << 4
 | |
| 
 | |
|   width = 0             '0 = minimum
 | |
|   x_scale = 1           '1 = minimum
 | |
|   y_scale = 1           '1 = minimum
 | |
|   x_spacing = 6         '6 = normal
 | |
|   y_spacing = 13        '13 = normal
 | |
| 
 | |
|   x_chr = x_scale * x_spacing
 | |
|   y_chr = y_scale * y_spacing
 | |
| 
 | |
|   y_offset = y_spacing / 6 + y_chr - 1
 | |
| 
 | |
|   x_limit = x_screen / (x_scale * x_spacing)
 | |
|   y_limit = y_screen / (y_scale * y_spacing)
 | |
|   y_max = y_limit - 1
 | |
| 
 | |
|   y_screen_bytes = y_screen << 2
 | |
|   y_scroll = y_chr << 2
 | |
|   y_scroll_longs = y_chr * y_max
 | |
|   y_clear = y_scroll_longs << 2
 | |
|   y_clear_longs = y_screen - y_scroll_longs
 | |
| 
 | |
|   paramcount = 14       
 | |
| 
 | |
|   
 | |
| VAR
 | |
| 
 | |
|   long  x, y, bitmap_base
 | |
| 
 | |
|   long  tv_status     '0/1/2 = off/visible/invisible           read-only
 | |
|   long  tv_enable     '0/? = off/on                            write-only
 | |
|   long  tv_pins       '%ppmmm = pins                           write-only
 | |
|   long  tv_mode       '%ccinp = chroma,interlace,ntsc/pal,swap write-only
 | |
|   long  tv_screen     'pointer to screen (words)               write-only
 | |
|   long  tv_colors     'pointer to colors (longs)               write-only               
 | |
|   long  tv_hc         'horizontal cells                        write-only
 | |
|   long  tv_vc         'vertical cells                          write-only
 | |
|   long  tv_hx         'horizontal cell expansion               write-only
 | |
|   long  tv_vx         'vertical cell expansion                 write-only
 | |
|   long  tv_ho         'horizontal offset                       write-only
 | |
|   long  tv_vo         'vertical offset                         write-only
 | |
|   long  tv_broadcast  'broadcast frequency (Hz)                write-only
 | |
|   long  tv_auralcog   'aural fm cog                            write-only
 | |
| 
 | |
|   long  bitmap[x_tiles * y_tiles << 4 + 16]     'add 16 longs to allow for 64-byte alignment
 | |
|   word  screen[x_tiles * y_tiles]
 | |
|   
 | |
| 
 | |
| OBJ
 | |
| 
 | |
|   tv    : "tv"
 | |
|   gr    : "graphics"
 | |
| 
 | |
| 
 | |
| PUB start(basepin)
 | |
| 
 | |
| '' Start terminal
 | |
| ''
 | |
| ''  basepin = first of three pins on a 4-pin boundary (0, 4, 8...) to have
 | |
| ''  1.1k, 560, and 270 ohm resistors connected and summed to form the 1V,
 | |
| ''  75 ohm DAC for baseband video   
 | |
| 
 | |
|   'init bitmap and tile screen
 | |
|   bitmap_base := (@bitmap + $3F) & $7FC0
 | |
|   repeat x from 0 to x_tiles - 1
 | |
|     repeat y from 0 to y_tiles - 1
 | |
|       screen[y * x_tiles + x] := bitmap_base >> 6 + y + x * y_tiles
 | |
| 
 | |
|   'start tv
 | |
|   tvparams_pins := (basepin & $38) << 1 | (basepin & 4 == 4) & %0101
 | |
|   longmove(@tv_status, @tvparams, paramcount)
 | |
|   tv_screen := @screen
 | |
|   tv_colors := @color_schemes
 | |
|   tv.start(@tv_status)
 | |
| 
 | |
|   'start graphics
 | |
|   gr.start
 | |
|   gr.setup(x_tiles, y_tiles, 0, y_screen, bitmap_base)
 | |
|   gr.textmode(x_scale, y_scale, x_spacing, 0)
 | |
|   gr.width(width)
 | |
|   out(0)
 | |
| 
 | |
| 
 | |
| PUB stop
 | |
| 
 | |
| '' Stop terminal
 | |
| 
 | |
|   tv.stop
 | |
|   gr.stop
 | |
| 
 | |
| 
 | |
| PUB out(c)
 | |
| 
 | |
| '' Print a character
 | |
| ''
 | |
| ''       $00 = home
 | |
| ''  $01..$03 = color
 | |
| ''  $04..$07 = color schemes
 | |
| ''       $09 = tab
 | |
| ''       $0D = return
 | |
| ''  $20..$7E = character
 | |
| 
 | |
|   case c
 | |
| 
 | |
|     $00:                'home?
 | |
|       gr.clear
 | |
|       x := y := 0
 | |
| 
 | |
|     $01..$03:           'color?
 | |
|       gr.color(c)
 | |
| 
 | |
|     $04..$07:           'color scheme?
 | |
|       tv_colors := @color_schemes[c & 3]
 | |
| 
 | |
|     $09:                'tab?
 | |
|       repeat
 | |
|         out($20)
 | |
|       while x & 7
 | |
| 
 | |
|     $0D:                'return?
 | |
|       newline
 | |
| 
 | |
|     $20..$7E:           'character?
 | |
|       gr.text(x * x_chr, -y * y_chr - y_offset, @c)
 | |
|       gr.finish
 | |
|       if ++x == x_limit
 | |
|         newline
 | |
| 
 | |
| 
 | |
| PUB str(string_ptr)
 | |
| 
 | |
| '' Print a zero-terminated string
 | |
| 
 | |
|   repeat strsize(string_ptr)
 | |
|     out(byte[string_ptr++])
 | |
| 
 | |
| 
 | |
| PUB dec(value) | i
 | |
| 
 | |
| '' Print a decimal number
 | |
| 
 | |
|   if value < 0
 | |
|     -value
 | |
|     out("-")
 | |
| 
 | |
|   i := 1_000_000_000
 | |
| 
 | |
|   repeat 10
 | |
|     if value => i
 | |
|       out(value / i + "0")
 | |
|       value //= i
 | |
|       result~~
 | |
|     elseif result or i == 1
 | |
|       out("0")
 | |
|     i /= 10
 | |
| 
 | |
| 
 | |
| PUB hex(value, digits)
 | |
| 
 | |
| '' Print a hexadecimal number
 | |
| 
 | |
|   value <<= (8 - digits) << 2
 | |
|   repeat digits
 | |
|     out(lookupz((value <-= 4) & $F : "0".."9", "A".."F"))
 | |
| 
 | |
| 
 | |
| PUB bin(value, digits)
 | |
| 
 | |
| '' Print a binary number
 | |
| 
 | |
|   value <<= 32 - digits
 | |
|   repeat digits
 | |
|     out((value <-= 1) & 1 + "0")
 | |
| 
 | |
| 
 | |
| PRI newline
 | |
| 
 | |
|   if ++y == y_limit
 | |
|     gr.finish
 | |
|     repeat x from 0 to x_tiles - 1
 | |
|       y := bitmap_base + x * y_screen_bytes
 | |
|       longmove(y, y + y_scroll, y_scroll_longs)
 | |
|       longfill(y + y_clear, 0, y_clear_longs)
 | |
|     y := y_max
 | |
|   x := 0
 | |
| 
 | |
| 
 | |
| DAT
 | |
| 
 | |
| tvparams                long    0               'status
 | |
|                         long    1               'enable
 | |
| tvparams_pins           long    %001_0101       'pins
 | |
|                         long    %0000           'mode
 | |
|                         long    0               'screen
 | |
|                         long    0               'colors
 | |
|                         long    x_tiles         'hc
 | |
|                         long    y_tiles         'vc
 | |
|                         long    10              'hx
 | |
|                         long    1               'vx
 | |
|                         long    0               'ho
 | |
|                         long    0               'vo
 | |
|                         long    55_250_000      'broadcast
 | |
|                         long    0               'auralcog
 | |
| 
 | |
| color_schemes           long    $BC_6C_05_02
 | |
|                         long    $0E_0D_0C_0A
 | |
|                         long    $6E_6D_6C_6A
 | |
|                         long    $BE_BD_BC_BA
 | |
| 
 | |
| {{
 | |
| 
 | |
| ┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
 | |
| │                                                   TERMS OF USE: MIT License                                                  │                                                            
 | |
| ├──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
 | |
| │Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation    │ 
 | |
| │files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy,    │
 | |
| │modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software│
 | |
| │is furnished to do so, subject to the following conditions:                                                                   │
 | |
| │                                                                                                                              │
 | |
| │The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.│
 | |
| │                                                                                                                              │
 | |
| │THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE          │
 | |
| │WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR         │
 | |
| │COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,   │
 | |
| │ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                         │
 | |
| └──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
 | |
| }}                    |