apple1/ROM development/POST.asm

228 lines
4.6 KiB
NASM

;KBD = $D010
;KBDCR = $D011
;DSP = $D012
;DSPCR = $D013
START_TEST = $EA
END_TEST = $EB
LED_BLINKS = 5
TEST1_REPEATS = 4
TEST2_REPEATS = 16
TEST61_REPEATS = 8
TEST62_REPEATS = 8
TEST7_REPEATS = 16
POSTOK_REPEATS = 4
/*
LED_BLINKS = 1
TEST1_REPEATS = 1
TEST2_REPEATS = 1
TEST61_REPEATS = 1
TEST62_REPEATS = 1
TEST7_REPEATS = 1
POSTOK_REPEATS = 1
*/
POST_START: NOP
LDA #START_TEST
STA DSP
LDA #%00000001
JSR BLINK
;Test 1. Memory addresses decoder (blinking in cycle)
MEM_DECODER: LDX #TEST1_REPEATS
LOOPADDR: LDA $FF00
LDA $E000
LDA $D000
LDA $C000
DEX
BNE LOOPADDR
LDA #%00000010
JSR BLINK
;Test 2. Ports decoder (blinking in cycle)
LDA #TEST2_REPEATS
PORTS_DECODER: TAX
LDY KBD
LDY KBDCR
STX DSP
BIT DSP
DEX
TXA
BNE PORTS_DECODER
LDA #%00000100
JSR BLINK
;Test 3. Testing writing to Video port (1->2->4->8->16->32->64->128->256->0)
LDA #%00000001
VIDEO_PORT: STA DSP
ASL A ;shifting 1 to the left
BNE VIDEO_PORT
LDA #%00001000
JSR BLINK
;Test 4. Testing writing to Video port via function call (256->128->64->32->16->8->4->2->1->0)
JSR VIDEO_PORT2
LDA #%00010000
JSR BLINK
;Test 5. Testing RAM with write&read (writing TEST_SYMBOL and testing read for every 4Kb block in 32Kb RAM)
;Total blocks tested is 8 (4*8 = 32)
TEST_SYMBOL = $3E
/*
RAMTEST: CLD
LDX #$00
LDY #$00
LDA #$FF
STA $00
LDA #$0F
STA $01
RAMLOOP: LDA #TEST_SYMBOL
STA ($00),Y
LDA ($00),Y
CMP #TEST_SYMBOL
BNE ENDTEST
TXA
ASL A
ADC #$01
STA DSP
TAX
LDA $01
ADC #$10
STA $01
JMP RAMLOOP
*/
LDA #%00100000
JSR BLINK
;Test 6. Testing BIT7 ports - keyboard and video
BIT7MASK = %10000000
KBD7MASK = %00000111
DSP7MASK = %00111111
;Test 6.1. Testing keyboard BIT7 port read (turn on 3 LEDs on the left and show BIT7 in the last LED)
KBDBIT7: LDX #TEST61_REPEATS
LDA #KBD7MASK
STA DSP
KBD7LOOP:
LDA KBDCR
AND #BIT7MASK
ORA #KBD7MASK
STA DSP
DEX
BNE KBD7LOOP
;Test 6.2. Testing video BIT7 port read (turn on 6 LEDs on the left and show BIT7 in the last LED)
DSPBIT7: LDX #TEST62_REPEATS
LDA #DSP7MASK
STA DSP
DSP7LOOP:
LDA DSP
AND #BIT7MASK
ORA #DSP7MASK
STA DSP
DEX
BNE DSP7LOOP
LDA #%01000000
JSR BLINK
;Test 7. Testing keyboard port read and write to Video port
KBDTODSP: LDX #TEST7_REPEATS
LDA #$00
STA DSP
KBDDSPLOOP:
LDA KBD
STA DSP
DEX
BNE KBDDSPLOOP
;POST success and end
ENDPOST: LDX #POSTOK_REPEATS
ENDLOOP:
LDA #%01010101
STA DSP
NOP
NOP
LDA #%10101010
STA DSP
NOP
NOP
DEX
BNE ENDLOOP
NOP
NOP
;printing ASCII table
JSR ASCII_ECHO
ENDTEST: NOP
NOP
LDA #END_TEST
JSR ECHO ;writing END_TEST to let video driver know that tests are over
LDX #$00
PRINT_MSG:
LDA POSTCompletedText, X
BEQ TO_WOZ_MON ;end printing at the end of the string (\n=0)
JSR ECHO
INX
JMP PRINT_MSG
TO_WOZ_MON: JMP RESET ;start Woz Monitor (operating system)
;------------------------------------------------------
; POST subroutines
;------------------------------------------------------
;blinking LEDs in Video port
VIDEO_PORT2: LDA #%10000000
TEST2: STA DSP
LSR A
BNE TEST2
RTS
;blink with a LED in a position from A register
TURN_OFF = %00000000
BLINK: LDX #LED_BLINKS
TAY ;save A
NEXT_BLINK: TYA ;restore A
STA DSP
NOP
NOP
LDA #TURN_OFF
STA DSP
NOP
NOP
DEX
BNE NEXT_BLINK
RTS
;printing visible symbols of ACSII table via ECHO function from Woz Monitor
PRINT_ASCII:
LDY #32
LDX #95 ;80 in hex = 127 in decimal
ASCII_ECHO:
BIT DSP
BMI ASCII_ECHO
STY DSP
INY
DEX
BNE ASCII_ECHO
RTS
CHAR_ECHO: BIT DSP
BMI CHAR_ECHO
STA DSP
RTS
POSTCompletedText:
.byte $0d, $0d, "POST ok (v.1.0). SmartyKit 1 is ready.", $0d, $0d, $00