Advertisement
Guest User

TMS9918ANL driving

a guest
Jul 12th, 2020
247
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #define DEFB .BYTE
  2. #define DEFW .WORD
  3. #define EQU .EQU
  4.  
  5. ; labels defining for PIO (Parallel Input/Output)
  6. DATAPORTA      equ 0x10
  7. DATAPORTB      equ 0x12
  8. CTRLPORTA      equ 0x11
  9. CTRLPORTB      equ 0x13
  10.  
  11. ;label defining for VDP (Video Display Processor)
  12. VDP_ACCESS     equ 0x40
  13. VDP_WREG    equ 10000000b   ; to be added to the REG value
  14. VDP_RRAM    equ 00000000b   ; to be added to the ADRS value
  15. VDP_WRAM    equ 01000000b   ; to be added to the ADRS value
  16. VDP_R0      equ 00h
  17. VDP_R1      equ 01h
  18. VDP_R2      equ 02h
  19. VDP_R3      equ 03h
  20. VDP_R4      equ 04h
  21. VDP_R5      equ 05h
  22. VDP_R6      equ 06h
  23. VDP_R7      equ 07h
  24. RegWPIO     equ 0x8
  25. blank       equ 0x0
  26.  
  27. CR              equ     0dh
  28. LF              equ     0ah
  29. SP              equ     20h
  30.  
  31. .ORG     $0000
  32.  
  33. LOAD_PIO:
  34.         LD      A,  0xF
  35.         OUT     (CTRLPORTA) , A  ;Set PIO port A to OUTPUT
  36.  
  37.         LD      A,  0x0
  38.         OUT     (DATAPORTA),  A  ;Set PIO port A to 0
  39.  
  40.         LD      A,  0xCF
  41.         OUT     (CTRLPORTB),  A  ;Set PIO port B to BITMODE
  42.  
  43.         LD      A,  0xC0
  44.         OUT     (CTRLPORTB),  A  ;Set I/O Pinmodes
  45.  
  46.         LD      A,  0x97
  47.         OUT     (CTRLPORTB),  A
  48.         LD      A,  0x80
  49.         OUT     (CTRLPORTB),  A  
  50.         EI                     ;Setup and enable interrupts
  51.  
  52. initVDP:        ; set up VDP to work at startup in TEXT MODE
  53.  
  54.                 ld a,RegWPIO
  55.                 out (DATAPORTA),a   ;Select the VDPU
  56.  
  57.                 ; set up registers for text mode
  58.                 ld b,$08            ; 8 registers
  59.                 ld hl,VDPTXTREG     ; pointer to registers settings
  60.                 ld a,VDP_WREG+$00   ; start with REG0 ($80+register number)
  61.                 ld c,VDP_ACCESS        ; VDP port for registers access
  62. LDREGVLS        ld d,(HL)           ; load register's value
  63.                 out (c),d           ; send data to VDP
  64.                 out (c),a           ; indicate the register to send data to
  65.                 LD      A,  blank
  66.                 OUT     (DATAPORTA),  A  ;Select the VDPU
  67.                 inc a               ; next register
  68.                 inc hl              ; next value
  69.                 djnz LDREGVLS       ; repeat for 8 registers
  70.  
  71.                 ld a,RegWPIO
  72.                 out (DATAPORTA),a   ;Select the VDPU
  73.                 ; reset VRAM
  74.                 ld c,VDP_ACCESS        ; load VPD port value
  75.                 ld hl,$4000         ; first RAM cell $0000 (MSBs must be 0 & 1, resp.)
  76.                 xor a,a
  77.                 out (c),l           ; low byte of address to VDP
  78.                 out (c),h           ; high byte address to VDP
  79.                 ld b,$40            ; $40 pages of RAM...
  80.                 ld d,a              ; ...each one with $100 cells (tot. $4000 bytes)
  81. EMPTYVRAM:      out (VDP_ACCESS),a     ; after first byte, the VDP autoincrements VRAM pointer
  82.                 nop
  83.                 nop
  84.                 inc d               ; next cell
  85.                 LD      A,  blank
  86.                 OUT     (DATAPORTA),  A  ;Select the VDPU
  87.                 jr nz,EMPTYVRAM     ; repeat until page is fully cleared
  88.                 djnz EMPTYVRAM      ; repeat for $40 pages
  89.                 ld a,RegWPIO
  90.                 out (DATAPORTA),a   ;Select the VDPU
  91.                 ; load charset
  92.                 ld b,$ff            ; 127 chars to be loaded
  93.                 ld hl,$4000         ; fist pattern cell $0000 (MSB must be 0 & 1)
  94.                 ld c,VDP_ACCESS        ; load VDP address into C
  95.                 out (c),l           ; send low byte of address
  96.                 out (c),h           ; send high byte
  97.                 ld hl,CHARSET       ; address of first byte of first pattern into ROM
  98.                 LD      A,  blank
  99.                 OUT     (DATAPORTA),  A  ;Select the VDPU
  100. NXTCHAR:        
  101.                 ld a,RegWPIO
  102.                 out (DATAPORTA),a   ;Select the VDPU
  103.                 ld d,$08            ; 8 bytes per pattern char
  104. SENDCHRPTRNS:   ld a,(hl)           ; load byte to send to VDP
  105.                 out (VDP_ACCESS),a     ; send byte to VRAM
  106.                 nop
  107.                 LD      A,  blank
  108.                 OUT     (DATAPORTA),  A  ;Select the VDPU
  109.                 inc hl              ; inc byte pointer
  110.                 dec d               ; 8 bytes sents (1 char)?
  111.                 jr nz,SENDCHRPTRNS  ; no, continue
  112.                 djnz NXTCHAR        ; yes, decrement chars counter and continue for all the 127 chars
  113.  
  114.                 ; welcome message
  115.                 LD      A,  RegWPIO
  116.                 OUT     (DATAPORTA),  A  ;Select the VDPU
  117.                 ld c,VDP_ACCESS        ; load VPD port value
  118.                 ld hl,$4800         ; position at X,Y 0,0 (MSB must be 1 & 10, resp.)
  119.                 out (c),l           ; low byte of address to VDP
  120.                 out (c),h           ; high byte address to VDP
  121.                 ld hl,WLCMSG        ; load start address of welcome message
  122.                 LD      A,  blank
  123.                 OUT     (DATAPORTA),  A  ;Select the VDPU
  124. LDWLCMMSG      
  125.                 LD      A,  RegWPIO
  126.                 OUT     (DATAPORTA),  A  ;Select the VDPU
  127.                 ld a,(hl)           ; load char
  128.                 cp $00              ; is it the end of message?
  129.                 jr z,ENDVDPINIT     ; yes, exit
  130.                 out (VDP_ACCESS),a     ; no, print char onto screen
  131.                 nop
  132.                 LD      A,  blank
  133.                 OUT     (DATAPORTA),  A  ;Select the VDPU
  134.                 inc hl
  135.                 jr LDWLCMMSG        ; next char
  136. ENDVDPINIT:      
  137.                 DI
  138.                 HALT
  139.  
  140.                 ; VDP registers settings to set up a text mode
  141. VDPTXTREG       defb 00000000b    ; reg.0: external video disabled
  142.                 defb 11010000b    ; reg.1: text mode (40x24), enable display
  143.                 defb $02          ; reg.2: name table set to $800 ($02x$400)
  144.                 defb $00          ; reg.3: not used in text mode
  145.                 defb $00          ; reg.4: pattern table set to $0000
  146.                 defb $00          ; reg.5: not used in text mode
  147.                 defb $00          ; reg.6: not used in text mode
  148.                 defb $90          ; reg.7: light blue text on white background
  149. ;------------------------------------------------------------------------------
  150. MSGTXT1:        defm "Z80 SBC by Grant Searle",CR,LF
  151.                 defm "LM80C bootloader by Leonardo Miliani",CR,LF,0
  152.  
  153. WLCMSG:         defm "Hello!",CR,LF
  154. CHARSET equ $
  155.         defb 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; char 0
  156.         defb 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; char 1
  157.         defb 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; char 2
  158.         defb 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; char 3
  159.         defb 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; char 4
  160.         defb 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; char 5
  161.         defb 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; char 6
  162.         defb 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; char 7
  163.         defb 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; char 8
  164.         defb 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; char 9
  165.         defb 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; char 10
  166.         defb 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; char 11
  167.         defb 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; char 12
  168.         defb 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; char 13
  169.         defb 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; char 14
  170.         defb 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; char 15
  171.         defb 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; char 16
  172.         defb 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; char 17
  173.         defb 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; char 18
  174.         defb 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; char 19
  175.         defb 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; char 20
  176.         defb 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; char 21
  177.         defb 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; char 22
  178.         defb 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; char 23
  179.         defb 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; char 24
  180.         defb 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; char 25
  181.         defb 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; char 26
  182.         defb 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; char 27
  183.         defb 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; char 28
  184.         defb 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; char 29
  185.         defb 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; char 30
  186.         defb 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; char 31
  187.         defb 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; space
  188.         defb 0x20,0x20,0x20,0x20,0x20,0x00,0x20,0x00 ; !
  189.         defb 0x50,0x50,0x00,0x00,0x00,0x00,0x00,0x00 ; "
  190.         defb 0x50,0x50,0xf8,0x50,0xf8,0x50,0x50,0x00 ; #
  191.         defb 0x20,0x78,0xa0,0x70,0x28,0xf0,0x20,0x00 ; $
  192.         defb 0xc0,0xc8,0x10,0x20,0x40,0x98,0x18,0x00 ; %
  193.         defb 0x60,0x90,0xa0,0x40,0xa8,0x90,0x68,0x00 ; &
  194.         defb 0x60,0x20,0x40,0x00,0x00,0x00,0x00,0x00 ; '
  195.         defb 0x10,0x20,0x40,0x40,0x40,0x20,0x10,0x00 ; (
  196.         defb 0x40,0x20,0x10,0x10,0x10,0x20,0x40,0x00 ; )
  197.         defb 0x00,0x20,0xa8,0x70,0xa8,0x20,0x00,0x00 ; *
  198.         defb 0x00,0x20,0x20,0xf8,0x20,0x20,0x00,0x00 ; +
  199.         defb 0x00,0x00,0x00,0x00,0x60,0x20,0x40,0x00 ; ,
  200.         defb 0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00 ; -
  201.         defb 0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00 ; .
  202.         defb 0x00,0x08,0x10,0x20,0x40,0x80,0x00,0x00 ; /
  203.         defb 0x70,0x88,0x98,0xa8,0xc8,0x88,0x70,0x00 ; 0
  204.         defb 0x20,0x60,0x20,0x20,0x20,0x20,0x70,0x00 ; 1
  205.         defb 0x70,0x88,0x08,0x10,0x20,0x40,0xf8,0x00 ; 2
  206.         defb 0xf8,0x10,0x20,0x10,0x08,0x88,0x70,0x00 ; 3
  207.         defb 0x10,0x30,0x50,0x90,0xf8,0x10,0x10,0x00 ; 4
  208.         defb 0xf8,0x80,0xf0,0x08,0x08,0x88,0x70,0x00 ; 5
  209.         defb 0x30,0x40,0x80,0xf8,0x88,0x88,0x70,0x00 ; 6
  210.         defb 0xf8,0x08,0x10,0x20,0x40,0x40,0x40,0x00 ; 7
  211.         defb 0x70,0x88,0x88,0x70,0x88,0x88,0x70,0x00 ; 8
  212.         defb 0x70,0x88,0x88,0x78,0x08,0x10,0x60,0x00 ; 9
  213.         defb 0x00,0x30,0x30,0x00,0x30,0x30,0x00,0x00 ; :
  214.         defb 0x00,0x30,0x30,0x00,0x30,0x10,0x20,0x00 ; ;
  215.         defb 0x10,0x20,0x40,0x80,0x40,0x20,0x10,0x00 ; <
  216.         defb 0x14,0x14,0x14,0x14,0x14,0x00,0x00,0x00 ; =
  217.         defb 0x40,0x20,0x10,0x08,0x10,0x20,0x40,0x00 ; >
  218.         defb 0x70,0x88,0x08,0x10,0x20,0x00,0x20,0x00 ; ?
  219.         defb 0x70,0x88,0x08,0x68,0xa8,0xa8,0x70,0x00 ; @
  220.         defb 0x70,0x88,0x88,0x88,0xf8,0x88,0x88,0x00 ; A
  221.         defb 0xf0,0x88,0x88,0xf0,0x88,0x88,0xf0,0x00 ; B
  222.         defb 0x70,0x88,0x80,0x80,0x80,0x88,0x70,0x00 ; C
  223.         defb 0xe0,0x90,0x88,0x88,0x88,0x90,0xe0,0x00 ; D
  224.         defb 0xf8,0x80,0x80,0xf0,0x80,0x80,0xf8,0x00 ; E
  225.         defb 0xf8,0x80,0x80,0xf0,0x80,0x80,0x80,0x00 ; F
  226.         defb 0x70,0x88,0x80,0xb8,0x88,0x88,0x78,0x00 ; G
  227.         defb 0x88,0x88,0x88,0xf8,0x88,0x88,0x88,0x00 ; H
  228.         defb 0x70,0x20,0x20,0x20,0x20,0x20,0x70,0x00 ; I
  229.         defb 0x38,0x10,0x10,0x10,0x10,0x90,0x60,0x00 ; J
  230.         defb 0x88,0x90,0xa0,0xc0,0xa0,0x90,0x88,0x00 ; K
  231.         defb 0x80,0x80,0x80,0x80,0x80,0x80,0xf8,0x00 ; L
  232.         defb 0x88,0xd8,0xa8,0xa8,0x88,0x88,0x88,0x00 ; M
  233.         defb 0x88,0xc8,0xa8,0x98,0x88,0x88,0x88,0x00 ; N
  234.         defb 0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x00 ; O
  235.         defb 0xf0,0x88,0x88,0xf0,0x80,0x80,0x80,0x00 ; P
  236.         defb 0x70,0x88,0x88,0x88,0xa8,0x90,0x68,0x00 ; Q
  237.         defb 0xf0,0x88,0x88,0xf0,0xa0,0x90,0x88,0x00 ; R
  238.         defb 0x78,0x80,0x80,0x70,0x08,0x08,0xf0,0x00 ; S
  239.         defb 0xf8,0x20,0x20,0x20,0x20,0x20,0x20,0x00 ; T
  240.         defb 0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x00 ; U
  241.         defb 0x88,0x88,0x88,0x88,0x88,0x50,0x20,0x00 ; V
  242.         defb 0x88,0x88,0x88,0x88,0xa8,0xa8,0x50,0x00 ; W
  243.         defb 0x88,0x88,0x50,0x20,0x50,0x88,0x88,0x00 ; X
  244.         defb 0x88,0x88,0x88,0x50,0x20,0x20,0x20,0x00 ; Y
  245.         defb 0xf8,0x08,0x10,0x20,0x40,0x80,0xf8,0x00 ; Z
  246.         defb 0x70,0x40,0x40,0x40,0x40,0x40,0x70,0x00 ; [
  247.         defb 0x00,0x80,0x40,0x20,0x10,0x08,0x00,0x00 ; \
  248.         defb 0x70,0x10,0x10,0x10,0x10,0x10,0x70,0x00 ; ]
  249.         defb 0x20,0x50,0x88,0x00,0x00,0x00,0x00,0x00 ; ^
  250.         defb 0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00 ; _
  251.         defb 0x40,0x20,0x10,0x00,0x00,0x00,0x00,0x00 ; `
  252.         defb 0x00,0x00,0x70,0x08,0x78,0x88,0x78,0x00 ; a
  253.         defb 0x00,0x80,0x80,0xb0,0xc8,0x88,0xf0,0x00 ; b
  254.         defb 0x00,0x00,0x70,0x80,0x80,0x88,0x70,0x00 ; c
  255.         defb 0x08,0x08,0x08,0x68,0x98,0x88,0x78,0x00 ; d
  256.         defb 0x00,0x00,0x70,0x88,0xf8,0x80,0x70,0x00 ; e
  257.         defb 0x30,0x48,0x40,0xe0,0x40,0x40,0x40,0x00 ; f
  258.         defb 0x00,0x78,0x88,0x88,0x78,0x08,0x70,0x00 ; g
  259.         defb 0x80,0x80,0xb0,0xc8,0x88,0x88,0x88,0x00 ; h
  260.         defb 0x00,0x20,0x00,0x20,0x20,0x20,0x20,0x00 ; i
  261.         defb 0x10,0x00,0x30,0x10,0x10,0x90,0x60,0x00 ; j
  262.         defb 0x80,0x80,0x90,0xa0,0xc0,0xa0,0x90,0x00 ; k
  263.         defb 0x60,0x20,0x20,0x20,0x20,0x20,0x70,0x00 ; l
  264.         defb 0x00,0x00,0xd0,0xa8,0xa8,0x88,0x88,0x00 ; m
  265.         defb 0x00,0x00,0xb0,0xc8,0x88,0x88,0x88,0x00 ; n
  266.         defb 0x00,0x00,0x70,0x88,0x88,0x88,0x70,0x00 ; o
  267.         defb 0x00,0x00,0xf0,0x88,0xf0,0x80,0x80,0x00 ; p
  268.         defb 0x00,0x00,0x68,0x98,0x78,0x08,0x08,0x00 ; q
  269.         defb 0x00,0x00,0xb0,0xc8,0x80,0x80,0x80,0x00 ; r
  270.         defb 0x00,0x00,0x70,0x80,0x70,0x08,0xf0,0x00 ; s
  271.         defb 0x40,0x40,0xe0,0x40,0x40,0x48,0x30,0x00 ; t
  272.         defb 0x00,0x00,0x88,0x88,0x88,0x98,0x68,0x00 ; u
  273.         defb 0x00,0x00,0x88,0x88,0x88,0x50,0x20,0x00 ; v
  274.         defb 0x00,0x00,0x88,0x88,0xa8,0xa8,0x50,0x00 ; w
  275.         defb 0x00,0x00,0x88,0x50,0x20,0x50,0x88,0x00 ; x
  276.         defb 0x00,0x00,0x88,0x88,0x78,0x08,0x70,0x00 ; y
  277.         defb 0x00,0x00,0xf8,0x10,0x20,0x40,0xf8,0x00 ; z
  278.         defb 0x10,0x20,0x20,0x40,0x20,0x20,0x10,0x00 ; {
  279.         defb 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00 ; |
  280.         defb 0x20,0x10,0x10,0x08,0x10,0x10,0x20,0x00 ; }
  281.         defb 0x00,0x28,0x50,0x00,0x00,0x00,0x00,0x00 ; ~ (127th char, last ASCII char)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement