; 🐟 для Вектора-06ц
    .project helv06c.rom
    .tape v06c-rom

rastint equ 38h ; прервывание обратного хода луча

    .org 100h
    ; стандартная точка входа .rom файла 
    di              ; запретить прерывания
    xra a               
    out 10h         ; выключить квазидиск 
    lxi sp, $100    ; инициализировать указатель стека

    mvi a, 0c9h     ; код инструкции RET
    sta rastint     ; инициализировать обработчик RST7

    call clrscr     ; очистить экран
    call set_palette; установить палитру

    ; задать позицию вывода текста
    ; столбец 0, строка $f8 (верх экрана)
    lxi h, $00f8    
    call gotoxy

    ; вывести строку
    lxi h, msg
    call puts

    ; элегантно зависнуть
    di
    hlt

msg:
    db 'HELLO, WORLD!',0

    ;
    ; Микро-библиотека для Вектора-06ц
    ;

    ; Область временного хранения SP
__savedsp dw 0

    ; Очистка всей экранной области
clrscr
    di
    lxi h,0
    dad sp
    shld __savedsp

    lxi sp, 0
    lxi b, 0
    lxi d, $1000
_clrscr_1:
    push b
    push b
    push b
    push b
    dcx d
    mov a, d
    ora e
    jnz _clrscr_1

    lhld __savedsp
    sphl
    ret

    ; Программирование палитры
set_palette
    ei
    hlt

    mvi a, 88h      ; настроить ППИ
    out 0

    mvi a, 255      ; сбросить прокрутку
    out 03

    mvi c, $f       ; программирование палитры
    mvi b, $00
_set_palette_1:
    mov a,c
    out 2
    mov a, b
    out $c
    out $c
    out $c
    out $c
    cma
    mov b, a
    dcr c
    jp _set_palette_1
    ret

    ; установить позицию для вывода следующего символа
    ; H = столбец, L = строка ($F8 = верхняя)
gotoxy
    shld _puts_de
    ret

    ; Вывести 0-терминированую строку в HL на экран
puts
    shld _puts_sptr
_puts_1:
    call _putchar
    jnz _puts_1
    ret

_puts_sptr:dw 0
_puts_de: dw 0

    ; Нарисовать один символ
_putchar:
    lhld _puts_sptr
    mov a, m
    ora a
    rz
    mov c, a
    inx h
    shld _puts_sptr
    xchg
    lhld _puts_de
    inr h
    shld _puts_de
    xchg

    lxi h,0
    dad sp
    shld __savedsp

    ; Найти адрес спрайта символа
    ; bc = (c-32)*8
    mov a,c
    sui 32
    mov c, a
    rlc
    rlc
    rlc
    ani 7
    mov b,a
    mov a,c
    rlc
    rlc
    rlc
    ani $f8
    mov c,a
    lxi h, _font_table
    dad b
    sphl        ; sp -> char

    lxi h, $e000
    dad d        ; hl -> destination

    ; Выдавить биты на экран
    pop b\ mov m, c\ dcr l\ mov m, b\ dcr l
    pop b\ mov m, c\ dcr l\ mov m, b\ dcr l
    pop b\ mov m, c\ dcr l\ mov m, b\ dcr l
    pop b\ mov m, c\ dcr l\ mov m, b\ dcr l

    lhld __savedsp
    sphl
    mvi a, 1
    ret    

_font_table:
    ; Font: 8X8!FONT.pf
    db    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00    
    db    0x30, 0x78, 0x78, 0x30, 0x30, 0x00, 0x30, 0x00    
    db    0x6C, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00    
    db    0x6C, 0x6C, 0xFE, 0x6C, 0xFE, 0x6C, 0x6C, 0x00    
    db    0x30, 0x7C, 0xC0, 0x78, 0x0C, 0xF8, 0x30, 0x00    
    db    0x00, 0xC6, 0xCC, 0x18, 0x30, 0x66, 0xC6, 0x00    
    db    0x38, 0x6C, 0x38, 0x76, 0xDC, 0xCC, 0x76, 0x00    
    db    0x60, 0x60, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00    
    db    0x18, 0x30, 0x60, 0x60, 0x60, 0x30, 0x18, 0x00    
    db    0x60, 0x30, 0x18, 0x18, 0x18, 0x30, 0x60, 0x00    
    db    0x00, 0x66, 0x3C, 0xFF, 0x3C, 0x66, 0x00, 0x00    
    db    0x00, 0x30, 0x30, 0xFC, 0x30, 0x30, 0x00, 0x00    
    db    0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x60    
    db    0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00    
    db    0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00    
    db    0x06, 0x0C, 0x18, 0x30, 0x60, 0xC0, 0x80, 0x00    
    db    0x7C, 0xC6, 0xCE, 0xDE, 0xF6, 0xE6, 0x7C, 0x00    
    db    0x30, 0x70, 0x30, 0x30, 0x30, 0x30, 0x30, 0x00    
    db    0x78, 0xCC, 0x0C, 0x38, 0x60, 0xC0, 0xFC, 0x00    
    db    0x78, 0xCC, 0x0C, 0x38, 0x0C, 0xCC, 0x78, 0x00    
    db    0x1C, 0x3C, 0x6C, 0xCC, 0xFE, 0x0C, 0x0C, 0x00    
    db    0xFC, 0xC0, 0xF8, 0x0C, 0x0C, 0xCC, 0x78, 0x00    
    db    0x38, 0x60, 0xC0, 0xF8, 0xCC, 0xCC, 0x78, 0x00    
    db    0xFC, 0x0C, 0x0C, 0x18, 0x30, 0x30, 0x30, 0x00    
    db    0x78, 0xCC, 0xCC, 0x78, 0xCC, 0xCC, 0x78, 0x00    
    db    0x78, 0xCC, 0xCC, 0x7C, 0x0C, 0x18, 0x70, 0x00    
    db    0x00, 0x30, 0x30, 0x00, 0x00, 0x30, 0x30, 0x00    
    db    0x00, 0x30, 0x30, 0x00, 0x00, 0x30, 0x30, 0x60    
    db    0x18, 0x30, 0x60, 0xC0, 0x60, 0x30, 0x18, 0x00    
    db    0x00, 0x00, 0xFC, 0x00, 0x00, 0xFC, 0x00, 0x00    
    db    0x60, 0x30, 0x18, 0x0C, 0x18, 0x30, 0x60, 0x00    
    db    0x78, 0xCC, 0x0C, 0x18, 0x30, 0x00, 0x30, 0x00    
    db    0x7C, 0xC6, 0xDE, 0xDE, 0xDE, 0xC0, 0x78, 0x00    
    db    0x18, 0x3C, 0x66, 0x66, 0x7E, 0x66, 0x66, 0x00    
    db    0x7C, 0x66, 0x66, 0x7C, 0x66, 0x66, 0x7C, 0x00    
    db    0x3C, 0x66, 0xC0, 0xC0, 0xC0, 0x66, 0x3C, 0x00     
    db    0x78, 0x6C, 0x66, 0x66, 0x66, 0x6C, 0x78, 0x00    
    db    0x7E, 0x60, 0x60, 0x78, 0x60, 0x60, 0x7E, 0x00    
    db    0x7E, 0x60, 0x60, 0x78, 0x60, 0x60, 0x60, 0x00    
    db    0x3C, 0x66, 0xC0, 0xC0, 0xCE, 0x66, 0x3E, 0x00    
    db    0x66, 0x66, 0x66, 0x7E, 0x66, 0x66, 0x66, 0x00    
    db    0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00    
    db    0x06, 0x06, 0x06, 0x06, 0x66, 0x66, 0x3C, 0x00    
    db    0x66, 0x66, 0x6C, 0x78, 0x6C, 0x66, 0x66, 0x00    
    db    0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x7E, 0x00    
    db    0xC6, 0xEE, 0xFE, 0xFE, 0xD6, 0xC6, 0xC6, 0x00    
    db    0xC6, 0xE6, 0xF6, 0xDE, 0xCE, 0xC6, 0xC6, 0x00    
    db    0x3C, 0x66, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x00    
    db    0x7C, 0x66, 0x66, 0x7C, 0x60, 0x60, 0x60, 0x00    
    db    0x3C, 0x66, 0x66, 0x66, 0x6E, 0x3C, 0x0E, 0x00    
    db    0x7C, 0x66, 0x66, 0x7C, 0x6C, 0x66, 0x66, 0x00    
    db    0x3C, 0x66, 0x70, 0x38, 0x0E, 0x66, 0x3C, 0x00    
    db    0x7E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00    
    db    0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x3E, 0x00    
    db    0x66, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x18, 0x00    
    db    0xC6, 0xC6, 0xC6, 0xD6, 0xFE, 0xEE, 0xC6, 0x00    
    db    0x66, 0x66, 0x3C, 0x18, 0x3C, 0x66, 0x66, 0x00    
    db    0x66, 0x66, 0x66, 0x3C, 0x18, 0x18, 0x18, 0x00    
    db    0xFE, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xFE, 0x00    
    db    0x78, 0x60, 0x60, 0x60, 0x60, 0x60, 0x78, 0x00    
    db    0xC0, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x02, 0x00    
    db    0x78, 0x18, 0x18, 0x18, 0x18, 0x18, 0x78, 0x00    
    db    0x07, 0x0E, 0x39, 0x63, 0x83, 0x31, 0x1C, 0x07   
    db    0xC0, 0xE0, 0x38, 0x8C, 0x82, 0x18, 0x70, 0xC0  

    end