;Scroll a message stored in ROM across an 8-character ;display attached at output ports 0-7. ; ;Top of ROM: 0x2000 ;Top of RAM: 0x4000 ; ;Null terminated string @ 0x0400 STRING: EQU 400h STRINGPTR: EQU 2000h BUFF: EQU 2004h START: LXI SP, 4000h LXI H, STRING SHLD STRINGPTR CALL CLEAR SCROLL: CALL UPDATE CALL SHIFT CALL DELAY JMP SCROLL ;Shift the contents of the data buffer down one ;and replace the last character with the next char ;from the circular array. SHIFT: LXI H, BUFF ;buff* MOV B, H ;buff* + 1 MOV C, L INX B MVI D, 07h SH1: LDAX B MOV M, A INX H INX B DCR D JNZ SH1 CALL ARRAYNEXT MOV M, A RET ;Update the 8-character ASCII display with the contents ;of its buffer. UPDATE: LXI H, BUFF CALL GETELE OUT 00h CALL GETELE OUT 01h CALL GETELE OUT 02h CALL GETELE OUT 03h CALL GETELE OUT 04h CALL GETELE OUT 05h CALL GETELE OUT 06h CALL GETELE OUT 07h RET ;Support subroutine for UPDATE GETELE: MOV A, M INX H RET ;Load the buffer with spaces CLEAR: LXI H, BUFF MVI D, 8h MVI A, 20h REP: MOV M, A INX H DCR D RZ JMP REP ;Circular Array Implementation ;Return with the next value of the array in A. ;If we reach the end, loop back around. ARRAYNEXT: PUSH H LHLD STRINGPTR MOV A, M CPI 00h JZ WRAP INX H SHLD STRINGPTR POP H RET WRAP: LXI H, STRING SHLD STRINGPTR CALL ARRAYNEXT RET ;Delay, return to HL when done. DELAY: PUSH B MVI A, 0FFh MOV B, A PT1: DCR A PT2: DCR B JNZ PT2 CPI 00h JNZ PT1 POP B RET