; test comments in weird places PRINTS "this should never execute" main: ; test main beginning at 1, not 0 MOVECL 0x0, q1 MOVECL 0x2, q1 SIC @q1, q0 FLUSHQ q0 FLUSHQ q1 FLUSHQ q2 ALLOCATEC 0x4, q90 SIC @q90, q0 FLUSHQ q0 MMS q91, q92 MOVE @q90, q91 MOVECL 0x0, q91 MOVECL 0x5, q92 MOVECL 0x1, q91 MOVECL 0xA, q92 MML q93, q94 MOVE @q90, q93 MOVECL 0x0, q93 MOVECL 0x1, q93 PRINTSNNL "readback from allocate test, loc 0: " PRINTQX q94 PRINTSNNL "loc 1: " PRINTQX q94 PRINTS "\nAbove test should have yielded 0 to have 0x5, 1 to have 0xA" ;; that's it... MOVECL 0x10, q110 ; spawn threads! NOP ; test the NOP instruction spawn: SPAWNC begin, q111 MAPQC q112, q0, q111 ; map q112 to q0 in target context PROCID q112 ; forward my data... EEQ q112 ; ensure it gets sent... UNMAPQ q112 ; unmap for next cycle SUBC q110, 1, q110 SLEC @q110, 0, q111 BRZ q111, spawn PRINTSNNL "number of threads completing their code: " MOVECL 0x0, q1 waitfinish: ADD q0, q1, q1 ; add the return code to q1 PRINTQNNL @q1 PRINTSNNL " " SEQC @q1, 0x10, q2 BRZ q2, waitfinish CYCLES ; print cycle count HALT 0,0 begin: MAPQC q127, q0, q0 ; q127 in this context maps to q0 in original calling context MOVECL 0x4, q1 ; test multiple queueing and adds MOVECL 0x3, q1 MOVECL 0x2, q0 MOVECL 0x2, q2 PRINTSNNL "q1 should be 4: " PRINTQ q1 ADD q1, q2, q3 PRINTSNNL "q3 should be 5: " PRINTQ @q3 ; copy of this value SUBC q3, 0x6, q3 PRINTS "q4 should be -1: " PRINTQ @q3 ;; test word operations MOVECL 0x3, q42 MOVECL 0x2, q78 MUL @q42, q78, q20 PRINTSNNL "mul test, should be 6: " PRINTQ @q20 DIV q20, q42, q20 PRINTSNNL "div test, should be 2: " PRINTQ q20 ; all queues from above should be emptied now ;; load q10 with 0xF0F0F0F0F0F0F0F0 MOVECL 0xF0F0F0F0, q10 SHLC q10, 32, q10 MOVECL 0xF0F0F0F0, q11 SHLC q11, 32, q11 ; get rid of sign SHRC q11, 32, q11 OR q10, q11, q10 ;; load q11 with 0x123456789ABCDEF MOVECL 0x12345678, q11 SHLC q11, 32, q11 MOVECL 0x9ABCDEFF, q12 SHLC q12, 32, q12 SHRC q12, 32, q12 OR q11, q12, q11 AND @q10, @q11, q12 PRINTSNNL "and test, should be 0x1030507090B0D0F0: " PRINTQX q12 OR @q10, @q11, q12 PRINTSNNL "or test, should be 0xF2F4F6F8FAFCFEFF: " PRINTQX q12 XOR @q10, @q11, q12 PRINTSNNL "xor test, should be 0xE2C4A6886A4C2E0F: " PRINTQX @q12 ; save q12 for next test MOVECL 16, q13 SRA q12, q13, q12 PRINTSNNL "sra test, should be 0xFFFFE2C4A6886A4C: " PRINTQX q12 ;; coverage so far: MOVECL, ADD, SUB, MUL, DIV, OR, AND, XOR ;; ADDC, SUBC, MULC, DIVC, ORC, ANDC, XORC, SHL, SHLC, SHR, SHRC ;; SRA, SRAC ;; only tested long-word types (type test later) ;; (c-type instructions by glass-box test association) ;; now test branch operations, set and test PRINTS "count from 5 to -1, using queue storage" MOVECL 5,q14 ; setup a counter test1: MOVE @q14, q16 SUBC q14,1,q14 SLEC @q14, -2, q15 BRZ q15, test1 test2: PRINTQNNL q16 ; print queue contents post-test PRINTSNNL " " BRNE q16, test2 PRINTS "." ; put a periond and newline at the end ;; test coverage is BRZ, SLEC, SLE, MOVE PRINTS "Test threads and inter-thread comms..." SPAWNC thread1, q30 MAPQC q31, q0, @q30 ; q31 here maps to q0 in my new thread MAPQC q32, q1, @q30 ; q32 here maps to q1 in my new thread MAPQC q33, q2, @q30 ; q33 here maps to q2 in my new thread PROCID q31 ; send my procID into q0 of the new thread MOVECS 0x00030004, q32 MOVECS 0x00050002, q33 PRINTSNNL "value should be 0x80006: " PRINTQX q34 MOVECS 0x42, q32 ; send something to other thread q1 waitsend: SEMPTY q32, q34 BRZ q34, waitsend NOP MOVECS 0x88, q32 EEQ q32 UNMAPQ q31 UNMAPQ q32 UNMAPQ q33 MOVECF 3.2, q31 MOVECF 2.4, q32 FADD q31, q32, q33 PRINTSNNL "value should be 5.6: " PRINTQ q33 ;; test coverage is SPAWNC, MAPQC, PROCID, MOVECS, SEMPTY ;; NOP, UNMAPQ, MOVECF, FADD, MAPSQ and basic multithreading/synchro MOVECL 0x1, q127 ; send my return code so I can be counted.... HALT 0,0 PRINTS "now entering infinite loop" loop: SUBC q3, -2, q3 PRINTQ @q3 BR loop ;; test coverage is BR HALT 0,0 thread1: PRINTS "new thread started okay" MAPQC q3, q34, q0 ; first thing: wait for q0 to get return context ID ADD q1, q2, q3 MAPSQ q1, q4 ; record our source queue for q1 PRINTSNNL "waiting for data on q1..." PRINTQX q1 PRINTSNNL "source queue for q1: " PRINTQ q4 PRINTS "test thread terminating" HALT 0,0