Давно собирался с незавершенным вопросом. Проблема была в том, что не удавалось собрать файл в .tap, который умеет компилировать zasm. Раньше ассемблер раздавался только под линупс, и скомпилировать в Win32 мне не удалось. Автор на заданный вопрос ответил, что не умеет. Теперь появилась версия 4.4 и 64бит. Забавно, что собраны не пойми как, запускаются с cygwin.dll.
Нашлись готовые примеры. Документация и другая инфа лежит на сайте. Эмуляторов нашлось немало: SpudAce с убогим дизайном и кривым отладчиком. EightyOne с неудобным отладчиком. Есть и новый - InkSpector 64bit, он как-то вяло читал .tap.
Первая программа(изменил код):
семиграфика(которая блочная) просто ахтунг
; ================================================================
; Source for target 'tap'
; ZASM Tape file for Jupiter ACE - BINARY files
;
; Basen on TAP file template for ZX Spectrum by kio@little-bat.de
;
; Copyright (c) McKlaud 2020
;
; Change log:
;
; v.0.3 - 7/10/2020 - naming, comments (kio)
; v.0.2 - 7/10/2020 - spelling corrections and housekeeping
; v.0.1 - 1/10/2020 - first release
;
; ================================================================
;
; fill byte is 0x00
; #code has an additional argument: the block type (flag byte) for the block.
; Since ZASM 4.2.0 the flag byte in #CODE must be set to NONE for ACE TAPs.
; The assembler calculates and appends checksum byte to each segment.
; Note: If a segment is appended without an explicite address, then the sync
; byte and the checksum byte of the preceding segment are not counted when
; calculating the start address of this segment.
;
; Compile with ZASM v 4.2.x or above
; zasm --z80 --dotnames -uwy source.asm target.tap
;
; --z80 - traget Zilog Z80 (default)
; --dotnames - allow label names starting with a dot '.' - if needed
; -b - write output in binary file (default)
; -u - include object code in list file
; -w - append label listing to list file
; -y - include cpu clock cycles in list file
;
; zasm -uwy source.asm target.tap
;
; Load with:
; 0 0 bload binary
;
; Run the code with:
; 16000 call
;
; ================================================================
startadr equ $3E80 ; Start address for BIN files; e.g. 16000
;------------------
; BIN file definition
;------------------
headerlength equ 25 ; neither block type (flag byte) nor CRC byte included
filetype equ $20 ; 0x20 = BINARY file type
;------------------
; Default values of system variables
;------------------
v_c_link equ $2020
v_current equ $2020
v_context equ $2020
v_voclink equ $2020
v_stkbot equ $2020
;------------------
; ROM routines
;------------------
CLS equ $0A24 ; Clear Screen
#target TAP
#code TAP_HEADER, 0, headerlength, flag=NONE
; Jupiter ACE TAP header structure:
; defw headerlength ; 2 bytes: always 25 bytes (0x1A) for JACE - added by ZASM
defb filetype ; 1 byte: File Type
defb "binary " ; 10 bytes: the file name
; |----------| <<< Keep it exactly 10 chars long!
defw CODE_DATA_size ; 2 bytes: File Length
defw startadr ; 2 bytes: Start Address
defw v_c_link ; 2 bytes: current word link (NOT USED)
defw v_current ; 2 bytes: CURRENT (NOT USED)
defw v_context ; 2 bytes: CONTEXT (NOT USED)
defw v_voclink ; 2 bytes: VOCLINK (NOT USED)
defw v_stkbot ; 2 bytes: STKBOT (NOT USED)
; defb checksum ; 1 byte: Header Block CheckSum - added by ZASM
#code CODE_DATA, startadr, *, flag=NONE
; defw CODE_DATA_size ; 2 bytes: TAP 2nd chunck size - added by ZASM
; BIN block starts here
;------------------------------
; -- Z80 assembler code and data starting at 'startadr'
call CLS ; call 'CLS' in ROM
ld hl,$2400
mm ld (hl),l
inc l
jr nz,mm
jp (iy) ; return to forth
; --- END ---
endadr equ $
; defb checksum ; 1 byte: CODE_DATA Block CheckSum - added by ZASM
#end ; code blocks END
компиляция:
zasm --z80 --dotnames -uwy BIN_template.asm target.tap
Как загрузить и запустить написано в комментариях. Заодно обнаружил у двух эмуляторов опцию чтения бинаря и пересел на ужасм. Разобраться с контрольной суммой мне не удалось.
Почитал доки - экран расположен по адресу $2400, 32x24 символа. Данные символов хранятся по адресу $2C00, причем работает только запись, а не чтение - над этим я тупил весь вечер, разбираясь с кодом и не понимая, почему не работает очистка с помощью LDIR. Вернее заполняет байтом $FF.
Генерируются узоры так:
ld hl,$2c00
ld de,$2c78
ld c,l ;ld c,0 ; value
m1 push bc
m2 ld (hl),c
ld a,c
ld (de),a
inc de
sla c
inc l
ld a,l
and 7
jr nz,m2
ex de,hl
ld bc,16
or a
sbc hl,bc
ex de,hl
pop bc
scf
rr c
bit 6,l
jr z,m1
На основе набора символов написал простенький эффект, но публиковать не буду.
Стал читать дизассемблер ROM, получилось так, что вызывать процедуру построения точки сложно. Поэтому переписал код
device zxspectrum128
org 16000
begin
; call $0A24 ; CLS routine
; x,y,n plot
;n=0-unplot,1-plot,2-move,3-change(?)
ld de,$0101
tp:
push de
;--------------------------------
ld c,1
srl e ;Y
rl c
ld a,$16
sub e
srl d ;X
rl c
;CALL L0B28
L0B28: ADD A,$20
LD L,A
LD H,$01
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
LD D,$00
LD A,E
AND $1F
LD E,A
ADD HL,DE
;;;;
LD A,(HL)
AND $78 ; 01111000
CP $10
LD A,(HL)
JR Z,L0B6F ;
LD A,$10
L0B6F: LD E,A
LD D,$87
LD A,C
AND $03
LD B,A
JR Z,L0B7F ;
CPL
ADD A,$02
ADC A,$03
LD D,A
LD B,E
L0B7F: LD A,C
RRCA
RRCA
RRCA
SBC A,A
BIT 3,C
JR NZ,L0B8C ;
XOR E
RLCA
SBC A,A
XOR B
L0B8C: AND D
XOR E
LD (HL),A
;--------------------------------
pop de
inc e
inc d
bit 5,e
jp z,tp
jr $
end
savebin "tt.bin",begin,end-begin
Остались еще другие, неясные нюансы. Надеюсь, что разберусь с вопросами, изучая примеры.
Надо написать какую-нить простую игрушку.
Комментарии
Отправить комментарий