Кодинг для Спектрум и 8бит

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Кодинг для Спектрум и 8бит » 6502 » Разработка для Apple II


Разработка для Apple II

Сообщений 1 страница 5 из 5

1

В первую очередь понадобится эмулятор AppleWin. Для разработки не помешает кросс-ассемблер ACME

Исходный текст начинается с:

Код:
 *=$6000
 !to "PL.bin", plain	; set output file and format
 !cpu 6502    ; set processor type


Для быстрого копирования бинарного файла на диск пригодится Apple Commander

Сборка делается так:

Код:
acme pl.asm

java -jar AppleCommander-1.3.5.jar -d master.dsk pl

java -jar AppleCommander-1.3.5.jar -p master.dsk pl B 24576 < pl.bin

rem  del pl.bin
pause


master.dsk  берется из архива эмулятора.

Что происходит с пакетным файлом:
1. компилируется исходный текст pl.asm
2. бинарный файл pl.bin удаляется с диска
3. полученный pl.bin копируется на диск с указанным адресом 24576

2

http://forumfiles.ru/files/0019/c1/72/59384.png

Вывод текста на экран

Структура экрана довольно сложная, я использовал похожий способ печати.

Код:
 *=$6000
 !to "HL.bin", plain	; set output file and format
 !cpu 6502    ; set processor type

	ldx #0
outext
	lda msg,x
	ora #$80
	jsr $FDF0;COUT1
	inx
	lda msg,x
	bne outext
	rts
msg
 !byte 13
 !pet "HELLO, APPLE II! "
 !byte 0

Здесь используется процедура монитора COUT1, операнд ora #$80 нужен, чтобы не было инверсии для букв. Результат на экране.

Сборка

Код:
acme hl.asm

java -jar AppleCommander-1.3.5.jar -d master.dsk hl

java -jar AppleCommander-1.3.5.jar -p master.dsk hl B 24576 < hl.bin

3

Графика низкого разрешения(lowres)

Кроме текстового режима существует режим низкого разрешения (аналог GR в Бейсике). Разрешение 40х50, 16 цветов. Цвета определяются так:
http://forumfiles.ru/files/0019/c1/72/50544.png

Видеопамять хранится по адресу $400, формат видео слегка замысловатый, т.к. существует такое понятие как memory holes. Формат пикселей проще - старший ниббл байта - это цвет верхней точки, младший ниббл - цвет нижней точки.

Для режима предусмотрен раздельный режим - 40 пикселей и 4 строки текста в нижнем окне. Существует две страницы режима, расположенные по адресам $400 и $600.

Для примера я нарисую простую XOR-текстуру.

Следует заметить, что в процессоре не реализовано обращение к аппаратной части по портам, поэтому в Apple II созданы soft switches, или адреса памяти, запись или обращение к которым даст некоторый результат. Для графики режимы такие:

Код:
CLRTEXT =  $C050 ;display graphics 
SETTEXT =  $C051 ;display text 

CLRMIXED = $C052 ;clear mixed mode- enable full graphics 
SETMIXED = $C053 ;enable graphics/text mixed mode 

PAGE1 =    $C054 ;select text/graphics page1 
PAGE2 =    $C055 ;select text/graphics page2 

CLRHIRES = $C056 ;select Lo-res 
SETHIRES = $C057 ;select Hi-res 


Выходит, что обращение к адресу $C052 отключит раздельный режим - текст и графика. Монитор  предоставляет две процедуры:

SETGR($FB40) -  установка lowres режима
GBASCALC($F847) - расчет адреса линии по координате Y, которая хранится в аккумуляторе А. Адреса расположены в GBASL/GBASH. Контроль верности координаты(0-23) не осуществляется.

Теперь программа:

Код:
 *=$6000
 !to "HL.bin", plain	; set output file and format
 !cpu 6502    ; set processor type

GBASL	=	$26
GBASH	=	$27
SETGR    =     $FB40 ; процедура установки режима
GBASCALC = $F847 ; рассчет вертикального адреса

CLRTEXT =  $C050 ;display graphics 
SETTEXT =  $C051 ;display text 

CLRMIXED = $C052 ;clear mixed mode- enable full graphics 
SETMIXED = $C053 ;enable graphics/text mixed mode 

PAGE1 =    $C054 ;select text/graphics page1 
PAGE2 =    $C055 ;select text/graphics page2 

CLRHIRES = $C056 ;select Lo-res 
SETHIRES = $C057 ;select Hi-res 

TMP= $FA

	JSR   SETGR      ;GR
	BIT CLRMIXED ; full screen

	LDA #0 ; A=0
	STA TMP ; POKE $FA,A

YLP ; цикл по линиям
	LDA TMP ; A=PEEK($FA)
;	LSR ; A=A/2
	JSR GBASCALC
	LDY #0;Y=0

XLP TYA ; A=Y
	EOR TMP ; A=A xor PEEK($FA)
	and #$0F ; A=A and 15
	TAX ; X=A
	LDA COLORS,X ;A=PEEK(COLORS+X)
	STA(GBASL),Y ; POKE PEEK($26)+256*PEEK($27)+Y,A
	INY ; Y=Y+1
	CPY #40 ; Y=40?
	BNE XLP ; если нет, то переход на XLP
	INC TMP ; POKE $FA,PEEK($FA)+1
	LDA TMP ; A=PEEK($FA)
	CMP #24 ; A=24?
	BNE YLP ; если нет, то переход на YLP
	
M1 JMP M1 ; зацикливание, можно заменить на RTS

COLORS 
!byte $00,$11,$22,$33,$44,$55,$66,$77
!byte $88,$99,$AA,$BB,$CC,$DD,$EE,$FF


http://forumfiles.ru/files/0019/c1/72/28911.png

Дополнительно: https://www.callapple.org/uncategorized/use-of-apple-ii-color-graphics-in-assembly-language/]Use of Apple II Color Graphics in Assembly Language

Отредактировано Shinny (2018-10-17 10:01:32)

4

Звук Apple II

Код вырос из сайта несговорчивого товарища. На одном из дисков найдена Бейсик-программа, которая играет "Lambada"

Код:
 0  REM ************************
 1  REM *    L A M B A D A     *
 2  REM *                      *
 3  REM *  PENCHEV & ALASHKI   *
 4  REM *                      *
 5  REM ************************
 6  HOME 
 10  VTAB 12: HTAB 13: PRINT "L A M B A D A"
 20  DATA 173,48,192,136,208,5,206,1,3,240,9,202,208,245,174,0,3,76,2,3,206,32,3,208,240,96
 30  FOR X = 770 TO 795: READ Y: POKE X,Y: NEXT 
 40  GOTO 80
 50  POKE 768,V: POKE 769,P - 255 *  INT (P / 256): POKE 800,1 + P / 256
 60  CALL 770: RETURN 
 80 N = 70
 90  DIM V(N),P(N)
 95  FOR K = 1 TO N: READ V(K),P(K): NEXT K
 100  FOR K = 1 TO N:V = V(K):P = P(K): IF V = 1 THEN  FOR I = 1 TO P: NEXT I: GOTO 120
 110  GOSUB 50
 120  NEXT K
 130  DATA 76,192,85,64,96,64,102,64,114,128,114,64,96,64,102,64,114,64,128,64
 140  DATA 114,64,152,64,171,64,152,512,76,192,85,64,96,64,102,64,114,128,114,64
 150  DATA 96,64,102,64,114,64,128,64,114,64,152,64,171,64,152,512,85,64,85,64
 160  DATA 85,64,96,64,144,128,144,64,128,64,76,128,85,64,96,64,144,128,114,64
 170  DATA 96,64,102,128,114,64,128,64,128,128,114,64,128,64,114,512,85,64,85,64
 180  DATA 85,64,96,64,144,128,144,64,128,64,76,128,85,64,96,64,144,128,114,64
 190  DATA 96,64,102,128,114,64,128,64,128,64,128,128,96,64,85,64,96,64,102,64,114,64,114,64,,,,,


Я переписал код, но вышло немного кривовато, наверное из-за разницы Бейсика и ассемблера. В программе используется привычный код - самомодификация программы, которая неприменима, если код расположен в ROM и подобные изменения не прокатят, приходится прибегать к адресации нулевой страницы.

Код:
 *=$6000
 !to "HL.bin", plain	; set output file and format
 !cpu 6502    ; set processor type

;start
; 95  FOR K = 1 TO N: READ V(K),P(K): NEXT K
; 100  FOR K = 1 TO N:V = V(K):P = P(K)
ini:
	lda #70
	sta cnt+1
	lda #music&255
	sta gotbyte+1
	lda #music/256
	sta gotbyte+2

lop:
;V
	jsr gotbyte
	sta L300
	jsr gotbyte
;P
	jsr gotbyte
	sta L301
	jsr gotbyte
	clc
	adc #1
	sta L320
	jsr beep
	
	dec cnt+1
cnt lda #70
	bne lop
; 110  GOSUB 50
; 50  POKE 768,V: POKE 769,P - 255 *  INT (P / 256): POKE 800,1 + P / 256
; 60  CALL 770: RETURN 
	jmp ini
gotbyte
	lda music
	inc gotbyte+1
	bne noinch
	inc gotbyte+2
noinch
	rts
;!byte 173,48,192,136,208,5,206,1,3,240,9,202,208,245,174,0,3,76,2,3,206,32,3,208,240,96
beep:
	ldy #1
	ldx #1
loc_302:
    LDA	$C030

loc_305:
    DEY
    BNE	loc_30D
    DEC	L301
loc_30B:
    BEQ	loc_316

loc_30D:
    DEX
    BNE	loc_305
    LDX	L300
    JMP	loc_302
loc_316:
    DEC	L320
    BNE	loc_30B
    RTS
L301 !byte 0
L300 !byte 0
L320 !byte 0
music
 !word 76,192,85,64,96,64,102,64,114,128,114,64,96,64,102,64,114,64,128,64
 !word 114,64,152,64,171,64,152,512,76,192,85,64,96,64,102,64,114,128,114,64
 !word 96,64,102,64,114,64,128,64,114,64,152,64,171,64,152,512,85,64,85,64
 !word 85,64,96,64,144,128,144,64,128,64,76,128,85,64,96,64,144,128,114,64
 !word 96,64,102,128,114,64,128,64,128,128,114,64,128,64,114,512,85,64,85,64
 !word 85,64,96,64,144,128,144,64,128,64,76,128,85,64,96,64,144,128,114,64
 !word 96,64,102,128,114,64,128,64,128,64,128,128,96,64,85,64,96,64,102,64,114,64,114,64


Теория воспроизведения проста, в ней нет ничего заумного. Воспроизведение бипера осуществляется через обращение к аппаратной ячейке памяти $C030

Еще один пример я использовал в статье "Говорящее яблоко" для Downgrade.

5

Опрос клавиатуры
Начну с таблицы ASCII:
http://forumfiles.ru/files/0019/c1/72/23375.jpg

Код нажатой клавиши хранится в $C000, чтобы сбросить значение, нужно записать произвольное значение в $С010. С модификаторами Ctrl, Shift непонятно, опрос описанной ячейки не заработал. Наверное, удобнее обращаться к справочнику.

Код:
 *=$6000
 !to "HL.bin", plain	; set output file and format
 !cpu 6502    ; set processor type

	lda #164 ; put "$"
	sta $400

;OPNAPPLE = $C061 ;open apple (command) key data (read) 
;CLSAPPLE = $C062 ;closed apple (option) key data (read) 
;These are actually the first two game Pushbutton inputs (PB0 
;and PB1) which are borrowed by the Open Apple and Closed Apple 
;keys. Bit 7 is set (=1) in these locations if the game switch or 
;corresponding key is pressed.
;PB2 =      $C063 ;game Pushbutton 2 (read) 
;This input has an option to be connected to the shift key on 
;the keyboard. (See info on the 'shift key mod'.)

;http://www.kreativekorp.com/miscpages/a2info/iomemory.shtml
;C025 49189 KEYMODREG       G    V Modifier Keys: Bit 7: Command, Bit 6: Option,
;                                                 Bit 5: NotUsed, Bit 4: Keypad,
;                                                 Bit 3: Repeat,  Bit 2: Caps,
;                                                 Bit 1: Control, Bit 0: Shift
                                                 
wk: lda $C000
	bpl wk
	sta $C010

	ldx #1
	pha
	jsr PRBYTE ;print hex value
	lda #58+128 ; output ":"
	jsr PRTIT
	pla
	jsr PRTIT
	jmp wk

PRBYTE
	pha
	lsr
	lsr
	lsr
	lsr
	jsr PRHEXZ
	PLA
PRHEX and #$0F
PRHEXZ ora #$B0
	cmp #$BA
	bcc PRTIT ; blt
	adc #$6
PRTIT sta $400,X
	inx
	rts


Вы здесь » Кодинг для Спектрум и 8бит » 6502 » Разработка для Apple II