Sprinter-BIOS/bios/exp/FUNC_LOW_PRINT.ASM
2026-05-19 19:46:03 +10:00

2405 lines
42 KiB
NASM
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

; DISPLAY "Low-print-2."
;==============================================================
;
; <09>ணࠬ¬  LOW PRINT for Sprinter-97.
;
;==============================================================
;=============================================================
; ”㭪樨 Bios Sprinter-97.
; <09> ¡®ç ï ¢¥àá¨ï 29.05.97
;=============================================================
; LP_OPEN_WIN Žâªàë⨥ ®ª­ 
; point 3D13h C=80h ‚室: B - ª®¤ ®ª­ .
; B=0 - Spectrum 32x24 B=1 - Spectrum 64x24
; B=2 - Spectrum 40x24 B=3 - Spectrum 80x24
; ‚ë室: DE - à §¬¥à ®ª­ 
;=============================================================
; LP_PRINT_ALL ‚뢮¤ ᨬ¢®«®¢ ­  íªà ­ á ⥪ã饣® §­ ª®¬¥áâ 
; point 3D13h C=81h ‚室: A - ᨬ¢®«,
; B - ç¨á«® ¢ë¢®¤¨¬ëå ᨬ¢®«®¢,
; … -  âਡãâ ᨬ¢®« 
;=============================================================
; LP_PRINT_SYM ‚뢮¤ ᨬ¢®«®¢ ­  íªà ­ á ⥪ã饣® §­ ª®¬¥áâ 
; ¡¥§  âਡãâ 
; point 3D13h C=82h ‚室: A - ᨬ¢®«,
; B - ç¨á«® ¢ë¢®¤¨¬ëå ᨬ¢®«®¢,
;=============================================================
; LP_PRINT_ATR ‚뢮¤  âਡã⮢ ­  íªà ­ á ⥪ã饣® §­ ª®¬¥áâ 
; point 3D13h C=83h ‚室: B - ç¨á«® ¢ë¢®¤¨¬ëå ᨬ¢®«®¢,
; … -  âਡãâ ᨬ¢®« 
;=============================================================
; LP_SET_PLACE “áâ ­®¢ª  ⥪ã饣® §­ ª®¬¥áâ 
; point 3D13h C=84h ‚室: E - §­ ª®¬¥áâ® ¯® £®à¨§®­â «¨
; D - §­ ª®¬¥áâ® ¯® ¢¥à⨪ «¨
;=============================================================
; LP_PRINT_LN ‚뢮¤ áâப¨ ᨬ¢®«®¢ ­  íªà ­ á ⥪ã饣®
; §­ ª®¬¥áâ 
; point 3D13h C=85h ‚室: HL -  ¤à¥á áâப¨
; B - ç¨á«® ¢ë¢®¤¨¬ëå ᨬ¢®«®¢,
; … -  âਡãâ ᨬ¢®«®¢
;=============================================================
; LP_PRINT_LN2 ‚뢮¤ áâப¨ ᨬ¢®«®¢ ­  íªà ­ á ⥪ã饣®
; §­ ª®¬¥áâ  ¡¥§  âਡã⮢
; point 3D13h C=86h ‚室: HL -  ¤à¥á áâப¨
; B - ç¨á«® ¢ë¢®¤¨¬ëå ᨬ¢®«®¢,
;=============================================================
; LP_PRINT_LN3 ‚뢮¤ áâப¨ ᨬ¢®«®¢ ­  íªà ­ á ⥪ã饣®
; §­ ª®¬¥áâ 
; point 3D13h C=87h ‚室: HL -  ¤à¥á áâப¨
; B - ç¨á«® ¢ë¢®¤¨¬ëå ᨬ¢®«®¢,
; D - à §¤¥«¨â¥«ì
; … -  âਡãâ ᨬ¢®«®¢
;=============================================================
; LP_PRINT_LN4 ‚뢮¤ áâப¨ ᨬ¢®«®¢ ­  íªà ­ á ⥪ã饣®
; §­ ª®¬¥áâ  ¡¥§  âਡã⮢
; point 3D13h C=88h ‚室: HL -  ¤à¥á áâப¨
; B - ç¨á«® ¢ë¢®¤¨¬ëå ᨬ¢®«®¢,
; D - à §¤¥«¨â¥«ì
;=============================================================
; LP_CLS_WIN Žç¨á⪠ ®ª­  íªà ­ 
; point 3D13h C=89h ‚室: DE - ¯®«®¦¥­¨¥ ®ª­ 
; B -  âਡãâ ®ç¨á⪨
; H - ¢ëá®â , L - è¨à¨­ 
;=============================================================
MACRO CORRECT_SCR_40_FORWARD ;[x] ¢ª«î稫 31/10/23, ç¨áâ® ­  •í««®ããã㨨¨­
EX AF,AF'
JR C,.LLL
INC D ; ०¨¬ 40
.LLL: EX AF,AF'
ENDM ;
MACRO CORRECT_SCR_40_BACKWARD
EX AF,AF'
JR C,.LLL
DEC D ; ०¨¬ 40
.LLL: EX AF,AF'
ENDM ;
MACRO DJNZ_NEXT_HL
DJNZ .LLL
CALL LP_NEXT_HL
.LLL: ;
ENDM
;*********************************
;* LOW LEVEL PRINTER *
;* DE' - ZG *
;* HL' - PLACE ON SCR *
;* C' - ATTRIBUTES *
;* B' - COUNT SYMBS *
;* ZF - inverse *
;* AF' - áâà ­¨æ  ¨ mode *
;*********************************
; MACRO LP_BEG_PM
; EX AF,AF'
; EXX
; IN A,(SLOT3)
; LD C,A
; IN A,(PORT_Y)
; LD B,A
; LD A,SYS_PAGE
; OUT (SLOT3),A
; LD (SYS_SP),SP
; LD SP,SYS_SP
; PUSH BC
; ;
; LD HL,(WIN_ID_0.HL)
; LD DE,(WIN_ID_0.DE)
; LD BC,(WIN_ID_0.BC)
; LD A,E
; AND A
; RRA
; OUT (PORT_Y),A
; EXX
; EX AF,AF'
; ENDM ;
; MACRO LP_END_PM
; EX AF,AF'
; EXX
; RLA
; LD E,A
; LD (WIN_ID_0.HL),HL ; ¬¥áâ® ¯¥ç â¨
; LD (WIN_ID_0.DE),DE
; LD (WIN_ID_0.BC),BC
; ;
; POP BC
; LD A,B
; OUT (PORT_Y),A
; LD A,C
; OUT (SLOT3),A
; LD SP,SYS_SP
; EXX
; EX AF,AF'
; RET
; ENDM ;
;
;------------------------------------------------------------------[#81]
LP_PRINT_ALL: CALL LP_BEG_P
EXX
LD C,A
EXX
LD A,#50
OUT (SLOT3),A
;
.loop: EXX
LD A,D
OUT (PORT_Y),A
INC D
.cont: LD (HL),C
EXX
LD A,E
EXX
INC L
LD (HL),A
DEC L
CORRECT_SCR_40_FORWARD
DJNZ_NEXT_HL
EXX
DJNZ .loop
JP LP_END_P
;------------------------------------------------------------------[#81]
;
;
;------------------------------------------------------------------[#82]
;
LP_PRINT_SYM: CALL LP_BEG_P
EXX
LD C,A
EXX
LD A,#50
OUT (SLOT3),A
;
.loop: EXX
LD A,D
OUT (PORT_Y),A
.cont: LD (HL),C
INC D
CORRECT_SCR_40_FORWARD
DJNZ_NEXT_HL
EXX
DJNZ .loop
JP LP_END_P
;------------------------------------------------------------------[#82]
;
;
;------------------------------------------------------------------[#83]
LP_PRINT_ATR: CALL LP_BEG_P
LD A,E
EXX
LD C,A
EXX
LD A,#50
OUT (SLOT3),A
;
.loop: EXX
LD A,D
OUT (PORT_Y),A
INC D
INC L
LD (HL),C
DEC L
CORRECT_SCR_40_FORWARD
DJNZ_NEXT_HL
EXX
DJNZ .loop
JP LP_END_P
;------------------------------------------------------------------[#83]
;
;
;------------------------------------------------------------------[#85]
LP_PRINT_LINE: CALL LP_BEG_P
EXX
LD C,PORT_Y
EXX
LD A,#50
OUT (SLOT3),A
;
.loop: EXX
OUT (C),D
INC D
EXX
LD A,(HL)
INC HL
EXX
LD (HL),A
EXX
LD A,E
EXX
INC L
LD (HL),A
DEC L
CORRECT_SCR_40_FORWARD
DJNZ_NEXT_HL
EXX
DJNZ .loop
JP LP_END_P
;------------------------------------------------------------------[#85]
;
;
;------------------------------------------------------------------[#86]
LP_PRINT_LINE2: CALL LP_BEG_P
EXX
LD C,PORT_Y
EXX
LD A,#50
OUT (SLOT3),A
;
.loop: LD A,(HL)
INC HL
EXX
OUT (C),D
INC D
LD (HL),A
CORRECT_SCR_40_FORWARD
DJNZ_NEXT_HL
EXX
DJNZ .loop
;LD A,SYS_PAGE
;OUT (SLOT3),A
JP LP_END_P
;------------------------------------------------------------------[#86]
;
;
;------------------------------------------------------------------[#87]
LP_PRINT_LINE3: CALL LP_BEG_P
LD A,#50
OUT (SLOT3),A
;
.loop: EXX
LD A,D
OUT (PORT_Y),A
INC D
EXX
LD A,(HL)
INC HL
CP D
JR NZ,.NoEnd
;
DEC HL
EXX
LD C,' '
JP LP_PRINT_ALL.cont
;
.NoEnd: EXX
LD (HL),A
EXX
LD A,E
EXX
INC L
LD (HL),A
DEC L
CORRECT_SCR_40_FORWARD
DJNZ_NEXT_HL
EXX
DJNZ .loop
JP LP_END_P
;------------------------------------------------------------------[#87]
;
;
;------------------------------------------------------------------[#88]
LP_PRINT_LINE4: CALL LP_BEG_P
LD A,#50
OUT (SLOT3),A
;
.loop: EXX
LD A,D
OUT (PORT_Y),A
EXX
LD A,(HL)
INC HL
CP D
JR NZ,.NoEndSymbol
;
DEC HL
EXX
LD C,' '
JP LP_PRINT_SYM.cont
;
.NoEndSymbol: EXX
LD (HL),A
INC D
CORRECT_SCR_40_FORWARD
DJNZ_NEXT_HL
EXX
DJNZ .loop
JP LP_END_P
;------------------------------------------------------------------[#88]
;
;
;------------------------------------------------------------------[#8B]
LP_PRINT_LINE5: CALL LP_BEG_P
LD A,#50
OUT (SLOT3),A
EXX
LD C,PORT_Y
EXX
;
.loop: EXX
OUT (C),D
EXX
LD A,(HL)
INC HL
CP D
JR Z,LP_END_P
;
EXX
LD (HL),A
EXX
LD A,E
EXX
INC L
LD (HL),A
DEC L
INC D
CORRECT_SCR_40_FORWARD
DJNZ_NEXT_HL
EXX
DJNZ .loop
;JP LP_END_P
;----------------- ------------------------------------[#8B]
; ®¦¨¤ ¥âáï, çâ® ¯®àâïâáï ⮫쪮  «ìâ¥à­ â¨¢­ë¥ ॣ¨áâàë ¨ â¥, çâ® ª ª ¯ à ¬¥âàë ­  ¢å®¤¥
LP_END_P: LD A,SYS_PAGE
OUT (SLOT3),A
;
.SYS_PAGE: EX AF,AF'
EXX
RLA
LD E,A
LD (WIN_ID_0.LineAddr),HL ; ¬¥áâ® ¯¥ç â¨
LD (WIN_ID_0.ColumnRGADR_TXTMode),DE
LD (WIN_ID_0.reg_BC),BC
CALL LP_CLOSE_PG
EXX
EX AF,AF'
AND A
RET
;
.short: EX AF,AF'
EXX
CALL LP_CLOSE_PG
EXX
EX AF,AF'
AND A
RET
;------------------------------------------------------------------[#8C]
LP_PRINT_LINE6: CALL LP_BEG_P
LD A,#50
OUT (SLOT3),A
EXX
LD C,PORT_Y
EXX
;
.loop: EXX
OUT (C),D
EXX
LD A,(HL)
INC HL
CP D
JR Z,LP_END_P
;
EXX
LD (HL),A
INC D
CORRECT_SCR_40_FORWARD
DJNZ_NEXT_HL
EXX
DJNZ .loop
JP LP_END_P
;------------------------------------------------------------------[#8C]
;
;
;------------------------------------------------------------------[#84]
; ¯®àâïâáï ⮫쪮  «ìâ¥à­ â¨¢­ë¥ ॣ¨áâàë ¨ â¥, çâ® ª ª ¯ à ¬¥âàë ­  ¢å®¤¥
LP_SET_PLACE: CALL LP_BEG_P
CALL LP_SET_CUR
JP LP_END_P.SYS_PAGE
;------------------------------------------------------------------[#84]
;
;
;------------------------------------------------------------------[#8E]
LP_GET_PLACE: CALL LP_BEG_P
LD A,(WIN_ID_0.H_BEG)
NEG
EXX
ADD A,D
EXX
LD E,A
LD A,(WIN_ID_0.V_BEG)
NEG
EXX
ADD A,L
DEC A
EXX
RRCA
RRCA
AND %0011'1111
LD D,A
; ०¨¬ txt 40
EX AF,AF'
JR C,.no_txt40
SRL E
AND A
.no_txt40: EX AF,AF'
JP LP_END_P.short
;------------------------------------------------------------------[#8E]
;
;
;-------------------------------------------------------------[#89, #8D]
;--------------------------------------------------------[#8D]
LP_CLS_WIN2: LD C,A
JR LP_CLS_WIN.START
;--------------------------------------------------------[#8D]
;--------------------------------------------------------[#89]
LP_CLS_WIN: LD C,' '
;---------------- -----------------------------[#89]
.START: CALL LP_BEG_P
CALL .CLS
JP LP_END_P.SYS_PAGE
;
.CLS: LD (SYS_PAGE.SYS_WORK1),BC ; á®åà ­¨âì æ¢¥â ; !TODO ¨á¯®«ì§®¢ âì ¯¥à¥¬¥­­ë¥ ®ª­ 
PUSH DE
; !TODO ¯à®¢¥àª  ­  ¯à¥¢ë襭¨¥ à §¬¥à  ®ª­  - ­® ᥩç á í⨠¯à®æ¥¤ãàë ¤«ï ¯®«­®£® íªà ­ 
; EXX
; LD A,B
; EXX
; CP L
; JR NC,.loop1
; LD L,A
;
.loop1: CALL LP_SET_CUR
PUSH DE
EXX
LD BC,(SYS_PAGE.SYS_WORK1) ; !TODO ¨á¯®«ì§®¢ âì ¯¥à¥¬¥­­ë¥ ®ª­ 
EXX
LD B,L
LD A,#50
OUT (SLOT3),A
;
.loop2: EXX
LD A,D
OUT (PORT_Y),A
LD (HL),C
INC L
LD (HL),B
DEC L
INC D
CORRECT_SCR_40_FORWARD
EXX
DJNZ .loop2
;
LD A,SYS_PAGE
OUT (SLOT3),A
POP DE
INC D
DEC H
JR NZ,.loop1
;
POP DE
JP LP_SET_CUR
;-------------------------------------------------------------[#89, #8D]
;
;
;------------------------------------------------------------------[#B8]
; DE -  ¤à¥á ªã¤  ¯¥à¥á« âì ä®­â
WIN_GET_ZG: LD HL,ZG_ADDRESS
LD BC,ZG_SIZE
LDIR
AND A
RET
;------------------------------------------------------------------[#B8]
;
;
;------------------------------------------------------------------[#B6]
WIN_SET_ZG: EX AF,AF' ; LP_SET_ZG:
EXX
CALL LP_OPEN_PG
CALL .SET
CALL LP_CLOSE_PG
EXX
EX AF,AF'
AND A
RET
;
.SET: IN A,(SLOT1) ;LP_SET_ZG1
LD (SYS_PAGE.COPY_SLOT1),A
LD A,SHARED_PAGE
OUT (SLOT1),A
EXX
LD BC,Port_All_Mode
IN A,(C)
LD (SYS_PAGE.SYS_WORK1),A
AND #FE ; Spectrum Screen on, accelerator and keyboard interrupt off
OUT (C),A
EX AF,AF'
LD B,A
AND #0F
ADD A,A
OUT (PORT_Y),A
LD A,B ; %xx00'0000
RRCA ; %0xx0'0000
RRCA ; %00xx'0000
RRCA ; %000x'x000
AND %0001'1000
OR %0100'0000
LD H,A
LD L,0
LD BC,ZG_SIZE
EX DE,HL
;[ ] 11/02/2024 ãáâ ­®¢ª  èà¨äâ  ¡®«¥¥ £¨¡ª ï ¡¥§ § ¯«ñ⮢
LD A,H
SUB #C0
JR NC,.change
;
LDIR
.cont: EX DE,HL
LD A,H
RRCA
RRCA
RRCA
DEC A
AND 3
ADD A,#58
LD H,A
;
.loop: LD (HL),L
INC L
JR NZ,.loop
;
LD A,(SYS_PAGE.SYS_WORK1)
LD BC,Port_All_Mode
OUT (C),A
EXX
EX AF,AF'
LD A,(SYS_PAGE.COPY_SLOT1)
OUT (SLOT1),A
RET
;
;[ ] 11/02/2024 ãáâ ­®¢ª  èà¨äâ  ¡®«¥¥ £¨¡ª ï ¡¥§ § ¯«ñ⮢
.change: LD A,(SYS_PAGE.COPY_SLOT3)
OUT (SLOT3),A
LDIR
LD A,SYS_PAGE
OUT (SLOT3),A
JR .cont
;------------------------------------------------------------------[#B6]
;
;*******************************************************
;
; WIN_MAP_SC - ª àâ  íªà ­ 
; 0 - hor size
; 1 - ver size
; 2 - hor place
; 3 - ver place
; ®¯à¥¤¥«¥­¨¥ size
LP_SIZE: CALL LP_OPEN_PG
LD DE,(WIN_ID_0.USER.SIZE_H)
LD A,(WIN_ID_0.USER.MODE)
AND %0010'0000
CALL LP_CLOSE_PG
RET NZ
; txt 40
SLA E
RET
;
; ®¦¨¤ ¥âáï, çâ® ¯®àâïâáï ⮫쪮  «ìâ¥à­ â¨¢­ë¥ ॣ¨áâàë ¨ â¥, çâ® ª ª ¯ à ¬¥âàë ­  ¢å®¤¥
; ãáâ ­®¢¨âì ªãàá®à:
; D - ­®¬¥à ᨬ¢®«  ¯® ¢¥à⨪ «¨
; E - ­®¬¥à ᨬ¢®«  ¯® £®à¨§®­â «¨
LP_SET_CUR: ; LP_AT_D:
LD A,(WIN_ID_0.USER.SIZE_V)
EXX
LD L,A
EXX
LD A,D
EXX
.loop_x: SUB L
JR NC,.loop_x
;
ADD A,L
ADD A,A
ADD A,A
LD L,A
;
LD A,(WIN_ID_0.V_BEG)
ADD A,L
LD L,A
INC L
LD H,#C3 ;!HARDCODE ­ ç «® ®¯¨á â¥«¥© ¢ SLOT3
EXX
;RET
;
;LP_TAB_E:
LD A,(WIN_ID_0.SIZE_REL)
EXX
LD D,A
EXX
LD A,E
EXX
.loop_y: SUB D
JR NC,.loop_y
JR Z,.loop_y
;
NEG
LD B,A ; á®åà ­¨âì ᪮«ìª® ®áâ «®áì ᨬ¢®«®¢ ¢ áâப¥
NEG
ADD A,D
LD D,A
;
EX AF,AF'
JR C,.LLL
SLA D ; ०¨¬ txt 40. ­¥ ¤®«¦­® áâ ¢¨âì CF
.LLL: EX AF,AF'
.skip_Dx2: LD A,(WIN_ID_0.H_BEG)
ADD A,D
LD D,A
EXX
RET
;*************************************************************
; ¢ëç¨á«¥­¨¥ ­®¢®£® ¬¥áâ 
LP_NEXT_HL: LD A,SYS_PAGE
OUT (SLOT3),A
LD A,4 ;!HARDCODE ¤«¨­  ®¤­®£® ®¯¨á â¥«ï ª¢ ¤à â¨ª 
ADD L
LD L,A
LD A,(WIN_ID_0.V_END)
CP L
JR C,.end_line
;
.no_end_line: LD A,(WIN_ID_0.H_BEG)
LD D,A
LD A,(WIN_ID_0.SIZE_REL)
LD B,A
LD A,#50
OUT (SLOT3),A
RET
;
.end_line: LD HL,(WIN_ID_0.V_BEG)
INC L
LD H,#C3 ;!HARDCODE ­ ç «® ®¯¨á â¥«¥© ¢ SLOT3
JP .no_end_line
; !®¦¨¤ ¥âáï, çâ® ¯®àâïâáï ⮫쪮  «ìâ¥à­ â¨¢­ë¥ ॣ¨áâàë ¨ â¥, çâ® ª ª ¯ à ¬¥âàë ­  ¢å®¤¥
LP_BEG_P: EX AF,AF'
EXX
CALL LP_OPEN_PG
LD HL,(WIN_ID_0.LineAddr)
LD DE,(WIN_ID_0.ColumnRGADR_TXTMode)
LD BC,(WIN_ID_0.reg_BC)
LD A,E
AND A
RRA
;OUT (PORT_Y),A
EXX
EX AF,AF'
RET
;
LP_INI_P: EX AF,AF'
EXX
CALL LP_OPEN_PG
LD A,(WIN_ID_0.USER.MODE)
CP #C0
JR NC,.NO_ZG ; ®âªàë⨥ ¡®à¤¥à ...
LD A,(WIN_ID_0.USER.MODE_S)
AND %0000'0001
JR NZ,.NO_ZG ; ®âªàë⨥ Spectrum-Screen
;
LD A,(WIN_ID_0.USER.MODE)
BIT 4,A
JR Z,.NO_ZG ; ®âªàë⨥ £à ä¨ç¥áª®£® íªà ­ 
;LD DE,(SYS_PAGE.WIN_ZG) ; §­ ª®£¥­¥à â®à
LD DE,ZG_ADDRESS ; §­ ª®£¥­¥à â®à
EXX
EX AF,AF'
CALL WIN_SET_ZG.SET ;LP_SET_ZG1 ;!TODO á⮨⠫¨ ª ¦¤ë© à § § ª¨¤ë¢ âì èà¨äâ?
EX AF,AF'
EXX
.NO_ZG: LD A,(WIN_ID_0.H_BEG)
LD D,A
LD A,(WIN_ID_0.V_BEG)
LD L,A
INC L
LD H,#C3
AND A
LD A,(WIN_ID_0.USER.MODE)
BIT 5,A
LD A,(WIN_ID_0.USER.SIZE_H)
JR NZ,.TXT_40
; TXT_80
ADD A,A
SCF
.TXT_40: LD B,A
LD (WIN_ID_0.SIZE_REL),A
EX AF,AF'
EXX
JP LP_END_P
;********************************************************
;
;------------------------------------------------------------------[#80]
LP_OPEN_S: LD A,B
ADD A,A
CP LP_SC_TAB.SIZE
CCF
RET C
PUSH HL
LD HL,LP_SC_TAB
ADD A,L
LD L,A
JR NC,.no_inc
INC H
.no_inc: LD A,(HL)
INC HL
LD H,(HL)
LD L,A
EX (SP),HL
RET
;
LP_SC_TAB: DW LP_SET_32 ; 0 - ᯥªâà㬮¢áª®¥ ®ª­® 32x24
DW LP_SET_64 ; 1 - ⥪á⮢®¥ ®ª­® 64x24
DW LP_SET_40 ; 2 - ⥪á⮢®¥ ®ª­® 40x32
DW LP_SET_80 ; 3 - ⥪á⮢®¥ ®ª­® 80x32
DW LP_SET_32.X ; 4 - ᯥªâà㬮¢áª®¥ ®ª­®, HL - ¯®«®¦¥­¨¥ ®ª­ 
DW LP_SET_64.X ; 5 - ⥪á⮢®¥ ®ª­® 64x24, HL - ¯®«®¦¥­¨¥ ®ª­ 
DW LP_SET_40.X ; 6 - ⥪á⮢®¥ ®ª­® 40x32, HL - ¯®«®¦¥­¨¥ ®ª­ 
DW LP_SET_80.X ; 7 - ⥪á⮢®¥ ®ª­® 80x32, HL - ¯®«®¦¥­¨¥ ®ª­ 
DW PIC_SET_S1 ; 8 - £à ä¨ç¥áª®¥ ®ª­® 0, HL - ¯®«®¦¥­¨¥ ®ª­ 
DW PIC_SET_S2 ; 9 - £à ä¨ç¥áª®¥ ®ª­® 1, HL - ¯®«®¦¥­¨¥ ®ª­ 
;DW LP_SET_MNU ; 10 - ;!TODO
.SIZE: EQU $-LP_SC_TAB
; !TODO
; LP_SET_MNU:
; LD IX,LP_SCR_MNU
; JP PIC_FN0_OpenWin
LP_SET_32: LD HL,#4104
.X: LD IX,LP_SCR_32
JP PIC_FN0_OpenWin
LP_SET_64: LD HL,#4104
.X: LD IX,LP_SCR_64
JP PIC_FN0_OpenWin
LP_SET_40: LD HL,#4000
.X: LD IX,LP_SCR_40
JP PIC_FN0_OpenWin
LP_SET_80: LD HL,#4000
.X: LD IX,LP_SCR_80
JP PIC_FN0_OpenWin
PIC_SET_S1: LD IX,PIC_320X256_1
JP PIC_FN0_OpenWin
PIC_SET_S2: LD IX,PIC_320X256_2
JP PIC_FN0_OpenWin
;------------------------------------------------------------------[#80]
;
;------------------------------------------------------------------[#B1]
; !TODO
WIN_CLOSE: SCF
RET
;------------------------------------------------------------------[#B1]
;
;
;------------------------------------------------------------------[#B0]
; IX - ®¯¨á â¥«ì ®ª­ 
WIN_OPEN.SCR1: LD E,1
; E - bit0 - ­®¬¥à íªà ­ 
WIN_OPEN: CALL .Prepare
LD L,(IX + Window_Variables.USER.PLACE_H)
LD H,(IX + Window_Variables.USER.PLACE_V)
JP WIN_OPEN_W1
;
.Prepare: CALL LP_OPEN_PG
PUSH HL
PUSH DE
;LD (SYS_PAGE.WIN_MAP_SC),IX ; ª àâ  ®ª­ 
;LD HL,(SYS_PAGE.WIN_MAP_SC)
PUSH IX
POP HL
LD DE,WIN_ID_0
LD BC,Window_UserVars
LDIR
LD IX,WIN_ID_0
POP DE
POP HL
LD (IX + Window_Variables.MODE_E),E
RET
;------------------------------------------------------------------[#B0]
;
;
;------------------------------------------------------------------[#A0]
; HL = X + Y*64 + #4000 + #1000*RGMOD. ¬¥áâ® ­  íªà ­¥ ¯® §­ ª®¬¥áâ ¬
; IX - ®¯¨á â¥«ì ®ª­ 
; E - bit0: ­®¬¥à íªà ­ 
;LP_SET_MODE:
PIC_FN0_OpenWin:
; 䨭⠤«ï ᮢ¬¥á⨬®á⨠ᮠáâ à묨 ¯à®£ ¬¨, £¤¥ ¯¥à¥¤ ¢ «¨áì ¤à㣨¥ ¯ à ¬¥âàë
LD A,H
AND %00001'0000 ; ¯¥à¥¬¥áâ¨âì ¡¨â 4 ¢ ॣ¨áâà E
XOR E
LD E,A
;
LD A,L
AND #3F
ADD HL,HL
ADD HL,HL
LD L,A
;
LD A,H
AND #3F
LD H,A
CALL WIN_OPEN.Prepare
LD (IX + Window_Variables.USER.PLACE_H),L
LD (IX + Window_Variables.USER.PLACE_V),H
;
WIN_OPEN_W1: LD A,L
ADD A,A
INC A ; ¢ëç¨á«¥­¨¥ PORT_Y
BIT 4,E
JR NZ,.NO_OR
OR #80 ; ¥á«¨ ¢ë¢®¤ ­  ¢â®à®© íªà ­
.NO_OR: LD (IX+Window_Variables.H_BEG),A
LD D,A
LD A,(IX+Window_Variables.USER.SIZE_H)
ADD A,A
ADD A,D
LD (IX+Window_Variables.H_END),A
;LD (SYS_PAGE.WIN_MODE_SC),DE ; ¬¥áâ® ¯® £®à¨§®­â «¨ ¨ áâà ­¨æ  ¬®¤ë
LD A,H
AND #3F
ADD A,A
ADD A,A
LD L,A
LD H,A
;LD (SYS_PAGE.WIN_MODE_SH),HL ; ¬¥áâ® ¯® ¢¥à⨪ «¨ á  ¤à¥á®¬
LD (IX+Window_Variables.V_BEG),A
LD A,(IX+Window_Variables.USER.SIZE_V)
ADD A,A
ADD A,A
ADD A,L
LD (IX+Window_Variables.V_END),A
;
;LD L,(IX+Window_Variables.V_BEG)
LD L,H
LD H,#C3
LD B,(IX+Window_Variables.USER.SIZE_V) ; à §¬¥à ¯® ¢¥à⨪ «¨
LD (IX+Window_Variables.WORK_1),0
LD A,(IX+Window_Variables.USER.MODE) ; §­ ª®£¥­¥à â®à ¯«îá ०¨¬
LD (IX+Window_Variables.WORK_2),A
BIT 4,A
JR NZ,.LOOP ; ¯¥à¥å®¤, ¥á«¨ ⥪áâ®¢ë© à¥¦¨¬
;
AND #F0
LD C,A
LD A,(IX+Window_Variables.USER.GR_X)
RRCA
RRCA
RRCA
LD D,A
AND #0F
OR C
LD (IX+Window_Variables.WORK_2),A
;
LD A,D
AND #E0
LD C,A
LD A,(IX+Window_Variables.USER.GR_Y)
AND #1F
OR C
RLCA
RLCA
RLCA
LD (IX+Window_Variables.WORK_1),A
.LOOP: LD D,(IX+Window_Variables.H_BEG) ; D - ­ ç «® áâப¨ (PORT_Y)
LD C,(IX+Window_Variables.USER.SIZE_H) ; à §¬¥à ¯® £®à¨§®­â «¨
LD A,(IX+Window_Variables.USER.MODE) ; §­ ª®£¥­¥à â®à ¯«îá ०¨¬
PUSH BC
CALL LP_MODE_LINE
POP BC
INC L
INC L
INC L
INC L
DJNZ .LOOP
;
LD A,(IX+Window_Variables.MODE_E)
AND 1
OUT (SCREEN_SWITCH),A
;LD A,(IX+Window_Variables.MODE)
;BIT 4,A
CALL LP_CLOSE_PG
;RET Z
CALL LP_INI_P
;LD A,(SYS_PAGE.WIN_MODE_SC)
;OUT (RGMOD),A
; ­¨£¤¥ ­¥ ¡ë«® ®¯¨á ­®
CALL LP_SIZE
; DE - à §¬¥àë ®ª­ 
;
XOR A ;!TODO ­®¬¥à ®ª­ 
RET
;
; “áâ ­®¢ª  ०¨¬  ­  «¨­¨¨
LP_MODE_LINE: BIT 0,(IX+Window_Variables.USER.MODE_S)
JP NZ,.Spectrum ; ¨¤â¨ ­  ᯥªâàã¬
BIT 4,A
JP Z,.Graphic ; ¨¤â¨ ­  £à ä¨ªã!
DEC D
; ⥪áâ®¢ë© à¥¦¨¬.
EX AF,AF'
LD A,#50
OUT (SLOT3),A
LD A,L ; ¢¥à⨪ «ì­®¥ ¯®«®¦¥­¨¥
CP #80
JR NC,.Exit_txt
;
CALL .RECURSE
JR NC,.Exit_txt
;
CALL .CALC_C
;
.loop_txt_scr: EX AF,AF'
LD A,D
OUT (PORT_Y),A
EX AF,AF'
LD (HL),A ; ०¨¬
INC D
EX AF,AF'
LD A,D
OUT (PORT_Y),A
EX AF,AF'
LD (HL),A ; ०¨¬
INC D
DEC C
JR NZ,.loop_txt_scr
;
EX AF,AF'
.Exit_txt: LD A,SYS_PAGE
OUT (SLOT3),A
EX AF,AF'
RET
;
; Spectrum mode
.Spectrum: LD A,(IX+Window_Variables.WORK_2)
LD B,(IX+Window_Variables.WORK_1)
DEC D
EX AF,AF'
LD A,#50
OUT (SLOT3),A
LD A,L ; ¢¥à⨪ «ì­®¥ ¯®«®¦¥­¨¥
CP #80
JR NC,.Exit_zx_scr
;
CALL .RECURSE
JR NC,.Exit_zx_scr
;
CALL .CALC_C
;
.loop_zx_scr: EX AF,AF'
LD A,D
OUT (PORT_Y),A
EX AF,AF'
LD (HL),A ; ०¨¬
;
INC L
LD (HL),B
INC L
LD (HL),B
DEC L
DEC L
;
INC D
BIT 4,A
JR NZ,.no_inc_B_zx
;
INC B
.no_inc_B_zx: EX AF,AF'
LD A,D
OUT (PORT_Y),A
EX AF,AF'
;
LD (HL),A ; ०¨¬
INC L
LD (HL),B
INC L
LD (HL),B
DEC L
DEC L
;
INC D
INC B
JR NZ,.NO_ADD_40
;
ADD A,#40
.NO_ADD_40: DEC C
JR NZ,.loop_zx_scr
EX AF,AF'
;
.Exit_zx_scr: LD A,SYS_PAGE
OUT (SLOT3),A
EX AF,AF'
LD (IX+Window_Variables.WORK_1),B
LD (IX+Window_Variables.WORK_2),A
RET
;
; Graphic Mode
.Graphic: LD A,(IX+Window_Variables.WORK_1)
LD B,(IX+Window_Variables.WORK_2)
DEC D
EX AF,AF'
LD A,#50
OUT (SLOT3),A
LD A,L ; ¢¥à⨪ «ì­®¥ ¯®«®¦¥­¨¥
CP #80
JR NC,.Exit2_GFX_scr
;
CALL .RECURSE
JR NC,.Exit2_GFX_scr
;
CALL .CALC_C
;
BIT 5,B
JR Z,.GFX_640_Loop
;
; GFX 320
.loop_GFX_scr: EX AF,AF'
LD A,D
OUT (PORT_Y),A
EX AF,AF'
LD (HL),B ; mode 0
INC L
LD (HL),A ; mode 1
INC L
LD (HL),0 ; mode 2
DEC L
DEC L
INC D
;
;EX AF,AF'
;LD A,D
;OUT (PORT_Y),A
;EX AF,AF'
;LD (HL),B ; ०¨¬
;INC L
;LD (HL),A ; ०¨¬ 2
;DEC L
;
INC D
INC A
LD E,A
AND 7
JR NZ,.NO_INC_B_320
;
LD A,E
SUB 8
LD E,A
INC B
.NO_INC_B_320: LD A,E
DEC C
JR NZ,.loop_GFX_scr
;
.Exit_GFX_scr: EX AF,AF'
.Exit2_GFX_scr: LD A,SYS_PAGE
OUT (SLOT3),A
EX AF,AF'
LD A,(IX+Window_Variables.WORK_1)
ADD A,8
LD (IX+Window_Variables.WORK_1),A
RET
;
; GFX 640
.GFX_640_Loop: EX AF,AF'
LD A,D
OUT (PORT_Y),A
EX AF,AF'
LD (HL),B ; mode 0
INC L
LD (HL),A ; mode 1
INC L
LD (HL),0 ; mode 2
;
INC D
EX AF,AF'
LD A,D
OUT (PORT_Y),A
EX AF,AF'
LD (HL),0 ; mode 2
DEC L
LD (HL),A ; mode 1
DEC L
LD (HL),B ; mode 0
;
INC D
INC A
LD E,A
AND 7
JR NZ,.NO_INC_B_640
;
LD A,E
SUB 8
LD E,A
INC B
.NO_INC_B_640: LD A,E
DEC C
JR NZ,.GFX_640_Loop
JP .Exit_GFX_scr
;
.RECURSE: LD A,D ; £®à¨§®­â «ì­®¥ ¯®«®¦¥­¨¥
AND #7F
SUB 80
RET C
SUB 48
NEG
LD E,A ; § ¯®¬­¨âì
ADD A,D
LD D,A ; ­®¢®¥ ¯®«®¦¥­¨¥
LD A,E ; ¢®ááâ ­®¢¨âì
RRA
AND #3F
SUB C
RET NC
NEG
LD C,A ; ­®¢®¥ §­ ç¥­¨¥ C
JR .RECURSE
;
.CALC_C: NEG
RRA
AND #3F
CP C
JR NC,.NoChangeC
LD C,A
.NoChangeC: EX AF,AF'
INC D
RET
;*****************************************************************
LP_SCROLL_UD: DEC B
JR Z,LP_SCROLL_UP
DEC B
JR Z,LP_SCROLL_DN
SCF
RET
; ‚室:
; D - ¢¥àå­ïï áâப  ( ®â 0 )
; E - ç¨á«® áªà®««¨à㥬ëå áâப
LP_SCROLL_UP: DEC E
RET Z
CALL LP_OPEN_PG
;
LD B,E
LD E,0 ; ¢áî áâப㠮ª­  áªà®««¨¬
CALL .RUN
JP LP_CLOSE_PG
;
;
.RUN: CALL LP_SET_CUR ; ¢ëç¨á«¨âì ¯¥à¥¬¥­­ë¥ ¤«ï áâப¨
PUSH IX
LD IX,(WIN_ID_0.USER.SIZE_H)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;!TODO
; ®â«¨ç¨¥ ®â LP_SCROLL_DN
LD A,(WIN_ID_0.V_END)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LD C,A
LD A,#50
OUT (SLOT3),A ; ®âªàëâì áâà ­¨æã ¤«ï ¯¥à¥­®á 
;
.loop2: EXX
PUSH HL
EXX
POP HL
;
LD E,L
LD D,H
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;!TODO
; ®â«¨ç¨¥ ®â LP_SCROLL_DN
LD A,4
ADD L
LD L,A
;
LD A,C ; LD A,(WIN_ID_0.V_END)
CP L
JR C,.exit ; ¥á«¨ ª®­¥æ, â® ¢ë室
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
PUSH BC
LD A,L
EXX
LD L,A
EXX
;XH
LD A,XL ; WIN_ID_0.USER.SIZE_H
; LD A,SYS_PAGE
; OUT (SLOT3),A
; LD A,(WIN_ID_0.USER.SIZE_H)
ADD A,A ; ç¨á«® ¡ ©â ¢ áâப¥ ¤«ï ¯¥à¥­®á 
ADD A,A
LD C,A
LD B,0
; LD A,#50
; OUT (SLOT3),A ; ®âªàëâì áâà ­¨æã ¤«ï ¯¥à¥­®á 
;
EXX
LD A,D ; ¯®«ãç¨âì ¯®àâ ­ ç «  áâப¨
EXX
.loop1: OUT (PORT_Y),A
INC A ; á«¥¤ãî饥 §­ ç¥­¨¥ ¯®àâ 
LDI
LDD
;
OUT (PORT_Y),A
INC A ; á«¥¤ãî饥 §­ ç¥­¨¥ ¯®àâ 
LDI
LDD
JP PE,.loop1
;
POP BC
DJNZ .loop2
.exit: POP IX
RET
; ‚室 :
; D - ¢¥àå­ïï áâப  ( ®â 0 )
; E - ç¨á«® áªà®««¨à㥬ëå áâப
LP_SCROLL_DN: DEC E
RET Z
CALL LP_OPEN_PG
;
LD B,E
LD E,0
LD A,D
ADD A,B
LD D,A
CALL .RUN
.EXIT: JP LP_CLOSE_PG
;
;
.RUN: CALL LP_SET_CUR
PUSH IX
LD IX,(WIN_ID_0.USER.SIZE_H)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;!TODO
; ®â«¨ç¨¥ ®â LP_SCROLL_UD
LD A,(WIN_ID_0.V_BEG)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LD C,A
LD A,#50
OUT (SLOT3),A ; ®âªàëâì áâà ­¨æã ¤«ï ¯¥à¥­®á 
;
.loop2: EXX
PUSH HL
EXX
POP HL
;
LD E,L
LD D,H
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;!TODO
; ®â«¨ç¨¥ ®â LP_SCROLL_UD
LD A,L
SUB 4
LD L,A
;
LD A,C
CP L ; .CONT: L >= A
JR Z,.CONT
JR NC,.exit ; ¥á«¨ ª®­¥æ, â® ¢ë室
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.CONT: PUSH BC
LD A,L
EXX
LD L,A
EXX
;
LD A,XL ; WIN_ID_0.USER.SIZE_H
; LD A,SYS_PAGE
; OUT (SLOT3),A
; LD A,(WIN_ID_0.USER.SIZE_H)
ADD A,A ; ç¨á«® ¡ ©â ¢ áâப¥ ¤«ï ¯¥à¥­®á 
ADD A,A
LD C,A
LD B,0
; LD A,#50
; OUT (SLOT3),A ; ®âªàëâì áâà ­¨æã ¤«ï ¯¥à¥­®á 
;
EXX
LD A,D ; ¯®«ãç¨âì ¯®àâ ­ ç «  áâப¨
EXX
.loop1: OUT (PORT_Y),A
INC A ; á«¥¤ãî饥 §­ ç¥­¨¥ ¯®àâ 
LDI
LDD
;
OUT (PORT_Y),A
INC A ; á«¥¤ãî饥 §­ ç¥­¨¥ ¯®àâ 
LDI
LDD
JP PE,.loop1
;
POP BC
DJNZ .loop2
.exit: POP IX
RET
; DE - ¬¥á⮠ᨬ¢®«  ¢ ®ª­¥
; € - ­®¬¥à ®ª­ 
; ¢ë室: HL - ᨬ¢®«/ âਡãâ B - §­ ª®£¥­¥à â®à
WIN_GET_SYM: AND A
SCF
RET NZ
;
CALL LP_BEG_P
CALL LP_SET_CUR
LD A,#50
OUT (SLOT3),A
;
EXX
LD A,D
OUT (PORT_Y),A
LD A,(HL)
EXX
LD L,A
EXX
INC L
LD A,(HL)
EXX
LD H,A
EXX
DEC L
DEC L
LD A,(HL)
INC L
EXX
LD B,A
JP LP_END_P
;RET
; DE - ¬¥á⮠ᨬ¢®«  ¢ ®ª­¥
; € - ­®¬¥à ®ª­ 
; HL - ᨬ¢®«/ âਡãâ
; B - §­ ª®£¥­¥à â®à
WIN_PUT_SYM: AND A
SCF
RET NZ
;
CALL LP_BEG_P
CALL LP_SET_CUR
LD A,#50
OUT (SLOT3),A
;
EXX
LD A,D
OUT (PORT_Y),A
EXX
; [ ] 31/03/2025 ¥á«¨ B=0, â® ª« ¤ñ¬ ⮫쪮 ᨬ¢®«
; ¥á«¨ B=1, â® ª« ¤ñ¬ ᨬ¢®« á  âਡã⮬
; ᨬ¢®«
; LD A,L
; EXX
; LD (HL),A
; INC L
; EXX
; ;  âਡãâ
; LD A,H
; EXX
; LD (HL),A
; DEC L
; DEC L
; EXX
; ; èà¨äâ
; LD A,B
; EXX
; LD (HL),A
; INC L
; EXX
; JP LP_END_P
;
; èà¨äâ
LD A,B
OR A
JR Z,.onlySymbol
DEC B
JR Z,.noChangeZG
;
EXX
DEC L
LD (HL),A
INC L
EXX
;  âਡãâ
.noChangeZG: LD A,H
EXX
INC L
LD (HL),A
DEC L
EXX
; ᨬ¢®«
.onlySymbol: LD A,L
EXX
LD (HL),A
EXX
JP LP_END_P
; HL - à §¬¥à ®ª­ 
; DE - ¯®«®¦¥­¨¥ ®ª­ 
; A - ­®¬¥à ®ª­ 
; IX - ­®¢®¥ ¯®«®¦¥­¨¥ ®ª­ 
WIN_MOVE: AND A
SCF
RET NZ
PUSH IX
PUSH HL
LD B,SHARED_PAGE
LD IX,SLOT3.MEM_ADDR
CALL WIN_COPY_WIN1
POP HL
POP DE
LD B,SHARED_PAGE
LD IX,SLOT3.MEM_ADDR
CALL WIN_RESTORE.Start
AND A
RET
; HL - à §¬¥à á®å࠭塞®£® ®ª­ 
; DE - ¬¥áâ® á®å࠭塞®£® ®ª­ 
; IX -  ¤à¥á á®å࠭塞®£® ®ª­ , ¢ áâà ­¨æ¥ 4000h
; € - ­®¬¥à ®ª­ , B - áâà ­¨æ 
WIN_COPY: AND A
SCF
RET NZ
WIN_COPY_WIN1: CALL LP_BEG_P
IN A,(SLOT1)
PUSH AF
;
CALL LP_SET_CUR
LD (SYS_PAGE.SYS_WORK1),SP
LD A,B
OUT (SLOT3),A
LD A,#50
OUT (SLOT1),A
;
EXX
RES 7,H
LD C,D
EXX
;
.COPY_loop2: LD A,L
EXX
LD B,A
ADD A,A
ADD A,XL
LD XL,A
JR NC,.NO_INC_XH
;
INC XH
.NO_INC_XH: LD SP,IX
LD A,C
ADD A,B
.COPY_loop: DEC A
OUT (PORT_Y),A
LD E,(HL)
INC L
LD D,(HL)
DEC L
PUSH DE
DJNZ .COPY_loop
;
INC HL
INC HL
INC HL
INC HL
EXX
DEC H
JR NZ,.COPY_loop2
;
LD A,SYS_PAGE
OUT (SLOT3),A
LD SP,(SYS_PAGE.SYS_WORK1)
;
POP AF
OUT (SLOT1),A
JP LP_END_P.short
;
; HL - à §¬¥à á®å࠭塞®£® ®ª­ 
; DE - ¬¥áâ® á®å࠭塞®£® ®ª­ 
; IX -  ¤à¥á ¤ ­­ëå ¢®ááâ ­ ¢«¨¢ ¥¬®£® ®ª­ 
WIN_RESTORE: AND A
SCF
RET NZ
.Start:
CALL LP_BEG_P
;
IN A,(SLOT1)
PUSH AF
;
CALL LP_SET_CUR
;
LD (SYS_PAGE.SYS_WORK1),SP
LD SP,IX
;
LD A,B
OUT (SLOT3),A
LD A,#50
OUT (SLOT1),A
;
EXX
RES 7,H
LD C,D
EXX
.L2: LD A,L
EXX
LD B,A
LD A,C
.L1: OUT (PORT_Y),A
INC A
POP DE
LD (HL),E
INC L
LD (HL),D
DEC L
DJNZ .L1
;
INC HL
INC HL
INC HL
INC HL
EXX
DEC H
JR NZ,.L2
LD A,SYS_PAGE
OUT (SLOT3),A
LD SP,(SYS_PAGE.SYS_WORK1)
POP AF
OUT (SLOT1),A
JP LP_END_P.short
;======================================================================;
; <20>¥ç âì á ã¯à ¢«ïî騬¨ ᨬ¢®« ¬¨ ¢ ª®­á®«ì
;------------------------------------------------------------------[#E0]
LP_PR_LINE_DIR:
;>------------------------------------------------[BELL]
.BELL: EXX
PUSH HL
PUSH BC
;
LD DE,1200
LD HL,4
CALL BEEP
;
POP BC
POP HL
EXX
JR .loop
;-------------------------------------------------[BELL]
;>------------------------------------------------[Backspace]
.BACK: LD A,(WIN_ID_0.H_BEG)
CP D
JR Z,.loop
INC B
DEC D
CORRECT_SCR_40_BACKWARD
JP .loop
;>------------------------------------------------[Backspace]
;
.EXIT_SpecSymbol:
DEC HL
CALL LP_END_P
POP IX
SCF
RET
;
.EXIT: POP IX
JP LP_END_P
;;;;;;;;;;;;;;;;;
; A -  âਡãâë ¢ë¢®¤¨¬®£® ᨬ¢®«  ¥á«¨ CF'
; A' - ¥á«¨ !=0 â® ¡¥§ áªà®«« 
; CF - XY-mode
; DE - ¬¥á⮠ᨬ¢®«  ¢ ®ª­¥, ¥á«¨ CF=1
; HL -  ¤à¥á á ¢ë¢®¤¨¬®© áâப®©
; B - 梥⠪®­á®«¨ (¨á¯®«ì§ã¥âáï ¯à¨ áªà®««¥ ¨ ®ç¨á⪥ ®ª­ )
; IY - ¤¢  ᯥæ.ᨬ¢®«  ¤«ï ¢ë室  á CF=1. „®«¦­ë ¡ëâì à ¢­ë 0, ¥á«¨ ­¥ ­ã¦­ë
; CF' - ¢ë¢®¤¨âì ᨬ¢®« á  âਡãâ ¬¨
;;;;;;;;;;;;;;;;;
.START: PUSH IX
LD XL,A ;  âਡãâë ¢ë¢®¤¨¬®£® ᨬ¢®« 
;
EX AF,AF'
PUSH AF ; attr-mode
EX AF,AF'
;
IN A,(SLOT3)
LD C,A
CALL LP_BEG_P
CALL C,LP_SET_CUR ; mode for DE
LD A,B
; ¤ «¥¥ ॣ B ᢮¡®¤¥­, ¬®¦­® § ¤¥©á⢮¢ âì
LD (SYS_PAGE.SYS_WORK2),A ; 梥⠪®­á®«¨
POP AF ; attr-mode, scroll on/off
LD B,A ; scroll on/off
EXX
RL C ; C' - attr-mode. ¢ë¢®¤¨âì  âਡãâ
.loop: LD A,D
OUT (PORT_Y),A
EXX
LD A,C
OUT (SLOT3),A
;
LD A,(HL)
LD XH,A
INC HL
AND A
JR Z,.EXIT
CP YH
JR Z,.EXIT_SpecSymbol
CP YL
JR Z,.EXIT_SpecSymbol
;
EXX
; ¯¥ç â ¥¬ë¥ ᨬ¢®«ë
CP 14
JR NC,.print
CP 7
JR C,.print
; ã¯à ¢«ïî騥 ᨬ¢®«ë
LD A,SYS_PAGE
OUT (SLOT3),A
LD A,XH
;
SUB 7
JR Z,.BELL ; A = 07 "BELL"
DEC A
JR Z,.BACK ; A = 08 "Backspace"
DEC A
JR Z,.TAB ; A = 09 "TAB"
DEC A
JR Z,.LineFeed ; € = 10 "Line Feed"
DEC A
JR Z,.VertTab ; € = 11 "Vertical Tabulation"
DEC A
JR Z,.CLS ; € = 12 "Form feed" - à §àë¢ áâà ­¨æë, ­ ç «® ­®¢®£® «¨áâ , ¬®¦¥â à ¡®â âì ª ª VT
;DEC A
;JR Z,.CR ; € = 13 "Carriage Return"
;>------------------------------------------------[CR]
.CR: LD A,(WIN_ID_0.H_BEG)
LD D,A
LD A,(WIN_ID_0.SIZE_REL)
LD B,A
JP .loop
;-------------------------------------------------[CR]
;>------------------------------------------------[PRINT]
.print: LD A,#50
OUT (SLOT3),A
LD A,XH
LD (HL),A
; ¢ë¢®¤¨âì  âਡãâ
RR C ; C' - attr flag
JR NC,.NoPutAttr
;
INC L
LD A,XL
LD (HL),A
DEC L
.NoPutAttr: RL C ; C' - attr flag
INC D
.next_full: CORRECT_SCR_40_FORWARD
.next: DJNZ .loop
CALL LP_NEXT_HL_DIR
JP .loop
;-------------------------------------------------[PRINT]
;>------------------------------------------------[TAB]
.TAB: LD A,(WIN_ID_0.H_BEG)
SUB D
NEG
AND %0000'0111
NEG
ADD A,8
CP B
JR C,.keep_A
;
LD A,B
DEC A
.keep_A: ;NEG
PUSH BC ; save C' - attr flag
LD C,A
EX AF,AF'
JR C,.LLL
;
EX AF,AF'
ADD A,A ; ०¨¬ 40
EX AF,AF'
.LLL: EX AF,AF'
;
.tabNxt: ADD A,D
LD D,A
LD A,B
SUB C ; set XL
POP BC ; restore C' - attr flag
LD B,A
JP .loop
;
;-------------------------------------------------[TAB]
;>------------------------------------------------[Line Feed]
.VertTab: ;
.LineFeed: LD A,4 ;!HARDCODE ¤«¨­  ®¤­®£® ®¯¨á â¥«ï ª¢ ¤à â¨ª 
ADD L
LD L,A
;
LD A,(WIN_ID_0.V_END)
CP L
CALL C,LP_NEXT_HL_DIR.end_line
JP .loop
;-------------------------------------------------[Line Feed]
;>------------------------------------------------[Form feed]
.CLS: PUSH BC ; C' - attr flag
EXX
PUSH BC
PUSH HL
PUSH DE
;
LD A,(SYS_PAGE.SYS_WORK2) ; 梥⠪®­á®«¨
LD B,A
LD DE,0
LD HL,(WIN_ID_0.USER.SIZE_H) ; get WIN XY
LD A,(WIN_ID_0.SIZE_REL)
LD L,A
LD C," "
CALL LP_CLS_WIN.CLS
;
POP DE
POP HL
POP BC
EXX
LD A,B
POP BC ; C' - attr flag
LD B,A
JP .loop
;-------------------------------------------------[Form feed]
;------------------------------------------------------------------[#E0]
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LP_NEXT_HL_DIR: LD A,SYS_PAGE
OUT (SLOT3),A
LD A,4 ;!HARDCODE ¤«¨­  ®¤­®£® ®¯¨á â¥«ï ª¢ ¤à â¨ª 
ADD L
LD L,A
LD A,(WIN_ID_0.V_END)
CP L
CALL C,.end_line
;
.no_end_line: LD A,(WIN_ID_0.H_BEG)
LD D,A
LD A,(WIN_ID_0.SIZE_REL)
LD B,A
RET
;
.end_line: LD A,L
SUB 4 ;!HARDCODE ¤«¨­  ®¤­®£® ®¯¨á â¥«ï ª¢ ¤à â¨ª 
LD L,A
; ¨£­®à¨¬ áªà஫« ¨«¨ ­¥â?
EXX
LD A,B
EXX
AND A
RET NZ ; ZF=0 ¨£­®à áªà®«« 
;
PUSH HL
DEC L
PUSH BC
PUSH DE
EXX
PUSH BC
PUSH HL
PUSH DE
LD A,(WIN_ID_0.V_BEG)
LD D,A
LD A,(WIN_ID_0.USER.SIZE_V)
LD B,A
LD E,0 ; ¢áî áâப㠮ª­  áªà®««¨¬
CALL LP_SCROLL_UP.RUN
;
LD A,SYS_PAGE
OUT (SLOT3),A
LD C," "
LD A,(SYS_PAGE.SYS_WORK2) ; 梥⠪®­á®«¨
LD B,A
LD A,(WIN_ID_0.USER.SIZE_V)
DEC A
LD D,A
LD E,0
LD HL,(WIN_ID_0.SIZE_REL)
LD H,1
LD C," "
CALL LP_CLS_WIN.CLS
;
POP DE
POP HL
POP BC
EXX
POP DE
POP BC
POP HL
RET
;
; LD HL,(WIN_ID_0.V_END)
; DEC L
; DEC L
; DEC L
; LD H,#C3
; ;
; LD A,(WIN_ID_0.H_BEG)
; LD D,A
; ;
; LD A,#50
; OUT (SLOT3),A
; ;
; EXX
; LD A,(WIN_ID_0.SIZE_REL)
; LD B,A
; .loop_cl_line: EXX
; LD A,D
; OUT (PORT_Y),A
; LD (HL),C
; INC D
; CORRECT_SCR_40_FORWARD
; EXX
; DJNZ .loop_cl_line
; LD A,SYS_PAGE
; OUT (SLOT3),A
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LP_OPEN_PG: IN A,(SLOT3)
LD C,A
LD A,SYS_PAGE
OUT (SLOT3),A
;
LD A,C
LD (SYS_PAGE.COPY_SLOT3),A
IN A,(PORT_Y)
LD (SYS_PAGE.COPY_RGADR),A
RET
;
; ­¥ ¤®«¦­  ¢«¨ïâì ­  ä« £¨ ¨ âண âì ॣ¨áâàë ªà®¬¥ A
LP_CLOSE_PG: LD A,(SYS_PAGE.COPY_RGADR)
OUT (PORT_Y),A
LD A,(SYS_PAGE.COPY_SLOT3)
OUT (SLOT3),A
RET
/*
;!TODO áâ à ï LP_SET_MODE - à áª®¢ëàïâì áâ àë© LP_SCR_MNU
MODULE EXPERIMENT
; byte 1
; 0..4 - VIDEO_PAGE
; 5 - mode 42/84 ; 0 - 42,1 - 84
; 6 - next line
; 7 - end table
; byte 2 - number of places
; byte 3..4 - adress places/
; 4000-5FFF - Spectrum modes/ C000-FFFF - Graf mode
;
MACRO LP_S PG,XX,ADR
DB PG,XX
DW ADR
ENDM
MACRO LP_OPEN_PG
IN A,(SLOT3)
LD C,A
LD A,SYS_PAGE
OUT (SLOT3),A
;
LD A,C
LD (SYS_PAGE.COPY_SLOT3),A
IN A,(PORT_Y)
LD (SYS_PAGE.COPY_RGADR),A
ENDM ;
MACRO LP_CLOSE_PG
LD A,(SYS_PAGE.COPY_RGADR)
OUT (PORT_Y),A
LD A,(SYS_PAGE.COPY_SLOT3)
OUT (SLOT3),A
ENDM ;
;---------------------------------------
GR_BIT_END: EQU 7
S_BIT_END: EQU 7
S_BIT_LIN: EQU 6
S_BIT_MOD: EQU 5
BIT_1440: EQU 1
BIT_MASK_1440: EQU %00000010
MODE_PAGE: EQU #FC
;---------------------------------------
;DS (($/4)*4+4-$)
ALIGN 4
LP_SCR_MNU:
LP_S #40,14,#40E7
LP_S #40,14,#4807
LP_S #40,14,#4827
LP_S #40,14,#4847
LP_S #40,14,#4867
LP_S #40,14,#4887
LP_S #40,14,#48A7
LP_S #40,14,#48C7
LP_S #40,14,#48E7
DB #FF,0,0,0
; LP_SCR_80:
; DB 40,32,0,0,#1B,0,0,0
; DB 0,0,0,0,0,0,0,0
; LP_S %0110'0010,40,#4000
; LP_S %0110'0010,40,#4028
; LP_S %0110'0010,40,#4050
; LP_S %0110'0010,40,#4078
; LP_S %0110'0010,40,#40A0
; LP_S %0110'0010,40,#40C8
;
; LP_S %0110'0010,40,#4800
; LP_S %0110'0010,40,#4828
; LP_S %0110'0010,40,#4850
; LP_S %0110'0010,40,#4878
; LP_S %0110'0010,40,#48A0
; LP_S %0110'0010,40,#48C8
;
; LP_S %0110'0010,40,#5000
; LP_S %0110'0010,40,#5028
; LP_S %0110'0010,40,#5050
; LP_S %0110'0010,40,#5078
; LP_S %0110'0010,40,#50A0
; LP_S %0110'0010,40,#50C8
;
; LP_S %0110'0100,40,#4000
; LP_S %0110'0100,40,#4028
; LP_S %0110'0100,40,#4050
; LP_S %0110'0100,40,#4078
; LP_S %0110'0100,40,#40A0
; LP_S %0110'0100,40,#40C8
;
; LP_S %0110'0100,40,#4800
; LP_S %0110'0100,40,#4828
; LP_S %0110'0100,40,#4850
; LP_S %0110'0100,40,#4878
; LP_S %0110'0100,40,#48A0
; LP_S %0110'0100,40,#48C8
;
; LP_S %0110'0100,40,#5000
; LP_S %0110'0100,40,#5028
;
; DEFB #FF,0,0,0
;
; LP_SCR_40:
; DB 40,32,0,0,7BH,0,0,0
; DB 0,0,0,0,0,0,0,0
;
; LP_S 01000100B,40,5050H
; LP_S 01000100B,40,5078H
; LP_S 01000100B,40,50A0H
; LP_S 01000100B,40,50C8H
;
; LP_S 01000110B,40,4000H
; LP_S 01000110B,40,4028H
; LP_S 01000110B,40,4050H
; LP_S 01000110B,40,4078H
; LP_S 01000110B,40,40A0H
; LP_S 01000110B,40,40C8H
;
; LP_S 01000110B,40,4800H
; LP_S 01000110B,40,4828H
; LP_S 01000110B,40,4850H
; LP_S 01000110B,40,4878H
; LP_S 01000110B,40,48A0H
; LP_S 01000110B,40,48C8H
;
; LP_S 01000110B,40,5000H
; LP_S 01000110B,40,5028H
; LP_S 01000110B,40,5050H
; LP_S 01000110B,40,5078H
; LP_S 01000110B,40,50A0H
; LP_S 01000110B,40,50C8H
;
; LP_S 01001000B,40,4000H
; LP_S 01001000B,40,4028H
; LP_S 01001000B,40,4050H
; LP_S 01001000B,40,4078H
; LP_S 01001000B,40,40A0H
; LP_S 01001000B,40,40C8H
;
; LP_S 01001000B,40,4800H
; LP_S 01001000B,40,4828H
; LP_S 01001000B,40,4850H
; LP_S 01001000B,40,4878H
;
; DEFB 0FFh,0,0,0
;
; LP_SCR_32:
; DB 32,24,4,4,30H,1,0,0
; DB 0,0,0,0,0,0,0,0
;
; LP_S 040h,32,04000H
; LP_S 040h,32,04020H
; LP_S 040h,32,04040H
; LP_S 040h,32,04060H
; LP_S 040h,32,04080H
; LP_S 040h,32,040A0H
; LP_S 040h,32,040C0H
; LP_S 040h,32,040E0H
;
; LP_S 040h,32,04800H
; LP_S 040h,32,04820H
; LP_S 040h,32,04840H
; LP_S 040h,32,04860H
; LP_S 040h,32,04880H
; LP_S 040h,32,048A0H
; LP_S 040h,32,048C0H
; LP_S 040h,32,048E0H
;
; LP_S 040h,32,05000H
; LP_S 040h,32,05020H
; LP_S 040h,32,05040H
; LP_S 040h,32,05060H
; LP_S 040h,32,05080H
; LP_S 040h,32,050A0H
; LP_S 040h,32,050C0H
; LP_S 040h,32,050E0H
;
; LP_S 0FFh,0,0
;
; LP_SCR_64:
; DB 32,24,4,4,9BH,0,0,0
; DB 0,0,0,0,0,0,0,0
;
; LP_S 06Ah,32,04000H
; LP_S 06Ah,32,04020H
; LP_S 06Ah,32,04040H
; LP_S 06Ah,32,04060H
; LP_S 06Ah,32,04080H
; LP_S 06Ah,32,040A0H
; LP_S 06Ah,32,040C0H
; LP_S 06Ah,32,040E0H
;
; LP_S 06Ah,32,04800H
; LP_S 06Ah,32,04820H
; LP_S 06Ah,32,04840H
; LP_S 06Ah,32,04860H
; LP_S 06Ah,32,04880H
; LP_S 06Ah,32,048A0H
; LP_S 06Ah,32,048C0H
; LP_S 06Ah,32,048E0H
;
; LP_S 06Ah,32,05000H
; LP_S 06Ah,32,05020H
; LP_S 06Ah,32,05040H
; LP_S 06Ah,32,05060H
; LP_S 06Ah,32,05080H
; LP_S 06Ah,32,050A0H
; LP_S 06Ah,32,050C0H
; LP_S 06Ah,32,050E0H
;
; LP_S 0FFh,0,0
@LP_SET_MNU: LD IX,LP_SCR_MNU
;JR LP_SET_MODE
; HL - ᬥ饭¨¥ ®â ­ ç «  íªà ­ 
; = hor_sh + vert_sh * 64 + 4000H
; IX - íªà ­­ ï â ¡«¨æ 
LP_SET_MODE: LP_OPEN_PG
LD (SYS_PAGE.WIN_MAP_SC),IX
LD (SYS_PAGE.WIN_MODE_SH),HL
LD (SYS_PAGE.WIN_MODE_SC),DE
LD HL,(SYS_PAGE.WIN_MAP_SC)
LD DE,SYS_PAGE.WIN_MAP_IX
.LP_SET_COPY: LD BC,4
LDIR
BIT S_BIT_END,(HL)
JR Z,.LP_SET_COPY
LD BC,4
LDIR
LD HL,SYS_PAGE.WIN_MAP_IX
LD (SYS_PAGE.WIN_MAP_SC),HL
.LP_SET_MODE_INT:
LD IX,(SYS_PAGE.WIN_MAP_SC)
LD HL,(SYS_PAGE.WIN_MODE_SH)
CALL LP_SET_MODE1
LD DE,(SYS_PAGE.WIN_MODE_SC)
LP_CLOSE_PG
PUSH DE
CALL LP_INI_P
POP DE
LD A,E
OUT (RGMOD),A
CALL LP_SIZE
RET
LP_SET_MODE1: AND A
BIT S_BIT_END,(IX) ; ¯à®¢¥àª  ª®­æ  ¤ ­­ëå
RET NZ
PUSH HL
IN A,(RGADR)
PUSH AF
LD A,H
CP #48
CCF
LD A,#16
ADC A,0
OUT (RGADR),A
.LP_SET_LOOP: CALL LP_MODE_LINE
INC IX
INC IX
INC IX
INC IX
BIT S_BIT_LIN,(IX)
JR Z,.LP_SET_LOOP
POP AF
OUT (RGADR),A
POP HL
LD BC,#40
ADD HL,BC
JR LP_SET_MODE1
;********************************************************
; ‚ëç¨á«¥­¨¥ §­ ç¥­¨ï MODE ¨§ íªà ­­®© â ¡«¨æë.
; IX - ⥪ã饥 ¯®«®¦¥­¨¥ ¢ â ¡«¨æ¥.
LP_MODE_LINE: BIT 3,H
RET NZ
IN A,(SLOT1)
LD (SYS_PAGE.SYS_WORK1),A
IN A,(RGADR)
AND 1
OR MODE_PAGE
OUT (SLOT1),A
LD A,(IX)
LD B,A
RRCA
AND #0F
LD C,A
LD A,B
AND #20
XOR #30
OR C
LD C,A
LD A,(IX+3)
RLC A
RLC A
RLC A
AND #C0
OR C
LD D,A ; <20>¥à¢ë© ¡ ©â MODE
LD E,(IX+2) ; ‚â®à®© ¡ ©â..
LD B,(IX+1) ; ç¨á«® §­ ª®¬¥áâ
LD A,L
AND #3F
SUB 40
JR NC,.LP_NO_SET_MD
NEG
CP B
JR NC,.LP_MD_NO_B
LD B,A
.LP_MD_NO_B:
.LP_MD_LOOP: SET 4,H
LD (HL),E
RES 4,H
LD (HL),D
INC E
INC L
DJNZ .LP_MD_LOOP
.LP_MD_END: LD A,(SYS_PAGE.SYS_WORK1)
OUT (SLOT1),A
RET
.LP_NO_SET_MD: LD A,C
.LP_MD_LOOP2: INC E
INC L
BIT 5,H
JR Z,.LP_MD_LOOP
DJNZ .LP_MD_LOOP2
JR .LP_MD_END
; ¢ëç¨á«¥­¨¥ ­®¢®£® ¬¥áâ 
LP_TAB_HL: LD HL,(SYS_PAGE.WIN_TAB_SC) ; § £à㧨âì ⥪ã饥 ¯®«®¦¥­¨¥ ¢ â ¡«¨æ¥ SCR
LD A,(HL) ; § £à㧨âì ä« £¨ â ¡«¨æë
BIT S_BIT_END,A ; ä« £ ª®­æ 
JR Z,LP_TAB_H1 ; ¥á«¨ 0 - ­¥ ª®­¥æ
LP_TAB_H2: LD HL,(SYS_PAGE.WIN_MAP_SC) ; § £à㧨âì ­ ç «ì­®¥ ¯®«®¦¥­¨¥ ¢ â ¡«¨æ¥ SCR
LP_TAB_H3: LD A,(HL) ; ¨ ­®¢ë¥ ä« £¨
LP_TAB_H1: CALL .LP_PG1 ; ¯¥à¥ª«îç¨âì áâà ­¨æã
INC HL ; (HL) - ­®¢®¥ ç¨á«® ᨬ¢®«®¢
BIT S_BIT_MOD,A ; ¡¨â 42/84
LD A,(HL) ; § £à㧨âì ç¨á«® ᨬ¢®«®¢
JR Z,.LP_NO_MUL ; ¥á«¨ 84, â® ­¥ ­ã¦­® 㬭®¦¥­¨¥ ­  2
ADD A,A ; A=A*2
.LP_NO_MUL: LD B,A ; ç¨á«® ᨬ¢®«®¢ ¢ B
INC HL ; § £à㧪  ­®¢®£® HL
LD A,(HL)
INC HL
INC HL
LD (SYS_PAGE.WIN_TAB_SC),HL ; á á®åà ­¥­¨¥¬ á«¥¤ãî饣® ¯®«®¦¥­¨ï ¢ â ¡«¨æ¥ SCR
DEC HL
LD H,(HL) ; ¯®«®¦¥­¨¥ ­  íªà ­¥
LD L,A
LD A,H
RRCA ; ¢ëç¨á«¨âì ¯®«®¦¥­¨¥
RRCA ;  ââਡãâ 
RRCA
AND 3
OR H
OR #18
LD C,A
RET
.LP_PG1: AND #1F ; ¯¥à¥ª«îç âì ⮫쪮 áâà ­¨æë އ“ Spectrum mode
OUT (RGADR),A
LD E,(HL) ; §­ ç¥­¨¥ ¡¨â®¢ ¨ ä« £®¢
BIT S_BIT_MOD,E ; ¡¨â 42/84
JR Z,.LP_N_84 ; ¥á«¨ 42 â® ­¥ ãáâ ­ ¢«¨¢ âì CF
SCF ; 84 mode
.LP_N_84: EX AF,AF' ; á¯àïâ âì ä« £¨ ¨ §­ ç¥­¨¥ ¤«ï ¢ë¢®¤  ¢ ¯®àâ
LD A,E ; ¢ A ¤®«¦¥­ ¡ëâì ¡ ©â á ä« £ ¬¨
RET
; program init registers
; for low printer & save
LP_INI_P: EXX
LP_OPEN_PG
LD DE,(SYS_PAGE.WIN_ZG)
LD B,0
CALL LP_TAB_H2
EXX
; program save registers
; for low printer
LP_END_P: EX AF,AF'
EXX
RLA
LD E,A
LD (SYS_PAGE.WIN_SAV_HL),HL
LD (SYS_PAGE.WIN_SAV_DE),DE
LD (SYS_PAGE.WIN_SAV_BC),BC
LP_CLOSE_PG
EXX
EX AF,AF'
RET
; ®¯à¥¤¥«¥­¨¥ size
LP_SIZE: LP_OPEN_PG
EXX
XOR A
LD HL,(SYS_PAGE.WIN_MAP_SC) ; ­ ç «® ª àâë scr
CALL .LP_LN2 ; ᪠­¨à®¢ âì ¤®
EXX ; ª®­æ 
NEG ; ¯®«ãç¨âì ç¨á«®
LD D,A ; áâப ¢ D
LD E,0
EXX
;LD A,3 ; ç¨á«® ᨬ¢®«®¢
LD HL,(SYS_PAGE.WIN_MAP_SC) ; ¯® 3-©¥ áâப¥
;CALL LP_LN2 ; ­ áâனª 
.LOOP: CALL LP_TAB_H3 ; ¤ ­­ë¥
LD A,B
EXX
ADD A,E
LD E,A
EXX
LD HL,(SYS_PAGE.WIN_TAB_SC) ; ¤ ­­ë¥ íªà ­ 
BIT S_BIT_LIN,(HL)
JR Z,.LOOP
;BIT S_BIT_MOD,(HL)
EXX
;XOR A
;OUT (RGADR),A
LP_CLOSE_PG
RET
;
.LP_LN0: DEC A
RET Z
.LP_LN1: INC HL
INC HL
INC HL
INC HL
.LP_LN2: BIT S_BIT_LIN,(HL)
JR Z,.LP_LN1
BIT S_BIT_END,(HL)
JR Z,.LP_LN0
RET
ENDMODULE
*/