Przyjazne forum elektroniczno-programistyczne
https://microgeek.eu/
gen-1.asm pisze:Kod: Zaznacz cały
.sm RAM
.or $0000
; vars and temps here
samplePtr: .bs 2
;
; (...)
;
.sm CODE
.or $E000
; sin gen init
ldx #SINE_WAVE_256
stx samplePtr
;
; (...)
;
; gets next sample for D/A
getNextSample:
pshu x,a
lda [samplePtr] ; get sample at samplePtr
sta VIA1+ORA ; set voltage
ldx samplePtr ; get samplePtr itself
inx ; ++
cmpx #SINE_WAVE_256+$FF ; end?
bne getNextSampleExit ; if not skip ptr init
ldx #SINE_WAVE_256 ; reset ptr
getNextSampleExit:
stx samplePtr ; save samplePtr
pulu x,a
rts
;
; (...)
;
via-irq-test-1.asm pisze:Kod: Zaznacz cały
lda #VOUT_MAIN
.loop
sta VIA1+ORA
bra .loop
via-irq-test-1.asm pisze:Kod: Zaznacz cały
irqHandler:
lda #VOUT_IRQ_ENTER
sta VIA1+ORA
lda #$C0
sta VIA1+IFR ; clear Irq flag (!!!!)
lda #VOUT_IRQ_BODY
sta VIA1+ORA
lda #10
.loop
deca
bne .loop
lda #VOUT_IRQ_EXIT
sta VIA1+ORA
rti
via-irq-test-1.asm pisze:Kod: Zaznacz cały
irqHandler:
lda #VOUT_IRQ_ENTER
sta VIA1+ORA
lda #$C0
;;;;;; sta VIA1+IFR ; clear Irq flag (!!!!)
lda #VOUT_IRQ_BODY
sta VIA1+ORA
lda #10
.loop
deca
bne .loop
lda #VOUT_IRQ_EXIT
sta VIA1+ORA
rti
tasza pisze:aaaale scerbate toto wysło...
Kod: Zaznacz cały
screen /dev/ttyUSB0
Kod: Zaznacz cały
putty -serial /dev/ttyUSB0 -sercfg 9600,8,n,1,N > /dev/null 2>&1 &
serial-3.asm pisze:Kod: Zaznacz cały
ldx #vt100green
jsr serialSendText
ldx #vt100bold
jsr serialSendText
ldx #message2a
jsr serialSendText
ldx #vt100reset
jsr serialSendText
ldx #message2b
jsr serialSendText
ldx #vt100reverse
jsr serialSendText
ldx #message2c
jsr serialSendText
ldx #vt100reset
jsr serialSendText
ldx #message2d
jsr serialSendText
;
message2a .az /Antonina/
message2b .az / has a /
message2c .az /cat/
message2d .az / :) /,#$d,#$a
vt100reset: .az #$1B,/[0m/
vt100bold: .az #$1B,/[1m/
vt100reverse: .az #$1B,/[7m/
vt100green: .az #$1B,/[32m/
vt100blue: .az #$1B,/[34m/
vt100cyan: .az #$1B,/[36m/
vt100default: .az #$1B,/[39m/
piotrek pisze:...żeby nie ryzykować jego uszkodzenia, a szkoda by była bo to prawdziwy rarytas.
tasza pisze:Już chyba wszystkich znajomych (z tych co mnie jeszcze nie zaczeli unikać) obsępiłam z kostek typu 6264 i doszły dodatkowe trzy: Hitachi, NEC i Hyundai.
sin-irq-1.asm pisze:Kod: Zaznacz cały
irqHandler:
lda #$ff
sta VIA1+IFR
jsr getNextSample
rti
sin-irq-1.asm pisze:Kod: Zaznacz cały
divider .eq CLK2FREQ/25/256
rezasurmar pisze:ale w tym przypadku jak podłączany będzie oscyloskop, to wtórnik można sobie darować
gaweł pisze:mogę się podzielić. Mam w DIL
nixie pisze:...cudeńka
iv-9-simple-1.asm pisze:Kod: Zaznacz cały
SEG_A .eq 1<<0
SEG_B .eq 1<<1
SEG_C .eq 1<<2
SEG_D .eq 1<<3
SEG_E .eq 1<<4
SEG_F .eq 1<<5
SEG_G .eq 1<<6
DIG_0 .eq SEG_A|SEG_B|SEG_C|SEG_D|SEG_E|SEG_F
DIG_1 .eq SEG_B|SEG_C
DIG_2 .eq SEG_A|SEG_B|SEG_D|SEG_E|SEG_G
DIG_3 .eq SEG_A|SEG_B|SEG_C|SEG_D|SEG_G
DIG_4 .eq SEG_F|SEG_G|SEG_B|SEG_C
DIG_5 .eq SEG_A|SEG_F|SEG_G|SEG_C|SEG_D
DIG_6 .eq SEG_A|SEG_C|SEG_D|SEG_E|SEG_F|SEG_G
DIG_7 .eq SEG_A|SEG_B|SEG_C
DIG_8 .eq SEG_A|SEG_B|SEG_C|SEG_D|SEG_E|SEG_F|SEG_G
DIG_9 .eq SEG_A|SEG_B|SEG_C|SEG_D|SEG_F|SEG_G
DIG_A .eq SEG_A|SEG_B|SEG_C|SEG_E|SEG_F|SEG_G
DIG_B .eq SEG_C|SEG_D|SEG_E|SEG_F|SEG_G
DIG_C .eq SEG_A|SEG_D|SEG_E|SEG_F
DIG_D .eq SEG_B|SEG_C|SEG_D|SEG_E|SEG_G
DIG_E .eq SEG_A|SEG_D|SEG_E|SEG_F|SEG_G
DIG_F .eq SEG_A|SEG_E|SEG_F|SEG_G
iv-9-simple-1.asm pisze:Kod: Zaznacz cały
byte2sevenSeg:
pshu x,y,b ; uses y,b then save
pshu a
ldy #.b2sevenDat ; table of 7-seg
exg b,a ; input in b
lsrb
lsrb
lsrb
lsrb ; >> 4
andb #$0f ; first 4 bits
lda b,y ; a := ascii [ b ]
sta 0,x+ ; msb
pulu a
exg b,a ; input in b again
andb #$0f ; first 4 bits
lda b,y ; a := ascii [ b ]
sta 0,x ; lsb
pulu x,y,b ; gimme back
rts
.b2sevenDat
.db DIG_0,DIG_1,DIG_2,DIG_3,DIG_4,DIG_5,DIG_6,DIG_7
.db DIG_8,DIG_9,DIG_A,DIG_B,DIG_C,DIG_D,DIG_E,DIG_F
word2sevenSeg:
pshu d,x ; ab,x protection
jsr byte2sevenSeg ; msb as is
leax 2,x ; x += 2, next 2 chars
tfr b,a ; lsb from b
jsr byte2sevenSeg ; msb as is
pulu d,x ;
rts
iv-9-simple-1.asm pisze:Kod: Zaznacz cały
; acc - byte to set
postByte:
ldx #8
.pb:
pshu b ; save on stack
andb #%1000.0000
beq .skipIfZero
;set data pin
lda #CD4094_DATA_HI
sta VIA2+ORA
.skipIfZero:
pulu b ; restore for a moment
lslb ; >> next incoming bit
pshu b ; save back
lda #CD4094_CLK_HI
ora VIA2+ORA
sta VIA2+ORA
lda #0
sta VIA2+ORA
dex
bne .pb
pulu b ; just for stack balance
rts
iv-9-simple-1.asm pisze:Kod: Zaznacz cały
commitDisplay:
; finally strobe
lda #CD4094_STROBE_HI
ora VIA2+ORA
sta VIA2+ORA
lda #CD4094_STROBE_LO
anda VIA2+ORA
sta VIA2+ORA
rts
ad574-1.asm pisze:Kod: Zaznacz cały
lda #5
ldx #txtBuff
jsr memZero
; prepare to read data
lda #$04 ; PA2=1
sta VIA2+ORA
; get MSB
lda VIA1+IRB
anda #$0F
; get LSB
ldb VIA1+IRA
pshu a,b
; and start next conversion cycle
lda #$0
sta VIA2+ORA
pulu a,b
; show data
ldx #txtBuff
jsr word2hex
ldx #txtBuff
jsr vfdPrint
serial-loop-1.asm pisze:Kod: Zaznacz cały
serialGetChar:
.waitChar:
lda ACIA+STATR
; bit 3 - Register Data Receiver Full
anda #$08
beq .waitChar
lda ACIA+RDR
rts
serial-loop-2.asm pisze:Kod: Zaznacz cały
irqHandler:
; confirm irq reading stat
lda ACIA+STATR
; get char from RX
lda ACIA+RDR
sta ACIA+RDR ; do echo
; store char in buff
ldx rxBufferPtr
sta ,x+ ; save char
stx rxBufferPtr ; save prt
clra
sta ,x+ ; save NULL after
; check against buff end
cmpx #rxBuffer+10 ; <<=== here!
bne .hasEnoughSpace
; reinit rx buff
ldx #rxBuffer
stx rxBufferPtr
.hasEnoughSpace
rti
serial-loop-2.asm pisze:Kod: Zaznacz cały
system jump table, must be in this particular order
; .....
>DEF_SYS_JUMP IRQ_____, irqHandler
; .....
>DEF_SYS_JUMP RESET___, main
serial-loop-3.asm pisze:Kod: Zaznacz cały
.sm RAM
.or $0000
textMessage .bs 32 ; any text here
rxBuffer .bs 8 ; receive buff very small!!!
counter .bs 2 ; important var as a neighbour
rxBufferPtr .bs 2
serial-loop-3.asm pisze:Kod: Zaznacz cały
irqHandler
; ... blah blah blah
; check against buff end
cmpx #rxBuffer+12 ; <<=== here!
bne .hasEnoughSpace
; reinit rx buff
ldx #rxBuffer
stx rxBufferPtr
.hasEnoughSpace
rti
serial-loop-4.asm pisze:Kod: Zaznacz cały
textMessage .bs 10 ; any text here
MSG_TEXT_LEN .eq *-textMessage ; compute length
rxBuffer .bs 20 ; buff for incoming stuff
RX_BUFF_LEN .eq *-rxBuffer ; compute length
counter .bs 2
rxBufferPtr .bs 2
serial-loop-4.asm pisze:Kod: Zaznacz cały
; check against buff end
cmpx #rxBuffer+RX_BUFF_LEN
bne .hasEnoughSpace
; .....
lda #RX_BUFF_LEN
ldx #rxBuffer
jsr memZero
serial-loop-4.lst pisze:Kod: Zaznacz cały
0000- 7 .sm RAM
0000- 8 .or $0000
0000- 9 ; vars and temps here
0000- 10 textMessage .bs 10 ; any text here
000A- 11 MSG_TEXT_LEN .eq *-textMessage ; compute length
000A- 12 rxBuffer .bs 20 ; buff for incoming stuff
0014- 13 RX_BUFF_LEN .eq *-rxBuffer ; compute length
001E- 14 counter .bs 2
0020- 15 rxBufferPtr .bs 2
0022- 16
0022- 17 ;
0000- 18 .sm CODE
;.....
F120- 92
F120-86 14 93 ( 2) lda #RX_BUFF_LEN
F122-8E 00 0A 94 ( 3) ldx #rxBuffer
F125-BD F0 BE 95 ( 8) jsr memZero
F128- 96
ad574-mux-1.asm pisze:Kod: Zaznacz cały
;-------------
; ACC - channel
; 0 - 431 10Vref,
; 1 - MCP9700 outdoor
; 2 - LM35 on CPU
; 3 - LM35 indoor
getADC:
; set channel on MAC24A (VIA1.PB7/PB6)
lsla
lsla
lsla
lsla
lsla
lsla << 6
anda #%11000000
; update bits
sta VIA1+ORB
; dummy read/conv first
lda #$04
sta VIA2+ORA
nop
lda #$0
sta VIA2+ORA
ldb #40
.getADCdel
decb
bne .getADCdel
;
; prepare to read real data
lda #$04
sta VIA2+ORA
; MSB (4bits)
lda VIA1+IRB
anda #$0F
; LSB (8bits)
ldb VIA1+IRA
pshu a,b
; and start next conversion cycle
lda #$0
sta VIA2+ORA
pulu a,b
rts
ad574-mux-1.asm pisze:Kod: Zaznacz cały
lda #0
sta currentChannel
.doNext
lda #5
ldx #txtBuff
jsr memZero
lda currentChannel
jsr getADC
ldx #txtBuff
jsr word2hex
ldx #txtBuff
jsr vfdPrint
lda #' '
jsr vfdData
inc currentChannel
lda currentChannel
cmpa #4
bne .doNext
jsr delay
jmp .here ; while(1);
tasza pisze:stąd pomysł na oflagowanie poletka, tak dosłownie. Szpile moje krawieckie idealnie wchodzą w płytkę stykową, a chorągiewki opisują co jest do czego.
ad574-mux-serial-1.asm pisze:Kod: Zaznacz cały
strcat:
; X - dest string being expaned, must be long enough and 0-ended
; Y - src string to add
.doFindEnd:
; scroll to end of dest(X) string
lda ,x+
bne .doFindEnd
; one char back!
dex
.doCopy:
lda ,y+
sta ,x+
bne .doCopy
rts
Kod: Zaznacz cały
^qqqq:wwww:eeee:rrrr↧
main.pas pisze:Kod: Zaznacz cały
procedure TForm1.SdpoSerial1RxData(Sender: TObject);
var s : String;
begin
self.rxBuffer := self.rxBuffer + self.SdpoSerial1.ReadData;
if RightStr( self.rxBuffer, 1 ) = chr( 10 ) then
begin
s := Trim( self.rxBuffer );
self.RequestQueue.Items.Add ( s );
Memo1.Lines.Insert( 0 , Format('%.4d', [lineCounter]) + ' ' + s );
Inc( lineCounter );
self.rxBuffer := '';
end;
end;
main.pas pisze:Kod: Zaznacz cały
function TForm1.ProcessRemoteRequest ( req : String ) : String;
var parts : TStringList;
v : array [0..3] of Double;
i : integer;
begin
parts := TStringList.Create;
parts.Delimiter := ':';
parts.DelimitedText := RightStr( req, Length(req) - 1); // cut ^ at begin
for i := 0 to parts.Count - 1 do
begin
v [i] := Hex2Dec( parts.Strings[i] );
// do calc
case i of
0: v [i] := (( v [i] * 2.44 ) / 4.0 ) / 1000;
1: v [i] := ((( v [i] * 2.44 ) / 4.0 ) - 500 ) / 10;
2,3: v [i] := (( v [i] * 2.44 ) / 4.0 ) / 10;
else
v [i] := 0.0;
end;
end;
parts.Free;
// update numeric indicators
self.UrefLEDDisplay2.Value:= v [0];
if self.LEDButton1.StateOn then v [1] := v [1] * -1.0;
self.outLEDDisplay1.Value := v [1];
self.cpuLEDDisplay3.Value := v [2]; self.LEDMeter1.Position := floor( v[2] );
self.inLEDDisplay4.Value:= v [3];
// ° in CU20025 VFD is coded as $DF :) :)
ProcessRemoteRequest := Format('%1.2f', [ v[0] ] ) + 'V ' +
Format('%2.0f', [ v[1] ]) + char($DF) + 'C ' +
Format('%2.0f', [ v[2] ]) + chr($DF) + 'C ' +
Format('%2.0f', [ v[3] ]) + chr($DF) + 'C';
Caption := ProcessRemoteRequest;
end;
ad574-mux-serial-2.asm pisze:Kod: Zaznacz cały
strcpy:
; Y - str from
; X - str to (dest)
; copies chars until zero in src
.doCopy:
lda ,y+
sta ,x+
bne .doCopy
rts
ad574-mux-serial-2.asm pisze:Kod: Zaznacz cały
irqHandler
; confirm irq reading stat
lda ACIA+STATR
; get char from RX
lda ACIA+RDR
; check if LF (end of frame) then copy buffers
cmpa #10
bne .doStoreRxChar
; play with received frame
; clear dest buffer
ldx #displayBuff
lda #displayBuffLen
jsr memZero
; copy from rx buffer to vfd
ldy #rxBuffer
ldx #displayBuff
jsr strcpy
; zero rx buffer for sure
ldx #rxBuffer
lda #rxBufferLen
jsr memZero
bra .doReinitRx ; kindly exit from here
.doStoreRxChar:
; otherwise store char in buff
ldx rxBufferPtr
sta ,x+ ; save char
stx rxBufferPtr ; save prt
clra
sta ,x+ ; save NULL after
; check against buff end
cmpx #rxBuffer+rxBufferLen
bne .hasEnoughSpace
.doReinitRx:
; reinit rx buff
ldx #rxBuffer
stx rxBufferPtr
.hasEnoughSpace
rti
tasza pisze:W komputerowym światku przyjęło się tak, że to mały sterowniczek pełni rolę podrzędną, jako niezbyt mądry do gadania ma niewiele i raczej słucha poleceń z nadrzędnego systemu niż sam o czymś tam decyduje. Z drugiej strony w ludzkim świecie korporacyjnych zagródek za korzystną należy uznać sytuację wręcz odwrotną. To właśnie szefowi swemu trzeba podrzucać do wykonania wszelkie niewdzięczne i nudne zadania! Wymaga to odrobiny sprytu i różnych socjotechnik, ale ma się wtenczas znacznie więcej chwil dla siebie i ktoś jeszcze czuje się potrzebny, no same zalety.
serial-bcd-1.asm pisze:Kod: Zaznacz cały
;-----
; bcd correction on n bytes
; b - number of bytes
; x - ptr to bcd buff
binToBcdCorrect:
.corrNext:
lda ,x
pshu a ; save for later
anda #$F0 ; high nibble
cmpa #$50 ; >= 5?
bcs .hidone ; skip if not
adda #$30 ; +30
.hidone:
sta ,x ; save hi nibble
pulu a ; get accu again
anda #$0F ; low nibble
cmpa #$05 ; >= 5?
bcs .lodone ; skip if not
adda #$03 ; +03
.lodone
ora ,x ; hi|lo
sta ,x ; save result @
inx
decb
bne .corrNext
rts
serial-bcd-1.asm pisze:Kod: Zaznacz cały
.sm RAM
.co
| BCD | HI BIN LO |
| +0 | +1 | +2 | +0 | +1 |
<--|<==
.ec
b2bcd_BCD: .bs 3
b2bcd_BIN: .bs 2
serial-bcd-1.asm pisze:Kod: Zaznacz cały
;----------------
; y - addr of src bin value (two bytes)
; x - addr of dest BCD buffer (3 bytes for 65535)
binToBcd:
pshu x ; save dest BCD prt for later
;clear BCD buffer
clr b2bcd_BCD+0
clr b2bcd_BCD+1
clr b2bcd_BCD+2
; copy bin to working mem
lda 0,y
sta b2bcd_BIN ; HI byte
lda 1,y
sta b2bcd_BIN+1 ; LO byte
ldb #16 ; 16 bits to scroll
.nextBit
pshu b
; first << on bin LO
lsl b2bcd_BIN+1
; rest via C marker, do << x 4
rol b2bcd_BIN+0
rol b2bcd_BCD+2
rol b2bcd_BCD+1
rol b2bcd_BCD+0
; mem rotated, do correction if != last bit
cmpb #1
beq .skipLastCorrection
ldb #3
ldx #b2bcd_BCD
jsr binToBcdCorrect
.skipLastCorrection:
pulu b
decb
bne .nextBit
;copy result from working var
pulu x ; get original BCD bag
lda b2bcd_BCD+0
sta 0,x
lda b2bcd_BCD+1
sta 1,x
lda b2bcd_BCD+2
sta 2,x
rts
;
tasza pisze:Mam dystans do siebie i na szyderę w sumie jestem dość odporna więc proszę, można używać:
adc0816-mux-1.asm pisze:Kod: Zaznacz cały
getADC:
; mux: ALE = VIA1.PB4
; ADD_B = PB.1
; ADD_A = PB.0
;
; adc: D7..D0 - VIA1.PA7..PA0
; START = VIA1.PB7
; set channel
anda #%0000.0011
sta VIA1+ORB
; ALE + START
lda #%1001.0000
ora VIA1+ORB
sta VIA1+ORB
nop
lda #%0110.1111
anda VIA1+ORB
sta VIA1+ORB
; wait a moment
ldb #$80
.omg: decb
bne .omg
; read data
lda #$00
ldb VIA1+IRA
rts
Kod: Zaznacz cały
lda #0
sta VIA1+ORA
tu:
inc VIA1+ORA
jmp tu
Kod: Zaznacz cały
lda #80
sta VIA1+ORA
sta VIA1+ORB
tu:
inc VIA1+ORA
dec VIA1+ORB
jmp tu
Kod: Zaznacz cały
ldx #SINE_WAVE_256
ldy #SINE_WAVE_256
tu:
lda ,x+
sta VIA1+ORA
lda ,y+
sta VIA1+ORB
cmpx #SINE_WAVE_256+$FF
bne xInRange
ldx #SINE_WAVE_256
xInRange:
cmpy #SINE_WAVE_256+$FF
bne yInRange
ldy #SINE_WAVE_256
yInRange:
jmp tu
Kod: Zaznacz cały
ldx #SINE_WAVE_256
ldy #SINE_WAVE_256+$40
tu:
lda ,x+
sta VIA1+ORA
lda ,y+
sta VIA1+ORB
cmpx #SINE_WAVE_256+$FF
bne xInRange
ldx #SINE_WAVE_256
xInRange:
cmpy #SINE_WAVE_256+$FF
bne yInRange
ldy #SINE_WAVE_256
yInRange:
jmp tu
Kod: Zaznacz cały
lda ,x+
sta VIA1+ORA
suba #10
sta VIA1+ORA
lda ,y+
sta VIA1+ORB
suba #10
sta VIA1+ORB