Files
Z8C-Homebrew-Computer/OperatingSystem/Applications/displaydemo/backup.asm
2024-11-30 15:41:09 +01:00

294 lines
5.9 KiB
NASM

.include "extern_symbols.s" ;include monitor symbols.
START_ADDR .EQU 0x8000
org START_ADDR
com_header:
jp com_prg
db 0x00
dw 0x00, 0x00, 0x00 ;always 0
dw [START_ADDR] ;start addr
dw [_eof] ;end of file
dw [_eof - START_ADDR] ;length
dc 48,0x00
com_prg:
; Program start
VDP_REGISTER .EQU 0xE1
VDP_RAM .EQU 0xE0
VDPR_MODE0 .EQU 0
VDPR_MODE1 .EQU 1
VDPR_MODE2 .EQU 8
VDPR_MODE3 .EQU 9
VDPR_COLOR .EQU 7
VDPR_PATNMEBASE .EQU 2
VDPR_PATGENBASE .EQU 4
VDPR_COLTBBASE0 .EQU 3
VDPR_COLTBBASE1 .EQU 10
TmsTransparent: equ 0
TmsBlack: equ 1
TmsMediumGreen: equ 2
TmsLightGreen: equ 3
TmsDarkBlue: equ 4
TmsLightBlue: equ 5
TmsDarkRed: equ 6
TmsCyan: equ 7
TmsMediumRed: equ 8
TmsLightRed: equ 9
TmsDarkYellow: equ 0ah
TmsLightYellow: equ 0bh
TmsDarkGreen: equ 0ch
TmsMagenta: equ 0dh
TmsGray: equ 0eh
TmsWhite: equ 0fh
TMS_R8_MS equ 128 ;Mouse: when set to 1, sets the color bus into input mode and enables mouse. If set to 0, sets color bus into output mode and disables mouse
TMS_R8_LP equ 64 ;Light pen: when set to 1, enables light pen
TMS_R8_TP equ 32 ;Sets the color of code 0 to the color of the palette
TMS_R8_CB equ 16 ;Color bus: when set to 1, sets color bus into input mode. If set to 0, sets color bus into output mode
TMS_R8_VR equ 8 ;If set to 1, VRAM is 64Kx1Bit or 64Kx4bits. If set to 0, VRAM is 16Kx1Bit or 16Kx4Bits
TMS_R8_SPD equ 2 ;if set to 1, sprites are not displayed and related VRAM reads are not performed
TMS_R8_BW equ 1 ;if set to 1, output is grayscale in 32 tones
call tms_init_text2
ret
; Set a VDP Register (dircet access)
; a = data
; e = register
tms_setregister:
out (VDP_REGISTER), a
ld a,e
or 80h
out (VDP_REGISTER), a
ret
; ahl contains pointer to VRAM address
tms_mem_setpointer_rd:
rlc h
rla
rlc h
rla
srl h
srl h
out (VDP_REGISTER),a
ld a,14 + 128
out (VDP_REGISTER),a
ld a,l
out (VDP_REGISTER),a
ld a,h
out (VDP_REGISTER),a
ret
; ahl contains pointer to VRAM address
tms_mem_setpointer_wr:
rlc h
rla
rlc h
rla
srl h
srl h
out (VDP_REGISTER),a
ld a,14 + 128
out (VDP_REGISTER),a
ld a,l
out (VDP_REGISTER),a
ld a,h
or 64
out (VDP_REGISTER),a
ret
;b back, c: front
tms_set_color
ld a,c ;load front color to a
rlca
rlca
rlca
rlca
or b ;combine back color
ld e, VDPR_COLOR
jp tms_setregister
tms_init_text2:
; init vdp (80col text)
ld e, VDPR_MODE0
ld a, 00000100b ;TEXT2
call tms_setregister
ld e, VDPR_MODE1 ;blank screen wit 64K enabled
ld a, 00001000b
call tms_setregister
ld e, VDPR_MODE2
ld a, TMS_R8_SPD
call tms_setregister
ld e, VDPR_MODE3
ld a, 00000010b
call tms_setregister
; set memory layout
; set pattern name table
ld e, VDPR_PATNMEBASE
ld a, 00000011b
call tms_setregister
ld e, VDPR_PATGENBASE
ld a, 00000010b
call tms_setregister
ld e, VDPR_COLTBBASE0
ld a, 00101111b
call tms_setregister
ld e, VDPR_COLTBBASE1
ld a, 00000000b
call tms_setregister
;enable cpu wait
ld e,25
ld a,4
call tms_setregister
;setup cursor:
ld e, 13 ; set blink rate
ld a, 0x22
call tms_setregister
ld e, 12 ; set blink color
ld a, 0xFF
call tms_setregister
ld de, 0x0000
ld bc, 0x2000
ld a, 0
call tms_fill_data
;load font
ld hl, [TmsFont]
ld bc, 256*8
ld de, 0x1000
call tms_load_data
ld e, VDPR_MODE1 ;enable screen wit 64K enabled
ld a, 01010000b
call tms_setregister
;WRITE CHAR
ld hl, 0
ld a,0
call tms_mem_setpointer_wr
ld a,'R'
call VTERM_INIT
ld hl,[STR_Banner_Start_Test]
call VTERM_PRINT_STR
call VTERM_CURSOR_ON
ld b, TmsBlack
ld c, TmsWhite
call tms_set_color
TEST_ECHO:
call read_char
jp z, TEST_ECHO
call VTERM_PRINT
jr TEST_ECHO
ret
STR_Banner_Start_Test:
db 10,13,"Z8C Monitor V2.1 by Dennis Gunia (2022-2024)",10,13,"TEST",10,13,"NEW LINE",10,13,"LOLLOLLLOLOLOLOLOL",0
;hl location in sysram
;de location in vram (destination)
;bc amount of bytes (byte counter)
tms_load_data:
;setup address
push hl
ex de,hl
ld a,0
call tms_mem_setpointer_wr
pop hl
;load data
tms_load_data_loop:
ld a,(hl) ;load byte from system
inc hl
out (VDP_RAM),a
dec bc ;decrement counter
ld a,b ;check if zero
or c
jr nz, tms_load_data_loop ;if not loop
ret ;else exit
tms_read_statusreg:
out (VDP_RAM),a
ld a,15 + 128
out (VDP_RAM),a
in a,(VDP_RAM)
ex af,af'
xor a ; ld a,0
out (VDP_RAM),a
ld a,15 + 128
out (VDP_RAM),a
ex af,af'
ret
;a bytes to fill
;de location in vram (destination)
;bc amount of bytes (byte counter)
tms_fill_data:
;setup address
push af
ex de,hl
call tms_mem_setpointer_wr
tms_fill_data_loop:
pop af
out (VDP_RAM),a
push af
dec bc ;decrement counter
ld a,b ;check if zero
or c
jr nz, tms_fill_data_loop ;if not loop
pop af
ret ;else exit
.include "font80.s"
.include "vdpterm.s"
;
;hl location in sysmem
;de location in vram (destination)
;bc amount of bytes (byte counter)
tms_read_data:
push hl
push bc
ex de,hl
call tms_mem_setpointer_rd
pop bc
pop hl
tms_read_data_loop:
in a,(VDP_RAM)
ld (hl),a
inc hl
dec bc ;decrement counter
ld a,b ;check if zero
or c
jr nz, tms_read_data_loop ;if not loop
ret ;else exit
_eof: