Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define DEFB .BYTE
- #define DEFW .WORD
- #define EQU .EQU
- ; labels defining for PIO (Parallel Input/Output)
- DATAPORTA equ 0x10
- DATAPORTB equ 0x12
- CTRLPORTA equ 0x11
- CTRLPORTB equ 0x13
- ;label defining for VDP (Video Display Processor)
- VDP_ACCESS equ 0x40
- VDP_WREG equ 10000000b ; to be added to the REG value
- VDP_RRAM equ 00000000b ; to be added to the ADRS value
- VDP_WRAM equ 01000000b ; to be added to the ADRS value
- VDP_R0 equ 00h
- VDP_R1 equ 01h
- VDP_R2 equ 02h
- VDP_R3 equ 03h
- VDP_R4 equ 04h
- VDP_R5 equ 05h
- VDP_R6 equ 06h
- VDP_R7 equ 07h
- RegWPIO equ 0x8
- blank equ 0x0
- CR equ 0dh
- LF equ 0ah
- SP equ 20h
- .ORG $0000
- LOAD_PIO:
- LD A, 0xF
- OUT (CTRLPORTA) , A ;Set PIO port A to OUTPUT
- LD A, 0x0
- OUT (DATAPORTA), A ;Set PIO port A to 0
- LD A, 0xCF
- OUT (CTRLPORTB), A ;Set PIO port B to BITMODE
- LD A, 0xC0
- OUT (CTRLPORTB), A ;Set I/O Pinmodes
- LD A, 0x97
- OUT (CTRLPORTB), A
- LD A, 0x80
- OUT (CTRLPORTB), A
- EI ;Setup and enable interrupts
- initVDP: ; set up VDP to work at startup in TEXT MODE
- ld a,RegWPIO
- out (DATAPORTA),a ;Select the VDPU
- ; set up registers for text mode
- ld b,$08 ; 8 registers
- ld hl,VDPTXTREG ; pointer to registers settings
- ld a,VDP_WREG+$00 ; start with REG0 ($80+register number)
- ld c,VDP_ACCESS ; VDP port for registers access
- LDREGVLS ld d,(HL) ; load register's value
- out (c),d ; send data to VDP
- out (c),a ; indicate the register to send data to
- LD A, blank
- OUT (DATAPORTA), A ;Select the VDPU
- inc a ; next register
- inc hl ; next value
- djnz LDREGVLS ; repeat for 8 registers
- ld a,RegWPIO
- out (DATAPORTA),a ;Select the VDPU
- ; reset VRAM
- ld c,VDP_ACCESS ; load VPD port value
- ld hl,$4000 ; first RAM cell $0000 (MSBs must be 0 & 1, resp.)
- xor a,a
- out (c),l ; low byte of address to VDP
- out (c),h ; high byte address to VDP
- ld b,$40 ; $40 pages of RAM...
- ld d,a ; ...each one with $100 cells (tot. $4000 bytes)
- EMPTYVRAM: out (VDP_ACCESS),a ; after first byte, the VDP autoincrements VRAM pointer
- nop
- nop
- inc d ; next cell
- LD A, blank
- OUT (DATAPORTA), A ;Select the VDPU
- jr nz,EMPTYVRAM ; repeat until page is fully cleared
- djnz EMPTYVRAM ; repeat for $40 pages
- ld a,RegWPIO
- out (DATAPORTA),a ;Select the VDPU
- ; load charset
- ld b,$ff ; 127 chars to be loaded
- ld hl,$4000 ; fist pattern cell $0000 (MSB must be 0 & 1)
- ld c,VDP_ACCESS ; load VDP address into C
- out (c),l ; send low byte of address
- out (c),h ; send high byte
- ld hl,CHARSET ; address of first byte of first pattern into ROM
- LD A, blank
- OUT (DATAPORTA), A ;Select the VDPU
- NXTCHAR:
- ld a,RegWPIO
- out (DATAPORTA),a ;Select the VDPU
- ld d,$08 ; 8 bytes per pattern char
- SENDCHRPTRNS: ld a,(hl) ; load byte to send to VDP
- out (VDP_ACCESS),a ; send byte to VRAM
- nop
- LD A, blank
- OUT (DATAPORTA), A ;Select the VDPU
- inc hl ; inc byte pointer
- dec d ; 8 bytes sents (1 char)?
- jr nz,SENDCHRPTRNS ; no, continue
- djnz NXTCHAR ; yes, decrement chars counter and continue for all the 127 chars
- ; welcome message
- LD A, RegWPIO
- OUT (DATAPORTA), A ;Select the VDPU
- ld c,VDP_ACCESS ; load VPD port value
- ld hl,$4800 ; position at X,Y 0,0 (MSB must be 1 & 10, resp.)
- out (c),l ; low byte of address to VDP
- out (c),h ; high byte address to VDP
- ld hl,WLCMSG ; load start address of welcome message
- LD A, blank
- OUT (DATAPORTA), A ;Select the VDPU
- LDWLCMMSG
- LD A, RegWPIO
- OUT (DATAPORTA), A ;Select the VDPU
- ld a,(hl) ; load char
- cp $00 ; is it the end of message?
- jr z,ENDVDPINIT ; yes, exit
- out (VDP_ACCESS),a ; no, print char onto screen
- nop
- LD A, blank
- OUT (DATAPORTA), A ;Select the VDPU
- inc hl
- jr LDWLCMMSG ; next char
- ENDVDPINIT:
- DI
- HALT
- ; VDP registers settings to set up a text mode
- VDPTXTREG defb 00000000b ; reg.0: external video disabled
- defb 11010000b ; reg.1: text mode (40x24), enable display
- defb $02 ; reg.2: name table set to $800 ($02x$400)
- defb $00 ; reg.3: not used in text mode
- defb $00 ; reg.4: pattern table set to $0000
- defb $00 ; reg.5: not used in text mode
- defb $00 ; reg.6: not used in text mode
- defb $90 ; reg.7: light blue text on white background
- ;------------------------------------------------------------------------------
- MSGTXT1: defm "Z80 SBC by Grant Searle",CR,LF
- defm "LM80C bootloader by Leonardo Miliani",CR,LF,0
- WLCMSG: defm "Hello!",CR,LF
- CHARSET equ $
- defb 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; char 0
- defb 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; char 1
- defb 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; char 2
- defb 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; char 3
- defb 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; char 4
- defb 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; char 5
- defb 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; char 6
- defb 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; char 7
- defb 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; char 8
- defb 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; char 9
- defb 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; char 10
- defb 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; char 11
- defb 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; char 12
- defb 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; char 13
- defb 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; char 14
- defb 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; char 15
- defb 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; char 16
- defb 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; char 17
- defb 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; char 18
- defb 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; char 19
- defb 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; char 20
- defb 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; char 21
- defb 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; char 22
- defb 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; char 23
- defb 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; char 24
- defb 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; char 25
- defb 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; char 26
- defb 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; char 27
- defb 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; char 28
- defb 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; char 29
- defb 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; char 30
- defb 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; char 31
- defb 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; space
- defb 0x20,0x20,0x20,0x20,0x20,0x00,0x20,0x00 ; !
- defb 0x50,0x50,0x00,0x00,0x00,0x00,0x00,0x00 ; "
- defb 0x50,0x50,0xf8,0x50,0xf8,0x50,0x50,0x00 ; #
- defb 0x20,0x78,0xa0,0x70,0x28,0xf0,0x20,0x00 ; $
- defb 0xc0,0xc8,0x10,0x20,0x40,0x98,0x18,0x00 ; %
- defb 0x60,0x90,0xa0,0x40,0xa8,0x90,0x68,0x00 ; &
- defb 0x60,0x20,0x40,0x00,0x00,0x00,0x00,0x00 ; '
- defb 0x10,0x20,0x40,0x40,0x40,0x20,0x10,0x00 ; (
- defb 0x40,0x20,0x10,0x10,0x10,0x20,0x40,0x00 ; )
- defb 0x00,0x20,0xa8,0x70,0xa8,0x20,0x00,0x00 ; *
- defb 0x00,0x20,0x20,0xf8,0x20,0x20,0x00,0x00 ; +
- defb 0x00,0x00,0x00,0x00,0x60,0x20,0x40,0x00 ; ,
- defb 0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00 ; -
- defb 0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00 ; .
- defb 0x00,0x08,0x10,0x20,0x40,0x80,0x00,0x00 ; /
- defb 0x70,0x88,0x98,0xa8,0xc8,0x88,0x70,0x00 ; 0
- defb 0x20,0x60,0x20,0x20,0x20,0x20,0x70,0x00 ; 1
- defb 0x70,0x88,0x08,0x10,0x20,0x40,0xf8,0x00 ; 2
- defb 0xf8,0x10,0x20,0x10,0x08,0x88,0x70,0x00 ; 3
- defb 0x10,0x30,0x50,0x90,0xf8,0x10,0x10,0x00 ; 4
- defb 0xf8,0x80,0xf0,0x08,0x08,0x88,0x70,0x00 ; 5
- defb 0x30,0x40,0x80,0xf8,0x88,0x88,0x70,0x00 ; 6
- defb 0xf8,0x08,0x10,0x20,0x40,0x40,0x40,0x00 ; 7
- defb 0x70,0x88,0x88,0x70,0x88,0x88,0x70,0x00 ; 8
- defb 0x70,0x88,0x88,0x78,0x08,0x10,0x60,0x00 ; 9
- defb 0x00,0x30,0x30,0x00,0x30,0x30,0x00,0x00 ; :
- defb 0x00,0x30,0x30,0x00,0x30,0x10,0x20,0x00 ; ;
- defb 0x10,0x20,0x40,0x80,0x40,0x20,0x10,0x00 ; <
- defb 0x14,0x14,0x14,0x14,0x14,0x00,0x00,0x00 ; =
- defb 0x40,0x20,0x10,0x08,0x10,0x20,0x40,0x00 ; >
- defb 0x70,0x88,0x08,0x10,0x20,0x00,0x20,0x00 ; ?
- defb 0x70,0x88,0x08,0x68,0xa8,0xa8,0x70,0x00 ; @
- defb 0x70,0x88,0x88,0x88,0xf8,0x88,0x88,0x00 ; A
- defb 0xf0,0x88,0x88,0xf0,0x88,0x88,0xf0,0x00 ; B
- defb 0x70,0x88,0x80,0x80,0x80,0x88,0x70,0x00 ; C
- defb 0xe0,0x90,0x88,0x88,0x88,0x90,0xe0,0x00 ; D
- defb 0xf8,0x80,0x80,0xf0,0x80,0x80,0xf8,0x00 ; E
- defb 0xf8,0x80,0x80,0xf0,0x80,0x80,0x80,0x00 ; F
- defb 0x70,0x88,0x80,0xb8,0x88,0x88,0x78,0x00 ; G
- defb 0x88,0x88,0x88,0xf8,0x88,0x88,0x88,0x00 ; H
- defb 0x70,0x20,0x20,0x20,0x20,0x20,0x70,0x00 ; I
- defb 0x38,0x10,0x10,0x10,0x10,0x90,0x60,0x00 ; J
- defb 0x88,0x90,0xa0,0xc0,0xa0,0x90,0x88,0x00 ; K
- defb 0x80,0x80,0x80,0x80,0x80,0x80,0xf8,0x00 ; L
- defb 0x88,0xd8,0xa8,0xa8,0x88,0x88,0x88,0x00 ; M
- defb 0x88,0xc8,0xa8,0x98,0x88,0x88,0x88,0x00 ; N
- defb 0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x00 ; O
- defb 0xf0,0x88,0x88,0xf0,0x80,0x80,0x80,0x00 ; P
- defb 0x70,0x88,0x88,0x88,0xa8,0x90,0x68,0x00 ; Q
- defb 0xf0,0x88,0x88,0xf0,0xa0,0x90,0x88,0x00 ; R
- defb 0x78,0x80,0x80,0x70,0x08,0x08,0xf0,0x00 ; S
- defb 0xf8,0x20,0x20,0x20,0x20,0x20,0x20,0x00 ; T
- defb 0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x00 ; U
- defb 0x88,0x88,0x88,0x88,0x88,0x50,0x20,0x00 ; V
- defb 0x88,0x88,0x88,0x88,0xa8,0xa8,0x50,0x00 ; W
- defb 0x88,0x88,0x50,0x20,0x50,0x88,0x88,0x00 ; X
- defb 0x88,0x88,0x88,0x50,0x20,0x20,0x20,0x00 ; Y
- defb 0xf8,0x08,0x10,0x20,0x40,0x80,0xf8,0x00 ; Z
- defb 0x70,0x40,0x40,0x40,0x40,0x40,0x70,0x00 ; [
- defb 0x00,0x80,0x40,0x20,0x10,0x08,0x00,0x00 ; \
- defb 0x70,0x10,0x10,0x10,0x10,0x10,0x70,0x00 ; ]
- defb 0x20,0x50,0x88,0x00,0x00,0x00,0x00,0x00 ; ^
- defb 0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00 ; _
- defb 0x40,0x20,0x10,0x00,0x00,0x00,0x00,0x00 ; `
- defb 0x00,0x00,0x70,0x08,0x78,0x88,0x78,0x00 ; a
- defb 0x00,0x80,0x80,0xb0,0xc8,0x88,0xf0,0x00 ; b
- defb 0x00,0x00,0x70,0x80,0x80,0x88,0x70,0x00 ; c
- defb 0x08,0x08,0x08,0x68,0x98,0x88,0x78,0x00 ; d
- defb 0x00,0x00,0x70,0x88,0xf8,0x80,0x70,0x00 ; e
- defb 0x30,0x48,0x40,0xe0,0x40,0x40,0x40,0x00 ; f
- defb 0x00,0x78,0x88,0x88,0x78,0x08,0x70,0x00 ; g
- defb 0x80,0x80,0xb0,0xc8,0x88,0x88,0x88,0x00 ; h
- defb 0x00,0x20,0x00,0x20,0x20,0x20,0x20,0x00 ; i
- defb 0x10,0x00,0x30,0x10,0x10,0x90,0x60,0x00 ; j
- defb 0x80,0x80,0x90,0xa0,0xc0,0xa0,0x90,0x00 ; k
- defb 0x60,0x20,0x20,0x20,0x20,0x20,0x70,0x00 ; l
- defb 0x00,0x00,0xd0,0xa8,0xa8,0x88,0x88,0x00 ; m
- defb 0x00,0x00,0xb0,0xc8,0x88,0x88,0x88,0x00 ; n
- defb 0x00,0x00,0x70,0x88,0x88,0x88,0x70,0x00 ; o
- defb 0x00,0x00,0xf0,0x88,0xf0,0x80,0x80,0x00 ; p
- defb 0x00,0x00,0x68,0x98,0x78,0x08,0x08,0x00 ; q
- defb 0x00,0x00,0xb0,0xc8,0x80,0x80,0x80,0x00 ; r
- defb 0x00,0x00,0x70,0x80,0x70,0x08,0xf0,0x00 ; s
- defb 0x40,0x40,0xe0,0x40,0x40,0x48,0x30,0x00 ; t
- defb 0x00,0x00,0x88,0x88,0x88,0x98,0x68,0x00 ; u
- defb 0x00,0x00,0x88,0x88,0x88,0x50,0x20,0x00 ; v
- defb 0x00,0x00,0x88,0x88,0xa8,0xa8,0x50,0x00 ; w
- defb 0x00,0x00,0x88,0x50,0x20,0x50,0x88,0x00 ; x
- defb 0x00,0x00,0x88,0x88,0x78,0x08,0x70,0x00 ; y
- defb 0x00,0x00,0xf8,0x10,0x20,0x40,0xf8,0x00 ; z
- defb 0x10,0x20,0x20,0x40,0x20,0x20,0x10,0x00 ; {
- defb 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00 ; |
- defb 0x20,0x10,0x10,0x08,0x10,0x10,0x20,0x00 ; }
- defb 0x00,0x28,0x50,0x00,0x00,0x00,0x00,0x00 ; ~ (127th char, last ASCII char)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement