START MOVE.L #$7000,D7 ;Anger startläge för stackpekaren JSR SETUPPIA ;Hoppar till settup för parallellporten JSR CORRECTCODE ;Hoppar till att lägga in rätt kod JSR ASCII ;Hoppar till att lägga in felmedelandebokstäverna CLEARLOOP JSR CLEARCODE ;Hoppar till att rensa koden GETKEYLOOP JSR GETKEY ;Hoppar till att läsa av stroben CMP.B #$F,D4 ;Jämför knapptrycket med F BEQ CHECKCODE ;Om ja, kolla koden CMP.B #$A,D4 ;Jämför knapptrycket med A BEQ ACTIVATE ;Om ja, aktivera alarmet JMP ADDKEY ;Annars hoppa till att lägga till knapptrycket i D6 SETUPPIA MOVE.B #0,$10084 ;Välj datariktningsregistret (DDRA) MOVE.B #1,$10080 ;Sätt pinne 0 på PIAA som utgång MOVE.B #4,$10084 ;Välj in/utgångsregistret MOVE.B #0,$10086 ;Välj datariktningsregistret (DDRB) MOVE.B #0,$10082 ;Sätt alla pinnar som ingångar MOVE.B #4,$10086 ;Välj in/utgångsregistret RTS CORRECTCODE MOVE.L #$06050100,D7 ;Rätta koden RTS ASCII MOVE.L #$46656C61,$4020 ;Fela MOVE.L #$6B746967,$4024 ;ktig MOVE.L #$206B6F64,$4028 ;*mellanlag*kod MOVE.W #$0A0D,$402C ;newline, carriage return RTS CLEARCODE MOVE.L #$FFFFFFFF,D6 ;Sätter D6 till bara ettor RTS GETKEY MOVE.B $10082,D4 ;Lägger PIAB i D4 AND.B #$10,D4 ;Isolerar stroben CMP.B #16,D4 ;Kollar om den är 1 BNE GETKEYLOOP ;Om nej, loopa igen STROBEOFF MOVE.B $10082,D4 ;Om ja, se nu till så stroben är 0 igen AND.B #10,D4 ;Isolera stroben CMP.B #00,D4 ;Kollar om stroben är 0 BNE STROBEOFF ;Om nej, loopa igen tills stroben är 0 MOVE.B $10082,D4 ;Om ja, lägg senaste i D4 RTS ADDKEY LSL.L #8,D6 ;Skiftar D6 en byte till vänster MOVE.B D4,D6 ;Flytta D4 som är senaste knapptryck till D6 där senaste koden ligger lagrad JMP GETKEYLOOP ;Hoppa till loopen att hitta nya tecken CHECKCODE CMP.L D6,D7 ;Jämför D6 med D7 BEQ DEACTIVATE ;Stämmer det så gå till aktivera larmet LEA $4020,A4 ;Load effective adress, ladda ASCII till A4 MOVE.B #14,D5 ;Flytta #14 till D5, längden på strängen JMP PRINTSTRING ;Hoppa till printstring ACTIVATE MOVE.B #1,$10080 ;Skickar en 1a till lysdioden JMP CLEARLOOP ;Hoppa till clearcode DEACTIVATE MOVE.B #0,$10080 ;Skickar en 0a till lysdioden JMP CLEARLOOP ;Hoppa till clearcode PRINTSTRING CMP.B #0,D5 ;Kolla om längden på D5 är 0, alltså att alla tecken skrivits ut BNE PRINT ;Om det inte stämmer, hoppa till PRINT JMP CLEARLOOP ;Alla tecken är utskrivna, hoppa till clearcode PRINT MOVE.B (A4)+,D4 ;Flytta nästa tecken till D4 JSR PRINTCHARACTER ;Hoppa till printchar som skriver ut koden på skärmen SUBQ.B #1,D5 ;Minska sedan antal tecken kvar att skriva ut med 1 BNE PRINTSTRING ; JMP CLEARLOOP ;Alla tecken är utskrivna, hoppa tillbaks till clearcode PRINTCHARACTER MOVE.B D5,-(A7) ;Sparar undan D5 på stacken WAITTX MOVE.B $10040,D5 ;Skicka serieportens statusregister till D5 AND.B #2,D5 ;Isolera bit 1, vänta på att den inte skickar BEQ WAITTX ;Om den skickar, loopa tills den är klar för att skicka MOVE.B D4,$10042 ;Flytta tecknet som ska skrivas ut till serieporten, tecknet skrivs ut MOVE.B (A7)+,D5 ;Återställer D5 RTS Vad ligger i dataregistret? D0: Används för att byta kod D1: Lagrar senaste knapptrycken v2, det som åker ut från D6 D2: D3: D4: Inputen från PIAB, även innehållet i printstring D5: Längden på strängen i printstring D6: Senaste knapptrycken D7: Den rätta koden A0: A1: A2: A3: A4: Används till printstring A5: A6: A7: Stackpekare