mirror of
https://github.com/romychs/OK240.2-Firmware.git
synced 2026-04-21 10:53:18 +03:00
4789 lines
89 KiB
NASM
4789 lines
89 KiB
NASM
; ======================================================
|
|
; Ocean-240.2
|
|
; Turbo monitor
|
|
;
|
|
; Disassembled by Romych 2025-09-09
|
|
; ======================================================
|
|
|
|
DEVICE NOSLOT64K
|
|
|
|
INCLUDE "io.inc"
|
|
INCLUDE "equates.inc"
|
|
INCLUDE "ram.inc"
|
|
INCLUDE "bios_entries.inc"
|
|
|
|
OUTPUT tmon_E000.bin
|
|
|
|
|
|
MODULE TURBO_MONITOR
|
|
|
|
ORG 0xe000
|
|
|
|
; ------------------------------------------------------
|
|
; Monitor Entry points
|
|
; ------------------------------------------------------
|
|
|
|
start: JP m_init ; E000
|
|
mon_cold_start: JP m_cold_start ; E003
|
|
non_con_status: JP m_con_status ; E009
|
|
mon_con_in: JP tm_con_in ; E00C
|
|
mon_con_out: JP m_con_out ; E00F
|
|
mon_serial_in: JP m_serial_in ; E012
|
|
mon_serial_out: JP m_serial_out ; E015
|
|
mon_char_print: JP tm_char_print ; E018
|
|
mon_tape_read: JP m_tape_read ; E01B
|
|
mon_tape_write: JP m_tape_write ; E01E
|
|
ram_disk_read: JP m_ramdisk_read ; E021
|
|
ram_disk_write: JP m_ramdisk_write ; E024
|
|
mon_free_fn1: JP m_cold_start ; E027
|
|
mon_free_fn2: JP m_cold_start ; E02A
|
|
mon_tape_wait: JP m_tape_wait ; E02D
|
|
mon_tape_detect: JP m_tape_blk_detect ; E030
|
|
read_floppy: JP m_read_floppy ; E033
|
|
write_floppy: JP m_write_floppy ; E036
|
|
|
|
|
|
; ------------------------------------------------------
|
|
; Init system devices
|
|
; ------------------------------------------------------
|
|
m_init:
|
|
DI
|
|
LD SP, TM_VARS.rst_ret_JP
|
|
LD A, 10000000b ; DD17 all ports to out
|
|
OUT (SYS_DD17CTR), A ; VV55 Sys CTR
|
|
OUT (DD67CTR), A ; VV55 Video CTR
|
|
|
|
CALL m_init_kbd_tape
|
|
LD A, 01111111b ; VSU=0, C/M=1, FL=111, COL=111
|
|
OUT (VID_DD67PB), A ; color mode
|
|
LD A, 00000001b
|
|
OUT (SYS_DD17PB), A ; Access to VRAM
|
|
LD B, 0x0
|
|
LD HL, 0x3f00
|
|
LD A, H
|
|
ADD A, 65 ; A=128 0x80
|
|
|
|
; Clear memory from 0x3F00 to 0x7FFF
|
|
i_fill_video:
|
|
LD (HL), B
|
|
INC HL
|
|
CP H
|
|
JP NZ, i_fill_video
|
|
XOR A
|
|
OUT (SYS_DD17PB), A ; Disable VRAM
|
|
LD A, 00000111b
|
|
OUT (SYS_DD17PC), A ; pix shift to 7
|
|
LD (TM_VARS.m_pix_shift), A
|
|
XOR A
|
|
LD (TM_VARS.m_screen_mode), A
|
|
LD (TM_VARS.m_row_shift), A
|
|
|
|
; Set color mode and palette
|
|
LD (TM_VARS.m_curr_color+1), A
|
|
CPL
|
|
LD (TM_VARS.m_curr_color), A
|
|
LD A, 00000011b
|
|
LD (TM_VARS.m_cur_palette), A
|
|
; VSU=0, C/M=1, FL=000, COL=011
|
|
; color mode, black border
|
|
; 00-black, 01-red, 10-purple, 11-white
|
|
LD A, 01000011b
|
|
OUT (VID_DD67PB), A
|
|
|
|
; config LPT
|
|
LD A, 0x4
|
|
OUT (DD67PC), A ; bell=1, strobe=0
|
|
LD (TM_VARS.m_strobe_state), A ; store strobe
|
|
LD HL,1024 ; 683us
|
|
LD (TM_VARS.m_beep_period), HL
|
|
LD HL, 320 ; 213us
|
|
LD (TM_VARS.m_beep_duration), HL
|
|
|
|
; Config UART
|
|
LD A, 11001110b
|
|
OUT (UART_DD72RR), A
|
|
LD A, 00100101b
|
|
OUT (UART_DD72RR), A
|
|
|
|
; Config Timer#1 for UART clock
|
|
LD A, 01110110b ; tmr#1, load l+m bin, sq wave
|
|
OUT (TMR_DD70CTR), A
|
|
|
|
; 1.5M/10 = 150kHz
|
|
LD A, 10
|
|
OUT (TMR_DD70C2), A
|
|
XOR A
|
|
OUT (TMR_DD70C2), A
|
|
|
|
; Config PIC
|
|
LD A,00010010b ; ICW1 edge trigger, interval 8, sin...
|
|
OUT (PIC_DD75RS), A
|
|
XOR A
|
|
OUT (PIC_DD75RM), A ; ICW2
|
|
CPL
|
|
OUT (PIC_DD75RM), A ; ICW3 no slave
|
|
LD A,00100000b
|
|
OUT (PIC_DD75RS), A ; Non-specific EOI command, End of I...
|
|
LD A, PIC_POLL_MODE
|
|
OUT (PIC_DD75RS), A ; Poll mode, poll on next RD
|
|
|
|
; Init cursor
|
|
CALL m_draw_cursor
|
|
LD HL, TM_VARS.tm_stsp
|
|
LD (TM_VARS.tm_stack_0), HL ; tm_stack_0 - directly not used elsewhere
|
|
LD A, JP_OPCODE
|
|
LD (RST1), A
|
|
LD HL, m_rst1_handler
|
|
LD (RST1_handler_addr), HL
|
|
|
|
; Beep
|
|
LD C, ASCII_BELL
|
|
CALL m_con_out
|
|
; check bios exists
|
|
LD A, (BIOS.boot_f)
|
|
CP JP_OPCODE
|
|
JP Z, BIOS.boot_f
|
|
LD HL, msg_hw_mon
|
|
CALL m_out_strz
|
|
JP m_cold_start
|
|
|
|
m_out_strz:
|
|
LD C, (HL)
|
|
LD A, C
|
|
OR A
|
|
RET Z
|
|
CALL m_con_out
|
|
INC HL
|
|
JP m_out_strz
|
|
|
|
msg_hw_mon:
|
|
DB "\r\nHARDWARE MONITOR+ V1\r\n", 0
|
|
DS 3, 0xFF
|
|
|
|
m_init_kbd_tape:
|
|
LD A, 10010011b
|
|
; Configure KBD/TAPE VV55
|
|
; A - In, B-Out, Ch-Out, Cl-In
|
|
OUT (KBD_DD78CTR), A
|
|
LD A, PORT_C4
|
|
OUT (KBD_DD78PC), A
|
|
XOR A
|
|
OUT (KBD_DD78PC), A
|
|
XOR A
|
|
LD (TM_VARS.m_last_key), A
|
|
RET
|
|
|
|
; ------------------------------------------------------
|
|
; Console status
|
|
; Out: A = 0 - not ready
|
|
; A = 0xFF - ready (key pressed)
|
|
; ------------------------------------------------------
|
|
m_con_status:
|
|
LD A, (TM_VARS.m_last_key)
|
|
OR A
|
|
JP Z, mc_check_irq
|
|
LD A, 0xff ; ready
|
|
RET
|
|
|
|
; ckeck keyboard IRQ
|
|
mc_check_irq:
|
|
IN A, (PIC_DD75RS)
|
|
AND KBD_IRQ
|
|
RET Z ; no int from keyboard
|
|
|
|
; read keyboard data
|
|
IN A, (KBD_DD78PA)
|
|
OR A
|
|
JP NZ, mc_has_key
|
|
LD A, KBD_ACK ; ACK=1
|
|
OUT (KBD_DD78PC), A
|
|
XOR A
|
|
OUT (KBD_DD78PC), A ; ACK=0
|
|
XOR A
|
|
RET
|
|
|
|
mc_has_key:
|
|
PUSH BC
|
|
LD B, A ; store row in B
|
|
IN A, (KBD_DD78PC)
|
|
AND 00001111b ; column code
|
|
LD C, A
|
|
IN A, (KBD_DD78PB) ; [JST3..1, ACK,TAPE5,TAPE4,GK,GC]
|
|
RRA
|
|
AND 00110000b ; SHIFT+CTRL
|
|
OR C
|
|
LD C, A ; C=SHIFT+CTRL+IE10
|
|
LD A,KBD_ACK ; ACK=1
|
|
OUT (KBD_DD78PC), A
|
|
XOR A ; ACK=0
|
|
OUT (KBD_DD78PC), A
|
|
LD A,B ; A = key
|
|
LD B, 0xff
|
|
|
|
; decode key
|
|
mc_calc_column:
|
|
INC B
|
|
RRA ; >> [CF] -> 7
|
|
JP NC,mc_calc_column
|
|
LD A, C
|
|
RLA ; 0 <- [CF] <<
|
|
RLA
|
|
RLA
|
|
|
|
; IE10 shifted + B
|
|
AND 01111000b
|
|
OR B
|
|
INC A
|
|
CP KEY_ALF
|
|
JP NZ, mc_not_alf
|
|
LD A, 0x0
|
|
LD (TM_VARS.mc_stored_key), A
|
|
JP mc_fin
|
|
|
|
mc_not_alf:
|
|
CP 0xc
|
|
JP NZ,mc_chk_fix
|
|
LD A, 0xff
|
|
LD (TM_VARS.mc_stored_key), A
|
|
JP mc_fin
|
|
|
|
mc_chk_fix:
|
|
CP KEY_FIX
|
|
JP NZ,mc_plain_key
|
|
; invert fix state
|
|
LD A, (TM_VARS.mc_fix_state)
|
|
CPL
|
|
LD (TM_VARS.mc_fix_state), A
|
|
JP mc_fin
|
|
mc_plain_key:
|
|
LD (TM_VARS.m_last_key), A
|
|
LD A, C
|
|
AND 0x30
|
|
LD (TM_VARS.m_last_shifts), A
|
|
POP BC
|
|
LD A, 0xff
|
|
RET
|
|
mc_fin:
|
|
POP BC
|
|
XOR A
|
|
RET
|
|
|
|
; ------------------------------------------------------
|
|
; Read key
|
|
; Inp: A
|
|
; ------------------------------------------------------
|
|
tm_con_in:
|
|
CALL m_con_status
|
|
OR A
|
|
JP Z, tm_con_in
|
|
LD A, (TM_VARS.m_last_key)
|
|
PUSH HL
|
|
PUSH BC
|
|
LD B, A
|
|
LD A, (TM_VARS.m_last_shifts)
|
|
LD C, A
|
|
LD HL, mci_ctrl_tab
|
|
AND 0x10 ; Ctrl
|
|
JP NZ, mci_is_crtl
|
|
LD A, C
|
|
LD HL, mci_alt_tab
|
|
AND 0x20 ; Shift
|
|
JP NZ, mci_is_shift
|
|
LD A, (TM_VARS.mc_fix_state)
|
|
OR A
|
|
JP NZ, mci_is_shift
|
|
LD HL, mci_base_tab
|
|
; Calc offset for key decode
|
|
mci_is_shift:
|
|
LD A, B ; last
|
|
ADD A, L
|
|
LD L, A
|
|
LD A, H
|
|
ADC A, 0x0
|
|
LD H, A
|
|
LD C, (HL) ; C - decoded
|
|
LD A, (TM_VARS.mc_stored_key)
|
|
OR A
|
|
LD A, C ; A = decoded key
|
|
JP Z, mci_key_zero
|
|
OR 0x80
|
|
mci_key_zero:
|
|
LD C, A
|
|
XOR A
|
|
LD (TM_VARS.m_last_key), A
|
|
; Return A=C=key
|
|
LD A, C
|
|
POP BC
|
|
POP HL
|
|
RET
|
|
mci_is_crtl:
|
|
LD A,B
|
|
ADD A,L
|
|
LD L, A
|
|
LD A,H
|
|
ADC A, 0x0
|
|
LD H, A
|
|
LD A, (HL)
|
|
JP mci_key_zero
|
|
|
|
mci_base_tab equ $-1
|
|
db ',', '-', 0x00, 0x00, 0x00, '7', '8', '9'
|
|
db 0x1B, 0x09, 0x00, 0x00, 0x00, '0', '.', "\r"
|
|
db '@', 'J', 'F', 'Q', 0x00, '1', '2', '3'
|
|
db 0x9E, '1', 'C', 'Y', '^', '4', '5', '6'
|
|
db 0x81, '2', 'U', 'W', 'S', '+', 0x7F, 0x03
|
|
db 0x86, '3', 'K', 'A', 'M', "\b", 0x99, 0x8B
|
|
db '4', 'E', 'P', 'I', ' ', 0x84, "\r", '/'
|
|
db 0x92, '5', 'N', 'R', 'T', 0x98, 0x85, '_'
|
|
db 0x83, '6', 'G', 'O', 'X', '.', ':', '-'
|
|
db '7', '[', 'L', 'B', 0x93, 0x5C, 'H', '0'
|
|
db '8', ']', 'D', ';', ',', 'V', 'Z', '9'
|
|
|
|
mci_alt_tab equ $-1
|
|
db ',', '-', 0x00, 0x00, 0x00, '7', '8', '9'
|
|
db 0x1B, "\t", 0x00, 0x00, 0x00, '0', '.', "\r"
|
|
db '`', 'j', 'f', 'q', 0x00, '1', '2', '3'
|
|
db 0x9E, '!', 'c', 'y', '~', '4', '5', '6'
|
|
db 0x81, '"', 'u', 'w', 's', '+', 0x7F, 0x03
|
|
db 0x86, '#', 'k', 'a', 'm', "\b", 0x99, 0x8B
|
|
db '$', 'e', 'p', 'i', ' ', 0x84, "\r", '?'
|
|
db 0x92, '%', 'n', 'r', 't', 0x98, 0x85, '_'
|
|
db 0x83, '&', 'g', 'o', 'x', '>', '*', '='
|
|
db 0x27, '{', 'l', 'b', 0x93, '|', 'h', '0'
|
|
db '(', '}', 'd', '+', '<', 'v', 'z', ')'
|
|
|
|
mci_ctrl_tab equ $-1
|
|
db ',', '-', 0x00, 0x00, 0x00, '7', '8', '9'
|
|
db 0x1B, "\t", 0x00, 0x00, 0x00, '0', '.', "\r"
|
|
db 0x00, "\n", 0x06, 0x11, 0x00, '1', '2', '3'
|
|
db 0x9E, '1', 0x03, 0x19, 0x1E, '4', '5', '6'
|
|
db 0x81, '2', 0x15, 0x17, 0x13, '+', 0x7F, 0x03
|
|
db 0x86, '3', "\v", 0x01, "\r", "\b", 0x99, 0x8B
|
|
db '4', 0x05, 0x10, "\t", ' ', 0x84, "\r", '/'
|
|
db 0x92, '5', 0x0E, 0x12, 0x14, 0x98, 0x85, 0x1F
|
|
db 0x83, '6', "\a", 0x0F, 0x18, '.', ':', '-'
|
|
db '7', 0x1B, "\f", 0x02, 0x93, 0x1C, "\b", '0'
|
|
db '8', 0x1D, 0x04, ';', ',', 0x16, 0x1A, '9'
|
|
|
|
; ------------------------------------------------------
|
|
; Out char to console
|
|
; Inp: C - char
|
|
; ------------------------------------------------------
|
|
m_con_out:
|
|
PUSH HL
|
|
PUSH DE
|
|
PUSH BC
|
|
CALL m_con_out_int
|
|
POP BC
|
|
POP DE
|
|
POP HL
|
|
RET
|
|
|
|
; ------------------------------------------------------
|
|
; Out char C to console
|
|
; ------------------------------------------------------
|
|
m_con_out_int:
|
|
LD DE, TM_VARS.m_esc_mode
|
|
LD A, (DE)
|
|
DEC A
|
|
OR A
|
|
JP M, co_print_no_esc ; standart print no ESC mode
|
|
JP NZ, co_exit_esc
|
|
|
|
; handle ESC param
|
|
INC DE
|
|
LD A, (DE)
|
|
OR A
|
|
JP P, co_get_esc_param
|
|
LD A, C
|
|
AND 0xf ; convert char to command code
|
|
LD (DE), A
|
|
INC DE
|
|
XOR A
|
|
LD (DE), A
|
|
RET
|
|
|
|
co_get_esc_param:
|
|
LD HL, TM_VARS.m_esc_cmd
|
|
LD B, (HL)
|
|
; inc param count
|
|
INC HL
|
|
LD A, (HL)
|
|
INC A
|
|
LD (HL), A
|
|
; store new param
|
|
LD E, A
|
|
LD D, 0x0
|
|
ADD HL, DE
|
|
LD (HL), C
|
|
; get params count for esc command
|
|
LD HL, m_esc_params_tab
|
|
LD E, B ; d=0, b = cmd
|
|
ADD HL, DE ; DE - command offset
|
|
CP (HL)
|
|
; return if enough
|
|
RET M
|
|
|
|
; Entry point for user programs
|
|
; to use graphics with parameters in ASCII form
|
|
LD A, (TM_VARS.m_esc_cmd)
|
|
AND 0xf ; ??? already applied
|
|
CP 15
|
|
JP Z, ge_lbl_1
|
|
CP 11
|
|
LD C, 0x5
|
|
JP Z, ge_lbl_2
|
|
CP 4
|
|
JP P, esc_handler1
|
|
ge_lbl_1:
|
|
LD C, 0x4
|
|
ge_lbl_2:
|
|
LD HL, TM_VARS.m_esc_param_1
|
|
LD D, H
|
|
LD E, L
|
|
ge_lbl_3:
|
|
|
|
LD A, (HL)
|
|
CP 0x3a ; ':'
|
|
JP M, ge_is_digit_1
|
|
SUB 0x7
|
|
ge_is_digit_1:
|
|
AND 0xf
|
|
ADD A, A
|
|
ADD A, A
|
|
ADD A, A
|
|
ADD A, A
|
|
LD B, A ; B=A*16
|
|
INC HL
|
|
LD A, (HL)
|
|
CP ':'
|
|
JP M, ge_is_digit_2
|
|
SUB 0x7
|
|
ge_is_digit_2:
|
|
AND 0xf
|
|
OR B
|
|
INC HL
|
|
LD (DE), A
|
|
INC DE
|
|
DEC C
|
|
JP NZ, ge_lbl_3
|
|
|
|
esc_handler1:
|
|
LD HL, TM_VARS.m_esc_cmd
|
|
LD A, (HL)
|
|
AND 0xf
|
|
LD E, A
|
|
DEC HL
|
|
OR A
|
|
LD (HL), 0x2
|
|
RET Z
|
|
LD D, 0x0
|
|
LD (HL), D
|
|
DEC DE
|
|
; Calc ESC command handler offset
|
|
LD HL, m_esc_handler_tab
|
|
ADD HL, DE
|
|
ADD HL, DE
|
|
LD E, (HL)
|
|
INC HL
|
|
; HL = addr of handler func
|
|
LD D, (HL)
|
|
EX DE, HL
|
|
; It is 1..4 func DRAW_* func?
|
|
CP 0x4
|
|
JP P, esc_no_draw_fn
|
|
LD A, (TM_VARS.m_screen_mode)
|
|
AND 00000111b
|
|
; If not in graphics mode - exit
|
|
JP NZ, esc_exit
|
|
|
|
esc_no_draw_fn:
|
|
LD DE, esc_exit
|
|
PUSH DE
|
|
|
|
; Jump to ESC func handler
|
|
JP (HL)
|
|
|
|
esc_exit:
|
|
XOR A
|
|
LD (TM_VARS.m_esc_mode), A
|
|
RET
|
|
|
|
; Count of parameters for ESC commands
|
|
m_esc_params_tab:
|
|
db 4, 8, 8, 4, 1, 2, 1, 1
|
|
db 1, 1, 1, 10, 1, 1, 1, 8
|
|
|
|
m_esc_handler_tab:
|
|
dw esc_draw_fill_rect ; <ESC>1
|
|
dw esc_draw_line ; <ESC>2
|
|
dw esc_draw_dot ; <ESC>3
|
|
dw esc_set_color ; <ESC>4
|
|
dw esc_set_cursor ; <ESC>5
|
|
dw esc_set_vmode ; <ESC>6
|
|
dw esc_set_charset ; <ESC>7
|
|
dw esc_set_palette ; <ESC>8
|
|
dw esc_reset_esc ; <ESC>9
|
|
dw esc_print_screen ; <ESC>:
|
|
dw esc_fn_b ; <ESC>;
|
|
dw esc_fn_none ; <ESC><
|
|
dw esc_fn_none ; <ESC>=
|
|
dw esc_fn_none ; <ESC>>
|
|
dw esc_set_beep ; <ESC>?
|
|
esc_fn_none:
|
|
RET
|
|
|
|
esc_set_beep:
|
|
LD DE, TM_VARS.m_esc_param_1
|
|
LD A, (DE)
|
|
LD H, A
|
|
INC DE
|
|
LD A, (DE)
|
|
LD L, A
|
|
LD (TM_VARS.m_beep_period), HL
|
|
INC DE
|
|
LD A, (DE)
|
|
LD H, A
|
|
INC DE
|
|
LD A, (DE)
|
|
LD L, A
|
|
LD (TM_VARS.m_beep_duration), HL
|
|
RET
|
|
|
|
esc_reset_esc:
|
|
POP DE
|
|
XOR A
|
|
LD (TM_VARS.m_esc_mode), A
|
|
LD A, (TM_VARS.m_screen_mode)
|
|
RET
|
|
|
|
esc_print_screen:
|
|
LD A, (TM_VARS.m_screen_mode)
|
|
AND 00000111b
|
|
RET NZ ; ret if not 0 mode
|
|
LD DE, 0x30ff
|
|
CALL m_print_hor_line
|
|
DEC E
|
|
LD D, 0xf0
|
|
|
|
fna_chk_keys:
|
|
CALL m_con_status
|
|
OR A
|
|
JP Z, fna_no_keys
|
|
CALL tm_con_in
|
|
CP ASCII_ESC
|
|
RET Z
|
|
|
|
fna_no_keys:
|
|
CALL m_print_hor_line
|
|
DEC E
|
|
JP NZ, fna_chk_keys
|
|
LD D, 0xe0
|
|
CALL m_print_hor_line
|
|
RET
|
|
|
|
; ------------------------------------------------------
|
|
; Print line to printer
|
|
; D - width
|
|
; ------------------------------------------------------
|
|
m_print_hor_line:
|
|
LD HL, cmd_esc_set_X0
|
|
|
|
; Set printer X coordinate = 0
|
|
CALL m_print_cmd
|
|
LD HL, 4
|
|
LD (TM_VARS.m_print_pos_x), HL ; Set start coord X = 4
|
|
LD B, 0x0
|
|
|
|
phl_print_next_col:
|
|
LD C, 0x0
|
|
; 1
|
|
CALL m_get_7vpix
|
|
AND D
|
|
CALL NZ, m_print_vert_7pix
|
|
LD HL, (TM_VARS.m_print_pos_x)
|
|
INC HL
|
|
|
|
; inc X
|
|
LD (TM_VARS.m_print_pos_x), HL
|
|
LD C, 0x1
|
|
; 2
|
|
CALL m_get_7vpix
|
|
AND D
|
|
CALL NZ, m_print_vert_7pix
|
|
LD HL, (TM_VARS.m_print_pos_x)
|
|
INC HL
|
|
; inc X
|
|
LD (TM_VARS.m_print_pos_x), HL
|
|
INC B
|
|
LD A, B
|
|
CP 236
|
|
JP C, phl_print_next_col
|
|
LD HL, cmd_esc_inc_Y2
|
|
CALL m_print_cmd
|
|
RET
|
|
|
|
; ------------------------------------------------------
|
|
; Send command to printer
|
|
; Inp: HL -> to command bytes array
|
|
; ------------------------------------------------------
|
|
m_print_cmd:
|
|
PUSH BC
|
|
ps_print_nxt:
|
|
LD A, (HL)
|
|
CP ESC_CMD_END
|
|
JP Z, ps_cmd_end
|
|
LD C, A
|
|
CALL m_print_write
|
|
INC HL
|
|
JP ps_print_nxt
|
|
ps_cmd_end:
|
|
POP BC
|
|
RET
|
|
|
|
; ------------------------------------------------------
|
|
; Print 7 vertical pixels to printer
|
|
; Inp: A - value to print
|
|
; ------------------------------------------------------
|
|
m_print_vert_7pix:
|
|
PUSH AF
|
|
; Set coordinate X to 0
|
|
LD HL, cmd_esc_set_X
|
|
CALL m_print_cmd
|
|
LD HL, (TM_VARS.m_print_pos_x)
|
|
LD C,H
|
|
CALL m_print_write
|
|
LD C,L
|
|
CALL m_print_write
|
|
; Set column print mode
|
|
LD HL, cmd_esc_print_col
|
|
CALL m_print_cmd
|
|
POP AF
|
|
; Print 7 vertical pixels
|
|
LD C, A
|
|
CALL m_print_write
|
|
RET
|
|
|
|
; ------------------------------------------------------
|
|
; Control codes for printer УВВПЧ-30-004
|
|
; ------------------------------------------------------
|
|
; <ESC>Zn - Increment Y coordinate
|
|
cmd_esc_inc_Y2:
|
|
db ASCII_ESC
|
|
db 'Z'
|
|
db 2h
|
|
db ESC_CMD_END
|
|
|
|
; <ESC>Xnn - Set X coordinate
|
|
cmd_esc_set_X0:
|
|
db ASCII_ESC
|
|
db 'X'
|
|
db 0h ; 0..479
|
|
db 0h
|
|
db ESC_CMD_END
|
|
; ------------------------------------------------------
|
|
; <ESC>X - Start on "Set X coordinate" command
|
|
; ------------------------------------------------------
|
|
cmd_esc_set_X:
|
|
db ASCII_ESC
|
|
db 'X'
|
|
db ESC_CMD_END
|
|
|
|
; <ESC>O - Column print (vertical 7 bit)
|
|
cmd_esc_print_col:
|
|
db ASCII_ESC
|
|
db 'O'
|
|
db ESC_CMD_END
|
|
|
|
; ------------------------------------------------------
|
|
; Get 7 vertical pixels from screen
|
|
; Inp: C - sheet
|
|
; Out: A - byte
|
|
; ------------------------------------------------------
|
|
m_get_7vpix:
|
|
LD A, (TM_VARS.m_row_shift)
|
|
ADD A, B
|
|
ADD A, 19 ; skip first 20pix
|
|
LD L, A
|
|
PUSH DE
|
|
PUSH BC
|
|
LD A, E
|
|
g7v_calc_pix_no:
|
|
AND 0x7
|
|
LD B, A
|
|
LD A, E
|
|
; calc hi addr
|
|
RRA ; /8
|
|
RRA
|
|
RRA
|
|
AND 0x1f
|
|
ADD A, A ; *2
|
|
ADD A, 64 ; bytes per row
|
|
LD H, A
|
|
; select sheet 0|1
|
|
LD A, C
|
|
AND 0x1
|
|
ADD A, H
|
|
LD H, A
|
|
; HL = pix addr, turn on VRAM access
|
|
LD A, 0x1
|
|
OUT (SYS_DD17PB), A
|
|
LD E, (HL) ; read pixel
|
|
INC H ; HL += 512
|
|
INC H
|
|
LD D, (HL) ; read pixel row+1
|
|
|
|
; turn off VRAM access
|
|
XOR A
|
|
OUT (SYS_DD17PB), A
|
|
g7v_for_all_pix:
|
|
DEC B
|
|
JP M,g7v_all_shifted
|
|
; shift pixels D >> [CF] >> E
|
|
LD A, D
|
|
RRA
|
|
LD D, A
|
|
LD A, E
|
|
RRA
|
|
LD E, A
|
|
JP g7v_for_all_pix
|
|
g7v_all_shifted:
|
|
LD A, E
|
|
LD D,00000000b
|
|
RRA
|
|
JP NC,g7v_not_1_1
|
|
LD D,00110000b
|
|
g7v_not_1_1:
|
|
RRA
|
|
JP NC,g7v_not_1_2
|
|
LD A, D
|
|
OR 11000000b
|
|
LD D, A
|
|
g7v_not_1_2:
|
|
LD A, D
|
|
POP BC
|
|
POP DE
|
|
RET
|
|
|
|
esc_set_palette:
|
|
LD A, (TM_VARS.m_esc_param_1)
|
|
AND 00111111b ; bgcol[2,1,0],pal[2,1,0]
|
|
LD (TM_VARS.m_cur_palette), A
|
|
LD B, A
|
|
LD A, (TM_VARS.m_screen_mode)
|
|
AND 0x7
|
|
LD A, 0x0
|
|
JP NZ,esp_no_colr
|
|
LD A, 0x40
|
|
|
|
esp_no_colr:
|
|
OR B
|
|
OUT (VID_DD67PB), A
|
|
RET
|
|
|
|
esc_set_charset:
|
|
LD A, (TM_VARS.m_esc_param_1)
|
|
AND 0x3 ; charset 0..3
|
|
LD (TM_VARS.m_codepage), A
|
|
RET
|
|
|
|
; ------------------------------------------------------
|
|
; Get address for draw symbol glyph
|
|
; ------------------------------------------------------
|
|
m_get_glyph:
|
|
LD L, A
|
|
LD E, A
|
|
XOR A
|
|
LD D, A
|
|
LD H, A
|
|
; HL = DE = A
|
|
ADD HL, HL
|
|
ADD HL, DE
|
|
ADD HL, HL
|
|
ADD HL, DE
|
|
; HL = A * 7
|
|
LD A, E ; A = A at proc entry
|
|
CP '@'
|
|
; First 64 symbols is same for all codepages
|
|
JP M, m_cp_common
|
|
LD A, (TM_VARS.m_codepage)
|
|
OR A
|
|
; cp=0 - Latin letters
|
|
JP Z, m_cp_common
|
|
DEC A
|
|
; cp=1 - Russian letters
|
|
JP Z, m_cp_russ
|
|
; cp=2 - 0x40..0x5F - displayed as Lat
|
|
; 0x60 - 0x7F - displayed as Rus
|
|
LD A, E
|
|
CP 0x60
|
|
JP M, m_cp_common
|
|
m_cp_russ:
|
|
LD DE, 448 ; +448=64*7 Offset for cp1
|
|
ADD HL, DE
|
|
|
|
m_cp_common:
|
|
LD DE, m_font_cp0-224 ; m_font_cp0-224
|
|
ADD HL, DE ; add symbol glyph offset
|
|
RET
|
|
|
|
; ------------------------------------------------------
|
|
; Console output
|
|
; ------------------------------------------------------
|
|
co_print_no_esc:
|
|
LD A, C
|
|
AND 0x7f
|
|
CP ' '
|
|
JP M, m_print_control_char
|
|
CALL m_get_glyph
|
|
; Calc screen address to DE
|
|
EX DE, HL
|
|
LD HL, (TM_VARS.m_cursor_row)
|
|
LD A, (TM_VARS.m_row_shift)
|
|
ADD A, L
|
|
LD L, A
|
|
LD A, H
|
|
ADD A, 64
|
|
LD H, A
|
|
LD C, 7
|
|
LD A, (TM_VARS.m_screen_mode)
|
|
AND 0x7
|
|
JP NZ, co_m_no_color
|
|
; Access to video RAM
|
|
LD A, 0x1
|
|
OUT (SYS_DD17PB), A
|
|
EX DE, HL
|
|
; draw to both planes
|
|
XOR A
|
|
LD (DE), A
|
|
INC D
|
|
LD (DE), A
|
|
DEC D
|
|
INC E
|
|
co_m_colorify:
|
|
LD A, (TM_VARS.m_curr_color)
|
|
AND (HL)
|
|
ADD A, A
|
|
LD (DE), A
|
|
INC D
|
|
LD A, (TM_VARS.m_curr_color+1)
|
|
AND (HL)
|
|
ADD A, A
|
|
LD (DE), A
|
|
|
|
; next font byte
|
|
DEC D
|
|
INC HL
|
|
INC E
|
|
DEC C
|
|
JP NZ, co_m_colorify
|
|
XOR A
|
|
; Remove access to VRAM
|
|
OUT (SYS_DD17PB), A
|
|
; Address to draw cursor proc on stack
|
|
LD HL, m_draw_cursor
|
|
PUSH HL
|
|
LD HL, TM_VARS.m_cursor_row
|
|
LD A, (TM_VARS.m_screen_mode)
|
|
AND 0x8
|
|
JP NZ, m_cursor_rt_2
|
|
|
|
m_psc_fwd_cmn:
|
|
INC HL
|
|
LD A, (HL)
|
|
ADD A, 0x2
|
|
AND 0x3f
|
|
LD (HL), A
|
|
DEC HL
|
|
RET NZ
|
|
m_psc_lf_cmn:
|
|
LD A, (HL)
|
|
ADD A, 0xe
|
|
CP 0xfa
|
|
JP NC, LAB_ram_e57a
|
|
LD (HL), A
|
|
RET
|
|
LAB_ram_e57a:
|
|
LD A, (TM_VARS.m_row_shift)
|
|
ADD A, 0xe
|
|
OUT (SYS_DD17PA), A
|
|
LD (TM_VARS.m_row_shift), A
|
|
LD HL, 0x40f0
|
|
ADD A, L
|
|
LD L, A
|
|
DEC L
|
|
DEC L
|
|
LD C, H
|
|
LD A, 0x1
|
|
OUT (SYS_DD17PB), A
|
|
XOR A
|
|
LD DE, 0x1240
|
|
|
|
LAB_ram_e594:
|
|
LD H, C
|
|
LD B, E
|
|
LAB_ram_e596:
|
|
LD (HL), A
|
|
INC H
|
|
DEC B
|
|
JP NZ, LAB_ram_e596
|
|
INC L
|
|
DEC D
|
|
JP NZ, LAB_ram_e594
|
|
XOR A
|
|
OUT (SYS_DD17PB), A
|
|
RET
|
|
|
|
m_psc_bksp_cmn:
|
|
INC HL
|
|
LD A, (HL)
|
|
SUB 0x2
|
|
AND 0x3f
|
|
LD (HL), A
|
|
CP 0x3e
|
|
DEC HL
|
|
RET NZ
|
|
|
|
m_psc_up_cmn:
|
|
LD A, (HL)
|
|
SUB 14
|
|
JP NC, up_no_minus
|
|
LD A, 238
|
|
up_no_minus:
|
|
LD (HL), A
|
|
RET
|
|
|
|
m_psc_tab_cmn:
|
|
INC HL
|
|
LD A, (HL)
|
|
ADD A,16
|
|
AND 0x30
|
|
LD (HL), A
|
|
DEC HL
|
|
RET NZ
|
|
JP m_psc_lf_cmn
|
|
|
|
m_psc_tab:
|
|
INC HL
|
|
LD A, (HL)
|
|
ADD A, 16
|
|
AND 0x30
|
|
LD (HL), A
|
|
DEC HL
|
|
RET NZ
|
|
JP m_psc_lf
|
|
|
|
; Move cursor 2 sym right, move to next line if wrap
|
|
m_cursor_rt_2:
|
|
INC HL
|
|
LD A, (HL)
|
|
ADD A,2
|
|
AND 0x3f ; screen column 0..63
|
|
LD (HL), A
|
|
DEC HL
|
|
RET NZ ; Return if no wrap
|
|
|
|
m_psc_lf:
|
|
LD A, (HL)
|
|
ADD A, 12
|
|
CP 16
|
|
JP NC, mp_next_nowr
|
|
LD (HL), A
|
|
RET
|
|
|
|
mp_next_nowr:
|
|
LD A, (TM_VARS.m_row_shift)
|
|
LD L, A
|
|
ADD A, 12
|
|
LD E, A
|
|
LD C, 8
|
|
; Acces VRAM
|
|
LD A,1
|
|
OUT (SYS_DD17PB), A
|
|
LAB_ram_e5f2:
|
|
LD B, 0x40
|
|
LD H, 0x40
|
|
LD D, H
|
|
LAB_ram_e5f7:
|
|
LD A, (DE)
|
|
LD (HL), A
|
|
INC H
|
|
INC D
|
|
DEC B
|
|
JP NZ, LAB_ram_e5f7
|
|
INC L
|
|
INC E
|
|
DEC C
|
|
JP NZ, LAB_ram_e5f2
|
|
LD C, 0xc
|
|
LD A, (TM_VARS.m_row_shift)
|
|
ADD A, 0x8
|
|
LD E, A
|
|
LAB_ram_e60d:
|
|
LD B, 0x40
|
|
LD D, 0x40
|
|
XOR A
|
|
LAB_ram_e612:
|
|
LD (DE), A
|
|
INC D
|
|
DEC B
|
|
JP NZ, LAB_ram_e612
|
|
INC E
|
|
DEC C
|
|
JP NZ, LAB_ram_e60d
|
|
XOR A
|
|
OUT (SYS_DD17PB), A
|
|
RET
|
|
|
|
m_psc_bksp:
|
|
INC HL
|
|
LD A, (HL)
|
|
OR A
|
|
DEC HL
|
|
RET Z
|
|
INC HL
|
|
SUB 0x2
|
|
AND 0x3f
|
|
LD (HL), A
|
|
DEC HL
|
|
RET
|
|
|
|
co_m_no_color:
|
|
CP 7
|
|
JP Z, LAB_ram_e6b5
|
|
CP 3
|
|
JP Z, LAB_ram_e6b5
|
|
AND 0x2
|
|
JP NZ, LAB_ram_e7b9
|
|
LD A, 0x1
|
|
OUT (SYS_DD17PB), A
|
|
EX DE, HL
|
|
XOR A
|
|
LD (DE), A
|
|
INC E
|
|
|
|
LAB_ram_e645:
|
|
LD A, (HL)
|
|
ADD A, A
|
|
LD (DE), A
|
|
INC HL
|
|
INC E
|
|
DEC C
|
|
JP NZ, LAB_ram_e645
|
|
XOR A
|
|
OUT (SYS_DD17PB), A
|
|
LD HL, m_draw_cursor
|
|
PUSH HL
|
|
LD HL, TM_VARS.m_cursor_row
|
|
LAB_ram_e658:
|
|
INC HL
|
|
LD A, (HL)
|
|
ADD A, 0x1
|
|
AND 0x3f
|
|
LD (HL), A
|
|
DEC HL
|
|
RET NZ
|
|
LAB_ram_e661:
|
|
LD A, (HL)
|
|
ADD A, 0xb
|
|
CP 0xfa
|
|
JP NC, LAB_ram_e66b
|
|
LD (HL), A
|
|
RET
|
|
|
|
LAB_ram_e66b:
|
|
LD A, (TM_VARS.m_row_shift)
|
|
ADD A, 0xb
|
|
OUT (SYS_DD17PA), A
|
|
LD (TM_VARS.m_row_shift), A
|
|
LD HL, 0x40f0
|
|
ADD A,L
|
|
LD L, A
|
|
LD C,H
|
|
LD A, 0x1
|
|
OUT (SYS_DD17PB), A
|
|
XOR A
|
|
LD DE, 0x1040
|
|
LAB_ram_e683:
|
|
LD H, C
|
|
LD B, E
|
|
LAB_ram_e685:
|
|
LD (HL), A
|
|
INC H
|
|
DEC B
|
|
JP NZ, LAB_ram_e685
|
|
INC L
|
|
DEC D
|
|
JP NZ, LAB_ram_e683
|
|
XOR A
|
|
OUT (SYS_DD17PB), A
|
|
RET
|
|
LAB_ram_e694:
|
|
INC HL
|
|
LD A, (HL)
|
|
SUB 0x1
|
|
AND 0x3f
|
|
LD (HL), A
|
|
CP 0x3f
|
|
DEC HL
|
|
RET NZ
|
|
LAB_ram_e69f:
|
|
LD A, (HL)
|
|
SUB 0xb
|
|
JP NC, LAB_ram_e6a7
|
|
LD A, 0xf2
|
|
LAB_ram_e6a7:
|
|
LD (HL), A
|
|
RET
|
|
LAB_ram_e6a9:
|
|
INC HL
|
|
LD A, (HL)
|
|
ADD A, 0x8
|
|
AND 0x38
|
|
LD (HL), A
|
|
DEC HL
|
|
RET NZ
|
|
JP LAB_ram_e661
|
|
LAB_ram_e6b5:
|
|
CALL m_calc_addr_40
|
|
LD A, 0x1
|
|
OUT (SYS_DD17PB), A
|
|
EX DE, HL
|
|
LD A,B
|
|
OR B
|
|
JP Z, LAB_ram_e6cd
|
|
DEC B
|
|
JP Z, LAB_ram_e6df
|
|
DEC B
|
|
JP Z, LAB_ram_e706
|
|
JP LAB_ram_e731
|
|
LAB_ram_e6cd:
|
|
XOR A
|
|
LD (DE), A
|
|
INC E
|
|
LAB_ram_e6d0:
|
|
LD B, (HL)
|
|
LD A, (DE)
|
|
AND 0xc0
|
|
OR B
|
|
LD (DE), A
|
|
INC HL
|
|
INC E
|
|
DEC C
|
|
JP NZ, LAB_ram_e6d0
|
|
JP LAB_ram_e745
|
|
LAB_ram_e6df:
|
|
XOR A
|
|
LD (DE), A
|
|
DEC D
|
|
LD (DE), A
|
|
INC D
|
|
INC E
|
|
LAB_ram_e6e5:
|
|
LD A, (HL)
|
|
RRCA
|
|
RRCA
|
|
AND 0x7
|
|
LD B, A
|
|
LD A, (DE)
|
|
AND 0xf0
|
|
OR B
|
|
LD (DE), A
|
|
LD A, (HL)
|
|
RRCA
|
|
RRCA
|
|
AND 0xc0
|
|
LD B, A
|
|
DEC D
|
|
LD A, (DE)
|
|
AND 0x1f
|
|
OR B
|
|
LD (DE), A
|
|
INC D
|
|
INC HL
|
|
INC E
|
|
DEC C
|
|
JP NZ, LAB_ram_e6e5
|
|
JP LAB_ram_e745
|
|
LAB_ram_e706:
|
|
XOR A
|
|
LD (DE), A
|
|
DEC D
|
|
LD (DE), A
|
|
INC D
|
|
INC E
|
|
LAB_ram_e70c:
|
|
LD A, (HL)
|
|
RRCA
|
|
RRCA
|
|
RRCA
|
|
RRCA
|
|
AND 0x1
|
|
LD B, A
|
|
LD A, (DE)
|
|
AND 0xfc
|
|
OR B
|
|
LD (DE), A
|
|
LD A, (HL)
|
|
RRCA
|
|
RRCA
|
|
RRCA
|
|
RRCA
|
|
AND 0xf0
|
|
LD B, A
|
|
DEC D
|
|
LD A, (DE)
|
|
AND 0x7
|
|
OR B
|
|
LD (DE), A
|
|
INC D
|
|
INC HL
|
|
INC E
|
|
DEC C
|
|
JP NZ, LAB_ram_e70c
|
|
JP LAB_ram_e745
|
|
LAB_ram_e731:
|
|
DEC D
|
|
XOR A
|
|
LD (DE), A
|
|
INC E
|
|
LAB_ram_e735:
|
|
LD A, (HL)
|
|
RLCA
|
|
RLCA
|
|
LD B, A
|
|
LD A, (DE)
|
|
AND 0x1
|
|
OR B
|
|
LD (DE), A
|
|
INC HL
|
|
INC E
|
|
DEC C
|
|
JP NZ, LAB_ram_e735
|
|
INC D
|
|
LAB_ram_e745:
|
|
XOR A
|
|
OUT (SYS_DD17PB), A
|
|
LD HL, m_draw_cursor
|
|
PUSH HL
|
|
LD HL, TM_VARS.m_cursor_row
|
|
LAB_ram_e74f:
|
|
INC HL
|
|
LD A, (HL)
|
|
ADD A, 0x1
|
|
AND 0x7f
|
|
LD (HL), A
|
|
CP 0x50
|
|
DEC HL
|
|
RET M
|
|
LAB_ram_e75a:
|
|
INC HL
|
|
XOR A
|
|
LD (HL), A
|
|
DEC HL
|
|
LAB_ram_e75e:
|
|
LD A, (HL)
|
|
ADD A, 0xb
|
|
CP 0xfa
|
|
JP NC, LAB_ram_e66b
|
|
LD (HL), A
|
|
RET
|
|
LAB_ram_e768:
|
|
INC HL
|
|
LD A, (HL)
|
|
SUB 0x1
|
|
AND 0x7f
|
|
CP 0x7f
|
|
JP Z, LAB_ram_e776
|
|
LD (HL), A
|
|
DEC HL
|
|
RET
|
|
LAB_ram_e776:
|
|
LD A, 0x4f
|
|
LD (HL), A
|
|
DEC HL
|
|
LAB_ram_e77a:
|
|
LD A, (HL)
|
|
SUB 0xb
|
|
JP NC, LAB_ram_e782
|
|
LD A, 0xf2
|
|
LAB_ram_e782:
|
|
LD (HL), A
|
|
RET
|
|
LAB_ram_e784:
|
|
INC HL
|
|
LD A, (HL)
|
|
ADD A, 0x8
|
|
AND 0x7f
|
|
LD (HL), A
|
|
CP 0x50
|
|
DEC HL
|
|
RET M
|
|
JP LAB_ram_e75a
|
|
|
|
; ------------------------------------------------------
|
|
; Calculate text position in 40 column text mode
|
|
; Out: HL - addr
|
|
; B - bit no
|
|
; C = 7
|
|
; ------------------------------------------------------
|
|
m_calc_addr_40:
|
|
LD HL, (TM_VARS.m_cursor_row)
|
|
LD A, (TM_VARS.m_row_shift)
|
|
ADD A,L
|
|
LD L, A ; HL = row+shift
|
|
LD A,H
|
|
CP 4
|
|
LD B, A
|
|
JP M, ca_bef_scrn_top
|
|
AND 0x3
|
|
LD B, A
|
|
LD A,H
|
|
OR A
|
|
RRA
|
|
OR A
|
|
RRA
|
|
LD C, A
|
|
LD H, 0x3
|
|
XOR A
|
|
|
|
ca_lbl1:
|
|
ADD A,H
|
|
DEC C
|
|
JP NZ, ca_lbl1
|
|
ADD A,B
|
|
ca_bef_scrn_top:
|
|
ADD A, 0x40 ; next row
|
|
LD H, A
|
|
LD C, 0x7
|
|
RET
|
|
|
|
LAB_ram_e7b9:
|
|
LD A, (TM_VARS.m_cursor_col)
|
|
CP 0x40
|
|
JP M, LAB_ram_e7c8
|
|
LD HL, TM_VARS.m_cursor_row
|
|
CALL m_draw_cursor
|
|
RET
|
|
LAB_ram_e7c8:
|
|
LD A, 0x1
|
|
OUT (SYS_DD17PB), A
|
|
EX DE, HL
|
|
XOR A
|
|
LD (DE), A
|
|
INC E
|
|
LAB_ram_e7d0:
|
|
LD A, (HL)
|
|
ADD A, A
|
|
LD (DE), A
|
|
INC HL
|
|
INC E
|
|
DEC C
|
|
JP NZ, LAB_ram_e7d0
|
|
XOR A
|
|
OUT (SYS_DD17PB), A
|
|
LD HL, m_draw_cursor
|
|
PUSH HL
|
|
LD HL, TM_VARS.m_cursor_row
|
|
INC HL
|
|
LD A, (HL)
|
|
ADD A, 0x1
|
|
CP 0x40
|
|
JP M, LAB_ram_e7ee
|
|
LD A, 0x40
|
|
LAB_ram_e7ee:
|
|
LD (HL), A
|
|
DEC HL
|
|
RET
|
|
|
|
m_psc_clrscr_cmn:
|
|
LD A, (TM_VARS.m_screen_mode)
|
|
AND 0x8
|
|
JP NZ,m_clr_color
|
|
LD A,01111111b
|
|
OUT (VID_DD67PB), A ; C/M=1 FL=111 CL=111 All black
|
|
; Access VRAM
|
|
LD A, 0x1
|
|
OUT (SYS_DD17PB), A
|
|
LD DE, video_ram
|
|
EX DE, HL
|
|
LD A,H
|
|
ADD A,64 ; row + 1
|
|
LD B, 0x0
|
|
|
|
clr_fill_scrn1:
|
|
LD (HL),B
|
|
INC HL
|
|
CP H
|
|
JP NZ, clr_fill_scrn1
|
|
EX DE, HL
|
|
LD A, (TM_VARS.m_cur_palette)
|
|
LD B, A
|
|
LD A, (TM_VARS.m_screen_mode)
|
|
AND 0x7
|
|
LD A, 0x0
|
|
JP NZ, clr_rest_no_color
|
|
LD A, 01000000b
|
|
|
|
clr_rest_no_color:
|
|
OR B
|
|
; Restore mode and palette
|
|
OUT (VID_DD67PB), A
|
|
|
|
m_psc_home_cmn:
|
|
XOR A
|
|
NOP
|
|
NOP
|
|
LD (HL), A
|
|
INC HL
|
|
XOR A
|
|
LD (HL), A
|
|
DEC HL
|
|
XOR A
|
|
; Disable VRAM access
|
|
OUT (SYS_DD17PB), A
|
|
RET
|
|
|
|
; Clear scr in color mode
|
|
m_clr_color:
|
|
LD A, (TM_VARS.m_row_shift)
|
|
LD L, A
|
|
LD C,20
|
|
; Access VRAM
|
|
LD A, 0x1
|
|
OUT (SYS_DD17PB), A
|
|
m_clr_fill_c1:
|
|
LD H, 0x40 ; HL = 0x4000 + shift_row
|
|
LD B,64 ; 64 bytes at row
|
|
XOR A
|
|
m_clr_fill_c2:
|
|
LD (HL), A
|
|
INC H
|
|
DEC B
|
|
JP NZ, m_clr_fill_c2
|
|
INC L
|
|
DEC C
|
|
JP NZ, m_clr_fill_c1
|
|
XOR A
|
|
; Disabe VRAM access
|
|
OUT (SYS_DD17PB), A
|
|
JP m_psc_home_cmn
|
|
m_draw_cursor:
|
|
LD A, (TM_VARS.m_screen_mode)
|
|
AND 0x4
|
|
RET NZ
|
|
LD A, (TM_VARS.m_screen_mode)
|
|
AND 0x7
|
|
JP NZ, LAB_ram_e884
|
|
EX DE, HL
|
|
LD HL, (TM_VARS.m_cursor_row)
|
|
LD A, (TM_VARS.m_row_shift)
|
|
ADD A, L
|
|
LD L, A
|
|
LD A, H
|
|
ADD A, 0x40
|
|
LD H, A
|
|
LD A, 0x1
|
|
OUT (SYS_DD17PB), A
|
|
LD BC, 0x7f08
|
|
LAB_ram_e872:
|
|
LD A, (HL)
|
|
XOR B
|
|
LD (HL), A
|
|
INC H
|
|
LD A, (HL)
|
|
XOR B
|
|
LD (HL), A
|
|
DEC H
|
|
INC L
|
|
DEC C
|
|
JP NZ, LAB_ram_e872
|
|
EX DE, HL
|
|
XOR A
|
|
OUT (SYS_DD17PB), A
|
|
RET
|
|
LAB_ram_e884:
|
|
CP 0x3
|
|
JP Z, LAB_ram_e8af
|
|
EX DE, HL
|
|
LD HL, (TM_VARS.m_cursor_row)
|
|
LD A, (TM_VARS.m_row_shift)
|
|
ADD A, L
|
|
LD L, A
|
|
LD A, H
|
|
CP 0x40
|
|
EX DE, HL
|
|
RET P
|
|
EX DE, HL
|
|
ADD A, 0x40
|
|
LD H, A
|
|
LD A, 0x1
|
|
OUT (SYS_DD17PB), A
|
|
LD BC, 0x7f08
|
|
LAB_ram_e8a2:
|
|
LD A, (HL)
|
|
XOR B
|
|
LD (HL), A
|
|
INC L
|
|
DEC C
|
|
JP NZ, LAB_ram_e8a2
|
|
EX DE, HL
|
|
XOR A
|
|
OUT (SYS_DD17PB), A
|
|
RET
|
|
LAB_ram_e8af:
|
|
EX DE, HL
|
|
LD HL, (TM_VARS.m_cursor_row)
|
|
LD A, H
|
|
CP 0x50
|
|
EX DE, HL
|
|
RET P
|
|
EX DE, HL
|
|
CALL m_calc_addr_40
|
|
LD A, 0x1
|
|
OUT (SYS_DD17PB), A
|
|
LD A, B
|
|
OR B
|
|
JP Z, LAB_ram_e8d0
|
|
DEC B
|
|
JP Z, LAB_ram_e8e6
|
|
DEC B
|
|
JP Z, LAB_ram_e908
|
|
JP LAB_ram_e92a
|
|
LAB_ram_e8d0:
|
|
LD BC, 0x1f08
|
|
LAB_ram_e8d3:
|
|
LD A, (HL)
|
|
AND 0xc0
|
|
LD B, A
|
|
LD A, (HL)
|
|
XOR 0x1f
|
|
AND 0x1f
|
|
OR B
|
|
LD (HL), A
|
|
INC L
|
|
DEC C
|
|
JP NZ, LAB_ram_e8d3
|
|
JP LAB_ram_e93e
|
|
LAB_ram_e8e6:
|
|
LD C, 0x8
|
|
LAB_ram_e8e8:
|
|
DEC H
|
|
LD A, (HL)
|
|
AND 0x1f
|
|
LD B, A
|
|
LD A, (HL)
|
|
XOR 0xc0
|
|
AND 0xc0
|
|
OR B
|
|
LD (HL), A
|
|
INC H
|
|
LD A, (HL)
|
|
AND 0xf0
|
|
LD B, A
|
|
LD A, (HL)
|
|
XOR 0x7
|
|
AND 0x7
|
|
OR B
|
|
LD (HL), A
|
|
INC L
|
|
DEC C
|
|
JP NZ, LAB_ram_e8e8
|
|
JP LAB_ram_e93e
|
|
LAB_ram_e908:
|
|
LD C, 0x8
|
|
LAB_ram_e90a:
|
|
DEC H
|
|
LD A, (HL)
|
|
AND 0x7
|
|
LD B, A
|
|
LD A, (HL)
|
|
XOR 0xf0
|
|
AND 0xf0
|
|
OR B
|
|
LD (HL), A
|
|
INC H
|
|
LD A, (HL)
|
|
AND 0xfc
|
|
LD B, A
|
|
LD A, (HL)
|
|
XOR 0x1
|
|
AND 0x1
|
|
OR B
|
|
LD (HL), A
|
|
INC L
|
|
DEC C
|
|
JP NZ, LAB_ram_e90a
|
|
JP LAB_ram_e93e
|
|
LAB_ram_e92a:
|
|
LD C, 0x8
|
|
DEC H
|
|
LAB_ram_e92d:
|
|
LD A, (HL)
|
|
AND 0x1
|
|
LD B, A
|
|
LD A, (HL)
|
|
XOR 0x7c
|
|
AND 0x7c
|
|
OR B
|
|
LD (HL), A
|
|
INC L
|
|
DEC C
|
|
JP NZ, LAB_ram_e92d
|
|
INC H
|
|
LAB_ram_e93e:
|
|
EX DE, HL
|
|
XOR A
|
|
OUT (SYS_DD17PB), A ; reset screen shifts
|
|
RET
|
|
|
|
m_print_control_char:
|
|
CP ASCII_ESC
|
|
JP NZ,m_psc_std_char
|
|
; turn on ESC mode for next chars
|
|
LD HL, TM_VARS.m_esc_mode
|
|
LD (HL), 0x1
|
|
INC HL
|
|
LD (HL), 0xff
|
|
RET
|
|
|
|
m_psc_std_char:
|
|
CP ASCII_BELL
|
|
JP Z, m_beep
|
|
LD HL, m_draw_cursor
|
|
PUSH HL
|
|
LD HL, TM_VARS.m_cursor_row
|
|
PUSH AF
|
|
CALL m_draw_cursor
|
|
LD A, (TM_VARS.m_screen_mode)
|
|
AND 0x8 ; mode 40x20?
|
|
JP Z, m_psc_no_40x30 ; jump if no
|
|
POP AF
|
|
CP ASCII_TAB ; TAB
|
|
JP Z,m_psc_tab
|
|
CP ASCII_BS ; BKSP
|
|
JP Z,m_psc_bksp
|
|
CP ASCII_CAN ; Cancel
|
|
JP Z,m_cursor_rt_2
|
|
CP ASCII_US ; ASCII Unit separator
|
|
JP Z,m_clr_color
|
|
CP ASCII_LF ; LF
|
|
JP Z,m_psc_lf
|
|
CP ASCII_CR ; CR
|
|
RET NZ ; ret on unknown
|
|
INC HL
|
|
LD (HL), 0x0
|
|
DEC HL
|
|
RET
|
|
|
|
; common for 40x25, 64x25, 80x25 modes
|
|
m_psc_no_40x30:
|
|
POP AF
|
|
CP ASCII_US ; Unit separator
|
|
JP Z, m_psc_clrscr_cmn
|
|
CP ASCII_FF ; Form feed
|
|
JP Z, m_psc_home_cmn
|
|
PUSH AF
|
|
LD A, (TM_VARS.m_screen_mode)
|
|
AND 0x7
|
|
JP NZ, LAB_ram_e9c6
|
|
POP AF
|
|
CP ASCII_TAB
|
|
JP Z, m_psc_tab_cmn
|
|
CP ASCII_BS
|
|
JP Z, m_psc_bksp_cmn
|
|
CP ASCII_CAN
|
|
JP Z, m_psc_fwd_cmn
|
|
CP ASCII_EM ; ASCII End of medium
|
|
JP Z, m_psc_up_cmn
|
|
CP ASCII_SUB
|
|
JP Z, m_psc_lf_cmn ; cursor down
|
|
CP ASCII_LF
|
|
JP Z, m_psc_lf_cmn
|
|
CP ASCII_CR
|
|
RET NZ
|
|
INC HL
|
|
LD (HL), 0x0
|
|
DEC HL
|
|
RET
|
|
|
|
LAB_ram_e9c6:
|
|
LD A, (TM_VARS.m_screen_mode)
|
|
CP 0x3
|
|
JP Z, m_psc_no_40x25
|
|
CP 0x7
|
|
JP Z, m_psc_no_40x25
|
|
AND 0x2
|
|
JP NZ, LAB_ram_e9ff
|
|
; For 40x25?
|
|
POP AF
|
|
CP 0x9
|
|
JP Z, LAB_ram_e6a9
|
|
CP 0x8
|
|
JP Z, LAB_ram_e694
|
|
CP 0x18
|
|
JP Z, LAB_ram_e658
|
|
CP 0x19
|
|
JP Z, LAB_ram_e69f
|
|
CP 0x1a
|
|
JP Z, LAB_ram_e661
|
|
CP 0xa
|
|
JP Z, LAB_ram_e661
|
|
CP 0xd
|
|
RET NZ
|
|
INC HL
|
|
LD (HL), 0x0
|
|
DEC HL
|
|
RET
|
|
|
|
LAB_ram_e9ff:
|
|
POP AF
|
|
CP 0xa
|
|
JP Z, LAB_ram_e661
|
|
CP 0xd
|
|
RET NZ
|
|
INC HL
|
|
LD (HL), 0x0
|
|
DEC HL
|
|
RET
|
|
|
|
m_psc_no_40x25:
|
|
POP AF
|
|
CP 0x9
|
|
JP Z, LAB_ram_e784
|
|
CP 0x8
|
|
JP Z, LAB_ram_e768
|
|
CP 0x18
|
|
JP Z, LAB_ram_e74f
|
|
CP 0x19
|
|
JP Z, LAB_ram_e77a
|
|
CP 0x1a
|
|
JP Z, LAB_ram_e75e
|
|
CP 0xa
|
|
JP Z, LAB_ram_e75e
|
|
CP 0xd
|
|
RET NZ
|
|
INC HL
|
|
LD (HL), 0x0
|
|
DEC HL
|
|
RET
|
|
|
|
m_beep:
|
|
LD HL, (TM_VARS.m_beep_duration)
|
|
EX DE, HL
|
|
LD HL, (TM_VARS.m_beep_period)
|
|
LD A,00110110b ; TMR#0 LSB+MSB Square Wave Generator
|
|
OUT (TMR_DD70CTR), A
|
|
LD A,L ; LSB
|
|
OUT (TMR_DD70C1), A
|
|
LD A,H ; MSB
|
|
OUT (TMR_DD70C1), A
|
|
LD A, (TM_VARS.m_strobe_state)
|
|
LD B, A
|
|
m_bell_cont:
|
|
LD A, D ; DE=duration
|
|
OR E
|
|
RET Z ; ret if enough
|
|
DEC DE
|
|
LD A,B
|
|
XOR BELL_PIN
|
|
LD B, A
|
|
OUT (DD67PC), A ; Invert bell pin
|
|
m_bell_wait_tmr1:
|
|
IN A, (PIC_DD75RS)
|
|
AND TIMER_IRQ ; 0x10
|
|
JP NZ,m_bell_wait_tmr1
|
|
LD A,B
|
|
XOR BELL_PIN ; Flip pin again
|
|
LD B, A
|
|
OUT (DD67PC), A
|
|
m_bell_wait_tmr2:
|
|
IN A, (PIC_DD75RS)
|
|
AND TIMER_IRQ
|
|
JP Z,m_bell_wait_tmr2
|
|
JP m_bell_cont
|
|
|
|
; ------------------------------------------------------
|
|
; <ESC>5<row><col> Set cursor position
|
|
; ------------------------------------------------------
|
|
esc_set_cursor:
|
|
LD A, (TM_VARS.m_screen_mode)
|
|
AND 0x8
|
|
RET NZ ; ret if graphics mode
|
|
CALL m_draw_cursor ; hide cursor
|
|
LD A, (TM_VARS.m_screen_mode)
|
|
AND 0x7 ; mode 0-7
|
|
JP NZ,sc_set_64_or_80
|
|
; Set cursor for 32x18 mode
|
|
LD DE, TM_VARS.m_esc_param_1
|
|
LD HL, TM_VARS.m_cursor_col
|
|
INC DE
|
|
LD A, (DE) ; column
|
|
AND 0x1f ; limit column to 0..31
|
|
ADD A, A ; *2
|
|
LD (HL), A
|
|
DEC DE
|
|
DEC HL
|
|
LD A, (DE) ; row
|
|
AND 0x1f ; 0..31
|
|
CP 17
|
|
JP C,sc_no_row_limit1
|
|
LD A,17
|
|
|
|
sc_no_row_limit1:
|
|
LD B, A
|
|
ADD A, A
|
|
ADD A,B
|
|
ADD A, A
|
|
ADD A,B
|
|
ADD A, A ; a = a * 14 (font height)
|
|
LD (HL), A
|
|
CALL m_draw_cursor
|
|
RET
|
|
|
|
sc_set_64_or_80:
|
|
LD A, (TM_VARS.m_screen_mode)
|
|
CP 0x3
|
|
JP Z, sc_set_for_80x32
|
|
CP 0x7
|
|
JP Z, sc_set_for_80x32
|
|
AND 0x2
|
|
JP NZ, sc_set_for_65x23
|
|
; Set for 64 col modes
|
|
LD DE, TM_VARS.m_esc_param_1 ; row
|
|
LD HL, TM_VARS.m_cursor_col
|
|
INC DE
|
|
LD A, (DE) ; column
|
|
SUB 0x20
|
|
AND 0x3f ; 0..63
|
|
LD (HL), A
|
|
DEC DE
|
|
DEC HL
|
|
LD A, (DE) ; row
|
|
; limit row to 0..22
|
|
AND 0x1f
|
|
CP 22
|
|
JP C,sc_no_row_limit2
|
|
LD A,22
|
|
sc_no_row_limit2:
|
|
LD B, A
|
|
ADD A, A
|
|
ADD A, A
|
|
ADD A,B
|
|
ADD A, A
|
|
ADD A,B ; A = A * 11 (font height)
|
|
LD (HL), A
|
|
CALL m_draw_cursor ; show cursor
|
|
RET
|
|
|
|
sc_set_for_65x23:
|
|
LD DE, TM_VARS.m_esc_param_1
|
|
LD HL, TM_VARS.m_cursor_col
|
|
INC DE
|
|
LD A, (DE) ; column
|
|
SUB 0x20
|
|
CP 64
|
|
JP M,sc_no_col_limit3
|
|
LD A,64
|
|
|
|
sc_no_col_limit3:
|
|
LD (HL), A
|
|
DEC DE
|
|
DEC HL
|
|
LD A, (DE) ; row
|
|
AND 0x1f
|
|
CP 22
|
|
JP C,sc_no_row_limit3
|
|
LD A,22
|
|
sc_no_row_limit3:
|
|
LD B, A
|
|
ADD A, A
|
|
ADD A, A
|
|
ADD A,B
|
|
ADD A, A
|
|
ADD A,B ; A = A * 11
|
|
LD (HL), A
|
|
CALL m_draw_cursor ; show cursor
|
|
RET
|
|
|
|
sc_set_for_80x32:
|
|
LD DE, TM_VARS.m_esc_param_1
|
|
LD HL, TM_VARS.m_cursor_col
|
|
INC DE
|
|
LD A, (DE)
|
|
SUB 0x20
|
|
AND 0x7f
|
|
CP 79
|
|
JP M, sc_no_row_limit4
|
|
LD A,79
|
|
|
|
sc_no_row_limit4:
|
|
LD (HL), A
|
|
DEC DE
|
|
DEC HL
|
|
LD A, (DE)
|
|
AND 0x1f
|
|
CP 22
|
|
JP C,sc_no_col_limit4
|
|
LD A,22
|
|
|
|
sc_no_col_limit4:
|
|
LD B, A
|
|
ADD A, A
|
|
ADD A, A
|
|
ADD A,B
|
|
ADD A, A
|
|
ADD A,B ; A = A * 11
|
|
LD (HL), A
|
|
CALL m_draw_cursor ; show cursor
|
|
RET
|
|
|
|
; ------------------------------------------------------
|
|
; <ESC>6n
|
|
; where n is
|
|
; 0 - 32x18 with cursor;
|
|
; 1,2 - 64x23 with cursor;
|
|
; 3 - 80x23 with cursor;
|
|
; 4 - 32x18 no cursor;
|
|
; 5,6 - 64x23 no cursor;
|
|
; 7 - 80x23 no cursor;
|
|
; 8 - graphics mode.
|
|
; ------------------------------------------------------
|
|
esc_set_vmode:
|
|
LD HL, TM_VARS.m_screen_mode
|
|
LD A, (TM_VARS.m_cur_palette)
|
|
LD B, A ; b = palette
|
|
LD A, (TM_VARS.m_esc_param_1)
|
|
LD C, A ; c = mode
|
|
AND 0x8 ; graph mode?
|
|
LD A, C
|
|
JP Z,svm_set_text
|
|
LD A, 0x8
|
|
svm_set_text:
|
|
AND 0xf
|
|
LD (HL), A ; save new mode
|
|
AND 0x7 ; with cursor?
|
|
LD A,00000000b
|
|
JP NZ, swm_no_color
|
|
LD A,01000000b
|
|
swm_no_color:
|
|
OR B
|
|
OUT (VID_DD67PB), A ; Set C/M and palette
|
|
LD HL, TM_VARS.m_cursor_row
|
|
CALL m_psc_clrscr_cmn
|
|
CALL m_draw_cursor
|
|
RET
|
|
|
|
; ------------------------------------------------------
|
|
; <ESC>4n n=1..4 Set drawing color
|
|
; ------------------------------------------------------
|
|
esc_set_color:
|
|
LD A, (TM_VARS.m_esc_param_1)
|
|
AND 0x3
|
|
RRA
|
|
LD B, A
|
|
LD A, 0x0
|
|
SBC A, A
|
|
LD (TM_VARS.m_curr_color), A
|
|
LD A, B
|
|
DEC A
|
|
CPL
|
|
LD (TM_VARS.m_curr_color+1), A
|
|
RET
|
|
|
|
co_exit_esc:
|
|
LD A, (TM_VARS.m_screen_mode)
|
|
AND 0x7
|
|
JP NZ, esc_exit
|
|
LD A, C
|
|
AND 0x7f
|
|
LD C, A
|
|
CP 0x20
|
|
JP M, esc_exit
|
|
LD HL, TM_VARS.m_esc_param_1
|
|
LD A, (HL)
|
|
LD E, A
|
|
ADD A, 0x8
|
|
JP C, esc_exit
|
|
LD (HL), A
|
|
INC HL
|
|
LD A, 0xf7
|
|
CP (HL)
|
|
JP C, esc_exit
|
|
LD D, (HL)
|
|
CALL SUB_ram_ebe2
|
|
LD A, L
|
|
SUB 0x7
|
|
LD L, A
|
|
PUSH HL
|
|
LD A, C
|
|
CALL m_get_glyph
|
|
POP DE
|
|
LD C, 0x7
|
|
|
|
LAB_ram_eb9b:
|
|
PUSH HL
|
|
LD A, 0x1
|
|
OUT (SYS_DD17PB), A
|
|
LD L, (HL)
|
|
LD H, 0x0
|
|
LD A, B
|
|
OR A
|
|
JP Z, LAB_ram_ebad
|
|
LAB_ram_eba8:
|
|
ADD HL, HL
|
|
DEC A
|
|
JP NZ, LAB_ram_eba8
|
|
LAB_ram_ebad:
|
|
EX DE, HL
|
|
PUSH BC
|
|
LD A, (TM_VARS.m_curr_color)
|
|
CPL
|
|
LD B, A
|
|
LD A, (HL)
|
|
XOR B
|
|
OR E
|
|
XOR B
|
|
LD (HL), A
|
|
INC H
|
|
INC H
|
|
LD A, (HL)
|
|
XOR B
|
|
OR D
|
|
XOR B
|
|
LD (HL), A
|
|
DEC H
|
|
LD A, (TM_VARS.m_curr_color+1)
|
|
CPL
|
|
LD B, A
|
|
LD A, (HL)
|
|
XOR B
|
|
OR E
|
|
XOR B
|
|
LD (HL), A
|
|
INC H
|
|
INC H
|
|
LD A, (HL)
|
|
XOR B
|
|
OR D
|
|
XOR B
|
|
LD (HL), A
|
|
DEC H
|
|
DEC H
|
|
DEC H
|
|
INC L
|
|
EX DE, HL
|
|
POP BC
|
|
XOR A
|
|
OUT (SYS_DD17PB), A
|
|
POP HL
|
|
INC HL
|
|
DEC C
|
|
JP NZ, LAB_ram_eb9b
|
|
RET
|
|
SUB_ram_ebe2:
|
|
LD A, (TM_VARS.m_row_shift)
|
|
SUB D
|
|
DEC A
|
|
LD L, A
|
|
LD A, E
|
|
AND 0x7
|
|
LD B, A
|
|
LD A, E
|
|
RRA
|
|
RRA
|
|
AND 0x3e
|
|
ADD A, 0x40
|
|
LD H, A
|
|
RET
|
|
|
|
esc_draw_fill_rect:
|
|
LD HL, TM_VARS.m_esc_param_4
|
|
LD DE, TM_VARS.m_esc_param_2
|
|
LD A, (DE)
|
|
LD B, (HL)
|
|
CP B
|
|
JP NC, LAB_ram_ec04
|
|
LD (HL), A
|
|
LD A,B
|
|
LD (DE), A
|
|
LAB_ram_ec04:
|
|
DEC DE
|
|
DEC HL
|
|
LD A, (DE)
|
|
LD B, (HL)
|
|
CP B
|
|
JP C, LAB_ram_ec0f
|
|
LD (HL), A
|
|
LD A,B
|
|
LD (DE), A
|
|
LAB_ram_ec0f:
|
|
EX DE, HL
|
|
LD E, (HL)
|
|
INC HL
|
|
LD D, (HL)
|
|
CALL SUB_ram_ebe2
|
|
PUSH HL
|
|
XOR A
|
|
LAB_ram_ec18:
|
|
SCF
|
|
RLA
|
|
DEC B
|
|
JP P, LAB_ram_ec18
|
|
RRA
|
|
LD D, A
|
|
LD HL, TM_VARS.m_esc_param_3
|
|
LD A, (HL)
|
|
AND 0x7
|
|
LD B, A
|
|
XOR A
|
|
LAB_ram_ec28:
|
|
SCF
|
|
RLA
|
|
DEC B
|
|
JP P, LAB_ram_ec28
|
|
CPL
|
|
LD E, A
|
|
LD A, (HL)
|
|
DEC HL
|
|
DEC HL
|
|
SUB (HL)
|
|
RRCA
|
|
RRCA
|
|
RRCA
|
|
AND 0x1f
|
|
LD C, A
|
|
INC HL
|
|
LD A, (HL)
|
|
INC HL
|
|
INC HL
|
|
SUB (HL)
|
|
JP NZ, LAB_ram_ec43
|
|
INC A
|
|
LAB_ram_ec43:
|
|
LD B, A
|
|
POP HL
|
|
LD A, E
|
|
LD (TM_VARS.m_esc_hex_cmd), A
|
|
LAB_ram_ec49:
|
|
PUSH DE
|
|
PUSH HL
|
|
PUSH BC
|
|
; Access VRAM
|
|
LD A, 0x1
|
|
OUT (SYS_DD17PB), A
|
|
LD A, C
|
|
OR A
|
|
JP NZ, LAB_ram_ec58
|
|
LD A, D
|
|
OR E
|
|
dr_no_cmd:
|
|
LD D, A
|
|
LAB_ram_ec58:
|
|
LD B, D
|
|
EX DE, HL
|
|
LD HL, (TM_VARS.m_curr_color)
|
|
EX DE, HL
|
|
LD A, (HL)
|
|
XOR E
|
|
AND B
|
|
XOR E
|
|
LD (HL), A
|
|
INC H
|
|
LD A, (HL)
|
|
XOR D
|
|
AND B
|
|
XOR D
|
|
LD (HL), A
|
|
INC H
|
|
LD A, C
|
|
OR A
|
|
JP Z, LAB_ram_ec81
|
|
DEC C
|
|
LAB_ram_ec70:
|
|
LD A, (TM_VARS.m_esc_hex_cmd)
|
|
JP Z, dr_no_cmd
|
|
LAB_ram_ec76:
|
|
LD (HL), E
|
|
INC H
|
|
LD (HL), D
|
|
INC H
|
|
DEC C
|
|
JP NZ, LAB_ram_ec76
|
|
JP LAB_ram_ec70
|
|
LAB_ram_ec81:
|
|
XOR A
|
|
OUT (SYS_DD17PB), A
|
|
POP BC
|
|
POP HL
|
|
POP DE
|
|
INC L
|
|
DEC B
|
|
JP NZ, LAB_ram_ec49
|
|
RET
|
|
|
|
esc_draw_line:
|
|
LD HL, TM_VARS.m_esc_param_1
|
|
LD E, (HL)
|
|
INC HL
|
|
LD D, (HL)
|
|
INC HL
|
|
LD A, (HL)
|
|
INC HL
|
|
LD H, (HL)
|
|
LD L, A
|
|
CP E
|
|
JP C, LAB_ram_ec9d
|
|
EX DE, HL
|
|
LAB_ram_ec9d:
|
|
LD (TM_VARS.m_esc_param_1), HL
|
|
LD A, E
|
|
SUB L
|
|
LD L, A
|
|
LD A, D
|
|
SUB H
|
|
LD H, A
|
|
PUSH AF
|
|
JP NC, LAB_ram_ecad
|
|
CPL
|
|
INC A
|
|
LD H, A
|
|
LAB_ram_ecad:
|
|
EX DE, HL
|
|
LD HL, (TM_VARS.m_esc_param_1)
|
|
EX DE, HL
|
|
JP Z, LAB_ram_ed96
|
|
LD A, L
|
|
OR A
|
|
JP Z, LAB_ram_ed4c
|
|
LD B, A
|
|
POP AF
|
|
LD A, 0x0
|
|
ADC A, A
|
|
LD (TM_VARS.m_esc_hex_cmd), A
|
|
LD E, H
|
|
LD C, 0x10
|
|
LD D, 0x0
|
|
LAB_ram_ecc7:
|
|
ADD HL, HL
|
|
EX DE, HL
|
|
ADD HL, HL
|
|
EX DE, HL
|
|
LD A, D
|
|
JP C, LAB_ram_ecd3
|
|
CP B
|
|
JP C, LAB_ram_ecd6
|
|
LAB_ram_ecd3:
|
|
SUB B
|
|
LD D, A
|
|
INC HL
|
|
LAB_ram_ecd6:
|
|
DEC C
|
|
JP NZ, LAB_ram_ecc7
|
|
LD DE, 0x0
|
|
PUSH DE
|
|
PUSH HL
|
|
LD HL, (TM_VARS.m_esc_param_1)
|
|
EX DE, HL
|
|
LD C,B
|
|
CALL SUB_ram_ebe2
|
|
LD A, 0x80
|
|
LAB_ram_ece9:
|
|
RLCA
|
|
DEC B
|
|
JP P, LAB_ram_ece9
|
|
CPL
|
|
LD B, A
|
|
LAB_ram_ecf0:
|
|
POP DE
|
|
EX (SP), HL
|
|
LD A,H
|
|
ADD HL, DE
|
|
SUB H
|
|
CPL
|
|
INC A
|
|
EX (SP), HL
|
|
PUSH DE
|
|
PUSH BC
|
|
LD C, A
|
|
EX DE, HL
|
|
LD HL, (TM_VARS.m_curr_color)
|
|
EX DE, HL
|
|
LD A, 0x1
|
|
OUT (SYS_DD17PB), A
|
|
LD A, (TM_VARS.m_esc_hex_cmd)
|
|
OR A
|
|
JP NZ, LAB_ram_ed21
|
|
LAB_ram_ed0b:
|
|
LD A, (HL)
|
|
XOR E
|
|
AND B
|
|
XOR E
|
|
LD (HL), A
|
|
INC H
|
|
LD A, (HL)
|
|
XOR D
|
|
AND B
|
|
XOR D
|
|
LD (HL), A
|
|
DEC H
|
|
LD A, C
|
|
OR A
|
|
JP Z, LAB_ram_ed37
|
|
DEC C
|
|
DEC L
|
|
JP LAB_ram_ed0b
|
|
LAB_ram_ed21:
|
|
LD A, (HL)
|
|
XOR E
|
|
AND B
|
|
XOR E
|
|
LD (HL), A
|
|
INC H
|
|
LD A, (HL)
|
|
XOR D
|
|
AND B
|
|
XOR D
|
|
LD (HL), A
|
|
DEC H
|
|
LD A, C
|
|
OR A
|
|
JP Z, LAB_ram_ed37
|
|
DEC C
|
|
INC L
|
|
JP LAB_ram_ed21
|
|
LAB_ram_ed37:
|
|
XOR A
|
|
OUT (SYS_DD17PB), A
|
|
POP BC
|
|
LD A,B
|
|
SCF
|
|
RLA
|
|
JP C, LAB_ram_ed44
|
|
RLA
|
|
INC H
|
|
INC H
|
|
LAB_ram_ed44:
|
|
LD B, A
|
|
DEC C
|
|
JP NZ, LAB_ram_ecf0
|
|
POP HL
|
|
POP HL
|
|
RET
|
|
LAB_ram_ed4c:
|
|
LD C,H
|
|
CALL SUB_ram_ebe2
|
|
LD A, 0x80
|
|
LAB_ram_ed52:
|
|
RLCA
|
|
DEC B
|
|
JP P, LAB_ram_ed52
|
|
CPL
|
|
LD B, A
|
|
EX DE, HL
|
|
LD HL, (TM_VARS.m_curr_color)
|
|
EX DE, HL
|
|
POP AF
|
|
LD A, 0x1
|
|
OUT (SYS_DD17PB), A
|
|
JP C, LAB_ram_ed7c
|
|
LAB_ram_ed66:
|
|
LD A, (HL)
|
|
XOR E
|
|
AND B
|
|
XOR E
|
|
LD (HL), A
|
|
INC H
|
|
LD A, (HL)
|
|
XOR D
|
|
AND B
|
|
XOR D
|
|
LD (HL), A
|
|
DEC H
|
|
LD A, C
|
|
OR A
|
|
JP Z, LAB_ram_ed92
|
|
DEC C
|
|
DEC L
|
|
JP LAB_ram_ed66
|
|
LAB_ram_ed7c:
|
|
LD A, (HL)
|
|
XOR E
|
|
AND B
|
|
XOR E
|
|
LD (HL), A
|
|
INC H
|
|
LD A, (HL)
|
|
XOR D
|
|
AND B
|
|
XOR D
|
|
LD (HL), A
|
|
DEC H
|
|
LD A, C
|
|
OR A
|
|
JP Z, LAB_ram_ed92
|
|
DEC C
|
|
INC L
|
|
JP LAB_ram_ed7c
|
|
LAB_ram_ed92:
|
|
XOR A
|
|
OUT (SYS_DD17PB), A
|
|
RET
|
|
LAB_ram_ed96:
|
|
POP AF
|
|
LD C,L
|
|
LD A,L
|
|
OR A
|
|
JP NZ, LAB_ram_ed9e
|
|
INC C
|
|
LAB_ram_ed9e:
|
|
CALL SUB_ram_ebe2
|
|
LD A, 0x80
|
|
LAB_ram_eda3:
|
|
RLCA
|
|
DEC B
|
|
JP P, LAB_ram_eda3
|
|
CPL
|
|
LD B, A
|
|
EX DE, HL
|
|
LD HL, (TM_VARS.m_curr_color)
|
|
EX DE, HL
|
|
LD A, 0x1
|
|
OUT (SYS_DD17PB), A
|
|
LAB_ram_edb3:
|
|
LD A, (HL)
|
|
XOR E
|
|
AND B
|
|
XOR E
|
|
LD (HL), A
|
|
INC H
|
|
LD A, (HL)
|
|
XOR D
|
|
AND B
|
|
XOR D
|
|
LD (HL), A
|
|
DEC H
|
|
LD A,B
|
|
SCF
|
|
RLA
|
|
JP C, LAB_ram_edc8
|
|
RLA
|
|
INC H
|
|
INC H
|
|
LAB_ram_edc8:
|
|
LD B, A
|
|
DEC C
|
|
JP NZ, LAB_ram_edb3
|
|
XOR A
|
|
OUT (SYS_DD17PB), A
|
|
RET
|
|
esc_draw_dot:
|
|
LD HL, (TM_VARS.m_esc_param_1)
|
|
EX DE, HL
|
|
CALL SUB_ram_ebe2
|
|
LD A, 0x80
|
|
LAB_ram_edda:
|
|
RLCA
|
|
DEC B
|
|
JP P, LAB_ram_edda
|
|
LD B, A
|
|
EX DE, HL
|
|
LD HL, (TM_VARS.m_curr_color)
|
|
EX DE, HL
|
|
LD A, 0x1
|
|
OUT (SYS_DD17PB), A
|
|
LD A, (HL)
|
|
XOR B
|
|
LD (HL), A
|
|
INC H
|
|
LD A, (HL)
|
|
XOR B
|
|
LD (HL), A
|
|
XOR A
|
|
OUT (SYS_DD17PB), A
|
|
RET
|
|
esc_fn_b:
|
|
LD A, (TM_VARS.m_esc_param_3)
|
|
LD B, A
|
|
OR A
|
|
RET Z
|
|
LD A, 0x7f
|
|
CP B
|
|
RET M
|
|
XOR A
|
|
LD D, A
|
|
LD E,B
|
|
CALL SUB_ram_ee53
|
|
LD A, 0x1
|
|
LD H, A
|
|
SUB B
|
|
LD C, A
|
|
LD A,B
|
|
RLCA
|
|
LD B, A
|
|
LD A, 0x1
|
|
SUB B
|
|
LD L, A
|
|
CCF
|
|
LAB_ram_ee11:
|
|
INC D
|
|
LD A, E
|
|
CP D
|
|
JP Z,SUB_ram_ee53
|
|
CALL SUB_ram_ee53
|
|
LD A,H
|
|
ADD A, 0x2
|
|
LD H, A
|
|
LD A,L
|
|
ADD A, 0x2
|
|
LD L, A
|
|
LD A, C
|
|
ADD A,H
|
|
LD C, A
|
|
JP NC, LAB_ram_ee11
|
|
LAB_ram_ee28:
|
|
CCF
|
|
INC D
|
|
DEC E
|
|
LD A, D
|
|
CP E
|
|
JP Z,SUB_ram_ee53
|
|
SUB E
|
|
CP 0x1
|
|
RET Z
|
|
LD A, E
|
|
SUB D
|
|
CP 0x1
|
|
JP Z,SUB_ram_ee53
|
|
CALL SUB_ram_ee53
|
|
LD A,H
|
|
ADD A, 0x2
|
|
LD H, A
|
|
LD A,L
|
|
ADD A, 0x4
|
|
LD L, A
|
|
JP NC, LAB_ram_ee4a
|
|
CCF
|
|
LAB_ram_ee4a:
|
|
LD A, C
|
|
ADD A,L
|
|
LD C, A
|
|
JP NC, LAB_ram_ee11
|
|
JP LAB_ram_ee28
|
|
SUB_ram_ee53:
|
|
PUSH HL
|
|
PUSH DE
|
|
PUSH BC
|
|
PUSH DE
|
|
CALL SUB_ram_ee6f
|
|
LD HL, (TM_VARS.m_esc_param_1)
|
|
CALL SUB_ram_eedc
|
|
POP DE
|
|
CALL SUB_ram_ee8f
|
|
LD HL, (TM_VARS.m_esc_param_1)
|
|
CALL SUB_ram_ef0b
|
|
POP BC
|
|
POP DE
|
|
POP HL
|
|
XOR A
|
|
RET
|
|
SUB_ram_ee6f:
|
|
LD HL, (TM_VARS.m_esc_param_4)
|
|
LD A,L
|
|
OR A
|
|
LD C, D
|
|
LD B, E
|
|
JP NZ, LAB_ram_ee7f
|
|
LD A,H
|
|
OR A
|
|
JP NZ, LAB_ram_ee88
|
|
RET
|
|
LAB_ram_ee7f:
|
|
LD A,H
|
|
LD H,L
|
|
LD E, C
|
|
OFF_ram_ee82:
|
|
CALL SUB_ram_eeaf
|
|
LD C, E
|
|
OR A
|
|
RET Z
|
|
LAB_ram_ee88:
|
|
LD H, A
|
|
LD E,B
|
|
CALL SUB_ram_eeaf
|
|
LD B, E
|
|
RET
|
|
SUB_ram_ee8f:
|
|
LD HL, (TM_VARS.m_esc_param_4)
|
|
LD A,L
|
|
OR A
|
|
LD C, D
|
|
LD B, E
|
|
JP NZ, LAB_ram_ee9f
|
|
LD A,H
|
|
OR A
|
|
JP NZ, LAB_ram_eea8
|
|
RET
|
|
LAB_ram_ee9f:
|
|
LD A,H
|
|
LD H,L
|
|
LD E,B
|
|
CALL SUB_ram_eeaf
|
|
LD B, E
|
|
OR A
|
|
RET Z
|
|
LAB_ram_eea8:
|
|
LD H, A
|
|
LD E, C
|
|
CALL SUB_ram_eeaf
|
|
LD C, E
|
|
RET
|
|
SUB_ram_eeaf:
|
|
LD D, 0x0
|
|
LD L, D
|
|
ADD HL, HL
|
|
JP NC, LAB_ram_eeb7
|
|
ADD HL, DE
|
|
LAB_ram_eeb7:
|
|
ADD HL, HL
|
|
JP NC, LAB_ram_eebc
|
|
ADD HL, DE
|
|
LAB_ram_eebc:
|
|
ADD HL, HL
|
|
JP NC, LAB_ram_eec1
|
|
ADD HL, DE
|
|
LAB_ram_eec1:
|
|
ADD HL, HL
|
|
JP NC, LAB_ram_eec6
|
|
ADD HL, DE
|
|
LAB_ram_eec6:
|
|
ADD HL, HL
|
|
JP NC, LAB_ram_eecb
|
|
ADD HL, DE
|
|
LAB_ram_eecb:
|
|
ADD HL, HL
|
|
JP NC, LAB_ram_eed0
|
|
ADD HL, DE
|
|
LAB_ram_eed0:
|
|
ADD HL, HL
|
|
JP NC, LAB_ram_eed5
|
|
ADD HL, DE
|
|
LAB_ram_eed5:
|
|
ADD HL, HL
|
|
JP NC, LAB_ram_eeda
|
|
ADD HL, DE
|
|
LAB_ram_eeda:
|
|
LD E,H
|
|
RET
|
|
SUB_ram_eedc:
|
|
LD A,H
|
|
ADD A,B
|
|
JP C, LAB_ram_eee8
|
|
LD D, A
|
|
LD A,L
|
|
ADD A, C
|
|
LD E, A
|
|
CALL SUB_ram_ef3a
|
|
LAB_ram_eee8:
|
|
LD A,H
|
|
ADD A,B
|
|
JP C, LAB_ram_eef4
|
|
LD D, A
|
|
LD A,L
|
|
SUB C
|
|
LD E, A
|
|
CALL SUB_ram_ef3a
|
|
LAB_ram_eef4:
|
|
LD A,H
|
|
SUB B
|
|
JP C, LAB_ram_ef00
|
|
LD D, A
|
|
LD A,L
|
|
SUB C
|
|
LD E, A
|
|
CALL SUB_ram_ef3a
|
|
LAB_ram_ef00:
|
|
LD A,H
|
|
SUB B
|
|
RET C
|
|
LD D, A
|
|
LD A,L
|
|
ADD A, C
|
|
LD E, A
|
|
CALL SUB_ram_ef3a
|
|
RET
|
|
SUB_ram_ef0b:
|
|
LD A,H
|
|
ADD A, C
|
|
JP C, LAB_ram_ef17
|
|
LD D, A
|
|
LD A,L
|
|
ADD A,B
|
|
LD E, A
|
|
CALL SUB_ram_ef3a
|
|
LAB_ram_ef17:
|
|
LD A,H
|
|
ADD A, C
|
|
JP C, LAB_ram_ef23
|
|
LD D, A
|
|
LD A,L
|
|
SUB B
|
|
LD E, A
|
|
CALL SUB_ram_ef3a
|
|
LAB_ram_ef23:
|
|
LD A,H
|
|
SUB C
|
|
JP C, LAB_ram_ef2f
|
|
LD D, A
|
|
LD A,L
|
|
SUB B
|
|
LD E, A
|
|
CALL SUB_ram_ef3a
|
|
LAB_ram_ef2f:
|
|
LD A,H
|
|
SUB C
|
|
RET C
|
|
LD D, A
|
|
LD A,L
|
|
ADD A,B
|
|
LD E, A
|
|
CALL SUB_ram_ef3a
|
|
RET
|
|
SUB_ram_ef3a:
|
|
RET C
|
|
PUSH HL
|
|
PUSH BC
|
|
CALL SUB_ram_ebe2
|
|
LD A, 0x80
|
|
LAB_ram_ef42:
|
|
RLCA
|
|
DEC B
|
|
JP P, LAB_ram_ef42
|
|
CPL
|
|
LD B, A
|
|
EX DE, HL
|
|
LD HL, (TM_VARS.m_curr_color)
|
|
EX DE, HL
|
|
LD A, 0x1
|
|
OUT (SYS_DD17PB), A
|
|
LD A, (HL)
|
|
XOR E
|
|
AND B
|
|
XOR E
|
|
LD (HL), A
|
|
INC H
|
|
LD A, (HL)
|
|
XOR D
|
|
AND B
|
|
XOR D
|
|
LD (HL), A
|
|
XOR A
|
|
OUT (SYS_DD17PB), A
|
|
POP BC
|
|
POP HL
|
|
RET
|
|
|
|
; Full charset, Common + Latin letters
|
|
m_font_cp0:
|
|
db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04
|
|
db 0x04, 0x04, 0x04, 0x00, 0x00, 0x04, 0x14, 0x14
|
|
db 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x0A, 0x1F
|
|
db 0x0A, 0x1F, 0x0A, 0x0A, 0x04, 0x1E, 0x05, 0x0E
|
|
db 0x14, 0x0F, 0x04, 0x03, 0x13, 0x08, 0x04, 0x02
|
|
db 0x19, 0x18, 0x06, 0x09, 0x05, 0x02, 0x15, 0x09
|
|
db 0x16, 0x06, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00
|
|
db 0x08, 0x04, 0x02, 0x02, 0x02, 0x04, 0x08, 0x02
|
|
db 0x04, 0x08, 0x08, 0x08, 0x04, 0x02, 0x00, 0x0A
|
|
db 0x04, 0x1F, 0x04, 0x0A, 0x00, 0x00, 0x04, 0x04
|
|
db 0x1F, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00
|
|
db 0x06, 0x04, 0x02, 0x00, 0x00, 0x00, 0x1F, 0x00
|
|
db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06
|
|
db 0x06, 0x00, 0x10, 0x08, 0x04, 0x02, 0x01, 0x00
|
|
db 0x0E, 0x11, 0x19, 0x15, 0x13, 0x11, 0x0E, 0x04
|
|
db 0x06, 0x04, 0x04, 0x04, 0x04, 0x0E, 0x0E, 0x11
|
|
db 0x10, 0x08, 0x04, 0x02, 0x1F, 0x1F, 0x08, 0x04
|
|
db 0x08, 0x10, 0x11, 0x0E, 0x08, 0x0C, 0x0A, 0x09
|
|
db 0x1F, 0x08, 0x08, 0x1F, 0x01, 0x0F, 0x10, 0x10
|
|
db 0x11, 0x0E, 0x0C, 0x02, 0x01, 0x0F, 0x11, 0x11
|
|
db 0x0E, 0x1F, 0x10, 0x08, 0x04, 0x02, 0x02, 0x02
|
|
db 0x0E, 0x11, 0x11, 0x0E, 0x11, 0x11, 0x0E, 0x0E
|
|
db 0x11, 0x11, 0x1E, 0x10, 0x08, 0x06, 0x00, 0x06
|
|
db 0x06, 0x00, 0x06, 0x06, 0x00, 0x00, 0x06, 0x06
|
|
db 0x00, 0x06, 0x04, 0x02, 0x08, 0x04, 0x02, 0x01
|
|
db 0x02, 0x04, 0x08, 0x00, 0x00, 0x1F, 0x00, 0x1F
|
|
db 0x00, 0x00, 0x02, 0x04, 0x08, 0x10, 0x08, 0x04
|
|
db 0x02, 0x0E, 0x11, 0x10, 0x08, 0x04, 0x00, 0x04
|
|
db 0x0E, 0x11, 0x10, 0x16, 0x15, 0x15, 0x0E, 0x04
|
|
db 0x0A, 0x11, 0x11, 0x1F, 0x11, 0x11, 0x0F, 0x11
|
|
db 0x11, 0x0F, 0x11, 0x11, 0x0F, 0x0E, 0x11, 0x01
|
|
db 0x01, 0x01, 0x11, 0x0E, 0x07, 0x09, 0x11, 0x11
|
|
db 0x11, 0x09, 0x07, 0x1F, 0x01, 0x01, 0x0F, 0x01
|
|
db 0x01, 0x1F, 0x1F, 0x01, 0x01, 0x0F, 0x01, 0x01
|
|
db 0x01, 0x0E, 0x11, 0x01, 0x1D, 0x11, 0x11, 0x1E
|
|
db 0x11, 0x11, 0x11, 0x1F, 0x11, 0x11, 0x11, 0x0E
|
|
db 0x04, 0x04, 0x04, 0x04, 0x04, 0x0E, 0x1C, 0x08
|
|
db 0x08, 0x08, 0x08, 0x09, 0x06, 0x11, 0x09, 0x05
|
|
db 0x03, 0x05, 0x09, 0x11, 0x01, 0x01, 0x01, 0x01
|
|
db 0x01, 0x01, 0x1F, 0x11, 0x1B, 0x15, 0x15, 0x11
|
|
db 0x11, 0x11, 0x11, 0x11, 0x13, 0x15, 0x19, 0x11
|
|
db 0x11, 0x0E, 0x11, 0x11, 0x11, 0x11, 0x11, 0x0E
|
|
db 0x0F, 0x11, 0x11, 0x0F, 0x01, 0x01, 0x01, 0x0E
|
|
db 0x11, 0x11, 0x11, 0x15, 0x09, 0x16, 0x0F, 0x11
|
|
db 0x11, 0x0F, 0x05, 0x09, 0x11, 0x1E, 0x01, 0x01
|
|
db 0x0E, 0x10, 0x10, 0x0F, 0x1F, 0x04, 0x04, 0x04
|
|
db 0x04, 0x04, 0x04, 0x11, 0x11, 0x11, 0x11, 0x11
|
|
db 0x11, 0x0E, 0x11, 0x11, 0x11, 0x11, 0x0A, 0x0A
|
|
db 0x04, 0x11, 0x11, 0x11, 0x15, 0x15, 0x15, 0x0A
|
|
db 0x11, 0x11, 0x0A, 0x04, 0x0A, 0x11, 0x11, 0x11
|
|
db 0x11, 0x11, 0x0A, 0x04, 0x04, 0x04, 0x1F, 0x10
|
|
db 0x08, 0x04, 0x02, 0x01, 0x1F, 0x0E, 0x02, 0x02
|
|
db 0x02, 0x02, 0x02, 0x0E, 0x00, 0x01, 0x02, 0x04
|
|
db 0x08, 0x10, 0x00, 0x0E, 0x08, 0x08, 0x08, 0x08
|
|
db 0x08, 0x0E, 0x0E, 0x11, 0x00, 0x00, 0x00, 0x00
|
|
db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F
|
|
db 0x1C, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00
|
|
db 0x00, 0x0E, 0x10, 0x1E, 0x13, 0x1E, 0x01, 0x01
|
|
db 0x0D, 0x13, 0x11, 0x11, 0x0F, 0x00, 0x00, 0x0E
|
|
db 0x01, 0x01, 0x01, 0x0E, 0x10, 0x10, 0x16, 0x19
|
|
db 0x11, 0x11, 0x1E, 0x00, 0x00, 0x0E, 0x11, 0x1F
|
|
db 0x01, 0x0E, 0x18, 0x04, 0x04, 0x0E, 0x04, 0x04
|
|
db 0x04, 0x00, 0x0E, 0x11, 0x11, 0x1E, 0x10, 0x0E
|
|
db 0x01, 0x01, 0x0D, 0x13, 0x11, 0x11, 0x11, 0x04
|
|
db 0x00, 0x04, 0x04, 0x04, 0x04, 0x04, 0x08, 0x00
|
|
db 0x08, 0x08, 0x08, 0x08, 0x06, 0x01, 0x01, 0x09
|
|
db 0x05, 0x03, 0x05, 0x09, 0x04, 0x04, 0x04, 0x04
|
|
db 0x04, 0x04, 0x08, 0x00, 0x00, 0x0F, 0x15, 0x15
|
|
db 0x15, 0x15, 0x00, 0x00, 0x09, 0x13, 0x11, 0x11
|
|
db 0x11, 0x00, 0x00, 0x0E, 0x11, 0x11, 0x11, 0x0E
|
|
db 0x00, 0x00, 0x0E, 0x11, 0x11, 0x0F, 0x01, 0x00
|
|
db 0x00, 0x0E, 0x11, 0x11, 0x1E, 0x10, 0x00, 0x00
|
|
db 0x0D, 0x13, 0x01, 0x01, 0x01, 0x00, 0x00, 0x1E
|
|
db 0x01, 0x0E, 0x10, 0x0F, 0x04, 0x04, 0x0E, 0x04
|
|
db 0x04, 0x04, 0x18, 0x00, 0x00, 0x11, 0x11, 0x11
|
|
db 0x19, 0x16, 0x00, 0x00, 0x11, 0x11, 0x0A, 0x0A
|
|
db 0x04, 0x00, 0x00, 0x11, 0x15, 0x15, 0x15, 0x0A
|
|
db 0x00, 0x00, 0x11, 0x0A, 0x04, 0x0A, 0x11, 0x00
|
|
db 0x00, 0x11, 0x11, 0x1E, 0x10, 0x0C, 0x00, 0x00
|
|
db 0x1F, 0x08, 0x04, 0x02, 0x1F, 0x10, 0x08, 0x08
|
|
db 0x04, 0x08, 0x08, 0x10, 0x04, 0x04, 0x04, 0x04
|
|
db 0x04, 0x04, 0x04, 0x04, 0x08, 0x08, 0x10, 0x08
|
|
db 0x08, 0x04, 0x00, 0x02, 0x15, 0x08, 0x00, 0x00
|
|
db 0x00, 0x15, 0x00, 0x15, 0x00, 0x15, 0x00, 0x15
|
|
db 0x00, 0x00, 0x09, 0x15, 0x17, 0x15, 0x09, 0x00
|
|
db 0x00, 0x06, 0x08, 0x0E, 0x09, 0x16, 0x06, 0x01
|
|
db 0x01, 0x06, 0x09, 0x09, 0x06, 0x00, 0x00, 0x09
|
|
db 0x09, 0x09, 0x1F, 0x10, 0x00, 0x00, 0x0E, 0x0A
|
|
db 0x0A, 0x1F, 0x11, 0x00, 0x00, 0x0E, 0x11, 0x1F
|
|
db 0x01, 0x1E, 0x00, 0x04, 0x0E, 0x15, 0x15, 0x0E
|
|
db 0x04, 0x00, 0x00, 0x0F, 0x09, 0x01, 0x01, 0x01
|
|
db 0x00, 0x00, 0x11, 0x0A, 0x04, 0x0A, 0x11, 0x00
|
|
db 0x00, 0x11, 0x19, 0x15, 0x13, 0x11, 0x0A, 0x04
|
|
db 0x11, 0x19, 0x15, 0x13, 0x11, 0x00, 0x00, 0x11
|
|
db 0x09, 0x07, 0x09, 0x11, 0x00, 0x00, 0x1C, 0x12
|
|
db 0x12, 0x12, 0x11, 0x00, 0x00, 0x11, 0x1B, 0x15
|
|
db 0x11, 0x11, 0x00, 0x00, 0x11, 0x11, 0x1F, 0x11
|
|
db 0x11, 0x00, 0x00, 0x0E, 0x11, 0x11, 0x11, 0x0E
|
|
db 0x00, 0x00, 0x1F, 0x11, 0x11, 0x11, 0x11, 0x00
|
|
db 0x00, 0x1E, 0x11, 0x1E, 0x14, 0x12, 0x00, 0x00
|
|
db 0x07, 0x09, 0x07, 0x01, 0x01, 0x00, 0x00, 0x0E
|
|
db 0x01, 0x01, 0x01, 0x0E, 0x00, 0x00, 0x1F, 0x04
|
|
db 0x04, 0x04, 0x04, 0x00, 0x00, 0x11, 0x11, 0x1E
|
|
db 0x10, 0x0E, 0x00, 0x00, 0x15, 0x15, 0x0E, 0x15
|
|
db 0x15, 0x00, 0x00, 0x03, 0x05, 0x07, 0x09, 0x07
|
|
db 0x00, 0x00, 0x01, 0x01, 0x07, 0x09, 0x07, 0x00
|
|
db 0x00, 0x11, 0x11, 0x13, 0x15, 0x13, 0x00, 0x00
|
|
db 0x0E, 0x11, 0x0C, 0x11, 0x0E, 0x00, 0x00, 0x15
|
|
db 0x15, 0x15, 0x15, 0x1F, 0x00, 0x00, 0x07, 0x08
|
|
db 0x0E, 0x08, 0x07, 0x00, 0x00, 0x15, 0x15, 0x15
|
|
db 0x1F, 0x10, 0x00, 0x00, 0x09, 0x09, 0x0E, 0x08
|
|
db 0x08, 0x00, 0x00, 0x06, 0x05, 0x0C, 0x14, 0x0C
|
|
|
|
; 32 chars cp=1 (Russian letters)
|
|
m_font_matrix_cp2:
|
|
db 0x09, 0x15, 0x15, 0x17, 0x15, 0x15, 0x09, 0x04
|
|
db 0x0A, 0x11, 0x11, 0x1F, 0x11, 0x11, 0x1F, 0x11
|
|
db 0x01, 0x0F, 0x11, 0x11, 0x1F, 0x09, 0x09, 0x09
|
|
db 0x09, 0x09, 0x1F, 0x10, 0x0C, 0x0A, 0x0A, 0x0A
|
|
db 0x0A, 0x1F, 0x11, 0x1F, 0x01, 0x01, 0x0F, 0x01
|
|
db 0x01, 0x1F, 0x04, 0x0E, 0x15, 0x15, 0x15, 0x0E
|
|
db 0x04, 0x1F, 0x11, 0x01, 0x01, 0x01, 0x01, 0x01
|
|
db 0x11, 0x11, 0x0A, 0x04, 0x0A, 0x11, 0x11, 0x11
|
|
db 0x11, 0x19, 0x15, 0x13, 0x11, 0x11, 0x04, 0x15
|
|
db 0x11, 0x19, 0x15, 0x13, 0x11, 0x11, 0x09, 0x05
|
|
db 0x03, 0x05, 0x09, 0x11, 0x1C, 0x12, 0x12, 0x12
|
|
db 0x12, 0x12, 0x11, 0x11, 0x1B, 0x15, 0x15, 0x11
|
|
db 0x11, 0x11, 0x11, 0x11, 0x11, 0x1F, 0x11, 0x11
|
|
db 0x11, 0x0E, 0x11, 0x11, 0x11, 0x11, 0x11, 0x0E
|
|
db 0x1F, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x1E
|
|
db 0x11, 0x11, 0x11, 0x1E, 0x12, 0x11, 0x0F, 0x11
|
|
db 0x11, 0x11, 0x0F, 0x01, 0x01, 0x0E, 0x11, 0x01
|
|
db 0x01, 0x01, 0x11, 0x0E, 0x1F, 0x04, 0x04, 0x04
|
|
db 0x04, 0x04, 0x04, 0x11, 0x11, 0x11, 0x11, 0x1E
|
|
db 0x10, 0x0E, 0x15, 0x15, 0x15, 0x0E, 0x15, 0x15
|
|
db 0x15, 0x0F, 0x11, 0x11, 0x0F, 0x11, 0x11, 0x0F
|
|
db 0x01, 0x01, 0x01, 0x0F, 0x11, 0x11, 0x0F, 0x11
|
|
db 0x11, 0x11, 0x13, 0x15, 0x15, 0x13, 0x0E, 0x11
|
|
db 0x10, 0x0C, 0x10, 0x11, 0x0E, 0x15, 0x15, 0x15
|
|
db 0x15, 0x15, 0x15, 0x1F, 0x0E, 0x11, 0x10, 0x1C
|
|
db 0x10, 0x11, 0x0E, 0x15, 0x15, 0x15, 0x15, 0x15
|
|
db 0x1F, 0x10, 0x11, 0x11, 0x11, 0x1E, 0x10, 0x10
|
|
db 0x10, 0x1F, 0x15, 0x1F, 0x15, 0x1F, 0x15, 0x1C
|
|
|
|
m_print_write:
|
|
LD SP, m_font_cp0+28
|
|
ds 24, 0xFF
|
|
|
|
m_ramdisk_read:
|
|
PUSH HL
|
|
PUSH DE
|
|
LD A, D
|
|
AND 0x1
|
|
OR 0x2
|
|
LD B, A
|
|
XOR A
|
|
LD A, E
|
|
RRA
|
|
LD D, A
|
|
LD A, 0x0
|
|
RRA
|
|
LD E, A
|
|
LAB_ram_f3ee:
|
|
LD A,B
|
|
OUT (SYS_DD17PB), A
|
|
LD A, (DE)
|
|
LD C, A
|
|
XOR A
|
|
OUT (SYS_DD17PB), A
|
|
LD (HL), C
|
|
INC HL
|
|
INC DE
|
|
LD A, E
|
|
ADD A, A
|
|
JP NZ, LAB_ram_f3ee
|
|
XOR A
|
|
OUT (SYS_DD17PB), A
|
|
POP DE
|
|
POP HL
|
|
RET
|
|
m_ramdisk_write:
|
|
PUSH HL
|
|
PUSH DE
|
|
LD A, D
|
|
AND 0x1
|
|
OR 0x2
|
|
LD B, A
|
|
XOR A
|
|
LD A, E
|
|
RRA
|
|
LD D, A
|
|
LD A, 0x0
|
|
RRA
|
|
LD E, A
|
|
LAB_ram_f414:
|
|
XOR A
|
|
OUT (SYS_DD17PB), A
|
|
LD C, (HL)
|
|
LD A,B
|
|
OUT (SYS_DD17PB), A
|
|
LD A, C
|
|
LD (DE), A
|
|
INC HL
|
|
INC DE
|
|
LD A, E
|
|
ADD A, A
|
|
JP NZ, LAB_ram_f414
|
|
XOR A
|
|
OUT (SYS_DD17PB), A
|
|
POP DE
|
|
POP HL
|
|
RET
|
|
|
|
; ------------------------------------------------------
|
|
; Write block to Tape
|
|
; In: DE - block ID,
|
|
; HL -> block of data.
|
|
; ------------------------------------------------------
|
|
m_tape_write:
|
|
PUSH HL
|
|
PUSH DE
|
|
PUSH DE
|
|
LD BC,2550
|
|
LD A,PIC_POLL_MODE ; pool mode
|
|
OUT (PIC_DD75RS), A
|
|
LD A,TMR0_SQWAVE ; tmr0, load lsb+msb, sq wave, bin
|
|
OUT (TMR_DD70CTR), A
|
|
LD A, C
|
|
OUT (TMR_DD70C1), A
|
|
LD A,B
|
|
OUT (TMR_DD70C1), A
|
|
; Write Hi+Lo, Hi+Lo
|
|
LD DE, 0x4 ; repeat next 4 times
|
|
tw_wait_t0_l1:
|
|
IN A, (PIC_DD75RS)
|
|
AND TIMER_IRQ ; check rst4 from timer#0
|
|
JP NZ,tw_wait_t0_l1
|
|
LD A, D
|
|
CPL
|
|
LD D, A
|
|
OR A
|
|
LD A,TL_HIGH ; tape level hi
|
|
JP NZ,tw_set_tape_lvl
|
|
LD A,TL_LOW ; tape level low
|
|
tw_set_tape_lvl:
|
|
OUT (DD67PC), A ; set tape level
|
|
LD A,TMR0_SQWAVE ; tmr0, load lsb+msb, swq, bin
|
|
; timer on
|
|
OUT (TMR_DD70CTR), A
|
|
LD A, C
|
|
OUT (TMR_DD70C1), A
|
|
LD A,B
|
|
OUT (TMR_DD70C1), A
|
|
DEC E
|
|
JP NZ,tw_wait_t0_l1
|
|
tw_wait_t0_l2:
|
|
IN A, (PIC_DD75RS)
|
|
AND TIMER_IRQ
|
|
JP NZ,tw_wait_t0_l2
|
|
; Write 00 at start
|
|
LD A, 0x0
|
|
CALL m_tape_wr_byte
|
|
; Write 0xF5 marker
|
|
LD A, 0xf5
|
|
CALL m_tape_wr_byte
|
|
LD E, 0x0 ; checksum=0
|
|
; Write block ID
|
|
POP BC
|
|
LD A, C
|
|
CALL m_tape_wr_byte
|
|
LD A,B
|
|
CALL m_tape_wr_byte
|
|
; Write 128 data bytes
|
|
LD B,128
|
|
tw_wr_next_byte:
|
|
LD A, (HL)
|
|
CALL m_tape_wr_byte
|
|
INC HL
|
|
DEC B
|
|
JP NZ,tw_wr_next_byte
|
|
; Write checksum
|
|
LD A, E
|
|
CALL m_tape_wr_byte
|
|
; Write final zero byte
|
|
LD A, 0x0
|
|
CALL m_tape_wr_byte
|
|
tw_wait_t0_l3:
|
|
IN A, (PIC_DD75RS)
|
|
AND TIMER_IRQ
|
|
JP NZ,tw_wait_t0_l3
|
|
LD A,TL_MID ; tape level middle
|
|
OUT (DD67PC), A
|
|
POP DE
|
|
POP HL
|
|
RET
|
|
; ------------------------------------------------------
|
|
; Write byte to tape
|
|
; Inp: A - byte top write
|
|
; D - current level
|
|
; E - current checksum
|
|
; ------------------------------------------------------
|
|
m_tape_wr_byte:
|
|
PUSH BC
|
|
; calc checksum
|
|
LD B, A
|
|
LD A, E
|
|
SUB B
|
|
LD E, A
|
|
LD C,8 ; 8 bit in byte
|
|
twb_get_bit:
|
|
LD A,B
|
|
RRA
|
|
LD B, A
|
|
JP C,twb_bit_hi
|
|
twb_wait_t0_l1:
|
|
IN A, (PIC_DD75RS)
|
|
AND TIMER_IRQ
|
|
JP NZ,twb_wait_t0_l1
|
|
LD A,TMR0_SQWAVE
|
|
OUT (TMR_DD70CTR), A
|
|
; program for 360 cycles
|
|
LD A, 0x68
|
|
OUT (TMR_DD70C1), A
|
|
LD A, 0x1
|
|
OUT (TMR_DD70C1), A
|
|
; change amplitude
|
|
LD A, D
|
|
CPL
|
|
LD D, A
|
|
OR A
|
|
LD A,TL_HIGH
|
|
JP NZ,twb_out_bit_l1
|
|
LD A,TL_LOW
|
|
twb_out_bit_l1:
|
|
OUT (DD67PC), A
|
|
DEC C
|
|
JP NZ,twb_get_bit
|
|
POP BC
|
|
RET
|
|
twb_bit_hi:
|
|
IN A, (PIC_DD75RS)
|
|
AND TIMER_IRQ
|
|
JP NZ,twb_bit_hi
|
|
; program for 660 cycles
|
|
LD A,TMR0_SQWAVE
|
|
OUT (TMR_DD70CTR), A
|
|
LD A, 0x94
|
|
OUT (TMR_DD70C1), A
|
|
LD A, 0x2
|
|
OUT (TMR_DD70C1), A
|
|
; change amplitude
|
|
LD A, D
|
|
CPL
|
|
LD D, A
|
|
OR A
|
|
LD A,TL_HIGH
|
|
JP NZ,twb_out_bit_l2
|
|
LD A,TL_LOW
|
|
twb_out_bit_l2:
|
|
OUT (DD67PC), A
|
|
DEC C
|
|
JP NZ,twb_get_bit
|
|
POP BC
|
|
RET
|
|
|
|
; ------------------------------------------------------
|
|
; Load block from Tape
|
|
; In: HL -> buffer to receive bytes from Tape
|
|
; Out: A = 0 - ok,
|
|
; 1 - CRC error,
|
|
; 2 - unexpected block Id
|
|
; 4 - key pressed
|
|
; ------------------------------------------------------
|
|
m_tape_read:
|
|
PUSH HL
|
|
PUSH DE
|
|
LD A,PIC_POLL_MODE ; pool mode
|
|
OUT (PIC_DD75RS), A
|
|
LD A,TMR0_SQWAVE
|
|
OUT (TMR_DD70CTR), A ; tmr0, load lsb+msb, sq wave
|
|
LD A, 0x0
|
|
; tmr0 load 0x0000
|
|
OUT (TMR_DD70C1), A
|
|
OUT (TMR_DD70C1), A
|
|
LD C,3
|
|
tr_wait_3_changes:
|
|
CALL ccp_read_tape_bit_kbd
|
|
INC A
|
|
JP Z,tr_key_pressed_l0
|
|
LD A,B
|
|
ADD A,4
|
|
JP P,tr_wait_3_changes
|
|
DEC C
|
|
JP NZ,tr_wait_3_changes
|
|
tr_wait_4th_change:
|
|
CALL ccp_read_tape_bit_kbd
|
|
INC A
|
|
JP Z,tr_key_pressed_l0
|
|
LD A,B
|
|
ADD A,4
|
|
JP M,tr_wait_4th_change
|
|
LD C, 0x0
|
|
tr_wait_f5_marker:
|
|
CALL ccp_read_tape_bit_kbd
|
|
INC A
|
|
JP Z,tr_key_pressed_l0
|
|
DEC A
|
|
RRA
|
|
LD A, C
|
|
RRA
|
|
LD C, A
|
|
CP 0xf5
|
|
JP NZ,tr_wait_f5_marker
|
|
LD E, 0x0 ; checksum = 0
|
|
; Read blk ID
|
|
CALL m_tape_read_byte
|
|
JP NC,tr_err_read_id
|
|
LD C, D
|
|
CALL m_tape_read_byte
|
|
JP NC,tr_err_read_id
|
|
LD B, D
|
|
PUSH BC
|
|
; Read block, 128 bytes
|
|
LD C,128
|
|
tr_read_next_b:
|
|
CALL m_tape_read_byte
|
|
JP NC,tr_err_read_blk
|
|
LD (HL), D
|
|
INC HL
|
|
DEC C
|
|
JP NZ,tr_read_next_b
|
|
|
|
; Read checksum
|
|
CALL m_tape_read_byte
|
|
JP NC,tr_err_read_blk
|
|
LD A, E
|
|
OR A
|
|
JP Z,tr_checksum_ok
|
|
LD A, 0x1 ; bad checksum
|
|
tr_checksum_ok:
|
|
POP BC
|
|
tr_return:
|
|
POP DE
|
|
POP HL
|
|
RET
|
|
tr_err_read_blk:
|
|
POP BC
|
|
LD BC, 0x0
|
|
tr_err_read_id:
|
|
LD A, 0x2 ; read error
|
|
JP tr_return
|
|
tr_key_pressed_l0:
|
|
CALL tm_con_in
|
|
LD C, A ; store key code in C
|
|
LD B, 0x0
|
|
LD A, 0x4
|
|
JP tr_return
|
|
m_tape_read_byte:
|
|
PUSH BC
|
|
|
|
; ------------------------------------------------------
|
|
; Read byte from Tape
|
|
; Out: D - byte
|
|
; CF is set if ok, cleared if error
|
|
; ------------------------------------------------------
|
|
LD C,8
|
|
trb_next_bit:
|
|
CALL ccp_read_tape_bit
|
|
; push bit from lo to hi in D
|
|
RRA
|
|
LD A, D
|
|
RRA
|
|
LD D, A
|
|
LD A,4
|
|
ADD A,B
|
|
JP NC,trb_ret_err
|
|
DEC C
|
|
JP NZ,trb_next_bit
|
|
; calc checksum
|
|
LD A, D
|
|
ADD A, E
|
|
LD E, A
|
|
SCF
|
|
trb_ret_err:
|
|
POP BC
|
|
RET
|
|
|
|
; ------------------------------------------------------
|
|
; Read bit from tape
|
|
; Out: A - bit from tape
|
|
; B - time from last bit
|
|
; ------------------------------------------------------
|
|
ccp_read_tape_bit:
|
|
IN A, (KBD_DD78PB) ; Read Tape bit 5 (data)
|
|
AND TAPE_P
|
|
LD B, A
|
|
rtb_wait_change:
|
|
IN A, (KBD_DD78PB)
|
|
AND TAPE_P
|
|
CP B
|
|
JP Z,rtb_wait_change
|
|
LD A,TMR0_SQWAVE
|
|
OUT (TMR_DD70CTR), A
|
|
; [360...480...660] 0x220=544d
|
|
IN A, (TMR_DD70C1) ; get tmer#0 lsb
|
|
ADD A, 0x20
|
|
IN A, (TMR_DD70C1) ; get tmer#0 msb
|
|
LD B, A
|
|
ADC A, 0x2
|
|
; reset timer to 0
|
|
LD A, 0x0
|
|
OUT (TMR_DD70C1), A
|
|
OUT (TMR_DD70C1), A
|
|
; For 0 - 65535-360+544 -> overflow P/V=1
|
|
; For 1 - 65535-660+544 -> no overflow P/V=0
|
|
RET P
|
|
INC A
|
|
RET
|
|
|
|
; ------------------------------------------------------
|
|
; Read bit from tape with keyboard interruption
|
|
; Out: A - bit from tape
|
|
; B - time from last bit
|
|
; ------------------------------------------------------
|
|
ccp_read_tape_bit_kbd:
|
|
IN A, (KBD_DD78PB)
|
|
AND TAPE_P
|
|
LD B, A ; save tape bit state
|
|
; wait change with keyboard check
|
|
twc_wait_change:
|
|
IN A, (PIC_DD75RS)
|
|
AND KBD_IRQ
|
|
JP NZ,twc_key_pressed
|
|
IN A, (KBD_DD78PB)
|
|
AND TAPE_P
|
|
CP B
|
|
JP Z,twc_wait_change
|
|
; measure time
|
|
LD A,TMR0_SQWAVE
|
|
OUT (TMR_DD70CTR), A
|
|
; read lsb+msb
|
|
IN A, (TMR_DD70C1)
|
|
ADD A, 0x20
|
|
IN A, (TMR_DD70C1)
|
|
LD B, A
|
|
ADC A, 0x2
|
|
; reset timer#0
|
|
LD A, 0x0
|
|
OUT (TMR_DD70C1), A
|
|
OUT (TMR_DD70C1), A
|
|
; flag P/V is set for 0
|
|
RET P
|
|
INC A
|
|
RET
|
|
twc_key_pressed:
|
|
LD A, 0xff
|
|
RET
|
|
|
|
; ------------------------------------------------------
|
|
; Wait tape block
|
|
; Inp: A - periods to wait
|
|
; Out: A=4 - interrupded by keyboard, C=key
|
|
; ------------------------------------------------------
|
|
m_tape_wait:
|
|
OR A
|
|
RET Z
|
|
PUSH DE
|
|
LD B, A
|
|
m_wait_t4:
|
|
LD C,B
|
|
IN A, (KBD_DD78PB)
|
|
AND TAPE_P ; Get TAPE4 (Wait det) and save
|
|
LD E, A ; store T4 state to E
|
|
m_wait_next_2ms:
|
|
LD A,TMR0_SQWAVE
|
|
OUT (TMR_DD70CTR), A
|
|
; load 3072 = 2ms
|
|
XOR A
|
|
OUT (TMR_DD70C1), A
|
|
LD A, 0xc
|
|
OUT (TMR_DD70C1), A
|
|
m_wait_tmr_key:
|
|
IN A, (PIC_DD75RS)
|
|
AND KBD_IRQ ; RST1 flag (keyboard)
|
|
JP NZ,mt_key_pressed
|
|
IN A, (PIC_DD75RS)
|
|
AND TIMER_IRQ ; RST4 flag (timer out)
|
|
JP Z,m_wait_no_rst4
|
|
IN A, (KBD_DD78PB)
|
|
AND TAPE_P ; TAPE4 not changed?
|
|
CP E
|
|
JP NZ,m_wait_t4 ; continue wait
|
|
JP m_wait_tmr_key
|
|
m_wait_no_rst4:
|
|
DEC C
|
|
JP NZ,m_wait_next_2ms
|
|
XOR A
|
|
POP DE
|
|
RET
|
|
mt_key_pressed:
|
|
CALL tm_con_in
|
|
LD C, A ; C = key pressed
|
|
LD A, 0x4 ; a=4 interrupted by key
|
|
POP DE
|
|
RET
|
|
|
|
; ------------------------------------------------------
|
|
; Check block marker from Tape
|
|
; Out: A=0 - not detected, 0xff - detected
|
|
; ------------------------------------------------------
|
|
m_tape_blk_detect:
|
|
IN A, (KBD_DD78PB)
|
|
AND TAPE_D ; TAPE5 - Pause detector
|
|
LD A, 0x0
|
|
RET Z
|
|
CPL
|
|
RET
|
|
|
|
esc_64x23_cursor:
|
|
db ASCII_ESC, '6', '1', ASCII_ESC, '8', '0', 0
|
|
|
|
msg_turbo_mon:
|
|
db "\f\r\n Turbo MONITOR Ver 1.1 for 13.01.92 (C)Alex Z.\r\n",0
|
|
|
|
m_rst1_handler:
|
|
DI
|
|
LD (TM_VARS.rst_hl_save), HL
|
|
LD HL, 0x2
|
|
ADD HL, SP
|
|
LD (TM_VARS.rst_sp_save), HL
|
|
POP HL
|
|
LD SP, TM_VARS.rst_hl_save
|
|
PUSH DE
|
|
PUSH BC
|
|
PUSH AF
|
|
LD (TM_VARS.rst_ret_addr), HL
|
|
LD (TM_VARS.tm_hrg), HL
|
|
JP tm_main
|
|
tm_rst_ret:
|
|
LD A, 0xc3
|
|
LD (TM_VARS.rst_ret_JP), A
|
|
LD SP, TM_VARS.rst_af_save
|
|
POP AF
|
|
POP BC
|
|
POP DE
|
|
POP HL
|
|
LD SP, HL
|
|
LD HL, (TM_VARS.rst_hl_save)
|
|
JP TM_VARS.rst_ret_JP
|
|
|
|
m_cold_start:
|
|
LD HL, tpa_start
|
|
LD (TM_VARS.tm_hrg), HL
|
|
tm_main:
|
|
LD SP, TM_VARS.tm_stsp
|
|
LD DE, esc_64x23_cursor ; FORM61
|
|
CALL tm_print
|
|
LD DE, msg_turbo_mon ;= '\f'
|
|
CALL tm_out_strz
|
|
LD DE, 0x363d ; 54 x '='
|
|
CALL tm_rpt_print
|
|
CALL tm_beeep
|
|
|
|
tm_mon:
|
|
LD DE, 0x300
|
|
CALL tm_screen
|
|
CALL tm_lps
|
|
LD DE, 0x520
|
|
CALL tm_rpt_print
|
|
LD HL, msg_digits ;= "0123456789ABCDEF"
|
|
|
|
; Out '012345789ABCDEF' string
|
|
tm_tit:
|
|
CALL tm_print_SP
|
|
LD C, (HL)
|
|
CALL tm_sym_out
|
|
INC HL
|
|
LD A, (HL)
|
|
OR A
|
|
JP NZ, tm_tit
|
|
LD HL, (TM_VARS.tm_hrg)
|
|
LD L, 0x0
|
|
tm_adr:
|
|
CALL tm_print_LFCR_hexw
|
|
|
|
tm_prh:
|
|
LD A, (HL)
|
|
CALL tm_hex_b
|
|
INC L
|
|
LD A,L
|
|
AND 0xf
|
|
CP 0x0
|
|
JP NZ, tm_prh
|
|
LD A, L
|
|
SUB 0x10
|
|
LD L, A
|
|
CALL tm_print_SP
|
|
CALL tm_buk
|
|
LD A, L
|
|
CP 0x0
|
|
JP NZ, tm_adr
|
|
CALL tm_print_LFCR
|
|
CALL tm_lpr
|
|
LD DE, 0x363d ; 54 x '='
|
|
CALL tm_rpt_print
|
|
CALL tm_print_LFCR
|
|
LD DE, tm_msg_regs ;= "A,FB,CD,EH,L SP"
|
|
LD HL, TM_VARS.rst_af_save
|
|
|
|
LAB_ram_f717:
|
|
LD B, 0x3
|
|
|
|
LAB_ram_f719:
|
|
LD A, (DE) ;= "A,FB,CD,EH,L SP"
|
|
LD C, A
|
|
CP 0xff
|
|
JP Z,tm_out_contacts
|
|
CP 0x0
|
|
JP Z, LAB_ram_f744
|
|
CALL tm_sym_out
|
|
INC DE
|
|
DEC B
|
|
JP NZ, LAB_ram_f719
|
|
LD C,'='
|
|
CALL tm_sym_out
|
|
INC HL
|
|
LD A, (HL)
|
|
CALL tm_hex_b
|
|
DEC HL
|
|
LD A, (HL)
|
|
CALL tm_hex_b
|
|
INC HL
|
|
INC HL
|
|
CALL tm_print_SP
|
|
JP LAB_ram_f717
|
|
LAB_ram_f744:
|
|
INC HL
|
|
INC DE
|
|
JP LAB_ram_f719
|
|
|
|
tm_msg_regs:
|
|
db "A,FB,CD,EH,L SP",0
|
|
db " PC", 0xFF
|
|
|
|
tm_out_contacts:
|
|
LD DE, m_msg_contacts ;= " (Chernogolovka Mosk.reg. ...
|
|
CALL tm_out_strz
|
|
LD HL, (TM_VARS.tm_hrg)
|
|
tm_kur:
|
|
LD DE, 0x405
|
|
LD A, L
|
|
AND 0xf0
|
|
RRCA
|
|
RRCA
|
|
RRCA
|
|
RRCA
|
|
ADD A, D
|
|
LD D, A
|
|
LD A, L
|
|
AND 0xf
|
|
ADD A, A
|
|
ADD A, E
|
|
LD E, A
|
|
CALL tm_screen
|
|
LD A, (TM_VARS.tm_tbu)
|
|
CP 0x9
|
|
JP Z, tm_tabu
|
|
LD B, 0x1
|
|
tm_m2:
|
|
CALL tm_con_in
|
|
LD C, A
|
|
CP 0x3
|
|
JP Z, m_print_log_sep
|
|
CALL tm_poke
|
|
LD A, B
|
|
OR A
|
|
JP NZ, tm_m6
|
|
CALL tm_re1
|
|
JP tm_m2
|
|
tm_m6:
|
|
LD A, C
|
|
CP 0x9
|
|
JP NZ, tm_m7
|
|
LD (TM_VARS.tm_tbu), A
|
|
JP tm_kur
|
|
tm_tabu:
|
|
CALL tm_print_CR
|
|
LD E, '&'
|
|
LD A, L
|
|
AND 0xf
|
|
ADD A, E
|
|
LD E, A
|
|
CALL tm_scr1
|
|
tm_tab:
|
|
CALL tm_get_key_ctrl_c
|
|
CP ASCII_TAB
|
|
JP NZ, tm_m7
|
|
XOR A
|
|
LD (TM_VARS.tm_tbu), A
|
|
JP tm_kur
|
|
tm_m7:
|
|
CP 0x8b
|
|
JP Z, tm_search
|
|
CP 0x9e
|
|
JP Z, tm_f1
|
|
CP 0x81
|
|
JP Z, tm_f2
|
|
CP 0x86
|
|
JP Z, tm_f3
|
|
CP 0x92
|
|
JP Z, tm_f4
|
|
CP 0x83
|
|
JP Z, tm_f5
|
|
LD A, (TM_VARS.tm_tbu)
|
|
CP 0x9
|
|
LD A, C
|
|
JP NZ, tm_m8_monitor
|
|
CALL tm_m9
|
|
JP tm_tab
|
|
tm_m9:
|
|
CP 0x93
|
|
JP Z, tm_leta
|
|
CP 0x8
|
|
JP Z, tm_leta
|
|
CP 0x84
|
|
JP Z, tm_rgta
|
|
CP 0x85
|
|
JP Z, tm_up
|
|
CP 0x98
|
|
JP Z, tm_down
|
|
AND 0x7f
|
|
CP 0x20
|
|
LD (HL), C
|
|
JP NC, tm_met1
|
|
LD C, 0x20
|
|
CP ASCII_CR
|
|
JP NZ, tm_met1
|
|
CALL tm_sym_out
|
|
CALL tm_rigth1
|
|
LD (HL), ASCII_LF
|
|
LD C, 0x20
|
|
tm_met1:
|
|
CALL tm_sym_out
|
|
JP tm_rigth1
|
|
tm_leta:
|
|
LD A, L
|
|
OR A
|
|
RET Z
|
|
AND 0xf
|
|
JP NZ, tm_left1
|
|
LD C, 0x19 ; EM (End of medium)
|
|
CALL tm_sym_out
|
|
LD DE, 0x1018 ; 16 x CAN (Cancel)
|
|
CALL tm_rpt_print
|
|
tm_left1:
|
|
DEC L
|
|
LD C, 0x8 ; BS (Backspace)
|
|
JP tm_sym_out
|
|
tm_rgta:
|
|
LD C, 0x18 ; CAN
|
|
CALL tm_sym_out
|
|
tm_rigth1:
|
|
INC L
|
|
JP Z, tm_left1
|
|
tm_rigth2:
|
|
LD A, L
|
|
AND 0xf
|
|
RET NZ
|
|
LD DE, 0x1008 ; 16 x BS
|
|
CALL tm_rpt_print
|
|
LD C, ASCII_LF
|
|
JP tm_sym_out
|
|
tm_m8_monitor:
|
|
CP ASCII_ESC
|
|
JP NZ, tm_m3
|
|
CALL tm_niz
|
|
JP tm_rst_ret
|
|
tm_m3:
|
|
CP ASCII_CR
|
|
JP Z, tm_main
|
|
CP 0x99
|
|
JP Z, tm_fill
|
|
CP 0x7f
|
|
JP Z, tm_fill_nxt2
|
|
CP '+'
|
|
JP Z, tm_plus
|
|
CP '-'
|
|
JP Z, tm_minus
|
|
CP 'G'
|
|
JP NZ, tm_rstr
|
|
LD DE, tm_main
|
|
PUSH DE
|
|
JP (HL)
|
|
tm_rstr:
|
|
CP 'J'
|
|
JP Z, tm_jump
|
|
CP 'H'
|
|
JP Z, tm_add
|
|
CP 'M'
|
|
JP Z, tm_move
|
|
CP 'R'
|
|
JP Z, tm_dsk_read
|
|
CP 'W'
|
|
JP Z, tm_dsk_write
|
|
CP 'T'
|
|
JP Z, tm_print_t
|
|
CP 'P'
|
|
LD (TM_VARS.tm_hrg), HL
|
|
JP Z, LAST ; ???
|
|
CP 'p'
|
|
JP Z, tm_lprn
|
|
CP 0x10
|
|
; if key 0x10 - turn on duplicate output to printer
|
|
JP Z, tm_ltab
|
|
CALL tm_met2
|
|
LD (TM_VARS.tm_hrg), HL
|
|
JP tm_m2
|
|
tm_met2:
|
|
CP 0x93
|
|
JP Z, tm_left
|
|
CP 0x8
|
|
JP Z, tm_left
|
|
CP 0x84
|
|
JP Z, tm_rght
|
|
CP 0x85
|
|
JP Z, tm_up
|
|
CP 0x98
|
|
JP Z, tm_down
|
|
RET
|
|
tm_left:
|
|
LD A,B
|
|
CP 0x2
|
|
JP Z, tm_le2
|
|
LD A,L
|
|
AND 0xf
|
|
RET Z
|
|
tm_le3:
|
|
DEC L
|
|
LD B, 0x2
|
|
tm_le1:
|
|
LD C, ASCII_BS
|
|
JP tm_sym_out
|
|
tm_le2:
|
|
LD B, 0x1
|
|
JP tm_le1
|
|
tm_rght:
|
|
LD C, 0x18
|
|
CALL tm_sym_out
|
|
LD A, B
|
|
CP 0x1
|
|
LD B, 0x2
|
|
RET Z
|
|
tm_re1:
|
|
INC L
|
|
JP Z, tm_le3
|
|
LD A, L
|
|
AND 0xf
|
|
LD B, 0x1
|
|
JP Z, tm_print_LFCR_hexw
|
|
RET
|
|
tm_up:
|
|
LD A, L
|
|
AND 0xf0
|
|
RET Z
|
|
LD A, L
|
|
SUB 0x10
|
|
LD L, A
|
|
LD C, 0x19
|
|
JP tm_sym_out
|
|
tm_down:
|
|
LD A, L
|
|
ADD A, 0x10
|
|
AND 0xf0
|
|
RET Z
|
|
LD A, 0x10
|
|
ADD A, L
|
|
LD L, A
|
|
LD C, 0xa
|
|
JP tm_sym_out
|
|
|
|
; ------------------------------------------------------
|
|
; Get nibbles from A and (HL), conver to byte
|
|
; put back to (HL), print nibble
|
|
; ------------------------------------------------------
|
|
tm_poke:
|
|
CP 'G'
|
|
RET P
|
|
CP '0'
|
|
RET M
|
|
SUB '0'
|
|
CP 10
|
|
JP M, p_is_alpha
|
|
SUB 0x7
|
|
p_is_alpha:
|
|
PUSH AF
|
|
CALL tm_print_hex_nibble
|
|
LD A, B
|
|
CP 0x2
|
|
JP Z, tm_m5
|
|
LD A, (HL)
|
|
AND 0xf
|
|
LD B, A
|
|
POP AF
|
|
RLCA
|
|
RLCA
|
|
RLCA
|
|
RLCA
|
|
ADD A, B
|
|
LD (HL), A
|
|
LD B, 0x2
|
|
RET
|
|
|
|
tm_m5:
|
|
LD A, (HL)
|
|
AND 0xf0
|
|
LD B, A
|
|
POP AF
|
|
ADD A, B
|
|
LD (HL), A
|
|
XOR A
|
|
LD B, A
|
|
RET
|
|
|
|
tm_pokh:
|
|
CALL tm_pok
|
|
DEC HL
|
|
tm_pok:
|
|
LD B, 0x1
|
|
tm_pk1:
|
|
CALL tm_get_key_ctrl_c
|
|
CALL tm_poke
|
|
LD A, B
|
|
OR A
|
|
JP NZ, tm_pk1
|
|
RET
|
|
tm_buk:
|
|
LD A, (HL)
|
|
LD C, A
|
|
AND 0x7f
|
|
CP 0x20
|
|
JP P, tm_m24
|
|
LD C, 0x20
|
|
tm_m24:
|
|
CALL tm_sym_out
|
|
INC L
|
|
LD A, L
|
|
AND 0xf
|
|
CP 0x0
|
|
JP NZ, tm_buk
|
|
RET
|
|
m_msg_jump:
|
|
db "JAMP\r\n", 0
|
|
|
|
tm_jump:
|
|
LD DE, 0x300
|
|
CALL tm_screen
|
|
LD DE, m_msg_jump ;= "JAMP\r\n"
|
|
CALL tm_print
|
|
LD HL, TM_VARS.tm_hrg+1
|
|
CALL tm_pokh
|
|
JP tm_mon
|
|
m_msg_add:
|
|
db "\fADD [", 0
|
|
|
|
tm_add:
|
|
LD DE,m_msg_add ;= "\fADD ["
|
|
CALL tm_print
|
|
LD HL, TM_VARS.tm_strt+1
|
|
CALL tm_pokh
|
|
LD C,'+'
|
|
CALL tm_sym_out
|
|
LD HL, TM_VARS.tm_strt+3
|
|
CALL tm_pokh
|
|
LD C,'='
|
|
CALL tm_sym_out
|
|
LD HL, (TM_VARS.tm_strt)
|
|
EX DE, HL
|
|
LD HL, (TM_VARS.tm_strt+2)
|
|
ADD HL, DE
|
|
CALL tm_hex_hl
|
|
CALL tm_con_in
|
|
JP tm_main
|
|
|
|
m_msg_move:
|
|
db "\fMOVE }", 0
|
|
|
|
tm_move:
|
|
LD DE,m_msg_move ;= "\fMOVE }"
|
|
CALL tm_print
|
|
LD HL, TM_VARS.tm_strt+1
|
|
CALL tm_pokh
|
|
LD C,'-'
|
|
CALL tm_sym_out
|
|
LD HL, TM_VARS.tm_strt+3
|
|
CALL tm_pokh
|
|
LD C,'='
|
|
CALL tm_sym_out
|
|
LD HL, TM_VARS.tm_strt+5
|
|
CALL tm_pokh
|
|
LD HL, (TM_VARS.tm_strt)
|
|
LD B,H
|
|
LD C,L
|
|
LD HL, (TM_VARS.tm_strt+2)
|
|
LD D,H
|
|
LD E,L
|
|
INC DE
|
|
LD HL, (TM_VARS.tm_strt+4)
|
|
|
|
tm_mov_nxt:
|
|
LD A, (BC)
|
|
LD (HL), A
|
|
INC BC
|
|
INC HL
|
|
LD A, C
|
|
CP E
|
|
JP NZ, tm_mov_nxt
|
|
LD A, B
|
|
CP D
|
|
JP NZ, tm_mov_nxt
|
|
JP tm_main
|
|
tm_dsk_read:
|
|
LD DE, m_msg_read ;= "Read/"
|
|
JP tm_ra4
|
|
tm_dsk_write:
|
|
LD DE, m_msg_write ;= "Write/"
|
|
tm_ra4:
|
|
LD (TM_VARS.tm_rw_disk), A
|
|
CALL tm_print_verh
|
|
CALL tm_print
|
|
tm_ra5:
|
|
CALL tm_get_key_ctrl_c
|
|
CP 'A'
|
|
JP C, tm_ra5
|
|
CP 'F'
|
|
JP NC, tm_ra5
|
|
LD (TM_VARS.tm_drive), A
|
|
CALL tm_sym_out
|
|
LD C, ':'
|
|
CALL tm_sym_out
|
|
LD A, (TM_VARS.tm_drive)
|
|
SUB 65
|
|
LD (TM_VARS.tm_drive), A
|
|
JP NZ, tm_disk
|
|
LD DE, tm_msg_0123 ;= "0123 ?"
|
|
CALL tm_print
|
|
tm_rrr:
|
|
CALL tm_get_key_ctrl_c
|
|
SUB 48
|
|
CP 4
|
|
JP NC, tm_rrr
|
|
LD (TM_VARS.tm_strt+15), A
|
|
JP tm_main
|
|
tm_beeep:
|
|
LD BC, 0x6060
|
|
tm_bell_next_p:
|
|
LD A,BELL_PIN
|
|
OUT (DD67PC), A ; BELL=1
|
|
LD A, C
|
|
tm_bell_w1:
|
|
DEC A
|
|
JP NZ, tm_bell_w1
|
|
OUT (DD67PC), A ; BELL 0
|
|
LD A, C
|
|
tm_bell_w2:
|
|
DEC A
|
|
JP NZ, tm_bell_w2
|
|
DEC B
|
|
JP NZ, tm_bell_next_p
|
|
RET
|
|
tm_msg_0123:
|
|
db "0123 ?", 0
|
|
|
|
tm_disk:
|
|
LD DE, m_msg_track ;= "/Track-"
|
|
CALL tm_print
|
|
CALL tm_des_dv
|
|
LD (TM_VARS.tm_track_no), A
|
|
LD DE, tm_sector ;= "/Sekt-"
|
|
CALL tm_print
|
|
CALL tm_des_dv
|
|
LD (TM_VARS.tm_sector_no), A
|
|
LD DE, m_msg_num ;= "/N-"
|
|
CALL tm_print
|
|
CALL tm_des_dv
|
|
LD (TM_VARS.tm_num_sect), A
|
|
LD DE, m_msg_io ;= "/(I/O)-"
|
|
CALL tm_print
|
|
tm_disk_op_unk:
|
|
CALL tm_get_key_ctrl_c
|
|
CP 'I'
|
|
JP Z, tm_disk_inp
|
|
CP 'O'
|
|
JP NZ, tm_disk_op_unk
|
|
tm_disk_inp:
|
|
LD (TM_VARS.tm_disk_op), A
|
|
CALL tm_sym_out
|
|
CALL tm_rd_wr_disk
|
|
JP tm_cont
|
|
tm_rd_wr_disk:
|
|
CALL tm_niz
|
|
tm_rd:
|
|
CALL tm_print_CR
|
|
LD A, (TM_VARS.tm_track_no)
|
|
LD D, A
|
|
LD A, (TM_VARS.tm_sector_no)
|
|
LD E, A
|
|
LD A, (TM_VARS.tm_disk_op)
|
|
CP 'O'
|
|
CALL Z, tm_sect_map
|
|
LD A, H
|
|
CP 0xac
|
|
JP NC, tm_error
|
|
LD BC, 0x84
|
|
LD A, (TM_VARS.tm_rw_disk)
|
|
CP 'W'
|
|
LD A, (TM_VARS.tm_drive)
|
|
JP NZ, tm_d3
|
|
LD C, 0xa4
|
|
CALL m_write_floppy
|
|
DEC L
|
|
JP tm_d4
|
|
tm_d3:
|
|
CALL m_read_floppy
|
|
tm_d4:
|
|
CP 0x0
|
|
JP NZ, tm_error
|
|
LD A, (TM_VARS.tm_track_no)
|
|
LD D, A
|
|
LD A, (TM_VARS.tm_sector_no)
|
|
INC A
|
|
CP 10
|
|
JP C, tm_wf_nx_trk
|
|
INC D
|
|
LD A, D
|
|
LD (TM_VARS.tm_track_no), A
|
|
LD A, 0x1
|
|
tm_wf_nx_trk:
|
|
LD (TM_VARS.tm_sector_no), A
|
|
LD E, A
|
|
CALL tm_print_CR_hexw
|
|
CALL tm_dv_des
|
|
LD A, (TM_VARS.tm_num_sect)
|
|
DEC A
|
|
LD (TM_VARS.tm_num_sect), A
|
|
JP NZ, tm_rd
|
|
RET
|
|
tm_error:
|
|
PUSH AF
|
|
LD DE, m_msg_disk_error ;= "Disk Error - "
|
|
CALL tm_print
|
|
POP AF
|
|
CALL tm_hex_b
|
|
LD BC, 0x70ff
|
|
CALL tm_bell_next_p
|
|
LD DE, m_msg_track ;= "/Track-"
|
|
CALL tm_print
|
|
LD A, (TM_VARS.tm_track_no)
|
|
CALL tm_dva
|
|
LD DE, tm_sector ;= "/Sekt-"
|
|
CALL tm_print
|
|
LD A, (TM_VARS.tm_sector_no)
|
|
CALL tm_dva
|
|
LD DE, m_msg_retr_abrt ;= "Retry, Abort -?"
|
|
CALL tm_print_w_key
|
|
CP 'A'
|
|
JP Z, tm_main
|
|
JP tm_rd_wr_disk
|
|
tm_dv_des:
|
|
CALL tm_dv1
|
|
LD A, E
|
|
|
|
; ------------------------------------------------------
|
|
; Convert to BCD and print?
|
|
; ------------------------------------------------------
|
|
tm_dva:
|
|
LD D, A
|
|
tm_dv1:
|
|
LD C, 0
|
|
LD B, 8
|
|
tm_dv2:
|
|
LD A, D
|
|
RLCA
|
|
LD D, A
|
|
LD A, C
|
|
ADC A, C
|
|
DAA
|
|
LD C, A
|
|
DEC B
|
|
JP NZ, tm_dv2
|
|
|
|
OFF_ram_fb76:
|
|
JP tm_hex_b
|
|
|
|
tm_sec_map_t:
|
|
db 1, 8, 6, 4, 2, 9, 7, 5, 3
|
|
|
|
; ------------------------------------------------------
|
|
; Map sectors
|
|
; Inp: E - sector
|
|
; Out: E - sector
|
|
; ------------------------------------------------------
|
|
tm_sect_map:
|
|
LD BC, tm_sec_map_t-1
|
|
LD A, E
|
|
ADD A, C
|
|
LD C, A
|
|
JP NC, tm_tbl_noc
|
|
INC B
|
|
tm_tbl_noc:
|
|
LD A, (BC)
|
|
LD E, A
|
|
RET
|
|
tm_des_dv:
|
|
CALL SUB_ram_fb9f
|
|
RLCA
|
|
RLCA
|
|
RLCA
|
|
LD B, A
|
|
RRCA
|
|
RRCA
|
|
ADD A,B
|
|
LD B, A
|
|
CALL SUB_ram_fb9f
|
|
ADD A,B
|
|
RET
|
|
SUB_ram_fb9f:
|
|
CALL tm_get_key_ctrl_c
|
|
SUB 0x30
|
|
JP M,SUB_ram_fb9f
|
|
CP 0xa
|
|
JP P,SUB_ram_fb9f
|
|
PUSH AF
|
|
CALL tm_sym_out
|
|
POP AF
|
|
RET
|
|
|
|
; ------------------------------------------------------
|
|
; Read data from floppy
|
|
; Inp: A = 0..4 - select drives
|
|
; HL -> buffer
|
|
; C - command (0x84) READ_SEC, single, 15ms delay
|
|
; Out: A=0 if ok
|
|
; CF is set if error
|
|
; ------------------------------------------------------
|
|
m_read_floppy:
|
|
CALL m_select_drive
|
|
CALL m_start_floppy
|
|
RET C
|
|
CALL m_fdc_seek_trk
|
|
RET C
|
|
CALL m_fdc_read_c_bytes
|
|
RET C
|
|
XOR A
|
|
RET
|
|
|
|
; ------------------------------------------------------
|
|
; Write data to floppy
|
|
; Inp: A = 0..4 - select drives
|
|
; HL -> buffer
|
|
; C - command (0xA4) WRITE_SEC, single, 15ms delay
|
|
; Out: A=0 if ok
|
|
; CF is set if error
|
|
; ------------------------------------------------------
|
|
m_write_floppy:
|
|
CALL m_select_drive
|
|
CALL m_start_floppy
|
|
RET C
|
|
CALL m_fdc_seek_trk
|
|
RET C
|
|
CALL m_fdc_write_bytes
|
|
RET C
|
|
XOR A
|
|
RET
|
|
|
|
; ------------------------------------------------------
|
|
; Select or disable drive
|
|
; Inp: A = 0 - disable drives
|
|
; A = 1 - select + drsel + motor0 en
|
|
; A = 2 - select + motor0 enanle
|
|
; A = 3 - select
|
|
; A = 4 - select + drsel
|
|
; ------------------------------------------------------
|
|
m_select_drive:
|
|
PUSH BC
|
|
LD B, 00000111b ; DRSEL, DSEL1, DSEL0
|
|
CP 0x1
|
|
JP Z, mal_out_to_flop
|
|
LD B, 00100111b ; MOT0_EN, DRSEL, DSEL1, DSEL0
|
|
CP 0x2
|
|
JP Z, mal_out_to_flop
|
|
LD B, 00000011b ; DSEL1, DSEL0
|
|
CP 0x3
|
|
JP Z, mal_out_to_flop
|
|
LD B, 00100011b ; MOT0_EN, DSEL1, DSEL0
|
|
CP 0x4
|
|
JP Z, mal_out_to_flop
|
|
LD B, 00000000b ; Turn off and deselect drives
|
|
mal_out_to_flop:
|
|
LD A, B
|
|
OUT (FLOPPY), A
|
|
POP BC
|
|
RET
|
|
|
|
; ------------------------------------------------------
|
|
; Start floppy
|
|
; Out:
|
|
; CF is set, A=0x20 if INTRQ
|
|
; CF not set, A=0x00 if READY
|
|
; ------------------------------------------------------
|
|
m_start_floppy:
|
|
IN A, (FLOPPY) ; Get floppy ctrl state
|
|
RLCA
|
|
JP C, .start_motor
|
|
IN A, (FDC_CMD)
|
|
AND FDC_NOT_READY
|
|
RET Z
|
|
|
|
.start_motor:
|
|
PUSH BC
|
|
LD BC, 64000 ; timeout
|
|
CALL m_fdc_set_init
|
|
|
|
.wait_mot_start:
|
|
IN A, (FDC_CMD)
|
|
AND FDC_NOT_READY
|
|
JP Z, .delay_for_spin_up
|
|
IN A, (FLOPPY)
|
|
; Check motor start bit
|
|
RLCA
|
|
JP NC, .wait_mot_start
|
|
; Time is out or not started
|
|
LD A, 0x20
|
|
JP .ok_exit
|
|
; Delay for spindle spin-up
|
|
.delay_for_spin_up:
|
|
DEC C
|
|
JP NZ, .delay_for_spin_up
|
|
DEC B
|
|
JP NZ, .delay_for_spin_up
|
|
XOR A
|
|
.ok_exit:
|
|
POP BC
|
|
RET
|
|
|
|
; ------------------------------------------------------
|
|
; Send INIT to FDC
|
|
; ------------------------------------------------------
|
|
m_fdc_set_init:
|
|
IN A, (FLOPPY)
|
|
AND 01001110b ; Read SSEL, DDEN, MOT1, MOT0
|
|
RRA
|
|
OUT (FLOPPY), A ; SSEL DRSEL MOT1 MOT0
|
|
OR 00001000b ; INIT
|
|
OUT (FLOPPY), A
|
|
RET
|
|
|
|
; ------------------------------------------------------
|
|
; Seek track on floppy
|
|
; Inp: DE - track/sector
|
|
; ------------------------------------------------------
|
|
m_fdc_seek_trk:
|
|
PUSH BC
|
|
LD B, 0x2 ; try 2 times if error
|
|
fs_seek_again:
|
|
LD A, D
|
|
OUT (FDC_DATA), A ; Set track to search
|
|
LD A,FDC_SEEK_LV ; Seek, Load Head, Verify on dst track
|
|
OUT (FDC_CMD), A
|
|
NOP
|
|
NOP
|
|
IN A, (FDC_WAIT)
|
|
IN A, (FDC_CMD)
|
|
AND 00011001b ; SEEK error, CRC error, BUSY flags
|
|
CP 0x0
|
|
JP Z, fs_seek_ok
|
|
LD A, 0x20
|
|
SCF ; set erro flag
|
|
DEC B
|
|
JP Z, fs_seek_ok
|
|
LD A, FDC_RESTORE_L ; restore with load head
|
|
OUT (FDC_CMD), A
|
|
NOP
|
|
NOP
|
|
IN A, (FDC_WAIT)
|
|
JP fs_seek_again
|
|
fs_seek_ok:
|
|
PUSH AF
|
|
LD A, E
|
|
OUT (FDC_SECT), A
|
|
POP AF
|
|
POP BC
|
|
RET
|
|
|
|
; ------------------------------------------------------
|
|
; Write bytes to FDC
|
|
; Inp: C - count of bytes
|
|
; HL -> buffer
|
|
; Out: CF set if error,
|
|
; C - error code if CF is set
|
|
; ------------------------------------------------------
|
|
m_fdc_write_bytes:
|
|
LD A, C
|
|
OUT (FDC_CMD), A
|
|
fw_next_byte:
|
|
IN A, (FDC_WAIT)
|
|
RRCA
|
|
LD A, (HL)
|
|
OUT (FDC_DATA), A
|
|
INC HL
|
|
JP C,fw_next_byte
|
|
JP m_floppy_chk_error
|
|
|
|
; ------------------------------------------------------
|
|
; Read bytes from FDC
|
|
; Inp: C - command code for VG93
|
|
; HL -> buffer
|
|
; Out: CF set if error,
|
|
; C - error code if CF is set
|
|
; ------------------------------------------------------
|
|
m_fdc_read_c_bytes:
|
|
LD A, C
|
|
OUT (FDC_CMD), A
|
|
JP .skip_first_inc
|
|
.read_next_byte:
|
|
LD (HL), A
|
|
INC HL
|
|
.skip_first_inc:
|
|
IN A, (FDC_WAIT)
|
|
RRCA
|
|
IN A, (FDC_DATA)
|
|
JP C, .read_next_byte
|
|
|
|
m_floppy_chk_error:
|
|
IN A, (FDC_CMD)
|
|
AND 11011111b ; mask 5th bit Write fault... ???
|
|
CP 0x0
|
|
RET Z ; retutn in no errors
|
|
IN A, (FDC_CMD)
|
|
LD C, A
|
|
SCF
|
|
RET
|
|
|
|
m_msg_disk_error:
|
|
db "Disk Error - ", 0
|
|
|
|
m_msg_retr_abrt:
|
|
db "Retry, Abort -?", 0
|
|
|
|
m_msg_read:
|
|
db "Read/", 0
|
|
|
|
m_msg_write:
|
|
db "Write/", 0
|
|
|
|
m_msg_track:
|
|
db "/Track-", 0
|
|
|
|
tm_sector:
|
|
db "/Sekt-", 0
|
|
|
|
m_msg_num:
|
|
db "/N-", 0
|
|
|
|
m_msg_b_ok:
|
|
db " {OK}", 0
|
|
|
|
m_msg_io:
|
|
db "/(I/O)-", 0
|
|
|
|
esc_cmd_kod:
|
|
db ASCII_ESC, '@', ASCII_ESC, 'R', 3, ESC_CMD_END
|
|
|
|
tm_fill:
|
|
LD C, (HL)
|
|
LD A, 0xb0
|
|
.fill_nxt1:
|
|
LD (HL), C
|
|
INC HL
|
|
CP H
|
|
JP NZ, .fill_nxt1
|
|
JP tm_mon
|
|
tm_fill_nxt2:
|
|
LD C, (HL)
|
|
.fill_nxt3:
|
|
LD (HL), C
|
|
INC L
|
|
JP NZ, .fill_nxt3
|
|
JP tm_mon
|
|
EX DE, HL
|
|
CALL tm_hex_hl
|
|
EX DE, HL
|
|
RET
|
|
|
|
; ------------------------------------------------------
|
|
; Print word as hex
|
|
; Inp: HL - value to print
|
|
; ------------------------------------------------------
|
|
tm_hex_hl:
|
|
LD A, H
|
|
CALL tm_hex_b
|
|
LD A, L
|
|
|
|
; ------------------------------------------------------
|
|
; Print byte in HEX
|
|
; Inp: A - Byte to print
|
|
; ------------------------------------------------------
|
|
tm_hex_b:
|
|
PUSH AF
|
|
AND 0xf0
|
|
RRCA
|
|
RRCA
|
|
RRCA
|
|
RRCA
|
|
CALL tm_print_hex_nibble
|
|
POP AF
|
|
PUSH AF
|
|
AND 0xf
|
|
CALL tm_print_hex_nibble
|
|
POP AF
|
|
RET
|
|
|
|
tm_print_hex_nibble:
|
|
PUSH DE
|
|
LD DE,msg_digits ;= "0123456789ABCDEF"
|
|
ADD A, E
|
|
JP NC, .no_cf
|
|
INC D
|
|
.no_cf:
|
|
LD E, A
|
|
LD A, (DE)
|
|
LD C, A
|
|
CALL tm_sym_out
|
|
POP DE
|
|
RET
|
|
|
|
msg_digits:
|
|
db "0123456789ABCDEF", 0
|
|
|
|
tm_print_LFCR_hexw:
|
|
LD C, ASCII_LF
|
|
CALL tm_sym_out
|
|
|
|
tm_print_CR_hexw:
|
|
CALL tm_print_CR
|
|
CALL tm_hex_hl
|
|
|
|
tm_print_SP:
|
|
LD C, ' '
|
|
JP tm_sym_out
|
|
|
|
tm_print_LFCR:
|
|
LD C, ASCII_LF
|
|
CALL tm_sym_out
|
|
|
|
tm_print_CR:
|
|
LD C, ASCII_CR
|
|
JP tm_sym_out
|
|
|
|
; ------------------------------------------------------
|
|
; Get key from keyboard. Return to monitor
|
|
; if Ctrl+C pressed
|
|
; Out: C=A - key
|
|
; ------------------------------------------------------
|
|
tm_get_key_ctrl_c:
|
|
CALL tm_con_in
|
|
LD C, A
|
|
CP 0x3
|
|
JP Z, tm_main
|
|
RET
|
|
|
|
; TYPE
|
|
tm_print_t:
|
|
LD C, ASCII_US
|
|
CALL tm_sym_out
|
|
EX DE, HL
|
|
CALL tm_print
|
|
tm_cont:
|
|
LD DE, m_msg_b_ok ;= " {OK}"
|
|
CALL tm_print_w_key
|
|
JP tm_main
|
|
|
|
; ------------------------------------------------------
|
|
; Print message and wait key
|
|
; Ctrl+C to cansel current op and
|
|
; return to monitor
|
|
; Inp: DE -> strz
|
|
; Out: A - key
|
|
; ------------------------------------------------------
|
|
tm_print_w_key:
|
|
CALL tm_out_strz
|
|
JP tm_get_key_ctrl_c
|
|
|
|
tm_out_strz:
|
|
CALL tm_print_LFCR
|
|
tm_print:
|
|
LD B,16
|
|
p11_print_next:
|
|
LD A, (DE)
|
|
OR A
|
|
RET Z
|
|
CP ASCII_CR
|
|
JP NZ, p11_no_CR
|
|
DEC B
|
|
JP NZ, p11_no_CR
|
|
CALL tm_get_key_ctrl_c
|
|
LD B, 16
|
|
LD A, (DE)
|
|
p11_no_CR:
|
|
LD C, A
|
|
CALL tm_sym_out
|
|
INC DE
|
|
JP p11_print_next
|
|
|
|
; ------------------------------------------------------
|
|
; Out symbol
|
|
; Inp: C - symbol
|
|
; ------------------------------------------------------
|
|
tm_sym_out:
|
|
LD A, C
|
|
AND 0x80
|
|
JP Z, tm_rus
|
|
LD A, 0x1
|
|
|
|
tm_rus:
|
|
LD (TM_VARS.m_codepage), A
|
|
CALL m_con_out
|
|
LD A, (TM_VARS.tm_ltb+1) ; if 0x10, return, no out to printer;
|
|
CP 0x10
|
|
RET NZ
|
|
JP tm_char_print
|
|
|
|
; ------------------------------------------------------
|
|
; Print FS (FileSeparator)
|
|
; ------------------------------------------------------
|
|
tm_print_verh:
|
|
LD C, 0xc
|
|
JP tm_sym_out
|
|
tm_screen:
|
|
CALL tm_print_verh
|
|
LD A, D
|
|
OR A
|
|
tm_scr0:
|
|
JP Z,tm_scr1
|
|
LD C, ASCII_LF
|
|
CALL tm_sym_out
|
|
DEC D
|
|
JP tm_scr0
|
|
|
|
; ------------------------------------------------------
|
|
; Print CAN symbol E times
|
|
; ------------------------------------------------------
|
|
tm_scr1:
|
|
LD A, E
|
|
OR A
|
|
RET Z
|
|
LD C, ASCII_CAN ; CAN (Cancel)
|
|
CALL tm_sym_out
|
|
DEC E
|
|
JP tm_scr1
|
|
|
|
tm_niz:
|
|
LD DE, 0x1500 ; 21 x 0
|
|
CALL tm_screen
|
|
LD DE, 0x7f20 ; 126 x ' '
|
|
CALL tm_rpt_print
|
|
LD DE, 0x1500 ; 21 x 0
|
|
JP tm_screen
|
|
|
|
; ------------------------------------------------------
|
|
; Print the character the specified number of times
|
|
; Inp: E - character
|
|
; D - count
|
|
; ------------------------------------------------------
|
|
tm_rpt_print:
|
|
LD C, E ; DE=363D
|
|
rpt_next:
|
|
CALL tm_sym_out
|
|
DEC D
|
|
RET Z
|
|
JP rpt_next
|
|
|
|
; Turn on duplicate output to printer
|
|
tm_ltab:
|
|
LD A,10h
|
|
LD (TM_VARS.tm_ltb), A
|
|
JP tm_mon
|
|
|
|
tm_lps:
|
|
LD A, (TM_VARS.tm_ltb)
|
|
CP 0x10
|
|
RET NZ
|
|
LD (TM_VARS.tm_ltb+1), A
|
|
LD DE,esc_cmd_kod ;= 1Bh
|
|
JP tm_lprint
|
|
|
|
tm_lpr:
|
|
XOR A
|
|
LD (TM_VARS.tm_ltb), A
|
|
LD (TM_VARS.tm_ltb+1), A
|
|
RET
|
|
|
|
tm_lprn:
|
|
EX DE, HL
|
|
CALL tm_lprint
|
|
JP tm_mon
|
|
|
|
; ------------------------------------------------------
|
|
; Print string until SUB symbol
|
|
; Inp: DE -> string ended with SUB (0x1A)
|
|
; ------------------------------------------------------
|
|
tm_lprint:
|
|
LD A, (DE)
|
|
LD C, A
|
|
CP ASCII_SUB
|
|
RET Z
|
|
CALL tm_char_print
|
|
INC DE
|
|
JP tm_lprint
|
|
|
|
; ------------------------------------------------------
|
|
; Send character to printer
|
|
; Inp: C - character
|
|
; ------------------------------------------------------
|
|
tm_char_print:
|
|
IN A, (PIC_DD75RS)
|
|
AND PRINTER_IRQ
|
|
JP Z, tm_char_print ; Wait printer ready
|
|
cp_wait_ack:
|
|
IN A, (KBD_DD78PB)
|
|
AND PRINTER_ACK
|
|
JP NZ, cp_wait_ack
|
|
LD A, C
|
|
CPL
|
|
OUT (LPT_DD67PA), A
|
|
LD A, 00001001b ; set Printer Strobe (port C 4th bit)
|
|
OUT (DD67CTR), A
|
|
LD A, 00001000b ; reset Printer Strobe
|
|
OUT (DD67CTR), A
|
|
RET
|
|
|
|
; ------------------------------------------------------
|
|
; Wait and read data from UART
|
|
; Out: A - 7 bit data
|
|
; ------------------------------------------------------
|
|
m_serial_in:
|
|
IN A, (UART_DD72RR)
|
|
AND RX_READY
|
|
JP Z, m_serial_in ; wait for rx data ready
|
|
IN A, (UART_DD72RD)
|
|
AND 0x7f ; leave 7 bits
|
|
RET
|
|
|
|
; ------------------------------------------------------
|
|
; Send data by UART
|
|
; Inp: C - data to transmitt
|
|
; ------------------------------------------------------
|
|
m_serial_out:
|
|
IN A, (UART_DD72RR)
|
|
AND TX_READY
|
|
JP Z, m_serial_out ; Wait for TX ready
|
|
LD A, C
|
|
OUT (UART_DD72RD), A
|
|
RET
|
|
tm_plus:
|
|
LD HL, (TM_VARS.tm_hrg)
|
|
INC H
|
|
JP tm_ff
|
|
tm_minus:
|
|
LD HL, (TM_VARS.tm_hrg)
|
|
DEC H
|
|
JP tm_ff
|
|
tm_f1:
|
|
LD H, 0x1
|
|
JP tm_ff
|
|
tm_f2:
|
|
LD H, 0x40
|
|
JP tm_ff
|
|
tm_f3:
|
|
LD H, 0xb0
|
|
JP tm_ff
|
|
tm_ff:
|
|
XOR A
|
|
LD L, A
|
|
LD (TM_VARS.tm_hrg), HL
|
|
JP tm_mon
|
|
tm_f4:
|
|
LD A,H
|
|
ADD A, 0x10
|
|
JP tm_fa
|
|
tm_f5:
|
|
LD A,H
|
|
SUB 0x10
|
|
tm_fa:
|
|
LD H, A
|
|
JP tm_ff
|
|
|
|
tm_msg_search:
|
|
db "\fSEARCH [", 0
|
|
|
|
tm_search:
|
|
LD (TM_VARS.tm_hrg), HL
|
|
tm_search0:
|
|
LD DE, tm_msg_search ;= "\fSEARCH ["
|
|
CALL tm_print
|
|
LD HL, TM_VARS.tm_stack
|
|
tm_s0:
|
|
LD B, 0x1
|
|
tm_s1:
|
|
CALL tm_get_key_ctrl_c
|
|
CP ASCII_BS
|
|
JP Z, tm_search0
|
|
CP ASCII_CR
|
|
JP Z, tm_do_search
|
|
CP '*'
|
|
JP Z, tm_s4
|
|
LD A, (TM_VARS.tm_tbu)
|
|
CP ASCII_TAB
|
|
JP NZ, tm_s2
|
|
tm_s4:
|
|
LD (HL), C
|
|
CALL tm_sym_out
|
|
JP tm_s5
|
|
tm_s2:
|
|
LD A, C
|
|
CALL tm_poke
|
|
LD A, B
|
|
OR A
|
|
JP NZ, tm_s1
|
|
tm_s5:
|
|
INC L
|
|
JP tm_s0
|
|
|
|
tm_do_search:
|
|
LD B,L
|
|
LD D,H
|
|
XOR A
|
|
LD E, A
|
|
LD HL, (TM_VARS.tm_hrg)
|
|
INC HL
|
|
ADD A,B
|
|
JP Z, tm_sea1
|
|
LD (TM_VARS.tm_stack+16), A
|
|
tm_sea1:
|
|
LD A, (DE)
|
|
CP (HL)
|
|
JP NZ, tm_s3
|
|
tm_s6:
|
|
DEC B
|
|
JP Z, tm_aga
|
|
INC E
|
|
tm_sea2:
|
|
INC L
|
|
JP NZ, tm_sea1
|
|
INC H
|
|
JP NZ, tm_sea1
|
|
JP tm_main
|
|
tm_s3:
|
|
LD A, (DE)
|
|
CP '*'
|
|
JP Z, tm_s6
|
|
LD A, (TM_VARS.tm_stack+16)
|
|
LD B, A
|
|
LD E, 0x0
|
|
JP tm_sea2
|
|
|
|
tm_aga:
|
|
LD A, (TM_VARS.tm_stack+16)
|
|
|
|
tm_ogo:
|
|
DEC A
|
|
JP Z, tm_rets
|
|
DEC HL
|
|
JP tm_ogo
|
|
|
|
tm_rets:
|
|
LD (TM_VARS.tm_hrg), HL
|
|
JP tm_main
|
|
|
|
m_print_log_sep:
|
|
LD C, ASCII_US
|
|
CALL tm_sym_out
|
|
JP warm_boot
|
|
|
|
m_msg_contacts:
|
|
db " (Chernogolovka Mosk.reg. Tel 51-24)", 0
|
|
|
|
LAST EQU $
|
|
CODE_SIZE EQU LAST-0xE000
|
|
FILL_SIZE EQU 8192-CODE_SIZE
|
|
|
|
DISPLAY "Code size is: ",/A,CODE_SIZE
|
|
|
|
FILLER
|
|
DS FILL_SIZE, 0xFF
|
|
DISPLAY "Filler size is: ",/A,FILL_SIZE
|
|
|
|
ENDMODULE
|
|
|
|
OUTEND
|
|
|
|
INCLUDE "tm_vars.inc"
|