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.                         │
 | 
						|
└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
 | 
						|
}}                    |