; ====================================================== ; 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 ; 1 dw esc_draw_line ; 2 dw esc_draw_dot ; 3 dw esc_set_color ; 4 dw esc_set_cursor ; 5 dw esc_set_vmode ; 6 dw esc_set_charset ; 7 dw esc_set_palette ; 8 dw esc_reset_esc ; 9 dw esc_print_screen ; : dw esc_fn_b ; ; dw esc_fn_none ; < dw esc_fn_none ; = dw esc_fn_none ; > dw esc_set_beep ; ? 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 ; ------------------------------------------------------ ; Zn - Increment Y coordinate cmd_esc_inc_Y2: db ASCII_ESC db 'Z' db 2h db ESC_CMD_END ; Xnn - Set X coordinate cmd_esc_set_X0: db ASCII_ESC db 'X' db 0h ; 0..479 db 0h db ESC_CMD_END ; ------------------------------------------------------ ; X - Start on "Set X coordinate" command ; ------------------------------------------------------ cmd_esc_set_X: db ASCII_ESC db 'X' db ESC_CMD_END ; 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 ; ------------------------------------------------------ ; 5 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 ; ------------------------------------------------------ ; 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 ; ------------------------------------------------------ ; 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"