;  TSAVE LJUD2.TXT
;---------------------------------
;86-02-11
;DAVID ANDERSSON <5201>
;
;ASSEMBLER RUTINER F\R ATT SPELA IN
;OCH ]TERGE LJUD.
;---------------------------------
;
;
PRGADR: EQU 61440       ;PROGRAMMET PLACERAS UNDER STACKEN -
                        ;DET M]STE VARA P] EN J[MN PAGE-ADRESS
HI:     EQU .HIGH.PRGADR ;H\GA BYTEN AV ADRESSEN
;
SADDR:  EQU 51200       ;STARTADRESS F\R LJUD-DATA (16K RAM)
EADDR:  EQU PRGADR-1    ;SISTA ADRESS F\R LJUD-DATA
;
;
;--------------------------------
; PROGRAMMET B\RJAR H[R
;
        ORG PRGADR
;
        JP START        ;CALL(PRGADR)    SPELA IN LJUD
        JP PLAY         ;CALL(PRGADR+3)  SPELA UP LJUD
;
;
; VARIABLER
;
BYTE:   DEFB 0          ;SHIFTA IN/UT EN BYTE
COUNT:  DEFB 8          ;R[KNAR 8 BITAR I EN BYTE
ADDR:   DEFW 0          ;ADRESS TILL LJUD-DATA
;
;
; INTERUPT VEKTORER
;
        ORG PRGADR+52   ;NORMAL I-VEKTOR I PIO:N
;
SINT:   DEFW SINT1      ;STROBE INTERUPT (S[TTS VID INITIERING)
        DEFW 1428       ;CASSETT INTERUPT
;
;
;---------------------------------
; RUTINER SOM ANROPAS FR]N BASIC
;
; SPELA IN LJUD
; ANROPAS FR]N BASIC, AVBRYTS MED <RETURN>
; <MELLANSLAG> ]TERSTARTAR INSPELNING
;
START:  LD A,8
        LD (COUNT),A    ;INITIERA VARIABEL
        LD HL,EADDR
        LD (ADDR),HL    ;S[TT SLUTADRESS F\R INSPELNING -
                        ;INSPELNING SKER D] INTE F\RENS -
                        ;<SPACE> TRYCKS NER
        LD HL,SINT1     ;INTERUPT F\R INSPELNING
        LD (SINT),HL    ;S[TT INTERUPTRUTIN 1
        CALL INITI      ;INITIERA PIO-INTERUPT
;
RECORD: IN A,(56)       ;TESTA TANGENTBORDET
        CP 13+128       ;<RETURN>
        JR Z,EXITI      ;TERMINERA INTERUPT OM RETURN
        CP 32+128       ;<SPACE>
        JR NZ,RECORD    ;SPELA IN LJUD OM EJ SPACE, LOOPA
        LD HL,SADDR     ;SPACE [R INTRYCKT -
        LD (ADDR),HL    ;S[TT STARTADRESS F\R DATA
        JR RECORD       ;LOOPA
;
;
; SPELA UPP LJUD
; ANROPAS FR]N BASIC, AVBRYTS MED <RETURN>
;
PLAY:   LD A,1
        LD (COUNT),A    ;INITIERA VARIABEL
        LD HL,SADDR
        LD (ADDR),HL    ;S[TT STARTADRESS F\R DATA
        LD HL,SINT2     ;INTERUPT F\R ]TEGIVNING
        LD (SINT),HL    ;S[TT INTERUPTRUTIN 2
        CALL INITI      ;INITIERA PIO-INTERUPT
;
PLAY1:  LD HL,(ADDR)    ;TESTA OM EFTER SLUTADRESS
        LD A,H
        CP HI
        JP NC,EXITI     ;OM S], TERMINERA INTERUPT
        IN A,(56)       ;TESTA TANGENTBORDET
        CP 13+128       ;<RETURN>
        JR NZ,PLAY1     ;LOOPA OM INTE RETURN
;
        JP EXITI        ;TERMINERA INTERUPT
;
;
;---------------------------------
; INITIERINGS RUTINER
;
; INITIERA STROB INTERUPT
;
INITI:  LD A,I          ;TESTA OM I-REGISTRET REDAN [R SPARAD
        CP HI
        JR Z,INITI3
        LD (SAVEI),A    ;OM INTE, SPARA SIST I LISTAN
INITI3: LD HL,ILIST     ;PIO DATA F\R STROBE INTERUPT
        JR SETPIO
;
;
; TERMINERA STROB INTERUPT
;
EXITI:  LD HL,ULIST     ;PIO DATA F\R NORMAL INTERUPT
       ;JR SETPIO
;
;
; PROGRAMERA PIO OCH ENABLE INTERUPT
; HL SKA PEKA P] LISTA ,5 BYTES L]NG
;
SETPIO: PUSH BC
        LD BC,4*256+57  ;B=4 BYTES, C=PORT 57
        DI
        OTIR
        LD A,(HL)       ;A=SISTA BYTEN I LISTAN -
        LD I,A          ;TILL I-REGISTRET
        EI
        POP BC
        RET
;
;
; DATA F\R PROGRAMERING AV PIO PORT A (KEYBOARD)
;
ILIST:  DEFB 04FH       ;MODE 1 (ALL INPUTS)
        DEFB 087H       ;ENABLE INTERUPT
        DEFB 087H       ; -"-
        DEFB 087H       ; -"-
        DEFB HI         ;HIGH VEKTOR
;
ULIST:  DEFB 0CFH       ;MODE 3 (CONTROL)
        DEFB 0FFH       ;DIRECTION ALL INPUT
        DEFB 0B7H       ;ENABLE,OR_BITS,GO_HIGH,MASK_FOLLOWS
        DEFB 07FH       ;BIT 7 IS MASKED
SAVEI:  DEFB 0          ;OLD HIGH VEKTOR (S[TTS VID INITIERING)
;
;
;---------------------------------
; INTERUPT RUTINER
;
; STROB INTERUPT, 7812 PERIODER/S
; INTERUPT RUTIN F\R INSPELNING AV LJUD
;
SINT1:  PUSH AF
        PUSH HL
        IN A,(58)       ;K[NN AV V24-PORTEN
        AND 1           ;TESTA OM LJUDSIGNALEN, CLEAR CARRY
        JR NZ,NOOUT     ;HOPPA OM 1 (AKTIV L]G)
        XOR A           ;GE PULS I H\GTALAREN
        OUT (6),A
        LD A,121
        OUT (6),A
        SCF             ;S[TT CARRY
                        ;CARRY [R SAMPLAD BIT
NOOUT:  LD HL,BYTE
        RL (HL)         ;CARRY TILL BIT 0 AV (BYTE)
        LD A,(HL)       ;A=BYTE
        INC HL          ;HL=ADRESS TILL COUNT
        DEC (HL)        ;R[KNA NER COUNT
        JR NZ,NONEX2    ;HOPPA OM COUNT>0
        LD (HL),8       ;COUNT=8, F\R N[STA BYTE
        LD HL,(ADDR)    ;ADRESS TILL LJUD-DATA
        LD (HL),A       ;SPARA BYTE I LJUD-DATA
        JP NXTADR       ;S[TT NY ADRESS, RETURN FROM INTERUPT
;
;
; INTERUPT RUTIN F\R ]TERGIVNING AV LJUD
;
SINT2:  PUSH AF
        PUSH HL
        LD HL,BYTE
        RL (HL)         ;BIT 7 AV (BYTE) TILL CARRY
        JR NC,NOOUT2    ;HOPPA OM BIT=0
        XOR A           ;BIT=1, GE PULS I H\GTALAREN
        OUT (6),A
        LD A,121
        OUT (6),A
NOOUT2: INC HL          ;HL=ADRESS TILL COUNT
        DEC (HL)        ;R[KNA NER COUNT
        JR NZ,NONEX2    ;HOPPA OM COUNT>0
        LD (HL),8       ;COUNT=8 F\R N[STA BYTE
        LD HL,(ADDR)    ;ADRESS TILL LJUD-DATA
        LD A,(HL)       ;A=LJUD-DATA BYTE
        LD (BYTE),A     ;SPARA BYTE F\R ATT SHIFTA UT
;
NXTADR: INC HL          ;N[STA BYTE
        LD A,H          ;TESTA OM EFTER SISTA ADRESS
        CP HI
        JR NC,NONEX2    ;JA, SPARA INTE NY ADRESS
        LD (ADDR),HL    ;SPARA N[STA ADRESS
NONEX2: POP HL          ;RETURN FROM INTERUPT
        POP AF
        EI
        RETI
;
;---------------------------------
        END
