mirror of
https://github.com/romychs/SprinterFirmware.git
synced 2025-04-18 18:12:39 +03:00
688 lines
9.7 KiB
NASM
688 lines
9.7 KiB
NASM
|
||
;[BEGIN]
|
||
;//MODULE: VIDEO
|
||
;//CREATE: 19-05-1998 AUTHOR: Denis Parinov
|
||
;//UPDATE: 24-10-1999 DNS Restore module
|
||
;---------------------------------------------------------------
|
||
;Rev Date Name Description
|
||
;---------------------------------------------------------------
|
||
;R01 07-11-2002 DNS FIX BUG WITH SCROLLUP FN. (A=0)
|
||
;R02 07-11-2002 DNS CORRECT FN. WINCOPY & WINREST, ADD "DI+EI"
|
||
;---------------------------------------------------------------
|
||
|
||
; CLEAR TEXT WINDOW
|
||
;=====================
|
||
; D - Y
|
||
; E - X
|
||
; H - HEIGHT
|
||
; L - WIDTH
|
||
; B - COLOR
|
||
; A - ATTR
|
||
|
||
CLEAR LD C,#8D
|
||
RST #08
|
||
AND A
|
||
RET
|
||
;
|
||
|
||
; PRINT NULL-TERMINATED CHARS STRING
|
||
;======================================
|
||
; HL - STRING POINTER
|
||
|
||
PCHARS
|
||
LD A,(HL)
|
||
INC HL
|
||
OR A
|
||
RET Z
|
||
CALL PUTCHAR
|
||
JR PCHARS
|
||
|
||
; PRINT CHAR
|
||
;==============
|
||
; A - CHAR
|
||
|
||
PUTCHAR
|
||
LD B,A
|
||
LD C,0x8e
|
||
RST 0x08
|
||
LD A,B
|
||
CP 0xd
|
||
JR Z,CR_
|
||
CP 0xa
|
||
JR Z,LF_
|
||
CP 0x9
|
||
JR Z,TB_
|
||
CP 0x8
|
||
JR Z,BK_
|
||
PUSH HL
|
||
LD BC,0x182
|
||
RST 0x08
|
||
PUSH AF
|
||
LD A,E
|
||
CP 0x4f
|
||
JP NZ,NLFF
|
||
LD A,D
|
||
CP 0x1f
|
||
JP NZ,NLFF
|
||
LD E,0x0
|
||
LD C,0x84
|
||
RST 0x08
|
||
CALL LFF
|
||
NLFF
|
||
POP AF
|
||
POP HL
|
||
RET
|
||
|
||
BK_
|
||
LD C,0x8e ;GET CURSOR
|
||
RST 0x08
|
||
XOR A
|
||
CP E
|
||
JP Z,LOCATE
|
||
DEC E
|
||
JP LOCATE
|
||
|
||
TB_
|
||
LD C,0x8e
|
||
RST 0x08
|
||
LD A,E
|
||
ADD A,0x8
|
||
AND 0x78
|
||
LD E,A
|
||
JP LOCATE
|
||
|
||
CR_
|
||
LD C,0x8e
|
||
RST 0x08
|
||
LD E,0x0
|
||
JP LOCATE
|
||
|
||
LF_
|
||
LD C,0x8e
|
||
RST 0x08
|
||
LD A,D
|
||
CP 0x1f
|
||
JR NC,LFF
|
||
INC D
|
||
CALL LOCATE
|
||
JR CR_
|
||
|
||
LFF
|
||
PUSH HL
|
||
LD BC,0x18a
|
||
LD DE,0x20
|
||
EI
|
||
HALT
|
||
DI
|
||
RST 0x08
|
||
LD DE,0x1f00
|
||
PUSH DE
|
||
CALL LOCATE
|
||
LD A,0x20
|
||
LD BC,0x5082
|
||
RST 0x08
|
||
EI
|
||
POP DE
|
||
CALL LOCATE
|
||
POP HL
|
||
RET
|
||
|
||
|
||
; SET CURRENT CURSOR POSITION
|
||
;===============================
|
||
; D = Y
|
||
; E = X
|
||
|
||
LOCATE
|
||
LD C,#84
|
||
RST #08
|
||
RET
|
||
|
||
; GET CURRENT CURSOR POSITION
|
||
;===============================
|
||
;
|
||
|
||
CURSOR
|
||
LD C,#8E
|
||
RST #08
|
||
RET
|
||
; D - Y
|
||
; E - X
|
||
|
||
; READ CHAR & ATTR FROM THE SCREEN
|
||
;=============================
|
||
; D - Y
|
||
; E - X
|
||
|
||
RDCHAR
|
||
XOR A
|
||
LD C,#B4
|
||
RST #08
|
||
LD A,L
|
||
LD B,H
|
||
AND A
|
||
RET
|
||
; A - CHAR
|
||
; B - ATTR
|
||
|
||
; WRITE CHAR & ATTR TO THE SCREEN
|
||
;===================================
|
||
; D - Y
|
||
; E - X
|
||
; A - CHAR
|
||
; B - ATTR
|
||
|
||
WRCHAR LD C,A
|
||
PUSH BC
|
||
PUSH DE
|
||
LD C,#B4
|
||
XOR A
|
||
RST #08
|
||
POP DE
|
||
POP HL
|
||
LD C,#B5
|
||
XOR A
|
||
RST #08
|
||
AND A
|
||
RET
|
||
|
||
; COPY WINDOW FROM THE SCREEN
|
||
;===============================
|
||
; D - Y
|
||
; E - X
|
||
; H - HEIGHT
|
||
; L - WIDTH
|
||
; IX - ADDRESS
|
||
; B - PAGE, IF IX > 0C000H
|
||
|
||
WINCOPY
|
||
LD A,R ;R02
|
||
PUSH AF ;R02
|
||
XOR A
|
||
DI ;R02
|
||
LD C,#B2
|
||
RST #08
|
||
POP AF ;R02
|
||
SCF ;R02
|
||
CCF ;R02
|
||
RET PO ;R02
|
||
EI ;R02
|
||
RET
|
||
|
||
; RESTORE WINDOW TO THE SCREEN
|
||
;================================
|
||
; D - Y
|
||
; E - X
|
||
; H - HEIGHT
|
||
; L - WIDTH
|
||
; IX - ADDRESS
|
||
; B - PAGE, IF IX > 0C000H
|
||
|
||
WINREST
|
||
LD A,R ;R02
|
||
PUSH AF ;R02
|
||
XOR A
|
||
DI ;R02
|
||
LD C,#B3
|
||
RST #08
|
||
POP AF ;R02
|
||
SCF ;R02
|
||
CCF ;R02
|
||
RET PO ;R02
|
||
EI ;R02
|
||
RET
|
||
|
||
; SCROLL WINDOWS
|
||
;==================
|
||
; D - Y
|
||
; E - X
|
||
; H - HEIGHT
|
||
; L - WIDTH
|
||
; B - SCROLL DIRECTION
|
||
; B = 1 - SCROLL UP
|
||
; B = 2 - SCROLL DOWN
|
||
; A = 0 - CLEAR LINE
|
||
SCROLL
|
||
DJNZ SCR_DW
|
||
LD B,A
|
||
LD C,H
|
||
PUSH BC
|
||
PUSH DE
|
||
PUSH HL
|
||
LD XH,D
|
||
LD XL,E
|
||
INC D
|
||
DEC H
|
||
XOR A
|
||
LD C,0xb7
|
||
DI
|
||
RST 0x8
|
||
EI
|
||
POP HL
|
||
POP DE
|
||
POP BC
|
||
XOR A
|
||
CP B
|
||
RET NZ
|
||
LD A,D
|
||
ADD A,H
|
||
DEC A
|
||
LD D,A
|
||
|
||
SCR1
|
||
PUSH DE
|
||
CALL LOCATE
|
||
LD A,0x20
|
||
LD B,L
|
||
LD C,0x82
|
||
RST 0x8
|
||
POP DE
|
||
CALL LOCATE
|
||
AND A
|
||
RET
|
||
|
||
|
||
SCR_DW
|
||
DJNZ SCR_ERR
|
||
LD B,A
|
||
LD C,L
|
||
PUSH DE
|
||
PUSH BC
|
||
LD XH,D
|
||
LD XL,E
|
||
INC XH
|
||
DEC H
|
||
XOR A
|
||
LD C,0xb7
|
||
DI
|
||
RST 0x8
|
||
EI
|
||
POP HL
|
||
POP DE
|
||
XOR A
|
||
CP B
|
||
JR Z,SCR1
|
||
RET
|
||
|
||
SCR_ERR
|
||
LD A,1
|
||
SCF
|
||
RET
|
||
|
||
; SELECT SCREEN PAGE
|
||
;======================
|
||
; B - SCREEN PAGE
|
||
|
||
SELPAGE
|
||
PUSH BC
|
||
LD A,(VMODE)
|
||
BIT 7,A
|
||
JR NZ,SEL2
|
||
LD C,A
|
||
CALL TEXT_M
|
||
SEL2 POP BC
|
||
LD A,B
|
||
AND #01
|
||
OUT (#C9),A
|
||
RET
|
||
|
||
; GET CURRENT VIDEO MODE
|
||
;==========================
|
||
;
|
||
GETVMOD
|
||
IN A,(#C9)
|
||
LD B,A
|
||
LD A,(VMODE)
|
||
AND A
|
||
RET
|
||
; A - MODE
|
||
; B - PAGE
|
||
|
||
; SET CURRENT VIDEO MODE
|
||
;==========================
|
||
; A - MODE
|
||
; B - PAGE
|
||
|
||
SETVMOD
|
||
BIT 7,A
|
||
LD C,A
|
||
JR NZ,GRAPH
|
||
|
||
TEXT_M
|
||
LD IX,BACKTXT
|
||
PUSH IX
|
||
EX AF,AF'
|
||
LD A,(VMODE)
|
||
LD (VVMODE),A
|
||
EX AF,AF'
|
||
INC A
|
||
DEC A
|
||
JR Z,NOMODE
|
||
DEC A
|
||
JR Z,NOMODE
|
||
DEC A
|
||
JR Z,T_40_32
|
||
DEC A
|
||
JR Z,T_80_32
|
||
NOMODE
|
||
POP IX
|
||
LD A,#30
|
||
SCF
|
||
RET
|
||
|
||
GRAPH
|
||
CALL SAVETXT
|
||
AND #7F
|
||
JP Z,G320_16
|
||
DEC A
|
||
JP Z,G320_56
|
||
DEC A
|
||
JP Z,G640_16
|
||
DEC A
|
||
JP Z,G640_56
|
||
LD A,#30
|
||
SCF
|
||
RET
|
||
|
||
T_40_32
|
||
PUSH BC
|
||
LD HL,TAB2
|
||
LD A,B
|
||
RLCA
|
||
RLCA
|
||
RLCA
|
||
RLCA
|
||
OR B
|
||
AND #11
|
||
XOR #10
|
||
LD E,A
|
||
CALL SETMODE
|
||
POP BC
|
||
LD A,C
|
||
LD (VMODE),A
|
||
LD A,B
|
||
AND #01
|
||
OUT (#C9),A
|
||
LD A,(VMODE)
|
||
LD C,#81
|
||
RST #30
|
||
LD A,#C0
|
||
OUT (Y_PORT),A
|
||
XOR A
|
||
RET
|
||
|
||
T_80_32
|
||
PUSH BC
|
||
LD HL,TAB1
|
||
LD A,B
|
||
RLCA
|
||
RLCA
|
||
RLCA
|
||
RLCA
|
||
OR B
|
||
AND #11
|
||
XOR #10
|
||
LD E,A
|
||
CALL SETMODE
|
||
POP BC
|
||
LD A,C
|
||
LD (VMODE),A
|
||
LD A,B
|
||
AND #01
|
||
OUT (#C9),A
|
||
LD A,(VMODE)
|
||
LD C,#81
|
||
RST #30
|
||
LD A,#C0
|
||
OUT (Y_PORT),A
|
||
XOR A
|
||
RET
|
||
|
||
G320_16
|
||
LD A,#30
|
||
SCF
|
||
RET
|
||
|
||
G320_56
|
||
PUSH BC
|
||
LD HL,TAB4
|
||
LD E,#11
|
||
CALL SETMODE
|
||
LD HL,TAB8
|
||
LD E,#00
|
||
CALL SETMODE
|
||
POP BC
|
||
LD A,C
|
||
LD (VMODE),A
|
||
LD A,B
|
||
AND #01
|
||
OUT (#C9),A
|
||
LD A,(VMODE)
|
||
LD C,#81
|
||
RST #30
|
||
LD A,#C0
|
||
OUT (Y_PORT),A
|
||
XOR A
|
||
RET
|
||
|
||
G640_16 PUSH BC
|
||
LD HL,TAB3
|
||
LD E,#11
|
||
CALL SETMODE
|
||
LD HL,TAB7
|
||
LD E,#00
|
||
CALL SETMODE
|
||
POP BC
|
||
LD A,C
|
||
LD (VMODE),A
|
||
LD A,B
|
||
AND #01
|
||
OUT (#C9),A
|
||
LD A,(VMODE)
|
||
LD C,#81
|
||
RST #30
|
||
LD A,#C0
|
||
OUT (Y_PORT),A
|
||
XOR A
|
||
RET
|
||
|
||
G640_56 LD A,#30
|
||
SCF
|
||
RET
|
||
|
||
VMODE DB #03
|
||
|
||
;02h - TEXT 40 x 32 (16 colors)
|
||
;03h - TEXT 80 x 32 (16 colors)
|
||
;80h - GRAF 320 x 256 (16 colors)
|
||
;81h - GRAF 320 x 256 (256 colors)
|
||
;82h - GRAF 640 x 256 (16 colors)
|
||
;83h - GRAF 640 x 256 (256 colors) UNUSED
|
||
|
||
SETMODE
|
||
PUSH DE
|
||
LD DE,0xFEE0
|
||
LD BC,0x0020
|
||
CALL MOVBIOS
|
||
POP DE
|
||
LD IX,0xFEE0
|
||
LD C,0xB0
|
||
RST 0x08
|
||
LD A,0xC0
|
||
OUT (Y_PORT),A
|
||
XOR A
|
||
RET
|
||
|
||
MOVBIOS LD A,R
|
||
IN A,(PAGE3)
|
||
EX AF,AF'
|
||
LD A,#FE
|
||
OUT (PAGE3),A
|
||
LDIR
|
||
EX AF,AF'
|
||
OUT (PAGE3),A
|
||
RET PO
|
||
EI
|
||
RET
|
||
|
||
;IX+0 ;HORIZONTAL
|
||
;IX+1 ;VERTICAL
|
||
;IX+2 ;X - COORD
|
||
;IX+3 ;Y - COORD
|
||
;IX+4 ;MODE
|
||
;IX+5 ;EXT MODE
|
||
;IX+6 ;VIDEO RAM X OFFSET (SIGNPLACES)
|
||
;IX+7 ;VIDEO RAM Y OFFSET (SIGNPLACES)
|
||
|
||
;80x32
|
||
TAB1 DB #28,#20,#00,#00,#1B,#00,#00,#00
|
||
;40x32
|
||
TAB2 DB #28,#20,#00,#00,#3B,#00,#00,#00
|
||
;640x256 PAGE 0
|
||
TAB3 DB #28,#20,#00,#00,#00,#00,#00,#00
|
||
;320x256 PAGE 0
|
||
TAB4 DB #28,#20,#00,#00,#20,#00,#00,#00
|
||
;640x256 PAGE 1
|
||
TAB7 DB #28,#20,#00,#00,#40,#00,#28,#00
|
||
;320x256 PAGE 1
|
||
TAB8 DB #28,#20,#00,#00,#60,#00,#28,#00
|
||
|
||
SAVETXT
|
||
PUSH AF
|
||
LD A,(VMODE)
|
||
BIT 0x7,A
|
||
JR NZ,NOSAVET
|
||
SUB 0x2
|
||
JR C,NOSAVET
|
||
PUSH BC
|
||
PUSH DE
|
||
PUSH HL
|
||
PUSH IX
|
||
PUSH AF
|
||
LD C,0x8e
|
||
RST 0x08
|
||
|
||
LD (TCURS),DE
|
||
POP AF
|
||
LD IX,0xc000
|
||
LD DE,0x0
|
||
LD HL,0x2050
|
||
OR A
|
||
JR NZ,SVTEXT1
|
||
LD L,0x28
|
||
SVTEXT1
|
||
LD (SVHL1),HL
|
||
LD A,(BANKTBL+TXTPAGE) ;(BANKTBL_2)
|
||
LD B,A
|
||
XOR A
|
||
LD C,0xb2
|
||
DI
|
||
RST 0x08
|
||
EI
|
||
POP IX
|
||
POP HL
|
||
POP DE
|
||
POP BC
|
||
NOSAVET
|
||
POP AF
|
||
RET
|
||
|
||
|
||
BACKTXT
|
||
PUSH AF
|
||
VVMODE EQU $+1
|
||
LD A,0x0
|
||
RLCA
|
||
JR NC,NOBACKT
|
||
PUSH BC
|
||
PUSH DE
|
||
PUSH HL
|
||
PUSH IX
|
||
LD IX,0xc000
|
||
LD DE,0x0
|
||
SVHL1 EQU $+1
|
||
LD HL,0x2050
|
||
LD A,(BANKTBL+TXTPAGE)
|
||
LD B,A
|
||
XOR A
|
||
LD C,0xb3
|
||
DI
|
||
RST 0x8
|
||
EI
|
||
TCURS EQU $+1
|
||
LD DE,0x0
|
||
LD C,0x84
|
||
RST 0x8
|
||
POP IX
|
||
POP HL
|
||
POP DE
|
||
POP BC
|
||
NOBACKT
|
||
POP AF
|
||
RET
|
||
|
||
; SEND A SYMBOL TO THE PRINTER
|
||
;==============================
|
||
; A - SYMBOL
|
||
;
|
||
LPT_A EQU #1B
|
||
LPT_B EQU #1C
|
||
|
||
PRINT
|
||
LD B,A
|
||
LD A,R
|
||
LD A,B
|
||
DI
|
||
PUSH AF
|
||
XOR A
|
||
OUT (LPT_A),A
|
||
LD A,#10
|
||
OUT (LPT_A),A
|
||
XOR A
|
||
OUT (LPT_A),A
|
||
IN A,(LPT_A)
|
||
LD C,A
|
||
; IN (1Bh): bit 5 - busy, Bit 3 - Ack
|
||
; IN (19h): bit 5 - Paper Enable, Bit 3 - Select
|
||
|
||
BIT 5,A
|
||
JR NZ,LPTBUSY
|
||
AND 0xd8
|
||
JR Z,LPTBUSY
|
||
LD A,B
|
||
OUT (LPT_B),A
|
||
POP AF
|
||
SCF
|
||
CCF
|
||
RET PO
|
||
EI
|
||
RET
|
||
|
||
LPTBUSY
|
||
POP AF
|
||
LD A,C
|
||
SCF
|
||
RET PO
|
||
EI
|
||
RET
|
||
|
||
; B - SYMBOL
|
||
; CF = 1 - PRINTER BUSY
|
||
|
||
PRINT_INIT
|
||
DI
|
||
LD A,#CF ; port 1F только чеpез LD BC,1F: Out (BC),reg !!!
|
||
LD BC,#001F
|
||
OUT (C),A
|
||
LD A,#63
|
||
OUT (C),A
|
||
LD A,#C0 ; Bit 7 - Select (1), Bit 6 - Auto_Line_Feed (1)
|
||
OUT (#1E),A
|
||
LD A,#0F ; Init printer port for Out
|
||
OUT (#1D),A
|
||
RET
|
||
|
||
|
||
;//MODULE: VIDEO
|
||
;[END]
|