4 LET F=100 5 LET K=1 10 FOR A=0 TO 1000 20 OUT 0,K 21 IF INP(0)=0 THEN GOTO 25 22 LET F=INP(0)+1 25 LET K=K*2 26 IF K<256 THEN GOTO 28 27 LET K=1 28 FOR I=0 TO F 29 NEXT I 30 NEXT A
P.S. народ подумал, что нажимая на кнопки, я проигрываю сэмплы придётся делать звуковую карточку, играющую сэмплы из памяти
Чисто из интересу: если конструкция модульная, есть материнская плата и можно втыкать дополнительные устройства, шины процессора пробуферированы?
P.S. И, кстати, вот здесь излагают проRC2014 — модульный бейсик-компьютер на Z80, и ругают "видеокару" на "Малине.Pi" - "Raspberry здесь - больное место. Это всё равно что поставлять в комплекте с конструктором ноутбук."
_________________ iLavr
23 Feb 2019 20:37
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 23436 Location: Silicon Valley
Чисто из интересу: если конструкция модульная, есть материнская плата и можно втыкать дополнительные устройства, шины процессора пробуферированы?
Нет. От автора объяснение такое - используйте только 74HCT-серию в периферийных платах и будет вам щастье ибо она жрёт немного по входам и на выходах выдаёт "rail-to-rail" и поэтому мы де всё тычем напрямую в процых без буферизации...
Lavr wrote:
P.S. И, кстати, вот здесь излагают проRC2014 — модульный бейсик-компьютер на Z80, и ругают "видеокару" на "Малине.Pi" - "Raspberry здесь - больное место. Это всё равно что поставлять в комплекте с конструктором ноутбук."
Нет. От автора объяснение такое - используйте только 74HCT-серию в периферийных платах и будет вам щастье ибо она жрёт немного по входам и на выходах выдаёт "rail-to-rail" и поэтому мы де всё тычем напрямую в процых без буферизации...
У авторов RC2014 концепция "полный минимализм". На поиграться 1 час после работы самое то за 3руб. Буферизация займет большую часть платы. А все остальное типа используйте 74HCT - отмазка для назойливых юзеров в коментах.
И действительно кому интересно проектировать схемы есть проект на шине ECB. Или даже S100 - для "прожженных" схемотехников.
Да и удовольствие это уже не дешевое схемы на рассыпухе делать. Сколько там эта малина стояла, сразу после выхода?
с другой стороны если тормозить процессор вейтом, то чтение ненужно (или туда PS/2-клаву присобачить?)
при записи байта в регистр надо будет взвести триггер, выдающий IFLAG на схему и этот триггер будет сброшен, когда SX-28 выдаст OFLAG, по которому в свою очередь обнулится !WAIT - вобщем как-то так...
>go to address: 0x0000 press Return to execute command
Small Computer Monitor - RCZ280 *help Small Computer Monitor by Stephen C Cousins (www.scc.me.uk) Version 1.0.0 configuration Z1 for Bill Shen's Z280 based RCZ280 system
Monitor commands: A [<address>] = Assemble | D [<address>] = Disassemble M [<address>] = Memory display | E [<address>] = Edit memory R [<name>] = Registers/edit | F [<name>] = Flags/edit B [<address>] = Breakpoint | S [<address>] = Single step I <port> = Input from port | O <port> <data> = Output to port G [<address>] = Go to program BAUD <device> <rate> | CONSOLE <device> FILL <start> <end> <byte> | API <function> [<A>] [<DE>] DEVICES, DIR, HELP, RESET BASIC Grant Searle's adaptation of Microsoft BASIC WBASIC Warm start BASIC (retains BASIC program) CPM Load CP/M from Compact Flash (requires prepared CF card) *
а для текстовой видеокарточки мне нужен будет только один порт, но легко декодируемый - взять из области #D8...#DB, скажем #DA? ... с другой стороны если тормозить процессор вейтом, то чтение ненужно (или туда PS/2-клаву присобачить?)
при записи байта в регистр надо будет взвести триггер, выдающий IFLAG на схему и этот триггер будет сброшен, когда SX-28 выдаст OFLAG, по которому в свою очередь обнулится !WAIT - вобщем как-то так...
вообще если иметь свой отдельный порт, то придётся переделывать прошивки - все эти бейсики и мониторы, а я смотрю там достаточно простой интерфейс к этому чипу MC68B50 Asynchronous Communications Interface Adapter (ACIA) - порт контроля $80 и порт данных $81 - его можно относительно легко сымитировать (правда придётся ещё и контроллер PS/2-клавы на эту же плату за уши притягивать, чтобы полноценный терминал был)
вот исходник интерфейса к ACIA из MS-бейсика от Grant Searle:
intmini.asm
Code:
;================================================================================== ; Contents of this file are copyright Grant Searle ; ; You have permission to use this for NON COMMERCIAL USE ONLY ; If you wish to use it elsewhere, please include an acknowledgement to myself. ; ; http://searle.hostei.com/grant/index.html ; ; eMail: home.micros01@btinternet.com ; ; If the above don't work, please perform an Internet search to see if I have ; updated the web page hosting service. ; ;==================================================================================
; Minimum 6850 ACIA interrupt driven serial I/O to run modified NASCOM Basic 4.7 ; Full input buffering with incoming data hardware handshaking ; Handshake shows full before the buffer is totally filled to allow run-on from the sender
RST00 DI ;Disable interrupts JP INIT ;Initialize Hardware and go
;------------------------------------------------------------------------------ ; TX a character over RS232
.ORG 0008H RST08 JP TXA
;------------------------------------------------------------------------------ ; RX a character over RS232 Channel A [Console], hold here until char ready.
.ORG 0010H RST10 JP RXA
;------------------------------------------------------------------------------ ; Check serial status
.ORG 0018H RST18 JP CKINCHAR
;------------------------------------------------------------------------------ ; RST 38 - INTERRUPT VECTOR [ for IM 1 ]
.ORG 0038H RST38 JR serialInt
;------------------------------------------------------------------------------ serialInt: PUSH AF PUSH HL
IN A,($80) AND $01 ; Check if interupt due to read buffer full JR Z,rts0 ; if not, ignore
IN A,($81) PUSH AF LD A,(serBufUsed) CP SER_BUFSIZE ; If full then ignore JR NZ,notFull POP AF JR rts0
notFull: LD HL,(serInPtr) INC HL LD A,L ; Only need to check low byte becasuse buffer<256 bytes CP (serBuf+SER_BUFSIZE) & $FF JR NZ, notWrap LD HL,serBuf notWrap: LD (serInPtr),HL POP AF LD (HL),A LD A,(serBufUsed) INC A LD (serBufUsed),A CP SER_FULLSIZE JR C,rts0 LD A,RTS_HIGH OUT ($80),A rts0: POP HL POP AF EI RETI
;------------------------------------------------------------------------------ RXA: waitForChar: LD A,(serBufUsed) CP $00 JR Z, waitForChar PUSH HL LD HL,(serRdPtr) INC HL LD A,L ; Only need to check low byte becasuse buffer<256 bytes CP (serBuf+SER_BUFSIZE) & $FF JR NZ, notRdWrap LD HL,serBuf notRdWrap: DI LD (serRdPtr),HL LD A,(serBufUsed) DEC A LD (serBufUsed),A CP SER_EMPTYSIZE JR NC,rts1 LD A,RTS_LOW OUT ($80),A rts1: LD A,(HL) EI POP HL RET ; Char ready in A
;------------------------------------------------------------------------------ TXA: PUSH AF ; Store character conout1: IN A,($80) ; Status byte BIT 1,A ; Set Zero flag if still transmitting character JR Z,conout1 ; Loop until flag signals ready POP AF ; Retrieve character OUT ($81),A ; Output the character RET
;------------------------------------------------------------------------------ CKINCHAR LD A,(serBufUsed) CP $0 RET
PRINT: LD A,(HL) ; Get character OR A ; Is it $00 ? RET Z ; Then RETurn on terminator RST 08H ; Print it INC HL ; Next Character JR PRINT ; Continue until $00 RET ;------------------------------------------------------------------------------ INIT: LD HL,TEMPSTACK ; Temp stack LD SP,HL ; Set up a temporary stack LD HL,serBuf LD (serInPtr),HL LD (serRdPtr),HL XOR A ;0 to accumulator LD (serBufUsed),A LD A,RTS_LOW OUT ($80),A ; Initialise ACIA IM 1 EI LD HL,SIGNON1 ; Sign-on message CALL PRINT ; Output string LD A,(basicStarted); Check the BASIC STARTED flag CP 'Y' ; to see if this is power-up JR NZ,COLDSTART ; If not BASIC started then always do cold start LD HL,SIGNON2 ; Cold/warm message CALL PRINT ; Output string CORW: CALL RXA AND %11011111 ; lower to uppercase CP 'C' JR NZ, CHECKWARM RST 08H LD A,$0D RST 08H LD A,$0A RST 08H COLDSTART: LD A,'Y' ; Set the BASIC STARTED flag LD (basicStarted),A JP $0150 ; Start BASIC COLD CHECKWARM: CP 'W' JR NZ, CORW RST 08H LD A,$0D RST 08H LD A,$0A RST 08H JP $0153 ; Start BASIC WARM
SIGNON1: .BYTE CS .BYTE "Z80 SBC By Grant Searle",CR,LF,0 SIGNON2: .BYTE CR,LF .BYTE "Cold or warm start (C or W)? ",0
.END
отсюда видятся только вот такие точки взаимодействия:
Interrupt: ... IN A,($80) AND $01 ; Check if interupt due to read buffer full ... IN A,($81) ; Read data ... LD A,RTS_HIGH OUT ($80),A
RXA: ; loop if buffer is empty ... LD A,RTS_LOW OUT ($80),A
TXA: PUSH AF ; Store character conout1: IN A,($80) ; Status byte BIT 1,A ; Set Zero flag if still transmitting character JR Z,conout1 ; Loop until flag signals ready POP AF ; Retrieve character OUT ($81),A ; Output the character RET
INIT: ... LD A,RTS_LOW OUT ($80),A ; Initialise ACIA IM 1
т.е. при чтении проверяется бит наличия входного символа 0 в порту $80 при записи проверяется бит готовности 1 в порту $80 (признак пустоты буфера передачи) ну и при получении символа программа сигнализирует, что символ получен путём взведения бита 6 в порту $80 а порт $81 просто используется для чтения байта с ввода и для передачи байта на вывод
P.S. а вот со Small Computer Monitor несколько сложнее т.к. он проверяет наличие одного из устройств - ACIA или SIO/2 и вот что он делает для ACIA:
; Status (control) register bit numbers k6850RxRdy: .EQU 0 ;Receive data available bit number k6850TxRdy: .EQU 1 ;Transmit data empty bit number
; Device detection, test 1 ; This test just reads from the devices' status (control) register ; and looks for register bits in known states: ; /CTS input bit = low ; /DCD input bit = low ; WARNING ; Sometimes at power up the Tx data reg empty bit is zero, but ; recovers after device initialised. So test 1 excludes this bit. k6850Mask1: .EQU 0b00001100 ;Mask for known bits in control reg k6850Test1: .EQU 0b00000000 ;Test value following masking
; Device detection, test 2 ; This test just reads from the devices' status (control) register ; and looks for register bits in known states: ; /CTS input bit = low ; /DCD input bit = low ; Transmit data register empty bit = high k6850Mask2: .EQU 0b00001110 ;Mask for known bits in control reg k6850Test2: .EQU 0b00000010 ;Test value following masking
; RC2014 serial 6850 initialise ; On entry: No parameters required ; On exit: Z flagged if device is found and initialised ; AF BC DE HL not specified ; IX IY I AF' BC' DE' HL' preserved ; If the device is found it is initialised RC2014_SerialACIA1_Initialise: ; First look to see if the device is present ; Test 1, just read from chip, do not write anything IN A,(kACIA1Cont) ;Read status (control) register AND k6850Mask1 ;Mask for known bits in control reg CP k6850Test1 ;and check for known values RET NZ ;If not found return with NZ flag ; Attempt to initialise the chip LD A,k6850Reset ;Master reset OUT (kACIA1Cont),A ;Write to ACIA control register LD A,k6850Init ;No int, RTS low, 8+1, /64 OUT (kACIA1Cont),A ;Write to ACIA control register ; Test 2, perform tests on chip following initialisation IN A,(kACIA1Cont) ;Read status (control) register AND k6850Mask2 ;Mask for known bits in control reg CP k6850Test2 ;Test value following masking ; RET NZ ;Return not found NZ flagged RET ;Return Z if found, NZ if not
получается надо сохранить нулевыми биты 2 и 3 когда Z80 читает из $80 и прерывания этот монитор не использует (No int, RTS low, 8+1, /64) значит надо поддержать вариант работы и с прерываниями, и без...
P.P.S. Значит Бейсик ожидает контроллер ACIA по адресам $80,$81. Монитор SCM смотрит в 2 места - $80,$81 и $40,$41. Поглядел ещё в исходники RomWBW - этот поддерживает только $A0,$A1 и $60,$61 (т.е. бит 5 ещё задействан - там 1 будет). Хотя https://github.com/wwarthen/RomWBW/blob/master/Source/HBIOS/acia.asm Судя по комментариям он всё также использует $80,$81 или $40,$41 ACIA, но чтобы их детектирование не путало другие устройства по тем же адресам, он торкает $60 и $A0 (т.к. в ACIA всё равно только старшие 2 бита адреса проверяются):
Code:
; POSSIBLE BASE I/O ADDRESSES ; NOTE THAT THE ACIA ONLY QUALIFIES ADDRESS BITS 7 & 6, SO ; THE ACIA'S TWO PORTS APPEAR REPEATEDLY OVER AN ADDRESS RANGE ; OF $40 STARTING FROM THE REAL BASE PORT. ; WE TAKE ADVANTAGE OF THIS TO AVOID CONFLICTING WITH SIO ; AND COMPACT FLASH MODULES DURING DETECTION PROBES. ; ACIAA_BASE .EQU $80 + $20 ; MODULE A ACIAB_BASE .EQU $40 + $20 ; MODULE B
Набор стоит $46.50 и работает совместно с платой последовательного интерфейса
В моём случае это будет NTSC/PAL+PS/2 Serial Terminal Kit for RC2014 который работает ВМЕСТО платы последовательного интерфейса и надо как-то уложиться хотя бы в $50...
Users browsing this forum: No registered users and 1 guest
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot post attachments in this forum