diff --git a/ROM development/8x8art.asm b/ROM development/8x8art.asm new file mode 100644 index 0000000..08044a7 --- /dev/null +++ b/ROM development/8x8art.asm @@ -0,0 +1,96 @@ +;printing 8x8 picture in the center with '*' +PIC_WIDTH = 8 +PIC_HEIGHT = 8 +OFFSET_X = (40 - PIC_WIDTH)/2 +PIC_ADDRESS = $1111 +ROW_ADDRESS = PIC_ADDRESS + PIC_HEIGHT + + +; Y - row number +; X - column (pixel) number + JSR NEXT_ROW + LDA #$0 + STA ROW_ADDRESS ;initialize row counter with 0 + LDY #PIC_HEIGHT + +ROWS_LOOP: JSR PRINT_OFFSET + LDA ROW_ADDRESS + TAX + LDA PIC_ADDRESS, X + LDX #PIC_WIDTH +NEXT_PIXEL: ASL + BCC NO_PIXEL + JSR PRINT_STAR + JMP AFTER_PIXEL +NO_PIXEL: JSR PRINT_BLANK +AFTER_PIXEL: DEX + BNE NEXT_PIXEL + JSR NEXT_ROW + INC ROW_ADDRESS + DEY + BNE ROWS_LOOP + JSR NEXT_ROW + JMP RESET + +;printing offset subroutine (optional: save registers A and X) +PRINT_OFFSET: PHA ;save A + TXA ;X->A + PHA ;save X + LDX #OFFSET_X +OFFSET_LOOP: LDA #' ' + JSR ECHO + DEX + BNE OFFSET_LOOP + + PLA ;restore X + TAX ;A->X + PLA ;restore A + RTS + +PRINT_STAR: PHA + LDA #'*' + JSR ECHO + PLA + RTS +PRINT_BLANK: PHA + LDA #' ' + JSR ECHO + PLA + RTS +NEXT_ROW: PHA + LDA #$0d + JSR ECHO + PLA + RTS +;from HeartPicture +;to PIC_ADDRESS ($88) +COPY_HEART: PHA + TXA + PHA + + LDX #PIC_HEIGHT +COPY_LOOP: LDA HeartPicture, X + STA PIC_ADDRESS, X + DEX + BPL COPY_LOOP + + PLA + TAX + PLA + RTS + + +HeartPicture: + .byte %00000000 + .byte %01100110 + .byte %11111111 + .byte %11111111 + .byte %11111111 + .byte %01111110 + .byte %00111100 + .byte %00011000 +SmileyPicture: .byte $3c, $42, $a5, $81, $a5, $99, $42, $3c +WozPicture: .byte $88, $a8, $50, $07, $61, $92, $94, $67 +SmartyLogo: .byte $ff, $81, $bd, $bd, $bd, $bd, $81, $ff +RocketPicture: .byte $18, $24, $24, $24, $7e, $a5, $FF, $a5 + .byte "8*8 Pixel Art program end", $0d, $00 \ No newline at end of file diff --git a/ROM development/Apple30th_Woz.asm b/ROM development/Apple30th_Woz.asm new file mode 100644 index 0000000..828b501 --- /dev/null +++ b/ROM development/Apple30th_Woz.asm @@ -0,0 +1,525 @@ +;SYMBOLS_TABLE = $031D +;INSTRUCTIONS_TABLE = $032D + +VAR_X = $0006 +VAR_Y = $0007 + +;addresses from Woz Monitor +;ECHO = $FFEF +;KBD = $D010 +;KBDCR = $D011 + +SCREEN_WIDTH = $28 + + LDA #$FF + PHA + LDA #$00 + PHA +A_0286: LDA #INSTRUCTIONS + STA VAR_Y ;zp +A_028R: JSR ECHO_CR + +A_0291: LDY #$00 + LDA (VAR_X),Y + BEQ A_02B2 + LSR A + LSR A + LSR A + LSR A + TAX + LDA (VAR_X),Y + AND #$0F + TAY + LDA SYMBOLS,Y +A_02A4: JSR ECHO + DEX + BNE A_02A4 + INC VAR_X ;zp + BNE A_0291 + INC VAR_Y ;zp + BNE A_0291 +A_02B2: INY + SEC + LDA #SCREEN_WIDTH + SBC (VAR_X),Y + LSR A + TAX + LDA #$A0 +A_02BC: JSR ECHO + DEX + BNE A_02BC + LDA (VAR_X),Y + TAX +A_02C5: INY + LDA (VAR_X),Y + JSR ECHO + DEX + BNE A_02C5 + INY + TYA + CLC + ADC VAR_X ;zp + STA VAR_X ;zp + LDA #$00 + ADC VAR_Y ;zp + STA VAR_Y ;zp + LDA #$10 + JSR FUNC_WAIT + JSR ECHO_CR + LDY #$00 + LDA (VAR_X),Y + BEQ A_0286 + BNE A_028R + +FUNC_WAIT: PHA + TXA + PHA + TYA + PHA + LDY #$FF +A_02F2: LDX #$FF +A_02F4: LDA KBDCR + BPL A_0302 + PLA + TAY + PLA + TAX + PLA + LDA KBD + RTS + +A_0302: DEX + BNE A_02F4 + DEY + BNE A_02F2 + PLA + TAY + PLA + TAX + PLA + SEC + SBC #$01 + BNE FUNC_WAIT + LDA #$00 + RTS + +ECHO_CR: PHA + LDA #$8D + JSR ECHO + PLA + RTS + +SYMBOLS: + .BYTE $A0 + .BYTE $AE + .BYTE $BA + .BYTE $AC + .BYTE $BB + .BYTE $A1 + .BYTE $AD + .BYTE $DE + .BYTE $AB + .BYTE $BD + .BYTE $BF + .BYTE $A6 + .BYTE $AA + .BYTE $A5 + .BYTE $A3 + .BYTE $C0 + +INSTRUCTIONS: + .BYTE $FF + .BYTE $1F + .BYTE $1B + .BYTE $17 + .BYTE $16 + .BYTE $14 + .BYTE $13 + .BYTE $14 + .BYTE $17 + .BYTE $1B + .BYTE $1E + .BYTE $FF + .BYTE $CF + .BYTE $1E + .BYTE $2C + .BYTE $18 + .BYTE $50 + .BYTE $21 + .BYTE $12 + .BYTE $14 + .BYTE $17 + .BYTE $1C + .BYTE $FF + .BYTE $8F + .BYTE $1B + .BYTE $16 + .BYTE $12 + .BYTE $21 + .BYTE $70 + .BYTE $31 + .BYTE $10 + .BYTE $11 + .BYTE $18 + .BYTE $FF + .BYTE $5F + .BYTE $1D + .BYTE $15 + .BYTE $50 + .BYTE $21 + .BYTE $70 + .BYTE $41 + .BYTE $18 + .BYTE $1D + .BYTE $FF + .BYTE $2F + .BYTE $1E + .BYTE $14 + .BYTE $F0 + .BYTE $30 + .BYTE $11 + .BYTE $10 + .BYTE $12 + .BYTE $17 + .BYTE $1E + .BYTE $FF + .BYTE $19 + .BYTE $E0 + .BYTE $11 + .BYTE $12 + .BYTE $24 + .BYTE $12 + .BYTE $40 + .BYTE $19 + .BYTE $FF + .BYTE $14 + .BYTE $50 + .BYTE $23 + .BYTE $11 + .BYTE $20 + .BYTE $21 + .BYTE $20 + .BYTE $12 + .BYTE $15 + .BYTE $18 + .BYTE $19 + .BYTE $16 + .BYTE $12 + .BYTE $30 + .BYTE $12 + .BYTE $19 + .BYTE $DF + .BYTE $1C + .BYTE $11 + .BYTE $40 + .BYTE $12 + .BYTE $19 + .BYTE $1A + .BYTE $17 + .BYTE $25 + .BYTE $26 + .BYTE $34 + .BYTE $17 + .BYTE $2A + .BYTE $19 + .BYTE $17 + .BYTE $13 + .BYTE $30 + .BYTE $11 + .BYTE $1B + .BYTE $CF + .BYTE $18 + .BYTE $50 + .BYTE $13 + .BYTE $2A + .BYTE $19 + .BYTE $38 + .BYTE $19 + .BYTE $18 + .BYTE $27 + .BYTE $28 + .BYTE $27 + .BYTE $18 + .BYTE $17 + .BYTE $12 + .BYTE $30 + .BYTE $18 + .BYTE $CF + .BYTE $1A + .BYTE $50 + .BYTE $15 + .BYTE $19 + .BYTE $17 + .BYTE $14 + .BYTE $13 + .BYTE $22 + .BYTE $13 + .BYTE $16 + .BYTE $17 + .BYTE $16 + .BYTE $13 + .BYTE $21 + .BYTE $12 + .BYTE $14 + .BYTE $17 + .BYTE $15 + .BYTE $20 + .BYTE $13 + .BYTE $1D + .BYTE $CF + .BYTE $1C + .BYTE $40 + .BYTE $12 + .BYTE $28 + .BYTE $15 + .BYTE $13 + .BYTE $11 + .BYTE $30 + .BYTE $12 + .BYTE $28 + .BYTE $12 + .BYTE $10 + .BYTE $11 + .BYTE $12 + .BYTE $14 + .BYTE $17 + .BYTE $18 + .BYTE $12 + .BYTE $10 + .BYTE $1A + .BYTE $DF + .BYTE $1D + .BYTE $12 + .BYTE $30 + .BYTE $14 + .BYTE $1A + .BYTE $19 + .BYTE $18 + .BYTE $17 + .BYTE $45 + .BYTE $16 + .BYTE $1B + .BYTE $1D + .BYTE $18 + .BYTE $26 + .BYTE $17 + .BYTE $18 + .BYTE $1A + .BYTE $1B + .BYTE $15 + .BYTE $11 + .BYTE $1C + .BYTE $EF + .BYTE $18 + .BYTE $10 + .BYTE $13 + .BYTE $12 + .BYTE $13 + .BYTE $59 + .BYTE $18 + .BYTE $27 + .BYTE $19 + .BYTE $1B + .BYTE $2C + .BYTE $1A + .BYTE $27 + .BYTE $19 + .BYTE $2A + .BYTE $17 + .BYTE $12 + .BYTE $18 + .BYTE $EF + .BYTE $1E + .BYTE $12 + .BYTE $23 + .BYTE $11 + .BYTE $15 + .BYTE $16 + .BYTE $35 + .BYTE $24 + .BYTE $35 + .BYTE $16 + .BYTE $17 + .BYTE $16 + .BYTE $14 + .BYTE $13 + .BYTE $14 + .BYTE $15 + .BYTE $16 + .BYTE $15 + .BYTE $11 + .BYTE $18 + .BYTE $FF + .BYTE $17 + .BYTE $30 + .BYTE $12 + .BYTE $24 + .BYTE $13 + .BYTE $21 + .BYTE $23 + .BYTE $11 + .BYTE $10 + .BYTE $21 + .BYTE $22 + .BYTE $21 + .BYTE $13 + .BYTE $14 + .BYTE $12 + .BYTE $13 + .BYTE $1D + .BYTE $FF + .BYTE $1D + .BYTE $16 + .BYTE $11 + .BYTE $10 + .BYTE $21 + .BYTE $22 + .BYTE $11 + .BYTE $22 + .BYTE $13 + .BYTE $24 + .BYTE $25 + .BYTE $14 + .BYTE $23 + .BYTE $41 + .BYTE $1A + .BYTE $FF + .BYTE $2F + .BYTE $1D + .BYTE $16 + .BYTE $15 + .BYTE $20 + .BYTE $31 + .BYTE $13 + .BYTE $24 + .BYTE $15 + .BYTE $16 + .BYTE $47 + .BYTE $13 + .BYTE $11 + .BYTE $10 + .BYTE $12 + .BYTE $19 + .BYTE $FF + .BYTE $2F + .BYTE $1D + .BYTE $1A + .BYTE $1C + .BYTE $19 + .BYTE $13 + .BYTE $11 + .BYTE $20 + .BYTE $21 + .BYTE $13 + .BYTE $24 + .BYTE $33 + .BYTE $24 + .BYTE $21 + .BYTE $13 + .BYTE $1A + .BYTE $EF + .BYTE $2E + .BYTE $1D + .BYTE $1C + .BYTE $1B + .BYTE $1D + .BYTE $1E + .BYTE $1B + .BYTE $16 + .BYTE $13 + .BYTE $51 + .BYTE $12 + .BYTE $41 + .BYTE $12 + .BYTE $21 + .BYTE $12 + .BYTE $18 + .BYTE $1A + .BYTE $1D + .BYTE $AF + .BYTE $1E + .BYTE $1D + .BYTE $3C + .BYTE $2D + .BYTE $4E + .BYTE $1A + .BYTE $14 + .BYTE $22 + .BYTE $11 + .BYTE $20 + .BYTE $71 + .BYTE $13 + .BYTE $15 + .BYTE $17 + .BYTE $2C + .BYTE $1D + .BYTE $1E + .BYTE $7F + .BYTE $4D + .BYTE $2E + .BYTE $2D + .BYTE $2E + .BYTE $1D + .BYTE $2E + .BYTE $19 + .BYTE $23 + .BYTE $32 + .BYTE $31 + .BYTE $22 + .BYTE $13 + .BYTE $15 + .BYTE $16 + .BYTE $14 + .BYTE $17 + .BYTE $2E + .BYTE $3D + .BYTE $2E + .BYTE $4F + .BYTE $2E + .BYTE $7D + .BYTE $2E + .BYTE $1D + .BYTE $2E + .BYTE $1A + .BYTE $14 + .BYTE $43 + .BYTE $14 + .BYTE $13 + .BYTE $14 + .BYTE $15 + .BYTE $16 + .BYTE $17 + .BYTE $15 + .BYTE $14 + .BYTE $18 + .BYTE $1D + .BYTE $4E + .BYTE $2D + .BYTE $4E + .BYTE $9D + .BYTE $4E + .BYTE $1C + .BYTE $1A + .BYTE $18 + .BYTE $15 + .BYTE $14 + .BYTE $43 + .BYTE $15 + .BYTE $26 + .BYTE $15 + .BYTE $13 + .BYTE $16 + .BYTE $1A + .BYTE $3E + .BYTE $8D + .BYTE $00 + .BYTE $04 + .BYTE $57 + .BYTE $4F + .BYTE $5A + .BYTE $20 + .BYTE $00 + + .byte "Woz face program end", $0d, $00 diff --git a/ROM development/HelloWorld.asm b/ROM development/HelloWorld.asm new file mode 100644 index 0000000..a7fec4b --- /dev/null +++ b/ROM development/HelloWorld.asm @@ -0,0 +1,14 @@ +;printing 'Hello, World!' +;More about 'Hello, World!' program: https://en.wikipedia.org/wiki/%22Hello,_World!%22_program + LDX #00 +PRINT_CHAR: + LDA HelloWorldText, X + BEQ END_PRINT ;end printing at the end of the string (\n=0) + JSR ECHO + INX + JMP PRINT_CHAR +END_PRINT: + JMP RESET ;return to Woz Monitor + +HelloWorldText: + .byte $0d, "Hello, World!", $0d, "This is SmartyKit 1.", $0d, $0d, $00 \ No newline at end of file diff --git a/ROM development/HelloWorld.txt b/ROM development/HelloWorld.txt new file mode 100644 index 0000000..e6acacd --- /dev/null +++ b/ROM development/HelloWorld.txt @@ -0,0 +1,4 @@ +FD00: A2 00 BD 11 FD F0 07 20 +FD08: EF FF E8 4C 02 FD 4C 00 +FD10: FF 48 65 6C 6C 6F 20 57 +FD18: 6F 72 6C 64 21 0D 00 \ No newline at end of file diff --git a/ROM development/Makefile b/ROM development/Makefile new file mode 100644 index 0000000..c583fb7 --- /dev/null +++ b/ROM development/Makefile @@ -0,0 +1,15 @@ +all: welcome compile + +welcome: + @echo "SmartyKit 1: 6502 assembler & C-compiler to ROM (.bin)" + +compile: + @echo "Assembling and linking..." + ca65 -l ROM_listing.asm SmartyKit1_ROM.asm + ld65 -m ROM.map -o SmartyKit1_ROM.bin SmartyKit1_ROM.o -C apple1.cfg + + ld65 -o SmartyKit1_ROM_symon.bin SmartyKit1_ROM.o -C symon.cfg + +clean: + @echo "Cleaning up..." + rm SmartyKit1_ROM.o \ No newline at end of file diff --git a/ROM development/POST.asm b/ROM development/POST.asm new file mode 100644 index 0000000..c3b453e --- /dev/null +++ b/ROM development/POST.asm @@ -0,0 +1,228 @@ +;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 \ No newline at end of file diff --git a/ROM development/ROM.map b/ROM development/ROM.map new file mode 100644 index 0000000..d5d8345 --- /dev/null +++ b/ROM development/ROM.map @@ -0,0 +1,46 @@ +Modules list: +------------- +SmartyKit1_ROM.o: + CODE Offs=000000 Size=000005 Align=00001 Fill=0000 + PICTURE Offs=000000 Size=00001A Align=00001 Fill=0000 + C000 Offs=000000 Size=000001 Align=00001 Fill=0000 + E000 Offs=000000 Size=000007 Align=00001 Fill=0000 + F000 Offs=000000 Size=00024A Align=00001 Fill=0000 + F800 Offs=000000 Size=00000B Align=00001 Fill=0000 + FA00 Offs=000000 Size=000122 Align=00001 Fill=0000 + FC00 Offs=000000 Size=0000B2 Align=00001 Fill=0000 + FD00 Offs=000000 Size=000037 Align=00001 Fill=0000 + FF00 Offs=000000 Size=0000FA Align=00001 Fill=0000 + VECTORS Offs=000000 Size=000006 Align=00001 Fill=0000 + + +Segment list: +------------- +Name Start End Size Align +---------------------------------------------------- +PICTURE 000088 0000A1 00001A 00001 +CODE 008000 008004 000005 00001 +C000 00C000 00C000 000001 00001 +E000 00E000 00E006 000007 00001 +F000 00F000 00F249 00024A 00001 +F800 00F800 00F80A 00000B 00001 +FA00 00FA00 00FB21 000122 00001 +FC00 00FC00 00FCB1 0000B2 00001 +FD00 00FD00 00FD36 000037 00001 +FF00 00FF00 00FFF9 0000FA 00001 +VECTORS 00FFFA 00FFFF 000006 00001 + + +Exports list by name: +--------------------- + + + +Exports list by value: +---------------------- + + + +Imports list: +------------- + diff --git a/ROM development/ROM_listing.asm b/ROM development/ROM_listing.asm new file mode 100644 index 0000000..96e9f71 --- /dev/null +++ b/ROM development/ROM_listing.asm @@ -0,0 +1,1107 @@ +ca65 V2.19 - Git 0f4cb443 +Main file : SmartyKit1_ROM.asm +Current file: SmartyKit1_ROM.asm + +000000r 1 .setcpu "6502" +000000r 1 .feature c_comments +000000r 1 .segment "PICTURE" +000000r 1 00 .byte %00000000 +000001r 1 66 .byte %01100110 +000002r 1 FF .byte %11111111 +000003r 1 FF .byte %11111111 +000004r 1 FF .byte %11111111 +000005r 1 7E .byte %01111110 +000006r 1 3C .byte %00111100 +000007r 1 18 .byte %00011000 +000008r 1 00 .byte 00 +000009r 1 00 .byte 00 +00000Ar 1 3C 42 A5 81 Smiley: .byte $3c, $42, $a5, $81, $a5, $99, $42, $3c +00000Er 1 A5 99 42 3C +000012r 1 88 A8 50 07 Woz: .byte $88, $a8, $50, $07, $61, $92, $94, $67 +000016r 1 61 92 94 67 +00001Ar 1 ; .byte "8*8 Pixel Art picture end", $0d, $00 +00001Ar 1 +00001Ar 1 .code +000000r 1 A9 12 loop: lda #$12 +000002r 1 4C rr rr jmp loop +000005r 1 +000005r 1 .segment "C000" +000000r 1 EA nop +000001r 1 .segment "E000" +000000r 1 20 rr rr JSR COPY_HEART +000003r 1 4C 00 FC JMP $FC00 +000006r 1 EA nop +000007r 1 .segment "F000" +000000r 1 ;Woz face +000000r 1 .include "Apple30th_Woz.asm" +000000r 2 ;SYMBOLS_TABLE = $031D +000000r 2 ;INSTRUCTIONS_TABLE = $032D +000000r 2 +000000r 2 VAR_X = $0006 +000000r 2 VAR_Y = $0007 +000000r 2 +000000r 2 ;addresses from Woz Monitor +000000r 2 ;ECHO = $FFEF +000000r 2 ;KBD = $D010 +000000r 2 ;KBDCR = $D011 +000000r 2 +000000r 2 SCREEN_WIDTH = $28 +000000r 2 +000000r 2 A9 FF LDA #$FF +000002r 2 48 PHA +000003r 2 A9 00 LDA #$00 +000005r 2 48 PHA +000006r 2 A9 rr A_0286: LDA #INSTRUCTIONS +00000Cr 2 85 07 STA VAR_Y ;zp +00000Er 2 20 rr rr A_028R: JSR ECHO_CR +000011r 2 +000011r 2 A0 00 A_0291: LDY #$00 +000013r 2 B1 06 LDA (VAR_X),Y +000015r 2 F0 1B BEQ A_02B2 +000017r 2 4A LSR A +000018r 2 4A LSR A +000019r 2 4A LSR A +00001Ar 2 4A LSR A +00001Br 2 AA TAX +00001Cr 2 B1 06 LDA (VAR_X),Y +00001Er 2 29 0F AND #$0F +000020r 2 A8 TAY +000021r 2 B9 rr rr LDA SYMBOLS,Y +000024r 2 20 EF FF A_02A4: JSR ECHO +000027r 2 CA DEX +000028r 2 D0 FA BNE A_02A4 +00002Ar 2 E6 06 INC VAR_X ;zp +00002Cr 2 D0 E3 BNE A_0291 +00002Er 2 E6 07 INC VAR_Y ;zp +000030r 2 D0 DF BNE A_0291 +000032r 2 C8 A_02B2: INY +000033r 2 38 SEC +000034r 2 A9 28 LDA #SCREEN_WIDTH +000036r 2 F1 06 SBC (VAR_X),Y +000038r 2 4A LSR A +000039r 2 AA TAX +00003Ar 2 A9 A0 LDA #$A0 +00003Cr 2 20 EF FF A_02BC: JSR ECHO +00003Fr 2 CA DEX +000040r 2 D0 FA BNE A_02BC +000042r 2 B1 06 LDA (VAR_X),Y +000044r 2 AA TAX +000045r 2 C8 A_02C5: INY +000046r 2 B1 06 LDA (VAR_X),Y +000048r 2 20 EF FF JSR ECHO +00004Br 2 CA DEX +00004Cr 2 D0 F7 BNE A_02C5 +00004Er 2 C8 INY +00004Fr 2 98 TYA +000050r 2 18 CLC +000051r 2 65 06 ADC VAR_X ;zp +000053r 2 85 06 STA VAR_X ;zp +000055r 2 A9 00 LDA #$00 +000057r 2 65 07 ADC VAR_Y ;zp +000059r 2 85 07 STA VAR_Y ;zp +00005Br 2 A9 10 LDA #$10 +00005Dr 2 20 rr rr JSR FUNC_WAIT +000060r 2 20 rr rr JSR ECHO_CR +000063r 2 A0 00 LDY #$00 +000065r 2 B1 06 LDA (VAR_X),Y +000067r 2 F0 9D BEQ A_0286 +000069r 2 D0 A3 BNE A_028R +00006Br 2 +00006Br 2 48 FUNC_WAIT: PHA +00006Cr 2 8A TXA +00006Dr 2 48 PHA +00006Er 2 98 TYA +00006Fr 2 48 PHA +000070r 2 A0 FF LDY #$FF +000072r 2 A2 FF A_02F2: LDX #$FF +000074r 2 AD 11 D0 A_02F4: LDA KBDCR +000077r 2 10 09 BPL A_0302 +000079r 2 68 PLA +00007Ar 2 A8 TAY +00007Br 2 68 PLA +00007Cr 2 AA TAX +00007Dr 2 68 PLA +00007Er 2 AD 10 D0 LDA KBD +000081r 2 60 RTS +000082r 2 +000082r 2 CA A_0302: DEX +000083r 2 D0 EF BNE A_02F4 +000085r 2 88 DEY +000086r 2 D0 EA BNE A_02F2 +000088r 2 68 PLA +000089r 2 A8 TAY +00008Ar 2 68 PLA +00008Br 2 AA TAX +00008Cr 2 68 PLA +00008Dr 2 38 SEC +00008Er 2 E9 01 SBC #$01 +000090r 2 D0 D9 BNE FUNC_WAIT +000092r 2 A9 00 LDA #$00 +000094r 2 60 RTS +000095r 2 +000095r 2 48 ECHO_CR: PHA +000096r 2 A9 8D LDA #$8D +000098r 2 20 EF FF JSR ECHO +00009Br 2 68 PLA +00009Cr 2 60 RTS +00009Dr 2 +00009Dr 2 SYMBOLS: +00009Dr 2 A0 .BYTE $A0 +00009Er 2 AE .BYTE $AE +00009Fr 2 BA .BYTE $BA +0000A0r 2 AC .BYTE $AC +0000A1r 2 BB .BYTE $BB +0000A2r 2 A1 .BYTE $A1 +0000A3r 2 AD .BYTE $AD +0000A4r 2 DE .BYTE $DE +0000A5r 2 AB .BYTE $AB +0000A6r 2 BD .BYTE $BD +0000A7r 2 BF .BYTE $BF +0000A8r 2 A6 .BYTE $A6 +0000A9r 2 AA .BYTE $AA +0000AAr 2 A5 .BYTE $A5 +0000ABr 2 A3 .BYTE $A3 +0000ACr 2 C0 .BYTE $C0 +0000ADr 2 +0000ADr 2 INSTRUCTIONS: +0000ADr 2 FF .BYTE $FF +0000AEr 2 1F .BYTE $1F +0000AFr 2 1B .BYTE $1B +0000B0r 2 17 .BYTE $17 +0000B1r 2 16 .BYTE $16 +0000B2r 2 14 .BYTE $14 +0000B3r 2 13 .BYTE $13 +0000B4r 2 14 .BYTE $14 +0000B5r 2 17 .BYTE $17 +0000B6r 2 1B .BYTE $1B +0000B7r 2 1E .BYTE $1E +0000B8r 2 FF .BYTE $FF +0000B9r 2 CF .BYTE $CF +0000BAr 2 1E .BYTE $1E +0000BBr 2 2C .BYTE $2C +0000BCr 2 18 .BYTE $18 +0000BDr 2 50 .BYTE $50 +0000BEr 2 21 .BYTE $21 +0000BFr 2 12 .BYTE $12 +0000C0r 2 14 .BYTE $14 +0000C1r 2 17 .BYTE $17 +0000C2r 2 1C .BYTE $1C +0000C3r 2 FF .BYTE $FF +0000C4r 2 8F .BYTE $8F +0000C5r 2 1B .BYTE $1B +0000C6r 2 16 .BYTE $16 +0000C7r 2 12 .BYTE $12 +0000C8r 2 21 .BYTE $21 +0000C9r 2 70 .BYTE $70 +0000CAr 2 31 .BYTE $31 +0000CBr 2 10 .BYTE $10 +0000CCr 2 11 .BYTE $11 +0000CDr 2 18 .BYTE $18 +0000CEr 2 FF .BYTE $FF +0000CFr 2 5F .BYTE $5F +0000D0r 2 1D .BYTE $1D +0000D1r 2 15 .BYTE $15 +0000D2r 2 50 .BYTE $50 +0000D3r 2 21 .BYTE $21 +0000D4r 2 70 .BYTE $70 +0000D5r 2 41 .BYTE $41 +0000D6r 2 18 .BYTE $18 +0000D7r 2 1D .BYTE $1D +0000D8r 2 FF .BYTE $FF +0000D9r 2 2F .BYTE $2F +0000DAr 2 1E .BYTE $1E +0000DBr 2 14 .BYTE $14 +0000DCr 2 F0 .BYTE $F0 +0000DDr 2 30 .BYTE $30 +0000DEr 2 11 .BYTE $11 +0000DFr 2 10 .BYTE $10 +0000E0r 2 12 .BYTE $12 +0000E1r 2 17 .BYTE $17 +0000E2r 2 1E .BYTE $1E +0000E3r 2 FF .BYTE $FF +0000E4r 2 19 .BYTE $19 +0000E5r 2 E0 .BYTE $E0 +0000E6r 2 11 .BYTE $11 +0000E7r 2 12 .BYTE $12 +0000E8r 2 24 .BYTE $24 +0000E9r 2 12 .BYTE $12 +0000EAr 2 40 .BYTE $40 +0000EBr 2 19 .BYTE $19 +0000ECr 2 FF .BYTE $FF +0000EDr 2 14 .BYTE $14 +0000EEr 2 50 .BYTE $50 +0000EFr 2 23 .BYTE $23 +0000F0r 2 11 .BYTE $11 +0000F1r 2 20 .BYTE $20 +0000F2r 2 21 .BYTE $21 +0000F3r 2 20 .BYTE $20 +0000F4r 2 12 .BYTE $12 +0000F5r 2 15 .BYTE $15 +0000F6r 2 18 .BYTE $18 +0000F7r 2 19 .BYTE $19 +0000F8r 2 16 .BYTE $16 +0000F9r 2 12 .BYTE $12 +0000FAr 2 30 .BYTE $30 +0000FBr 2 12 .BYTE $12 +0000FCr 2 19 .BYTE $19 +0000FDr 2 DF .BYTE $DF +0000FEr 2 1C .BYTE $1C +0000FFr 2 11 .BYTE $11 +000100r 2 40 .BYTE $40 +000101r 2 12 .BYTE $12 +000102r 2 19 .BYTE $19 +000103r 2 1A .BYTE $1A +000104r 2 17 .BYTE $17 +000105r 2 25 .BYTE $25 +000106r 2 26 .BYTE $26 +000107r 2 34 .BYTE $34 +000108r 2 17 .BYTE $17 +000109r 2 2A .BYTE $2A +00010Ar 2 19 .BYTE $19 +00010Br 2 17 .BYTE $17 +00010Cr 2 13 .BYTE $13 +00010Dr 2 30 .BYTE $30 +00010Er 2 11 .BYTE $11 +00010Fr 2 1B .BYTE $1B +000110r 2 CF .BYTE $CF +000111r 2 18 .BYTE $18 +000112r 2 50 .BYTE $50 +000113r 2 13 .BYTE $13 +000114r 2 2A .BYTE $2A +000115r 2 19 .BYTE $19 +000116r 2 38 .BYTE $38 +000117r 2 19 .BYTE $19 +000118r 2 18 .BYTE $18 +000119r 2 27 .BYTE $27 +00011Ar 2 28 .BYTE $28 +00011Br 2 27 .BYTE $27 +00011Cr 2 18 .BYTE $18 +00011Dr 2 17 .BYTE $17 +00011Er 2 12 .BYTE $12 +00011Fr 2 30 .BYTE $30 +000120r 2 18 .BYTE $18 +000121r 2 CF .BYTE $CF +000122r 2 1A .BYTE $1A +000123r 2 50 .BYTE $50 +000124r 2 15 .BYTE $15 +000125r 2 19 .BYTE $19 +000126r 2 17 .BYTE $17 +000127r 2 14 .BYTE $14 +000128r 2 13 .BYTE $13 +000129r 2 22 .BYTE $22 +00012Ar 2 13 .BYTE $13 +00012Br 2 16 .BYTE $16 +00012Cr 2 17 .BYTE $17 +00012Dr 2 16 .BYTE $16 +00012Er 2 13 .BYTE $13 +00012Fr 2 21 .BYTE $21 +000130r 2 12 .BYTE $12 +000131r 2 14 .BYTE $14 +000132r 2 17 .BYTE $17 +000133r 2 15 .BYTE $15 +000134r 2 20 .BYTE $20 +000135r 2 13 .BYTE $13 +000136r 2 1D .BYTE $1D +000137r 2 CF .BYTE $CF +000138r 2 1C .BYTE $1C +000139r 2 40 .BYTE $40 +00013Ar 2 12 .BYTE $12 +00013Br 2 28 .BYTE $28 +00013Cr 2 15 .BYTE $15 +00013Dr 2 13 .BYTE $13 +00013Er 2 11 .BYTE $11 +00013Fr 2 30 .BYTE $30 +000140r 2 12 .BYTE $12 +000141r 2 28 .BYTE $28 +000142r 2 12 .BYTE $12 +000143r 2 10 .BYTE $10 +000144r 2 11 .BYTE $11 +000145r 2 12 .BYTE $12 +000146r 2 14 .BYTE $14 +000147r 2 17 .BYTE $17 +000148r 2 18 .BYTE $18 +000149r 2 12 .BYTE $12 +00014Ar 2 10 .BYTE $10 +00014Br 2 1A .BYTE $1A +00014Cr 2 DF .BYTE $DF +00014Dr 2 1D .BYTE $1D +00014Er 2 12 .BYTE $12 +00014Fr 2 30 .BYTE $30 +000150r 2 14 .BYTE $14 +000151r 2 1A .BYTE $1A +000152r 2 19 .BYTE $19 +000153r 2 18 .BYTE $18 +000154r 2 17 .BYTE $17 +000155r 2 45 .BYTE $45 +000156r 2 16 .BYTE $16 +000157r 2 1B .BYTE $1B +000158r 2 1D .BYTE $1D +000159r 2 18 .BYTE $18 +00015Ar 2 26 .BYTE $26 +00015Br 2 17 .BYTE $17 +00015Cr 2 18 .BYTE $18 +00015Dr 2 1A .BYTE $1A +00015Er 2 1B .BYTE $1B +00015Fr 2 15 .BYTE $15 +000160r 2 11 .BYTE $11 +000161r 2 1C .BYTE $1C +000162r 2 EF .BYTE $EF +000163r 2 18 .BYTE $18 +000164r 2 10 .BYTE $10 +000165r 2 13 .BYTE $13 +000166r 2 12 .BYTE $12 +000167r 2 13 .BYTE $13 +000168r 2 59 .BYTE $59 +000169r 2 18 .BYTE $18 +00016Ar 2 27 .BYTE $27 +00016Br 2 19 .BYTE $19 +00016Cr 2 1B .BYTE $1B +00016Dr 2 2C .BYTE $2C +00016Er 2 1A .BYTE $1A +00016Fr 2 27 .BYTE $27 +000170r 2 19 .BYTE $19 +000171r 2 2A .BYTE $2A +000172r 2 17 .BYTE $17 +000173r 2 12 .BYTE $12 +000174r 2 18 .BYTE $18 +000175r 2 EF .BYTE $EF +000176r 2 1E .BYTE $1E +000177r 2 12 .BYTE $12 +000178r 2 23 .BYTE $23 +000179r 2 11 .BYTE $11 +00017Ar 2 15 .BYTE $15 +00017Br 2 16 .BYTE $16 +00017Cr 2 35 .BYTE $35 +00017Dr 2 24 .BYTE $24 +00017Er 2 35 .BYTE $35 +00017Fr 2 16 .BYTE $16 +000180r 2 17 .BYTE $17 +000181r 2 16 .BYTE $16 +000182r 2 14 .BYTE $14 +000183r 2 13 .BYTE $13 +000184r 2 14 .BYTE $14 +000185r 2 15 .BYTE $15 +000186r 2 16 .BYTE $16 +000187r 2 15 .BYTE $15 +000188r 2 11 .BYTE $11 +000189r 2 18 .BYTE $18 +00018Ar 2 FF .BYTE $FF +00018Br 2 17 .BYTE $17 +00018Cr 2 30 .BYTE $30 +00018Dr 2 12 .BYTE $12 +00018Er 2 24 .BYTE $24 +00018Fr 2 13 .BYTE $13 +000190r 2 21 .BYTE $21 +000191r 2 23 .BYTE $23 +000192r 2 11 .BYTE $11 +000193r 2 10 .BYTE $10 +000194r 2 21 .BYTE $21 +000195r 2 22 .BYTE $22 +000196r 2 21 .BYTE $21 +000197r 2 13 .BYTE $13 +000198r 2 14 .BYTE $14 +000199r 2 12 .BYTE $12 +00019Ar 2 13 .BYTE $13 +00019Br 2 1D .BYTE $1D +00019Cr 2 FF .BYTE $FF +00019Dr 2 1D .BYTE $1D +00019Er 2 16 .BYTE $16 +00019Fr 2 11 .BYTE $11 +0001A0r 2 10 .BYTE $10 +0001A1r 2 21 .BYTE $21 +0001A2r 2 22 .BYTE $22 +0001A3r 2 11 .BYTE $11 +0001A4r 2 22 .BYTE $22 +0001A5r 2 13 .BYTE $13 +0001A6r 2 24 .BYTE $24 +0001A7r 2 25 .BYTE $25 +0001A8r 2 14 .BYTE $14 +0001A9r 2 23 .BYTE $23 +0001AAr 2 41 .BYTE $41 +0001ABr 2 1A .BYTE $1A +0001ACr 2 FF .BYTE $FF +0001ADr 2 2F .BYTE $2F +0001AEr 2 1D .BYTE $1D +0001AFr 2 16 .BYTE $16 +0001B0r 2 15 .BYTE $15 +0001B1r 2 20 .BYTE $20 +0001B2r 2 31 .BYTE $31 +0001B3r 2 13 .BYTE $13 +0001B4r 2 24 .BYTE $24 +0001B5r 2 15 .BYTE $15 +0001B6r 2 16 .BYTE $16 +0001B7r 2 47 .BYTE $47 +0001B8r 2 13 .BYTE $13 +0001B9r 2 11 .BYTE $11 +0001BAr 2 10 .BYTE $10 +0001BBr 2 12 .BYTE $12 +0001BCr 2 19 .BYTE $19 +0001BDr 2 FF .BYTE $FF +0001BEr 2 2F .BYTE $2F +0001BFr 2 1D .BYTE $1D +0001C0r 2 1A .BYTE $1A +0001C1r 2 1C .BYTE $1C +0001C2r 2 19 .BYTE $19 +0001C3r 2 13 .BYTE $13 +0001C4r 2 11 .BYTE $11 +0001C5r 2 20 .BYTE $20 +0001C6r 2 21 .BYTE $21 +0001C7r 2 13 .BYTE $13 +0001C8r 2 24 .BYTE $24 +0001C9r 2 33 .BYTE $33 +0001CAr 2 24 .BYTE $24 +0001CBr 2 21 .BYTE $21 +0001CCr 2 13 .BYTE $13 +0001CDr 2 1A .BYTE $1A +0001CEr 2 EF .BYTE $EF +0001CFr 2 2E .BYTE $2E +0001D0r 2 1D .BYTE $1D +0001D1r 2 1C .BYTE $1C +0001D2r 2 1B .BYTE $1B +0001D3r 2 1D .BYTE $1D +0001D4r 2 1E .BYTE $1E +0001D5r 2 1B .BYTE $1B +0001D6r 2 16 .BYTE $16 +0001D7r 2 13 .BYTE $13 +0001D8r 2 51 .BYTE $51 +0001D9r 2 12 .BYTE $12 +0001DAr 2 41 .BYTE $41 +0001DBr 2 12 .BYTE $12 +0001DCr 2 21 .BYTE $21 +0001DDr 2 12 .BYTE $12 +0001DEr 2 18 .BYTE $18 +0001DFr 2 1A .BYTE $1A +0001E0r 2 1D .BYTE $1D +0001E1r 2 AF .BYTE $AF +0001E2r 2 1E .BYTE $1E +0001E3r 2 1D .BYTE $1D +0001E4r 2 3C .BYTE $3C +0001E5r 2 2D .BYTE $2D +0001E6r 2 4E .BYTE $4E +0001E7r 2 1A .BYTE $1A +0001E8r 2 14 .BYTE $14 +0001E9r 2 22 .BYTE $22 +0001EAr 2 11 .BYTE $11 +0001EBr 2 20 .BYTE $20 +0001ECr 2 71 .BYTE $71 +0001EDr 2 13 .BYTE $13 +0001EEr 2 15 .BYTE $15 +0001EFr 2 17 .BYTE $17 +0001F0r 2 2C .BYTE $2C +0001F1r 2 1D .BYTE $1D +0001F2r 2 1E .BYTE $1E +0001F3r 2 7F .BYTE $7F +0001F4r 2 4D .BYTE $4D +0001F5r 2 2E .BYTE $2E +0001F6r 2 2D .BYTE $2D +0001F7r 2 2E .BYTE $2E +0001F8r 2 1D .BYTE $1D +0001F9r 2 2E .BYTE $2E +0001FAr 2 19 .BYTE $19 +0001FBr 2 23 .BYTE $23 +0001FCr 2 32 .BYTE $32 +0001FDr 2 31 .BYTE $31 +0001FEr 2 22 .BYTE $22 +0001FFr 2 13 .BYTE $13 +000200r 2 15 .BYTE $15 +000201r 2 16 .BYTE $16 +000202r 2 14 .BYTE $14 +000203r 2 17 .BYTE $17 +000204r 2 2E .BYTE $2E +000205r 2 3D .BYTE $3D +000206r 2 2E .BYTE $2E +000207r 2 4F .BYTE $4F +000208r 2 2E .BYTE $2E +000209r 2 7D .BYTE $7D +00020Ar 2 2E .BYTE $2E +00020Br 2 1D .BYTE $1D +00020Cr 2 2E .BYTE $2E +00020Dr 2 1A .BYTE $1A +00020Er 2 14 .BYTE $14 +00020Fr 2 43 .BYTE $43 +000210r 2 14 .BYTE $14 +000211r 2 13 .BYTE $13 +000212r 2 14 .BYTE $14 +000213r 2 15 .BYTE $15 +000214r 2 16 .BYTE $16 +000215r 2 17 .BYTE $17 +000216r 2 15 .BYTE $15 +000217r 2 14 .BYTE $14 +000218r 2 18 .BYTE $18 +000219r 2 1D .BYTE $1D +00021Ar 2 4E .BYTE $4E +00021Br 2 2D .BYTE $2D +00021Cr 2 4E .BYTE $4E +00021Dr 2 9D .BYTE $9D +00021Er 2 4E .BYTE $4E +00021Fr 2 1C .BYTE $1C +000220r 2 1A .BYTE $1A +000221r 2 18 .BYTE $18 +000222r 2 15 .BYTE $15 +000223r 2 14 .BYTE $14 +000224r 2 43 .BYTE $43 +000225r 2 15 .BYTE $15 +000226r 2 26 .BYTE $26 +000227r 2 15 .BYTE $15 +000228r 2 13 .BYTE $13 +000229r 2 16 .BYTE $16 +00022Ar 2 1A .BYTE $1A +00022Br 2 3E .BYTE $3E +00022Cr 2 8D .BYTE $8D +00022Dr 2 00 .BYTE $00 +00022Er 2 04 .BYTE $04 +00022Fr 2 57 .BYTE $57 +000230r 2 4F .BYTE $4F +000231r 2 5A .BYTE $5A +000232r 2 20 .BYTE $20 +000233r 2 00 .BYTE $00 +000234r 2 +000234r 2 57 6F 7A 20 .byte "Woz face program end", $0d, $00 +000238r 2 66 61 63 65 +00023Cr 2 20 70 72 6F +00024Ar 2 +00024Ar 1 +00024Ar 1 +00024Ar 1 .segment "F800" +000000r 1 ;Test from Apple-1 Operation Manual – printing all ASCII symbols in a loop +000000r 1 .include "TestFromManual.asm" +000000r 2 ;Test from Apple-1 Operation Manual – printing all ASCII symbols in a loop +000000r 2 A9 00 LDA #$00 +000002r 2 AA TEST_LOOP: TAX +000003r 2 20 EF FF JSR ECHO +000006r 2 E8 INX +000007r 2 8A TXA +000008r 2 4C rr rr JMP TEST_LOOP +00000Br 2 +00000Br 1 +00000Br 1 .segment "FA00" +000000r 1 ;Power-On Self Test (POST) +000000r 1 .include "POST.asm" +000000r 2 ;KBD = $D010 +000000r 2 ;KBDCR = $D011 +000000r 2 ;DSP = $D012 +000000r 2 ;DSPCR = $D013 +000000r 2 START_TEST = $EA +000000r 2 END_TEST = $EB +000000r 2 +000000r 2 +000000r 2 LED_BLINKS = 5 +000000r 2 TEST1_REPEATS = 4 +000000r 2 TEST2_REPEATS = 16 +000000r 2 TEST61_REPEATS = 8 +000000r 2 TEST62_REPEATS = 8 +000000r 2 TEST7_REPEATS = 16 +000000r 2 POSTOK_REPEATS = 4 +000000r 2 +000000r 2 /* +000000r 2 LED_BLINKS = 1 +000000r 2 TEST1_REPEATS = 1 +000000r 2 TEST2_REPEATS = 1 +000000r 2 TEST61_REPEATS = 1 +000000r 2 TEST62_REPEATS = 1 +000000r 2 TEST7_REPEATS = 1 +000000r 2 POSTOK_REPEATS = 1 +000000r 2 */ +000000r 2 +000000r 2 +000000r 2 EA POST_START: NOP +000001r 2 A9 EA LDA #START_TEST +000003r 2 8D 12 D0 STA DSP +000006r 2 +000006r 2 A9 01 LDA #%00000001 +000008r 2 20 rr rr JSR BLINK +00000Br 2 ;Test 1. Memory addresses decoder (blinking in cycle) +00000Br 2 A2 04 MEM_DECODER: LDX #TEST1_REPEATS +00000Dr 2 AD 00 FF LOOPADDR: LDA $FF00 +000010r 2 AD 00 E0 LDA $E000 +000013r 2 AD 00 D0 LDA $D000 +000016r 2 AD 00 C0 LDA $C000 +000019r 2 CA DEX +00001Ar 2 D0 F1 BNE LOOPADDR +00001Cr 2 +00001Cr 2 A9 02 LDA #%00000010 +00001Er 2 20 rr rr JSR BLINK +000021r 2 ;Test 2. Ports decoder (blinking in cycle) +000021r 2 A9 10 LDA #TEST2_REPEATS +000023r 2 AA PORTS_DECODER: TAX +000024r 2 AC 10 D0 LDY KBD +000027r 2 AC 11 D0 LDY KBDCR +00002Ar 2 8E 12 D0 STX DSP +00002Dr 2 2C 12 D0 BIT DSP +000030r 2 CA DEX +000031r 2 8A TXA +000032r 2 D0 EF BNE PORTS_DECODER +000034r 2 +000034r 2 A9 04 LDA #%00000100 +000036r 2 20 rr rr JSR BLINK +000039r 2 ;Test 3. Testing writing to Video port (1->2->4->8->16->32->64->128->256->0) +000039r 2 A9 01 LDA #%00000001 +00003Br 2 8D 12 D0 VIDEO_PORT: STA DSP +00003Er 2 0A ASL A ;shifting 1 to the left +00003Fr 2 D0 FA BNE VIDEO_PORT +000041r 2 +000041r 2 A9 08 LDA #%00001000 +000043r 2 20 rr rr JSR BLINK +000046r 2 ;Test 4. Testing writing to Video port via function call (256->128->64->32->16->8->4->2->1->0) +000046r 2 20 rr rr JSR VIDEO_PORT2 +000049r 2 +000049r 2 +000049r 2 A9 10 LDA #%00010000 +00004Br 2 20 rr rr JSR BLINK +00004Er 2 ;Test 5. Testing RAM with write&read (writing TEST_SYMBOL and testing read for every 4Kb block in 32Kb RAM) +00004Er 2 ;Total blocks tested is 8 (4*8 = 32) +00004Er 2 TEST_SYMBOL = $3E +00004Er 2 +00004Er 2 /* +00004Er 2 RAMTEST: CLD +00004Er 2 LDX #$00 +00004Er 2 LDY #$00 +00004Er 2 +00004Er 2 LDA #$FF +00004Er 2 STA $00 +00004Er 2 LDA #$0F +00004Er 2 STA $01 +00004Er 2 +00004Er 2 RAMLOOP: LDA #TEST_SYMBOL +00004Er 2 STA ($00),Y +00004Er 2 LDA ($00),Y +00004Er 2 CMP #TEST_SYMBOL +00004Er 2 BNE ENDTEST +00004Er 2 TXA +00004Er 2 ASL A +00004Er 2 ADC #$01 +00004Er 2 STA DSP +00004Er 2 TAX +00004Er 2 LDA $01 +00004Er 2 ADC #$10 +00004Er 2 STA $01 +00004Er 2 JMP RAMLOOP +00004Er 2 +00004Er 2 */ +00004Er 2 +00004Er 2 A9 20 LDA #%00100000 +000050r 2 20 rr rr JSR BLINK +000053r 2 ;Test 6. Testing BIT7 ports - keyboard and video +000053r 2 BIT7MASK = %10000000 +000053r 2 KBD7MASK = %00000111 +000053r 2 DSP7MASK = %00111111 +000053r 2 ;Test 6.1. Testing keyboard BIT7 port read (turn on 3 LEDs on the left and show BIT7 in the last LED) +000053r 2 +000053r 2 A2 08 KBDBIT7: LDX #TEST61_REPEATS +000055r 2 A9 07 LDA #KBD7MASK +000057r 2 8D 12 D0 STA DSP +00005Ar 2 KBD7LOOP: +00005Ar 2 AD 11 D0 LDA KBDCR +00005Dr 2 29 80 AND #BIT7MASK +00005Fr 2 09 07 ORA #KBD7MASK +000061r 2 8D 12 D0 STA DSP +000064r 2 CA DEX +000065r 2 D0 F3 BNE KBD7LOOP +000067r 2 ;Test 6.2. Testing video BIT7 port read (turn on 6 LEDs on the left and show BIT7 in the last LED) +000067r 2 +000067r 2 A2 08 DSPBIT7: LDX #TEST62_REPEATS +000069r 2 A9 3F LDA #DSP7MASK +00006Br 2 8D 12 D0 STA DSP +00006Er 2 DSP7LOOP: +00006Er 2 AD 12 D0 LDA DSP +000071r 2 29 80 AND #BIT7MASK +000073r 2 09 3F ORA #DSP7MASK +000075r 2 8D 12 D0 STA DSP +000078r 2 CA DEX +000079r 2 D0 F3 BNE DSP7LOOP +00007Br 2 +00007Br 2 +00007Br 2 A9 40 LDA #%01000000 +00007Dr 2 20 rr rr JSR BLINK +000080r 2 ;Test 7. Testing keyboard port read and write to Video port +000080r 2 A2 10 KBDTODSP: LDX #TEST7_REPEATS +000082r 2 A9 00 LDA #$00 +000084r 2 8D 12 D0 STA DSP +000087r 2 KBDDSPLOOP: +000087r 2 AD 10 D0 LDA KBD +00008Ar 2 8D 12 D0 STA DSP +00008Dr 2 CA DEX +00008Er 2 D0 F7 BNE KBDDSPLOOP +000090r 2 +000090r 2 ;POST success and end +000090r 2 +000090r 2 A2 04 ENDPOST: LDX #POSTOK_REPEATS +000092r 2 ENDLOOP: +000092r 2 A9 55 LDA #%01010101 +000094r 2 8D 12 D0 STA DSP +000097r 2 EA NOP +000098r 2 EA NOP +000099r 2 A9 AA LDA #%10101010 +00009Br 2 8D 12 D0 STA DSP +00009Er 2 EA NOP +00009Fr 2 EA NOP +0000A0r 2 CA DEX +0000A1r 2 D0 EF BNE ENDLOOP +0000A3r 2 +0000A3r 2 EA NOP +0000A4r 2 EA NOP +0000A5r 2 +0000A5r 2 ;printing ASCII table +0000A5r 2 20 rr rr JSR ASCII_ECHO +0000A8r 2 +0000A8r 2 EA ENDTEST: NOP +0000A9r 2 EA NOP +0000AAr 2 A9 EB LDA #END_TEST +0000ACr 2 20 EF FF JSR ECHO ;writing END_TEST to let video driver know that tests are over +0000AFr 2 +0000AFr 2 A2 00 LDX #$00 +0000B1r 2 PRINT_MSG: +0000B1r 2 BD rr rr LDA POSTCompletedText, X +0000B4r 2 F0 07 BEQ TO_WOZ_MON ;end printing at the end of the string (\n=0) +0000B6r 2 20 EF FF JSR ECHO +0000B9r 2 E8 INX +0000BAr 2 4C rr rr JMP PRINT_MSG +0000BDr 2 +0000BDr 2 4C 00 FF TO_WOZ_MON: JMP RESET ;start Woz Monitor (operating system) +0000C0r 2 +0000C0r 2 ;------------------------------------------------------ +0000C0r 2 ; POST subroutines +0000C0r 2 ;------------------------------------------------------ +0000C0r 2 ;blinking LEDs in Video port +0000C0r 2 A9 80 VIDEO_PORT2: LDA #%10000000 +0000C2r 2 8D 12 D0 TEST2: STA DSP +0000C5r 2 4A LSR A +0000C6r 2 D0 FA BNE TEST2 +0000C8r 2 60 RTS +0000C9r 2 +0000C9r 2 ;blink with a LED in a position from A register +0000C9r 2 TURN_OFF = %00000000 +0000C9r 2 A2 05 BLINK: LDX #LED_BLINKS +0000CBr 2 A8 TAY ;save A +0000CCr 2 98 NEXT_BLINK: TYA ;restore A +0000CDr 2 8D 12 D0 STA DSP +0000D0r 2 EA NOP +0000D1r 2 EA NOP +0000D2r 2 A9 00 LDA #TURN_OFF +0000D4r 2 8D 12 D0 STA DSP +0000D7r 2 EA NOP +0000D8r 2 EA NOP +0000D9r 2 CA DEX +0000DAr 2 D0 F0 BNE NEXT_BLINK +0000DCr 2 60 RTS +0000DDr 2 +0000DDr 2 ;printing visible symbols of ACSII table via ECHO function from Woz Monitor +0000DDr 2 PRINT_ASCII: +0000DDr 2 A0 20 LDY #32 +0000DFr 2 A2 5F LDX #95 ;80 in hex = 127 in decimal +0000E1r 2 ASCII_ECHO: +0000E1r 2 2C 12 D0 BIT DSP +0000E4r 2 30 FB BMI ASCII_ECHO +0000E6r 2 8C 12 D0 STY DSP +0000E9r 2 C8 INY +0000EAr 2 CA DEX +0000EBr 2 D0 F4 BNE ASCII_ECHO +0000EDr 2 60 RTS +0000EEr 2 +0000EEr 2 2C 12 D0 CHAR_ECHO: BIT DSP +0000F1r 2 30 FB BMI CHAR_ECHO +0000F3r 2 8D 12 D0 STA DSP +0000F6r 2 60 RTS +0000F7r 2 +0000F7r 2 POSTCompletedText: +0000F7r 2 0D 0D 50 4F .byte $0d, $0d, "POST ok (v.1.0). SmartyKit 1 is ready.", $0d, $0d, $00 +0000FBr 2 53 54 20 6F +0000FFr 2 6B 20 28 76 +000122r 2 +000122r 1 +000122r 1 .segment "FC00" +000000r 1 ;printing 8x8 picture in the center with '*' +000000r 1 .include "8x8art.asm" +000000r 2 ;printing 8x8 picture in the center with '*' +000000r 2 PIC_WIDTH = 8 +000000r 2 PIC_HEIGHT = 8 +000000r 2 OFFSET_X = (40 - PIC_WIDTH)/2 +000000r 2 PIC_ADDRESS = $1111 +000000r 2 ROW_ADDRESS = PIC_ADDRESS + PIC_HEIGHT +000000r 2 +000000r 2 +000000r 2 ; Y - row number +000000r 2 ; X - column (pixel) number +000000r 2 20 rr rr JSR NEXT_ROW +000003r 2 A9 00 LDA #$0 +000005r 2 8D 19 11 STA ROW_ADDRESS ;initialize row counter with 0 +000008r 2 A0 08 LDY #PIC_HEIGHT +00000Ar 2 +00000Ar 2 20 rr rr ROWS_LOOP: JSR PRINT_OFFSET +00000Dr 2 AD 19 11 LDA ROW_ADDRESS +000010r 2 AA TAX +000011r 2 BD 11 11 LDA PIC_ADDRESS, X +000014r 2 A2 08 LDX #PIC_WIDTH +000016r 2 0A NEXT_PIXEL: ASL +000017r 2 90 06 BCC NO_PIXEL +000019r 2 20 rr rr JSR PRINT_STAR +00001Cr 2 4C rr rr JMP AFTER_PIXEL +00001Fr 2 20 rr rr NO_PIXEL: JSR PRINT_BLANK +000022r 2 CA AFTER_PIXEL: DEX +000023r 2 D0 F1 BNE NEXT_PIXEL +000025r 2 20 rr rr JSR NEXT_ROW +000028r 2 EE 19 11 INC ROW_ADDRESS +00002Br 2 88 DEY +00002Cr 2 D0 DC BNE ROWS_LOOP +00002Er 2 20 rr rr JSR NEXT_ROW +000031r 2 4C 00 FF JMP RESET +000034r 2 +000034r 2 ;printing offset subroutine (optional: save registers A and X) +000034r 2 48 PRINT_OFFSET: PHA ;save A +000035r 2 8A TXA ;X->A +000036r 2 48 PHA ;save X +000037r 2 A2 10 LDX #OFFSET_X +000039r 2 A9 20 OFFSET_LOOP: LDA #' ' +00003Br 2 20 EF FF JSR ECHO +00003Er 2 CA DEX +00003Fr 2 D0 F8 BNE OFFSET_LOOP +000041r 2 +000041r 2 68 PLA ;restore X +000042r 2 AA TAX ;A->X +000043r 2 68 PLA ;restore A +000044r 2 60 RTS +000045r 2 +000045r 2 48 PRINT_STAR: PHA +000046r 2 A9 2A LDA #'*' +000048r 2 20 EF FF JSR ECHO +00004Br 2 68 PLA +00004Cr 2 60 RTS +00004Dr 2 48 PRINT_BLANK: PHA +00004Er 2 A9 20 LDA #' ' +000050r 2 20 EF FF JSR ECHO +000053r 2 68 PLA +000054r 2 60 RTS +000055r 2 48 NEXT_ROW: PHA +000056r 2 A9 0D LDA #$0d +000058r 2 20 EF FF JSR ECHO +00005Br 2 68 PLA +00005Cr 2 60 RTS +00005Dr 2 ;from HeartPicture +00005Dr 2 ;to PIC_ADDRESS ($88) +00005Dr 2 48 COPY_HEART: PHA +00005Er 2 8A TXA +00005Fr 2 48 PHA +000060r 2 +000060r 2 A2 08 LDX #PIC_HEIGHT +000062r 2 BD rr rr COPY_LOOP: LDA HeartPicture, X +000065r 2 9D 11 11 STA PIC_ADDRESS, X +000068r 2 CA DEX +000069r 2 10 F7 BPL COPY_LOOP +00006Br 2 +00006Br 2 68 PLA +00006Cr 2 AA TAX +00006Dr 2 68 PLA +00006Er 2 60 RTS +00006Fr 2 +00006Fr 2 +00006Fr 2 HeartPicture: +00006Fr 2 00 .byte %00000000 +000070r 2 66 .byte %01100110 +000071r 2 FF .byte %11111111 +000072r 2 FF .byte %11111111 +000073r 2 FF .byte %11111111 +000074r 2 7E .byte %01111110 +000075r 2 3C .byte %00111100 +000076r 2 18 .byte %00011000 +000077r 2 3C 42 A5 81 SmileyPicture: .byte $3c, $42, $a5, $81, $a5, $99, $42, $3c +00007Br 2 A5 99 42 3C +00007Fr 2 88 A8 50 07 WozPicture: .byte $88, $a8, $50, $07, $61, $92, $94, $67 +000083r 2 61 92 94 67 +000087r 2 FF 81 BD BD SmartyLogo: .byte $ff, $81, $bd, $bd, $bd, $bd, $81, $ff +00008Br 2 BD BD 81 FF +00008Fr 2 18 24 24 24 RocketPicture: .byte $18, $24, $24, $24, $7e, $a5, $FF, $a5 +000093r 2 7E A5 FF A5 +000097r 2 38 2A 38 20 .byte "8*8 Pixel Art program end", $0d, $00 +00009Br 2 50 69 78 65 +00009Fr 2 6C 20 41 72 +0000B2r 2 +0000B2r 1 +0000B2r 1 .segment "FD00" +000000r 1 ;Printing 'Hello, World!' +000000r 1 .include "HelloWorld.asm" +000000r 2 ;printing 'Hello, World!' +000000r 2 ;More about 'Hello, World!' program: https://en.wikipedia.org/wiki/%22Hello,_World!%22_program +000000r 2 A2 00 LDX #00 +000002r 2 PRINT_CHAR: +000002r 2 BD rr rr LDA HelloWorldText, X +000005r 2 F0 07 BEQ END_PRINT ;end printing at the end of the string (\n=0) +000007r 2 20 EF FF JSR ECHO +00000Ar 2 E8 INX +00000Br 2 4C rr rr JMP PRINT_CHAR +00000Er 2 END_PRINT: +00000Er 2 4C 00 FF JMP RESET ;return to Woz Monitor +000011r 2 +000011r 2 HelloWorldText: +000011r 2 0D 48 65 6C .byte $0d, "Hello, World!", $0d, "This is SmartyKit 1.", $0d, $0d, $00 +000015r 2 6C 6F 2C 20 +000019r 2 57 6F 72 6C +000037r 2 +000037r 1 +000037r 1 .segment "FF00" +000000r 1 .include "Woz_Monitor.asm" +000000r 2 ; The WOZ Monitor for the Apple 1 +000000r 2 ; Written by Steve Wozniak in 1976 +000000r 2 +000000r 2 +000000r 2 ; Page 0 Variables +000000r 2 +000000r 2 XAML = $24 ; Last "opened" location Low +000000r 2 XAMH = $25 ; Last "opened" location High +000000r 2 STL = $26 ; Store address Low +000000r 2 STH = $27 ; Store address High +000000r 2 L = $28 ; Hex value parsing Low +000000r 2 H = $29 ; Hex value parsing High +000000r 2 YSAV = $2A ; Used to see if hex value is given +000000r 2 MODE = $2B ; $00=XAM, $7F=STOR, $AE=BLOCK XAM +000000r 2 +000000r 2 +000000r 2 ; Other Variables +000000r 2 +000000r 2 IN = $0200 ; Input buffer to $027F +000000r 2 KBD = $D010 ; PIA.A keyboard input +000000r 2 KBDCR = $D011 ; PIA.A keyboard control register +000000r 2 DSP = $D012 ; PIA.B display output register +000000r 2 DSPCR = $D013 ; PIA.B display control register +000000r 2 +000000r 2 .org $FF00 +00FF00 2 .export RESET +00FF00 2 +00FF00 2 D8 RESET: CLD ; Clear decimal arithmetic mode. +00FF01 2 58 CLI +00FF02 2 A0 7F LDY #$7F ; Mask for DSP data direction register. +00FF04 2 8C 12 D0 STY DSP ; Set it up. +00FF07 2 A9 A7 LDA #$A7 ; KBD and DSP control register mask. +00FF09 2 8D 11 D0 STA KBDCR ; Enable interrupts, set CA1, CB1, for +00FF0C 2 8D 13 D0 STA DSPCR ; positive edge sense/output mode. +00FF0F 2 C9 DF NOTCR: CMP #'_'+$80 ; "_"? +00FF11 2 F0 13 BEQ BACKSPACE ; Yes. +00FF13 2 C9 9B CMP #$9B ; ESC? +00FF15 2 F0 03 BEQ ESCAPE ; Yes. +00FF17 2 C8 INY ; Advance text index. +00FF18 2 10 0F BPL NEXTCHAR ; Auto ESC if > 127. +00FF1A 2 A9 DC ESCAPE: LDA #'\'+$80 ; "\". +00FF1C 2 20 EF FF JSR ECHO ; Output it. +00FF1F 2 A9 8D GETLINE: LDA #$8D ; CR. +00FF21 2 20 EF FF JSR ECHO ; Output it. +00FF24 2 A0 01 LDY #$01 ; Initialize text index. +00FF26 2 88 BACKSPACE: DEY ; Back up text index. +00FF27 2 30 F6 BMI GETLINE ; Beyond start of line, reinitialize. +00FF29 2 AD 11 D0 NEXTCHAR: LDA KBDCR ; Key ready? +00FF2C 2 10 FB BPL NEXTCHAR ; Loop until ready. +00FF2E 2 AD 10 D0 LDA KBD ; Load character. B7 should be ‘1’. +00FF31 2 99 00 02 STA IN,Y ; Add to text buffer. +00FF34 2 20 EF FF JSR ECHO ; Display character. +00FF37 2 C9 8D CMP #$8D ; CR? +00FF39 2 D0 D4 BNE NOTCR ; No. +00FF3B 2 A0 FF LDY #$FF ; Reset text index. +00FF3D 2 A9 00 LDA #$00 ; For XAM mode. +00FF3F 2 AA TAX ; 0->X. +00FF40 2 0A SETSTOR: ASL ; Leaves $7B if setting STOR mode. +00FF41 2 85 2B SETMODE: STA MODE ; $00=XAM $7B=STOR $AE=BLOK XAM +00FF43 2 C8 BLSKIP: INY ; Advance text index. +00FF44 2 B9 00 02 NEXTITEM: LDA IN,Y ; Get character. +00FF47 2 C9 8D CMP #$8D ; CR? +00FF49 2 F0 D4 BEQ GETLINE ; Yes, done this line. +00FF4B 2 C9 AE CMP #'.'+$80 ; "."? +00FF4D 2 90 F4 BCC BLSKIP ; Skip delimiter. +00FF4F 2 F0 F0 BEQ SETMODE ; Yes. Set STOR mode. +00FF51 2 C9 BA CMP #':'+$80 ; ":"? +00FF53 2 F0 EB BEQ SETSTOR ; Yes. Set STOR mode. +00FF55 2 C9 D2 CMP #'R'+$80 ; "R"? +00FF57 2 F0 3B BEQ RUN ; Yes. Run user program. +00FF59 2 86 28 STX L ; $00-> L. +00FF5B 2 86 29 STX H ; and H. +00FF5D 2 84 2A STY YSAV ; Save Y for comparison. +00FF5F 2 B9 00 02 NEXTHEX: LDA IN,Y ; Get character for hex test. +00FF62 2 49 B0 EOR #$B0 ; Map digits to $0-9. +00FF64 2 C9 0A CMP #$0A ; Digit? +00FF66 2 90 06 BCC DIG ; Yes. +00FF68 2 69 88 ADC #$88 ; Map letter "A"-"F" to $FA-FF. +00FF6A 2 C9 FA CMP #$FA ; Hex letter? +00FF6C 2 90 11 BCC NOTHEX ; No, character not hex. +00FF6E 2 0A DIG: ASL +00FF6F 2 0A ASL ; Hex digit to MSD of A. +00FF70 2 0A ASL +00FF71 2 0A ASL +00FF72 2 A2 04 LDX #$04 ; Shift count. +00FF74 2 0A HEXSHIFT: ASL ; Hex digit left, MSB to carry. +00FF75 2 26 28 ROL L ; Rotate into LSD. +00FF77 2 26 29 ROL H ; Rotate into MSD’s. +00FF79 2 CA DEX ; Done 4 shifts? +00FF7A 2 D0 F8 BNE HEXSHIFT ; No, loop. +00FF7C 2 C8 INY ; Advance text index. +00FF7D 2 D0 E0 BNE NEXTHEX ; Always taken. Check next char for hex. +00FF7F 2 C4 2A NOTHEX: CPY YSAV ; Check if L, H empty (no hex digits). +00FF81 2 F0 97 BEQ ESCAPE ; Yes, generate ESC sequence. +00FF83 2 24 2B BIT MODE ; Test MODE byte. +00FF85 2 50 10 BVC NOTSTOR ; B6=0 STOR 1 for XAM & BLOCK XAM +00FF87 2 A5 28 LDA L ; LSD’s of hex data. +00FF89 2 81 26 STA (STL,X) ; Store at current ‘store index’. +00FF8B 2 E6 26 INC STL ; Increment store index. +00FF8D 2 D0 B5 BNE NEXTITEM ; Get next item. (no carry). +00FF8F 2 E6 27 INC STH ; Add carry to ‘store index’ high order. +00FF91 2 4C 44 FF TONEXTITEM: JMP NEXTITEM ; Get next command item. +00FF94 2 6C 24 00 RUN: JMP (XAML) ; Run at current XAM index. +00FF97 2 30 2B NOTSTOR: BMI XAMNEXT ; B7=0 for XAM, 1 for BLOCK XAM. +00FF99 2 A2 02 LDX #$02 ; Byte count. +00FF9B 2 B5 27 SETADR: LDA L-1,X ; Copy hex data to +00FF9D 2 95 25 STA STL-1,X ; ‘store index’. +00FF9F 2 95 23 STA XAML-1,X ; And to ‘XAM index’. +00FFA1 2 CA DEX ; Next of 2 bytes. +00FFA2 2 D0 F7 BNE SETADR ; Loop unless X=0. +00FFA4 2 D0 14 NXTPRNT: BNE PRDATA ; NE means no address to print. +00FFA6 2 A9 8D LDA #$8D ; CR. +00FFA8 2 20 EF FF JSR ECHO ; Output it. +00FFAB 2 A5 25 LDA XAMH ; ‘Examine index’ high-order byte. +00FFAD 2 20 DC FF JSR PRBYTE ; Output it in hex format. +00FFB0 2 A5 24 LDA XAML ; Low-order ‘examine index’ byte. +00FFB2 2 20 DC FF JSR PRBYTE ; Output it in hex format. +00FFB5 2 A9 BA LDA #':'+$80 ; ":". +00FFB7 2 20 EF FF JSR ECHO ; Output it. +00FFBA 2 A9 A0 PRDATA: LDA #$A0 ; Blank. +00FFBC 2 20 EF FF JSR ECHO ; Output it. +00FFBF 2 A1 24 LDA (XAML,X) ; Get data byte at ‘examine index’. +00FFC1 2 20 DC FF JSR PRBYTE ; Output it in hex format. +00FFC4 2 86 2B XAMNEXT: STX MODE ; 0->MODE (XAM mode). +00FFC6 2 A5 24 LDA XAML +00FFC8 2 C5 28 CMP L ; Compare ‘examine index’ to hex data. +00FFCA 2 A5 25 LDA XAMH +00FFCC 2 E5 29 SBC H +00FFCE 2 B0 C1 BCS TONEXTITEM ; Not less, so no more data to output. +00FFD0 2 E6 24 INC XAML +00FFD2 2 D0 02 BNE MOD8CHK ; Increment ‘examine index’. +00FFD4 2 E6 25 INC XAMH +00FFD6 2 A5 24 MOD8CHK: LDA XAML ; Check low-order ‘examine index’ byte +00FFD8 2 29 07 AND #$07 ; For MOD 8=0 +00FFDA 2 10 C8 BPL NXTPRNT ; Always taken. +00FFDC 2 48 PRBYTE: PHA ; Save A for LSD. +00FFDD 2 4A LSR +00FFDE 2 4A LSR +00FFDF 2 4A LSR ; MSD to LSD position. +00FFE0 2 4A LSR +00FFE1 2 20 E5 FF JSR PRHEX ; Output hex digit. +00FFE4 2 68 PLA ; Restore A. +00FFE5 2 29 0F PRHEX: AND #$0F ; Mask LSD for hex print. +00FFE7 2 09 B0 ORA #'0'+$80 ; Add "0". +00FFE9 2 C9 BA CMP #$BA ; Digit? +00FFEB 2 90 02 BCC ECHO ; Yes, output it. +00FFED 2 69 06 ADC #$06 ; Add offset for letter. +00FFEF 2 2C 12 D0 ECHO: BIT DSP ; bit (B7) cleared yet? +00FFF2 2 30 FB BMI ECHO ; No, wait for display. +00FFF4 2 8D 12 D0 STA DSP ; Output character. Sets DA. +00FFF7 2 60 RTS ; Return. +00FFF8 2 +00FFF8 2 40 NMI: RTI ; simple Interrupt Service Routine(ISR) +00FFF9 2 40 IRQ: RTI ; simple Interrupt Service Routine(ISR) +00FFFA 2 +00FFFA 1 +00FFFA 1 .segment "VECTORS" +00FFFA 1 ; Interrupt Vectors +00FFFA 1 F8 FF .WORD NMI ; NMI +00FFFC 1 rr rr .WORD POST_START ; RESET (starting point in Woz Monitor) or POST (test) +00FFFE 1 F9 FF .WORD IRQ ; BRK/IRQ +010000 1 +010000 1 +010000 1 diff --git a/ROM development/SmartyKit1_ROM.asm b/ROM development/SmartyKit1_ROM.asm new file mode 100644 index 0000000..a6cf5c2 --- /dev/null +++ b/ROM development/SmartyKit1_ROM.asm @@ -0,0 +1,58 @@ + .setcpu "6502" + .feature c_comments + .segment "PICTURE" + .byte %00000000 + .byte %01100110 + .byte %11111111 + .byte %11111111 + .byte %11111111 + .byte %01111110 + .byte %00111100 + .byte %00011000 + .byte 00 + .byte 00 +Smiley: .byte $3c, $42, $a5, $81, $a5, $99, $42, $3c +Woz: .byte $88, $a8, $50, $07, $61, $92, $94, $67 + ; .byte "8*8 Pixel Art picture end", $0d, $00 + + .code +loop: lda #$12 + jmp loop + + .segment "C000" + nop + .segment "E000" + JSR COPY_HEART + JMP $FC00 + nop + .segment "F000" + ;Woz face + .include "Apple30th_Woz.asm" + + + .segment "F800" + ;Test from Apple-1 Operation Manual – printing all ASCII symbols in a loop + .include "TestFromManual.asm" + + .segment "FA00" + ;Power-On Self Test (POST) + .include "POST.asm" + + .segment "FC00" + ;printing 8x8 picture in the center with '*' + .include "8x8art.asm" + + .segment "FD00" + ;Printing 'Hello, World!' + .include "HelloWorld.asm" + + .segment "FF00" + .include "Woz_Monitor.asm" + + .segment "VECTORS" + ; Interrupt Vectors + .WORD NMI ; NMI + .WORD POST_START ; RESET (starting point in Woz Monitor) or POST (test) + .WORD IRQ ; BRK/IRQ + + diff --git a/ROM development/SmartyKit1_ROM.bin b/ROM development/SmartyKit1_ROM.bin new file mode 100644 index 0000000..af45d03 Binary files /dev/null and b/ROM development/SmartyKit1_ROM.bin differ diff --git a/ROM development/SmartyKit1_ROM.o b/ROM development/SmartyKit1_ROM.o new file mode 100644 index 0000000..7df5c6e Binary files /dev/null and b/ROM development/SmartyKit1_ROM.o differ diff --git a/ROM development/SmartyKit1_ROM_symon.bin b/ROM development/SmartyKit1_ROM_symon.bin new file mode 100644 index 0000000..9c0ee53 Binary files /dev/null and b/ROM development/SmartyKit1_ROM_symon.bin differ diff --git a/ROM development/TestFromManual.asm b/ROM development/TestFromManual.asm new file mode 100644 index 0000000..9906280 --- /dev/null +++ b/ROM development/TestFromManual.asm @@ -0,0 +1,7 @@ +;Test from Apple-1 Operation Manual – printing all ASCII symbols in a loop + LDA #$00 +TEST_LOOP: TAX + JSR ECHO + INX + TXA + JMP TEST_LOOP diff --git a/ROM development/Woz_Monitor.asm b/ROM development/Woz_Monitor.asm new file mode 100644 index 0000000..60fd0cd --- /dev/null +++ b/ROM development/Woz_Monitor.asm @@ -0,0 +1,154 @@ +; The WOZ Monitor for the Apple 1 +; Written by Steve Wozniak in 1976 + + +; Page 0 Variables + +XAML = $24 ; Last "opened" location Low +XAMH = $25 ; Last "opened" location High +STL = $26 ; Store address Low +STH = $27 ; Store address High +L = $28 ; Hex value parsing Low +H = $29 ; Hex value parsing High +YSAV = $2A ; Used to see if hex value is given +MODE = $2B ; $00=XAM, $7F=STOR, $AE=BLOCK XAM + + +; Other Variables + +IN = $0200 ; Input buffer to $027F +KBD = $D010 ; PIA.A keyboard input +KBDCR = $D011 ; PIA.A keyboard control register +DSP = $D012 ; PIA.B display output register +DSPCR = $D013 ; PIA.B display control register + + .org $FF00 + .export RESET + +RESET: CLD ; Clear decimal arithmetic mode. + CLI + LDY #$7F ; Mask for DSP data direction register. + STY DSP ; Set it up. + LDA #$A7 ; KBD and DSP control register mask. + STA KBDCR ; Enable interrupts, set CA1, CB1, for + STA DSPCR ; positive edge sense/output mode. +NOTCR: CMP #'_'+$80 ; "_"? + BEQ BACKSPACE ; Yes. + CMP #$9B ; ESC? + BEQ ESCAPE ; Yes. + INY ; Advance text index. + BPL NEXTCHAR ; Auto ESC if > 127. +ESCAPE: LDA #'\'+$80 ; "\". + JSR ECHO ; Output it. +GETLINE: LDA #$8D ; CR. + JSR ECHO ; Output it. + LDY #$01 ; Initialize text index. +BACKSPACE: DEY ; Back up text index. + BMI GETLINE ; Beyond start of line, reinitialize. +NEXTCHAR: LDA KBDCR ; Key ready? + BPL NEXTCHAR ; Loop until ready. + LDA KBD ; Load character. B7 should be ‘1’. + STA IN,Y ; Add to text buffer. + JSR ECHO ; Display character. + CMP #$8D ; CR? + BNE NOTCR ; No. + LDY #$FF ; Reset text index. + LDA #$00 ; For XAM mode. + TAX ; 0->X. +SETSTOR: ASL ; Leaves $7B if setting STOR mode. +SETMODE: STA MODE ; $00=XAM $7B=STOR $AE=BLOK XAM +BLSKIP: INY ; Advance text index. +NEXTITEM: LDA IN,Y ; Get character. + CMP #$8D ; CR? + BEQ GETLINE ; Yes, done this line. + CMP #'.'+$80 ; "."? + BCC BLSKIP ; Skip delimiter. + BEQ SETMODE ; Yes. Set STOR mode. + CMP #':'+$80 ; ":"? + BEQ SETSTOR ; Yes. Set STOR mode. + CMP #'R'+$80 ; "R"? + BEQ RUN ; Yes. Run user program. + STX L ; $00-> L. + STX H ; and H. + STY YSAV ; Save Y for comparison. +NEXTHEX: LDA IN,Y ; Get character for hex test. + EOR #$B0 ; Map digits to $0-9. + CMP #$0A ; Digit? + BCC DIG ; Yes. + ADC #$88 ; Map letter "A"-"F" to $FA-FF. + CMP #$FA ; Hex letter? + BCC NOTHEX ; No, character not hex. +DIG: ASL + ASL ; Hex digit to MSD of A. + ASL + ASL + LDX #$04 ; Shift count. +HEXSHIFT: ASL ; Hex digit left, MSB to carry. + ROL L ; Rotate into LSD. + ROL H ; Rotate into MSD’s. + DEX ; Done 4 shifts? + BNE HEXSHIFT ; No, loop. + INY ; Advance text index. + BNE NEXTHEX ; Always taken. Check next char for hex. +NOTHEX: CPY YSAV ; Check if L, H empty (no hex digits). + BEQ ESCAPE ; Yes, generate ESC sequence. + BIT MODE ; Test MODE byte. + BVC NOTSTOR ; B6=0 STOR 1 for XAM & BLOCK XAM + LDA L ; LSD’s of hex data. + STA (STL,X) ; Store at current ‘store index’. + INC STL ; Increment store index. + BNE NEXTITEM ; Get next item. (no carry). + INC STH ; Add carry to ‘store index’ high order. +TONEXTITEM: JMP NEXTITEM ; Get next command item. +RUN: JMP (XAML) ; Run at current XAM index. +NOTSTOR: BMI XAMNEXT ; B7=0 for XAM, 1 for BLOCK XAM. + LDX #$02 ; Byte count. +SETADR: LDA L-1,X ; Copy hex data to + STA STL-1,X ; ‘store index’. + STA XAML-1,X ; And to ‘XAM index’. + DEX ; Next of 2 bytes. + BNE SETADR ; Loop unless X=0. +NXTPRNT: BNE PRDATA ; NE means no address to print. + LDA #$8D ; CR. + JSR ECHO ; Output it. + LDA XAMH ; ‘Examine index’ high-order byte. + JSR PRBYTE ; Output it in hex format. + LDA XAML ; Low-order ‘examine index’ byte. + JSR PRBYTE ; Output it in hex format. + LDA #':'+$80 ; ":". + JSR ECHO ; Output it. +PRDATA: LDA #$A0 ; Blank. + JSR ECHO ; Output it. + LDA (XAML,X) ; Get data byte at ‘examine index’. + JSR PRBYTE ; Output it in hex format. +XAMNEXT: STX MODE ; 0->MODE (XAM mode). + LDA XAML + CMP L ; Compare ‘examine index’ to hex data. + LDA XAMH + SBC H + BCS TONEXTITEM ; Not less, so no more data to output. + INC XAML + BNE MOD8CHK ; Increment ‘examine index’. + INC XAMH +MOD8CHK: LDA XAML ; Check low-order ‘examine index’ byte + AND #$07 ; For MOD 8=0 + BPL NXTPRNT ; Always taken. +PRBYTE: PHA ; Save A for LSD. + LSR + LSR + LSR ; MSD to LSD position. + LSR + JSR PRHEX ; Output hex digit. + PLA ; Restore A. +PRHEX: AND #$0F ; Mask LSD for hex print. + ORA #'0'+$80 ; Add "0". + CMP #$BA ; Digit? + BCC ECHO ; Yes, output it. + ADC #$06 ; Add offset for letter. +ECHO: BIT DSP ; bit (B7) cleared yet? + BMI ECHO ; No, wait for display. + STA DSP ; Output character. Sets DA. + RTS ; Return. + + NMI: RTI ; simple Interrupt Service Routine(ISR) + IRQ: RTI ; simple Interrupt Service Routine(ISR) diff --git a/ROM development/apple1.cfg b/ROM development/apple1.cfg new file mode 100644 index 0000000..4be79cf --- /dev/null +++ b/ROM development/apple1.cfg @@ -0,0 +1,20 @@ +MEMORY +{ + RAM: start=$0000, size=$8000, type=rw, define=yes, fill=yes; + ROM: start=$8000, size=$8000, type=ro, define=yes, fill=yes, file=%O; +} + +SEGMENTS +{ + PICTURE: load=RAM, type=rw, offset=$0088; + CODE: load=ROM, type=ro; + C000: load=ROM, type=ro, offset=$4000; + E000: load=ROM, type=ro, offset=$6000; + F000: load=ROM, type=ro, offset=$7000; + F800: load=ROM, type=ro, offset=$7800; + FA00: load=ROM, type=ro, offset=$7a00; + FC00: load=ROM, type=ro, offset=$7c00; + FD00: load=ROM, type=ro, offset=$7d00; + FF00: load=ROM, type=ro, offset=$7f00; + VECTORS: load=ROM, type=ro, offset=$7ffa; +} \ No newline at end of file diff --git a/ROM development/symon.cfg b/ROM development/symon.cfg new file mode 100644 index 0000000..c8185ed --- /dev/null +++ b/ROM development/symon.cfg @@ -0,0 +1,19 @@ +MEMORY +{ + ROM: start=$E000, size=$2000, type=ro, define=yes, fill=yes, file=%O; +} + +SEGMENTS +{ + CODE: load=ROM, type=ro; + PICTURE: load=ROM, type=ro; + C000: load=ROM, type=ro; + E000: load=ROM, type=ro; + F000: load=ROM, type=ro, offset=$1000; + F800: load=ROM, type=ro, offset=$1800; + FA00: load=ROM, type=ro, offset=$1a00; + FC00: load=ROM, type=ro, offset=$1c00; + FD00: load=ROM, type=ro, offset=$1d00; + FF00: load=ROM, type=ro, offset=$1f00; + VECTORS: load=ROM, type=ro, offset=$1ffa; +} \ No newline at end of file diff --git a/SmartyKit_ModulesSchematics_1.0.pdf b/SmartyKit_ModulesSchematics_1.0.pdf new file mode 100644 index 0000000..6e3a280 Binary files /dev/null and b/SmartyKit_ModulesSchematics_1.0.pdf differ