Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ORG 0x0000
- EN EQU %10000000
- RW EQU %01000000
- RS EQU %00100000
- PORTA EQU (0x00)
- PORTB EQU (0x01)
- DDRA EQU (0x02)
- DDRB EQU (0x03)
- START:
- LD SP, 0xFFFE ; stack pointer at end of ram cca
- LD B, %10000000
- LD C, 0x2
- LD A, 0x0
- LD (BC), A ; so the ram address of 0x8002 is 0x0
- LD A, 0xCF
- OUT (C), A ; control mode on 0x2
- LD A, 0x0
- OUT (C), A ; all are outputs on 0x2
- LD A, %00000111
- OUT (C), A ; interrupt config, not sure if necessary
- LD A, 0x0
- LD C, 0x3
- LD (BC), A ; so the ram addres of 0x8003 is 0x0
- LD C, 0x1
- LD (BC), A ; so the 0x8001 is also 0x0
- LD C, 0x0
- LD (BC), A ; so the 0x8000 is also 0x0
- LD C, 0x3
- LD A, 0xCF
- OUT (C), A ; control mode
- LD A, %00010000
- OUT (C), A ; all are outputs except 4
- LD A, 0x0
- OUT (C), A ; vector is 0 i suppose
- ; this is the latest addition
- LD A, %10010111
- OUT (C), A ; interrupt config
- LD A, %11101111 ; monitor only byte 4
- OUT (C), A
- LD A, 0x02
- LD I, A ; interrupt register, upper byte
- EI
- IM 2
- LD A, %00110000
- CALL LCD_INSTRUCTION
- LD A, %00110000
- CALL LCD_INSTRUCTION
- LD A, %00110000
- CALL LCD_INSTRUCTION
- LD A, %00111000 ; set 8-bit mode, 2 line display, 5x8 font
- CALL LCD_INSTRUCTION
- LD A, %00001110 ; display on, cursor on, blink off
- CALL LCD_INSTRUCTION
- LD A, %00000110 ; increment and shift
- CALL LCD_INSTRUCTION
- JP MAIN
- ORG 66h ; non maskable interrupt
- CALL NMI
- RETI
- ORG 0x100
- MAIN:
- LD A, %00000001 ; clear display
- CALL LCD_INSTRUCTION
- LD HL,msg
- LOOP:
- LD A, (HL)
- OR A
- JP Z, END
- CALL PRINT_CHAR
- INC HL
- JP LOOP
- END:
- JP END
- ORG 0x200
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- DW 0x1234
- ORG 0x1234
- INTERRUPTION:
- DI
- EX AF, AF'
- EXX
- LD A, %00000001 ; clear display
- CALL LCD_INSTRUCTION
- LD HL,msg_lol2
- LOOP_INT3:
- LD A, (HL)
- OR A
- JP Z, END_LOOP3
- CALL PRINT_CHAR
- INC HL
- JP LOOP_INT3
- END_LOOP3:
- EXX
- EX AF, AF'
- EI
- HALT
- RETI
- LCD_WAIT:
- PUSH AF
- LD C, 0x2
- LD A, 0xCF
- OUT (C), A
- LD A, 0xFF
- OUT (C), A ; port A is input
- LCD_BUSY:
- LD A, RW
- LD C, 0x1
- OUT (C), A
- OR EN
- OUT (C), A
- LD C, 0x0
- IN A, (C)
- AND %10000000
- JR NZ, LCD_BUSY
- LD A, RW
- LD C, 0x1
- OUT (C), A
- LD C, 0x2
- LD A, 0xCF
- OUT (C), A
- LD A, 0x00
- OUT (C), A ; port A is input
- POP AF
- RET
- LCD_INSTRUCTION:
- CALL LCD_WAIT
- LD C, 0x0
- OUT (C), A ; put the contents of A register on PORT A
- LD C, 0x1
- LD A, 0x0
- OUT (C), A
- LD A, EN
- OUT (C), A
- LD A, 0x0
- OUT (C), A
- RET
- DELAY:
- LD HL, 5000
- DELAY1:
- DEC HL
- LD A, H
- OR L
- JR NZ, DELAY1
- RET ; if zero, return
- PRINT_CHAR:
- CALL LCD_WAIT
- LD C, 0x0
- OUT (C), A
- LD C, 0x1
- LD A, RS
- OUT (C), A
- LD A, RS
- OR EN
- OUT (C), A
- LD A, RS
- OUT (C), A
- RET
- NMI:
- DI
- EX AF, AF'
- EXX
- LD HL,msg_nmi
- LOOP_INT2:
- LD A, (HL)
- OR A
- JP Z, END_LOOP2
- CALL PRINT_CHAR
- INC HL
- JP LOOP_INT2
- END_LOOP2:
- EXX
- EX AF, AF'
- EI
- RET
- msg: .asciz "Hello World"
- msg_nmi: .asciz "NMI"
- msg_int: .asciz "INT"
- msg_lol2: .asciz "1234"
- msg_lol: .asciz "3412"
- ORG 0x3412
- INTERRUPTION22:
- DI
- EX AF, AF'
- EXX
- LD A, %00000001 ; clear display
- CALL LCD_INSTRUCTION
- LD HL,msg_lol
- LOOP_INT22:
- LD A, (HL)
- OR A
- JP Z, END_LOOP22
- CALL PRINT_CHAR
- INC HL
- JP LOOP_INT22
- END_LOOP22:
- EXX
- EX AF, AF'
- EI
- HALT
- RETI
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement